IyEvdXNyL2Jpbi9lbnYgcHl0aG9uClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAF9faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAzpEsa+R0AAPkdAAALAAAAX19tYWluX18ucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSBwaXB0b29sIG1vZHVsZSBpbXBvcnRzIHBpcCByZXF1aXJlbWVudHMgaW50byBCYXplbCBydWxlcy4iIiIKCiMgQm9pbGVycGxhdGUgYWRkZWQgYnkgc3VicGFyL2NvbXBpbGVyL3B5dGhvbl9hcmNoaXZlLnB5CmZyb20gc3VicGFyLnJ1bnRpbWUgaW1wb3J0IHN1cHBvcnQgYXMgXwpfLnNldHVwKGltcG9ydF9yb290cz1bdSdweXBpX19zZXR1cHRvb2xzXzM4XzJfNCcsIHUncHlwaV9fcGlwXzlfMF8zJywgdSdweXBpX193aGVlbF8wXzMwXzBhMCcsIHUnaW9fYmF6ZWxfcnVsZXNfcHl0aG9uJywgdSdweXBpX19waXBfOV8wXzMnLCB1J3B5cGlfX3NldHVwdG9vbHNfMzhfMl80JywgdSdweXBpX193aGVlbF8wXzMwXzBhMCddLCB6aXBfc2FmZT1UcnVlKQpkZWwgXwojIEVuZCBib2lsZXJwbGF0ZQppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLm1rZHRlbXAoKSwgImNhY2VydC5wZW0iKQogICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKICAgICAgY2VydC53cml0ZShwa2d1dGlsLmdldF9kYXRhKCJwaXAuX3ZlbmRvci5yZXF1ZXN0cyIsICJjYWNlcnQucGVtIikpCiAgICBhcmd2ID0gWyItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBydWxlc19weXRob24ud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIGlmIHBpcF9tYWluKFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0pOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gW1doZWVsKHBhdGgpIGZvciBwYXRoIGluIGxpc3Rfd2hscygpXQogIHBvc3NpYmxlX2V4dHJhcyA9IGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscykKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgd2hsID0gIkB7bmFtZX0vLzp7cGF0aH0iLAogICAgICAgIHJlcXVpcmVtZW50cyA9ICJAe25hbWV9Ly86cmVxdWlyZW1lbnRzLmJ6bCIsCiAgICAgICAgZXh0cmFzID0gW3tleHRyYXN9XQogICAgKSIiIi5mb3JtYXQobmFtZT1hcmdzLm5hbWUsIHJlcG9fbmFtZT13aGVlbC5yZXBvc2l0b3J5X25hbWUoKSwKICAgICAgICAgICAgICAgIHBhdGg9d2hlZWwuYmFzZW5hbWUoKSwKICAgICAgICAgICAgICAgIGV4dHJhcz0nLCcuam9pbihbCiAgICAgICAgICAgICAgICAgICciJXMiJyAlIGV4dHJhCiAgICAgICAgICAgICAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdoZWVsLCBbXSkKICAgICAgICAgICAgICAgIF0pKQoKICB3aGxfdGFyZ2V0cyA9ICcsJy5qb2luKFsKICAgICcsJy5qb2luKFsKICAgICAgJyIlcyI6ICJAJXMvLzpwa2ciJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgd2hsLnJlcG9zaXRvcnlfbmFtZSgpKQogICAgXSArIFsKICAgICAgIyBGb3IgZXZlcnkgZXh0cmEgdGhhdCBpcyBwb3NzaWJsZSBmcm9tIHRoaXMgcmVxdWlyZW1lbnRzLnR4dAogICAgICAnIiVzWyVzXSI6ICJAJXMvLzolcyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCBleHRyYS5sb3dlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobC5yZXBvc2l0b3J5X25hbWUoKSwgZXh0cmEpCiAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdobCwgW10pCiAgICBdKQogICAgZm9yIHdobCBpbiB3aGxzCiAgXSkKCiAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIlwKIyBJbnN0YWxsIHBpcCByZXF1aXJlbWVudHMuCiMKIyBHZW5lcmF0ZWQgZnJvbSB7aW5wdXR9Cgpsb2FkKCJAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uLy9weXRob246d2hsLmJ6bCIsICJ3aGxfbGlicmFyeSIpCgpkZWYgcGlwX2luc3RhbGwoKToKICB7d2hsX2xpYnJhcmllc30KCl9yZXF1aXJlbWVudHMgPSB7ewogIHttYXBwaW5nc30KfX0KCmFsbF9yZXF1aXJlbWVudHMgPSBfcmVxdWlyZW1lbnRzLnZhbHVlcygpCgpkZWYgcmVxdWlyZW1lbnQobmFtZSk6CiAgbmFtZV9rZXkgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpLmxvd2VyKCkKICBpZiBuYW1lX2tleSBub3QgaW4gX3JlcXVpcmVtZW50czoKICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHBpcC1wcm92aWRlZCBkZXBlbmRlbmN5OiAnJXMnIiAlIG5hbWUpCiAgcmV0dXJuIF9yZXF1aXJlbWVudHNbbmFtZV9rZXldCiIiIi5mb3JtYXQoaW5wdXQ9YXJncy5pbnB1dCwKICAgICAgICAgICB3aGxfbGlicmFyaWVzPSdcbicuam9pbihtYXAod2hsX2xpYnJhcnksIHdobHMpKSBpZiB3aGxzIGVsc2UgInBhc3MiLAogICAgICAgICAgIG1hcHBpbmdzPXdobF90YXJnZXRzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAALgAAAGlvX2JhemVsX3J1bGVzX3B5dGhvbi9ydWxlc19weXRob24vX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAElIPlm/GgAAvxoAACoAAABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3BpcHRvb2wjIS91c3IvYmluL2VudiBweXRob24KCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgemlwZmlsZQoKIyBSZXR1cm4gVHJ1ZSBpZiBydW5uaW5nIG9uIFdpbmRvd3MKZGVmIElzV2luZG93cygpOgogIHJldHVybiBvcy5uYW1lID09ICdudCcKCmRlZiBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgocGF0aCk6CiAgIiIiCiAgQWRkaW5nIFVOQyBwcmVmaXggYWZ0ZXIgZ2V0dGluZyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgV2luZG93cyBwYXRoLAogIGl0J3Mgbm8tb3AgZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBvciBpZiBydW5uaW5nIHVuZGVyIHB5dGhvbjIuCiAgIiIiCiAgcGF0aCA9IHBhdGguc3RyaXAoKQoKICAjIE5vIG5lZWQgdG8gYWRkIHByZWZpeCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICMgQW5kIFxcP1wgZG9lc24ndCB3b3JrIGluIHB5dGhvbiAyCiAgaWYgbm90IElzV2luZG93cygpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgcmV0dXJuIHBhdGgKCiAgIyBMZXRzIHN0YXJ0IHRoZSB1bmljb2RlIGZ1bgogIHVuaWNvZGVfcHJlZml4ID0gIlxcXFw/XFwiCiAgaWYgcGF0aC5zdGFydHN3aXRoKHVuaWNvZGVfcHJlZml4KToKICAgIHJldHVybiBwYXRoCgogICMgb3MucGF0aC5hYnNwYXRoIHJldHVybnMgYSBub3JtYWxpemVkIGFic29sdXRlIHBhdGgKICByZXR1cm4gdW5pY29kZV9wcmVmaXggKyBvcy5wYXRoLmFic3BhdGgocGF0aCkKClBZVEhPTl9CSU5BUlkgPSAncHl0aG9uJwppZiBJc1dpbmRvd3MoKSBhbmQgbm90IFBZVEhPTl9CSU5BUlkuZW5kc3dpdGgoJy5leGUnKToKICBQWVRIT05fQklOQVJZID0gUFlUSE9OX0JJTkFSWSArICcuZXhlJwoKIyBGaW5kIGEgZmlsZSBpbiBhIGdpdmVuIHNlYXJjaCBwYXRoLgpkZWYgU2VhcmNoUGF0aChuYW1lKToKICBzZWFyY2hfcGF0aCA9IG9zLmdldGVudignUEFUSCcsIG9zLmRlZnBhdGgpLnNwbGl0KG9zLnBhdGhzZXApCiAgZm9yIGRpcmVjdG9yeSBpbiBzZWFyY2hfcGF0aDoKICAgIGlmIGRpcmVjdG9yeSA9PSAnJzogY29udGludWUKICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKQogICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCkgYW5kIG9zLmFjY2VzcyhwYXRoLCBvcy5YX09LKToKICAgICAgcmV0dXJuIHBhdGgKICByZXR1cm4gTm9uZQoKZGVmIElzUnVubmluZ0Zyb21aaXAoKToKICByZXR1cm4gRmFsc2UKCiMgRmluZCB0aGUgcmVhbCBQeXRob24gYmluYXJ5IGlmIGl0J3Mgbm90IGEgbm9ybWFsIGFic29sdXRlIHBhdGgKZGVmIEZpbmRQeXRob25CaW5hcnkobW9kdWxlX3NwYWNlKToKICBpZiBQWVRIT05fQklOQVJZLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAjIENhc2UgMTogUGF0aCBpcyBhIGxhYmVsLiBOb3Qgc3VwcG9ydGVkIHlldC4KICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAnQmF6ZWwgZG9lcyBub3Qgc3VwcG9ydCBleGVjdXRpb24gb2YgUHl0aG9uIGludGVycHJldGVycyB2aWEgbGFiZWxzIHlldCcpCiAgZWxpZiBQWVRIT05fQklOQVJZLnN0YXJ0c3dpdGgoJy8nKToKICAgICMgQ2FzZSAyOiBBYnNvbHV0ZSBwYXRoLgogICAgcmV0dXJuIFBZVEhPTl9CSU5BUlkKICBlbGlmICcvJyBpbiBQWVRIT05fQklOQVJZOgogICAgIyBDYXNlIDM6IFBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCBQWVRIT05fQklOQVJZKQogIGVsc2U6CiAgICAjIENhc2UgNDogUGF0aCBoYXMgdG8gYmUgbG9va2VkIHVwIGluIHRoZSBzZWFyY2ggcGF0aC4KICAgIHJldHVybiBTZWFyY2hQYXRoKFBZVEhPTl9CSU5BUlkpCgpkZWYgQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSk6CiAgcGFydHMgPSBweXRob25faW1wb3J0cy5zcGxpdCgnOicpOwogIHJldHVybiBbbW9kdWxlX3NwYWNlXSArIFsiJXMvJXMiICUgKG1vZHVsZV9zcGFjZSwgcGF0aCkgZm9yIHBhdGggaW4gcGFydHNdCgojIEZpbmQgdGhlIHJ1bmZpbGVzIHRyZWUKZGVmIEZpbmRNb2R1bGVTcGFjZSgpOgogIHN0dWJfZmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCiAgbW9kdWxlX3NwYWNlID0gc3R1Yl9maWxlbmFtZSArICcucnVuZmlsZXMnCiAgaWYgb3MucGF0aC5pc2Rpcihtb2R1bGVfc3BhY2UpOgogICAgcmV0dXJuIG1vZHVsZV9zcGFjZQoKICBydW5maWxlc19wYXR0ZXJuID0gIiguKlwucnVuZmlsZXMpLy4qIgogIGlmIElzV2luZG93cygpOgogICAgcnVuZmlsZXNfcGF0dGVybiA9ICIoLipcLnJ1bmZpbGVzKVxcLioiCiAgbWF0Y2hvYmogPSByZS5tYXRjaChydW5maWxlc19wYXR0ZXJuLCBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pKQogIGlmIG1hdGNob2JqOgogICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDEpCgogIHJhaXNlIEFzc2VydGlvbkVycm9yKCdDYW5ub3QgZmluZCAucnVuZmlsZXMgZGlyZWN0b3J5IGZvciAlcycgJSBzeXMuYXJndlswXSkKCiMgQ3JlYXRlIHRoZSBydW5maWxlcyB0cmVlIGJ5IGV4dHJhY3RpbmcgdGhlIHppcCBmaWxlCmRlZiBDcmVhdGVNb2R1bGVTcGFjZSgpOgogIFpJUF9SVU5GSUxFU19ESVJFQ1RPUllfTkFNRSA9ICJydW5maWxlcyIKICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoIiIsICJCYXplbC5ydW5maWxlc18iKQogIHpmID0gemlwZmlsZS5aaXBGaWxlKEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSkKICB6Zi5leHRyYWN0YWxsKEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeCh0ZW1wX2RpcikpCiAgcmV0dXJuIG9zLnBhdGguam9pbih0ZW1wX2RpciwgWklQX1JVTkZJTEVTX0RJUkVDVE9SWV9OQU1FKQoKIyBSZXR1cm5zIHJlcG9zaXRvcnkgcm9vdHMgdG8gYWRkIHRvIHRoZSBpbXBvcnQgcGF0aC4KZGVmIEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBpbXBvcnRfYWxsKToKICBpZiBpbXBvcnRfYWxsOgogICAgcmVwb19kaXJzID0gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIGQpIGZvciBkIGluIG9zLmxpc3RkaXIobW9kdWxlX3NwYWNlKV0KICAgIHJldHVybiBbZCBmb3IgZCBpbiByZXBvX2RpcnMgaWYgb3MucGF0aC5pc2RpcihkKV0KICByZXR1cm4gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsICJpb19iYXplbF9ydWxlc19weXRob24iKV0KCiMgRmluZHMgdGhlIHJ1bmZpbGVzIG1hbmlmZXN0IG9yIHRoZSBydW5maWxlcyBkaXJlY3RvcnkuCmRlZiBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpOgogICMgSWYgdGhpcyBiaW5hcnkgaXMgdGhlIGRhdGEtZGVwZW5kZW5jeSBvZiBhbm90aGVyIG9uZSwgdGhlIG90aGVyIHNldHMKICAjIFJVTkZJTEVTX01BTklGRVNUX0ZJTEUgb3IgUlVORklMRVNfRElSIGZvciBvdXIgc2FrZS4KICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgcnVuZmlsZXMgPSBvcy5lbnZpcm9uLmdldCgnUlVORklMRVNfRElSJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgZnJvbSBhIHppcCwgdGhlcmUncyBubyBtYW5pZmVzdCBmaWxlLgogIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIG1vZHVsZV9zcGFjZSkKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgIm91dHB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzX21hbmlmZXN0IgogIHJ1bmZpbGVzID0gbW9kdWxlX3NwYWNlICsgJ19tYW5pZmVzdCcKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgcnVuZmlsZXMpCgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICJpbnB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzL01BTklGRVNUIgogIHJ1bmZpbGVzID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgJ01BTklGRVNUJykKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBydW5maWxlcykKCiAgcmV0dXJuIChOb25lLCBOb25lKQoKZGVmIE1haW4oKToKICBhcmdzID0gc3lzLmFyZ3ZbMTpdCgogIG5ld19lbnYgPSB7fQoKICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICBtb2R1bGVfc3BhY2UgPSBDcmVhdGVNb2R1bGVTcGFjZSgpCiAgZWxzZToKICAgIG1vZHVsZV9zcGFjZSA9IEZpbmRNb2R1bGVTcGFjZSgpCgogIHB5dGhvbl9pbXBvcnRzID0gJ3B5cGlfX3NldHVwdG9vbHNfMzhfMl80OnB5cGlfX3BpcF85XzBfMzpweXBpX193aGVlbF8wXzMwXzBhMCcKICBweXRob25fcGF0aF9lbnRyaWVzID0gQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSkKICBweXRob25fcGF0aF9lbnRyaWVzICs9IEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBUcnVlKQoKICBweXRob25fcGF0aF9lbnRyaWVzID0gW0dldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChkKSBmb3IgZCBpbiBweXRob25fcGF0aF9lbnRyaWVzXQoKICBvbGRfcHl0aG9uX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgcHl0aG9uX3BhdGggPSBvcy5wYXRoc2VwLmpvaW4ocHl0aG9uX3BhdGhfZW50cmllcykKICBpZiBvbGRfcHl0aG9uX3BhdGg6CiAgICBweXRob25fcGF0aCArPSBvcy5wYXRoc2VwICsgb2xkX3B5dGhvbl9wYXRoCgogIGlmIElzV2luZG93cygpOgogICAgcHl0aG9uX3BhdGggPSBweXRob25fcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBuZXdfZW52WydQWVRIT05QQVRIJ10gPSBweXRob25fcGF0aAogIHJ1bmZpbGVzX2VudmtleSwgcnVuZmlsZXNfZW52dmFsdWUgPSBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpCiAgaWYgcnVuZmlsZXNfZW52a2V5OgogICAgbmV3X2VudltydW5maWxlc19lbnZrZXldID0gcnVuZmlsZXNfZW52dmFsdWUKCiAgIyBOb3cgbG9vayBmb3IgbXkgbWFpbiBweXRob24gc291cmNlIGZpbGUuCiAgIyBUaGUgbWFnaWMgc3RyaW5nIHBlcmNlbnQtbWFpbi1wZXJjZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZQogICMgbWFpbiBmaWxlIG9mIHRoZSBQeXRob24gYmluYXJ5IGluIEJhemVsUHl0aG9uU2VtYW50aWNzLmphdmEuCiAgcmVsX3BhdGggPSAnaW9fYmF6ZWxfcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9waXB0b29sLnB5JwogIGlmIElzV2luZG93cygpOgogICAgcmVsX3BhdGggPSByZWxfcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBtYWluX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgcmVsX3BhdGgpCiAgbWFpbl9maWxlbmFtZSA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChtYWluX2ZpbGVuYW1lKQogIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhtYWluX2ZpbGVuYW1lKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgZm91bmQuJyAlIG1haW5fZmlsZW5hbWUKICBhc3NlcnQgb3MuYWNjZXNzKG1haW5fZmlsZW5hbWUsIG9zLlJfT0spLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCByZWFkYWJsZS4nICUgbWFpbl9maWxlbmFtZQoKICBwcm9ncmFtID0gcHl0aG9uX3Byb2dyYW0gPSBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSkKICBpZiBweXRob25fcHJvZ3JhbSBpcyBOb25lOgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHB5dGhvbiBiaW5hcnk6ICcgKyBQWVRIT05fQklOQVJZKQogIGFyZ3MgPSBbcHl0aG9uX3Byb2dyYW0sIG1haW5fZmlsZW5hbWVdICsgYXJncwoKICBvcy5lbnZpcm9uLnVwZGF0ZShuZXdfZW52KQoKICB0cnk6CiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgICAgIyBJZiBSVU5fVU5ERVJfUlVORklMRVMgZXF1YWxzIDEsIGl0IG1lYW5zIHdlIG5lZWQgdG8KICAgICAgIyBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByaWdodCBydW5maWxlcyBkaXJlY3RvcnkuCiAgICAgICMgKFNvIHRoYXQgdGhlIGRhdGEgZmlsZXMgYXJlIGFjY2Vzc2libGUpCiAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJSVU5fVU5ERVJfUlVORklMRVMiKSA9PSAiMSI6CiAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgImlvX2JhemVsX3J1bGVzX3B5dGhvbiIpKQogICAgICByZXRDb2RlID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MpCiAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKG1vZHVsZV9zcGFjZSksIFRydWUpCiAgICAgIGV4aXQocmV0Q29kZSkKICAgIGVsc2U6CiAgICAgIG9zLmV4ZWN2KGFyZ3NbMF0sIGFyZ3MpCiAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAgICAjIFRoaXMgd29ya3MgZnJvbSBQeXRob24gMi40IGFsbCB0aGUgd2F5IHRvIDMueC4KICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgIyBUaGlzIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBvcy5leGVjdigpIGZhaWxzIGZvciBzb21lIHJlYXNvbi4KICAgIGlmIG5vdCBnZXRhdHRyKGUsICdmaWxlbmFtZScsIE5vbmUpOgogICAgICBlLmZpbGVuYW1lID0gcHJvZ3JhbSAgIyBBZGQgaW5mbyB0byBlcnJvciBtZXNzYWdlCiAgICByYWlzZQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBNYWluKCkKUEsDBBQAAAAAAAAAIQCEeBfcrhwAAK4cAAAtAAAAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9waXB0b29sLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLm1rZHRlbXAoKSwgImNhY2VydC5wZW0iKQogICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKICAgICAgY2VydC53cml0ZShwa2d1dGlsLmdldF9kYXRhKCJwaXAuX3ZlbmRvci5yZXF1ZXN0cyIsICJjYWNlcnQucGVtIikpCiAgICBhcmd2ID0gWyItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBydWxlc19weXRob24ud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIGlmIHBpcF9tYWluKFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0pOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gW1doZWVsKHBhdGgpIGZvciBwYXRoIGluIGxpc3Rfd2hscygpXQogIHBvc3NpYmxlX2V4dHJhcyA9IGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscykKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgd2hsID0gIkB7bmFtZX0vLzp7cGF0aH0iLAogICAgICAgIHJlcXVpcmVtZW50cyA9ICJAe25hbWV9Ly86cmVxdWlyZW1lbnRzLmJ6bCIsCiAgICAgICAgZXh0cmFzID0gW3tleHRyYXN9XQogICAgKSIiIi5mb3JtYXQobmFtZT1hcmdzLm5hbWUsIHJlcG9fbmFtZT13aGVlbC5yZXBvc2l0b3J5X25hbWUoKSwKICAgICAgICAgICAgICAgIHBhdGg9d2hlZWwuYmFzZW5hbWUoKSwKICAgICAgICAgICAgICAgIGV4dHJhcz0nLCcuam9pbihbCiAgICAgICAgICAgICAgICAgICciJXMiJyAlIGV4dHJhCiAgICAgICAgICAgICAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdoZWVsLCBbXSkKICAgICAgICAgICAgICAgIF0pKQoKICB3aGxfdGFyZ2V0cyA9ICcsJy5qb2luKFsKICAgICcsJy5qb2luKFsKICAgICAgJyIlcyI6ICJAJXMvLzpwa2ciJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgd2hsLnJlcG9zaXRvcnlfbmFtZSgpKQogICAgXSArIFsKICAgICAgIyBGb3IgZXZlcnkgZXh0cmEgdGhhdCBpcyBwb3NzaWJsZSBmcm9tIHRoaXMgcmVxdWlyZW1lbnRzLnR4dAogICAgICAnIiVzWyVzXSI6ICJAJXMvLzolcyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCBleHRyYS5sb3dlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobC5yZXBvc2l0b3J5X25hbWUoKSwgZXh0cmEpCiAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdobCwgW10pCiAgICBdKQogICAgZm9yIHdobCBpbiB3aGxzCiAgXSkKCiAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIlwKIyBJbnN0YWxsIHBpcCByZXF1aXJlbWVudHMuCiMKIyBHZW5lcmF0ZWQgZnJvbSB7aW5wdXR9Cgpsb2FkKCJAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uLy9weXRob246d2hsLmJ6bCIsICJ3aGxfbGlicmFyeSIpCgpkZWYgcGlwX2luc3RhbGwoKToKICB7d2hsX2xpYnJhcmllc30KCl9yZXF1aXJlbWVudHMgPSB7ewogIHttYXBwaW5nc30KfX0KCmFsbF9yZXF1aXJlbWVudHMgPSBfcmVxdWlyZW1lbnRzLnZhbHVlcygpCgpkZWYgcmVxdWlyZW1lbnQobmFtZSk6CiAgbmFtZV9rZXkgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpLmxvd2VyKCkKICBpZiBuYW1lX2tleSBub3QgaW4gX3JlcXVpcmVtZW50czoKICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHBpcC1wcm92aWRlZCBkZXBlbmRlbmN5OiAnJXMnIiAlIG5hbWUpCiAgcmV0dXJuIF9yZXF1aXJlbWVudHNbbmFtZV9rZXldCiIiIi5mb3JtYXQoaW5wdXQ9YXJncy5pbnB1dCwKICAgICAgICAgICB3aGxfbGlicmFyaWVzPSdcbicuam9pbihtYXAod2hsX2xpYnJhcnksIHdobHMpKSBpZiB3aGxzIGVsc2UgInBhc3MiLAogICAgICAgICAgIG1hcHBpbmdzPXdobF90YXJnZXRzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAHGnWX+YVAADmFQAAKQAAAGlvX2JhemVsX3J1bGVzX3B5dGhvbi9ydWxlc19weXRob24vd2hsLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X25hbWUoc2VsZik6CiAgICAjIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBCYXplbCByZXBvc2l0b3J5IGZvciB0aGlzIHBhY2thZ2UuCiAgICBjYW5vbmljYWwgPSAncHlwaV9fe31fe30nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKICAgICMgRXNjYXBlIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3JlLgogICAgcmV0dXJuIHJlLnN1YignWy0uK10nLCAnXycsIGNhbm9uaWNhbCkKCiAgZGVmIF9kaXN0X2luZm8oc2VsZik6CiAgICAjIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlzdC1pbmZvIGRpcmVjdG9yeSB3aXRoaW4gdGhlIC53aGwgZmlsZS4KICAgICMgZS5nLiBnb29nbGVfY2xvdWQtMC4yNy4wLXB5Mi5weTMtbm9uZS1hbnkud2hsIC0+CiAgICAjICAgICAgZ29vZ2xlX2Nsb3VkLTAuMjcuMC5kaXN0LWluZm8KICAgIHJldHVybiAne30te30uZGlzdC1pbmZvJy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCgogIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICMgRXh0cmFjdCB0aGUgc3RydWN0dXJlZCBkYXRhIGZyb20gbWV0YWRhdGEuanNvbiBpbiB0aGUgV0hMJ3MgZGlzdC1pbmZvCiAgICAjIGRpcmVjdG9yeS4KICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgIyBmaXJzdCBjaGVjayBmb3IgbWV0YWRhdGEuanNvbgogICAgICB0cnk6CiAgICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvbWV0YWRhdGEuanNvbicpIGFzIGY6CiAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgIHBhc3MKICAgICAgIyBmYWxsIGJhY2sgdG8gTUVUQURBVEEgZmlsZSAoaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pCiAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL01FVEFEQVRBJykgYXMgZjoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbWV0YWRhdGEoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICBkZWYgbmFtZShzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCduYW1lJykKCiAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCBleHRyYT1Ob25lKToKICAgICIiIkFjY2VzcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgV2hlZWwuCgogICAgQXJnczoKICAgICAgZXh0cmE6IGlmIHNwZWNpZmllZCwgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgb2YgdGhlIG5hbWVkICJleHRyYSIuCgogICAgWWllbGRzOgogICAgICB0aGUgbmFtZXMgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG1ldGFkYXRhLmpzb24KICAgICIiIgogICAgIyBUT0RPKG1hdHRtb29yKTogSXMgdGhlcmUgYSBzY2hlbWEgdG8gZm9sbG93IGZvciB0aGlzPwogICAgcnVuX3JlcXVpcmVzID0gc2VsZi5tZXRhZGF0YSgpLmdldCgncnVuX3JlcXVpcmVzJywgW10pCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gcnVuX3JlcXVpcmVzOgogICAgICBpZiByZXF1aXJlbWVudC5nZXQoJ2V4dHJhJykgIT0gZXh0cmE6CiAgICAgICAgIyBNYXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZXh0cmEgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgY29udGludWUKICAgICAgbWFya2VyID0gcmVxdWlyZW1lbnQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgIGlmIG1hcmtlciBhbmQgbm90IHBrZ19yZXNvdXJjZXMuZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgIyBUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgUEVQIDUwOCBtYXJrZXIsCiAgICAgICAgIyBzbyBpZ25vcmUgdGhpcyByZXF1aXJlbWVudC4KICAgICAgICBjb250aW51ZQogICAgICByZXF1aXJlcyA9IHJlcXVpcmVtZW50LmdldCgncmVxdWlyZXMnLCBbXSkKICAgICAgZm9yIGVudHJ5IGluIHJlcXVpcmVzOgogICAgICAgICMgU3RyaXAgb2ZmIGFueSB0cmFpbGluZyB2ZXJzaW9uaW5nIGRhdGEuCiAgICAgICAgcGFydHMgPSByZS5zcGxpdCgnWyA+PD0oKV0nLCBlbnRyeSkKICAgICAgICB5aWVsZCBwYXJ0c1swXQoKICBkZWYgZXh0cmFzKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ2V4dHJhcycsIFtdKQoKICBkZWYgZXhwYW5kKHNlbGYsIGRpcmVjdG9yeSk6CiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgIHdobC5leHRyYWN0YWxsKGRpcmVjdG9yeSkKCiAgIyBfcGFyc2VfbWV0YWRhdGEgcGFyc2VzIE1FVEFEQVRBIGZpbGVzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMzE0LwogIGRlZiBfcGFyc2VfbWV0YWRhdGEoc2VsZiwgY29udGVudCk6CiAgICAjIFRPRE86IGhhbmRsZSBmaWVsZHMgb3RoZXIgdGhhbiBqdXN0IG5hbWUKICAgIG5hbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUoJ05hbWU6ICguKiknKQogICAgcmV0dXJuIHsgJ25hbWUnOiBuYW1lX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpLmdyb3VwKDEpIH0KCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdVbnBhY2sgYSBXSEwgZmlsZSBhcyBhIHB5X2xpYnJhcnkuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0td2hsJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSAud2hsIGZpbGUgd2UgYXJlIGV4cGFuZGluZy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHBpcF9pbXBvcnQgZnJvbSB3aGljaCB0byBkcmF3IGRlcGVuZGVuY2llcy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nLicsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGV4cGFuZCB0aGluZ3MuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFzJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXQgb2YgZXh0cmFzIGZvciB3aGljaCB0byBnZW5lcmF0ZSBsaWJyYXJ5IHRhcmdldHMuJykKCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICB3aGwgPSBXaGVlbChhcmdzLndobCkKCiAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIHdobC5leHBhbmQoYXJncy5kaXJlY3RvcnkpCgogIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYXJncy5kaXJlY3RvcnksICdCVUlMRCcpLCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIgpwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQoKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdKSwKICAgIGRhdGEgPSBnbG9iKFsiKiovKiJdLCBleGNsdWRlPVsiKiovKi5weSIsICIqKi8qICoiLCAiQlVJTEQiLCAiV09SS1NQQUNFIl0pLAogICAgIyBUaGlzIG1ha2VzIHRoaXMgZGlyZWN0b3J5IGEgdG9wLWxldmVsIGluIHRoZSBweXRob24gaW1wb3J0CiAgICAjIHNlYXJjaCBwYXRoIGZvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhpcy4KICAgIGltcG9ydHMgPSBbIi4iXSwKICAgIGRlcHMgPSBbe2RlcGVuZGVuY2llc31dLAopCntleHRyYXN9IiIiLmZvcm1hdCgKICByZXF1aXJlbWVudHM9YXJncy5yZXF1aXJlbWVudHMsCiAgZGVwZW5kZW5jaWVzPScsJy5qb2luKFsKICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkCiAgICBmb3IgZCBpbiB3aGwuZGVwZW5kZW5jaWVzKCkKICBdKSwKICBleHRyYXM9J1xuXG4nLmpvaW4oWwogICAgIiIicHlfbGlicmFyeSgKICAgIG5hbWUgPSAie2V4dHJhfSIsCiAgICBkZXBzID0gWwogICAgICAgICI6cGtnIix7ZGVwc30KICAgIF0sCikiIiIuZm9ybWF0KGV4dHJhPWV4dHJhLAogICAgICAgICAgICBkZXBzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkZXAKICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYSkKICAgICAgICAgICAgXSkpCiAgICBmb3IgZXh0cmEgaW4gYXJncy5leHRyYXMgb3IgW10KICBdKSkpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIG1haW4oKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAABsAAABweXBpX19waXBfOV8wXzMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAKtxNFcHBQAABwUAADMAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RwaXAKPT09CgpUaGUgYFB5UEEgcmVjb21tZW5kZWQKPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2N1cnJlbnQvPmBfCnRvb2wgZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLgoKKiBgSW5zdGFsbGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZS9pbnN0YWxsaW5nLmh0bWw+YF8KKiBgRG9jdW1lbnRhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby8+YF8KKiBgQ2hhbmdlbG9nIDxodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZS9uZXdzLmh0bWw+YF8KKiBgR2l0aHViIFBhZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcD5gXwoqIGBJc3N1ZSBUcmFja2luZyA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcz5gXwoqIGBVc2VyIG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5dGhvbi12aXJ0dWFsZW52PmBfCiogYERldiBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXBhLWRldj5gXwoqIFVzZXIgSVJDOiAjcHlwYSBvbiBGcmVlbm9kZS4KKiBEZXYgSVJDOiAjcHlwYS1kZXYgb24gRnJlZW5vZGUuCgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL3B5cGEvcGlwL21hc3Rlci5zdmcKICAgOnRhcmdldDogaHR0cDovL3RyYXZpcy1jaS5vcmcvcHlwYS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9weXBhL3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9weXBhL3BpcC9oaXN0b3J5CgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3BpcC9iYWRnZS8/dmVyc2lvbj1zdGFibGUKICAgOnRhcmdldDogaHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBwaXAgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsIGNoYXQKcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgYFB5UEEgQ29kZSBvZiBDb25kdWN0YF8uCgouLiBfUHlQQSBDb2RlIG9mIENvbmR1Y3Q6IGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8KCgpQSwMEFAAAAAAAAAAhADxQfyX5CQAA+QkAACwAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQU1ldGFkYXRhLVZlcnNpb246IDIuMApOYW1lOiBwaXAKVmVyc2lvbjogOS4wLjMKU3VtbWFyeTogVGhlIFB5UEEgcmVjb21tZW5kZWQgdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCkhvbWUtcGFnZTogaHR0cHM6Ly9waXAucHlwYS5pby8KQXV0aG9yOiBUaGUgcGlwIGRldmVsb3BlcnMKQXV0aG9yLWVtYWlsOiBweXRob24tdmlydHVhbGVudkBncm91cHMuZ29vZ2xlLmNvbQpMaWNlbnNlOiBNSVQKS2V5d29yZHM6IGVhc3lfaW5zdGFsbCBkaXN0dXRpbHMgc2V0dXB0b29scyBlZ2cgdmlydHVhbGVudgpQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UKQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogQnVpbGQgVG9vbHMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNApDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiBJbXBsZW1lbnRhdGlvbiA6OiBQeVB5ClJlcXVpcmVzLVB5dGhvbjogPj0yLjYsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioKUHJvdmlkZXMtRXh0cmE6IHRlc3RpbmcKUHJvdmlkZXMtRXh0cmE6IHRlc3RpbmcKUmVxdWlyZXMtRGlzdDogcHl0ZXN0OyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogdmlydHVhbGVudiAoPj0xLjEwKTsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IHNjcmlwdHRlc3QgKD49MS4zKTsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IG1vY2s7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiBwcmV0ZW5kOyBleHRyYSA9PSAndGVzdGluZycKCnBpcAo9PT0KClRoZSBgUHlQQSByZWNvbW1lbmRlZAo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvY3VycmVudC8+YF8KdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCgoqIGBJbnN0YWxsYXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL2luc3RhbGxpbmcuaHRtbD5gXwoqIGBEb2N1bWVudGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvLz5gXwoqIGBDaGFuZ2Vsb2cgPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL25ld3MuaHRtbD5gXwoqIGBHaXRodWIgUGFnZSA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwPmBfCiogYElzc3VlIFRyYWNraW5nIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzPmBfCiogYFVzZXIgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHl0aG9uLXZpcnR1YWxlbnY+YF8KKiBgRGV2IG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5cGEtZGV2PmBfCiogVXNlciBJUkM6ICNweXBhIG9uIEZyZWVub2RlLgoqIERldiBJUkM6ICNweXBhLWRldiBvbiBGcmVlbm9kZS4KCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9waXAvbWFzdGVyLnN2ZwogICA6dGFyZ2V0OiBodHRwOi8vdHJhdmlzLWNpLm9yZy9weXBhL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL3B5cGEvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L3B5cGEvcGlwL2hpc3RvcnkKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvcGlwL2JhZGdlLz92ZXJzaW9uPXN0YWJsZQogICA6dGFyZ2V0OiBodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZQoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHBpcCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKClBLAwQUAAAAAAAAACEAV/4j5ZhiAACYYgAAKgAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL1JFQ09SRHBpcC9fX2luaXRfXy5weSxzaGEyNTY9YXh2SWpXX01naG1HYjlWUUViUmZreXMxYTVqS0dzeXlaMGRmME0tYmVQVSwxMTk1Ng0KcGlwL19fbWFpbl9fLnB5LHNoYTI1Nj1WNktoLUlFREVGcHQxY2FoUkU2TWFqVUZfMTRxSlJfUXN2bjRNaldaWHpFLDU4NA0KcGlwL2Jhc2Vjb21tYW5kLnB5LHNoYTI1Nj1UVGxtWmVzUTRWdXhjdG8yS3F3WkdtZ21ONWlvSEVsX0RlRmV2OWllX1NBLDExOTEwDQpwaXAvYmFzZXBhcnNlci5weSxzaGEyNTY9QUtNT2VGM2ZUclJyb2l2MERtVFFiZGlMVzBEUXV4MktxR0NfZEpKQjlkMCwxMDQ2NQ0KcGlwL2NtZG9wdGlvbnMucHksc2hhMjU2PThKQ2NGMmtLQUYyY0ZuVjc3b1ctM0RzSEppZnI5akYyV3VDaHp6d2djd2csMTY0NzQNCnBpcC9kb3dubG9hZC5weSxzaGEyNTY9X1ZKYU5Hc2Rhd09OZDlzaGFzbDdNeE56VG84ZzBFQUNuMmdhNkdSak01bywzMjE1Mw0KcGlwL2V4Y2VwdGlvbnMucHksc2hhMjU2PUJ2cUgtSnczdFAyYi0ySUoya2pyUWVtT0FQTXFLclFNTFJJWkhaUXBKWGssODEyMQ0KcGlwL2luZGV4LnB5LHNoYTI1Nj1MNlVodEFFWmMycXc3QnFmUXJrUFFjdzJnQ2dFdzNHdWtMUlNBOTVCTnlJLDM5OTUwDQpwaXAvbG9jYXRpb25zLnB5LHNoYTI1Nj05ckpSbGdvbkM2UUMyekdESW5fN21YYW9aOV90Rl9JSE0yQlFoV1ZSZ2JvLDU2MjYNCnBpcC9wZXA0MjV0YWdzLnB5LHNoYTI1Nj1xM2tlYzRmNk5Ic3p1R1lJaEdJYlZ2czg5NkQwNnVKQW5LRmdKX3djZTQ0LDEwOTgwDQpwaXAvc3RhdHVzX2NvZGVzLnB5LHNoYTI1Nj1GNnVERzZHajdSTktRSlVEbmQ4N1FLcUkxNlVzLXQtQjB3UEZfNFFNcFdjLDE1Ng0KcGlwL3doZWVsLnB5LHNoYTI1Nj1RU1dtR3MydWktbjRVTVdtMEpVWTZhTUNjd05LdW5nVnpiV3N4STlLbEpRLDMyMDEwDQpwaXAvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9V2FhU0ozcm9TU0pfVXY0eUtBeGxHb2hLRUg5WVVBM2FJaDFYZzJJamZnVSw0NjcwDQpwaXAvX3ZlbmRvci9hcHBkaXJzLnB5LHNoYTI1Nj0tOVVPSVp5NjJhaENRVlk5LWI3Tm42XzVfNFk2b29IbnY3MnRNOGlIaTlZLDIyMzY4DQpwaXAvX3ZlbmRvci9kaXN0cm8ucHksc2hhMjU2PUE0RG91dzlwY3FkWXhEVHA1Yi1PUjAyZnhWWG5mV3Mtd0Mxd0E4OXJoUmssMzgzNDkNCnBpcC9fdmVuZG9yL2lwYWRkcmVzcy5weSxzaGEyNTY9d2ltYnFjRTdyd3dFVGx1Y244QV80UWRfLU5LWFBPQmNOeEpIYXJVb1huZyw4MDE3Ng0KcGlwL192ZW5kb3Ivb3JkZXJlZGRpY3QucHksc2hhMjU2PTRLc0Z1YzZWOElnSFJPQ0hVdS00dkNycjIxWlBQZWE3WjBjdlg5QWpRN3csNDA5NA0KcGlwL192ZW5kb3IvcHlwYXJzaW5nLnB5LHNoYTI1Nj03dkF1VVZiaDZ0eFVLUVIySXpKOF85REttRDV2dG01TURzc1drSTBrYThvLDIyNDE3MQ0KcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5LHNoYTI1Nj1QY2RaNDBkMG9oTXNkSm1BNHQwQWVBV2JQWGkxdEZzdkF3QTVLRTVGR2VZLDc3Mw0KcGlwL192ZW5kb3IvcmV0cnlpbmcucHksc2hhMjU2PWszZmZsZjVfTW0wWGNJSlloQjdUajM0YnFDQ1BoVURrWWJ4MU52VzJGUEUsOTk3Mg0KcGlwL192ZW5kb3Ivc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX19pbml0X18ucHksc2hhMjU2PVVQeUZsejBkSWp4dXN1NUlUaWc5VURGSmRTWTVMVHdpamhsZG4wQWZ5elUsMzAyDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weSxzaGEyNTY9TVB4WmZaZDJMS0R6VnJzNTVYM3dBMXJzSTJZdVA4ZXZMWlN3UWowZElrMCwxMzIwDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvYWRhcHRlci5weSxzaGEyNTY9UmFHWXlSQS1SQTFKMEFuRTY3R3pFWUZQQnU0WUg0RVFVdlFxVEthNTdpTSw0NjA4DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGUucHksc2hhMjU2PXh0bC1WLXByOUtTdDlWdkZEUkNCOXlySFBFdnF2YmstNU0xdkFJblpiNWssNzkwDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5LHNoYTI1Nj0yTVRPeUkxSmxHX2dKcGZ1eTMtVVFRbEtNUmlKaW1SLVhYQjBzcjQ0d2owLDM4MA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbnRyb2xsZXIucHksc2hhMjU2PWVsRHNMY2FZQTE1bmNvZFJtSG5XUXA2ZWtVX29jRUd0RGVHTGJzblRqem8sMTMwMjQNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9maWxld3JhcHBlci5weSxzaGEyNTY9X0s4Y1N0bVhxRDMzbTE1UGZzUThybHBvNkZmWGpWYkttanZMWHlJQ1JnSSwyNTMxDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvaGV1cmlzdGljcy5weSxzaGEyNTY9V3RKclZzeVdqcFA5V29VaURWZFRaWlJOQkN6NVpWcHRhUXBZbnFvZkRRVSw0MTQxDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvc2VyaWFsaXplLnB5LHNoYTI1Nj1YTTZlbEc5RFNOZXh3YU9DZ01qVXRmckhIVzVOQUI2VFNiSWYzeDIzNXhzLDY1MzYNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5LHNoYTI1Nj1LcXl1XzNUV181NFhEdWRoYTQtSEYyMXZ5RU9BSjRablJYRnlzVGlMbVhBLDQ5OA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weSxzaGEyNTY9dVduVXR5TXZIWV9MVUxhTF80X0lSMUZfeFBnSzV6SGZKeVJuQnE0RG5QRSwzNjkNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvZmlsZV9jYWNoZS5weSxzaGEyNTY9RnNEdWczYndVQVEzb2tqamZHenhsRGFCZjJmd1ZTbjFpQktNVEw2U3lHVSwzNTMyDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL3JlZGlzX2NhY2hlLnB5LHNoYTI1Nj1YeXdxeGtTOU1rQ2FmbFRPWV93anJFMDJuZUtkeXdCOVl3bE9CYlA3WXdjLDk3Mw0KcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weSxzaGEyNTY9UVNSeTFVenRFLWkwOUl1R0lLS3VjMTkwazA3bHQ2a3RhYmJlbFBNSVpvYyw2Mw0KcGlwL192ZW5kb3IvY2VydGlmaS9fX21haW5fXy5weSxzaGEyNTY9RmlPWXQxRmx0c3Q3d2s5RFJhNkdDb0JyOHFCVXhsTlF1X01LSmYwNEU2cyw0MQ0KcGlwL192ZW5kb3IvY2VydGlmaS9jYWNlcnQucGVtLHNoYTI1Nj03Q0VYZkxIeER3dkRwd1Z1MHlfMmxmSllrNjNjVS1LVUtJX0RMMUxxOFVvLDI3MTA4OA0KcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5LHNoYTI1Nj14UFFEZEdfc2l5NUE3QmZxR1dhN1JKaGNBNjF4WEVxUGlTcnc5R055aEhFLDgzNg0KcGlwL192ZW5kb3IvY2hhcmRldC9fX2luaXRfXy5weSxzaGEyNTY9WXNQNXdRbHNISjJhdUYxUlpKZnlwaVNyQ0E3X2JRaVJtM0VTX05JNzYtWSwxNTU5DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5LHNoYTI1Nj1EX3pLNUd5em9Wc1JlczBIa0xKemlsdEZRWDBiS0NMT3JGZTlfeER2T184LDMxMjU0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHksc2hhMjU2PWtCeEhiZGV0QnBQZTd4cmxiLWU5OTBpb3Q2NGdfZUdTTGQzMmxCN19oM00sMTc1Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyZGlzdHJpYnV0aW9uLnB5LHNoYTI1Nj0zd29XUzYyS3JHb29LeXF6NHpRU25qRmJKcGE2VjdnMDJkYUFpYlR3Y2w4LDk0MTENCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldGdyb3VwcHJvYmVyLnB5LHNoYTI1Nj02YkR1OFlJaVJ1U2NYNGNhOUlnYjBVNjlUQTJQR1hYRGVqNkNjNF85a080LDM3ODcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weSxzaGEyNTY9S1Ntd0pFcmp5cHlqMGJSWm1DNUY1ZU03YzhZUWdMWUlqWlhpbnRaTnN0Zyw1MTEwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NvZGluZ3N0YXRlbWFjaGluZS5weSxzaGEyNTY9VllwXzZjeXlraTVzSGdYRFNablhXNHExb2VsSGMzY3U5QXlRVFg3dXVnOCwzNTkwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weSxzaGEyNTY9UEtUekhrU2J0YkhEcVM5UHl1ak1iWDc0cTFhOG1NcGVRVERWc1FoWk1SdywxMTM0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NwOTQ5cHJvYmVyLnB5LHNoYTI1Nj1UWjQzNFFYOHp6QnNuVXZMXzh3bTRBUVZUWjJaa3FFRVFMX2xOdzlmOW93LDE4NTUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZW51bXMucHksc2hhMjU2PUFpbXdkYjlhczFkSktaYUZOVUgyT2hXSVZCVmQ2WmtKSl9XSzVzTlk4Y1UsMTY2MQ0KcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHksc2hhMjU2PWtreXFWZzFZdzNESU9BTUoyYmRseVFnVUZRaHVIQVc4ZFVHc2tUb05XU2MsMzk1MA0KcGlwL192ZW5kb3IvY2hhcmRldC9lc2NzbS5weSxzaGEyNTY9UnVYbGdOdlRJRGFybmR2bGxOQ2s1V1pCSXBkQ3hRMGtjZDlFQXV4VWg4NCwxMDUxMA0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weSxzaGEyNTY9aUQ4SmRwMElTUmpnamlWTjdmMGU4eEdlUUo1R00yb2VaMWRBOG5iU2VVdywzNzQ5DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tyZnJlcS5weSxzaGEyNTY9LTdHZG12Z1dlejQtZU80U3VYcGE3dEJpRGk1dlJYUThXdmRGQXpWYVNmbywxMzU0Ng0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weSxzaGEyNTY9TXFGTVRRWHhXNEhieklwWjlsS0RIQjNHTjhTUDR5aUhlblRtZjhnX1B4WSwxNzQ4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weSxzaGEyNTY9Tm8xV3lkdUZPZ0I1VklUVUE3UEx5QzVvSlJOelJ5TWJCeGFLSTFsMTZNQSwzMTYyMQ0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weSxzaGEyNTY9MTNwNkVQNHlSYXhxblA0aUh0eEhPSjZSMnp4SHExX204aFRSanpWWjk1YywxNzQ3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMmZyZXEucHksc2hhMjU2PUpYOGxzd2VLTG1uQ3dtazhVSEVRc0xna3JfclBfa0Vidml2QzRxUE9ybGMsMjA3MTUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5LHNoYTI1Nj1nR3ZJV2k5V2hEakUteFFYSHZOSXlybkx2RWJNQVlneVVTWjY1SFVmeWx3LDE3NTQNCnBpcC9fdmVuZG9yL2NoYXJkZXQvaGVicmV3cHJvYmVyLnB5LHNoYTI1Nj1jM1NaLUs3aHZ5ekdZNkpSQVp4Smd3Sl9zVVM5azBXWWt2TVkwMFlCWUZvLDEzODM4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2ppc2ZyZXEucHksc2hhMjU2PXZwbUp2MkJ1MEo4Z25NVlJQSE1GZWZUUnZvX2hhMW1yeUxpZzhDQndnT2csMjU3NzcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvanBjbnR4LnB5LHNoYTI1Nj1QWWxOcVJVUVQ4TE0zY1Q1Rm1IR1AwaWlzY0ZsVFdFRDkyTUFMdkJ1bmdvLDE5NjQzDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdidWxnYXJpYW5tb2RlbC5weSxzaGEyNTY9MUhxUVM5UGJ0bmoxeFFneGl0Sk12dzhYNmtLcjVPb2NrTkNaV2ZFUXJQRSwxMjgzOQ0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weSxzaGEyNTY9TE9EYWp2c2V0SDg3eVlERFFLQTJDVUxYVUg4N3RJMjIzZGhmamg5Wng5YywxNzk0OA0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nZ3JlZWttb2RlbC5weSxzaGEyNTY9OFlBVzdiVThZd1NKYXAwa0lKU2JQTXcxQkVxekdqV3pxY3FmMFdnVUtBQSwxMjY4OA0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naGVicmV3bW9kZWwucHksc2hhMjU2PUpTbnFtRTVFNjJ0RExUUFR2THBRc2c1Z09NTzRQYmRXUnZWN0F2a2MwSEEsMTEzNDUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5LHNoYTI1Nj1SaGFwWVNHNWwwWmFPLVZWNEZhbjVzVzBXUkdRcWh3Qk02MXl4M3l4eU9BLDEyNTkyDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0aGFpbW9kZWwucHksc2hhMjU2PThsMDE3M0d1X1c2RzhteG1RT1RFRjRsczJZZEU3RnhXZjNRa1N4RUdYSlEsMTEyOTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3R1cmtpc2htb2RlbC5weSxzaGEyNTY9VzIyZVJOSnNxSTZ1V0Fmd1hTS1ZXV25DZXJZcXJJOGRaUVRtX00wbFJGaywxMTEwMg0KcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHksc2hhMjU2PVMySW9PUmhGazM5RkVGT2xTRld0Z1Z5YlJpUDZoN0JsTGxkSFZjbE5rVTgsNTM3MA0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNoYXJzZXRwcm9iZXIucHksc2hhMjU2PUFSOTVlRkg5dnVxU2Z2TFFaTi1MNWlqZWEyNU5PQkNvWHF3OHM1Tzl4TFEsMzQxMw0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzZ3JvdXBwcm9iZXIucHksc2hhMjU2PWg2VFJubllxMk94RzFXZEQ1Sk95eGNkVnBuN2RHMHEtdkI4bldyNW1iaDQsMjAxMg0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzc20ucHksc2hhMjU2PVNZMzJ3VklGM0h6Y2pZM0JhRXNweTltZXRiTlNLeElJQjBSS1BuN3RqcEksMjU0ODENCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2JjaGFyc2V0cHJvYmVyLnB5LHNoYTI1Nj1MRFNwQ2xkRENGbFl3VWtHa3dEMm9GeExsUFdJV1hUMDlha0hfMlBpWTc0LDU2NTcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5LHNoYTI1Nj0xSXByY0NCX2sxcWZtbnhHQzZNQmJ4RUxsS3FEM3NjVzZTOFlJd2RleVhBLDM1NDYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2ppc3Byb2Jlci5weSxzaGEyNTY9SUl0LWxaajBXSnFLNHJtVVp6S1pQNEdKbEU4S1VFdEZZVnVZOTZlazVNUSwzNzc0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3VuaXZlcnNhbGRldGVjdG9yLnB5LHNoYTI1Nj1xTDAxNzRsU1pFNDQyZUIyMW5ua3RUOV9WY0F5ZTA3bGFGV1VlVXJqdHRZLDEyNDg1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3V0Zjhwcm9iZXIucHksc2hhMjU2PUlkRDh2M3pXT3NCOE9MaXlQaS15X2Zxd2lwUkZ4VjlOYzFlS0JMU3VJRXcsMjc2Ng0KcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5LHNoYTI1Nj1zcDNCMDhtckRYQi1wZjNLOWZxSl96ZURIT0NMQzhScm5nUXlERmFwXzdnLDI0Mg0KcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHksc2hhMjU2PUFicEhHY2dMYi1rUnNKR253RkVrdGs3dXpwWk9DY0JZNzQtWUJkcktWR3MsMQ0KcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvY2hhcmRldGVjdC5weSxzaGEyNTY9WUJPOEw0bVhvMFdSNl8tRmpoXzhReFBCb0VCTnFCOW9OeE5yZGM1NEFRcywyNzM4DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9fX2luaXRfXy5weSxzaGEyNTY9OXhCeXJUdms5dXBrTDVOR1Y1SXQyRWplNC1rek5Md2FfMWxHUFdwWG9OVSwyNDANCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2kucHksc2hhMjU2PUZpMHVuLVFMcVJtLXY3b19uS2lPcXlDOFBhcEJKSzdETFZfcTlMS3RUTzAsMjUyNA0KcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHksc2hhMjU2PWdKWkIzNUxiZGphdHlrZDJ6clVVbm9rTXprdmNGZ3NjeW5fdE54eE1GSEEsOTY2OA0KcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weSxzaGEyNTY9Y0hxVkp0YjgyT0c3SFVDeHZRMmpvRzdOX0NveGJJS2JJX2Zncnlaa2oyMCwxOTE3DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS93aW4zMi5weSxzaGEyNTY9X1NDRW9US19HQTJ0VTFuaGJheUtLYWMtdjlKbjk4bENQSUZPZUZNR0NIUSw1MzY1DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5LHNoYTI1Nj1WN1U3b2p3RzFxNG42UEtyaXBqRXZXX2h0WVFpNXVlWFNNM0xVVW9xcURZLDYyOTANCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHksc2hhMjU2PS1hVWVOTkNmaUlHXzFUcWYxOUJIMHhMTnVCS0dYMUk3bE5oY0xZZ0ZVRUEsNTgxDQpwaXAvX3ZlbmRvci9kaXN0bGliL2NvbXBhdC5weSxzaGEyNTY9RnpLbFA5ZE5VTUgtal8xTENWbmpneDZLZ1VicG5SalRqWWtUa0RZUlBsSSw0MDgwMQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9kYXRhYmFzZS5weSxzaGEyNTY9am5pSm1ZazBNajJ0NmdaWWJubjY4VHZRd25WWjBrWHlldWZfM0F4RmNsayw0OTY3Mg0KcGlwL192ZW5kb3IvZGlzdGxpYi9pbmRleC5weSxzaGEyNTY9Q3c4Z3hGcV83eFh2ZGdFeEwzZWZqTEFZM0VBUERNU0wzVkE0MlJrYlFCcywyMTA4NQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9sb2NhdG9ycy5weSxzaGEyNTY9aERfSG0zYVNMOURrbFk5Q3h5Y3Qybl83NGdaMHhORkZHQjVMN002ZHMxNCw1MTAxMw0KcGlwL192ZW5kb3IvZGlzdGxpYi9tYW5pZmVzdC5weSxzaGEyNTY9M3FFdVpoSGxEYnZ5WVoxQlpiZGFwREFpdmdNZ1V3V3BaMDBjbVhxY24xOCwxNDgxMA0KcGlwL192ZW5kb3IvZGlzdGxpYi9tYXJrZXJzLnB5LHNoYTI1Nj1pUnJWV3dweVZ3amtLSlNYOE5FUTkyX01STXdwUk9jZk5HS0NELUNoMVFNLDYyODINCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHksc2hhMjU2PWhVc2Y3UWgyQWU0Q0NrTDMzcUs4cHB3QzhaVHpUN2VwNkhqOVJLcGlqS1UsMzg4MzMNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5LHNoYTI1Nj1WRkJWYkZxTFZxREJTUURYY0ZRSHJYMUtFY3VvRHhUSzY5OVlkaV9iZXljLDEwNzY2DQpwaXAvX3ZlbmRvci9kaXN0bGliL3NjcmlwdHMucHksc2hhMjU2PXhwZWhOZklTR1BUTnhRWnUwMks5UncyUWJOeF8yUTRlbWVQdjNXNVgwaXcsMTUyMjQNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZSxzaGEyNTY9Y3AwVUFVRERyMXRHQXg4YWRsS3hXYkNISWEtb0IzYnhldjV6WXpnQXI4RSw4OTA4OA0KcGlwL192ZW5kb3IvZGlzdGxpYi90NjQuZXhlLHNoYTI1Nj1GaWxqRFBjWDlxdm9lOUZZRV85cE5FSHFicU1uaGNDT3VJX29MSjRGOUY4LDk3NzkyDQpwaXAvX3ZlbmRvci9kaXN0bGliL3V0aWwucHksc2hhMjU2PUUyd1UtUlpTaFBNRlVNSnI5a1BtZW1UVUxpbk00cUR6b3NOUGloQ3VLRTAsNTI5OTENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weSxzaGEyNTY9Q2dnaE9VeWx4R0Q3ZEVBMlMzTXZXang3bVlfMmJXc2x1RjBPZjNZeGw0WSwyMzcxMQ0KcGlwL192ZW5kb3IvZGlzdGxpYi93MzIuZXhlLHNoYTI1Nj1MSXRyQkplc0VxdDJRVFF1Qi15aGEyWWJNZWdVUkhtSG1kU3hoakJxbW5jLDg1NTA0DQpwaXAvX3ZlbmRvci9kaXN0bGliL3c2NC5leGUsc2hhMjU2PW5fUGlvQkM3bHR6N3NBazFXTGJMelpKZ1M0UjJheFN5XzBIUGY4WkNzRWcsOTQyMDgNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHksc2hhMjU2PVVQNTNjS3hPTTVyN2JIU1MtbjVwckY2aHdKRVZzTVc5Wk5KdXRPdUMyNmMsMzkxMTUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L19faW5pdF9fLnB5LHNoYTI1Nj1icVNfZFRPSDZ1VzlpR2dkMHV6ZnBQam82dlo0eHBQWjdreWZaSjJ2TmF3LDI3NA0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvbWlzYy5weSxzaGEyNTY9S1dlY0lOZGJGTk94U09QMWZHRjY4MENKbmFDNlM0ZkJSZ0V0YVlUdzBpZyw5NzENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3NodXRpbC5weSxzaGEyNTY9VlcxdDN1WXFValdaSDdqVi02UWlpbUxobmxkb1Y1dUlwSDRFdWlUMWpmdywyNTY0Nw0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLmNmZyxzaGEyNTY9c3daS3hxOVJZNWU5cjNQWENybHZRUE1zdk9kaVdaQlRITEVicVM4TEpMVSwyNjE3DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcucHksc2hhMjU2PWVTRXlKZzdqeEZfZUhsSEc4SU90bDkza2IwN1VvTUlScDF3WXNQZUdpOWssMjY5NTUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3RhcmZpbGUucHksc2hhMjU2PUlocDdyWFJjamJJS3c4Q09tOXdTZVBWOUFSR1hiU0Y5Z0dYQU1uMlEtS1UsOTI2MjgNCnBpcC9fdmVuZG9yL2h0bWw1bGliL19faW5pdF9fLnB5LHNoYTI1Nj1Kc0l3bUZsZGstOXJhQmFkUFNUUzc0SnJmbUp2b3pjLTNhZWtNaTdIcjlzLDc4MA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX2loYXRleG1sLnB5LHNoYTI1Nj10elh5Z1ltaXNVbWlFVXQydjdFMUFiNTBBS1FzckQtU2dsUFJuWTc1dk1FLDE2NzA1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9faW5wdXRzdHJlYW0ucHksc2hhMjU2PUM0bFg1Z1VCd2ViT1d5NDFoWVAyWkJwa1BWTnZ4a19oWkJtM09WeVBaTTQsMzI1MzINCnBpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHksc2hhMjU2PVlBYU9FQkQ2cWM1SVNxOVh0OU5pZjFPRmdjeWJUVGZNZHdxQmtaaHBBcTQsNzY1ODANCnBpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weSxzaGEyNTY9YlM2VEhWbEw4WnlUY0k2Q0l4aU02eHh1SHNFOGkxajVPZ2QzSGExRzg0VSw0MDk2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHksc2hhMjU2PURmYzFGdjNfOWZya3RnV2pnNHRiai1Dak1NcDAyS285cU1lNGlsMUJWZG8sODMzODcNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5LHNoYTI1Nj1EbWx1OWhscTV3X2lkNm1CWnlZX3NFNUx1a0lBQ2d2RzRrcGdJc2RlZDhRLDExNzE3MA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weSxzaGEyNTY9VXJyc2EwY1BQTHFOWC1VYkpXUzJnVWhzXzA2cVZiTnhadlVucm1HWks2RSwxNDE3Nw0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX19pbml0X18ucHksc2hhMjU2PThWUjFiY2dEMk9wZVMyWEV4cHU1eUJoUF9RMUstbHdLYkJLSUNCUGYxa1UsMjg5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fYmFzZS5weSxzaGEyNTY9NlBfQWNJb0dqdHdCMnFBbGhWOEg0VlAtenRReG9YRkd3dDROeU1xR19Ldyw5NzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weSxzaGEyNTY9RVFwcVNma1pSdVRiRS1EdWhXN3hNZFZEeGRaTlowQ2ZtbllmSEFfM3p4TSwxMTc4DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9weS5weSxzaGEyNTY9d1htUUxyWlJmNE15V055ZzBtM2g4MW05SW5oTFI3R0owMDJtSUlaaC04bywxNzc1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYWxwaGFiZXRpY2FsYXR0cmlidXRlcy5weSxzaGEyNTY9RFh2LVAydmRRNUYzT1RXTTZRWjZLaHlEbEFXbTkwcGJmckQxQms5RF9sMCw2MjENCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weSxzaGEyNTY9ei1JVTlaQVlqcHNWc3FtVnQ3a3VXQzYzalIxMWhETXI2Q1ZydnVhbzhXMCwyODYNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvaW5qZWN0X21ldGFfY2hhcnNldC5weSxzaGEyNTY9MlFfSm5Nc2NuX3ROYlZfcXBnWU5fNU0zUG5CR2ZtdXZFQ01LREV4SFVjWSwyNzQyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2xpbnQucHksc2hhMjU2PXFmNWNMclQ2eFhkOFY3R0gxUl8zbEt4SWp1SlNmcGJXVHBTd2FnbFlkRHcsMzM2NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHksc2hhMjU2PUVIaWc0a00tUWlManV4VkozRkFBRk55LTEwazRhVjZISmJRekhLWl8zdTgsMTA1MzQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvc2FuaXRpemVyLnB5LHNoYTI1Nj03UHFKcmhtNm1vM0p2YUhrMklRVzdpNzRPcjdRdGQtRlY4VWZ0Skl5RHlzLDI1MTEyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3doaXRlc3BhY2UucHksc2hhMjU2PUtQdDA2N25ZVHFxaThLTFRDbHl5bm40ZVZ6TkRDXy1NQXBYTlZIUlhWWDAsMTEzOQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5LHNoYTI1Nj1sM0xjcU1TRXlvaDk5SmhfZVdqR2V4SG5JdktoTEFYb1AtTER6ODh3aHVNLDIwOA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL2dlbnNoaS5weSxzaGEyNTY9NlZJdUhETm9FeHYxSld2M2VQajZWNUNNLXRjeWlVU1dlNV9IZDJlamJ3WSwxNTU1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5LHNoYTI1Nj0zb2Y0dnZhVVlJQWljN3BuZ2Vid0pWMjRocE9TN1pnOWdnSmFfV1FlZ3k0LDE2NjENCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9fX2luaXRfXy5weSxzaGEyNTY9VWxCNG9ya1RnWmhGSUtRZFhydGlXbjljcEtTc3Vobk9RT0lIZUQwRnY0aywzNDA2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvYmFzZS5weSxzaGEyNTY9NHZkam1fWjJmX0dUUUJ3S25XbHJ6VmNjdFRiLUs1c2ZOOHBYRGFXT0RpQSwxMzk0Mg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2RvbS5weSxzaGEyNTY9U1kzTXNpalh5emROUGM4YUs1SVFzdXBCb004SjY3eTU2RGdOdEd2c2I5Zyw4ODM1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHksc2hhMjU2PWFxSUJPR2pfZEZZcUJVUkljVGVnR05CaEFJSk93NWlGREhiNGpya1lILTgsMTI3NjQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5LHNoYTI1Nj1DRWd3SE1JUVp2SURGQXFjdDRrcVBrVnR5S0ltOWVmSEZxX1ZlRXhFUENBLDE0MTYxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weSxzaGEyNTY9Q0ZwVU9DZkx1aEFnVko4TllrOXd2aUN1MWtoWW52N1hSU3R2eXpVMUZ3cyw1NTQ0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9iYXNlLnB5LHNoYTI1Nj1laS0yY0ZiTkZkMGdSanlhRm14bnhaR0xOSUQ0bzBiSEZDSDliTXlaNUJrLDQ5MzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2RvbS5weSxzaGEyNTY9RUh5RlI4RDhsWU5ueURVOWx4X0lLaWdWSlJ5ZWNVR3VhMG1PaTdIQnVrYywxNDEzDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weSxzaGEyNTY9OGpWTEVZMkZqZ040UkZ1Z3doQWg0NGw5U2NWWW9EU3RRRkNubFB3dmFmSSw0Njg0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZV9seG1sLnB5LHNoYTI1Nj1zWTZ3ZlJzaFdUbGx1Nm40OFRQV3BLc1FSUHAtMENRclQwaGpfQWR6SFNVLDYzMDkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2dlbnNoaS5weSxzaGEyNTY9NEQyUEVDWjVuM1pOM3F1M2pNbDl5WTdCODFqblFBcEJRU1ZsZmFJdVliQSwyMzA5DQpwaXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5LHNoYTI1Nj05TnQ3eHB5ZXQzRG1PclBVR29vRGRBd21IWlp1MXFVQXkyRWFKOTNrR2lRLDU4DQpwaXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5LHNoYTI1Nj1sdlliN3l1N1BoQXFGYUFJQWRXY3dnYVdJMlVtZ3NlVXVhLTFjMEFzRzBBLDMyOTkNCnBpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5LHNoYTI1Nj1SLWgyOUQtNm1ybkp6Ylh4eW1yV1VXN2laVXZ5LTI2VFF3WjBpajU3aTRVLDIzMg0KcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5LHNoYTI1Nj1HYWZpV2RZUUlLNVRTaldkUnpDWUNobzcwNEFMdE1DclZfZG5YWG41N1UwLDExMzkwDQpwaXAvX3ZlbmRvci9pZG5hL2lkbmFkYXRhLnB5LHNoYTI1Nj0tQ2c4M2x1cktvQTlwN2xiMGxNQXNvczByRnoxZG5LckdlQkUzbzhVdUNBLDMyOTk5DQpwaXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weSxzaGEyNTY9VFkxbHB4WklRV0VQNnROcWpaa0ZBNWhnb01XT2oxT0JtblVHOGloVDg3RSwxNzQ5DQpwaXAvX3ZlbmRvci9pZG5hL3BhY2thZ2VfZGF0YS5weSxzaGEyNTY9S01TVVRTX003Wlo3VWdsX1ZfRU94Vi1EM283djd5Vmt0NDVKS19icFcyNCwyMQ0KcGlwL192ZW5kb3IvaWRuYS91dHM0NmRhdGEucHksc2hhMjU2PVl5bFFZQmZsakF4X1dWcVIyRDdIZ2NHR3lWQ1d3UG02dUYzOGFFUnVoeXcsMTg0OTQ0DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9fX2luaXRfXy5weSxzaGEyNTY9VHFwejkwRHdLWWZoUHNmelZPSmw4NFRMODdwZEZFNWVQTkhkWEF4czRUayw5MzcxDQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHksc2hhMjU2PUM3T0gzSDRHZEs2OHU0RlFncDhma1Aya080ZnlVVFN5ajNYNmJsZ2ZvYmMsMjY1Mg0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weSxzaGEyNTY9ZTNxZ0lMLWV0Wk1Mc1MtM2Z0MTlpV184SVEzNjBITmtHT3FFM3lCS3NVdywzMDk2DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9waWRsb2NrZmlsZS5weSxzaGEyNTY9dWtIOXVrNk5GdXh5Vm1HNVFpV3c0aUtxM2ZUN01qcVVndVg5NWF2WVBJWSw2MDkwDQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weSxzaGEyNTY9bzJUTWtNUlkwaXduLWlMMVhNUlJJRlN0TVVrUzRpM2FqY2VlWU5udEtGZyw1NTA2DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHksc2hhMjU2PUFCd1hYbXZUSHZDbDV2aVBibFNoTDNQRy1nR3NMaVQxcm9BTWZEUndoaTgsMjYxNg0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSxzaGEyNTY9emtjQ1BUTl82VGNMVzBOcmxnMDE3Ni1SMVFRX1dWUFRtOHN6MVI0LUhqTSw3MjANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5LHNoYTI1Nj1WaV9BMHJBUWVIYlUtYTlYMHR0MXlRbTlScWtnUWJEU3h6Unc4V2xVOWtBLDg2MA0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj1SSW1FQ0o0Y193VGxhVFlZd1pZTEhFaWViRE1hQUptSzFvUEFSaHcxVDVvLDE0MTYNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj1tdGcybnBoSkUxb1FPMzlnMURnc2RQc01PLWd1QkJDbHBSLUFFWUZyYk1nLDgyMzANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHksc2hhMjU2PVNEN2RWSkdqZFBVcXRvSGI0N3F3SzZ3V0pUUWQtWlhXanhwSmc4M1VjQkEsNDMyNw0KcGlwL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHksc2hhMjU2PVNBTVJlcnpPM2ZLMklrRlpDYVprdXdaYUxfRUdxSE5PejRwbmk0dmhuTjAsMjgwMjUNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjENCnBpcC9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5LHNoYTI1Nj1Pd0dueFlmcjJnaE56WXg1OXFXSUJrckszU25CNm4tWmZkMVhhTHBubk0wLDExNTU2DQpwaXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5LHNoYTI1Nj1DY3d1SHRDQlpuOU9Ua21nRjljRnBhZElBTWhscm5aVFZLVE9vNFYycDU4LDEwMzIzMA0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHksc2hhMjU2PVduMTA3NExVRFpvdmQ0emZvVllvam5QQmdPYzZjdEhiUVg3cnBfcDhsUkEsMzAyMw0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvYmFyLnB5LHNoYTI1Nj1ZTlBKZVJyd1lWS0ZPMm55YUV3c1FqWUJ5YW1NV1RnSk12UU8xTnBELUFZLDI2ODUNCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHksc2hhMjU2PWtFcUE4aldFZHdyYzZQXzlWYVJ4N2JqT0h3azlneGwtUTlvVmJRMDh2NWMsMTUwMg0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weSxzaGEyNTY9RmVoZndaVHYtNWNDZnNiY01sdmxVa20zeFowY1Joc2V2NlhWcG1lVEY0YywyODU0DQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9zcGlubmVyLnB5LHNoYTI1Nj1pQ1Z0VVFiYUpVRkhUam4xWkxQUUxQWWVhbzRsQzlhWEFhX0h4SWVVSzZrLDEzMTQNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19faW5pdF9fLnB5LHNoYTI1Nj1KUkZWQnc2SnlWOThXUVNxdjhqc2hjNV9nOXhJYkxoZXZJNUxIYVZpOUk0LDM1NzUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5LHNoYTI1Nj1CUTI3OWJqcVFfOFBIaHZEX0ZOMzZVdUZxamJTVXFzbTdiTWV5SlYta1ZvLDQzNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5LHNoYTI1Nj1aeDNQbkVVY2N5ZnNCLWllMTFuWlZBVzhxQ2xKeTBneDFxTk1FN3JnVDE4LDEwOTYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2FkYXB0ZXJzLnB5LHNoYTI1Nj1MQWF5M09IMFpidkk2YkRXX001T2YwNnRVNXoyZm5DZmxycF9YbTM4S3NZLDIxMDE2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHksc2hhMjU2PUJxVlpudnNXdTZQd20wdlEzZndfRGo5X0ktZ2NPUjlDYlNjQjJodFBBckEsNjIzNw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weSxzaGEyNTY9NEtDRlFIckwxTGNveDN1TWg0dGpPaDNPckpody1GNXp0aTkxd1ktWnlUWSw5NzI4DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jYWNlcnQucGVtLHNoYTI1Nj03Q0VYZkxIeER3dkRwd1Z1MHlfMmxmSllrNjNjVS1LVUtJX0RMMUxxOFVvLDI3MTA4OA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY2VydHMucHksc2hhMjU2PW5YUlZxOUR0R212XzFBWWJ3alR1OVVyZ0FjZEp2MDVadmtOZWFvTE9aeFksNDY1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jb21wYXQucHksc2hhMjU2PWtjcWhWN1U0M2M0aThPdWs1ZTVZZEpYTURFbVdOTFQ5N0xZbTZVb3ItNzQsMTYyNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weSxzaGEyNTY9dTdRQzVobWxvTXdkVDktMnRhejVHcHdBdnpwMkxUVVM5Y1A0U1dVS25mTSwxODIwOA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weSxzaGEyNTY9b1p3WXdDbTY1WTBGTXVGcW9qRWdVbFdVQlE0TWtYUnk1VVJIVjFiOThMNCwzMTE1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5LHNoYTI1Nj1VdUJUdGM3dEVwblVfaXZucHVrMmhqZ3p1UzZ6N0duVEVrU2JFTmxjMVhRLDM2NjcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2hvb2tzLnB5LHNoYTI1Nj1IWEFIb0MxRk5URlJaWDYtbE5kdlBNN1RzdDRrdkd3WVROLUFPS1J4b1JVLDc2Nw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvbW9kZWxzLnB5LHNoYTI1Nj1sY3oyR0VPZTJlT3UtR3FBR2RwQTB2SlVwSTdFRTRlRFNsV0k3OFI4WTY0LDM0MDUxDQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weSxzaGEyNTY9bmpKbVZpZlk0YVNjdHVXM1BQNUVGUkN4akV3TVJETzZKX2ZlRzJkS1dzSSw2OTUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5LHNoYTI1Nj1fQTVxcGZyb2hIVkZZTEV1VnlFSjR2My1sSWxOd08zR3BIRy1MemtXRkNNLDI3NTQ2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHksc2hhMjU2PWE5Ynd1VTdsTXI0SHNoc1JaZHpCYlVzWVZzSW80RnU5R1lnMVhGVEZGUGMsMzMyMw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weSxzaGEyNTY9eWV4Q3ZXYlg0ME02RThtTFFPcEFHWlotWm9BbnlhVDJkbmktQnAtYjQyZywzMDEyDQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy91dGlscy5weSxzaGEyNTY9c1BFa1NWTFhuR2xmb2JiSk1ueDVFOVZjNGtmdjZUcEZXcEhLRkI4d084VSwyNzY1Mg0KcGlwL192ZW5kb3IvdXJsbGliMy9fX2luaXRfXy5weSxzaGEyNTY9RWZVUEY5Ukh2ZWFGOWc1ZGNLNWtCc0dEcDVMcklCLTM5Nk1wSzJSUWsxSSwyODUzDQpwaXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weSxzaGEyNTY9YjAteDQ1TEJBcnM5NlJ1bTV4R0FiUHNyaXdmQjNNWlZRYnN2N2xGaVV3RSwxMDIwNA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5LHNoYTI1Nj00R0tSOHVYSHo2SXB6dFlodHVoS0JxWGo4NEhiYkZVRjNDdnd5bUdmTEQwLDEzMDAzDQpwaXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5LHNoYTI1Nj01dWI4Q1huS3Mxd2MyWC1NeXVWVlBvM185c2NXTGdoU2diSE9KVHBRWHVFLDM1MzU4DQpwaXAvX3ZlbmRvci91cmxsaWIzL2V4Y2VwdGlvbnMucHksc2hhMjU2PWR6MWdCRWd0Uk9uTHJXOFY5MTFLaFZaV2VBbjNIMk9oREd6dFdOWFFwcjAsNjYwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9maWVsZHMucHksc2hhMjU2PVlyTlJNOFJCVW1NOGd1WEtVUUZhM2t3ajZYdlFaNzhaOGluRTZsLVlLLUUsNTk0Mw0KcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weSxzaGEyNTY9TkY2Umx5NjZiaWxXVS1zZFVMWGpDZFFnTjF1UnhmRlJlZGVpZmNSTHprVSwyMzIxDQpwaXAvX3ZlbmRvci91cmxsaWIzL3Bvb2xtYW5hZ2VyLnB5LHNoYTI1Nj0tNTFCQVBsRDBNZ0VDWWR1SGhmYlpDRWlab1VfTkRGT0tZbGhTamlmZjJRLDE2MzQ1DQpwaXAvX3ZlbmRvci91cmxsaWIzL3JlcXVlc3QucHksc2hhMjU2PXdydDJEMFNXTExnVFJLclJuYVpvcGhxMnhYcEN2TlJkN1JNVDZGNW81aFksNTk0Ng0KcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weSxzaGEyNTY9N21HVUgzNUwySVB1WlZPWTdRdkRRMUdTU0tJZjZWNmdlSlhUaGRqbVFENCwyMjkwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHksc2hhMjU2PTQxbDNhclR5LWtCQnBPZFZwU1BZVkM2NFFvN1JMblhuREVENmhjSXRoQTAsMTA4NjUNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9udGxtcG9vbC5weSxzaGEyNTY9UTktck81UmgyLUlxeUVkNFppY3BURGZNbk9sZjBJUFBDa2poQ2hCQ2pWNCw0NDc4DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvcHlvcGVuc3NsLnB5LHNoYTI1Nj1CeEoxeU1QRTYyZHV1SEpQNmpsWnhMel9GTlRLYldJMGItblZSS2xCRGdJLDE1MzU0DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc2VjdXJldHJhbnNwb3J0LnB5LHNoYTI1Nj1aUlB6NlExdG5zdTlIMUJPQVFWVVNISXlvd1dtZmFCYjdwR2xiRzVpT1BrLDMwNTAxDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc29ja3MucHksc2hhMjU2PXpQWVVLTWdfYzBuOUhGalpQRzluR04ya2pwYUg3cVVDWnhyRDVCN0cwX0ksNjE5NQ0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvYmluZGluZ3MucHksc2hhMjU2PXgya0xTaC1BU1pLc3VuMEZ4dHJhQnVMVmUzb0h1dGg0WVc2eVo1Vm9mLXcsMTc1NjANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2xvd19sZXZlbC5weSxzaGEyNTY9VWJoVXlrRUg2SFVJSnVkOV9ybl82WVdqaW9uazVpcV9ycTZZcmhWTTZDbywxMjA2Mg0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9fX2luaXRfXy5weSxzaGEyNTY9bmxDaHJHemtqQ2ttaENYOUhyRl9xSFBVZ29zZnNQUWtWSUp4aWlMaGs5ZywxMDkNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvb3JkZXJlZF9kaWN0LnB5LHNoYTI1Nj1WUWFQT05maFZNc2I4QjYzWGc3Wk95ZEpxSUVfanplTWhWTjNQZWM2b2d3LDg5MzUNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9tYWtlZmlsZS5weSxzaGEyNTY9cjFJQURvbF9wQkJxMlkxdWI0Q1B5dVMyaFh1U2hLNDduZkZuZ1pSY1JoSSwxNDYxDQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9fX2luaXRfXy5weSxzaGEyNTY9V0JWYnhRQm9qTkF4Zlp3TmF2a294M0JnSmlNQTlCSm1tLV9md2QwakRfbyw2ODgNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19pbXBsZW1lbnRhdGlvbi5weSxzaGEyNTY9bEFqN3FHQ1pMT2xkaG44Z1pEWTZUcXA0bXZna2JUZnk0azRnRElEUm84Zyw1NzAyDQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHksc2hhMjU2PTZSYW40b0FWSXk0MEN1X29FUFduTlY5YndGNXJYeDZHMURVWjdvZWhqUFksMTA0NA0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL2Nvbm5lY3Rpb24ucHksc2hhMjU2PV82XzVKWkpGM0hIUlhSN0hheEhnM21rN3FNS0szTjBubDNETDhnRkFmbzQsNDIzNw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHksc2hhMjU2PUg1X2xySHZ0d2wyVTJCYlQxVVlOOUhwcnVOYzFnc05GbHoybmpRbWhQclEsMzcwNQ0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5LHNoYTI1Nj1TU05MODg4Vy1NUTh0M0hBaTQ0a05HZ0Y2ODJwNkhfX3l0RVh6Qll4Vl9NLDIzNDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXRyeS5weSxzaGEyNTY9cDRMSG0tT1ZhTmROeVotaG9Bb2RUSW94Tm9jQXV1ZWdUMzZIeF9HY3drZywxNDYwMQ0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NlbGVjdG9ycy5weSxzaGEyNTY9UElJTnp3amlENVo2SXlUS0ExdFI1bjFrQ09YeVRocERDRTJmQ1ZGekxlTSwyMTE0Nw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NzbF8ucHksc2hhMjU2PVlwY2lNMG1OX3JkMjd3Y2hMRU5TeFROYTdQV0VnWjJNUDlhdGVGdXJDZW8sMTIyMDgNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC90aW1lb3V0LnB5LHNoYTI1Nj03bEhOcmdMNVlIMmNJMWoteVpuelZfSjhqQmxSVmRtRmhRYU55TTFfMmI4LDk3NTcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC91cmwucHksc2hhMjU2PXFDWV9ISFVYdm8wNXdBc0VFUkFMZ0V4dGxneExuQUhTUTdjZTFiLWczU00sNjQ4Nw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHksc2hhMjU2PVFfcGRfYkQ2aWFQZ1JLd0VtY2pUWURyU1BqNERkNG9qeWttcUEzOThiOG8sMTQ1MQ0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL19faW5pdF9fLnB5LHNoYTI1Nj10N3JBUVF4WHdhbFktYWs5aFRsNzNxSGpoaWE5VUgtc0wtZTAwcVFyQnBvLDEwNTc2DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbGFiZWxzLnB5LHNoYTI1Nj00QU9fS3hUZGRxR3RyTDluczdrQVBqYjBDY042eHNDSXhiSzM3SFk5cjNFLDg5NzkNCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weSxzaGEyNTY9R1lJZXl3bnBhTG5QMEdTaWM4TEZXZ2QwVVZ2T19sMU5jNllvRi04N1JfNCwxMzA1DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvdGVzdHMucHksc2hhMjU2PTd2VGs3TGdPSm5fdDFYdFRfdmlvZlpsRUo3Y0pDelBlX2h2VkhPa2NRbDgsNjU2Mg0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5LHNoYTI1Nj03MmNmUFJoYmZrUkNHa2tBOFpudlZWN1Vub2lMYjV1UE1oWHdoclhpTFBrLDQzMDYNCnBpcC9jb21tYW5kcy9fX2luaXRfXy5weSxzaGEyNTY9MlVxM0hDZGpjaEpEOUZMMUxCN3JkNXY2VXlTVkFWaXpYMFczRVgzaElvRSwyMjQ0DQpwaXAvY29tbWFuZHMvY2hlY2sucHksc2hhMjU2PS1BN0dJMS1XWkJoOWE0UDZVb0hfYVItSjdJOEx6OGx5N20zd25Dam1ldnMsMTM4Mg0KcGlwL2NvbW1hbmRzL2NvbXBsZXRpb24ucHksc2hhMjU2PWtrUGdWWDdTVWNKXzhKdXc1R2tnV2F4SE45XzQ1d21BcjltR3MxelhFRXMsMjQ1Mw0KcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5LHNoYTI1Nj04UnV1UG1TWWdBcTNpRURUcVpZXzFQRFhScVJFZFVVTEhOaldKZUF2N01vLDc4MTANCnBpcC9jb21tYW5kcy9mcmVlemUucHksc2hhMjU2PWg2LXlGTXBqQ2piTmo4LWdPbTVVdW9GNmNnMTRONXJQVjRUQ2kzX0NldUksMjgzNQ0KcGlwL2NvbW1hbmRzL2hhc2gucHksc2hhMjU2PU1DdDRqRUZ5Zm9jZTBsVmVORXoxeDQ5dWFUWS1WRGtLaUJ2dnhyVmNIa3csMTU5Nw0KcGlwL2NvbW1hbmRzL2hlbHAucHksc2hhMjU2PTg0SFdrRWRuR1BfQUVCSG5uOGdKUDJUZTBYVFhSS0ZvWHFYb3BiT1pUTm8sOTgyDQpwaXAvY29tbWFuZHMvaW5zdGFsbC5weSxzaGEyNTY9b3ZHOXA5bjFYMk5QcU1nRlZ0U3VUOWtNYkxBZHgxcjNZU1NpWFN2Z09LSSwxNzQxMg0KcGlwL2NvbW1hbmRzL2xpc3QucHksc2hhMjU2PTkzYkNpRnl0MlF1dF9ZSGtZSEpNWkhwWGxhZG14c2pTLXlPdFplYjN1cUksMTEzNjkNCnBpcC9jb21tYW5kcy9zZWFyY2gucHksc2hhMjU2PW9UczlRTmRlZm5ybUNWX0plZnRHMFBHaU11WVZtaUVERjFPVWFZc21EYW8sNDUwMg0KcGlwL2NvbW1hbmRzL3Nob3cucHksc2hhMjU2PVpZTTU3XzdVOEtQOU1RSUl5SEtRZFp4bWlFWkJ5eS1EUnpCNjk3VkZvVFksNTg5MQ0KcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weSxzaGEyNTY9dHo4Y1h6NFdkcFVkbnQzUnZwZFF3SDZfU05NQjUwZWdCSVpXYTFkd2ZjYywyODg0DQpwaXAvY29tbWFuZHMvd2hlZWwucHksc2hhMjU2PXo1U0Vod3MyWVJNYjBNbDFJRWtnNmpGWk1MUnBMbDg2YkhDclFiWXQ1em8sNzcyOQ0KcGlwL2NvbXBhdC9fX2luaXRfXy5weSxzaGEyNTY9MlhzX0lwc21kUmdIYlFnUU8wYzhfbFB2SEpuUVhIeUdXeFBiTGJZSkw0Yyw0NjcyDQpwaXAvY29tcGF0L2RpY3Rjb25maWcucHksc2hhMjU2PWRScmVsUERXcmNlRFN6RlQ1MVJURVZZMkd1TTdVRHljNUlnaF90bjRGdmssMjMwOTYNCnBpcC9tb2RlbHMvX19pbml0X18ucHksc2hhMjU2PTBSczdfUkE0RHhlT2tXVDVDcTRDUXpEclNFaHZZY04zVEgyY2F6cjcyUEUsNzENCnBpcC9tb2RlbHMvaW5kZXgucHksc2hhMjU2PXBVZmJPX192M21EOWotMm5fQ2x3UFM4cFZ5eDRsMndJd3l2V3Q4R01DUkEsNDg3DQpwaXAvb3BlcmF0aW9ucy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvb3BlcmF0aW9ucy9jaGVjay5weSxzaGEyNTY9dXdVTjljczFzUG83YzBTajZwUnJTdjdiMjJQazI5U1hVSW1UZWxWY2hNUSwxNTkwDQpwaXAvb3BlcmF0aW9ucy9mcmVlemUucHksc2hhMjU2PWstN3c3THNNLVJwUHY3RVJCekhpUHBZa0gtR3VZZkhMeVItQ3BfMVZQTDAsNTE5NA0KcGlwL3JlcS9fX2luaXRfXy5weSxzaGEyNTY9dkZ3Wlk4X1ZjMVdVMXpGQWVzcGcxTXlfcl9BVDNuN2NOMFc5ZVgwRUZxaywyNzYNCnBpcC9yZXEvcmVxX2ZpbGUucHksc2hhMjU2PWZHOU1Ec1hVTlBobUd3eFVpd3JJWEV5bnlEOFE3czNMNDctaExaUERYcTAsMTE5MjYNCnBpcC9yZXEvcmVxX2luc3RhbGwucHksc2hhMjU2PWdZckgtbHdRTW10NTVWVmJhdl9FdFJJUHU5NGNRYkhGSG1fS3E2QWVIYmcsNDY0ODcNCnBpcC9yZXEvcmVxX3NldC5weSxzaGEyNTY9akhzcFhxY0EyRnhjRjA1ZGdVSUFaNWh1WVB2NmJuMHdSVVgwWjdQS21hQSwzNDQ2Mg0KcGlwL3JlcS9yZXFfdW5pbnN0YWxsLnB5LHNoYTI1Nj1mZEgyVmdDakVDOE5SWURTN2ZSdTNaSmFCQlVFeS1ONW11d3hEWDVNQk5NLDY4OTcNCnBpcC91dGlscy9fX2luaXRfXy5weSxzaGEyNTY9SFhfd1lTMTVvaVlPei1IM3FHMUtiaTFDWTdBR1dDTks1amxvaUQwZmF1YywyNzE4Nw0KcGlwL3V0aWxzL2FwcGRpcnMucHksc2hhMjU2PWtqMkxLLUkyZkM1UW5FaF9BX3YtZXZfSVFNY1hhV1dGNURFMzlzTnZDTFEsODgxMQ0KcGlwL3V0aWxzL2J1aWxkLnB5LHNoYTI1Nj00c21MUnJmU0NtWG1qRW5Wbk1GaDJ0QkVwTmNTTFJlNkowZWpaSi13V0pFLDEzMTINCnBpcC91dGlscy9kZXByZWNhdGlvbi5weSxzaGEyNTY9WF9GTWp0RGJNSnFmcUVrZFJya2ktbVl5SWRQQjZJNkRIVVRDQV9DaFk2TSwyMjMyDQpwaXAvdXRpbHMvZW5jb2RpbmcucHksc2hhMjU2PU5ReEdpRlM1R2JlQXZlTFpUbng5MnQ1cjBQWXF2dDBpUm5QMnU5U0dHMXcsOTcxDQpwaXAvdXRpbHMvZmlsZXN5c3RlbS5weSxzaGEyNTY9WkVWQnVZTTNmcXIyX2xnT0VTaDRZN2ZQRnN6R0Q0NzR6Vm1fTTNNYjVUayw4OTkNCnBpcC91dGlscy9nbGliYy5weSxzaGEyNTY9amNRWWp0X29KTFBLVlpCMjhLYXV5NFN3NzB6Uy13YXd4b1UxSEhYMzZfMCwyOTM5DQpwaXAvdXRpbHMvaGFzaGVzLnB5LHNoYTI1Nj1vTWs3Y2QzUGJKZ3pwU1F5WHExTXl0TXVkNWY2SDVPYTJZWTVoWXVDcTZJLDI4NjYNCnBpcC91dGlscy9sb2dnaW5nLnB5LHNoYTI1Nj03eVd1NGdady1RY2xqN1g4MFFWZHBHV2tkVFdHS1Q0TGlVVktjRTA0cHJvLDMzMjcNCnBpcC91dGlscy9vdXRkYXRlZC5weSxzaGEyNTY9Zk53T0NMNXIyRWZ0UEdoZ0NZR01LdTAzMkhDOGNWLUpBcjlscDBIbVRvTSw1NDU1DQpwaXAvdXRpbHMvcGFja2FnaW5nLnB5LHNoYTI1Nj1xaG1saTE0b2R3NkRJaFdKZ1FZUzJRMFJyU2JyOG5YTmNHNDhmNXlUUm1zLDIwODANCnBpcC91dGlscy9zZXR1cHRvb2xzX2J1aWxkLnB5LHNoYTI1Nj0wYmxmc2NtTkpXX2laNURjc3dKZURCX1BidFRFamZLOVJMMVIxV0VEVzJFLDI3OA0KcGlwL3V0aWxzL3VpLnB5LHNoYTI1Nj1wYkRrU0FldW1aNmpkWmNPSjJ5QWJ4OGlCZ2VQMnpmcHFObkxKSzFnc2tRLDExNTk3DQpwaXAvdmNzL19faW5pdF9fLnB5LHNoYTI1Nj1XYWZGbGlVVEhNbXNTSVNWOFBIcDFNNUVYRE5TV3lKcjc4ekthUW1QTGRZLDEyMzc0DQpwaXAvdmNzL2JhemFhci5weSxzaGEyNTY9dFlUd2M0YjRvZmY4bXIwTzJvOFNpR2VqcUJESnhjYkRCTVNNZDktSVNZYywzODAzDQpwaXAvdmNzL2dpdC5weSxzaGEyNTY9NUxmV3J5aTc4QS0yVUxqRVpKdkNUYXJKXzNsOHZlbndYQVNsd204aGl1ZywxMTE5Nw0KcGlwL3Zjcy9tZXJjdXJpYWwucHksc2hhMjU2PXhHNnJEaXdIQ1J5dEpFczIzU0lIQlhsX1N3UW8yamtrZERfNnJWVlA1aDQsMzQ3Mg0KcGlwL3Zjcy9zdWJ2ZXJzaW9uLnB5LHNoYTI1Nj1HQXVYMlNrN0ladkp5RXpFTktjVmxkX3dHQnJRM2ZwWERsWGphcFpFWWRJLDkzNTANCnBpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0LHNoYTI1Nj1WYThXajFYQnBUYlZRMlo0MW1aUkpkQUxFZXppaVNfWmV3V24xSDJlY1k0LDEyODcNCnBpcC05LjAuMy5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PWtNMnpYRG9JUGlaMnFvamZrYURDN2FLcVRGd3V3Z01SVko3RllVdEFBVmssMjU1Mw0KcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkQsLA0KcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTCxzaGEyNTY9a2RzTi01T0pBWklpSE4taU80UmhsODJLeVMwYkRXZjR1QndNYmtOYWZyOCwxMTANCnBpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9US1mUjJ0Y3A5RFJkZVhvR24xd1I2N1hlY3kzMm81RXlRRW56RGdod3Fxayw2OA0KcGlwLTkuMC4zLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uLHNoYTI1Nj00TG1ydWkza25MMGJnb3hsMThzY3lzMVV6dE9mdWdVZkN6QVJjcEtXNHpBLDE1NjUNCnBpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9enV1dWU0a25veUotVXdQUFhnOGZlelM3VkNyWEpRckFQN3plTnV3dkZRZyw0DQpQSwMEFAAAAAAAAAAhAPbd0r5uAAAAbgAAACkAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTFdoZWVsLVZlcnNpb246IDEuMApHZW5lcmF0b3I6IGJkaXN0X3doZWVsICgwLjMwLjApClJvb3QtSXMtUHVyZWxpYjogdHJ1ZQpUYWc6IHB5Mi1ub25lLWFueQpUYWc6IHB5My1ub25lLWFueQoKUEsDBBQAAAAAAAAAIQC0F5jERAAAAEQAAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCnBpcCA9IHBpcDptYWluCnBpcDMgPSBwaXA6bWFpbgpwaXAzLjYgPSBwaXA6bWFpbgoKUEsDBBQAAAAAAAAAIQDI4LebHQYAAB0GAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvbnsiY2xhc3NpZmllcnMiOiBbIkRldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZSIsICJUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBCdWlsZCBUb29scyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IEltcGxlbWVudGF0aW9uIDo6IFB5UHkiXSwgImV4dGVuc2lvbnMiOiB7InB5dGhvbi5jb21tYW5kcyI6IHsid3JhcF9jb25zb2xlIjogeyJwaXAiOiAicGlwOm1haW4iLCAicGlwMyI6ICJwaXA6bWFpbiIsICJwaXAzLjYiOiAicGlwOm1haW4ifX0sICJweXRob24uZGV0YWlscyI6IHsiY29udGFjdHMiOiBbeyJlbWFpbCI6ICJweXRob24tdmlydHVhbGVudkBncm91cHMuZ29vZ2xlLmNvbSIsICJuYW1lIjogIlRoZSBwaXAgZGV2ZWxvcGVycyIsICJyb2xlIjogImF1dGhvciJ9XSwgImRvY3VtZW50X25hbWVzIjogeyJkZXNjcmlwdGlvbiI6ICJERVNDUklQVElPTi5yc3QifSwgInByb2plY3RfdXJscyI6IHsiSG9tZSI6ICJodHRwczovL3BpcC5weXBhLmlvLyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7InBpcCI6ICJwaXA6bWFpbiIsICJwaXAzIjogInBpcDptYWluIiwgInBpcDMuNiI6ICJwaXA6bWFpbiJ9fX0sICJleHRyYXMiOiBbInRlc3RpbmciXSwgImdlbmVyYXRvciI6ICJiZGlzdF93aGVlbCAoMC4zMC4wKSIsICJrZXl3b3JkcyI6IFsiZWFzeV9pbnN0YWxsIiwgImRpc3R1dGlscyIsICJzZXR1cHRvb2xzIiwgImVnZyIsICJ2aXJ0dWFsZW52Il0sICJsaWNlbnNlIjogIk1JVCIsICJtZXRhZGF0YV92ZXJzaW9uIjogIjIuMCIsICJuYW1lIjogInBpcCIsICJyZXF1aXJlc19weXRob24iOiAiPj0yLjYsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAidGVzdGluZyIsICJyZXF1aXJlcyI6IFsibW9jayIsICJwcmV0ZW5kIiwgInB5dGVzdCIsICJzY3JpcHR0ZXN0ICg+PTEuMykiLCAidmlydHVhbGVudiAoPj0xLjEwKSJdfV0sICJzdW1tYXJ5IjogIlRoZSBQeVBBIHJlY29tbWVuZGVkIHRvb2wgZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLiIsICJ0ZXN0X3JlcXVpcmVzIjogW3sicmVxdWlyZXMiOiBbIm1vY2siLCAicHJldGVuZCIsICJweXRlc3QiLCAic2NyaXB0dGVzdCAoPj0xLjMpIiwgInZpcnR1YWxlbnYgKD49MS4xMCkiXX1dLCAidmVyc2lvbiI6ICI5LjAuMyJ9UEsDBBQAAAAAAAAAIQDHH5fCBAAAAAQAAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dHBpcApQSwMEFAAAAAAAAAAhAA1b0Ha0LgAAtC4AAB8AAABweXBpX19waXBfOV8wXzMvcGlwL19faW5pdF9fLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9jYWxlCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgppbXBvcnQgc3lzCmltcG9ydCByZQoKIyAyMDE2LTA2LTE3IGJhcnJ5QGRlYmlhbi5vcmc6IHVybGxpYjMgMS4xNCBhZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciBzb2NrcywKIyBidXQgaWYgaW52b2tlZCAoaS5lLiBpbXBvcnRlZCksIGl0IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHRvIHN0ZGVyciBpZiBzb2NrcwojIGlzbid0IGF2YWlsYWJsZS4gIHJlcXVlc3RzIHVuY29uZGl0aW9uYWxseSBpbXBvcnRzIHVybGxpYjMncyBzb2NrcyBjb250cmliCiMgbW9kdWxlLCB0cmlnZ2VyaW5nIHRoaXMgd2FybmluZy4gIFRoZSB3YXJuaW5nIGJyZWFrcyBERVAtOCB0ZXN0cyAoYmVjYXVzZSBvZgojIHRoZSBzdGRlcnIgb3V0cHV0KSBhbmQgaXMganVzdCBwbGFpbiBhbm5veWluZyBpbiBub3JtYWwgdXNhZ2UuICBJIGRvbid0IHdhbnQKIyB0byBhZGQgc29ja3MgYXMgeWV0IGFub3RoZXIgZGVwZW5kZW5jeSBmb3IgcGlwLCBub3IgZG8gSSB3YW50IHRvIGFsbG93LXN0ZGVyCiMgaW4gdGhlIERFUC04IHRlc3RzLCBzbyBqdXN0IHN1cHByZXNzIHRoZSB3YXJuaW5nLiAgcGRiIHRlbGxzIG1lIHRoaXMgaGFzIHRvCiMgYmUgZG9uZSBiZWZvcmUgdGhlIGltcG9ydCBvZiBwaXAudmNzLgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PURlcGVuZGVuY3lXYXJuaW5nKSAgIyBub3FhCgojIFdlIHdhbnQgdG8gaW5qZWN0IHRoZSB1c2Ugb2YgU2VjdXJlVHJhbnNwb3J0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNvIHRoYXQgYW55CiMgcmVmZXJlbmNlcyBvciBzZXNzaW9ucyBvciB3aGF0IGhhdmUgeW91IGFyZSBlbnN1cmVkIHRvIGhhdmUgaXQsIGhvd2V2ZXIgd2UKIyBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSB0aGF0IHdlJ3JlIHJ1bm5pbmcgb24gbWFjT1MgYW5kIHRoZSBsaW5rZWQKIyBPcGVuU1NMIGlzIHRvbyBvbGQgdG8gaGFuZGxlIFRMU3YxLjIKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICBpZiAoc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZAogICAgICAgICAgICBnZXRhdHRyKHNzbCwgIk9QRU5TU0xfVkVSU0lPTl9OVU1CRVIiLCAwKSA8IDB4MTAwMDEwMGYpOiAgIyBPcGVuU1NMIDEuMC4xCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYiBpbXBvcnQgc2VjdXJldHJhbnNwb3J0CiAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWN1cmV0cmFuc3BvcnQuaW5qZWN0X2ludG9fdXJsbGliMygpCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvciwgQ29tbWFuZEVycm9yLCBQaXBFcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zLCBnZXRfcHJvZwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGVwcmVjYXRpb24sIGRpc3RfaXNfZWRpdGFibGUKZnJvbSBwaXAudmNzIGltcG9ydCBnaXQsIG1lcmN1cmlhbCwgc3VidmVyc2lvbiwgYmF6YWFyICAjIG5vcWEKZnJvbSBwaXAuYmFzZXBhcnNlciBpbXBvcnQgQ29uZmlnT3B0aW9uUGFyc2VyLCBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcgpmcm9tIHBpcC5jb21tYW5kcyBpbXBvcnQgZ2V0X3N1bW1hcmllcywgZ2V0X3NpbWlsYXJfY29tbWFuZHMKZnJvbSBwaXAuY29tbWFuZHMgaW1wb3J0IGNvbW1hbmRzX2RpY3QKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IEluc2VjdXJlUmVxdWVzdFdhcm5pbmcKCgojIGFzc2lnbm1lbnQgZm9yIGZsYWtlOCB0byBiZSBoYXBweQoKIyBUaGlzIGZpeGVzIGEgcGVjdWxpYXJpdHkgd2hlbiBpbXBvcnRpbmcgdmlhIF9faW1wb3J0X18gLSBhcyB3ZSBhcmUKIyBpbml0aWFsaXNpbmcgdGhlIHBpcCBtb2R1bGUsICJmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucyIgaXMgcmVjdXJzaXZlCiMgYW5kIGFwcGVhcnMgbm90IHRvIHdvcmsgcHJvcGVybHkgaW4gdGhhdCBzaXR1YXRpb24uCmltcG9ydCBwaXAuY21kb3B0aW9ucwpjbWRvcHRpb25zID0gcGlwLmNtZG9wdGlvbnMKCiMgVGhlIHZlcnNpb24gYXMgdXNlZCBpbiB0aGUgc2V0dXAucHkgYW5kIHRoZSBkb2NzIGNvbmYucHkKX192ZXJzaW9uX18gPSAiOS4wLjMiCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojIEhpZGUgdGhlIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcgZnJvbSB1cmxsaWIzCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1JbnNlY3VyZVJlcXVlc3RXYXJuaW5nKQoKCmRlZiBhdXRvY29tcGxldGUoKToKICAgICIiIkNvbW1hbmQgYW5kIG9wdGlvbiBjb21wbGV0aW9uIGZvciB0aGUgbWFpbiBvcHRpb24gcGFyc2VyIChhbmQgb3B0aW9ucykKICAgIGFuZCBpdHMgc3ViY29tbWFuZHMgKGFuZCBvcHRpb25zKS4KCiAgICBFbmFibGUgYnkgc291cmNpbmcgb25lIG9mIHRoZSBjb21wbGV0aW9uIHNoZWxsIHNjcmlwdHMgKGJhc2gsIHpzaCBvciBmaXNoKS4KICAgICIiIgogICAgIyBEb24ndCBjb21wbGV0ZSBpZiB1c2VyIGhhc24ndCBzb3VyY2VkIGJhc2hfY29tcGxldGlvbiBmaWxlLgogICAgaWYgJ1BJUF9BVVRPX0NPTVBMRVRFJyBub3QgaW4gb3MuZW52aXJvbjoKICAgICAgICByZXR1cm4KICAgIGN3b3JkcyA9IG9zLmVudmlyb25bJ0NPTVBfV09SRFMnXS5zcGxpdCgpWzE6XQogICAgY3dvcmQgPSBpbnQob3MuZW52aXJvblsnQ09NUF9DV09SRCddKQogICAgdHJ5OgogICAgICAgIGN1cnJlbnQgPSBjd29yZHNbY3dvcmQgLSAxXQogICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgY3VycmVudCA9ICcnCgogICAgc3ViY29tbWFuZHMgPSBbY21kIGZvciBjbWQsIHN1bW1hcnkgaW4gZ2V0X3N1bW1hcmllcygpXQogICAgb3B0aW9ucyA9IFtdCiAgICAjIHN1YmNvbW1hbmQKICAgIHRyeToKICAgICAgICBzdWJjb21tYW5kX25hbWUgPSBbdyBmb3IgdyBpbiBjd29yZHMgaWYgdyBpbiBzdWJjb21tYW5kc11bMF0KICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgIHN1YmNvbW1hbmRfbmFtZSA9IE5vbmUKCiAgICBwYXJzZXIgPSBjcmVhdGVfbWFpbl9wYXJzZXIoKQogICAgIyBzdWJjb21tYW5kIG9wdGlvbnMKICAgIGlmIHN1YmNvbW1hbmRfbmFtZToKICAgICAgICAjIHNwZWNpYWwgY2FzZTogJ2hlbHAnIHN1YmNvbW1hbmQgaGFzIG5vIG9wdGlvbnMKICAgICAgICBpZiBzdWJjb21tYW5kX25hbWUgPT0gJ2hlbHAnOgogICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgICMgc3BlY2lhbCBjYXNlOiBsaXN0IGxvY2FsbHkgaW5zdGFsbGVkIGRpc3RzIGZvciB1bmluc3RhbGwgY29tbWFuZAogICAgICAgIGlmIHN1YmNvbW1hbmRfbmFtZSA9PSAndW5pbnN0YWxsJyBhbmQgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnLScpOgogICAgICAgICAgICBpbnN0YWxsZWQgPSBbXQogICAgICAgICAgICBsYyA9IGN1cnJlbnQubG93ZXIoKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5LnN0YXJ0c3dpdGgobGMpIGFuZCBkaXN0LmtleSBub3QgaW4gY3dvcmRzWzE6XToKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgICAgICAjIGlmIHRoZXJlIGFyZSBubyBkaXN0cyBpbnN0YWxsZWQsIGZhbGwgYmFjayB0byBvcHRpb24gY29tcGxldGlvbgogICAgICAgICAgICBpZiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZGlzdCkKICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCgogICAgICAgIHN1YmNvbW1hbmQgPSBjb21tYW5kc19kaWN0W3N1YmNvbW1hbmRfbmFtZV0oKQogICAgICAgIG9wdGlvbnMgKz0gWyhvcHQuZ2V0X29wdF9zdHJpbmcoKSwgb3B0Lm5hcmdzKQogICAgICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gc3ViY29tbWFuZC5wYXJzZXIub3B0aW9uX2xpc3RfYWxsCiAgICAgICAgICAgICAgICAgICAgaWYgb3B0LmhlbHAgIT0gb3B0cGFyc2UuU1VQUFJFU1NfSEVMUF0KCiAgICAgICAgIyBmaWx0ZXIgb3V0IHByZXZpb3VzbHkgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSBhdmFpbGFibGUgb3B0aW9ucwogICAgICAgIHByZXZfb3B0cyA9IFt4LnNwbGl0KCc9JylbMF0gZm9yIHggaW4gY3dvcmRzWzE6Y3dvcmQgLSAxXV0KICAgICAgICBvcHRpb25zID0gWyh4LCB2KSBmb3IgKHgsIHYpIGluIG9wdGlvbnMgaWYgeCBub3QgaW4gcHJldl9vcHRzXQogICAgICAgICMgZmlsdGVyIG9wdGlvbnMgYnkgY3VycmVudCBpbnB1dAogICAgICAgIG9wdGlvbnMgPSBbKGssIHYpIGZvciBrLCB2IGluIG9wdGlvbnMgaWYgay5zdGFydHN3aXRoKGN1cnJlbnQpXQogICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uczoKICAgICAgICAgICAgb3B0X2xhYmVsID0gb3B0aW9uWzBdCiAgICAgICAgICAgICMgYXBwZW5kICc9JyB0byBvcHRpb25zIHdoaWNoIHJlcXVpcmUgYXJncwogICAgICAgICAgICBpZiBvcHRpb25bMV06CiAgICAgICAgICAgICAgICBvcHRfbGFiZWwgKz0gJz0nCiAgICAgICAgICAgIHByaW50KG9wdF9sYWJlbCkKICAgIGVsc2U6CiAgICAgICAgIyBzaG93IG1haW4gcGFyc2VyIG9wdGlvbnMgb25seSB3aGVuIG5lY2Vzc2FyeQogICAgICAgIGlmIGN1cnJlbnQuc3RhcnRzd2l0aCgnLScpIG9yIGN1cnJlbnQuc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgb3B0cyA9IFtpLm9wdGlvbl9saXN0IGZvciBpIGluIHBhcnNlci5vcHRpb25fZ3JvdXBzXQogICAgICAgICAgICBvcHRzLmFwcGVuZChwYXJzZXIub3B0aW9uX2xpc3QpCiAgICAgICAgICAgIG9wdHMgPSAobyBmb3IgaXQgaW4gb3B0cyBmb3IgbyBpbiBpdCkKCiAgICAgICAgICAgIHN1YmNvbW1hbmRzICs9IFtpLmdldF9vcHRfc3RyaW5nKCkgZm9yIGkgaW4gb3B0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaS5oZWxwICE9IG9wdHBhcnNlLlNVUFBSRVNTX0hFTFBdCgogICAgICAgIHByaW50KCcgJy5qb2luKFt4IGZvciB4IGluIHN1YmNvbW1hbmRzIGlmIHguc3RhcnRzd2l0aChjdXJyZW50KV0pKQogICAgc3lzLmV4aXQoMSkKCgpkZWYgY3JlYXRlX21haW5fcGFyc2VyKCk6CiAgICBwYXJzZXJfa3cgPSB7CiAgICAgICAgJ3VzYWdlJzogJ1xuJXByb2cgPGNvbW1hbmQ+IFtvcHRpb25zXScsCiAgICAgICAgJ2FkZF9oZWxwX29wdGlvbic6IEZhbHNlLAogICAgICAgICdmb3JtYXR0ZXInOiBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcigpLAogICAgICAgICduYW1lJzogJ2dsb2JhbCcsCiAgICAgICAgJ3Byb2cnOiBnZXRfcHJvZygpLAogICAgfQoKICAgIHBhcnNlciA9IENvbmZpZ09wdGlvblBhcnNlcigqKnBhcnNlcl9rdykKICAgIHBhcnNlci5kaXNhYmxlX2ludGVyc3BlcnNlZF9hcmdzKCkKCiAgICBwaXBfcGtnX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpCiAgICBwYXJzZXIudmVyc2lvbiA9ICdwaXAgJXMgZnJvbSAlcyAocHl0aG9uICVzKScgJSAoCiAgICAgICAgX192ZXJzaW9uX18sIHBpcF9wa2dfZGlyLCBzeXMudmVyc2lvbls6M10pCgogICAgIyBhZGQgdGhlIGdlbmVyYWwgb3B0aW9ucwogICAgZ2VuX29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKGNtZG9wdGlvbnMuZ2VuZXJhbF9ncm91cCwgcGFyc2VyKQogICAgcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ2VuX29wdHMpCgogICAgcGFyc2VyLm1haW4gPSBUcnVlICAjIHNvIHRoZSBoZWxwIGZvcm1hdHRlciBrbm93cwoKICAgICMgY3JlYXRlIGNvbW1hbmQgbGlzdGluZyBmb3IgZGVzY3JpcHRpb24KICAgIGNvbW1hbmRfc3VtbWFyaWVzID0gZ2V0X3N1bW1hcmllcygpCiAgICBkZXNjcmlwdGlvbiA9IFsnJ10gKyBbJyUtMjdzICVzJyAlIChpLCBqKSBmb3IgaSwgaiBpbiBjb21tYW5kX3N1bW1hcmllc10KICAgIHBhcnNlci5kZXNjcmlwdGlvbiA9ICdcbicuam9pbihkZXNjcmlwdGlvbikKCiAgICByZXR1cm4gcGFyc2VyCgoKZGVmIHBhcnNlb3B0cyhhcmdzKToKICAgIHBhcnNlciA9IGNyZWF0ZV9tYWluX3BhcnNlcigpCgogICAgIyBOb3RlOiBwYXJzZXIgY2FsbHMgZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpLCBzbyB0aGUgcmVzdWx0IG9mIHRoaXMKICAgICMgY2FsbCBpcyB0byBzcGxpdCB0aGUgaW5pdGlhbCBhcmdzIGludG8gdGhlIGdlbmVyYWwgb3B0aW9ucyBiZWZvcmUgdGhlCiAgICAjIHN1YmNvbW1hbmQgYW5kIGV2ZXJ5dGhpbmcgZWxzZS4KICAgICMgRm9yIGV4YW1wbGU6CiAgICAjICBhcmdzOiBbJy0tdGltZW91dD01JywgJ2luc3RhbGwnLCAnLS11c2VyJywgJ0lOSVRvb2xzJ10KICAgICMgIGdlbmVyYWxfb3B0aW9uczogWyctLXRpbWVvdXQ9PTUnXQogICAgIyAgYXJnc19lbHNlOiBbJ2luc3RhbGwnLCAnLS11c2VyJywgJ0lOSVRvb2xzJ10KICAgIGdlbmVyYWxfb3B0aW9ucywgYXJnc19lbHNlID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKCiAgICAjIC0tdmVyc2lvbgogICAgaWYgZ2VuZXJhbF9vcHRpb25zLnZlcnNpb246CiAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwYXJzZXIudmVyc2lvbikKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKG9zLmxpbmVzZXApCiAgICAgICAgc3lzLmV4aXQoKQoKICAgICMgcGlwIHx8IHBpcCBoZWxwIC0+IHByaW50X2hlbHAoKQogICAgaWYgbm90IGFyZ3NfZWxzZSBvciAoYXJnc19lbHNlWzBdID09ICdoZWxwJyBhbmQgbGVuKGFyZ3NfZWxzZSkgPT0gMSk6CiAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQogICAgICAgIHN5cy5leGl0KCkKCiAgICAjIHRoZSBzdWJjb21tYW5kIG5hbWUKICAgIGNtZF9uYW1lID0gYXJnc19lbHNlWzBdCgogICAgaWYgY21kX25hbWUgbm90IGluIGNvbW1hbmRzX2RpY3Q6CiAgICAgICAgZ3Vlc3MgPSBnZXRfc2ltaWxhcl9jb21tYW5kcyhjbWRfbmFtZSkKCiAgICAgICAgbXNnID0gWyd1bmtub3duIGNvbW1hbmQgIiVzIicgJSBjbWRfbmFtZV0KICAgICAgICBpZiBndWVzczoKICAgICAgICAgICAgbXNnLmFwcGVuZCgnbWF5YmUgeW91IG1lYW50ICIlcyInICUgZ3Vlc3MpCgogICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignIC0gJy5qb2luKG1zZykpCgogICAgIyBhbGwgdGhlIGFyZ3Mgd2l0aG91dCB0aGUgc3ViY29tbWFuZAogICAgY21kX2FyZ3MgPSBhcmdzWzpdCiAgICBjbWRfYXJncy5yZW1vdmUoY21kX25hbWUpCgogICAgcmV0dXJuIGNtZF9uYW1lLCBjbWRfYXJncwoKCmRlZiBjaGVja19pc29sYXRlZChhcmdzKToKICAgIGlzb2xhdGVkID0gRmFsc2UKCiAgICBpZiAiLS1pc29sYXRlZCIgaW4gYXJnczoKICAgICAgICBpc29sYXRlZCA9IFRydWUKCiAgICByZXR1cm4gaXNvbGF0ZWQKCgpkZWYgbWFpbihhcmdzPU5vbmUpOgogICAgaWYgYXJncyBpcyBOb25lOgogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KCiAgICAjIENvbmZpZ3VyZSBvdXIgZGVwcmVjYXRpb24gd2FybmluZ3MgdG8gYmUgc2VudCB0aHJvdWdoIGxvZ2dlcnMKICAgIGRlcHJlY2F0aW9uLmluc3RhbGxfd2FybmluZ19sb2dnZXIoKQoKICAgIGF1dG9jb21wbGV0ZSgpCgogICAgdHJ5OgogICAgICAgIGNtZF9uYW1lLCBjbWRfYXJncyA9IHBhcnNlb3B0cyhhcmdzKQogICAgZXhjZXB0IFBpcEVycm9yIGFzIGV4YzoKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFUlJPUjogJXMiICUgZXhjKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUob3MubGluZXNlcCkKICAgICAgICBzeXMuZXhpdCgxKQoKICAgICMgTmVlZGVkIGZvciBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpIHRvIHdvcmsKICAgICMgaW4gcGlwLnV0aWxzLmVuY29kaW5nLmF1dG9fZGVjb2RlCiAgICB0cnk6CiAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnJykKICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3IgYXMgZToKICAgICAgICAjIHNldGxvY2FsZSBjYW4gYXBwYXJlbnRseSBjcmFzaCBpZiBsb2NhbGUgYXJlIHVuaW5pdGlhbGl6ZWQKICAgICAgICBsb2dnZXIuZGVidWcoIklnbm9yaW5nIGVycm9yICVzIHdoZW4gc2V0dGluZyBsb2NhbGUiLCBlKQogICAgY29tbWFuZCA9IGNvbW1hbmRzX2RpY3RbY21kX25hbWVdKGlzb2xhdGVkPWNoZWNrX2lzb2xhdGVkKGNtZF9hcmdzKSkKICAgIHJldHVybiBjb21tYW5kLm1haW4oY21kX2FyZ3MpCgoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICMgV3JpdGluZyBmcmVlemUgZmlsZXMKCmNsYXNzIEZyb3plblJlcXVpcmVtZW50KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJlcSwgZWRpdGFibGUsIGNvbW1lbnRzPSgpKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5yZXEgPSByZXEKICAgICAgICBzZWxmLmVkaXRhYmxlID0gZWRpdGFibGUKICAgICAgICBzZWxmLmNvbW1lbnRzID0gY29tbWVudHMKCiAgICBfcmV2X3JlID0gcmUuY29tcGlsZShyJy1yKFxkKykkJykKICAgIF9kYXRlX3JlID0gcmUuY29tcGlsZShyJy0oMjBcZFxkXGRcZFxkXGQpJCcpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9kaXN0KGNscywgZGlzdCwgZGVwZW5kZW5jeV9saW5rcyk6CiAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChkaXN0LmxvY2F0aW9uKSkKICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIGdldF9zcmNfcmVxdWlyZW1lbnQKICAgICAgICBpZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpIGFuZCB2Y3MuZ2V0X2JhY2tlbmRfbmFtZShsb2NhdGlvbik6CiAgICAgICAgICAgIGVkaXRhYmxlID0gVHJ1ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXEgPSBnZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsIGxvY2F0aW9uKQogICAgICAgICAgICBleGNlcHQgSW5zdGFsbGF0aW9uRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gdHJ5aW5nIHRvIGdldCByZXF1aXJlbWVudCBmb3IgVkNTIHN5c3RlbSAlcywgIgogICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgdG8gdW5lZGl0YWJsZSBmb3JtYXQiLCBleGMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlcSA9IE5vbmUKICAgICAgICAgICAgaWYgcmVxIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGRldGVybWluZSByZXBvc2l0b3J5IGxvY2F0aW9uIG9mICVzJywgbG9jYXRpb24KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAnIyMgISEgQ291bGQgbm90IGRldGVybWluZSByZXBvc2l0b3J5IGxvY2F0aW9uJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgICAgICBlZGl0YWJsZSA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZWRpdGFibGUgPSBGYWxzZQogICAgICAgICAgICByZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgc3BlY3MgPSByZXEuc3BlY3MKICAgICAgICAgICAgYXNzZXJ0IGxlbihzcGVjcykgPT0gMSBhbmQgc3BlY3NbMF1bMF0gaW4gWyI9PSIsICI9PT0iXSwgXAogICAgICAgICAgICAgICAgJ0V4cGVjdGVkIDEgc3BlYyB3aXRoID09IG9yID09PTsgc3BlY3MgPSAlcjsgZGlzdCA9ICVyJyAlIFwKICAgICAgICAgICAgICAgIChzcGVjcywgZGlzdCkKICAgICAgICAgICAgdmVyc2lvbiA9IHNwZWNzWzBdWzFdCiAgICAgICAgICAgIHZlcl9tYXRjaCA9IGNscy5fcmV2X3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgICAgICBkYXRlX21hdGNoID0gY2xzLl9kYXRlX3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgICAgICBpZiB2ZXJfbWF0Y2ggb3IgZGF0ZV9tYXRjaDoKICAgICAgICAgICAgICAgIHN2bl9iYWNrZW5kID0gdmNzLmdldF9iYWNrZW5kKCdzdm4nKQogICAgICAgICAgICAgICAgaWYgc3ZuX2JhY2tlbmQ6CiAgICAgICAgICAgICAgICAgICAgc3ZuX2xvY2F0aW9uID0gc3ZuX2JhY2tlbmQoKS5nZXRfbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IHN2bl9sb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ1dhcm5pbmc6IGNhbm5vdCBmaW5kIHN2biBsb2NhdGlvbiBmb3IgJXMnLCByZXEpCiAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAnIyMgRklYTUU6IGNvdWxkIG5vdCBmaW5kIHN2biBVUkwgaW4gZGVwZW5kZW5jeV9saW5rcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBwYWNrYWdlOicKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgJyMgSW5zdGFsbGluZyBhcyBlZGl0YWJsZSB0byBzYXRpc2Z5IHJlcXVpcmVtZW50ICVzOicgJQogICAgICAgICAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgdmVyX21hdGNoOgogICAgICAgICAgICAgICAgICAgICAgICByZXYgPSB2ZXJfbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByZXYgPSAneyVzfScgJSBkYXRlX21hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmVxID0gJyVzQCVzI2VnZz0lcycgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN2bl9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICAgICAgICAgICAgICBjbHMuZWdnX25hbWUoZGlzdCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscyhkaXN0LnByb2plY3RfbmFtZSwgcmVxLCBlZGl0YWJsZSwgY29tbWVudHMpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGVnZ19uYW1lKGRpc3QpOgogICAgICAgIG5hbWUgPSBkaXN0LmVnZ19uYW1lKCkKICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChyJy1weVxkXC5cZCQnLCBuYW1lKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6bWF0Y2guc3RhcnQoKV0KICAgICAgICByZXR1cm4gbmFtZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJlcSA9IHNlbGYucmVxCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmVxID0gJy1lICVzJyAlIHJlcQogICAgICAgIHJldHVybiAnXG4nLmpvaW4obGlzdChzZWxmLmNvbW1lbnRzKSArIFtzdHIocmVxKV0pICsgJ1xuJwoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuZXhpdChtYWluKCkpClBLAwQUAAAAAAAAACEAS0mkZUgCAABIAgAAHwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX19tYWluX18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCiMgSWYgd2UgYXJlIHJ1bm5pbmcgZnJvbSBhIHdoZWVsLCBhZGQgdGhlIHdoZWVsIHRvIHN5cy5wYXRoCiMgVGhpcyBhbGxvd3MgdGhlIHVzYWdlIHB5dGhvbiBwaXAtKi53aGwvcGlwIGluc3RhbGwgcGlwLSoud2hsCmlmIF9fcGFja2FnZV9fID09ICcnOgogICAgIyBfX2ZpbGVfXyBpcyBwaXAtKi53aGwvcGlwL19fbWFpbl9fLnB5CiAgICAjIGZpcnN0IGRpcm5hbWUgY2FsbCBzdHJpcHMgb2YgJy9fX21haW5fXy5weScsIHNlY29uZCBzdHJpcHMgb2ZmICcvcGlwJwogICAgIyBSZXN1bHRpbmcgcGF0aCBpcyB0aGUgbmFtZSBvZiB0aGUgd2hlZWwgaXRzZWxmCiAgICAjIEFkZCB0aGF0IHRvIHN5cy5wYXRoIHNvIHdlIGNhbiBpbXBvcnQgcGlwCiAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGF0aCkKCmltcG9ydCBwaXAgICMgbm9xYQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5leGl0KHBpcC5tYWluKCkpClBLAwQUAAAAAAAAACEAT73MSD4SAAA+EgAAJwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9fX2luaXRfXy5weSIiIgpwaXAuX3ZlbmRvciBpcyBmb3IgdmVuZG9yaW5nIGRlcGVuZGVuY2llcyBvZiBwaXAgdG8gcHJldmVudCBuZWVkaW5nIHBpcCB0bwpkZXBlbmQgb24gc29tZXRoaW5nIGV4dGVybmFsLgoKRmlsZXMgaW5zaWRlIG9mIHBpcC5fdmVuZG9yIHNob3VsZCBiZSBjb25zaWRlcmVkIGltbXV0YWJsZSBhbmQgc2hvdWxkIG9ubHkgYmUKdXBkYXRlZCB0byB2ZXJzaW9ucyBmcm9tIHVwc3RyZWFtLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBnbG9iCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzeXMKCiMgRG93bnN0cmVhbSByZWRpc3RyaWJ1dG9ycyB3aGljaCBoYXZlIGRlYnVuZGxlZCBvdXIgZGVwZW5kZW5jaWVzIHNob3VsZCBhbHNvCiMgcGF0Y2ggdGhpcyB2YWx1ZSB0byBiZSB0cnVlLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYWRkaXRpb25hbCBwYXRjaGluZwojIHRvIGNhdXNlIHRoaW5ncyBsaWtlICJzaXgiIHRvIGJlIGF2YWlsYWJsZSBhcyBwaXAuCkRFQlVORExFRCA9IEZhbHNlCgojIEJ5IGRlZmF1bHQsIGxvb2sgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGEgYnVuY2ggb2YgLndobCBmaWxlcyB3aGljaCB3ZSB3aWxsCiMgYWRkIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3lzLnBhdGggYmVmb3JlIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGFueXRoaW5nLiBUaGlzCiMgaXMgZG9uZSB0byBzdXBwb3J0IGRvd25zdHJlYW0gcmUtZGlzdHJpYnV0b3JzIGxpa2UgRGViaWFuIGFuZCBGZWRvcmEgd2hvCiMgd2lzaCB0byBjcmVhdGUgdGhlaXIgb3duIFdoZWVscyBmb3Igb3VyIGRlcGVuZGVuY2llcyB0byBhaWQgaW4gZGVidW5kbGluZy4KV0hFRUxfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCgoKIyBEZWZpbmUgYSBzbWFsbCBoZWxwZXIgZnVuY3Rpb24gdG8gYWxpYXMgb3VyIHZlbmRvcmVkIG1vZHVsZXMgdG8gdGhlIHJlYWwgb25lcwojIGlmIHRoZSB2ZW5kb3JlZCBvbmVzIGRvIG5vdCBleGlzdC4gVGhpcyBpZGVhIG9mIHRoaXMgd2FzIHRha2VuIGZyb20KIyBodHRwczovL2dpdGh1Yi5jb20va2VubmV0aHJlaXR6L3JlcXVlc3RzL3B1bGwvMjU2Ny4KZGVmIHZlbmRvcmVkKG1vZHVsZW5hbWUpOgogICAgdmVuZG9yZWRfbmFtZSA9ICJ7MH0uezF9Ii5mb3JtYXQoX19uYW1lX18sIG1vZHVsZW5hbWUpCgogICAgdHJ5OgogICAgICAgIF9faW1wb3J0X18odmVuZG9yZWRfbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgbGV2ZWw9MCkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgbGV2ZWw9MCkKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgV2UgY2FuIGp1c3Qgc2lsZW50bHkgYWxsb3cgaW1wb3J0IGZhaWx1cmVzIHRvIHBhc3MgaGVyZS4gSWYgd2UKICAgICAgICAgICAgIyBnb3QgdG8gdGhpcyBwb2ludCBpdCBtZWFucyB0aGF0IGBgaW1wb3J0IHBpcC5fdmVuZG9yLndoYXRldmVyYGAKICAgICAgICAgICAgIyBmYWlsZWQgYW5kIHNvIGRpZCBgYGltcG9ydCB3aGF0ZXZlcmBgLiBTaW5jZSB3ZSdyZSBpbXBvcnRpbmcgdGhpcwogICAgICAgICAgICAjIHVwZnJvbnQgaW4gYW4gYXR0ZW1wdCB0byBhbGlhcyBpbXBvcnRzLCBub3QgZXJyb3JpbmcgaGVyZSB3aWxsCiAgICAgICAgICAgICMganVzdCBtZWFuIHdlIGdldCBhIHJlZ3VsYXIgaW1wb3J0IGVycm9yIHdoZW5ldmVyIHBpcCAqYWN0dWFsbHkqCiAgICAgICAgICAgICMgdHJpZXMgdG8gaW1wb3J0IG9uZSBvZiB0aGVzZSBtb2R1bGVzIHRvIHVzZSBpdCwgd2hpY2ggYWN0dWFsbHkKICAgICAgICAgICAgIyBnaXZlcyB1cyBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoYW4gd2Ugd291bGQgaGF2ZSBvdGhlcndpc2UKICAgICAgICAgICAgIyBnb3R0ZW4uCiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBzeXMubW9kdWxlc1t2ZW5kb3JlZF9uYW1lXSA9IHN5cy5tb2R1bGVzW21vZHVsZW5hbWVdCiAgICAgICAgICAgIGJhc2UsIGhlYWQgPSB2ZW5kb3JlZF9uYW1lLnJzcGxpdCgiLiIsIDEpCiAgICAgICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbYmFzZV0sIGhlYWQsIHN5cy5tb2R1bGVzW21vZHVsZW5hbWVdKQoKCiMgSWYgd2UncmUgb3BlcmF0aW5nIGluIGEgZGVidW5kbGVkIHNldHVwLCB0aGVuIHdlIHdhbnQgdG8gZ28gYWhlYWQgYW5kIHRyaWdnZXIKIyB0aGUgYWxpYXNpbmcgb2Ygb3VyIHZlbmRvcmVkIGxpYnJhcmllcyBhcyB3ZWxsIGFzIGxvb2tpbmcgZm9yIHdoZWVscyB0byBhZGQKIyB0byBvdXIgc3lzLnBhdGguIFRoaXMgd2lsbCBjYXVzZSBhbGwgb2YgdGhpcyBjb2RlIHRvIGJlIGEgbm8tb3AgdHlwaWNhbGx5CiMgaG93ZXZlciBkb3duc3RyZWFtIHJlZGlzdHJpYnV0b3JzIGNhbiBlbmFibGUgaXQgaW4gYSBjb25zaXN0ZW50IHdheSBhY3Jvc3MKIyBhbGwgcGxhdGZvcm1zLgppZiBERUJVTkRMRUQ6CiAgICAjIEFjdHVhbGx5IGxvb2sgaW5zaWRlIG9mIFdIRUVMX0RJUiB0byBmaW5kIC53aGwgZmlsZXMgYW5kIGFkZCB0aGVtIHRvIHRoZQogICAgIyBmcm9udCBvZiBvdXIgc3lzLnBhdGguCiAgICBzeXMucGF0aFs6XSA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oV0hFRUxfRElSLCAiKi53aGwiKSkgKyBzeXMucGF0aAoKICAgICMgQWN0dWFsbHkgYWxpYXMgYWxsIG9mIG91ciB2ZW5kb3JlZCBkZXBlbmRlbmNpZXMuCiAgICB2ZW5kb3JlZCgiY2FjaGVjb250cm9sIikKICAgIHZlbmRvcmVkKCJjb2xvcmFtYSIpCiAgICB2ZW5kb3JlZCgiZGlzdGxpYiIpCiAgICB2ZW5kb3JlZCgiZGlzdHJvIikKICAgIHZlbmRvcmVkKCJodG1sNWxpYiIpCiAgICB2ZW5kb3JlZCgibG9ja2ZpbGUiKQogICAgdmVuZG9yZWQoInNpeCIpCiAgICB2ZW5kb3JlZCgic2l4Lm1vdmVzIikKICAgIHZlbmRvcmVkKCJzaXgubW92ZXMudXJsbGliIikKICAgIHZlbmRvcmVkKCJwYWNrYWdpbmciKQogICAgdmVuZG9yZWQoInBhY2thZ2luZy52ZXJzaW9uIikKICAgIHZlbmRvcmVkKCJwYWNrYWdpbmcuc3BlY2lmaWVycyIpCiAgICB2ZW5kb3JlZCgicGtnX3Jlc291cmNlcyIpCiAgICB2ZW5kb3JlZCgicHJvZ3Jlc3MiKQogICAgdmVuZG9yZWQoInJldHJ5aW5nIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuX2NvbGxlY3Rpb25zIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbm5lY3Rpb24iKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29ubmVjdGlvbnBvb2wiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb250cmliLm50bG1wb29sIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmV4Y2VwdGlvbnMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuZmllbGRzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmZpbGVwb3N0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLm9yZGVyZWRfZGljdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5zaXgiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZS4iCiAgICAgICAgICAgICAiX2ltcGxlbWVudGF0aW9uIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBvb2xtYW5hZ2VyIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnJlcXVlc3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucmVzcG9uc2UiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLmNvbm5lY3Rpb24iKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5yZXF1ZXN0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwucmVzcG9uc2UiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5yZXRyeSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnNzbF8iKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC50aW1lb3V0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwudXJsIikKUEsDBBQAAAAAAAAAIQCFiZaKYFcAAGBXAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2FwcGRpcnMucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMuCiMgQ29weXJpZ2h0IChjKSAyMDEzIEVkZHkgUGV0cmnImW9yCgoiIiJVdGlsaXRpZXMgZm9yIGRldGVybWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRpcnMuCgpTZWUgPGh0dHA6Ly9naXRodWIuY29tL0FjdGl2ZVN0YXRlL2FwcGRpcnM+IGZvciBkZXRhaWxzIGFuZCB1c2FnZS4KIiIiCiMgRGV2IE5vdGVzOgojIC0gTVNETiBvbiB3aGVyZSB0byBzdG9yZSBhcHAgZGF0YSBmaWxlczoKIyAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7ZW4tdXM7MzEwMjk0I1hTTFRIMzE5NDEyMTEyMzEyMDEyMTEyMDEyMAojIC0gbWFjT1M6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vTWFjT1NYL0NvbmNlcHR1YWwvQlBGaWxlU3lzdGVtL2luZGV4Lmh0bWwKIyAtIFhERyBzcGVjIGZvciBVbip4OiBodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sCgpfX3ZlcnNpb25faW5mb19fID0gKDEsIDQsIDApCl9fdmVyc2lvbl9fID0gJy4nLmpvaW4obWFwKHN0ciwgX192ZXJzaW9uX2luZm9fXykpCgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKaWYgUFkzOgogICAgdW5pY29kZSA9IHN0cgoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBwbGF0Zm9ybQogICAgb3NfbmFtZSA9IHBsYXRmb3JtLmphdmFfdmVyKClbM11bMF0KICAgIGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnV2luZG93cycpOiAjICJXaW5kb3dzIFhQIiwgIldpbmRvd3MgNyIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnd2luMzInCiAgICBlbGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnTWFjJyk6ICMgIm1hY09TIiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICdkYXJ3aW4nCiAgICBlbHNlOiAjICJMaW51eCIsICJTdW5PUyIsICJGcmVlQlNEIiwgZXRjLgogICAgICAgICMgU2V0dGluZyB0aGlzIHRvICJsaW51eDIiIGlzIG5vdCBpZGVhbCwgYnV0IG9ubHkgV2luZG93cyBvciBNYWMKICAgICAgICAjIGFyZSBhY3R1YWxseSBjaGVja2VkIGZvciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZSBleHBlY3RzCiAgICAgICAgIyAqc3lzLnBsYXRmb3JtKiBzdHlsZSBzdHJpbmdzLgogICAgICAgIHN5c3RlbSA9ICdsaW51eDInCmVsc2U6CiAgICBzeXN0ZW0gPSBzeXMucGxhdGZvcm0KCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbiAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKHJvYW1pbmcpOiAgICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwQXV0aG9yPlw8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8ubG9jYWwvc2hhcmUiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBkYXRhIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19EQVRBX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPicsCiAgICAgICAgICAgIGlmIFhER19EQVRBX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIC91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+IG9yIC91c3Ivc2hhcmUvPEFwcE5hbWU+CiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xBbGwgVXNlcnNcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQogICAgICAgIFdpbiA3OiAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPiAgICMgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3LgoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0RBVEFfRElSU1swXSBkZWZhdWx0LgoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfREFUQV9ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9ESVJTJywKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGhzZXAuam9pbihbJy91c3IvbG9jYWwvc2hhcmUnLCAnL3Vzci9zaGFyZSddKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPiAgICAgIyBvciBpbiAkWERHX0NPTkZJR19IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luICo6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19DT05GSUdfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlYWZ1bHQgIn4vLmNvbmZpZy88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIE5vbmUsIHJvYW1pbmcpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBjb25maWcgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0NPTkZJR19ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL2V0Yy94ZGcvPEFwcE5hbWU+JywgaWYgWERHX0NPTkZJR19ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgL2V0Yy94ZGcvPEFwcE5hbWU+IG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+IGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiAqOiAgICAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfQ09ORklHX0RJUlNbMF0gZGVmYXVsdCwgaWYgbXVsdGlwYXRoPUZhbHNlCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSBzaXRlX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgICAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfQ09ORklHX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfRElSUycsICcvZXRjL3hkZycpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiQ2FjaGUiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cy4gU2VlCiAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28gaW4KICAgIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbm9uLXJvYW1pbmcKICAgIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgIGFib3ZlKS4gQXBwcyB0eXBpY2FsbHkKICAgIHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZSBleGFtcGxlczoKICAgICAgICAuLi5cTW96aWxsYVxGaXJlZm94XFByb2ZpbGVzXDxQcm9maWxlTmFtZT5cQ2FjaGUKICAgICAgICAuLi5cQWNtZVxTdXBlckFwcFxDYWNoZVwxLjAKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgICAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkNhY2hlIikKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9DYWNoZXMnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NBQ0hFX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLmNhY2hlJykpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2xvZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgbG9nIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkxvZ3MiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cywgYW5kICJsb2ciIHRvIHRoZQogICAgICAgICAgICBiYXNlIGNhY2hlIGRpciBmb3IgVW5peC4gU2VlIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvTG9ncy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4vbG9nICAjIG9yIHVuZGVyICRYREdfQ0FDSEVfSE9NRSBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzCiAgICBnbyBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gKE5vdGU6IEknbSBpbnRlcmVzdGVkIGluCiAgICBleGFtcGxlcyBvZiB3aGF0IHNvbWUgd2luZG93cyBhcHBzIHVzZSBmb3IgYSBsb2dzIGRpci4pCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJMb2dzIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgCiAgICB2YWx1ZSBmb3IgV2luZG93cyBhbmQgYXBwZW5kcyAibG9nIiB0byB0aGUgdXNlciBjYWNoZSBkaXIgZm9yIFVuaXguCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvTG9ncycpLAogICAgICAgICAgICBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiTG9ncyIpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSB1c2VyX2NhY2hlX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAibG9nIikKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBBcHBEaXJzKG9iamVjdCk6CiAgICAiIiJDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBnZXR0aW5nIGFwcGxpY2F0aW9uIGRpcnMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXBwbmFtZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSwKICAgICAgICAgICAgICAgICBtdWx0aXBhdGg9RmFsc2UpOgogICAgICAgIHNlbGYuYXBwbmFtZSA9IGFwcG5hbWUKICAgICAgICBzZWxmLmFwcGF1dGhvciA9IGFwcGF1dGhvcgogICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICBzZWxmLnJvYW1pbmcgPSByb2FtaW5nCiAgICAgICAgc2VsZi5tdWx0aXBhdGggPSBtdWx0aXBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NhY2hlX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2xvZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfbG9nX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgoKIy0tLS0gaW50ZXJuYWwgc3VwcG9ydCBzdHVmZgoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiVGhpcyBpcyBhIGZhbGxiYWNrIHRlY2huaXF1ZSBhdCBiZXN0LiBJJ20gbm90IHN1cmUgaWYgdXNpbmcgdGhlCiAgICByZWdpc3RyeSBmb3IgdGhpcyBndWFyYW50ZWVzIHVzIHRoZSBjb3JyZWN0IGFuc3dlciBmb3IgYWxsIENTSURMXyoKICAgIG5hbWVzLgogICAgIiIiCiAgICBpbXBvcnQgX3dpbnJlZwoKICAgIHNoZWxsX2ZvbGRlcl9uYW1lID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogIkFwcERhdGEiLAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6ICJDb21tb24gQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAiTG9jYWwgQXBwRGF0YSIsCiAgICB9W2NzaWRsX25hbWVdCgogICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5KAogICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgciJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzIgogICAgKQogICAgZGlyLCB0eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMihjc2lkbF9uYW1lKToKICAgIGZyb20gd2luMzJjb20uc2hlbGwgaW1wb3J0IHNoZWxsY29uLCBzaGVsbAogICAgZGlyID0gc2hlbGwuU0hHZXRGb2xkZXJQYXRoKDAsIGdldGF0dHIoc2hlbGxjb24sIGNzaWRsX25hbWUpLCAwLCAwKQogICAgIyBUcnkgdG8gbWFrZSB0aGlzIGEgdW5pY29kZSBwYXRoIGJlY2F1c2UgU0hHZXRGb2xkZXJQYXRoIGRvZXMKICAgICMgbm90IHJldHVybiB1bmljb2RlIHN0cmluZ3Mgd2hlbiB0aGVyZSBpcyB1bmljb2RlIGRhdGEgaW4gdGhlCiAgICAjIHBhdGguCiAgICB0cnk6CiAgICAgICAgZGlyID0gdW5pY29kZShkaXIpCgogICAgICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBjIGluIGRpcjoKICAgICAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHdpbjMyYXBpCiAgICAgICAgICAgICAgICBkaXIgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKGRpcikKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcyhjc2lkbF9uYW1lKToKICAgIGltcG9ydCBjdHlwZXMKCiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgYXJyYXkKICAgIGZyb20gY29tLnN1biBpbXBvcnQgam5hCiAgICBmcm9tIGNvbS5zdW4uam5hLnBsYXRmb3JtIGltcG9ydCB3aW4zMgoKICAgIGJ1Zl9zaXplID0gd2luMzIuV2luRGVmLk1BWF9QQVRIICogMgogICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgIHNoZWxsID0gd2luMzIuU2hlbGwzMi5JTlNUQU5DRQogICAgc2hlbGwuU0hHZXRGb2xkZXJQYXRoKE5vbmUsIGdldGF0dHIod2luMzIuU2hsT2JqLCBjc2lkbF9uYW1lKSwgTm9uZSwgd2luMzIuU2hsT2JqLlNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gZGlyOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgICAgICBrZXJuZWwgPSB3aW4zMi5LZXJuZWwzMi5JTlNUQU5DRQogICAgICAgIGlmIGtlcm5hbC5HZXRTaG9ydFBhdGhOYW1lKGRpciwgYnVmLCBidWZfc2l6ZSk6CiAgICAgICAgICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgIHJldHVybiBkaXIKCmlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW4zMmNvbS5zaGVsbAogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgY29tLnN1bi5qbmEKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCiMtLS0tIHNlbGYgdGVzdCBjb2RlCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgYXBwbmFtZSA9ICJNeUFwcCIKICAgIGFwcGF1dGhvciA9ICJNeUNvbXBhbnkiCgogICAgcHJvcHMgPSAoInVzZXJfZGF0YV9kaXIiLCAic2l0ZV9kYXRhX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jb25maWdfZGlyIiwgInNpdGVfY29uZmlnX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jYWNoZV9kaXIiLCAidXNlcl9sb2dfZGlyIikKCiAgICBwcmludCgiLS0gYXBwIGRpcnMgKHdpdGggb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb249IjEuMCIpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGggZGlzYWJsZWQgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcj1GYWxzZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQpQSwMEFAAAAAAAAAAhAABWrDouAQAALgEAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5IiIiQ2FjaGVDb250cm9sIGltcG9ydCBJbnRlcmZhY2UuCgpNYWtlIGl0IGVhc3kgdG8gaW1wb3J0IGZyb20gY2FjaGVjb250cm9sIHdpdGhvdXQgbG9uZyBuYW1lc3BhY2VzLgoiIiIKX19hdXRob3JfXyA9ICdFcmljIExhcnNvbicKX19lbWFpbF9fID0gJ2VyaWNAaW9ucm9jay5vcmcnCl9fdmVyc2lvbl9fID0gJzAuMTEuNycKCmZyb20gLndyYXBwZXIgaW1wb3J0IENhY2hlQ29udHJvbApmcm9tIC5hZGFwdGVyIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gLmNvbnRyb2xsZXIgaW1wb3J0IENhY2hlQ29udHJvbGxlcgpQSwMEFAAAAAAAAAAhANpURqUoBQAAKAUAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19jbWQucHlpbXBvcnQgbG9nZ2luZwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcmVxdWVzdHMKCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmFkYXB0ZXIgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuY2FjaGUgaW1wb3J0IERpY3RDYWNoZQpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5jb250cm9sbGVyIGltcG9ydCBsb2dnZXIKCmZyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCgoKZGVmIHNldHVwX2xvZ2dpbmcoKToKICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQogICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCiAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQoKCmRlZiBnZXRfc2Vzc2lvbigpOgogICAgYWRhcHRlciA9IENhY2hlQ29udHJvbEFkYXB0ZXIoCiAgICAgICAgRGljdENhY2hlKCksCiAgICAgICAgY2FjaGVfZXRhZ3M9VHJ1ZSwKICAgICAgICBzZXJpYWxpemVyPU5vbmUsCiAgICAgICAgaGV1cmlzdGljPU5vbmUsCiAgICApCiAgICBzZXNzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICBzZXNzLm1vdW50KCdodHRwOi8vJywgYWRhcHRlcikKICAgIHNlc3MubW91bnQoJ2h0dHBzOi8vJywgYWRhcHRlcikKCiAgICBzZXNzLmNhY2hlX2NvbnRyb2xsZXIgPSBhZGFwdGVyLmNvbnRyb2xsZXIKICAgIHJldHVybiBzZXNzCgoKZGVmIGdldF9hcmdzKCk6CiAgICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcigpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd1cmwnLCBoZWxwPSdUaGUgVVJMIHRvIHRyeSBhbmQgY2FjaGUnKQogICAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKCgpkZWYgbWFpbihhcmdzPU5vbmUpOgogICAgYXJncyA9IGdldF9hcmdzKCkKICAgIHNlc3MgPSBnZXRfc2Vzc2lvbigpCgogICAgIyBNYWtlIGEgcmVxdWVzdCB0byBnZXQgYSByZXNwb25zZQogICAgcmVzcCA9IHNlc3MuZ2V0KGFyZ3MudXJsKQoKICAgICMgVHVybiBvbiBsb2dnaW5nCiAgICBzZXR1cF9sb2dnaW5nKCkKCiAgICAjIHRyeSBzZXR0aW5nIHRoZSBjYWNoZQogICAgc2Vzcy5jYWNoZV9jb250cm9sbGVyLmNhY2hlX3Jlc3BvbnNlKHJlc3AucmVxdWVzdCwgcmVzcC5yYXcpCgogICAgIyBOb3cgdHJ5IHRvIGdldCBpdAogICAgaWYgc2Vzcy5jYWNoZV9jb250cm9sbGVyLmNhY2hlZF9yZXF1ZXN0KHJlc3AucmVxdWVzdCk6CiAgICAgICAgcHJpbnQoJ0NhY2hlZCEnKQogICAgZWxzZToKICAgICAgICBwcmludCgnTm90IGNhY2hlZCA6KCcpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAFDmqSwAEgAAABIAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlpbXBvcnQgdHlwZXMKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hZGFwdGVycyBpbXBvcnQgSFRUUEFkYXB0ZXIKCmZyb20gLmNvbnRyb2xsZXIgaW1wb3J0IENhY2hlQ29udHJvbGxlcgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gLmZpbGV3cmFwcGVyIGltcG9ydCBDYWxsYmFja0ZpbGVXcmFwcGVyCgoKY2xhc3MgQ2FjaGVDb250cm9sQWRhcHRlcihIVFRQQWRhcHRlcik6CiAgICBpbnZhbGlkYXRpbmdfbWV0aG9kcyA9IHNldChbJ1BVVCcsICdERUxFVEUnXSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjYWNoZV9ldGFncz1UcnVlLAogICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfY2xhc3M9Tm9uZSwKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyPU5vbmUsCiAgICAgICAgICAgICAgICAgaGV1cmlzdGljPU5vbmUsCiAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY2FjaGUgPSBjYWNoZSBvciBEaWN0Q2FjaGUoKQogICAgICAgIHNlbGYuaGV1cmlzdGljID0gaGV1cmlzdGljCgogICAgICAgIGNvbnRyb2xsZXJfZmFjdG9yeSA9IGNvbnRyb2xsZXJfY2xhc3Mgb3IgQ2FjaGVDb250cm9sbGVyCiAgICAgICAgc2VsZi5jb250cm9sbGVyID0gY29udHJvbGxlcl9mYWN0b3J5KAogICAgICAgICAgICBzZWxmLmNhY2hlLAogICAgICAgICAgICBjYWNoZV9ldGFncz1jYWNoZV9ldGFncywKICAgICAgICAgICAgc2VyaWFsaXplcj1zZXJpYWxpemVyLAogICAgICAgICkKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBTZW5kIGEgcmVxdWVzdC4gVXNlIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHNlZSBpZiBpdAogICAgICAgIGV4aXN0cyBpbiB0aGUgY2FjaGUgYW5kIGNhY2hlIHRoZSByZXNwb25zZSBpZiB3ZSBuZWVkIHRvIGFuZCBjYW4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcmVxdWVzdC5tZXRob2QgPT0gJ0dFVCc6CiAgICAgICAgICAgIGNhY2hlZF9yZXNwb25zZSA9IHNlbGYuY29udHJvbGxlci5jYWNoZWRfcmVxdWVzdChyZXF1ZXN0KQogICAgICAgICAgICBpZiBjYWNoZWRfcmVzcG9uc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9yZXNwb25zZShyZXF1ZXN0LCBjYWNoZWRfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX2NhY2hlPVRydWUpCgogICAgICAgICAgICAjIGNoZWNrIGZvciBldGFncyBhbmQgYWRkIGhlYWRlcnMgaWYgYXBwcm9wcmlhdGUKICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnVwZGF0ZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jb25kaXRpb25hbF9oZWFkZXJzKHJlcXVlc3QpCiAgICAgICAgICAgICkKCiAgICAgICAgcmVzcCA9IHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLnNlbmQocmVxdWVzdCwgKiprdykKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgYnVpbGRfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGZyb21fY2FjaGU9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgcmVzcG9uc2UgYnkgbWFraW5nIGEgcmVxdWVzdCBvciB1c2luZyB0aGUgY2FjaGUuCgogICAgICAgIFRoaXMgd2lsbCBlbmQgdXAgY2FsbGluZyBzZW5kIGFuZCByZXR1cm5pbmcgYSBwb3RlbnRpYWxseQogICAgICAgIGNhY2hlZCByZXNwb25zZQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBmcm9tX2NhY2hlIGFuZCByZXF1ZXN0Lm1ldGhvZCA9PSAnR0VUJzoKICAgICAgICAgICAgIyBDaGVjayBmb3IgYW55IGhldXJpc3RpY3MgdGhhdCBtaWdodCB1cGRhdGUgaGVhZGVycwogICAgICAgICAgICAjIGJlZm9yZSB0cnlpbmcgdG8gY2FjaGUuCiAgICAgICAgICAgIGlmIHNlbGYuaGV1cmlzdGljOgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmhldXJpc3RpYy5hcHBseShyZXNwb25zZSkKCiAgICAgICAgICAgICMgYXBwbHkgYW55IGV4cGlyYXRpb24gaGV1cmlzdGljcwogICAgICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMzA0OgogICAgICAgICAgICAgICAgIyBXZSBtdXN0IGhhdmUgc2VudCBhbiBFVGFnIHJlcXVlc3QuIFRoaXMgY291bGQgbWVhbgogICAgICAgICAgICAgICAgIyB0aGF0IHdlJ3ZlIGJlZW4gZXhwaXJlZCBhbHJlYWR5IG9yIHRoYXQgd2Ugc2ltcGx5CiAgICAgICAgICAgICAgICAjIGhhdmUgYW4gZXRhZy4gSW4gZWl0aGVyIGNhc2UsIHdlIHdhbnQgdG8gdHJ5IGFuZAogICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIGNhY2hlIGlmIHRoYXQgaXMgdGhlIGNhc2UuCiAgICAgICAgICAgICAgICBjYWNoZWRfcmVzcG9uc2UgPSBzZWxmLmNvbnRyb2xsZXIudXBkYXRlX2NhY2hlZF9yZXNwb25zZSgKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIGNhY2hlZF9yZXNwb25zZSBpcyBub3QgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgZnJvbV9jYWNoZSA9IFRydWUKCiAgICAgICAgICAgICAgICAjIFdlIGFyZSBkb25lIHdpdGggdGhlIHNlcnZlciByZXNwb25zZSwgcmVhZCBhCiAgICAgICAgICAgICAgICAjIHBvc3NpYmxlIHJlc3BvbnNlIGJvZHkgKGNvbXBsaWFudCBzZXJ2ZXJzIHdpbGwKICAgICAgICAgICAgICAgICMgbm90IHJldHVybiBvbmUsIGJ1dCB3ZSBjYW5ub3QgYmUgMTAwJSBzdXJlKSBhbmQKICAgICAgICAgICAgICAgICMgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZChkZWNvZGVfY29udGVudD1GYWxzZSkKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlbGVhc2VfY29ubigpCgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjYWNoZWRfcmVzcG9uc2UKCiAgICAgICAgICAgICMgV2UgYWx3YXlzIGNhY2hlIHRoZSAzMDEgcmVzcG9uc2VzCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jYWNoZV9yZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV3JhcCB0aGUgcmVzcG9uc2UgZmlsZSB3aXRoIGEgd3JhcHBlciB0aGF0IHdpbGwgY2FjaGUgdGhlCiAgICAgICAgICAgICAgICAjICAgcmVzcG9uc2Ugd2hlbiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbnN1bWVkLgogICAgICAgICAgICAgICAgcmVzcG9uc2UuX2ZwID0gQ2FsbGJhY2tGaWxlV3JhcHBlcigKICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5fZnAsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jYWNoZV9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgcmVzcG9uc2UuY2h1bmtlZDoKICAgICAgICAgICAgICAgICAgICBzdXBlcl91cGRhdGVfY2h1bmtfbGVuZ3RoID0gcmVzcG9uc2UuX3VwZGF0ZV9jaHVua19sZW5ndGgKCiAgICAgICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY2h1bmtfbGVuZ3RoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl91cGRhdGVfY2h1bmtfbGVuZ3RoKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcC5fY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLl91cGRhdGVfY2h1bmtfbGVuZ3RoID0gdHlwZXMuTWV0aG9kVHlwZShfdXBkYXRlX2NodW5rX2xlbmd0aCwgcmVzcG9uc2UpCgogICAgICAgIHJlc3AgPSBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5idWlsZF9yZXNwb25zZSgKICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UKICAgICAgICApCgogICAgICAgICMgU2VlIGlmIHdlIHNob3VsZCBpbnZhbGlkYXRlIHRoZSBjYWNoZS4KICAgICAgICBpZiByZXF1ZXN0Lm1ldGhvZCBpbiBzZWxmLmludmFsaWRhdGluZ19tZXRob2RzIGFuZCByZXNwLm9rOgogICAgICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNvbnRyb2xsZXIuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCgogICAgICAgICMgR2l2ZSB0aGUgcmVxdWVzdCBhIGZyb21fY2FjaGUgYXR0ciB0byBsZXQgcGVvcGxlIHVzZSBpdAogICAgICAgIHJlc3AuZnJvbV9jYWNoZSA9IGZyb21fY2FjaGUKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZS5jbG9zZSgpCiAgICAgICAgc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuY2xvc2UoKQpQSwMEFAAAAAAAAAAhABKqxvAWAwAAFgMAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlLnB5IiIiClRoZSBjYWNoZSBvYmplY3QgQVBJIGZvciBpbXBsZW1lbnRpbmcgY2FjaGVzLiBUaGUgZGVmYXVsdCBpcyBhIHRocmVhZApzYWZlIGluLW1lbW9yeSBkaWN0aW9uYXJ5LgoiIiIKZnJvbSB0aHJlYWRpbmcgaW1wb3J0IExvY2sKCgpjbGFzcyBCYXNlQ2FjaGUob2JqZWN0KToKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBEaWN0Q2FjaGUoQmFzZUNhY2hlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdF9kaWN0PU5vbmUpOgogICAgICAgIHNlbGYubG9jayA9IExvY2soKQogICAgICAgIHNlbGYuZGF0YSA9IGluaXRfZGljdCBvciB7fQoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmdldChrZXksIE5vbmUpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5kYXRhLnVwZGF0ZSh7a2V5OiB2YWx1ZX0pCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgc2VsZi5kYXRhLnBvcChrZXkpClBLAwQUAAAAAAAAACEAnh1W/HEBAABxAQAAOwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL19faW5pdF9fLnB5ZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZGVkZW50Cgp0cnk6CiAgICBmcm9tIC5maWxlX2NhY2hlIGltcG9ydCBGaWxlQ2FjaGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgbm90aWNlID0gZGVkZW50KCcnJwogICAgTk9URTogSW4gb3JkZXIgdG8gdXNlIHRoZSBGaWxlQ2FjaGUgeW91IG11c3QgaGF2ZQogICAgbG9ja2ZpbGUgaW5zdGFsbGVkLiBZb3UgY2FuIGluc3RhbGwgaXQgdmlhIHBpcDoKICAgICAgcGlwIGluc3RhbGwgbG9ja2ZpbGUKICAgICcnJykKICAgIHByaW50KG5vdGljZSkKCgp0cnk6CiAgICBpbXBvcnQgcmVkaXMKICAgIGZyb20gLnJlZGlzX2NhY2hlIGltcG9ydCBSZWRpc0NhY2hlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDBpwb/zA0AAMwNAAA9AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvZmlsZV9jYWNoZS5weWltcG9ydCBoYXNobGliCmltcG9ydCBvcwoKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZSBpbXBvcnQgTG9ja0ZpbGUKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZS5ta2RpcmxvY2tmaWxlIGltcG9ydCBNa2RpckxvY2tGaWxlCgpmcm9tIC4uY2FjaGUgaW1wb3J0IEJhc2VDYWNoZQpmcm9tIC4uY29udHJvbGxlciBpbXBvcnQgQ2FjaGVDb250cm9sbGVyCgoKZGVmIF9zZWN1cmVfb3Blbl93cml0ZShmaWxlbmFtZSwgZm1vZGUpOgogICAgIyBXZSBvbmx5IHdhbnQgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLCBzbyBvcGVuIGl0IGluIHdyaXRlIG9ubHkgbW9kZQogICAgZmxhZ3MgPSBvcy5PX1dST05MWQoKICAgICMgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIHNvIHdlIG9ubHkKICAgICMgIHdpbGwgb3BlbiAqbmV3KiBmaWxlcy4KICAgICMgV2Ugc3BlY2lmeSB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZSB3ZSBwYXNzIGlzIHRoZQogICAgIyBtb2RlIG9mIHRoZSBmaWxlLgogICAgZmxhZ3MgfD0gb3MuT19DUkVBVCB8IG9zLk9fRVhDTAoKICAgICMgRG8gbm90IGZvbGxvdyBzeW1saW5rcyB0byBwcmV2ZW50IHNvbWVvbmUgZnJvbSBtYWtpbmcgYSBzeW1saW5rIHRoYXQKICAgICMgd2UgZm9sbG93IGFuZCBpbnNlY3VyZWx5IG9wZW4gYSBjYWNoZSBmaWxlLgogICAgaWYgaGFzYXR0cihvcywgIk9fTk9GT0xMT1ciKToKICAgICAgICBmbGFncyB8PSBvcy5PX05PRk9MTE9XCgogICAgIyBPbiBXaW5kb3dzIHdlJ2xsIG1hcmsgdGhpcyBmaWxlIGFzIGJpbmFyeQogICAgaWYgaGFzYXR0cihvcywgIk9fQklOQVJZIik6CiAgICAgICAgZmxhZ3MgfD0gb3MuT19CSU5BUlkKCiAgICAjIEJlZm9yZSB3ZSBvcGVuIG91ciBmaWxlLCB3ZSB3YW50IHRvIGRlbGV0ZSBhbnkgZXhpc3RpbmcgZmlsZSB0aGF0IGlzCiAgICAjIHRoZXJlCiAgICB0cnk6CiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQogICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAjIFRoZSBmaWxlIG11c3Qgbm90IGV4aXN0IGFscmVhZHksIHNvIHdlIGNhbiBqdXN0IHNraXAgYWhlYWQgdG8gb3BlbmluZwogICAgICAgIHBhc3MKCiAgICAjIE9wZW4gb3VyIGZpbGUsIHRoZSB1c2Ugb2Ygb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB3aWxsIGVuc3VyZSB0aGF0IGlmIGEKICAgICMgcmFjZSBjb25kaXRpb24gaGFwcGVucyBiZXR3ZWVuIHRoZSBvcy5yZW1vdmUgYW5kIHRoaXMgbGluZSwgdGhhdCBhbgogICAgIyBlcnJvciB3aWxsIGJlIHJhaXNlZC4gQmVjYXVzZSB3ZSB1dGlsaXplIGEgbG9ja2ZpbGUgdGhpcyBzaG91bGQgb25seQogICAgIyBoYXBwZW4gaWYgc29tZW9uZSBpcyBhdHRlbXB0aW5nIHRvIGF0dGFjayB1cy4KICAgIGZkID0gb3Mub3BlbihmaWxlbmFtZSwgZmxhZ3MsIGZtb2RlKQogICAgdHJ5OgogICAgICAgIHJldHVybiBvcy5mZG9wZW4oZmQsICJ3YiIpCiAgICBleGNlcHQ6CiAgICAgICAgIyBBbiBlcnJvciBvY2N1cnJlZCB3cmFwcGluZyBvdXIgRkQgaW4gYSBmaWxlIG9iamVjdAogICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgIHJhaXNlCgoKY2xhc3MgRmlsZUNhY2hlKEJhc2VDYWNoZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5LCBmb3JldmVyPUZhbHNlLCBmaWxlbW9kZT0wbzA2MDAsCiAgICAgICAgICAgICAgICAgZGlybW9kZT0wbzA3MDAsIHVzZV9kaXJfbG9jaz1Ob25lLCBsb2NrX2NsYXNzPU5vbmUpOgoKICAgICAgICBpZiB1c2VfZGlyX2xvY2sgaXMgbm90IE5vbmUgYW5kIGxvY2tfY2xhc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCB1c2UgdXNlX2Rpcl9sb2NrIGFuZCBsb2NrX2NsYXNzIHRvZ2V0aGVyIikKCiAgICAgICAgaWYgdXNlX2Rpcl9sb2NrOgogICAgICAgICAgICBsb2NrX2NsYXNzID0gTWtkaXJMb2NrRmlsZQoKICAgICAgICBpZiBsb2NrX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgICAgIGxvY2tfY2xhc3MgPSBMb2NrRmlsZQoKICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IGRpcmVjdG9yeQogICAgICAgIHNlbGYuZm9yZXZlciA9IGZvcmV2ZXIKICAgICAgICBzZWxmLmZpbGVtb2RlID0gZmlsZW1vZGUKICAgICAgICBzZWxmLmRpcm1vZGUgPSBkaXJtb2RlCiAgICAgICAgc2VsZi5sb2NrX2NsYXNzID0gbG9ja19jbGFzcwoKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZW5jb2RlKHgpOgogICAgICAgIHJldHVybiBoYXNobGliLnNoYTIyNCh4LmVuY29kZSgpKS5oZXhkaWdlc3QoKQoKICAgIGRlZiBfZm4oc2VsZiwgbmFtZSk6CiAgICAgICAgIyBOT1RFOiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGNoYW5nZSBhcyBzb21lIG1heSBkZXBlbmQgb24gaXQuCiAgICAgICAgIyAgICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pb25yb2NrL2NhY2hlY29udHJvbC9pc3N1ZXMvNjMKICAgICAgICBoYXNoZWQgPSBzZWxmLmVuY29kZShuYW1lKQogICAgICAgIHBhcnRzID0gbGlzdChoYXNoZWRbOjVdKSArIFtoYXNoZWRdCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgKnBhcnRzKQoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICBuYW1lID0gc2VsZi5fZm4oa2V5KQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgd2l0aCBvcGVuKG5hbWUsICdyYicpIGFzIGZoOgogICAgICAgICAgICByZXR1cm4gZmgucmVhZCgpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBuYW1lID0gc2VsZi5fZm4oa2V5KQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cwogICAgICAgIHRyeToKICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG5hbWUpLCBzZWxmLmRpcm1vZGUpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICB3aXRoIHNlbGYubG9ja19jbGFzcyhuYW1lKSBhcyBsb2NrOgogICAgICAgICAgICAjIFdyaXRlIG91ciBhY3R1YWwgZmlsZQogICAgICAgICAgICB3aXRoIF9zZWN1cmVfb3Blbl93cml0ZShsb2NrLnBhdGgsIHNlbGYuZmlsZW1vZGUpIGFzIGZoOgogICAgICAgICAgICAgICAgZmgud3JpdGUodmFsdWUpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCiAgICAgICAgaWYgbm90IHNlbGYuZm9yZXZlcjoKICAgICAgICAgICAgb3MucmVtb3ZlKG5hbWUpCgoKZGVmIHVybF90b19maWxlX3BhdGgodXJsLCBmaWxlY2FjaGUpOgogICAgIiIiUmV0dXJuIHRoZSBmaWxlIGNhY2hlIHBhdGggYmFzZWQgb24gdGhlIFVSTC4KCiAgICBUaGlzIGRvZXMgbm90IGVuc3VyZSB0aGUgZmlsZSBleGlzdHMhCiAgICAiIiIKICAgIGtleSA9IENhY2hlQ29udHJvbGxlci5jYWNoZV91cmwodXJsKQogICAgcmV0dXJuIGZpbGVjYWNoZS5fZm4oa2V5KQpQSwMEFAAAAAAAAAAhANOIxlTNAwAAzQMAAD4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgoKZGVmIHRvdGFsX3NlY29uZHModGQpOgogICAgIiIiUHl0aG9uIDIuNiBjb21wYXRhYmlsaXR5IiIiCiAgICBpZiBoYXNhdHRyKHRkLCAndG90YWxfc2Vjb25kcycpOgogICAgICAgIHJldHVybiB0ZC50b3RhbF9zZWNvbmRzKCkKCiAgICBtcyA9IHRkLm1pY3Jvc2Vjb25kcwogICAgc2VjcyA9ICh0ZC5zZWNvbmRzICsgdGQuZGF5cyAqIDI0ICogMzYwMCkKICAgIHJldHVybiAobXMgKyBzZWNzICogMTAqKjYpIC8gMTAqKjYKCgpjbGFzcyBSZWRpc0NhY2hlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgogICAgICAgIHNlbGYuY29ubiA9IGNvbm4KCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5nZXQoa2V5KQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSwgZXhwaXJlcz1Ob25lKToKICAgICAgICBpZiBub3QgZXhwaXJlczoKICAgICAgICAgICAgc2VsZi5jb25uLnNldChrZXksIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV4cGlyZXMgPSBleHBpcmVzIC0gZGF0ZXRpbWUubm93KCkKICAgICAgICAgICAgc2VsZi5jb25uLnNldGV4KGtleSwgdG90YWxfc2Vjb25kcyhleHBpcmVzKSwgdmFsdWUpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIHNlbGYuY29ubi5kZWxldGUoa2V5KQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiJIZWxwZXIgZm9yIGNsZWFyaW5nIGFsbCB0aGUga2V5cyBpbiBhIGRhdGFiYXNlLiBVc2Ugd2l0aAogICAgICAgIGNhdXRpb24hIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmNvbm4ua2V5cygpOgogICAgICAgICAgICBzZWxmLmNvbm4uZGVsZXRlKGtleSkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jb25uLmRpc2Nvbm5lY3QoKQpQSwMEFAAAAAAAAAAhAC08LTN8AQAAfAEAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbXBhdC5weXRyeToKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxqb2luCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybGpvaW4KCgp0cnk6CiAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHBpY2tsZQoKCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsIGltcG9ydCBpc19mcF9jbG9zZWQKCiMgUmVwbGljYXRlIHNvbWUgc2l4IGJlaGF2aW91cgp0cnk6CiAgICB0ZXh0X3R5cGUgPSAodW5pY29kZSwpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICB0ZXh0X3R5cGUgPSAoc3RyLCkKUEsDBBQAAAAAAAAAIQDHYLne4DIAAOAyAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb250cm9sbGVyLnB5IiIiClRoZSBodHRwbGliMiBhbGdvcml0aG1zIHBvcnRlZCBmb3IgdXNlIHdpdGggcmVxdWVzdHMuCiIiIgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKaW1wb3J0IGNhbGVuZGFyCmltcG9ydCB0aW1lCmZyb20gZW1haWwudXRpbHMgaW1wb3J0IHBhcnNlZGF0ZV90egoKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0Cgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gLnNlcmlhbGl6ZSBpbXBvcnQgU2VyaWFsaXplcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKVVJJID0gcmUuY29tcGlsZShyIl4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPyIpCgoKZGVmIHBhcnNlX3VyaSh1cmkpOgogICAgIiIiUGFyc2VzIGEgVVJJIHVzaW5nIHRoZSByZWdleCBnaXZlbiBpbiBBcHBlbmRpeCBCIG9mIFJGQyAzOTg2LgoKICAgICAgICAoc2NoZW1lLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkgPSBwYXJzZV91cmkodXJpKQogICAgIiIiCiAgICBncm91cHMgPSBVUkkubWF0Y2godXJpKS5ncm91cHMoKQogICAgcmV0dXJuIChncm91cHNbMV0sIGdyb3Vwc1szXSwgZ3JvdXBzWzRdLCBncm91cHNbNl0sIGdyb3Vwc1s4XSkKCgpjbGFzcyBDYWNoZUNvbnRyb2xsZXIob2JqZWN0KToKICAgICIiIkFuIGludGVyZmFjZSB0byBzZWUgaWYgcmVxdWVzdCBzaG91bGQgY2FjaGVkIG9yIG5vdC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlPU5vbmUsIGNhY2hlX2V0YWdzPVRydWUsIHNlcmlhbGl6ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5jYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICAgICAgc2VsZi5jYWNoZV9ldGFncyA9IGNhY2hlX2V0YWdzCiAgICAgICAgc2VsZi5zZXJpYWxpemVyID0gc2VyaWFsaXplciBvciBTZXJpYWxpemVyKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfdXJsbm9ybShjbHMsIHVyaSk6CiAgICAgICAgIiIiTm9ybWFsaXplIHRoZSBVUkwgdG8gY3JlYXRlIGEgc2FmZSBrZXkgZm9yIHRoZSBjYWNoZSIiIgogICAgICAgIChzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KSA9IHBhcnNlX3VyaSh1cmkpCiAgICAgICAgaWYgbm90IHNjaGVtZSBvciBub3QgYXV0aG9yaXR5OgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIk9ubHkgYWJzb2x1dGUgVVJJcyBhcmUgYWxsb3dlZC4gdXJpID0gJXMiICUgdXJpKQoKICAgICAgICBzY2hlbWUgPSBzY2hlbWUubG93ZXIoKQogICAgICAgIGF1dGhvcml0eSA9IGF1dGhvcml0eS5sb3dlcigpCgogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICBwYXRoID0gIi8iCgogICAgICAgICMgQ291bGQgZG8gc3ludGF4IGJhc2VkIG5vcm1hbGl6YXRpb24gb2YgdGhlIFVSSSBiZWZvcmUKICAgICAgICAjIGNvbXB1dGluZyB0aGUgZGlnZXN0LiBTZWUgU2VjdGlvbiA2LjIuMiBvZiBTdGQgNjYuCiAgICAgICAgcmVxdWVzdF91cmkgPSBxdWVyeSBhbmQgIj8iLmpvaW4oW3BhdGgsIHF1ZXJ5XSkgb3IgcGF0aAogICAgICAgIGRlZnJhZ191cmkgPSBzY2hlbWUgKyAiOi8vIiArIGF1dGhvcml0eSArIHJlcXVlc3RfdXJpCgogICAgICAgIHJldHVybiBkZWZyYWdfdXJpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgY2FjaGVfdXJsKGNscywgdXJpKToKICAgICAgICByZXR1cm4gY2xzLl91cmxub3JtKHVyaSkKCiAgICBkZWYgcGFyc2VfY2FjaGVfY29udHJvbChzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSB0aGUgY2FjaGUgY29udHJvbCBoZWFkZXJzIHJldHVybmluZyBhIGRpY3Rpb25hcnkgd2l0aCB2YWx1ZXMKICAgICAgICBmb3IgdGhlIGRpZmZlcmVudCBkaXJlY3RpdmVzLgogICAgICAgICIiIgogICAgICAgIHJldHZhbCA9IHt9CgogICAgICAgIGNjX2hlYWRlciA9ICdjYWNoZS1jb250cm9sJwogICAgICAgIGlmICdDYWNoZS1Db250cm9sJyBpbiBoZWFkZXJzOgogICAgICAgICAgICBjY19oZWFkZXIgPSAnQ2FjaGUtQ29udHJvbCcKCiAgICAgICAgaWYgY2NfaGVhZGVyIGluIGhlYWRlcnM6CiAgICAgICAgICAgIHBhcnRzID0gaGVhZGVyc1tjY19oZWFkZXJdLnNwbGl0KCcsJykKICAgICAgICAgICAgcGFydHNfd2l0aF9hcmdzID0gWwogICAgICAgICAgICAgICAgdHVwbGUoW3guc3RyaXAoKS5sb3dlcigpIGZvciB4IGluIHBhcnQuc3BsaXQoIj0iLCAxKV0pCiAgICAgICAgICAgICAgICBmb3IgcGFydCBpbiBwYXJ0cyBpZiAtMSAhPSBwYXJ0LmZpbmQoIj0iKQogICAgICAgICAgICBdCiAgICAgICAgICAgIHBhcnRzX3dvX2FyZ3MgPSBbCiAgICAgICAgICAgICAgICAobmFtZS5zdHJpcCgpLmxvd2VyKCksIDEpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBwYXJ0cyBpZiAtMSA9PSBuYW1lLmZpbmQoIj0iKQogICAgICAgICAgICBdCiAgICAgICAgICAgIHJldHZhbCA9IGRpY3QocGFydHNfd2l0aF9hcmdzICsgcGFydHNfd29fYXJncykKICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgZGVmIGNhY2hlZF9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNhY2hlZCByZXNwb25zZSBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlLCBvdGhlcndpc2UKICAgICAgICByZXR1cm4gRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdMb29raW5nIHVwICIlcyIgaW4gdGhlIGNhY2hlJywgY2FjaGVfdXJsKQogICAgICAgIGNjID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKHJlcXVlc3QuaGVhZGVycykKCiAgICAgICAgIyBCYWlsIG91dCBpZiB0aGUgcmVxdWVzdCBpbnNpc3RzIG9uIGZyZXNoIGRhdGEKICAgICAgICBpZiAnbm8tY2FjaGUnIGluIGNjOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibm8tY2FjaGUiLCBjYWNoZSBieXBhc3NlZCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiAnbWF4LWFnZScgaW4gY2MgYW5kIGNjWydtYXgtYWdlJ10gPT0gMDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGhlYWRlciBoYXMgIm1heF9hZ2UiIGFzIDAsIGNhY2hlIGJ5cGFzc2VkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgUmVxdWVzdCBhbGxvd3Mgc2VydmluZyBmcm9tIHRoZSBjYWNoZSwgbGV0J3Mgc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nCiAgICAgICAgY2FjaGVfZGF0YSA9IHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkKICAgICAgICBpZiBjYWNoZV9kYXRhIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gY2FjaGUgZW50cnkgYXZhaWxhYmxlJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQ2hlY2sgd2hldGhlciBpdCBjYW4gYmUgZGVzZXJpYWxpemVkCiAgICAgICAgcmVzcCA9IHNlbGYuc2VyaWFsaXplci5sb2FkcyhyZXF1ZXN0LCBjYWNoZV9kYXRhKQogICAgICAgIGlmIG5vdCByZXNwOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2FjaGUgZW50cnkgZGVzZXJpYWxpemF0aW9uIGZhaWxlZCwgZW50cnkgaWdub3JlZCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlIGhhdmUgYSBjYWNoZWQgMzAxLCByZXR1cm4gaXQgaW1tZWRpYXRlbHkuIFdlIGRvbid0CiAgICAgICAgIyBuZWVkIHRvIHRlc3Qgb3VyIHJlc3BvbnNlIGZvciBvdGhlciBoZWFkZXJzIGIvYyBpdCBpcwogICAgICAgICMgaW50cmluc2ljYWxseSAiY2FjaGVhYmxlIiBhcyBpdCBpcyBQZXJtYW5lbnQuCiAgICAgICAgIyBTZWU6CiAgICAgICAgIyAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjIKICAgICAgICAjCiAgICAgICAgIyBDbGllbnQgY2FuIHRyeSB0byByZWZyZXNoIHRoZSB2YWx1ZSBieSByZXBlYXRpbmcgdGhlIHJlcXVlc3QKICAgICAgICAjIHdpdGggY2FjaGUgYnVzdGluZyBoZWFkZXJzIGFzIHVzdWFsIChpZSBuby1jYWNoZSkuCiAgICAgICAgaWYgcmVzcC5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICBtc2cgPSAoJ1JldHVybmluZyBjYWNoZWQgIjMwMSBNb3ZlZCBQZXJtYW5lbnRseSIgcmVzcG9uc2UgJwogICAgICAgICAgICAgICAgICAgJyhpZ25vcmluZyBkYXRlIGFuZCBldGFnIGluZm9ybWF0aW9uKScpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhtc2cpCiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgIGhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3AuaGVhZGVycykKICAgICAgICBpZiBub3QgaGVhZGVycyBvciAnZGF0ZScgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIGlmICdldGFnJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgICMgV2l0aG91dCBkYXRlIG9yIGV0YWcsIHRoZSBjYWNoZWQgcmVzcG9uc2UgY2FuIG5ldmVyIGJlIHVzZWQKICAgICAgICAgICAgICAgICMgYW5kIHNob3VsZCBiZSBkZWxldGVkLgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQdXJnaW5nIGNhY2hlZCByZXNwb25zZTogbm8gZGF0ZSBvciBldGFnJykKICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBjYWNoZWQgcmVzcG9uc2U6IG5vIGRhdGUnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBkYXRlID0gY2FsZW5kYXIudGltZWdtKAogICAgICAgICAgICBwYXJzZWRhdGVfdHooaGVhZGVyc1snZGF0ZSddKQogICAgICAgICkKICAgICAgICBjdXJyZW50X2FnZSA9IG1heCgwLCBub3cgLSBkYXRlKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ3VycmVudCBhZ2UgYmFzZWQgb24gZGF0ZTogJWknLCBjdXJyZW50X2FnZSkKCiAgICAgICAgIyBUT0RPOiBUaGVyZSBpcyBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc3VsdCB3aWxsIGJlIGEKICAgICAgICAjICAgICAgIHVybGxpYjMgcmVzcG9uc2Ugb2JqZWN0LiBUaGlzIG1heSBub3QgYmUgYmVzdCBzaW5jZSB3ZQogICAgICAgICMgICAgICAgY291bGQgcHJvYmFibHkgYXZvaWQgaW5zdGFudGlhdGluZyBvciBjb25zdHJ1Y3RpbmcgdGhlCiAgICAgICAgIyAgICAgICByZXNwb25zZSB1bnRpbCB3ZSBrbm93IHdlIG5lZWQgaXQuCiAgICAgICAgcmVzcF9jYyA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChoZWFkZXJzKQoKICAgICAgICAjIGRldGVybWluZSBmcmVzaG5lc3MKICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSAwCgogICAgICAgICMgQ2hlY2sgdGhlIG1heC1hZ2UgcHJhZ21hIGluIHRoZSBjYWNoZSBjb250cm9sIGhlYWRlcgogICAgICAgIGlmICdtYXgtYWdlJyBpbiByZXNwX2NjIGFuZCByZXNwX2NjWydtYXgtYWdlJ10uaXNkaWdpdCgpOgogICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBpbnQocmVzcF9jY1snbWF4LWFnZSddKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZyZXNobmVzcyBsaWZldGltZSBmcm9tIG1heC1hZ2U6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKCiAgICAgICAgIyBJZiB0aGVyZSBpc24ndCBhIG1heC1hZ2UsIGNoZWNrIGZvciBhbiBleHBpcmVzIGhlYWRlcgogICAgICAgIGVsaWYgJ2V4cGlyZXMnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGV4cGlyZXMgPSBwYXJzZWRhdGVfdHooaGVhZGVyc1snZXhwaXJlcyddKQogICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXhwaXJlX3RpbWUgPSBjYWxlbmRhci50aW1lZ20oZXhwaXJlcykgLSBkYXRlCiAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBtYXgoMCwgZXhwaXJlX3RpbWUpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkZyZXNobmVzcyBsaWZldGltZSBmcm9tIGV4cGlyZXM6ICVpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUpCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGFyZSBzZXR0aW5nIGZyZXNobmVzcyBsaW1pdCBpbiB0aGUKICAgICAgICAjIHJlcXVlc3QuIE5vdGUsIHRoaXMgb3ZlcnJpZGVzIHdoYXQgd2FzIGluIHRoZSByZXNwb25zZS4KICAgICAgICBpZiAnbWF4LWFnZScgaW4gY2M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IGludChjY1snbWF4LWFnZSddKQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGcmVzaG5lc3MgbGlmZXRpbWUgZnJvbSByZXF1ZXN0IG1heC1hZ2U6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gMAoKICAgICAgICBpZiAnbWluLWZyZXNoJyBpbiBjYzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWluX2ZyZXNoID0gaW50KGNjWydtaW4tZnJlc2gnXSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBtaW5fZnJlc2ggPSAwCiAgICAgICAgICAgICMgYWRqdXN0IG91ciBjdXJyZW50IGFnZSBieSBvdXIgbWluIGZyZXNoCiAgICAgICAgICAgIGN1cnJlbnRfYWdlICs9IG1pbl9mcmVzaAogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkanVzdGVkIGN1cnJlbnQgYWdlIGZyb20gbWluLWZyZXNoOiAlaScsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2FnZSkKCiAgICAgICAgIyBSZXR1cm4gZW50cnkgaWYgaXQgaXMgZnJlc2ggZW5vdWdoCiAgICAgICAgaWYgZnJlc2huZXNzX2xpZmV0aW1lID4gY3VycmVudF9hZ2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVGhlIHJlc3BvbnNlIGlzICJmcmVzaCIsIHJldHVybmluZyBjYWNoZWQgcmVzcG9uc2UnKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVpID4gJWknLCBmcmVzaG5lc3NfbGlmZXRpbWUsIGN1cnJlbnRfYWdlKQogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICAjIHdlJ3JlIG5vdCBmcmVzaC4gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBFdGFnLCBjbGVhciBpdCBvdXQKICAgICAgICBpZiAnZXRhZycgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdUaGUgY2FjaGVkIHJlc3BvbnNlIGlzICJzdGFsZSIgd2l0aCBubyBldGFnLCBwdXJnaW5nJwogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKCiAgICAgICAgIyByZXR1cm4gdGhlIG9yaWdpbmFsIGhhbmRsZXIKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgY29uZGl0aW9uYWxfaGVhZGVycyhzZWxmLCByZXF1ZXN0KToKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICByZXNwID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKHJlcXVlc3QsIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkpCiAgICAgICAgbmV3X2hlYWRlcnMgPSB7fQoKICAgICAgICBpZiByZXNwOgogICAgICAgICAgICBoZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwLmhlYWRlcnMpCgogICAgICAgICAgICBpZiAnZXRhZycgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgIG5ld19oZWFkZXJzWydJZi1Ob25lLU1hdGNoJ10gPSBoZWFkZXJzWydFVGFnJ10KCiAgICAgICAgICAgIGlmICdsYXN0LW1vZGlmaWVkJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3X2hlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBoZWFkZXJzWydMYXN0LU1vZGlmaWVkJ10KCiAgICAgICAgcmV0dXJuIG5ld19oZWFkZXJzCgogICAgZGVmIGNhY2hlX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFsZ29yaXRobSBmb3IgY2FjaGluZyByZXF1ZXN0cy4KCiAgICAgICAgVGhpcyBhc3N1bWVzIGEgcmVxdWVzdHMgUmVzcG9uc2Ugb2JqZWN0LgogICAgICAgICIiIgogICAgICAgICMgRnJvbSBodHRwbGliMjogRG9uJ3QgY2FjaGUgMjA2J3Mgc2luY2Ugd2UgYXJlbid0IGdvaW5nIHRvCiAgICAgICAgIyAgICAgICAgICAgICAgICBoYW5kbGUgYnl0ZSByYW5nZSByZXF1ZXN0cwogICAgICAgIGNhY2hlYWJsZV9zdGF0dXNfY29kZXMgPSBbMjAwLCAyMDMsIDMwMCwgMzAxXQogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyBub3QgaW4gY2FjaGVhYmxlX3N0YXR1c19jb2RlczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1N0YXR1cyBjb2RlICVzIG5vdCBpbiAlcycsCiAgICAgICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBjYWNoZWFibGVfc3RhdHVzX2NvZGVzCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlc3BvbnNlX2hlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3BvbnNlLmhlYWRlcnMpCgogICAgICAgICMgSWYgd2UndmUgYmVlbiBnaXZlbiBhIGJvZHksIG91ciByZXNwb25zZSBoYXMgYSBDb250ZW50LUxlbmd0aCwgdGhhdAogICAgICAgICMgQ29udGVudC1MZW5ndGggaXMgdmFsaWQgdGhlbiB3ZSBjYW4gY2hlY2sgdG8gc2VlIGlmIHRoZSBib2R5IHdlJ3ZlCiAgICAgICAgIyBiZWVuIGdpdmVuIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHNpemUsIGFuZCBpZiBpdCBkb2Vzbid0IHdlJ2xsIGp1c3QKICAgICAgICAjIHNraXAgdHJ5aW5nIHRvIGNhY2hlIGl0LgogICAgICAgIGlmIChib2R5IGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoIiBpbiByZXNwb25zZV9oZWFkZXJzIGFuZAogICAgICAgICAgICAgICAgcmVzcG9uc2VfaGVhZGVyc1siY29udGVudC1sZW5ndGgiXS5pc2RpZ2l0KCkgYW5kCiAgICAgICAgICAgICAgICBpbnQocmVzcG9uc2VfaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSkgIT0gbGVuKGJvZHkpKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGNjX3JlcSA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChyZXF1ZXN0LmhlYWRlcnMpCiAgICAgICAgY2MgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2wocmVzcG9uc2VfaGVhZGVycykKCiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVcGRhdGluZyBjYWNoZSB3aXRoIHJlc3BvbnNlIGZyb20gIiVzIicsIGNhY2hlX3VybCkKCiAgICAgICAgIyBEZWxldGUgaXQgZnJvbSB0aGUgY2FjaGUgaWYgd2UgaGFwcGVuIHRvIGhhdmUgaXQgc3RvcmVkIHRoZXJlCiAgICAgICAgbm9fc3RvcmUgPSBGYWxzZQogICAgICAgIGlmIGNjLmdldCgnbm8tc3RvcmUnKToKICAgICAgICAgICAgbm9fc3RvcmUgPSBUcnVlCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVzcG9uc2UgaGVhZGVyIGhhcyAibm8tc3RvcmUiJykKICAgICAgICBpZiBjY19yZXEuZ2V0KCduby1zdG9yZScpOgogICAgICAgICAgICBub19zdG9yZSA9IFRydWUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGhlYWRlciBoYXMgIm5vLXN0b3JlIicpCiAgICAgICAgaWYgbm9fc3RvcmUgYW5kIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUHVyZ2luZyBleGlzdGluZyBjYWNoZSBlbnRyeSB0byBob25vciAibm8tc3RvcmUiJykKICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQoKICAgICAgICAjIElmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gZXRhZywgdGhlbiBrZWVwIHRoZSByZXNwb25zZQogICAgICAgIGlmIHNlbGYuY2FjaGVfZXRhZ3MgYW5kICdldGFnJyBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgZHVlIHRvIGV0YWcnKQogICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSwgYm9keT1ib2R5KSwKICAgICAgICAgICAgKQoKICAgICAgICAjIEFkZCB0byB0aGUgY2FjaGUgYW55IDMwMXMuIFdlIGRvIHRoaXMgYmVmb3JlIGxvb2tpbmcgdGhhdAogICAgICAgICMgdGhlIERhdGUgaGVhZGVycy4KICAgICAgICBlbGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBwZXJtYW5hbnQgcmVkaXJlY3QnKQogICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSkKICAgICAgICAgICAgKQoKICAgICAgICAjIEFkZCB0byB0aGUgY2FjaGUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgZGVtYW5kIGl0LiBJZiB0aGVyZQogICAgICAgICMgaXMgbm8gZGF0ZSBoZWFkZXIgdGhlbiB3ZSBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBleHBpcmluZwogICAgICAgICMgdGhlIGNhY2hlLgogICAgICAgIGVsaWYgJ2RhdGUnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgICMgY2FjaGUgd2hlbiB0aGVyZSBpcyBhIG1heC1hZ2UgPiAwCiAgICAgICAgICAgIGlmIGNjIGFuZCBjYy5nZXQoJ21heC1hZ2UnKToKICAgICAgICAgICAgICAgIGlmIGNjWydtYXgtYWdlJ10uaXNkaWdpdCgpIGFuZCBpbnQoY2NbJ21heC1hZ2UnXSkgPiAwOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBiL2MgZGF0ZSBleGlzdHMgYW5kIG1heC1hZ2UgPiAwJykKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Ym9keSksCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBJZiB0aGUgcmVxdWVzdCBjYW4gZXhwaXJlLCBpdCBtZWFucyB3ZSBzaG91bGQgY2FjaGUgaXQKICAgICAgICAgICAgIyBpbiB0aGUgbWVhbnRpbWUuCiAgICAgICAgICAgIGVsaWYgJ2V4cGlyZXMnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgICAgICBpZiByZXNwb25zZV9oZWFkZXJzWydleHBpcmVzJ106CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIGIvYyBvZiBleHBpcmVzIGhlYWRlcicpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PWJvZHkpLAogICAgICAgICAgICAgICAgICAgICkKCiAgICBkZWYgdXBkYXRlX2NhY2hlZF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSk6CiAgICAgICAgIiIiT24gYSAzMDQgd2Ugd2lsbCBnZXQgYSBuZXcgc2V0IG9mIGhlYWRlcnMgdGhhdCB3ZSB3YW50IHRvCiAgICAgICAgdXBkYXRlIG91ciBjYWNoZWQgdmFsdWUgd2l0aCwgYXNzdW1pbmcgd2UgaGF2ZSBvbmUuCgogICAgICAgIFRoaXMgc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgd2hlbiB3ZSd2ZSBzZW50IGFuIEVUYWcgYW5kCiAgICAgICAgZ290dGVuIGEgMzA0IGFzIHRoZSByZXNwb25zZS4KICAgICAgICAiIiIKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKAogICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICBzZWxmLmNhY2hlLmdldChjYWNoZV91cmwpCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgY2FjaGVkX3Jlc3BvbnNlOgogICAgICAgICAgICAjIHdlIGRpZG4ndCBoYXZlIGEgY2FjaGVkIHJlc3BvbnNlCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICAjIExldHMgdXBkYXRlIG91ciBoZWFkZXJzIHdpdGggdGhlIGhlYWRlcnMgZnJvbSB0aGUgbmV3IHJlcXVlc3Q6CiAgICAgICAgIyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcDQtY29uZGl0aW9uYWwtMjYjc2VjdGlvbi00LjEKICAgICAgICAjCiAgICAgICAgIyBUaGUgc2VydmVyIGlzbid0IHN1cHBvc2VkIHRvIHNlbmQgaGVhZGVycyB0aGF0IHdvdWxkIG1ha2UKICAgICAgICAjIHRoZSBjYWNoZWQgYm9keSBpbnZhbGlkLiBCdXQuLi4ganVzdCBpbiBjYXNlLCB3ZSdsbCBiZSBzdXJlCiAgICAgICAgIyB0byBzdHJpcCBvdXQgb25lcyB3ZSBrbm93IHRoYXQgbWlnaHQgYmUgcHJvYmxtYXRpYyBkdWUgdG8KICAgICAgICAjIHR5cGljYWwgYXNzdW1wdGlvbnMuCiAgICAgICAgZXhjbHVkZWRfaGVhZGVycyA9IFsKICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoIiwKICAgICAgICBdCgogICAgICAgIGNhY2hlZF9yZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSgKICAgICAgICAgICAgZGljdCgoaywgdikgZm9yIGssIHYgaW4gcmVzcG9uc2UuaGVhZGVycy5pdGVtcygpCiAgICAgICAgICAgICAgICAgaWYgay5sb3dlcigpIG5vdCBpbiBleGNsdWRlZF9oZWFkZXJzKQogICAgICAgICkKCiAgICAgICAgIyB3ZSB3YW50IGEgMjAwIGIvYyB3ZSBoYXZlIGNvbnRlbnQgdmlhIHRoZSBjYWNoZQogICAgICAgIGNhY2hlZF9yZXNwb25zZS5zdGF0dXMgPSAyMDAKCiAgICAgICAgIyB1cGRhdGUgb3VyIGNhY2hlCiAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIGNhY2hlZF9yZXNwb25zZSksCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gY2FjaGVkX3Jlc3BvbnNlClBLAwQUAAAAAAAAACEAbCY0fOMJAADjCQAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvZmlsZXdyYXBwZXIucHlmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgoKY2xhc3MgQ2FsbGJhY2tGaWxlV3JhcHBlcihvYmplY3QpOgogICAgIiIiCiAgICBTbWFsbCB3cmFwcGVyIGFyb3VuZCBhIGZwIG9iamVjdCB3aGljaCB3aWxsIHRlZSBldmVyeXRoaW5nIHJlYWQgaW50byBhCiAgICBidWZmZXIsIGFuZCB3aGVuIHRoYXQgZmlsZSBpcyBjbG9zZWQgaXQgd2lsbCBleGVjdXRlIGEgY2FsbGJhY2sgd2l0aCB0aGUKICAgIGNvbnRlbnRzIG9mIHRoYXQgYnVmZmVyLgoKICAgIEFsbCBhdHRyaWJ1dGVzIGFyZSBwcm94aWVkIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0LgoKICAgIFRoaXMgY2xhc3MgdXNlcyBtZW1iZXJzIHdpdGggYSBkb3VibGUgdW5kZXJzY29yZSAoX18pIGxlYWRpbmcgcHJlZml4IHNvIGFzCiAgICBub3QgdG8gYWNjaWRlbnRhbGx5IHNoYWRvdyBhbiBhdHRyaWJ1dGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIGNhbGxiYWNrKToKICAgICAgICBzZWxmLl9fYnVmID0gQnl0ZXNJTygpCiAgICAgICAgc2VsZi5fX2ZwID0gZnAKICAgICAgICBzZWxmLl9fY2FsbGJhY2sgPSBjYWxsYmFjawoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAjIFRoZSB2YWd1YXJpZXMgb2YgZ2FyYmFnZSBjb2xsZWN0aW9uIG1lYW5zIHRoYXQgc2VsZi5fX2ZwIGlzCiAgICAgICAgIyBub3QgYWx3YXlzIHNldC4gIEJ5IHVzaW5nIF9fZ2V0YXR0cmlidXRlX18gYW5kIHRoZSBwcml2YXRlCiAgICAgICAgIyBuYW1lWzBdIGFsbG93cyBsb29raW5nIHVwIHRoZSBhdHRyaWJ1dGUgdmFsdWUgYW5kIHJhaXNpbmcgYW4KICAgICAgICAjIEF0dHJpYnV0ZUVycm9yIHdoZW4gaXQgZG9lc24ndCBleGlzdC4gVGhpcyBzdG9wIHRoaWducyBmcm9tCiAgICAgICAgIyBpbmZpbml0ZWx5IHJlY3Vyc2luZyBjYWxscyB0byBnZXRhdHRyIGluIHRoZSBjYXNlIHdoZXJlCiAgICAgICAgIyBzZWxmLl9fZnAgaGFzbid0IGJlZW4gc2V0LgogICAgICAgICMKICAgICAgICAjIFswXSBodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL3JlZmVyZW5jZS9leHByZXNzaW9ucy5odG1sI2F0b20taWRlbnRpZmllcnMKICAgICAgICBmcCA9IHNlbGYuX19nZXRhdHRyaWJ1dGVfXygnX0NhbGxiYWNrRmlsZVdyYXBwZXJfX2ZwJykKICAgICAgICByZXR1cm4gZ2V0YXR0cihmcCwgbmFtZSkKCiAgICBkZWYgX19pc19mcF9jbG9zZWQoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2ZwLmZwIGlzIE5vbmUKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2ZwLmNsb3NlZAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIFdlIGp1c3QgZG9uJ3QgY2FjaGUgaXQgdGhlbi4KICAgICAgICAjIFRPRE86IEFkZCBzb21lIGxvZ2dpbmcgaGVyZS4uLgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fX2NhbGxiYWNrOgogICAgICAgICAgICBzZWxmLl9fY2FsbGJhY2soc2VsZi5fX2J1Zi5nZXR2YWx1ZSgpKQoKICAgICAgICAjIFdlIGFzc2lnbiB0aGlzIHRvIE5vbmUgaGVyZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgY2FuIGdldCBpbnRvCiAgICAgICAgIyByZWFsbHkgdHJpY2t5IHByb2JsZW1zIHdoZXJlIHRoZSBDUHl0aG9uIGludGVycHJldGVyIGRlYWQgbG9ja3MKICAgICAgICAjIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gc29tZXRoaW5nIHdoaWNoCiAgICAgICAgIyBoYXMgYSBfX2RlbF9fIG1ldGhvZC4gU2V0dGluZyB0aGlzIHRvIE5vbmUgYnJlYWtzIHRoZSBjeWNsZQogICAgICAgICMgYW5kIGFsbG93cyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gZG8gaXQncyB0aGluZyBub3JtYWxseS4KICAgICAgICBzZWxmLl9fY2FsbGJhY2sgPSBOb25lCgogICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUpOgogICAgICAgIGRhdGEgPSBzZWxmLl9fZnAucmVhZChhbXQpCiAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShkYXRhKQogICAgICAgIGlmIHNlbGYuX19pc19mcF9jbG9zZWQoKToKICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfc2FmZV9yZWFkKHNlbGYsIGFtdCk6CiAgICAgICAgZGF0YSA9IHNlbGYuX19mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICBpZiBhbXQgPT0gMiBhbmQgZGF0YSA9PSBiJ1xyXG4nOgogICAgICAgICAgICAjIHVybGxpYiBleGVjdXRlcyB0aGlzIHJlYWQgdG8gdG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kCiAgICAgICAgICAgICMgb2YgdGhlIGNodW5rLgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgICAgICBzZWxmLl9fYnVmLndyaXRlKGRhdGEpCiAgICAgICAgaWYgc2VsZi5fX2lzX2ZwX2Nsb3NlZCgpOgogICAgICAgICAgICBzZWxmLl9jbG9zZSgpCgogICAgICAgIHJldHVybiBkYXRhClBLAwQUAAAAAAAAACEADlQe/C0QAAAtEAAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvaGV1cmlzdGljcy5weWltcG9ydCBjYWxlbmRhcgppbXBvcnQgdGltZQoKZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZm9ybWF0ZGF0ZSwgcGFyc2VkYXRlLCBwYXJzZWRhdGVfdHoKCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKClRJTUVfRk1UID0gIiVhLCAlZCAlYiAlWSAlSDolTTolUyBHTVQiCgoKZGVmIGV4cGlyZV9hZnRlcihkZWx0YSwgZGF0ZT1Ob25lKToKICAgIGRhdGUgPSBkYXRlIG9yIGRhdGV0aW1lLm5vdygpCiAgICByZXR1cm4gZGF0ZSArIGRlbHRhCgoKZGVmIGRhdGV0aW1lX3RvX2hlYWRlcihkdCk6CiAgICByZXR1cm4gZm9ybWF0ZGF0ZShjYWxlbmRhci50aW1lZ20oZHQudGltZXR1cGxlKCkpKQoKCmNsYXNzIEJhc2VIZXVyaXN0aWMob2JqZWN0KToKCiAgICBkZWYgd2FybmluZyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgdmFsaWQgMXh4IHdhcm5pbmcgaGVhZGVyIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGNhY2hlCiAgICAgICAgYWRqdXN0bWVudHMuCgogICAgICAgIFRoZSByZXNwb25zZSBpcyBwcm92aWRlZCB0b28gYWxsb3cgd2FybmluZ3MgbGlrZSAxMTMKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjM0I3NlY3Rpb24tNS41LjQgd2hlcmUgd2UgbmVlZAogICAgICAgIHRvIGV4cGxpY2l0bHkgc2F5IHJlc3BvbnNlIGlzIG92ZXIgMjQgaG91cnMgb2xkLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnMTEwIC0gIlJlc3BvbnNlIGlzIFN0YWxlIicKCiAgICBkZWYgdXBkYXRlX2hlYWRlcnMoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgICIiIlVwZGF0ZSB0aGUgcmVzcG9uc2UgaGVhZGVycyB3aXRoIGFueSBuZXcgaGVhZGVycy4KCiAgICAgICAgTk9URTogVGhpcyBTSE9VTEQgYWx3YXlzIGluY2x1ZGUgc29tZSBXYXJuaW5nIGhlYWRlciB0bwogICAgICAgICAgICAgIHNpZ25pZnkgdGhhdCB0aGUgcmVzcG9uc2Ugd2FzIGNhY2hlZCBieSB0aGUgY2xpZW50LCBub3QKICAgICAgICAgICAgICBieSB3YXkgb2YgdGhlIHByb3ZpZGVkIGhlYWRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHt9CgogICAgZGVmIGFwcGx5KHNlbGYsIHJlc3BvbnNlKToKICAgICAgICB1cGRhdGVkX2hlYWRlcnMgPSBzZWxmLnVwZGF0ZV9oZWFkZXJzKHJlc3BvbnNlKQoKICAgICAgICBpZiB1cGRhdGVkX2hlYWRlcnM6CiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMudXBkYXRlKHVwZGF0ZWRfaGVhZGVycykKICAgICAgICAgICAgd2FybmluZ19oZWFkZXJfdmFsdWUgPSBzZWxmLndhcm5pbmcocmVzcG9uc2UpCiAgICAgICAgICAgIGlmIHdhcm5pbmdfaGVhZGVyX3ZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy51cGRhdGUoeydXYXJuaW5nJzogd2FybmluZ19oZWFkZXJfdmFsdWV9KQoKICAgICAgICByZXR1cm4gcmVzcG9uc2UKCgpjbGFzcyBPbmVEYXlDYWNoZShCYXNlSGV1cmlzdGljKToKICAgICIiIgogICAgQ2FjaGUgdGhlIHJlc3BvbnNlIGJ5IHByb3ZpZGluZyBhbiBleHBpcmVzIDEgZGF5IGluIHRoZQogICAgZnV0dXJlLgogICAgIiIiCiAgICBkZWYgdXBkYXRlX2hlYWRlcnMoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIGhlYWRlcnMgPSB7fQoKICAgICAgICBpZiAnZXhwaXJlcycgbm90IGluIHJlc3BvbnNlLmhlYWRlcnM6CiAgICAgICAgICAgIGRhdGUgPSBwYXJzZWRhdGUocmVzcG9uc2UuaGVhZGVyc1snZGF0ZSddKQogICAgICAgICAgICBleHBpcmVzID0gZXhwaXJlX2FmdGVyKHRpbWVkZWx0YShkYXlzPTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9ZGF0ZXRpbWUoKmRhdGVbOjZdKSkKICAgICAgICAgICAgaGVhZGVyc1snZXhwaXJlcyddID0gZGF0ZXRpbWVfdG9faGVhZGVyKGV4cGlyZXMpCiAgICAgICAgICAgIGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSA9ICdwdWJsaWMnCiAgICAgICAgcmV0dXJuIGhlYWRlcnMKCgpjbGFzcyBFeHBpcmVzQWZ0ZXIoQmFzZUhldXJpc3RpYyk6CiAgICAiIiIKICAgIENhY2hlICoqYWxsKiogcmVxdWVzdHMgZm9yIGEgZGVmaW5lZCB0aW1lIHBlcmlvZC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKICAgICAgICBzZWxmLmRlbHRhID0gdGltZWRlbHRhKCoqa3cpCgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICBleHBpcmVzID0gZXhwaXJlX2FmdGVyKHNlbGYuZGVsdGEpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ2V4cGlyZXMnOiBkYXRldGltZV90b19oZWFkZXIoZXhwaXJlcyksCiAgICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ3B1YmxpYycsCiAgICAgICAgfQoKICAgIGRlZiB3YXJuaW5nKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICB0bXBsID0gJzExMCAtIEF1dG9tYXRpY2FsbHkgY2FjaGVkIGZvciAlcy4gUmVzcG9uc2UgbWlnaHQgYmUgc3RhbGUnCiAgICAgICAgcmV0dXJuIHRtcGwgJSBzZWxmLmRlbHRhCgoKY2xhc3MgTGFzdE1vZGlmaWVkKEJhc2VIZXVyaXN0aWMpOgogICAgIiIiCiAgICBJZiB0aGVyZSBpcyBubyBFeHBpcmVzIGhlYWRlciBhbHJlYWR5LCBmYWxsIGJhY2sgb24gTGFzdC1Nb2RpZmllZAogICAgdXNpbmcgdGhlIGhldXJpc3RpYyBmcm9tCiAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjM0I3NlY3Rpb24tNC4yLjIKICAgIHRvIGNhbGN1bGF0ZSBhIHJlYXNvbmFibGUgdmFsdWUuCgogICAgRmlyZWZveCBhbHNvIGRvZXMgc29tZXRoaW5nIGxpa2UgdGhpcyBwZXIKICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ2FjaGluZ19GQVEKICAgIGh0dHA6Ly9seHIubW96aWxsYS5vcmcvbW96aWxsYS1yZWxlYXNlL3NvdXJjZS9uZXR3ZXJrL3Byb3RvY29sL2h0dHAvbnNIdHRwUmVzcG9uc2VIZWFkLmNwcCMzOTcKICAgIFVubGlrZSBtb3ppbGxhIHdlIGxpbWl0IHRoaXMgdG8gMjQtaHIuCiAgICAiIiIKICAgIGNhY2hlYWJsZV9ieV9kZWZhdWx0X3N0YXR1c2VzID0gc2V0KFsKICAgICAgICAyMDAsIDIwMywgMjA0LCAyMDYsIDMwMCwgMzAxLCA0MDQsIDQwNSwgNDEwLCA0MTQsIDUwMQogICAgXSkKCiAgICBkZWYgdXBkYXRlX2hlYWRlcnMoc2VsZiwgcmVzcCk6CiAgICAgICAgaGVhZGVycyA9IHJlc3AuaGVhZGVycwoKICAgICAgICBpZiAnZXhwaXJlcycgaW4gaGVhZGVyczoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGlmICdjYWNoZS1jb250cm9sJyBpbiBoZWFkZXJzIGFuZCBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gIT0gJ3B1YmxpYyc6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBpZiByZXNwLnN0YXR1cyBub3QgaW4gc2VsZi5jYWNoZWFibGVfYnlfZGVmYXVsdF9zdGF0dXNlczoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGlmICdkYXRlJyBub3QgaW4gaGVhZGVycyBvciAnbGFzdC1tb2RpZmllZCcgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBkYXRlID0gY2FsZW5kYXIudGltZWdtKHBhcnNlZGF0ZV90eihoZWFkZXJzWydkYXRlJ10pKQogICAgICAgIGxhc3RfbW9kaWZpZWQgPSBwYXJzZWRhdGUoaGVhZGVyc1snbGFzdC1tb2RpZmllZCddKQogICAgICAgIGlmIGRhdGUgaXMgTm9uZSBvciBsYXN0X21vZGlmaWVkIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIGN1cnJlbnRfYWdlID0gbWF4KDAsIG5vdyAtIGRhdGUpCiAgICAgICAgZGVsdGEgPSBkYXRlIC0gY2FsZW5kYXIudGltZWdtKGxhc3RfbW9kaWZpZWQpCiAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gbWF4KDAsIG1pbihkZWx0YSAvIDEwLCAyNCAqIDM2MDApKQogICAgICAgIGlmIGZyZXNobmVzc19saWZldGltZSA8PSBjdXJyZW50X2FnZToKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGV4cGlyZXMgPSBkYXRlICsgZnJlc2huZXNzX2xpZmV0aW1lCiAgICAgICAgcmV0dXJuIHsnZXhwaXJlcyc6IHRpbWUuc3RyZnRpbWUoVElNRV9GTVQsIHRpbWUuZ210aW1lKGV4cGlyZXMpKX0KCiAgICBkZWYgd2FybmluZyhzZWxmLCByZXNwKToKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhABJhgLiIGQAAiBkAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weWltcG9ydCBiYXNlNjQKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCB6bGliCgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmNvbXBhdCBpbXBvcnQgSFRUUFJlc3BvbnNlLCBwaWNrbGUsIHRleHRfdHlwZQoKCmRlZiBfYjY0X2VuY29kZV9ieXRlcyhiKToKICAgIHJldHVybiBiYXNlNjQuYjY0ZW5jb2RlKGIpLmRlY29kZSgiYXNjaWkiKQoKCmRlZiBfYjY0X2VuY29kZV9zdHIocyk6CiAgICByZXR1cm4gX2I2NF9lbmNvZGVfYnl0ZXMocy5lbmNvZGUoInV0ZjgiKSkKCgpkZWYgX2I2NF9lbmNvZGUocyk6CiAgICBpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIF9iNjRfZW5jb2RlX3N0cihzKQogICAgcmV0dXJuIF9iNjRfZW5jb2RlX2J5dGVzKHMpCgoKZGVmIF9iNjRfZGVjb2RlX2J5dGVzKGIpOgogICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoYi5lbmNvZGUoImFzY2lpIikpCgoKZGVmIF9iNjRfZGVjb2RlX3N0cihzKToKICAgIHJldHVybiBfYjY0X2RlY29kZV9ieXRlcyhzKS5kZWNvZGUoInV0ZjgiKQoKCmNsYXNzIFNlcmlhbGl6ZXIob2JqZWN0KToKCiAgICBkZWYgZHVtcHMoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Tm9uZSk6CiAgICAgICAgcmVzcG9uc2VfaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcG9uc2UuaGVhZGVycykKCiAgICAgICAgaWYgYm9keSBpcyBOb25lOgogICAgICAgICAgICBib2R5ID0gcmVzcG9uc2UucmVhZChkZWNvZGVfY29udGVudD1GYWxzZSkKCiAgICAgICAgICAgICMgTk9URTogOTklIHN1cmUgdGhpcyBpcyBkZWFkIGNvZGUuIEknbSBvbmx5IGxlYXZpbmcgaXQKICAgICAgICAgICAgIyAgICAgICBoZXJlIGIvYyBJIGRvbid0IGhhdmUgYSB0ZXN0IHlldCB0byBwcm92ZQogICAgICAgICAgICAjICAgICAgIGl0LiBCYXNpY2FsbHksIGJlZm9yZSB1c2luZwogICAgICAgICAgICAjICAgICAgIGBjYWNoZWNvbnRyb2wuZmlsZXdyYXBwZXIuQ2FsbGJhY2tGaWxlV3JhcHBlcmAsCiAgICAgICAgICAgICMgICAgICAgdGhpcyBtYWRlIGFuIGVmZm9ydCB0byByZXNldCB0aGUgZmlsZSBoYW5kbGUuIFRoZQogICAgICAgICAgICAjICAgICAgIGBDYWxsYmFja0ZpbGVXcmFwcGVyYCBzaG9ydCBjaXJjdWl0cyB0aGlzIGNvZGUgYnkKICAgICAgICAgICAgIyAgICAgICBzZXR0aW5nIHRoZSBib2R5IGFzIHRoZSBjb250ZW50IGlzIGNvbnN1bWVkLCB0aGUKICAgICAgICAgICAgIyAgICAgICByZXN1bHQgYmVpbmcgYSBgYm9keWAgYXJndW1lbnQgaXMgKmFsd2F5cyogcGFzc2VkCiAgICAgICAgICAgICMgICAgICAgaW50byBjYWNoZV9yZXNwb25zZSwgYW5kIGluIHR1cm4sCiAgICAgICAgICAgICMgICAgICAgYFNlcmlhbGl6ZXIuZHVtcGAuCiAgICAgICAgICAgIHJlc3BvbnNlLl9mcCA9IGlvLkJ5dGVzSU8oYm9keSkKCiAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgInJlc3BvbnNlIjogewogICAgICAgICAgICAgICAgImJvZHkiOiBfYjY0X2VuY29kZV9ieXRlcyhib2R5KSwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjogZGljdCgKICAgICAgICAgICAgICAgICAgICAoX2I2NF9lbmNvZGUoayksIF9iNjRfZW5jb2RlKHYpKQogICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHJlc3BvbnNlLmhlYWRlcnMuaXRlbXMoKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHJlc3BvbnNlLnZlcnNpb24sCiAgICAgICAgICAgICAgICAicmVhc29uIjogX2I2NF9lbmNvZGVfc3RyKHJlc3BvbnNlLnJlYXNvbiksCiAgICAgICAgICAgICAgICAic3RyaWN0IjogcmVzcG9uc2Uuc3RyaWN0LAogICAgICAgICAgICAgICAgImRlY29kZV9jb250ZW50IjogcmVzcG9uc2UuZGVjb2RlX2NvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfQoKICAgICAgICAjIENvbnN0cnVjdCBvdXIgdmFyeSBoZWFkZXJzCiAgICAgICAgZGF0YVsidmFyeSJdID0ge30KICAgICAgICBpZiAidmFyeSIgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgdmFyaWVkX2hlYWRlcnMgPSByZXNwb25zZV9oZWFkZXJzWyd2YXJ5J10uc3BsaXQoJywnKQogICAgICAgICAgICBmb3IgaGVhZGVyIGluIHZhcmllZF9oZWFkZXJzOgogICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyLnN0cmlwKCkKICAgICAgICAgICAgICAgIGRhdGFbInZhcnkiXVtoZWFkZXJdID0gcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIsIE5vbmUpCgogICAgICAgICMgRW5jb2RlIG91ciBWYXJ5IGhlYWRlcnMgdG8gZW5zdXJlIHRoZXkgY2FuIGJlIHNlcmlhbGl6ZWQgYXMgSlNPTgogICAgICAgIGRhdGFbInZhcnkiXSA9IGRpY3QoCiAgICAgICAgICAgIChfYjY0X2VuY29kZShrKSwgX2I2NF9lbmNvZGUodikgaWYgdiBpcyBub3QgTm9uZSBlbHNlIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGRhdGFbInZhcnkiXS5pdGVtcygpCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gYiIsIi5qb2luKFsKICAgICAgICAgICAgYiJjYz0yIiwKICAgICAgICAgICAgemxpYi5jb21wcmVzcygKICAgICAgICAgICAgICAgIGpzb24uZHVtcHMoCiAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICAgICAgICAgICkuZW5jb2RlKCJ1dGY4IiksCiAgICAgICAgICAgICksCiAgICAgICAgXSkKCiAgICBkZWYgbG9hZHMoc2VsZiwgcmVxdWVzdCwgZGF0YSk6CiAgICAgICAgIyBTaG9ydCBjaXJjdWl0IGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gZW1wdHkgc2V0IG9mIGRhdGEKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgRGV0ZXJtaW5lIHdoYXQgdmVyc2lvbiBvZiB0aGUgc2VyaWFsaXplciB0aGUgZGF0YSB3YXMgc2VyaWFsaXplZAogICAgICAgICMgd2l0aAogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyLCBkYXRhID0gZGF0YS5zcGxpdChiIiwiLCAxKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXIgPSBiImNjPTAiCgogICAgICAgICMgTWFrZSBzdXJlIHRoYXQgb3VyICJ2ZXIiIGlzIGFjdHVhbGx5IGEgdmVyc2lvbiBhbmQgaXNuJ3QgYSBmYWxzZQogICAgICAgICMgcG9zaXRpdmUgZnJvbSBhICwgYmVpbmcgaW4gdGhlIGRhdGEgc3RyZWFtLgogICAgICAgIGlmIHZlcls6M10gIT0gYiJjYz0iOgogICAgICAgICAgICBkYXRhID0gdmVyICsgZGF0YQogICAgICAgICAgICB2ZXIgPSBiImNjPTAiCgogICAgICAgICMgR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgdGhlIGNjPU4KICAgICAgICB2ZXIgPSB2ZXIuc3BsaXQoYiI9IiwgMSlbLTFdLmRlY29kZSgiYXNjaWkiKQoKICAgICAgICAjIERpc3BhdGNoIHRvIHRoZSBhY3R1YWwgbG9hZCBtZXRob2QgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2xvYWRzX3Z7MH0iLmZvcm1hdCh2ZXIpKShyZXF1ZXN0LCBkYXRhKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBUaGlzIGlzIGEgdmVyc2lvbiB3ZSBkb24ndCBoYXZlIGEgbG9hZHMgZnVuY3Rpb24gZm9yLCBzbyB3ZSdsbAogICAgICAgICAgICAjIGp1c3QgdHJlYXQgaXQgYXMgYSBtaXNzIGFuZCByZXR1cm4gTm9uZQogICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcHJlcGFyZV9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCBjYWNoZWQpOgogICAgICAgICIiIlZlcmlmeSBvdXIgdmFyeSBoZWFkZXJzIG1hdGNoIGFuZCBjb25zdHJ1Y3QgYSByZWFsIHVybGxpYjMKICAgICAgICBIVFRQUmVzcG9uc2Ugb2JqZWN0LgogICAgICAgICIiIgogICAgICAgICMgU3BlY2lhbCBjYXNlIHRoZSAnKicgVmFyeSB2YWx1ZSBhcyBpdCBtZWFucyB3ZSBjYW5ub3QgYWN0dWFsbHkKICAgICAgICAjIGRldGVybWluZSBpZiB0aGUgY2FjaGVkIHJlc3BvbnNlIGlzIHN1aXRhYmxlIGZvciB0aGlzIHJlcXVlc3QuCiAgICAgICAgaWYgIioiIGluIGNhY2hlZC5nZXQoInZhcnkiLCB7fSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBWYXJ5IGhlYWRlcnMgZm9yIHRoZSBjYWNoZWQgcmVzcG9uc2UgbWF0Y2ggb3VyCiAgICAgICAgIyByZXF1ZXN0CiAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gY2FjaGVkLmdldCgidmFyeSIsIHt9KS5pdGVtcygpOgogICAgICAgICAgICBpZiByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlciwgTm9uZSkgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYm9keV9yYXcgPSBjYWNoZWRbInJlc3BvbnNlIl0ucG9wKCJib2R5IikKCiAgICAgICAgaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoZGF0YT1jYWNoZWRbJ3Jlc3BvbnNlJ11bJ2hlYWRlcnMnXSkKICAgICAgICBpZiBoZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnLCAnJykgPT0gJ2NodW5rZWQnOgogICAgICAgICAgICBoZWFkZXJzLnBvcCgndHJhbnNmZXItZW5jb2RpbmcnKQoKICAgICAgICBjYWNoZWRbJ3Jlc3BvbnNlJ11bJ2hlYWRlcnMnXSA9IGhlYWRlcnMKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBib2R5ID0gaW8uQnl0ZXNJTyhib2R5X3JhdykKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpZiBjYWNoZWNvbnRyb2wgc2VyaWFsaXplZCB0byB2MSBmb3JtYXQgKHBpY2tsZSkKICAgICAgICAgICAgIyB1c2luZyBQeXRob24gMi4gQSBQeXRob24gMiBzdHIoYnl0ZSBzdHJpbmcpIHdpbGwgYmUgdW5waWNrbGVkIGFzCiAgICAgICAgICAgICMgYSBQeXRob24gMyBzdHIgKHVuaWNvZGUgc3RyaW5nKSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYWJvdmUgdG8KICAgICAgICAgICAgIyBmYWlsIHdpdGg6CiAgICAgICAgICAgICMKICAgICAgICAgICAgIyAgICAgVHlwZUVycm9yOiAnc3RyJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlCiAgICAgICAgICAgIGJvZHkgPSBpby5CeXRlc0lPKGJvZHlfcmF3LmVuY29kZSgndXRmOCcpKQoKICAgICAgICByZXR1cm4gSFRUUFJlc3BvbnNlKAogICAgICAgICAgICBib2R5PWJvZHksCiAgICAgICAgICAgIHByZWxvYWRfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgKipjYWNoZWRbInJlc3BvbnNlIl0KICAgICAgICApCgogICAgZGVmIF9sb2Fkc192MChzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICAjIFRoZSBvcmlnaW5hbCBsZWdhY3kgY2FjaGUgZGF0YS4gVGhpcyBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoCiAgICAgICAgIyBpbmZvcm1hdGlvbiB0byBjb25zdHJ1Y3QgZXZlcnl0aGluZyB3ZSBuZWVkLCBzbyB3ZSdsbCB0cmVhdCB0aGlzIGFzCiAgICAgICAgIyBhIG1pc3MuCiAgICAgICAgcmV0dXJuCgogICAgZGVmIF9sb2Fkc192MShzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZCA9IHBpY2tsZS5sb2FkcyhkYXRhKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmV0dXJuIHNlbGYucHJlcGFyZV9yZXNwb25zZShyZXF1ZXN0LCBjYWNoZWQpCgogICAgZGVmIF9sb2Fkc192MihzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZCA9IGpzb24ubG9hZHMoemxpYi5kZWNvbXByZXNzKGRhdGEpLmRlY29kZSgidXRmOCIpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXZSBuZWVkIHRvIGRlY29kZSB0aGUgaXRlbXMgdGhhdCB3ZSd2ZSBiYXNlNjQgZW5jb2RlZAogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiYm9keSJdID0gX2I2NF9kZWNvZGVfYnl0ZXMoCiAgICAgICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiYm9keSJdCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiaGVhZGVycyJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZGVjb2RlX3N0cihrKSwgX2I2NF9kZWNvZGVfc3RyKHYpKQogICAgICAgICAgICBmb3IgaywgdiBpbiBjYWNoZWRbInJlc3BvbnNlIl1bImhlYWRlcnMiXS5pdGVtcygpCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsicmVhc29uIl0gPSBfYjY0X2RlY29kZV9zdHIoCiAgICAgICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsicmVhc29uIl0sCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsidmFyeSJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZGVjb2RlX3N0cihrKSwgX2I2NF9kZWNvZGVfc3RyKHYpIGlmIHYgaXMgbm90IE5vbmUgZWxzZSB2KQogICAgICAgICAgICBmb3IgaywgdiBpbiBjYWNoZWRbInZhcnkiXS5pdGVtcygpCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gc2VsZi5wcmVwYXJlX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZCkKUEsDBBQAAAAAAAAAIQCLe8VC8gEAAPIBAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5ZnJvbSAuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCgoKZGVmIENhY2hlQ29udHJvbChzZXNzLAogICAgICAgICAgICAgICAgIGNhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgY2FjaGVfZXRhZ3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyPU5vbmUsCiAgICAgICAgICAgICAgICAgaGV1cmlzdGljPU5vbmUpOgoKICAgIGNhY2hlID0gY2FjaGUgb3IgRGljdENhY2hlKCkKICAgIGFkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgIGNhY2hlLAogICAgICAgIGNhY2hlX2V0YWdzPWNhY2hlX2V0YWdzLAogICAgICAgIHNlcmlhbGl6ZXI9c2VyaWFsaXplciwKICAgICAgICBoZXVyaXN0aWM9aGV1cmlzdGljLAogICAgKQogICAgc2Vzcy5tb3VudCgnaHR0cDovLycsIGFkYXB0ZXIpCiAgICBzZXNzLm1vdW50KCdodHRwczovLycsIGFkYXB0ZXIpCgogICAgcmV0dXJuIHNlc3MKUEsDBBQAAAAAAAAAIQAUcAVHPwAAAD8AAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19pbml0X18ucHlmcm9tIC5jb3JlIGltcG9ydCB3aGVyZSwgb2xkX3doZXJlCgpfX3ZlcnNpb25fXyA9ICIyMDE4LjAxLjE4IgpQSwMEFAAAAAAAAAAhAIMr2sEpAAAAKQAAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX21haW5fXy5weWZyb20gY2VydGlmaSBpbXBvcnQgd2hlcmUKcHJpbnQod2hlcmUoKSkKUEsDBBQAAAAAAAAAIQAFodr18CIEAPAiBAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbQojIElzc3VlcjogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzA3NjY5MDA1MjA0CiMgTUQ1IEZpbmdlcnByaW50OiAzZTo0NTo1MjoxNTowOTo1MTo5MjplMTpiNzo1ZDozNzo5ZjpiMTo4NzoyOTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOmJjOjk2OjhiOmQ0OmY0OjlkOjYyOjJhOmE4OjlhOjgxOmYyOjE1OjAxOjUyOmE0OjFkOjgyOjljCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpkNDoxMDo0MDplNDpiYjozZTpjNzo0MjpjOTplMzo4MTpkMzoxZTpmMjphNDoxYTo0ODpiNjo2ODo1Yzo5NjplNzpjZTpmMzpjMTpkZjo2YzpkNDozMzoxYzo5OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrRwpBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CmIzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXcKTURCYUZ3MHlPREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQpZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYUR1YVoKamM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAp4eTBTeTZzY1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUzhwRjk0RzNWTlRDT1hrTno4a0hwCjFXcmpzb2s2VmprNGJ3WThpR2xiS2szRnAxUzRiSW5NbS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEcKc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgpVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWGd6VC9MQ3JCYkJsRFNnZUY1OU44CjlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096CnlqMWhUZE5HQ2JNK3c2RGpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UKMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95R2ovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUApBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhIaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkCkRLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUNYNFhTUVJqYmdiTUUKSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMiIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4ODU2NTgxMjUKIyBNRDUgRmluZ2VycHJpbnQ6IDk0OjE0Ojc3OjdlOjNlOjVlOmZkOjhmOjMwOmJkOjQxOmIwOmNmOmU3OmQwOjMwCiMgU0hBMSBGaW5nZXJwcmludDogNzU6ZTA6YWI6YjY6MTM6ODU6MTI6Mjc6MWM6MDQ6Zjg6NWY6ZGQ6ZGU6Mzg6ZTQ6Yjc6MjQ6MmU6ZmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNhOjQyOmRkOjQxOjc0OjVmOmQwOmI4OjFlOmI5OjAyOjM2OjJjOmY5OmQ4OmJmOjcxOjlkOmExOmJkOjFiOjFlOmZjOjk0OjZmOjViOjRjOjk5OmY0OjJjOjFiOjllCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJTEJBQUFBQUFCRDRZbTVnMHdEUVlKS29aSWh2Y05BUUVGQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqSXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURZeE1qRTFNRGd3TURBd1doY05NakV4TWpFMQpNRGd3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU01qRVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLYlBKQTYrTG04b21VVkN4S3MrSVZTYkM5Ti9oSEQ2RXJQTAp2NGRmeG4rRzA3SXdYTmI5cmZGNzNPWDRZSllKa2hEMTBGUGUrM3QrYzRpc1VvaDdTcWJLU2FaZXFLZU1XaEc4CmVvTHJ2b3pwczZ5V0pRZVhTcGtxQnkrMEhuZS9pZysxQW53YmxyakZ1VG9zdk5ZU3VldFpmZUxRQm9aZlhrbHEKdFRsZWlEVHN2SGdNQ0ppRWJLak5TN1NnZlF4NVRmQzRMY3NoeXRWc1czM2hvQ21Fb2ZuVGxFbkxKR0tSSUx6ZApDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTFRmdXdOaHYyR1hxRjRHM3lZUk9JWEovZ2t3cFJsNHBhCnpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDeWdQQ200OENBd0VBQWFPQm5EQ0IKbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbStJSApWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuCmJHOWlZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0cKM2xtMG1pM2YzQm1HTGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHcwpKMC9Xd2JnY1EzaXpESnI4Nml3OGJtRWJUVXNwOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPCjI5MXhOQnJCVk5wR1ArRFRLcXR0VkNMMU9tTE5JRys2S1luWDNaSHUwMXlpUHFGYlFmWGY1V1JETGVuVk9hdlMKb3QrM2k5REFnQmtjUmNBdGpPajRMYVIwVmtuRkJiVlBGZDV1UkhnNWg2aCt1L041R0pHNzlHK2R3ZkNNTll4ZApBZnZEYmJudlJHMTVSakYrQ3Y2cGdzSC83NnR1SU1SUXlWK2RUWnNYakF6bEFjbWdRV3B6VS9xbFVMUnVKUS83ClRCajAvVkxaam1teDZCRVAzb2pZK3gxSjk2cmVsYzhnZU1KZ0V0c2xRSXhxL0g1Q09FQmtFdmVlZ2VHVExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjA2Njg0Njk2Mjc5NDcyMzEwMjU0Mjc3ODcwMTgwOTY2NzIzNDE1CiMgTUQ1IEZpbmdlcnByaW50OiBjZDo2ODpiNjphNzpjNzpjNDpjZTo3NTplMDoxZDo0Zjo1Nzo0NDo2MTo5MjowOQojIFNIQTEgRmluZ2VycHJpbnQ6IDEzOjJkOjBkOjQ1OjUzOjRiOjY5Ojk3OmNkOmIyOmQ1OmMzOjM5OmUyOjU1Ojc2OjYwOjliOjVjOmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjowNDpjZjo1ZTpiMTpmMzo5YTpmYTo3NjoyZjoyYjpiMToyMDpmMjo5NjpjYjphNToyMDpjMTpiOTo3ZDpiMTo1ODo5NTo2NTpiODoxYzpiOTphMTo3Yjo3Mjo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUdqQ0NBd0lDRVFDYmZnWkpvejVpdWRYdWtFaHhLZTlYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCmNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAphV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAphV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKSUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxRVVHTytpMnQKS21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdQpreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCkNDK1ZrNytxUnkrb1JwZndFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkoKWHd6dzNzSjJ6cS8zYXZMNlFhYWlNeFRKNVhwajA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdQppbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCjJ5RlBocGswZGpaWDNkQVZMOFd0ZnhVZk4ySnpQdFRuWDg0WEE5czEraXZicm1BSlh4NWZqMjY3Q3ozcVdoTWUKREdCdnRjQzFJeUl1Qnd2THFYVExSN3Nkd2RlbGE4d3Ywa0w5U2QybmljOVR1dG9BV2lpL2d0LzR1aE1kVUlhQwovWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCkY0RXJXamZKWGlyMHh1S2hYRlNicGxRQXovRHh3Y2VZTUJvN05oYmJvMjdxL2EyeXd0cnZBa2NUaXNEeHN6R3QKVHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhdDIwWGo1MGVnV1RoL3NWRnVxMXJ1UXA2VGs5TGhPNUw4WDNkRVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgU3ViamVjdDogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgTGFiZWw6ICJFbnRydXN0Lm5ldCBQcmVtaXVtIDIwNDggU2VjdXJlIFNlcnZlciBDQSIKIyBTZXJpYWw6IDk0NjA2OTI0MAojIE1ENSBGaW5nZXJwcmludDogZWU6Mjk6MzE6YmM6MzI6N2U6OWE6ZTY6ZTg6YjU6Zjc6NTE6YjQ6MzQ6NzE6OTAKIyBTSEExIEZpbmdlcnByaW50OiA1MDozMDowNjowOToxZDo5NzpkNDpmNTphZTozOTpmNzpjYjplNzo5Mjo3ZDo3ZDo2NToyZDozNDozMQojIFNIQTI1NiBGaW5nZXJwcmludDogNmQ6YzQ6NzE6NzI6ZTA6MWM6YmM6YjA6YmY6NjI6NTg6MGQ6ODk6NWY6ZTI6Yjg6YWM6OWE6ZDQ6Zjg6NzM6ODA6MWU6MGM6MTA6Yjk6Yzg6Mzc6ZDI6MWU6YjE6NzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lFT0dQZStEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKUlc1MGNuVnpkQzV1WlhReFFEQStCZ05WQkFzVU4zZDNkeTVsYm5SeWRYTjBMbTVsZEM5RFVGTmZNakEwT0NCcApibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHBiV2wwY3lCc2FXRmlMaWt4SlRBakJnTlZCQXNUSENoaktTQXhPVGs1CklFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4TnpVd05URmFGdzB5T1RBMwpNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTNkM2QzCkxtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKWVdJdUtURWxNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFRwpBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKSzB2UnZ3dEtUWTd0Z0hhbFo3ZDRRTUJ6UXNob3dOdFRLOTFldUhhWU5aT0xHcDE4RXpvT0gxdTNIcy9sSkJRZQpzWUdwalgyNHpHdExBL0VDRE55cnBVQWtBSDkwbEtHZENDbXppQXYxaDNlZFZjM2t3MzdYYW1TcmhSU0dsVnVYCk1sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKWFR6V25MTFBLUVA1TDZSUXN0Ukl6Z1V5VllyOXNtUk1EdVNZQjNYYmY5KzVDRlZnaFRBcCtYdElwR21HNHpVLwpIb1pkZW5vVnZlOEFqaFVpVkJjQWtDYVR2QTVKYUpHLytFZlRuWlZDd1E1TjMyOG16OE1ZSVdKbVEzRFcxY0FICjRRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlYKSFE0RUZnUVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUR1YgpqMWFiTU9kVG1YeDZlYWRObDljWmxaRDdCaC9LTTN4R1k0K1daaVQ2UUJzaEo4cm1jblB5VC80eG1mM0lERXhvClU4YUFnaE9ZK3JhdDJsMDk4YzV1OWhVUmxJSU03aitWcnhHckQ5Y3YzaDhEajFjc0hzbTdtaHBFbGVzWVQ2WWYKelgxWEVDK2JCQWxhaExWdTJCMDY0ZGFlMFd4NVhua2NGTVhqMEV5VE8yVTg3ZDg5dnFibGxSckR0Um5EdlY1Ygp1LzhqNzJnWnl4S1RKMXdETFc4dzBCNjJHcXplV3ZmUnFxZ25wdjU1Z2NSNW1UTlh1aEt3cWVCQ2JKUEtWdDcrCmJZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZW5ORk1GWTNoN0NJM3pKcERDNWZjZ0pDTnMyZWJiMGdJRlZiUHYvRXIKZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIFN1YmplY3Q6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIExhYmVsOiAiQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCIKIyBTZXJpYWw6IDMzNTU0NjE3CiMgTUQ1IEZpbmdlcnByaW50OiBhYzpiNjo5NDphNTo5YzoxNzplMDpkNzo5MTo1Mjo5YjpiMTo5NzowNjphNjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ0OmRlOjIwOmQwOjVlOjY2OmZjOjUzOmZlOjFhOjUwOjg4OjJjOjc4OmRiOjI4OjUyOmNhOmU0Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNjphZjo1NzphOTpmNjo3NjpiMDphYjoxMjo2MDo5NTphYTo1ZTpiYTpkZTpmMjoyYTpiMzoxMToxOTpkNjo0NDphYzo5NTpjZDo0Yjo5MzpkYjpmMzpmMjo2YTplYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUVBZ0FBdVRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWURWUVFHRXdKSgpSVEVTTUJBR0ExVUVDaE1KUW1Gc2RHbHRiM0psTVJNd0VRWURWUVFMRXdwRGVXSmxjbFJ5ZFhOME1TSXdJQVlEClZRUURFeGxDWVd4MGFXMXZjbVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBNQjRYRFRBd01EVXhNakU0TkRZd01Gb1gKRFRJMU1EVXhNakl6TlRrd01Gb3dXakVMTUFrR0ExVUVCaE1DU1VVeEVqQVFCZ05WQkFvVENVSmhiSFJwYlc5eQpaVEVUTUJFR0ExVUVDeE1LUTNsaVpYSlVjblZ6ZERFaU1DQUdBMVVFQXhNWlFtRnNkR2x0YjNKbElFTjVZbVZ5ClZISjFjM1FnVW05dmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtNRXV5S3IKbUQxWDZDWnltclY1MUNuaTRlaVZnTEd3NDF1T0t5bWFaTitoWGUyd0NRVnQyeWd1em1LaVl2NjBpTm9TNnpqcgpJWjNBUVNzQlVudUlkOU1jajhlNnVZaTFhZ25uYytnUlFLZlJ6TXBpalMzbGp3dW1VTktvVU1NbzZ2V3JKWWVLCm1wWWNxV2U0UHd6VjkvbFNFeS9DRzlWd2NQQ1B3QkxLQnN1YTRkbktNM3AzMXZqc3VmRm9SRUpJRTlMQXdxU3UKWG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDlYYklHZXZPRjZ1dlVBNjVlaEQ1Zi94WHRhYno1T1RaeQpkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcmwzUmpNNzFvR0RId2VJMTJ2L3llCmpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JVkRhR2V6cTEKQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyCjloa1RJN2dRQ3ZsWXBOUmhjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3gKamt6U3N3RjA3cjUxWGdkSUduOXcveFpjaE1CNWhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMApFcG4zbzBXQzR6eGU5WjJldGNpZWZDN0lwSjVPQ0JSTGJmMXdiV3NhWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6CmtzTGk0eGFObWpJQ3E0NFkzZWtRRWU1K05hdVFyejR3bEhyUU16Mm5aUS8xL0k2ZVlzOUhSQ3dCWGJzZHRUTFMKUjlJNEx0RCtnZHd5YWg2MTdqelYvT2VCSFJuREpFTHFZem1wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBMYWJlbDogIkFkZFRydXN0IEV4dGVybmFsIFJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxZDozNTo1NDowNDo4NTo3ODpiMDozZjo0Mjo0Mjo0ZDpiZjoyMDo3MzowYTozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDAyOmZhOmYzOmUyOjkxOjQzOjU0OjY4OjYwOjc4OjU3OjY5OjRkOmY1OmU0OjViOjY4Ojg1OjE4OjY4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ODo3ZjphNDo1MTozODoyMjo3ODpmZjpmMDpjODpiMToxZjo4ZDo0MzpkNTo3Njo2NzoxYzo2ZTpiMjpiYzplYTpiNDoxMzpmYjo4MzpkOTo2NTpkMDo2ZDoyZjpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU5qQ0NBeDZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnZNUXN3Q1FZRFZRUUdFd0pUUlRFVQpNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SmpBa0JnTlZCQXNUSFVGa1pGUnlkWE4wSUVWNGRHVnlibUZzCklGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGZUhSbGNtNWhiQ0JEUVNCU2IyOTAKTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3TkRnek9Gb3diekVMTUFrR0ExVUVCaE1DVTBVeApGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlVjblZ6ZENCRmVIUmxjbTVoCmJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZ1VtOXYKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dApIN3hzRDgyMStpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5CnVNcS9Oemd0SGo2UlFhMXdWc2Z3VHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelgKbWs2dkJiT21jWlNjY2JOUVlBckhFNTA0QjRZQ3FPbW9hU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWAphMFRreDYzdWJVRmZjbHB4Q0RlemVXV2tXYUNVTi9jQUx3M0NrbkxhMERoeTJ4U29SY1JkS24yM3ROYkU3cXpOCkUwUzN5U3ZkUXdBbCttRzVhV3BZSXhHM3B6T1BWblZaOWMwcDEwYTNDaXRsdHROQ2J4V3l1SHY3NytsZFU5VTAKV2ljQ0F3RUFBYU9CM0RDQjJUQWRCZ05WSFE0RUZnUVVyYjJZZWpTMEp2ZjZ4Q1pVN3dPOTRDVExWQm93Q3dZRApWUjBQQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnWmtHQTFVZEl3U0JrVENCam9BVXJiMlllalMwCkp2ZjZ4Q1pVN3dPOTRDVExWQnFoYzZSeE1HOHhDekFKQmdOVkJBWVRBbE5GTVJRd0VnWURWUVFLRXd0QlpHUlUKY25WemRDQkJRakVtTUNRR0ExVUVDeE1kUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnVkZSUUlFNWxkSGR2Y21zeApJakFnQmdOVkJBTVRHVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnNJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOCkFRRUZCUUFEZ2dFQkFMQ2I0SVVsd3RZajRnK1dCcEtkUVppYzJZUjVnZGtlV3hRSEl6WmxqN0RZZDd1c1FXeEgKWUlOUnNQa3lQZWY4OWlZVHg0QVdwYjlhL0lmUGVIbUpJWnJpVEFjS2hqVzg4dDVSeE5LV3Q5eCtUdTV3L1J3NQo2d3dDVVJRdGpyMFc0TUhmUm5YbkpLM3M5RUswaFpOd0VHZTZuUVkxU2hqVEszck1VVUtoZW1QUjVydWh4U3ZDCk5yNFREZWE5WTM1NWU2Y0pEVUNyYXQyUGlzUDI5b3dhUWdWUjFFWDFuNmRpSVdnVklFTThtZWQ4dlNUWXFaRVgKYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1RytHTW1JUExIekh4UkV6R0JITkpkbUFQeC9pOUY0QnJMdW5NVEE1YQptbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY0NjYwODIwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjphNTpjMzplZDo1ZDpkZDozZTowMDpjMTozZDo4Nzo5MjoxZjoxZDozZjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGIzOjFlOmIxOmI3OjQwOmUzOjZjOjg0OjAyOmRhOmRjOjM3OmQ0OjRkOmY1OmQ0OjY3OjQ5OjUyOmY5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MzpjMTo3Njo0Mzo0ZjoxYjpjNjpkNTphZDpmNDo1YjowZTo3NjplNzoyNzoyODo3Yzo4ZDplNTo3NjoxNjpjMTplNjplNjoxNDoxYToyYjoyYzpiYzo3ZDo4ZTo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wCkxtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKd2IzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVcKS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTBNbG9YRFRJMk1URXlOekl3Ck5UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1Ua3cKTndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeQpaV1psY21WdVkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WCkJBTVRKRVZ1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGbwpOdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzekE5dTNnM3MrSUlSZTdiSldLS2Y0CjRMbEFjVGZGeTBjT2x5cG93Q0tWWWhYYlI5bjEwQ3YvZ2t2SnJUN2VUTnVRZ0ZBL0NZcUVBT3d3Q2owWXpmdjkKS2xtYUk1VVhMRVdlSDI1RGVXME1YSmorU0tmRkkwZGNYdjF1NXg2MDltaEYwWWFEVzZLS2piSGpLWUQrSlhHSQpyYjY4ajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpCjk0RGtaZnMwTnc0cGdIQk5yemlHTHA1L1Y2K2VGNjdySE1zb0lWKzJITmpub2dRaStkUGEyTXNDQXdFQUFhT0IKc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBckJnTlZIUkFFSkRBaQpnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJvCmtPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REhobWFrOGZkTFEvdUUKdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0Ck8xS3pLdHZuMUlTTVkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWEKQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUAo5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFNXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvCmV1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMHRIdXUyZ3VRT0hYdmdSMW0KMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IEdsb2JhbCBDQSIKIyBTZXJpYWw6IDE0NDQ3MAojIE1ENSBGaW5nZXJwcmludDogZjc6NzU6YWI6Mjk6ZmI6NTE6NGU6Yjc6Nzc6NWU6ZmY6MDU6M2M6OTk6OGU6ZjUKIyBTSEExIEZpbmdlcnByaW50OiBkZToyODpmNDphNDpmZjplNTpiOToyZjphMzpjNTowMzpkMTphMzo0OTphNzpmOTo5NjoyYTo4MjoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogZmY6ODU6NmE6MmQ6MjU6MWQ6Y2Q6ODg6ZDM6NjY6NTY6ZjQ6NTA6MTI6Njc6OTg6Y2Y6YWI6YWE6ZGU6NDA6Nzk6OWM6NzI6MmQ6ZTQ6ZDI6YjU6ZGI6MzY6YTc6M2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWRENDQWp5Z0F3SUJBZ0lEQWpSV01BMEdDU3FHU0liM0RRRUJCUVVBTUVJeEN6QUpCZ05WQkFZVEFsVlQKTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNUnN3R1FZRFZRUURFeEpIWlc5VWNuVnpkQ0JIYkc5aQpZV3dnUTBFd0hoY05NREl3TlRJeE1EUXdNREF3V2hjTk1qSXdOVEl4TURRd01EQXdXakJDTVFzd0NRWURWUVFHCkV3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWJNQmtHQTFVRUF4TVNSMlZ2VkhKMWMzUWcKUjJ4dlltRnNJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyc3dZWXpEOQo5QmNqR2xaK1c5ODhiRGprY2JkNGtkUzhvZGhNK0toRHRnUHBUU0VIQ0lqYVdDOW1PU205QlhpTG5Uam9CYmRxCmZuR2s1c1JncHJEdmdPU0pLQStlSmRidGcvT3RwcEhIbU1sQ0dEVVVuYTJZUnBJdVQ4cnhoMFBCRnBWWExWRHYKaVMyQWVsZXQ4dTVmYTlJQWpia1UrQlFWTmRuQVJxTjdjc2lSdjhsVks4M1FsejZjSm1UTTM4NkRHWEhLVHViVQoxWHVwR2MxVjNzanMwbDQ0VStWY1Q0d3QvbEFqTnZ4bTVzdU9wRGtaQUxlVkFqbVJDdzcrT0M3UkhRV2E5azArCmJ3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVdlRMckdBTW9VZ1J4NWFzelBlRTR1d2MyaEdLY2Vlb1cKTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQQplcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWa0RCRjlxbjFsCnVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW4KWjU3UXp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmUwp0UVdWWXJtbTNvazlObnM0ZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGClBzZUtVZ3piRmJTOWJadmx4ckZVYUtuamFaQzJtcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW4KaHc0RWJOWC8zYUJkN1lkU3R5c1ZBcTQ1cG1wMDZkckU1N3hOTkI2cFhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVgo1ZkVXQ1JFMTFhemJKSEZ3TEpoV0M5a1h0TkhqVVN0ZWRlalYwTnhQTk8zQ0JXYUFvY3ZtTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjY1OjU4OjhiOmEyOjFhOjMxOjcyOjczOjY4OjVjOmI0OmE1OjdhOjA3OjQ4CiMgU0hBMSBGaW5nZXJwcmludDogZTY6MjE6ZjM6MzU6NDM6Nzk6MDU6OWE6NGI6Njg6MzA6OWQ6OGE6MmY6NzQ6MjI6MTU6ODc6ZWM6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQ1OjliOjlmOjYzOmIyOjI1OjU5OmY1OmZhOjVkOjRjOjZkOmIzOmY5OmY3OjJmOmYxOjkzOjQyOjAzOjM1Ojc4OmYwOjczOmJmOjFkOjFiOjQ2OmNiOmI5OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJNQjRYRFRBME1ETXdOREExTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRQpCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wCklGVnVhWFpsY25OaGJDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWVYKVmFDanh1QWZqSjBoVU5mQnZpdGJ0YVNlb2RseVdMMEFHMHkvWWNrVUhVV0NxOFlkZ05ZOTZ4Q2NPcTl0SlBpOApjUUdlQnZWOFh4N0JEbFhLZzVwWk1LNFp5ekJJbGUwaU40MzBTcHB5Wmo2dGxjRGdGZ0RnRUI4ck1RN1hsRlRUClFqT2dOQjBlUlhiZFQ4b1lOK3lGRlhvWkNQelZ4NXp3OHFrdUVLbVM1ajFZUGFrV2FEd3ZkU0VZZnloM3BlRmgKRjdlbTZmZ2VtZHR6YnZRS29pRnM3dHFxaFpKbXIvWjZhNExhdWlJSU5RL1BRdkUxK21ydWZpc2x6RG9SNUcydgpjN0oySGEzUXNuaG5HcVE1SEZFTFoxYUQvVGhkRGM3ZDhMc3JsaC9lZXpKUy9SMjd0UWFoc2lGZXBkYVZhSC93Cm1aN2NSUWcrNTlJSkRUV1UzWUJPVTVmWHRRbEVJR1FXRndNQ1RGTU5hTjdWcW5KTmsyMkNEdHVjdmMrMDgxeGQKVkhwcENaYlcyeEhCalhXb3RNODV5TTQ4dkNSODVtTEs0YjE5cDcxWFpRdmsvaVh0dG1rUTNDZ2FScjBCSGRDWAp0ZUdZTzhBM1pOWTlsTzRMNGZVb3JndFd2M0dMSXlsQmpvYkZTMUo3MkhHckg0b1ZwanVEV3RkWUFWSEdURUhaCmY5aEJaM0tpS045Z2c2bWV5SHY4VTNOeVdmV1RlaGQyRHM3MzVWelpDMVUwb3FwYnRXcFU1eFBLVit5WGJmUmUKQmk5RmkxalVJeGFTNUJadUtHTlpNTjlRQVp4amlScWYyeGVVZ25BM3d5U2Vta2ZXV3NwT3FHbUpjaCtSYk50KwpuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4bmk0b1Bta21NOFY3QWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQjhHQTFVZEl3UVkKTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlgKSXdqaG1GN0RXZ2gycWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bgpBTlhIL0t0dGdDSndwUXpnWFFRcEF2dkxvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6CnV6WVltNFVQRmQzdUxheDJrN25aQVkxSUVLajc5VGlHOGRzS3hyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU4KUG5iaXVjb244bCtmNzI1WkRRYllLeGVrMG54cnUxOFVHa2lQR2t6bnMwY2Nqa3hGS3lEdVNOL24zUW1PR0tqYQpRSTJTSmhGVFlYTmQ2NzNueEUwcE4ySHJyRGt0Wnk0VzF2VUFnNFdoekg5MnhIM2t0MHRtN3dORllHbTJERktXCmtvUmVwcU8xcEQ0cjJjellHMGVxOGtUYVQva0Q2UEFVeXovemc5N1F3VlRqdCtnS04wMkxJRmtETUJtaExNaTkKRVIvZnJzbEt4Zk1uWm1hR3JHaVIvOW5tVXh3UGkxeHBaUW9teUI0MHcxMVJlOWVwbkFhaE50M1ZpWlM4MmVRdApERjRKYkFpWGZLTTlmSlAvUDZFVXA4KzFYZXZiMnh6RWR0K0l1YjFGQlpVYnJ2eEdha3l2U09QT3JnL1NmdXZtCmJKeFBnV3A2Wkt5N1B0WG55M1l1eGFkSXdWeVFEOHZJUC9ybU11R05HMitrNW83WStTbElpczV6L2l3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDM0OmZjOmI4OmQwOjM2OmRiOjllOjE0OmIzOmMyOmYyOmRiOjhmOmU0Ojk0OmM3CiMgU0hBMSBGaW5nZXJwcmludDogMzc6OWE6MTk6N2I6NDE6ODU6NDU6MzU6MGM6YTY6MDM6Njk6ZjM6M2M6MmU6YWY6NDc6NGY6MjA6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjIzOjRmOjNiOmM4OjUyOjdjOmE1OjYyOjhlOmVjOjgxOmFkOjVkOjY5Ojg5OjVkOmE1OjY4OjBkOmM5OjFkOjFjOmI4OjQ3OjdmOjMzOmY4Ojc4OmI5OjViOjBiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJJREl3SGhjTk1EUXdNekEwTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRApWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxCmMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFDelZGTEJ5VDd5MmR5eFV4cFpLZWV4dzBVbzVkZlI3Y1hGUzZHcWRIdFhyMG9tL05qMVhxZHVHZHQwREU4MQpXeklMQWVQYjYzcDNOZXFxV3VEVzZLRlhsUENRbzNSV2xFUXdBeDVjVGl1RkpuU0NlZ3gyb0c5TnprRXRvQlVHCkZGKzNRczE3ajFoaE5Od3FDUGt1d3dHbUlrUWNUQWVDNWx2TzBFcDhCTk1aY3lmd3FwaC9McTlPNjRjZUpIZHEKWGJib1cwVzYzTU9oQlc5V2pvOFFKcVZKd3k3WFFZY2k0RStHeW1DMTZxRmp3QUdYRUhtOUFEd1NiU3NWc2F4TApzZTRZdVU2VzNOeDIvenUrejE4RHdQdzc2TDVHRy8vYVFNSlM5LzdqT3ZkcWR6WFEybzNyWGhocU1jY2V1andiCktOWnJWTWFxVzllaUxCc1p6S0lDOXB0WnZUZHJoclZ0Z3JyWTZzbFd2S2syV1AwK0dmUHREQ2Fwa3pqNFQ4RmQKSWdiUWwrcmhyY1pWNElFcktJTTYrdlI3SVZFQXZsSTR6czFtZWFqMGdWYmkwSU1KUjFGYlVHclAyMGdhWFQ3Mwp5L1psOTJ6eGxmZ0NPekpXZ2psNlc3MHZpUnUvb2JUby8zK05qTjhEOFdCT1dCRk02Nk0vRUN1RG1nRnoyWlJ0CmhBQW5acXp3Y0VBSlFwS3RUNU1OWVFsUkpOaVMxUXVVWWJLSHN1My9talgvaFZUSzdVUkRyQnM4Rm10SVNnb2MKUUlnZmtzSUxBQVgvOHNnQ1NxU3FxY3labHB3dldPQjk0YjY3Qjl4ZkJISmNNVFREN0Y4dDREMWtrQ0xtMGV5NApMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHOGRoY3lGVlF5V2k5cUxvMkNRSURBUUFCbzJNd1lUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBZkJnTlYKSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFEKTDFFdXhCUmEzdWdaNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJncgpGZzVmTnVIOEtyVXdKTS9nWXd4N1dCcittYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvCmFnL0h0UFFUeE9SYjdRclNwSmRNS3UwdmJCS0pQZkVuY0twcUExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVkKVDFVNlUrUHY4dlNmeDN6WVdLOHBJcGU0NEwyUkxyQjI3RmNSeis4cFJQUHBoWHBnWStSZE00a1gyVEdxMnRiegpHRFZ5ejRjckwyTWpoRjJFakQ5WG9JajhtWkVvSm1tWjFJK1hSTDZPMVVpeHBDZ3A4UlcwNGVXZTNmaVBwbThtCjF3azhPaHdSRHFac04vZXRSSWNzS01mWWRJS3owRzlLVjdzMUtTZWdpK2docDRka05sM00yQmFzeDdJblFKSlYKT0NpTlVXN2RGR2RUYkhGY0pvUk5kVnEyZm1CV3FVMnQrNXNlbC9NTjJkS1hWSGZhUFJLMzRCN3ZDQWFzK1lXSAo2YUxjcjM0WUVvUDlWaGRCTHRVcGduMlo5REgyY2FuUExBRW5wUVc1cXJKSVRpcnZuNU5TVVpVOFVuT09Wa3dYClFNQUpLT1NMYWtoVDIrek5WVlh4eHZqcG9peE1wdEVtWDM2dldremFINmJ5SEN4K3JnSVcwbGJRTDFkVFIraVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgU3ViamVjdDogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBMYWJlbDogIlZpc2EgZUNvbW1lcmNlIFJvb3QiCiMgU2VyaWFsOiAyNTk1MjE4MDc3NjI4NTgzNjA0ODAyNDg5MDI0MTUwNTU2NTc5NAojIE1ENSBGaW5nZXJwcmludDogZmM6MTE6Yjg6ZDg6MDg6OTM6MzA6MDA6NmQ6MjM6Zjk6N2U6ZWI6NTI6MWU6MDIKIyBTSEExIEZpbmdlcnByaW50OiA3MDoxNzo5Yjo4Njo4YzowMDphNDpmYTo2MDo5MTo1MjoyMjozZjo5ZjozZTozMjpiZDplMDowNTo2MgojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZmE6Yzk6YmQ6NTU6ZmI6MGE6Yzc6OGQ6NTM6YmI6ZWU6NWM6ZjE6ZDU6OTc6OTg6OWY6ZDA6YWE6YWI6MjA6YTI6NTE6NTE6YmQ6ZjE6NzM6M2U6ZTc6ZDE6MjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvakNDQW9xZ0F3SUJBZ0lRRTRZMVRSMC9CdkxCK1dVRjFaQWNZakFOQmdrcWhraUc5dzBCQVFVRkFEQnIKTVFzd0NRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbApjbTVoZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52CmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMldoY05Nakl3TmpJME1EQXhOakV5V2pCck1Rc3cKQ1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsY201aApkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnZiVzFsCmNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgKMm1DeGxDZkxGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RQpscEY3c0RQd3NSUk9FVysxUUs4YlJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWClpxVzFMUzdZZ0ZteXB3MjNSdXdoWS84MXE2VUN6eXIwVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEKMjk5eU9JenpscjN4Rjd6U3VqdEZXc2FuOXNZWGl3R2QvQm1vS29NV3VEcEkvazQrb0tzR0dlbFQ4NEFUQiswdAp2ejhLUEZVZ09Td3NBR2wwbFVxOElMS3BlZVVZaVpHbzNCeE43N3QrTnd0ZC9qbWxpRktNQUd6c0dIeEJ2ZmFMCmRYZTZZSjJFNS80dEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUVZPSU1QUHl3L2NETWV6VWIrQjR3ZzROZkR0ekFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQVgvRkJmWHhjQ0xrcjROV1NSL3BuWEtVVHd3TWhteXRNaVViUFdVM0ovcVZBdG1QTjNYRW9sV2NSCnpDU3MwMFJzY2E0QklHc0RvbzhZdHlrNmZlVVdZRk40UE1DdkZZUDNqMUl6Skwxa2s1ZnVpL2ZiR0todGNiUDMKTEJmUWRDVnA5LzVyUEpTK1RVdEJqRTdpYzlEamtDSnpRODN6NytwenprV0tzS1pKLzB4OW5YR0l4SFlka0ZzZAo3djNNOSs3OVlLV3hlaFp4MFJiUWZCSThiR21YMjY1Zk9acHdMd1U4R1VZRW1TQTIwR0J1WVFhN0ZrS01jUGN3CisrRGJacU1BQWIzbUxOcVJYNkJHaTAxcW5EMDkzUVZHL25hL29Bbzg1QURtSjdmL2hDM2V1aUlubGhCeDZ5THQKMzk4em5NL2pyYTZPMUk3bVQxR3ZGcExnWFBZSER3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBMYWJlbDogIkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDQ5Ojc5OjA0OmIwOmViOjg3OjE5OmFjOjQ3OmIwOmJjOjExOjUxOjliOjc0OmQwCiMgU0hBMSBGaW5nZXJwcmludDogZDE6ZWI6MjM6YTQ6NmQ6MTc6ZDY6OGY6ZDk6MjU6NjQ6YzI6ZjE6ZjE6NjA6MTc6NjQ6ZDg6ZTM6NDkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ3OmE3OmEwOmZiOjVkOjdlOjI3OjMxOmQ3OjcxOmU5OjQ4OjRlOmJjOmRlOmY3OjFkOjVmOjBjOjNlOjBhOjI5OjQ4Ojc4OjJiOmM4OjNlOmUwOmVhOjY5OjllOmY0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0F3U1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3cKR0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sagpZWFJsSUZObGNuWnBZMlZ6TUI0WERUQTBNREV3TVRBd01EQXdNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ01Fa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnd3SFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2d3UlEyOXRiMlJ2SUVOQklFeHBiV2wwWldReElUQWZCZ05WQkFNTQpHRUZCUVNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFMNUFuZlJ1NGVwMmh4eE5SVVNPdmtiSWd3YWR3U3IrR0IrTzVBTDY4NnRkVUlvV01RdWEKQnRERmNDTE5TUzFVWTh5MmJtaEdDMVBxeTB3a3dMeHlUdXJ4RmE3MFZKb1NDc042c2pOZzR0cUpWZk1pV1BQZQozTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVc2kxNEhaR1dDd0Vpd3FKSDVZWjkySUZDb2tjZG10ZXQ0CllnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXWTE5empOb0ZtYWc0cU1zWGVEWlIKck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakhZcHkrZzhjbQplejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVCm9CRUtJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdld1lEVlIwZkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdgpRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0CmIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbTdsM3NBZzlnMW8xUQpHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDIKRzl3ODRGb1Z4cDdaOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaQpsMkQ0a0Y1MDFLS2FVNzN5cVdqZ29tN0MxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzCnNtUGk5V0lzZ3RScUFFRlE4VG1EbjVYcE5wYVliZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSIKIyBTZXJpYWw6IDk4NTAyNjY5OQojIE1ENSBGaW5nZXJwcmludDogMjc6ZGU6MzY6ZmU6NzI6Yjc6MDA6MDM6MDA6OWQ6ZjQ6ZjA6MWU6NmM6MDQ6MjQKIyBTSEExIEZpbmdlcnByaW50OiBkZTozZjo0MDpiZDo1MDo5MzpkMzo5Yjo2Yzo2MDpmNjpkYTpiYzowNzo2MjowMTowMDo4OTo3NjpjOQojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6NWU6ZGU6M2I6YmI6ZjA6OWM6OGE6ZTE6NWM6NzI6ZWY6YzA6NzI6Njg6ZDY6OTM6YTI6MWM6OTk6NmY6ZDU6MWU6Njc6Y2E6MDc6OTQ6NjA6ZmQ6NmQ6ODg6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwRENDQkxpZ0F3SUJBZ0lFT3JaUWl6QU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFbE1DTUdBMVVFQ3hNY1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV1TUN3R0ExVUVBeE1sVVhWdlZtRmthWE1nVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBek1Ua3hPRE16TXpOYUZ3MHlNVEF6TVRjeE9ETXoKTXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVdwpJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSCmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcApsaTRrVkVBa09QY2FoZHhZVE11a0owS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJECnJPcG0yUmdiYUlyMVZ4cVl1dlh0ZGoxODJkNlVhanRMRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkoKV0NDWWZxdGZmcC9wMWszc2czU3B4MnpZN2lsS2hTb0dGUGxVNXRQYVpRZUxZemNTMTlEc3czc2dRVVNqN2N1ZwpGK0Z4WmM0ZFpqSDNkZ0VaeUgwRFdMYVZTUjJtRWlib3hneDI0T05teStwZHBpYnU1Y3hmdldlbkFTY09vc3BVCnhiRjZsUjF4SGtvcGlnUGNha1hCcEJsZWJ6Yk53Nkt3dC81Y09PSlN2UGhFUSthUXV3SURBUUFCbzRJQ1VqQ0MKQWs0d1BRWUlLd1lCQlFVSEFRRUVNVEF2TUMwR0NDc0dBUVVGQnpBQmhpRm9kSFJ3Y3pvdkwyOWpjM0F1Y1hWdgpkbUZrYVhOdlptWnphRzl5WlM1amIyMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0NBUm9HQTFVZElBU0NBUkV3CmdnRU5NSUlCQ1FZSkt3WUJCQUcrV0FBQk1JSDdNSUhVQmdnckJnRUZCUWNDQWpDQnh4cUJ4RkpsYkdsaGJtTmwKSUc5dUlIUm9aU0JSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEowZVNCaApjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5ClpDQjBaWEp0Y3lCaGJtUWdZMjl1WkdsMGFXOXVjeUJ2WmlCMWMyVXNJR05sY25ScFptbGpZWFJwYjI0Z2NISmgKWTNScFkyVnpMQ0JoYm1RZ2RHaGxJRkYxYjFaaFpHbHpJRU5sY25ScFptbGpZWFJsSUZCdmJHbGplUzR3SWdZSQpLd1lCQlFVSEFnRVdGbWgwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE11WW0wd0hRWURWUjBPQkJZRUZJdExiZTNUCktia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdUJnTlZIU01FZ2FZd2dhT0FGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnEKeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcApkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEClZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNnRsQ0wKTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTawpmbklZajlsb2ZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4CjdDOVRxbk43QXoxMGJ1WVdudXVsTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVIKY0hoWEhUTWUvUUtabkF6TkNnVlB4N3VPcEhYNlNtMnhnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweQptUU02aXN4VUpUa3hnWHNUSWxHNlJteWh1NTc2Qkd4SkpuU1AwblByekRDaTV1cFpJb2Y0bC9VTy9lck1rcVFXCnhGSVk2aUhPc2ZIbWhJSGx1cW1HS1BKRFdsMFNuYXdlMmFqbENtcW5mNkNIS2MveWlVM1U3TVhpNW5yUU5pT0sKU25RMitRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIiCiMgU2VyaWFsOiAxMjg5CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTozOTo3YjpkZDpmODpiYTplYzo4MjplOTphYzo2MjpiYTowYzo1NDowMDoyYgojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOjNhOmZiOmNmOjEyOjQwOjM2OjRiOjQ0OmIyOjE2OjIwOjg4OjgwOjQ4OjM5OjE5OjkzOjdjOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTphMDpkZDo3ZDpkNzoyMDphZDpiNzpmZjowNTpmODozZDo1NDoyYjoyMDo5ZDpjNzpmZjo0NToyODpmNzpkNjo3NzpiMTo4Mzo4OTpmZTphNTplNTpjNDo5ZTo4NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnR6Q0NBNStnQXdJQkFnSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTWpBZUZ3MHdOakV4TWpReE9ESTNNREJhRncwek1URXhNalF4T0RJek16TmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNhCkdNcExsQTBBTGE4REtZcndENEhJcmt3WmhSMEluNnNwUklYekw0R3RNaDZRUnIramhpWWFIdjUrSEJnNlhKeGcKRnlvNmRJTXpNSDFoVkJITDdhdmc1dEtpZnZWcmJ4aTNDZ3N0L2VrKzd3ckdzeERwM01KR0YvaGQvYVRhLzU1SgpXcHptTStZa2x2Yy91bHNySEhvMXd0Wm4vcXRtVUl0dEtHQXI3OWRndzhlVHZJMDJrZk4vK05zUkU4U2NkM2JCCnJyY0Nhb0Y2cVVXRDRnWG11VmJCbERlUFNIRmpJdXdYWlFlVmlrdmZqOFphQ3VXdzQxOWVheEdyRFBtRjYwVHAKK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3lsWlV0UW9mWDFiT1FRN2RzRS9IZTNmYkUrSWsvMFhYMQprc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dDY2LzNGc3ZielNVcjVSLzdtcC9pClVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhud1E1aFlJaXoKUHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZwovek9oRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVICm95Y1I3aFlRZTd4RlNreXlCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUkKeVY3N3pHSGNpek4zMDBReU5RbGlCSklXRU5pZUowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyCkE4UVpSdEdVYXpCdUJnTlZIU01FWnpCbGdCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhNkZKcEVjd1JURUwKTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVApFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmCkJsdW9ybkZkTHdVdlorWVRSWVBFTnZiendDWU1EYlZIWkYzNHRITEpScVVER0NkVmlYaDlkdXFXTklBWElOem4KZy9pTi9BZTQybDlOTG1leWhQM1pSUHgzVUlIbWZMVEpEUXR5VS9oMkJ3ZEJSNVlNKytDQ0pwTlZqUDRpSDJCbApmRi9uSnJQM01wQ1lVTlEzY1ZYMmtpRjQ5NVY1K3ZndEpvZG1WakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLCldXUEtqYUpXMWFjdnZGWWZ6em5CNHZzS3FCVXNmVTE2WThac2wwUTgwbS9EU2hjSytKRFNWNklaVWFVdGwwSGEKQjArcFVOcVFqWlJHNFQ3d2xQMFFBRGoxTytoQTRiUnVWaG9nekc5WWplMHVSWS9XNlpNLzU3RXMzenJXSW96YwpoTHNpYjlENDVNWTU2UVNJUE1PNjYxVjZiWUNaSlBWc0FmdjRsN0NVVyt2OTBtL3hkMmdOTldRanJMaFZvUVBSClRVSVozUGgxV1ZhaithaEplZml2RHJrUm9IeTNhdTAwMExZbVlqZ2Fod3o0NlAwdTA1Qi9CNUVxSGRaK1hJV0QKbWJBNENEL3BYdmsxQitUSlltNVhmNmRRbGZlNnlKdm1qcUlCeGRabXYzbGg4endjNGJtQ1hGMmd3K25ZU0wwWgpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSTRwRVpYTkx4SWQyNkYwS0NsM0dCVXpHcG4vWjlZcjl5CjRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04VkNMQUFWQnBRNTcwc3U5dCtPemEKOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIgojIFNlcmlhbDogMTQ3OAojIE1ENSBGaW5nZXJwcmludDogMzE6ODU6M2M6NjI6OTQ6OTc6NjM6Yjk6YWE6ZmQ6ODk6NGU6YWY6NmY6ZTA6Y2YKIyBTSEExIEZpbmdlcnByaW50OiAxZjo0OToxNDpmNzpkODo3NDo5NToxZDpkZDphZTowMjpjMDpiZTpmZDozYToyZDo4Mjo3NTo1MTo4NQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6ZjE6ZmM6N2Y6MjA6NWQ6Zjg6YWQ6ZGQ6ZWI6N2Y6ZTA6MDc6ZGQ6NTc6ZTM6YWY6Mzc6NWE6OWM6NGQ6OGQ6NzM6NTQ6NmI6ZjQ6ZjE6ZmU6ZDE6ZTE6OGQ6MzUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ016QWVGdzB3TmpFeE1qUXhPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFETQpWMElXVkp6bW1OUFRUZTcrN2NlZlF6bEtaYlBvRm9nMDJ3MVprWFRQa3JnRVFLMENTekdydkkyUmFOZ2dEaG9CCjRocDdUaGRkNG9xM1A1a2F6ZXRocThKbHBoKzN0NzIzai96OWNJOExvR2UrQWFKWnozSG1EeWwyLzdGV2VVVXIKSDU1NlZPaWpLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZAo4bHl5QlROdmlqYk8wQk5PLzc5S0REUk1wc01odlZBRVZldXh1NTM3UlI1a0ZkNVZBWXdDZHJYTG9UOUNhYnd2CnZXaERGbGFKS2pkaGtmMm1yazdBeXhSbGxEZExrZ2J2Qk5ESW5JamJDM3VCcjdFOUtzUmxPbmkyN3R5QXNkTFQKbVp3NjdtdGFhN09OdDlYT25NSytwVXN2RnJHZWFEc0diNjU5bi9qZTdNd3BwNWlqSlVNdjcvRmZKdUdJVGZoZQpidGZaRkc0Wk0ybW5PNFNKazhSVFZST2hVWGhBK0xqSm91NTd1bEpDZzU0VTdRVlNXbGxXcDVmOG5UOEtLZGpjClQ1RU9FN3plbGFUZmk1bStySnN6aU8rMWdhOGJ4aUpUeVBiSDdwY1VzTVY4ZUZMSThNNXVkMkNFcHVrcWRpRHQKV0FFWE1KUHBHb3ZnYzJQWmFwS1VTVTYwclVxRnhLTWlNUHdKN1dnaWM2YUlERlVoV01YaE9wOHEzY3Joa09EWgpjNnRzZ0xqb0MyU1RvSnlNR2YrejBnenNrU2FIaXJPaTRYQ1BMQXJselcxb1VldmFQd1YvaXpMbUUxeHIvbDlBCjRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHp1RDg3blNWTDJ2OUE2d0lEQVFBQm80SUJsVENDQVpFd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVEJna3JCZ0VFQWI1WUFBTXdnY1V3Z1pNRwpDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqWVhSbElHTnZibk4wCmFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdQpkQzR3TFFZSUt3WUJCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53CmN6QUxCZ05WSFE4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEcKQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREViTUJrR0ExVUVBeE1TVVhWdlZtRmthWE1nClVtOXZkQ0JEUVNBemdnSUZ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBVDYyZ0xFejZ3UEp2OTJaVnF5TTAKN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbQpkMW80MTcrc2h2enVYWU84QnNiUmQyc1BiU1F2UzNwc3B3ZVd5dU9FbjYySWl4MnJGbzFiWmhmWkZ2U0xnTkxkCitMSjJ3L3c0RTZvTTNrSnBLMjd6UE91QUo5djFwa1FObjFwVldRdlZEVkpJeGE2ZjhpK0F4ZW95VURVU2x5N0IKNGYveEk0aFJPSi95WmxaMjV3OVJsNlZTREUxSlVaVTJQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTgp0NTRDcm5NQXlOb2pBK2o1NmhsMFlnQ1V5eUlndnBTbldiV0NhcjZaZVhxcDhrb2tVdmQwL2JwTzVxZ2RBbTZ4CkRZQkV3YTdUSXpkZnU0VjhLNUl1Nkg2bGk5Mlo0YjhuYnkxZHFudUgvZ3JkUy95TzlTYmtibkJDYmpQc01aNTcKazhIa3lXa2FQY0JyVGlKdDdxdFlUY2JRUWNFcjZrOFNoMTdyUmRoczlaZ0MwNkRZVllvR21SbWlvSGZSTUo2cwp6SFh1Zy9Xd1lqblBiRmZpVE5LUkN3NTFLQnVhdi8wYVEvSEtkL3M3ajJHNGFTZ1dRZ1JlY0NvY0lkaVA0YjBqCld5MTBRSkxaWXhrTmM5MXB2R0pIdk9CMEs3THJmYjVCRzdYQVJzV2hJc3RmVHNFb2t0NFl1dFVxS0xzUml4ZVQKbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicnFaNWhIWTh5Mm80TTFuUStld2trMmdGM1I4UTd6VFNNbWZYSwo0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZjE6YmM6NjM6NmE6NTQ6ZTA6YjU6Mjc6ZjU6Y2Q6ZTc6MWE6ZTM6NGQ6NmU6NGEKIyBTSEExIEZpbmdlcnByaW50OiAzNjpiMToyYjo0OTpmOTo4MTo5ZTpkNzo0Yzo5ZTpiYzozODowZjpjNjo1Njo4Zjo1ZDphYzpiMjpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6NWU6NzI6ZWQ6OWY6NTY6MGU6ZWM6NmU6YjQ6ODA6MDA6NzM6YTQ6M2Y6YzM6YWQ6MTk6MTk6NWE6Mzk6MjI6ODI6MDE6Nzg6OTU6OTc6NGE6OTk6MDI6NmI6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURXakNDQWtLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJRTVFzd0NRWURWUVFHRXdKS1VERVkKTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdIaGNOTURNd09UTXdNRFF5TURRNVdoY05Nak13T1RNd01EUXlNRFE1CldqQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWUQKVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN6cy81LzAyMng3eFo4VjZVTWJYYUtMMHUvWlB0TTdvcnc4eWw4CjlmL3VLdURwNmJwYlpDS2FtbThzT2lacFVRV1pKdHpWSEdweHhwcDlIcDNkZkd6R2pHZG5Tajc0Y2JBWko2a0oKREthVnYwdU1EUHBWbUR2WTZDS2hTM0U0ZWF5WGttbXppWDdxSVdnR21CU1doOUpoTnJ4dEoxYWVWKzdBd0ZiOQpNcytrMlk3Q0k5ZU5xUFBZSmF5WDVIQTQ5TFk2dEowN2x5WkRvNkc4U1ZseVRDTXdod0ZZOWs2K0hHaFdacS9OClFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkREpaa25kd2k5MlNMMzJIZUZaUlNGYUI5VXNsTHFDSEoKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjJKQ2h6QWdNQkFBR2pQekE5TUIwRwpBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkcKa2wzZzBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmcgpVajk0bks5TnJ2alZUOCthbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241CkJ3K1NVRW1LM1RHWFg4bnBONm83V1dXWGxETEpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlUKSlJETDhUcnkyZnJiU1ZhN3B2Nm5RVFhENEloaHlZakgzellRSXBoWjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdApSU2ZsTU1GZTh0b1R5eVZDVVpWSEE0eHNJY3gwUXUxVC96T0xqdzlYQVJZdno2YnV5WEFpRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgU3ViamVjdDogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIExhYmVsOiAiU29uZXJhIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDI5CiMgTUQ1IEZpbmdlcnByaW50OiBhMzplYzo3NTowZjoyZTo4ODpkZjpmYTo0ODowMTo0ZTowYjo1Yzo0ODo2ZjpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OmY3OjZkOmU2OjA3OjdjOjkwOmM1OmIxOjNlOjkzOjFhOmI3OjQxOjEwOmI0OmYyOmU0OjlhOjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3OTowODpiNDowMzoxNDpjMTozODoxMDowYjo1MTo4ZDowNzozNTo4MDo3ZjpmYjpmYzpmODo1MTo4YTowMDo5NTozMzo3MTowNTpiYTozODo2YjoxNTozZDpkOToyNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUApNQTBHQTFVRUNoTUdVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4Ck1EUXdOakEzTWprME1Gb1hEVEl4TURRd05qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlYKQkFvVEJsTnZibVZ5WVRFWk1CY0dBMVVFQXhNUVUyOXVaWEpoSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpBWFNqV2R5dkFObHNkRStoWTMvRWk5dlgrQUxUVTc0VytvClo2bS9BeHhOakc4eVI5VkJhS1FUQk1FMURKcUVRL3hjSGYrSnMrZ1hHTTJSWC91SjQrcS9UbDE4R3liVGRYbnQKNW9UalYrV3RLY1QwT2lqbnBYdUVObW16L1Y1MnZhTXRtZE9RVGlNb2ZSaGo4VlE3SnAxMlc1ZENzdit1OEU3cwozVG1WVG9NR2YrZEpRTWpGQWJKVVdtWWRQZno1NlR3S25vRzRjUEFCaStRalZIeklydmlRSGdDV2N0UlV6MkVqCnZPcjduUUtWMGJhNWNUcHBDRDhQdE9GQ3g0ajFQNWlvcDdvYzRIRng3MWhYZ1ZCNlhHdDBSZzZEQTVqRGpxaHUKOG5ZeWJpZUR3blB6M0Jqb3RKUHFkVVJyQkdBZ2NWZUhuZk8rb0pBalBZb2s0ZG9oMjhNQ0F3RUFBYU16TURFdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ05WSFE0RUNnUUlTcUNxV0lUVFhqd3dDd1lEVlIwUEJBUURBZ0VHCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmF6b2Y1Rm5JVlYwc2QyWnZub2lZdzdKTm4zOVl0MGpTdjl6aWwKenFzV3Vhc3ZmRFhMck5BUHRFd3IvSUR2YTR5Ulh6WjI5OXV6R3hucTlMSVIvV0Z4Ukw4b3N6b2R2N05ENkorLwozREVJY2JDZGpkWTBSektReG1Vazk2QktmQVJ6anpsdkY0eHl0YjFMeUhyNGU0UERLRTZjQ2VwblA3Sm5CQnZECkZOcjQ1MGtra2RBZGF2cGhPZTlyNXlGMUJnZllFclFoSUhCQ2NZSGFQSm8ydnFaYkRXcHNtaCtSZS9uNTcwSzYKVGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeEV0ektPNmd1blJSYUJYVzM3TmRqNHJvMXRnUUlrZWphblp6MgpaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExIbGxwd3JOOU0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBTdWJqZWN0OiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgTGFiZWw6ICJYUmFtcCBHbG9iYWwgQ0EgUm9vdCIKIyBTZXJpYWw6IDEwNzEwODkwODgwMzY1MTUwOTY5Mjk4MDEyNDIzMzc0NTAxNDk1NwojIE1ENSBGaW5nZXJwcmludDogYTE6MGI6NDQ6YjM6Y2E6MTA6ZDg6MDA6NmU6OWQ6MGY6ZDg6MGY6OTI6MGE6ZDEKIyBTSEExIEZpbmdlcnByaW50OiBiODowMTo4NjpkMTplYjo5Yzo4NjphNTo0MTowNDpjZjozMDo1NDpmMzo0Yzo1MjpiNzplNTo1ODpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogY2U6Y2Q6ZGM6OTA6NTA6OTk6ZDg6ZGE6ZGY6YzU6YjE6ZDI6MDk6Yjc6Mzc6Y2I6ZTI6YzE6OGM6ZmI6MmM6MTA6YzA6ZmY6MGI6Y2Y6MGQ6MzI6ODY6ZmM6MWE6YTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFawpNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZClVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3gKTkRBMFdoY05NelV3TVRBeE1EVXpOekU1V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkMwpkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5CmRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1lKQjY5RmJTNgozOGVNcFNlMk9BdHA4N1pPcUN3dUlSMWNSTjhoWFg0amRQNWVmclJLdDZhdEg2N2dCaGJpbTF2WlozUnJYWUNQCktaMkdHOW1jRFpodGRoQW9XT1Jsc0g5S21IbWY0TU14Zm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1EKRHhJRU01ZGZUMkZhOE9UNWthdm5IVHU4Nk0vMGF5MDBmT0pJWVJ5TzgyRkV6RytnU3FtVXNFM2E1NmswZW5JNApxRUhNUEpRUmZldklwb3kzaHN2S016dlpQVGVMKzNvK2hpem5jOWNLVjZ4a214bnI5QThFQ0lxc0F4Y1paUFJhCkpTS05OQ3l5OW1nZEVtM1RpaDRVMnNTUHB1SWpoZFY2RGIxcTRPbnM3QmU3UWh0bnFpWHRSWU1oL01ISmZOVmkKUHZyeXhTM1QvZFJsQWdNQkFBR2pnWjh3Z1p3d0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUApCQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNWlBvajBHWTRRSm5NNWk1QVNzCmpWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTlqY213dWVISmhiWEJ6WldOMWNtbDAKZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjL0toNFp6WHhIZkFSCnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYQpJUjlObVhtZDRjOG5ueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5Cmk2bXg1TythR3RBOWFabnVxQ2lqNFR5ejhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVEKTys3RVRQVHNKM3hDd25SOGdvb0p5YlFESmJ3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkdvIERhZGR5IENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA5MTpkZTowNjoyNTphYjpkYTpmZDozMjoxNzowYzpiYjoyNToxNzoyYTo4NDo2NwojIFNIQTEgRmluZ2VycHJpbnQ6IDI3Ojk2OmJhOmU2OjNmOjE4OjAxOmUyOjc3OjI2OjFiOmEwOmQ3Ojc3OjcwOjAyOjhmOjIwOmVlOmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMzo4NDo2YjpmMjo0Yjo5ZTo5MzpjYTo2NDoyNzo0YzowZTpjNjo3YzoxZTpjYzo1ZTowMjo0ZjpmYzphYzpkMjpkNzo0MDoxOTozNTowZTo4MTpmZTo1NDo2YTplNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaApNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFCllXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTMKTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSbwpaU0JIYnlCRVlXUmtlU0JIY205MWNDd2dTVzVqTGpFeE1DOEdBMVVFQ3hNb1IyOGdSR0ZrWkhrZ1EyeGhjM01nCk1pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTQXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRU4KQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQQpQVllZWXdodjJ2TE0wRDkvQWxRaVZCRFlzb0hVd0hVOVMzL0hkOE0rZUtzYUE3VWdheTlxSzdIRmlIN0V1eDZ3CndkaEZKMitxTjFqM2h5YlgyQzMycVJlM0gzSTJUcVlYUDJXWWt0c3FibDJpL29qZ0M5NS81WTBWNGV2TE90WGkKRXFJVExkaU9yMThTUGFBSUJRaTJYS1ZsT0FSRm1SNmpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWQphdng0QTZsTmY0REQrcXRhL0tGQXBNb1pGdjZ5eU85ZWN3M3VkNzJhOW5tWXZMRUhaNklWRGQyZ1dNWkVld28rCllpaGZ1a0VIVTFqUEVYNDRkTVg0LzdWcGtJK0VkT3FYRzY4Q0FRT2pnY0F3Z2Iwd0hRWURWUjBPQkJZRUZOTEUKc05LUjFFd1JjYk5oeXoyaC90Mm9hdFRqTUlHTkJnTlZIU01FZ1lVd2dZS0FGTkxFc05LUjFFd1JjYk5oeXoyaAovdDJvYXRUam9XZWtaVEJqTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1CklFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltUFFvWitZZUFFVzVwNUpZWE1QODBrV055Ck9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3RJM2xwamJpMlRjN1AKVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSCmRFci9WeHFIRDNWSUxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWYKUmVZTm55aWNzYmtxV2xldE53K3ZIWC9idlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJTdGFyZmllbGQgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDMyOjRhOjRiOmJiOmM4OjYzOjY5OjliOmJlOjc0OjlhOmM2OmRkOjFkOjQ2OjI0CiMgU0hBMSBGaW5nZXJwcmludDogYWQ6N2U6MWM6Mjg6YjA6NjQ6ZWY6OGY6NjA6MDM6NDA6MjA6MTQ6YzM6ZDA6ZTM6Mzc6MGU6YjU6OGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE0OjY1OmZhOjIwOjUzOjk3OmI4Ojc2OmZhOmE2OmYwOmE5Ojk1OjhlOjU1OjkwOmU0OjBmOmNjOjdmOmFhOjRmOmI3OmMyOmM4OjY3Ojc1OjIxOmZiOjVmOmI2OjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SlZVekVsCk1DTUdBMVVFQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXAKVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURRdwpOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFCkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnAKWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmCjhNT2gydFRZYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4KK2xxMmN3UWxadXQzZitkWnhrcVpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMApYOXREa1lJMjJXWThzYmk1Z3YyY09qNFF5RHZ2Qm1WbWVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhCks0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NORjRBemJsNUtYWm5KSG9lMG5SckEKMVc0VE5TTmUzNXRmUGUvVzkzYkM2ajY3ZUEwY1FtZHJCTmo0MXRwdmkvSkVvQUdyQWdFRG80SEZNSUhDTUIwRwpBMVVkRGdRV0JCUy9YN2ZSenQwZmh2UmJWYXpjMXhEQ0RxbUk1ekNCa2dZRFZSMGpCSUdLTUlHSGdCUy9YN2ZSCnp0MGZodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjAKWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQXNUS1ZOMFlYSm1hV1ZzWkNCRApiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBV2RQNGlkMGNrYVZhR3NhZlB6V2RxYkFZY2FUMWVwb1hrSkt0djMKTDdJZXpNZGVhdGlEaDZHWDcwazFQbmNHUVZoaXY0NVl1QXBuUCt5ejNTRm1IOGxVK25MTVBVeEEySUd2ZDU2RAplcnVpeC9VMEY0N1pFVUQwL0N3cVRSVi9wMkpkTGlYVEFBc2dHaDFvK1JlNDlMMkw3U2haM1UwV2l4ZUR5TEpsCnh5MTZwYXE4VTRadDNWZWt5dmdnUVF0bzhQVDdkTDVXWFhwNTlma2RoZU10bGI3MWNaQkR6STBmbWdBS2h5bnAKVlNKWUFDUHE0eEpES1Z0SENOMk1RV3BsQnFqbElhcEJ0SlVobGJsOTBUU3JFOWF0dk56aVBUbk52VDUxY0tFWQpXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTNRQkZHbWg5NURtSy9ENWZzNEM4ZkY1UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlRhaXdhbiBHUkNBIgojIFNlcmlhbDogNDIwMjMwNzA4MDc3MDg3MjQxNTk5OTExNDA1NTY1MjcwNjY4NzAKIyBNRDUgRmluZ2VycHJpbnQ6IDM3Ojg1OjQ0OjUzOjMyOjQ1OjFmOjIwOmYwOmYzOjk1OmUxOjI1OmM0OjQzOjRlCiMgU0hBMSBGaW5nZXJwcmludDogZjQ6OGI6MTE6YmY6ZGU6YWI6YmU6OTQ6NTQ6MjA6NzE6ZTY6NDE6ZGU6NmI6YmU6ODg6MmI6NDA6YjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc2OjAwOjI5OjVlOmVmOmU4OjViOjllOjFmOmQ2OjI0OmRiOjc2OjA2OjJhOmFhOmFlOjU5OjgxOjhhOjU0OmQyOjc3OjRjOmQ0OmMwOmIyOmMwOjExOjMxOmUxOmIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJUUg1MVpXdGN2d2daRXBZQUlhZU5lOWpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1Rc3dDUVlEVlFRR0V3SlVWekV3TUM0R0ExVUVDZ3duUjI5MlpYSnViV1Z1ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBeU1USXdOVEV6TWpNek0xb1hEVE15TVRJd05URXpNak16TTFvdwpQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHZkbVZ5Ym0xbGJuUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOdzhYUgpJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxCmdRZFc4b3I1QnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3kKeWh3T2VZSFd0WEJpQ0FFdVRrOE8xUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0cwpGL3RueU1LdHNjMkF0SmZjZGdFV0ZlbHExNlRoZUVmT2h0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyCmpXUit0U0JxblR1QnRvOUFBR2RMaVlhNHpHWCtGVlBwQk1IV1h4MUUxd292SjVwR2ZhRU5kYTFVaGhYY1NUdngKbHM0UG02RHNvM3BkdnRVcWRVTGxlOTZsdHFxdktLeXNrS3c0dDlWb05TWjYzUGM3OC8xRm05RzdRM2h1Yi9GQwpWR3FZOEEydGwrbFNYdW5WYW5MZWF2Y2JZQlQwcGVTMmNXZXFIK3JpVGNGQ1FQNW5SaGM0TDBjL2NaeXU1U0hLCllTMXRCNmlFZkMzdVVTWHhZNUNlL2VGWGlHdnZpaU50c2VhOVA2M1JQWllMaFkzTmF5ZTd0d1diN0x1UnFRb0gKRWdLWFRpQ1E4UDhOSHVKQk85TkFPdWVOWGRwbTVBS3dCMUtZWEE2T001ekNwcFg3VlJsdVRJNnVTdys5d1RoTgpYbytFSFdiTnhXQ1d0RkphQlltT2xYcVl3WkU4bFNPeUR2UjV0TWw4d1VvaEFnTUJBQUdqYWpCb01CMEdBMVVkCkRnUVdCQlRNek8vTUtXQ2tPN0dTdGp6Nk1tS1ByQ1VWT3pBTUJnTlZIUk1FQlRBREFRSC9NRGtHQkdjcUJ3QUUKTVRBdk1DMENBUUF3Q1FZRkt3NERBaG9GQURBSEJnVm5LZ01BQUFRVUE1dndJaFAvbFNnMjA5eWV3REw3TVRxSwpVV1V3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUVDQVN2b215YzVlTU4xUGhuUjJXUFd1czRNemVLUjZkQmNaClR1bFN0Ym5nQ25SaXFtaktlS0JNbW80c0l5N1ZhaElrdjlSbzA0clEySnlmdEI4TTNqaCtWemo4amVKUFhneWYKcXp2Uy8zV1h5NlRqWndqLzVjQVd0VWdCZmVuNUN2OGI1V3BwdjNnaHFNS25JNm1HcTNaVzZBNE05aFBkS21hSwpaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjJOZS8vQUhZMlJUS2J4a2FGWGVJa3NCN2pTSmFZVjBlVVZYb1BRYkZFCkpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVUQ3Z3NMMHU4cVYxYllIK01oNlhnVW1NcXZ0ZzcKaFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6RHhBUnZCTUIxdVVPMDcrMQpFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmtaNk1tCm5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1gKdWRwVkJya2s3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuegpzc1F3bVNOT1hmSklvUklNM0JLUUNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlCkxNRERhdjd2M0F1bitrYmZZTnVjcGxsUWRTTnBjNU95K2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWwKcFlZc2ZQUVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSIKIyBTZXJpYWw6IDE3MTU0NzE3OTM0MTIwNTg3ODYyMTY3Nzk0OTE0MDcxNDI1MDgxCiMgTUQ1IEZpbmdlcnByaW50OiA4NzpjZTowYjo3YjoyYTowZTo0OTowMDplMTo1ODo3MTo5YjozNzphODo5Mzo3MgojIFNIQTEgRmluZ2VycHJpbnQ6IDA1OjYzOmI4OjYzOjBkOjYyOmQ3OjVhOmJiOmM4OmFiOjFlOjRiOmRmOmI1OmE4Ojk5OmIyOjRkOjQzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo5MDo5OTpiNTowMTo1ZTo4Zjo0ODo2YzowMDpiYzplYTo5ZDoxMToxZTplNzoyMTpmYTpiYTozNTo1YTo4OTpiYzpmMTpkZjo2OTo1NjoxZTozZDpjNjozMjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHR6Q0NBcCtnQXdJQkFnSVFET2ZnNVJmWVJ2NlA1V0Q4Ry9Bd09UQU5CZ2txaGtpRzl3MEJBUVVGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4TVRFd01EQXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3YwpKcFNJcXZUTzlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQCm1ESTJkc3plM1R5b291OXEreUh5VW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZysKd1J2RGpEUFoyQzhZL2lnUHM2ZUQxc051Uk1CaE5aWVcvbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNApWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweW9lYjZwTm5WRnpGMXJvVjlJcTQvCkFVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmR0hkUEFnTUIKQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRVwpCQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVuCnB5R2Q4MjNJRHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkMKZFdLdWgrdnkxZG5lVnJPZnpNNFVLTGtObDJCY0VreFk1Tk05ZzBsRldKYzFhUnFvUitwV3hubXJFdGhuZ1lUZgpmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtCk5XMWZpUUcyU1Z1ZkFRV2JxejBsd2N5MmY4THhiNGJHK21SbzY0RXRsT3RDdC9xTUh0MWk4YjVRWjdkc3ZmUHgKSDJzTU5nY1dmemQ4cVZ0dGV2RVNSbUNEMXljRXZrdk9sNzdEWnlwb0VkK0E1d3d6WnI4VERSUnU4MzhmWXhBZQorbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDEwOTQ0NzE5NTk4OTUyMDQwMzc0OTUxODMyOTYzNzk0NDU0MzQ2CiMgTUQ1IEZpbmdlcnByaW50OiA3OTplNDphOTo4NDowZDo3ZDozYTo5NjpkNzpjMDo0ZjplMjo0Mzo0Yzo4OToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IGE4Ojk4OjVkOjNhOjY1OmU1OmU1OmM0OmIyOmQ3OmQ2OjZkOjQwOmM2OmRkOjJmOmIxOjljOjU0OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0Mzo0ODphMDplOTo0NDo0Yzo3ODpjYjoyNjo1ZTowNTo4ZDo1ZTo4OTo0NDpiNDpkODo0Zjo5Njo2MjpiZDoyNjpkYjoyNTo3Zjo4OTozNDphNDo0MzpjNzowMTo2MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHJ6Q0NBcGVnQXdJQkFnSVFDRHZnVnBCQ1JyR2hkV3JKV1pISFNqQU5CZ2txaGtpRzl3MEJBUVVGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkQKUVRBZUZ3MHdOakV4TVRBd01EQXdNREJhRncwek1URXhNVEF3TURBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVOQk1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTRqdmhFWExlcUtUVG8xZXFVS0tQQzNlUXlhS2w3aExPbGxzQgpDU0RNQVpPblRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3Cm5oNlZmZTYzU0tNSTJ0YXZlZ3c1Qm1WL1NsMGZ2QmY0cTc3dUtOZDBmM3A0bVZtRmFHNWNJekpMdjA3QTZGcHQKNDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUg0aWRxOUpveitFa0lZSXZVWDdRNmhMK2hxa3BNZlQ3UApUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveTd2clRDMExVcTdkQk10b00xTy80CmdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUgpUTHRtOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3IKaE1BdHVkWEgvdlRCSDFqTHVHMmNlblRubUNtckViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZwowNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0dGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGClBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODZVQWIzTHVqRVYwbHMKWVNFWTFRU3RlRHdzT29CcnArdXZGUlRwMkluQnVUaHM0cEZzaXY5a3VYY2xWekRBR3lTajRkenAzMGQ4dGJRawpDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDM1NTM0MDAwNzY0MTA1NDc5MTk3MjQ3MzA3MzQzNzgxMDAwODcKIyBNRDUgRmluZ2VycHJpbnQ6IGQ0Ojc0OmRlOjU3OjVjOjM5OmIyOmQzOjljOjg1OjgzOmM1OmMwOjY1OjQ5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogNWY6Yjc6ZWU6MDY6MzM6ZTI6NTk6ZGI6YWQ6MGM6NGM6OWE6ZTY6ZDM6OGY6MWE6NjE6Yzc6ZGM6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc0OjMxOmU1OmY0OmMzOmMxOmNlOjQ2OjkwOjc3OjRmOjBiOjYxOmUwOjU0OjQwOjg4OjNiOmE5OmEwOjFlOmQwOjBiOmE2OmFiOmQ3OjgwOjZlOmQzOmIxOjE4OmNmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3S1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1agpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXdNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1WTJVZwpSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtCis5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKUE50ME9LUkt6RTBsZ3ZkS3BWTVNPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTQp4Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0M01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCCklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWVoMTBhVUFzZwpFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lYwpuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6CmVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrS21ORVZYNThTdm53MgpZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EiCiMgU2VyaWFsOiAxNzc3NzAyMDgwNDU5MzQwNDAyNDE0Njg3NjA0ODgzMjc1OTUwNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDg4OjJjOjhjOjUyOmI4OmEyOjNjOmYzOmY3OmJiOjAzOmVhOmFlOmFjOjQyOjBiCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6MjA6NzQ6NDE6NzI6OWM6ZGQ6OTI6ZWM6Nzk6MzE6ZDg6MjM6MTA6OGQ6YzI6ODE6OTI6ZTI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBmOjk5OjNjOjhhOmVmOjk3OmJhOmFmOjU2Ojg3OjE0OjBlOmQ1OjlhOmQxOjgyOjFiOmI0OmFmOmFjOmYwOmFhOjlhOjU4OmI1OmQ1OjdhOjMzOjhhOjNhOmZiOmNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3ClBURUxNQWtHQTFVRUJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnoKY3lBeUlGQnlhVzFoY25rZ1EwRXdIaGNOT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOQpNUXN3Q1FZRFZRUUdFd0pHVWpFUk1BOEdBMVVFQ2hNSVEyVnlkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56CklESWdVSEpwYldGeWVTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOeFEKbHRBUytEWFNDSGg2dGxKdy9XL3V6N2tSeTExMzRlenBmZ1NOMXN4dmMwTlhZS3d6Q2tUc0ExOGNnQ1NSNWFpUgpWaEtDOStBcjlOdXVZUzZKRUkxcmJMcXpBcjNWTnNWSU55UGk4Rm8zVWpNWEV1TFJZRTIrTDBFUjQvWVhKUXlMCmtjQWJtWHVaVmcydjd0SzhSMWZqZVVsN05Ja25KSVRlc2V6cFdFNytUdDlhdmtHdHJBakZHQTd2MGxQdWJOQ2QKRWdFVGpkeUFZdmVWcVVTSVNuRk9ZRldlMnlNWmVWWUhERDlqQzF5dzRyNStGZnlVTTFoQk9IVEU0WStMM3lhcwpIN1dMTzdkRFdXdXdKS1p0a0l2RWN1cGRNNWkzeTk1ZWUrK1U4UnMreXNraHdjV1lBcXFpOWx0M20vVitsbFUwCkhHZHB3UEZDNDBlcy9DZ2NabFVDQXdFQUFhT0JqRENCaVRBUEJnTlZIUk1FQ0RBR0FRSC9BZ0VLTUFzR0ExVWQKRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNDNNdDM4c09LQXplM2JPa3lubTRqcnZvTUlrd0VRWUpZSVpJQVliNApRZ0VCQkFRREFnRUdNRGNHQTFVZEh3UXdNQzR3TEtBcW9DaUdKbWgwZEhBNkx5OTNkM2N1WTJWeWRIQnNkWE11ClkyOXRMME5TVEM5amJHRnpjekl1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ25WTStJUkJuTDM5Ui8KQU45V00ySzE5MUVCa092RFA5R0lST2trWGUvbkZMMGd0NW84QVA1dG45dVEzTmYwWXRhTGNGM241UVJJcVdoOAp5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSVHRNVFpHbmtMdVBUNTVzSm1hYmdsWnZPR3RkL3Zqek9Vck1SCkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLys3VUNtbllSME9ibmNIb1VXMmlrYmhpTUEKeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVy8vMUlNd3JoM0tXQgprSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIFN1YmplY3Q6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgTGFiZWw6ICJEU1QgUm9vdCBDQSBYMyIKIyBTZXJpYWw6IDkxMjk5NzM1NTc1MzM5OTUzMzM1OTE5MjY2OTY1ODAzNzc4MTU1CiMgTUQ1IEZpbmdlcnByaW50OiA0MTowMzo1MjpkYzowZjpmNzo1MDoxYjoxNjpmMDowMjo4ZTpiYTo2Zjo0NTpjNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmM5OjAyOjRmOjU0OmQ4OmY2OmRmOjk0OjkzOjVmOmIxOjczOjI2OjM4OmNhOjZhOmQ3OjdjOjEzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjo4NzoyNjowMzozMTphNzoyNDowMzpkOTowOTpmMTowNTplNjo5YjpjZjowZDozMjplMTpiZDoyNDo5MzpmZjpjNjpkOToyMDo2ZDoxMTpiYzpkNjo3NzowNzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFNqQ0NBaktnQXdJQkFnSVFSSyt3Z05hako3cUpNRG1HTHZoQWF6QU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUQXdNRGt6TURJeE1USXhPVm9YRFRJeE1Ea3pNREUwTURFeE5Wb3cKUHpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SY3dGUVlEVlFRRApFdzVFVTFRZ1VtOXZkQ0JEUVNCWU16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOK3Y2WmRRQ0lOWHRNeGlaZmFRZ3V6SDB5eHJNTXBiN05uRGZjZEF3UmdVaStEb00zWkpLdU0vSVVtVHJFNE8Kcno1SXkyWHUvTk1oRDJYU0t0a3lqNHpsOTNld0VudTFsY0NKbzZtNjdYTXVlZ3dHTW9PaWZvb1VNTTBSb09FcQpPTGw1Q2pIOVVMMkFaZCszVVdPRHlPS0lZZXBMWVlIc1VtdTVvdUpMR2lpZlNLT2VETm9Kamo0WExoN2RJTjliCnhpcUtxeTY5Y0szRkN4b2xrSFJ5eFh0cXF6VFdNSW4vNVdnVGUxUUx5TmF1N0ZxY2toNDlaTE9NeHQrL3lVRncKN0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGR1dG9sdWNiWTM4RVZBanFyMm03eFBpNzFYQWljUE5hRAphZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRTUEwR0NTcUcKU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OQppa3VnZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyCkF2SFJBb3NaeTVRNlhrakVHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnoKUjhzcnpKbXdOMGpQNDFaTDljOFBESEl5aDhid1JMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNQpKREdGb3FnQ1dqQkg0ZDFRQjd3Q0NaQUE2MlJqWUpzV3ZJakpFdWJTZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvCk9iOFZaUnpJOW5lV2FncU5kd3ZZa1FzRWpnZmJLYllLN3AyQ05UVVEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gR29sZCBDQSAtIEcyIgojIFNlcmlhbDogMTM0OTI4MTU1NjE4MDY5OTEyODAKIyBNRDUgRmluZ2VycHJpbnQ6IDI0Ojc3OmQ5OmE4OjkxOmQxOjNiOmZhOjg4OjJkOmMyOmZmOmY4OmNkOjMzOjkzCiMgU0hBMSBGaW5nZXJwcmludDogZDg6YzU6Mzg6OGE6Yjc6MzA6MWI6MWI6NmU6ZDQ6N2E6ZTY6NDU6MjU6M2E6NmY6OWY6MWE6Mjc6NjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDYyOmRkOjBiOmU5OmI5OmY1OjBhOjE2OjNlOmEwOmY4OmU3OjVjOjA1OjNiOjFlOmNhOjU3OmVhOjU1OmM4OjY4OjhmOjY0OjdjOjY4OjgxOmYyOmM4OjM1OjdiOjk1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WCkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG4KYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRgpNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUCmQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUMKQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxdDIvOAo3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrCmJicUJISDVDakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2MKNmJNOEs4dnpBUk8vV3MvQnRRcGd2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRQplbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkCk1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSQWlUeXN5YlVhOW9FVmVYQkNzZHQKTURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmRqSWozbzAyeQpNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5CkZHa09wZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGkKYUc1OWplODgzV1gwWGF4Ujd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TQpnSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCCnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjcKbHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybgo4TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92CkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTYKNDVSODhhN0EzaGZtNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6TwpVWXJIVURGdTRVcCtHQzlwV2JZOVpJRXI0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1Ck8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0MKYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtR3U2dUxmdElkeGYrdSt5dgpHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHBtby9hCjc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0MKaGRpRHl5Smt2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMwo5MnFnUW13TE9NN1hkVkF5a3NMZkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwCkxkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3cKWk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWp2aU92cnYxdkErQUNPekIyK2h0dApRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiIKIyBTZXJpYWw6IDU3MDAzODMwNTMxMTc1OTk1NjMKIyBNRDUgRmluZ2VycHJpbnQ6IGUwOjA2OmExOmM5OjdkOmNmOmM5OmZjOjBkOmMwOjU2Ojc1Ojk2OmQ4OjYyOjEzCiMgU0hBMSBGaW5nZXJwcmludDogOWI6YWE6ZTU6OWY6NTY6ZWU6MjE6Y2I6NDM6NWE6YmU6MjU6OTM6ZGY6YTc6ZjA6NDA6ZDE6MWQ6Y2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOjZjOjRkOmEyOmJiOmI5OmJhOjU5OmI2OmYzOjkzOjk3OjY4OjM3OjQyOjQ2OmMzOmMwOjA1Ojk5OjNmOmE5OjhmOjAyOjBkOjFkOmVkOmJlOmQ0OjhhOjgxOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFCkJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVlVM2RwYzNOVGFXZHUKSUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYRFRBMk1UQXlOVEE0TXpJME5sb1hEVE0yTVRBeU5UQTRNekkwTmxvdwpSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZClUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0TjBNdgpGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyCllUN1FiTkhtKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUYKbmJBVmxETGFZUTFIVFdCQ3JwSkg2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSAo2QVRLNzJveGg5VEF0dm1VY1h0blpMaTJrVXBDZTJVdU1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0CmVKTUVMcHlDYlRhcHhERmtINGFEQ3lyME5RcDR5VlhQUWJCSDZUQ2ZtYjVocUFhRXVTaDZYempaRzZrNHNJTi8KYzhIRE8wZ3FnZzhobTdqTXFEWERoQnVEc3o2K3BKVnBBVHFKQUhnRTJjbjBtUm1yVm41Ymk0WTVGWkdrRUN3SgpNb0JnczVQQUtyWVlDNTEralVueUVFcC8rZFZHTHhtU281bW5KcXk3akR6bURyeEhCOXh6VWZGd1pDOEkrYlJICkhUQnNST29wTjRXU2FHYThnemorZXprdTAxRHdIL3RlWUxhcHB2b25RZkdiR0hMeTlZUjBTc2xueEZTdVNHVGYKak5GdXNCM2hCNDhJSHBtY2NlbE0yS1gzUnhJZmRORlJub2J6d3FJalFBdHoyMHVtNTNNR2pNR2c2Y0ZackViNgo1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYQ082SE9TS0dzZzBQV0VQM2NhbElMdjNxMWg4Q0F3RUFBYU9CCnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVUKRjZETndlUkJ0anBiTzh0Rm5iMGN3cGo2aGxnd0h3WURWUjBqQkJnd0ZvQVVGNkROd2VSQnRqcGJPOHRGbmIwYwp3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCmNEb3ZMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUIKQUhQR2dlQW4waTBQNEpVdzRwcEJmMUFzWDE5aVlhbUdhbWtZREhSSjFsMkU2a0ZTR0c5WXJWQldJR3JHdlNocApXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUZrV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5CnhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTDNYV2d3RjE1a0l3YjRGRG0zakgrbUh0d1g2V1EKMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4L3VObmNxQ3h2MXlMNVBxWgpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmFER2k4CmFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlgKZW0xWnFTcVBlOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUgpkQXRxL2dzRC9LTlZWNG4rU3N1dVd4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvCk9NcFhFQTI5TUMvSHBlWkJvTnF1QlllYW9LUmxiRXdKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWSsKaEFobTBzUTJmYWMrRVB5STROU0E1UUM5cXZOT0JxTjZhdmxpY3VNSlQrdWJEZ0VqOForN2ZOemNiQkdYSmJMeQp0R01VMGdZcVo0eUQ5YzdxQjlpYWFoN3M1QXE3S2t6ckNXQTV6c3BpMkM1dQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDMyNzk4MjI2NTUxMjU2OTYzMzI0MzEzODA2NDM2OTgxOTgyMzY5CiMgTUQ1IEZpbmdlcnByaW50OiAwMjoyNjpjMzowMTo1ZTowODozMDozNzo0MzphOTpkMDo3ZDpjZjozNzplNjpiZgojIFNIQTEgRmluZ2VycHJpbnQ6IDMyOjNjOjExOjhlOjFiOmY3OmI4OmI2OjUyOjU0OmUyOmUyOjEwOjBkOmQ2OjAyOjkwOjM3OmYwOjk2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNzpkNToxMDowNjpjNToxMjplYTphYjo2Mjo2NDoyMTpmMTplYzo4Yzo5MjowMTozZjpjNTpmODoyYTplOTo4ZTplNTozMzplYjo0NjoxOTpiODpkZTpiNDpkMDo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWQpNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vClIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXgKTWpjd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNRmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhaVzlVY25WemRDQlFjbWx0WVhKNUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXZyZ1ZlLy9VZkgxbnJZTmtlOGhDVXkzZjlvUUlJR0hXQVZscW5FUVJyKzkyL1pWK3ptRXd1M3FEWHdLOQpBV2JLN2hXTmI2RXduTDJoaFo2VU92TldpQUF4ejlqdWFwWUMyZTBEalB0MWJlZnF1RlVXQlJhYTlPQmVzWWpBClpJVmNGVTJJeDdlNjRIWHByUVU5bmNlSlNPQzdLTWdENFRDVFpGNVN3Rmx3SWpWWGlJcnhsUXFEMTd3eGN3RTAKN2U5R2NlQnJBcWcxY211WG0yYmd5eHg1WDlnYUJHZ2VSd0xtbldEaU5wY0IzODQxa3QrK1o4ZHRkMWs3ajUzVwprQldVdkVJMEVNRTUrYkVuUG43V2luWEZzcStXMDZMZW0rU1l2bjNoNllHdHRtLzgxdzdhNERTd0RScDM1K01JCm1POVkrcHlFdHphdnd0K3MwdlFRQm5CeE5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVMTlZRUVpjVmkvQ1BObUZiU3Z0cjJabkpNNUl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGcHdmeXpkdHpSUDlZWlJxU2ErUzdpcThYRU4zR0hIb09vMEhucDNEd1ExCjZDZVBiSkMva1JZa1JqNUtUczRyRnRVTFVoMzhIMmVpQWtVeFQ4N3orZ09uZVoxVGF0bmFZenI0Z05mVG1lR2wKNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTk5XTXppVW5XbTA3S3grZE9DUUQzMnNmdm1XS1pkN2FWSWw2SwpvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhRmxveHQvbTBjWUFTU0pseWMxcFpVOEZqClVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcxcmlSL2FZTkt4b1UKQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSIKIyBTZXJpYWw6IDY5NTI5MTgxOTkyMDM5MjAzNTY2Mjk4OTUzNzg3NzEyOTQwOTA5CiMgTUQ1IEZpbmdlcnByaW50OiA4YzpjYTpkYzowYjoyMjpjZTpmNTpiZTo3MjphYzo0MToxYToxMTphODpkODoxMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkxOmM2OmQ2OmVlOjNlOjhhOmM4OjYzOjg0OmU1OjQ4OmMyOjk5OjI5OjVjOjc1OjZjOjgxOjdiOjgxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZDo3MjoyZjo4MTphOTpjMToxMzpjMDo3OToxZDpmMTozNjphMjo5Njo2ZDpiMjo2Yzo5NTowYTo5NzoxZDpiNDo2Yjo0MTo5OTpmNDplYTo1NDpiNzo4YjpmYjo5ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSVFORTdWVnlEVjdleEo5Qy9PTjlzcmJUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hIekFkQmdOVgpCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URTNNREF3TURBd1doY05Nell3Ck56RTJNak0xT1RVNVdqQ0JxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWoKTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZRwpBMVVFQ3hNdktHTXBJREl3TURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4SHpBZEJnTlZCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3NvUEQ3Z0ZuVW5NZWt6NTJoV1hNSkVFVU1EU3h1YVBGcwpXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSjFDUmZCc0RNUkpTVWpRSmliK3RhCjNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjcS9nY2ZvbWsKNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNgpTay9LYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKCk5xUjMySHVIVUVUVlBtNHBhZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUApyODdMZXYweGtocHF0dk5HNjFkSVVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVCkRXNUZ2bFhvazlMT0F6L3QyaVd3SFZmTEhqcDJvRXpzVUhib1pISU1wS254dUl2VzFvZUV1ekxsUVJIQWQ5bXoKWUozckc5WFJia1JFcWFZQjdGVmlIWGU0WEk1SVNYeWNPMWNScksxek40NHZlRnlRYUVmWllHRG0vQWM5SWlBWAp4UGNXNmNUWWN2bkljM3pmRmk4VnFUNzlhaWUyb2V0YXVwZ2YxZU5OWkFxZEU4aGh1dlU1SEllNnVMMTdJbi8yCi9xeEFlZVdzRUc4OWp4dDVkb3ZFTjdNaEdJVGxOZ0RyWXlDWnVlbitNd1M3UWNqQkF2bEVZeUNlZ2M1QzA5WS8KTEhiVFk1eFozWSttNFE2Z0xrSDNMcFZIejd6OU0vUDJDMkYrZnBFcmdVZkNKekR1cHhCZE40OWNPU3ZrQlBCNwpqVmFNYUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUiCiMgU2VyaWFsOiAzMzAzNzY0NDE2NzU2ODA1ODk3MDE2NDcxOTQ3NTY3NjEwMTQ1MAojIE1ENSBGaW5nZXJwcmludDogY2I6MTc6ZTQ6MzE6Njc6M2U6ZTI6MDk6ZmU6NDU6NTc6OTM6ZjM6MGE6ZmE6MWMKIyBTSEExIEZpbmdlcnByaW50OiA0ZTpiNjpkNTo3ODo0OTo5YjoxYzpjZjo1Zjo1ODoxZTphZDo1NjpiZTozZDo5Yjo2Nzo0NDphNTplNQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6Y2Y6YWI6N2U6NDM6Yzg6ZDg6ODA6ZDA6NmI6MjY6MmE6OTQ6ZGU6ZWU6ZTQ6YjQ6NjU6OTk6ODk6YzM6ZDA6Y2E6ZjE6OWI6YWY6NjQ6MDU6ZTQ6MWE6Yjc6ZGYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUwekNDQTd1Z0F3SUJBZ0lRR05yUm5pWjk2THRLSVZqTnpHczdTakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKeWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFcKWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNUlDMGdSelV3SGhjTk1EWXhNVEE0TURBd01EQXdXaGNOTXpZd056RTJNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZKQWdJS1hvMQpubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLemovaTVWYmV4CnQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXoKU2RoRFkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRRwpCTytRdWVRQTVOMDZ0Um4vQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrCnJDcFN4NC9WQkVua2pXTkhpRHhwZzh2K1I3MHJmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC8KTkllV2l1NVQ2Q1VWQWdNQkFBR2pnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXdIekFICkJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnkKYVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZIL1RaYWZDM2V5NzhEQUo4ME01K2dLdgpNekV6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDVEpFb3dYMkxQMkJxWUx6M3EzSmt0dlhmMnBYa2lPT3pFCnA2QjRFcTFpRGtWd1pNWG5sMll0bUFsK1g2L1d6Q2hsOGdHcUNCcEgzdm41ZkpKYUNHa2dEZGsrYlc0OERXN1kKNWdhUlFCaTUrTUh0Mzl0QnF1Q1dJTW5OWkJVNGdjbVU3cUtFS1FzVGI0N2JETjBsQXR1a2l4bEUwa0Y2QldsSwpXRTlneW42Q2Fnc0NxaVVYT2JYYmYrZUVaU3FWaXIyRzNsNkJGb010RU16ZS9haUNLbTBvSHcwTHhPWG5HaVlaCjRmUVJieEMxbGZ6blFnVXkyODZkVVY0b3RwNkYwMXZ2cFgxRlFIS090dzVyRGdiN016VkljYmlkSjR2RVpWOE4KaG5hY1JIcjJsVnoyWFRJSU02UlV0aGcvYUZ6eVFrcUZPRlNEWDlIb0xQS3NFZGFvN1dOcQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZVRydXN0IENBIgojIFNlcmlhbDogMTcxOTk3NzQ1ODkxMjUyNzc3ODgzNjI3NTcwMTQyNjY4NjIwMzIKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjMyOmMzOmE3OjZkOjI1OjU3OmM3OjY4OjA5OjlkOmVhOjJkOmE5OmEyOmQxCiMgU0hBMSBGaW5nZXJwcmludDogODc6ODI6YzY6YzM6MDQ6MzU6M2I6Y2Y6ZDI6OTY6OTI6ZDI6NTk6M2U6N2Q6NDQ6ZDk6MzQ6ZmY6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYxOmMxOmI1OjBhOmU1OmEyOjBkOmQ4OjAzOjBlOmM5OmY2OmJjOjI0OjgyOjNkOmQzOjY3OmI1OjI1OjU3OjU5OmI0OmU3OjFiOjYxOmZjOmU5OmY3OjM3OjVkOjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKRnpBVkJnTlZCQU1URGxObFkzVnlaVlJ5ZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJegpNVEU1TkRBMU5Wb3dTREVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52CmNuQnZjbUYwYVc5dU1SY3dGUVlEVlFRREV3NVRaV04xY21WVWNuVnpkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUt1a2dlV1Z6ZlgyRkk3Q1Q4clU0bmlWV0p4QjRRMlpRQ1FYT1pFegpadW0rNFlPdllseUowZndrVzJHejRCRVJRUndkYnZDNHUvamVwNEc2cGtqR254Mjl2bzZwUVQ2NGxPMHBHdFNPCjBnTWRBKzl0RFdjY1Y5Y0dyY3JJOWY0T3IyWWxTQVNXQzEyanVoYkRDRS9SUnZnVVhQTElYZ0daYmYySXpJYW8Kd1c4eFFteFNQbWpMOHhrMDM3dUhHRmFBSnNUUTNNQnYzOTZnd3BFV29HUVJTMFM4SHZibittUGVacXgycEhHago3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYjAxay91bks4UkNTYzQzT3o5NjlYTDBJbW5hbDB1Z0JTCjhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1IdXJzQ0F3RUFBYU9CblRDQm1qQVQKQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnCkpZWWphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0MKTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0Mwo2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1U2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvCjNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGZtYng4SVZRcjVGaWl1MWNwcnA2cG94a20KRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWm5NVUZkQXZuWnlQUwpDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmUgR2xvYmFsIENBIgojIFNlcmlhbDogOTc1MTgzNjE2NzczMTA1MTU1NDIzMjExOTQ4MTQ1Njk3ODU5NwojIE1ENSBGaW5nZXJwcmludDogY2Y6ZjQ6Mjc6MGQ6ZDQ6ZWQ6ZGM6NjU6MTY6NDk6NmQ6M2Q6ZGE6YmY6NmU6ZGUKIyBTSEExIEZpbmdlcnByaW50OiAzYTo0NDo3Mzo1YTplNTo4MTo5MDoxZjoyNDo4Njo2MTo0NjoxZTozYjo5YzpjNDo1ZjpmNTozYToxYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDI6MDA6ZjU6MDQ6M2E6Yzg6NTk6MGU6YmI6NTI6N2Q6MjA6OWU6ZDE6NTA6MzA6Mjk6ZmI6Y2I6ZDQ6MWM6YTE6YjU6MDY6ZWM6Mjc6ZjE6NWE6ZGU6N2Q6YWM6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4Ck1qTXhNVGsxTWpBMldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWcKUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdk5TN1lyR3hWYVFaeDVSTm9KTE5QMk13aFIvanhZRGlKCmlRUHB2ZXBlUmxNSjNGejFXdWozUlNvQzZ6RmgxeWt6VE03SGZBbzNmZys2TXBqaEhaZXZqOGZjeVRpVzg5c2EKL0ZIdGFNYlFicVI4Sk5HdVFzaVdVR011NFA1MS9waW5YMGt1bGVNNU0yU09IcVJma05KblBMTFova0c1VmFjSgpqbklGSG92ZFJJV0NRdEJKd0IxZzhORVhMSlhyOXFYQmtxUEZ3cWNJWUExZ0JCQ1dlWjRXTk9hcHR2b2xSVG5JCkhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWSERHQTc2b1lhOEo3MTlyTytUTWcxZlc5YWpNdGdRVDcKc0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkwWFBuajNwREFnTUJBQUdqZ1owdwpnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3cKS2FBbm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzRwpBUVFCZ2pjVkFRUURBZ0VBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMClVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNitPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE8KSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbQpJNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81M0NZTnY2WkhkQWJZCmlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTA0MzUwNTEzNjQ4MjQ5MjMyOTQxOTk4NTA4OTg1ODM0NDY0NTczCiMgTUQ1IEZpbmdlcnByaW50OiA1Yzo0ODpkYzpmNzo0Mjo3MjplYzo1Njo5NDo2ZDoxYzpjYzo3MTozNTo4MDo3NQojIFNIQTEgRmluZ2VycHJpbnQ6IDY2OjMxOmJmOjllOmY3OjRmOjllOmI2OmM5OmQ1OmE2OjBjOmJhOjZhOmJlOmQxOmY3OmJkOmVmOjdiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYzoyYzpkNjozZDpmNzo4MDo2ZjphMzo5OTplZDplODowOToxMTo2Yjo1Nzo1YjpmODo3OTo4OTpmMDo2NToxODpmOTo4MDo4Yzo4NjowNTowMzoxNzo4YjphZjo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUhUQ0NBd1dnQXdJQkFnSVFUb0V0aW9KbDRBc0M3ajQxQWtibFBUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4SnpBbEJnTlYKQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXlNREV3TURBdwpNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNCTVNSM0psCllYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRFQwMVAKUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzClVjRWJWQVNZMDZtL3dlYUtYVHVIKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkKMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3d4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOApRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVjRFYWpjTnhvMmY4RVNJbDMzclhwCisyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBMUtHenFTWCsKRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1TwpuS1ZJckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmcKUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbU52Ylc5a2IyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dQpRWFYwYUc5eWFYUjVMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZClNkT0g1RU9DNnovSnF2V290ZTlWZkNGU1pmblZEZUZzOUQ2TWszT1JMZ0xFVGdkeGI4Q1BPR0VJcUI2QkNzQXYKSUM5Qmk1SGNTRVc4OGNiZXVuWnJNOGdBTFRGR1RPM25uYytJbFA4endGYm9KSVltdU5nNE9OOHFhOTBTek1jLwpSeGRNb3NJR2xnblcyLzQvUEVaQjMxamlWZzg4TzhFY2t6WFpPRktzN3Nqc0xqQk9sRFcwSkI5TGVHbmE4Z0k0CnpKVlNrL0J3SlZtY0lHZkU3dm1MVjJIMGtuWjlQNFNOVmJmbzVhelY4ZlVaVnFaYSs1QWNyNVByNVJ6VVo1ZGQKQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOKzhjRmR1UFlTbzM4TkJlanhpRW92akJGTVI3SGVMNVlZVGlzTytJQgpaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBTdWJqZWN0OiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBMYWJlbDogIk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjY5NzkxNTE1MjkzNzQ5NzQ5MDQzNzU1NjM4NjgxMjQ4NzkwNAojIE1ENSBGaW5nZXJwcmludDogZDM6ZjM6YTY6MTY6YzA6ZmE6NmI6MWQ6NTk6YjE6MmQ6OTY6NGQ6MGU6MTE6MmUKIyBTSEExIEZpbmdlcnByaW50OiA3NDpmODphMzpjMzplZjplNzpiMzo5MDowNjo0Yjo4Mzo5MDozYzoyMTo2NDo2MDoyMDplNTpkZjpjZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6ZjA6YmE6MDA6YTM6YWM6N2E6ZjM6YWM6ODg6NGM6MDc6MmI6MTA6MTE6YTA6Nzc6YmQ6Nzc6YzA6OTc6ZjQ6MDE6NjQ6YjI6Zjg6NTk6OGE6YmQ6ODM6ODY6MGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdQpNVEF3TGdZRFZRUURFeWRPWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwCmRIa3dIaGNOTURZeE1qQXhNREF3TURBd1doY05Namt4TWpNeE1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011TVRBd0xnWURWUVFERXlkTwpaWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURrdkg2U01HM0cySTRyQzd4R3p1QW5sdDdlK2ZvUzB6d3oKYzdNRUw3eHhqT1dmdGlKZ1BsOWR6Z24vZ2d3Ym1sRlFHaWFKM2RWaFhSbmNFZzh0Q3FKRFhSZlFOSklnNm5QUApPQ3dHSmdsNmN2ZjZVREw0d3BQVGFhSWp6a0d4ek9UVkh6YlJpanI0akdQaUZGbHA3UTNUZjJ2b3VBUGxUMnJsCm1HTnBTQVcrTHY4enR1bVhXV240WnhtdWsyR1dSQlhUY3JBL3ZHcDk3RWgvamNPcnFuRXJVMmxCVXpTMXNMbkYKQmdyRXNFWDFRVjF1aVVWN1BUc21qSFRDNWRMUmZiSVIxUHRZTWlLYWdNbmMvUXpwZjE0RGw4NDdBQlNISjNBNApxWTV1c3lkMm1GSGdCZU1ocXhyVmhTSThLYldhRnNXQXFQUzdhekNQTDBZQ29yRU1JdURUQWdNQkFBR2pnWmN3CmdaUXdIUVlEVlIwT0JCWUVGQ0V3eWZzQTEwNlkyb2VxS3RDbkxyRkFNYWRNTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUZJR0ExVWRId1JMTUVrd1I2QkZvRU9HUVdoMGRIQTZMeTlqY213dQpibVYwYzI5c2MzTnNMbU52YlM5T1pYUjNiM0pyVTI5c2RYUnBiMjV6UTJWeWRHbG1hV05oZEdWQmRYUm9iM0pwCmRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDN3Jrdm50MWZyZjZvdHQzTkhoV3JCNUtVZDVPYzgKNmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UTRMcUlMUHhGekJpd21aVlJEdXdkdUlqLwpoMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvR0dVc3lmSmo0YWtICi9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITgpwR3hsYUtGSmRseER5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNDE1NzgyODM4NjcwODY2OTI2MzgyNTY5MjE1ODk3MDc5MzgwOTAKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjYyOmZmOjc0OjlkOjMxOjUzOjVlOjY4OjRhOmQ1Ojc4OmFhOjFlOmJmOjIzCiMgU0hBMSBGaW5nZXJwcmludDogOWY6NzQ6NGU6OWY6MmI6NGQ6YmE6ZWM6MGY6MzE6MmM6NTA6YjY6NTY6M2I6OGU6MmQ6OTM6YzM6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjkzOjkyOjdhOjA2OjE0OjU0Ojk3Ojg5OmFkOmNlOjJmOjhmOjM0OmY3OmYwOmI2OjZkOjBmOjNhOmUzOmEzOmI4OjRkOjIxOmVjOjE1OmRiOmJhOjRmOmFkOmM3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaVRDQ0FnK2dBd0lCQWdJUUgwZXZxbUlBY0ZCVVRBR2VtMk9aS2pBS0JnZ3Foa2pPUFFRREF6Q0JoVEVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVApJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd016QTJNREF3Ck1EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHkKWldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TgpUMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1IKRnRTcllwbjFQbElMQnM1QkFIK1g0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSgpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaXd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXCkJCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkdGQWtLK3FEbQpmUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2CkdEZUFVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EiCiMgU2VyaWFsOiA4NjcxODg3Nzg3MTEzMzE1OTA5MDA4MDU1NTkxMTgyMzU0ODMxNAojIE1ENSBGaW5nZXJwcmludDogYmM6NmM6NTE6MzM6YTc6ZTk6ZDM6NjY6NjM6NTQ6MTU6NzI6MWI6MjE6OTI6OTMKIyBTSEExIEZpbmdlcnByaW50OiA1OToyMjphMTplMTo1YTplYToxNjozNToyMTpmODo5ODozOTo2YTo0Njo0NjpiMDo0NDoxYjowZjphOQojIFNIQTI1NiBGaW5nZXJwcmludDogNDE6Yzk6MjM6ODY6NmE6YjQ6Y2E6ZDY6Yjc6YWQ6NTc6ODA6ODE6NTg6MmU6MDI6MDc6OTc6YTY6Y2I6ZGY6NGY6ZmY6Nzg6Y2U6ODM6OTY6YjM6ODk6Mzc6ZDc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ4VENDQXRtZ0F3SUJBZ0lRUVQxeXgvUnJINEZEZmZIU0tGVGZtakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKaWpFTE1Ba0dBMVVFQmhNQ1EwZ3hFREFPQmdOVkJBb1RCMWRKVTJWTFpYa3hHekFaQmdOVkJBc1RFa052Y0hseQphV2RvZENBb1l5a2dNakF3TlRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sClpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhRU0JEUVRBZUZ3MHcKTlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEVlFRR0V3SkRTREVRTUE0RwpBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXdJQVlEClZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlgKU1ZObFMyVjVJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF5MCt6QUpzOU50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSClZWdXVrK2czL3l0cjZkVHF2aXJkcUZFcjEyYkRZVnhnQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjIKdzkzTnZLU0x0WmxodUFHaW85Uk4xQVU5a2EzNHRBaHhaSzl3OFJ4cmZ2YkRkNTBrYzN2a0RJemgyVGJobVlzRgptUXZ0UlRFSnlzSUEyL2R5b0phcWxZZlFqc2UyWVhNTmRtYU0zQnUwWTZLZmY1TVRNUEdoSjl2Wi95eFZpSkdnCjRFOEhzQ2hXakJnYmwwU09pZDNnRjI3bkt1K1BPUW94aElMWVFCUkpMbnBCNUtmKzQyVE13Vmx4U3l3aHAxdDkKNEIzUkxvR2J3OWhvOTcyV0c2eHdzUllVQzl0Z3VTWUJCUUlEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVzd04rcmphOHNIblIzSlFtdGhHK0liSnBocFF3CkVBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFdWgvd3VIYnJQNXdVT3gKU1BNb3dCMHV5UWxCK3BRQUhLU2txMGxQanowZTcwMXZ2YnlrOXZJbU1Na1F5aDJJKzNRWkg0VkZ2YkJzVWZrMgpmdHYxVERJNlFVOWJSOC9vQ3kyMnhCbWRkTVZIeGp0cUQ2d1UyenowYzV5cEJkOEEzSFI0K3ZnMVlGa0NFeGg4CnZQdE5zQ0J0UTd0Z01IcG5NMXpGbWRINExUbFNjL3VNcXBjbFhITFpDQjZyVGp6amdUR2ZBNmI3d1A0cGlGWGEKaE5WUUE3YmloS09tTnFvUk9nSGhHRXZXUkdpelBmbFRkSVN6UnBGR2xnQzNnQ3kyNGVNUTR0dWk1eWlQQVpaaQpGajRBNHh5bE5vRVlva3hTZHNBUm8yN21IYnJqV3I0MlU4VStkWStHYVNsWVU3V2N1MitmWE1VWTdOMHY0WmpKCi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIFN1YmplY3Q6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgTGFiZWw6ICJDZXJ0aWduYSIKIyBTZXJpYWw6IDE4MzY0ODAyOTc0MjA5MzYyMTc1CiMgTUQ1IEZpbmdlcnByaW50OiBhYjo1NzphNjo1Yjo3ZDo0Mjo4MjoxOTpiNTpkODo1ODoyNjoyODo1ZTpmZDpmZgojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOjJlOjEzOjYzOjQ1Ojg2OmE0OjZmOjFhOmIyOjYwOjY4OjM3OjU4OjJkOmM0OmFjOmZkOjk0Ojk3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzpiNjphMjpkYjoyZTpkNzpjZTo0ODo4NDoyZjo3YTpjNTozMjo0MTpjNzpiNzoxZDo1NDoxNDo0YjpmYjo0MDpjMToxZjozZjoxZDowYjo0MjpmNTplZTphMToyZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVgpCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYCkRUQTNNRFl5T1RFMU1UTXdOVm9YRFRJM01EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVEKQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3FYT0VtN1JGSFllR2lmQlo0ClFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SEd4bnkKZ1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhidwp6QmZzVjEvcG9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRCjEzMHlHTE1MTEdxL2pqOFVFWWtnRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjIKSnNnbHJnVkt0T2RqTFBPTUZsTitYUHNSR2dqQlJtS2ZJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2JrdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkV3ClpBWURWUjBqQkYwd1c0QVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkdoT0tRMk1EUXhDekFKQmdOVkJBWVQKQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhnZ2tBL3R6agpBUS9KU1A4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFoUU1la25IMlFxL2hvMkdlNi9QQUQvS2wxTnFWNXRhK2FEWTlmbTRmVElydjBROGgKYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzK0ltdmFZUzUvMUhJOTNURGhIa3hBR1l3UDE1elJnekI3bUZuYwpmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1UEJTMXhwODFIbERRd1k5cWNFUUNZc3V1CkhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkxZ2tJbDJQbHdTNncKdDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDM4CiMgTUQ1IEZpbmdlcnByaW50OiA3NDowMTo0YTo5MTpiMTowODpjNDo1ODpjZTo0NzpjZDpmMDpkZDoxMTo1MzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDg1OmE0OjA4OmMwOjljOjE5OjNlOjVkOjUxOjU4OjdkOmNkOmQ2OjEzOjMwOmZkOjhjOmRlOjM3OmJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjoxOToxYTo1MDpkMDpjMzo5Nzo3Zjo3ZDphOTo5YjpjZDphYTpjODo2YToyMjo3ZDphZTpiOTo2Nzo5ZTpjNzowYjphMzpiMDpjOTpkOToyMjo3MTpjMTo3MDpkMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFYwpNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqCklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkIKSURJd0hoY05PVGt3TnpBNU1USXhNVEF3V2hjTk1Ua3dOekE1TWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRQpSVEVjTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsClUyVmpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTAKSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDckM2TTE0SXNwRkxFVQpoYTg4RU9RNWJ6VmRTcTdkNm1HTmxVbjBiMlNqR21CbXBLbEFJb1RaMUtYbGVKTU9hQUd0dVUxY09zN1R1S2hDClFOL1BvN3FDV1dxU0c2d2NtdG9JS3lVbitXa2pSL0hnNnl4Nm0vVVRBdEIrTkh6Q25qd0FXYXYxMmd6MU1qd3IKckZEYTFzUGVnNVRLcUF5Wk1nNElTRlpiYXZ2YTRWaFlBVWxmY2tFOEZRWUJqbDJ0cXJpVHRNMmU2NmZvYWkxUwpOTnM2NzF4MVVkcmI4ekg1N25HWU1zUlVGVVFNK1p0VjdhM2ZHQWlnbzRhS1NlNVRCWThaVE5YZVdIbWIwbW9jClFxdkYxYWZQYUErVzVPRmhtSFpoeUpGODFqNEE0cEZRaCtHZEN1YXRsOUlkeGpwOXk3emFBelRWamxzQjlXb0gKdHhhMmJrcC9BZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlF4dzNrYnV2VlQxeGZnaVhvdEYyd0tzeXVkTXpBUApCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFsR1JaclRsazV5bnJFLzVhdzRzVFY4Z0VKUEIwZDhCZzQyZjc2WW1tZzcrV2dueHUxTU05NzU2QWJyc3AKdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeXpoZnpMTWRpTmxYaUl0aUpWYlNZU0twayt0WWNOdGhFZUZwYQpJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4clo3L2dGbmttMFcwOWp1d3pUa1ptRExsCjZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEdkeWQxTHgrNGl2bisKeGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgU3ViamVjdDogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIExhYmVsOiAiQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdCIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4Nzc0ODQzNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDcyOmU0OjRhOjg3OmUzOjY5OjQwOjgwOjc3OmVhOmJjOmUzOmY0OmZmOmYwOmUxCiMgU0hBMSBGaW5nZXJwcmludDogNWY6NDM6ZTU6YjE6YmY6Zjg6Nzg6OGM6YWM6MWM6Yzc6Y2E6NGE6OWE6YzY6MjI6MmI6Y2M6MzQ6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OjBhOmRmOjAwOjYzOmU5OjYzOjU2Ojc1OjBjOjI5OjY1OmRkOjBhOjA4OjY3OmRhOjBiOjljOmJkOjZlOjc3OjcxOjRhOmVhOmZiOjIzOjQ5OmFiOjM5OjNkOmEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHCkExVUVDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmgKYkNCU2IyOTBNQjRYRFRBMk1USXhOVEE0TURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRQpDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTCmIyOTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQStNaTh2UlJRWmhQLzhOTjUKN0NQeXR4ckhqb1h4RW5PbUdhb1EyNXlpWlhSYWR6NVJmVmIyM0NPMjFPMWZXTEUzVGRWSkRtNzFhb2ZXMG96UwpKOGJpL3phZm1HV2dFMDdHS21TYjFaQVN6eFFHOUR2ajFDaSs2QTc0cTA1SWxHMk9sVEVRWE8yaUxiM1ZPbTJ5CkhMdGd3RVpMQWZWSnJuNUdpdEIwamFFTUFzN3UvT2VQdUd0bTgzOUVBTDltSlJRcjNSQXdIUWVXUDAzMmE3aVAKdDNzTXBUanIza2ZiMVYwNS9JaW44OWNxZFBIb1dxSTduMUM2cG94Rk5jSlFaWlhjWTRMdjNiOTNUWnhpeVdOegpGdEFwRDBtcFNQQ3pxcmRzeGFjd09VQmRyc1RpWFNaVDhNNGNJd2hocUpRWnVnUmlRT3dmT0hCM0VnWnhwekFZClhTVW5wUUlEQVFBQm80R2xNSUdpTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUIwR0ExVWREZ1FXQkJTMkNIc05lc3lzSUV5R1ZqSmV6NnR1aFMxd1Z6QS9CZ05WSFI4RU9EQTJNRFNnTXFBdwpoaTVvZEhSd09pOHZkM2QzTWk1d2RXSnNhV010ZEhKMWMzUXVZMjl0TDJOeWJDOWpkQzlqZEhKdmIzUXVZM0pzCk1COEdBMVVkSXdRWU1CYUFGTFlJZXcxNnpLd2dUSVpXTWw3UHEyNkZMWEJYTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQlc3d29qb0ZST2xaZkorSW5hUmNIVW93QWw5QjhUcTdlamhWaHB3akN0MkJXS0xlUEp6WUZhK0hNagpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpNU1YekxxWFpJK080VGtvZ3AyNENKSjhpWUdkN2l4MXlDY1V4ClhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDJoTzBqOW4wSHEwViswOSt6dittS3RzMm8Kb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVFgzRUpJcmR1UHVvYwpBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogImVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI4OTU2MDg4NjgyNzM1MTg5NjU1MDMwNTI5MDU3MzUyNzYwNDc3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjoyZTowMDpjYToyNjowNjo5MDozZDphZDpmZTo2ZjoxNTo2ODpkMzo2YjpiMwojIFNIQTEgRmluZ2VycHJpbnQ6IDY3OjY1OjBkOmYxOjdlOjhlOjdlOjViOjgyOjQwOmE0OmY0OjU2OjRiOmNmOmUyOjNkOjY5OmM2OmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMDphNjpmNDpkYzo2MzphMjo0YjpmZDpjZjo1NDplZjoyYTo2YTowODoyYTowYTo3MjpkZTozNTo4MDozZToyZjpmNTpmZjo1Mjo3YTplNTpkODo3MjowNjpkZjpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZQpNUXN3Q1FZRFZRUUdFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwClpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14TWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNdwpJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXFNQ2dHQTFVRUN3d2haVkJMClNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSApTeVpiQ1VOc0laNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoCmlqSHlsM1NKQ1JJbUhKN0syUktpbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1gKRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXZxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMQpUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWDEycnVPempqSzlTWERya2I1d2RKCmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPV1FxcmFmZkEKc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VQpXSDErRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTCm5UMElGYVVRQVMyek1uYW9sUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEgKZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5L3Z2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcApOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpWm8xakRpVk4xUm15NW5rM3B5S2RWREVDCkF3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWlNQXdHQTFVZEV3UUYKTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCCnV2bDJJQ08xSjJCMDFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWwKUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUApKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFZ4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvCmdwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUE5YdWJyamxwQzJKZ1FDQTIKajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyR05tNgo1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCCm8yTTNJVXhFeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMKL2pRNmZianBLZHgycWNndytCUnhnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyegpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeXNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFClc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9EQkNFSVo0M3lna25RVy8yeHpRK0QKaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgU3ViamVjdDogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgTGFiZWw6ICJjZXJ0U0lHTiBST09UIENBIgojIFNlcmlhbDogMzUyMTAyMjcyNDkxNTQKIyBNRDUgRmluZ2VycHJpbnQ6IDE4Ojk4OmMwOmQ2OmU5OjNhOmZjOmY5OmIwOmY1OjBjOmY3OjRiOjAxOjQ0OjE3CiMgU0hBMSBGaW5nZXJwcmludDogZmE6Yjc6ZWU6MzY6OTc6MjY6NjI6ZmI6MmQ6YjA6MmE6ZjY6YmY6MDM6ZmQ6ZTg6N2M6NGI6MmY6OWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVhOmE5OjYyOmM0OmZhOjRhOjZiOmFmOmViOmU0OjE1OjE5OjZkOjM1OjFjOmNkOjg4OjhkOjRmOjUzOmYzOmZhOjhhOmU2OmQ3OmM0OjY2OmE5OjRlOjYwOjQyOmJiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlET0RDQ0FpQ2dBd0lCQWdJR0lBWUZGbkFDTUEwR0NTcUdTSWIzRFFFQkJRVUFNRHN4Q3pBSkJnTlZCQVlUCkFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkQKUVRBZUZ3MHdOakEzTURReE56SXdNRFJhRncwek1UQTNNRFF4TnpJd01EUmFNRHN4Q3pBSkJnTlZCQVlUQWxKUApNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SUpVcU90ZHUwS0J1cVY1RG8KMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhIcmZBUQpVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkClJkWTR6VFcyc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1EKT0E3K2oweGJtMGJxUWZXd0NIVEQwSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dgpKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0M0FBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDCkF3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBY1l3SFFZRFZSME8KQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUErMGh5SgpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZCk1uUThTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1oKNDRneCtGa2FnUW5JbDZaMHgyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SQpKZDFoSnlNY3RURUhCRGEwR3BDOW9IUnhVSWx0dkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053CmkvbkRoRHdUcW42U20xZFRrL3B3d3BFT01mbWJaMTNwbGpoZVg3TnpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE4KOXU2d1drNUpSRlJZWDBLRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjg4MDkxMDU3Njk5Mjg1NjQzMTM5ODQwODUyMDk5NzU4ODU1OTkKIyBNRDUgRmluZ2VycHJpbnQ6IGI1OmU4OjM0OjM2OmM5OjEwOjQ0OjU4OjQ4OjcwOjZkOjJlOjgzOmQ0OmI4OjA1CiMgU0hBMSBGaW5nZXJwcmludDogMDM6OWU6ZWQ6Yjg6MGI6ZTc6YTA6M2M6Njk6NTM6ODk6M2I6MjA6ZDI6ZDk6MzI6M2E6NGM6MmE6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI0Ojc4OmI4OjEyOjI1OjBkOmY4Ojc4OjYzOjVjOjJhOmE3OmVjOjdkOjE1OjVlOmFhOjYyOjVlOmU4OjI5OjE2OmUyOmNkOjI5OjQzOjYxOjg4OjZjOmQxOmZiOmQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEL2pDQ0F1YWdBd0lCQWdJUUZheHVsQm15ZVV0QjlpZXB3eGdQSHpBTkJna3Foa2lHOXcwQkFRc0ZBRENCCm1ERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1QKTUNoaktTQXlNREE0SUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cwplVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlU0F0SUVjek1CNFhEVEE0TURRd01qQXdNREF3TUZvWERUTTNNVEl3TVRJek5UazFPVm93Z1pneEN6QUoKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3T0NCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwCkJnTlZCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU56aVhtSllIVE5YT1RJegordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1aksvQkd2RVN5aWFIQUtBeEpjQ0dWbjJUQXBwTVNBbVVtCmhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFYzVJaWFhY0RpR3lkWThoUzJwZ24KNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0NJU2h3aVAvVwpKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMCkRtS3VkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkMKaHVPbDFVY0NBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpIUVlEVlIwT0JCWUVGTVI1eW82aFRnTWRITnhyMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCCkFRQXR4UlBQVm9CN2VuaTluNjRzbWVmdjJ0K1VYZ2xwcCtkdWFJeTljcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEIKelU2QjhBOEV4Q1N6TkpiR3Bxb3czMmhoYzlmNWpvV0o3dzVlbFNoS0tpZVBFSTR1ZkliRUFwN2FESGRsRGtRTgprdjM5c3hZMitoRU5IWXdPQjRscUtWYjNjdlRkRlp4M05XWlhxeE5UMkk3QlFNWFhFeFphY3NlM2FRSEVlckdECkFXaDlqVUdobEJqQkpWejg4UDZEQW9kOERRM1BMZ2hjU2tBTlB1eUJZZVlrMjhyZ0RpMEhzajVXM0kzMVFZVUgKU0pzTUM4dEpQMzNzdC8zTGpXZUpHcXZ0dXg2akFBZ0lGeXFDWERGZFJvb3RENGFiZE5sRis5UkFzWHFxYUMyRwpzcGtpNGNFcng1ejQ4MStvZ2hMckdSRXQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogNzE3NTgzMjA2NzI4MjU0MTAwMjA2NjE2MjEwODUyNTY0NzI0MDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjlkOmVhOjYwOjI0OmM0OmZkOjIyOjUzOjNlOmNjOjNhOjcyOmQ5OjI5OjRmCiMgU0hBMSBGaW5nZXJwcmludDogYWE6ZGI6YmM6MjI6MjM6OGY6YzQ6MDE6YTE6Mjc6YmI6Mzg6ZGQ6ZjQ6MWQ6ZGI6MDg6OWU6ZjA6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjMxOjBkOjUwOmFmOjE4OmE2OjQ0OjcxOjkwOjM3OjJhOjg2OmFmOmFmOjhiOjk1OjFmOmZiOjQzOjFkOjgzOjdmOjFlOjU2Ojg4OmI0OjU5OjcxOmVkOjE1OjU3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaURDQ0FnMmdBd0lCQWdJUU5md21YTm1FVDhrOUpqMVhtNjdYVmpBS0JnZ3Foa2pPUFFRREF6Q0JoREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFNE1EWUdBMVVFQ3hNdktHTXAKSURJd01EY2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaQpCZ05WQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE1qQWVGdzB3TnpFeE1EVXdNREF3Ck1EQmFGdzB6T0RBeE1UZ3lNelU1TlRsYU1JR0VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGgKZDNSbExDQkpibU11TVRnd05nWURWUVFMRXk4b1l5a2dNakF3TnlCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZwpZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2CmRDQkRRU0F0SUVjeU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFb3RXY2dudVZuZkZTZUlmK2loYS8KQmViZm93SlBEUWZHQUZHNkRBSlNMU0trUWpuRS9vL3F5Y0crMUUzL24zcWU0ckY4bXEybmhnbHpoOUhubXVONgpwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNTgvc0l4cEhSK3ltVm8wSXdRREFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVbXRnQU1BRG5hMytGR082THRzNksKRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU5HNGs4VklaMwpLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94ClhaM0tycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEyNzYxNDE1NzA1NjY4MTI5OTgwNTU1NjQ3NjI3NTk5NTQxNDc3OQojIE1ENSBGaW5nZXJwcmludDogZmI6MWI6NWQ6NDM6OGE6OTQ6Y2Q6NDQ6YzY6NzY6ZjI6NDM6NGI6NDc6ZTc6MzEKIyBTSEExIEZpbmdlcnByaW50OiBmMTo4Yjo1Mzo4ZDoxYjplOTowMzpiNjphNjpmMDo1Njo0Mzo1YjoxNzoxNTo4OTpjYTpmMzo2YjpmMgojIFNIQTI1NiBGaW5nZXJwcmludDogNGI6MDM6ZjQ6NTg6MDc6YWQ6NzA6ZjI6MWI6ZmM6MmM6YWU6NzE6Yzk6ZmQ6ZTQ6NjA6NGM6MDY6NGM6ZjU6ZmY6YjY6ODY6YmE6ZTU6ZGI6YWE6ZDc6ZmQ6ZDM6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lRWUFHWHQwYW42clMwbXRaTEwvZVErekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKcmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EZ2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaUJnTlYKQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE16QWVGdzB3T0RBME1ESXdNREF3TURCYQpGdzB6TnpFeU1ERXlNelU1TlRsYU1JR3VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGhkM1JsCkxDQkpibU11TVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpJRVJwZG1semFXOXUKTVRnd05nWURWUVFMRXk4b1l5a2dNakF3T0NCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbApaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2ZENCRFFTQXRJRWN6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc3I4bkxQdmIyRnZkZUhzYm5uZG0KZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXRQMExNcW1zeXdDUExMRUhkNU4vOApZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQytCc1VhMExmCmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzkKOWlyWTdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyUwp6aGtHY3VZTVhEaHB4d1RXdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrCk9RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVVyV3lxbEdDYzdlVC8rajRLZEN0akEvZTJXYjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUJwQQoySlZsckFtU2ljWTU5QkRscVE1bVUxMTQzdm9ra2J2blJGSGZ4aFkwQ3U5cVJGSHFLd2VLQTNyRDZ6OEtMRklXCm9DdER1U1dRUDNDcE15VnRSUm9vT3lmUHFzTXBRaHZmTzB6QU16UmJRWWkvYXl0bHJ5anZzdlhEcW1iT2UxYnUKdDhqTFo4SEpuQm9ZdU1URFNRUHhZQTVRelViRjgzZDU5N1lWNERqYnh5OG9vQXcvZHlaMDJTVVMyakhhR2g3YwpLVUdSSWp4cHA3c0M4clpjSndPSjlBYnFtK1J5Z3VPaENjSHBBQm5UUHRSd2E3cHhwcXBZcnZTNzZXeTI3NGZNCm03di9PZVpXWWRNS3A4UmNUR0I3QlhjbWVyL1lCMUlzWXZkd1k5azV2Rzhjd25uY2RpbXZ6c1VzWkFSZWlEWnUKTWRSQUdtSTBOajgxQWE2c1k2QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDgwNjgyODYzMjAzMzgxMDY1NzgyMTc3OTA4NzUxNzk0NjE5MjQzCiMgTUQ1IEZpbmdlcnByaW50OiAwMTo1ZTpkODo2YjpiZDo2ZjozZDo4ZTphMTozMTpmODoxMjplMDo5ODo3Mzo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOjE3Ojg0OmQ1OjM3OmYzOjAzOjdkOmVjOjcwOmZlOjU3OjhiOjUxOjlhOjk5OmU2OjEwOmQ3OmIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZTpkYjo3YTpjNDozYjo4MjphMDo2YTo4Nzo2MTplODpkNzpiZTo0OTo3OTplYjpmMjo2MToxZjo3ZDpkNzo5YjpmOToxYzoxYzo2Yjo1Njo2YToyMTo5ZTpkNzo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3JqQ0NBaldnQXdJQkFnSVFQTEwwU0FvQTR2N3JKRHRlWUQ3RGF6QUtCZ2dxaGtqT1BRUURBekNCbURFTApNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1RNQ2hqCktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTIKTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazFPVm93Z1pneEN6QUpCZ05WCkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZ01qQXcKTnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVgpCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICk1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0wKU28xN1ZEczZibDhWQXNCUXBzOGxMMzNLU0xqSFVHTWNLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbAp0Skx0YkN5ZjY5MURpYUk4UzBpUkhWRHNKdC9XWUM2OUlhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJWZk5WZFJWZnNsc3EwRGFmd0JvL3ErRVZYVk1Bb0cKQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR1NXV2Fib0NkNkx1dnBhaUlqd0g1SFRScWp5U2t3Q1kvdHNYempiTGtHVApxUTdtbmR3eEhMS2dweGdjZWVISE5nSXdPbGF2bW5Sczl2dUQ0RFBUQ0YraG5NSmJuMGJXdHN1UkJtT2lCdWN6CnJENm9nUkxReTdyUWtndTJucGFxQkErSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA4NTIwOTU3NDczNDA4NDU4MTkxNzc2Mzc1MjY0NDAzMTcyNjg3NwojIE1ENSBGaW5nZXJwcmludDogOGU6YWQ6YjU6MDE6YWE6NGQ6ODE6ZTQ6OGM6MWQ6ZDE6ZTE6MTQ6MDA6OTU6MTkKIyBTSEExIEZpbmdlcnByaW50OiAzNjo3OTpjYTozNTo2Njo4Nzo3MjozMDo0ZDozMDphNTpmYjo4NzozYjowZjphNzo3YjpiNzowZDo1NAojIFNIQTI1NiBGaW5nZXJwcmludDogMjM6OTk6NTY6MTE6Mjc6YTU6NzE6MjU6ZGU6OGM6ZWY6ZWE6NjE6MGQ6ZGY6MmY6YTA6Nzg6YjU6Yzg6MDY6N2Y6NGU6ODI6ODI6OTA6YmY6Yjg6NjA6ZTg6NGI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1VENDQTZHZ0F3SUJBZ0lRUUJyRVpDR3pFeUVERHJ2a0VockZIVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKdlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd09DQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1UZ3dOZ1lEVlFRREV5OVcKWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlZVekVYCk1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjAKSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eQpJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oCmJDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4MkUzWHJFQk5OdGkxeFdiLzFoYWpDTWoxbUNPa2RlUW1JTjY1bGdaT0l6Rgo5dVZraGJTaWNmdnR2Ym5helUwQXRNZ3RjNlhIYVhHVkh6azhza1FIbk9nTytrMUt4Q0hmS1dHUE1pSmhnc1dICkgyNk1mRjhXSUZGRTBYQlBWK3JqSE9QTWVlNVkyQTdDczBXVHdDem5taGNyZXdBM2VrRXplT0V6NHZNUUduK0gKTEw3MjlmZEM0dVcvaDJLSlh3QkwzOFhkNUhWRU1rRTZIbkZ1YWNzTGRVWUkwY3JTSzVYUXovdTVRR3RrakZkTgovQk1SZVlUdFhsVDJOSjhJQWZNUUpRWVhTdHJ4SFhwbWE1aGdacVRaNzlJdWd2SHc3d25xUk1rVmF1SURialBUCnJKOVZBTWYyQ0dxVXVWL2M0RFB4aEdENVd5Y1J0UHdXOHJ0V2FvQWxqUUlEQVFBQm80R3lNSUd2TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUcwR0NDc0dBUVVGQndFTUJHRXdYNkZkb0ZzdwpXVEJYTUZVV0NXbHRZV2RsTDJkcFpqQWhNQjh3QndZRkt3NERBaG9FRkkvbDB4cUdySTJPYThQUGdHclVTQmdzCmV4a3VNQ1VXSTJoMGRIQTZMeTlzYjJkdkxuWmxjbWx6YVdkdUxtTnZiUzkyYzJ4dloyOHVaMmxtTUIwR0ExVWQKRGdRV0JCUzJkL3BwU0VlZlV4TFZ3dW9ITW5ZSDBaY0hHVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBU3ZqNApzQVBtTEdkNzVKUjNZOHh1VFBsOURnM2N5TGsxdVhCUFkvb2srbXlEakVlZE8yUHptdmwyTXBXUnNYZThySnErCnNlUXhJY2FCbFZaYURySEMxTEdtV2F6eFk4dTRUQjFaa0VydmtCWW9IMXF1RVB1QlVEZ01iTXp4UGNQMVkrT3oKNHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4UC9qZ2RGY3JHSjJCdE1RbzJwU1hwWERyckIyKwpCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1B3R1pzWTZycDJhUVc5SUhSCmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNG1KTzMKN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IgojIFNlcmlhbDogNjMxNDM0ODQzNDgxNTM1MDY2NjUzMTE5ODU1MDE0NTg2NDAwNTEKIyBNRDUgRmluZ2VycHJpbnQ6IDNhOjUyOmUxOmU3OmZkOjZmOjNhOmUzOjZmOmYzOjZmOjk5OjFiOmY5OjIyOjQxCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZDU6ZDg6ZGY6OGY6MDI6MzE6ZDE6OGQ6Zjc6OWQ6Yjc6Y2Y6OGE6MmQ6NjQ6Yzk6M2Y6NmM6M2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmRkOmQ3OmVhOjkwOmJiOjU3OmM5OjNlOjEzOjVkOmM4OjVlOmE2OmZjOmQ1OjQ4OjBiOjYwOjMyOjM5OmJkOmM0OjU0OmZjOjc1OjhiOjJhOjI2OmNmOjdmOjc5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEaERDQ0F3cWdBd0lCQWdJUUw0RCtJNHdPSWc5SVp4SW9rWWVzc3pBS0JnZ3Foa2pPUFFRREF6Q0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwClUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2cKU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbgpiaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1CklDMGdSelF3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBU25WbnA4VXRwa213NHRYTmhlckpJOS9nSG0KR1VvOUZBTkwrbUFuSU5tRGlXbjZWTWFhR0Y1VkttVGVCdmFOU2p1dEVEeGxQWkNJQkluZ01HR3pybDBCcDN2ZQpmTEsreW1WaEFJYXUybzk3MEltdFRSMVpta0d4dkVlQTNKNWl3L21qZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUoKYVcxaFoyVXZaMmxtTUNFd0h6QUhCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZagphSFIwY0RvdkwyeHZaMjh1ZG1WeWFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGTE1XCmtmM3VwbTdrdFM1Smo0ZDRnWURzNWJHMU1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01HWWhEQmdtWUZvNGUxWkMKNEtmOE5vUlJrU0FzZGsxRFBjUWRoQ1BRck5aOE5RYk96V205a0EzYmJFaENIUTZxUWdJeEFKdzlTRGtqT1ZnYQpGUkpaYXA3djFWbXlIVklzbVhITnh5bmZHeXBoZTNIUjN2UEE1UTA2U3FvdHA5aUdLdDB1RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIFN1YmplY3Q6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBMYWJlbDogIk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSIKIyBTZXJpYWw6IDgwNTQ0Mjc0ODQxNjE2CiMgTUQ1IEZpbmdlcnByaW50OiBjNTphMTpiNzpmZjo3MzpkZDpkNjpkNzozNDozMjoxODpkZjpmYzozYzphZDo4OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA2OjA4OjNmOjU5OjNmOjE1OmExOjA0OmEwOjY5OmE0OjZiOmE5OjAzOmQwOjA2OmI3Ojk3OjA5OjkxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yzo2MTpkYTpjMzphMjpkZTpmMDozMTo1MDo2YjplMDozNjpkMjphNjpmZTo0MDoxOTo5NDpmYjpkMTozZDpmOTpjODpkNDo2Njo1OTo5Mjo3NDpjNDo0NjplYzo5OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRRwpFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzCk1EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMGRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmwKY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUgpkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3hNakEyTVRVd09ESXhXakNCCnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4T1pYUk0KYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbQphV05oZEdsdmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56CklFZHZiR1FwSUViRmtYUmhic082YzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeENSZWM3NUxiUlREb2ZUamw1QnUwakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVApsRjhhZkZ0dHZ6QlBoQ2Yybng5SnZNYVpDcER5RC9WL1E0UTNZMUdMZXFWdy9IcFl6WTZiN2NOR2JJUndYZHJ6CkFaQWovRTR3cVg3aEoyUG43V1E4b0xqSk0yUCtGcEQvc0xqOTE2akF3SlJEQzdiVldhYWVWdEFrSDNCNXI5czUKVkExbGRka1ZRWlFCcjE3czlvM3gvNjFrL2lDYTExenIvcVlmQ0dTamkzWlZyUjQ3S0dBdWh5WG9xcThmeG1SRwpJTGR3Znp6ZVNOdVdVN2M1ZCtRYTRzY1doSGFYV3krN0dSV0YrR21GOVptbnFmSTBwNm0ycGdQOGI0WTlWSHgyCkJKdHIrVUJkQURUSExwbDFuZVdJQTZwTitBUFNRbmJBR3dJREFLaUxvMFV3UXpBU0JnTlZIUk1CQWY4RUNEQUcKQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV6UHBuay9DMnVOQ2x3Qjd6VS8yTQpVOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXcVp3OFVRQ2d3QkVJQmFlWjVtOEJpRlJoCmJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGFZdE9VWmNUaDVtMkMKK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGCnVMamJ2clc1S2ZuYU53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTIKWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1ZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogMTAwMDAwMTIKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOmE1OjBmOmY4OjViOjlhOjdkOjZkOjMwOmFlOjU0OjVhOmUzOjQyOmEyOjhhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6YWY6ODI6Nzk6OTE6ODY6Yzc6YjQ6NzU6MDc6Y2I6Y2Y6MDM6NTc6NDY6ZWI6MDQ6ZGQ6Yjc6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY2OjhjOjgzOjk0OjdkOmE2OjNiOjcyOjRiOmVjOmUxOjc0OjNjOjMxOmEwOmU2OmFlOmQwOmRiOjhlOmM1OmIzOjFiOmUzOjc3OmJiOjc4OjRmOjkxOmI2OjcxOjZmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGeWpDQ0E3S2dBd0lCQWdJRUFKaVdqREFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjeU1CNFhEVEE0TURNeU5qRXhNVGd4TjFvWApEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaNTI5MQpxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwCnVPVWZpVXRudldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFUKWjV1VzZNN1h4Z3BUMEd0Smx2T2pDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RQpwTWZROVhRK3BWMGFDUEtiSmRMMnJBUW1QbFU2WWlpbGU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwCjVSYm4zSkJWM3cvb09NMlpOeUZQWGZVaWIyckZFaFpnRjFYeVpXYW1wekNST01FNEhZWUVoTG9hSlhoZW5hL00KVUdEV0U0ZFM3V01mYldWOXdoVVlkTXJoZm1RcGpITFlGaE45QzBsSzhTZ2JJSFJyeFQzZHNLcElDVDB1Z3BUTgpHbVhaSzRpYW1id1lmcC91ZldaOFByMlV1SUhPelpnd2VNRnZaOUMrWCtCbzdkN2lzY2tzV1hpU3F0OHJZR1B5CjVWNjU0OHI2ZjFDR1BxSTBHQXdKYUNnUkhPVGh1VncrUjdveVB4ak1XNFQxODJ0MHhISjA0ZU9Mb0VxOWpXWXYKNnEwMTJpRFRpSUpoOEJJaXRyelExYVRzcjFTSUpTUThwMjJ4Y2lrL1BsZW1mMVd2YmliRy91Zk1RRnhSUklFSwplTjVLemxXL0hkWFp0MWJ2OEhiL0MzbTFyNzM3cVdtUlJwZG9nQlEySGJOL3V5bVlOcVVnK29KZ1lqT2s3TmE2CkI2ZHV4YzhVcHVmV2tqVFlnZlg4SFYycVhCNzJvMDA3dVBjNUFnTUJBQUdqZ1pjd2daUXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekJTQmdOVkhTQUVTekJKTUVjR0JGVWRJQUF3UHpBOUJnZ3JCZ0VGQlFjQ0FSWXhhSFIwY0RvdgpMM2QzZHk1d2EybHZkbVZ5YUdWcFpDNXViQzl3YjJ4cFkybGxjeTl5YjI5MExYQnZiR2xqZVMxSE1qQU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSkZvTW9jVkhZbml0ZkdzTmlnMGpRdDhZb2pyTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQ0FRQ29RVXBuS3BLQmdsQnU0ZGZZc3prNzh3SVZDVkJSN3kyOUpIdUloanY1dEx5UwpDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXorNTFJdnV4QlE0RWZma2RBSE9WNkNNcXFpM1d0Rk1UQzZHWThnZ2VuCjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3amYvU1Q3WndhVWI3ZFJVRy9rU1MwSDR6cFg4OTcKSVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOa3FiRzlBY2xWTXdXVnhKSwpnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmtDcFlMCis2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEwKdkp4eGN5cEZVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbQpiRWdlcW1pU0JlR0NjMXFiM0FkYkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrCk4xdHJTdDhzVjRwQVdqYTYzWFZFQ0RkQ2NBeiszRjRob0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkMKWTdCWE4wVXRlNHFjdndYcVpWVXo5emtReFNncUlYb2Jpc1FrK1Q4VnlKb1ZJUFZWWXBidGJaTlF2T1NxZUszWgp5d3BsaDZabXdjU0JvM2M2V0I0TDdvT0xuUjdTVXFUTUhXK3dtRzJVTWJYNGNRcmN1Zng5TW1EbTY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBTdWJqZWN0OiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBMYWJlbDogIkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIgojIFNlcmlhbDogMTAwMAojIE1ENSBGaW5nZXJwcmludDogYTg6MGQ6NmY6Mzk6Nzg6Yjk6NDM6NmQ6Nzc6NDI6NmQ6OTg6NWE6Y2M6MjM6Y2EKIyBTSEExIEZpbmdlcnByaW50OiBkNjpkYTphODoyMDo4ZDowOTpkMjoxNTo0ZDoyNDpiNToyZjpjYjozNDo2ZTpiMjo1ODpiMjo4YTo1OAojIFNIQTI1NiBGaW5nZXJwcmludDogZjk6ZTY6N2Q6MzM6NmM6NTE6MDA6MmE6YzA6NTQ6YzY6MzI6MDI6MmQ6NjY6ZGQ6YTI6ZTc6ZTM6ZmY6ZjE6MGE6ZDA6NjE6ZWQ6MzE6ZDg6YmI6YjQ6MTA6Y2Y6YjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNRENDQWhpZ0F3SUJBZ0lDQStnd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1NFc3gKRmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcmIyNW5JRkJ2YzNRZwpVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXhOVEExTVRNeE5Gb1hEVEl6TURVeE5UQTBOVEl5T1Zvd1J6RUxNQWtHCkExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHIKYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzFBcHpRCmpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW4KUHpsVENlcXJhdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaApaWTRiWFNObU83aWxNbEhJaHFxaHFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5Cm5uVjB0dGdDWGpxUWVzQkNObkxzYWszYzc4UUEzeE1ZVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2gKcTVVUlgyMDhvMXhOZzF2eXN4bUtnSXNMaHdJREFRQUJveVl3SkRBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFRApNQTRHQTFVZER3RUIvd1FFQXdJQnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFEa2JWUEs3aWg5bGVnWXNDCm1FRUlqRXk4MnR2dUp4dUM1MnBGN0JhTFQ0V2c4N0p3dlZxV3VzcHViZTVHaTI3bktpNldzeGt6NjdTZnFMSTMKN3Bpb2w3WXV0bWNuMUtaSi9SeVRaWGFlUWkvY0lteWFUL0phRlRteGNkY3JVZWh0SEpqQTJTcjBvWUo3MWNsQgpvaU1CZERoVml3KzVMbWVpSUFRMzJwd0wweGNoNEkrWGVUUnZoRWdDSURNYjVqUkVuNUZ3OUlCZWhFUENLZEpzCkVoVGtZWTJzRUpDZWhGQzc4Slp2UlorSzg4cHNUL29ST2hVVlJzUE5INE5iTFVFUzdWQm5RUk05SWF1VWlxcE8KZk1HeCs2Zld0U2N2bDZ0dTRCM2kwUndzSDBUaS9MNlJvWno3MWlsVGM0YWZVOWhERGwzV1k0SnhIWUIweXZiaQpBbXZaV2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIExhYmVsOiAiU2VjdXJlU2lnbiBSb290Q0ExMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGI3OjUyOjc0OmUyOjkyOmI0OjgwOjkzOmYyOjc1OmU0OmNjOmQ3OmYyOmVhOjI2CiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzQ6OWY6NDg6Zjg6ZjM6NzM6YTA6OWM6MWU6YmQ6Zjg6NWI6YjE6YzM6NjU6Yzc6ZDg6MTE6YjMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOjBmOmVlOmZiOjllOjNhOjU4OjFhOmQ1OmY5OmU5OmRiOjc1Ojg5Ojk4OjU3OjQzOmQyOjYxOjA4OjVjOjRkOjMxOjRmOjZmOjVkOjcyOjU5OmFhOjQyOjE2OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyCk1Da0dBMVVFQ2hNaVNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0cKQTFVRUF4TVRVMlZqZFhKbFUybG5iaUJTYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBMApNRGd3TkRVMk5EZGFNRmd4Q3pBSkJnTlZCQVlUQWtwUU1Tc3dLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwClkyRjBhVzl1SUZObGNuWnBZMlZ6TENCSmJtTXVNUnd3R2dZRFZRUURFeE5UWldOMWNtVlRhV2R1SUZKdmIzUkQKUVRFeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBL1hlcXBSeVFCVHZMVEpzegppMW9VUmFUbmtCYlIzMWZTSVJDa0YvM2ZyTllmcCtUYmZQZnMzN2dEMnBSWS9WMXlmSXcvWHdGbmRCV1c0d0k4Cmg5dXV5d0dPd3ZObXhvVkY5QUxHT3JWaXNxLzZuTCtrNXRTQU1KanpEYmFUajZuVTJEYnlzUHlLeWl5aEZUT1YKTWRyQUcvTHVZcG1HWXorLzNaTXFnNmgydVJNZnQ4NU9Rb1dQSXVjdUd2S1ZDYklGdFVST2Q2RWd2YW55VGdwOQpVSzMxQlExRlQwWngvU2crVS9zRTJDM1haUjFLRy9yUE83QXhtalZ1eUlzRzB3Q1I4cFFJWlV5eE5BWUFlb25pCjhNY0RXYy9WMXVpbk1yUG1tRUNHeGMwbkVvdk1lODYzRVR4aVlBY2pQaXRBYnBTQUNXMjJzMjkzYnpVSVVQc0MKaDhVK2lRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVXL2hOVDdLbGh0UTYwdkZqbXFDK0NmWlh0OTR3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCkFLQ2hPQlptTHFkV0h5R2NCdm9kN2JraXhUZ20yRTVQN0tOL2VkNUdJYUdIZDQ4SENKcXlwTVd2RHpLWUMzeG0KS2JhYmZTVlNTVU9yVEM0cmJucHdyeFlPNHdKcyswTG1HSjFGMkZYSTZEdmQ1K0gwTGdzY05GeHNXRXI3akloUQpYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRT2gyOURieDdWRkFMdVVLdlZhQVlnYTFsbWUrKzVKeS94SVdyClFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDF5OGhTeW4rQi90bHIwL2NSN1NYZitPZjUKcFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MWxnZUxLQk9iakJtTgpRU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBTdWJqZWN0OiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgTGFiZWw6ICJNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkiCiMgU2VyaWFsOiAxNDAxNDcxMjc3NjE5NTc4NDQ3MwojIE1ENSBGaW5nZXJwcmludDogZjg6NDk6ZjQ6MDM6YmM6NDQ6MmQ6ODM6YmU6NDg6Njk6N2Q6Mjk6NjQ6ZmM6YjEKIyBTSEExIEZpbmdlcnByaW50OiA4OTpkZjo3NDpmZTo1YzpmNDowZjo0YTo4MDpmOTplMzozNzo3ZDo1NDpkYTo5MTplMTowMTozMTo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NWY6ODE6ZmU6YTU6ZmE6Yjg6MmM6NjQ6YmY6YTI6ZWE6ZWM6YWY6Y2Q6ZTg6ZTA6Nzc6ZmM6ODY6MjA6YTc6Y2E6ZTU6Mzc6MTY6M2Q6ZjM6NmU6ZGI6ZjM6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MApaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHCkNTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHkKT1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReApGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwCloyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UAprZDZtSnZpWnBXTndyWnV1eWpOQWZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjCmNibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFUKZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0FweG4xbnR4VlV3T1hld2RJLzVuNwpONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bTFIeGRydGJDCnhremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTEKK3JVQ0F3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNClBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUVGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwb2xaTUV5TC9helhtNFE1RHdwTDd2OHU4aAptTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYSS9PTW43NGRzZUdrCmRkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YwoyUG0yRzJKd0N6MDJ5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0CkhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaUxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTc1OTQyNjIwOTk1NAojIE1ENSBGaW5nZXJwcmludDogYzU6ZGY6Yjg6NDk6Y2E6MDU6MTM6NTU6ZWU6MmQ6YmE6MWE6YzM6M2U6YjA6MjgKIyBTSEExIEZpbmdlcnByaW50OiBkNjo5Yjo1NjoxMTo0ODpmMDoxYzo3NzpjNTo0NTo3ODpjMTowOToyNjpkZjo1Yjo4NTo2OTo3NjphZAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6YjU6MjI6ZDc6Yjc6ZjE6Mjc6YWQ6NmE6MDE6MTM6ODY6NWI6ZGY6MWM6ZDQ6MTA6MmU6N2Q6MDc6NTk6YWY6NjM6NWE6N2M6ZjQ6NzI6MGQ6Yzk6NjM6YzU6M2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0Ck1UQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU13bGRwQjVCbmdpRnZYQWc3YUV5aWllL1FWMkVjV3RpSEw4ClJnSkR4N0tLblFSZkpNc3VTK0ZnZ2tiaFVxc01nVWR3Yk4xazBldjFMS01QZ2owTUs2NlgxN1lVaGhCNXV6c1QKZ0hlTUNPRkowbXBpTHg5ZStwWm8zNGtubFRpZkJ0Yyt5Y3NtV1ExejNyREk2U1lPZ3hYRzcxdUwwZ1JneWttbQpLUFpwTy9iTHlDaVI1WjJLWVZjM3JIUVUzSFRnT3U1eUx5NmMrOUM3di9VOUFPRUdNK2lDSzY1VHBqb1djNHpkClFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psT0NaZ2RiS2ZkLytSRk8rdUlFbjhyVUFWU05FQ01XRVoKWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjJ4bW1GZ2hjQ0F3RUFBYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZJL3dTMytvCkxrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlUKUlVtN2xnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcApqak01UmNPTzVMbFhiS3I4RXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLCjZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUViZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVgKbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOFlJdkRRVkVUSTUzTzl6SnJsQUdvbWVjcwpNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdya3BlRE1kbXp0Y3BICldEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIFN1YmplY3Q6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIExhYmVsOiAiQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4IgojIFNlcmlhbDogNjA0NzI3NDI5NzI2Mjc1Mzg4NwojIE1ENSBGaW5nZXJwcmludDogNzM6M2E6NzQ6N2E6ZWM6YmI6YTM6OTY6YTY6YzI6ZTQ6ZTI6Yzg6OWI6YzA6YzMKIyBTSEExIEZpbmdlcnByaW50OiBhZTpjNTpmYjozZjpjODplMTpiZjpjNDplNTo0ZjowMzowNzo1YTo5YTplODowMDpiNzpmNzpiNjpmYQojIFNIQTI1NiBGaW5nZXJwcmludDogMDQ6MDQ6ODA6Mjg6YmY6MWY6Mjg6NjQ6ZDQ6OGY6OWE6ZDQ6ZDg6MzI6OTQ6MzY6NmE6ODI6ODg6NTY6NTU6M2Y6M2I6MTQ6MzA6M2Y6OTA6MTQ6N2Y6NWQ6NDA6ZWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJVSt3Nzd2dXlTRjh3RFFZSktvWklodmNOQVFFRkJRQXdVVEVMTUFrR0ExVUUKQmhNQ1JWTXhRakJBQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaApjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMk9EQWVGdzB3T1RBMU1qQXdPRE00TVRWYUZ3MHpNREV5Ck16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJd1FBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWcKUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCTmpJMk16UXdOamd3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1RERVdGQ5CnRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU0KY2FzOVVYNFBCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmRwpMOUl0V1kxNkNrNldhVklDcWphWTdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpCk5BOXdCajRnR0ZyTzkzSWJKV3lUZEJTVG8zT3hEcXFIRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2gKWDY4Z3ZxQjJmM2JsN0JxR1lUTSs1M3UwUDZBUGpxSzVhbSs1aHladlFXeUlwbEQ5YW1NTDlaTVdHeG1Qc3UyYgptOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WE1iU2N5SkN5ClovUVlGcE02L0VmWTBYaVdNUis2S3d4ZlhabXRZNGxhSkNCMjJOLzlxMDZtSXFxZFh1WW5pbjFvS2FQbmlyamEKRWJzWExabWRFeVJHOThYaTJKK09mOGVQZEcxYXN1aHk5YXp1SkJDdEx4VGEveTJhUm5GSHZrTGZ1d0hiOUgvVApLSTh4V1Z2VHlRS210RkxLYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGCjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1V2emxOMUo1QnRvK1dIV09XazltVkJuZ3hhSjQzQmp1QWlVVmgKT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6Q0JwZ1lEClZSMGdCSUdlTUlHYk1JR1lCZ1JWSFNBQU1JR1BNQzhHQ0NzR0FRVUZCd0lCRmlOb2RIUndPaTh2ZDNkM0xtWnAKY20xaGNISnZabVZ6YVc5dVlXd3VZMjl0TDJOd2N6QmNCZ2dyQmdFRkJRY0NBakJRSGs0QVVBQmhBSE1BWlFCdgpBQ0FBWkFCbEFDQUFiQUJoQUNBQVFnQnZBRzRBWVFCdUFHOEFkZ0JoQUNBQU5BQTNBQ0FBUWdCaEFISUFZd0JsCkFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeEFEY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQmQ5b1BtMDNjWEYKNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4NTF0a2xqWXlHT3lsTW5mWDQwUzJ3QkVxZ0xrOQphbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWtSNzFrTXJ2MkpZU2lKMEwxCklMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUFQ0ODEKUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUwozYS9EVGc0ZkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrClNlVHkzNkxzc1V6QUtoM250TEZsb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYKM2R2ZDZxSjJnSE45OVp3RXhFV041N2tjaTU3cTEzWFJjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTQpaY0Z3Z2JnNC9FTXhzdllETkVleXJQc2lCc3NlM1JkSEhGOW11ZE1hb3RvUnNhUzhJOG5rdm9mL3VaUzIrRjBnClN0UmY1NzFvZTJYeUZSN1NPcWt0NmRockpLeVhXRVJIclZrWThTRmxjTjdPTkdDb1FQSHpQS1RES0NPTS9pY3oKUTBDZ0Z6enI2anV3Y3FhanVVcExYaFpJOUxLOHlJeVN4WjJmckhJMnZEU0FOR3VwaTVMQXVCZnQ3SFpUOVNRQgpqTE1pNkV0OFZjYWQrcU1VdTJXRmJtNVBFbjRLUEoyVgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgU3ViamVjdDogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgTGFiZWw6ICJJemVucGUuY29tIgojIFNlcmlhbDogOTE3NTYzMDY1NDkwMzg5MjQxNTk1NTM2Njg2OTkxNDAyNjIxCiMgTUQ1IEZpbmdlcnByaW50OiBhNjpiMDpjZDo4NTo4MDpkYTo1Yzo1MDozNDphMzozOTo5MDoyZjo1NTo2Nzo3MwojIFNIQTEgRmluZ2VycHJpbnQ6IDJmOjc4OjNkOjI1OjUyOjE4OmE3OjRhOjY1OjM5OjcxOmI1OjJjOmEyOjljOjQ1OjE1OjZmOmU5OjE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNTozMDpjYzo4ZTo5ODozMjoxNTowMjpiYTpkOTo2Zjo5YjoxZjpiYToxYjowOTo5ZToyZDoyOTo5ZTowZjo0NTo0ODpiYjo5MTo0ZjozNjozYjpjMDpkNDo1MzoxZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNApNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2ClpXNXdaUzVqYjIwd0hoY05NRGN4TWpFek1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWUQKVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1agpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREowM3JLRHg2c3A0Ym9GbVZxCnNjSWJSVEp4bGRuK0VGdk1yK2VsZVFHUGljUEs4bFZ4OTNlK2Q1VHpjcVFzUk5pZWtwc1VPcUhuSkpBS0NsYU8KeGRnbWxPSFpTT0V0UHRvS2N0MmptUlhhZ2FLSDlIdHVKbmVKV0szVzZ3eXlRWHB6Ym0zYmVuaEI2UWlJRW42SApMbVlSWTJ4VSt6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYCnVhT0ttTVBzT3pURmxVRnBmblhDUENERllicFJSNkFna0pPaGtFdnpUbnlGUlZTYTBRVW1RYkMxVFIwenZzUUQKeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFRPVGNqN05NQitlQUpSRTFOWk1EaERWcUhJcnl0RzZQKwpKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiS0Y3akplb2RXTEJvQkhteStFNjBRCnJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLMEdxZnZFeU4KQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TApoaWorMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCClFGcU5lYitMejB2UHFoYkJsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSisKSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJREFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdQpabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnClFUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkdOaklnVXpneFF6QkIKQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQ0FRQjRwZ3dXU3A5TWlEckF5dzZsRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYgpsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2FrRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2CmF3bXF4aW51YUVsbk1JQWtlakVXT1Z0KzhSd3UzV3dKcmZJeHdZSk91YnY1dnI4cWhUL0FRS002V2Z4WlN6d28KSk51MEZYV3VEWWk2TG5QQXZWaUg1VUx5NjE3dUhqQWltY3MzMGNRaGJJSHN2bTBtNWh6a1FpQ2VSN0NzZzFsdwpMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUClZ5dmVoUVA1YVRmTG5uaHFCYlRGTVhpSjdIcW5oZUc1ZXp6ZXZoNTVoTTZmY0E1WndqVXVrQ294MmVSRmVrR2sKTGhPYk5BNW1lMG1yWkpmUVJzTjVuWEpRWTZhWVd3YTlTRzNZT1lOdzZEWHdCZEdxdk9QYnlBTHFmUDJDMnNKYgpVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQ0NsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvClFuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvUTBpeTIrdHpKT2VSZjFTa3RvQSsKbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVpXck9aeUdscwpReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDExODA2ODIyNDg0ODAxNTk3MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTo4MDo5ZTo4NDo1YTowZTo2NTowYjoxNzowMjpmMzo1NToxODoyYTozZTpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDc4OjZhOjc0OmFjOjc2OmFiOjE0OjdmOjljOjZhOjMwOjUwOmJhOjllOmE4OjdlOmZlOjlhOmNlOjNjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjozZTo0YTpmYTpjNDo5MTpkZjpkMzozMjpmMzowODo5Yjo4NTo0MjplOTo0NjoxNzpkODo5MzpkNzpmZTo5NDo0ZToxMDphNzo5Mzo3ZTplMjo5ZDo5Njo5MzpjMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKegpJRzltSUVOdmJXMWxjbU5sSUZKdmIzUWdMU0F5TURBNE1CNFhEVEE0TURnd01URXlNamsxTUZvWERUTTRNRGN6Ck1URXlNamsxTUZvd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObFpTQmoKZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0TDJGa1pISmxjM01wTVJJdwpFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnlabWx5YldFZ1V5NUJMakVwCk1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdElESXdNRGd3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN2QU10d055dUFXa282YkhpVWZhTi9HaC8yTmRXOQoyOHNOUkhJK0pyS1FVcnBqT3loWWI2V3piWlNtODkxa0RGWDI5dWZ5SWlLQVh1Rml4cllwNFlGczhyL2xmVEpxClZLQXlHVm4rSDR2WFBXQ0doU1J2NHhHemR6NGdsalVoYTdNSTJYQXVaUGVFa2xQV0RyQ1Fpb3JqaDQwRzA3MlEKRHVLWm9SdUdEdHFhQ3JzTFlWQUdVdkdlZjNic3l3L1FIZzNQbVRBOUhNUkZFRmlzMXRQbzErWHF4UUVIZDlaUgo1Z04vaWtpbFRXaDF1ZW04bms0WmNmVXlTNXh0WUJrTCs4eWRkZHkvSnMyUGszZzVlWE5lSlE3S1hPdDNFZ2ZMClpFRkhjcE9yVU1QckNYWmtOTkk1dDNZUkNRMTJSY1NwcmoxcXI3VjlaUytVV0JEc1hIeXZmdUsyR05uUW0wNWEKU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1Z0QydmxHdHMvNCtFaHlTbkI4ZXNIbkZJYkFVUlJQSHNsMThUbApVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxbHViS2dkYVg4WlNENmUyd3NXc1NhUjZzCisxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEwd2xmMmVPS05jeDUKV2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4CmhkdXViKzg0TXhoMkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlYKSFE0RUZnUVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMQorSG5BK21DSUc4VFpUUUtlRnhtaGdiU2tnYkV3Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOCllXUnlhV1FnS0hObFpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXQKTDJGa1pISmxjM01wTVJJd0VBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeQpabWx5YldFZ1V5NUJMakVwTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0CklESXdNRGlDQ1FDajJrSitwTEd1MmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlYKSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSkFTcnlJMXdxTTU4QzdlNmJYcGVIeEl2ajk5UlpKZTZkcXhHZndXClBKKzBXMmFlYXVmRHVWMkk2QSt0enlNUDNpVTZYc3hQcGNHMUxhd2swbGdIM3FMUGFZUmdNK2dRRFJPcEk5Q0YKNVk1N3BwNDljaE55TS9XcWZjWmpId2owL2dGL0pNOHJMRlFKM3VJcmJaTEdPVThXNmp4K2VrYlVSV3BHcU90MQpnbGFucTZCOGFCTXo5cDB3OEc4bk9TUWpLcEQ5a0NrMThwUGZOS1hHOS9qdmpBOWlTbnl1MC9WVStJMjJtbGFICkZvSTZNNnRhSWdqM2dycnFMdUJIbXJTMVJhTUZPOW5jTGtWQU8rcmNmK2c3NjlIc0p0ZzFwRERGT3F4WG5yTjIKcFNCNytSNUtCV0lCcGloMVlKZVNEVzQrVFRkRERaSVZuQmdpelZHWm9Da2FQRitLTWpOYk1NZUpMMGVZRDZNRAp4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GOWRpanNjaWxJZVVjRTVmdURyM2ZLYW52TkZOYjArUnFFNFFHCnRqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0t6QklLaW5td1BRTi9hVXYwTkNCOXN6VHEKamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2R25yRFFXemlsbTFEZQpmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFoKZDBqUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxNDU0MTUxMTc3MzExMTc4ODQ5NAojIE1ENSBGaW5nZXJwcmludDogOWU6ODA6ZmY6Nzg6MDE6MGM6MmU6YzE6MzY6YmQ6ZmU6OTY6OTA6NmU6MDg6ZjMKIyBTSEExIEZpbmdlcnByaW50OiA0YTpiZDplZTplYzo5NTowZDozNTo5Yzo4OTphZTpjNzo1MjphMToyYzo1YjoyOTpmNjpkNjphYTowYwojIFNIQTI1NiBGaW5nZXJwcmludDogMTM6NjM6MzU6NDM6OTM6MzQ6YTc6Njk6ODA6MTY6YTA6ZDM6MjQ6ZGU6NzI6Mjg6NGU6MDc6OWQ6N2I6NTI6MjA6YmI6OGY6YmQ6NzQ6Nzg6MTY6ZWU6YmU6YmE6Y2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQWVGdzB3T0RBNE1ERXhNak14TkRCYUZ3MHpPREEzTXpFeApNak14TkRCYU1JR3NNUXN3Q1FZRFZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5CmNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUcKQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbApCZ05WQkFNVEhrZHNiMkpoYkNCRGFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPRENDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTURmVnRQa09wdDJSYlFUMi8vQnRobUxOMEVZbFZKSDZ4ZWQKS1lpT05Xd0dNaTVIWXZOSkJMOTlSRGF4Y2N5OVdnbHoxZG1GUlArUlZ5WGZYamFPY05GY2NVTWQyZHJ2WE5MNwpHNzA2dGN1dG84eEVwdzJ1SVJVL3VYcGJrblhZcEJJNGlSbUt0NERTNGpKdlZweVIxb2dRQzdOMFpKSjBZUFAyCnp4aFBZTElqME1jN3ptRkxtWS9DRE5CQXNwamNEYWhPbzdrS3JtQ2dyVVZTWTdwbXZXamcrYjRhcUlHN0hrRjQKZGRQQi9nQlZzSWRVNkNlUU5SMU1NNjJYL0pjdW1JUy9MTW1qdjlHWUVSVHRZL2pLbUloWUY1bnRSUU9YZmp5RwpIb2lNdnZLUmhJOWxOTmdBVEgyM01SZGFLWG9LR0NRd296ZTFlcWtCZlNiVytRNk9XZkg5R3pPMUtUc1hPMEcyCklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk1IL3VjVWE2TGNMMG5uM0hBYTZ4OWtHYm8xMTA2RGJEVndvM1YKeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZU94MllJdGFzd1RYYm82QWwvM0sxZGgzZQpiZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGSFR5bnlRYmVoUDlyCjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZwp6Q3RMa3lrUEFnTUJBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXCkJCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHIKcnUxVThWdVRCalV1WHFHQnNxU0JyekNCckRFTE1Ba0dBMVVFQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcApaQ0FvYzJWbElHTjFjbkpsYm5RZ1lXUmtjbVZ6Y3lCaGRDQjNkM2N1WTJGdFpYSm1hWEp0WVM1amIyMHZZV1JrCmNtVnpjeWt4RWpBUUJnTlZCQVVUQ1VFNE1qYzBNekk0TnpFYk1Ca0dBMVVFQ2hNU1FVTWdRMkZ0WlhKbWFYSnQKWVNCVExrRXVNU2N3SlFZRFZRUURFeDVIYkc5aVlXd2dRMmhoYldKbGNuTnBaMjRnVW05dmRDQXRJREl3TURpQwpDUURKemRQcDFYMGp6akFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293CktBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWkkKaHZjTkFRRUZCUUFEZ2dJQkFJQ0lmM0Rla2lqWkJaUkcvNUJYcWZFdjN4b05hL3A4RGh4SkpIa24yRWFxYnlsWgpVb2h3RXVyZFBmV2JVMVJ2NFdDaXFBbTU3T3RaZk1ZMThkd1k2ZkZuNWErNlJlQUozc3BFRDhJWERuZVJSWG96ClgxK1dMR2lMd1VlUG1Kczl3T3pMOWRXQ2tvUTEwYjQyT0ZaeU1WdEhMYW9YcEdOUjZ3b0JyWC9zZFo3TG9SL3gKZnhLeHVlUmtmMmZXSXlyMHVEbGRtT2docCtHOVBVSWFkSnB3cjJoc1VGMUp6Ly83RGwzbUxFZlhnVHBaQUxWegphMk1nOWpGRkNEa085SEIrUUhCYVA5QnJRcWwwUFNndkFtMTFjcFVKalVoanhzWWpWNUtUWGpYQmpma0s5eXlkClloejJyWHpkcGpFZXRySEhmb1VtK3FScXRkcGpNTkh2a3pleVppOTlCZmZudDB1WWxEWEEyVG9wd1oyeVVETWQKU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdXFxcUhXMlBvaytKcnFOUzRjbmhyRyswNTVGM0xtNnFIMVU5TwpBUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyUDNpWjhudHhQanp4bUtmRkdCSS81cnNvCk0wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnFjNWlKV3pvdUU0Z2UKdjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIFN1YmplY3Q6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIExhYmVsOiAiR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgwOjNhOmJjOjIyOmMxOmU2OmZiOjhkOjliOjNiOjI3OjRhOjMyOjFiOjlhOjAxCiMgU0hBMSBGaW5nZXJwcmludDogNDc6YmU6YWI6Yzk6MjI6ZWE6ZTg6MGU6Nzg6Nzg6MzQ6NjI6YTc6OWY6NDU6YzI6NTQ6ZmQ6ZTY6OGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ1OjE0OjBiOjMyOjQ3OmViOjljOmM4OmM1OmI0OmYwOmQ3OmI1OjMwOjkxOmY3OjMyOjkyOjA4OjllOjZlOjVhOjYzOmUyOjc0OjlkOmQzOmFjOmE5OjE5OjhlOmRhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1QKRVVkdlJHRmtaSGt1WTI5dExDQkpibU11TVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScApabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6Ck5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUgKRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHQTFVRQpBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0QKRTZiRklFTUJPNFR4NW9WSm55ZnE5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSAovUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRCtxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5CkRmTUFaaUxJaldsdE5vd1JHTGZUc2h4Z3REajZBb3pPMDkxR0I5NEtQdXRkZk1oOCs3QXJVNlNTWW1sUkpRVmgKR2tTQmpDeXBRNVlqMzZ3Nmdab09LY1VjcWVsZEhyYWVuakFLT2M3eGlJRDdTMTNNTXV5RllrTWxOQUpXSndHUgp0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBCkFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRkRxYWhRY1FaeWkyNy9hOUJVRnVJTUdVMmcvZU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1oyMTE1MWZtWApXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjdk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1Cjl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3I1TjlzczRVWG5UM1pKRTk1a1RYV1h3VHIKZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVk44R2I1REtqN1RqbwoyR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUkKNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZDY6Mzk6ODE6YzY6NTI6N2U6OTY6Njk6ZmM6ZmM6Y2E6NjY6ZWQ6MDU6ZjI6OTYKIyBTSEExIEZpbmdlcnByaW50OiBiNToxYzowNjo3YzplZToyYjowYzozZDpmODo1NTphYjoyZDo5MjpmNDpmZTozOTpkNDplNzowZjowZQojIFNIQTI1NiBGaW5nZXJwcmludDogMmM6ZTE6Y2I6MGI6Zjk6ZDI6Zjk6ZTE6MDI6OTk6M2Y6YmU6MjE6NTE6NTI6YzM6YjI6ZGQ6MGM6YWI6ZGU6MWM6Njg6ZTU6MzE6OWI6ODM6OTE6NTQ6ZGI6Yjc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzClpDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXcKTUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWdWR1ZqCmFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUwzdHdRUDg5by84QXJGdlc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nCm5MUkpkeklwVnYyNTdJemRJdnB5M0NkaGwrNzJXb1RzYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDEKSE9aLzVGU3VTL2hWY2xjQ0dmZ1hjVm5ySGlnSGRNV2RTTDVzdFBTa3NQTmtOM21Td094R1huL2hiVk5NWXEvTgpId3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZlpURDRwN2ROCmRsb2VkbDQwd09pV1ZwbUtzL0IvcE0yOTNESXhmSkhQNEY4UitHdXFTVnpSbVpUUm91TmpXd2wydFZaaTRVdDAKSFpiVUp0UUlCRm5RbUE0TzV0Nzh3K3dma1BFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2xUd052bEprN21oK0NoVG5VZGdXVVh1RW9rMjFpWFFuQ29LalUKc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeDRtY3VqSlVESmk1RG5Vb3g5ZzYxREx1Mwo0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3RjVva3hCRGdCUGZnCjhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMQptTXBZam4wcTdwQlpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDE3OjM1Ojc0OmFmOjdiOjYxOjFjOmViOmY0OmY5OjNjOmUyOmVlOjQwOmY5OmEyCiMgU0hBMSBGaW5nZXJwcmludDogOTI6NWE6OGY6OGQ6MmM6NmQ6MDQ6ZTA6NjY6NWY6NTk6NmE6ZmY6MjI6ZDg6NjM6ZTg6MjU6NmY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OjhkOjY5OjA1OmEyOmM4Ojg3OjA4OmE0OmIzOjAyOjUxOjkwOmVkOmNmOmVkOmIxOjk3OjRhOjYwOjZhOjEzOmM2OmU1OjI5OjBmOmNiOjJhOmU2OjNlOmRhOmI1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEN3pDQ0F0ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE96QTVCZ05WQkFNVE1sTjBZWEptYVdWcwpaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1Ck1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJBd0RnWUQKVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeQpabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5CmRtbGpaWE1nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcApPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yCjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhaEhRVXcyZWVCR2c2MzQ1QVdoMUsKVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFBMSkdtcHVmZQpoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrCjZtRkJyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcQpBZGN3S3ppSW9yaHRTcHp5RVpHRE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JCmJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFBFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEIKdmU2U2J6SjA4cEdDTDcyQ1FucXRLcmNnZlUyOGVsVVN3aFhxdmZkcWxTNXNkSi9QSExUeXhRR2poZEJ5UHExegpxd3ViZFF4dFJiZU9sS3lXTjdXZzBJOFZSdzdqNklQZGovM3ZRUUYzekNlcFlvVXo4amNJNzNIUGR3YmV5QmtkCmlFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24KMHEyM0tYQjU2anphWXlXZi9XaTNNT3h3KzNXS3QyMWdaN0lleUxucDJLaHZBb3RuRFUwbVYzSGFJUHpCU2xDTgpzU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IENvbW1lcmNpYWwiCiMgU2VyaWFsOiA4NjA4MzU1OTc3OTY0MTM4ODc2CiMgTUQ1IEZpbmdlcnByaW50OiA4Mjo5MjpiYTo1YjplZjpjZDo4YTo2ZjphNjozZDo1NTpmOTo4NDpmNjpkNjpiNwojIFNIQTEgRmluZ2VycHJpbnQ6IGY5OmI1OmI2OjMyOjQ1OjVmOjljOmJlOmVjOjU3OjVmOjgwOmRjOmU5OjZlOjJjOmM3OmIyOjc4OmI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMzo3NjphYjoxZDo1NDpjNTpmOTo4MDozYzplNDpiMjplMjowMTphMDplZTo3ZTplZjo3Yjo1NzpiNjozNjplODphOTozYzo5Yjo4ZDo0ODo2MDpjOTo2Zjo1ZjphNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQkRiMjF0WlhKamFXRnNNQjRYRFRFd01ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYkR1S1AKSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcgpiYTBGOFByVkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMCk1lSXJKbXFiVEZldXJDQSt1a1Y2QmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzEKeUhwNTJVS3FLMzljL3M0bVQ2Tm1nVFd2UkxwVUhod3dNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxcgpWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVblpQR1U0dGV5cTgvCm54NFA1Wm1WdkNUMmxJOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmlzOUFRT3pjQU4vd3I5MUxvV1h5bTllMmlaV0VuU3RCMDNUWDhuZlVZRwpYVVBHaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qCnZiejRZWUNhbnJIT1FuRGlxWDBHSlgwbm9mNXY3TE1lSk5yalMxVWFBRHMxdER2WjExMHcvWUVUaWZMQ0JpdnQKWjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdjB3cWlVT1AyTytndVJNTGJaamlwTTFaSThXMGJNNDBOakQ5ZwpONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDCm5scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IE5ldHdvcmtpbmciCiMgU2VyaWFsOiA4OTU3MzgyODI3MjA2NTQ3NzU3CiMgTUQ1IEZpbmdlcnByaW50OiA0Mjo2NTpjYTpiZTowMTo5YTo5YTo0YzphOTo4Yzo0MTo0OTpjZDpjMDpkNTo3ZgojIFNIQTEgRmluZ2VycHJpbnQ6IDI5OjM2OjIxOjAyOjhiOjIwOmVkOjAyOmY1OjY2OmM1OjMyOmQxOmQ2OmVkOjkwOjlmOjQ1OjAwOjJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYTo4MTplYzo1YTo5Mjo5Nzo3NzpmMTo0NTo5MDo0YTpmMzo4ZDo1ZDo1MDo5Zjo2NjpiNTplMjpjNTo4ZjpjZDpiNTozMTowNTo4YjowZToxNzpmMzpmMDpiNDoxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFd01ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRUhpM3kKWUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YQprQ05ybXJlSWRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMClFFU3hHOWZod29YQTNoQS9QZTI0L1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXAKNnp4RzhEMWd2ejlRMHR3bVFWR2VGRGRDQktOd1Y2Z2JoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kRwp5SDMyOUpLQk52M2JOUEZ5ZnZNTUZyMjBGUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVQngvUzU1emF3bTZpClFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWxYc2haNnFNTDkxdG1ibXpUQ25MUXlGRTJucE4vc3ZxZSsrRVBia1RmTwp0REl1VUZVYU5VNTJRM0VnNzVOM1RoVndMb2ZEd1IxdDNNdTFKOVFzVnRGU1V6cEUwblBJeEJzRlpWcGlrcHp1ClFZMHgyK2MwNmxraDFRRjYxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVloKTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyM1dKWmEzVzNTQUtEMG0waSt3emVrdWpiZ2ZJZUZseG9Wb3Q0dQpvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5L1pGdmdyRytDSlBiRkVmeG9qZkhSWjQ4CngzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0iCiMgU2VyaWFsOiA3ODkzNzA2NTQwNzM0MzUyMTEwCiMgTUQ1IEZpbmdlcnByaW50OiBjNDo1ZDowZTo0ODpiNjphYzoyODozMDo0ZTowYTpiYzpmOTozODoxNjo4Nzo1NwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmE2OjMzOjJjOmUwOjAzOjZmOmIxOjg1OmY2OjYzOjRmOjdkOjZhOjA2OjY1OjI2OjMyOjI4OjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MDphNzozZjo3ZjozNzo2Yjo2MDowNzo0Mjo0ODo5MDo0NTozNDpiMToxNDo4MjpkNTpiZjowZTo2OTo4ZTpjYzo0OTo4ZDpmNToyNTo3NzplYjpmMjplOTozYjo5YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6CmRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeU9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0cKQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVQpjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF4QkxmCnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bkJLQVEKSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWgoramplUkZjVjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTCnM4UGhhSnlKK0hvQVZ0NzBWWlZzKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTUKSE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWRHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNwo3ME8vTmJ1YTJQbHpweXp5MEZmdUtFNG1YNCtRYUFrdnVQamNCdWt1bWo1UnA5RWl4QXFuT0Voc3Mvbi9mYXVHClYrTzYxb1Y0ZDdwRDZraC85dGkrSTIwZXY5RTJiRmhjOGU2a0dWUWE5UVBTZHViaGpMMDhzOU5JUytMSStIK1MKcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43Uwo1dTA0NnV3QkhqeElWa2tKeDB3M0FKNklEc0J6NFc5bTZYSkhNRDRRNVFzRHlacENBR3pGbEg1aHhJcmZmNElhCkMxbkVXVEozczd4Z2FWWTUvYlFHZXl6V1pEYlp2VWp0aEI5K3BTS1BLcmhDOUlLMzFGT1FlRTR0R3YyQmIwVFgKT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbytOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRQpGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXZNaVBJczBsYVVaeDIKS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCCjhPV3ljdnBFZ2pOQzZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFEKTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYwowamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsrNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRCnU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVkJ0V1Z5dUVrbHV0ODlwTUYKdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnSXhwSApZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4CkdLYTFxRjYwZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU8KUnRHZEZOckhGK1FGbG96RUpMVWJ6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZQpLZUMydUFsb0dSd1lRdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MiCiMgU2VyaWFsOiA4NDAxMjI0OTA3ODYxNDkwMjYwCiMgTUQ1IEZpbmdlcnByaW50OiA2NDpiMDowOTo1NTpjZjpiMTpkNTo5OTplMjpiZToxMzphYjphNjo1ZDplYTo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjIzOjZiOjAwOjJmOjFkOjE2Ojg2OjUzOjAxOjU1OjZjOjExOmE0OjM3OmNhOmViOmZmOmMzOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZDo3MTpmZDpmNjpkYTo5NzplNDpjZjo2MjpkMTo2NDo3YTpkZDoyNTo4MTpiMDo3ZDo3OTphZDpmODozOTo3ZTpiNDplYzpiYTo5Yzo1ZTo4NDo4ODo4MjoxNDoyMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQwpWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRCmNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeE1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUoKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdApWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRTk1GNGJGWjBECjBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UU44TzkKc3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwRwpBMVVkRGdRV0JCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnMKYW9iZ3hDZDA1RGhUMXdWL0d6VGp4aSt6eWdrOE41M1g1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SQpmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTWVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSIKIyBTZXJpYWw6IDI3OTc0NAojIE1ENSBGaW5nZXJwcmludDogZDU6ZTk6ODE6NDA6YzU6MTg6Njk6ZmM6NDY6MmM6ODk6NzU6NjI6MGY6YWE6NzgKIyBTSEExIEZpbmdlcnByaW50OiAwNzplMDozMjplMDoyMDpiNzoyYzozZjoxOToyZjowNjoyODphMjo1OTozYToxOTphNzowZjowNjo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6NTg6NDY6OGQ6NTU6ZjU6OGU6NDk6N2U6NzQ6Mzk6ODI6ZDI6YjU6MDA6MTA6YjY6ZDE6NjU6Mzc6NGE6Y2Y6ODM6YTc6ZDQ6YTM6MmQ6Yjc6Njg6YzQ6NDA6OGUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk0KTVNJd0lBWURWUVFLRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RApaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVCmNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeU1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTMKV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZwpVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU0l3CklBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySApVVitycERLbVlZZTJiZytHMGpBQ2wvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNClRYUGI4NjVQeDFiVldxZVdpZnJ6cTJqVUk0WlpKODhKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlUKQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDRmT1F0Zi9Xc1grc1duN0V0MGJyTQprVUozVENYSmtEaHYyL0RNKzQ0ZWwxaysxV0JPNWdVbzdVbDVFMHU2U05zditYTFRPY3IrSDlnMGN2VzBRTTh4CkFjUHMzaEV0RjEwZnVGRFJYaG1uYWQ0SE15aktVSlg1cDFUTFZJWlFSYW41U1FJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUthb3JTTE9BVDJtby85aTBFaWRpMTV5CnNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2pqU2ZlQzRKajBPN2VERGQ1UVZzaXNyQ2FRVnltY09EVTBIZkwKSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMW1TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOApKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqWnQzaHJ2SkJXOHFZClZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYWE6MDg6OGY6ZjY6Zjk6N2I6Yjc6ZjI6YjE6YTc6MWU6OWI6ZWE6ZWE6YmQ6NzkKIyBTSEExIEZpbmdlcnByaW50OiBjZjo5ZTo4Nzo2ZDpkMzplYjpmYzo0MjoyNjo5NzphMzpiNTphMzo3YTphMDo3NjphOTowNjoyMzo0OAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZDg6OGY6ZTE6MTA6MWM6NDE6YWU6M2U6ODA6MWI6Zjg6YmU6NTY6MzU6MGU6ZTk6YmE6ZDE6YTY6Yjk6YmQ6NTE6NWU6ZGM6NWM6NmQ6NWI6ODc6MTE6YWM6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQW1PZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJmTVFzd0NRWURWUVFHRXdKVVZ6RVMKTUJBR0ExVUVDZ3dKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVQpWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3T0RJNE1EY3lORE16CldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKVkVGSlYwRk8KTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkUKQWNLMEhNTXhRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISApLM1hMZkordXRkR2RJemRqcDl4Q29pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYClJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3oKclgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXJ5K1VQaXpnTjdncjgvZytZbnpBeAozV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3EKaGtpRzl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQwpNRXJKay85cTU2WUFmNGxDbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzClhlYlE3OU5xWnA0VktJVjY2SUlBckI2bkNXbFdRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkQKbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWVQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bgphc3BIWWNONitOT1NCQis0SUlUaE5sUVd4MERlTzRwejNOL0dDVXpmN05yLzFGTkNvY255WWgwaWd6eVh4ZmtaCllpZXNaU0xYMHp6RzVZNnlVOHhKenJ3dy9uc09NNUQ3N2RJVWtSOEhydz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNmM6Mzk6N2Q6YTQ6MGU6NTU6NTk6YjI6M2Y6ZDY6NDE6YjE6MTI6NTA6ZGU6NDMKIyBTSEExIEZpbmdlcnByaW50OiA1ZjozYjo4YzpmMjpmODoxMDpiMzo3ZDo3ODpiNDpjZTplYzoxOToxOTpjMzo3MzozNDpiOTpjNzo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogNTE6M2I6MmM6ZWM6Yjg6MTA6ZDQ6Y2Q6ZTU6ZGQ6ODU6Mzk6MWE6ZGY6YzY6YzI6ZGQ6NjA6ZDg6N2I6Yjc6MzY6ZDI6YjU6MjE6NDg6NGE6YTQ6N2E6MGU6YmU6ZjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREJkTVFzd0NRWURWUVFHRXdKS1VERWwKTUNNR0ExVUVDaE1jVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZQpVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmhkR2x2YmlCU2IyOTBRMEV5TUI0WERUQTVNRFV5T1RBMU1EQXpPVm9YCkRUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnkKZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5YVhSNUlFTnZiVzExYm1sagpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkFWCk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3IKemJsK2RwKysrVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTQpWQVgzTnVSRmczc1VaZGJjREUzUjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRCmhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5Wc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V08Kb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUtFT3RPZ2hZNnJDY01VL0d0MVNTdwphd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOFFJSDRENWNzCk9QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRgpjb0p4RGpyU3pHK250S0VqdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjCm9rZ2ZHVCtPayt2eCtoZnV6VTdqQkJKVjF1WGszZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDgKdC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cXRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeQoxVWtDOWdMbDlCL3JmTm1XVmFuLzdJcjVtVWYvTlZvQ3FnVExpbHVIY1NtUnZhUzBlZzI5bXZWWEl3QUhJUmMvClNqblJCVWtMcDdZM2dhVmRqS296WG9Fb2ZLZDlKK3NBcm8wMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNzM6OWY6NGM6NGI6NzM6NWI6Nzk6ZTk6ZmE6YmE6MWM6ZWY6NmU6Y2I6ZDU6YzkKIyBTSEExIEZpbmdlcnByaW50OiBmZTo0NTo2NTo5Yjo3OTowMzo1Yjo5ODphMTo2MTpiNTo1MToyZTphYzpkYTo1ODowOTo0ODoyMjo0ZAojIFNIQTI1NiBGaW5nZXJwcmludDogYmM6MTA6NGY6MTU6YTQ6OGI6ZTc6MDk6ZGM6YTU6NDI6YTc6ZTE6ZDQ6Yjk6ZGY6NmY6MDU6NDU6Mjc6ZTg6MDI6ZWE6YTk6MmQ6NTk6NTQ6NDQ6MjU6OGE6ZmU6NzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXgKUkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwCll5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXcKTmpFek5EazFNbG9YRFRNeE1USXdNVEV6TkRrMU1sb3dnWlV4Q3pBSkJnTlZCQVlUQWtkU01VUXdRZ1lEVlFRSwpFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRU5sCmNuUXVJRUYxZEdodmNtbDBlVEZBTUQ0R0ExVUVBeE0zU0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCU2IyOTBRMEVnTWpBeE1UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLbFRBT011cHZhTyttRFlMWlUrK0N3cVZFN051WVJobEZoUGp6Mkw1RVB6CmRZbU5VZVRETjlLS2lFMTVIcmNTM1VONFNvcVM1dGRJMVEra09pbEVOYmdIOW1nZFZjMDRVZkNNSkRHRnI0UEoKZmVsM3IrMGFlNTBYK2JPZE9GQVBwbHA1a1lDdk42Nm0wekg3dFNZSm5UeGE3MUhGSzkrV1hlc3lIZ0xhY0VucwpiZ3pJbWplTjkvRTJZRXNtTElLZTBIanpEUTlqcEZFdzRma3JKeElIMk9xOUdHS1lzRmszZmI3dTh5QlJRbHFECjc1TzZhUlh4WXAyZm1UbUNvYmQwTG92VXhRdDdML0RJQ3RvOWVRcWFreHlsS0hKemtVT2FwOUZOaFlTNXFYU1AKRkVESDNONnNRV1JzdEJtYkFtTnRKR1NQUkxJbDZzNWRkQXhqTWx5TmgrVUNBd0VBQWFPQmlUQ0JoakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVwcEZDL1JOaFNpT2VDS1FwCjVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQThNQVdDQXk1bmNqQUZnZ011WlhVd0JvSUVMbVZrZFRBR2dnUXUKYjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdWIzSm5NQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0WGRNaUthaHNvZzJwCjZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jNwpkSXNYUlNaTUZwR0QvbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzCk5ucS9vbk42OTQvQnRacWhGTEtQTTU4Tjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWEkKbDdXZG1wbE5zRHo0U2dDYlpOMmZPVXZSSjllNAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBTdWJqZWN0OiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIExhYmVsOiAiQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogNjI3MTg0NDc3MjQyNDc3MDUwOAojIE1ENSBGaW5nZXJwcmludDogNjk6YzE6MGQ6NGY6MDc6YTM6MWI6YzM6ZmU6NTY6M2Q6MDQ6YmM6MTE6ZjY6YTYKIyBTSEExIEZpbmdlcnByaW50OiBmMzo3MzpiMzo4NzowNjo1YToyODo4NDo4YTpmMjpmMzo0YTpjZToxOToyYjpkZDpjNzo4ZTo5YzphYwojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6OTI6NjA6ODQ6ZWM6OTY6M2E6NjQ6Yjk6NmU6MmE6YmU6MDE6Y2U6MGI6YTg6NmE6NjQ6ZmI6ZmU6YmM6Yzc6YWE6YjU6YWY6YzE6NTU6YjM6N2Y6ZDc6NjA6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUUKQmhNQ1NWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4dwpNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCklFTkJNQjRYRFRFeE1Ea3lNakV4TWpJd01sb1hEVE13TURreU1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUMKU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMQpPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTBJRU5CCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcDhiRXBTbWtMTy9sR01Xd1VLTnYKVVR1ZkNsckp3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWAo0YXk4SU1LeDRJTlJpbWxOQUpaYWJ5L0FSSDZqRHVTUnpWanUzUHZISGtWSDNTZTVDQUdmcGlFZDlVRXRMMHo5CktLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082emZCOUUxZkFYZEtEYTBoTXhLdWZnRnBiT3IzSnB5SS8KZ0Njeld3NjNpZ3hkQnpjSXkyelNla2NpUkRYRnpNd3VqdDBxN2JkOVpnMWZZVkVpVlJ2alJ1UGpQZEExWXByYgpyeFRJVzZITWlSdmhNQ2I4b0pzZmdhZEhId1Ryb3ptU0JwK1owNy9UNms5UW5Cbitsb2NlUEdYMm94Z2tnNFlRCjUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkYKYmU4bEVmS1hHa0poOTBxWDZJdXhFQWY2WllHeW9qblA5enovR1B2RzhWcUxXZUlDckh1UzBFNFVUMWxGOWd4ZQpLRit3NkQ5Rno4K3ZtMi83aE5OM1dwVnZySlNFbnU2OHdFcVBTcFA0UkNIaU1VVmhVRTRRMk9NMWZFd1p0TjRGCnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjhFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm4KZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNWpGNjZDeUNVM251RHVQL2pWbzIzRWVrNwpqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZaURySW4zaG03WW56CmV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTAplM0tId0dDbVNVeUlXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwCmpzTmpMaU5tc0dlK2I3YkFFemxncXFJMEpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHoKV29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4SzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VgpTTTBSRmJuQUtWeTA2SWozUGphdXQyTDlIbUxlY0hnUUhFaGIycnlrT0xwbjdWVStYbGZmMUFOQVRJR2swazlqCnB3bENDUlQ4QUtuQ2dITlBMc0JBMlJGN1NPcDZBc0RUNnlnQkpsaDB3Y0J6SW0yVGxmMDVmYnNxNC9hQzR5eVgKWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPawpmY3ZIbFhIbzJxTjh4Y0w0ZEpJRUc0YXNwQ0pUUUxhcy9reDJ6L3VVTXNBMW4zWS9idVdRYnFDbUpxSzRMTDdSCks0WDlwMmpJdWdFcnNXeDBIYmh6bGVmdXQ4Y2w4QUJNQUxKK3RndUxIUFBBVUo0bHVlQUkzalptL3plbDBidFUKWkN6Sko3VkxrbjVsLzlNdDRibE92SCtrUVNHUVFYZW1PUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVQpMeXNSSnlVM2VFeFJhckR6ekZoZEZQRnFTQlgvd2dlMnNZMFBqbHhRUnJNOXZ3R1lUN0paVkVjK05IdDRiVmFUCkxuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgU3ViamVjdDogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIExhYmVsOiAiVHJ1c3RpcyBGUFMgUm9vdCBDQSIKIyBTZXJpYWw6IDM2MDUzNjQwMzc1Mzk5MDM0MzA0NzI0OTg4OTc1NTYzNzEwNTUzCiMgTUQ1IEZpbmdlcnByaW50OiAzMDpjOTplNzoxZTo2YjplNjoxNDplYjo2NTpiMjoxNjo2OToyMDozMTo2Nzo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmMwOjM4OjBiOjMzOmMzOmY2OmE2OjBjOjg2OjE1OjIyOjkzOmQ5OmRmOmY1OjRiOjgxOmMwOjA0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMTpiNDo4Mjo5OTphYjphNToyMDo4ZjplOTo2MzowYTpjZTo1NTpjYTo2ODphMDozZTpkYTo1YTo1MTo5Yzo4ODowMjphMDpkMzphNjo3MzpiZTo4Zjo4ZTo1NTo3ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFp6Q0NBaytnQXdJQkFnSVFHeCt0dGlENUpOTTJhL2ZIOFl5Z1dUQU5CZ2txaGtpRzl3MEJBUVVGQURCRgpNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFZISjFjM1JwY3lCTWFXMXBkR1ZrTVJ3d0dnWURWUVFMCkV4TlVjblZ6ZEdseklFWlFVeUJTYjI5MElFTkJNQjRYRFRBek1USXlNekV5TVRRd05sb1hEVEkwTURFeU1URXgKTXpZMU5Gb3dSVEVMTUFrR0ExVUVCaE1DUjBJeEdEQVdCZ05WQkFvVEQxUnlkWE4wYVhNZ1RHbHRhWFJsWkRFYwpNQm9HQTFVRUN4TVRWSEoxYzNScGN5QkdVRk1nVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVZRZTU0N05kRGZ4SXpOanB2dG84QTJtZlJDNnFjK2dJTVBwcWRaaDhtUVJVTisKQU9xR2VTb0R2VDAzbVlsbXQrV0tWb2FUbkdoTGFBU01rNU1DUGpEU056b2lZWWtjaFU1OWo5V3ZlelgyZmloSAppVEhjRG5sa0g1blNXN3IrZjJDL3Jldm5QRGdwYWkvbGtRdFYvK3h2V05VdHlkNU1abkdQRE5jRTJnZm1IaGpqCnZTa0NxUG9jNFZ1NWc2aEJTTHdhY1kzbll1VXRzdXZmZk0vYnExcktNZkZNSXZNRkUvZUMrWE41REw3WFN4ekEKMFJVOGswRmswZWErSXhjaUFJbGVIMnVsckc2blM0enRvM0xtcjJOTkw0WFNGRFdhTGs2TTZqS1lLSWFoa1FsQgpPclRoNC9MNjhNa0tva0hkcWVNRHg0Z1ZPeHpVR3BUWG4yUlpFbTBDQXdFQUFhTlRNRkV3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUzYrbkVsZVl0WFFTVWhoZ3R4NjdKa0Rvc2haekFkQmdOVkhRNEUKRmdRVXV2cHhKWG1MVjBFbElZWUxjZXV5WkE2TElXY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSDVZLy8wMQpHWDJjR0UrZXNDdThqb3dVL3l5ZzJrZGJ3KytCTGE4RjZuUklXL00rVGdmSGJjV3prODhpTlZ5MlAzVW5Yd21XCnphRCt2a0FNWEJKVitKT0N5aW5wWGo5V1Y0czROdmRGR2t3b3paNUJ1TzFXVElTa1FNaTRzS1VyYVhBRWFzUDQKMUJJeStRN0RzZHd5aEVRc2I4dEdEK3BtUVE5UDhWaWxwZzBORDJIZXBaNWRmV1doUEJmbnFGVk83NkRIN2NaRQpmMVQxbytDUDhIeFZJbzhwdG9HajRXMU9MQnVBWit5dElKOE1ZbUhWbC85RDdTM0IybDBwS29VL3JHWHVoZzhGCmpaQmYzKzZmOUwvdUhmdVk1SCtRSzRSNEVBNXNTVlB2RlZ0bFJrcGRyN3I3T25JZHpmWWxpQjZYekNHY0tRRU4KWmV0WDJmTlhscnRJellFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogNDY6YTc6ZDI6ZmU6NDU6ZmI6NjQ6NWE6YTg6NTk6OTA6OWI6Nzg6NDQ6OWI6MjkKIyBTSEExIEZpbmdlcnByaW50OiA0OTowYTo3NTo3NDpkZTo4NzowYTo0NzpmZTo1ODplZTpmNjpjNzo2YjplYjpjNjowYjoxMjo0MDo5OQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6MTE6NDA6MjU6MTk6N2M6NWI6Yjk6NWQ6OTQ6ZTY6M2Q6NTU6Y2Q6NDM6Nzk6MDg6NDc6YjY6NDY6YjI6M2M6ZGY6MTE6YWQ6YTQ6YTA6MGU6ZmY6MTU6ZmI6NDgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ01pQlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZkhYdmZCQjlSMyswTWg5UFQxYWVUdU1nSGJvNFlmNUZrTnV1ZDFnMUxyCjZoeGhGVWk3SFFmS2pLNnczSmFkNnNOZ2tvYUNLSE9jVmdiL1MyVHdEQ28zU2JYbHp3eDg3dkZLdTNNd1pmUFYKTDRPMmZ1UG45WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MQoxSzJHU2N1VnIxUUdiTmdHRTQxYi8rRW1HVm5BSkxxQmNYbVFSRkJvSkpSZnVMTVI4U2xCWWFOQnl5TTIxY0h4Ck1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVQ3FUcWMvc0xVZWdUQnhqNkR2RXIwVlFWZlR6aDk3UVoKUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmZhd3JiRDAyVFRxaWd6WHN1OGxrQgphcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSXpSRm8xY2xyClVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGkKRlJobkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSUwpQL1RpelBKaGs5SDlaMnZYVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OCjlTRzlkS3BONm5JRFNkdkhYeDFpWThmOTNaSHNNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFAKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1tQWQrQmlrb0wxUnB6egp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVMThoCjlicXdPbEk1TEpLd2JBREo3ODRnN3dieWxwN3BwSFIvZWhiOHQvVzIreFViUDZ1bXdISmRFTEZ4N3J4UDQ2MnMKQTIwdWNTNnZ4T090bzcwTUVhZTAvMHF5ZXhBUUg2ZFhRYkxBcnZRc1dkWkhFSWp6SVZFcE1NcGdocTlHcXgzdApPbHV3bE41RTQwRUlvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvCitmc2ljZGw5c3oxR3Y3U0VyNUFjRDQ4U2FxL3Y3aDU2cmdKS2loY3JkdjZzVklra0xFOC90cktuVG95b2taZjcKS2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkRG5rTS9jcnFKSUJ5dzVjLzhuZXJReUlLeCt1MgpESVNDTElCclFZb0l3T3VsYTkrWkVzdUsxVjZBREpIZ0pnZzJTTVg2T0JFMS95V0RMZko2djlyOWp2Nmx5MFVzCkg4U0lVNjUzRHRtYWRzV09MQjJqdXRYc01xN0FxcXozMFhwTjY5UUg0a2ozSW82d3BKOXF6bzZ5c21EMG95TFEKSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNwo1dDk4YmlHQ3dXZzVUYlNZV0daaXpFcVFYc1A2SndTeGVSVjBtY3krclNEZUptQWM2MVpScHFQcTVLTS9wLzloCjNQRmFUV3d5STBQdXJLanU3a29TQ1R4ZGNjSytlZnJDaDJnZEMvMWNhY3dHMEpwOVZKa3F5VGthR2E5TEtrUHoKWTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU5ySmdXVnFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogM2Q6M2I6MTg6OWU6MmM6NjQ6NWE6ZTg6ZDU6ODg6Y2U6MGU6Zjk6Mzc6YzI6ZWMKIyBTSEExIEZpbmdlcnByaW50OiBkYTpmYTpmNzpmYTo2Njo4NDplYzowNjo4ZjoxNDo1MDpiZDpjNzpjMjo4MTphNTpiYzphOTo2NDo1NwojIFNIQTI1NiBGaW5nZXJwcmludDogZWQ6Zjc6ZWI6YmM6YTI6N2E6MmE6Mzg6NGQ6Mzg6N2I6N2Q6NDA6MTA6YzY6NjY6ZTI6ZWQ6YjQ6ODQ6M2U6NGM6Mjk6YjQ6YWU6MWQ6NWI6OTM6MzI6ZTY6YjI6NGQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ015QlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklETWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWGFDcFVXVU9PVjhsNmRkakVHTW5xYjhSQjJ1QUNhdFZJMnpTUkhzSjhZClpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0UKTjNjb1RSaVI1ci9WVXYxeExYQSs1OGJFaXVQd0tBdjBkcGloaTRkVnNqb1QvTGMrSnplT0l1T29UeXJ2WUxzOQp0em5ERGdGSG1WMFNUOXREK2xlaDdmbWR2aEZISmxzVG1LdGRGb3F3Tnh4WG5VWC9pSlkydjd2S0IzdHZoMlBYCjBESnExbDFzRFBHemJqbmlhekV1T1FBbkZONDR3T3daWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMKLzNBVEFPdXg5VE42UzlaVitBV05TMm13OWJNb05sd1V4RkZ6VFdzTDhUUUgyeGM1MTl3b2UydjFuL011d1U4WApLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVi9hZm1pU1RZCnpJdzBiT0lqTDlrU0dpRzVWWkZ2QzVGNUdReXRRSWdMY09KNjBnN1lhRWk3Z2hNNUVGanAyQ29IeGhMYldOdlMKTzFVUVJ3VVZaMkorR0dPbVJqOEpEbFF5WHI4Tllub243NERvMjlsTEJsbzNXaVhRQ0JKMzFHOEpVSmM5eUIzRAozNHhGTUZiRzAyU3JadlBBWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQCks5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXFqNkc4QmFWbW9zOGJkcktFWkxGTU9WTEFNTHJ3akVzQ3NMYTMKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkVlNHpmL2xiKzc0c3V3dgpUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFBQ0FqClFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYUwpJR3JzL0NJQktNK0d1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEyCkhKTHc1UVkzM0tibWtKczRqMXhyRzBhR1EwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2EKTzVTM0hXQ250WnpuS1dsWFdwdVRla013R3dQWFlzaEFwcXI4Wk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94dgowMzNhU0YvcnRKQzhMYWtjQzZ3YzFhSm9JSUFFMXZ5eGp5KzdTakVOU29ZYzYrSTJLU2IxMnRqRThuVmh6MzZ1CmRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJejZNa0UKa2JJUk5CRSs2dEJER1I4RGs1QU0vMUU5Vi9SQmJ1SExvTDdyeVdQTmJjemsrRGFxYUozdHZWMlhjRVFOdGc0MQozT0VNWGJ1Z1VaVExmaGJyRVMramtrWElUSEhadk1tWlVsZEdMMURQdlRWcDlEMFZ6Z2FsTEE4KzlvRzZsTHZECnU3OWxlTktHZWY5Sk94cUREUERlZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHEKNC9nN3U5eE4xMlR5VWI3bXFxdGE2VEh1QnJ4enZ4TmlDcC9IdVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmYjo0MDphODo0ZTozOTo5Mjo4YToxZDpmZTo4ZToyZjpjNDoyNzplYTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU1OmE2OjcyOjNlOmNiOmYyOmVjOmNkOmMzOjIzOjc0OjcwOjE5OjlkOjJhOmJlOjExOmUzOjgxOmQxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZDo3MzpkYTpkMzoxYzo2NDo0ZjpmMTpiNDozYjplZjowYzpjZDpkYTo5Njo3MTowYjo5YzpkOTo4Nzo1ZTpjYTo3ZTozMTo3MDo3YTpmMzplOTo2ZDo1MjoyYjpiZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4TURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzlkWlB3WWlKdkpLN2dlbmFzZmIzWkpOVzR0L3pOCjhFTGc2M2lJVmw2Ym1sUWRUUXlLOXRQUGNQUlN0ZGlUQk9OR2huRkJTaXZ3S2l4VkE5Wkl3K0E1T08zeVhEdy8KUkx5VFBXR3JUczBOdnZBZ0oxZ09SSDhFR29lbDE1WVVOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNApocVgyaXlzNTJxTXpWTm42Y2hyM0loVWNpSkZyZjJibHcycUFzQ1R6MzRaRmlQMFpmM1dISHgreEd3cHpKRnU1ClplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXMGVEclhsdE0KRW5BTWJFUWdxeEhZOUJuMjBweFNOK2Y2dHNJeE8wclVGSm10eHhyMVhWLzZCN2g4RFIvV2d4NnpBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMxCkEvZDJPMkdDYWhLcUdGUHJBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3kKV0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYmZzRHVYbWtxSmE5YzFoM2Ewbm5KODVjcDRJYUgzZ1JaRC9GWgoxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUdWNwSDlzcnk5dWV0dVVnL3ZCYTN3VzMwCjZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2hQMEhIUndBMTFmWFQKOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwClRwUERwRlFVV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBTdWJqZWN0OiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIExhYmVsOiAiRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSIKIyBTZXJpYWw6IDExMjMyNDgyODY3NjIwMDI5MTg3MTkyNjQzMTg4ODQ5NDk0NTg2NgojIE1ENSBGaW5nZXJwcmludDogNDM6NWU6ODg6ZDQ6N2Q6MWE6NGE6N2U6ZmQ6ODQ6MmU6NTI6ZWI6MDE6ZDQ6NmYKIyBTSEExIEZpbmdlcnByaW50OiBjOTphODpiOTplNzo1NTo4MDo1ZTo1ODplMzo1Mzo3NzphNzoyNTplYjphZjpjMzo3YjoyNzpjYzpkNwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6ODQ6YmE6NDM6NDI6OTA6ODU6MTY6ZTc6NzU6NzM6YzA6OTk6MmY6MDk6Nzk6Y2E6MDg6NGU6NDY6ODU6Njg6MWY6ZjE6OTU6Y2M6YmE6OGE6MjI6OWI6OGE6NzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBekNDQXV1Z0F3SUJBZ0lRVklENW9IUHRQd0JNeW9uWTQzSG1TakFOQmdrcWhraUc5dzBCQVFVRkFEQjEKTVFzd0NRWURWUVFHRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MQpjekVvTUNZR0ExVUVBd3dmUlVVZ1EyVnlkR2xtYVdOaGRHbHZiaUJEWlc1MGNtVWdVbTl2ZENCRFFURVlNQllHCkNTcUdTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNQ0lZRHpJd01UQXhNRE13TVRBeE1ETXdXaGdQTWpBek1ERXkKTVRjeU16VTVOVGxhTUhVeEN6QUpCZ05WQkFZVEFrVkZNU0l3SUFZRFZRUUtEQmxCVXlCVFpYSjBhV1pwZEhObApaWEpwYldsemEyVnphM1Z6TVNnd0pnWURWUVFEREI5RlJTQkRaWEowYVdacFkyRjBhVzl1SUVObGJuUnlaU0JTCmIyOTBJRU5CTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x3YTJsQWMyc3VaV1V3Z2dFaU1BMEdDU3FHU0liM0RRRUIKQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJSU1EczRNVkxxd2Q0bGZORTd2c0xEUDkwam1HN3NXTHFJOWlyb1dVeQpldXVPRjArVzJBcDdrYUpqYk1lTVRDNTV2NmtGL0dsY2xZMWkrYmx3N2NOUmZkQ1Q1bXpyTUV2aHZIMi9VcHZPCmJudGw4aml4d0tJeTcyS3lhT0JoVThFMmxmL3NsTG8ycnB3Y3B6SVA1WHkweG05MC9Yc1k2S3hYN1FZZ1N6SXcKV0Z2OXpham1vZnh3dkk2U2M5dVhwM3docmozQjlVaUhiQ2U5bnlWMGdWV3c5M1gyUGFSa2E5WlA1ODVBclEvZApNdE84aWhKVG1NbUoreEFkVFg3TmZoOVdEU0Z3aGZZZ2d4LzJ1aDhFaitwM2lEWEUvK3BPb1l0TlAyTWJSTU5FCjFDVjJ5cmVOMXg1S1ptVE5YTVdjZytIQ0NJaWE3RTZqOFQ0Y0xObHNIYUZMQWdNQkFBR2pnWW93Z1ljd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCTHlXajdxVmh5Lwp6UWFzOGZFbHlhbEwxQlNaTUVVR0ExVWRKUVErTUR3R0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREFRWUlLd1lCCkJRVUhBd01HQ0NzR0FRVUZCd01FQmdnckJnRUZCUWNEQ0FZSUt3WUJCUVVIQXdrd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnRUJBSHYyNU1BTnFobEh0MDFYby82dHU3RnExUStlMitSanhZNmhVRmFUbHJnNHdDUWlacnhURkdHVgp2OURIS3BZNVAzMG9zeEJBSVdyRXI3QlNkeGpobHRoV1hlUGRObDRkcDFCVW9NVXE1S3FNbElwUG5UWC9kcVFHCkU1R2lvbjBBUkQ5VjA0SThHdFZidkZaTUlpNUdRNG9rUUMzekVyZzdjQnFrbHJrYXI0ZEJHbW9ZRFFaUHh6NXUKdVNsTkRVbUpFWWN5VytaTEJNamtYT1owYzVSZEZwZ1RsZjc3MjdGRTVUcHdyRGRyNXJNemNpakpzMWVnOWdJVwppQVlMdHFaTElDalUzajJMclRjRlUzVCtic3k4UXhkeFh2bkZ6QnFwWWU3M2RnenpjdlJ5cmM5eUFqWUhSOC92CkdWQ0pZTXpwSkpVUHdzc2Q4bTkya01mTWRjR1d4WjA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSIKIyBTZXJpYWw6IDYyMzYwMwojIE1ENSBGaW5nZXJwcmludDogY2Q6ZTA6MjU6Njk6OGQ6NDc6YWM6OWM6ODk6MzU6OTA6Zjc6ZmQ6NTE6M2Q6MmYKIyBTSEExIEZpbmdlcnByaW50OiA1ODplODphYjpiMDozNjoxNTozMzpmYjo4MDpmNzo5YjoxYjo2ZDoyOTpkMzpmZjo4ZDo1ZjowMDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6ZTc6YTQ6NDI6YWM6ZjA6ZWE6NjI6ODc6MDU6MDA6NTQ6YjU6MjU6NjQ6YjY6NTA6ZTQ6ZjQ6OWU6NDI6ZTM6NDg6ZDY6YWE6Mzg6ZTA6Mzk6ZTk6NTc6YjE6YzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnTWpBd09UQWVGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhCk1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU0KSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOT3lTczk2Uis5MW15UDZPaS9XVUVXSk5UckdhOXYrMndCb3FPQURFUjAzClVBaWZUVXBvbERXelU5R1VZNmNnVnEvZVVYanNLajN6U0VoUVBncmZSbFdMSjIzREVFME5rVkpEMklmZ1hVNDIKdFNIS1h6bEFCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5Ugp5U1BvY3E2MHZGWUpmeExMSExHdktaQUt5VlhNRDlPMEd1MUhOVnBLN1p4ekJDSFFxcjBNRTdVQXlpWnN4R3NNCmxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6cCtoblVxdVZIK0JHUHRpa3c4cGF4VEdBNkVpYW41UnAKL2huZDJITjhnY3FXM283dHN6SUZaWVEwNXViOVZ4QzFYM2EvTDdBUURjVUNBd0VBQWFPQ0FSb3dnZ0VXTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQM2FGTVNmTU40aHZSNUNPZnlyWXlOSjRQR0VNQTRHCkExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1VtOXZkQ1V5TUVOc1lYTnpKVEl3TXlVeQpNRU5CSlRJd01pVXlNREl3TURrc1R6MUVMVlJ5ZFhOMEpUSXdSMjFpU0N4RFBVUkZQMk5sY25ScFptbGpZWFJsCmNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0dQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnMKTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBd09TNWpjbXd3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptMkg2Tk1MVndNZW5pCmFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0Swp6Q1VxTlFUNFlKRVZkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4ClBJV21hd29tRGVDVG1HQ3Vmc1lrbDRwaFg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1kKSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IgojIFNlcmlhbDogNjIzNjA0CiMgTUQ1IEZpbmdlcnByaW50OiBhYTpjNjo0MzoyYzo1ZToyZDpjZDpjNDozNDpjMDo1MDo0ZjoxMTowMjo0ZjpiNgojIFNIQTEgRmluZ2VycHJpbnQ6IDk2OmM5OjFiOjBiOjk1OmI0OjEwOjk4OjQyOmZhOmQwOmQ4OjIyOjc5OmZlOjYwOmZhOmI5OjE2OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZTpjNTo0OTo2Yjo5ODo4YzplOTo4NjoyNTpiOTozNDowOToyZTplYzoyOTowODpiZTpkMDpiMDpmMzoxNjpjMjpkNDo3MzowYzo4NDplYTpmMTpmMzpkMzo0ODo4MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQWVGdzB3T1RFeE1EVXdPRFV3TkRaYUZ3MHlPVEV4TURVd09EVXcKTkRaYU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVgpCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmU2VncG4KbGpnSjloQk9sU0p6bVkzYUZTM25CZndaY3lLM2pwZ0F2RHc5cktGcys5WjVKVXV0OE14azJvZytLYmdQQ2RNMAozVFAxWXRIaHpSbnA3aGhQVEZpdTRoN1dERnNWV3RnNnVNUVlaQjdqTTdLMWlYZE9ETC9abEdzVGwyOFNvLzZaCnFRVE1GZXhnYURidENIdTM5YitUN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFIKcDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjBzVVlnb3ZzZU8zRHZrNWg5akhPVzhzWHZoWEN0S1NiOApIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNTExSDNhNlVDQXdFQUFhT0NBU1F3CmdnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2Y29wOU50ZWEKSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGdwpPaTh2WkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoCmMzTWxNakF6SlRJd1EwRWxNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUUKUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScGIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdApkSEoxYzNRdWJtVjBMMk55YkM5a0xYUnlkWE4wWDNKdmIzUmZZMnhoYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1ClkzSnNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEwN1h0YVBLU1VpTzhhRVhVSEw3UCtQUG9lVVNicmgvWXAKM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQpuc0t0akhFaDhscHJyOTg4VGxXdnNvUmxGSW01ZDhzcU1iN1BvMjNQYjBpVU1rWnY1M0dNb0thRUdUY0g4Z05GCkNTdUdkWHpmWDJsWEFOdHUyS1p5SWt0UTFIV1lWdCszR1A5RFExQ3Vla1I3OEhsUjEwTTlwOU9CMC9ESlQ3bmEKeHBlRzBJTEQ1RUp0L3JEaVpFNE9KdWRBTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWApLVnd2dm9GQnVZei82bjFnQnA3TjF6M1RMcU1WdktqbUp1VnZ3OXk0QXlIcW54YnhMRlMxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIFN1YmplY3Q6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgTGFiZWw6ICJDQSBEaXNpZyBSb290IFIyIgojIFNlcmlhbDogMTA1NzIzNTA2MDIzOTMzMzgyMTEKIyBNRDUgRmluZ2VycHJpbnQ6IDI2OjAxOmZiOmQ4OjI3OmE3OjE3OjlhOjQ1OjU0OjM4OjFhOjQzOjAxOjNiOjAzCiMgU0hBMSBGaW5nZXJwcmludDogYjU6NjE6ZWI6ZWE6YTQ6ZGU6ZTQ6MjU6NGI6Njk6MWE6OTg6YTU6NTc6NDc6YzI6MzQ6Yzc6ZDk6NzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUyOjNkOjRhOjAzOjZkOjdiOjcwOmU5OmY1Ojk1OmIxOjQyOjIwOjc5OmQyOmI5OjFlOmRmOmJiOjFmOmI2OjUxOmEwOjYzOjNlOmFhOjhhOjlkOmM1OmY4OjA3OjAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WCkJBWVRBbE5MTVJNd0VRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXUKTVJrd0Z3WURWUVFERXhCRFFTQkVhWE5wWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReQpNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3hFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4CkV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScGMybG5JRkp2YjNRZ1VqSXcKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2lvOFFBQ2RhRlhTMXRGUGJDdzNPZQpOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IClBXU2I2V2lheHN3YlA3cStzb3MwQWk2WVZSbjhqRytxWDlwTXprMERJYVBZMGpTVFZwYkxUQXdBRmp4ZkdzM0kKeDJ5bXJkTXhwN3pvNWVGbTF0TDdBN1JCWmNrUXJnNEZZOGFBYW1rdy9kTHVrTzhOSjkrZmxYUDA0U1hhYkJiZQpRVGcwNm92ODBlZ0VGR0V0UVg2c3gzZE95MUZVKzE2U0dCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSCnl5WCtoazRrTGxZTWVFMmVBUkttSzZjQlpXNThZaDJFaE4vcXdHdTFwU3FWZzhOVEVReHpIUXV5UnBEUlFqck8KUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmE1QmVueTkxMgpIOUFaZHVnc0JiUFduRFRZbHR4aGg1RUY1RVFJTThIYXVRaGwxSzZ5TmczcnVqaTZET1dibnV1Tlp0Mlp6OWFKClFmWUVrb29wS1cxck9oem5kWDBDY1E3endPZTl5eG5kbldDeXdtWmd0ckVFN3NubWhybWFaa0NvNXhIdGdVVUQKaS9abldlakJCaEc5M2MrQUFrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9ScwpuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpRmgvZjVEY2ZFWFA3a0FwbFE2SU5mUGdHQVZVemZiQU51UFQxCnJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dVF1MHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWYKR29wVHB0aTcyVFZWc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYgpsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmVkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthCitlbFNMb3RnRXF2ODlXQlc3eEJjaThRYVF0eURXMlFPeTdXODFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWwKVEZ0eHllZ3h2dWc0QmtpaEd1THEwdDRTT1ZnYS80QU9nblhtdDhrSGJBN3Yvemp4bUhIRXQzOE9GZEFsYWIwaQpuU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDF1dEkzCmd6aFRPRFk3ejJ6cCtXc08wUHNFNkU5MzEyVUJlSVlNZWo0aFl2Ri9ZM0VNeVo5RTI2Z25vblcrYm9FKzE4RHIKRzVnUGNGdzBzb3JNd0lVWTYyNTZzL2Rhb1FlL3FVS1M4MkFpbCtRVW9RZWJUbmJBam4zOXBDWEhSKzMvSDNPcwp6TU9sNlc4S2pwdGx3bENGdGFPZ1V4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4Ckw0eXNFcjN2UUNqOEtXZWZzaE5QWmlURVV4bnBIaWtWNytadHNIOHRaLzN6YkJ0MVJxUGxTaGZwcE5jTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgU3ViamVjdDogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgTGFiZWw6ICJBQ0NWUkFJWjEiCiMgU2VyaWFsOiA2ODI4NTAzMzg0NzQ4Njk2ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBkMDphMDo1YTplZTowNTpiNjowOTo5NDoyMTphMTo3ZDpmMTpiMjoyOTo4MjowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkzOjA1OjdhOjg4OjE1OmM2OjRmOmNlOjg4OjJmOmZhOjkxOjE2OjUyOjI4Ojc4OmJjOjUzOjY0OjE3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTo2ZTpjMDoxMjplMTphNzpkYTo5ZDpiZTozNDoxOTo0ZDo0Nzo4YTpkNzpjMDpkYjoxODoyMjpmYjowNzoxZDpmMToyOTo4MTo0OTo2ZTpkMTowNDozODo0MToxMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRQpBd3dKUVVORFZsSkJTVm94TVJBd0RnWURWUVFMREFkUVMwbEJRME5XTVEwd0N3WURWUVFLREFSQlEwTldNUXN3CkNRWURWUVFHRXdKRlV6QWVGdzB4TVRBMU1EVXdPVE0zTXpkYUZ3MHpNREV5TXpFd09UTTNNemRhTUVJeEVqQVEKQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORApWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNiCnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTWptb1kKSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXbwpHMmlvUGVqMFJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBCmxIUHJ6ZzVYUEFPQk9wMEtvVmREYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHIKSUE4d0tGU1ZmK0R1emdwbW5kRkFMVzRpcjUwYXdRVVowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLwowS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFER1d1em5kTjl3cnFPREplcld4NWVICms2Zkdpb296bDJBM0VENlhQbTRwRmRhaEQ5R0lMQktmYjZxa3hrTHJRYUxqbFVQVEFZVnRqcnM3OHlNMngvNDcKNEtFbEIwaXJ5WWwwL3dpUGdML0FsbVh6N3V4TGFMMmRpTU14czBEeDZNLzJPTHVjNU5GLzFPVlltM3o2MVBNTwptM1dSNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhCmNYcGthdGNuWUdNTjI4NUo5WTBma0lreUYvaHpRN2pTV3BPR1lkYmhkUXJxZVdaMmlFOXg2d1FsMWdwYWVwUGwKdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSS1EyNlpJTUFwY1FyQVpRSURBUUFCbzRJQ3l6Q0NBc2N3ZlFZSQpLd1lCQlFVSEFRRUVjVEJ2TUV3R0NDc0dBUVVGQnpBQ2hrQm9kSFJ3T2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzClpXRmtiV2x1TDBGeVkyaHBkbTl6TDJObGNuUnBabWxqWVdSdmN5OXlZV2w2WVdOamRqRXVZM0owTUI4R0NDc0cKQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgpWdXFCNVRiTWpCNC92VEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk5LSHRPUGZOeWVUClZmWlc2b0hsTnN5TUhqKzlNSUlCY3dZRFZSMGdCSUlCYWpDQ0FXWXdnZ0ZpQmdSVkhTQUFNSUlCV0RDQ0FTSUcKQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQQpjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmhBTzBBZWdBZ0FHUUFaUUFnQUd3QVlRQWdBRUVBClF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQVl3QnVBRzhBYkFCdkFHY0EKN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqQUhRQQpjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBClF3QlFBRk1BSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUEKY3pBd0JnZ3JCZ0VGQlFjQ0FSWWthSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdQphSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMGRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0CmFXNHZRWEpqYUdsMmIzTXZZMlZ5ZEdsbWFXTmhaRzl6TDNKaGFYcGhZMk4yTVY5a1pYSXVZM0pzTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBWEJnTlZIUkVFRURBT2dReGhZMk4yUUdGalkzWXVaWE13RFFZSktvWklodmNOQVFFRgpCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwCkQ3MEVSOW0rMjdVcDJwdlpycW1aMWRNOE1KUDFqYUdvL0FhTlJQVEtGcFY4TTl4aWk2ZzMrQ2ZZQ1MwYjc4Z1UKSnlDcFpFVC9MdFoxcW14TllFQVpTVU5VWTlyaXpMcG01VTlFZWx2WmFvRXJRTlYvK1FFbldDekk3VWlSZkQrbQpBTS9FS1hNUk50NkdHVDZkN2htS0c5V3c3WTQ5bkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBECnZWK0pIYW5Cc015WjRrMEFDdHJKSjF2bkU1QmM1UFV6b2xWdDNPQUpUUyt4SmxzbmRRQUp4R0ozS1FoZm5sbXMKdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXM3NDUGRLNmpUMmlXSAo3ZWhWUkUySTlEWitoSnA0clBjT1Zra08xak1sMW9SUVFtd2dFaDBxMWI2ODhuQ0JwSEJndmdXMW01NEVSTDVoCkk2enBwU1NNRVlDVVdxS2l1VW5Td2R6UnArMHhFU3llR2FidTRWWGh3T3JQRFlUa0Y3ZWlmS1hlVlNVRzdzekEKaDF4QTJzeVZQMVhnTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RgpkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQzZGpESjlldytmN1pmYzNRbjQ4TEZGaFJueStMd3pndDN1aVAxbzJICnBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcEVmYlJEMHRWTkVZcWk0WTcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDMyNjIKIyBNRDUgRmluZ2VycHJpbnQ6IGY5OjAzOjdlOmNmOmU2OjllOjNjOjczOjdhOjJhOjkwOjA3OjY5OmZmOjJiOjk2CiMgU0hBMSBGaW5nZXJwcmludDogOWM6YmI6NDg6NTM6ZjY6YTQ6ZjY6ZDM6NTI6YTQ6ZTg6MzI6NTI6NTU6NjA6MTM6ZjU6YWQ6YWY6NjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU5Ojc2OjkwOjA3OmY3OjY4OjVkOjBmOmNkOjUwOjg3OjJmOjlmOjk1OmQ1Ojc1OjVhOjViOjJiOjQ1OjdkOjgxOmYzOjY5OjJiOjYxOjBhOjk4OjY3OjJmOjBlOjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJQ0RMNHdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNWRmN4CkVqQVFCZ05WQkFvVENWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVQKVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEUVRBZUZ3MHhNakEyTWpjd05qSTRNek5hRncwek1ERXlNekV4TlRVNQpOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUtFd2xVUVVsWFFVNHRRMEV4RURBT0JnTlZCQXNUCkIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDbkpmRgoxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6CjBBTGZVUFpWcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2gKTUJ3cW9KaW1GYjN1L1JrMjhPS1JRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSAp6SWgxSHJ0c0J2K2JhejRYN0dHcWNYekdIYUwzU2VrVnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjCjQ2S29rV29md3BGRmlGemxtTGh4cFJVWnlYeDFFY3h3ZEU4dG14MlJSUDFXS0tEK3U0WnF5UHBjQzFqY3hrdDIKeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTlzeTJzYlpDaQpsYUxPejlxQzV3YzBHWmJwdUNHcUtYNm1PTDZPS1VvaFpua2ZzOE8xQ1dmZTF0UUhSdk1xMnVZaU4yRExnYllQCm9BL3B5SlYvdjFXUkJYclBQUlhBYjk0SmxBR0QxelFiekVDbDhMaWJaOVdZa1R1bmhIaVZKcVJhQ1BncmRMUUEKQkR6ZnVCU082Titwald4bmtqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRQpxWVNqTXErdTdtc1hpN0t4L216aGtJeUlxSmRJenNoTnkvTUd6MTlxQ2tLeEhoNTNMNDZnNXBJT0J2d0ZJdEltCjRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVh6U0JkdStXSGRYbHRka0NZNFFXd2E2Z2NGR245MHhITmNnTAoxeWc5aVhIWnFqTkI2aFFiYkNFQXdHeENHWDZmYVZzZ1F0K2kwdHJFZkpkTGpiRG9yTWp1cFdrRW1RcVNwcXNuCkxocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0YKSDZ2UE5Pdy9LUDRNOFZlR1RzbFY5eHpVMktWOUJucHYxZDhRMzRGT0lXV3h0dUVYZVpWRkJzNWZ6TnhHaVdObwpSSTJUOUdSd29EMmRLQVhET1hDNFluc2cvZVRiNlFpaHVKNDlDY2RQK3l6NGszWkIzbExnNFZmU25RTzhkNTcrCm5pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZ2xQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gKMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQQTlnSzhreGtScjA1WXVXVwo2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM21pNFRXCm5zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWoKd2ExOWhBTThFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXegphR0hRUmlhcElWSnBMZXN1eCt0M3pxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15Ckt3YlFCTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBTdWJqZWN0OiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBMYWJlbDogIlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEiCiMgU2VyaWFsOiAxOTkwNDE5NjY3NDEwOTAxMDc5NjQ5MDQyODcyMTc3ODY4MDE1NTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjQxOjQ5OjFiOjE4OjU2OjlhOjI2OmY1OmFkOmMyOjY2OmZiOjQwOmE1OjRjCiMgU0hBMSBGaW5nZXJwcmludDogNDM6MTM6YmI6OTY6ZjE6ZDU6ODY6OWI6YzE6NGU6NmE6OTI6ZjY6Y2Y6ZjY6MzQ6Njk6ODc6ODI6MzcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGRkOjY5OjM2OmZlOjIxOmY4OmYwOjc3OmMxOjIzOmExOmE1OjIxOmMxOjIyOjI0OmY3OjIyOjU1OmI3OjNlOjAzOmE3OjI2OjA2OjkzOmU4OmEyOjRiOjBmOmEzOjg5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Ck56RVVNQklHQTFVRUNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnYKYjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0TVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRApWUVFLREF0VVpXeHBZVk52Ym1WeVlURWZNQjBHQTFVRUF3d1dWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1LKzZ5ZndJYVB6YVNaVmZwM0YKVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBM0dWMQo3Q3BOWDhHSDlTQmxLNEdvUno2Skk1VXdGcEIvNkZjSFNPY1pycjlGWjdFM0d3WXEvdDc1ckgyRCsxNjY1SStYClo3NUxqbzFrQjFjNFZXazBOajBUU085UDR0Tm1IcVRQR3JkZU5qUFV0QWE5R0FIOWQ0UlFBRVgxakYzb0k3eCsKL2pYaDdWQjdxVENOR2RNSmptaG5YYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDcwo4MU10OEJ6MTdXdzVPWE9BRnNoU3NDUE40RDdjM1R4SG9MczFpdUtZYUl1KzViOXk3dEw2cGUwUzdmeVlHS2ttCmR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzRjBmVVRQSFNpWGsrVFQyWXFHSGUKT2g3UytGNEQ0TUhKSEl6VGpVM1RsVGF6TjE5alk1c3pGUEF0Sm10VGZJbU1Nc0p1N0QwaEFEbkpvV2ppVUlNdQpzRG9yOHphZ3JDL2tiMkhDVVFrNVBvdFR1YnRuMnR4VHVYWlpOcDFENVNEZ1BUSmdoU0pSdDhjenU5MFZMNlI0CnBnZDdnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnMKc2xFU2wxTXBXdFR3RWhEY1R3SzdFcEl2WXRRL2FVTjhEZGI4V0hVQmlKMVlGa3ZldXBEL1J3R0pCbXIyWDdLUQphck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CQUFHalB6QTlNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEClZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVdETlhyK251cUYrZ1RFakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObXpxak1EZnoxbWdibApkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGoKVFFwZ2NtTE5rUWZXcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZApZMmdlYSt6RFRZYTRFekF2WFVZTlIwUFZHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3ClE0V1F4WXBZeG1VS2VGZnl4aU1QQWRrZ1M5NFArNUtGZFNwY2M0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUkKT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9USnNqckROWW1pTGJBSk0rNwp2VnZyZFgzcENJNkdNeXg1ZHdscHBZbjhzM0NRaDNhUDB5SzdRczY5Y3dzZ0ppclFtejF3SGlSc3pZZDJxUmVXCnQ4OE5rdnVPR0ttWVNkR2UvbUJFY2lHNUdlM0M5VEh4T1VpSWtDUjFWQmF0enZUNGFSUmtPZnVqdUxwd1FNY24KSEwvRVZsUDZZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeApTSzIzNnRoWmlOU1F2eGF6MmVtc1dXRlV5Qnk2eXNISzRia2dUSTg2azRtbG9NeS8wL1oxcEhXV2JWWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgU3ViamVjdDogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBMYWJlbDogIkUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA3NjY3NDQ3MjA2NzAzMjU0MzU1CiMgTUQ1IEZpbmdlcnByaW50OiBiODphMTowMzo2MzpiMDpiZDoyMTo3MTo3MDo4YTo2ZjoxMzozYTpiYjo3OTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDUxOmM2OmU3OjA4OjQ5OjA2OjZlOmYzOjkyOmQ0OjVjOmEwOjBkOjZkOmEzOjYyOjhmOmMzOjUyOjM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiMDpiZjpkNToyYjpiMDpkNzpkOTpiZDo5MjpiZjo1ZDo0ZDpjMTozZDphMjo1NTpjMDoyYzo1NDoyZjozNzo4Mzo2NTplYTo4OTozOToxMTpmNTo1ZTo1NTpmMjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1N6Q0NCRE9nQXdJQkFnSUlhbWcrbkZHYnkxTXdEUVlKS29aSWh2Y05BUUVMQlFBd2diSXhDekFKQmdOVgpCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQStCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDCmFXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocGVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlYKQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMQpaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRFek1ETXdOVEV5TURrME9Gb1hEVEl6Ck1ETXdNekV5TURrME9Gb3dnYkl4Q3pBSkJnTlZCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQSsKQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQ2FXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocAplbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOClpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjFaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0dlUva3dWUkhvVmlWRjU2Qy9VWQpCNE91ZnE5ODk5U0thNlZqUXptNVMvZkR4bVNKUFpRdVZJQlNPVGtIUzB2ZGhRZDJoOHkvTDVWTXpIMm5QYnhICkQ1aHcrSXlGSG5TT2ttMGJRTkdaRGJ0MWJzaXBhNXJBaERHdnlrUEw2eXMwNkkrWGF3R2IxUTVLQ0twYmtuU0YKUTlPQXJxR0lXNjZ6Nmw3TEZwcDNSTWloOWxSb3p0NlBseXU2VzBBQ0RHUVh3TFdUemVIeEUyYk9ESG52MFpFbwpxMStnRWxJd2N4bU9qK0dNQjZMRHUwcnc2aDhWcU80bHpLUkcrQnNpNzdNT1E3b3NKTGpGTEZ6VUhQaGRaTDNECmsxNG9wejhuOFk0ZTB5cFFCYU5WMmN2bk9WUEFtSjZNVkdLTEpyRDNmWTE4NU1hZVprSlZna2Zuc2xpTlp2Y0gKZkM0MjVsQWNQOXRESk1XL2hrZDVzM2tjOTFyMEUreHMrRC9pV1IrVjdrSSt1YTJvTW9WSmwwYitTekdQV3N1dApkRWNmNlpHMzN5Z0VJcURVRDEzaWVVL3FiSVdHdmFpbXp1VDZ3K0d6cnQ0OFVlN0xFM3dCZjRRT1hWR1VuaE1NCnRpNmxUUGs1Y0Radmxzb3VERVJWeGNyNlhRS2ozOVprakZxekFRcXB0UXBIRi8vdmtVQXFqcUZHT2pHWTVSSDgKekx0SlZvcjh1ZEJobW05bGJPYkR5ejUxU2Y2UHArS0p4V2ZYblVZVFRqRjJPeVN6bmhGbGhxdC83eDNVK0x6bgpyRnBjdDFwSFhGWE9WYlFpY1Z0YkMvRFAzS0JoWk9xcDEyZ0tZNmZnRFQrZ3I5T3Ewbjd2VWFEbVVTdFZraFVYClU4dTNaZzVtVFBqNWRVeVE1eEp3eDBVQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZDN2oyN0pKMEp4VWVWejYKSnlyK3pFN1M2RTVVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUx1UGJza25RbkZSNQpYUG9uS3Y3TVR0TG9UbFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFGCk56cjBUYmRGNGtWMUpJKzJkMUxvSE5nUWsyWHo4bGtHcEQ0ZUtleGQwZENyZk9BS2tFaDQ3VTZZQTVuK0tHQ1IKSFRBZHVHTjhxT1kxdGZyVFlYYm0xZ2RMeW1tYXNvUjZkNU5GRnhXZkpOQ1lFeEwvdTZBdS9VNU1oL2pPWEtxWQpHd1hnQUVaS2dvQ2xNNHNvM08wNDA5L2xQdW4rKzFuZFlZUlAwbFNXRTJFVFBvK0FhYjZUUjdVMVE5SmF1ejFjCjc3TkNSODA3VlJNR3NBbmIvV1AyT29nS21XOSs0YzRiVTJwRVppTlJDSHU4VzFLaS9RWTNPRUJoajBxV3VKQTMKK0diSGVKQUFGUzZMclZFMVV3ZW9hMml1K1U0OEJ5Yk5DQVZ3ekRrL2RyMmwwMmNtQVlhbVU5SmdPM3hEZjFXSwp2SlVhd1NnNVRCOUQwcEgwY2xtS3VWYjhQN1NkMm5DY2RscU1RMUR1ampCeVRkLy9TZmZHcVdmWmJhd0NFZUk2CkZpV25XQWpMYjFOQm5FZzRSMmd6MGRmSGo5UjBJZFREQlpCNi84NldpTEVWS1YwanE5QmdvUkpQM3ZRWHpUTGwKeWIvSVE2MzlMbzd4citMMG1Qb1NIeURZd0tjTWhjV1E5RHN0bGlheExMNU1xK3V4MG9ySjIzZ1REeDRKblcyUApBSjhDMnNINkgzcDZDY1JLNW9ncWw1K0ppLzAzWDE4NnpqaFpoa3V2Y1F1MDJQSndUNTh5RStPd3AxZmwydHBECnk0UTA4aWpFNm0zMEt1L0JhM2JhKzM2N2hUelNVOEpOdm5IaFJkSDlJMmNORTNYN3oyVm5JcDJ1c0FuUkNmOGQKTkwvK0k1YzMwam42UFEwR0M3VGJPNk9yYjF3ZHRuN29zNEkwN1FaY0pBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMmI6OWI6OWU6ZTQ6N2I6NmM6MWY6MDA6NzI6MWE6Y2M6YzE6Nzc6Nzk6ZGY6NmEKIyBTSEExIEZpbmdlcnByaW50OiA1OTowZDoyZDo3ZDo4ODo0Zjo0MDoyZTo2MTo3ZTphNTo2MjozMjoxNzo2NTpjZjoxNzpkODo5NDplOQojIFNIQTI1NiBGaW5nZXJwcmludDogOTE6ZTI6ZjU6Nzg6OGQ6NTg6MTA6ZWI6YTc6YmE6NTg6NzM6N2Q6ZTE6NTQ6OGE6OGU6Y2E6Y2Q6MDE6NDU6OTg6YmM6MGI6MTQ6M2U6MDQ6MWI6MTc6MDU6MjU6NTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdIaGNOTURneE1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxWDlvYlgraHprZVhhWFBTaTVrZmw4MmhWWUFVZApBcVN6bTFuekhvcXZOSzM4RGNMWlNCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDCkZvVDZackFJeGxRamdlVE51VWsvOWs5dU4wZ29PQS9GdnVkb2NQMDVsMDNTeDVpUlVLckVSTE1qZlRsSDZWSmkKMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAyY3UrZmpPbGJwU0Q4RFQ2SWF2cQpqbktnUDZUZU1GdnZoazFxbFZ0RFJLZ1FGUnpsQVZmRm1QSG1CaWlScWlERnQxTW1VVU95Q3hHVldPSEFEM2JaCndJMThnZk55Y0o1di9ocU8yVjgxeHJKdk5IeStTRS9pV2puWDJKMTRucCtHUGdOZUdZdEVvdFhIQWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTLwpXU0EyQUhtZ29DSnJqTlh5WWRLNExNdUNTakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBTVFPaVlRc2ZkT2h5Ck5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazRyNnA4RlUzenRxT05wZlNPOWtTcHArZ2hsYTArQUdJV2lQQUMKdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZnZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWdwpJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSM3AxbTBJdlZWR2I2CmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUApCU2VPRTZGdXdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBTdWJqZWN0OiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgTGFiZWw6ICJBdG9zIFRydXN0ZWRSb290IDIwMTEiCiMgU2VyaWFsOiA2NjQzODc3NDk3ODEzMzE2NDAyCiMgTUQ1IEZpbmdlcnByaW50OiBhZTpiOTpjNDozMjo0YjphYzo3Zjo1ZDo2NjpjYzo3Nzo5NDpiYjoyYTo3Nzo1NgojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOmIxOmY1OjNlOjU1OjBjOjFkOmM1OmYxOmQ0OmU2OmI3OjZhOjQ2OjRiOjU1OjA2OjAyOmFjOjIxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMzo1NjpiZTphMjo0NDpiNzphOToxZTpiMzo1ZDo1MzpjYTo5YTpkNzo4Njo0YTpjZTowMTo4ZToyZDozNTpkNTpmODpmOTo2ZDpkZjo2ODphNjpmNDoxYTphNDo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRQpBd3dWUVhSdmN5QlVjblZ6ZEdWa1VtOXZkQ0F5TURFeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWURWUVFHCkV3SkVSVEFlRncweE1UQTNNRGN4TkRVNE16QmFGdzB6TURFeU16RXlNelU1TlRsYU1Ed3hIakFjQmdOVkJBTU0KRlVGMGIzTWdWSEoxYzNSbFpGSnZiM1FnTWpBeE1URU5NQXNHQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQwpSRVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1ZoVHVYYnlvN0xqdlBwdk1wCk5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cjU0ck0KVkQ2UVVNK0ExSlg3NkxXQzFCVEZ0cWxWSlZmYnNWRDJzR0JrV1hwcHp3TzNidzIreWo1dmRITHFxakFxYzJLKwpTWkZoeUJIK0RnTXE5Mm9nM0FJVkRWNFZhdnpqZ3NHMXhaMWtDV3lqV1pnSEo4Y2JsaXRoZEhGc1EvSDNOWWtRCjRKN3NWYUUzSXFLSEJBVXNSMzIwSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MEwKY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1J6M2JGbXg1VmRKeDRJYkh3TGZFTG44TFZsaGdmOEZRaQplb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UmwrbHdycnc3R1d6YklUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaYk5zaE1CZ0cKQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqCnZaZnphMXp2N3YxQXB0K2hrNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1AKRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaFRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwYwptYUhGQ043OTV0clYxbHBGRE1TM3dyVVU3N1FSL3c0VnRmWDEyOGE5NjFxbjhGWWlxVHhsVk1ZVnFMMkduczJECmxtaDZjWUdKNFF2aDZoRWJhQWpNYVo3c25rR2VSREltZXVLSENuRTk2K1JhcE5MYnhjM0czbUIvdWZOUFJKTHYKS3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAxIEczIgojIFNlcmlhbDogNjg3MDQ5NjQ5NjI2NjY5MjUwNzM2MjcxMDM3NjA2NTU0NjI0MDc4NzIwMDM0MTk1CiMgTUQ1IEZpbmdlcnByaW50OiBhNDpiYzo1YjozZjpmZTozNzo5YTpmYTo2NDpmMDplMjpmYTowNTozZDowYjphYgojIFNIQTEgRmluZ2VycHJpbnQ6IDFiOjhlOmVhOjU3Ojk2OjI5OjFhOmM5OjM5OmVhOmI4OjBhOjgxOjFhOjczOjczOmMwOjkzOjc5OjY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4YTo4Njo2ZjpkMTpiMjo3NjpiNTo3ZTo1Nzo4ZTo5MjoxYzo2NTo4Mjo4YToyYjplZDo1ODplOTpmMjpmMjo4ODowNTo0MTozNDpiNzpmMTpmNDpiZjpjOTpjYzo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDAKTWpBeE1USXhOekkzTkRSYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNndmxBUWp1bnliRUMwQkp5RnVUSEszQzNrRWFrRVBCdFYKd2VkWU1CMGt0TVB2aGQ2TUxPSEJQZCtDNWsrdFI0ZHM3RnRKd1VyVnU0L3NoNngvZ3BxRzdEMERtVklCMGpXZQpyTnJ3VThsbVBOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxCjY4WGZ1dzZjd0kySDQ0ZzRoV2Y2UHNlcjRCT2NCUmlZejVQMXNaSzAvQ1BUejlYRUowbmduanliQ0tPTFhTb2gKNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU5vZmpTeHhSM1c1QTJCNEdiUGdiNlVsNWp4YVlBL3FYcApVaHRTdFpJNWNnTUpZcjJ3WUJadXB0MGx3Z05tM2ZNRTBVRGlUb3VHOUcvbGc2QW5oRjRFd2ZXUXZUQTl4TytvCmFidzRtNlNrbHRGaTJtbkFBWmF1eThSUk5Pb01xdjhoamxtUFNsemtZWnFuMHVrcWVJMVJQVG9WN3FKWmpxbGMKM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovRwpLdWJYOVpxeldCNHZNSWtJRzFTaXRaZ2o3QWgzSEpWZFlkSExpWnhmb2txUm11OGhxa2tXQ0tpOVlTZ3h5WFN0CmhmYlp4YkdMMGVVUU1rMWZpeUE2UEVrZk00VlpEZHZMQ1hWRGFYUDdhM0Y5OE4vRVRIM0dveTdJbFhuTGM2S08KVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZ3QzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdAp6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyCmNETVQvdUZQcGlOM0dQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU4KcVhzQ0hLblFPMThMd0lFNlBXVGh2NmN0VHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNQpZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlArVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2CmIyWDUyejNzSWV4ZTlQU0x5bUJsVk5GeFpQVDVwcU9CTXpZemNmQ2tlRjlPcllNaDNqUkpqZWhackozeWRsbzIKOGhQMHIrQUp4MkVxYlBmZ25hNjdoa29vYnk3dXRIbk5rRFBEczNiNjlmQnNuUUdRK3A2UTlweHl6MGZhd3gvawpOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qClpnS0F2UVU2TzBlYzdBQW1UUFdJVWIrb0kzOFlCN0FMN1lzbW9XVFRZVXJyWEovZXM2OW5BN01mM1cxZGFXaHAKcTE0NjdIeHB2TWM3aFU2ZUZibTBGVS9EbFhwWTE4bHM2V3k1OHlsalhyUXM4QzA5N1ZwbDRLbGJRTUpJbVlGdApuaDhHS2p3U3RJc1BtNklrOEthTjFucmdTN1prbG1PVmhNSkt6Und1SkljellPWEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIgRzMiCiMgU2VyaWFsOiAzOTAxNTYwNzk0NTg5NTkyNTc0NDYxMzMxNjkyNjYwNzk5NjIwMjY4MjQ3MjU4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGFmOjBjOjg2OjZlOmJmOjQwOjJkOjdmOjBiOjNlOjEyOjUwOmJhOjEyOjNkOjA2CiMgU0hBMSBGaW5nZXJwcmludDogMDk6M2M6NjE6ZjM6OGI6OGI6ZGM6N2Q6NTU6ZGY6NzU6Mzg6MDI6MDU6MDA6ZTE6MjU6ZjU6Yzg6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhmOmU0OmZiOjBhOmY5OjNhOjRkOjBkOjY3OmRiOjBiOmViOmIyOjNlOjM3OmM3OjFiOmYzOjI1OmRjOmJjOmRkOjI0OjBlOmEwOjRkOmFmOjU4OmI0OjdlOjE4OjQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwMApNakF4TVRJeE9EVTVNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2hyaVd5QVJqY1Y0Zy9SdXY1citMckkzSGltdEZoWmlGZgpxcThuVWVWdUd4YlVMWDFRc0ZOM3ZYZzZZT0prQXB0OGhwdldHbzZ0L3g4VmY5V1ZIaExMNWhTRUJNSGZOck1XCm40cmp5ZHVZTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW0KYzVHUVlhWURGQ0R5NTRlamlLMnRvSXovcGdzbFVpWG5GZ0hWeTdnMWdReWpPL0RoNGZ4YVhjNkFjVzM0U2FzKwpPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3Arb01pd016QWtkMDU2T1hieE1tTzdGR21oNzdGT202UlExCm85L05nSjhNU1BzYzlQRy9Tcmo2MVl4eFNzY2ZyZjVCbXJPRFhmS0VWdStsVjBQT0thMk1xMVcveFB0YkFkMGoKSWFGWUFJN0QwR29UN1JQakVpdUEzR2ZtbGJMTkhpSnVLdmhCMVBMS0ZBZU5pbFVTeG1uMXVJWm9MMU5lc05LcQpJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6CjhlUVFzU1d1MVpLN0U4RU00RG5hdERsWHRhczFxbkloTzRNMTV6SGZlaUZ1dURJSWZSMHlrUlZLWW5MUDQzZWgKdk5VUkczWUJad2pnUVF2RDZ4VnUrS1FaMmFLcnIrSW5VbFlyQW9vc0ZDVDV2MElDdnliSXhvL2diamg5VXkzbAo3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhobFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHCmNDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkMKcm9palExaDVmcTdLcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYQpXL1paR1lqZVZZZzNVUXQ0WEFvZW8wTDl4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRuCmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnemRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUKK1YrdFlsVWttbEtZN1ZIbm9YNlhPdVl2SHhIYVU0QXNoWjZyTlJEYklsOXF4VjZYVS9JeUFna3dvMWp3RFFIVgpjc2F4ZkdsN3cvVTJSY3hoYmw1TWxNVmVydWdPWG91Lzk4M2c3YUVPR3pQdVZCaitENzd2Zm9SclErTndtTnRkCmRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmcKS0NManNaV0R6WVdtM1M4UDUyZFNicnN2aFh6MVNuUG54VDdBdlNFU0JULzh0d05KQWx2SUplYmlWRGoxZVllTQpIVk95VG9WN0JqakhMUGo0c0hLTkplVjNVdlFESEVpbVVGK0lJREJ1OG9KRHF6MlhoT2RUK3lIQlR3OGltb2E0CldTcjJSejBaaUMzb2hlR2U3SVVJYXJGc05Na2Q3RWdyTzNqdFpzU09lV21EM24rTQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyIKIyBTZXJpYWw6IDI2ODA5MDc2MTE3MDQ2MTQ2MjQ2Mzk5NTk1MjE1NzMyNzI0MjEzNzA4OTIzOTU4MQojIE1ENSBGaW5nZXJwcmludDogZGY6N2Q6Yjk6YWQ6NTQ6NmY6Njg6YTE6ZGY6ODk6NTc6MDM6OTc6NDM6YjA6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA0ODoxMjpiZDo5MjozYzphODpjNDozOTowNjplNzozMDo2ZDoyNzo5NjplNjphNDpjZjoyMjoyZTo3ZAojIFNIQTI1NiBGaW5nZXJwcmludDogODg6ZWY6ODE6ZGU6MjA6MmU6YjA6MTg6NDU6MmU6NDM6Zjg6NjQ6NzI6NWM6ZWE6NWY6YmQ6MWY6YzI6ZDk6ZDI6MDU6NzM6MDc6MDk6YzU6ZDg6Yjg6Njk6MGY6NDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwCk1qQXhNVEl5TURJMk16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDenl3NFFaNDdxRkplbk1pb0tWalovYUV6SHMyODZJeFNSCi94bC9wY3FzN3JOMm5YcnBpeHVyYXpIYitndFRUSy9GcFJwNVBJcE0vNnpmSmQ1TzJZSXlDMFRleXR1TXJLTnUKRm9NN3BtUkxNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUgpVN094N3NXVGFZSStGclVvUnFIZTZva0o3VU80QlVhS2h2VlpSNzRiYndFaEVMbjlxZElveWhBNUNjb1ROcytjCnJhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzSTRaeVlVVXBTRmxvYjNlbUxvRytCMDF2cjg3RVJST1IKRkhBR2p4K2YrSWRwc1E3dnc0a1o2K29jWWZ4NmJJcmMxZ01MbmlhNkV0M1VWRG1ySnFNejZuV0IyaTNORDAvawpBOUh2RlpjYmE1REZBcENUWmdJaHNVZmVpNXBLZ0xsVmo3V2lMOERXTTJmYWZzU250QVJFNjBmNzVsaTU5d3p3CmV5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWwKc1NxaU1kNW1CUGZBZE9oeDN2ODlXY3lXSmhLTGhaVlhHcXRyZFF0RVBSRW9QSHRodCtLUFowL2w3RHhNWUlCcApWemdlQVZ1TlZlakgzOERNZHlNMFNYVjg5cGdSNnkzZTdVRXVGQVVDZitEK0lPczE1eEdzSXM1WFBkN0pNRzBRCkE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXRyUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCsKeWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSQpGVUJoeW5MV2NLelN0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2Cm94WHFBLzRUaTJUazA4SFM2SVQ3U2RFUVRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmcKdS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1RGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUAowQWovdUhZVWJ0N2xKK3lyZUxWVHViWS82Q0Q1MHFpK1lVYktoNHlFOC9ueG9HaWJJaDZCSnBzUUJKRnh3QVlmCjNLRFR1VmFuNDVndGY0T2QzNHdybkRLT01wVHdBVHdpS3A5RHdpN0RtRGtIT0h2OFhnQkNIL015Sm5tRGhQYmwKOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkKwpEaGNJMDBpWDBIR1M4QTg1UGpScUhIM1k4aUt1dTJuME03U21TRlhSRHc0bTZPeTJDeTJuaFRYTi9WbkluOUhOClBsb3BOTGs5aE02eFpkUlprWkZXZFNIQmQ1NzVldUZnbmRPdEJCajBmT3RlazQ5VFNpSXArRWdyUGsyR3JGdC8KeXdhWldXRFlXR1dWalVUUjkzOStKMzk5cm9EMUIweTJQcHh4VkprRVMvMVkrWmowCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIiCiMgU2VyaWFsOiAxNTM4NTM0ODE2MDg0MDIxMzkzODY0MzAzMzYyMDg5NDkwNTQxOQojIE1ENSBGaW5nZXJwcmludDogOTI6Mzg6Yjk6Zjg6NjM6MjQ6ODI6NjU6MmM6NTc6MzM6ZTY6ZmU6ODE6OGY6OWQKIyBTSEExIEZpbmdlcnByaW50OiBhMTo0Yjo0ODpkOTo0MzplZTowYTowZTo0MDo5MDo0ZjozYzplMDphNDpjMDo5MTo5Mzo1MTo1ZDozZgojIFNIQTI1NiBGaW5nZXJwcmludDogN2Q6MDU6ZWI6YjY6ODI6MzM6OWY6OGM6OTQ6NTE6ZWU6MDk6NGU6ZWI6ZmU6ZmE6Nzk6NTM6YTE6MTQ6ZWQ6YjI6ZjQ6NDk6NDk6NDU6MmY6YWI6N2Q6MmY6YzE6ODUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdSekl3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFo1eWd2VWo4MmNrbUlrelR6K0dvZU1WU0EKbjYxVVFiVkgzNWFvMUsrQUxia0t6M1g5aWFWOUpQcmpJZ3dydkpVWEN6Ty9HVTFCQnBBQXZReE5FUDRIdGVjYwpiaUpWTVdXWHZkTVgwaDVpODl2cWJGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwCkVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3Vldtdm8yaWZ2OTIyZWJQeW5YQXBWZlNyLzVWaDg4bEEKYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1BZTGZ5a3FHeHZZbUpIekROdzZZdQpZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbmxUR05BZ01CCkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVcKQkJUT3cwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSQpRVzVwSjZkMUVlODhoalp2MHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJCjBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmkKbG13T1JHWVFSSSt0QmV2NGVheW1HK2czTkoxVHlXR3FvbEt2U25BV2hzSTZ5TEVUY0RiWXorNzBDalRWVzB6OQpCNXlpdXRrQmNsenpUY0hkRHJFY0RjUmp2cTMwRlB1SjdLSkJEa3pNeUZkQTBHNERxczBNam9tWm1XendQREN2Ck9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KSWhOemJNOG05WW9wNXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIgojIFNlcmlhbDogMTU0NTkzMTI5ODEwMDg1NTM3MzE5MjgzODQ5NTMxMzU0MjY3OTYKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjdmOjY1OjMxOjBjOjgxOmRmOjhkOmJhOjNlOjk5OmUyOjVjOmFkOjZlOmZiCiMgU0hBMSBGaW5nZXJwcmludDogZjU6MTc6YTI6NGY6OWE6NDg6YzY6Yzk6Zjg6YTI6MDA6MjY6OWY6ZGM6MGY6NDg6MmM6YWI6MzA6ODkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdlOjM3OmNiOjhiOjRjOjQ3OjA5OjBjOmFiOjM2OjU1OjFiOmE2OmY0OjVkOmI4OjQwOjY4OjBmOmJhOjE2OjZhOjk1OjJkOmIxOjAwOjcxOjdmOjQzOjA1OjNmOmMyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUmpDQ0FjMmdBd0lCQWdJUUM2RmEraDNmb0xWSlJLL05KS0JzN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZwpSek13SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdkakFRQmdjcQpoa2pPUFFJQkJnVXJnUVFBSWdOaUFBUVo1N3lzUkdYdHpiZy9XUHVOc1ZlcFJDMEZGZkx2Qy84UWRKKzFZbEpmClpuNGY1ZHdiUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1EKUlNBUFdYWVExcUFrOEMzZU52SnNLVG1qUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRlVhRk5ONktEZWM2TkhTcmtoREFLQmdncWhrak9QUVFECkF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5WVo1ZUVKSlpWcm1EeHhEbk9PbFkKSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kxdlVoWnNjdgo2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIiCiMgU2VyaWFsOiA0MjkzNzQzNTQwMDQ2OTc1Mzc4NTM0ODc5NTAzMjAyMjUzNTQxCiMgTUQ1IEZpbmdlcnByaW50OiBlNDphNjo4YTpjODo1NDphYzo1Mjo0Mjo0NjowYTpmZDo3Mjo0ODoxYjoyYTo0NAojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjNjOjI0OmY5OmJmOmQ2OjY2Ojc2OjFiOjI2OjgwOjczOmZlOjA2OmQxOmNjOjhkOjRmOjgyOmE0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjozYzpjYjpiNzo2MDozMTplNTplMDoxMzo4Zjo4ZDpkMzo5YToyMzpmOTpkZTo0NzpmZjpjMzo1ZTo0MzpjMToxNDo0YzplYToyNzpkNDo2YTo1YTpiMTpjYjo1ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGpqQ0NBbmFnQXdJQkFnSVFBenJ4NXFjUnFhQzdLR1N4SFFuNjVUQU5CZ2txaGtpRzl3MEJBUXNGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkgKTWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjeU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1SQoyL091OGpxSmtUeDY1cXNHR212UHJDM29YZ2trUkxwaW1uN1dvNmgrNEZSMUlBV3NVTGVjWXhwc01OemFIeG14CjF4N2UvZGZneTVTRE42N3NIME5PM1hzczByMHVwUy9rcWJpdE90U1pwTFlsNlp0ckFHQ1NZUDlQSVVrWTkyZVEKcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVZCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXegp0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TVVOR1BIZ20rRjZIbUljcjlnK1VRCnZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVgo1dU51NWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZCjFZbDlQTVdMU24vcHZ0c3JGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djQKTmVGMjJkK21RcnZIUkFpR2Z6WjBKRnJhYkEwVVdUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFORwpGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJIUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxCjhyR09tYUZ2RTdGQmNmNklLc2hQRUNCVjEvTVVSZVhnUlBUcWg1VXlrdzcrVTBiNkxKMy9peUs1UzlrSlJhVGUKcExpYVdOMGJmVktmamxsRGlJR2tuaWJWYjYzZERjWTNmZTBEa2h2bGQxOTI3anlOeEYxV1c2TFpabTZ6TlRmbApNclk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMiCiMgU2VyaWFsOiA3MDg5MjQ0NDY5MDMwMjkzMjkxNzYwMDgzMzMzODg0MzY0MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiBmNTo1ZDphNDo1MDphNTpmYjoyODo3ZToxZTowZjowZDpjYzo5Njo1Nzo1NjpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IDdlOjA0OmRlOjg5OjZhOjNlOjY2OjZkOjAwOmU2Ojg3OmQzOjNmOmZhOmQ5OjNiOmU4OjNkOjM0OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMTphZDo2Njo0ODpmODoxMDo0MTozODpjNzozODpmMzo5ZTphNDozMjowMTozMzozOTozZTozYToxODpjYzowMjoyOTo2ZTpmOTo3YzoyYTpjOTplZjo2NzozMTpkMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1B6Q0NBY1dnQXdJQkFnSVFCVlZXdlBKZXBEVTF3NlFQMWF0RmNqQUtCZ2dxaGtqT1BRUURBekJoTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE16QWUKRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVdwpFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWpiMjB4CklEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQ0FRWUYKSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGRwpmcDR0bis2T1l3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPClo5d2ovd01jbytJK28wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWQKQmdOVkhRNEVGZ1FVczl0SXBQbWh4ZGl1TmtITUVXTnBZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeApBSzI4OG13L0VrclJMVG5EQ2dtWGMvU0lOb3lJSjd2bWlJMVFoYWRqK1o0eTNtYVREL0hNc1FtUDNXeXIrbXQvCm9BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0Vk9LYTVWdDgKc3ljWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IgojIFNlcmlhbDogNzQ1MTUwMDU1ODk3NzM3MDc3NzkzMDA4NDg2OTAxNjYxNDIzNgojIE1ENSBGaW5nZXJwcmludDogNzg6ZjI6ZmM6YWE6NjA6MWY6MmY6YjQ6ZWI6Yzk6Mzc6YmE6NTM6MmU6NzU6NDkKIyBTSEExIEZpbmdlcnByaW50OiBkZDpmYjoxNjpjZDo0OTozMTpjOTo3MzphMjowMzo3ZDozZjpjODozYTo0ZDo3ZDo3Nzo1ZDowNTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6MmY6N2I6ZGM6ZjE6YTc6YWY6OWU6NmM6ZTY6NzI6MDE6N2Y6NGY6MTI6YWI6Zjc6NzI6NDA6Yzc6OGU6NzY6MWE6YzI6MDM6ZDE6ZDk6ZDI6MGE6Yzg6OTk6ODgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnClJ6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3kKaXRoWnd1RXBwejFZcTNhYXphNTdHNFFOeERBZjh4dWtPQmJyVnNhWGJSMnJzbm55eWhIUzVGL1dCVHhTRDFJZgp4cDRWcFg2K242bFhGbGxWY3E5b2szRENzcnAxbVdwek1wVFJFRVFRTHQrQzh3ZUU1blE3YlhIaUxRd2I3aURWCnlTQWRZeWt0enV4ZVRzaVQrQ0ZobXpUckJjWmU3RnNhdk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU8KREN1M1Q2Y3cyVmJ1eW50ZDQ2M0pUMTdsTmVjeHk5cVRYdHlPajREYXRwR1lRSkI1dzNqSHRySEV0V29ZT0FNUQpqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNk1VU2FNMEMvCkNOZGFTYVRDNXFtZ1o5MmtKN3loVHptMUVWZ1g5eVJjUm85azk4RnBpSGFZZGoxWlhVSjJoNG1YYVhwSThPQ2kKRWh0bW1uVEsza3NlNXc1anJ1YlU3NUtTT3A0OTNBRGtSU1dKdHBwRUdTdCt3SlMwMG1GdDZ6UFp4ZDlMQkFETQpmUnlWdzQvM0liS3lFYmU3Zi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZCnVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkhkTDRtckxaQmRkNTZyRitOUDhtODAwRVJFbHZsRUZEck1jWEsKY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOG9SN0Z3SStpc1g0S0pwbjE1R2t2bUIwdAo5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMgpTVjFFWStDdG5KWVlaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkCitTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2MKZkZxSzFxSTRtZk40aS9STjBpQUwzZ1R1akp0SGdYSU53QlF5N3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYQpzallVZWdieUpMa0pFVkRYQ0xHNGlYcUVJMkZDS2VXanphSWdRZGZSbkdUWjZpYWhpeFRYVEJteVVFRnhQVDlOCmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTjVyNU4KMFhXczBNcjdRYmhEcGFyVHd3VkVUeXcybStMNjRrVzRJMU5zQm05blZYOUd0VXcvYmloYWVTYlNwS2hpbDlJZQo0dTFLaTd3Yi9VZEtEZDluWm42eVcwSFFPK1QwTy9RRVkrbnZ3bFFBVWFDS0tzbk9lTXpWNm9jRUdMUE9yMG1JCnIvT1NtYmF6NW1FUDBvVUE1MUFhNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEKL1lsZHZJVmlIVExTb0N0VTdacFh3ZHY2RU04WnQ0dEtHNDhCdGllVlUraTJpVzFidkdqVUkraUxVYUpXK2ZDbQpnS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UDgyWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwMTkwOTA4NDUzNzU4MjA5MzMwODk0MTM2MzUyNDg3MzE5MzExNwojIE1ENSBGaW5nZXJwcmludDogMWI6MzE6YjA6NzE6NDA6MzY6Y2M6MTQ6MzY6OTE6YWQ6YzQ6M2U6ZmQ6ZWM6MTgKIyBTSEExIEZpbmdlcnByaW50OiBhZjplNTpkMjo0NDphODpkMToxOTo0MjozMDpmZjo0Nzo5ZjplMjpmODo5NzpiYjpjZDo3YTo4YzpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTI6ZjA6ZTE6YzQ6ZTU6OGU6YzY6Mjk6Mjk6MWI6NjA6MzE6N2Y6MDc6NDY6NzE6Yjg6NWQ6N2U6YTg6MGQ6NWI6MDc6Mjc6MzQ6NjM6NTM6NGI6MzI6YjQ6MDI6MzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WCkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTUKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVApFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUgo2RlNTMGdwV3Nhd05KTjNGejBSbmRKa3JONk45STNBQWNieFQzOFQ2S2hLUFMzOFFWcjJmY0hLM1lYL0pTdzhYCnB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaRkd2bm5MT0ZvSUo2ZHE5eGtOZnMvUTM2bkd6NjM3Q0MKOUJSKytiN0VwaTlQZjVsL3RmeG5RM0s5REFEV2lldHJMTlB0ajVnY0ZLdCs1ZU51L05pbzVKSWsya05yWXJoVgovZXJCdkd5MmkvTU9qWnJrbTJ4cG1maDRTREJGMWEzaERUeEZZUHd5bGxFbnZHZkR5aTYyYStwR3g4Y2dvTEVmClpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNloKK3BVWDJud3pWMEU4alZIdEM3WmNyeXhqR3Q5WHlEKzg2VjNFbTY5Rm1lS2pXaVMwdXFsV1BjOXZxdjlKV0w3dwpxUC8wdUszcE4vdTZ1UFFMT3Zub1EwSWVpZGlFeXhQeDJidmhpV0M0akNoV3JCUWRuQXJuY2V2UER0MDlxWmFoClNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTNzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUMKdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQ0dDZTAxYTYweTFEbWEvUk1obkV3NmFiZgpGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41V2RZZ0dxL3lhcGlxCmNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsCndGVFBvQ1dPQXZuOXNLSU45U0NZUEJNdHJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU0KNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVgoyamVEY2h6VGMrQ2lSNWtET0YzVlNYa0FLUnpIN0pzZ0hBY2thVmQ0c2puOE9vU2d0Wng4amI4dWsySW50em5hCkZ4aXV2VHdKYVArRW16elYxZ3NENDFlZUZQZlI2MC9JdlljanQ3WkpRM21GWExycmtndWh4dWhvcUV3V3NScVoKQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpSwpib0hHaGZLcHBDM245S1VrRUVlRHlzMzBqWGxZc1FhYjV4b3EyWjBCMTVSOTdRTkt5dkRiNktrQlB2VldtY2tlCmprazl1K1VKdWVCUFNaSTlGb0pBek14Wnh1WTY3Ukl1YVR4c2xiSDlxaDE3ZjRhK0hnNHlSdnY3RTQ5MWYweUwKUzBaai9nQTBRSERCdzdtaDNhWnc0Z1N6UWJ6cGdKSHFaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYgpRT2hUc2llZFNybkFkeUdOLzRmeTNyeU03eGZmdDBrTDBmSnVNQXNhRGs1MjdSSDg5ZWxXc24yL3gyMEtrNHlsCjBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJTGFaUmZ5SEIKTlZPRkJrcGRuNjI3RzE5MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyNjQ1MDkzNzY0NzgxMDU4Nzg3NTkxODcxNjQ1NjY1Nzg4NzE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjpmZTo2OTpkMTo5MTpiNzoxOTozMzphMzo3MjphODowZjplMTo1NTplNTpiNQojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOjhmOjFiOjU3OjMzOjBkOmJiOmEyOmQwOjdhOjZjOjUxOmY3OjBlOmU5OjBkOmRhOmI5OmFkOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo5MzpjOTpiMDoyZjpkODphYToxMzplMjoxYzozMToyMjo4YTpjYzpiMDo4MToxOTo2NDozYjo3NDo5Yzo4OTo4OTo2NDpiMTo3NDo2ZDo0NjpjMzpkNDpjYjpkMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNqQ0NBOGFnQXdJQkFnSVFBZjF0TVB5anlsR29HN3hrRGpVRExUQU5CZ2txaGtpRzl3MEJBUXdGQURDQgppREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsCmNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlYKQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBdwpNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WCkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNBRW1VWE5nN0Qyd2l6MEt4WERYYnR6U2ZUVEsxUWcySGlxaUJOQ1Mxa0Nkek9pWi9NUGFuczlzL0IKM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmpZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWQp0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGblJnaFJ5NFlVVkQrOE0vNStiSnovCkZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PK1QyM0xMYjIKVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVAo3OXVxL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2CmMwUGxmZzZsWnJFcGZES0VZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVQKWW82MVpzOGxpTTJFdUxFL3BEa1AyUUtlNnhKTWxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bApjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4eWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlClVCOVhWS2crL1hSakw3RlFaUW5tV0VJdVF4cE10UEFsUjFuNkJCNlQxQ1pHU2xDQnN0NitlTGY4WnhYaHlWZUUKSGc5ajF1bGl1dFpmVlM3cVhNWW9DQVFsT2JnT0s2bnlUSmNjQno4TlV2WHQ3eStDRHdJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUZ6VWZBM1A5d0Y5UVpsbERIUEYKVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXRlBGU1BDZUhsQ2p0SHpvQk42SjIvRk5Rd0lTYnhtdE91b3doVDZLTwpWV0tSODJrVjJMeUk0OFNxQy8zdnFPbExWU29HSUcxVmVDa1o3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zCkFUaVVGSlZEQnduN1lLbnVIS3NTaktDYVhxZVlhbGx0aXo4SSs4alJSYThZRldTUUVnOXpLQzdGNGlSTy9GanMKOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNOFdjUgppUXljRTB4eU5OKzgxWEhmcW5IZDRibHNqRHdTWFdYYXZWY1N0a05yLytYZVRXWVJVYytacnV3WHR1aHhrWXplClNmN2ROWEdpRlNlVUhNOWg0eWE3YjZObkpTRmQ1dDBkQ3k1b0d6dUNyK3lEWjRYVW1GRjBzYm1aZ0luL2YzZ1oKWEhsS1lDNlNRSzVNTnlvc3ljZGl5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05LwpxUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5Y0oydmhzRS96Qis0QUx0UlpoOHRTUVpYcTlFZlg3bVJCClZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3c0F2Z25FekRITmI4NDJtMVIwYUIKTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3hRKzZJSGRmRwpqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTIzMDEzODIzNzIwMTk5NDgxNDU2NTY5NzIwNDQzOTk3NTcyMTM0CiMgTUQ1IEZpbmdlcnByaW50OiBmYTo2ODpiYzpkOTpiNTo3ZjphZDpmZDpjOToxZDowNjo4MzoyODpjYzoyNDpjMQojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmNiOmNhOjVkOmIyOmQ1OjJhOjdmOjY5OjNiOjY3OjRkOmU1OmYwOjVhOjFkOjBjOjk1OjdkOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZjpmNDo2MDpkNTo0Yjo5Yzo4NjpkYTpiZjpiYzpmYzo1NzoxMjplMDo0MDowZDoyYjplZDozZjpiYzo0ZDo0ZjpiZDphYTo4NjplMDo2YTpkYzpkMjphOTphZDo3YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBaFdnQXdJQkFnSVFYSXVaeFZxVXhkSnhWdDdOaVlETUpqQUtCZ2dxaGtqT1BRUURBekNCaURFTApNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sCmVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVQKSlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeApNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUCkNrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWcKVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvCkkrZDYxU1J2VThaYTJFdXJ4dFcyMGVaemNhN2RuTllNWWYzYm9Ja0R1QVVVN0ZmTzdsMC80aUd6enZmVWlubmcKbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXpuUE8vTGx4VHNWK3pmVEovaWpUamVYbWpRakJBTUIwRwpBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCSFU2KzRXTUIKenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiVwpSTlp1OVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0IgojIFNlcmlhbDogMTQzNjcxNDgyOTQ5MjI5NjQ0ODA4NTkwMjIxMjU4MDA5Nzc4OTc0NzQKIyBNRDUgRmluZ2VycHJpbnQ6IDIwOmYwOjI3OjY4OmQxOjdlOmEwOjlkOjBlOmU2OjJhOmNhOmRmOjVjOjg5OjhlCiMgU0hBMSBGaW5nZXJwcmludDogNjk6Njk6NTY6MmU6NDA6ODA6ZjQ6MjQ6YTE6ZTc6MTk6OWY6MTQ6YmE6ZjM6ZWU6NTg6YWI6NmE6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOmM5OjQ5OjExOmMyOjk1OjU2Ojc2OmRiOjZjOjBhOjU1OjA5Ojg2OmQ3OjZlOjNiOmEwOjA1OjY2OjdjOjQ0OjJjOjk3OjYyOmI0OmZiOmI3OjczOmRlOjIyOjhjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCNFRDQ0FZZWdBd0lCQWdJUktqaWtISllLQk41Q3NpaWxDK2cwbUFJd0NnWUlLb1pJemowRUF3SXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdU1aNTA0OXNKUTZmTGprWkhBT2tycHJsT1FjSgpGc3Bqc2JtRytJcFh3VmZPUXZwem9mZGxRdjhld1FDeWJuTU8vOGNoNVJpa3F0bHhQNmpVdWM2TUhhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkZTd2U2MUYKdU9KQWYvc0tidnUrTThrOG80VFZNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURja3FHZ0U2YlBBN0RteENHWAprUG9VVnkwRDdPNDgwMjdLcUd4MnZLTGV1d0lnSjZpRkp6V2JWc2FqOGtmU3QyNGJBZ0FYcW1lbUZaSGUrcFRzCmV3djRuNFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNSIKIyBTZXJpYWw6IDMyNzg1NzkyMDk5OTkwNTA3MjI2NjgwNjk4MDExNTYwOTQ3OTMxMjQ0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZjphZDozYjoxYzowMjoxZTo4YTpiYToxNzo3NDozODo4MTowYzphMjpiYzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjI0OmM2OjMwOmNkOmE0OjE4OmVmOjIwOjY5OmZmOmFkOjRmOmRkOjVmOjQ2OjNhOjFiOjY5OmFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5ZjpiYzoxNDo4YTozZDpkMDowZjpkMjo0ZTphMTozNDo1ODpjYzo0MzpiZjphNzpmNTo5Yzo4MTo4MjpkNzo4MzphNToxMzpmNjplYjplYzoxMDowYzo4OToyNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNlNGa2MKOEdJeExjQjZLUDRhcDF5enRzeVg1MFhVV1ByUmQyMURvc0NIWlRRS0gzcmQ2end6b2NXZFRhUnZRWlU0ZjhrZQpoT3ZSbmttU2g1U0hERHFGU21hZm5WbVRUWmRoQm9aS28wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUkKS29aSXpqMEVBd01EYUFBd1pRSXhBT1ZwRXNsdTI4WXh1Z2xCNFpmNCsvMmE0bjBTeWUxOFpOUExCU1dMVnRtZwo1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJN3lGejlTTzhOZENLb0NPSnV4VW5PCnh3eThwMkZwOGZjNzRTckwrU3Z6WnBBMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMDAwMzAwMQojIE1ENSBGaW5nZXJwcmludDogMGI6NDY6Njc6MDc6ZGI6MTA6MmY6MTk6OGM6MzU6NTA6NjA6ZDE6MGI6ZjQ6MzcKIyBTSEExIEZpbmdlcnByaW50OiBkODplYjo2Yjo0MTo1MTo5Mjo1OTplMDpmMzplNzo4NTowMDpjMDozZDpiNjo4ODo5NzpjOTplZTpmYwojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NGY6YjA6Yjk6NWE6Yjg6YjM6MDA6MzI6ZjQ6MzI6Yjg6NmY6NTM6NWY6ZTE6NzI6YzE6ODU6ZDA6ZmQ6Mzk6ODY6NTg6Mzc6Y2Y6MzY6MTg6N2Y6YTY6ZjQ6MjgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lFQUppaU9UQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN6TUI0WERURXpNVEV4TkRFeE1qZzBNbG9YCkRUSTRNVEV4TXpJek1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNekNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMNHlvbFFQCmNQc3NYRm5yYk1Ta1VlaUZLclBNU2pUeXNGL3pEc2NjUFZNZWlBaG8yRzg5cmNLZXpJSm5CeWVIYUhFNm4zV1cKSWtZRnNPMnR4MXVlS3Q2Yy9EckdsYWYxRjJjWTV5OUpDQXhjeitiTU5PMTQrMUN4M0dzeThLTCt0anprN0ZxWAp4ejhlY0Fnd29OekZzMjF2MElKeUVhdlNnV2haZ2hlM2VKSmcrc3plUDRUcmpUZ3prQXB5SS9vMXpDWnhNZEZ5CktKTFpXeU50WnJWdEIwTHJwalBPa3R2QTlteGplTTNLVGoyMTVWS2I4YjQ3NWxSZ3NHWWVDYXNIL2xTSkVVTFIKOXlTNllIZ2FtUGZKRWYwV3dUVWFWSFh2UTlQbHJrN081M3ZEeGs1aFVVdXJta1ZMb1I5QnZVaFRGWEZrQzRhego1UzYrenFRYndTbUVvclhMQ0NOMlF5SWtIeGNFMUc2Y3h2eC9LMllhN0lybDFzOU45V01KdHhVNTFudXM2K044CjZVNzhkVUxJN1ZpVkRBWkNvcHozNUhDejMzSnZXamRBaWRpRnBOZnhDOTVER2RSS1dDeU1pam1ldjRTSDhSWTcKTmd6cDA3VEtiQmxCVWdtaEhiQnF2NEx2Y0ZFaE10d0Zkb3pMOTJUa0ExQ3ZqSkZucThYeTdsalkzcjczNXpIUApiTWs3Y2NIVmlMVmx2TURvRnhjSEVyVmMwcXNnazdUbWdvTndOc1hObzQydGkreWp3VU9INWtQaU5MNlZpelh0CkJ6bmFxQjE2bnphZUVyQU1aUktRRldEWkprQkU0MVpncFJEVWFqejlRZHdPV2tlMjc1ZGhkVS9aL3NleUhkVHQKWFVtenFXckxab1FUMVZ5ZzNOOXVkd2JSY1hYSVYyK3ZEM2RiQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSVXJmckhrbGV1eWpXY0xoTDc1THBkCklOeVVWekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBTUptZEJUTElYZzQ3bUFFNmlxVG5CL2Q2K09lYTMxQkQKVTVjcVBjbzhSNWd1NFJWNzhaTHpZZHFRSlJabHdKOVVYUTRETzF0M0FweUV0ZzJZWHpUZE8yUEN3eWlCd3B3cApMaW5peU1NQjhqUHFLcXJNQ1FqM1pXZkd6ZC9UdGl1bnZjelJEbkJmdUNQUnk1Rk9DdlRJZXVYWll6YkIxTi84CklwZjNZRjNxS1M5WXNyMVl2WTJXVHhCMXYwaDdQVkdIb1R4MElzTDhCMytBM01Tcy9tckJjREN3Nlk1cDRpeHAKZ1pRSnV0MytUY0NEakpSWXdFWWdyNXdmQXZnMVZVa3ZSdFRBOEtDV0FnOHp4WEh6bmlOOWxMZjlPdE1KZ3dZaAovV0E5cmpMQTB1Nk5wdkRudElKOENzeHd5WG1BK1A1TTl6V0VHWW94K3dyWjEzK2I4S0thYThNRlN1MUJZQlF3CjBhb1JRbTdUSXdJRUM4WmwzZDFTZDlxQmE3S28rZ0U0dVpicUtteG5sNG1VbnJ6aFZOWGthbmp2U3Iwcm1qMUEKZnNiQWRkSnUrMmd3N095TG5mbEpOWm9hTE5temxUblZIcEwzcHJsbEwrVTliVHBJVEFqYzVDZ1NLTDU5TlZ6cQo0QlorRXh0cTF6N1hudnd0ZGJMQkZOVWpBOXRiYndzK2VDOE4zak9ORnJkSTU0T2FnUTk3d1VOTlZRUVhPRXBSCjFWbWlpWFRUbjc0ZVM5ZkdiYmVJSkc5Z2thU0NoVnRXUWJ6UVJLdHFFNzdSTEZpM0VqTllzamRqM0JQMWxCMC8KUUZIMVQvVTY3Y2pGNjhJZUhSYVZlc2QrUW5HVGJrc1Z0ekRmcXUxWGhVaXNIV3JkT1duazRYbDR2czRGdjZFTQo5NEI3SVdjbk1Gaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIgojIFNlcmlhbDogMTAwMDAwMTMKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjA2OmFmOjdiOmU4OjFhOmYxOjlhOmI0OmU4OmQyOjcwOjFmOmMwOmY1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogNzY6ZTI6N2U6YzE6NGY6ZGI6ODI6YzE6YzA6YTY6NzU6YjU6MDU6YmU6M2Q6Mjk6YjQ6ZWQ6ZGI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRkOjI0OjkxOjQxOjRjOmZlOjk1OjY3OjQ2OmVjOjRjOmVmOmE2OmNmOjZmOjcyOmUyOjhhOjEzOjI5OjQzOjJmOjlkOjhhOjkwOjdhOmM0OmNiOjVkOmFkOmMxOjVhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY0RDQ0ExaWdBd0lCQWdJRUFKaVdqVEFOQmdrcWhraUc5dzBCQVFzRkFEQllNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNrd0p3WURWUVFERENCVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnUlZZZ1VtOXZkQ0JEUVRBZUZ3MHhNREV5TURneE1URTVNamxhRncweQpNakV5TURneE1URXdNamhhTUZneEN6QUpCZ05WQkFZVEFrNU1NUjR3SEFZRFZRUUtEQlZUZEdGaGRDQmtaWElnClRtVmtaWEpzWVc1a1pXNHhLVEFuQmdOVkJBTU1JRk4wWVdGMElHUmxjaUJPWldSbGNteGhibVJsYmlCRlZpQlMKYjI5MElFTkJNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTQ4ZCtpZmtrU3pyUwpNNE0xTEduczNBbWs0MUdvSlN0NXVBZzk0Skc2aElYR2hhVEs1c2t1VTZUSkpCNzlWV1p4WFN6RllHZ0V0OW5DClVpWTRpS1RXTzBDbXdzMC96WmlUczFRVVdKWlYxVkQraHEya1kzOWNoL2FPNWllU1p4ZVNBZ01zM05abWRPM2QKWi8vQllZMWpUdytiYlJjd0p1K3IwaDhRb1BuRmZ4WnBnUU5IN1I1b2pYS2hUYklteHJwc1gyM1dyOUd4RTQ2cApyZk5lYVhVbUdENUJLeUYvN290ZEJ3YWRROFFwQ2l2OEtqNkd5enlET3ZuSkRkckZtZUs4ZUVFemR1Ry9MMTNsCnBKaFFEQlhkNFBxY2Z6aG8wTEttZXFmUk1iMStpbGduUTdPNk01SFRwNWdWWEpybTB3OTEyZnhCbUpjK3FpWGIKajVJdXNIc01YL0ZqcVRmNW0zVnBUQ2dtSmRyVjhoSndSVlhqMzNOZU4vVWhiSkNPTlZySjB5UHIwOEMrZUt4QwpLRmhtcFVadGNBTFhFUGxMVlB4ZGhrcUh6My9LUmF3UldyVWdVWTB2aUVlWE9jRFB1c0JDQVVDWlNDRUxhNmZTCi9aYlYwYjVHblVuZ0M2YWdJazQ0ME1FOE1MeHdqeXgxek5ERmpGRTdQWlFJWkNaaGZibkRaWThVbkNIUXF2MFgKY2dPUHZadU01bDVUbnJtZDc0Szc0YnppY2tGYklaVFRSVGVVMGQ4Sk9WM25JNnFhSGNwdHFBcUdoWXFDdmtJSAoxdkk0Z25QYWgxdmxQTk9lUHFjN252UURzL254ZlJOMEF2KzdvZVg2QUhrY3BtWkJpRnhnVjZZdUNjUzYvWnJQCnB4OUF3N3ZNV2dwVlN6czRkbEc0WTR1RWxCYm1Wdk1DQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlA2ckFKQ1luaVQ4cWN3YWl2c251TDh3YnFnNwpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURQZHl4dVZyNU9zN2FFQUpTclI4a04wbmJIaHA4ZEI5TzJ0THNJCmVLOXAwZ3RKM2pQRnJLM0NpQUo5QnJjMUFzRmd5Yi9FNkpUZTFOT3BFeVZhL202aXJuMEYzSDN6YlBCK3BvM3UKMmRmT1dCZm9xU211YzBpSDU1dktiaW1oWkY4WkUvZXVCaEQvVWNhYlRWVWxUNU9aRUFGVGRmRVR6c2VtUVVIUwp2NGlsZjBYOHJMaWx0VE1NZ3NUN0IvWnE1U1dFWHdiS3dZWTVFZHRZelhjN0xNSk1EMTZhNC9DclBtRWJVQ1RDCndQVHhHZkFSS2JhbEdBS2IxMk5NY0l4SG93TkRYTGxkUnFBTmIvOVpqcjdkbjNMRFd5dmZqRnZPNVF4R2JKS3kKQ3FOTVZFSVlGUklZdmRyOHVuUnUvOEcyb0dUWXFWOVZycDljYW5hVzJITm5oL3ROZjF6dWFjcHpFUHVLcWYyZQp2VFk0U1VtSDlBNFU4T21IdUQrblQzcGFqbm5VaytTN2FGS0VyR3pwODVod1ZYSXkrVFNySzBtMXpTQmk1RHA2CloyT3JsdHh0cnBmcy9KOTJWb2d1WnM5YnRzbWtzTmNGdXVFbkw1TzdKaXFpazdBYjg0NitIVUNqdVRhUFBvSWEKR2w2STZsRDRXZUtEUmlrTDQwUmM0WlcyYVpDYUZHK1hyb0hQYU8rWm1yNjE1K0YvK1BvVFJ4Wk16RzBJUU9lTAplRzlRZ2tSUVAyWUdpcXREaEZaS0R5QXRoZzcxMHR2U2VvcEx6YVhvVHZGZUppVUJXU09nZnRMMmZpRlgxeWU4CkZWZE1wRWJCNElNZURFeE5IMDhHR2VMNXFQUTZncUd5ZVVONTFxMXZlaWVRQTZUcUpJYy8yYjNaNmZKZlVFa2MKN3V6WExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjAwMDM4Nzc3OTY4Mzk0MjYKIyBNRDUgRmluZ2VycHJpbnQ6IGIzOjNlOjc3OjczOjc1OmVlOmEwOmQzOmUzOjdlOjQ5OjYzOjQ5OjU5OmJiOmM3CiMgU0hBMSBGaW5nZXJwcmludDogZGY6NzE6N2U6YWE6NGE6ZDk6NGU6Yzk6NTU6ODQ6OTk6NjA6MmQ6NDg6ZGU6NWY6YmM6ZjA6M2E6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVkOjU2OjQ5OjliOmU0OmQyOmUwOjhiOmNmOmNhOmQwOjhhOjNlOjM4OjcyOjNkOjUwOjUwOjNiOmRlOjcwOjY5OjQ4OmU0OjJmOjU1OjYwOjMwOjE5OmU1OjI4OmFlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnUKVkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRneE1qSXpXaGNOTXpRdwpNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3CkpRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkaE5sVAozUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVCitlaGNDdXovbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3AKUzBsNFBKTmdpQ0w4bWRvMnlNS2kxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMQpiVm9FL2M0MHlpVGNkQ01iWFRNVEVsM0VBU1gyTU4wQ1haL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpClQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsM1pCV3p2dXJwV0NkeEozNVVyQ0wKdllmNWp5c2pDaU4yTy9jejRja0E4Mm41UzZMZ1RyeCtrem1FQi9kRWNINytCMXJsc2F6UkdNenlOZVZKU1FqSwpWc2s5K3c4WWZZczd3UlBDVFkvSlR3NDM2UitoRG1yZllpN0xOUVpSZVN6SUpUajAra3VuaVZ5YzB1TU5PWVpLCmRIelZXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFQKYytYdnZxRHRNd3QwdmlBZ3hHZHM4QWdEZWxXQWYwWk9scWYwSGo3aDl0Z0o0VE5rSzJQWE1sNmYrY0I3RDNodgpsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4dXVGdWNBUzZUNkM2YU1ONy96SHdjejA5bENxeEMwRU9vUDVOCmlHVnJlVE8wMXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVTdVUVp3TlB3Qm92dXBIdStRdWNtVk1pT05uWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICjZvaTZtWXRRbE5lQ2dOOWhDUUNUclEwVTVzN0I4amVVZUxCZm5MT2ljN2lQQlpNNHpZMCtzTGo3d00reDh1d3QKTFJ2TTdLcWFzNnBnZ2hzdE84T0VQVmVLbGg2Y2RialRNTTFnQ0lPUTA0NVU4VTFtd0YxMEEwQ2o3b1Yrd2g5MwpuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnRvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzCit3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVllqemxWWUEyMTFRQy8vRzVYYzdVSTIvWVJZUksKVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYZmV1K2gxc1hJRlJSazBwVApBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm9rVExxCmwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEcKNGlaWlJIVWUyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWgptVWxPK0tXQTJ5VVBIR05paXNreloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBCjcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMTk3NjE1Njg0MzkzMzY5OAojIE1ENSBGaW5nZXJwcmludDogMzc6MDY6YTU6YjA6ZmM6ODk6OWQ6YmE6ZjQ6NmI6OGM6MWE6NjQ6Y2Q6ZDU6YmEKIyBTSEExIEZpbmdlcnByaW50OiBiYToyOTo0MTo2MDo3Nzo5ODozZjpmNDpmMzplZjpmMjozMTowNTozYjoyZTplYTo2ZDo0ZDo0NTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogMzA6ZDA6ODk6NWE6OWE6NDQ6OGE6MjY6MjA6OTE6NjM6NTU6MjI6ZDE6ZjU6MjA6MTA6YjU6ODY6N2E6Y2E6ZTE6MmM6Nzg6ZWY6OTU6OGY6ZDQ6ZjQ6Mzg6OWY6MmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk4KTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdQpWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRjMU16TXlXaGNOCk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjAKTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHlQNG83CmVrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3kKUkJiMDZ0RDZIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sUwpiZHNIeW8rMVcvQ0Q4MC9ITGFYSXJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGCi9ZVExOaUNCV1MyYWIyMUlTR0hLVE45VDBhOVN2RVNmcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IKM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1NtSnhaWm9ZK3JmR3d5ajRHRDN2dwpFVXMzb0VSdGU4dW9qSEgwMWJXUk5zendGY1lyM2xFWHNaZE1VRDJ4bFZsOEJYMHRJZFVBdndGbm9sNTdwbHp5Cjl5THhrQTJUMjZwRVVXYk1mWFlENjJxb0tqZ1psM1lOYTRwaCtiejI3bmI5Y0N2ZEtUejRDaDViUWh5TFZpOVYKR3h5aExyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWgoyZmpYY3RzY3ZHMjlaVi92aURVcVppL3U5ck5sOERPTmZKaEJhVVlQUXh4cCtwdTEwR0ZxemNwTDJVeVFScXNWCldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUw0ak05ZjlvWlJPUmljc1BmSXNieVZ0VGRYNVZ5N1cxZjkwZ0QKVy8zRktxRDJjeU9FRUJzQjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU0M0hnbnRpblF0bmJjWkZybEpQcnc2UFJGS013RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKdDJvZElGZmxBV0pCRjlNSjIzWExibFNRZGY0YW40RUt3dDNYOXduUVczSVY1QjRKYWowejh5R2E1aFYrclZIVgpEUkR0ZlVMQWorN0FtZ2pWUWRaY0RpRnBib0JoRGhYQXVNL0ZTUkpTekw0NnpOUXVPQVhlTmYwZmI3aUFhSmc5ClRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdEd0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEcKbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0bTYvbjZKOTFlRXlyUmp1YXpyOEZHRjFORlR3VwptaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXhOUkY0ZUtMZzZUQ01mNERmCldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNE1objUKK2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSgp0c2hxdURESWFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBCkdhUWRwL2xMUXpmY2FGcFB6K3ZDWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnYKOFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEzV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAxMjQ2OTg5MzUyCiMgTUQ1IEZpbmdlcnByaW50OiA0YjplMjpjOTo5MTo5Njo2NTowYzpmNDowZTo1YTo5Mzo5MjphMDowYTpmZTpiMgojIFNIQTEgRmluZ2VycHJpbnQ6IDhjOmY0OjI3OmZkOjc5OjBjOjNhOmQxOjY2OjA2OjhkOmU4OjFlOjU3OmVmOmJiOjkzOjIyOjcyOmQ0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MzpkZjo1Nzo3NDpiMDozZTo3ZjplZjo1ZjplNDowZDo5MzoxYTo3YjplZDpmMTpiYjoyZTo2Yjo0Mjo3Mzo4Yzo0ZTo2ZDozODo0MToxMDozZDozYTphNzpmMzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwCmNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXMKSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WegpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdIaGNOTURrd056QTNNVGN5Ck5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnUKZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dApkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwCmFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUC92YUNlYjl6WVFZS3BTZllzMS9UClJVNGNjdFpPTXZKeWlnLzNneG5RYW9DQUFFVWVzTWZubXI4U1Z5Y2NvMmd2Q29lOWFtc09YbVh6SEhmVjFJV04KY0NHMHN6TG5pNkxWaGprQ3NialNSODdreVVuRU82ZmUrMVI5Vjc3dzZHN0NlYkk2QzFYaVVKZ1dNaE5jTDNoVwp3Y0tVcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xClUxK2NQdlFYTE9acHJFNHlUR0ozNnJmbzViczB2Qm1McnB4UjU3ZCt0Vk94TXlMbGJjOXdQQnI2NHB0bnRvUDAKamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFjaVo2MEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWVaOGRsc2EyZVQ4aWpZZlRod01FWUdwcm1pNVppWE1SckVQUjlSUC8KalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgpSa2Z6Ni9kandVQUZRS1hTdC9TMW1qYS9xWWgyaUFSVkJDdWNoMzhhTnp4K0xhVWEyTlNKWHNxOXJEMXMyRzJ2CjFmTjJEODA3aURnaW5XeVRtc1E5djRJYlpUK21EMTJxL09XeUZjcTFyY2E4UGRDRTZPb0djckJOT1RKNHZ6NFIKbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArdkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSApWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE9lNHBJYjR0RjlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEiCiMgU2VyaWFsOiA1MTU0MzEyNDQ4MTkzMDY0OTExNDExNjEzMzM2OQojIE1ENSBGaW5nZXJwcmludDogYjY6N2U6MWQ6ZjA6NTg6YzU6NDk6NmM6MjQ6M2I6M2Q6ZWQ6OTg6MTg6ZWQ6YmMKIyBTSEExIEZpbmdlcnByaW50OiAyMDpkODowNjo0MDpkZjo5YjoyNTpmNToxMjoyNTozYToxMTplYTpmNzo1OTo4YTplYjoxNDpiNTo0NwojIFNIQTI1NiBGaW5nZXJwcmludDogMDI6ZWQ6MGU6YjI6OGM6MTQ6ZGE6NDU6MTY6NWM6NTY6Njc6OTE6NzA6MGQ6NjQ6NTE6ZDc6ZmI6NTY6ZjA6YjI6YWI6MWQ6M2I6OGU6YjA6NzA6ZTU6NmU6ZGY6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0cKQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCMwpkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1CmRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXEKUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1JVTXhNQjRYRFRFeQpNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEClZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdWJtVjAKTDJ4bFoyRnNMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE1pQkZiblJ5ZFhOMExDQkpibU11SUMwZwpabTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVWRE1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWkKQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHlBc1dmb1BaYjFZc0dHWVpQVXhCdApCeVFub2FENDFVY1pZVXg5eXBNbjZuUU03MitXQ2Y1ajdIQmROcTFuZDY3Sm5YeFZSRHFpWTFFZjllTmkxS2xICkJ6N01JS05DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQwpSOThjcmxPWkY3WnZISDNodnhHVTBRT0lkZVNOaWFTS2QwYmViV0h2QXZYN3RkL00vazcvL3FubXB3SXdXNW5YCmhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDhrbWh0Yzlodkpxd2hBcmladHlaQld5VmdydEJJR3U0RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDRkNBIEVWIFJPT1QiCiMgU2VyaWFsOiA0MDc1NTUyODYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OmUxOmI2OmVkOjI2OjdhOjdhOjQ0OjMwOjMzOjk0OmFiOjdiOjI3OjgxOjMwCiMgU0hBMSBGaW5nZXJwcmludDogZTI6Yjg6Mjk6NGI6NTU6ODQ6YWI6NmI6NTg6YzI6OTA6NDY6NmM6YWM6M2Y6Yjg6Mzk6OGY6ODQ6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOmMzOmQ3OjhlOjRlOjFkOjVlOjQ1OjU0OjdhOjA0OmU2Ojg3OjNlOjY0OmY5OjBjOmY5OjUzOjZkOjFjOmNjOjJlOmY4OjAwOmYzOjU1OmM0OmM1OmZkOjcwOmZkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJRUdFck0xakFOQmdrcWhraUc5dzBCQVFzRkFEQldNUXN3Q1FZRFZRUUdFd0pEClRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlBUMVF3SGhjTk1USXdPREE0TURNd056QXhXaGNOTWpreApNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqCmFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlAKVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WQlUwMwpzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMClRJcFRVbnJEN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUKL1pPa1ZJQk1VdFJTcXk1SjM1RE51RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncAo3aFpaTERSSkdxZ0cxNmlJMGdOeWVqTGk2bWhOYml5V1pYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6CkVwUi8zOHdtbnZGeVhWQmxXWTlwczRkZU1tL0RHSXExbFkrd2VqZmVXa1U3eHpiaDcyZlJPZE9YVzNOaUdVZ3QKaHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWZweTI1SUd2UAphOTMxRGZTQ3QvU3laaTRRS1BhWFdudVdGbzhCR1Mxc2JuODVXQVprZ3dHRGc4Tk5rdDB5eG9la04ra1d6cW90CmFLOEtnV1U2Y01HYnJVMXRWTW9xTFV1Rkc3T0E1bkJGRFd0ZU5mQi9PN2ljNUFSd2lSSWxrOW9LbVNKZ2FtTmcKVG5ZR21FNjlnNjBkV0lvbGhkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVgpQS1B0bDhNZU5QbzQrUWdPNDhCZEs0UFJWbXJKdHFoVVV5NTRNbWM5Z245MDBQdmh0Z1ZndVhEYmpndjVFMWh2CmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWZCZ05WSFNNRUdEQVdnQlRqL2kzOUtOQUwKdGJxMm9zUy9CcW9GakpQN0x6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZApCZ05WSFE0RUZnUVU0LzR0L1NqUUM3VzZ0cUxFdndhcUJZeVQreTh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlQKZWovdFV4UFE0aTlxZWNzQUl5am1IamRYTlltRXduWlBORGF0WjhQT1FRYUl4ZmZ1MkJxNDFndC9VUCtUcWhkTApqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWE0Q1VxbXR6SFFUYjN5SFFGaERtVk9kWUxPNlFuK2dqWVhCNzRCR0JTCkVTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzR0U1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXkKUDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYQkRyRE1sSTFEbGI0cGQxOQp4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam5hSDlkCkNpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE4KNW15ZExJaHlQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZQovdjVXT2FISXoxNmVHV1JHRU5vWGtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaCkFBb0FDeEdWMmxaRkE0Z0tuMmZRMVhteHFJMUFiUTNDZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdloKNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgU3ViamVjdDogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBMYWJlbDogIlRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSIKIyBTZXJpYWw6IDE1NjIzMzY5OTE3MjQ4MQojIE1ENSBGaW5nZXJwcmludDogZGE6NzA6OGU6ZjA6MjI6ZGY6OTM6MjY6ZjY6NWY6OWY6ZDM6MTU6MDY6NTI6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjNDoxODpmNjo0ZDo0NjpkMTpkZjowMDozZDoyNzozMDoxMzo3Mjo0MzphOToxMjoxMTpjNjo3NTpmYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6MzU6MWI6OTA6MzQ6NDQ6YzE6ODU6Y2M6ZGM6NWM6Njk6M2Q6MjQ6ZDg6NTU6NWM6YjI6MDg6ZDY6YTg6MTQ6MTM6MDc6Njk6OWY6NGE6ZjA6NjM6MTk6OWQ6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVKekNDQXcrZ0F3SUJBZ0lIQUk0WC9pUWdnVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUUKQmhNQ1ZGSXhEekFOQmdOVkJBY01Ca0Z1YTJGeVlURk5NRXNHQTFVRUNneEVWTU9jVWt0VVVsVlRWQ0JDYVd4bgphU0RFc0d4bGRHbkZuMmx0SUhabElFSnBiR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnClFTN0ZuaTR4UWpCQUJnTlZCQU1NT1ZURG5GSkxWRkpWVTFRZ1JXeGxhM1J5YjI1cGF5QlRaWEowYVdacGEyRWcKU0dsNmJXVjBJRk5oeEo5c1lYbkVzV1BFc1hQRXNTQklOVEFlRncweE16QTBNekF3T0RBM01ERmFGdzB5TXpBMApNamd3T0RBM01ERmFNSUd4TVFzd0NRWURWUVFHRXdKVVVqRVBNQTBHQTFVRUJ3d0dRVzVyWVhKaE1VMHdTd1lEClZRUUtERVJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzgKZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakZDTUVBR0ExVUVBd3c1Vk1PY1VrdFVVbFZUVkNCRgpiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeElFZzFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwQ1VaNFdXZTYwZ2hVRW9JNVJId1dyb20KLzROWnprUXFMLzdoem1BRC9JMERwZTMvYTZpNnpEUUduMWsxOXV3c3U1MzdqVkpwNDV3bkVGUHpwQUxGcC9rUgpHbWwxYnNNZGk5R1lqWk9IcDNHWERTSEhtZmxTMHl4alhWVzg2QjhCU0xsZy9rSks5c2lBcnMxbWVwNUZpbWgzCjRraG9uNkxhOGVIQkVKL3JQQ21CcCtFeUNOU2dCYkdNKzQyV0FBNCtKZDlUaGlJNy9QUzk4d2wrZCt5RzZ3OHoKNVVOUDlGUjFiU21aTG1aYVE5L0xYTXJJNVRqeGZqczFuUS8weFZxaHpQTWdnQ1RUVit3VnVuVWxtK2hrUzdNMApoTzhFdVBiSmJLb0NQclpWNGpJM1gveG1sMS9OMXA3SElMOU54cXcvZFY4YzdUS2NmR2tBYVpIakl4aFQ2UUlECkFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVZwa0hIdE9zREdsa3RBeFFSOTVETEw0Z3dQc3dEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSjVGZG5zWApTREx5T0lzcHZlNldTazZCR0xGUlJ5RE4wR1N4RHNuWkFka0p6c2laM0dnbEU5UmM4cVBvQlA1eUNjY0xxaDBsClZYNldtbGUzdXNVUmVobm1wMzQ5aFE3MStTNHBMK2Y1YkZnV1YxQWw5ajR1UHFydGQzR3FxcG1XUmdxdWp1d3EKVVJhd1hzM3Fad1FjV0REMVlJcTlwcjFONVphMC9FS0pBV3YyY01oUU9Rd3QxV2JaeU5Lek1yY2JHVzNMTS9uZgpwZVlWaERmd3d2SmxscEtRZC9DdDlKRHBFWGpYazRuQVBRdTZLZlRvbVoxeWp1MmRMKzZTZmFIeC8xMjZNMkNGCll2NEhBcUdFVmthK2xncWFFOWNoVExkOEI1OU9UaitSZFBzbm5SSE0zZWF4eW5GTkV4YzVKc1VwSVN1VEtXcVcKK3F0QjRVdTJOUXZBbXhVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgU3ViamVjdDogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgTGFiZWw6ICJDZXJ0aW5vbWlzIC0gUm9vdCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDE0OjBhOmZkOjhkOmE4OjI4OmI1OjM4OjY5OmRiOjU2OjdlOjYxOjIyOjAzOjNmCiMgU0hBMSBGaW5nZXJwcmludDogOWQ6NzA6YmI6MDE6YTU6YTQ6YTA6MTg6MTE6MmU6Zjc6MWM6MDE6Yjk6MzI6YzU6MzQ6ZTc6ODg6YTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJhOjk5OmY1OmJjOjExOjc0OmI3OjNjOmJiOjFkOjYyOjA4Ojg0OmUwOjFjOjM0OmU1OjFjOmNiOjM5Ojc4OmRhOjEyOjVmOjBlOjMzOjI2Ojg4OjgzOmJmOjQxOjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa2pDQ0EzcWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SkdVakVUCk1CRUdBMVVFQ2hNS1EyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEhUQWIKQmdOVkJBTVRGRU5sY25ScGJtOXRhWE1nTFNCU2IyOTBJRU5CTUI0WERURXpNVEF5TVRBNU1UY3hPRm9YRFRNegpNVEF5TVRBNU1UY3hPRm93V2pFTE1Ba0dBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14CkZ6QVZCZ05WQkFzVERqQXdNRElnTkRNek9UazRPVEF6TVIwd0d3WURWUVFERXhSRFpYSjBhVzV2YldseklDMGcKVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOVE1DUW9zUDVMMgpmeFNlQzV5YWFoMUFNR1Q5cXQ4T0hnWmJuMUNGNnMyTnEwTm4zckQ2Zm9DV25vUjRra2pXNHpudXp1UlpXSmZsCkxpZVk2cE9vZDV0SzhPOTBnQzNyTUIrMTJjZUFuR0lua1lqd1NvbmQzSWptRlBuVkF5Ly9sZHU5bit3cytoUVYKV1pVS3hrZDhhUmk1cHdQNXluYXB6OGR2dEY0Ri91N0JVckoxTW9mczdTbG1PL05LRm9MMjFwcmJjcGpwM3ZERgpUS1dydGVvQjRvd3VaSDlrYi8yakpaT0x5S0lPU1kwMDhCL3NXRVV1TktxRVVMM25za29UdUxBUHJqaGRzS2tiCjVuUEpXcUhaWmtDcXFVMm1OQUt0aEg2eUk4SDdLc1puOURTMnNKVnFNMDl4UkxXdHdIa3ppT0MvN2FPZ0ZMU2MKQ2JBSzQyQysrUGhtaU0xYjhYY0Y0TFZ6YnNGOVJpNk9TeWVtelRVSy9lVk5mYW9xb3luSFdtZ0U2T1hXazZSaQp3c1htOUUvRytaOGFqWUpKR1lyS1dVTTY2QTB5d2ZSTUV3TnZicVkva1hQTHluTnZFaUNMN3NDQ2VONUxMc0pKCnd4M3RGdllrOUNjYlhGY3gzRlh1cUI1dmJLemlSY3hYVjRwMVZ4bmd0VmlaU1RZeFBETUJiUlpLemJncWc0U0cKbS9sZzBoOXRrUVBUWUtiVlBacmRkNUE5TmFTZkQxNzFVa1JwdWNDNjNNOTkzM3paeEt5R0lqSzhlMnVSNzNyNApGMml3NGxOVllDMnZQc0tEMk5rSksvREFaTnVIaTVITWtlc0UvWGEwbFpybUZBWWIxVFFkdnRqL2RCeFRoWm5nCldWSktZZTJJbm10SmlVWitJRnJaNTBybGF1N1NaUkZEQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMAoyVEFmQmdOVkhTTUVHREFXZ0JUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMDJUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBZmoxVTJpSmRHbGcrTzFRbnVyck15T01hYXVvKytSTHJWbDg5VU03ZzZrZ21Kczk1Vm42UkhKay8KMEtHUkhDd1BUNWlWV1ZPOTBDTFlpRjJjTi96N1pNRjRqSXVhWUFucTFmb2hYOUIwWmVkUXhiOHV1UXNMcmJXdwpGNllTak5SaWVPcFdhdXdLMGtERFBBVXdQazJVdDU5S0E5TjlKMHUyL2tUTytoa3pHbTJrUXRIZHpNakkxeFpTCmcwODFsTE1TVlgzbDRrTHI1SnlUQ2NCTVd3ZXJ4MjBSb0ZBWGxDT290UXFTRDdKNndXQXNPTXdhcGx2LzhnemoKcWg4YzNMaWdreWZlWStOL0laODY1Wjc2NEJOcWRldVdYR0tSbEk1blU3YUorQklKeTI5U1d3TnlobENWQ05TTgpoNFlWSDVVazJLUnZtczZrblp0dDBySjJCb2JHVmdqRjZ3bmFOc0liVzBHK1lTcmpjT2E0cHZpMldzUzlJZmYvCnFsK2hiSFk1WnRicVRGWGhBRE9iRTVoanlXL1FBU0FKTjFMbkRFOCt6YnoxWDVZbnB5QUNsZUF1NkFkQkJSOFYKYnRhdzVCbmdEd0tUQUNkeXhZdlJWQjlkU3NOQWwzNVZwbnpCTXdRVUFSMUpJR2tMR1pPZGJsZ2k5MEFNUmd3agpZL001MG45MlVhZjB5S0h4REhZaUkwWlNLUzNpbzBFSFZtbVkwZ1VKdkduSFdtSE5qNEZnRlUyQTNaRGlmY1JRCjhvdzdia3JIeHVhQUt6eUJ2QkdBRmhBbjEvRE5QM25NY3lyRGZsT1IxbTc0OWZQSDBGRk5qa3VsVytZWkZ6dlcKZ1FuY0l0enVqcm5FajFQaFo3c3p1SWdWUnMvdGFUWC9kUTFHODg1eDRjVnJoa0lHdVVFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EiCiMgU2VyaWFsOiAxNTc3Njg1OTU2MTY1ODg0MTQ0MjIxNTkyNzg5NjY3NTA3NTc1NjgKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmViOmI5OjYxOjI4OjJlOmI3OjJmOjk4OmIwOjM1OjI2OjkwOjk5OjUxOjFkCiMgU0hBMSBGaW5nZXJwcmludDogMGY6Zjk6NDA6NzY6MTg6ZDM6ZDc6NmE6NGI6OTg6ZjA6YTg6MzU6OWU6MGM6ZmQ6Mjc6YWM6Y2M6ZWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZiOjljOjA4OmU4OjZlOmIwOmY3OjY3OmNmOmFkOjY1OmNkOjk4OmI2OjIxOjQ5OmU1OjQ5OjRhOjY3OmY1Ojg0OjVlOjdiOmQxOmVkOjAxOjlmOjI3OmI4OjZiOmQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdFRDQ0FwMmdBd0lCQWdJUWRyRWdVblR3aFlkR3MvZ2pHdmJDd0RBTkJna3Foa2lHOXcwQkFRc0ZBREJ0Ck1Rc3dDUVlEVlFRR0V3SkRTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWcKUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aQpZV3dnVW05dmRDQkhRaUJEUVRBZUZ3MHhOREV5TURFeE5UQXdNekphRncwek9URXlNREV4TlRFd016RmFNRzB4CkN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRFZRUUxFeGxQU1ZOVVJTQkcKYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzYjJKaApiQ0JTYjI5MElFZENJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyQmUzCkhFb2tLdGFYc2NyaUh2dDlPTytZOWJJNW1FNG51QkZkZTlJbGxJaUNGU1pxR3pHN3FGc2hJU3ZZRDA2Zld2R3gKV3VSNTFqSWpLK0ZUekpsRlhIdFByYnkvaDBvTFM1ZGFxUFpJN0gxN0RjMGhCdCtlRmYxQmlraTNJUFNoZWh0WAoxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sazkrSEtRVVlPS1hIUXVTUDh5WUZmVHZkdjM3K0VyWE5rCnU3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvUW5jL25TTWJzclk5Z0JRSFRDNVAKOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmdHVXB1dXk5cgpNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUIKQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaApjVmlYZmE0M0ZLOCs1L2VhNG4zMmNaaVpCS3BEZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1CmdTazhyeFdZSVREK0tKQUFqTkhoeS9wZXlQMzRFRVk3b25oQ2tSZDBWUXJlVUdkTlp0R24vLzNad0xXb280ck8KWnZVUFE4Mm5LMWQ3WTBacXFpNVMyUFR0NFcydEtaQjRTTHJoSTZxamlleTFxNWJBdEV1aUhaZWVldkp1UUhIZgphUEZsVGM1OEJkOVRaYW1sOExHWEJIQVZSZ09ZMU5LL1ZMU2dXSDFTYjlwV0ptTFUyTnVKTVc4YzhDTEMwMkljCk5jMU1hUlZVR3BDWTN1c2VYOHAzeDh1T1BVTnBuSnBZMENRNzN4dEFsbjQxcllISFRuRzZpQk09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgU3ViamVjdDogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIExhYmVsOiAiU1pBRklSIFJPT1QgQ0EyIgojIFNlcmlhbDogMzU3MDQzMDM0NzY3MTg2OTE0MjE3Mjc3MzQ0NTg3Mzg2NzQzMzc3NTU4Mjk2MjkyCiMgTUQ1IEZpbmdlcnByaW50OiAxMTo2NDpjMTo4OTpiMDoyNDpiMTo4YzpiMTowNzo3ZTo4OTo5ZTo1MTo5ZTo5OQojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOjUyOmZhOjk1OjNmOmVkOmRiOjI0OjYwOmJkOjZlOjI4OmYzOjljOmNjOmNmOjVlOmIzOjNmOmRlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMTozMzo5ZDozMzoyODoxYTowYjo1NjplNTo1NzpkMzpkMzoyYjoxYzplNzpmOTozNjo3ZTpiMDo5NDpiZDo1ZjphNzoyYTo3ZTo1MDowNDpjODpkZTpkNzpjYTpmZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTApCUUF3VVRFTE1Ba0dBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042ClpXNXBiM2RoSUZNdVFTNHhHREFXQmdOVkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3cKTnpRek16QmFGdzB6TlRFd01Ua3dOelF6TXpCYU1GRXhDekFKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TApjbUZxYjNkaElFbDZZbUVnVW05NmJHbGplbVZ1YVc5M1lTQlRMa0V1TVJnd0ZnWURWUVFEREE5VFdrRkdTVklnClVrOVBWQ0JEUVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMzdkQ1UXFFdk4KUUxYT1llZVd5clNoMmd3aXNQcTFlM1lBZDR3THozMm9oc3dtVWVRZ1BZVU0xbGpqNS9RcUdKM2EwYTRtN3V0VAozUFNRMWhOS0RKQTh3L1RhMG80TmtqcmNzYkgvT043RHVpMWZnTGtDdlVxZEd3KzB3OExCWndQZDNCdWNQYk93CjNnQWVxRFJIdTVyci9nc1V2VGFFMmcwZ3YvcGJ5NmtXSUswNVlPNHZkYmJubDV6NVB2MStUVzlOTCsrSURXcjYKM2ZFOWJpQ2xvQkswVFhDNXp0ZHlPNG1UcDRDRUhDZEpja20xL3p1Vm5zSE15QUhzNkE2S0NwYm5zNmFINWRiNQpCU3NObDBCd1BMcXNkVnFjMVUyZEFnclNTNXRtUzBZSEYyV3RuMnlJQU53aWllRGhaTlJudkRGNVlUeTd5a0hOClhHb0F5RHc0amxpdkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUXVGcWxLR0xYTHpQVnZVUE1qWC9oZDU2end5REFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQVFFQXRYUDRBOXhaV3gxMjZhTXFlNUFvc2szQU0wK3FtckhVdU9Rbi82bVdtYzVHNEcxOFRLSTRwQVp3CjhQUkJFZXcvUjQwL2NvZjVPLzJrYnl0VEFPRC9PYmxxQnc3ckhSejJvbktReTRJOUVZS0wwcnVmS3E4aDVtT0cKblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2N29Qd2dsVjlQSmk4Ukk0Tk9kUWNQdjV2UnRCM3BFQVQreW1DUApva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsNCt2SmhhQWxJRGY3anM0TU5JVGhQSUd5CmQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYrL05OSXh1Wk16U2cKTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiIKIyBTZXJpYWw6IDQ0OTc5OTAwMDE3MjA0MzgzMDk5NDYzNzY0MzU3NTEyNTk2OTY5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZDo0Njo5ZTpkOToyNTo2ZDowODoyMzo1Yjo1ZTo3NDo3ZDoxZToyNzpkYjpmMgojIFNIQTEgRmluZ2VycHJpbnQ6IGQzOmRkOjQ4OjNlOjJiOmJmOjRjOjA1OmU4OmFmOjEwOmY1OmZhOjc2OjI2OmNmOmQzOmRjOjMwOjkyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjo3NjpmMjplZDpkYTplODo3Nzo1YzpkMzo2YzpiMDpmNjozYzpkMTpkNDo2MDozOTo2MTpmNDo5ZTo2Mjo2NTpiYTowMTozYToyZjowMzowNzpiNjpkMDpiODowNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQgpnREVMTUFrR0ExVUVCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11ClFTNHhKekFsQmdOVkJBc1RIa05sY25SMWJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUcKQTFVRUF4TWJRMlZ5ZEhWdElGUnlkWE4wWldRZ1RtVjBkMjl5YXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnegpPVFUyV2hnUE1qQTBOakV3TURZd09ETTVOVFphTUlHQU1Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aClZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNRd0lnWURWUVFERXh0RFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSMwpiM0pySUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDOStYajQ1dFdBCkRHU2RoaHVXWkdjL0lqb2VkUUY5Ny90Y1o0ekp6RnhycVpIbXVVTGxJRXViMnB0N3VabGQyWnVBUzllRVFDc24KMCtpNk1McytDUnFuU1pYdkswQWt3cGZIcCs2YkplK29DZ0NYaFZxcW5kd3B5ZUkxQit0d1RVcld3Yk5XdUtGQgpPSnZSK3pGL2orQmY0YkUvRDQ0V1NXRFhCbzBZK2FvbUVLc3EwOURSWjQwYlJyNUhNTlV1Y3RIRlk5cm5ZM2xFCmZrdGpKSW1HTGpRL0tVeFNpeXFud09LUktJbTV3RnY1SGRubko2My9tZ0tYd2NaUWtwc0NMTDJwdVRSWkNyK0UKU3YvZi9yT2Y2OW1lNEpnajdLWnJkeFlxMjh5dE94eWtoOXhHYzE0WlltaEZWK1NRZ2tLN1F0YndZZURCb3oxbQpvMTMwR082SXlZMFhSU21aTW5VQ01lNHBKc2hyQXVhMVlrVi9OeFZhSTJpSjFEN2VUaWV3OEVBTXZFMFh5MDJpCnN4N1FCbHJkOXBQUFYzV1o5ZnFHR21kNHM3K1cvalRjdmVkU1Z1V3o1WFY3MTBHUkJkeGRhZU9WRFVPNS9JT1cKT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQlJna2cvaUtndGxzd2pieUpETlhYY1BpSFV2M2E3NnhSTGdlegpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllaGl6S1YvTWE1Y2lTaXhxQ2xuckR2RkFTCmFkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk1CaEJndTRNMXQxNW4KM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1EKRi94bGhNY1FTWkRlMjhjbWs0Z21iM0RXQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZgpDVm4wVzNjTE4rbUxJTWI0Q2s0dVdCenJNOURQaG1ESjJ2dUFMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5ClhONDBoejVCc0E3MnVkWS9DUk9XRkMvZW1oMWF1VmJPTlRxd1gzQk5YdU1wOFNNb2NsbTJxOEtNWmlZY2R5d20KZGpXTEtLZHBvUGs3OVNQZGhSQjB5WkFEVnBIbnI3cEgxQktYRVNMam9rbVViT2UzbEV1NkxhVGFNNHRNcGtULwpXanpHSFdUWXRUSGtwang2cUZjTDIrMWhHc3Z4em5OM1k2U0hiMHhST05ia1g4ZWZ0b0VxNUlWSWVWaGVPL2piCkFvSm53VG5idzNSTFBUWWUrU21UaUdoYnFFUVpJZkNuNklFTkxPaVROclEzc3Nxd0d5WjZtaVVmbXBxQW5rc3EKUC91am12NXpNbkhDbnNaeTRZcG9KL0hrRDdURVRLVmhrL2lYRUFjcU1DV3B1Y2h4dU85b3pDMSs5ZUIrRDRLbwpiN2E2YklORGQ4MktraGVobmx0NEZqMUY0ak55M2VGbXlwblR5Y1VtL1Exb0JFYXV0dG1iakw0WnZySEc4aG5qClhBTEtMTmh2U2dmWnlUWGFRSFh5eEtjWmI1NUNFSmgxNXBXTFlMenR4UkxYaXM3Vm1GeFdsZ1BGN25jR05mL1AKNU80L0UySHUyOW90aGZETnJwMnlHQWxGdzVLaGNoZjhSN2FnQ3l6eHhONURhQWhxWHp2d2RtUDd6QVlzcHNiaQpEclc1dmlTUAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogY2E6ZmY6ZTI6ZGI6MDM6ZDk6Y2I6NGI6ZTk6MGY6YWQ6ODQ6ZmQ6N2I6MTg6Y2UKIyBTSEExIEZpbmdlcnByaW50OiAwMTowYzowNjo5NTphNjo5ODoxOToxNDpmZjpiZjo1ZjpjNjpiMDpiNjo5NTplYToyOTplOToxMjphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDA6OTI6OWE6MDI6Y2U6NTM6YjQ6YWM6ZjQ6ZjI6ZmY6YzY6OTg6MWM6ZTQ6NDk6NmY6NzU6NWU6NmQ6NDU6ZmU6MGI6MmE6Njk6MmI6Y2Q6NTI6NTI6M2Y6MzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDekNDQS9PZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCcGpFTE1Ba0dBMVVFQmhNQ1IxSXgKRHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1awpJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlZCQU1UCk4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXYKZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4TVRJeFdqQ0JwakVMTUFrRwpBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oClpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3gKUURBK0JnTlZCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1VtOXZkRU5CSURJd01UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREMrS2svRzRuOFBEd0VYVDJRTnJDUk9uazhabHJ2YlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUEKNHlqc3JpRkJ6aC9hL1gwU1d3R0REN213WDVuaDhoS0RnRTBHUHQrc3IrZWhpR3N4ci9DTDBCZ3p1TnRGYWpUMApBb0FrS0FvQ0ZaVmVkaW9ObVRvVVcvYkx5MU84RTAwQmlEZVVKUnRDdkNMWWpxT1dYanJaTXRzKzZQQVFaZTEwCjRTK25mSzhuTkxzcGZadTJ6d25JNWRNSy9JaGxaWFFLM0hNY1hNMUFzUnpVdG9TTVRGRFBhSTZvV2E3Q0owNkMKb2pYZEZQUWYvN0ozMVljdnFtNTlKQ2ZueHNzbTV1WCtad2RqMkVVTjNUcFpaVGxZZXBLWmNqMmNoRjZJSWJqVgo5Q3o4MlhCU1QzaTR2VHdyaTVXWTliUFJhTThnRkg1TVhGL25pK1gxTllFWk45Y1JDTGRtdnROS3pvTlhBRHJECmdmZ1h5NUkyWGRHajJIVWI0WXNuNm5wSVFmMUZHUWF0SjVsT3dYQkgzYldmZ1ZNUzViR01TRjB4UXhmampNWjYKWTVaTEtUQk9oRTVpR1Y0OHpwZVFwWDhCNjUzZytJdUozU1dZUFpLMmZ1L1o4VkZSZlMwbXlHbFpZZUNzYXJncQpOaEVFZWxDOU1vUytMOXh5MWRjZEZrZmtSMllnUC9TV3hhK09BWHFsRDNwazlRMFloOW11aU5YNmhNRTZ3R2tvCkxmSU5hRkdxNDZWM3hxU1FEcUUzaXpFalI4RUpDT3R1OTNpYjE0TDhoQ0NaU1JtMkVrYXgrMFZWRnFtalpheWMKQncvcWE5d2ZMZ1p5N0lhSUV1UXQyMThGTCtUd0E5TW1NK2VBd3MxQ29SYzBDd0lEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVY1JWbnlNakp2WFZkCmN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFc3YlZSTHFoQllSalR5WXRjV05sMEkKWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrRDFoWWMyUnl4K2hGanR5cDhpWS94bm1Nc1ZNSQpNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck1kL0s0a1BGb3gvbGEvdm90CjlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reWQrMlYKWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYQpqOEdzR3NWbjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oClg5aXpqRmswV2FTclQyeTdIeGpiZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFEKbDAzM0RsWmR3SlZxd2piREcyako5U3JjUjVxK3NzN0ZKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZgpiem9Fdk0xNGlRdU9EeStqcWsraUd4STlGZ2hBRC9GR1ROZXFld2pCQ3ZWdEo5NENqOHJEdFN2SzZldklJVk00CnBjdzcySGMzTUtKUDJXL1I4a0N0UVhvWHhkWktOWW0zUWRWOGhuOVZUWU5LcFhNZ3dEcXZrUEdhSkk3WmpuSEsKZTdpRzJyS1BtVDRkRXcwU0VlN1VxL0RwRlhZQzVPRGZxaUFlVzJHRlpFQ3BrSmNOclZQU1doMkhhZ0NYWldLMAp2bTlxcC9Vc1F1MHlyYllobnI2OAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODE6ZTU6YjQ6MTc6ZWI6YzI6ZjU6ZTE6NGI6MGQ6NDE6N2I6NDk6OTI6ZmU6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA5ZjpmMTo3MTo4ZDo5MjpkNTo5YTpmMzo3ZDo3NDo5NzpiNDpiYzo2Zjo4NDo2ODowYjpiYTpiNjo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogNDQ6YjU6NDU6YWE6OGE6MjU6ZTY6NWE6NzM6Y2E6MTU6ZGM6Mjc6ZmM6MzY6ZDI6NGM6MWM6Yjk6OTU6M2E6MDY6NjU6Mzk6YjE6MTU6ODI6ZGM6NDg6N2I6NDg6MzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3ekNDQWtxZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQ0JxakVMTUFrR0ExVUVCaE1DUjFJeER6QU4KQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hSREJDQmdOVkJBTVRPMGhsCmJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUlVORElGSnYKYjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3TXpjeE1sb3dnYW94Q3pBSgpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqCllXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjUKTVVRd1FnWURWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMApkWFJwYjI1eklFVkRReUJTYjI5MFEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnClFlaExnb1JjNHZneEVabUdaRTRKSlMrZFFTOEtyalZQZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmEKanE0b252a3RUcG52TEVodlRDVXA2TkZ4Vzk4ZHdYVTN0TmY2ZTNwQ25Hb0tWbHA4YVF1cWdBa2tiSDdCUnFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTFFpCkM0S1pKQUVPbkx2a0R2Mi8rNWNnazVrcU1Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HZk9GbUk0b3F4aVJhZXAKbFNUQUdpZWNNanZBd05XNnFlZjRCRU5UaGU1U0lkNmQ5U1dEUHA1WVN5L1haeE1PSVFJd0JlRjFBZDVvN1NvZgpUVXdKQ0Ezc1M2MWtGeWpuZGM1RlpYSWhGOHNpUVE2TUU1ZzRtbFJ0bThyaWZPb0NXQ0tSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkxOTExNTY1Nzc5ODk4MzU2NzA5NzMxMTc2OTY1NjE1NTY0NjM3NzEzCiMgTUQ1IEZpbmdlcnByaW50OiA3ZjowOTo5YzpmNzpkOTpiOTo1Yzo2OTo2OTo1NjpkNTozNzozZToxNDowZDo0MgojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmZkOmQwOmI3OmZkOmEyOjRlOjBkOmFjOjQ5OjJjOmEwOmFjOmE2OjdiOjZhOjFmOmUzOmY3OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNToyYTo0MDoyYjpmYzpkZjoyYzpkNTo0ODowNTo0ZDoyMjo3NTpiMzo5Yzo3ZjpjYTozZTpjMDo5Nzo4MDo3ODpiMDpmMDplYTo3NjplNTo2MTphNjpjNzo0MzozZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVNFU0JWZytRdFBsUldoUzJETjdjczNFWVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFOcFFoN2JhdUtrK25XVDZWak9hVmowVzVRT1ZzalFjbW0xaUJkVFlqK2VKWkorNjIyU0xaT1o1S21ITnI0OWEKaVpGbHVWajh0QU5ma1Q4dEVCWGdmcys4L0g5RFo2aXRYallqMkppelRmTkRuamw4S3Z6c2lOV0k3bkM5aFJZdAo2a3VKUEtOeFF2NGMvZE1jTFJDNGhsVHFRN2pieG9mYXFLNkFKYzk2SmgycWtiQkliNjYxM3A3WTEvb0EvY2FQCjBGRzdZbjJrc1l5eS95QVJ1alZqQllaSFlFTXprUFpIb2dOUGxrMmRUOEhxNnB5aS9qUXUzcmZLRzNha3Q2MmYKNmFqVWVEOTQvdkk0Q1RZZDBoWUN5T3dxYUsvMWpwVHZMUk42SGtKS0hSVXhyZ3dFVi94aGMvTXhWb1l4Z0tERQpFVzR3ZHVPVThGOEV4S3lIY29tWXhaM01Wd2lhOUF6OGZYb0ZPdnBIZ0RtMno0UVRkMjhuNnYrV1p4Y0liZWtOCjFpTlFNTEFWZEJNKzVTLy9EczNFQzBwZDhOZ0FNMGxtNjZFWWZGa3VQU2k1WVhITHRhVzZ1T3JjNG5CdkNHcmMKaDJjMDc5OHdjdDN6eVQ4ai96WGh2aUVwSURDQjVCbWxJT2tseW5NeGRDbSs0a0xWODdJbVpzZG8vUm16NXlDVAptZWhkNEY2SDUwYm9KWndLS1NUVXpWaUdVa0Frc25zUG1CSWdKUGFRYkVmSURic1lJQzdaL2Z5TDhpbnFoM1NWCjRFSlFlSVFFUVdHdzlDRWpqeTNMS0NIeWFtejBHcWJGRkxRM1pVK1YvWURJK0hMbEpXdkVZTEY3Ylk1S2luUE8KV2Z0d2VuTUdFOW5UZERja1FRb1JiNWZjNStSK29iMFY4cnFIRHoxb2loWUhBZ01CQUFHall6QmhNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlNvd2NDYmthaERGWHhkCkJpZTBLbEhZbHd1QnNUQWZCZ05WSFNNRUdEQVdnQlNvd2NDYmthaERGWHhkQmllMEtsSFlsd3VCc1RBTkJna3EKaGtpRzl3MEJBUTBGQUFPQ0FnRUFuRlp2QVg3UnZVejFpc2J3SmgvazREZ1l6RExES1R1ZFFTazBZY2JYOEFDaAo2NlJ5ajVRWHZCTXNkYlJYN2dwOENYcmMxY3FoMERRVCtIZXJuK1grMkI1MGlvVUhqMy9NZVhyS2xzM04vVS83Ci9TTU5rUFgwWHRQR1lYMmVFZUFDN2drRTJRZmRwb3EzRElNa3U0TlFrdjVnZFJFKzJKMndpbnExNEoyYnk1QlMKUzdDVEt0UStGalBsbnNabEZUNWtPd1EvMnd5UFgxd2RhUit2OCtraGpQUHZsL2FhdHhtMmhIU2NvMVMxY0U1agoyRmRkVXlHYlFKSkQrdFozVlROUFpOWDcwQ3hxam0wbHB1K0Y2QUxFVXo2NW5vZTh6RFVhM3FIcGltT0haUjRSCkt0dGpkNWNVdnBvVW1SR3l3TzZ3VC9nVUlUSkRUNStyb3N1b0Q2bzdCbFhHRWlsWENOUTMxNGNuclVsWnA1R3IKUkhwZWpYRGJsODVJVUxGemsvYndnMkQ1emZIaE1mMWJmSEVoWXhRVXFxL0YzcE4rYUxIc0lxS3FrSFdldFVOeQo2bVNqaEV2OURLZ21hM0dYN2xaalp1aENWUG5ISGQvUWoxdmZ5REJ2aVA0TnhETWNVNmlqL1VnUTh1UUtUdUVWClYveHVaRERDVlJIYzZxbk5TbFNzS1dORXowcEFvTlpvV1JzeitlODZpOXNna3R4Q2hMOEJxNGZBMVNDQzI4YTUKZzRWQ1hBOURPMnBKTmRXWTlCVy8rbUdCREFrZ0dOTFFGd3pMU0FCUTZYYUNqR1RYT3FBSFZjd2VNY0R2T3JSbAorK08vUW11ZUQ2aTlhNWpjMk52TGk2VGQxMW4wYnQzK3FzT1IwQzVDQjhBTVRWUE5KTEZNV3g1UjlOL3Brdm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDg3MDk2MTMxNTM2ODQ0MjA5NTYzNTA5MjI4OTUxODc1ODYxNTg5CiMgTUQ1IEZpbmdlcnByaW50OiBhNzplZTpjNDo3ODoyZDoxYjplZToyZDpiOToyOTpjZTpkNjphNzo5NjozMjozMQojIFNIQTEgRmluZ2VycHJpbnQ6IDRmOjY1OjhlOjFmOmU5OjA2OmQ4OjI4OjAyOmU5OjU0OjQ3OjQxOmM5OjU0OjI1OjVkOjY5OmNjOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2YzpjMDo1MDo0MTplNjo0NDo1ZTo3NDo2OTo2Yzo0YzpmYjpjOTpmODowZjo1NDozYjo3ZTphYjpiYjo0NDpiNDpjZTo2Zjo3ODo3Yzo2YTo5OTo3MTpjNDoyZjoxNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hEQ0NBYUtnQXdJQkFnSVNFU0Raa2M2dW8rakY1Ly9wQXEvUGM3eFZNQW9HQ0NxR1NNNDlCQU1ETUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYU1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTTBQVzFhQzMvQkZHdGF0CjkzbndIY21zbHRhZVRwd2Z0RUlSeW9hL2JmdUZvOFhsR1Z6WDdxWS9hV2ZZZU9LbXljVGJMWGt1NTR1TkFtOHgKSWswRzQyQnlSWjBPUW5lZXpzL2xmNFdiR09UOHpDNXkweGFUVHNxWlkxeWhCU3BzQnFOak1HRXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnFEWXdKNWp0cE14andqCkZOaVB3eUNyS0dCWk1COEdBMVVkSXdRWU1CYUFGTnFEWXdKNWp0cE14andqRk5pUHd5Q3JLR0JaTUFvR0NDcUcKU000OUJBTURBMmdBTUdVQ01IRCtzQXZaOTRPWDdQTlZIZFRjc3dZTy9qT1luWXM1a0d1VUllMjIxMTNXVE5jaApwK2UvSVE4cnpmY3EzSVVIblFJeEFJWVVGdVhjc0dYQ3dJNFVuNzhrRm1qbHZQbDVhZHl0UlN2M3RqRnp6QWFsClU1T1JHcE91Y0dwbnV0ZWU1V0VhWHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkyMDM2NTc3ODExOTQ3MDEzNzcwNDAwMTI3MDM0ODI1MTc4ODQ0Nzc1CiMgTUQ1IEZpbmdlcnByaW50OiA3NjowMDpjYzo4MToyOTpjZDo1NTo1ZTo4ODo2YTo3YToyZTpmNzo0ZDozOTpkYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjkxOmU4OjM0OmY3OmUyOmVlOmRkOjA4Ojk1OjAxOjUyOmU5OjU1OjJkOjE0OmU5OjU4OmQ1OjdlCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NjpjNzo3MToyODpkOTo4YzoxODpkOToxYjo0YzpmZDpmZjpiYzoyNTplZTo5MTowMzpkNDo3NTo4ZTphMjphYjphZDo4Mjo2YTo5MDpmMzo0NTo3ZDo0NjowZTpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0N6a0ZVNWZYODJiV1RDcDU5clk0NW5NQTBHQ1NxR1NJYjNEUUVCQ3dVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeE1CNFhEVEUwTURVeU5qQTRORFUxTUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUQ0ZVViYWxzVXdYb3B4QXkxd3BMdXd4UWpjemVZMXdJQ2tFUzNkNW9ldVhUMlIwb2RzTjdmYVlwNmIKd2lUWGovSGJwcWJmUm05UnBuSExQaHN4WjJMM0VWczBKOVY1VG95YldMMGlFQTFjSnd6ZE1PV28wMTBoT0hRWAovdU1mdGs4N2F5M2JmV0FmakgxTUJjTHJBUllWbUJTTzBaQjNJai9zd2ptNGVUcndTU1RpbFpIY1lUU1NqRlIwCjc3RjlqQUhpT0gzQlgycGZKTEtPWWhldGVTQ3RxeDIzNExTV1NFOW1ReEFHRmlRRDRlQ2Nqc1pHVDQ0YW1lR1AKdVk0emJHbmVXSzJnRHFka1ZCRnBSR1pQVEJLbmppeDl4TlJieFFBME1NSFptZjR5emdlRXRFN05DdjgyVFdMeApwMk5YNU50cXA2Ni9LN25KNXJJbmllVittaHhOYU1iQkdONHpLMUZHU3h5Tzl6ME0rWW8wRk1UN016VWo4Y3p4CktzZWx1N0NpenY1VGEwMUJHMllvc3BiNnA2NEtUcms1TTBTY2RNR1RIUGpnbmlRbFEvR2JJNEtxM3l3Z3NOdzIKVGdPemZBTFU1bnNhcW9jVHZ6NmhkTHViRHVIQWs1L1hwR2JLdXhzNzR6RDBNMW1LQjNJRFZlZHphZ014Ym0rVwpHK09pbjYrU3grMzFRcmNsVERzVEJNOGNscThjSXFQUXF3V3lUQklqVXR6OUdWc25uQjQ3ZXYxQ0k5c2pnQlB3CnZGRVZWSlNtZHo3UWRGRzlVUlFJT1RmTEh6U3BNSjFTaEM1VmtMRzYzMVVBQzloV0xiRkpTWEtBcVdMWHdQWVkKRVFSVnpYUjd6MkZ3ZWZSN0xGeGNrdnpsdUZxclRKT1ZvU2Z1cGI3UGNTTkN1cHQyTFFJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWwwWWhWeUUxCjJqWlZ4L1B4TjNEbENQYVRLYll3SHdZRFZSMGpCQmd3Rm9BVWwwWWhWeUUxMmpaVngvUHhOM0RsQ1BhVEtiWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUIzZEFtQjg0RFduNXBoNzZrVE9aMEJQOHBOdVp0UTVpU2FzMDAwRQpQTHVISVQ4MzlIRWwya3U2cTVhQ2daRzI3ZG14cEdXWDRtOWtXYVNXN21ES0h5UDdSYnIvanlUd3lxa3hmM2tmCmdMTXRNcnBrWjJDdnVWbk4zNXBKMDZpQ3NmbVlsSXJNNEx2Z0JCdVpZTEZHWmR3SW9ySkdua1NJNnBOK1Z4YlMKRlhKZkxrdXIxSjFqdU9OSTVmNkVMbGdLbjBNZC9yY1lrb1pEU3c2Y01vWXNZUFhwU09xVjdYQXA4ZFV2L1RXMApWOC9iaFVpWnVjSnZiSS9OZUpXc1pDajlWckREYjhPK1dWTGhYNFNQZ1BMMERUYXRkck9qdGVGa2RqcFkzSDFQClhsWnM1VlZaVjZYZjhZcG1NSXpVVW1JNGQ3UytLTmZLTnNTYkJmRDRGZHZiOGU4MG5SMTRTb2hXWjI1Zy80L0kKaStHT3ZVS3BNd3BaUWhJU0t2cXhuVU9PQlp1WjJtS3RWemF6SGJZTmVTMld1T3Z5REVzTXBaVEdNS2NtR1MzdApUQVpRTVBIOVdEMjVTeGRmR2JScWhGUzBPRTg1b2cyV2FNTW9sUDN0TFI5S2EwT1dMcEFCRVBzNHBvRUwwTDkxCjA5UzV6dkUvYnc0Y0hqZHg1UmlIZFJrL1VMbGVwRVUwcmJESzV1VVRkZzh4RkttT0xaVFcxWVZOY3hWUFMvS3kKUHUxc3ZmME9uV1p6c0QyMDk3K280QkdreEs1MUNVcGpBRWdncHNhZEN3bUt0T0Rtemo3SFBpWTQ2U3ZlcGdoSgpBd1NRaXVtUHYraTJ0Q3FqSTQwY0hMSTVrcWlQQWx4QU9YWFVjMEVDZDk3TjRFT0gxdVM2U3NOc0VuLytLdVlqCjFveHgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjAxMjQ0ODA0MjcwMjA5Njk4Njg3NTk4NzY3NjkzNTU3MzQxNTQ0MQojIE1ENSBGaW5nZXJwcmludDogNTc6MjQ6YjY6NTk6MjQ6NmI6YWU6Yzg6ZmU6MWM6MGM6MjA6ZjI6YzA6NGU6ZWIKIyBTSEExIEZpbmdlcnByaW50OiA3OTo1Zjo4ODo2MDpjNTphYjo3YzozZDo5MjplNjpjYjpmNDo4ZDplMTo0NTpjZDoxMTplZjo2MDowYgojIFNIQTI1NiBGaW5nZXJwcmludDogMjc6OTk6NTg6Mjk6ZmU6NmE6NzU6MTU6YzE6YmY6ZTg6NDg6Zjk6YzQ6NzY6MWQ6YjE6NmM6MjI6NTk6Mjk6MjU6N2I6ZjQ6MGQ6MDg6OTQ6ZjI6OWU6YTg6YmE6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDaGFSdS92Ym05VXBhUEkraEl2eVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3lNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFETXRsZWxNNVFRZ1RKVDMyRitEM1k1ejF6Q1UzVWRTWHFXT04yaWMycnhiOTVlb2xxNWNTRytOdG1oCi9MenViS2g4TkJweEd1Z2EyRjhPUkFidHArRHowbUVMNERLaWx0RTQ4TUxhQVJmODVLeFA2TzZKSG5TclQ3OGUKQ2JZMmFsYno0ZTZXaVdZa0J1VE5RanBLM2VDYXNNU0NSYlAreWF0Y2ZEN0o2eGN2REgxdXJxV1B5S3dsQ20vNgoxVVdZMGpVSjlnTkRsUDdadnlDVmVZQ1lpdG1KTmJ0Ukc2UTNmZnlaTzZ2L3Y2d05qME94bVhzV0VINGRiMGZFCkZZOEVsZ2dHUWdUNGhOWWR2SkdtUXI1SjFXcUlQN3d0VWRHZWplQlN6RmZkTlRWWTI3U1BKSWpraTkvY2ExVFMKZ1N1eXpwSkxIQjlHK2gzWWtzdDJaN1VKbVFubHJCY1VWWERHUEtCV0NnT3ozR0laMzhpMU1ILzFQQ1oxRWIzWApHN09IbmdldlpYSGxvTThhcHdrUUhaT0pabHZvUEdJeXRiVTZidW1GQVl1ZVE0eG5jeWhaVyt2ajNDek1wU1p5ClloSzA1cHlEUlBaUnBPTEFlaVJYeWc2bFB6cTFPNHZsZHU1dzVwTGVGbHdvVzVjWko1TCtlcEpVenBNNUNoYUgKdkdPejliR1RYT0J1dDlEcStXSXlpRVQ3dnljb3RqQ1ZYUklvdVpXK2oxTVk1YUlZRnVKV3BMSXNFUFVkTjZiNAp0L2JRV1Z5Sjk4TFZ0WlIwMGRYK0c3Ync1dFllZTlJOHk2amo5Ump6SVI5dTcwMW9CbnN0WFc1RGlhYkErYUMvCmdoN1BVMyswNnl6YlhmWnFmVUFrQlhLSk9BR1R5M0hDT1YwR0VmWnZlUGczRFRtRUp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVham42UWlMMwo1b2tBVFY1OU00UEx1RzUzaHE4d0h3WURWUjBqQkJnd0ZvQVVham42UWlMMzVva0FUVjU5TTRQTHVHNTNocTh3CkRRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFKakxxMEE4NVRNQ2wzOHRoNmFQMUY1S3I3Z2U1N3R4KzRCa0phbXoKR2o1b1hTY21wN29xNGZCWGd3cGtUeDRpZEJ2cGtGL3dyTS8vVDJoNk9LUVFiQTJ4eDZSM2dCaTJvaWhFZHFjMApuWEdFTDhwWjBrZUltVUVpeVRDWVlXNDlxS2dGYmRFZndGRkVWbjhuTlFMZFhwZ0tRdXN3djQyaG0xR3FPK3FUClJtVEZBSG5lSVd2MlY2Q0cxd1p5N0hCR1M0dHozYUFoZFQ3Y0hjQ1AwMDl6SElYWi9uOWl5SlZ2dHRON2pMcFQKd20rYlJFeDUwQjF3czllZkF2U3lCN0RINWZpdEl3Nm1Wc2twRW5kSTJTOUcvVHZ3L0hSd2txV09PQWdmWkRDMgp0MHY3TnF3UWpxQlNNMk9kQXpWV3hXbTl4aU5hSjVUMnBCTDRMVE04b1ZhbFg5WVo2ZTE4Q0wxM3pTZGt6SlRhClRrWlFoK0Q1d1ZPQUhydXQrMGRTaXh2OW92bmVEaUszUFROWmJOVGU5WlVHTWcxUkdVRmNQazhHOTdrcmdDZjIKbzZwNmZBYmhROE1UT1dJYU5yM2dLQzZVQXVRcExtQlZya0E5c0hTU1h2QWdaSlkvWDBWZGlMV0syZ0tnVzBWVQozamc5Q2NDb1NtVkdGdnlxdjFST1RWdStPRU8zS01xTE02b2FKYm9sWENrdlcwcHVqT290bkNyMkJYYmdkNWVBCmlOMW5FMjhkYUNTTFQ3ZDBnZVgwWUo5NlZkYytOOW9XYXo1M3JLNFljSlVJZVNrRGl2N0JPN00vR2cra08xNGYKV0tHVnlhc3ZjMHJRTFc2YVdROVZHSGd0UEZHbWw0dm11N0p3cWt3UjN2OThLemZVZXRGM05JL24rVUwzUElFTQpTMUlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMyIKIyBTZXJpYWw6IDE0OTIxMDQ5MDgyNzE0ODU2NTMwNzEyMTk5NDE4NjQxNzExNzA0NTU2MTUKIyBNRDUgRmluZ2VycHJpbnQ6IDIxOjM3OmI0OjE3OjE2OjkyOjdiOjY3OjQ2OjcwOmE5Ojk2OmQ3OmE4OjEzOjI0CiMgU0hBMSBGaW5nZXJwcmludDogNmU6MjY6NjQ6ZjM6NTY6YmY6MzQ6NTU6YmY6ZDE6OTM6M2Y6N2M6MDE6ZGU6ZDg6MTM6ZGE6OGE6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI3OmMzOjYyOjMxOjcwOjZlOjgxOjA3OjhjOjM2OjdjOmI4Ojk2OjE5OjhmOjFlOjMyOjA4OmRkOjkyOjY5OjQ5OmRkOjhmOjU3OjA5OmE0OjEwOmY3OjViOjYyOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSVRDQ0FhYWdBd0lCQWdJU0VTRG0rRXo4SkxDK0JVQ3Myb01iTkdBL01Bb0dDQ3FHU000OUJBTURNRUF4CkN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5d1pXNVUKY25WemRDQlNiMjkwSUVOQklFY3pNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3TUZvdwpRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1VUM0JsCmJsUnlkWE4wSUZKdmIzUWdRMEVnUnpNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJLN2xpdVRjcG0KM2dZNm94SDg0Qmp3Ymh5NkxUQU1pZG5XN3B0emc2a2pGWXd2V1lwYTNSVHFuVmtyUTdjRzdESzJ1dTVCdGExZApvWVhNNmgwVVpxTm5ma2JpbFBQbnRsYWhGVm1oVHplWHVTSWV2UkhyOUxJZlhzTVVtdVhabDVtall6QmhNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJIZDhNVWkySTUKRE1sdjRWQk4wQkJZM0pXSWJUQWZCZ05WSFNNRUdEQVdnQlJIZDhNVWkySTVETWx2NFZCTjBCQlkzSldJYlRBSwpCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqNmpjbmJvTUJCZjZGZWs5THlrQmw3K0JGak5BazJ6OCtlMkFjRytxCmo5dUV3b3YxTmNvRzNHUnZhQmJoajVHNUFqRUEyRXVseThMUUNHenBHUHRhM1UxZkpBdXdBQ0VsNzQrbkJDWngKNG54cDVWMmErRUVmT3ptVGs1MVY2czJOOGZ2QgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBTdWJqZWN0OiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIExhYmVsOiAiSVNSRyBSb290IFgxIgojIFNlcmlhbDogMTcyODg2OTI4NjY5NzkwNDc2MDY0NjcwMjQzNTA0MTY5MDYxMTIwCiMgTUQ1IEZpbmdlcnByaW50OiAwYzpkMjpmOTplMDpkYToxNzo3MzplOTplZDo4Njo0ZDphNTplMzo3MDplNzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOmJkOjJhOjc5OmExOjA3OjZhOjMxOmYyOjFkOjI1OjM2OjM1OmNiOjAzOjlkOjQzOjI5OmE1OmU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjpiYzplYzowNjoyNjo0OTo3NjpmMzo3NDo2MDo3Nzo5YTpjZjoyODpjNTphNzpjZjplODphMzpjMDphYTplMToxYTo4ZjpmYzplZTowNTpjMDpiZDpkZjowODpjNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBdwpUekVMTUFrR0ExVUVCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoCmNtTm9JRWR5YjNWd01SVXdFd1lEVlFRREV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTQKV2hjTk16VXdOakEwTVRFd05ETTRXakJQTVFzd0NRWURWUVFHRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdQpaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUVWtjZ1VtOXZkQ0JZCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUszb0pIUDBGRGZ6bTU0clZ5Z2MKaDc3Y3Q5ODRrSXh1UE9aWG9IajNkY0tpL3ZWcWJ2WUFUeWpiM21pR2JFU1R0ckZqL1JRU2E3OGYwdW94bXlGKwowVE04dWtqMTNYbmZzN2ovRXZFaG1rdkJpb1p4YVVwbVpteVBmanh3djYwcElnYno1TURtZ0s3aVM0KzNtWDZVCkE1L1RSNWQ4bVVnalUrZzRyazhLYjRNdTBVbFhqSUIwdHRvdjBEaU5ld053SVJ0MThqQTgrbyt1M2RwanErc1cKVDhLT0VVdCt6d3ZvLzdWM0x2U3llMHJnVEJJbERIQ05BeW1nNFZNazdCUFo3aG0vRUxOS2pEK0pvMkZSM3F5SApCNVQwWTNIc0x1SnZXNWlCNFlsY05IbHNkdTg3a0dKNTV0dWttaThteGRBUTRRN2UyUkNPRnZ1Mzk2ajN4K1VDCkI1aVBOZ2lWNStJM2xnMDJkWjc3RG5LeEhadThBL2xKQmRpQjNRVzBLdFpCNmF3QmRwVUtEOWpmMWIwU0h6VXYKS0JkczBwakJxQWxrZDI1SE43ck9yRmxlYUoxL2N0YUp4UVpCS1Q1WlB0MG05U1RKRWFkYW8weEFIMGFobWJXbgpPbEZ1aGp1ZWZYS25FZ1Y0V2UwK1VYZ1ZDd09QamRBdkJiSStlMG9jUzNNRkV2ekc2dUJRRTN4RGszU3p5blRuCmpoOEJDTkF3MUZ0eE5yUUh1c0V3TUZ4SXQ0STdtS1o5WUlxaW95bUN6THE5Z3dRYm9vTURRYUhXQmZFYndyYncKcUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvck9QTmszc2dyRFFvby8vZmI0aFZDMUNMUUoxM2hlZjRZNTNDSQpyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFk5dW1iYmpBTkJna3EKaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRCjNCZWJZaHRGOEdhVjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0sKTkZ0WTJQd0J5VlM1dUNiTWlvZ3ppVXd0aER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNQpPUkF6STRKTVBKK0dzbFdZSGI0cGhvd2ltNTdpYXp0WE9vSndUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyClRrWFdTdEFtek9WeXlnaHFwWlhqRmFIM3BPM0pMRitsKy8rc0tBSXV2dGQ3dStOeGU1QVcwd2RlUmxOOE53ZEMKak5QRWxwelZtYlVxNEpVYWdFaXVURGtIenN4SHBGS1ZLN3E0KzYzU00xTjk1UjFOYmRXaHNjZENiK1pBSnpWYwpveWkzQjQzbmpUT1E1eU9mKzFDY2VXeEcxYlFWczVadWZwc01sanE0VWkwLzFsdmgrd2pDaFA0a3FLT0oycXhxCjRSZ3FzYWhEWVZ2VEg5dzdqWGJ5TGVpTmRkOFhNMnc5VS90N3kwRmYvOXlpMEdFNDRaYTRyRjJMTjlkMTFUUEEKbVJHdW5VSEJjbldFdmdKQlFsOW5KRWlVMFpzbnZnYy91YmhQZ1hSUjRYcTM3WjBqNHI3ZzFTZ0VFend4QTU3ZAplbXlQeGdjWXhuL2VSNDQvS0o0RUJzK2xWRFIzdmV5Sm0ra1hROTliMjEvK2poNVhvczFBblg1aUl0cmVHQ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBTdWJqZWN0OiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBMYWJlbDogIkFDIFJBSVogRk5NVC1SQ00iCiMgU2VyaWFsOiA0ODU4NzYzMDgyMDY0NDg4MDQ3MDE1NTQ2ODI3NjA1NTQ3NTkKIyBNRDUgRmluZ2VycHJpbnQ6IGUyOjA5OjA0OmI0OmQzOmJkOmQxOmEwOjE0OmZkOjFhOmQyOjQ3OmM0OjU3OjFkCiMgU0hBMSBGaW5nZXJwcmludDogZWM6NTA6MzU6MDc6YjI6MTU6YzQ6OTU6NjI6MTk6ZTI6YTg6OWE6NWI6NDI6OTk6MmM6NGM6MmM6MjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmM1OjU3OjBjOjI5OjAxOjhjOjRkOjY3OmIxOmFhOjEyOjdiOmFmOjEyOmY3OjAzOmI0OjYxOjFlOmJjOjE3OmI3OmRhOmI1OjU3OjM4Ojk0OjE3OjliOjkzOmZhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4CkN6QUpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkoKV2lCR1RrMVVMVkpEVFRBZUZ3MHdPREV3TWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSgpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHClRrMVVMVkpEVFRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTHB4Z0hwTWhtNS8KeUJOdHdNWjlIQUNYanl3TUk3c1Fta0NwR3JlSGlQaWJWbXI3NW51T2k1S09weVZkV1JIYk5pNjNVUmNmcVFnZgpCQmNrV0tvM1NoamY1VG5VVi8zWHdTeVJBWkhpSXRRRHdGajhkMGZzano1MFE3cXNOSTFOT0habmpyREliekF6CldIRmN0UFZyYnRRQlVMZ1RmbXhLbzBuUklCbnV2TUFwR0dXbjN2N3YzUXFRSWVjYVo1SkNFSmhmVHpDOFBoeEYKdEJEWGFFQVV3RUQ2NTNjWGV1WUxqMlZiUE5tYVV0dTF2WjVHenozcmtRVUN3SmF5ZGt4TkVKWTdrdnFjZncrWgozNzRqTlVVZUFseit0YWlibVNYYVh2TWl3em4xNUNvdTA4WWZ4R3lxeFJ4cUFRVktMOUxGd2FnMEpsMW1wZElDCklma1l0d2IxVHBsdnFLdE1VZWpQVUJqRmQ4ZzVDU3hKa2pLWnFMc1hGM213V3NYbW84UlpaVWMxZzE2cDZEVUwKbWJ2a3pTREdtMG9HT2JWby9DSzY3bFdNSzA3cTg3SGovTGFabXRWQytuRk5DTStISG1weGZmblR0T21sY1lGNwp3azVIbHFYMmRvV2pLSS9wZ0c2QlU2VnRYN2hJK2NMNU5xWXVTZis0bHNLTUI3T2JpRmo4NnhzYzNpMXc0cGVTCk1LR0o0N3hWcUNmV1MrMlFyWXY2WXlWWkxhZzEzY3FYTTd6bHpjZWQwZXp2WGc1S2tBWW1ZNjI1MlRVdEI3cDIKWlN5c1Y0OTk5QWVVMTRFQ2xsMmpCMG5WZXRCWCtSdm5VMFoxcXJCNVFzdG9jUWpwWUwwNWFjNzByOE5XUU1ldApVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhaTBiMUFnTUJBQUdqZ1lNd2dZQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUGQ5eGYzRTZKb2JkMlNuOVIyZ3pMK0gKWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxb2RIUndPaTh2ZDNkMwpMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjEKUlh4bERQaXlOOCtzRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTQpMVk4wVjJVZTFiTGRJNEU3cFdZakoyY0pqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmCjc3SXpsaEVZdDhsbHZoamhvNlRjK2hqNTA3d1Rtemw2TkxyVFFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk4KSnBMdUh2VUJLd3JaMXBlYmJ1Q29HUnc2SVlzTUhrQ3RBK2ZkWm43MXVTQU5BK2lXK1lKRjFEbmdvQUJkMTVqbQpmWjVuYzhPYUt2ZXJpNkU2Rk84MHZGSU9pWmlhQkVDRUhYNUZhWk5YenV2TytGQjhUeHh1QkVPYitkWTdJeGpwCjZvN1JUVWFOOFR2a2FzcTYreU8zbS9xWkFTbGFXRm90NC9uVWJRNG1yY0Z1Tkx3eStBd0YrbVdqMnpzM2d5THAKMXR4eU0vMWQ4aUM5ZGp3ajJpajMrUnZyV1dUVjNGOXlmaUQ4elltMWtHZE5Zbm8vVHEwZHd6bitldlFvRnQ5Qgo5a2lBQmRjUFVYbXNFS3ZVN0FObTVtcXd1akdTUWtCcXZqclRjdUZxTjFXOHJCMlZ0MmxoOGtPUmRPYWcwd29rClJxRUlyOWJhUlJtVzFGTWRXNFI1OE1EM1IrK0xqOFVHcnAxTVlwMy9SZ1Q0MDhtMkVDVkFkZjRXcXNsS1lJWXYKdXU4d2QrUlU0cmlFbVZpQXFoT0xVVHBQU1BhTHRyTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAxIgojIFNlcmlhbDogMTQzMjY2OTc4OTE2NjU1ODU2ODc4MDM0NzEyMzE3MjMwMDU0NTM4MzY5OTk0CiMgTUQ1IEZpbmdlcnByaW50OiA0MzpjNjpiZjphZTplYzpmZTphZDoyZjoxODpjNjo4ODo2ODozMDpmYzpjODplNgojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOmE3OmY5OjY1OmVjOjVlOmZjOjM3OjkxOjBmOjFjOjZlOjU5OmZkOmMxOmNjOjZhOjZlOmRlOjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZTpjZDplNjo4ODo0ZjozZDo4NzpiMToxMjo1YjphMzoxYTpjMzpmYzpiMTozZDo3MDoxNjpkZTo3Zjo1NzpjYzo5MDo0ZjplMTpjYjo5NzpjNjphZTo5ODoxOTo2ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXhNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxKNGdISEtlTlhqCmNhOUhnRkIwZlc3WTE0aDI5SmxvOTFnaFlQbDBoQUV2ckFJdGh0T2dRM3BPc3FUUU5yb0J2bzNiU01nSEZ6Wk0KOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xdwpJRkFHYkhyUWdMS20rYS9zUnhtUFVEZ0gzS0tIT1ZqNHV0V3ArVWhuTUpidWxIaGViNG1qVWNBd2htYWhSV2E2ClZPdWp3NUg1U056LzBlZ3dMWDB0ZEhBMTE0Z2s5NTdFV1c2N2M0Y1g4akpHS0xoRCtyY2Rxc3EwOHA4a0RpMUwKOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbQpqZ1N1YkpySXFnMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSVFZeklVMDdMd01sSlF1Q0ZtY3g3SVFUZ29JTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQkFRQ1k4amRhUVpDaEdzVjJVU2dnTmlNT3J1WW91NnI0bEs1SXBEQi9HL3dralV1MHlLR1g5cmJ4ZW5ESQpVNVBNQ0Nqam1DWFBJNlQ1M2lIVGZJVUpyVTZhZFRyQ0MycUplSFpFUnhobGJJMUJqanQvbXN2MHRhZFExd1VzCk4rZ0RTNjNwWWFBQ2J2WHk4TVd5N1Z1MzNQcVVYSGVlRTZWL1VxMlY4dmlUTzk2TFhGdktXbEpiWUs4VTkwdnYKby91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYTJYVjRjZEZ5UXpSMWJsZFp3Z0pjSm1BcHp5TVpGbzZJUTZYVQo1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyeEpORGQyWmh3TG5vUWRlWGVHQURia3B5CnJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAyIgojIFNlcmlhbDogMTQzMjY2OTgyODg1OTYzNTUxODE4MzQ5MTYwNjU4OTI1MDA2OTcwNjUzMjM5CiMgTUQ1IEZpbmdlcnByaW50OiBjODplNTo4ZDpjZTphODo0MjplMjo3YTpjMDoyYTo1Yzo3Yzo5ZToyNjpiZjo2NgojIFNIQTEgRmluZ2VycHJpbnQ6IDVhOjhjOmVmOjQ1OmQ3OmE2Ojk4OjU5Ojc2OjdhOjhjOjhiOjQ0Ojk2OmI1Ojc4OmNmOjQ3OjRiOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxYjphNTpiMjphYTo4Yzo2NTo0MDoxYTo4Mjo5NjowMToxODpmODowYjplYzo0Zjo2MjozMDo0ZDo4MzpjZTpjNDo3MTozYToxOTpjMzo5YzowMToxZTphNDo2ZDpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSVRCbXlmMHBZMWhwOEtEK1dHZVBoYkpydUtOekFOQmdrcWhraUc5dzBCQVF3RgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXlNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUsyV255MmNTa3hLCmdYbFJtZXlLeTJ0Z1VSTzhUVzBHL0xBSWpkMFpFR3JISmd3MTJNQnZJSVRwbExHYmhRUERXOXRLNk1qNGtIYloKVzAvalRPZ0dOazNNbXF3OURKQXJrdFFHR1dDc04wUjVoWUdDclZvMzRBM01uYVpNVW5icVE1MjNCTkZROWxYZwoxZEttU1lYcE4rbktmcTVjbFUxSW1qK3VJRnB0aUpYWk5MaFNHa09Rc0w5c0JibTJlTGZxME9RNlBCSlRZdjlLCjhudStOUVdwRWpUajgyUjBZaXc5QUVsYUtQNHlSTHVIM1dVbkFuRTcya3IzSDlyTjl5RlZrRThQN0s2QzRaOXIKMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmRmTEM2SE03ODNrODFkczhQK0hnZmFqWlJSaWRoVyttZQp6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeGt2OExWL1Nhc3JsWDZhdnZEWGJSCjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTYnRxRFQ2WmoKbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvego3TXQwUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2CitYVXlvMDVmN08wb1l0bE5jL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kKMHUxdWZtOC8waTJCV1NsbXk1QTVsUkVlZENmKzNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlN3RFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tClVqQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFxcWlBanc1NG8rQ2kxTTNtOVpoNk8rb0FBN0NYRHBPOFdxajIKTEl4eWg2bXgvSDl6L1dOeGVLV0hXYzh3NFEwUXNoTmFiWUwxYXVhQW42QUZDMmprUjJ2SGF0KzIvWGN5Y3VVWQorZ24wb0pNc1hkS01kWVYyWlpBTUEzbTNNU05qclhpRENZWm9oTXIvK2M4bW1wSjU1ODFMeGVkaHB4Zkw4NmtTCms1TnJwK2d2VTVMRVlGaXd6QUpSR0Z1RmpXSlpZN2F0dE42YSt5YjNBQ2ZBWFZVM2RKbkpVSC9qV1M1RTR5d2wKN3V4TU1uZTBueHJwUzEwZ3hkcjlISWNXeGtQbzFMc21ta1Z3WHFrTE4xUGlSbnNuL2VCRzhvbTN6RUsyeXlnbQpidG1seVRySVFSTmc5MUNNRmE2eWJSb1ZHbGQ0NXBJcTJXV1FnajlzQXErdUVqb25sallFMXgyaWdHT3BtL0hsCnVyUjhGTEJPeWJFZmRGODQ5bEhxbS9vc29oSFVxUzBuR2tXeHI3Sk9jUTNBV0ViV2FRYkxVOHV6L210QnpVRisKZlV3UGZISjVlbG5OWGtvT3JKdXBtSE41ZkxUMHpMbTRCd3l5ZEZ5NHgyK0lvWkNuOUtyNXYyYzY5Qm9WWWg2MwpuNzQ5c1Ntdlo2RVM4bGdRR1ZNRE1CdTRHb24ybkwyWEE0NmpDZk1kaXlIeHROL2tITkdmWlFJRzZseldFN09FCjc2S2xYSXgzS2Fkb3dHdXVRTktvdE9yTjhJMUxPSndabWhzb1ZMaUprTy9LZFlFK0h2SmtKTWNZcjA3L1I1NEgKOWpWbHBOTUtWdi8xRjJSczc2Z2lKVW1UdHQ4QUY5cFlmbDN1eFJ1dzBkRmZJUkRIK2ZPNkFnb25COFh4MXNmVAo0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDMiCiMgU2VyaWFsOiAxNDMyNjY5ODY2OTkwOTA3NjYyOTQ3MDA2MzUzODEyMzA5MzQ3ODg2NjU5MzAKIyBNRDUgRmluZ2VycHJpbnQ6IGEwOmQ0OmVmOjBiOmY3OmI1OmQ4OjQ5Ojk1OjJhOmVjOmY1OmM0OmZjOjgxOjg3CiMgU0hBMSBGaW5nZXJwcmludDogMGQ6NDQ6ZGQ6OGM6M2M6OGM6MWE6MWE6NTg6NzU6NjQ6ODE6ZTk6MGY6MmU6MmE6ZmY6YjM6ZDI6NmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmNlOjZjOmZlOjdiOmYxOjRlOjYwOmIyOmUzOjQ3OmI4OmRmOmU4OjY4OmNiOjMxOmQwOjJlOmJiOjNhOmRhOjI3OjE1OjY5OmY1OjAzOjQzOmI0OjZkOmIzOmE0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCdGpDQ0FWdWdBd0lCQWdJVEJteWYxWFNYTm1ZL093dWEyZWllZGdQeVNqQUtCZ2dxaGtqT1BRUURBakE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0F6TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdNekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQ21YcDhaQmY4QU5tK2dCRzFiRzhsS2wKdWkyeUV1alNMdGY2eWNYWXFtMGZjNEU3TzVock9Yd3pwY1ZPaG82QUYyaGlSVmQ5UkZnZHN6Zmxad2pyWnQ2agpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlNyCnR0dlhCcDQzckRDR0I1Rnd4NXpFR2JGNHdEQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE0SVdTb3hlM2pma3IKQnFXVHJCcVlhR0Z5K3VHaDBQc2NlR0NtUTVuRnVNUUNJUUNjQXUveGxKeXpsdm5yeGlyNHRpeitPcEFVRnRlTQpZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgNCIKIyBTZXJpYWw6IDE0MzI2Njk4OTc1ODA4MDc2Mzk3NDEwNTIwMDYzMDc2Mzg3Nzg0OTI4NDg3OAojIE1ENSBGaW5nZXJwcmludDogODk6YmM6Mjc6ZDU6ZWI6MTc6OGQ6MDY6NmE6Njk6ZDU6ZmQ6ODk6NDc6YjQ6Y2QKIyBTSEExIEZpbmdlcnByaW50OiBmNjoxMDo4NDowNzpkNjpmODpiYjo2Nzo5ODowYzpjMjplMjo0NDpjMjplYjphZToxYzplZjo2MzpiZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6NWQ6Mjg6NDE6OWU6ZDA6MjA6MjU6Y2Y6YTY6OTA6Mzg6Y2Q6NjI6Mzk6NjI6NDU6OGQ6YTU6YzY6OTU6ZmI6ZGU6YTM6YzI6MmI6MGI6ZmI6MjU6ODk6NzA6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI4akNDQVhpZ0F3SUJBZ0lUQm15ZjE4RzdFRXdwUStWeGUzc3N5QnJCRGpBS0JnZ3Foa2pPUFFRREF6QTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQTBNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ05EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk5LcmlqZFBvMU1OL3NHS2UwdW9lMFpMWTdCaQo5aTBiMndoeElkSUE2R085bWlmNzhEbHVYZW85cGNtQnFxTmJJSmhGWFJiYi9lZ1FiZU9jNE9POVg0Umk4M0JrCk02RExKQzl3dW9paEtxQjErSUd1WWdiRWdkczViaW13SHZvdVhLTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRk5Qc3h6cGxic3poMm5hYVZ2dWM4NFp0VitXQgpNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHFMSWZHOWZoR3QwTzlZbGkvVzY1MStrSTByejJaVnd5empLS2x3CkNrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxQUU0N3hEcVVFcEhKV0VhZElSTnlwNGljaXVSTVN0dVcKMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgU3ViamVjdDogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBMYWJlbDogIkx1eFRydXN0IEdsb2JhbCBSb290IDIiCiMgU2VyaWFsOiA1OTkxNDMzODIyNTczNDE0NzEyMzk0MTA1ODM3Njc4ODExMDMwNTgyMjQ4OTUyMQojIE1ENSBGaW5nZXJwcmludDogYjI6ZTE6MDk6MDA6NjE6YWY6Zjc6ZjE6OTE6NmY6YzQ6YWQ6OGQ6NWU6M2I6N2MKIyBTSEExIEZpbmdlcnByaW50OiAxZTowZTo1NjoxOTowYTpkMTo4YjoyNTo5ODpiMjowNDo0NDpmZjo2Njo4YTowNDoxNzo5OTo1ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTQ6NDU6NWY6NzE6Mjk6YzI6MGI6MTQ6NDc6YzQ6MTg6Zjk6OTc6MTY6OGY6MjQ6YzU6OGY6YzU6MDI6M2I6ZjU6ZGE6NWI6ZTI6ZWI6NmU6MWQ6ZDg6OTA6MmU6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3ekNDQTZ1Z0F3SUJBZ0lVQ242bTMwdEVudHBxSklXZTVyZ1YweFovdTdFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JqRUxNQWtHQTFVRUJoTUNURlV4RmpBVUJnTlZCQW9NRFV4MWVGUnlkWE4wSUZNdVFTNHhIekFkQmdOVgpCQU1NRmt4MWVGUnlkWE4wSUVkc2IySmhiQ0JTYjI5MElESXdIaGNOTVRVd016QTFNVE15TVRVM1doY05NelV3Ck16QTFNVE15TVRVM1dqQkdNUXN3Q1FZRFZRUUdFd0pNVlRFV01CUUdBMVVFQ2d3TlRIVjRWSEoxYzNRZ1V5NUIKTGpFZk1CMEdBMVVFQXd3V1RIVjRWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUWdNakNDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmVGbDc4Um1PbndZb05NUElmNVUybzNDL0lQUElmT2I5d21LYjNGCmlickpnejMzN3NwYnhtMUpjN1RKUnFNYk5CTS93WWxGVi9UWnNmczJaVXY3Q09KSWNSSElianVlbmQrSlpUZW0KaGZZN1JCaTJ4amN3WWtTU2wybDlRakFrNUEwTWlXdGozc1hoMzA2cEZHeFQ0R0hPOWhjdkhUeTk1aUpNSFpQMQpFTVNoZHV4cTNzVnMzNWEwVmtCQ3dHS1NNS0V0RlpTZzBpQUdDVzVxYmVYcnQ3N1U4UEVWZkl2bVRyb1R6RXNuClhwazhGMTJQZ1g4elBVL1RQeHZzWEQvd1BFeDFidkttMVozYUxRZGpBc1p5NlpTOFRFbVZUNGhTeU52b2FZTDQKekRSYkl2Q0dwNG05U0FwdFpvRnR5TWhrK3dIaDlPSGUyWjdkMjF2VUtwa21GUnNlVEpJcGdwN1Zrb0dTUVhBWgo5NlRsazB1OGQyY3gzUno5TVhBTkY1a00rUXc1R1NvWHRUQnhWZFVQcmxqaFBTODBtOCtmOW5pRndwTjZjajVtCmo1d1dFV0NQbm9sdlo3N2dSMW83REpwbmk4OUd4cTQ0by9LbnZPYldoV3N6SkhBaVM4c0ltN3ZJK0FJcEhiNGcKREVhL2E0ZWJzeXBtUWpWR2JLcTZyZm1ZZStsUVZSUXh2N0hhTGUyQXJXZ2srMm1yMkhFVE1PWm5zNGRBL1lsKwo4a1BSRWQ4dlpTOWt6bDhVdWJHL01iMkhlRnBaWllpcS9Ga3lTSWJXVExrcFM1WFRkdk4zSlcxQ0hEaURUZjJqClg1dC9MYXg1R3c1Q01aZGpwUHVLYWRVaURUU1FNQzZvdE9CdHRwU3N2SXRPMTNEOHhUaU9aQ1hoVFRtUXpzbUgKaEZoeEFnTUJBQUdqZ2Fnd2dhVXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkNCZ05WSFNBRU96QTVNRGNHQnl1QgpLd0VCQVFvd0xEQXFCZ2dyQmdFRkJRY0NBUlllYUhSMGNITTZMeTl5WlhCdmMybDBiM0o1TG14MWVIUnlkWE4wCkxteDFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlQvR0NoMitVZ0ZMS0d1OFNzYks3SlQKK0V0OHN6QWRCZ05WSFE0RUZnUVUveGdvZHZsSUJTeWhydkVyR3l1eVUvaExmTE13RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFHb1pGTzF1ZWNFc2g5UU5jSDdYOW5qSkN3Uk94TEhPazNEK3NGVEFNczJaTUdRWHZ3L2w0alA5CkJ6WkFjZzRhdG1wWjFnRGxhQ0RkTG5JTkgycGtNU0NFZlVtbVdqZnJSY21GOWRUSEY1a0g1cHRWNUF6b3FiVE8KakZ1MUVWelBpZzROMXF4M2dmNHluQ1NlY3M1VTg5QnZvbGJXN01NM0xHVll2bGNBR3ZJMSt1dDdNVjNDd1JJOQpsb0dJbG9uQldWeDY1bjl3Tk9lRDRySGg0YmhZNzlTVjVHQ2M4SmFYY296cmhBSXVaWStrdDlKL1o5M0kwNTVjCnFxbWtvQ1VVQnB2c1QzNHRDMzhkZGZFejJPM091SFZ0UGx1NW1CMHhEVmJZUXc4d2tiSUVhOTFXdnBXQVZXZSsKMk0yRDJSanVMZytHTFpLZWNCUHMzbEhKUTNnQ3BVM0krVi9Fa1ZoR0ZuZGFkS3BBdkFlZk1MbXg5eElYM2VQLwpKRUFkZW1yUlR4Z0txcEFkNjBBZTM2RWVSSklRbXZLTjRkRkxScDdvUlVLWDZrV1o4K3htMVFMNjhxWktKS3JlCnpybksrVCtUYi9tanV1cWxQcG10L2Y5N21mVmw3dkJaS0dmWGtKV2tFNFNwaE1Ib3pzNTFrMk1hdkR6cTFXUWYKTFNvU09jYkRXakx0UjVFV0RydzR3VkRlajhvcWtEUWM3a0dVbkY0Wkx2aEZTWmwwa2JBRWIrTUVXckdyS3F2Kwp4OUNXdHRyaFNtUUdibUJOdlVKTy8zamFKTW9idE5lV09XeXU4UTZxcDMxSWl5Qk16MlRXdUpkR3NFN1JLbFk2Cm9KTzlyNEFrNEFwKzU4clZ5dWlGVmR3Mkt1R1VhSlBIWm5KRUQ0QWhNbXdseHlPQWd3cnIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBTdWJqZWN0OiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgTGFiZWw6ICJUVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBkYzowMDo4MTpkYzo2OToyZjozZToyZjpiMDozYjpmNjozZDo1YTo5MTo4ZTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDMxOjQzOjY0OjliOmVjOmNlOjI3OmVjOmVkOjNhOjNmOjBiOjhmOjBkOmU0OmU4OjkxOmRkOmVlOmNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NjplZDpjMzo2ODo5MDo0NjpkNTozYTo0NTozZjpiMzoxMDo0YTpiODowZDpjYTplYzo2NTo4YjoyNjo2MDplYToxNjoyOTpkZDo3ZTo4Njo3OTo5MDo2NDo4NzoxNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeApHREFXQmdOVkJBY1REMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwCmJYTmxiQ0IyWlNCVVpXdHViMnh2YW1scklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHcKS3dZRFZRUUxFeVJMWVcxMUlGTmxjblJwWm1scllYTjViMjRnVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMApCZ05WQkFNVExWUlZRa2xVUVVzZ1MyRnRkU0JUVFNCVFUwd2dTMjlySUZObGNuUnBabWxyWVhOcElDMGdVM1Z5CmRXMGdNVEFlRncweE16RXhNalV3T0RJMU5UVmFGdzAwTXpFd01qVXdPREkxTlRWYU1JSFNNUXN3Q1FZRFZRUUcKRXdKVVVqRVlNQllHQTFVRUJ4TVBSMlZpZW1VZ0xTQkxiMk5oWld4cE1VSXdRQVlEVlFRS0V6bFVkWEpyYVhsbApJRUpwYkdsdGMyVnNJSFpsSUZSbGEyNXZiRzlxYVdzZ1FYSmhjM1JwY20xaElFdDFjblZ0ZFNBdElGUlZRa2xVClFVc3hMVEFyQmdOVkJBc1RKRXRoYlhVZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBJQzBnUzJGdGRTQlQKVFRFMk1EUUdBMVVFQXhNdFZGVkNTVlJCU3lCTFlXMTFJRk5OSUZOVFRDQkxiMnNnVTJWeWRHbG1hV3RoYzJrZwpMU0JUZFhKMWJTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXIzVXdNNnE3CmE5T1pMQkkzaE5tTmU1ZUEwMjduLzV0UWxUNlFsVlpDMXhsOEpvU05rdm9CSFRvUDRtUTR0NHk4NklqNWl5U3IKTHFQMU4rUkFqaGdsZVlOMUh6di9iS2pGeGxiNHRPMktSS09yYkV6OEhkRGM3Mmk5eitTcXp2QlY5NkkwMUlOcgpOM3djd3Y2MUEreFh6cnkwdGNYdEFBOVROeXBOOUU4TWcvdUd6OHYrakU2OWgvbW5peUZYbkhyZkEyZUpMSjJYCllhY1F1RldRZnc0dEp6aDAzK2Y5Mms0UzQwMFZJZ0xJNE9EOEQ2MksxOGxVVU13N0Q4b1dnSVRRVVZiRGpsWi8KaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOVdTTXM1dVdrOTlnTDdlcVFRRVNvbGJ1VDFkQ0FOTFpHZUE0ZgpBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVWlQvSGlvYkdQTjA4VkZ3MStEcnRVZ3hIClY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmCklQUDU0K002Mzh5Y2xOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTQKbHp3REdycER4cGE1UlhJNHM2ZWhsajJSZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3Ywo4akV5VnVwaytlcTFuUlptUW5MemY5T3hNVVA4cEk0WDhXMGpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmCmxvM1B0djBBblZvVW1yOENSUFhCd3A4aVhxSVBvZU09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBTdWJqZWN0OiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBMYWJlbDogIkdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QiCiMgU2VyaWFsOiA5MDA5ODk5NjUwNzQwMTIwMTg2CiMgTUQ1IEZpbmdlcnByaW50OiA2MzpjYzpkOTozZDozNDozNTo1Yzo2Zjo1MzphMzplMjowODo3MDo0ODoxZjpiNAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOjM2OjM4OjViOjgxOjFhOjI1OmMzOjliOjMxOjRlOjgzOmNhOmU5OjM0OjY2OjcwOmNjOjc0OmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpmZjo4ZjpkMDo0NDozMzo0ODo3ZDo2YTo4YTphNjowYzoxYToyOTo3Njo3YTo5ZjpjMjpiYjpiMDo1ZTo0MjowZjo3MTozYToxMzpiOTo5Mjo4OToxZDozODo5MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlEQ0NBM0NnQXdJQkFnSUlmUW1YL3ZCSDZub3dEUVlKS29aSWh2Y05BUUVMQlFBd1lqRUxNQWtHQTFVRQpCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUI0WERURTAKTVRFeU5qQTFNVE14TlZvWERUUXdNVEl6TVRFMU5UazFPVm93WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3QmdOVgpCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3CkhRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEyYU1XOE1oMGRIZWI3ek1OT3daK1ZmeTFZSTkyaGhKQ2ZWWm1Qb2lDN1hKagpEcDZMM1RRc0FsRlJ3eG45V1ZTRXlmRnJzMHl3NmVoR1hUakdvcWN1RVZlNmdoV2luSTl0c0psS0N2THJpWEJqClRubkV0MXU5b2wyeDhrRUNLNjJwT3FQc2VRcnNYenJqL2UrQVBLMDBteHFyaUNaN1ZxS0NoaC9yTlltRGYxK3UKS1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnJwZnRaVHFmcmxZd2lPWG5oTFFpUHpMeVJ1RUgzRk1FagpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSjlDeTVXbVlxc0JlYm5oNTJuVXBtCk1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FReFhBQlpHMTIKWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUAp6Z3NNUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drCkwzMFNnTGRUTUVaZVMxU1pEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUMKakdIZXVMelJMNXo3RDlBcjdSdDJ1ZVE1VmZqNG9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQQpIUUJVbHdiZ3NRZlp4dzljWlgwOGJWbFg1TzJsamVsQVU1OFZTNkJ4OWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDCkF3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZPTEpRSjlOenVpYW9YelBEajlseFNtSWFobFJNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURSU1ZmZwpwOHhvV0xvQkR5c1p6WTJ3WVVXc0VlMWpVR240SDMrK0ZvLzluZXNMcWpKSGR0Sm5KTzI5ZkRNeWx5ckhCWVptCkRSZDlGQlViMU92OUg1cjJYcGRwdHhvbHBBcXprVDlmTnF5TDdGZW9QdWVCaWhoWE9ZVjBHa0xINlZzVFg0LzUKQ09tU2RJMzFSOUtyTzliN2VHWk9ObjM1NlpMcEJONzlTV1A4YmZzVWNaTm5MMGRLdDduL0hpcHpjRVl3djFyeQpMM21sNFkwTTJmbXlZemVNTjJXRmNHcGNXd2x5dWExalBMSGQrUHd5dnplRzVMdU9tQ2QrdWg4VzRYQVI4Z1BmCkpXSXlKeVlZTW9TZi93QTZFN3FhVGZSUHVCUndJckhLSzVET0tjRnc5QytkZi9LUUh0WmEzN2RHL09hRytzdmcKSUhaNnVxYkw5WHplWXFXeGkrN2VnbWFLVGpvd0h6K0F5NjBudWd4ZTE5Q3hWc3AzY2JLMWRhRlFxVUJERjhJbwoyYzlTaTF2SVk5UkNQcUF6ZWtZdTl3b2dSbFIrYWs4eDhZRitRblE0WlhNbjdzWjh1STdYcFRyWG1LR2NqQkJWCjA5dEw3RUNROHMxdVY5SmlEbnhYazdHbmJjMmRnN3NxNStXMk8zRllyZjNSUmJ4YWtlNVRGVy9UUlFsMWJycVEKWFI0RXp6ZmZIcWhtc1l6bUlHcnYvRWhPZEpoQ3J5bHZMbXJIKzMzUlpqRWl6SVlBZm1hRERFTDB2VFNTd3hycQpUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VGFhQXBKVXFseXl2ZGltWUhGbmdWVjNFYjdQVkhoUE9lCk1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTEiCiMgU2VyaWFsOiAxNTc1MjQ0NDA5NTgxMTAwNjQ4OQojIE1ENSBGaW5nZXJwcmludDogNmU6ODU6ZjE6ZGM6MWE6MDA6ZDM6MjI6ZDU6YjI6YjI6YWM6NmI6Mzc6MDU6NDUKIyBTSEExIEZpbmdlcnByaW50OiBmZjpiZDpjZDplNzo4MjpjODo0Mzo1ZTozYzo2ZjoyNjo4Njo1YzpjYTphODozYTo0NTo1YjpjMzowYQojIFNIQTI1NiBGaW5nZXJwcmludDogZDQ6MGU6OWM6ODY6Y2Q6OGY6ZTQ6Njg6YzE6Nzc6Njk6NTk6ZjQ6OWU6YTc6NzQ6ZmE6NTQ6ODY6ODQ6YjY6YzQ6MDY6ZjM6OTA6OTI6NjE6ZjQ6ZGM6ZTI6NTc6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lKQU5xYjdISHpBN0FaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdrTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5ZFhOMFEyOXkKSUZKdmIzUkRaWEowSUVOQkxURXdIaGNOTVRZd01qQTBNVEl6TWpFMldoY05Namt4TWpNeE1UY3lNekUyV2pDQgpwREVMTUFrR0ExVUVCaE1DVUVFeER6QU5CZ05WQkFnTUJsQmhibUZ0WVRFVU1CSUdBMVVFQnd3TFVHRnVZVzFoCklFTnBkSGt4SkRBaUJnTlZCQW9NRzFSeWRYTjBRMjl5SUZONWMzUmxiWE1nVXk0Z1pHVWdVaTVNTGpFbk1DVUcKQTFVRUN3d2VWSEoxYzNSRGIzSWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVI4d0hRWURWUVFEREJaVQpjblZ6ZEVOdmNpQlNiMjkwUTJWeWRDQkRRUzB4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdjQ2M2xlTENKaEpyTXhuSFFGZ0txMW1xalFDai9JREhVSHVPMUNBbXVqSVMyQ05VU1NVUUlwaWQKUnRMQnlaNU9HeTRzRGpqekdpVm9IS1phQmVZZWkwaS9tSlowUG1uSzZiVjRwUWE4MVFCZUNRcnlKM3BTL0MzVgpzZXEwaVdFazh4b1QyNm5QVXUwTUpMcTVudXgrQUhUNms2MXNLWkt1VWJTNzAxZS9zL09valp6MEpFc3ExcG1lCjlKNyt3SDVDT3VjTGxWUGF0MmdPa0V6N2NEK1BTaXlVOHliZFkybXBsTmdRVHNWSENKQ1pHeGROdVd4dTcyQ1YKRVk0aGdMVzlvSFBZMExKM3hFWHFXaWI3Wm5aMitBWWZZVzBQVmNXRHR4QldjZ1lIcGZPeEdnTUZaQTZkV29yVwpobkFiSk43K0tJb3IwR3F3L0hxaTNMSjVEb3RsRHdJREFRQUJvMk13WVRBZEJnTlZIUTRFRmdRVTdtdEpQSG8vCkRlT3hDYmVLeUtzWm4zTXpVT2N3SHdZRFZSMGpCQmd3Rm9BVTdtdEpQSG8vRGVPeENiZUt5S3NabjNNelVPY3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUNVWTFKR1BFKzZQSGgwUlU5b3RSQ2tab0I1ck1aNU5EcDZ0UFZ4QmI1VXJKS0Y1bURvNE52dTdacDVJCi81Q1E3ejNVdUp1MGgzVS9JSnZPY3MraFZjRk5aS0laQnFFSE13d0xLZVh4NnF1ajdMVUtkSkRIZlhMeTExeWYKa2UrUmk3ZmM3V2FpejQ1bU83eWZPZ0xnSjkwV21NQ1YxQXFrNUlHYWRaUTFuSkJmaURjR3JWbVZDckRSWjlNWgp5b25uTWxvMkhENkNxRnFUdnNiUVpKRzJ6OW0yR00vYmZ0SmxvNmJFamhjeHdmdCtkdHZUaGVOWXNuZDZkanRzCkwxQWM1OXYyWjNrZjlZS1ZtZ2VuRksrUDNDZ2had25TMWsxYUhCa2NqbmRjdzVRa1BUSnJTMzdVZUpTRHZqZE4KemwvSEhrNDg0SWt6bFFzUHBUTFdQRnA1TEJrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiIKIyBTZXJpYWw6IDI3MTE2OTQ1MTAxOTkxMDE2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IGEyOmUxOmY4OjE4OjBiOmJhOjQ1OmQ1OmM3OjQxOjJhOmJiOjM3OjUyOjQ1OjY0CiMgU0hBMSBGaW5nZXJwcmludDogYjg6YmU6NmQ6Y2I6NTY6ZjE6NTU6Yjk6NjM6ZDQ6MTI6Y2E6NGU6MDY6MzQ6Yzc6OTQ6YjI6MWM6YzAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA3OjUzOmU5OjQwOjM3OjhjOjFiOmQ1OmUzOjgzOjZlOjM5OjVkOmFlOmE1OmNiOjgzOjllOjUwOjQ2OmYxOmJkOjBlOmFlOjE5OjUxOmNmOjEwOmZlOmM3OmM5OjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHTHpDQ0JCZWdBd0lCQWdJSUphSGZ5alBMV1FJd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2FReEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVmTUIwR0ExVUVBd3dXVkhKMWMzUkRiM0lnClVtOXZkRU5sY25RZ1EwRXRNakFlRncweE5qQXlNRFF4TWpNeU1qTmFGdzB6TkRFeU16RXhOekkyTXpsYU1JR2sKTVFzd0NRWURWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZwpRMmwwZVRFa01DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEClZRUUxEQjVVY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnkKZFhOMFEyOXlJRkp2YjNSRFpYSjBJRU5CTFRJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDbklHN0NLcUppSkpXUWRzZzRmb0RTcThHYlpRV1U5TUVLRU5VQ3JPMmZrOGVIeUxBbkswSU1QUW8rClFWcWVkZDJOeXVDYjdHZ3lwR21TYUl3TGdRNVdvRDRhM1N3bEZJSXZsOU5rUnZSVXFkdzZWQzB4SzVtQzh0a3EKMSs5eEFMZ3hwTDU2SkFmRFFpRHlpdFNTQkJ0bFZreHMxUHUyWVZwSEk3VFlhYlMzT3RCMFBBeDFvWXhPZHFIcAoyeXFsTy9yT3NQOSthaWo5Snh6SXNla3A4VmR1WkxUUXdSVnREcjR1RGtiSVh2UlIvdThPWXpvN2NiclBiMW5LCkRPT2JYVW00VE9KWHNaaUtRbGVjZHUvdnZkRm9xTkwwQ2J0M05iNGxnZ2pFRml4RUlGYXBSQkYzNzEyMEhhcGUKYXo2TE12WUhMMWNFa3NyMS9wM0M2ZWl6amt4TEFqSFo1RHhJZ2lmM0dJSjJTRHB4c1JPaE9kVXV4VFRDSFdLRgozd1ArVGZTdlBkOWNXNDM2Y09HbGZpZkhoaTVxanhMR2hGNURVVkNjR1p0NDV2ejI3VWQrZXoxbTd4TVRpRjg4Cm9XUDcrYXlITlovemdwNmtQd3FjTVdtTG1hU0lTbzV1WmszdkZzUVBlU2doWUEyRkZuM1hWRGp4a2xiOXRUTk0KZzl6WEVKOUwvY2I0UXIyNmZITUM0UDk5elZ2aDFLeGhlMWZWU250YjFJVllKMTIvK0N0Z3JLQW1yaFFoSjhaMwptak9BUEY1R1AvZkRzYU9HTThib1hnMjVOU3lxUnNHRkFuV0FvT3NrK3hXcTVHZC9ibmMvOUFTS0wzeDc0eGRoCjhOMEpxU0RJdmdtazBINUV3N0l3U2ppcXFld1ltZ2VDSzl1NG5CaXQydUJHRjZ6UFhRSURBUUFCbzJNd1lUQWQKQmdOVkhRNEVGZ1FVMmY0aFFHNlVucnliUFp4OW1DQVo1WXd3WXJJd0h3WURWUjBqQkJnd0ZvQVUyZjRoUUc2VQpucnliUFp4OW1DQVo1WXd3WXJJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFKNUZuZ3c3dHUvaE9zaDgwUUE5eitMcUJyV3lPcnNHUzJoNjBDT1gKZEtjczhBalllVnJYV29TSzJCS2FHOWw5WEUxd3hhWDVxK1dqaVluZEFmcnMzZm5wa3BmYnNFWkM4OU5pcXBYKwpNV2NVYVZpUUNxb0w3amNqeDFCUnRQVitudU43OStUTVFqSXRTUXpMLzBrTW14NDAvVzV1bG9wNUE3WnYyd25MCi9WOWxGRGZoT1BYellSWlk1TFZ0RFFzRUd6OVFMWCt6eDNvYUZvQmcrSW9mNlJzcXh2bTZBUnBwdjlKWXgxUlgKQ0kvaE9XQjNTNnhaaEJxSThkM0xUM2pYNStFekxmenVRZm9nc0w3TDl6aVV3T0hRaFErNzdTeHpxKzMra25ZYQpaSDliRFRNSkJ6TjdCajhScEZ4d1BJWEF6K09RcUlOMyt0dm14WXhvWnhCbnBWSXQ4TVNaajMrLzBXdml0VWZXCjJkQ0ZtVTJVbXc5TGplNEFXa2NkRVFPc1FSaXZoN2R2RERxUHlzL2NBOEdpQ2NqbC9ZQmV5R0JDQVJzYVUxcTcKTjZhM3ZMcUU2UjVzR3RSazJ0UkQvcE9MUy9Jc2VSWVExSk1MaUkraDJJWVVScEZIbXlnazcxZFNUbHhDbktyMwpTZXduNkVBZXM2YUpJbktjOVEwenRGaWpNRHZkMUdwVWs3NGFUZk9UbFBmOGhBcy9oQ0JjTkFORXhkcXR2QXJCCkFzOGU1WlRaODQ1YjJFenduZXhoRjdzVU1sUU1BaW1USHBLRzluL3Y1NUlGRGxuZG1RZ3VMdnFjQUZMVHhXWXAKNUtlWFJLUU9LSUVUTmNYMmIyVG1RY1RWTDh3MFJTWFBRUUNXUFVvdXdwYVlUMDVLbkplMzJ4K1NNc2ovRDFGdQoxdXdKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIEVDQS0xIgojIFNlcmlhbDogOTU0ODI0Mjk0Njk4ODYyNTk4NAojIE1ENSBGaW5nZXJwcmludDogMjc6OTI6MjM6MWQ6MGE6ZjU6NDA6N2M6ZTk6ZTY6NmI6OWQ6ZDg6ZjU6ZTc6NmMKIyBTSEExIEZpbmdlcnByaW50OiA1ODpkMTpkZjo5NTo5NTo2Nzo2Yjo2MzpjMDpmMDo1YjoxYzoxNzo0ZDo4Yjo4NDowYjpjODo3ODpiZAojIFNIQTI1NiBGaW5nZXJwcmludDogNWE6ODg6NWQ6YjE6OWM6MDE6ZDk6MTI6YzU6NzU6OTM6ODg6OTM6OGM6YWY6YmI6ZGY6MDM6MWE6YjI6ZDQ6OGU6OTE6ZWU6MTU6NTg6OWI6NDI6OTc6MWQ6MDM6OWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lKQUlTQ0xGOGNZdEJBTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdjTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hGekFWQmdOVkJBTU1EbFJ5ZFhOMFEyOXkKSUVWRFFTMHhNQjRYRFRFMk1ESXdOREV5TXpJek0xb1hEVEk1TVRJek1URTNNamd3TjFvd2dad3hDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFWE1CVUdBMVVFQXd3T1ZISjFjM1JEYjNJZwpSVU5CTFRFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURQaitBUnRaK29kbmJiCjN3OVU3M05qS1lLdFI4YWphKzMrWHpQNFExSHBHak9STVJlZ2RNVFVwd0htc3BJK2FwM3REdmwwbUVEVFB3T0EKQm9KQTZMSGlwMUduSFlNbWE2dmUraGVSSzlqR3JCNnhuaGtCMVplbTZnMjN4RlVmSjN6U0NOVjJIeWtWaDBBNQozVGhGRVhYUW1xYzA0TC9OeUZJZHVVZCtEYmk3eGd6MmMxY1dXbjVEa1I5Vk9zWnRSQVNxbkttY3AweUpGNE91Cm93UmVVb0NMSGhJbEVSblhESDE5TVVSQjZ0dXZzQnp2Z2RBc3hab2htejN0UWp0UUp2THN6bkZoQm1JaFZFNS8Kd1owK2Z5Q01nTXNxMkpkaXlJTXprWDJ3b2xvUFYrZzd6UElsc3RSOEwreE54cUU2RlhybnRsMDE5ZlpJU2paRgpadFM2bUZqQkFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFmCkJnTlZIU01FR0RBV2dCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQlQ0MVhCVndtOG5IYzJGdgpjaXZVd28veVExMEN6c1NVdVpRUmcyZGQ0bWRzZFhhL3V3eXFOc2F0UjVOajNCNSsxdDR1L3VrWk1qZ0RmeFQyCkFITXNXYkVoQnVIN3JCaVZES1AvbVpiM0t5ZWIxU1RNSGQzQk91Q1lSTERFNUQ1M3NYT3BaQ3oySEFGOFAxMUYKaGNDRjV5V1BsZHdYOHp5ZkdtNnd5dU1kS3VsTVkvb2tZV0xXMm42MkhHejFBaDNVS3QxVmtPc3FFVWM4TGw1MApzb0lpcFgxVEgwWHNKNUY5NXlJVzZNQm9OdGpHOFUrQVJETDU0ZEhSSGFyZXFLdWNCSyt0SUE1a21FMmxhOEJJCldKWnBUZHdIakZHVG90K2ZEejJMWUxTQ2phb0lUbUpGNFBrTDB1RGdQRnZlWEhFbkpjTG1BNEdMRUZQangxV2kKdEovWDVnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIgojIFNlcmlhbDogODg3NTY0MDI5NjU1ODMxMDA0MQojIE1ENSBGaW5nZXJwcmludDogODY6Njk6MTI6YzA6NzA6ZjE6ZWM6YWM6YWM6YzI6ZDU6YmM6YTU6NWI6YTE6MjkKIyBTSEExIEZpbmdlcnByaW50OiBiNzphYjozMzowODpkMTplYTo0NDo3NzpiYToxNDo4MDoxMjo1YTo2ZjpiZDphOTozNjo0OTowYzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogODU6NjY6NmE6NTY6MmU6ZTA6YmU6NWM6ZTk6MjU6YzE6ZDg6ODk6MGE6NmY6NzY6YTg6N2U6YzE6NmQ6NGQ6N2Q6NWY6Mjk6ZWE6NzQ6MTk6Y2Y6MjA6MTI6M2I6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzVENDQThXZ0F3SUJBZ0lJZXl5YjB4YUFNcGt3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrR0ExVUUKQmhNQ1ZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRSwpEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZd01qRXlNVGN6T1RNNVdoY05OREV3TWpFeU1UY3oKT1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52CmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUgp4RmRIYXhoM2EzYnkvWlBrUFEvQ0ZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYCnFodkl1RzVpWG1teFg5c3FBbjc4Yk1yelFkanQwT2o4UDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0MKQzUyR1ZXSDllamp0L3VJWkFMZHZvVkJpZFhROG9QcklKWkswYm5vaXgvZ2VvZU95M1pFeHF5c2RCUCtsU2dRMwo2WVdrTXl2OTR0WlZOSHdacEVwb3g3S28wN2ZLb1pPSTY4R1h2SXo1SGRraWhDUjB4d1E5YXFrcGs4enJ1RnZoCi9sOGxxalJZeU1FalZKMGJtQkhET0p4K1BZWnNwUTlBaG53QzlGd0NUeWpMcm5HZkR6cklNLzRSSlRYcS9MckYKWUQzWmZCalZzcW5UZFhnRGNpTEtPc01mN3l6bExxbjZuaXkyVVViOXJ3UFc2bUJvNm9VV05tdUY2UjdBczkzRQpKTnlBS29GQmJaUSt5T0RKZ1VFQW5sNi9mOFVJbUtJWUxFSkFzL2x2T0NkTFRvRDBQWUZINEloODZoek90WFZjClVTNGNLMzhhY2lqbkFMWFJkTWJYNUordEI1TzJVelUxL0Rma3cvWmRGcjRoYzk2U0N2aWdZMnE4bHBKcVB2aTgKWlZXYjN2VU5pU1lFL0NVYXBpVnB5OEp0eW56aVdWK1hyT3Z2THNpODF4dFpQQ3ZNOGhuSWsyc25ZeG5QL09rbQorTXB4bTMrVC9qUm5oRTZaNi95emVBa3pjTHBtcG5idEczUHJHcVVOeENJVElKUldDazRzYkU2eC9jK2NDYnFpCk0rMkhBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlRkQkFrSG92VjZmVkpURXBLVjdqaUFKUTJtV1RBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTjBFQ1FlaTlYcDlVbE1Ta3BYdU9JQWxEYVpaTUE0RwpBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUlCZ1JsQ243SnAwY0hoNXdZZkdWCmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcmRJV1FQWGhxOUxtTHBaYzd0UmlSdXg2bitVQmJrZmxWbWE4ZUVkQmMKSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmaWpoRFB3R0ZwVWVuUFVheXZPVWlhUGQ3bk5ncwpQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2x1MU9KRDdPQVVONUY3a1IvCnE1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcWVyUTAKY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcgphNngrM3V4ak14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJCkgzN2hWWmtMSWQ2VG5ncjc1cU5KdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1kKSzlmMUptekpCalNXRnVwd1dSb3llWGtMdG9oL0QxSklQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dQpuTHdzb0Z2VmFnQ3ZYemZoMWZvUUM1aWNodWNtajg3dzdHNktWd3VBNDA2eXdLQmpZWkM2VldnM2RHcTJrdHVmCm9ZWWl0bVVuRHV5Mm4wSmc1R2ZDdGRwQkM4VFRpMkVidlBvZmtTdlhSQWRldWltczJjWHA3MU5JV3V1QThTaFkKSWMyd0JsWDdKejlUa0hDcEJCNVhKN2s9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDg0OTU3MjM4MTMyOTcyMTY0MjQKIyBNRDUgRmluZ2VycHJpbnQ6IDJlOmRhOmU0OjM5OjdmOjljOjhmOjM3OmQxOjcwOjlmOjI2OjE3OjUxOjNhOjhlCiMgU0hBMSBGaW5nZXJwcmludDogYzM6MTk6N2M6Mzk6MjQ6ZTY6NTQ6YWY6MWI6YzQ6YWI6MjA6OTU6N2E6ZTI6YzM6MGU6MTM6MDI6NmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM0OjE3OmJiOjA2OmNjOjYwOjA3OmRhOjFiOjk2OjFjOjkyOjBiOjhhOmI0OmNlOjNmOmFkOjgyOjBlOjRhOmEzOjBiOjlhOmNiOmM0OmE3OjRlOmJkOmNlOmJjOjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMAphVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6CldqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodmRYTjAKYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52YlNCUwpiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCCkJBQWlBMklBQkVWdXFWREVwaU0ybmw4b2pSZkxsaUprUDl4NmpoM01DTE9pY1NTNmprbTVCQnRIbGxpckxaWEkKN1o0SU5jZ242NG1NVTFqcllvcis4RnNQYXpGU1kwRTdpYzNzN0xhTkdkTTBCOXk3eGdaL3drV1Y3TXQvcUNQZwpDZW1CK3ZOSDA2TmpNR0V3SFFZRFZSME9CQllFRklMUmhYTXc1elVFMDQ0Q2t2dmxwTkhFSWVqTk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVZ3RHRmN6RG5OUVRUamdLUysrV2swY1FoNk0wd0RnWUQKVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HL242MWtScEdEUFliQ1dlKzBGK1M4VAprZHp0NWZ4UWF4RkdSck1jSVFCaXU3N0Q1K2pOQjVuNURRdGRjajdFcWdJd0g3eTZDK0l3SlB0OGJZQlZDcGsrCmdBMHo1V2FqczZPN3BkV0xqd2tzcGwxKzR2QUhDR2h0MG54cGJsL2Y1V3BsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiIKIyBTZXJpYWw6IDYyNDgyMjc0OTQzNTI5NDMzNTAKIyBNRDUgRmluZ2VycHJpbnQ6IGUxOjFlOjMxOjU4OjFhOmFlOjU0OjUzOjAyOmY2OjE3OjZhOjExOjdiOjRkOjk1CiMgU0hBMSBGaW5nZXJwcmludDogNzQ6M2E6ZjA6NTI6OWI6ZDA6MzI6YTA6ZjQ6NGE6ODM6Y2Q6ZDQ6YmE6YTk6N2I6N2M6MmU6YzQ6OWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJlOjdiOmYxOjZjOmMyOjI0Ojg1OmE3OmJiOmUyOmFhOjg2Ojk2Ojc1OjA3OjYxOmIwOmFlOjM5OmJlOjNiOjJmOmU5OmQwOmNjOjZkOjRlOmY3OjM0OjkxOjQyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGNnpDQ0E5T2dBd0lCQWdJSVZyWXB6VFM4ZVBZd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lJeEN6QUpCZ05WCkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUUKQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXlNQjRYRFRFM01EVXpNVEU0TVRRek4xb1hEVFF5Ck1EVXpNREU0TVRRek4xb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEcKQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRApEQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBanpabFFPSFdUY0RYdE9sRzJtdnEKTTBmTlRQbDlmYjY5TFQzdzIzamhocVhadWdsWGFPMVhQcURRQ0VHRDV5aEJKQi9qY2hYUUFScjdYbkFqc3N1ZgpPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3d2NYSHN3eHpwWTZJWEZKM3ZHMmZUaFZVQ0F0Wkp5Y3hhCjRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPWncrb3oxMldHUXZFNDNMcnJkRjkKSFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdytCNktqQlNZUgphWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBCmI5WmhDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVEKR3A4aExIOTR0MlM0Mk9pbTlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVgpQV0tjaGpnR0FHWVM1RmwyV2xQQUFwaWlFQ3RvUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PCnBnV1ZTYm9vaTRpVHNqUWMyS1JWYnJjYzBONlpWVHNqOUNMZytTbG1KdXdnVUhmYlNndVB2dVVDWUhCQlh0U3UKVURraUZDYkxzanR6ZEZWSEIzbUJPYWd3RTBUbEJJcXVsaE1sUWcrNVU4U2IvTTNrSE40OCtxdldCa29mWjZhWQpNQnpkTE52Y0dKVlhac2IvWEl0VzlYY0NBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WCkhTTUVHREFXZ0JUNVlMdlU0OVUwOXJqMUJvQWxwM1BiUm1tb25qQWRCZ05WSFE0RUZnUVUrV0M3MU9QVk5QYTQKOVFhQUphZHoyMFpwcUo0d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCVwpzNDdMQ3AxSmpyK2t4Skc3WmhjRlVaaDErK1ZRTEhxZThSVDZxOU9LUHYrUktZOWppOWkwcVZRQkRiNlRoaS81ClNtM0hYdlZYK2NwVkhCSytSdzgyeGQ5cXQ5dDF3a2NsZjdueFkvaG9MVlVFMGZLTnNLVFB2RHhlSDNqbnBhQWcKY0xBRXhiZjNjcWZlSWcyOU15VkdqR1NTSnVNK0xtT1cycHVNUGZnWUNkY0R6SDJHZ3VES0JBZFJVTmYva3RVTQo3OXFHbjVuWDY3ZXZhT0k1SnBTNmFMZS9nOVBxZW1jOVltZXVKZVZ5Nk9MazdLNFM5a3NyUEovcHNFRHpPRlN6Ci9iZG95TnJHajFFOHN2dVIzQnpubTUzaHR3MXlqK0treEtsNCtlc1VyTVpEQmNKbE9TZ1lBc09Dc3AwRnZtWHQKbGw5bGREejdDVFV1ZTV3VC9Sc1BYY2R0Z1RwV0Q4dzc0YThDTHlLc1JzcEdQS0FjVE5aRXRGNHVYQlZtQ2VFbQpLZjdHVW1HNnNYUC93d3ljNVd4cWxEOFV5a0FXbFlUeldhbXNYMHhoazIzUk84eWlsUXdpcG1kblJDNjUyZEtLClFiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVScndVN1pjZWdiTEhOWWhMRGtCdmpKYzQwdkc5M2RyRVEKdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjFobE1ZZWdvdUNSdzJuNUg5Z29vaQpTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWDlod0oxQzA3Cm1LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDMxODIyNDY1MjY3NTQ1NTUyODUKIyBNRDUgRmluZ2VycHJpbnQ6IDU5OjUzOjIyOjY1OjgzOjQyOjAxOjU0OmMwOmNlOjQyOmI5OjVhOjdjOmYyOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNGM6ZGQ6NTE6YTM6ZDE6ZjU6MjA6MzI6MTQ6YjA6YzY6YzU6MzI6MjM6MDM6OTE6Yzc6NDY6NDI6NmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIyOmEyOmMxOmY3OmJkOmVkOjcwOjRjOmMxOmU3OjAxOmI1OmY0OjA4OmMzOjEwOjg4OjBmOmU5OjU2OmI1OmRlOjJhOjRhOjQ0OmY5OjljOjg3OjNhOjI1OmE3OmM4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDbERDQ0FocWdBd0lCQWdJSUxDbWNXeGJ0QlpVd0NnWUlLb1pJemowRUF3SXdmekVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5QmdOVkJBTU1LMU5UVEM1amIyMGdSVllnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5USXpXaGNOTkRFd01qRXlNVGd4Ck5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NTG1OdgpiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5CkFnRUdCU3VCQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUEKVkliYy9SL2ZBTGhCWWx6Y2NCWXkzaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdQpXbkJhQnUyKzhLR3d5dEFKS2FOak1HRXdIUVlEVlIwT0JCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXOHBlNWQ3U2dhck5xQzFrVWJiWmNwdVgKNWs4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTVFDSzVrQ0pOK3ZwMVJQWgp5dFJySlBPd1BZZEdXQnJzc2Q5disxYTZjR3ZIT016b3NZeFBEL2Z4WjNZT2c5QWVVWThDTUQzMkl5Z21UTVpnCmg1TW1tN0kxSHJyVzl6elJITTc2SlR5bUdvRVZXL01TRDJ6dVpZckpoNmo1QitCaW1veGNTZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KUEsDBBQAAAAAAAAAIQAJE0JHRAMAAEQDAAArAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvY29yZS5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCmNlcnRpZmkucHkKfn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcmV0dXJucyB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIG9mIGNhY2VydC5wZW0uCiIiIgppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCgoKY2xhc3MgRGVwcmVjYXRlZEJ1bmRsZVdhcm5pbmcoRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIgogICAgVGhlIHdlYWsgc2VjdXJpdHkgYnVuZGxlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSBib3RoZXIgeW91ciBzZXJ2aWNlCiAgICBwcm92aWRlciB0byBnZXQgdGhlbSB0byBzdG9wIHVzaW5nIGNyb3NzLXNpZ25lZCByb290cy4KICAgICIiIgoKCmRlZiB3aGVyZSgpOgogICAgZiA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKCiAgICByZXR1cm4gb3MucGF0aC5qb2luKGYsICdjYWNlcnQucGVtJykKCgpkZWYgb2xkX3doZXJlKCk6CiAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICJUaGUgd2VhayBzZWN1cml0eSBidW5kbGUgaGFzIGJlZW4gcmVtb3ZlZC4gY2VydGlmaS5vbGRfd2hlcmUoKSBpcyBub3cgYW4gYWxpYXMgIgogICAgICAgICJvZiBjZXJ0aWZpLndoZXJlKCkuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSBjZXJ0aWZpLndoZXJlKCkgaW5zdGVhZC4gIgogICAgICAgICJjZXJ0aWZpLm9sZF93aGVyZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiAyMDE4LiIsCiAgICAgICAgRGVwcmVjYXRlZEJ1bmRsZVdhcm5pbmcKICAgICkKICAgIHJldHVybiB3aGVyZSgpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcHJpbnQod2hlcmUoKSkKUEsDBBQAAAAAAAAAIQDwzw9TFwYAABcGAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvX19pbml0X18ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmcm9tIC5jb21wYXQgaW1wb3J0IFBZMiwgUFkzCmZyb20gLnVuaXZlcnNhbGRldGVjdG9yIGltcG9ydCBVbml2ZXJzYWxEZXRlY3Rvcgpmcm9tIC52ZXJzaW9uIGltcG9ydCBfX3ZlcnNpb25fXywgVkVSU0lPTgoKCmRlZiBkZXRlY3QoYnl0ZV9zdHIpOgogICAgIiIiCiAgICBEZXRlY3QgdGhlIGVuY29kaW5nIG9mIHRoZSBnaXZlbiBieXRlIHN0cmluZy4KCiAgICA6cGFyYW0gYnl0ZV9zdHI6ICAgICBUaGUgYnl0ZSBzZXF1ZW5jZSB0byBleGFtaW5lLgogICAgOnR5cGUgYnl0ZV9zdHI6ICAgICAgYGBieXRlc2BgIG9yIGBgYnl0ZWFycmF5YGAKICAgICIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVhcnJheSk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVzKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBieXRlcyBvciBieXRlYXJyYXksIGdvdDogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfScuZm9ybWF0KHR5cGUoYnl0ZV9zdHIpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBieXRlX3N0ciA9IGJ5dGVhcnJheShieXRlX3N0cikKICAgIGRldGVjdG9yID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgZGV0ZWN0b3IuZmVlZChieXRlX3N0cikKICAgIHJldHVybiBkZXRlY3Rvci5jbG9zZSgpClBLAwQUAAAAAAAAACEAOb+EEBZ6AAAWegAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEJpZzUgZnJlcXVlbmN5IHRhYmxlCiMgYnkgVGFpd2FuJ3MgTWFuZGFyaW4gUHJvbW90aW9uIENvdW5jaWwKIyA8aHR0cDovL3d3dy5lZHUudHc6ODEvbWFuZHIvPgojCiMgMTI4ICAtLT4gMC40MjI2MQojIDI1NiAgLS0+IDAuNTc4NTEKIyA1MTIgIC0tPiAwLjc0ODUxCiMgMTAyNCAtLT4gMC44OTM4NAojIDIwNDggLS0+IDAuOTc1ODMKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuNzQ4NTEvKDEtMC43NDg1MSkgPTIuOTgKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMi8oNTQwMS01MTIpPTAuMTA1CiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbyBhYm91dCAyNSUgb2YgSWRlYWwgb25lLCBzdGlsbCBtdWNoIGhpZ2hlciB0aGFuIFJEUgoKQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuNzUKCiNDaGFyIHRvIEZyZXFPcmRlciB0YWJsZQpCSUc1X1RBQkxFX1NJWkUgPSA1Mzc2CgpCSUc1X0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICAgMSwxODAxLDE1MDYsIDI1NSwxNDMxLCAxOTgsICAgOSwgIDgyLCAgIDYsNTAwOCwgMTc3LCAyMDIsMzY4MSwxMjU2LDI4MjEsIDExMCwgIyAgIDE2CjM4MTQsICAzMywzMjc0LCAyNjEsICA3NiwgIDQ0LDIxMTQsICAxNiwyOTQ2LDIxODcsMTE3NiwgNjU5LDM5NzEsICAyNiwzNDUxLDI2NTMsICMgICAzMgoxMTk4LDM5NzIsMzM1MCw0MjAyLCA0MTAsMjIxNSwgMzAyLCA1OTAsIDM2MSwxOTY0LCAgIDgsIDIwNCwgIDU4LDQ1MTAsNTAwOSwxOTMyLCAjICAgNDgKICA2Myw1MDEwLDUwMTEsIDMxNywxNjE0LCAgNzUsIDIyMiwgMTU5LDQyMDMsMjQxNywxNDgwLDUwMTIsMzU1NSwzMDkxLCAyMjQsMjgyMiwgIyAgIDY0CjM2ODIsICAgMywgIDEwLDM5NzMsMTQ3MSwgIDI5LDI3ODcsMTEzNSwyODY2LDE5NDAsIDg3MywgMTMwLDMyNzUsMTEyMywgMzEyLDUwMTMsICMgICA4MAo0NTExLDIwNTIsIDUwNywgMjUyLCA2ODIsNTAxNCwgMTQyLDE5MTUsIDEyNCwgMjA2LDI5NDcsICAzNCwzNTU2LDMyMDQsICA2NCwgNjA0LCAjICAgOTYKNTAxNSwyNTAxLDE5NzcsMTk3OCwgMTU1LDE5OTEsIDY0NSwgNjQxLDE2MDYsNTAxNiwzNDUyLCAzMzcsICA3MiwgNDA2LDUwMTcsICA4MCwgIyAgMTEyCiA2MzAsIDIzOCwzMjA1LDE1MDksIDI2MywgOTM5LDEwOTIsMjY1NCwgNzU2LDE0NDAsMTA5NCwzNDUzLCA0NDksICA2OSwyOTg3LCA1OTEsICMgIDEyOAogMTc5LDIwOTYsIDQ3MSwgMTE1LDIwMzUsMTg0NCwgIDYwLCAgNTAsMjk4OCwgMTM0LCA4MDYsMTg2OSwgNzM0LDIwMzYsMzQ1NCwgMTgwLCAjICAxNDQKIDk5NSwxNjA3LCAxNTYsIDUzNywyOTA3LCA2ODgsNTAxOCwgMzE5LDEzMDUsIDc3OSwyMTQ1LCA1MTQsMjM3OSwgMjk4LDQ1MTIsIDM1OSwgIyAgMTYwCjI1MDIsICA5MCwyNzE2LDEzMzgsIDY2MywgIDExLCA5MDYsMTA5OSwyNTUzLCAgMjAsMjQ0MSwgMTgyLCA1MzIsMTcxNiw1MDE5LCA3MzIsICMgIDE3NgoxMzc2LDQyMDQsMTMxMSwxNDIwLDMyMDYsICAyNSwyMzE3LDEwNTYsIDExMywgMzk5LCAzODIsMTk1MCwgMjQyLDM0NTUsMjQ3NCwgNTI5LCAjICAxOTIKMzI3NiwgNDc1LDE0NDcsMzY4Myw1MDIwLCAxMTcsICAyMSwgNjU2LCA4MTAsMTI5NywyMzAwLDIzMzQsMzU1Nyw1MDIxLCAxMjYsNDIwNSwgIyAgMjA4CiA3MDYsIDQ1NiwgMTUwLCA2MTMsNDUxMywgIDcxLDExMTgsMjAzNyw0MjA2LCAxNDUsMzA5MiwgIDg1LCA4MzUsIDQ4NiwyMTE1LDEyNDYsICMgIDIyNAoxNDI2LCA0MjgsIDcyNywxMjg1LDEwMTUsIDgwMCwgMTA2LCA2MjMsIDMwMywxMjgxLDUwMjIsMjEyOCwyMzU5LCAzNDcsMzgxNSwgMjIxLCAjICAyNDAKMzU1OCwzMTM1LDUwMjMsMTk1NiwxMTUzLDQyMDcsICA4MywgMjk2LDExOTksMzA5MywgMTkyLCA2MjQsICA5Myw1MDI0LCA4MjIsMTg5OCwgIyAgMjU2CjI4MjMsMzEzNiwgNzk1LDIwNjUsIDk5MSwxNTU0LDE1NDIsMTU5MiwgIDI3LCAgNDMsMjg2NywgODU5LCAxMzksMTQ1NiwgODYwLDQ1MTQsICMgIDI3MgogNDM3LCA3MTIsMzk3NCwgMTY0LDIzOTcsMzEzNywgNjk1LCAyMTEsMzAzNywyMDk3LCAxOTUsMzk3NSwxNjA4LDM1NTksMzU2MCwzNjg0LCAjICAyODgKMzk3NiwgMjM0LCA4MTEsMjk4OSwyMDk4LDM5NzcsMjIzMywxNDQxLDM1NjEsMTYxNSwyMzgwLCA2NjgsMjA3NywxNjM4LCAzMDUsIDIyOCwgIyAgMzA0CjE2NjQsNDUxNSwgNDY3LCA0MTUsNTAyNSwgMjYyLDIwOTksMTU5MywgMjM5LCAxMDgsIDMwMCwgMjAwLDEwMzMsIDUxMiwxMjQ3LDIwNzgsICMgIDMyMAo1MDI2LDUwMjcsMjE3NiwzMjA3LDM2ODUsMjY4MiwgNTkzLCA4NDUsMTA2MiwzMjc3LCAgODgsMTcyMywyMDM4LDM5NzgsMTk1MSwgMjEyLCAjICAzMzYKIDI2NiwgMTUyLCAxNDksIDQ2OCwxODk5LDQyMDgsNDUxNiwgIDc3LCAxODcsNTAyOCwzMDM4LCAgMzcsICAgNSwyOTkwLDUwMjksMzk3OSwgIyAgMzUyCjUwMzAsNTAzMSwgIDM5LDI1MjQsNDUxNywyOTA4LDMyMDgsMjA3OSwgIDU1LCAxNDgsICA3NCw0NTE4LCA1NDUsIDQ4MywxNDc0LDEwMjksICMgIDM2OAoxNjY1LCAyMTcsMTg3MCwxNTMxLDMxMzgsMTEwNCwyNjU1LDQyMDksICAyNCwgMTcyLDM1NjIsIDkwMCwzOTgwLDM1NjMsMzU2NCw0NTE5LCAjICAzODQKICAzMiwxNDA4LDI4MjQsMTMxMiwgMzI5LCA0ODcsMjM2MCwyMjUxLDI3MTcsIDc4NCwyNjgzLCAgIDQsMzAzOSwzMzUxLDE0MjcsMTc4OSwgIyAgNDAwCiAxODgsIDEwOSwgNDk5LDUwMzIsMzY4NiwxNzE3LDE3OTAsIDg4OCwxMjE3LDMwNDAsNDUyMCw1MDMzLDM1NjUsNTAzNCwzMzUyLDE1MjAsICMgIDQxNgozNjg3LDM5ODEsIDE5NiwxMDM0LCA3NzUsNTAzNSw1MDM2LCA5MjksMTgxNiwgMjQ5LCA0MzksICAzOCw1MDM3LDEwNjMsNTAzOCwgNzk0LCAjICA0MzIKMzk4MiwxNDM1LDIzMDEsICA0NiwgMTc4LDMyNzgsMjA2Niw1MDM5LDIzODEsNTA0MCwgMjE0LDE3MDksNDUyMSwgODA0LCAgMzUsIDcwNywgIyAgNDQ4CiAzMjQsMzY4OCwxNjAxLDI1NTQsIDE0MCwgNDU5LDQyMTAsNTA0MSw1MDQyLDEzNjUsIDgzOSwgMjcyLCA5NzgsMjI2MiwyNTgwLDM0NTYsICMgIDQ2NAoyMTI5LDEzNjMsMzY4OSwxNDIzLCA2OTcsIDEwMCwzMDk0LCAgNDgsICA3MCwxMjMxLCA0OTUsMzEzOSwyMTk2LDUwNDMsMTI5NCw1MDQ0LCAjICA0ODAKMjA4MCwgNDYyLCA1ODYsMTA0MiwzMjc5LCA4NTMsIDI1NiwgOTg4LCAxODUsMjM4MiwzNDU3LDE2OTgsIDQzNCwxMDg0LDUwNDUsMzQ1OCwgIyAgNDk2CiAzMTQsMjYyNSwyNzg4LDQ1MjIsMjMzNSwyMzM2LCA1NjksMjI4NSwgNjM3LDE4MTcsMjUyNSwgNzU3LDExNjIsMTg3OSwxNjE2LDM0NTksICMgIDUxMgogMjg3LDE1NzcsMjExNiwgNzY4LDQ1MjMsMTY3MSwyODY4LDM1NjYsMjUyNiwxMzIxLDM4MTYsIDkwOSwyNDE4LDUwNDYsNDIxMSwgOTMzLCAjICA1MjgKMzgxNyw0MjEyLDIwNTMsMjM2MSwxMjIyLDQ1MjQsIDc2NSwyNDE5LDEzMjIsIDc4Niw0NTI1LDUwNDcsMTkyMCwxNDYyLDE2NzcsMjkwOSwgIyAgNTQ0CjE2OTksNTA0OCw0NTI2LDE0MjQsMjQ0MiwzMTQwLDM2OTAsMjYwMCwzMzUzLDE3NzUsMTk0MSwzNDYwLDM5ODMsNDIxMywgMzA5LDEzNjksICMgIDU2MAoxMTMwLDI4MjUsIDM2NCwyMjM0LDE2NTMsMTI5OSwzOTg0LDM1NjcsMzk4NSwzOTg2LDI2NTYsIDUyNSwxMDg1LDMwNDEsIDkwMiwyMDAxLCAjICA1NzYKMTQ3NSwgOTY0LDQ1MjcsIDQyMSwxODQ1LDE0MTUsMTA1NywyMjg2LCA5NDAsMTM2NCwzMTQxLCAzNzYsNDUyOCw0NTI5LDEzODEsICAgNywgIyAgNTkyCjI1MjcsIDk4MywyMzgzLCAzMzYsMTcxMCwyNjg0LDE4NDYsIDMyMSwzNDYxLCA1NTksMTEzMSwzMDQyLDI3NTIsMTgwOSwxMTMyLDEzMTMsICMgIDYwOAogMjY1LDE0ODEsMTg1OCw1MDQ5LCAzNTIsMTIwMywyODI2LDMyODAsIDE2NywxMDg5LCA0MjAsMjgyNywgNzc2LCA3OTIsMTcyNCwzNTY4LCAjICA2MjQKNDIxNCwyNDQzLDMyODEsNTA1MCw0MjE1LDUwNTEsIDQ0NiwgMjI5LCAzMzMsMjc1MywgOTAxLDM4MTgsMTIwMCwxNTU3LDQ1MzAsMjY1NywgIyAgNjQwCjE5MjEsIDM5NSwyNzU0LDI2ODUsMzgxOSw0MjE2LDE4MzYsIDEyNSwgOTE2LDMyMDksMjYyNiw0NTMxLDUwNTIsNTA1MywzODIwLDUwNTQsICMgIDY1Ngo1MDU1LDUwNTYsNDUzMiwzMTQyLDM2OTEsMTEzMywyNTU1LDE3NTcsMzQ2MiwxNTEwLDIzMTgsMTQwOSwzNTY5LDUwNTcsMjE0NiwgNDM4LCAjICA2NzIKMjYwMSwyOTEwLDIzODQsMzM1NCwxMDY4LCA5NTgsMzA0MywgNDYxLCAzMTEsMjg2OSwyNjg2LDQyMTcsMTkxNiwzMjEwLDQyMTgsMTk3OSwgIyAgNjg4CiAzODMsIDc1MCwyNzU1LDI2MjcsNDIxOSwgMjc0LCA1MzksIDM4NSwxMjc4LDE0NDIsNTA1OCwxMTU0LDE5NjUsIDM4NCwgNTYxLCAyMTAsICMgIDcwNAogIDk4LDEyOTUsMjU1NiwzNTcwLDUwNTksMTcxMSwyNDIwLDE0ODIsMzQ2MywzOTg3LDI5MTEsMTI1NywgMTI5LDUwNjAsMzgyMSwgNjQyLCAjICA3MjAKIDUyMywyNzg5LDI3OTAsMjY1OCw1MDYxLCAxNDEsMjIzNSwxMzMzLCAgNjgsIDE3NiwgNDQxLCA4NzYsIDkwNyw0MjIwLCA2MDMsMjYwMiwgIyAgNzM2CiA3MTAsIDE3MSwzNDY0LCA0MDQsIDU0OSwgIDE4LDMxNDMsMjM5OCwxNDEwLDM2OTIsMTY2Niw1MDYyLDM1NzEsNDUzMywyOTEyLDQ1MzQsICMgIDc1Mgo1MDYzLDI5OTEsIDM2OCw1MDY0LCAxNDYsIDM2NiwgIDk5LCA4NzEsMzY5MywxNTQzLCA3NDgsIDgwNywxNTg2LDExODUsICAyMiwyMjYzLCAjICA3NjgKIDM3OSwzODIyLDMyMTEsNTA2NSwzMjEyLCA1MDUsMTk0MiwyNjI4LDE5OTIsMTM4MiwyMzE5LDUwNjYsIDM4MCwyMzYyLCAyMTgsIDcwMiwgIyAgNzg0CjE4MTgsMTI0OCwzNDY1LDMwNDQsMzU3MiwzMzU1LDMyODIsNTA2NywyOTkyLDM2OTQsIDkzMCwzMjgzLDM4MjMsNTA2OCwgIDU5LDUwNjksICMgIDgwMAogNTg1LCA2MDEsNDIyMSwgNDk3LDM0NjYsMTExMiwxMzE0LDQ1MzUsMTgwMiw1MDcwLDEyMjMsMTQ3MiwyMTc3LDUwNzEsIDc0OSwxODM3LCAjICA4MTYKIDY5MCwxOTAwLDM4MjQsMTc3MywzOTg4LDE0NzYsIDQyOSwxMDQzLDE3OTEsMjIzNiwyMTE3LCA5MTcsNDIyMiwgNDQ3LDEwODYsMTYyOSwgIyAgODMyCjUwNzIsIDU1Niw1MDczLDUwNzQsMjAyMSwxNjU0LCA4NDQsMTA5MCwgMTA1LCA1NTAsIDk2NiwxNzU4LDI4MjgsMTAwOCwxNzgzLCA2ODYsICMgIDg0OAoxMDk1LDUwNzUsMjI4NywgNzkzLDE2MDIsNTA3NiwzNTczLDI2MDMsNDUzNiw0MjIzLDI5NDgsMjMwMiw0NTM3LDM4MjUsIDk4MCwyNTAzLCAjICA4NjQKIDU0NCwgMzUzLCA1MjcsNDUzOCwgOTA4LDI2ODcsMjkxMyw1MDc3LCAzODEsMjYyOSwxOTQzLDEzNDgsNTA3OCwxMzQxLDEyNTIsIDU2MCwgIyAgODgwCjMwOTUsNTA3OSwzNDY3LDI4NzAsNTA4MCwyMDU0LCA5NzMsIDg4NiwyMDgxLCAxNDMsNDUzOSw1MDgxLDUwODIsIDE1NywzOTg5LCA0OTYsICMgIDg5Ngo0MjI0LCAgNTcsIDg0MCwgNTQwLDIwMzksNDU0MCw0NTQxLDM0NjgsMjExOCwxNDQ1LCA5NzAsMjI2NCwxNzQ4LDE5NjYsMjA4Miw0MjI1LCAjICA5MTIKMzE0NCwxMjM0LDE3NzYsMzI4NCwyODI5LDM2OTUsIDc3MywxMjA2LDIxMzAsMTA2NiwyMDQwLDEzMjYsMzk5MCwxNzM4LDE3MjUsNDIyNiwgIyAgOTI4CiAyNzksMzE0NSwgIDUxLDE1NDQsMjYwNCwgNDIzLDE1NzgsMjEzMSwyMDY3LCAxNzMsNDU0MiwxODgwLDUwODMsNTA4NCwxNTgzLCAyNjQsICMgIDk0NAogNjEwLDM2OTYsNDU0MywyNDQ0LCAyODAsIDE1NCw1MDg1LDUwODYsNTA4NywxNzM5LCAzMzgsMTI4MiwzMDk2LCA2OTMsMjg3MSwxNDExLCAjICA5NjAKMTA3NCwzODI2LDI0NDUsNTA4OCw0NTQ0LDUwODksNTA5MCwxMjQwLCA5NTIsMjM5OSw1MDkxLDI5MTQsMTUzOCwyNjg4LCA2ODUsMTQ4MywgIyAgOTc2CjQyMjcsMjQ3NSwxNDM2LCA5NTMsNDIyOCwyMDU1LDQ1NDUsIDY3MSwyNDAwLCAgNzksNDIyOSwyNDQ2LDMyODUsIDYwOCwgNTY3LDI2ODksICMgIDk5MgozNDY5LDQyMzAsNDIzMSwxNjkxLCAzOTMsMTI2MSwxNzkyLDI0MDEsNTA5Miw0NTQ2LDUwOTMsNTA5NCw1MDk1LDUwOTYsMTM4MywxNjcyLCAjIDEwMDgKMzgyNywzMjEzLDE0NjQsIDUyMiwxMTE5LCA2NjEsMTE1MCwgMjE2LCA2NzUsNDU0NywzOTkxLDE0MzIsMzU3NCwgNjA5LDQ1NDgsMjY5MCwgIyAxMDI0CjI0MDIsNTA5Nyw1MDk4LDUwOTksNDIzMiwzMDQ1LCAgIDAsNTEwMCwyNDc2LCAzMTUsIDIzMSwyNDQ3LCAzMDEsMzM1Niw0NTQ5LDIzODUsICMgMTA0MAo1MTAxLCAyMzMsNDIzMywzNjk3LDE4MTksNDU1MCw0NTUxLDUxMDIsICA5NiwxNzc3LDEzMTUsMjA4Myw1MTAzLCAyNTcsNTEwNCwxODEwLCAjIDEwNTYKMzY5OCwyNzE4LDExMzksMTgyMCw0MjM0LDIwMjIsMTEyNCwyMTY0LDI3OTEsMTc3OCwyNjU5LDUxMDUsMzA5NywgMzYzLDE2NTUsMzIxNCwgIyAxMDcyCjUxMDYsMjk5Myw1MTA3LDUxMDgsNTEwOSwzOTkyLDE1NjcsMzk5MywgNzE4LCAxMDMsMzIxNSwgODQ5LDE0NDMsIDM0MSwzMzU3LDI5NDksICMgMTA4OAoxNDg0LDUxMTAsMTcxMiwgMTI3LCAgNjcsIDMzOSw0MjM1LDI0MDMsIDY3OSwxNDEyLCA4MjEsNTExMSw1MTEyLCA4MzQsIDczOCwgMzUxLCAjIDExMDQKMjk5NCwyMTQ3LCA4NDYsIDIzNSwxNDk3LDE4ODEsIDQxOCwxOTkzLDM4MjgsMjcxOSwgMTg2LDExMDAsMjE0OCwyNzU2LDM1NzUsMTU0NSwgIyAxMTIwCjEzNTUsMjk1MCwyODcyLDEzNzcsIDU4MywzOTk0LDQyMzYsMjU4MSwyOTk1LDUxMTMsMTI5OCwzNjk5LDEwNzgsMjU1NywzNzAwLDIzNjMsICMgMTEzNgogIDc4LDM4MjksMzgzMCwgMjY3LDEyODksMjEwMCwyMDAyLDE1OTQsNDIzNywgMzQ4LCAzNjksMTI3NCwyMTk3LDIxNzgsMTgzOCw0NTUyLCAjIDExNTIKMTgyMSwyODMwLDM3MDEsMjc1NywyMjg4LDIwMDMsNDU1MywyOTUxLDI3NTgsIDE0NCwzMzU4LCA4ODIsNDU1NCwzOTk1LDI3NTksMzQ3MCwgIyAxMTY4CjQ1NTUsMjkxNSw1MTE0LDQyMzgsMTcyNiwgMzIwLDUxMTUsMzk5NiwzMDQ2LCA3ODgsMjk5Niw1MTE2LDI4MzEsMTc3NCwxMzI3LDI4NzMsICMgMTE4NAozOTk3LDI4MzIsNTExNywxMzA2LDQ1NTYsMjAwNCwxNzAwLDM4MzEsMzU3NiwyMzY0LDI2NjAsIDc4NywyMDIzLCA1MDYsIDgyNCwzNzAyLCAjIDEyMDAKIDUzNCwgMzIzLDQ1NTcsMTA0NCwzMzU5LDIwMjQsMTkwMSwgOTQ2LDM0NzEsNTExOCwxNzc5LDE1MDAsMTY3OCw1MTE5LDE4ODIsNDU1OCwgIyAxMjE2CiAxNjUsIDI0Myw0NTU5LDM3MDMsMjUyOCwgMTIzLCA2ODMsNDIzOSwgNzY0LDQ1NjAsICAzNiwzOTk4LDE3OTMsIDU4OSwyOTE2LCA4MTYsICMgMTIzMgogNjI2LDE2NjcsMzA0NywyMjM3LDE2MzksMTU1NSwxNjIyLDM4MzIsMzk5OSw1MTIwLDQwMDAsMjg3NCwxMzcwLDEyMjgsMTkzMywgODkxLCAjIDEyNDgKMjA4NCwyOTE3LCAzMDQsNDI0MCw1MTIxLCAyOTIsMjk5NywyNzIwLDM1NzcsIDY5MSwyMTAxLDQyNDEsMTExNSw0NTYxLCAxMTgsIDY2MiwgIyAxMjY0CjUxMjIsIDYxMSwxMTU2LCA4NTQsMjM4NiwxMzE2LDI4NzUsICAgMiwgMzg2LCA1MTUsMjkxOCw1MTIzLDUxMjQsMzI4NiwgODY4LDIyMzgsICMgMTI4MAoxNDg2LCA4NTUsMjY2MSwgNzg1LDIyMTYsMzA0OCw1MTI1LDEwNDAsMzIxNiwzNTc4LDUxMjYsMzE0NiwgNDQ4LDUxMjcsMTUyNSw1MTI4LCAjIDEyOTYKMjE2NSw0NTYyLDUxMjksMzgzMyw1MTMwLDQyNDIsMjgzMywzNTc5LDMxNDcsIDUwMywgODE4LDQwMDEsMzE0OCwxNTY4LCA4MTQsIDY3NiwgIyAxMzEyCjE0NDQsIDMwNiwxNzQ5LDUxMzEsMzgzNCwxNDE2LDEwMzAsIDE5NywxNDI4LCA4MDUsMjgzNCwxNTAxLDQ1NjMsNTEzMiw1MTMzLDUxMzQsICMgMTMyOAoxOTk0LDUxMzUsNDU2NCw1MTM2LDUxMzcsMjE5OCwgIDEzLDI3OTIsMzcwNCwyOTk4LDMxNDksMTIyOSwxOTE3LDUxMzgsMzgzNSwyMTMyLCAjIDEzNDQKNTEzOSw0MjQzLDQ1NjUsMjQwNCwzNTgwLDUxNDAsMjIxNywxNTExLDE3MjcsMTEyMCw1MTQxLDUxNDIsIDY0NiwzODM2LDI0NDgsIDMwNywgIyAxMzYwCjUxNDMsNTE0NCwxNTk1LDMyMTcsNTE0NSw1MTQ2LDUxNDcsMzcwNSwxMTEzLDEzNTYsNDAwMiwxNDY1LDI1MjksMjUzMCw1MTQ4LCA1MTksICMgMTM3Ngo1MTQ5LCAxMjgsMjEzMywgIDkyLDIyODksMTk4MCw1MTUwLDQwMDMsMTUxMiwgMzQyLDMxNTAsMjE5OSw1MTUxLDI3OTMsMjIxOCwxOTgxLCAjIDEzOTIKMzM2MCw0MjQ0LCAyOTAsMTY1NiwxMzE3LCA3ODksIDgyNywyMzY1LDUxNTIsMzgzNyw0NTY2LCA1NjIsIDU4MSw0MDA0LDUxNTMsIDQwMSwgIyAxNDA4CjQ1NjcsMjI1MiwgIDk0LDQ1NjgsNTE1NCwxMzk5LDI3OTQsNTE1NSwxNDYzLDIwMjUsNDU2OSwzMjE4LDE5NDQsNTE1NiwgODI4LDExMDUsICMgMTQyNAo0MjQ1LDEyNjIsMTM5NCw1MTU3LDQyNDYsIDYwNSw0NTcwLDUxNTgsMTc4NCwyODc2LDUxNTksMjgzNSwgODE5LDIxMDIsIDU3OCwyMjAwLCAjIDE0NDAKMjk1Miw1MTYwLDE1MDIsIDQzNiwzMjg3LDQyNDcsMzI4OCwyODM2LDQwMDUsMjkxOSwzNDcyLDM0NzMsNTE2MSwyNzIxLDIzMjAsNTE2MiwgIyAxNDU2CjUxNjMsMjMzNywyMDY4LCAgMjMsNDU3MSwgMTkzLCA4MjYsMzgzOCwyMTAzLCA2OTksMTYzMCw0MjQ4LDMwOTgsIDM5MCwxNzk0LDEwNjQsICMgMTQ3MgozNTgxLDUxNjQsMTU3OSwzMDk5LDMxMDAsMTQwMCw1MTY1LDQyNDksMTgzOSwxNjQwLDI4NzcsNTE2Niw0NTcyLDQ1NzMsIDEzNyw0MjUwLCAjIDE0ODgKIDU5OCwzMTAxLDE5NjcsIDc4MCwgMTA0LCA5NzQsMjk1Myw1MTY3LCAyNzgsIDg5OSwgMjUzLCA0MDIsIDU3MiwgNTA0LCA0OTMsMTMzOSwgIyAxNTA0CjUxNjgsNDAwNiwxMjc1LDQ1NzQsMjU4MiwyNTU4LDUxNjksMzcwNiwzMDQ5LDMxMDIsMjI1MywgNTY1LDEzMzQsMjcyMiwgODYzLCAgNDEsICMgMTUyMAo1MTcwLDUxNzEsNDU3NSw1MTcyLDE2NTcsMjMzOCwgIDE5LCA0NjMsMjc2MCw0MjUxLCA2MDYsNTE3MywyOTk5LDMyODksMTA4NywyMDg1LCAjIDE1MzYKMTMyMywyNjYyLDMwMDAsNTE3NCwxNjMxLDE2MjMsMTc1MCw0MjUyLDI2OTEsNTE3NSwyODc4LCA3OTEsMjcyMywyNjYzLDIzMzksIDIzMiwgIyAxNTUyCjI0MjEsNTE3NiwzMDAxLDE0OTgsNTE3NywyNjY0LDI2MzAsIDc1NSwxMzY2LDM3MDcsMzI5MCwzMTUxLDIwMjYsMTYwOSwgMTE5LDE5MTgsICMgMTU2OAozNDc0LCA4NjIsMTAyNiw0MjUzLDUxNzgsNDAwNywzODM5LDQ1NzYsNDAwOCw0NTc3LDIyNjUsMTk1MiwyNDc3LDUxNzksMTEyNSwgODE3LCAjIDE1ODQKNDI1NCw0MjU1LDQwMDksMTUxMywxNzY2LDIwNDEsMTQ4Nyw0MjU2LDMwNTAsMzI5MSwyODM3LDM4NDAsMzE1Miw1MTgwLDUxODEsMTUwNywgIyAxNjAwCjUxODIsMjY5MiwgNzMzLCAgNDAsMTYzMiwxMTA2LDI4NzksIDM0NSw0MjU3LCA4NDEsMjUzMSwgMjMwLDQ1NzgsMzAwMiwxODQ3LDMyOTIsICMgMTYxNgozNDc1LDUxODMsMTI2MywgOTg2LDM0NzYsNTE4NCwgNzM1LCA4NzksIDI1NCwxMTM3LCA4NTcsIDYyMiwxMzAwLDExODAsMTM4OCwxNTYyLCAjIDE2MzIKNDAxMCw0MDExLDI5NTQsIDk2NywyNzYxLDI2NjUsMTM0OSwgNTkyLDIxMzQsMTY5MiwzMzYxLDMwMDMsMTk5NSw0MjU4LDE2NzksNDAxMiwgIyAxNjQ4CjE5MDIsMjE4OCw1MTg1LCA3MzksMzcwOCwyNzI0LDEyOTYsMTI5MCw1MTg2LDQyNTksMjIwMSwyMjAyLDE5MjIsMTU2MywyNjA1LDI1NTksICMgMTY2NAoxODcxLDI3NjIsMzAwNCw1MTg3LCA0MzUsNTE4OCwgMzQzLDExMDgsIDU5NiwgIDE3LDE3NTEsNDU3OSwyMjM5LDM0NzcsMzcwOSw1MTg5LCAjIDE2ODAKNDU4MCwgMjk0LDM1ODIsMjk1NSwxNjkzLCA0NzcsIDk3OSwgMjgxLDIwNDIsMzU4MywgNjQzLDIwNDMsMzcxMCwyNjMxLDI3OTUsMjI2NiwgIyAxNjk2CjEwMzEsMjM0MCwyMTM1LDIzMDMsMzU4NCw0NTgxLCAzNjcsMTI0OSwyNTYwLDUxOTAsMzU4NSw1MTkxLDQ1ODIsMTI4MywzMzYyLDIwMDUsICMgMTcxMgogMjQwLDE3NjIsMzM2Myw0NTgzLDQ1ODQsIDgzNiwxMDY5LDMxNTMsIDQ3NCw1MTkyLDIxNDksMjUzMiwgMjY4LDM1ODYsNTE5MywzMjE5LCAjIDE3MjgKMTUyMSwxMjg0LDUxOTQsMTY1OCwxNTQ2LDQyNjAsNTE5NSwzNTg3LDM1ODgsNTE5Niw0MjYxLDMzNjQsMjY5MywxNjg1LDQyNjIsIDk2MSwgIyAxNzQ0CjE2NzMsMjYzMiwgMTkwLDIwMDYsMjIwMywzODQxLDQ1ODUsNDU4Niw1MTk3LCA1NzAsMjUwNCwzNzExLDE0OTAsNTE5OCw0NTg3LDI2MzMsICMgMTc2MAozMjkzLDE5NTcsNDU4OCwgNTg0LDE1MTQsIDM5NiwxMDQ1LDE5NDUsNTE5OSw0NTg5LDE5NjgsMjQ0OSw1MjAwLDUyMDEsNDU5MCw0MDEzLCAjIDE3NzYKIDYxOSw1MjAyLDMxNTQsMzI5NCwgMjE1LDIwMDcsMjc5NiwyNTYxLDMyMjAsNDU5MSwzMjIxLDQ1OTIsIDc2Myw0MjYzLDM4NDIsNDU5MywgIyAxNzkyCjUyMDMsNTIwNCwxOTU4LDE3NjcsMjk1NiwzMzY1LDM3MTIsMTE3NCwgNDUyLDE0NzcsNDU5NCwzMzY2LDMxNTUsNTIwNSwyODM4LDEyNTMsICMgMTgwOAoyMzg3LDIxODksMTA5MSwyMjkwLDQyNjQsIDQ5Miw1MjA2LCA2MzgsMTE2OSwxODI1LDIxMzYsMTc1Miw0MDE0LCA2NDgsIDkyNiwxMDIxLCAjIDE4MjQKMTMyNCw0NTk1LCA1MjAsNDU5NiwgOTk3LCA4NDcsMTAwNywgODkyLDQ1OTcsMzg0MywyMjY3LDE4NzIsMzcxMywyNDA1LDE3ODUsNDU5OCwgIyAxODQwCjE5NTMsMjk1NywzMTAzLDMyMjIsMTcyOCw0MjY1LDIwNDQsMzcxNCw0NTk5LDIwMDgsMTcwMSwzMTU2LDE1NTEsICAzMCwyMjY4LDQyNjYsICMgMTg1Ngo1MjA3LDIwMjcsNDYwMCwzNTg5LDUyMDgsIDUwMSw1MjA5LDQyNjcsIDU5NCwzNDc4LDIxNjYsMTgyMiwzNTkwLDM0NzksMzU5MSwzMjIzLCAjIDE4NzIKIDgyOSwyODM5LDQyNjgsNTIxMCwxNjgwLDMxNTcsMTIyNSw0MjY5LDUyMTEsMzI5NSw0NjAxLDQyNzAsMzE1OCwyMzQxLDUyMTIsNDYwMiwgIyAxODg4CjQyNzEsNTIxMyw0MDE1LDQwMTYsNTIxNCwxODQ4LDIzODgsMjYwNiwzMzY3LDUyMTUsNDYwMywgMzc0LDQwMTcsIDY1Miw0MjcyLDQyNzMsICMgMTkwNAogMzc1LDExNDAsIDc5OCw1MjE2LDUyMTcsNTIxOCwyMzY2LDQ2MDQsMjI2OSwgNTQ2LDE2NTksIDEzOCwzMDUxLDI0NTAsNDYwNSw1MjE5LCAjIDE5MjAKMjI1NCwgNjEyLDE4NDksIDkxMCwgNzk2LDM4NDQsMTc0MCwxMzcxLCA4MjUsMzg0NSwzODQ2LDUyMjAsMjkyMCwyNTYyLDUyMjEsIDY5MiwgIyAxOTM2CiA0NDQsMzA1MiwyNjM0LCA4MDEsNDYwNiw0Mjc0LDUyMjIsMTQ5MSwgMjQ0LDEwNTMsMzA1Myw0Mjc1LDQyNzYsIDM0MCw1MjIzLDQwMTgsICMgMTk1MgoxMDQxLDMwMDUsIDI5MywxMTY4LCAgODcsMTM1Nyw1MjI0LDE1MzksIDk1OSw1MjI1LDIyNDAsIDcyMSwgNjk0LDQyNzcsMzg0NywgMjE5LCAjIDE5NjgKMTQ3OCwgNjQ0LDE0MTcsMzM2OCwyNjY2LDE0MTMsMTQwMSwxMzM1LDEzODksNDAxOSw1MjI2LDUyMjcsMzAwNiwyMzY3LDMxNTksMTgyNiwgIyAxOTg0CiA3MzAsMTUxNSwgMTg0LDI4NDAsICA2Niw0NjA3LDUyMjgsMTY2MCwyOTU4LCAyNDYsMzM2OSwgMzc4LDE0NTcsIDIyNiwzNDgwLCA5NzUsICMgMjAwMAo0MDIwLDI5NTksMTI2NCwzNTkyLCA2NzQsIDY5Niw1MjI5LCAxNjMsNTIzMCwxMTQxLDI0MjIsMjE2NywgNzEzLDM1OTMsMzM3MCw0NjA4LCAjIDIwMTYKNDAyMSw1MjMxLDUyMzIsMTE4NiwgIDE1LDUyMzMsMTA3OSwxMDcwLDUyMzQsMTUyMiwzMjI0LDM1OTQsIDI3NiwxMDUwLDI3MjUsIDc1OCwgIyAyMDMyCjExMjYsIDY1MywyOTYwLDMyOTYsNTIzNSwyMzQyLCA4ODksMzU5NSw0MDIyLDMxMDQsMzAwNywgOTAzLDEyNTAsNDYwOSw0MDIzLDM0ODEsICMgMjA0OAozNTk2LDEzNDIsMTY4MSwxNzE4LCA3NjYsMzI5NywgMjg2LCAgODksMjk2MSwzNzE1LDUyMzYsMTcxMyw1MjM3LDI2MDcsMzM3MSwzMDA4LCAjIDIwNjQKNTIzOCwyOTYyLDIyMTksMzIyNSwyODgwLDUyMzksNDYxMCwyNTA1LDI1MzMsIDE4MSwgMzg3LDEwNzUsNDAyNCwgNzMxLDIxOTAsMzM3MiwgIyAyMDgwCjUyNDAsMzI5OCwgMzEwLCAzMTMsMzQ4MiwyMzA0LCA3NzAsNDI3OCwgIDU0LDMwNTQsIDE4OSw0NjExLDMxMDUsMzg0OCw0MDI1LDUyNDEsICMgMjA5NgoxMjMwLDE2MTcsMTg1MCwgMzU1LDM1OTcsNDI3OSw0NjEyLDMzNzMsIDExMSw0MjgwLDM3MTYsMTM1MCwzMTYwLDM0ODMsMzA1NSw0MjgxLCAjIDIxMTIKMjE1MCwzMjk5LDM1OTgsNTI0MiwyNzk3LDQwMjYsNDAyNywzMDA5LCA3MjIsMjAwOSw1MjQzLDEwNzEsIDI0NywxMjA3LDIzNDMsMjQ3OCwgIyAyMTI4CjEzNzgsNDYxMywyMDEwLCA4NjQsMTQzNywxMjE0LDQ2MTQsIDM3MywzODQ5LDExNDIsMjIyMCwgNjY3LDQ2MTUsIDQ0MiwyNzYzLDI1NjMsICMgMjE0NAozODUwLDQwMjgsMTk2OSw0MjgyLDMzMDAsMTg0MCwgODM3LCAxNzAsMTEwNywgOTM0LDEzMzYsMTg4Myw1MjQ0LDUyNDUsMjExOSw0MjgzLCAjIDIxNjAKMjg0MSwgNzQzLDE1NjksNTI0Niw0NjE2LDQyODQsIDU4MiwyMzg5LDE0MTgsMzQ4NCw1MjQ3LDE4MDMsNTI0OCwgMzU3LDEzOTUsMTcyOSwgIyAyMTc2CjM3MTcsMzMwMSwyNDIzLDE1NjQsMjI0MSw1MjQ5LDMxMDYsMzg1MSwxNjMzLDQ2MTcsMTExNCwyMDg2LDQyODUsMTUzMiw1MjUwLCA0ODIsICMgMjE5MgoyNDUxLDQ2MTgsNTI1MSw1MjUyLDE0OTIsIDgzMywxNDY2LDUyNTMsMjcyNiwzNTk5LDE2NDEsMjg0Miw1MjU0LDE1MjYsMTI3MiwzNzE4LCAjIDIyMDgKNDI4NiwxNjg2LDE3OTUsIDQxNiwyNTY0LDE5MDMsMTk1NCwxODA0LDUyNTUsMzg1MiwyNzk4LDM4NTMsMTE1OSwyMzIxLDUyNTYsMjg4MSwgIyAyMjI0CjQ2MTksMTYxMCwxNTg0LDMwNTYsMjQyNCwyNzY0LCA0NDMsMzMwMiwxMTYzLDMxNjEsNTI1Nyw1MjU4LDQwMjksNTI1OSw0Mjg3LDI1MDYsICMgMjI0MAozMDU3LDQ2MjAsNDAzMCwzMTYyLDIxMDQsMTY0NywzNjAwLDIwMTEsMTg3Myw0Mjg4LDUyNjAsNDI4OSwgNDMxLDM0ODUsNTI2MSwgMjUwLCAjIDIyNTYKICA5NywgIDgxLDQyOTAsNTI2MiwxNjQ4LDE4NTEsMTU1OCwgMTYwLCA4NDgsNTI2MywgODY2LCA3NDAsMTY5NCw1MjY0LDIyMDQsMjg0MywgIyAyMjcyCjMyMjYsNDI5MSw0NjIxLDM3MTksMTY4NywgOTUwLDI0NzksIDQyNiwgNDY5LDMyMjcsMzcyMCwzNzIxLDQwMzEsNTI2NSw1MjY2LDExODgsICMgMjI4OAogNDI0LDE5OTYsIDg2MSwzNjAxLDQyOTIsMzg1NCwyMjA1LDI2OTQsIDE2OCwxMjM1LDM2MDIsNDI5Myw1MjY3LDIwODcsMTY3NCw0NjIyLCAjIDIzMDQKMzM3NCwzMzAzLCAyMjAsMjU2NSwxMDA5LDUyNjgsMzg1NSwgNjcwLDMwMTAsIDMzMiwxMjA4LCA3MTcsNTI2OSw1MjcwLDM2MDMsMjQ1MiwgIyAyMzIwCjQwMzIsMzM3NSw1MjcxLCA1MTMsNTI3MiwxMjA5LDI4ODIsMzM3NiwzMTYzLDQ2MjMsMTA4MCw1MjczLDUyNzQsNTI3NSw1Mjc2LDI1MzQsICMgMjMzNgozNzIyLDM2MDQsIDgxNSwxNTg3LDQwMzMsNDAzNCw1Mjc3LDM2MDUsMzQ4NiwzODU2LDEyNTQsNDYyNCwxMzI4LDMwNTgsMTM5MCw0MDM1LCAjIDIzNTIKMTc0MSw0MDM2LDM4NTcsNDAzNyw1Mjc4LCAyMzYsMzg1OCwyNDUzLDMzMDQsNTI3OSw1MjgwLDM3MjMsMzg1OSwxMjczLDM4NjAsNDYyNSwgIyAyMzY4CjUyODEsIDMwOCw1MjgyLDQ2MjYsIDI0NSw0NjI3LDE4NTIsMjQ4MCwxMzA3LDI1ODMsIDQzMCwgNzE1LDIxMzcsMjQ1NCw1MjgzLCAyNzAsICMgMjM4NAogMTk5LDI4ODMsNDAzOCw1Mjg0LDM2MDYsMjcyNywxNzUzLCA3NjEsMTc1NCwgNzI1LDE2NjEsMTg0MSw0NjI4LDM0ODcsMzcyNCw1Mjg1LCAjIDI0MDAKNTI4NiwgNTg3LCAgMTQsMzMwNSwgMjI3LDI2MDgsIDMyNiwgNDgwLDIyNzAsIDk0MywyNzY1LDM2MDcsIDI5MSwgNjUwLDE4ODQsNTI4NywgIyAyNDE2CjE3MDIsMTIyNiwgMTAyLDE1NDcsICA2MiwzNDg4LCA5MDQsNDYyOSwzNDg5LDExNjQsNDI5NCw1Mjg4LDUyODksMTIyNCwxNTQ4LDI3NjYsICMgMjQzMgogMzkxLCA0OTgsMTQ5Myw1MjkwLDEzODYsMTQxOSw1MjkxLDIwNTYsMTE3Nyw0NjMwLCA4MTMsIDg4MCwxMDgxLDIzNjgsIDU2NiwxMTQ1LCAjIDI0NDgKNDYzMSwyMjkxLDEwMDEsMTAzNSwyNTY2LDI2MDksMjI0MiwgMzk0LDEyODYsNTI5Miw1MjkzLDIwNjksNTI5NCwgIDg2LDE0OTQsMTczMCwgIyAyNDY0CjQwMzksIDQ5MSwxNTg4LCA3NDUsIDg5NywyOTYzLCA4NDMsMzM3Nyw0MDQwLDI3NjcsMjg4NCwzMzA2LDE3NjgsIDk5OCwyMjIxLDIwNzAsICMgMjQ4MAogMzk3LDE4MjcsMTE5NSwxOTcwLDM3MjUsMzAxMSwzMzc4LCAyODQsNTI5NSwzODYxLDI1MDcsMjEzOCwyMTIwLDE5MDQsNTI5Niw0MDQxLCAjIDI0OTYKMjE1MSw0MDQyLDQyOTUsMTAzNiwzNDkwLDE5MDUsIDExNCwyNTY3LDQyOTYsIDIwOSwxNTI3LDUyOTcsNTI5OCwyOTY0LDI4NDQsMjYzNSwgIyAyNTEyCjIzOTAsMjcyOCwzMTY0LCA4MTIsMjU2OCw1Mjk5LDMzMDcsNTMwMCwxNTU5LCA3MzcsMTg4NSwzNzI2LDEyMTAsIDg4NSwgIDI4LDI2OTUsICMgMjUyOAozNjA4LDM4NjIsNTMwMSw0Mjk3LDEwMDQsMTc4MCw0NjMyLDUzMDIsIDM0NiwxOTgyLDIyMjIsMjY5Niw0NjMzLDM4NjMsMTc0MiwgNzk3LCAjIDI1NDQKMTY0Miw0MDQzLDE5MzQsMTA3MiwxMzg0LDIxNTIsIDg5Niw0MDQ0LDMzMDgsMzcyNywzMjI4LDI4ODUsMzYwOSw1MzAzLDI1NjksMTk1OSwgIyAyNTYwCjQ2MzQsMjQ1NSwxNzg2LDUzMDQsNTMwNSw1MzA2LDQwNDUsNDI5OCwxMDA1LDEzMDgsMzcyOCw0Mjk5LDI3MjksNDYzNSw0NjM2LDE1MjgsICMgMjU3NgoyNjEwLCAxNjEsMTE3OCw0MzAwLDE5ODMsIDk4Nyw0NjM3LDExMDEsNDMwMSwgNjMxLDQwNDYsMTE1NywzMjI5LDI0MjUsMTM0MywxMjQxLCAjIDI1OTIKMTAxNiwyMjQzLDI1NzAsIDM3MiwgODc3LDIzNDQsMjUwOCwxMTYwLCA1NTUsMTkzNSwgOTExLDQwNDcsNTMwNywgNDY2LDExNzAsIDE2OSwgIyAyNjA4CjEwNTEsMjkyMSwyNjk3LDM3MjksMjQ4MSwzMDEyLDExODIsMjAxMiwyNTcxLDEyNTEsMjYzNiw1MzA4LCA5OTIsMjM0NSwzNDkxLDE1NDAsICMgMjYyNAoyNzMwLDEyMDEsMjA3MSwyNDA2LDE5OTcsMjQ4Miw1MzA5LDQ2MzgsIDUyOCwxOTIzLDIxOTEsMTUwMywxODc0LDE1NzAsMjM2OSwzMzc5LCAjIDI2NDAKMzMwOSw1MzEwLCA1NTcsMTA3Myw1MzExLDE4MjgsMzQ5MiwyMDg4LDIyNzEsMzE2NSwzMDU5LDMxMDcsIDc2NywzMTA4LDI3OTksNDYzOSwgIyAyNjU2CjEwMDYsNDMwMiw0NjQwLDIzNDYsMTI2NywyMTc5LDM3MzAsMzIzMCwgNzc4LDQwNDgsMzIzMSwyNzMxLDE1OTcsMjY2Nyw1MzEyLDQ2NDEsICMgMjY3Mgo1MzEzLDM0OTMsNTMxNCw1MzE1LDUzMTYsMzMxMCwyNjk4LDE0MzMsMzMxMSwgMTMxLCAgOTUsMTUwNCw0MDQ5LCA3MjMsNDMwMywzMTY2LCAjIDI2ODgKMTg0MiwzNjEwLDI3NjgsMjE5Miw0MDUwLDIwMjgsMjEwNSwzNzMxLDUzMTcsMzAxMyw0MDUxLDEyMTgsNTMxOCwzMzgwLDMyMzIsNDA1MiwgIyAyNzA0CjQzMDQsMjU4NCwgMjQ4LDE2MzQsMzg2NCwgOTEyLDUzMTksMjg0NSwzNzMyLDMwNjAsMzg2NSwgNjU0LCAgNTMsNTMyMCwzMDE0LDUzMjEsICMgMjcyMAoxNjg4LDQ2NDIsIDc3NywzNDk0LDEwMzIsNDA1MywxNDI1LDUzMjIsIDE5MSwgODIwLDIxMjEsMjg0NiwgOTcxLDQ2NDMsIDkzMSwzMjMzLCAjIDI3MzYKIDEzNSwgNjY0LCA3ODMsMzg2NiwxOTk4LCA3NzIsMjkyMiwxOTM2LDQwNTQsMzg2Nyw0NjQ0LDI5MjMsMzIzNCwgMjgyLDI3MzIsIDY0MCwgIyAyNzUyCjEzNzIsMzQ5NSwxMTI3LCA5MjIsIDMyNSwzMzgxLDUzMjMsNTMyNCwgNzExLDIwNDUsNTMyNSw1MzI2LDQwNTUsMjIyMywyODAwLDE5MzcsICMgMjc2OAo0MDU2LDMzODIsMjIyNCwyMjU1LDM4NjgsMjMwNSw1MzI3LDQ2NDUsMzg2OSwxMjU4LDMzMTIsNDA1NywzMjM1LDIxMzksMjk2NSw0MDU4LCAjIDI3ODQKNDA1OSw1MzI4LDIyMjUsIDI1OCwzMjM2LDQ2NDYsIDEwMSwxMjI3LDUzMjksMzMxMywxNzU1LDUzMzAsMTM5MSwzMzE0LDUzMzEsMjkyNCwgIyAyODAwCjIwNTcsIDg5Myw1MzMyLDUzMzMsNTMzNCwxNDAyLDQzMDUsMjM0Nyw1MzM1LDUzMzYsMzIzNywzNjExLDUzMzcsNTMzOCwgODc4LDEzMjUsICMgMjgxNgoxNzgxLDI4MDEsNDY0NywgMjU5LDEzODUsMjU4NSwgNzQ0LDExODMsMjI3Miw0NjQ4LDUzMzksNDA2MCwyNTA5LDUzNDAsIDY4NCwxMDI0LCAjIDI4MzIKNDMwNiw1MzQxLCA0NzIsMzYxMiwzNDk2LDExNjUsMzMxNSw0MDYxLDQwNjIsIDMyMiwyMTUzLCA4ODEsIDQ1NSwxNjk1LDExNTIsMTM0MCwgIyAyODQ4CiA2NjAsIDU1NCwyMTU0LDQ2NDksMTA1OCw0NjUwLDQzMDcsIDgzMCwxMDY1LDMzODMsNDA2Myw0NjUxLDE5MjQsNTM0MiwxNzAzLDE5MTksICMgMjg2NAo1MzQzLCA5MzIsMjI3MywgMTIyLDUzNDQsNDY1MiwgOTQ3LCA2NzcsNTM0NSwzODcwLDI2MzcsIDI5NywxOTA2LDE5MjUsMjI3NCw0NjUzLCAjIDI4ODAKMjMyMiwzMzE2LDUzNDYsNTM0Nyw0MzA4LDUzNDgsNDMwOSwgIDg0LDQzMTAsIDExMiwgOTg5LDUzNDksIDU0NywxMDU5LDQwNjQsIDcwMSwgIyAyODk2CjM2MTMsMTAxOSw1MzUwLDQzMTEsNTM1MSwzNDk3LCA5NDIsIDYzOSwgNDU3LDIzMDYsMjQ1NiwgOTkzLDI5NjYsIDQwNywgODUxLCA0OTQsICMgMjkxMgo0NjU0LDMzODQsIDkyNyw1MzUyLDEyMzcsNTM1MywyNDI2LDMzODUsIDU3Myw0MzEyLCA2ODAsIDkyMSwyOTI1LDEyNzksMTg3NSwgMjg1LCAjIDI5MjgKIDc5MCwxNDQ4LDE5ODQsIDcxOSwyMTY4LDUzNTQsNTM1NSw0NjU1LDQwNjUsNDA2NiwxNjQ5LDUzNTYsMTU0MSwgNTYzLDUzNTcsMTA3NywgIyAyOTQ0CjUzNTgsMzM4NiwzMDYxLDM0OTgsIDUxMSwzMDE1LDQwNjcsNDA2OCwzNzMzLDQwNjksMTI2OCwyNTcyLDMzODcsMzIzOCw0NjU2LDQ2NTcsICMgMjk2MAo1MzU5LCA1MzUsMTA0OCwxMjc2LDExODksMjkyNiwyMDI5LDMxNjcsMTQzOCwxMzczLDI4NDcsMjk2NywxMTM0LDIwMTMsNTM2MCw0MzEzLCAjIDI5NzYKMTIzOCwyNTg2LDMxMDksMTI1OSw1MzYxLCA3MDAsNTM2MiwyOTY4LDMxNjgsMzczNCw0MzE0LDUzNjMsNDMxNSwxMTQ2LDE4NzYsMTkwNywgIyAyOTkyCjQ2NTgsMjYxMSw0MDcwLCA3ODEsMjQyNywgMTMyLDE1ODksIDIwMywgMTQ3LCAyNzMsMjgwMiwyNDA3LCA4OTgsMTc4NywyMTU1LDQwNzEsICMgMzAwOAo0MDcyLDUzNjQsMzg3MSwyODAzLDUzNjUsNTM2Niw0NjU5LDQ2NjAsNTM2NywzMjM5LDUzNjgsMTYzNSwzODcyLCA5NjUsNTM2OSwxODA1LCAjIDMwMjQKMjY5OSwxNTE2LDM2MTQsMTEyMSwxMDgyLDEzMjksMzMxNyw0MDczLDE0NDksMzg3MywgIDY1LDExMjgsMjg0OCwyOTI3LDI3NjksMTU5MCwgIyAzMDQwCjM4NzQsNTM3MCw1MzcxLCAgMTIsMjY2OCwgIDQ1LCA5NzYsMjU4NywzMTY5LDQ2NjEsIDUxNywyNTM1LDEwMTMsMTAzNywzMjQwLDUzNzIsICMgMzA1NgozODc1LDI4NDksNTM3MywzODc2LDUzNzQsMzQ5OSw1Mzc1LDI2MTIsIDYxNCwxOTk5LDIzMjMsMzg3NywzMTEwLDI3MzMsMjYzOCw1Mzc2LCAjIDMwNzIKMjU4OCw0MzE2LCA1OTksMTI2OSw1Mzc3LDE4MTEsMzczNSw1Mzc4LDI3MDAsMzExMSwgNzU5LDEwNjAsIDQ4OSwxODA2LDMzODgsMzMxOCwgIyAzMDg4CjEzNTgsNTM3OSw1MzgwLDIzOTEsMTM4NywxMjE1LDI2MzksMjI1NiwgNDkwLDUzODEsNTM4Miw0MzE3LDE3NTksMjM5MiwyMzQ4LDUzODMsICMgMzEwNAo0NjYyLDM4NzgsMTkwOCw0MDc0LDI2NDAsMTgwNywzMjQxLDQ2NjMsMzUwMCwzMzE5LDI3NzAsMjM0OSwgODc0LDUzODQsNTM4NSwzNTAxLCAjIDMxMjAKMzczNiwxODU5LCAgOTEsMjkyOCwzNzM3LDMwNjIsMzg3OSw0NjY0LDUzODYsMzE3MCw0MDc1LDI2NjksNTM4NywzNTAyLDEyMDIsMTQwMywgIyAzMTM2CjM4ODAsMjk2OSwyNTM2LDE1MTcsMjUxMCw0NjY1LDM1MDMsMjUxMSw1Mzg4LDQ2NjYsNTM4OSwyNzAxLDE4ODYsMTQ5NSwxNzMxLDQwNzYsICMgMzE1MgoyMzcwLDQ2NjcsNTM5MCwyMDMwLDUzOTEsNTM5Miw0MDc3LDI3MDIsMTIxNiwgMjM3LDI1ODksNDMxOCwyMzI0LDQwNzgsMzg4MSw0NjY4LCAjIDMxNjgKNDY2OSwyNzAzLDM2MTUsMzUwNCwgNDQ1LDQ2NzAsNTM5Myw1Mzk0LDUzOTUsNTM5NiwyNzcxLCAgNjEsNDA3OSwzNzM4LDE4MjMsNDA4MCwgIyAzMTg0CjUzOTcsIDY4NywyMDQ2LCA5MzUsIDkyNSwgNDA1LDI2NzAsIDcwMywxMDk2LDE4NjAsMjczNCw0NjcxLDQwODEsMTg3NywxMzY3LDI3MDQsICMgMzIwMAozMzg5LCA5MTgsMjEwNiwxNzgyLDI0ODMsIDMzNCwzMzIwLDE2MTEsMTA5Myw0NjcyLCA1NjQsMzE3MSwzNTA1LDM3MzksMzM5MCwgOTQ1LCAjIDMyMTYKMjY0MSwyMDU4LDQ2NzMsNTM5OCwxOTI2LCA4NzIsNDMxOSw1Mzk5LDM1MDYsMjcwNSwzMTEyLCAzNDksNDMyMCwzNzQwLDQwODIsNDY3NCwgIyAzMjMyCjM4ODIsNDMyMSwzNzQxLDIxNTYsNDA4Myw0Njc1LDQ2NzYsNDMyMiw0Njc3LDI0MDgsMjA0NywgNzgyLDQwODQsIDQwMCwgMjUxLDQzMjMsICMgMzI0OAoxNjI0LDU0MDAsNTQwMSwgMjc3LDM3NDIsIDI5OSwxMjY1LCA0NzYsMTE5MSwzODgzLDIxMjIsNDMyNCw0MzI1LDExMDksIDIwNSw1NDAyLCAjIDMyNjQKMjU5MCwxMDAwLDIxNTcsMzYxNiwxODYxLDU0MDMsNTQwNCw1NDA1LDQ2NzgsNTQwNiw0Njc5LDI1NzMsIDEwNywyNDg0LDIxNTgsNDA4NSwgIyAzMjgwCjM1MDcsMzE3Miw1NDA3LDE1MzMsIDU0MSwxMzAxLCAxNTgsIDc1Myw0MzI2LDI4ODYsMzYxNyw1NDA4LDE2OTYsIDM3MCwxMDg4LDQzMjcsICMgMzI5Ngo0NjgwLDM2MTgsIDU3OSwgMzI3LCA0NDAsIDE2MiwyMjQ0LCAyNjksMTkzOCwxMzc0LDM1MDgsIDk2OCwzMDYzLCAgNTYsMTM5NiwzMTEzLCAjIDMzMTIKMjEwNywzMzIxLDMzOTEsNTQwOSwxOTI3LDIxNTksNDY4MSwzMDE2LDU0MTAsMzYxOSw1NDExLDU0MTIsMzc0Myw0NjgyLDI0ODUsNTQxMywgIyAzMzI4CjI4MDQsNTQxNCwxNjUwLDQ2ODMsNTQxNSwyNjEzLDU0MTYsNTQxNyw0MDg2LDI2NzEsMzM5MiwxMTQ5LDMzOTMsNDA4NywzODg0LDQwODgsICMgMzM0NAo1NDE4LDEwNzYsICA0OSw1NDE5LCA5NTEsMzI0MiwzMzIyLDMzMjMsIDQ1MCwyODUwLCA5MjAsNTQyMCwxODEyLDI4MDUsMjM3MSw0MzI4LCAjIDMzNjAKMTkwOSwxMTM4LDIzNzIsMzg4NSwzNTA5LDU0MjEsMzI0Myw0Njg0LDE5MTAsMTE0NywxNTE4LDI0MjgsNDY4NSwzODg2LDU0MjIsNDY4NiwgIyAzMzc2CjIzOTMsMjYxNCwgMjYwLDE3OTYsMzI0NCw1NDIzLDU0MjQsMzg4NywzMzI0LCA3MDgsNTQyNSwzNjIwLDE3MDQsNTQyNiwzNjIxLDEzNTEsICMgMzM5MgoxNjE4LDMzOTQsMzAxNywxODg3LCA5NDQsNDMyOSwzMzk1LDQzMzAsMzA2NCwzMzk2LDQzMzEsNTQyNywzNzQ0LCA0MjIsIDQxMywxNzE0LCAjIDM0MDgKMzMyNSwgNTAwLDIwNTksMjM1MCw0MzMyLDI0ODYsNTQyOCwxMzQ0LDE5MTEsIDk1NCw1NDI5LDE2NjgsNTQzMCw1NDMxLDQwODksMjQwOSwgIyAzNDI0CjQzMzMsMzYyMiwzODg4LDQzMzQsNTQzMiwyMzA3LDEzMTgsMjUxMiwzMTE0LCAxMzMsMzExNSwyODg3LDQ2ODcsIDYyOSwgIDMxLDI4NTEsICMgMzQ0MAoyNzA2LDM4ODksNDY4OCwgODUwLCA5NDksNDY4OSw0MDkwLDI5NzAsMTczMiwyMDg5LDQzMzUsMTQ5NiwxODUzLDU0MzMsNDA5MSwgNjIwLCAjIDM0NTYKMzI0NSwgOTgxLDEyNDIsMzc0NSwzMzk3LDE2MTksMzc0NiwxNjQzLDMzMjYsMjE0MCwyNDU3LDE5NzEsMTcxOSwzNTEwLDIxNjksNTQzNCwgIyAzNDcyCjMyNDYsNTQzNSw1NDM2LDMzOTgsMTgyOSw1NDM3LDEyNzcsNDY5MCwxNTY1LDIwNDgsNTQzOCwxNjM2LDM2MjMsMzExNiw1NDM5LCA4NjksICMgMzQ4OAoyODUyLCA2NTUsMzg5MCwzODkxLDMxMTcsNDA5MiwzMDE4LDM4OTIsMTMxMCwzNjI0LDQ2OTEsNTQ0MCw1NDQxLDU0NDIsMTczMywgNTU4LCAjIDM1MDQKNDY5MiwzNzQ3LCAzMzUsMTU0OSwzMDY1LDE3NTYsNDMzNiwzNzQ4LDE5NDYsMzUxMSwxODMwLDEyOTEsMTE5MiwgNDcwLDI3MzUsMjEwOCwgIyAzNTIwCjI4MDYsIDkxMywxMDU0LDQwOTMsNTQ0MywxMDI3LDU0NDQsMzA2Niw0MDk0LDQ2OTMsIDk4MiwyNjcyLDMzOTksMzE3MywzNTEyLDMyNDcsICMgMzUzNgozMjQ4LDE5NDcsMjgwNyw1NDQ1LCA1NzEsNDY5NCw1NDQ2LDE4MzEsNTQ0NywzNjI1LDI1OTEsMTUyMywyNDI5LDU0NDgsMjA5MCwgOTg0LCAjIDM1NTIKNDY5NSwzNzQ5LDE5NjAsNTQ0OSwzNzUwLCA4NTIsIDkyMywyODA4LDM1MTMsMzc1MSwgOTY5LDE1MTksIDk5OSwyMDQ5LDIzMjUsMTcwNSwgIyAzNTY4CjU0NTAsMzExOCwgNjE1LDE2NjIsIDE1MSwgNTk3LDQwOTUsMjQxMCwyMzI2LDEwNDksIDI3NSw0Njk2LDM3NTIsNDMzNywgNTY4LDM3NTMsICMgMzU4NAozNjI2LDI0ODcsNDMzOCwzNzU0LDU0NTEsMjQzMCwyMjc1LCA0MDksMzI0OSw1NDUyLDE1NjYsMjg4OCwzNTE0LDEwMDIsIDc2OSwyODUzLCAjIDM2MDAKIDE5NCwyMDkxLDMxNzQsMzc1NSwyMjI2LDMzMjcsNDMzOSwgNjI4LDE1MDUsNTQ1Myw1NDU0LDE3NjMsMjE4MCwzMDE5LDQwOTYsIDUyMSwgIyAzNjE2CjExNjEsMjU5MiwxNzg4LDIyMDYsMjQxMSw0Njk3LDQwOTcsMTYyNSw0MzQwLDQzNDEsIDQxMiwgIDQyLDMxMTksIDQ2NCw1NDU1LDI2NDIsICMgMzYzMgo0Njk4LDM0MDAsMTc2MCwxNTcxLDI4ODksMzUxNSwyNTM3LDEyMTksMjIwNywzODkzLDI2NDMsMjE0MSwyMzczLDQ2OTksNDcwMCwzMzI4LCAjIDM2NDgKMTY1MSwzNDAxLDM2MjcsNTQ1Niw1NDU3LDM2MjgsMjQ4OCwzNTE2LDU0NTgsMzc1Niw1NDU5LDU0NjAsMjI3NiwyMDkyLCA0NjAsNTQ2MSwgIyAzNjY0CjQ3MDEsNTQ2MiwzMDIwLCA5NjIsIDU4OCwzNjI5LCAyODksMzI1MCwyNjQ0LDExMTYsICA1Miw1NDYzLDMwNjcsMTc5Nyw1NDY0LDU0NjUsICMgMzY4MAo1NDY2LDE0NjcsNTQ2NywxNTk4LDExNDMsMzc1Nyw0MzQyLDE5ODUsMTczNCwxMDY3LDQ3MDIsMTI4MCwzNDAyLCA0NjUsNDcwMywxNTcyLCAjIDM2OTYKIDUxMCw1NDY4LDE5MjgsMjI0NSwxODEzLDE2NDQsMzYzMCw1NDY5LDQ3MDQsMzc1OCw1NDcwLDU0NzEsMjY3MywxNTczLDE1MzQsNTQ3MiwgIyAzNzEyCjU0NzMsIDUzNiwxODA4LDE3NjEsMzUxNywzODk0LDMxNzUsMjY0NSw1NDc0LDU0NzUsNTQ3Niw0NzA1LDM1MTgsMjkyOSwxOTEyLDI4MDksICMgMzcyOAo1NDc3LDMzMjksMTEyMiwgMzc3LDMyNTEsNTQ3OCwgMzYwLDU0NzksNTQ4MCw0MzQzLDE1MjksIDU1MSw1NDgxLDIwNjAsMzc1OSwxNzY5LCAjIDM3NDQKMjQzMSw1NDgyLDI5MzAsNDM0NCwzMzMwLDMxMjAsMjMyNywyMTA5LDIwMzEsNDcwNiwxNDA0LCAxMzYsMTQ2OCwxNDc5LCA2NzIsMTE3MSwgIyAzNzYwCjMyNTIsMjMwOCwgMjcxLDMxNzYsNTQ4MywyNzcyLDU0ODQsMjA1MCwgNjc4LDI3MzYsIDg2NSwxOTQ4LDQ3MDcsNTQ4NSwyMDE0LDQwOTgsICMgMzc3NgoyOTcxLDU0ODYsMjczNywyMjI3LDEzOTcsMzA2OCwzNzYwLDQ3MDgsNDcwOSwxNzM1LDI5MzEsMzQwMywzNjMxLDU0ODcsMzg5NSwgNTA5LCAjIDM3OTIKMjg1NCwyNDU4LDI4OTAsMzg5Niw1NDg4LDU0ODksMzE3NywzMTc4LDQ3MTAsNDM0NSwyNTM4LDQ3MTEsMjMwOSwxMTY2LDEwMTAsIDU1MiwgIyAzODA4CiA2ODEsMTg4OCw1NDkwLDU0OTEsMjk3MiwyOTczLDQwOTksMTI4NywxNTk2LDE4NjIsMzE3OSwgMzU4LCA0NTMsIDczNiwgMTc1LCA0NzgsICMgMzgyNAoxMTE3LCA5MDUsMTE2NywxMDk3LDU0OTIsMTg1NCwxNTMwLDU0OTMsMTcwNiw1NDk0LDIxODEsMzUxOSwyMjkyLDM3NjEsMzUyMCwzNjMyLCAjIDM4NDAKNDM0NiwyMDkzLDQzNDcsNTQ5NSwzNDA0LDExOTMsMjQ4OSw0MzQ4LDE0NTgsMjE5MywyMjA4LDE4NjMsMTg4OSwxNDIxLDMzMzEsMjkzMiwgIyAzODU2CjMwNjksMjE4MiwzNTIxLCA1OTUsMjEyMyw1NDk2LDQxMDAsNTQ5Nyw1NDk4LDQzNDksMTcwNywyNjQ2LCAyMjMsMzc2MiwxMzU5LCA3NTEsICMgMzg3MgozMTIxLCAxODMsMzUyMiw1NDk5LDI4MTAsMzAyMSwgNDE5LDIzNzQsIDYzMywgNzA0LDM4OTcsMjM5NCwgMjQxLDU1MDAsNTUwMSw1NTAyLCAjIDM4ODgKIDgzOCwzMDIyLDM3NjMsMjI3NywyNzczLDI0NTksMzg5OCwxOTM5LDIwNTEsNDEwMSwxMzA5LDMxMjIsMjI0NiwxMTgxLDU1MDMsMTEzNiwgIyAzOTA0CjIyMDksMzg5OSwyMzc1LDE0NDYsNDM1MCwyMzEwLDQ3MTIsNTUwNCw1NTA1LDQzNTEsMTA1NSwyNjE1LCA0ODQsMzc2NCw1NTA2LDQxMDIsICMgMzkyMAogNjI1LDQzNTIsMjI3OCwzNDA1LDE0OTksNDM1Myw0MTAzLDU1MDcsNDEwNCw0MzU0LDMyNTMsMjI3OSwyMjgwLDM1MjMsNTUwOCw1NTA5LCAjIDM5MzYKMjc3NCwgODA4LDI2MTYsMzc2NSwzNDA2LDQxMDUsNDM1NSwzMTIzLDI1MzksIDUyNiwzNDA3LDM5MDAsNDM1NiwgOTU1LDU1MTAsMTYyMCwgIyAzOTUyCjQzNTcsMjY0NywyNDMyLDU1MTEsMTQyOSwzNzY2LDE2NjksMTgzMiwgOTk0LCA5MjgsNTUxMiwzNjMzLDEyNjAsNTUxMyw1NTE0LDU1MTUsICMgMzk2OAoxOTQ5LDIyOTMsIDc0MSwyOTMzLDE2MjYsNDM1OCwyNzM4LDI0NjAsIDg2NywxMTg0LCAzNjIsMzQwOCwxMzkyLDU1MTYsNTUxNyw0MTA2LCAjIDM5ODQKNDM1OSwxNzcwLDE3MzYsMzI1NCwyOTM0LDQ3MTMsNDcxNCwxOTI5LDI3MDcsMTQ1OSwxMTU4LDU1MTgsMzA3MCwzNDA5LDI4OTEsMTI5MiwgIyA0MDAwCjE5MzAsMjUxMywyODU1LDM3NjcsMTk4NiwxMTg3LDIwNzIsMjAxNSwyNjE3LDQzNjAsNTUxOSwyNTc0LDI1MTQsMjE3MCwzNzY4LDI0OTAsICMgNDAxNgozMzMyLDU1MjAsMzc2OSw0NzE1LDU1MjEsNTUyMiwgNjY2LDEwMDMsMzAyMywxMDIyLDM2MzQsNDM2MSw1NTIzLDQ3MTYsMTgxNCwyMjU3LCAjIDQwMzIKIDU3NCwzOTAxLDE2MDMsIDI5NSwxNTM1LCA3MDUsMzkwMiw0MzYyLCAyODMsIDg1OCwgNDE3LDU1MjQsNTUyNSwzMjU1LDQ3MTcsNDcxOCwgIyA0MDQ4CjMwNzEsMTIyMCwxODkwLDEwNDYsMjI4MSwyNDYxLDQxMDcsMTM5MywxNTk5LCA2ODksMjU3NSwgMzg4LDQzNjMsNTUyNiwyNDkxLCA4MDIsICMgNDA2NAo1NTI3LDI4MTEsMzkwMywyMDYxLDE0MDUsMjI1OCw1NTI4LDQ3MTksMzkwNCwyMTEwLDEwNTIsMTM0NSwzMjU2LDE1ODUsNTUyOSwgODA5LCAjIDQwODAKNTUzMCw1NTMxLDU1MzIsIDU3NSwyNzM5LDM1MjQsIDk1NiwxNTUyLDE0NjksMTE0NCwyMzI4LDU1MzMsMjMyOSwxNTYwLDI0NjIsMzYzNSwgIyA0MDk2CjMyNTcsNDEwOCwgNjE2LDIyMTAsNDM2NCwzMTgwLDIxODMsMjI5NCw1NTM0LDE4MzMsNTUzNSwzNTI1LDQ3MjAsNTUzNiwxMzE5LDM3NzAsICMgNDExMgozNzcxLDEyMTEsMzYzNiwxMDIzLDMyNTgsMTI5MywyODEyLDU1MzcsNTUzOCw1NTM5LDM5MDUsIDYwNywyMzExLDM5MDYsIDc2MiwyODkyLCAjIDQxMjgKMTQzOSw0MzY1LDEzNjAsNDcyMSwxNDg1LDMwNzIsNTU0MCw0NzIyLDEwMzgsNDM2NiwxNDUwLDIwNjIsMjY0OCw0MzY3LDEzNzksNDcyMywgIyA0MTQ0CjI1OTMsNTU0MSw1NTQyLDQzNjgsMTM1MiwxNDE0LDIzMzAsMjkzNSwxMTcyLDU1NDMsNTU0NCwzOTA3LDM5MDgsNDcyNCwxNzk4LDE0NTEsICMgNDE2MAo1NTQ1LDU1NDYsNTU0Nyw1NTQ4LDI5MzYsNDEwOSw0MTEwLDI0OTIsMjM1MSwgNDExLDQxMTEsNDExMiwzNjM3LDMzMzMsMzEyNCw0NzI1LCAjIDQxNzYKMTU2MSwyNjc0LDE0NTIsNDExMywxMzc1LDU1NDksNTU1MCwgIDQ3LDI5NzQsIDMxNiw1NTUxLDE0MDYsMTU5MSwyOTM3LDMxODEsNTU1MiwgIyA0MTkyCjEwMjUsMjE0MiwzMTI1LDMxODIsIDM1NCwyNzQwLCA4ODQsMjIyOCw0MzY5LDI0MTIsIDUwOCwzNzcyLCA3MjYsMzYzOCwgOTk2LDI0MzMsICMgNDIwOAozNjM5LCA3MjksNTU1MywgMzkyLDIxOTQsMTQ1Myw0MTE0LDQ3MjYsMzc3Myw1NTU0LDU1NTUsMjQ2MywzNjQwLDI2MTgsMTY3NSwyODEzLCAjIDQyMjQKIDkxOSwyMzUyLDI5NzUsMjM1MywxMjcwLDQ3MjcsNDExNSwgIDczLDU1NTYsNTU1NywgNjQ3LDU1NTgsMzI1OSwyODU2LDIyNTksMTU1MCwgIyA0MjQwCjEzNDYsMzAyNCw1NTU5LDEzMzIsIDg4MywzNTI2LDU1NjAsNTU2MSw1NTYyLDU1NjMsMzMzNCwyNzc1LDU1NjQsMTIxMiwgODMxLDEzNDcsICMgNDI1Ngo0MzcwLDQ3MjgsMjMzMSwzOTA5LDE4NjQsMzA3MywgNzIwLDM5MTAsNDcyOSw0NzMwLDM5MTEsNTU2NSw0MzcxLDU1NjYsNTU2Nyw0NzMxLCAjIDQyNzIKNTU2OCw1NTY5LDE3OTksNDczMiwzNzc0LDI2MTksNDczMywzNjQxLDE2NDUsMjM3Niw0NzM0LDU1NzAsMjkzOCwgNjY5LDIyMTEsMjY3NSwgIyA0Mjg4CjI0MzQsNTU3MSwyODkzLDU1NzIsNTU3MywxMDI4LDMyNjAsNTU3NCw0MzcyLDI0MTMsNTU3NSwyMjYwLDEzNTMsNTU3Niw1NTc3LDQ3MzUsICMgNDMwNAozMTgzLCA1MTgsNTU3OCw0MTE2LDU1NzksNDM3MywxOTYxLDU1ODAsMjE0Myw0Mzc0LDU1ODEsNTU4MiwzMDI1LDIzNTQsMjM1NSwzOTEyLCAjIDQzMjAKIDUxNiwxODM0LDE0NTQsNDExNywyNzA4LDQzNzUsNDczNiwyMjI5LDI2MjAsMTk3MiwxMTI5LDM2NDIsNTU4MywyNzc2LDU1ODQsMjk3NiwgIyA0MzM2CjE0MjIsIDU3NywxNDcwLDMwMjYsMTUyNCwzNDEwLDU1ODUsNTU4NiwgNDMyLDQzNzYsMzA3NCwzNTI3LDU1ODcsMjU5NCwxNDU1LDI1MTUsICMgNDM1MgoyMjMwLDE5NzMsMTE3NSw1NTg4LDEwMjAsMjc0MSw0MTE4LDM1MjgsNDczNyw1NTg5LDI3NDIsNTU5MCwxNzQzLDEzNjEsMzA3NSwzNTI5LCAjIDQzNjgKMjY0OSw0MTE5LDQzNzcsNDczOCwyMjk1LCA4OTUsIDkyNCw0Mzc4LDIxNzEsIDMzMSwyMjQ3LDMwNzYsIDE2NiwxNjI3LDMwNzcsMTA5OCwgIyA0Mzg0CjU1OTEsMTIzMiwyODk0LDIyMzEsMzQxMSw0NzM5LCA2NTcsIDQwMywxMTk2LDIzNzcsIDU0MiwzNzc1LDM0MTIsMTYwMCw0Mzc5LDM1MzAsICMgNDQwMAo1NTkyLDQ3NDAsMjc3NywzMjYxLCA1NzYsIDUzMCwxMzYyLDQ3NDEsNDc0MiwyNTQwLDI2NzYsMzc3Niw0MTIwLDU1OTMsIDg0MiwzOTEzLCAjIDQ0MTYKNTU5NCwyODE0LDIwMzIsMTAxNCw0MTIxLCAyMTMsMjcwOSwzNDEzLCA2NjUsIDYyMSw0MzgwLDU1OTUsMzc3NywyOTM5LDI0MzUsNTU5NiwgIyA0NDMyCjI0MzYsMzMzNSwzNjQzLDM0MTQsNDc0Myw0MzgxLDI1NDEsNDM4Miw0NzQ0LDM2NDQsMTY4Miw0MzgzLDM1MzEsMTM4MCw1NTk3LCA3MjQsICMgNDQ0OAoyMjgyLCA2MDAsMTY3MCw1NTk4LDEzMzcsMTIzMyw0NzQ1LDMxMjYsMjI0OCw1NTk5LDE2MjEsNDc0Niw1NjAwLCA2NTEsNDM4NCw1NjAxLCAjIDQ0NjQKMTYxMiw0Mzg1LDI2MjEsNTYwMiwyODU3LDU2MDMsMjc0MywyMzEyLDMwNzgsNTYwNCwgNzE2LDI0NjQsMzA3OSwgMTc0LDEyNTUsMjcxMCwgIyA0NDgwCjQxMjIsMzY0NSwgNTQ4LDEzMjAsMTM5OCwgNzI4LDQxMjMsMTU3NCw1NjA1LDE4OTEsMTE5NywzMDgwLDQxMjQsNTYwNiwzMDgxLDMwODIsICMgNDQ5NgozNzc4LDM2NDYsMzc3OSwgNzQ3LDU2MDcsIDYzNSw0Mzg2LDQ3NDcsNTYwOCw1NjA5LDU2MTAsNDM4Nyw1NjExLDU2MTIsNDc0OCw1NjEzLCAjIDQ1MTIKMzQxNSw0NzQ5LDI0MzcsIDQ1MSw1NjE0LDM3ODAsMjU0MiwyMDczLDQzODgsMjc0NCw0Mzg5LDQxMjUsNTYxNSwxNzY0LDQ3NTAsNTYxNiwgIyA0NTI4CjQzOTAsIDM1MCw0NzUxLDIyODMsMjM5NSwyNDkzLDU2MTcsNDM5MSw0MTI2LDIyNDksMTQzNCw0MTI3LCA0ODgsNDc1MiwgNDU4LDQzOTIsICMgNDU0NAo0MTI4LDM3ODEsIDc3MSwxMzMwLDIzOTYsMzkxNCwyNTc2LDMxODQsMjE2MCwyNDE0LDE1NTMsMjY3NywzMTg1LDQzOTMsNTYxOCwyNDk0LCAjIDQ1NjAKMjg5NSwyNjIyLDE3MjAsMjcxMSw0Mzk0LDM0MTYsNDc1Myw1NjE5LDI1NDMsNDM5NSw1NjIwLDMyNjIsNDM5NiwyNzc4LDU2MjEsMjAxNiwgIyA0NTc2CjI3NDUsNTYyMiwxMTU1LDEwMTcsMzc4MiwzOTE1LDU2MjMsMzMzNiwyMzEzLCAyMDEsMTg2NSw0Mzk3LDE0MzAsNTYyNCw0MTI5LDU2MjUsICMgNDU5Mgo1NjI2LDU2MjcsNTYyOCw1NjI5LDQzOTgsMTYwNCw1NjMwLCA0MTQsMTg2NiwgMzcxLDI1OTUsNDc1NCw0NzU1LDM1MzIsMjAxNywzMTI3LCAjIDQ2MDgKNDc1NiwxNzA4LCA5NjAsNDM5OSwgODg3LCAzODksMjE3MiwxNTM2LDE2NjMsMTcyMSw1NjMxLDIyMzIsNDEzMCwyMzU2LDI5NDAsMTU4MCwgIyA0NjI0CjU2MzIsNTYzMywxNzQ0LDQ3NTcsMjU0NCw0NzU4LDQ3NTksNTYzNCw0NzYwLDU2MzUsMjA3NCw1NjM2LDQ3NjEsMzY0NywzNDE3LDI4OTYsICMgNDY0MAo0NDAwLDU2MzcsNDQwMSwyNjUwLDM0MTgsMjgxNSwgNjczLDI3MTIsMjQ2NSwgNzA5LDM1MzMsNDEzMSwzNjQ4LDQ0MDIsNTYzOCwxMTQ4LCAjIDQ2NTYKIDUwMiwgNjM0LDU2MzksNTY0MCwxMjA0LDQ3NjIsMzY0OSwxNTc1LDQ3NjMsMjYyMywzNzgzLDU2NDEsMzc4NCwzMTI4LCA5NDgsMzI2MywgIyA0NjcyCiAxMjEsMTc0NSwzOTE2LDExMTAsNTY0Miw0NDAzLDMwODMsMjUxNiwzMDI3LDQxMzIsMzc4NSwxMTUxLDE3NzEsMzkxNywxNDg4LDQxMzMsICMgNDY4OAoxOTg3LDU2NDMsMjQzOCwzNTM0LDU2NDQsNTY0NSwyMDk0LDU2NDYsNDQwNCwzOTE4LDEyMTMsMTQwNywyODE2LCA1MzEsMjc0NiwyNTQ1LCAjIDQ3MDQKMzI2NCwxMDExLDE1MzcsNDc2NCwyNzc5LDQ0MDUsMzEyOSwxMDYxLDU2NDcsMzc4NiwzNzg3LDE4NjcsMjg5Nyw1NjQ4LDIwMTgsIDEyMCwgIyA0NzIwCjQ0MDYsNDQwNywyMDYzLDM2NTAsMzI2NSwyMzE0LDM5MTksMjY3OCwzNDE5LDE5NTUsNDc2NSw0MTM0LDU2NDksMzUzNSwxMDQ3LDI3MTMsICMgNDczNgoxMjY2LDU2NTAsMTM2OCw0NzY2LDI4NTgsIDY0OSwzNDIwLDM5MjAsMjU0NiwyNzQ3LDExMDIsMjg1OSwyNjc5LDU2NTEsNTY1MiwyMDAwLCAjIDQ3NTIKNTY1MywxMTExLDM2NTEsMjk3Nyw1NjU0LDI0OTUsMzkyMSwzNjUyLDI4MTcsMTg1NSwzNDIxLDM3ODgsNTY1NSw1NjU2LDM0MjIsMjQxNSwgIyA0NzY4CjI4OTgsMzMzNywzMjY2LDM2NTMsNTY1NywyNTc3LDU2NTgsMzY1NCwyODE4LDQxMzUsMTQ2MCwgODU2LDU2NTksMzY1NSw1NjYwLDI4OTksICMgNDc4NAoyOTc4LDU2NjEsMjkwMCwzOTIyLDU2NjIsNDQwOCwgNjMyLDI1MTcsIDg3NSwzOTIzLDE2OTcsMzkyNCwyMjk2LDU2NjMsNTY2NCw0NzY3LCAjIDQ4MDAKMzAyOCwxMjM5LCA1ODAsNDc2OCw0NDA5LDU2NjUsIDkxNCwgOTM2LDIwNzUsMTE5MCw0MTM2LDEwMzksMjEyNCw1NjY2LDU2NjcsNTY2OCwgIyA0ODE2CjU2NjksMzQyMywxNDczLDU2NzAsMTM1NCw0NDEwLDM5MjUsNDc2OSwyMTczLDMwODQsNDEzNywgOTE1LDMzMzgsNDQxMSw0NDEyLDMzMzksICMgNDgzMgoxNjA1LDE4MzUsNTY3MSwyNzQ4LCAzOTgsMzY1Niw0NDEzLDM5MjYsNDEzOCwgMzI4LDE5MTMsMjg2MCw0MTM5LDM5MjcsMTMzMSw0NDE0LCAjIDQ4NDgKMzAyOSwgOTM3LDQ0MTUsNTY3MiwzNjU3LDQxNDAsNDE0MSwzNDI0LDIxNjEsNDc3MCwzNDI1LCA1MjQsIDc0MiwgNTM4LDMwODUsMTAxMiwgIyA0ODY0CjU2NzMsNTY3NCwzOTI4LDI0NjYsNTY3NSwgNjU4LDExMDMsIDIyNSwzOTI5LDU2NzYsNTY3Nyw0NzcxLDU2NzgsNDc3Miw1Njc5LDMyNjcsICMgNDg4MAoxMjQzLDU2ODAsNDE0MiwgOTYzLDIyNTAsNDc3Myw1NjgxLDI3MTQsMzY1OCwzMTg2LDU2ODIsNTY4MywyNTk2LDIzMzIsNTY4NCw0Nzc0LCAjIDQ4OTYKNTY4NSw1Njg2LDU2ODcsMzUzNiwgOTU3LDM0MjYsMjU0NywyMDMzLDE5MzEsMjk0MSwyNDY3LCA4NzAsMjAxOSwzNjU5LDE3NDYsMjc4MCwgIyA0OTEyCjI3ODEsMjQzOSwyNDY4LDU2ODgsMzkzMCw1Njg5LDM3ODksMzEzMCwzNzkwLDM1MzcsMzQyNywzNzkxLDU2OTAsMTE3OSwzMDg2LDU2OTEsICMgNDkyOAozMTg3LDIzNzgsNDQxNiwzNzkyLDI1NDgsMzE4OCwzMTMxLDI3NDksNDE0Myw1NjkyLDM0MjgsMTU1NiwyNTQ5LDIyOTcsIDk3NywyOTAxLCAjIDQ5NDQKMjAzNCw0MTQ0LDEyMDUsMzQyOSw1NjkzLDE3NjUsMzQzMCwzMTg5LDIxMjUsMTI3MSwgNzE0LDE2ODksNDc3NSwzNTM4LDU2OTQsMjMzMywgIyA0OTYwCjM5MzEsIDUzMyw0NDE3LDM2NjAsMjE4NCwgNjE3LDU2OTUsMjQ2OSwzMzQwLDM1MzksMjMxNSw1Njk2LDU2OTcsMzE5MCw1Njk4LDU2OTksICMgNDk3NgozOTMyLDE5ODgsIDYxOCwgNDI3LDI2NTEsMzU0MCwzNDMxLDU3MDAsNTcwMSwxMjQ0LDE2OTAsNTcwMiwyODE5LDQ0MTgsNDc3Niw1NzAzLCAjIDQ5OTIKMzU0MSw0Nzc3LDU3MDQsMjI4NCwxNTc2LCA0NzMsMzY2MSw0NDE5LDM0MzIsIDk3Miw1NzA1LDM2NjIsNTcwNiwzMDg3LDU3MDcsNTcwOCwgIyA1MDA4CjQ3NzgsNDc3OSw1NzA5LDM3OTMsNDE0NSw0MTQ2LDU3MTAsIDE1Myw0NzgwLCAzNTYsNTcxMSwxODkyLDI5MDIsNDQyMCwyMTQ0LCA0MDgsICMgNTAyNAogODAzLDIzNTcsNTcxMiwzOTMzLDU3MTMsNDQyMSwxNjQ2LDI1NzgsMjUxOCw0NzgxLDQ3ODIsMzkzNCw1NzE0LDM5MzUsNDQyMiw1NzE1LCAjIDUwNDAKMjQxNiwzNDMzLCA3NTIsNTcxNiw1NzE3LDE5NjIsMzM0MSwyOTc5LDU3MTgsIDc0NiwzMDMwLDI0NzAsNDc4Myw0NDIzLDM3OTQsIDY5OCwgIyA1MDU2CjQ3ODQsMTg5Myw0NDI0LDM2NjMsMjU1MCw0Nzg1LDM2NjQsMzkzNiw1NzE5LDMxOTEsMzQzNCw1NzIwLDE4MjQsMTMwMiw0MTQ3LDI3MTUsICMgNTA3MgozOTM3LDE5NzQsNDQyNSw1NzIxLDQ0MjYsMzE5MiwgODIzLDEzMDMsMTI4OCwxMjM2LDI4NjEsMzU0Miw0MTQ4LDM0MzUsIDc3NCwzOTM4LCAjIDUwODgKNTcyMiwxNTgxLDQ3ODYsMTMwNCwyODYyLDM5MzksNDc4Nyw1NzIzLDI0NDAsMjE2MiwxMDgzLDMyNjgsNDQyNyw0MTQ5LDQ0MjgsIDM0NCwgIyA1MTA0CjExNzMsIDI4OCwyMzE2LCA0NTQsMTY4Myw1NzI0LDU3MjUsMTQ2MSw0Nzg4LDQxNTAsMjU5Nyw1NzI2LDU3MjcsNDc4OSwgOTg1LCA4OTQsICMgNTEyMAo1NzI4LDM0MzYsMzE5Myw1NzI5LDE5MTQsMjk0MiwzNzk1LDE5ODksNTczMCwyMTExLDE5NzUsNTczMSw0MTUxLDU3MzIsMjU3OSwxMTk0LCAjIDUxMzYKIDQyNSw1NzMzLDQ3OTAsMzE5NCwxMjQ1LDM3OTYsNDQyOSw1NzM0LDU3MzUsMjg2Myw1NzM2LCA2MzYsNDc5MSwxODU2LDM5NDAsIDc2MCwgIyA1MTUyCjE4MDAsNTczNyw0NDMwLDIyMTIsMTUwOCw0NzkyLDQxNTIsMTg5NCwxNjg0LDIyOTgsNTczOCw1NzM5LDQ3OTMsNDQzMSw0NDMyLDIyMTMsICMgNTE2OAogNDc5LDU3NDAsNTc0MSwgODMyLDU3NDIsNDE1MywyNDk2LDU3NDMsMjk4MCwyNDk3LDM3OTcsIDk5MCwzMTMyLCA2MjcsMTgxNSwyNjUyLCAjIDUxODQKNDQzMywxNTgyLDQ0MzQsMjEyNiwyMTEyLDM1NDMsNDc5NCw1NzQ0LCA3OTksNDQzNSwzMTk1LDU3NDUsNDc5NSwyMTEzLDE3MzcsMzAzMSwgIyA1MjAwCjEwMTgsIDU0MywgNzU0LDQ0MzYsMzM0MiwxNjc2LDQ3OTYsNDc5Nyw0MTU0LDQ3OTgsMTQ4OSw1NzQ2LDM1NDQsNTc0NywyNjI0LDI5MDMsICMgNTIxNgo0MTU1LDU3NDgsNTc0OSwyOTgxLDU3NTAsNTc1MSw1NzUyLDU3NTMsMzE5Niw0Nzk5LDQ4MDAsMjE4NSwxNzIyLDU3NTQsMzI2OSwzMjcwLCAjIDUyMzIKMTg0MywzNjY1LDE3MTUsIDQ4MSwgMzY1LDE5NzYsMTg1Nyw1NzU1LDU3NTYsMTk2MywyNDk4LDQ4MDEsNTc1NywyMTI3LDM2NjYsMzI3MSwgIyA1MjQ4CiA0MzMsMTg5NSwyMDY0LDIwNzYsNTc1OCwgNjAyLDI3NTAsNTc1OSw1NzYwLDU3NjEsNTc2Miw1NzYzLDMwMzIsMTYyOCwzNDM3LDU3NjQsICMgNTI2NAozMTk3LDQ4MDIsNDE1NiwyOTA0LDQ4MDMsMjUxOSw1NzY1LDI1NTEsMjc4Miw1NzY2LDU3NjcsNTc2OCwzMzQzLDQ4MDQsMjkwNSw1NzY5LCAjIDUyODAKNDgwNSw1NzcwLDI4NjQsNDgwNiw0ODA3LDEyMjEsMjk4Miw0MTU3LDI1MjAsNTc3MSw1NzcyLDU3NzMsMTg2OCwxOTkwLDU3NzQsNTc3NSwgIyA1Mjk2CjU3NzYsMTg5Niw1Nzc3LDU3NzgsNDgwOCwxODk3LDQxNTgsIDMxOCw1Nzc5LDIwOTUsNDE1OSw0NDM3LDU3ODAsNTc4MSwgNDg1LDU3ODIsICMgNTMxMgogOTM4LDM5NDEsIDU1MywyNjgwLCAxMTYsNTc4MywzOTQyLDM2NjcsNTc4NCwzNTQ1LDI2ODEsMjc4MywzNDM4LDMzNDQsMjgyMCw1Nzg1LCAjIDUzMjgKMzY2OCwyOTQzLDQxNjAsMTc0NywyOTQ0LDI5ODMsNTc4Niw1Nzg3LCAyMDcsNTc4OCw0ODA5LDU3ODksNDgxMCwyNTIxLDU3OTAsMzAzMywgIyA1MzQ0CiA4OTAsMzY2OSwzOTQzLDU3OTEsMTg3OCwzNzk4LDM0MzksNTc5MiwyMTg2LDIzNTgsMzQ0MCwxNjUyLDU3OTMsNTc5NCw1Nzk1LCA5NDEsICMgNTM2MAoyMjk5LCAyMDgsMzU0Niw0MTYxLDIwMjAsIDMzMCw0NDM4LDM5NDQsMjkwNiwyNDk5LDM3OTksNDQzOSw0ODExLDU3OTYsNTc5Nyw1Nzk4LCAjIDUzNzYKKQoKUEsDBBQAAAAAAAAAIQDL52dm3QYAAN0GAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNXByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEJpZzVEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEJJRzVfU01fTU9ERUwKCgpjbGFzcyBCaWc1UHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEJpZzVQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShCSUc1X1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gQmlnNURpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJCaWc1IgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiQ2hpbmVzZSIKUEsDBBQAAAAAAAAAIQDgWSg9wyQAAMMkAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZXVjdHdmcmVxIGltcG9ydCAoRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSLCBFVUNUV19UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICBFVUNUV19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuZXVja3JmcmVxIGltcG9ydCAoRVVDS1JfQ0hBUl9UT19GUkVRX09SREVSLCBFVUNLUl9UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICBFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuZ2IyMzEyZnJlcSBpbXBvcnQgKEdCMjMxMl9DSEFSX1RPX0ZSRVFfT1JERVIsIEdCMjMxMl9UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgR0IyMzEyX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5iaWc1ZnJlcSBpbXBvcnQgKEJJRzVfQ0hBUl9UT19GUkVRX09SREVSLCBCSUc1X1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuamlzZnJlcSBpbXBvcnQgKEpJU19DSEFSX1RPX0ZSRVFfT1JERVIsIEpJU19UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQoKCmNsYXNzIENoYXJEaXN0cmlidXRpb25BbmFseXNpcyhvYmplY3QpOgogICAgRU5PVUdIX0RBVEFfVEhSRVNIT0xEID0gMTAyNAogICAgU1VSRV9ZRVMgPSAwLjk5CiAgICBTVVJFX05PID0gMC4wMQogICAgTUlOSU1VTV9EQVRBX1RIUkVTSE9MRCA9IDMKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBNYXBwaW5nIHRhYmxlIHRvIGdldCBmcmVxdWVuY3kgb3JkZXIgZnJvbSBjaGFyIG9yZGVyIChnZXQgZnJvbQogICAgICAgICMgR2V0T3JkZXIoKSkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBOb25lCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IE5vbmUgICMgU2l6ZSBvZiBhYm92ZSB0YWJsZQogICAgICAgICMgVGhpcyBpcyBhIGNvbnN0YW50IHZhbHVlIHdoaWNoIHZhcmllcyBmcm9tIGxhbmd1YWdlIHRvIGxhbmd1YWdlLAogICAgICAgICMgdXNlZCBpbiBjYWxjdWxhdGluZyBjb25maWRlbmNlLiAgU2VlCiAgICAgICAgIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL2ludGwvVW5pdmVyc2FsQ2hhcnNldERldGVjdGlvbi5odG1sCiAgICAgICAgIyBmb3IgZnVydGhlciBkZXRhaWwuCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IE5vbmUKICAgICAgICBzZWxmLl9kb25lID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzID0gTm9uZQogICAgICAgIHNlbGYuX2ZyZXFfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICIiInJlc2V0IGFuYWx5c2VyLCBjbGVhciBhbnkgc3RhdGUiIiIKICAgICAgICAjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gVHJ1ZSwgZGV0ZWN0aW9uIGlzIGRvbmUgYW5kIGNvbmNsdXNpb24gaGFzCiAgICAgICAgIyBiZWVuIG1hZGUKICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKICAgICAgICBzZWxmLl90b3RhbF9jaGFycyA9IDAgICMgVG90YWwgY2hhcmFjdGVycyBlbmNvdW50ZXJlZAogICAgICAgICMgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdob3NlIGZyZXF1ZW5jeSBvcmRlciBpcyBsZXNzIHRoYW4gNTEyCiAgICAgICAgc2VsZi5fZnJlcV9jaGFycyA9IDAKCiAgICBkZWYgZmVlZChzZWxmLCBjaGFyLCBjaGFyX2xlbik6CiAgICAgICAgIiIiZmVlZCBhIGNoYXJhY3RlciB3aXRoIGtub3duIGxlbmd0aCIiIgogICAgICAgIGlmIGNoYXJfbGVuID09IDI6CiAgICAgICAgICAgICMgd2Ugb25seSBjYXJlIGFib3V0IDItYnl0ZXMgY2hhcmFjdGVyIGluIG91ciBkaXN0cmlidXRpb24gYW5hbHlzaXMKICAgICAgICAgICAgb3JkZXIgPSBzZWxmLmdldF9vcmRlcihjaGFyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9yZGVyID0gLTEKICAgICAgICBpZiBvcmRlciA+PSAwOgogICAgICAgICAgICBzZWxmLl90b3RhbF9jaGFycyArPSAxCiAgICAgICAgICAgICMgb3JkZXIgaXMgdmFsaWQKICAgICAgICAgICAgaWYgb3JkZXIgPCBzZWxmLl90YWJsZV9zaXplOgogICAgICAgICAgICAgICAgaWYgNTEyID4gc2VsZi5fY2hhcl90b19mcmVxX29yZGVyW29yZGVyXToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcmVxX2NoYXJzICs9IDEKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgIiIicmV0dXJuIGNvbmZpZGVuY2UgYmFzZWQgb24gZXhpc3RpbmcgZGF0YSIiIgogICAgICAgICMgaWYgd2UgZGlkbid0IHJlY2VpdmUgYW55IGNoYXJhY3RlciBpbiBvdXIgY29uc2lkZXJhdGlvbiByYW5nZSwKICAgICAgICAjIHJldHVybiBuZWdhdGl2ZSBhbnN3ZXIKICAgICAgICBpZiBzZWxmLl90b3RhbF9jaGFycyA8PSAwIG9yIHNlbGYuX2ZyZXFfY2hhcnMgPD0gc2VsZi5NSU5JTVVNX0RBVEFfVEhSRVNIT0xEOgogICAgICAgICAgICByZXR1cm4gc2VsZi5TVVJFX05PCgogICAgICAgIGlmIHNlbGYuX3RvdGFsX2NoYXJzICE9IHNlbGYuX2ZyZXFfY2hhcnM6CiAgICAgICAgICAgIHIgPSAoc2VsZi5fZnJlcV9jaGFycyAvICgoc2VsZi5fdG90YWxfY2hhcnMgLSBzZWxmLl9mcmVxX2NoYXJzKQogICAgICAgICAgICAgICAgICogc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbykpCiAgICAgICAgICAgIGlmIHIgPCBzZWxmLlNVUkVfWUVTOgogICAgICAgICAgICAgICAgcmV0dXJuIHIKCiAgICAgICAgIyBub3JtYWxpemUgY29uZmlkZW5jZSAod2UgZG9uJ3Qgd2FudCB0byBiZSAxMDAlIHN1cmUpCiAgICAgICAgcmV0dXJuIHNlbGYuU1VSRV9ZRVMKCiAgICBkZWYgZ290X2Vub3VnaF9kYXRhKHNlbGYpOgogICAgICAgICMgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byByZWNlaXZlIGFsbCBkYXRhIHRvIGRyYXcgY29uY2x1c2lvbi4KICAgICAgICAjIEZvciBjaGFyc2V0IGRldGVjdGlvbiwgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBpcyBlbm91Z2gKICAgICAgICByZXR1cm4gc2VsZi5fdG90YWxfY2hhcnMgPiBzZWxmLkVOT1VHSF9EQVRBX1RIUkVTSE9MRAoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgV2UgZG8gbm90IGhhbmRsZSBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBlbmNvZGluZyBzdHJpbmcsCiAgICAgICAgIyBidXQgY29udmVydCB0aGlzIGVuY29kaW5nIHN0cmluZyB0byBhIG51bWJlciwgaGVyZSBjYWxsZWQgb3JkZXIuCiAgICAgICAgIyBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbmNvZGluZ3Mgb2YgYSBsYW5ndWFnZSB0byBzaGFyZSBvbmUgZnJlcXVlbmN5CiAgICAgICAgIyB0YWJsZS4KICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEVVQ1RXX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBFVUNUV19UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgZXVjLVRXIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHhjNCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIGZpcnN0X2NoYXIgPj0gMHhDNDoKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGZpcnN0X2NoYXIgLSAweEM0KSArIGJ5dGVfc3RyWzFdIC0gMHhBMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gRVVDS1JfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEVVQ0tSX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gRVVDS1JfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtS1IgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGIwIC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgZmlyc3RfY2hhciA+PSAweEIwOgogICAgICAgICAgICByZXR1cm4gOTQgKiAoZmlyc3RfY2hhciAtIDB4QjApICsgYnl0ZV9zdHJbMV0gLSAweEExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEdCMjMxMl9DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gR0IyMzEyX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gR0IyMzEyX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgR0IyMzEyIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgIGZpcnN0ICBieXRlIHJhbmdlOiAweGIwIC0tIDB4ZmUKICAgICAgICAjICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIChmaXJzdF9jaGFyID49IDB4QjApIGFuZCAoc2Vjb25kX2NoYXIgPj0gMHhBMSk6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChmaXJzdF9jaGFyIC0gMHhCMCkgKyBzZWNvbmRfY2hhciAtIDB4QTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBCSUc1X0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBCSUc1X1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGJpZzUgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGE0IC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4NDAgLS0gMHg3ZSAsIDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciwgc2Vjb25kX2NoYXIgPSBieXRlX3N0clswXSwgYnl0ZV9zdHJbMV0KICAgICAgICBpZiBmaXJzdF9jaGFyID49IDB4QTQ6CiAgICAgICAgICAgIGlmIHNlY29uZF9jaGFyID49IDB4QTE6CiAgICAgICAgICAgICAgICByZXR1cm4gMTU3ICogKGZpcnN0X2NoYXIgLSAweEE0KSArIHNlY29uZF9jaGFyIC0gMHhBMSArIDYzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gMTU3ICogKGZpcnN0X2NoYXIgLSAweEE0KSArIHNlY29uZF9jaGFyIC0gMHg0MAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIFNKSVNEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEpJU19DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gSklTX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3Igc2ppcyBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4ODEgLS0gMHg5ZiAsIDB4ZTAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHg0MCAtLSAweDdlLCAgMHg4MSAtLSBveGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIChmaXJzdF9jaGFyID49IDB4ODEpIGFuZCAoZmlyc3RfY2hhciA8PSAweDlGKToKICAgICAgICAgICAgb3JkZXIgPSAxODggKiAoZmlyc3RfY2hhciAtIDB4ODEpCiAgICAgICAgZWxpZiAoZmlyc3RfY2hhciA+PSAweEUwKSBhbmQgKGZpcnN0X2NoYXIgPD0gMHhFRik6CiAgICAgICAgICAgIG9yZGVyID0gMTg4ICogKGZpcnN0X2NoYXIgLSAweEUwICsgMzEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgb3JkZXIgPSBvcmRlciArIHNlY29uZF9jaGFyIC0gMHg0MAogICAgICAgIGlmIHNlY29uZF9jaGFyID4gMHg3RjoKICAgICAgICAgICAgb3JkZXIgPSAtMQogICAgICAgIHJldHVybiBvcmRlcgoKCmNsYXNzIEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gSklTX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBKSVNfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtSlAgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGEwIC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgY2hhciA+PSAweEEwOgogICAgICAgICAgICByZXR1cm4gOTQgKiAoY2hhciAtIDB4QTEpICsgYnl0ZV9zdHJbMV0gLSAweGExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xClBLAwQUAAAAAAAAACEAiVkkiMsOAADLDgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCgoKY2xhc3MgQ2hhclNldEdyb3VwUHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKENoYXJTZXRHcm91cFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5fYWN0aXZlX251bSA9IDAKICAgICAgICBzZWxmLnByb2JlcnMgPSBbXQogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihDaGFyU2V0R3JvdXBQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLl9hY3RpdmVfbnVtID0gMAogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5wcm9iZXJzOgogICAgICAgICAgICBpZiBwcm9iZXI6CiAgICAgICAgICAgICAgICBwcm9iZXIucmVzZXQoKQogICAgICAgICAgICAgICAgcHJvYmVyLmFjdGl2ZSA9IFRydWUKICAgICAgICAgICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gKz0gMQogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLl9iZXN0X2d1ZXNzX3Byb2Jlci5jaGFyc2V0X25hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLl9iZXN0X2d1ZXNzX3Byb2Jlci5sYW5ndWFnZQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXIuYWN0aXZlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc3RhdGUgPSBwcm9iZXIuZmVlZChieXRlX3N0cikKICAgICAgICAgICAgaWYgbm90IHN0YXRlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBwcm9iZXIKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgICAgIGVsaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgICAgIHByb2Jlci5hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5fYWN0aXZlX251bSAtPSAxCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmVfbnVtIDw9IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGUKICAgICAgICBpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgIHJldHVybiAwLjk5CiAgICAgICAgZWxpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FOgogICAgICAgICAgICByZXR1cm4gMC4wMQogICAgICAgIGJlc3RfY29uZiA9IDAuMAogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5wcm9iZXJzOgogICAgICAgICAgICBpZiBub3QgcHJvYmVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IHByb2Jlci5hY3RpdmU6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgbm90IGFjdGl2ZScsIHByb2Jlci5jaGFyc2V0X25hbWUpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb25mID0gcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsIHByb2Jlci5jaGFyc2V0X25hbWUsIHByb2Jlci5sYW5ndWFnZSwgY29uZikKICAgICAgICAgICAgaWYgYmVzdF9jb25mIDwgY29uZjoKICAgICAgICAgICAgICAgIGJlc3RfY29uZiA9IGNvbmYKICAgICAgICAgICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgcmV0dXJuIGJlc3RfY29uZgpQSwMEFAAAAAAAAAAhAOCXYVr2EwAA9hMAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCgoKY2xhc3MgQ2hhclNldFByb2JlcihvYmplY3QpOgoKICAgIFNIT1JUQ1VUX1RIUkVTSE9MRCA9IDAuOTUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5fc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5sYW5nX2ZpbHRlciA9IGxhbmdfZmlsdGVyCiAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuREVURUNUSU5HCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGZlZWQoc2VsZiwgYnVmKToKICAgICAgICBwYXNzCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3RhdGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHJldHVybiAwLjAKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmlsdGVyX2hpZ2hfYnl0ZV9vbmx5KGJ1Zik6CiAgICAgICAgYnVmID0gcmUuc3ViKGInKFtceDAwLVx4N0ZdKSsnLCBiJyAnLCBidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBmaWx0ZXJfaW50ZXJuYXRpb25hbF93b3JkcyhidWYpOgogICAgICAgICIiIgogICAgICAgIFdlIGRlZmluZSB0aHJlZSB0eXBlcyBvZiBieXRlczoKICAgICAgICBhbHBoYWJldDogZW5nbGlzaCBhbHBoYWJldHMgW2EtekEtWl0KICAgICAgICBpbnRlcm5hdGlvbmFsOiBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMgW1x4ODAtXHhGRl0KICAgICAgICBtYXJrZXI6IGV2ZXJ5dGhpbmcgZWxzZSBbXmEtekEtWlx4ODAtXHhGRl0KCiAgICAgICAgVGhlIGlucHV0IGJ1ZmZlciBjYW4gYmUgdGhvdWdodCB0byBjb250YWluIGEgc2VyaWVzIG9mIHdvcmRzIGRlbGltaXRlZAogICAgICAgIGJ5IG1hcmtlcnMuIFRoaXMgZnVuY3Rpb24gd29ya3MgdG8gZmlsdGVyIGFsbCB3b3JkcyB0aGF0IGNvbnRhaW4gYXQKICAgICAgICBsZWFzdCBvbmUgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIuIEFsbCBjb250aWd1b3VzIHNlcXVlbmNlcyBvZiBtYXJrZXJzCiAgICAgICAgYXJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGFzY2lpIGNoYXJhY3Rlci4KCiAgICAgICAgVGhpcyBmaWx0ZXIgYXBwbGllcyB0byBhbGwgc2NyaXB0cyB3aGljaCBkbyBub3QgdXNlIEVuZ2xpc2ggY2hhcmFjdGVycy4KICAgICAgICAiIiIKICAgICAgICBmaWx0ZXJlZCA9IGJ5dGVhcnJheSgpCgogICAgICAgICMgVGhpcyByZWdleCBleHByZXNzaW9uIGZpbHRlcnMgb3V0IG9ubHkgd29yZHMgdGhhdCBoYXZlIGF0LWxlYXN0IG9uZQogICAgICAgICMgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIuIFRoZSB3b3JkIG1heSBpbmNsdWRlIG9uZSBtYXJrZXIgY2hhcmFjdGVyIGF0CiAgICAgICAgIyB0aGUgZW5kLgogICAgICAgIHdvcmRzID0gcmUuZmluZGFsbChiJ1thLXpBLVpdKltceDgwLVx4RkZdK1thLXpBLVpdKlteYS16QS1aXHg4MC1ceEZGXT8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWYpCgogICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgogICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQod29yZFs6LTFdKQoKICAgICAgICAgICAgIyBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHdvcmQgaXMgYSBtYXJrZXIsIHJlcGxhY2UgaXQgd2l0aCBhCiAgICAgICAgICAgICMgc3BhY2UgYXMgbWFya2VycyBzaG91bGRuJ3QgYWZmZWN0IG91ciBhbmFseXNpcyAodGhleSBhcmUgdXNlZAogICAgICAgICAgICAjIHNpbWlsYXJseSBhY3Jvc3MgYWxsIGxhbmd1YWdlcyBhbmQgbWF5IHRodXMgaGF2ZSBzaW1pbGFyCiAgICAgICAgICAgICMgZnJlcXVlbmNpZXMpLgogICAgICAgICAgICBsYXN0X2NoYXIgPSB3b3JkWy0xOl0KICAgICAgICAgICAgaWYgbm90IGxhc3RfY2hhci5pc2FscGhhKCkgYW5kIGxhc3RfY2hhciA8IGInXHg4MCc6CiAgICAgICAgICAgICAgICBsYXN0X2NoYXIgPSBiJyAnCiAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChsYXN0X2NoYXIpCgogICAgICAgIHJldHVybiBmaWx0ZXJlZAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBmaWx0ZXJfd2l0aF9lbmdsaXNoX2xldHRlcnMoYnVmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgY29weSBvZiBgYGJ1ZmBgIHRoYXQgcmV0YWlucyBvbmx5IHRoZSBzZXF1ZW5jZXMgb2YgRW5nbGlzaAogICAgICAgIGFscGhhYmV0IGFuZCBoaWdoIGJ5dGUgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgYmV0d2VlbiA8PiBjaGFyYWN0ZXJzLgogICAgICAgIEFsc28gcmV0YWlucyBFbmdsaXNoIGFscGhhYmV0IGFuZCBoaWdoIGJ5dGUgY2hhcmFjdGVycyBpbW1lZGlhdGVseQogICAgICAgIGJlZm9yZSBvY2N1cnJlbmNlcyBvZiA+LgoKICAgICAgICBUaGlzIGZpbHRlciBjYW4gYmUgYXBwbGllZCB0byBhbGwgc2NyaXB0cyB3aGljaCBjb250YWluIGJvdGggRW5nbGlzaAogICAgICAgIGNoYXJhY3RlcnMgYW5kIGV4dGVuZGVkIEFTQ0lJIGNoYXJhY3RlcnMsIGJ1dCBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5CiAgICAgICAgYGBMYXRpbjFQcm9iZXJgYC4KICAgICAgICAiIiIKICAgICAgICBmaWx0ZXJlZCA9IGJ5dGVhcnJheSgpCiAgICAgICAgaW5fdGFnID0gRmFsc2UKICAgICAgICBwcmV2ID0gMAoKICAgICAgICBmb3IgY3VyciBpbiByYW5nZShsZW4oYnVmKSk6CiAgICAgICAgICAgICMgU2xpY2UgaGVyZSB0byBnZXQgYnl0ZXMgaW5zdGVhZCBvZiBhbiBpbnQgd2l0aCBQeXRob24gMwogICAgICAgICAgICBidWZfY2hhciA9IGJ1ZltjdXJyOmN1cnIgKyAxXQogICAgICAgICAgICAjIENoZWNrIGlmIHdlJ3JlIGNvbWluZyBvdXQgb2Ygb3IgZW50ZXJpbmcgYW4gSFRNTCB0YWcKICAgICAgICAgICAgaWYgYnVmX2NoYXIgPT0gYic+JzoKICAgICAgICAgICAgICAgIGluX3RhZyA9IEZhbHNlCiAgICAgICAgICAgIGVsaWYgYnVmX2NoYXIgPT0gYic8JzoKICAgICAgICAgICAgICAgIGluX3RhZyA9IFRydWUKCiAgICAgICAgICAgICMgSWYgY3VycmVudCBjaGFyYWN0ZXIgaXMgbm90IGV4dGVuZGVkLUFTQ0lJIGFuZCBub3QgYWxwaGFiZXRpYy4uLgogICAgICAgICAgICBpZiBidWZfY2hhciA8IGInXHg4MCcgYW5kIG5vdCBidWZfY2hhci5pc2FscGhhKCk6CiAgICAgICAgICAgICAgICAjIC4uLmFuZCB3ZSdyZSBub3QgaW4gYSB0YWcKICAgICAgICAgICAgICAgIGlmIGN1cnIgPiBwcmV2IGFuZCBub3QgaW5fdGFnOgogICAgICAgICAgICAgICAgICAgICMgS2VlcCBldmVyeXRoaW5nIGFmdGVyIGxhc3Qgbm9uLWV4dGVuZGVkLUFTQ0lJLAogICAgICAgICAgICAgICAgICAgICMgbm9uLWFscGhhYmV0aWMgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGJ1ZltwcmV2OmN1cnJdKQogICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IGEgc3BhY2UgdG8gZGVsaW1pdCBzdHJldGNoIHdlIGtlcHQKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQoYicgJykKICAgICAgICAgICAgICAgIHByZXYgPSBjdXJyICsgMQoKICAgICAgICAjIElmIHdlJ3JlIG5vdCBpbiBhIHRhZy4uLgogICAgICAgIGlmIG5vdCBpbl90YWc6CiAgICAgICAgICAgICMgS2VlcCBldmVyeXRoaW5nIGFmdGVyIGxhc3Qgbm9uLWV4dGVuZGVkLUFTQ0lJLCBub24tYWxwaGFiZXRpYwogICAgICAgICAgICAjIGNoYXJhY3RlcgogICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQoYnVmW3ByZXY6XSkKCiAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEAkwbXMgEAAAABAAAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9fX2luaXRfXy5weQpQSwMEFAAAAAAAAAAhAF/drbmyCgAAsgoAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvY2hhcmRldGVjdC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgoiIiIKU2NyaXB0IHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGZpbGUgcGF0aHMgYW5kIHJlcG9ydHMgb24gdGhlaXIgZGV0ZWN0ZWQKZW5jb2RpbmdzCgpFeGFtcGxlOjoKCiAgICAlIGNoYXJkZXRlY3Qgc29tZWZpbGUgc29tZW90aGVyZmlsZQogICAgc29tZWZpbGU6IHdpbmRvd3MtMTI1MiB3aXRoIGNvbmZpZGVuY2UgMC41CiAgICBzb21lb3RoZXJmaWxlOiBhc2NpaSB3aXRoIGNvbmZpZGVuY2UgMS4wCgpJZiBubyBwYXRocyBhcmUgcHJvdmlkZWQsIGl0IHRha2VzIGl0cyBpbnB1dCBmcm9tIHN0ZGluLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgcHJpbnRfZnVuY3Rpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgc3lzCgpmcm9tIGNoYXJkZXQgaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gY2hhcmRldC5jb21wYXQgaW1wb3J0IFBZMgpmcm9tIGNoYXJkZXQudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCgoKZGVmIGRlc2NyaXB0aW9uX29mKGxpbmVzLCBuYW1lPSdzdGRpbicpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmFibGUgZW5jb2Rpbmcgb2YgYSBmaWxlIG9yCiAgICBsaXN0IG9mIHN0cmluZ3MuCgogICAgOnBhcmFtIGxpbmVzOiBUaGUgbGluZXMgdG8gZ2V0IHRoZSBlbmNvZGluZyBvZi4KICAgIDp0eXBlIGxpbmVzOiBJdGVyYWJsZSBvZiBieXRlcwogICAgOnBhcmFtIG5hbWU6IE5hbWUgb2YgZmlsZSBvciBjb2xsZWN0aW9uIG9mIGxpbmVzCiAgICA6dHlwZSBuYW1lOiBzdHIKICAgICIiIgogICAgdSA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgIGxpbmUgPSBieXRlYXJyYXkobGluZSkKICAgICAgICB1LmZlZWQobGluZSkKICAgICAgICAjIHNob3J0Y3V0IG91dCBvZiB0aGUgbG9vcCB0byBzYXZlIHJlYWRpbmcgZnVydGhlciAtIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgd2UgcmVhZCBhIEJPTS4KICAgICAgICBpZiB1LmRvbmU6CiAgICAgICAgICAgIGJyZWFrCiAgICB1LmNsb3NlKCkKICAgIHJlc3VsdCA9IHUucmVzdWx0CiAgICBpZiBQWTI6CiAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSwgJ2lnbm9yZScpCiAgICBpZiByZXN1bHRbJ2VuY29kaW5nJ106CiAgICAgICAgcmV0dXJuICd7MH06IHsxfSB3aXRoIGNvbmZpZGVuY2UgezJ9Jy5mb3JtYXQobmFtZSwgcmVzdWx0WydlbmNvZGluZyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnY29uZmlkZW5jZSddKQogICAgZWxzZToKICAgICAgICByZXR1cm4gJ3swfTogbm8gcmVzdWx0Jy5mb3JtYXQobmFtZSkKCgpkZWYgbWFpbihhcmd2PU5vbmUpOgogICAgIiIiCiAgICBIYW5kbGVzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGdldHMgdGhpbmdzIHN0YXJ0ZWQuCgogICAgOnBhcmFtIGFyZ3Y6IExpc3Qgb2YgYXJndW1lbnRzLCBhcyBpZiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KICAgICAgICAgICAgICAgICBJZiBOb25lLCBgYHN5cy5hcmd2WzE6XWBgIGlzIHVzZWQgaW5zdGVhZC4KICAgIDp0eXBlIGFyZ3Y6IGxpc3Qgb2Ygc3RyCiAgICAiIiIKICAgICMgR2V0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJUYWtlcyBvbmUgb3IgbW9yZSBmaWxlIHBhdGhzIGFuZCByZXBvcnRzIHRoZWlyIGRldGVjdGVkIFwKICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2lucHV0JywKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRmlsZSB3aG9zZSBlbmNvZGluZyB3ZSB3b3VsZCBsaWtlIHRvIGRldGVybWluZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogc3RkaW4pJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncmInKSwgbmFyZ3M9JyonLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtzeXMuc3RkaW4gaWYgUFkyIGVsc2Ugc3lzLnN0ZGluLmJ1ZmZlcl0pCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCBhY3Rpb249J3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSclKHByb2cpcyB7MH0nLmZvcm1hdChfX3ZlcnNpb25fXykpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKCiAgICBmb3IgZiBpbiBhcmdzLmlucHV0OgogICAgICAgIGlmIGYuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KCJZb3UgYXJlIHJ1bm5pbmcgY2hhcmRldGVjdCBpbnRlcmFjdGl2ZWx5LiBQcmVzcyAiICsKICAgICAgICAgICAgICAgICAgIkNUUkwtRCB0d2ljZSBhdCB0aGUgc3RhcnQgb2YgYSBibGFuayBsaW5lIHRvIHNpZ25hbCB0aGUgIiArCiAgICAgICAgICAgICAgICAgICJlbmQgb2YgeW91ciBpbnB1dC4gSWYgeW91IHdhbnQgaGVscCwgcnVuIGNoYXJkZXRlY3QgIiArCiAgICAgICAgICAgICAgICAgICItLWhlbHBcbiIsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBwcmludChkZXNjcmlwdGlvbl9vZihmLCBmLm5hbWUpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQBc+zdIBg4AAAYOAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY29kaW5nc3RhdGVtYWNoaW5lLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmltcG9ydCBsb2dnaW5nCgpmcm9tIC5lbnVtcyBpbXBvcnQgTWFjaGluZVN0YXRlCgoKY2xhc3MgQ29kaW5nU3RhdGVNYWNoaW5lKG9iamVjdCk6CiAgICAiIiIKICAgIEEgc3RhdGUgbWFjaGluZSB0byB2ZXJpZnkgYSBieXRlIHNlcXVlbmNlIGZvciBhIHBhcnRpY3VsYXIgZW5jb2RpbmcuIEZvcgogICAgZWFjaCBieXRlIHRoZSBkZXRlY3RvciByZWNlaXZlcywgaXQgd2lsbCBmZWVkIHRoYXQgYnl0ZSB0byBldmVyeSBhY3RpdmUKICAgIHN0YXRlIG1hY2hpbmUgYXZhaWxhYmxlLCBvbmUgYnl0ZSBhdCBhIHRpbWUuIFRoZSBzdGF0ZSBtYWNoaW5lIGNoYW5nZXMgaXRzCiAgICBzdGF0ZSBiYXNlZCBvbiBpdHMgcHJldmlvdXMgc3RhdGUgYW5kIHRoZSBieXRlIGl0IHJlY2VpdmVzLiBUaGVyZSBhcmUgMwogICAgc3RhdGVzIGluIGEgc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBvZiBpbnRlcmVzdCB0byBhbiBhdXRvLWRldGVjdG9yOgoKICAgIFNUQVJUIHN0YXRlOiBUaGlzIGlzIHRoZSBzdGF0ZSB0byBzdGFydCB3aXRoLCBvciBhIGxlZ2FsIGJ5dGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgICAoaS5lLiBhIHZhbGlkIGNvZGUgcG9pbnQpIGZvciBjaGFyYWN0ZXIgaGFzIGJlZW4gaWRlbnRpZmllZC4KCiAgICBNRSBzdGF0ZTogIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXRlIG1hY2hpbmUgaWRlbnRpZmllZCBhIGJ5dGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgY2hhcnNldCBpdCBpcyBkZXNpZ25lZCBmb3IgYW5kIHRoYXQKICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gb3RoZXIgcG9zc2libGUgZW5jb2Rpbmcgd2hpY2ggY2FuIGNvbnRhaW4gdGhpcyBieXRlCiAgICAgICAgICAgICAgIHNlcXVlbmNlLiBUaGlzIHdpbGwgdG8gbGVhZCB0byBhbiBpbW1lZGlhdGUgcG9zaXRpdmUgYW5zd2VyIGZvcgogICAgICAgICAgICAgICB0aGUgZGV0ZWN0b3IuCgogICAgRVJST1Igc3RhdGU6IFRoaXMgaW5kaWNhdGVzIHRoZSBzdGF0ZSBtYWNoaW5lIGlkZW50aWZpZWQgYW4gaWxsZWdhbCBieXRlCiAgICAgICAgICAgICAgICAgc2VxdWVuY2UgZm9yIHRoYXQgZW5jb2RpbmcuIFRoaXMgd2lsbCBsZWFkIHRvIGFuIGltbWVkaWF0ZQogICAgICAgICAgICAgICAgIG5lZ2F0aXZlIGFuc3dlciBmb3IgdGhpcyBlbmNvZGluZy4gRGV0ZWN0b3Igd2lsbCBleGNsdWRlIHRoaXMKICAgICAgICAgICAgICAgICBlbmNvZGluZyBmcm9tIGNvbnNpZGVyYXRpb24gZnJvbSBoZXJlIG9uLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgc20pOgogICAgICAgIHNlbGYuX21vZGVsID0gc20KICAgICAgICBzZWxmLl9jdXJyX2J5dGVfcG9zID0gMAogICAgICAgIHNlbGYuX2N1cnJfY2hhcl9sZW4gPSAwCiAgICAgICAgc2VsZi5fY3Vycl9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9jdXJyX3N0YXRlID0gTWFjaGluZVN0YXRlLlNUQVJUCgogICAgZGVmIG5leHRfc3RhdGUoc2VsZiwgYyk6CiAgICAgICAgIyBmb3IgZWFjaCBieXRlIHdlIGdldCBpdHMgY2xhc3MKICAgICAgICAjIGlmIGl0IGlzIGZpcnN0IGJ5dGUsIHdlIGFsc28gZ2V0IGJ5dGUgbGVuZ3RoCiAgICAgICAgYnl0ZV9jbGFzcyA9IHNlbGYuX21vZGVsWydjbGFzc190YWJsZSddW2NdCiAgICAgICAgaWYgc2VsZi5fY3Vycl9zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgIHNlbGYuX2N1cnJfYnl0ZV9wb3MgPSAwCiAgICAgICAgICAgIHNlbGYuX2N1cnJfY2hhcl9sZW4gPSBzZWxmLl9tb2RlbFsnY2hhcl9sZW5fdGFibGUnXVtieXRlX2NsYXNzXQogICAgICAgICMgZnJvbSBieXRlJ3MgY2xhc3MgYW5kIHN0YXRlX3RhYmxlLCB3ZSBnZXQgaXRzIG5leHQgc3RhdGUKICAgICAgICBjdXJyX3N0YXRlID0gKHNlbGYuX2N1cnJfc3RhdGUgKiBzZWxmLl9tb2RlbFsnY2xhc3NfZmFjdG9yJ10KICAgICAgICAgICAgICAgICAgICAgICsgYnl0ZV9jbGFzcykKICAgICAgICBzZWxmLl9jdXJyX3N0YXRlID0gc2VsZi5fbW9kZWxbJ3N0YXRlX3RhYmxlJ11bY3Vycl9zdGF0ZV0KICAgICAgICBzZWxmLl9jdXJyX2J5dGVfcG9zICs9IDEKICAgICAgICByZXR1cm4gc2VsZi5fY3Vycl9zdGF0ZQoKICAgIGRlZiBnZXRfY3VycmVudF9jaGFybGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jdXJyX2NoYXJfbGVuCgogICAgZGVmIGdldF9jb2Rpbmdfc3RhdGVfbWFjaGluZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbJ25hbWUnXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tb2RlbFsnbGFuZ3VhZ2UnXQpQSwMEFAAAAAAAAAAhAHyG5WVuBAAAbgQAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb21wYXQucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb250cmlidXRvcihzKToKIyAgIERhbiBCbGFuY2hhcmQKIyAgIElhbiBDb3JkYXNjbwojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgc3lzCgoKaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKICAgIFBZMiA9IFRydWUKICAgIFBZMyA9IEZhbHNlCiAgICBiYXNlX3N0ciA9IChzdHIsIHVuaWNvZGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCmVsc2U6CiAgICBQWTIgPSBGYWxzZQogICAgUFkzID0gVHJ1ZQogICAgYmFzZV9zdHIgPSAoYnl0ZXMsIHN0cikKICAgIHRleHRfdHlwZSA9IHN0cgpQSwMEFAAAAAAAAAAhAL1CmjE/BwAAPwcAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5tYmNzc20gaW1wb3J0IENQOTQ5X1NNX01PREVMCgoKY2xhc3MgQ1A5NDlQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQ1A5NDlQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShDUDk0OV9TTV9NT0RFTCkKICAgICAgICAjIE5PVEU6IENQOTQ5IGlzIGEgc3VwZXJzZXQgb2YgRVVDLUtSLCBzbyB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBiZQogICAgICAgICMgICAgICAgbm90IGRpZmZlcmVudC4KICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkNQOTQ5IgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiS29yZWFuIgpQSwMEFAAAAAAAAAAhAEQErMl9BgAAfQYAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lbnVtcy5weSIiIgpBbGwgb2YgdGhlIEVudW1zIHRoYXQgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgY2hhcmRldCBwYWNrYWdlLgoKOmF1dGhvcjogRGFuIEJsYW5jaGFyZCAoZGFuLmJsYW5jaGFyZEBnbWFpbC5jb20pCiIiIgoKCmNsYXNzIElucHV0U3RhdGUob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgYSB1bml2ZXJzYWwgZGV0ZWN0b3IgY2FuIGJlIGluLgogICAgIiIiCiAgICBQVVJFX0FTQ0lJID0gMAogICAgRVNDX0FTQ0lJID0gMQogICAgSElHSF9CWVRFID0gMgoKCmNsYXNzIExhbmd1YWdlRmlsdGVyKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgZmlsdGVycyB3ZSBjYW4gYXBwbHkgdG8gYQogICAgYGBVbml2ZXJzYWxEZXRlY3RvcmBgLgogICAgIiIiCiAgICBDSElORVNFX1NJTVBMSUZJRUQgPSAweDAxCiAgICBDSElORVNFX1RSQURJVElPTkFMID0gMHgwMgogICAgSkFQQU5FU0UgPSAweDA0CiAgICBLT1JFQU4gPSAweDA4CiAgICBOT05fQ0pLID0gMHgxMAogICAgQUxMID0gMHgxRgogICAgQ0hJTkVTRSA9IENISU5FU0VfU0lNUExJRklFRCB8IENISU5FU0VfVFJBRElUSU9OQUwKICAgIENKSyA9IENISU5FU0UgfCBKQVBBTkVTRSB8IEtPUkVBTgoKCmNsYXNzIFByb2JpbmdTdGF0ZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBhIHByb2JlciBjYW4gYmUgaW4uCiAgICAiIiIKICAgIERFVEVDVElORyA9IDAKICAgIEZPVU5EX0lUID0gMQogICAgTk9UX01FID0gMgoKCmNsYXNzIE1hY2hpbmVTdGF0ZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBhIHN0YXRlIG1hY2hpbmUgY2FuIGJlIGluLgogICAgIiIiCiAgICBTVEFSVCA9IDAKICAgIEVSUk9SID0gMQogICAgSVRTX01FID0gMgoKCmNsYXNzIFNlcXVlbmNlTGlrZWxpaG9vZChvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgbGlrZWxpaG9vZCBvZiBhIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHByZXZpb3VzIG9uZS4KICAgICIiIgogICAgTkVHQVRJVkUgPSAwCiAgICBVTkxJS0VMWSA9IDEKICAgIExJS0VMWSA9IDIKICAgIFBPU0lUSVZFID0gMwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9udW1fY2F0ZWdvcmllcyhjbHMpOgogICAgICAgICIiIjpyZXR1cm5zOiBUaGUgbnVtYmVyIG9mIGxpa2VsaWhvb2QgY2F0ZWdvcmllcyBpbiB0aGUgZW51bS4iIiIKICAgICAgICByZXR1cm4gNAoKCmNsYXNzIENoYXJhY3RlckNhdGVnb3J5KG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgY2F0ZWdvcmllcyBsYW5ndWFnZSBtb2RlbHMgZm9yCiAgICBgYFNpbmdsZUJ5dGVDaGFyc2V0UHJvYmVyYGAgcHV0IGNoYXJhY3RlcnMgaW50by4KCiAgICBBbnl0aGluZyBsZXNzIHRoYW4gQ09OVFJPTCBpcyBjb25zaWRlcmVkIGEgbGV0dGVyLgogICAgIiIiCiAgICBVTkRFRklORUQgPSAyNTUKICAgIExJTkVfQlJFQUsgPSAyNTQKICAgIFNZTUJPTCA9IDI1MwogICAgRElHSVQgPSAyNTIKICAgIENPTlRST0wgPSAyNTEKUEsDBBQAAAAAAAAAIQAEiAU9bg8AAG4PAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuZW51bXMgaW1wb3J0IExhbmd1YWdlRmlsdGVyLCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5lc2NzbSBpbXBvcnQgKEhaX1NNX01PREVMLCBJU08yMDIyQ05fU01fTU9ERUwsIElTTzIwMjJKUF9TTV9NT0RFTCwKICAgICAgICAgICAgICAgICAgICBJU08yMDIyS1JfU01fTU9ERUwpCgoKY2xhc3MgRXNjQ2hhclNldFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICIiIgogICAgVGhpcyBDaGFyU2V0UHJvYmVyIHVzZXMgYSAiY29kZSBzY2hlbWUiIGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgZW5jb2RpbmdzLAogICAgd2hlcmVieSBlYXNpbHkgcmVjb2duaXphYmxlIGVzY2FwZSBvciBzaGlmdCBzZXF1ZW5jZXMgYXJlIHJlbGllZCBvbiB0bwogICAgaWRlbnRpZnkgdGhlc2UgZW5jb2RpbmdzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKEVzY0NoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gW10KICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuQ0hJTkVTRV9TSU1QTElGSUVEOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKEhaX1NNX01PREVMKSkKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIyQ05fU01fTU9ERUwpKQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5KQVBBTkVTRToKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIySlBfU01fTU9ERUwpKQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5LT1JFQU46CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSVNPMjAyMktSX1NNX01PREVMKSkKICAgICAgICBzZWxmLmFjdGl2ZV9zbV9jb3VudCA9IE5vbmUKICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlID0gTm9uZQogICAgICAgIHNlbGYuX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihFc2NDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgZm9yIGNvZGluZ19zbSBpbiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgaWYgbm90IGNvZGluZ19zbToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvZGluZ19zbS5hY3RpdmUgPSBUcnVlCiAgICAgICAgICAgIGNvZGluZ19zbS5yZXNldCgpCiAgICAgICAgc2VsZi5hY3RpdmVfc21fY291bnQgPSBsZW4oc2VsZi5jb2Rpbmdfc20pCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldCA9IE5vbmUKICAgICAgICBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZSA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldDoKICAgICAgICAgICAgcmV0dXJuIDAuOTkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gMC4wMAoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgZm9yIGNvZGluZ19zbSBpbiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgICAgIGlmIG5vdCBjb2Rpbmdfc20gb3Igbm90IGNvZGluZ19zbS5hY3RpdmU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IGNvZGluZ19zbS5uZXh0X3N0YXRlKGMpCiAgICAgICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgICAgIGNvZGluZ19zbS5hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX3NtX2NvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFjdGl2ZV9zbV9jb3VudCA8PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gY29kaW5nX3NtLmdldF9jb2Rpbmdfc3RhdGVfbWFjaGluZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UgPSBjb2Rpbmdfc20ubGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQpQSwMEFAAAAAAAAAAhAMEKYKIOKQAADikAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2NzbS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgTWFjaGluZVN0YXRlCgpIWl9DTFMgPSAoCjEsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKMCwwLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsMCwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDQsMCw1LDIsMCwgICMgNzggLSA3ZgoxLDEsMSwxLDEsMSwxLDEsICAjIDgwIC0gODcKMSwxLDEsMSwxLDEsMSwxLCAgIyA4OCAtIDhmCjEsMSwxLDEsMSwxLDEsMSwgICMgOTAgLSA5NwoxLDEsMSwxLDEsMSwxLDEsICAjIDk4IC0gOWYKMSwxLDEsMSwxLDEsMSwxLCAgIyBhMCAtIGE3CjEsMSwxLDEsMSwxLDEsMSwgICMgYTggLSBhZgoxLDEsMSwxLDEsMSwxLDEsICAjIGIwIC0gYjcKMSwxLDEsMSwxLDEsMSwxLCAgIyBiOCAtIGJmCjEsMSwxLDEsMSwxLDEsMSwgICMgYzAgLSBjNwoxLDEsMSwxLDEsMSwxLDEsICAjIGM4IC0gY2YKMSwxLDEsMSwxLDEsMSwxLCAgIyBkMCAtIGQ3CjEsMSwxLDEsMSwxLDEsMSwgICMgZDggLSBkZgoxLDEsMSwxLDEsMSwxLDEsICAjIGUwIC0gZTcKMSwxLDEsMSwxLDEsMSwxLCAgIyBlOCAtIGVmCjEsMSwxLDEsMSwxLDEsMSwgICMgZjAgLSBmNwoxLDEsMSwxLDEsMSwxLDEsICAjIGY4IC0gZmYKKQoKSFpfU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsICAgICAzLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAwMC0wNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDEwLTE3CiAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsICAgICA1LCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgogICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCwgICAgIDQsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjAtMjcKICAgICA0LE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAyOC0yZgopCgpIWl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwKQoKSFpfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSFpfQ0xTLAogICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSFpfU1QsCiAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEhaX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAnbmFtZSc6ICJIWi1HQi0yMzEyIiwKICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0NoaW5lc2UnfQoKSVNPMjAyMkNOX0NMUyA9ICgKMiwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDAsMCwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsMCwwLDAsMCwgICMgMjAgLSAyNwowLDMsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgowLDAsMCw0LDAsMCwwLDAsICAjIDQwIC0gNDcKMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCjIsMiwyLDIsMiwyLDIsMiwgICMgODAgLSA4NwoyLDIsMiwyLDIsMiwyLDIsICAjIDg4IC0gOGYKMiwyLDIsMiwyLDIsMiwyLCAgIyA5MCAtIDk3CjIsMiwyLDIsMiwyLDIsMiwgICMgOTggLSA5ZgoyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCjIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwoyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CjIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgoyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCjIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwoyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CjIsMiwyLDIsMiwyLDIsMiwgICMgZjggLSBmZgopCgpJU08yMDIyQ05fU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAwMC0wNwpNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDgtMGYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDEwLTE3Ck1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3CiAgICAgNSwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyOC0yZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDMwLTM3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCMgMzgtM2YKKQoKSVNPMjAyMkNOX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIyQ05fU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMkNOX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA5LAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMkNOX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMkNOX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItQ04iLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0NoaW5lc2UnfQoKSVNPMjAyMkpQX0NMUyA9ICgKMiwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDIsMiwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsNywwLDAsMCwgICMgMjAgLSAyNwozLDAsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgo2LDAsNCwwLDgsMCwwLDAsICAjIDQwIC0gNDcKMCw5LDUsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCjIsMiwyLDIsMiwyLDIsMiwgICMgODAgLSA4NwoyLDIsMiwyLDIsMiwyLDIsICAjIDg4IC0gOGYKMiwyLDIsMiwyLDIsMiwyLCAgIyA5MCAtIDk3CjIsMiwyLDIsMiwyLDIsMiwgICMgOTggLSA5ZgoyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCjIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwoyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CjIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgoyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCjIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwoyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CjIsMiwyLDIsMiwyLDIsMiwgICMgZjggLSBmZgopCgpJU08yMDIySlBfU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAwMC0wNwpNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDgtMGYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAxMC0xNwpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDI4LTJmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDMwLTM3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMzgtM2YKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyA0MC00NwopCgpJU08yMDIySlBfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkKCklTTzIwMjJKUF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBJU08yMDIySlBfQ0xTLAogICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDEwLAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMkpQX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMkpQX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItSlAiLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0phcGFuZXNlJ30KCklTTzIwMjJLUl9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDMsMCwwLDAsICAjIDIwIC0gMjcKMCw0LDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsNSwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMktSX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDAtMDcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAwOC0wZgpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAxMC0xNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAyMC0yNwopCgpJU08yMDIyS1JfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCkKCklTTzIwMjJLUl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBJU08yMDIyS1JfQ0xTLAogICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBJU08yMDIyS1JfU1QsCiAgICAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBJU08yMDIyS1JfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICJJU08tMjAyMi1LUiIsCiAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnS29yZWFuJ30KCgpQSwMEFAAAAAAAAAAhACA3xNClDgAApQ4AADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAuanBjbnR4IGltcG9ydCBFVUNKUENvbnRleHRBbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEVVQ0pQX1NNX01PREVMCgoKY2xhc3MgRVVDSlBQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDSlBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShFVUNKUF9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplciA9IEVVQ0pQQ29udGV4dEFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoRVVDSlBQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkVVQy1KUCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkphcGFuZXNlIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYnl0ZV9zdHIpKToKICAgICAgICAgICAgIyBQWTNLOiBieXRlX3N0ciBpcyBhIGJ5dGUgYXJyYXksIHNvIGJ5dGVfc3RyW2ldIGlzIGFuIGludCwgbm90IGEgYnl0ZQogICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBzZWxmLmNvZGluZ19zbS5uZXh0X3N0YXRlKGJ5dGVfc3RyW2ldKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIHByb2JlciBoaXQgZXJyb3IgYXQgYnl0ZSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJzZXRfbmFtZSwgc2VsZi5sYW5ndWFnZSwgaSkKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBjaGFyX2xlbiA9IHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKQogICAgICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhclsxXSA9IGJ5dGVfc3RyWzBdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCgogICAgICAgIHNlbGYuX2xhc3RfY2hhclswXSA9IGJ5dGVfc3RyWy0xXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ290X2Vub3VnaF9kYXRhKCkgYW5kCiAgICAgICAgICAgICAgIChzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRCkpOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgY29udGV4dF9jb25mID0gc2VsZi5jb250ZXh0X2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICBkaXN0cmliX2NvbmYgPSBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgcmV0dXJuIG1heChjb250ZXh0X2NvbmYsIGRpc3RyaWJfY29uZikKUEsDBBQAAAAAAAAAIQD0QQN56jQAAOo0AAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNhbXBsaW5nIGZyb20gYWJvdXQgMjBNIHRleHQgbWF0ZXJpYWxzIGluY2x1ZGUgbGl0ZXJhdHVyZSBhbmQgY29tcHV0ZXIgdGVjaG5vbG9neQoKIyAxMjggIC0tPiAwLjc5CiMgMjU2ICAtLT4gMC45MgojIDUxMiAgLS0+IDAuOTg2CiMgMTAyNCAtLT4gMC45OTk0NAojIDIwNDggLS0+IDAuOTk5OTkKIwojIElkZWEgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC45ODY1MyAvICgxLTAuOTg2NTMpID0gNzMuMjQKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMiAvICgyMzUwLTUxMikgPSAwLjI3OS4KIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvCgpFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDYuMAoKRVVDS1JfVEFCTEVfU0laRSA9IDIzNTIKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgMTMsIDEzMCwgMTIwLDEzOTYsIDQ4MSwxNzE5LDE3MjAsIDMyOCwgNjA5LCAyMTIsMTcyMSwgNzA3LCA0MDAsIDI5OSwxNzIyLCAgODcsCjEzOTcsMTcyMywgMTA0LCA1MzYsMTExNywxMjAzLDE3MjQsMTI2NywgNjg1LDEyNjgsIDUwOCwxNzI1LDE3MjYsMTcyNywxNzI4LDEzOTgsCjEzOTksMTcyOSwxNzMwLDE3MzEsIDE0MSwgNjIxLCAzMjYsMTA1NywgMzY4LDE3MzIsIDI2NywgNDg4LCAgMjAsMTczMywxMjY5LDE3MzQsCiA5NDUsMTQwMCwxNzM1LCAgNDcsIDkwNCwxMjcwLDE3MzYsMTczNywgNzczLCAyNDgsMTczOCwgNDA5LCAzMTMsIDc4NiwgNDI5LDE3MzksCiAxMTYsIDk4NywgODEzLDE0MDEsIDY4MywgIDc1LDEyMDQsIDE0NSwxNzQwLDE3NDEsMTc0MiwxNzQzLCAgMTYsIDg0NywgNjY3LCA2MjIsCiA3MDgsMTc0NCwxNzQ1LDE3NDYsIDk2NiwgNzg3LCAzMDQsIDEyOSwxNzQ3LCAgNjAsIDgyMCwgMTIzLCA2NzYsMTc0OCwxNzQ5LDE3NTAsCjE3NTEsIDYxNywxNzUyLCA2MjYsMTc1MywxNzU0LDE3NTUsMTc1NiwgNjUzLDE3NTcsMTc1OCwxNzU5LDE3NjAsMTc2MSwxNzYyLCA4NTYsCiAzNDQsMTc2MywxNzY0LDE3NjUsMTc2NiwgIDg5LCA0MDEsIDQxOCwgODA2LCA5MDUsIDg0OCwxNzY3LDE3NjgsMTc2OSwgOTQ2LDEyMDUsCiA3MDksMTc3MCwxMTE4LDE3NzEsIDI0MSwxNzcyLDE3NzMsMTc3NCwxMjcxLDE3NzUsIDU2OSwxNzc2LCA5OTksMTc3NywxNzc4LDE3NzksCjE3ODAsIDMzNywgNzUxLDEwNTgsICAyOCwgNjI4LCAyNTQsMTc4MSwgMTc3LCA5MDYsIDI3MCwgMzQ5LCA4OTEsMTA3OSwxNzgyLCAgMTksCjE3ODMsIDM3OSwxNzg0LCAzMTUsMTc4NSwgNjI5LCA3NTQsMTQwMiwgNTU5LDE3ODYsIDYzNiwgMjAzLDEyMDYsMTc4NywgNzEwLCA1NjcsCjE3ODgsIDkzNSwgODE0LDE3ODksMTc5MCwxMjA3LCA3NjYsIDUyOCwxNzkxLDE3OTIsMTIwOCwxNzkzLDE3OTQsMTc5NSwxNzk2LDE3OTcsCjE0MDMsMTc5OCwxNzk5LCA1MzMsMTA1OSwxNDA0LDE0MDUsMTE1NiwxNDA2LCA5MzYsIDg4NCwxMDgwLDE4MDAsIDM1MSwxODAxLDE4MDIsCjE4MDMsMTgwNCwxODA1LCA4MDEsMTgwNiwxODA3LDE4MDgsMTExOSwxODA5LDExNTcsIDcxNCwgNDc0LDE0MDcsMTgxMCwgMjk4LCA4OTksCiA4ODUsMTgxMSwxMTIwLCA4MDIsMTE1OCwxODEyLCA4OTIsMTgxMywxODE0LDE0MDgsIDY1OSwxODE1LDE4MTYsMTEyMSwxODE3LDE4MTgsCjE4MTksMTgyMCwxODIxLDE4MjIsIDMxOSwxODIzLCA1OTQsIDU0NSwxODI0LCA4MTUsIDkzNywxMjA5LDE4MjUsMTgyNiwgNTczLDE0MDksCjEwMjIsMTgyNywxMjEwLDE4MjgsMTgyOSwxODMwLDE4MzEsMTgzMiwxODMzLCA1NTYsIDcyMiwgODA3LDExMjIsMTA2MCwxODM0LCA2OTcsCjE4MzUsIDkwMCwgNTU3LCA3MTUsMTgzNiwxNDEwLCA1NDAsMTQxMSwgNzUyLDExNTksIDI5NCwgNTk3LDEyMTEsIDk3NiwgODAzLCA3NzAsCjE0MTIsMTgzNywxODM4LCAgMzksIDc5NCwxNDEzLCAzNTgsMTgzOSwgMzcxLCA5MjUsMTg0MCwgNDUzLCA2NjEsIDc4OCwgNTMxLCA3MjMsCiA1NDQsMTAyMywxMDgxLCA4NjksICA5MSwxODQxLCAzOTIsIDQzMCwgNzkwLCA2MDIsMTQxNCwgNjc3LDEwODIsIDQ1NywxNDE1LDE0MTYsCjE4NDIsMTg0MywgNDc1LCAzMjcsMTAyNCwxNDE3LCA3OTUsIDEyMSwxODQ0LCA3MzMsIDQwMywxNDE4LDE4NDUsMTg0NiwxODQ3LCAzMDAsCiAxMTksIDcxMSwxMjEyLCA2MjcsMTg0OCwxMjcyLCAyMDcsMTg0OSwxODUwLCA3OTYsMTIxMywgMzgyLDE4NTEsIDUxOSwxODUyLDEwODMsCiA4OTMsMTg1MywxODU0LDE4NTUsIDM2NywgODA5LCA0ODcsIDY3MSwxODU2LCA2NjMsMTg1NywxODU4LCA5NTYsIDQ3MSwgMzA2LCA4NTcsCjE4NTksMTg2MCwxMTYwLDEwODQsMTg2MSwxODYyLDE4NjMsMTg2NCwxODY1LDEwNjEsMTg2NiwxODY3LDE4NjgsMTg2OSwxODcwLDE4NzEsCiAyODIsICA5NiwgNTc0LDE4NzIsIDUwMiwxMDg1LDE4NzMsMTIxNCwxODc0LCA5MDcsMTg3NSwxODc2LCA4MjcsIDk3NywxNDE5LDE0MjAsCjE0MjEsIDI2OCwxODc3LDE0MjIsMTg3OCwxODc5LDE4ODAsIDMwOCwxODgxLCAgIDIsIDUzNywxODgyLDE4ODMsMTIxNSwxODg0LDE4ODUsCiAxMjcsIDc5MSwxODg2LDEyNzMsMTQyMywxODg3LCAgMzQsIDMzNiwgNDA0LCA2NDMsMTg4OCwgNTcxLCA2NTQsIDg5NCwgODQwLDE4ODksCiAgIDAsIDg4NiwxMjc0LCAxMjIsIDU3NSwgMjYwLCA5MDgsIDkzOCwxODkwLDEyNzUsIDQxMCwgMzE2LDE4OTEsMTg5MiwgMTAwLDE4OTMsCjE4OTQsMTEyMywgIDQ4LDExNjEsMTEyNCwxMDI1LDE4OTUsIDYzMywgOTAxLDEyNzYsMTg5NiwxODk3LCAxMTUsIDgxNiwxODk4LCAzMTcsCjE4OTksIDY5NCwxOTAwLCA5MDksIDczNCwxNDI0LCA1NzIsIDg2NiwxNDI1LCA2OTEsICA4NSwgNTI0LDEwMTAsIDU0MywgMzk0LCA4NDEsCjE5MDEsMTkwMiwxOTAzLDEwMjYsMTkwNCwxOTA1LDE5MDYsMTkwNywxOTA4LDE5MDksICAzMCwgNDUxLCA2NTEsIDk4OCwgMzEwLDE5MTAsCjE5MTEsMTQyNiwgODEwLDEyMTYsICA5MywxOTEyLDE5MTMsMTI3NywxMjE3LDE5MTQsIDg1OCwgNzU5LCAgNDUsICA1OCwgMTgxLCA2MTAsCiAyNjksMTkxNSwxOTE2LCAxMzEsMTA2MiwgNTUxLCA0NDMsMTAwMCwgODIxLDE0MjcsIDk1NywgODk1LDEwODYsMTkxNywxOTE4LCAzNzUsCjE5MTksIDM1OSwxOTIwLCA2ODcsMTkyMSwgODIyLDE5MjIsIDI5MywxOTIzLDE5MjQsICA0MCwgNjYyLCAxMTgsIDY5MiwgIDI5LCA5MzksCiA4ODcsIDY0MCwgNDgyLCAxNzQsMTkyNSwgIDY5LDExNjIsIDcyOCwxNDI4LCA5MTAsMTkyNiwxMjc4LDEyMTgsMTI3OSwgMzg2LCA4NzAsCiAyMTcsIDg1NCwxMTYzLCA4MjMsMTkyNywxOTI4LDE5MjksMTkzMCwgODM0LDE5MzEsICA3OCwxOTMyLCA4NTksMTkzMywxMDYzLDE5MzQsCjE5MzUsMTkzNiwxOTM3LCA0MzgsMTE2NCwgMjA4LCA1OTUsMTkzOCwxOTM5LDE5NDAsMTk0MSwxMjE5LDExMjUsMTk0MiwgMjgwLCA4ODgsCjE0MjksMTQzMCwxMjIwLDE0MzEsMTk0MywxOTQ0LDE5NDUsMTk0NiwxOTQ3LDEyODAsIDE1MCwgNTEwLDE0MzIsMTk0OCwxOTQ5LDE5NTAsCjE5NTEsMTk1MiwxOTUzLDE5NTQsMTAxMSwxMDg3LDE5NTUsMTQzMywxMDQzLDE5NTYsIDg4MSwxOTU3LCA2MTQsIDk1OCwxMDY0LDEwNjUsCjEyMjEsMTk1OCwgNjM4LDEwMDEsIDg2MCwgOTY3LCA4OTYsMTQzNCwgOTg5LCA0OTIsIDU1MywxMjgxLDExNjUsMTk1OSwxMjgyLDEwMDIsCjEyODMsMTIyMiwxOTYwLDE5NjEsMTk2MiwxOTYzLCAgMzYsIDM4MywgMjI4LCA3NTMsIDI0NywgNDU0LDE5NjQsIDg3NiwgNjc4LDE5NjUsCjE5NjYsMTI4NCwgMTI2LCA0NjQsIDQ5MCwgODM1LCAxMzYsIDY3MiwgNTI5LCA5NDAsMTA4OCwxNDM1LCA0NzMsMTk2NywxOTY4LCA0NjcsCiAgNTAsIDM5MCwgMjI3LCA1ODcsIDI3OSwgMzc4LCA1OTgsIDc5MiwgOTY4LCAyNDAsIDE1MSwgMTYwLCA4NDksIDg4MiwxMTI2LDEyODUsCiA2MzksMTA0NCwgMTMzLCAxNDAsIDI4OCwgMzYwLCA4MTEsIDU2MywxMDI3LCA1NjEsIDE0MiwgNTIzLDE5NjksMTk3MCwxOTcxLCAgIDcsCiAxMDMsIDI5NiwgNDM5LCA0MDcsIDUwNiwgNjM0LCA5OTAsMTk3MiwxOTczLDE5NzQsMTk3NSwgNjQ1LDE5NzYsMTk3NywxOTc4LDE5NzksCjE5ODAsMTk4MSwgMjM2LDE5ODIsMTQzNiwxOTgzLDE5ODQsMTA4OSwgMTkyLCA4MjgsIDYxOCwgNTE4LDExNjYsIDMzMywxMTI3LDE5ODUsCiA4MTgsMTIyMywxOTg2LDE5ODcsMTk4OCwxOTg5LDE5OTAsMTk5MSwxOTkyLDE5OTMsIDM0MiwxMTI4LDEyODYsIDc0NiwgODQyLDE5OTQsCjE5OTUsIDU2MCwgMjIzLDEyODcsICA5OCwgICA4LCAxODksIDY1MCwgOTc4LDEyODgsMTk5NiwxNDM3LDE5OTcsICAxNywgMzQ1LCAyNTAsCiA0MjMsIDI3NywgMjM0LCA1MTIsIDIyNiwgIDk3LCAyODksICA0MiwgMTY3LDE5OTgsIDIwMSwxOTk5LDIwMDAsIDg0MywgODM2LCA4MjQsCiA1MzIsIDMzOCwgNzgzLDEwOTAsIDE4MiwgNTc2LCA0MzYsMTQzOCwxNDM5LCA1MjcsIDUwMCwyMDAxLCA5NDcsIDg4OSwyMDAyLDIwMDMsCjIwMDQsMjAwNSwgMjYyLCA2MDAsIDMxNCwgNDQ3LDIwMDYsIDU0NywyMDA3LCA2OTMsIDczOCwxMTI5LDIwMDgsICA3MSwxNDQwLCA3NDUsCiA2MTksIDY4OCwyMDA5LCA4MjksMjAxMCwyMDExLCAxNDcsMjAxMiwgIDMzLCA5NDgsMjAxMywyMDE0LCAgNzQsIDIyNCwyMDE1LCAgNjEsCiAxOTEsIDkxOCwgMzk5LCA2MzcsMjAxNiwxMDI4LDExMzAsIDI1NywgOTAyLDIwMTcsMjAxOCwyMDE5LDIwMjAsMjAyMSwyMDIyLDIwMjMsCjIwMjQsMjAyNSwyMDI2LCA4MzcsMjAyNywyMDI4LDIwMjksMjAzMCwgMTc5LCA4NzQsIDU5MSwgIDUyLCA3MjQsIDI0NiwyMDMxLDIwMzIsCjIwMzMsMjAzNCwxMTY3LCA5NjksMjAzNSwxMjg5LCA2MzAsIDYwNSwgOTExLDEwOTEsMTE2OCwyMDM2LDIwMzcsMjAzOCwxNDQxLCA5MTIsCjIwMzksIDYyMywyMDQwLDIwNDEsIDI1MywxMTY5LDEyOTAsMjA0MiwxNDQyLCAxNDYsIDYyMCwgNjExLCA1NzcsIDQzMywyMDQzLDEyMjQsCiA3MTksMTE3MCwgOTU5LCA0NDAsIDQzNywgNTM0LCAgODQsIDM4OCwgNDgwLDExMzEsIDE1OSwgMjIwLCAxOTgsIDY3OSwyMDQ0LDEwMTIsCiA4MTksMTA2NiwxNDQzLCAxMTMsMTIyNSwgMTk0LCAzMTgsMTAwMywxMDI5LDIwNDUsMjA0NiwyMDQ3LDIwNDgsMTA2NywyMDQ5LDIwNTAsCjIwNTEsMjA1MiwyMDUzLCAgNTksIDkxMywgMTEyLDIwNTQsIDYzMiwyMDU1LCA0NTUsIDE0NCwgNzM5LDEyOTEsMjA1NiwgMjczLCA2ODEsCiA0OTksMjA1NywgNDQ4LDIwNTgsMjA1OSwgNzYwLDIwNjAsMjA2MSwgOTcwLCAzODQsIDE2OSwgMjQ1LDExMzIsMjA2MiwyMDYzLCA0MTQsCjE0NDQsMjA2NCwyMDY1LCAgNDEsIDIzNSwyMDY2LCAxNTcsIDI1MiwgODc3LCA1NjgsIDkxOSwgNzg5LCA1ODAsMjA2NywgNzI1LDIwNjgsCjIwNjksMTI5MiwyMDcwLDIwNzEsMTQ0NSwyMDcyLDE0NDYsMjA3MywyMDc0LCAgNTUsIDU4OCwgIDY2LDE0NDcsIDI3MSwxMDkyLDIwNzUsCjEyMjYsMjA3NiwgOTYwLDEwMTMsIDM3MiwyMDc3LDIwNzgsMjA3OSwyMDgwLDIwODEsMTI5MywyMDgyLDIwODMsMjA4NCwyMDg1LCA4NTAsCjIwODYsMjA4NywyMDg4LDIwODksMjA5MCwgMTg2LDIwOTEsMTA2OCwgMTgwLDIwOTIsMjA5MywyMDk0LCAxMDksMTIyNywgNTIyLCA2MDYsCjIwOTUsIDg2NywxNDQ4LDEwOTMsIDk5MSwxMTcxLCA5MjYsIDM1MywxMTMzLDIwOTYsIDU4MSwyMDk3LDIwOTgsMjA5OSwxMjk0LDE0NDksCjE0NTAsMjEwMCwgNTk2LDExNzIsMTAxNCwxMjI4LDIxMDEsMTQ1MSwxMjk1LDExNzMsMTIyOSwyMTAyLDIxMDMsMTI5NiwxMTM0LDE0NTIsCiA5NDksMTEzNSwyMTA0LDIxMDUsMTA5NCwxNDUzLDE0NTQsMTQ1NSwyMTA2LDEwOTUsMjEwNywyMTA4LDIxMDksMjExMCwyMTExLDIxMTIsCjIxMTMsMjExNCwyMTE1LDIxMTYsMjExNywgODA0LDIxMTgsMjExOSwxMjMwLDEyMzEsIDgwNSwxNDU2LCA0MDUsMTEzNiwyMTIwLDIxMjEsCjIxMjIsMjEyMywyMTI0LCA3MjAsIDcwMSwxMjk3LCA5OTIsMTQ1NywgOTI3LDEwMDQsMjEyNSwyMTI2LDIxMjcsMjEyOCwyMTI5LDIxMzAsCiAgMjIsIDQxNywyMTMxLCAzMDMsMjEzMiwgMzg1LDIxMzMsIDk3MSwgNTIwLCA1MTMsMjEzNCwxMTc0LCAgNzMsMTA5NiwgMjMxLCAyNzQsCiA5NjIsMTQ1OCwgNjczLDIxMzUsMTQ1OSwyMTM2LCAxNTIsMTEzNywyMTM3LDIxMzgsMjEzOSwyMTQwLDEwMDUsMTEzOCwxNDYwLDExMzksCjIxNDEsMjE0MiwyMTQzLDIxNDQsICAxMSwgMzc0LCA4NDQsMjE0NSwgMTU0LDEyMzIsICA0NiwxNDYxLDIxNDYsIDgzOCwgODMwLCA3MjEsCjEyMzMsIDEwNiwyMTQ3LCAgOTAsIDQyOCwgNDYyLCA1NzgsIDU2NiwxMTc1LCAzNTIsMjE0OCwyMTQ5LCA1MzgsMTIzNCwgMTI0LDEyOTgsCjIxNTAsMTQ2MiwgNzYxLCA1NjUsMjE1MSwgNjg2LDIxNTIsIDY0OSwyMTUzLCAgNzIsIDE3MywyMTU0LCA0NjAsIDQxNSwyMTU1LDE0NjMsCjIxNTYsMTIzNSwgMzA1LDIxNTcsMjE1OCwyMTU5LDIxNjAsMjE2MSwyMTYyLCA1NzksMjE2MywyMTY0LDIxNjUsMjE2NiwyMTY3LCA3NDcsCjIxNjgsMjE2OSwyMTcwLDIxNzEsMTQ2NCwgNjY5LDIxNzIsMjE3MywyMTc0LDIxNzUsMjE3NiwxNDY1LDIxNzcsICAyMywgNTMwLCAyODUsCjIxNzgsIDMzNSwgNzI5LDIxNzksIDM5NywyMTgwLDIxODEsMjE4MiwxMDMwLDIxODMsMjE4NCwgNjk4LDIxODUsMjE4NiwgMzI1LDIxODcsCjIxODgsIDM2OSwyMTg5LCA3OTksMTA5NywxMDE1LCAzNDgsMjE5MCwxMDY5LCA2ODAsMjE5MSwgODUxLDE0NjYsMjE5MiwyMTkzLCAgMTAsCjIxOTQsIDYxMywgNDI0LDIxOTUsIDk3OSwgMTA4LCA0NDksIDU4OSwgIDI3LCAxNzIsICA4MSwxMDMxLCAgODAsIDc3NCwgMjgxLCAzNTAsCjEwMzIsIDUyNSwgMzAxLCA1ODIsMTE3NiwyMTk2LCA2NzQsMTA0NSwyMTk3LDIxOTgsMTQ2NywgNzMwLCA3NjIsMjE5OSwyMjAwLDIyMDEsCjIyMDIsMTQ2OCwyMjAzLCA5OTMsMjIwNCwyMjA1LCAyNjYsMTA3MCwgOTYzLDExNDAsMjIwNiwyMjA3LDIyMDgsIDY2NCwxMDk4LCA5NzIsCjIyMDksMjIxMCwyMjExLDExNzcsMTQ2OSwxNDcwLCA4NzEsMjIxMiwyMjEzLDIyMTQsMjIxNSwyMjE2LDE0NzEsMjIxNywyMjE4LDIyMTksCjIyMjAsMjIyMSwyMjIyLDIyMjMsMjIyNCwyMjI1LDIyMjYsMjIyNywxNDcyLDEyMzYsMjIyOCwyMjI5LDIyMzAsMjIzMSwyMjMyLDIyMzMsCjIyMzQsMjIzNSwxMjk5LDIyMzYsMjIzNywgMjAwLDIyMzgsIDQ3NywgMzczLDIyMzksMjI0MCwgNzMxLCA4MjUsIDc3NywyMjQxLDIyNDIsCjIyNDMsIDUyMSwgNDg2LCA1NDgsMjI0NCwyMjQ1LDIyNDYsMTQ3MywxMzAwLCAgNTMsIDU0OSwgMTM3LCA4NzUsICA3NiwgMTU4LDIyNDcsCjEzMDEsMTQ3NCwgNDY5LCAzOTYsMTAxNiwgMjc4LCA3MTIsMjI0OCwgMzIxLCA0NDIsIDUwMywgNzY3LCA3NDQsIDk0MSwxMjM3LDExNzgsCjE0NzUsMjI0OSwgIDgyLCAxNzgsMTE0MSwxMTc5LCA5NzMsMjI1MCwxMzAyLDIyNTEsIDI5NywyMjUyLDIyNTMsIDU3MCwyMjU0LDIyNTUsCjIyNTYsICAxOCwgNDUwLCAyMDYsMjI1NywgMjkwLCAyOTIsMTE0MiwyMjU4LCA1MTEsIDE2MiwgIDk5LCAzNDYsIDE2NCwgNzM1LDIyNTksCjE0NzYsMTQ3NywgICA0LCA1NTQsIDM0MywgNzk4LDEwOTksMjI2MCwxMTAwLDIyNjEsICA0MywgMTcxLDEzMDMsIDEzOSwgMjE1LDIyNjIsCjIyNjMsIDcxNywgNzc1LDIyNjQsMTAzMywgMzIyLCAyMTYsMjI2NSwgODMxLDIyNjYsIDE0OSwyMjY3LDEzMDQsMjI2OCwyMjY5LCA3MDIsCjEyMzgsIDEzNSwgODQ1LCAzNDcsIDMwOSwyMjcwLCA0ODQsMjI3MSwgODc4LCA2NTUsIDIzOCwxMDA2LDE0NzgsMjI3MiwgIDY3LDIyNzMsCiAyOTUsMjI3NCwyMjc1LCA0NjEsMjI3NiwgNDc4LCA5NDIsIDQxMiwyMjc3LDEwMzQsMjI3OCwyMjc5LDIyODAsIDI2NSwyMjgxLCA1NDEsCjIyODIsMjI4MywyMjg0LDIyODUsMjI4NiwgIDcwLCA4NTIsMTA3MSwyMjg3LDIyODgsMjI4OSwyMjkwLCAgMjEsICA1NiwgNTA5LCAxMTcsCiA0MzIsMjI5MSwyMjkyLCAzMzEsIDk4MCwgNTUyLDExMDEsIDE0OCwgMjg0LCAxMDUsIDM5MywxMTgwLDEyMzksIDc1NSwyMjkzLCAxODcsCjIyOTQsMTA0NiwxNDc5LDIyOTUsIDM0MCwyMjk2LCAgNjMsMTA0NywgMjMwLDIyOTcsMjI5OCwxMzA1LCA3NjMsMTMwNiwgMTAxLCA4MDAsCiA4MDgsIDQ5NCwyMjk5LDIzMDAsMjMwMSwgOTAzLDIzMDIsICAzNywxMDcyLCAgMTQsICAgNSwyMzAzLCAgNzksIDY3NSwyMzA0LCAzMTIsCjIzMDUsMjMwNiwyMzA3LDIzMDgsMjMwOSwxNDgwLCAgIDYsMTMwNywyMzEwLDIzMTEsMjMxMiwgICAxLCA0NzAsICAzNSwgIDI0LCAyMjksCjIzMTMsIDY5NSwgMjEwLCAgODYsIDc3OCwgIDE1LCA3ODQsIDU5MiwgNzc5LCAgMzIsICA3NywgODU1LCA5NjQsMjMxNCwgMjU5LDIzMTUsCiA1MDEsIDM4MCwyMzE2LDIzMTcsICA4MywgOTgxLCAxNTMsIDY4OSwxMzA4LDE0ODEsMTQ4MiwxNDgzLDIzMTgsMjMxOSwgNzE2LDE0ODQsCjIzMjAsMjMyMSwyMzIyLDIzMjMsMjMyNCwyMzI1LDE0ODUsMjMyNiwyMzI3LCAxMjgsICA1NywgIDY4LCAyNjEsMTA0OCwgMjExLCAxNzAsCjEyNDAsICAzMSwyMzI4LCAgNTEsIDQzNSwgNzQyLDIzMjksMjMzMCwyMzMxLCA2MzUsMjMzMiwgMjY0LCA0NTYsMjMzMywyMzM0LDIzMzUsCiA0MjUsMjMzNiwxNDg2LCAxNDMsIDUwNywgMjYzLCA5NDMsMjMzNywgMzYzLCA5MjAsMTQ4NywgMjU2LDE0ODgsMTEwMiwgMjQzLCA2MDEsCjE0ODksMjMzOCwyMzM5LDIzNDAsMjM0MSwyMzQyLDIzNDMsMjM0NCwgODYxLDIzNDUsMjM0NiwyMzQ3LDIzNDgsMjM0OSwyMzUwLCAzOTUsCjIzNTEsMTQ5MCwxNDkxLCAgNjIsIDUzNSwgMTY2LCAyMjUsMjM1MiwyMzUzLCA2NjgsIDQxOSwxMjQxLCAxMzgsIDYwNCwgOTI4LDIzNTQsCjExODEsMjM1NSwxNDkyLDE0OTMsMjM1NiwyMzU3LDIzNTgsMTE0MywyMzU5LCA2OTYsMjM2MCwgMzg3LCAzMDcsMTMwOSwgNjgyLCA0NzYsCjIzNjEsMjM2MiwgMzMyLCAgMTIsIDIyMiwgMTU2LDIzNjMsIDIzMiwyMzY0LCA2NDEsIDI3NiwgNjU2LCA1MTcsMTQ5NCwxNDk1LDEwMzUsCiA0MTYsIDczNiwxNDk2LDIzNjUsMTAxNywgNTg2LDIzNjYsMjM2NywyMzY4LDE0OTcsMjM2OSwgMjQyLDIzNzAsMjM3MSwyMzcyLDE0OTgsCjIzNzMsIDk2NSwgNzEzLDIzNzQsMjM3NSwyMzc2LDIzNzcsIDc0MCwgOTgyLDE0OTksIDk0NCwxNTAwLDEwMDcsMjM3OCwyMzc5LDEzMTAsCjE1MDEsMjM4MCwyMzgxLDIzODIsIDc4NSwgMzI5LDIzODMsMjM4NCwxNTAyLDIzODUsMjM4NiwyMzg3LCA5MzIsMjM4OCwxNTAzLDIzODksCjIzOTAsMjM5MSwyMzkyLDEyNDIsMjM5MywyMzk0LDIzOTUsMjM5NiwyMzk3LCA5OTQsIDk1MCwyMzk4LDIzOTksMjQwMCwyNDAxLDE1MDQsCjEzMTEsMjQwMiwyNDAzLDI0MDQsMjQwNSwxMDQ5LCA3NDksMjQwNiwyNDA3LCA4NTMsIDcxOCwxMTQ0LDEzMTIsMjQwOCwxMTgyLDE1MDUsCjI0MDksMjQxMCwgMjU1LCA1MTYsIDQ3OSwgNTY0LCA1NTAsIDIxNCwxNTA2LDE1MDcsMTMxMywgNDEzLCAyMzksIDQ0NCwgMzM5LDExNDUsCjEwMzYsMTUwOCwxNTA5LDEzMTQsMTAzNywxNTEwLDEzMTUsMjQxMSwxNTExLDI0MTIsMjQxMywyNDE0LCAxNzYsIDcwMywgNDk3LCA2MjQsCiA1OTMsIDkyMSwgMzAyLDI0MTUsIDM0MSwgMTY1LDExMDMsMTUxMiwyNDE2LDE1MTMsMjQxNywyNDE4LDI0MTksIDM3NiwyNDIwLCA3MDAsCjI0MjEsMjQyMiwyNDIzLCAyNTgsIDc2OCwxMzE2LDI0MjQsMTE4MywyNDI1LCA5OTUsIDYwOCwyNDI2LDI0MjcsMjQyOCwyNDI5LCAyMjEsCjI0MzAsMjQzMSwyNDMyLDI0MzMsMjQzNCwyNDM1LDI0MzYsMjQzNywgMTk1LCAzMjMsIDcyNiwgMTg4LCA4OTcsIDk4MywxMzE3LCAzNzcsCiA2NDQsMTA1MCwgODc5LDI0MzgsIDQ1MiwyNDM5LDI0NDAsMjQ0MSwyNDQyLDI0NDMsMjQ0NCwgOTE0LDI0NDUsMjQ0NiwyNDQ3LDI0NDgsCiA5MTUsIDQ4OSwyNDQ5LDE1MTQsMTE4NCwyNDUwLDI0NTEsIDUxNSwgIDY0LCA0MjcsIDQ5NSwyNDUyLCA1ODMsMjQ1MywgNDgzLCA0ODUsCjEwMzgsIDU2MiwgMjEzLDE1MTUsIDc0OCwgNjY2LDI0NTQsMjQ1NSwyNDU2LDI0NTcsIDMzNCwyNDU4LCA3ODAsIDk5NiwxMDA4LCA3MDUsCjEyNDMsMjQ1OSwyNDYwLDI0NjEsMjQ2MiwyNDYzLCAxMTQsMjQ2NCwgNDkzLDExNDYsIDM2NiwgMTYzLDE1MTYsIDk2MSwxMTA0LDI0NjUsCiAyOTEsMjQ2NiwxMzE4LDExMDUsMjQ2NywxNTE3LCAzNjUsMjQ2OCwgMzU1LCA5NTEsMTI0NCwyNDY5LDEzMTksMjQ3MCwgNjMxLDI0NzEsCjI0NzIsIDIxOCwxMzIwLCAzNjQsIDMyMCwgNzU2LDE1MTgsMTUxOSwxMzIxLDE1MjAsMTMyMiwyNDczLDI0NzQsMjQ3NSwyNDc2LCA5OTcsCjI0NzcsMjQ3OCwyNDc5LDI0ODAsIDY2NSwxMTg1LDI0ODEsIDkxNiwxNTIxLDI0ODIsMjQ4MywyNDg0LCA1ODQsIDY4NCwyNDg1LDI0ODYsCiA3OTcsMjQ4NywxMDUxLDExODYsMjQ4OCwyNDg5LDI0OTAsMTUyMiwyNDkxLDI0OTIsIDM3MCwyNDkzLDEwMzksMTE4NywgIDY1LDI0OTQsCiA0MzQsIDIwNSwgNDYzLDExODgsMjQ5NSwgMTI1LCA4MTIsIDM5MSwgNDAyLCA4MjYsIDY5OSwgMjg2LCAzOTgsIDE1NSwgNzgxLCA3NzEsCiA1ODUsMjQ5NiwgNTkwLCA1MDUsMTA3MywyNDk3LCA1OTksIDI0NCwgMjE5LCA5MTcsMTAxOCwgOTUyLCA2NDYsMTUyMywyNDk4LDEzMjMsCjI0OTksMjUwMCwgIDQ5LCA5ODQsIDM1NCwgNzQxLDI1MDEsIDYyNSwyNTAyLDEzMjQsMjUwMywxMDE5LCAxOTAsIDM1NywgNzU3LCA0OTEsCiAgOTUsIDc4MiwgODY4LDI1MDQsMjUwNSwyNTA2LDI1MDcsMjUwOCwyNTA5LCAxMzQsMTUyNCwxMDc0LCA0MjIsMTUyNSwgODk4LDI1MTAsCiAxNjEsMjUxMSwyNTEyLDI1MTMsMjUxNCwgNzY5LDI1MTUsMTUyNiwyNTE2LDI1MTcsIDQxMSwxMzI1LDI1MTgsIDQ3MiwxNTI3LDI1MTksCjI1MjAsMjUyMSwyNTIyLDI1MjMsMjUyNCwgOTg1LDI1MjUsMjUyNiwyNTI3LDI1MjgsMjUyOSwyNTMwLCA3NjQsMjUzMSwxMjQ1LDI1MzIsCjI1MzMsICAyNSwgMjA0LCAzMTEsMjUzNCwgNDk2LDI1MzUsMTA1MiwyNTM2LDI1MzcsMjUzOCwyNTM5LDI1NDAsMjU0MSwyNTQyLCAxOTksCiA3MDQsIDUwNCwgNDY4LCA3NTgsIDY1NywxNTI4LCAxOTYsICA0NCwgODM5LDEyNDYsIDI3MiwgNzUwLDI1NDMsIDc2NSwgODYyLDI1NDQsCjI1NDUsMTMyNiwyNTQ2LCAxMzIsIDYxNSwgOTMzLDI1NDcsIDczMiwyNTQ4LDI1NDksMjU1MCwxMTg5LDE1MjksMjU1MSwgMjgzLDEyNDcsCjEwNTMsIDYwNywgOTI5LDI1NTIsMjU1MywyNTU0LCA5MzAsIDE4MywgODcyLCA2MTYsMTA0MCwxMTQ3LDI1NTUsMTE0OCwxMDIwLCA0NDEsCiAyNDksMTA3NSwyNTU2LDI1NTcsMjU1OCwgNDY2LCA3NDMsMjU1OSwyNTYwLDI1NjEsICA5MiwgNTE0LCA0MjYsIDQyMCwgNTI2LDI1NjIsCjI1NjMsMjU2NCwyNTY1LDI1NjYsMjU2NywyNTY4LCAxODUsMjU2OSwyNTcwLDI1NzEsMjU3MiwgNzc2LDE1MzAsIDY1OCwyNTczLCAzNjIsCjI1NzQsIDM2MSwgOTIyLDEwNzYsIDc5MywyNTc1LDI1NzYsMjU3NywyNTc4LDI1NzksMjU4MCwxNTMxLCAyNTEsMjU4MSwyNTgyLDI1ODMsCjI1ODQsMTUzMiwgIDU0LCA2MTIsIDIzNywxMzI3LDI1ODUsMjU4NiwgMjc1LCA0MDgsIDY0NywgMTExLDI1ODcsMTUzMywxMTA2LCA0NjUsCiAgIDMsIDQ1OCwgICA5LCAgMzgsMjU4OCwgMTA3LCAxMTAsIDg5MCwgMjA5LCAgMjYsIDczNywgNDk4LDI1ODksMTUzNCwyNTkwLCA0MzEsCiAyMDIsICA4OCwxNTM1LCAzNTYsIDI4NywxMTA3LCA2NjAsMTE0OSwyNTkxLCAzODEsMTUzNiwgOTg2LDExNTAsIDQ0NSwxMjQ4LDExNTEsCiA5NzQsMjU5MiwyNTkzLCA4NDYsMjU5NCwgNDQ2LCA5NTMsIDE4NCwxMjQ5LDEyNTAsIDcyNywyNTk1LCA5MjMsIDE5MywgODgzLDI1OTYsCjI1OTcsMjU5OCwgMTAyLCAzMjQsIDUzOSwgODE3LDI1OTksIDQyMSwxMDQxLDI2MDAsIDgzMiwyNjAxLCAgOTQsIDE3NSwgMTk3LCA0MDYsCjI2MDIsIDQ1OSwyNjAzLDI2MDQsMjYwNSwyNjA2LDI2MDcsIDMzMCwgNTU1LDI2MDgsMjYwOSwyNjEwLCA3MDYsMTEwOCwgMzg5LDI2MTEsCjI2MTIsMjYxMywyNjE0LCAyMzMsMjYxNSwgODMzLCA1NTgsIDkzMSwgOTU0LDEyNTEsMjYxNiwyNjE3LDE1MzcsIDU0NiwyNjE4LDI2MTksCjEwMDksMjYyMCwyNjIxLDI2MjIsMTUzOCwgNjkwLDEzMjgsMjYyMywgOTU1LDI2MjQsMTUzOSwyNjI1LDI2MjYsIDc3MiwyNjI3LDI2MjgsCjI2MjksMjYzMCwyNjMxLCA5MjQsIDY0OCwgODYzLCA2MDMsMjYzMiwyNjMzLCA5MzQsMTU0MCwgODY0LCA4NjUsMjYzNCwgNjQyLDEwNDIsCiA2NzAsMTE5MCwyNjM1LDI2MzYsMjYzNywyNjM4LCAxNjgsMjYzOSwgNjUyLCA4NzMsIDU0MiwxMDU0LDE1NDEsMjY0MCwyNjQxLDI2NDIsICAjIDUxMiwgMjU2CikKClBLAwQUAAAAAAAAACEAJgWX+NQGAADUBgAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tycHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgRVVDS1JfU01fTU9ERUwKCgpjbGFzcyBFVUNLUlByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNLUlByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ0tSX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLUtSIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiS29yZWFuIgpQSwMEFAAAAAAAAAAhAMzbSdWFewAAhXsAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d2ZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgRVVDVFcgZnJlcXVlbmN5IHRhYmxlCiMgQ29udmVydGVkIGZyb20gYmlnNSB3b3JrCiMgYnkgVGFpd2FuJ3MgTWFuZGFyaW4gUHJvbW90aW9uIENvdW5jaWwKIyA8aHR0cDojd3d3LmVkdS50dzo4MS9tYW5kci8+CgojIDEyOCAgLS0+IDAuNDIyNjEKIyAyNTYgIC0tPiAwLjU3ODUxCiMgNTEyICAtLT4gMC43NDg1MQojIDEwMjQgLS0+IDAuODkzODQKIyAyMDQ4IC0tPiAwLjk3NTgzCiMKIyBJZGVhIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuNzQ4NTEvKDEtMC43NDg1MSkgPTIuOTgKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMi8oNTQwMS01MTIpPTAuMTA1CiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbyBhYm91dCAyNSUgb2YgSWRlYWwgb25lLCBzdGlsbCBtdWNoIGhpZ2hlciB0aGFuIFJEUgoKRVVDVFdfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAwLjc1CgojIENoYXIgdG8gRnJlcU9yZGVyIHRhYmxlICwKRVVDVFdfVEFCTEVfU0laRSA9IDUzNzYKCkVVQ1RXX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICAgMSwxODAwLDE1MDYsIDI1NSwxNDMxLCAxOTgsICAgOSwgIDgyLCAgIDYsNzMxMCwgMTc3LCAyMDIsMzYxNSwxMjU2LDI4MDgsIDExMCwgICMgMjc0MgozNzM1LCAgMzMsMzI0MSwgMjYxLCAgNzYsICA0NCwyMTEzLCAgMTYsMjkzMSwyMTg0LDExNzYsIDY1OSwzODY4LCAgMjYsMzQwNCwyNjQzLCAgIyAyNzU4CjExOTgsMzg2OSwzMzEzLDQwNjAsIDQxMCwyMjExLCAzMDIsIDU5MCwgMzYxLDE5NjMsICAgOCwgMjA0LCAgNTgsNDI5Niw3MzExLDE5MzEsICAjIDI3NzQKICA2Myw3MzEyLDczMTMsIDMxNywxNjE0LCAgNzUsIDIyMiwgMTU5LDQwNjEsMjQxMiwxNDgwLDczMTQsMzUwMCwzMDY4LCAyMjQsMjgwOSwgICMgMjc5MAozNjE2LCAgIDMsICAxMCwzODcwLDE0NzEsICAyOSwyNzc0LDExMzUsMjg1MiwxOTM5LCA4NzMsIDEzMCwzMjQyLDExMjMsIDMxMiw3MzE1LCAgIyAyODA2CjQyOTcsMjA1MSwgNTA3LCAyNTIsIDY4Miw3MzE2LCAxNDIsMTkxNCwgMTI0LCAyMDYsMjkzMiwgIDM0LDM1MDEsMzE3MywgIDY0LCA2MDQsICAjIDI4MjIKNzMxNywyNDk0LDE5NzYsMTk3NywgMTU1LDE5OTAsIDY0NSwgNjQxLDE2MDYsNzMxOCwzNDA1LCAzMzcsICA3MiwgNDA2LDczMTksICA4MCwgICMgMjgzOAogNjMwLCAyMzgsMzE3NCwxNTA5LCAyNjMsIDkzOSwxMDkyLDI2NDQsIDc1NiwxNDQwLDEwOTQsMzQwNiwgNDQ5LCAgNjksMjk2OSwgNTkxLCAgIyAyODU0CiAxNzksMjA5NSwgNDcxLCAxMTUsMjAzNCwxODQzLCAgNjAsICA1MCwyOTcwLCAxMzQsIDgwNiwxODY4LCA3MzQsMjAzNSwzNDA3LCAxODAsICAjIDI4NzAKIDk5NSwxNjA3LCAxNTYsIDUzNywyODkzLCA2ODgsNzMyMCwgMzE5LDEzMDUsIDc3OSwyMTQ0LCA1MTQsMjM3NCwgMjk4LDQyOTgsIDM1OSwgICMgMjg4NgoyNDk1LCAgOTAsMjcwNywxMzM4LCA2NjMsICAxMSwgOTA2LDEwOTksMjU0NSwgIDIwLDI0MzYsIDE4MiwgNTMyLDE3MTYsNzMyMSwgNzMyLCAgIyAyOTAyCjEzNzYsNDA2MiwxMzExLDE0MjAsMzE3NSwgIDI1LDIzMTIsMTA1NiwgMTEzLCAzOTksIDM4MiwxOTQ5LCAyNDIsMzQwOCwyNDY3LCA1MjksICAjIDI5MTgKMzI0MywgNDc1LDE0NDcsMzYxNyw3MzIyLCAxMTcsICAyMSwgNjU2LCA4MTAsMTI5NywyMjk1LDIzMjksMzUwMiw3MzIzLCAxMjYsNDA2MywgICMgMjkzNAogNzA2LCA0NTYsIDE1MCwgNjEzLDQyOTksICA3MSwxMTE4LDIwMzYsNDA2NCwgMTQ1LDMwNjksICA4NSwgODM1LCA0ODYsMjExNCwxMjQ2LCAgIyAyOTUwCjE0MjYsIDQyOCwgNzI3LDEyODUsMTAxNSwgODAwLCAxMDYsIDYyMywgMzAzLDEyODEsNzMyNCwyMTI3LDIzNTQsIDM0NywzNzM2LCAyMjEsICAjIDI5NjYKMzUwMywzMTEwLDczMjUsMTk1NSwxMTUzLDQwNjUsICA4MywgMjk2LDExOTksMzA3MCwgMTkyLCA2MjQsICA5Myw3MzI2LCA4MjIsMTg5NywgICMgMjk4MgoyODEwLDMxMTEsIDc5NSwyMDY0LCA5OTEsMTU1NCwxNTQyLDE1OTIsICAyNywgIDQzLDI4NTMsIDg1OSwgMTM5LDE0NTYsIDg2MCw0MzAwLCAgIyAyOTk4CiA0MzcsIDcxMiwzODcxLCAxNjQsMjM5MiwzMTEyLCA2OTUsIDIxMSwzMDE3LDIwOTYsIDE5NSwzODcyLDE2MDgsMzUwNCwzNTA1LDM2MTgsICAjIDMwMTQKMzg3MywgMjM0LCA4MTEsMjk3MSwyMDk3LDM4NzQsMjIyOSwxNDQxLDM1MDYsMTYxNSwyMzc1LCA2NjgsMjA3NiwxNjM4LCAzMDUsIDIyOCwgICMgMzAzMAoxNjY0LDQzMDEsIDQ2NywgNDE1LDczMjcsIDI2MiwyMDk4LDE1OTMsIDIzOSwgMTA4LCAzMDAsIDIwMCwxMDMzLCA1MTIsMTI0NywyMDc3LCAgIyAzMDQ2CjczMjgsNzMyOSwyMTczLDMxNzYsMzYxOSwyNjczLCA1OTMsIDg0NSwxMDYyLDMyNDQsICA4OCwxNzIzLDIwMzcsMzg3NSwxOTUwLCAyMTIsICAjIDMwNjIKIDI2NiwgMTUyLCAxNDksIDQ2OCwxODk4LDQwNjYsNDMwMiwgIDc3LCAxODcsNzMzMCwzMDE4LCAgMzcsICAgNSwyOTcyLDczMzEsMzg3NiwgICMgMzA3OAo3MzMyLDczMzMsICAzOSwyNTE3LDQzMDMsMjg5NCwzMTc3LDIwNzgsICA1NSwgMTQ4LCAgNzQsNDMwNCwgNTQ1LCA0ODMsMTQ3NCwxMDI5LCAgIyAzMDk0CjE2NjUsIDIxNywxODY5LDE1MzEsMzExMywxMTA0LDI2NDUsNDA2NywgIDI0LCAxNzIsMzUwNywgOTAwLDM4NzcsMzUwOCwzNTA5LDQzMDUsICAjIDMxMTAKICAzMiwxNDA4LDI4MTEsMTMxMiwgMzI5LCA0ODcsMjM1NSwyMjQ3LDI3MDgsIDc4NCwyNjc0LCAgIDQsMzAxOSwzMzE0LDE0MjcsMTc4OCwgICMgMzEyNgogMTg4LCAxMDksIDQ5OSw3MzM0LDM2MjAsMTcxNywxNzg5LCA4ODgsMTIxNywzMDIwLDQzMDYsNzMzNSwzNTEwLDczMzYsMzMxNSwxNTIwLCAgIyAzMTQyCjM2MjEsMzg3OCwgMTk2LDEwMzQsIDc3NSw3MzM3LDczMzgsIDkyOSwxODE1LCAyNDksIDQzOSwgIDM4LDczMzksMTA2Myw3MzQwLCA3OTQsICAjIDMxNTgKMzg3OSwxNDM1LDIyOTYsICA0NiwgMTc4LDMyNDUsMjA2NSw3MzQxLDIzNzYsNzM0MiwgMjE0LDE3MDksNDMwNywgODA0LCAgMzUsIDcwNywgICMgMzE3NAogMzI0LDM2MjIsMTYwMSwyNTQ2LCAxNDAsIDQ1OSw0MDY4LDczNDMsNzM0NCwxMzY1LCA4MzksIDI3MiwgOTc4LDIyNTcsMjU3MiwzNDA5LCAgIyAzMTkwCjIxMjgsMTM2MywzNjIzLDE0MjMsIDY5NywgMTAwLDMwNzEsICA0OCwgIDcwLDEyMzEsIDQ5NSwzMTE0LDIxOTMsNzM0NSwxMjk0LDczNDYsICAjIDMyMDYKMjA3OSwgNDYyLCA1ODYsMTA0MiwzMjQ2LCA4NTMsIDI1NiwgOTg4LCAxODUsMjM3NywzNDEwLDE2OTgsIDQzNCwxMDg0LDczNDcsMzQxMSwgICMgMzIyMgogMzE0LDI2MTUsMjc3NSw0MzA4LDIzMzAsMjMzMSwgNTY5LDIyODAsIDYzNywxODE2LDI1MTgsIDc1NywxMTYyLDE4NzgsMTYxNiwzNDEyLCAgIyAzMjM4CiAyODcsMTU3NywyMTE1LCA3NjgsNDMwOSwxNjcxLDI4NTQsMzUxMSwyNTE5LDEzMjEsMzczNywgOTA5LDI0MTMsNzM0OCw0MDY5LCA5MzMsICAjIDMyNTQKMzczOCw3MzQ5LDIwNTIsMjM1NiwxMjIyLDQzMTAsIDc2NSwyNDE0LDEzMjIsIDc4Niw0MzExLDczNTAsMTkxOSwxNDYyLDE2NzcsMjg5NSwgICMgMzI3MAoxNjk5LDczNTEsNDMxMiwxNDI0LDI0MzcsMzExNSwzNjI0LDI1OTAsMzMxNiwxNzc0LDE5NDAsMzQxMywzODgwLDQwNzAsIDMwOSwxMzY5LCAgIyAzMjg2CjExMzAsMjgxMiwgMzY0LDIyMzAsMTY1MywxMjk5LDM4ODEsMzUxMiwzODgyLDM4ODMsMjY0NiwgNTI1LDEwODUsMzAyMSwgOTAyLDIwMDAsICAjIDMzMDIKMTQ3NSwgOTY0LDQzMTMsIDQyMSwxODQ0LDE0MTUsMTA1NywyMjgxLCA5NDAsMTM2NCwzMTE2LCAzNzYsNDMxNCw0MzE1LDEzODEsICAgNywgICMgMzMxOAoyNTIwLCA5ODMsMjM3OCwgMzM2LDE3MTAsMjY3NSwxODQ1LCAzMjEsMzQxNCwgNTU5LDExMzEsMzAyMiwyNzQyLDE4MDgsMTEzMiwxMzEzLCAgIyAzMzM0CiAyNjUsMTQ4MSwxODU3LDczNTIsIDM1MiwxMjAzLDI4MTMsMzI0NywgMTY3LDEwODksIDQyMCwyODE0LCA3NzYsIDc5MiwxNzI0LDM1MTMsICAjIDMzNTAKNDA3MSwyNDM4LDMyNDgsNzM1Myw0MDcyLDczNTQsIDQ0NiwgMjI5LCAzMzMsMjc0MywgOTAxLDM3MzksMTIwMCwxNTU3LDQzMTYsMjY0NywgICMgMzM2NgoxOTIwLCAzOTUsMjc0NCwyNjc2LDM3NDAsNDA3MywxODM1LCAxMjUsIDkxNiwzMTc4LDI2MTYsNDMxNyw3MzU1LDczNTYsMzc0MSw3MzU3LCAgIyAzMzgyCjczNTgsNzM1OSw0MzE4LDMxMTcsMzYyNSwxMTMzLDI1NDcsMTc1NywzNDE1LDE1MTAsMjMxMywxNDA5LDM1MTQsNzM2MCwyMTQ1LCA0MzgsICAjIDMzOTgKMjU5MSwyODk2LDIzNzksMzMxNywxMDY4LCA5NTgsMzAyMywgNDYxLCAzMTEsMjg1NSwyNjc3LDQwNzQsMTkxNSwzMTc5LDQwNzUsMTk3OCwgICMgMzQxNAogMzgzLCA3NTAsMjc0NSwyNjE3LDQwNzYsIDI3NCwgNTM5LCAzODUsMTI3OCwxNDQyLDczNjEsMTE1NCwxOTY0LCAzODQsIDU2MSwgMjEwLCAgIyAzNDMwCiAgOTgsMTI5NSwyNTQ4LDM1MTUsNzM2MiwxNzExLDI0MTUsMTQ4MiwzNDE2LDM4ODQsMjg5NywxMjU3LCAxMjksNzM2MywzNzQyLCA2NDIsICAjIDM0NDYKIDUyMywyNzc2LDI3NzcsMjY0OCw3MzY0LCAxNDEsMjIzMSwxMzMzLCAgNjgsIDE3NiwgNDQxLCA4NzYsIDkwNyw0MDc3LCA2MDMsMjU5MiwgICMgMzQ2MgogNzEwLCAxNzEsMzQxNywgNDA0LCA1NDksICAxOCwzMTE4LDIzOTMsMTQxMCwzNjI2LDE2NjYsNzM2NSwzNTE2LDQzMTksMjg5OCw0MzIwLCAgIyAzNDc4CjczNjYsMjk3MywgMzY4LDczNjcsIDE0NiwgMzY2LCAgOTksIDg3MSwzNjI3LDE1NDMsIDc0OCwgODA3LDE1ODYsMTE4NSwgIDIyLDIyNTgsICAjIDM0OTQKIDM3OSwzNzQzLDMxODAsNzM2OCwzMTgxLCA1MDUsMTk0MSwyNjE4LDE5OTEsMTM4MiwyMzE0LDczNjksIDM4MCwyMzU3LCAyMTgsIDcwMiwgICMgMzUxMAoxODE3LDEyNDgsMzQxOCwzMDI0LDM1MTcsMzMxOCwzMjQ5LDczNzAsMjk3NCwzNjI4LCA5MzAsMzI1MCwzNzQ0LDczNzEsICA1OSw3MzcyLCAgIyAzNTI2CiA1ODUsIDYwMSw0MDc4LCA0OTcsMzQxOSwxMTEyLDEzMTQsNDMyMSwxODAxLDczNzMsMTIyMywxNDcyLDIxNzQsNzM3NCwgNzQ5LDE4MzYsICAjIDM1NDIKIDY5MCwxODk5LDM3NDUsMTc3MiwzODg1LDE0NzYsIDQyOSwxMDQzLDE3OTAsMjIzMiwyMTE2LCA5MTcsNDA3OSwgNDQ3LDEwODYsMTYyOSwgICMgMzU1OAo3Mzc1LCA1NTYsNzM3Niw3Mzc3LDIwMjAsMTY1NCwgODQ0LDEwOTAsIDEwNSwgNTUwLCA5NjYsMTc1OCwyODE1LDEwMDgsMTc4MiwgNjg2LCAgIyAzNTc0CjEwOTUsNzM3OCwyMjgyLCA3OTMsMTYwMiw3Mzc5LDM1MTgsMjU5Myw0MzIyLDQwODAsMjkzMywyMjk3LDQzMjMsMzc0NiwgOTgwLDI0OTYsICAjIDM1OTAKIDU0NCwgMzUzLCA1MjcsNDMyNCwgOTA4LDI2NzgsMjg5OSw3MzgwLCAzODEsMjYxOSwxOTQyLDEzNDgsNzM4MSwxMzQxLDEyNTIsIDU2MCwgICMgMzYwNgozMDcyLDczODIsMzQyMCwyODU2LDczODMsMjA1MywgOTczLCA4ODYsMjA4MCwgMTQzLDQzMjUsNzM4NCw3Mzg1LCAxNTcsMzg4NiwgNDk2LCAgIyAzNjIyCjQwODEsICA1NywgODQwLCA1NDAsMjAzOCw0MzI2LDQzMjcsMzQyMSwyMTE3LDE0NDUsIDk3MCwyMjU5LDE3NDgsMTk2NSwyMDgxLDQwODIsICAjIDM2MzgKMzExOSwxMjM0LDE3NzUsMzI1MSwyODE2LDM2MjksIDc3MywxMjA2LDIxMjksMTA2NiwyMDM5LDEzMjYsMzg4NywxNzM4LDE3MjUsNDA4MywgICMgMzY1NAogMjc5LDMxMjAsICA1MSwxNTQ0LDI1OTQsIDQyMywxNTc4LDIxMzAsMjA2NiwgMTczLDQzMjgsMTg3OSw3Mzg2LDczODcsMTU4MywgMjY0LCAgIyAzNjcwCiA2MTAsMzYzMCw0MzI5LDI0MzksIDI4MCwgMTU0LDczODgsNzM4OSw3MzkwLDE3MzksIDMzOCwxMjgyLDMwNzMsIDY5MywyODU3LDE0MTEsICAjIDM2ODYKMTA3NCwzNzQ3LDI0NDAsNzM5MSw0MzMwLDczOTIsNzM5MywxMjQwLCA5NTIsMjM5NCw3Mzk0LDI5MDAsMTUzOCwyNjc5LCA2ODUsMTQ4MywgICMgMzcwMgo0MDg0LDI0NjgsMTQzNiwgOTUzLDQwODUsMjA1NCw0MzMxLCA2NzEsMjM5NSwgIDc5LDQwODYsMjQ0MSwzMjUyLCA2MDgsIDU2NywyNjgwLCAgIyAzNzE4CjM0MjIsNDA4Nyw0MDg4LDE2OTEsIDM5MywxMjYxLDE3OTEsMjM5Niw3Mzk1LDQzMzIsNzM5Niw3Mzk3LDczOTgsNzM5OSwxMzgzLDE2NzIsICAjIDM3MzQKMzc0OCwzMTgyLDE0NjQsIDUyMiwxMTE5LCA2NjEsMTE1MCwgMjE2LCA2NzUsNDMzMywzODg4LDE0MzIsMzUxOSwgNjA5LDQzMzQsMjY4MSwgICMgMzc1MAoyMzk3LDc0MDAsNzQwMSw3NDAyLDQwODksMzAyNSwgICAwLDc0MDMsMjQ2OSwgMzE1LCAyMzEsMjQ0MiwgMzAxLDMzMTksNDMzNSwyMzgwLCAgIyAzNzY2Cjc0MDQsIDIzMyw0MDkwLDM2MzEsMTgxOCw0MzM2LDQzMzcsNzQwNSwgIDk2LDE3NzYsMTMxNSwyMDgyLDc0MDYsIDI1Nyw3NDA3LDE4MDksICAjIDM3ODIKMzYzMiwyNzA5LDExMzksMTgxOSw0MDkxLDIwMjEsMTEyNCwyMTYzLDI3NzgsMTc3NywyNjQ5LDc0MDgsMzA3NCwgMzYzLDE2NTUsMzE4MywgICMgMzc5OAo3NDA5LDI5NzUsNzQxMCw3NDExLDc0MTIsMzg4OSwxNTY3LDM4OTAsIDcxOCwgMTAzLDMxODQsIDg0OSwxNDQzLCAzNDEsMzMyMCwyOTM0LCAgIyAzODE0CjE0ODQsNzQxMywxNzEyLCAxMjcsICA2NywgMzM5LDQwOTIsMjM5OCwgNjc5LDE0MTIsIDgyMSw3NDE0LDc0MTUsIDgzNCwgNzM4LCAzNTEsICAjIDM4MzAKMjk3NiwyMTQ2LCA4NDYsIDIzNSwxNDk3LDE4ODAsIDQxOCwxOTkyLDM3NDksMjcxMCwgMTg2LDExMDAsMjE0NywyNzQ2LDM1MjAsMTU0NSwgICMgMzg0NgoxMzU1LDI5MzUsMjg1OCwxMzc3LCA1ODMsMzg5MSw0MDkzLDI1NzMsMjk3Nyw3NDE2LDEyOTgsMzYzMywxMDc4LDI1NDksMzYzNCwyMzU4LCAgIyAzODYyCiAgNzgsMzc1MCwzNzUxLCAyNjcsMTI4OSwyMDk5LDIwMDEsMTU5NCw0MDk0LCAzNDgsIDM2OSwxMjc0LDIxOTQsMjE3NSwxODM3LDQzMzgsICAjIDM4NzgKMTgyMCwyODE3LDM2MzUsMjc0NywyMjgzLDIwMDIsNDMzOSwyOTM2LDI3NDgsIDE0NCwzMzIxLCA4ODIsNDM0MCwzODkyLDI3NDksMzQyMywgICMgMzg5NAo0MzQxLDI5MDEsNzQxNyw0MDk1LDE3MjYsIDMyMCw3NDE4LDM4OTMsMzAyNiwgNzg4LDI5NzgsNzQxOSwyODE4LDE3NzMsMTMyNywyODU5LCAgIyAzOTEwCjM4OTQsMjgxOSw3NDIwLDEzMDYsNDM0MiwyMDAzLDE3MDAsMzc1MiwzNTIxLDIzNTksMjY1MCwgNzg3LDIwMjIsIDUwNiwgODI0LDM2MzYsICAjIDM5MjYKIDUzNCwgMzIzLDQzNDMsMTA0NCwzMzIyLDIwMjMsMTkwMCwgOTQ2LDM0MjQsNzQyMSwxNzc4LDE1MDAsMTY3OCw3NDIyLDE4ODEsNDM0NCwgICMgMzk0MgogMTY1LCAyNDMsNDM0NSwzNjM3LDI1MjEsIDEyMywgNjgzLDQwOTYsIDc2NCw0MzQ2LCAgMzYsMzg5NSwxNzkyLCA1ODksMjkwMiwgODE2LCAgIyAzOTU4CiA2MjYsMTY2NywzMDI3LDIyMzMsMTYzOSwxNTU1LDE2MjIsMzc1MywzODk2LDc0MjMsMzg5NywyODYwLDEzNzAsMTIyOCwxOTMyLCA4OTEsICAjIDM5NzQKMjA4MywyOTAzLCAzMDQsNDA5Nyw3NDI0LCAyOTIsMjk3OSwyNzExLDM1MjIsIDY5MSwyMTAwLDQwOTgsMTExNSw0MzQ3LCAxMTgsIDY2MiwgICMgMzk5MAo3NDI1LCA2MTEsMTE1NiwgODU0LDIzODEsMTMxNiwyODYxLCAgIDIsIDM4NiwgNTE1LDI5MDQsNzQyNiw3NDI3LDMyNTMsIDg2OCwyMjM0LCAgIyA0MDA2CjE0ODYsIDg1NSwyNjUxLCA3ODUsMjIxMiwzMDI4LDc0MjgsMTA0MCwzMTg1LDM1MjMsNzQyOSwzMTIxLCA0NDgsNzQzMCwxNTI1LDc0MzEsICAjIDQwMjIKMjE2NCw0MzQ4LDc0MzIsMzc1NCw3NDMzLDQwOTksMjgyMCwzNTI0LDMxMjIsIDUwMywgODE4LDM4OTgsMzEyMywxNTY4LCA4MTQsIDY3NiwgICMgNDAzOAoxNDQ0LCAzMDYsMTc0OSw3NDM0LDM3NTUsMTQxNiwxMDMwLCAxOTcsMTQyOCwgODA1LDI4MjEsMTUwMSw0MzQ5LDc0MzUsNzQzNiw3NDM3LCAgIyA0MDU0CjE5OTMsNzQzOCw0MzUwLDc0MzksNzQ0MCwyMTk1LCAgMTMsMjc3OSwzNjM4LDI5ODAsMzEyNCwxMjI5LDE5MTYsNzQ0MSwzNzU2LDIxMzEsICAjIDQwNzAKNzQ0Miw0MTAwLDQzNTEsMjM5OSwzNTI1LDc0NDMsMjIxMywxNTExLDE3MjcsMTEyMCw3NDQ0LDc0NDUsIDY0NiwzNzU3LDI0NDMsIDMwNywgICMgNDA4Ngo3NDQ2LDc0NDcsMTU5NSwzMTg2LDc0NDgsNzQ0OSw3NDUwLDM2MzksMTExMywxMzU2LDM4OTksMTQ2NSwyNTIyLDI1MjMsNzQ1MSwgNTE5LCAgIyA0MTAyCjc0NTIsIDEyOCwyMTMyLCAgOTIsMjI4NCwxOTc5LDc0NTMsMzkwMCwxNTEyLCAzNDIsMzEyNSwyMTk2LDc0NTQsMjc4MCwyMjE0LDE5ODAsICAjIDQxMTgKMzMyMyw3NDU1LCAyOTAsMTY1NiwxMzE3LCA3ODksIDgyNywyMzYwLDc0NTYsMzc1OCw0MzUyLCA1NjIsIDU4MSwzOTAxLDc0NTcsIDQwMSwgICMgNDEzNAo0MzUzLDIyNDgsICA5NCw0MzU0LDEzOTksMjc4MSw3NDU4LDE0NjMsMjAyNCw0MzU1LDMxODcsMTk0Myw3NDU5LCA4MjgsMTEwNSw0MTAxLCAgIyA0MTUwCjEyNjIsMTM5NCw3NDYwLDQxMDIsIDYwNSw0MzU2LDc0NjEsMTc4MywyODYyLDc0NjIsMjgyMiwgODE5LDIxMDEsIDU3OCwyMTk3LDI5MzcsICAjIDQxNjYKNzQ2MywxNTAyLCA0MzYsMzI1NCw0MTAzLDMyNTUsMjgyMywzOTAyLDI5MDUsMzQyNSwzNDI2LDc0NjQsMjcxMiwyMzE1LDc0NjUsNzQ2NiwgICMgNDE4MgoyMzMyLDIwNjcsICAyMyw0MzU3LCAxOTMsIDgyNiwzNzU5LDIxMDIsIDY5OSwxNjMwLDQxMDQsMzA3NSwgMzkwLDE3OTMsMTA2NCwzNTI2LCAgIyA0MTk4Cjc0NjcsMTU3OSwzMDc2LDMwNzcsMTQwMCw3NDY4LDQxMDUsMTgzOCwxNjQwLDI4NjMsNzQ2OSw0MzU4LDQzNTksIDEzNyw0MTA2LCA1OTgsICAjIDQyMTQKMzA3OCwxOTY2LCA3ODAsIDEwNCwgOTc0LDI5MzgsNzQ3MCwgMjc4LCA4OTksIDI1MywgNDAyLCA1NzIsIDUwNCwgNDkzLDEzMzksNzQ3MSwgICMgNDIzMAozOTAzLDEyNzUsNDM2MCwyNTc0LDI1NTAsNzQ3MiwzNjQwLDMwMjksMzA3OSwyMjQ5LCA1NjUsMTMzNCwyNzEzLCA4NjMsICA0MSw3NDczLCAgIyA0MjQ2Cjc0NzQsNDM2MSw3NDc1LDE2NTcsMjMzMywgIDE5LCA0NjMsMjc1MCw0MTA3LCA2MDYsNzQ3NiwyOTgxLDMyNTYsMTA4NywyMDg0LDEzMjMsICAjIDQyNjIKMjY1MiwyOTgyLDc0NzcsMTYzMSwxNjIzLDE3NTAsNDEwOCwyNjgyLDc0NzgsMjg2NCwgNzkxLDI3MTQsMjY1MywyMzM0LCAyMzIsMjQxNiwgICMgNDI3OAo3NDc5LDI5ODMsMTQ5OCw3NDgwLDI2NTQsMjYyMCwgNzU1LDEzNjYsMzY0MSwzMjU3LDMxMjYsMjAyNSwxNjA5LCAxMTksMTkxNywzNDI3LCAgIyA0Mjk0CiA4NjIsMTAyNiw0MTA5LDc0ODEsMzkwNCwzNzYwLDQzNjIsMzkwNSw0MzYzLDIyNjAsMTk1MSwyNDcwLDc0ODIsMTEyNSwgODE3LDQxMTAsICAjIDQzMTAKNDExMSwzOTA2LDE1MTMsMTc2NiwyMDQwLDE0ODcsNDExMiwzMDMwLDMyNTgsMjgyNCwzNzYxLDMxMjcsNzQ4Myw3NDg0LDE1MDcsNzQ4NSwgICMgNDMyNgoyNjgzLCA3MzMsICA0MCwxNjMyLDExMDYsMjg2NSwgMzQ1LDQxMTMsIDg0MSwyNTI0LCAyMzAsNDM2NCwyOTg0LDE4NDYsMzI1OSwzNDI4LCAgIyA0MzQyCjc0ODYsMTI2MywgOTg2LDM0MjksNzQ4NywgNzM1LCA4NzksIDI1NCwxMTM3LCA4NTcsIDYyMiwxMzAwLDExODAsMTM4OCwxNTYyLDM5MDcsICAjIDQzNTgKMzkwOCwyOTM5LCA5NjcsMjc1MSwyNjU1LDEzNDksIDU5MiwyMTMzLDE2OTIsMzMyNCwyOTg1LDE5OTQsNDExNCwxNjc5LDM5MDksMTkwMSwgICMgNDM3NAoyMTg1LDc0ODgsIDczOSwzNjQyLDI3MTUsMTI5NiwxMjkwLDc0ODksNDExNSwyMTk4LDIxOTksMTkyMSwxNTYzLDI1OTUsMjU1MSwxODcwLCAgIyA0MzkwCjI3NTIsMjk4Niw3NDkwLCA0MzUsNzQ5MSwgMzQzLDExMDgsIDU5NiwgIDE3LDE3NTEsNDM2NSwyMjM1LDM0MzAsMzY0Myw3NDkyLDQzNjYsICAjIDQ0MDYKIDI5NCwzNTI3LDI5NDAsMTY5MywgNDc3LCA5NzksIDI4MSwyMDQxLDM1MjgsIDY0MywyMDQyLDM2NDQsMjYyMSwyNzgyLDIyNjEsMTAzMSwgICMgNDQyMgoyMzM1LDIxMzQsMjI5OCwzNTI5LDQzNjcsIDM2NywxMjQ5LDI1NTIsNzQ5MywzNTMwLDc0OTQsNDM2OCwxMjgzLDMzMjUsMjAwNCwgMjQwLCAgIyA0NDM4CjE3NjIsMzMyNiw0MzY5LDQzNzAsIDgzNiwxMDY5LDMxMjgsIDQ3NCw3NDk1LDIxNDgsMjUyNSwgMjY4LDM1MzEsNzQ5NiwzMTg4LDE1MjEsICAjIDQ0NTQKMTI4NCw3NDk3LDE2NTgsMTU0Niw0MTE2LDc0OTgsMzUzMiwzNTMzLDc0OTksNDExNywzMzI3LDI2ODQsMTY4NSw0MTE4LCA5NjEsMTY3MywgICMgNDQ3MAoyNjIyLCAxOTAsMjAwNSwyMjAwLDM3NjIsNDM3MSw0MzcyLDc1MDAsIDU3MCwyNDk3LDM2NDUsMTQ5MCw3NTAxLDQzNzMsMjYyMywzMjYwLCAgIyA0NDg2CjE5NTYsNDM3NCwgNTg0LDE1MTQsIDM5NiwxMDQ1LDE5NDQsNzUwMiw0Mzc1LDE5NjcsMjQ0NCw3NTAzLDc1MDQsNDM3NiwzOTEwLCA2MTksICAjIDQ1MDIKNzUwNSwzMTI5LDMyNjEsIDIxNSwyMDA2LDI3ODMsMjU1MywzMTg5LDQzNzcsMzE5MCw0Mzc4LCA3NjMsNDExOSwzNzYzLDQzNzksNzUwNiwgICMgNDUxOAo3NTA3LDE5NTcsMTc2NywyOTQxLDMzMjgsMzY0NiwxMTc0LCA0NTIsMTQ3Nyw0MzgwLDMzMjksMzEzMCw3NTA4LDI4MjUsMTI1MywyMzgyLCAgIyA0NTM0CjIxODYsMTA5MSwyMjg1LDQxMjAsIDQ5Miw3NTA5LCA2MzgsMTE2OSwxODI0LDIxMzUsMTc1MiwzOTExLCA2NDgsIDkyNiwxMDIxLDEzMjQsICAjIDQ1NTAKNDM4MSwgNTIwLDQzODIsIDk5NywgODQ3LDEwMDcsIDg5Miw0MzgzLDM3NjQsMjI2MiwxODcxLDM2NDcsNzUxMCwyNDAwLDE3ODQsNDM4NCwgICMgNDU2NgoxOTUyLDI5NDIsMzA4MCwzMTkxLDE3MjgsNDEyMSwyMDQzLDM2NDgsNDM4NSwyMDA3LDE3MDEsMzEzMSwxNTUxLCAgMzAsMjI2Myw0MTIyLCAgIyA0NTgyCjc1MTEsMjAyNiw0Mzg2LDM1MzQsNzUxMiwgNTAxLDc1MTMsNDEyMywgNTk0LDM0MzEsMjE2NSwxODIxLDM1MzUsMzQzMiwzNTM2LDMxOTIsICAjIDQ1OTgKIDgyOSwyODI2LDQxMjQsNzUxNCwxNjgwLDMxMzIsMTIyNSw0MTI1LDc1MTUsMzI2Miw0Mzg3LDQxMjYsMzEzMywyMzM2LDc1MTYsNDM4OCwgICMgNDYxNAo0MTI3LDc1MTcsMzkxMiwzOTEzLDc1MTgsMTg0NywyMzgzLDI1OTYsMzMzMCw3NTE5LDQzODksIDM3NCwzOTE0LCA2NTIsNDEyOCw0MTI5LCAgIyA0NjMwCiAzNzUsMTE0MCwgNzk4LDc1MjAsNzUyMSw3NTIyLDIzNjEsNDM5MCwyMjY0LCA1NDYsMTY1OSwgMTM4LDMwMzEsMjQ0NSw0MzkxLDc1MjMsICAjIDQ2NDYKMjI1MCwgNjEyLDE4NDgsIDkxMCwgNzk2LDM3NjUsMTc0MCwxMzcxLCA4MjUsMzc2NiwzNzY3LDc1MjQsMjkwNiwyNTU0LDc1MjUsIDY5MiwgICMgNDY2MgogNDQ0LDMwMzIsMjYyNCwgODAxLDQzOTIsNDEzMCw3NTI2LDE0OTEsIDI0NCwxMDUzLDMwMzMsNDEzMSw0MTMyLCAzNDAsNzUyNywzOTE1LCAgIyA0Njc4CjEwNDEsMjk4NywgMjkzLDExNjgsICA4NywxMzU3LDc1MjgsMTUzOSwgOTU5LDc1MjksMjIzNiwgNzIxLCA2OTQsNDEzMywzNzY4LCAyMTksICAjIDQ2OTQKMTQ3OCwgNjQ0LDE0MTcsMzMzMSwyNjU2LDE0MTMsMTQwMSwxMzM1LDEzODksMzkxNiw3NTMwLDc1MzEsMjk4OCwyMzYyLDMxMzQsMTgyNSwgICMgNDcxMAogNzMwLDE1MTUsIDE4NCwyODI3LCAgNjYsNDM5Myw3NTMyLDE2NjAsMjk0MywgMjQ2LDMzMzIsIDM3OCwxNDU3LCAyMjYsMzQzMywgOTc1LCAgIyA0NzI2CjM5MTcsMjk0NCwxMjY0LDM1MzcsIDY3NCwgNjk2LDc1MzMsIDE2Myw3NTM0LDExNDEsMjQxNywyMTY2LCA3MTMsMzUzOCwzMzMzLDQzOTQsICAjIDQ3NDIKMzkxOCw3NTM1LDc1MzYsMTE4NiwgIDE1LDc1MzcsMTA3OSwxMDcwLDc1MzgsMTUyMiwzMTkzLDM1MzksIDI3NiwxMDUwLDI3MTYsIDc1OCwgICMgNDc1OAoxMTI2LCA2NTMsMjk0NSwzMjYzLDc1MzksMjMzNywgODg5LDM1NDAsMzkxOSwzMDgxLDI5ODksIDkwMywxMjUwLDQzOTUsMzkyMCwzNDM0LCAgIyA0Nzc0CjM1NDEsMTM0MiwxNjgxLDE3MTgsIDc2NiwzMjY0LCAyODYsICA4OSwyOTQ2LDM2NDksNzU0MCwxNzEzLDc1NDEsMjU5NywzMzM0LDI5OTAsICAjIDQ3OTAKNzU0MiwyOTQ3LDIyMTUsMzE5NCwyODY2LDc1NDMsNDM5NiwyNDk4LDI1MjYsIDE4MSwgMzg3LDEwNzUsMzkyMSwgNzMxLDIxODcsMzMzNSwgICMgNDgwNgo3NTQ0LDMyNjUsIDMxMCwgMzEzLDM0MzUsMjI5OSwgNzcwLDQxMzQsICA1NCwzMDM0LCAxODksNDM5NywzMDgyLDM3NjksMzkyMiw3NTQ1LCAgIyA0ODIyCjEyMzAsMTYxNywxODQ5LCAzNTUsMzU0Miw0MTM1LDQzOTgsMzMzNiwgMTExLDQxMzYsMzY1MCwxMzUwLDMxMzUsMzQzNiwzMDM1LDQxMzcsICAjIDQ4MzgKMjE0OSwzMjY2LDM1NDMsNzU0NiwyNzg0LDM5MjMsMzkyNCwyOTkxLCA3MjIsMjAwOCw3NTQ3LDEwNzEsIDI0NywxMjA3LDIzMzgsMjQ3MSwgICMgNDg1NAoxMzc4LDQzOTksMjAwOSwgODY0LDE0MzcsMTIxNCw0NDAwLCAzNzMsMzc3MCwxMTQyLDIyMTYsIDY2Nyw0NDAxLCA0NDIsMjc1MywyNTU1LCAgIyA0ODcwCjM3NzEsMzkyNSwxOTY4LDQxMzgsMzI2NywxODM5LCA4MzcsIDE3MCwxMTA3LCA5MzQsMTMzNiwxODgyLDc1NDgsNzU0OSwyMTE4LDQxMzksICAjIDQ4ODYKMjgyOCwgNzQzLDE1NjksNzU1MCw0NDAyLDQxNDAsIDU4MiwyMzg0LDE0MTgsMzQzNyw3NTUxLDE4MDIsNzU1MiwgMzU3LDEzOTUsMTcyOSwgICMgNDkwMgozNjUxLDMyNjgsMjQxOCwxNTY0LDIyMzcsNzU1MywzMDgzLDM3NzIsMTYzMyw0NDAzLDExMTQsMjA4NSw0MTQxLDE1MzIsNzU1NCwgNDgyLCAgIyA0OTE4CjI0NDYsNDQwNCw3NTU1LDc1NTYsMTQ5MiwgODMzLDE0NjYsNzU1NywyNzE3LDM1NDQsMTY0MSwyODI5LDc1NTgsMTUyNiwxMjcyLDM2NTIsICAjIDQ5MzQKNDE0MiwxNjg2LDE3OTQsIDQxNiwyNTU2LDE5MDIsMTk1MywxODAzLDc1NTksMzc3MywyNzg1LDM3NzQsMTE1OSwyMzE2LDc1NjAsMjg2NywgICMgNDk1MAo0NDA1LDE2MTAsMTU4NCwzMDM2LDI0MTksMjc1NCwgNDQzLDMyNjksMTE2MywzMTM2LDc1NjEsNzU2MiwzOTI2LDc1NjMsNDE0MywyNDk5LCAgIyA0OTY2CjMwMzcsNDQwNiwzOTI3LDMxMzcsMjEwMywxNjQ3LDM1NDUsMjAxMCwxODcyLDQxNDQsNzU2NCw0MTQ1LCA0MzEsMzQzOCw3NTY1LCAyNTAsICAjIDQ5ODIKICA5NywgIDgxLDQxNDYsNzU2NiwxNjQ4LDE4NTAsMTU1OCwgMTYwLCA4NDgsNzU2NywgODY2LCA3NDAsMTY5NCw3NTY4LDIyMDEsMjgzMCwgICMgNDk5OAozMTk1LDQxNDcsNDQwNywzNjUzLDE2ODcsIDk1MCwyNDcyLCA0MjYsIDQ2OSwzMTk2LDM2NTQsMzY1NSwzOTI4LDc1NjksNzU3MCwxMTg4LCAgIyA1MDE0CiA0MjQsMTk5NSwgODYxLDM1NDYsNDE0OCwzNzc1LDIyMDIsMjY4NSwgMTY4LDEyMzUsMzU0Nyw0MTQ5LDc1NzEsMjA4NiwxNjc0LDQ0MDgsICAjIDUwMzAKMzMzNywzMjcwLCAyMjAsMjU1NywxMDA5LDc1NzIsMzc3NiwgNjcwLDI5OTIsIDMzMiwxMjA4LCA3MTcsNzU3Myw3NTc0LDM1NDgsMjQ0NywgICMgNTA0NgozOTI5LDMzMzgsNzU3NSwgNTEzLDc1NzYsMTIwOSwyODY4LDMzMzksMzEzOCw0NDA5LDEwODAsNzU3Nyw3NTc4LDc1NzksNzU4MCwyNTI3LCAgIyA1MDYyCjM2NTYsMzU0OSwgODE1LDE1ODcsMzkzMCwzOTMxLDc1ODEsMzU1MCwzNDM5LDM3NzcsMTI1NCw0NDEwLDEzMjgsMzAzOCwxMzkwLDM5MzIsICAjIDUwNzgKMTc0MSwzOTMzLDM3NzgsMzkzNCw3NTgyLCAyMzYsMzc3OSwyNDQ4LDMyNzEsNzU4Myw3NTg0LDM2NTcsMzc4MCwxMjczLDM3ODEsNDQxMSwgICMgNTA5NAo3NTg1LCAzMDgsNzU4Niw0NDEyLCAyNDUsNDQxMywxODUxLDI0NzMsMTMwNywyNTc1LCA0MzAsIDcxNSwyMTM2LDI0NDksNzU4NywgMjcwLCAgIyA1MTEwCiAxOTksMjg2OSwzOTM1LDc1ODgsMzU1MSwyNzE4LDE3NTMsIDc2MSwxNzU0LCA3MjUsMTY2MSwxODQwLDQ0MTQsMzQ0MCwzNjU4LDc1ODksICAjIDUxMjYKNzU5MCwgNTg3LCAgMTQsMzI3MiwgMjI3LDI1OTgsIDMyNiwgNDgwLDIyNjUsIDk0MywyNzU1LDM1NTIsIDI5MSwgNjUwLDE4ODMsNzU5MSwgICMgNTE0MgoxNzAyLDEyMjYsIDEwMiwxNTQ3LCAgNjIsMzQ0MSwgOTA0LDQ0MTUsMzQ0MiwxMTY0LDQxNTAsNzU5Miw3NTkzLDEyMjQsMTU0OCwyNzU2LCAgIyA1MTU4CiAzOTEsIDQ5OCwxNDkzLDc1OTQsMTM4NiwxNDE5LDc1OTUsMjA1NSwxMTc3LDQ0MTYsIDgxMywgODgwLDEwODEsMjM2MywgNTY2LDExNDUsICAjIDUxNzQKNDQxNywyMjg2LDEwMDEsMTAzNSwyNTU4LDI1OTksMjIzOCwgMzk0LDEyODYsNzU5Niw3NTk3LDIwNjgsNzU5OCwgIDg2LDE0OTQsMTczMCwgICMgNTE5MAozOTM2LCA0OTEsMTU4OCwgNzQ1LCA4OTcsMjk0OCwgODQzLDMzNDAsMzkzNywyNzU3LDI4NzAsMzI3MywxNzY4LCA5OTgsMjIxNywyMDY5LCAgIyA1MjA2CiAzOTcsMTgyNiwxMTk1LDE5NjksMzY1OSwyOTkzLDMzNDEsIDI4NCw3NTk5LDM3ODIsMjUwMCwyMTM3LDIxMTksMTkwMyw3NjAwLDM5MzgsICAjIDUyMjIKMjE1MCwzOTM5LDQxNTEsMTAzNiwzNDQzLDE5MDQsIDExNCwyNTU5LDQxNTIsIDIwOSwxNTI3LDc2MDEsNzYwMiwyOTQ5LDI4MzEsMjYyNSwgICMgNTIzOAoyMzg1LDI3MTksMzEzOSwgODEyLDI1NjAsNzYwMywzMjc0LDc2MDQsMTU1OSwgNzM3LDE4ODQsMzY2MCwxMjEwLCA4ODUsICAyOCwyNjg2LCAgIyA1MjU0CjM1NTMsMzc4Myw3NjA1LDQxNTMsMTAwNCwxNzc5LDQ0MTgsNzYwNiwgMzQ2LDE5ODEsMjIxOCwyNjg3LDQ0MTksMzc4NCwxNzQyLCA3OTcsICAjIDUyNzAKMTY0MiwzOTQwLDE5MzMsMTA3MiwxMzg0LDIxNTEsIDg5NiwzOTQxLDMyNzUsMzY2MSwzMTk3LDI4NzEsMzU1NCw3NjA3LDI1NjEsMTk1OCwgICMgNTI4Ngo0NDIwLDI0NTAsMTc4NSw3NjA4LDc2MDksNzYxMCwzOTQyLDQxNTQsMTAwNSwxMzA4LDM2NjIsNDE1NSwyNzIwLDQ0MjEsNDQyMiwxNTI4LCAgIyA1MzAyCjI2MDAsIDE2MSwxMTc4LDQxNTYsMTk4MiwgOTg3LDQ0MjMsMTEwMSw0MTU3LCA2MzEsMzk0MywxMTU3LDMxOTgsMjQyMCwxMzQzLDEyNDEsICAjIDUzMTgKMTAxNiwyMjM5LDI1NjIsIDM3MiwgODc3LDIzMzksMjUwMSwxMTYwLCA1NTUsMTkzNCwgOTExLDM5NDQsNzYxMSwgNDY2LDExNzAsIDE2OSwgICMgNTMzNAoxMDUxLDI5MDcsMjY4OCwzNjYzLDI0NzQsMjk5NCwxMTgyLDIwMTEsMjU2MywxMjUxLDI2MjYsNzYxMiwgOTkyLDIzNDAsMzQ0NCwxNTQwLCAgIyA1MzUwCjI3MjEsMTIwMSwyMDcwLDI0MDEsMTk5NiwyNDc1LDc2MTMsNDQyNCwgNTI4LDE5MjIsMjE4OCwxNTAzLDE4NzMsMTU3MCwyMzY0LDMzNDIsICAjIDUzNjYKMzI3Niw3NjE0LCA1NTcsMTA3Myw3NjE1LDE4MjcsMzQ0NSwyMDg3LDIyNjYsMzE0MCwzMDM5LDMwODQsIDc2NywzMDg1LDI3ODYsNDQyNSwgICMgNTM4MgoxMDA2LDQxNTgsNDQyNiwyMzQxLDEyNjcsMjE3NiwzNjY0LDMxOTksIDc3OCwzOTQ1LDMyMDAsMjcyMiwxNTk3LDI2NTcsNzYxNiw0NDI3LCAgIyA1Mzk4Cjc2MTcsMzQ0Niw3NjE4LDc2MTksNzYyMCwzMjc3LDI2ODksMTQzMywzMjc4LCAxMzEsICA5NSwxNTA0LDM5NDYsIDcyMyw0MTU5LDMxNDEsICAjIDU0MTQKMTg0MSwzNTU1LDI3NTgsMjE4OSwzOTQ3LDIwMjcsMjEwNCwzNjY1LDc2MjEsMjk5NSwzOTQ4LDEyMTgsNzYyMiwzMzQzLDMyMDEsMzk0OSwgICMgNTQzMAo0MTYwLDI1NzYsIDI0OCwxNjM0LDM3ODUsIDkxMiw3NjIzLDI4MzIsMzY2NiwzMDQwLDM3ODYsIDY1NCwgIDUzLDc2MjQsMjk5Niw3NjI1LCAgIyA1NDQ2CjE2ODgsNDQyOCwgNzc3LDM0NDcsMTAzMiwzOTUwLDE0MjUsNzYyNiwgMTkxLCA4MjAsMjEyMCwyODMzLCA5NzEsNDQyOSwgOTMxLDMyMDIsICAjIDU0NjIKIDEzNSwgNjY0LCA3ODMsMzc4NywxOTk3LCA3NzIsMjkwOCwxOTM1LDM5NTEsMzc4OCw0NDMwLDI5MDksMzIwMywgMjgyLDI3MjMsIDY0MCwgICMgNTQ3OAoxMzcyLDM0NDgsMTEyNywgOTIyLCAzMjUsMzM0NCw3NjI3LDc2MjgsIDcxMSwyMDQ0LDc2MjksNzYzMCwzOTUyLDIyMTksMjc4NywxOTM2LCAgIyA1NDk0CjM5NTMsMzM0NSwyMjIwLDIyNTEsMzc4OSwyMzAwLDc2MzEsNDQzMSwzNzkwLDEyNTgsMzI3OSwzOTU0LDMyMDQsMjEzOCwyOTUwLDM5NTUsICAjIDU1MTAKMzk1Niw3NjMyLDIyMjEsIDI1OCwzMjA1LDQ0MzIsIDEwMSwxMjI3LDc2MzMsMzI4MCwxNzU1LDc2MzQsMTM5MSwzMjgxLDc2MzUsMjkxMCwgICMgNTUyNgoyMDU2LCA4OTMsNzYzNiw3NjM3LDc2MzgsMTQwMiw0MTYxLDIzNDIsNzYzOSw3NjQwLDMyMDYsMzU1Niw3NjQxLDc2NDIsIDg3OCwxMzI1LCAgIyA1NTQyCjE3ODAsMjc4OCw0NDMzLCAyNTksMTM4NSwyNTc3LCA3NDQsMTE4MywyMjY3LDQ0MzQsNzY0MywzOTU3LDI1MDIsNzY0NCwgNjg0LDEwMjQsICAjIDU1NTgKNDE2Miw3NjQ1LCA0NzIsMzU1NywzNDQ5LDExNjUsMzI4MiwzOTU4LDM5NTksIDMyMiwyMTUyLCA4ODEsIDQ1NSwxNjk1LDExNTIsMTM0MCwgICMgNTU3NAogNjYwLCA1NTQsMjE1Myw0NDM1LDEwNTgsNDQzNiw0MTYzLCA4MzAsMTA2NSwzMzQ2LDM5NjAsNDQzNywxOTIzLDc2NDYsMTcwMywxOTE4LCAgIyA1NTkwCjc2NDcsIDkzMiwyMjY4LCAxMjIsNzY0OCw0NDM4LCA5NDcsIDY3Nyw3NjQ5LDM3OTEsMjYyNywgMjk3LDE5MDUsMTkyNCwyMjY5LDQ0MzksICAjIDU2MDYKMjMxNywzMjgzLDc2NTAsNzY1MSw0MTY0LDc2NTIsNDE2NSwgIDg0LDQxNjYsIDExMiwgOTg5LDc2NTMsIDU0NywxMDU5LDM5NjEsIDcwMSwgICMgNTYyMgozNTU4LDEwMTksNzY1NCw0MTY3LDc2NTUsMzQ1MCwgOTQyLCA2MzksIDQ1NywyMzAxLDI0NTEsIDk5MywyOTUxLCA0MDcsIDg1MSwgNDk0LCAgIyA1NjM4CjQ0NDAsMzM0NywgOTI3LDc2NTYsMTIzNyw3NjU3LDI0MjEsMzM0OCwgNTczLDQxNjgsIDY4MCwgOTIxLDI5MTEsMTI3OSwxODc0LCAyODUsICAjIDU2NTQKIDc5MCwxNDQ4LDE5ODMsIDcxOSwyMTY3LDc2NTgsNzY1OSw0NDQxLDM5NjIsMzk2MywxNjQ5LDc2NjAsMTU0MSwgNTYzLDc2NjEsMTA3NywgICMgNTY3MAo3NjYyLDMzNDksMzA0MSwzNDUxLCA1MTEsMjk5NywzOTY0LDM5NjUsMzY2NywzOTY2LDEyNjgsMjU2NCwzMzUwLDMyMDcsNDQ0Miw0NDQzLCAgIyA1Njg2Cjc2NjMsIDUzNSwxMDQ4LDEyNzYsMTE4OSwyOTEyLDIwMjgsMzE0MiwxNDM4LDEzNzMsMjgzNCwyOTUyLDExMzQsMjAxMiw3NjY0LDQxNjksICAjIDU3MDIKMTIzOCwyNTc4LDMwODYsMTI1OSw3NjY1LCA3MDAsNzY2NiwyOTUzLDMxNDMsMzY2OCw0MTcwLDc2NjcsNDE3MSwxMTQ2LDE4NzUsMTkwNiwgICMgNTcxOAo0NDQ0LDI2MDEsMzk2NywgNzgxLDI0MjIsIDEzMiwxNTg5LCAyMDMsIDE0NywgMjczLDI3ODksMjQwMiwgODk4LDE3ODYsMjE1NCwzOTY4LCAgIyA1NzM0CjM5NjksNzY2OCwzNzkyLDI3OTAsNzY2OSw3NjcwLDQ0NDUsNDQ0Niw3NjcxLDMyMDgsNzY3MiwxNjM1LDM3OTMsIDk2NSw3NjczLDE4MDQsICAjIDU3NTAKMjY5MCwxNTE2LDM1NTksMTEyMSwxMDgyLDEzMjksMzI4NCwzOTcwLDE0NDksMzc5NCwgIDY1LDExMjgsMjgzNSwyOTEzLDI3NTksMTU5MCwgICMgNTc2NgozNzk1LDc2NzQsNzY3NSwgIDEyLDI2NTgsICA0NSwgOTc2LDI1NzksMzE0NCw0NDQ3LCA1MTcsMjUyOCwxMDEzLDEwMzcsMzIwOSw3Njc2LCAgIyA1NzgyCjM3OTYsMjgzNiw3Njc3LDM3OTcsNzY3OCwzNDUyLDc2NzksMjYwMiwgNjE0LDE5OTgsMjMxOCwzNzk4LDMwODcsMjcyNCwyNjI4LDc2ODAsICAjIDU3OTgKMjU4MCw0MTcyLCA1OTksMTI2OSw3NjgxLDE4MTAsMzY2OSw3NjgyLDI2OTEsMzA4OCwgNzU5LDEwNjAsIDQ4OSwxODA1LDMzNTEsMzI4NSwgICMgNTgxNAoxMzU4LDc2ODMsNzY4NCwyMzg2LDEzODcsMTIxNSwyNjI5LDIyNTIsIDQ5MCw3Njg1LDc2ODYsNDE3MywxNzU5LDIzODcsMjM0Myw3Njg3LCAgIyA1ODMwCjQ0NDgsMzc5OSwxOTA3LDM5NzEsMjYzMCwxODA2LDMyMTAsNDQ0OSwzNDUzLDMyODYsMjc2MCwyMzQ0LCA4NzQsNzY4OCw3Njg5LDM0NTQsICAjIDU4NDYKMzY3MCwxODU4LCAgOTEsMjkxNCwzNjcxLDMwNDIsMzgwMCw0NDUwLDc2OTAsMzE0NSwzOTcyLDI2NTksNzY5MSwzNDU1LDEyMDIsMTQwMywgICMgNTg2MgozODAxLDI5NTQsMjUyOSwxNTE3LDI1MDMsNDQ1MSwzNDU2LDI1MDQsNzY5Miw0NDUyLDc2OTMsMjY5MiwxODg1LDE0OTUsMTczMSwzOTczLCAgIyA1ODc4CjIzNjUsNDQ1Myw3Njk0LDIwMjksNzY5NSw3Njk2LDM5NzQsMjY5MywxMjE2LCAyMzcsMjU4MSw0MTc0LDIzMTksMzk3NSwzODAyLDQ0NTQsICAjIDU4OTQKNDQ1NSwyNjk0LDM1NjAsMzQ1NywgNDQ1LDQ0NTYsNzY5Nyw3Njk4LDc2OTksNzcwMCwyNzYxLCAgNjEsMzk3NiwzNjcyLDE4MjIsMzk3NywgICMgNTkxMAo3NzAxLCA2ODcsMjA0NSwgOTM1LCA5MjUsIDQwNSwyNjYwLCA3MDMsMTA5NiwxODU5LDI3MjUsNDQ1NywzOTc4LDE4NzYsMTM2NywyNjk1LCAgIyA1OTI2CjMzNTIsIDkxOCwyMTA1LDE3ODEsMjQ3NiwgMzM0LDMyODcsMTYxMSwxMDkzLDQ0NTgsIDU2NCwzMTQ2LDM0NTgsMzY3MywzMzUzLCA5NDUsICAjIDU5NDIKMjYzMSwyMDU3LDQ0NTksNzcwMiwxOTI1LCA4NzIsNDE3NSw3NzAzLDM0NTksMjY5NiwzMDg5LCAzNDksNDE3NiwzNjc0LDM5NzksNDQ2MCwgICMgNTk1OAozODAzLDQxNzcsMzY3NSwyMTU1LDM5ODAsNDQ2MSw0NDYyLDQxNzgsNDQ2MywyNDAzLDIwNDYsIDc4MiwzOTgxLCA0MDAsIDI1MSw0MTc5LCAgIyA1OTc0CjE2MjQsNzcwNCw3NzA1LCAyNzcsMzY3NiwgMjk5LDEyNjUsIDQ3NiwxMTkxLDM4MDQsMjEyMSw0MTgwLDQxODEsMTEwOSwgMjA1LDc3MDYsICAjIDU5OTAKMjU4MiwxMDAwLDIxNTYsMzU2MSwxODYwLDc3MDcsNzcwOCw3NzA5LDQ0NjQsNzcxMCw0NDY1LDI1NjUsIDEwNywyNDc3LDIxNTcsMzk4MiwgICMgNjAwNgozNDYwLDMxNDcsNzcxMSwxNTMzLCA1NDEsMTMwMSwgMTU4LCA3NTMsNDE4MiwyODcyLDM1NjIsNzcxMiwxNjk2LCAzNzAsMTA4OCw0MTgzLCAgIyA2MDIyCjQ0NjYsMzU2MywgNTc5LCAzMjcsIDQ0MCwgMTYyLDIyNDAsIDI2OSwxOTM3LDEzNzQsMzQ2MSwgOTY4LDMwNDMsICA1NiwxMzk2LDMwOTAsICAjIDYwMzgKMjEwNiwzMjg4LDMzNTQsNzcxMywxOTI2LDIxNTgsNDQ2NywyOTk4LDc3MTQsMzU2NCw3NzE1LDc3MTYsMzY3Nyw0NDY4LDI0NzgsNzcxNywgICMgNjA1NAoyNzkxLDc3MTgsMTY1MCw0NDY5LDc3MTksMjYwMyw3NzIwLDc3MjEsMzk4MywyNjYxLDMzNTUsMTE0OSwzMzU2LDM5ODQsMzgwNSwzOTg1LCAgIyA2MDcwCjc3MjIsMTA3NiwgIDQ5LDc3MjMsIDk1MSwzMjExLDMyODksMzI5MCwgNDUwLDI4MzcsIDkyMCw3NzI0LDE4MTEsMjc5MiwyMzY2LDQxODQsICAjIDYwODYKMTkwOCwxMTM4LDIzNjcsMzgwNiwzNDYyLDc3MjUsMzIxMiw0NDcwLDE5MDksMTE0NywxNTE4LDI0MjMsNDQ3MSwzODA3LDc3MjYsNDQ3MiwgICMgNjEwMgoyMzg4LDI2MDQsIDI2MCwxNzk1LDMyMTMsNzcyNyw3NzI4LDM4MDgsMzI5MSwgNzA4LDc3MjksMzU2NSwxNzA0LDc3MzAsMzU2NiwxMzUxLCAgIyA2MTE4CjE2MTgsMzM1NywyOTk5LDE4ODYsIDk0NCw0MTg1LDMzNTgsNDE4NiwzMDQ0LDMzNTksNDE4Nyw3NzMxLDM2NzgsIDQyMiwgNDEzLDE3MTQsICAjIDYxMzQKMzI5MiwgNTAwLDIwNTgsMjM0NSw0MTg4LDI0NzksNzczMiwxMzQ0LDE5MTAsIDk1NCw3NzMzLDE2NjgsNzczNCw3NzM1LDM5ODYsMjQwNCwgICMgNjE1MAo0MTg5LDM1NjcsMzgwOSw0MTkwLDc3MzYsMjMwMiwxMzE4LDI1MDUsMzA5MSwgMTMzLDMwOTIsMjg3Myw0NDczLCA2MjksICAzMSwyODM4LCAgIyA2MTY2CjI2OTcsMzgxMCw0NDc0LCA4NTAsIDk0OSw0NDc1LDM5ODcsMjk1NSwxNzMyLDIwODgsNDE5MSwxNDk2LDE4NTIsNzczNywzOTg4LCA2MjAsICAjIDYxODIKMzIxNCwgOTgxLDEyNDIsMzY3OSwzMzYwLDE2MTksMzY4MCwxNjQzLDMyOTMsMjEzOSwyNDUyLDE5NzAsMTcxOSwzNDYzLDIxNjgsNzczOCwgICMgNjE5OAozMjE1LDc3MzksNzc0MCwzMzYxLDE4MjgsNzc0MSwxMjc3LDQ0NzYsMTU2NSwyMDQ3LDc3NDIsMTYzNiwzNTY4LDMwOTMsNzc0MywgODY5LCAgIyA2MjE0CjI4MzksIDY1NSwzODExLDM4MTIsMzA5NCwzOTg5LDMwMDAsMzgxMywxMzEwLDM1NjksNDQ3Nyw3NzQ0LDc3NDUsNzc0NiwxNzMzLCA1NTgsICAjIDYyMzAKNDQ3OCwzNjgxLCAzMzUsMTU0OSwzMDQ1LDE3NTYsNDE5MiwzNjgyLDE5NDUsMzQ2NCwxODI5LDEyOTEsMTE5MiwgNDcwLDI3MjYsMjEwNywgICMgNjI0NgoyNzkzLCA5MTMsMTA1NCwzOTkwLDc3NDcsMTAyNyw3NzQ4LDMwNDYsMzk5MSw0NDc5LCA5ODIsMjY2MiwzMzYyLDMxNDgsMzQ2NSwzMjE2LCAgIyA2MjYyCjMyMTcsMTk0NiwyNzk0LDc3NDksIDU3MSw0NDgwLDc3NTAsMTgzMCw3NzUxLDM1NzAsMjU4MywxNTIzLDI0MjQsNzc1MiwyMDg5LCA5ODQsICAjIDYyNzgKNDQ4MSwzNjgzLDE5NTksNzc1MywzNjg0LCA4NTIsIDkyMywyNzk1LDM0NjYsMzY4NSwgOTY5LDE1MTksIDk5OSwyMDQ4LDIzMjAsMTcwNSwgICMgNjI5NAo3NzU0LDMwOTUsIDYxNSwxNjYyLCAxNTEsIDU5NywzOTkyLDI0MDUsMjMyMSwxMDQ5LCAyNzUsNDQ4MiwzNjg2LDQxOTMsIDU2OCwzNjg3LCAgIyA2MzEwCjM1NzEsMjQ4MCw0MTk0LDM2ODgsNzc1NSwyNDI1LDIyNzAsIDQwOSwzMjE4LDc3NTYsMTU2NiwyODc0LDM0NjcsMTAwMiwgNzY5LDI4NDAsICAjIDYzMjYKIDE5NCwyMDkwLDMxNDksMzY4OSwyMjIyLDMyOTQsNDE5NSwgNjI4LDE1MDUsNzc1Nyw3NzU4LDE3NjMsMjE3NywzMDAxLDM5OTMsIDUyMSwgICMgNjM0MgoxMTYxLDI1ODQsMTc4NywyMjAzLDI0MDYsNDQ4MywzOTk0LDE2MjUsNDE5Niw0MTk3LCA0MTIsICA0MiwzMDk2LCA0NjQsNzc1OSwyNjMyLCAgIyA2MzU4CjQ0ODQsMzM2MywxNzYwLDE1NzEsMjg3NSwzNDY4LDI1MzAsMTIxOSwyMjA0LDM4MTQsMjYzMywyMTQwLDIzNjgsNDQ4NSw0NDg2LDMyOTUsICAjIDYzNzQKMTY1MSwzMzY0LDM1NzIsNzc2MCw3NzYxLDM1NzMsMjQ4MSwzNDY5LDc3NjIsMzY5MCw3NzYzLDc3NjQsMjI3MSwyMDkxLCA0NjAsNzc2NSwgICMgNjM5MAo0NDg3LDc3NjYsMzAwMiwgOTYyLCA1ODgsMzU3NCwgMjg5LDMyMTksMjYzNCwxMTE2LCAgNTIsNzc2NywzMDQ3LDE3OTYsNzc2OCw3NzY5LCAgIyA2NDA2Cjc3NzAsMTQ2Nyw3NzcxLDE1OTgsMTE0MywzNjkxLDQxOTgsMTk4NCwxNzM0LDEwNjcsNDQ4OCwxMjgwLDMzNjUsIDQ2NSw0NDg5LDE1NzIsICAjIDY0MjIKIDUxMCw3NzcyLDE5MjcsMjI0MSwxODEyLDE2NDQsMzU3NSw3NzczLDQ0OTAsMzY5Miw3Nzc0LDc3NzUsMjY2MywxNTczLDE1MzQsNzc3NiwgICMgNjQzOAo3Nzc3LDQxOTksIDUzNiwxODA3LDE3NjEsMzQ3MCwzODE1LDMxNTAsMjYzNSw3Nzc4LDc3NzksNzc4MCw0NDkxLDM0NzEsMjkxNSwxOTExLCAgIyA2NDU0CjI3OTYsNzc4MSwzMjk2LDExMjIsIDM3NywzMjIwLDc3ODIsIDM2MCw3NzgzLDc3ODQsNDIwMCwxNTI5LCA1NTEsNzc4NSwyMDU5LDM2OTMsICAjIDY0NzAKMTc2OSwyNDI2LDc3ODYsMjkxNiw0MjAxLDMyOTcsMzA5NywyMzIyLDIxMDgsMjAzMCw0NDkyLDE0MDQsIDEzNiwxNDY4LDE0NzksIDY3MiwgICMgNjQ4NgoxMTcxLDMyMjEsMjMwMywgMjcxLDMxNTEsNzc4NywyNzYyLDc3ODgsMjA0OSwgNjc4LDI3MjcsIDg2NSwxOTQ3LDQ0OTMsNzc4OSwyMDEzLCAgIyA2NTAyCjM5OTUsMjk1Niw3NzkwLDI3MjgsMjIyMywxMzk3LDMwNDgsMzY5NCw0NDk0LDQ0OTUsMTczNSwyOTE3LDMzNjYsMzU3Niw3NzkxLDM4MTYsICAjIDY1MTgKIDUwOSwyODQxLDI0NTMsMjg3NiwzODE3LDc3OTIsNzc5MywzMTUyLDMxNTMsNDQ5Niw0MjAyLDI1MzEsNDQ5NywyMzA0LDExNjYsMTAxMCwgICMgNjUzNAogNTUyLCA2ODEsMTg4Nyw3Nzk0LDc3OTUsMjk1NywyOTU4LDM5OTYsMTI4NywxNTk2LDE4NjEsMzE1NCwgMzU4LCA0NTMsIDczNiwgMTc1LCAgIyA2NTUwCiA0NzgsMTExNywgOTA1LDExNjcsMTA5Nyw3Nzk2LDE4NTMsMTUzMCw3Nzk3LDE3MDYsNzc5OCwyMTc4LDM0NzIsMjI4NywzNjk1LDM0NzMsICAjIDY1NjYKMzU3Nyw0MjAzLDIwOTIsNDIwNCw3Nzk5LDMzNjcsMTE5MywyNDgyLDQyMDUsMTQ1OCwyMTkwLDIyMDUsMTg2MiwxODg4LDE0MjEsMzI5OCwgICMgNjU4MgoyOTE4LDMwNDksMjE3OSwzNDc0LCA1OTUsMjEyMiw3ODAwLDM5OTcsNzgwMSw3ODAyLDQyMDYsMTcwNywyNjM2LCAyMjMsMzY5NiwxMzU5LCAgIyA2NTk4CiA3NTEsMzA5OCwgMTgzLDM0NzUsNzgwMywyNzk3LDMwMDMsIDQxOSwyMzY5LCA2MzMsIDcwNCwzODE4LDIzODksIDI0MSw3ODA0LDc4MDUsICAjIDY2MTQKNzgwNiwgODM4LDMwMDQsMzY5NywyMjcyLDI3NjMsMjQ1NCwzODE5LDE5MzgsMjA1MCwzOTk4LDEzMDksMzA5OSwyMjQyLDExODEsNzgwNywgICMgNjYzMAoxMTM2LDIyMDYsMzgyMCwyMzcwLDE0NDYsNDIwNywyMzA1LDQ0OTgsNzgwOCw3ODA5LDQyMDgsMTA1NSwyNjA1LCA0ODQsMzY5OCw3ODEwLCAgIyA2NjQ2CjM5OTksIDYyNSw0MjA5LDIyNzMsMzM2OCwxNDk5LDQyMTAsNDAwMCw3ODExLDQwMDEsNDIxMSwzMjIyLDIyNzQsMjI3NSwzNDc2LDc4MTIsICAjIDY2NjIKNzgxMywyNzY0LCA4MDgsMjYwNiwzNjk5LDMzNjksNDAwMiw0MjEyLDMxMDAsMjUzMiwgNTI2LDMzNzAsMzgyMSw0MjEzLCA5NTUsNzgxNCwgICMgNjY3OAoxNjIwLDQyMTQsMjYzNywyNDI3LDc4MTUsMTQyOSwzNzAwLDE2NjksMTgzMSwgOTk0LCA5MjgsNzgxNiwzNTc4LDEyNjAsNzgxNyw3ODE4LCAgIyA2Njk0Cjc4MTksMTk0OCwyMjg4LCA3NDEsMjkxOSwxNjI2LDQyMTUsMjcyOSwyNDU1LCA4NjcsMTE4NCwgMzYyLDMzNzEsMTM5Miw3ODIwLDc4MjEsICAjIDY3MTAKNDAwMyw0MjE2LDE3NzAsMTczNiwzMjIzLDI5MjAsNDQ5OSw0NTAwLDE5MjgsMjY5OCwxNDU5LDExNTgsNzgyMiwzMDUwLDMzNzIsMjg3NywgICMgNjcyNgoxMjkyLDE5MjksMjUwNiwyODQyLDM3MDEsMTk4NSwxMTg3LDIwNzEsMjAxNCwyNjA3LDQyMTcsNzgyMywyNTY2LDI1MDcsMjE2OSwzNzAyLCAgIyA2NzQyCjI0ODMsMzI5OSw3ODI0LDM3MDMsNDUwMSw3ODI1LDc4MjYsIDY2NiwxMDAzLDMwMDUsMTAyMiwzNTc5LDQyMTgsNzgyNyw0NTAyLDE4MTMsICAjIDY3NTgKMjI1MywgNTc0LDM4MjIsMTYwMywgMjk1LDE1MzUsIDcwNSwzODIzLDQyMTksIDI4MywgODU4LCA0MTcsNzgyOCw3ODI5LDMyMjQsNDUwMywgICMgNjc3NAo0NTA0LDMwNTEsMTIyMCwxODg5LDEwNDYsMjI3NiwyNDU2LDQwMDQsMTM5MywxNTk5LCA2ODksMjU2NywgMzg4LDQyMjAsNzgzMCwyNDg0LCAgIyA2NzkwCiA4MDIsNzgzMSwyNzk4LDM4MjQsMjA2MCwxNDA1LDIyNTQsNzgzMiw0NTA1LDM4MjUsMjEwOSwxMDUyLDEzNDUsMzIyNSwxNTg1LDc4MzMsICAjIDY4MDYKIDgwOSw3ODM0LDc4MzUsNzgzNiwgNTc1LDI3MzAsMzQ3NywgOTU2LDE1NTIsMTQ2OSwxMTQ0LDIzMjMsNzgzNywyMzI0LDE1NjAsMjQ1NywgICMgNjgyMgozNTgwLDMyMjYsNDAwNSwgNjE2LDIyMDcsMzE1NSwyMTgwLDIyODksNzgzOCwxODMyLDc4MzksMzQ3OCw0NTA2LDc4NDAsMTMxOSwzNzA0LCAgIyA2ODM4CjM3MDUsMTIxMSwzNTgxLDEwMjMsMzIyNywxMjkzLDI3OTksNzg0MSw3ODQyLDc4NDMsMzgyNiwgNjA3LDIzMDYsMzgyNywgNzYyLDI4NzgsICAjIDY4NTQKMTQzOSw0MjIxLDEzNjAsNzg0NCwxNDg1LDMwNTIsNzg0NSw0NTA3LDEwMzgsNDIyMiwxNDUwLDIwNjEsMjYzOCw0MjIzLDEzNzksNDUwOCwgICMgNjg3MAoyNTg1LDc4NDYsNzg0Nyw0MjI0LDEzNTIsMTQxNCwyMzI1LDI5MjEsMTE3Miw3ODQ4LDc4NDksMzgyOCwzODI5LDc4NTAsMTc5NywxNDUxLCAgIyA2ODg2Cjc4NTEsNzg1Miw3ODUzLDc4NTQsMjkyMiw0MDA2LDQwMDcsMjQ4NSwyMzQ2LCA0MTEsNDAwOCw0MDA5LDM1ODIsMzMwMCwzMTAxLDQ1MDksICAjIDY5MDIKMTU2MSwyNjY0LDE0NTIsNDAxMCwxMzc1LDc4NTUsNzg1NiwgIDQ3LDI5NTksIDMxNiw3ODU3LDE0MDYsMTU5MSwyOTIzLDMxNTYsNzg1OCwgICMgNjkxOAoxMDI1LDIxNDEsMzEwMiwzMTU3LCAzNTQsMjczMSwgODg0LDIyMjQsNDIyNSwyNDA3LCA1MDgsMzcwNiwgNzI2LDM1ODMsIDk5NiwyNDI4LCAgIyA2OTM0CjM1ODQsIDcyOSw3ODU5LCAzOTIsMjE5MSwxNDUzLDQwMTEsNDUxMCwzNzA3LDc4NjAsNzg2MSwyNDU4LDM1ODUsMjYwOCwxNjc1LDI4MDAsICAjIDY5NTAKIDkxOSwyMzQ3LDI5NjAsMjM0OCwxMjcwLDQ1MTEsNDAxMiwgIDczLDc4NjIsNzg2MywgNjQ3LDc4NjQsMzIyOCwyODQzLDIyNTUsMTU1MCwgICMgNjk2NgoxMzQ2LDMwMDYsNzg2NSwxMzMyLCA4ODMsMzQ3OSw3ODY2LDc4NjcsNzg2OCw3ODY5LDMzMDEsMjc2NSw3ODcwLDEyMTIsIDgzMSwxMzQ3LCAgIyA2OTgyCjQyMjYsNDUxMiwyMzI2LDM4MzAsMTg2MywzMDUzLCA3MjAsMzgzMSw0NTEzLDQ1MTQsMzgzMiw3ODcxLDQyMjcsNzg3Miw3ODczLDQ1MTUsICAjIDY5OTgKNzg3NCw3ODc1LDE3OTgsNDUxNiwzNzA4LDI2MDksNDUxNywzNTg2LDE2NDUsMjM3MSw3ODc2LDc4NzcsMjkyNCwgNjY5LDIyMDgsMjY2NSwgICMgNzAxNAoyNDI5LDc4NzgsMjg3OSw3ODc5LDc4ODAsMTAyOCwzMjI5LDc4ODEsNDIyOCwyNDA4LDc4ODIsMjI1NiwxMzUzLDc4ODMsNzg4NCw0NTE4LCAgIyA3MDMwCjMxNTgsIDUxOCw3ODg1LDQwMTMsNzg4Niw0MjI5LDE5NjAsNzg4NywyMTQyLDQyMzAsNzg4OCw3ODg5LDMwMDcsMjM0OSwyMzUwLDM4MzMsICAjIDcwNDYKIDUxNiwxODMzLDE0NTQsNDAxNCwyNjk5LDQyMzEsNDUxOSwyMjI1LDI2MTAsMTk3MSwxMTI5LDM1ODcsNzg5MCwyNzY2LDc4OTEsMjk2MSwgICMgNzA2MgoxNDIyLCA1NzcsMTQ3MCwzMDA4LDE1MjQsMzM3Myw3ODkyLDc4OTMsIDQzMiw0MjMyLDMwNTQsMzQ4MCw3ODk0LDI1ODYsMTQ1NSwyNTA4LCAgIyA3MDc4CjIyMjYsMTk3MiwxMTc1LDc4OTUsMTAyMCwyNzMyLDQwMTUsMzQ4MSw0NTIwLDc4OTYsMjczMyw3ODk3LDE3NDMsMTM2MSwzMDU1LDM0ODIsICAjIDcwOTQKMjYzOSw0MDE2LDQyMzMsNDUyMSwyMjkwLCA4OTUsIDkyNCw0MjM0LDIxNzAsIDMzMSwyMjQzLDMwNTYsIDE2NiwxNjI3LDMwNTcsMTA5OCwgICMgNzExMAo3ODk4LDEyMzIsMjg4MCwyMjI3LDMzNzQsNDUyMiwgNjU3LCA0MDMsMTE5NiwyMzcyLCA1NDIsMzcwOSwzMzc1LDE2MDAsNDIzNSwzNDgzLCAgIyA3MTI2Cjc4OTksNDUyMywyNzY3LDMyMzAsIDU3NiwgNTMwLDEzNjIsNzkwMCw0NTI0LDI1MzMsMjY2NiwzNzEwLDQwMTcsNzkwMSwgODQyLDM4MzQsICAjIDcxNDIKNzkwMiwyODAxLDIwMzEsMTAxNCw0MDE4LCAyMTMsMjcwMCwzMzc2LCA2NjUsIDYyMSw0MjM2LDc5MDMsMzcxMSwyOTI1LDI0MzAsNzkwNCwgICMgNzE1OAoyNDMxLDMzMDIsMzU4OCwzMzc3LDc5MDUsNDIzNywyNTM0LDQyMzgsNDUyNSwzNTg5LDE2ODIsNDIzOSwzNDg0LDEzODAsNzkwNiwgNzI0LCAgIyA3MTc0CjIyNzcsIDYwMCwxNjcwLDc5MDcsMTMzNywxMjMzLDQ1MjYsMzEwMywyMjQ0LDc5MDgsMTYyMSw0NTI3LDc5MDksIDY1MSw0MjQwLDc5MTAsICAjIDcxOTAKMTYxMiw0MjQxLDI2MTEsNzkxMSwyODQ0LDc5MTIsMjczNCwyMzA3LDMwNTgsNzkxMywgNzE2LDI0NTksMzA1OSwgMTc0LDEyNTUsMjcwMSwgICMgNzIwNgo0MDE5LDM1OTAsIDU0OCwxMzIwLDEzOTgsIDcyOCw0MDIwLDE1NzQsNzkxNCwxODkwLDExOTcsMzA2MCw0MDIxLDc5MTUsMzA2MSwzMDYyLCAgIyA3MjIyCjM3MTIsMzU5MSwzNzEzLCA3NDcsNzkxNiwgNjM1LDQyNDIsNDUyOCw3OTE3LDc5MTgsNzkxOSw0MjQzLDc5MjAsNzkyMSw0NTI5LDc5MjIsICAjIDcyMzgKMzM3OCw0NTMwLDI0MzIsIDQ1MSw3OTIzLDM3MTQsMjUzNSwyMDcyLDQyNDQsMjczNSw0MjQ1LDQwMjIsNzkyNCwxNzY0LDQ1MzEsNzkyNSwgICMgNzI1NAo0MjQ2LCAzNTAsNzkyNiwyMjc4LDIzOTAsMjQ4Niw3OTI3LDQyNDcsNDAyMywyMjQ1LDE0MzQsNDAyNCwgNDg4LDQ1MzIsIDQ1OCw0MjQ4LCAgIyA3MjcwCjQwMjUsMzcxNSwgNzcxLDEzMzAsMjM5MSwzODM1LDI1NjgsMzE1OSwyMTU5LDI0MDksMTU1MywyNjY3LDMxNjAsNDI0OSw3OTI4LDI0ODcsICAjIDcyODYKMjg4MSwyNjEyLDE3MjAsMjcwMiw0MjUwLDMzNzksNDUzMyw3OTI5LDI1MzYsNDI1MSw3OTMwLDMyMzEsNDI1MiwyNzY4LDc5MzEsMjAxNSwgICMgNzMwMgoyNzM2LDc5MzIsMTE1NSwxMDE3LDM3MTYsMzgzNiw3OTMzLDMzMDMsMjMwOCwgMjAxLDE4NjQsNDI1MywxNDMwLDc5MzQsNDAyNiw3OTM1LCAgIyA3MzE4Cjc5MzYsNzkzNyw3OTM4LDc5MzksNDI1NCwxNjA0LDc5NDAsIDQxNCwxODY1LCAzNzEsMjU4Nyw0NTM0LDQ1MzUsMzQ4NSwyMDE2LDMxMDQsICAjIDczMzQKNDUzNiwxNzA4LCA5NjAsNDI1NSwgODg3LCAzODksMjE3MSwxNTM2LDE2NjMsMTcyMSw3OTQxLDIyMjgsNDAyNywyMzUxLDI5MjYsMTU4MCwgICMgNzM1MAo3OTQyLDc5NDMsNzk0NCwxNzQ0LDc5NDUsMjUzNyw0NTM3LDQ1MzgsNzk0Niw0NTM5LDc5NDcsMjA3Myw3OTQ4LDc5NDksMzU5MiwzMzgwLCAgIyA3MzY2CjI4ODIsNDI1Niw3OTUwLDQyNTcsMjY0MCwzMzgxLDI4MDIsIDY3MywyNzAzLDI0NjAsIDcwOSwzNDg2LDQwMjgsMzU5Myw0MjU4LDc5NTEsICAjIDczODIKMTE0OCwgNTAyLCA2MzQsNzk1Miw3OTUzLDEyMDQsNDU0MCwzNTk0LDE1NzUsNDU0MSwyNjEzLDM3MTcsNzk1NCwzNzE4LDMxMDUsIDk0OCwgICMgNzM5OAozMjMyLCAxMjEsMTc0NSwzODM3LDExMTAsNzk1NSw0MjU5LDMwNjMsMjUwOSwzMDA5LDQwMjksMzcxOSwxMTUxLDE3NzEsMzgzOCwxNDg4LCAgIyA3NDE0CjQwMzAsMTk4Niw3OTU2LDI0MzMsMzQ4Nyw3OTU3LDc5NTgsMjA5Myw3OTU5LDQyNjAsMzgzOSwxMjEzLDE0MDcsMjgwMywgNTMxLDI3MzcsICAjIDc0MzAKMjUzOCwzMjMzLDEwMTEsMTUzNyw3OTYwLDI3NjksNDI2MSwzMTA2LDEwNjEsNzk2MSwzNzIwLDM3MjEsMTg2NiwyODgzLDc5NjIsMjAxNywgICMgNzQ0NgogMTIwLDQyNjIsNDI2MywyMDYyLDM1OTUsMzIzNCwyMzA5LDM4NDAsMjY2OCwzMzgyLDE5NTQsNDU0Miw3OTYzLDc5NjQsMzQ4OCwxMDQ3LCAgIyA3NDYyCjI3MDQsMTI2Niw3OTY1LDEzNjgsNDU0MywyODQ1LCA2NDksMzM4MywzODQxLDI1MzksMjczOCwxMTAyLDI4NDYsMjY2OSw3OTY2LDc5NjcsICAjIDc0NzgKMTk5OSw3OTY4LDExMTEsMzU5NiwyOTYyLDc5NjksMjQ4OCwzODQyLDM1OTcsMjgwNCwxODU0LDMzODQsMzcyMiw3OTcwLDc5NzEsMzM4NSwgICMgNzQ5NAoyNDEwLDI4ODQsMzMwNCwzMjM1LDM1OTgsNzk3MiwyNTY5LDc5NzMsMzU5OSwyODA1LDQwMzEsMTQ2MCwgODU2LDc5NzQsMzYwMCw3OTc1LCAgIyA3NTEwCjI4ODUsMjk2Myw3OTc2LDI4ODYsMzg0Myw3OTc3LDQyNjQsIDYzMiwyNTEwLCA4NzUsMzg0NCwxNjk3LDM4NDUsMjI5MSw3OTc4LDc5NzksICAjIDc1MjYKNDU0NCwzMDEwLDEyMzksIDU4MCw0NTQ1LDQyNjUsNzk4MCwgOTE0LCA5MzYsMjA3NCwxMTkwLDQwMzIsMTAzOSwyMTIzLDc5ODEsNzk4MiwgICMgNzU0Mgo3OTgzLDMzODYsMTQ3Myw3OTg0LDEzNTQsNDI2NiwzODQ2LDc5ODUsMjE3MiwzMDY0LDQwMzMsIDkxNSwzMzA1LDQyNjcsNDI2OCwzMzA2LCAgIyA3NTU4CjE2MDUsMTgzNCw3OTg2LDI3MzksIDM5OCwzNjAxLDQyNjksMzg0Nyw0MDM0LCAzMjgsMTkxMiwyODQ3LDQwMzUsMzg0OCwxMzMxLDQyNzAsICAjIDc1NzQKMzAxMSwgOTM3LDQyNzEsNzk4NywzNjAyLDQwMzYsNDAzNywzMzg3LDIxNjAsNDU0NiwzMzg4LCA1MjQsIDc0MiwgNTM4LDMwNjUsMTAxMiwgICMgNzU5MAo3OTg4LDc5ODksMzg0OSwyNDYxLDc5OTAsIDY1OCwxMTAzLCAyMjUsMzg1MCw3OTkxLDc5OTIsNDU0Nyw3OTkzLDQ1NDgsNzk5NCwzMjM2LCAgIyA3NjA2CjEyNDMsNzk5NSw0MDM4LCA5NjMsMjI0Niw0NTQ5LDc5OTYsMjcwNSwzNjAzLDMxNjEsNzk5Nyw3OTk4LDI1ODgsMjMyNyw3OTk5LDQ1NTAsICAjIDc2MjIKODAwMCw4MDAxLDgwMDIsMzQ4OSwzMzA3LCA5NTcsMzM4OSwyNTQwLDIwMzIsMTkzMCwyOTI3LDI0NjIsIDg3MCwyMDE4LDM2MDQsMTc0NiwgICMgNzYzOAoyNzcwLDI3NzEsMjQzNCwyNDYzLDgwMDMsMzg1MSw4MDA0LDM3MjMsMzEwNywzNzI0LDM0OTAsMzM5MCwzNzI1LDgwMDUsMTE3OSwzMDY2LCAgIyA3NjU0CjgwMDYsMzE2MiwyMzczLDQyNzIsMzcyNiwyNTQxLDMxNjMsMzEwOCwyNzQwLDQwMzksODAwNywzMzkxLDE1NTYsMjU0MiwyMjkyLCA5NzcsICAjIDc2NzAKMjg4NywyMDMzLDQwNDAsMTIwNSwzMzkyLDgwMDgsMTc2NSwzMzkzLDMxNjQsMjEyNCwxMjcxLDE2ODksIDcxNCw0NTUxLDM0OTEsODAwOSwgICMgNzY4NgoyMzI4LDM4NTIsIDUzMyw0MjczLDM2MDUsMjE4MSwgNjE3LDgwMTAsMjQ2NCwzMzA4LDM0OTIsMjMxMCw4MDExLDgwMTIsMzE2NSw4MDEzLCAgIyA3NzAyCjgwMTQsMzg1MywxOTg3LCA2MTgsIDQyNywyNjQxLDM0OTMsMzM5NCw4MDE1LDgwMTYsMTI0NCwxNjkwLDgwMTcsMjgwNiw0Mjc0LDQ1NTIsICAjIDc3MTgKODAxOCwzNDk0LDgwMTksODAyMCwyMjc5LDE1NzYsIDQ3MywzNjA2LDQyNzUsMzM5NSwgOTcyLDgwMjEsMzYwNyw4MDIyLDMwNjcsODAyMywgICMgNzczNAo4MDI0LDQ1NTMsNDU1NCw4MDI1LDM3MjcsNDA0MSw0MDQyLDgwMjYsIDE1Myw0NTU1LCAzNTYsODAyNywxODkxLDI4ODgsNDI3NiwyMTQzLCAgIyA3NzUwCiA0MDgsIDgwMywyMzUyLDgwMjgsMzg1NCw4MDI5LDQyNzcsMTY0NiwyNTcwLDI1MTEsNDU1Niw0NTU3LDM4NTUsODAzMCwzODU2LDQyNzgsICAjIDc3NjYKODAzMSwyNDExLDMzOTYsIDc1Miw4MDMyLDgwMzMsMTk2MSwyOTY0LDgwMzQsIDc0NiwzMDEyLDI0NjUsODAzNSw0Mjc5LDM3MjgsIDY5OCwgICMgNzc4Mgo0NTU4LDE4OTIsNDI4MCwzNjA4LDI1NDMsNDU1OSwzNjA5LDM4NTcsODAzNiwzMTY2LDMzOTcsODAzNywxODIzLDEzMDIsNDA0MywyNzA2LCAgIyA3Nzk4CjM4NTgsMTk3Myw0MjgxLDgwMzgsNDI4MiwzMTY3LCA4MjMsMTMwMywxMjg4LDEyMzYsMjg0OCwzNDk1LDQwNDQsMzM5OCwgNzc0LDM4NTksICAjIDc4MTQKODAzOSwxNTgxLDQ1NjAsMTMwNCwyODQ5LDM4NjAsNDU2MSw4MDQwLDI0MzUsMjE2MSwxMDgzLDMyMzcsNDI4Myw0MDQ1LDQyODQsIDM0NCwgICMgNzgzMAoxMTczLCAyODgsMjMxMSwgNDU0LDE2ODMsODA0MSw4MDQyLDE0NjEsNDU2Miw0MDQ2LDI1ODksODA0Myw4MDQ0LDQ1NjMsIDk4NSwgODk0LCAgIyA3ODQ2CjgwNDUsMzM5OSwzMTY4LDgwNDYsMTkxMywyOTI4LDM3MjksMTk4OCw4MDQ3LDIxMTAsMTk3NCw4MDQ4LDQwNDcsODA0OSwyNTcxLDExOTQsICAjIDc4NjIKIDQyNSw4MDUwLDQ1NjQsMzE2OSwxMjQ1LDM3MzAsNDI4NSw4MDUxLDgwNTIsMjg1MCw4MDUzLCA2MzYsNDU2NSwxODU1LDM4NjEsIDc2MCwgICMgNzg3OAoxNzk5LDgwNTQsNDI4NiwyMjA5LDE1MDgsNDU2Niw0MDQ4LDE4OTMsMTY4NCwyMjkzLDgwNTUsODA1Niw4MDU3LDQyODcsNDI4OCwyMjEwLCAgIyA3ODk0CiA0NzksODA1OCw4MDU5LCA4MzIsODA2MCw0MDQ5LDI0ODksODA2MSwyOTY1LDI0OTAsMzczMSwgOTkwLDMxMDksIDYyNywxODE0LDI2NDIsICAjIDc5MTAKNDI4OSwxNTgyLDQyOTAsMjEyNSwyMTExLDM0OTYsNDU2Nyw4MDYyLCA3OTksNDI5MSwzMTcwLDgwNjMsNDU2OCwyMTEyLDE3MzcsMzAxMywgICMgNzkyNgoxMDE4LCA1NDMsIDc1NCw0MjkyLDMzMDksMTY3Niw0NTY5LDQ1NzAsNDA1MCw4MDY0LDE0ODksODA2NSwzNDk3LDgwNjYsMjYxNCwyODg5LCAgIyA3OTQyCjQwNTEsODA2Nyw4MDY4LDI5NjYsODA2OSw4MDcwLDgwNzEsODA3MiwzMTcxLDQ1NzEsNDU3MiwyMTgyLDE3MjIsODA3MywzMjM4LDMyMzksICAjIDc5NTgKMTg0MiwzNjEwLDE3MTUsIDQ4MSwgMzY1LDE5NzUsMTg1Niw4MDc0LDgwNzUsMTk2MiwyNDkxLDQ1NzMsODA3NiwyMTI2LDM2MTEsMzI0MCwgICMgNzk3NAogNDMzLDE4OTQsMjA2MywyMDc1LDgwNzcsIDYwMiwyNzQxLDgwNzgsODA3OSw4MDgwLDgwODEsODA4MiwzMDE0LDE2MjgsMzQwMCw4MDgzLCAgIyA3OTkwCjMxNzIsNDU3NCw0MDUyLDI4OTAsNDU3NSwyNTEyLDgwODQsMjU0NCwyNzcyLDgwODUsODA4Niw4MDg3LDMzMTAsNDU3NiwyODkxLDgwODgsICAjIDgwMDYKNDU3Nyw4MDg5LDI4NTEsNDU3OCw0NTc5LDEyMjEsMjk2Nyw0MDUzLDI1MTMsODA5MCw4MDkxLDgwOTIsMTg2NywxOTg5LDgwOTMsODA5NCwgICMgODAyMgo4MDk1LDE4OTUsODA5Niw4MDk3LDQ1ODAsMTg5Niw0MDU0LCAzMTgsODA5OCwyMDk0LDQwNTUsNDI5Myw4MDk5LDgxMDAsIDQ4NSw4MTAxLCAgIyA4MDM4CiA5MzgsMzg2MiwgNTUzLDI2NzAsIDExNiw4MTAyLDM4NjMsMzYxMiw4MTAzLDM0OTgsMjY3MSwyNzczLDM0MDEsMzMxMSwyODA3LDgxMDQsICAjIDgwNTQKMzYxMywyOTI5LDQwNTYsMTc0NywyOTMwLDI5NjgsODEwNSw4MTA2LCAyMDcsODEwNyw4MTA4LDI2NzIsNDU4MSwyNTE0LDgxMDksMzAxNSwgICMgODA3MAogODkwLDM2MTQsMzg2NCw4MTEwLDE4NzcsMzczMiwzNDAyLDgxMTEsMjE4MywyMzUzLDM0MDMsMTY1Miw4MTEyLDgxMTMsODExNCwgOTQxLCAgIyA4MDg2CjIyOTQsIDIwOCwzNDk5LDQwNTcsMjAxOSwgMzMwLDQyOTQsMzg2NSwyODkyLDI0OTIsMzczMyw0Mjk1LDgxMTUsODExNiw4MTE3LDgxMTgsICAjIDgxMDIKKQoKUEsDBBQAAAAAAAAAIQCgQY0Y0wYAANMGAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBFVUNUV19TTV9NT0RFTAoKY2xhc3MgRVVDVFdQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDVFdQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShFVUNUV19TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkVVQy1UVyIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIlRhaXdhbiIKUEsDBBQAAAAAAAAAIQAZRdLX61AAAOtQAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEyZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBHQjIzMTIgbW9zdCBmcmVxdWVudGx5IHVzZWQgY2hhcmFjdGVyIHRhYmxlCiMKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsIGZyb20gaHo2NzYzCgojIDUxMiAgLS0+IDAuNzkgIC0tIDAuNzkKIyAxMDI0IC0tPiAwLjkyICAtLSAwLjEzCiMgMjA0OCAtLT4gMC45OCAgLS0gMC4wNgojIDY3NjggLS0+IDEuMDAgIC0tIDAuMDIKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuNzkxMzUvKDEtMC43OTEzNSkgPSAzLjc5CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIgLyAoMzc1NSAtIDUxMikgPSAwLjE1NwojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhdCBSRFIKCkdCMjMxMl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuOQoKR0IyMzEyX1RBQkxFX1NJWkUgPSAzNzYwCgpHQjIzMTJfQ0hBUl9UT19GUkVRX09SREVSID0gKAoxNjcxLCA3NDksMTQ0MywyMzY0LDM5MjQsMzgwNywyMzMwLDM5MjEsMTcwNCwzNDYzLDI2OTEsMTUxMSwxNTE1LCA1NzIsMzE5MSwyMjA1LAoyMzYxLCAyMjQsMjU1OCwgNDc5LDE3MTEsIDk2MywzMTYyLCA0NDAsNDA2MCwxOTA1LDI5NjYsMjk0NywzNTgwLDI2NDcsMzk2MSwzODQyLAoyMjA0LCA4NjksNDIwNywgOTcwLDI2NzgsNTYyNiwyOTQ0LDI5NTYsMTQ3OSw0MDQ4LCA1MTQsMzU5NSwgNTg4LDEzNDYsMjgyMCwzNDA5LAogMjQ5LDQwODgsMTc0NiwxODczLDIwNDcsMTc3NCwgNTgxLDE4MTMsIDM1OCwxMTc0LDM1OTAsMTAxNCwxNTYxLDQ4NDQsMjI0NSwgNjcwLAoxNjM2LDMxMTIsIDg4OSwxMjg2LCA5NTMsIDU1NiwyMzI3LDMwNjAsMTI5MCwzMTQxLCA2MTMsIDE4NSwzNDc3LDEzNjcsIDg1MCwzODIwLAoxNzE1LDI0MjgsMjY0MiwyMzAzLDI3MzIsMzA0MSwyNTYyLDI2NDgsMzU2NiwzOTQ2LDEzNDksIDM4OCwzMDk4LDIwOTEsMTM2MCwzNTg1LAogMTUyLDE2ODcsMTUzOSwgNzM4LDE1NTksICA1OSwxMjMyLDI5MjUsMjI2NywxMzg4LDEyNDksMTc0MSwxNjc5LDI5NjAsIDE1MSwxNTY2LAoxMTI1LDEzNTIsNDI3MSwgOTI0LDQyOTYsIDM4NSwzMTY2LDQ0NTksIDMxMCwxMjQ1LDI4NTAsICA3MCwzMjg1LDI3MjksMzUzNCwzNTc1LAoyMzk4LDMyOTgsMzQ2NiwxOTYwLDIyNjUsIDIxNywzNjQ3LCA4NjQsMTkwOSwyMDg0LDQ0MDEsMjc3MywxMDEwLDMyNjksNTE1MiwgODUzLAozMDUxLDMxMjEsMTI0NCw0MjUxLDE4OTUsIDM2NCwxNDk5LDE1NDAsMjMxMywxMTgwLDM2NTUsMjI2OCwgNTYyLCA3MTUsMjQxNywzMDYxLAogNTQ0LCAzMzYsMzc2OCwyMzgwLDE3NTIsNDA3NSwgOTUwLCAyODAsMjQyNSw0MzgyLCAxODMsMjc1OSwzMjcyLCAzMzMsNDI5NywyMTU1LAoxNjg4LDIzNTYsMTQ0NCwxMDM5LDQ1NDAsIDczNiwxMTc3LDMzNDksMjQ0MywyMzY4LDIxNDQsMjIyNSwgNTY1LCAxOTYsMTQ4MiwzNDA2LAogOTI3LDEzMzUsNDE0NywgNjkyLCA4NzgsMTMxMSwxNjUzLDM5MTEsMzYyMiwxMzc4LDQyMDAsMTg0MCwyOTY5LDMxNDksMjEyNiwxODE2LAoyNTM0LDE1NDYsMjM5MywyNzYwLCA3MzcsMjQ5NCwgIDEzLCA0NDcsIDI0NSwyNzQ3LCAgMzgsMjc2NSwyMTI5LDI1ODksMTA3OSwgNjA2LAogMzYwLCA0NzEsMzc1NSwyODkwLCA0MDQsIDg0OCwgNjk5LDE3ODUsMTIzNiwgMzcwLDIyMjEsMTAyMywzNzQ2LDIwNzQsMjAyNiwyMDIzLAoyMzg4LDE1ODEsMjExOSwgODEyLDExNDEsMzA5MSwyNTM2LDE1MTksIDgwNCwyMDUzLCA0MDYsMTU5NiwxMDkwLCA3ODQsIDU0OCw0NDE0LAoxODA2LDIyNjQsMjkzNiwxMTAwLCAzNDMsNDExNCw1MDk2LCA2MjIsMzM1OCwgNzQzLDM2NjgsMTUxMCwxNjI2LDUwMjAsMzU2NywyNTEzLAozMTk1LDQxMTUsNTYyNywyNDg5LDI5OTEsICAyNCwyMDY1LDI2OTcsMTA4NywyNzE5LCAgNDgsMTYzNCwgMzE1LCAgNjgsIDk4NSwyMDUyLAogMTk4LDIyMzksMTM0NywxMTA3LDE0MzksIDU5NywyMzY2LDIxNzIsIDg3MSwzMzA3LCA5MTksMjQ4NywyNzkwLDE4NjcsIDIzNiwyNTcwLAoxNDEzLDM3OTQsIDkwNiwzMzY1LDMzODEsMTcwMSwxOTgyLDE4MTgsMTUyNCwyOTI0LDEyMDUsIDYxNiwyNTg2LDIwNzIsMjAwNCwgNTc1LAogMjUzLDMwOTksICAzMiwxMzY1LDExODIsIDE5NywxNzE0LDI0NTQsMTIwMSwgNTU0LDMzODgsMzIyNCwyNzQ4LCA3NTYsMjU4NywgMjUwLAoyNTY3LDE1MDcsMTUxNywzNTI5LDE5MjIsMjc2MSwyMzM3LDM0MTYsMTk2MSwxNjc3LDI0NTIsMjIzOCwzMTUzLCA2MTUsIDkxMSwxNTA2LAoxNDc0LDI0OTUsMTI2NSwxOTA2LDI3NDksMzc1NiwzMjgwLDIxNjEsIDg5OCwyNzE0LDE3NTksMzQ1MCwyMjQzLDI0NDQsIDU2MywgIDI2LAozMjg2LDIyNjYsMzc2OSwzMzQ0LDI3MDcsMzY3NywgNjExLDE0MDIsIDUzMSwxMDI4LDI4NzEsNDU0OCwxMzc1LCAyNjEsMjk0OCwgODM1LAoxMTkwLDQxMzQsIDM1MywgODQwLDI2ODQsMTkwMCwzMDgyLDE0MzUsMjEwOSwxMjA3LDE2NzQsIDMyOSwxODcyLDI3ODEsNDA1NSwyNjg2LAoyMTA0LCA2MDgsMzMxOCwyNDIzLDI5NTcsMjc2OCwxMTA4LDM3MzksMzUxMiwzMjcxLDM5ODUsMjIwMywxNzcxLDM1MjAsMTQxOCwyMDU0LAoxNjgxLDExNTMsIDIyNSwxNjI3LDI5MjksIDE2MiwyMDUwLDI1MTEsMzY4NywxOTU0LCAxMjQsMTg1OSwyNDMxLDE2ODQsMzAzMiwyODk0LAogNTg1LDQ4MDUsMzk2OSwyODY5LDI3MDQsMjA4OCwyMDMyLDIwOTUsMzY1NiwyNjM1LDQzNjIsMjIwOSwgMjU2LCA1MTgsMjA0MiwyMTA1LAozNzc3LDM2NTcsIDY0MywyMjk4LDExNDgsMTc3OSwgMTkwLCA5ODksMzU0NCwgNDE0LCAgMTEsMjEzNSwyMDYzLDI5NzksMTQ3MSwgNDAzLAozNjc4LCAxMjYsIDc3MCwxNTYzLCA2NzEsMjQ5OSwzMjE2LDI4NzcsIDYwMCwxMTc5LCAzMDcsMjgwNSw0OTM3LDEyNjgsMTI5NywyNjk0LAogMjUyLDQwMzIsMTQ0OCwxNDk0LDEzMzEsMTM5NCwgMTI3LDIyNTYsIDIyMiwxNjQ3LDEwMzUsMTQ4MSwzMDU2LDE5MTUsMTA0OCwgODczLAozNjUxLCAyMTAsICAzMywxNjA4LDI1MTYsIDIwMCwxNTIwLCA0MTUsIDEwMiwgICAwLDMzODksMTI4NywgODE3LCAgOTEsMzI5OSwyOTQwLAogODM2LDE4MTQsIDU0OSwyMTk3LDEzOTYsMTY2OSwyOTg3LDM1ODIsMjI5NywyODQ4LDQ1MjgsMTA3MCwgNjg3LCAgMjAsMTgxOSwgMTIxLAoxNTUyLDEzNjQsMTQ2MSwxOTY4LDI2MTcsMzU0MCwyODI0LDIwODMsIDE3NywgOTQ4LDQ5MzgsMjI5MSwgMTEwLDQ1NDksMjA2NiwgNjQ4LAozMzU5LDE3NTUsMjExMCwyMTE0LDQ2NDIsNDg0NSwxNjkzLDM5MzcsMzMwOCwxMjU3LDE4NjksMjEyMywgMjA4LDE4MDQsMzE1OSwyOTkyLAoyNTMxLDI1NDksMzM2MSwyNDE4LDEzNTAsMjM0NywyODAwLDI1NjgsMTI5MSwyMDM2LDI2ODAsICA3MiwgODQyLDE5OTAsIDIxMiwxMjMzLAoxMTU0LDE1ODYsICA3NSwyMDI3LDM0MTAsNDkwMCwxODIzLDEzMzcsMjcxMCwyNjc2LCA3MjgsMjgxMCwxNTIyLDMwMjYsNDk5NSwgMTU3LAogNzU1LDEwNTAsNDAyMiwgNzEwLCA3ODUsMTkzNiwyMTk0LDIwODUsMTQwNiwyNzc3LDI0MDAsIDE1MCwxMjUwLDQwNDksMTIwNiwgODA3LAoxOTEwLCA1MzQsIDUyOSwzMzA5LDE3MjEsMTY2MCwgMjc0LCAgMzksMjgyNywgNjYxLDI2NzAsMTU3OCwgOTI1LDMyNDgsMzgxNSwxMDk0LAo0Mjc4LDQ5MDEsNDI1MiwgIDQxLDExNTAsMzc0NywyNTcyLDIyMjcsNDUwMSwzNjU4LDQ5MDIsMzgxMywzMzU3LDM2MTcsMjg4NCwyMjU4LAogODg3LCA1MzgsNDE4NywzMTk5LDEyOTQsMjQzOSwzMDQyLDIzMjksMjM0MywyNDk3LDEyNTUsIDEwNywgNTQzLDE1MjcsIDUyMSwzNDc4LAozNTY4LCAxOTQsNTA2MiwgIDE1LCA5NjEsMzg3MCwxMjQxLDExOTIsMjY2NCwgIDY2LDUyMTUsMzI2MCwyMTExLDEyOTUsMTEyNywyMTUyLAozODA1LDQxMzUsIDkwMSwxMTY0LDE5NzYsIDM5OCwxMjc4LCA1MzAsMTQ2MCwgNzQ4LCA5MDQsMTA1NCwxOTY2LDE0MjYsICA1MywyOTA5LAogNTA5LCA1MjMsMjI3OSwxNTM0LCA1MzYsMTAxOSwgMjM5LDE2ODUsIDQ2MCwyMzUzLCA2NzMsMTA2NSwyNDAxLDM2MDAsNDI5OCwyMjcyLAoxMjcyLDIzNjMsIDI4NCwxNzUzLDM2NzksNDA2NCwxNjk1LCAgODEsIDgxNSwyNjc3LDI3NTcsMjczMSwxMzg2LCA4NTksIDUwMCw0MjIxLAoyMTkwLDI1NjYsIDc1NywxMDA2LDI1MTksMjA2OCwxMTY2LDE0NTUsIDMzNywyNjU0LDMyMDMsMTg2MywxNjgyLDE5MTQsMzAyNSwxMjUyLAoxNDA5LDEzNjYsIDg0NywgNzE0LDI4MzQsMjAzOCwzMjA5LCA5NjQsMjk3MCwxOTAxLCA4ODUsMjU1MywxMDc4LDE3NTYsMzA0OSwgMzAxLAoxNTcyLDMzMjYsIDY4OCwyMTMwLDE5OTYsMjQyOSwxODA1LDE2NDgsMjkzMCwzNDIxLDI3NTAsMzY1MiwzMDg4LCAyNjIsMTE1OCwxMjU0LAogMzg5LDE2NDEsMTgxMiwgNTI2LDE3MTksIDkyMywyMDczLDEwNzMsMTkwMiwgNDY4LCA0ODksNDYyNSwxMTQwLCA4NTcsMjM3NSwzMDcwLAozMzE5LDI4NjMsIDM4MCwgMTE2LDEzMjgsMjY5MywxMTYxLDIyNDQsIDI3MywxMjEyLDE4ODQsMjc2OSwzMDExLDE3NzUsMTE0MiwgNDYxLAozMDY2LDEyMDAsMjE0NywyMjEyLCA3OTAsIDcwMiwyNjk1LDQyMjIsMTYwMSwxMDU4LCA0MzQsMjMzOCw1MTUzLDM2NDAsICA2NywyMzYwLAo0MDk5LDI1MDIsIDYxOCwzNDcyLDEzMjksIDQxNiwxMTMyLCA4MzAsMjc4MiwxODA3LDI2NTMsMzIxMSwzNTEwLDE2NjIsIDE5MiwyMTI0LAogMjk2LDM5NzksMTczOSwxNjExLDM2ODQsICAyMywgMTE4LCAzMjQsIDQ0NiwxMjM5LDEyMjUsIDI5MywyNTIwLDM4MTQsMzc5NSwyNTM1LAozMTE2LCAgMTcsMTA3NCwgNDY3LDI2OTIsMjIwMSwgMzg3LDI5MjIsICA0NSwxMzI2LDMwNTUsMTY0NSwzNjU5LDI4MTcsIDk1OCwgMjQzLAoxOTAzLDIzMjAsMTMzOSwyODI1LDE3ODQsMzI4OSwgMzU2LCA1NzYsIDg2NSwyMzE1LDIzODEsMzM3NywzOTE2LDEwODgsMzEyMiwxNzEzLAoxNjU1LCA5MzUsIDYyOCw0Njg5LDEwMzQsMTMyNywgNDQxLCA4MDAsIDcyMCwgODk0LDE5NzksMjE4MywxNTI4LDUyODksMjcwMiwxMDcxLAo0MDQ2LDM1NzIsMjM5OSwxNTcxLDMyODEsICA3OSwgNzYxLDExMDMsIDMyNywgMTM0LCA3NTgsMTg5OSwxMzcxLDE2MTUsIDg3OSwgNDQyLAogMjE1LDI2MDUsMjU3OSwgMTczLDIwNDgsMjQ4NSwxMDU3LDI5NzUsMzMxNywxMDk3LDIyNTMsMzgwMSw0MjYzLDE0MDMsMTY1MCwyOTQ2LAogODE0LDQ5NjgsMzQ4NywxNTQ4LDI2NDQsMTU2NywxMjg1LCAgIDIsIDI5NSwyNjM2LCAgOTcsIDk0NiwzNTc2LCA4MzIsIDE0MSw0MjU3LAozMjczLCA3NjAsMzgyMSwzNTIxLDMxNTYsMjYwNywgOTQ5LDEwMjQsMTczMywxNTE2LDE4MDMsMTkyMCwyMTI1LDIyODMsMjY2NSwzMTgwLAoxNTAxLDIwNjQsMzU2MCwyMTcxLDE1OTIsIDgwMywzNTE4LDE0MTYsIDczMiwzODk3LDQyNTgsMTM2MywxMzYyLDI0NTgsIDExOSwxNDI3LAogNjAyLDE1MjUsMjYwOCwxNjA1LDE2MzksMzE3NSwgNjk0LDMwNjQsICAxMCwgNDY1LCAgNzYsMjAwMCw0ODQ2LDQyMDgsIDQ0NCwzNzgxLAoxNjE5LDMzNTMsMjIwNiwxMjczLDM3OTYsIDc0MCwyNDgzLCAzMjAsMTcyMywyMzc3LDM2NjAsMjYxOSwxMzU5LDExMzcsMTc2MiwxNzI0LAoyMzQ1LDI4NDIsMTg1MCwxODYyLCA5MTIsIDgyMSwxODY2LCA2MTIsMjYyNSwxNzM1LDI1NzMsMzM2OSwxMDkzLCA4NDQsICA4OSwgOTM3LAogOTMwLDE0MjQsMzU2NCwyNDEzLDI5NzIsMTAwNCwzMDQ2LDMwMTksMjAxMSwgNzExLDMxNzEsMTQ1Miw0MTc4LCA0MjgsIDgwMSwxOTQzLAogNDMyLCA0NDUsMjgxMSwgMjA2LDQxMzYsMTQ3MiwgNzMwLCAzNDksICA3MywgMzk3LDI4MDIsMjU0NywgOTk4LDE2MzcsMTE2NywgNzg5LAogMzk2LDMyMTcsIDE1NCwxMjE4LCA3MTYsMTEyMCwxNzgwLDI4MTksNDgyNiwxOTMxLDMzMzQsMzc2MiwyMTM5LDEyMTUsMjYyNywgNTUyLAozNjY0LDM2MjgsMzIzMiwxNDA1LDIzODMsMzExMSwxMzU2LDI2NTIsMzU3NywzMzIwLDMxMDEsMTcwMywgNjQwLDEwNDUsMTM3MCwxMjQ2LAo0OTk2LCAzNzEsMTU3NSwyNDM2LDE2MjEsMjIxMCwgOTg0LDQwMzMsMTczNCwyNjM4LCAgMTYsNDUyOSwgNjYzLDI3NTUsMzI1NSwxNDUxLAozOTE3LDIyNTcsMTI1MywxOTU1LDIyMzQsMTI2MywyOTUxLCAyMTQsMTIyOSwgNjE3LCA0ODUsIDM1OSwxODMxLDE5NjksIDQ3MywyMzEwLAogNzUwLDIwNTgsIDE2NSwgIDgwLDI4NjQsMjQxOSwgMzYxLDQzNDQsMjQxNiwyNDc5LDExMzQsIDc5NiwzNzI2LDEyNjYsMjk0MywgODYwLAoyNzE1LCA5MzgsIDM5MCwyNzM0LDEzMTMsMTM4NCwgMjQ4LCAyMDIsIDg3NywxMDY0LDI4NTQsIDUyMiwzOTA3LCAyNzksMTYwMiwgMjk3LAoyMzU3LCAzOTUsMzc0MCwgMTM3LDIwNzUsIDk0NCw0MDg5LDI1ODQsMTI2NywzODAyLCAgNjIsMTUzMywyMjg1LCAxNzgsIDE3NiwgNzgwLAoyNDQwLCAyMDEsMzcwNywgNTkwLCA0NzgsMTU2MCw0MzU0LDIxMTcsMTA3NSwgIDMwLCAgNzQsNDY0Myw0MDA0LDE2MzUsMTQ0MSwyNzQ1LAogNzc2LDI1OTYsIDIzOCwxMDc3LDE2OTIsMTkxMiwyODQ0LCA2MDUsIDQ5OSwxNzQyLDM5NDcsIDI0MSwzMDUzLCA5ODAsMTc0OSwgOTM2LAoyNjQwLDQ1MTEsMjU4MiwgNTE1LDE1NDMsMjE2Miw1MzIyLDI4OTIsMjk5MywgODkwLDIxNDgsMTkyNCwgNjY1LDE4MjcsMzU4MSwxMDMyLAogOTY4LDMxNjMsIDMzOSwxMDQ0LDE4OTYsIDI3MCwgNTgzLDE3OTEsMTcyMCw0MzY3LDExOTQsMzQ4OCwzNjY5LCAgNDMsMjUyMywxNjU3LAogMTYzLDIxNjcsIDI5MCwxMjA5LDE2MjIsMzM3OCwgNTUwLCA2MzQsMjUwOCwyNTEwLCA2OTUsMjYzNCwyMzg0LDI1MTIsMTQ3NiwxNDE0LAogMjIwLDE0NjksMjM0MSwyMTM4LDI4NTIsMzE4MywyOTAwLDQ5MzksMjg2NSwzNTAyLDEyMTEsMzY4MCwgODU0LDMyMjcsMTI5OSwyOTc2LAozMTcyLCAxODYsMjk5OCwxNDU5LCA0NDMsMTA2NywzMjUxLDE0OTUsIDMyMSwxOTMyLDMwNTQsIDkwOSwgNzUzLDE0MTAsMTgyOCwgNDM2LAoyNDQxLDExMTksMTU4NywzMTY0LDIxODYsMTI1OCwgMjI3LCAyMzEsMTQyNSwxODkwLDMyMDAsMzk0MiwgMjQ3LCA5NTksIDcyNSw1MjU0LAoyNzQxLCA1NzcsMjE1OCwyMDc5LCA5MjksIDEyMCwgMTc0LCA4MzgsMjgxMywgNTkxLDExMTUsIDQxNywyMDI0LCAgNDAsMzI0MCwxNTM2LAoxMDM3LCAyOTEsNDE1MSwyMzU0LCA2MzIsMTI5OCwyNDA2LDI1MDAsMzUzNSwxODI1LDE4NDYsMzQ1MSwgMjA1LDExNzEsIDM0NSw0MjM4LAogIDE4LDExNjMsIDgxMSwgNjg1LDIyMDgsMTIxNywgNDI1LDEzMTIsMTUwOCwxMTc1LDQzMDgsMjU1MiwxMDMzLCA1ODcsMTM4MSwzMDU5LAoyOTg0LDM0ODIsIDM0MCwxMzE2LDQwMjMsMzk3MiwgNzkyLDMxNzYsIDUxOSwgNzc3LDQ2OTAsIDkxOCwgOTMzLDQxMzAsMjk4MSwzNzQxLAogIDkwLDMzNjAsMjkxMSwyMjAwLDUxODQsNDU1MCwgNjA5LDMwNzksMjAzMCwgMjcyLDMzNzksMjczNiwgMzYzLDM4ODEsMTEzMCwxNDQ3LAogMjg2LCA3NzksIDM1NywxMTY5LDMzNTAsMzEzNywxNjMwLDEyMjAsMjY4NywyMzkxLCA3NDcsMTI3NywzNjg4LDI2MTgsMjY4MiwyNjAxLAoxMTU2LDMxOTYsNTI5MCw0MDM0LDMxMDIsMTY4OSwzNTk2LDMxMjgsIDg3NCwgMjE5LDI3ODMsIDc5OCwgNTA4LDE4NDMsMjQ2MSwgMjY5LAoxNjU4LDE3NzYsMTM5MiwxOTEzLDI5ODMsMzI4NywyODY2LDIxNTksMjM3MiwgODI5LDQwNzYsICA0Niw0MjUzLDI4NzMsMTg4OSwxODk0LAogOTE1LDE4MzQsMTYzMSwyMTgxLDIzMTgsIDI5OCwgNjY0LDI4MTgsMzU1NSwyNzM1LCA5NTQsMzIyOCwzMTE3LCA1MjcsMzUxMSwyMTczLAogNjgxLDI3MTIsMzAzMywyMjQ3LDIzNDYsMzQ2NywxNjUyLCAxNTUsMjE2NCwzMzgyLCAxMTMsMTk5NCwgNDUwLCA4OTksIDQ5NCwgOTk0LAoxMjM3LDI5NTgsMTg3NSwyMzM2LDE5MjYsMzcyNywgNTQ1LDE1NzcsMTU1MCwgNjMzLDM0NzMsIDIwNCwxMzA1LDMwNzIsMjQxMCwxOTU2LAoyNDcxLCA3MDcsMjEzNCwgODQxLDIxOTUsMjE5NiwyNjYzLDM4NDMsMTAyNiw0OTQwLCA5OTAsMzI1Miw0OTk3LCAzNjgsMTA5MiwgNDM3LAozMjEyLDMyNTgsMTkzMywxODI5LCA2NzUsMjk3NywyODkzLCA0MTIsIDk0MywzNzIzLDQ2NDQsMzI5NCwzMjgzLDIyMzAsMjM3Myw1MTU0LAoyMzg5LDIyNDEsMjY2MSwyMzIzLDE0MDQsMjUyNCwgNTkzLCA3ODcsIDY3NywzMDA4LDEyNzUsMjA1OSwgNDM4LDI3MDksMjYwOSwyMjQwLAoyMjY5LDIyNDYsMTQ0NiwgIDM2LDE1NjgsMTM3MywzODkyLDE1NzQsMjMwMSwxNDU2LDM5NjIsIDY5MywyMjc2LDUyMTYsMjAzNSwxMTQzLAoyNzIwLDE5MTksMTc5NywxODExLDI3NjMsNDEzNywyNTk3LDE4MzAsMTY5OSwxNDg4LDExOTgsMjA5MCwgNDI0LDE2OTQsIDMxMiwzNjM0LAozMzkwLDQxNzksMzMzNSwyMjUyLDEyMTQsIDU2MSwxMDU5LDMyNDMsMjI5NSwyNTYxLCA5NzUsNTE1NSwyMzIxLDI3NTEsMzc3MiwgNDcyLAoxNTM3LDMyODIsMzM5OCwxMDQ3LDIwNzcsMjM0OCwyODc4LDEzMjMsMzM0MCwzMDc2LCA2OTAsMjkwNiwgIDUxLCAzNjksIDE3MCwzNTQxLAoxMDYwLDIxODcsMjY4OCwzNjcwLDI1NDEsMTA4MywxNjgzLCA5MjgsMzkxOCwgNDU5LCAxMDksNDQyNywgNTk5LDM3NDQsNDI4NiwgMTQzLAoyMTAxLDI3MzAsMjQ5MCwgIDgyLDE1ODgsMzAzNiwyMTIxLCAyODEsMTg2MCwgNDc3LDQwMzUsMTIzOCwyODEyLDMwMjAsMjcxNiwzMzEyLAoxNTMwLDIxODgsMjA1NSwxMzE3LCA4NDMsIDYzNiwxODA4LDExNzMsMzQ5NSwgNjQ5LCAxODEsMTAwMiwgMTQ3LDM2NDEsMTE1OSwyNDE0LAozNzUwLDIyODksMjc5NSwgODEzLDMxMjMsMjYxMCwxMTM2LDQzNjgsICAgNSwzMzkxLDQ1NDEsMjE3NCwgNDIwLCA0MjksMTcyOCwgNzU0LAoxMjI4LDIxMTUsMjIxOSwgMzQ3LDIyMjMsMjczMywgNzM1LDE1MTgsMzAwMywyMzU1LDMxMzQsMTc2NCwzOTQ4LDMzMjksMTg4OCwyNDI0LAoxMDAxLDEyMzQsMTk3MiwzMzIxLDMzNjMsMTY3MiwxMDIxLDE0NTAsMTU4NCwgMjI2LCA3NjUsIDY1NSwyNTI2LDM0MDQsMzI0NCwyMzAyLAozNjY1LCA3MzEsIDU5NCwyMTg0LCAzMTksMTU3NiwgNjIxLCA2NTgsMjY1Niw0Mjk5LDIwOTksMzg2NCwxMjc5LDIwNzEsMjU5OCwyNzM5LAogNzk1LDMwODYsMzY5OSwzOTA4LDE3MDcsMjM1MiwyNDAyLDEzODIsMzEzNiwyNDc1LDE0NjUsNDg0NywzNDk2LDM4NjUsMTA4NSwzMDA0LAoyNTkxLDEwODQsIDIxMywyMjg3LDE5NjMsMzU2NSwyMjUwLCA4MjIsIDc5Myw0NTc0LDMxODcsMTc3MiwxNzg5LDMwNTAsIDU5NSwxNDg0LAoxOTU5LDI3NzAsMTA4MCwyNjUwLCA0NTYsIDQyMiwyOTk2LCA5NDAsMzMyMiw0MzI4LDQzNDUsMzA5MiwyNzQyLCA5NjUsMjc4NCwgNzM5LAo0MTI0LCA5NTIsMTM1OCwyNDk4LDI5NDksMjU2NSwgMzMyLDI2OTgsMjM3OCwgNjYwLDIyNjAsMjQ3Myw0MTk0LDM4NTYsMjkxOSwgNTM1LAoxMjYwLDI2NTEsMTIwOCwxNDI4LDEzMDAsMTk0OSwxMzAzLDI5NDIsIDQzMywyNDU1LDI0NTAsMTI1MSwxOTQ2LCA2MTQsMTI2OSwgNjQxLAoxMzA2LDE4MTAsMjczNywzMDc4LDI5MTIsIDU2NCwyMzY1LDE0MTksMTQxNSwxNDk3LDQ0NjAsMjM2NywyMTg1LDEzNzksMzAwNSwxMzA3LAozMjE4LDIxNzUsMTg5NywzMDYzLCA2ODIsMTE1Nyw0MDQwLDQwMDUsMTcxMiwxMTYwLDE5NDEsMTM5OSwgMzk0LCA0MDIsMjk1MiwxNTczLAoxMTUxLDI5ODYsMjQwNCwgODYyLCAyOTksMjAzMywxNDg5LDMwMDYsIDM0NiwgMTcxLDI4ODYsMzQwMSwxNzI2LDI5MzIsIDE2OCwyNTMzLAogIDQ3LDI1MDcsMTAzMCwzNzM1LDExNDUsMzM3MCwxMzk1LDEzMTgsMTU3OSwzNjA5LDQ1NjAsMjg1Nyw0MTE2LDE0NTcsMjUyOSwxOTY1LAogNTA0LDEwMzYsMjY5MCwyOTg4LDI0MDUsIDc0NSw1ODcxLCA4NDksMjM5NywyMDU2LDMwODEsIDg2MywyMzU5LDM4NTcsMjA5NiwgIDk5LAoxMzk3LDE3NjksMjMwMCw0NDI4LDE2NDMsMzQ1NSwxOTc4LDE3NTcsMzcxOCwxNDQwLCAgMzUsNDg3OSwzNzQyLDEyOTYsNDIyOCwyMjgwLAogMTYwLDUwNjMsMTU5OSwyMDEzLCAxNjYsIDUyMCwzNDc5LDE2NDYsMzM0NSwzMDEyLCA0OTAsMTkzNywxNTQ1LDEyNjQsMjE4MiwyNTA1LAoxMDk2LDExODgsMTM2OSwxNDM2LDI0MjEsMTY2NywyNzkyLDI0NjAsMTI3MCwyMTIyLCA3MjcsMzE2NywyMTQzLCA4MDYsMTcwNiwxMDEyLAoxODAwLDMwMzcsIDk2MCwyMjE4LDE4ODIsIDgwNSwgMTM5LDI0NTYsMTEzOSwxNTIxLCA4NTEsMTA1MiwzMDkzLDMwODksIDM0MiwyMDM5LAogNzQ0LDUwOTcsMTQ2OCwxNTAyLDE1ODUsMjA4NywgMjIzLCA5MzksIDMyNiwyMTQwLDI1NzcsIDg5MiwyNDgxLDE2MjMsNDA3NywgOTgyLAozNzA4LCAxMzUsMjEzMSwgIDg3LDI1MDMsMzExNCwyMzI2LDExMDYsIDg3NiwxNjE2LCA1NDcsMjk5NywyODMxLDIwOTMsMzQ0MSw0NTMwLAo0MzE0LCAgIDksMzI1Niw0MjI5LDQxNDgsIDY1OSwxNDYyLDE5ODYsMTcxMCwyMDQ2LDI5MTMsMjIzMSw0MDkwLDQ4ODAsNTI1NSwzMzkyLAozMjc0LDEzNjgsMzY4OSw0NjQ1LDE0NzcsIDcwNSwzMzg0LDM2MzUsMTA2OCwxNTI5LDI5NDEsMTQ1OCwzNzgyLDE1MDksIDEwMCwxNjU2LAoyNTQ4LCA3MTgsMjMzOSwgNDA4LDE1OTAsMjc4MCwzNTQ4LDE4MzgsNDExNywzNzE5LDEzNDUsMzUzMCwgNzE3LDM0NDIsMjc3OCwzMjIwLAoyODk4LDE4OTIsNDU5MCwzNjE0LDMzNzEsMjA0MywxOTk4LDEyMjQsMzQ4MywgODkxLCA2MzUsIDU4NCwyNTU5LDMzNTUsIDczMywxNzY2LAoxNzI5LDExNzIsMzc4OSwxODkxLDIzMDcsIDc4MSwyOTgyLDIyNzEsMTk1NywxNTgwLDU3NzMsMjYzMywyMDA1LDQxOTUsMzA5NywxNTM1LAozMjEzLDExODksMTkzNCw1NjkzLDMyNjIsIDU4NiwzMTE4LDEzMjQsMTU5OCwgNTE3LDE1NjQsMjIxNywxODY4LDE4OTMsNDQ0NSwzNzI4LAoyNzAzLDMxMzksMTUyNiwxNzg3LDE5OTIsMzg4MiwyODc1LDE1NDksMTE5OSwxMDU2LDIyMjQsMTkwNCwyNzExLDUwOTgsNDI4NywgMzM4LAoxOTkzLDMxMjksMzQ4OSwyNjg5LDE4MDksMjgxNSwxOTk3LCA5NTcsMTg1NSwzODk4LDI1NTAsMzI3NSwzMDU3LDExMDUsMTMxOSwgNjI3LAoxNTA1LDE5MTEsMTg4MywzNTI2LCA2OTgsMzYyOSwzNDU2LDE4MzMsMTQzMSwgNzQ2LCAgNzcsMTI2MSwyMDE3LDIyOTYsMTk3NywxODg1LAogMTI1LDEzMzQsMTYwMCwgNTI1LDE3OTgsMTEwOSwyMjIyLDE0NzAsMTk0NSwgNTU5LDIyMzYsMTE4NiwzNDQzLDI0NzYsMTkyOSwxNDExLAoyNDExLDMxMzUsMTc3NywzMzcyLDI2MjEsMTg0MSwxNjEzLDMyMjksIDY2OCwxNDMwLDE4MzksMjY0MywyOTE2LCAxOTUsMTk4OSwyNjcxLAoyMzU4LDEzODcsIDYyOSwzMjA1LDIyOTMsNTI1Niw0NDM5LCAxMjMsMTMxMCwgODg4LDE4NzksNDMwMCwzMDIxLDM2MDUsMTAwMywxMTYyLAozMTkyLDI5MTAsMjAxMCwgMTQwLDIzOTUsMjg1OSwgIDU1LDEwODIsMjAxMiwyOTAxLCA2NjIsIDQxOSwyMDgxLDE0MzgsIDY4MCwyNzc0LAo0NjU0LDM5MTIsMTYyMCwxNzMxLDE2MjUsNTAzNSw0MDY1LDIzMjgsIDUxMiwxMzQ0LCA4MDIsNTQ0MywyMTYzLDIzMTEsMjUzNywgNTI0LAozMzk5LCAgOTgsMTE1NSwyMTAzLDE5MTgsMjYwNiwzOTI1LDI4MTYsMTM5MywyNDY1LDE1MDQsMzc3MywyMTc3LDM5NjMsMTQ3OCw0MzQ2LAogMTgwLDExMTMsNDY1NSwzNDYxLDIwMjgsMTY5OCwgODMzLDI2OTYsMTIzNSwxMzIyLDE1OTQsNDQwOCwzNjIzLDMwMTMsMzIyNSwyMDQwLAozMDIyLCA1NDEsMjg4MSwgNjA3LDM2MzIsMjAyOSwxNjY1LDEyMTksIDYzOSwxMzg1LDE2ODYsMTA5OSwyODAzLDMyMzEsMTkzOCwzMTg4LAoyODU4LCA0MjcsIDY3NiwyNzcyLDExNjgsMjAyNSwgNDU0LDMyNTMsMjQ4NiwzNTU2LCAyMzAsMTk1MCwgNTgwLCA3OTEsMTk5MSwxMjgwLAoxMDg2LDE5NzQsMjAzNCwgNjMwLCAyNTcsMzMzOCwyNzg4LDQ5MDMsMTAxNywgIDg2LDQ3OTAsIDk2NiwyNzg5LDE5OTUsMTY5NiwxMTMxLAogMjU5LDMwOTUsNDE4OCwxMzA4LCAxNzksMTQ2Myw1MjU3LCAyODksNDEwNywxMjQ4LCAgNDIsMzQxMywxNzI1LDIyODgsIDg5NiwxOTQ3LAogNzc0LDQ0NzQsNDI1NCwgNjA0LDM0MzAsNDI2NCwgMzkyLDI1MTQsMjU4OCwgNDUyLCAyMzcsMTQwOCwzMDE4LCA5ODgsNDUzMSwxOTcwLAozMDM0LDMzMTAsIDU0MCwyMzcwLDE1NjIsMTI4OCwyOTkwLCA1MDIsNDc2NSwxMTQ3LCAgIDQsMTg1MywyNzA4LCAyMDcsIDI5NCwyODE0LAo0MDc4LDI5MDIsMjUwOSwgNjg0LCAgMzQsMzEwNSwzNTMyLDI1NTEsIDY0NCwgNzA5LDI4MDEsMjM0NCwgNTczLDE3MjcsMzU3MywzNTU3LAoyMDIxLDEwODEsMzEwMCw0MzE1LDIxMDAsMzY4MSwgMTk5LDIyNjMsMTgzNywyMzg1LCAxNDYsMzQ4NCwxMTk1LDI3NzYsMzk0OSwgOTk3LAoxOTM5LDM5NzMsMTAwOCwxMDkxLDEyMDIsMTk2MiwxODQ3LDExNDksNDIwOSw1NDQ0LDEwNzYsIDQ5MywgMTE3LDU0MDAsMjUyMSwgOTcyLAoxNDkwLDI5MzQsMTc5Niw0NTQyLDIzNzQsMTUxMiwyOTMzLDI2NTcsIDQxMywyODg4LDExMzUsMjc2MiwyMzE0LDIxNTYsMTM1NSwyMzY5LAogNzY2LDIwMDcsMjUyNywyMTcwLDMxMjQsMjQ5MSwyNTkzLDI2MzIsNDc1NywyNDM3LCAyMzQsMzEyNSwzNTkxLDE4OTgsMTc1MCwxMzc2LAoxOTQyLDM0NjgsMzEzOCwgNTcwLDIxMjcsMjE0NSwzMjc2LDQxMzEsIDk2MiwgMTMyLDE0NDUsNDE5NiwgIDE5LCA5NDEsMzYyNCwzNDgwLAozMzY2LDE5NzMsMTM3NCw0NDYxLDM0MzEsMjYyOSwgMjgzLDI0MTUsMjI3NSwgODA4LDI4ODcsMzYyMCwyMTEyLDI1NjMsMTM1MywzNjEwLAogOTU1LDEwODksMzEwMywxMDUzLCAgOTYsICA4OCw0MDk3LCA4MjMsMzgwOCwxNTgzLCAzOTksIDI5Miw0MDkxLDMzMTMsIDQyMSwxMTI4LAogNjQyLDQwMDYsIDkwMywyNTM5LDE4NzcsMjA4MiwgNTk2LCAgMjksNDA2NiwxNzkwLCA3MjIsMjE1NywgMTMwLCA5OTUsMTU2OSwgNzY5LAoxNDg1LCA0NjQsIDUxMywyMjEzLCAyODgsMTkyMywxMTAxLDI0NTMsNDMxNiwgMTMzLCA0ODYsMjQ0NSwgIDUwLCA2MjUsIDQ4NywyMjA3LAogIDU3LCA0MjMsIDQ4MSwyOTYyLCAxNTksMzcyOSwxNTU4LCA0OTEsIDMwMywgNDgyLCA1MDEsIDI0MCwyODM3LCAxMTIsMzY0OCwyMzkyLAoxNzgzLCAzNjIsICAgOCwzNDMzLDM0MjIsIDYxMCwyNzkzLDMyNzcsMTM5MCwxMjg0LDE2NTQsICAyMSwzODIzLCA3MzQsIDM2NywgNjIzLAogMTkzLCAyODcsIDM3NCwxMDA5LDE0ODMsIDgxNiwgNDc2LCAzMTMsMjI1NSwyMzQwLDEyNjIsMjE1MCwyODk5LDExNDYsMjU4MSwgNzgyLAoyMTE2LDE2NTksMjAxOCwxODgwLCAyNTUsMzU4NiwzMzE0LDExMTAsMjg2NywyMTM3LDI1NjQsIDk4NiwyNzY3LDUxODUsMjAwNiwgNjUwLAogMTU4LCA5MjYsIDc2MiwgODgxLDMxNTcsMjcxNywyMzYyLDM1ODcsIDMwNiwzNjkwLDMyNDUsMTU0MiwzMDc3LDI0MjcsMTY5MSwyNDc4LAoyMTE4LDI5ODUsMzQ5MCwyNDM4LCA1MzksMjMwNSwgOTgzLCAxMjksMTc1NCwgMzU1LDQyMDEsMjM4NiwgODI3LDI5MjMsIDEwNCwxNzczLAoyODM4LDI3NzEsIDQxMSwyOTA1LDM5MTksIDM3NiwgNzY3LCAxMjIsMTExNCwgODI4LDI0MjIsMTgxNywzNTA2LCAyNjYsMzQ2MCwxMDA3LAoxNjA5LDQ5OTgsIDk0NSwyNjEyLDQ0MjksMjI3NCwgNzI2LDEyNDcsMTk2NCwyOTE0LDIxOTksMjA3MCw0MDAyLDQxMDgsIDY1NywzMzIzLAoxNDIyLCA1NzksIDQ1NSwyNzY0LDQ3MzcsMTIyMiwyODk1LDE2NzAsIDgyNCwxMjIzLDE0ODcsMjUyNSwgNTU4LCA4NjEsMzA4MCwgNTk4LAoyNjU5LDI1MTUsMTk2NywgNzUyLDI1ODMsMjM3NiwyMjE0LDQxODAsIDk3NywgNzA0LDI0NjQsNDk5OSwyNjIyLDQxMDksMTIxMCwyOTYxLAogODE5LDE1NDEsIDE0MiwyMjg0LCAgNDQsIDQxOCwgNDU3LDExMjYsMzczMCw0MzQ3LDQ2MjYsMTY0NCwxODc2LDM2NzEsMTg2NCwgMzAyLAoxMDYzLDU2OTQsIDYyNCwgNzIzLDE5ODQsMzc0NSwxMzE0LDE2NzYsMjQ4OCwxNjEwLDE0NDksMzU1OCwzNTY5LDIxNjYsMjA5OCwgNDA5LAoxMDExLDIzMjUsMzcwNCwyMzA2LCA4MTgsMTczMiwxMzgzLDE4MjQsMTg0NCwzNzU3LCA5OTksMjcwNSwzNDk3LDEyMTYsMTQyMywyNjgzLAoyNDI2LDI5NTQsMjUwMSwyNzI2LDIyMjksMTQ3NSwyNTU0LDUwNjQsMTk3MSwxNzk0LDE2NjYsMjAxNCwxMzQzLCA3ODMsIDcyNCwgMTkxLAoyNDM0LDEzNTQsMjIyMCw1MDY1LDE3NjMsMjc1MiwyNDcyLDQxNTIsIDEzMSwgMTc1LDI4ODUsMzQzNCwgIDkyLDE0NjYsNDkyMCwyNjE2LAozODcxLDM4NzIsMzg2NiwgMTI4LDE1NTEsMTYzMiwgNjY5LDE4NTQsMzY4Miw0NjkxLDQxMjUsMTIzMCwgMTg4LDI5NzMsMzI5MCwxMzAyLAoxMjEzLCA1NjAsMzI2NiwgOTE3LCA3NjMsMzkwOSwzMjQ5LDE3NjAsIDg2OCwxOTU4LCA3NjQsMTc4MiwyMDk3LCAxNDUsMjI3NywzNzc0LAo0NDYyLCAgNjQsMTQ5MSwzMDYyLCA5NzEsMjEzMiwzNjA2LDI0NDIsIDIyMSwxMjI2LDE2MTcsIDIxOCwgMzIzLDExODUsMzIwNywzMTQ3LAogNTcxLCA2MTksMTQ3MywxMDA1LDE3NDQsMjI4MSwgNDQ5LDE4ODcsMjM5NiwzNjg1LCAyNzUsIDM3NSwzODE2LDE3NDMsMzg0NCwzNzMxLAogODQ1LDE5ODMsMjM1MCw0MjEwLDEzNzcsIDc3MywgOTY3LDM0OTksMzA1MiwzNzQzLDI3MjUsNDAwNywxNjk3LDEwMjIsMzk0MywxNDY0LAozMjY0LDI4NTUsMjcyMiwxOTUyLDEwMjksMjgzOSwyNDY3LCAgODQsNDM4MywyMjE1LCA4MjAsMTM5MSwyMDE1LDI0NDgsMzY3MiwgMzc3LAoxOTQ4LDIxNjgsIDc5NywyNTQ1LDM1MzYsMjU3OCwyNjQ1LCAgOTQsMjg3NCwxNjc4LCA0MDUsMTI1OSwzMDcxLCA3NzEsIDU0NiwxMzE1LAogNDcwLDEyNDMsMzA4MywgODk1LDI0NjgsIDk4MSwgOTY5LDIwMzcsIDg0Niw0MTgxLCA2NTMsMTI3NiwyOTI4LCAgMTQsMjU5NCwgNTU3LAozMDA3LDI0NzQsIDE1NiwgOTAyLDEzMzgsMTc0MCwyNTc0LCA1MzcsMjUxOCwgOTczLDIyODIsMjIxNiwyNDMzLDE5MjgsIDEzOCwyOTAzLAoxMjkzLDI2MzEsMTYxMiwgNjQ2LDM0NTcsIDgzOSwyOTM1LCAxMTEsIDQ5NiwyMTkxLDI4NDcsIDU4OSwzMTg2LCAxNDksMzk5NCwyMDYwLAo0MDMxLDI2NDEsNDA2NywzMTQ1LDE4NzAsICAzNywzNTk3LDIxMzYsMTAyNSwyMDUxLDMwMDksMzM4MywzNTQ5LDExMjEsMTAxNiwzMjYxLAoxMzAxLCAyNTEsMjQ0NiwyNTk5LDIxNTMsIDg3MiwzMjQ2LCA2MzcsIDMzNCwzNzA1LCA4MzEsIDg4NCwgOTIxLDMwNjUsMzE0MCw0MDkyLAoyMTk4LDE5NDQsIDI0NiwyOTY0LCAxMDgsMjA0NSwxMTUyLDE5MjEsMjMwOCwxMDMxLCAyMDMsMzE3Myw0MTcwLDE5MDcsMzg5MCwgODEwLAoxNDAxLDIwMDMsMTY5MCwgNTA2LCA2NDcsMTI0MiwyODI4LDE3NjEsMTY0OSwzMjA4LDIyNDksMTU4OSwzNzA5LDI5MzEsNTE1NiwxNzA4LAogNDk4LCA2NjYsMjYxMywgODM0LDM4MTcsMTIzMSwgMTg0LDI4NTEsMTEyNCwgODgzLDMxOTcsMjI2MSwzNzEwLDE3NjUsMTU1MywyNjU4LAoxMTc4LDI2MzksMjM1MSwgIDkzLDExOTMsIDk0MiwyNTM4LDIxNDEsNDQwMiwgMjM1LDE4MjEsIDg3MCwxNTkxLDIxOTIsMTcwOSwxODcxLAozMzQxLDE2MTgsNDEyNiwyNTk1LDIzMzQsIDYwMywgNjUxLCAgNjksIDcwMSwgMjY4LDI2NjIsMzQxMSwyNTU1LDEzODAsMTYwNiwgNTAzLAogNDQ4LCAyNTQsMjM3MSwyNjQ2LCA1NzQsMTE4NywyMzA5LDE3NzAsIDMyMiwyMjM1LDEyOTIsMTgwMSwgMzA1LCA1NjYsMTEzMywgMjI5LAoyMDY3LDIwNTcsIDcwNiwgMTY3LCA0ODMsMjAwMiwyNjcyLDMyOTUsMTgyMCwzNTYxLDMwNjcsIDMxNiwgMzc4LDI3NDYsMzQ1MiwxMTEyLAogMTM2LDE5ODEsIDUwNywxNjUxLDI5MTcsMTExNywgMjg1LDQ1OTEsIDE4MiwyNTgwLDM1MjIsMTMwNCwgMzM1LDMzMDMsMTgzNSwyNTA0LAoxNzk1LDE3OTIsMjI0OCwgNjc0LDEwMTgsMjEwNiwyNDQ5LDE4NTcsMjI5MiwyODQ1LCA5NzYsMzA0NywxNzgxLDI2MDAsMjcyNywxMzg5LAoxMjgxLCAgNTIsMzE1MiwgMTUzLCAyNjUsMzk1MCwgNjcyLDM0ODUsMzk1MSw0NDYzLCA0MzAsMTE4MywgMzY1LCAyNzgsMjE2OSwgIDI3LAoxNDA3LDEzMzYsMjMwNCwgMjA5LDEzNDAsMTczMCwyMjAyLDE4NTIsMjQwMywyODgzLCA5NzksMTczNywxMDYyLCA2MzEsMjgyOSwyNTQyLAozODc2LDI1OTIsIDgyNSwyMDg2LDIyMjYsMzA0OCwzNjI1LCAzNTIsMTQxNywzNzI0LCA1NDIsIDk5MSwgNDMxLDEzNTEsMzkzOCwxODYxLAoyMjk0LCA4MjYsMTM2MSwyOTI3LDMxNDIsMzUwMywxNzM4LCA0NjMsMjQ2MiwyNzIzLCA1ODIsMTkxNiwxNTk1LDI4MDgsIDQwMCwzODQ1LAozODkxLDI4NjgsMzYyMSwyMjU0LCAgNTgsMjQ5MiwxMTIzLCA5MTAsMjE2MCwyNjE0LDEzNzIsMTYwMywxMTk2LDEwNzIsMzM4NSwxNzAwLAozMjY3LDE5ODAsIDY5NiwgNDgwLDI0MzAsIDkyMCwgNzk5LDE1NzAsMjkyMCwxOTUxLDIwNDEsNDA0NywyNTQwLDEzMjEsNDIyMywyNDY5LAozNTYyLDIyMjgsMTI3MSwyNjAyLCA0MDEsMjgzMywzMzUxLDI1NzUsNTE1NywgOTA3LDIzMTIsMTI1NiwgNDEwLCAyNjMsMzUwNywxNTgyLAogOTk2LCA2NzgsMTg0OSwyMzE2LDE0ODAsIDkwOCwzNTQ1LDIyMzcsIDcwMywyMzIyLCA2NjcsMTgyNiwyODQ5LDE1MzEsMjYwNCwyOTk5LAoyNDA3LDMxNDYsMjE1MSwyNjMwLDE3ODYsMzcxMSwgNDY5LDM1NDIsIDQ5NywzODk5LDI0MDksIDg1OCwgODM3LDQ0NDYsMzM5MywxMjc0LAogNzg2LCA2MjAsMTg0NSwyMDAxLDMzMTEsIDQ4NCwgMzA4LDMzNjcsMTIwNCwxODE1LDM2OTEsMjMzMiwxNTMyLDI1NTcsMTg0MiwyMDIwLAoyNzI0LDE5MjcsMjMzMyw0NDQwLCA1NjcsICAyMiwxNjczLDI3MjgsNDQ3NSwxOTg3LDE4NTgsMTE0NCwxNTk3LCAxMDEsMTgzMiwzNjAxLAogIDEyLCA5NzQsMzc4Myw0MzkxLCA5NTEsMTQxMiwgICAxLDM3MjAsIDQ1Myw0NjA4LDQwNDEsIDUyOCwxMDQxLDEwMjcsMzIzMCwyNjI4LAoxMTI5LCA4NzUsMTA1MSwzMjkxLDEyMDMsMjI2MiwxMDY5LDI4NjAsMjc5OSwyMTQ5LDI2MTUsMzI3OCwgMTQ0LDE3NTgsMzA0MCwgIDMxLAogNDc1LDE2ODAsIDM2NiwyNjg1LDMxODQsIDMxMSwxNjQyLDQwMDgsMjQ2Niw1MDM2LDE1OTMsMTQ5MywyODA5LCAyMTYsMTQyMCwxNjY4LAogMjMzLCAzMDQsMjEyOCwzMjg0LCAyMzIsMTQyOSwxNzY4LDEwNDAsMjAwOCwzNDA3LDI3NDAsMjk2NywyNTQzLCAyNDIsMjEzMywgNzc4LAoxNTY1LDIwMjIsMjYyMCwgNTA1LDIxODksMjc1NiwxMDk4LDIyNzMsIDM3MiwxNjE0LCA3MDgsIDU1MywyODQ2LDIwOTQsMjI3OCwgMTY5LAozNjI2LDI4MzUsNDE2MSwgMjI4LDI2NzQsMzE2NSwgODA5LDE0NTQsMTMwOSwgNDY2LDE3MDUsMTA5NSwgOTAwLDM0MjMsIDg4MCwyNjY3LAozNzUxLDUyNTgsMjMxNywzMTA5LDI1NzEsNDMxNywyNzY2LDE1MDMsMTM0MiwgODY2LDQ0NDcsMTExOCwgIDYzLDIwNzYsIDMxNCwxODgxLAoxMzQ4LDEwNjEsIDE3MiwgOTc4LDM1MTUsMTc0NywgNTMyLCA1MTEsMzk3MCwgICA2LCA2MDEsIDkwNSwyNjk5LDMzMDAsMTc1MSwgMjc2LAoxNDY3LDM3MjUsMjY2OCwgIDY1LDQyMzksMjU0NCwyNzc5LDI1NTYsMTYwNCwgNTc4LDI0NTEsMTgwMiwgOTkyLDIzMzEsMjYyNCwxMzIwLAozNDQ2LCA3MTMsMTUxMywxMDEzLCAxMDMsMjc4NiwyNDQ3LDE2NjEsIDg4NiwxNzAyLCA5MTYsIDY1NCwzNTc0LDIwMzEsMTU1NiwgNzUxLAoyMTc4LDI4MjEsMjE3OSwxNDk4LDE1MzgsMjE3NiwgMjcxLCA5MTQsMjI1MSwyMDgwLDEzMjUsIDYzOCwxOTUzLDI5MzcsMzg3NywyNDMyLAoyNzU0LCAgOTUsMzI2NSwxNzE2LCAyNjAsMTIyNyw0MDgzLCA3NzUsIDEwNiwxMzU3LDMyNTQsIDQyNiwxNjA3LCA1NTUsMjQ4MCwgNzcyLAoxOTg1LCAyNDQsMjU0NiwgNDc0LCA0OTUsMTA0NiwyNjExLDE4NTEsMjA2MSwgIDcxLDIwODksMTY3NSwyNTkwLCA3NDIsMzc1OCwyODQzLAozMjIyLDE0MzMsIDI2NywyMTgwLDI1NzYsMjgyNiwyMjMzLDIwOTIsMzkxMywyNDM1LCA5NTYsMTc0NSwzMDc1LCA4NTYsMjExMywxMTE2LAogNDUxLCAgIDMsMTk4OCwyODk2LDEzOTgsIDk5MywyNDYzLDE4NzgsMjA0OSwxMzQxLDI3MTgsMjcyMSwyODcwLDIxMDgsIDcxMiwyOTA0LAo0MzYzLDI3NTMsMjMyNCwgMjc3LDI4NzIsMjM0OSwyNjQ5LCAzODQsIDk4NywgNDM1LCA2OTEsMzAwMCwgOTIyLCAxNjQsMzkzOSwgNjUyLAoxNTAwLDExODQsNDE1MywyNDgyLDMzNzMsMjE2NSw0ODQ4LDIzMzUsMzc3NSwzNTA4LDMxNTQsMjgwNiwyODMwLDE1NTQsMjEwMiwxNjY0LAoyNTMwLDE0MzQsMjQwOCwgODkzLDE1NDcsMjYyMywzNDQ3LDI4MzIsMjI0MiwyNTMyLDMxNjksMjg1NiwzMjIzLDIwNzgsICA0OSwzNzcwLAozNDY5LCA0NjIsIDMxOCwgNjU2LDIyNTksMzI1MCwzMDY5LCA2NzksMTYyOSwyNzU4LCAzNDQsMTEzOCwxMTA0LDMxMjAsMTgzNiwxMjgzLAozMTE1LDIxNTQsMTQzNyw0NDQ4LCA5MzQsIDc1OSwxOTk5LCA3OTQsMjg2MiwxMDM4LCA1MzMsMjU2MCwxNzIyLDIzNDIsIDg1NSwyNjI2LAoxMTk3LDE2NjMsNDQ3NiwzMTI3LCAgODUsNDI0MCwyNTI4LCAgMjUsMTExMSwxMTgxLDM2NzMsIDQwNywzNDcwLDQ1NjEsMjY3OSwyNzEzLAogNzY4LDE5MjUsMjg0MSwzOTg2LDE1NDQsMTE2NSwgOTMyLCAzNzMsMTI0MCwyMTQ2LDE5MzAsMjY3MywgNzIxLDQ3NjYsIDM1NCw0MzMzLAogMzkxLDI5NjMsIDE4NywgIDYxLDMzNjQsMTQ0MiwxMTAyLCAzMzAsMTk0MCwxNzY3LCAzNDEsMzgwOSw0MTE4LCAzOTMsMjQ5NiwyMDYyLAoyMjExLCAxMDUsIDMzMSwgMzAwLCA0MzksIDkxMywxMzMyLCA2MjYsIDM3OSwzMzA0LDE1NTcsIDMyOCwgNjg5LDM5NTIsIDMwOSwxNTU1LAogOTMxLCAzMTcsMjUxNywzMDI3LCAzMjUsIDU2OSwgNjg2LDIxMDcsMzA4NCwgIDYwLDEwNDIsMTMzMywyNzk0LCAyNjQsMzE3Nyw0MDE0LAoxNjI4LCAyNTgsMzcxMiwgICA3LDQ0NjQsMTE3NiwxMDQzLDE3NzgsIDY4MywgMTE0LDE5NzUsICA3OCwxNDkyLCAzODMsMTg4NiwgNTEwLAogMzg2LCA2NDUsNTI5MSwyODkxLDIwNjksMzMwNSw0MTM4LDM4NjcsMjkzOSwyNjAzLDI0OTMsMTkzNSwxMDY2LDE4NDgsMzU4OCwxMDE1LAoxMjgyLDEyODksNDYwOSwgNjk3LDE0NTMsMzA0NCwyNjY2LDM2MTEsMTg1NiwyNDEyLCAgNTQsIDcxOSwxMzMwLCA1NjgsMzc3OCwyNDU5LAoxNzQ4LCA3ODgsIDQ5MiwgNTUxLDExOTEsMTAwMCwgNDg4LDMzOTQsMzc2MywgMjgyLDE3OTksIDM0OCwyMDE2LDE1MjMsMzE1NSwyMzkwLAoxMDQ5LCAzODIsMjAxOSwxNzg4LDExNzAsIDcyOSwyOTY4LDM1MjMsIDg5NywzOTI2LDI3ODUsMjkzOCwzMjkyLCAzNTAsMjMxOSwzMjM4LAoxNzE4LDE3MTcsMjY1NSwzNDUzLDMxNDMsNDQ2NSwgMTYxLDI4ODksMjk4MCwyMDA5LDE0MjEsICA1NiwxOTA4LDE2NDAsMjM4NywyMjMyLAoxOTE3LDE4NzQsMjQ3Nyw0OTIxLCAxNDgsICA4MywzNDM4LCA1OTIsNDI0NSwyODgyLDE4MjIsMTA1NSwgNzQxLCAxMTUsMTQ5NiwxNjI0LAogMzgxLDE2MzgsNDU5MiwxMDIwLCA1MTYsMzIxNCwgNDU4LCA5NDcsNDU3NSwxNDMyLCAyMTEsMTUxNCwyOTI2LDE4NjUsMjE0MiwgMTg5LAogODUyLDEyMjEsMTQwMCwxNDg2LCA4ODIsMjI5OSw0MDM2LCAzNTEsICAyOCwxMTIyLCA3MDAsNjQ3OSw2NDgwLDY0ODEsNjQ4Miw2NDgzLCAgI2xhc3QgNTEyCikKClBLAwQUAAAAAAAAACEAfqv+j9oGAADaBgAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMnByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBHQjIzMTJfU01fTU9ERUwKCmNsYXNzIEdCMjMxMlByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihHQjIzMTJQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShHQjIzMTJfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiR0IyMzEyIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiQ2hpbmVzZSIKUEsDBBQAAAAAAAAAIQANKdOyDjYAAA42AAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvaGVicmV3cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgICAgICAgICAgU2h5IFNoYWxvbQojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDUKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQoKIyBUaGlzIHByb2JlciBkb2Vzbid0IGFjdHVhbGx5IHJlY29nbml6ZSBhIGxhbmd1YWdlIG9yIGEgY2hhcnNldC4KIyBJdCBpcyBhIGhlbHBlciBwcm9iZXIgZm9yIHRoZSB1c2Ugb2YgdGhlIEhlYnJldyBtb2RlbCBwcm9iZXJzCgojIyMgR2VuZXJhbCBpZGVhcyBvZiB0aGUgSGVicmV3IGNoYXJzZXQgcmVjb2duaXRpb24gIyMjCiMKIyBGb3VyIG1haW4gY2hhcnNldHMgZXhpc3QgaW4gSGVicmV3OgojICJJU08tODg1OS04IiAtIFZpc3VhbCBIZWJyZXcKIyAid2luZG93cy0xMjU1IiAtIExvZ2ljYWwgSGVicmV3CiMgIklTTy04ODU5LTgtSSIgLSBMb2dpY2FsIEhlYnJldwojICJ4LW1hYy1oZWJyZXciIC0gPz8gTG9naWNhbCBIZWJyZXcgPz8KIwojIEJvdGggIklTTyIgY2hhcnNldHMgdXNlIGEgY29tcGxldGVseSBpZGVudGljYWwgc2V0IG9mIGNvZGUgcG9pbnRzLCB3aGVyZWFzCiMgIndpbmRvd3MtMTI1NSIgYW5kICJ4LW1hYy1oZWJyZXciIGFyZSB0d28gZGlmZmVyZW50IHByb3BlciBzdXBlcnNldHMgb2YKIyB0aGVzZSBjb2RlIHBvaW50cy4gd2luZG93cy0xMjU1IGRlZmluZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZQojIDB4ODAtMHg5RiBhcyBzb21lIG1pc2MgcHVuY3R1YXRpb24gbWFya3MgYXMgd2VsbCBhcyBzb21lIEhlYnJldy1zcGVjaWZpYwojIGRpYWNyaXRpY3MgYW5kIGFkZGl0aW9uYWwgJ1lpZGRpc2gnIGxpZ2F0dXJlIGxldHRlcnMgaW4gdGhlIHJhbmdlIDB4YzAtMHhkNi4KIyB4LW1hYy1oZWJyZXcgZGVmaW5lcyBzaW1pbGFyIGFkZGl0aW9uYWwgY29kZSBwb2ludHMgYnV0IHdpdGggYSBkaWZmZXJlbnQKIyBtYXBwaW5nLgojCiMgQXMgZmFyIGFzIGFuIGF2ZXJhZ2UgSGVicmV3IHRleHQgd2l0aCBubyBkaWFjcml0aWNzIGlzIGNvbmNlcm5lZCwgYWxsIGZvdXIKIyBjaGFyc2V0cyBhcmUgaWRlbnRpY2FsIHdpdGggcmVzcGVjdCB0byBjb2RlIHBvaW50cy4gTWVhbmluZyB0aGF0IGZvciB0aGUKIyBtYWluIEhlYnJldyBhbHBoYWJldCwgYWxsIGZvdXIgbWFwIHRoZSBzYW1lIHZhbHVlcyB0byBhbGwgMjcgSGVicmV3IGxldHRlcnMKIyAoaW5jbHVkaW5nIGZpbmFsIGxldHRlcnMpLgojCiMgVGhlIGRvbWluYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBjaGFyc2V0cyBpcyB0aGVpciBkaXJlY3Rpb25hbGl0eS4KIyAiVmlzdWFsIiBkaXJlY3Rpb25hbGl0eSBtZWFucyB0aGF0IHRoZSB0ZXh0IGlzIG9yZGVyZWQgYXMgaWYgdGhlIHJlbmRlcmVyIGlzCiMgbm90IGF3YXJlIG9mIGEgQklESSByZW5kZXJpbmcgYWxnb3JpdGhtLiBUaGUgcmVuZGVyZXIgc2VlcyB0aGUgdGV4dCBhbmQKIyBkcmF3cyBpdCBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9yZGVyZWQgbmF0dXJhbGx5IGlzIHJlYWQKIyBiYWNrd2FyZHMuIEEgYnVmZmVyIG9mIFZpc3VhbCBIZWJyZXcgZ2VuZXJhbGx5IGxvb2tzIGxpa2Ugc286CiMgIltsYXN0IHdvcmQgb2YgZmlyc3QgbGluZSBzcGVsbGVkIGJhY2t3YXJkc10gW3dob2xlIGxpbmUgb3JkZXJlZCBiYWNrd2FyZHMKIyBhbmQgc3BlbGxlZCBiYWNrd2FyZHNdIFtmaXJzdCB3b3JkIG9mIGZpcnN0IGxpbmUgc3BlbGxlZCBiYWNrd2FyZHNdCiMgW2VuZCBvZiBsaW5lXSBbbGFzdCB3b3JkIG9mIHNlY29uZCBsaW5lXSAuLi4gZXRjJyAiCiMgYWRkaW5nIHB1bmN0dWF0aW9uIG1hcmtzLCBudW1iZXJzIGFuZCBFbmdsaXNoIHRleHQgdG8gdmlzdWFsIHRleHQgaXMKIyBuYXR1cmFsbHkgYWxzbyAidmlzdWFsIiBhbmQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgojCiMgIkxvZ2ljYWwiIGRpcmVjdGlvbmFsaXR5IG1lYW5zIHRoZSB0ZXh0IGlzIG9yZGVyZWQgIm5hdHVyYWxseSIgYWNjb3JkaW5nIHRvCiMgdGhlIG9yZGVyIGl0IGlzIHJlYWQuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcmVuZGVyZXIgdG8gZGlzcGxheQojIHRoZSB0ZXh0IGZyb20gcmlnaHQgdG8gbGVmdC4gQSBCSURJIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBsYWNlIGdlbmVyYWwKIyBwdW5jdHVhdGlvbiBtYXJrcywgbnVtYmVycyBhbmQgRW5nbGlzaCB0ZXh0IGluIHRoZSB0ZXh0LgojCiMgVGV4dHMgaW4geC1tYWMtaGVicmV3IGFyZSBhbG1vc3QgaW1wb3NzaWJsZSB0byBmaW5kIG9uIHRoZSBJbnRlcm5ldC4gRnJvbQojIHdoYXQgbGl0dGxlIGV2aWRlbmNlIEkgY291bGQgZmluZCwgaXQgc2VlbXMgdGhhdCBpdHMgZ2VuZXJhbCBkaXJlY3Rpb25hbGl0eQojIGlzIExvZ2ljYWwuCiMKIyBUbyBzdW0gdXAgYWxsIG9mIHRoZSBhYm92ZSwgdGhlIEhlYnJldyBwcm9iaW5nIG1lY2hhbmlzbSBrbm93cyBhYm91dCB0d28KIyBjaGFyc2V0czoKIyBWaXN1YWwgSGVicmV3IC0gIklTTy04ODU5LTgiIC0gYmFja3dhcmRzIHRleHQgLSBXb3JkcyBhbmQgc2VudGVuY2VzIGFyZQojICAgIGJhY2t3YXJkcyB3aGlsZSBsaW5lIG9yZGVyIGlzIG5hdHVyYWwuIEZvciBjaGFyc2V0IHJlY29nbml0aW9uIHB1cnBvc2VzCiMgICAgdGhlIGxpbmUgb3JkZXIgaXMgdW5pbXBvcnRhbnQgKEluIGZhY3QsIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLCBldmVuCiMgICAgd29yZCBvcmRlciBpcyB1bmltcG9ydGFudCkuCiMgTG9naWNhbCBIZWJyZXcgLSAid2luZG93cy0xMjU1IiAtIG5vcm1hbCwgbmF0dXJhbGx5IG9yZGVyZWQgdGV4dC4KIwojICJJU08tODg1OS04LUkiIGlzIGEgc3Vic2V0IG9mIHdpbmRvd3MtMTI1NSBhbmQgZG9lc24ndCBuZWVkIHRvIGJlCiMgICAgc3BlY2lmaWNhbGx5IGlkZW50aWZpZWQuCiMgIngtbWFjLWhlYnJldyIgaXMgYWxzbyBpZGVudGlmaWVkIGFzIHdpbmRvd3MtMTI1NS4gQSB0ZXh0IGluIHgtbWFjLWhlYnJldwojICAgIHRoYXQgY29udGFpbiBzcGVjaWFsIHB1bmN0dWF0aW9uIG1hcmtzIG9yIGRpYWNyaXRpY3MgaXMgZGlzcGxheWVkIHdpdGgKIyAgICBzb21lIHVuY29udmVydGVkIGNoYXJhY3RlcnMgc2hvd2luZyBhcyBxdWVzdGlvbiBtYXJrcy4gVGhpcyBwcm9ibGVtIG1pZ2h0CiMgICAgYmUgY29ycmVjdGVkIHVzaW5nIGFub3RoZXIgbW9kZWwgcHJvYmVyIGZvciB4LW1hYy1oZWJyZXcuIER1ZSB0byB0aGUgZmFjdAojICAgIHRoYXQgeC1tYWMtaGVicmV3IHRleHRzIGFyZSBzbyByYXJlLCB3cml0aW5nIGFub3RoZXIgbW9kZWwgcHJvYmVyIGlzbid0CiMgICAgd29ydGggdGhlIGVmZm9ydCBhbmQgcGVyZm9ybWFuY2UgaGl0LgojCiMjIyMgVGhlIFByb2JlciAjIyMjCiMKIyBUaGUgcHJvYmVyIGlzIGRpdmlkZWQgYmV0d2VlbiB0d28gU0JDaGFyU2V0UHJvYmVycyBhbmQgYSBIZWJyZXdQcm9iZXIsCiMgYWxsIG9mIHdoaWNoIGFyZSBtYW5hZ2VkLCBjcmVhdGVkLCBmZWQgZGF0YSwgaW5xdWlyZWQgYW5kIGRlbGV0ZWQgYnkgdGhlCiMgU0JDU0dyb3VwUHJvYmVyLiBUaGUgdHdvIFNCQ2hhclNldFByb2JlcnMgaWRlbnRpZnkgdGhhdCB0aGUgdGV4dCBpcyBpbgojIGZhY3Qgc29tZSBraW5kIG9mIEhlYnJldywgTG9naWNhbCBvciBWaXN1YWwuIFRoZSBmaW5hbCBkZWNpc2lvbiBhYm91dCB3aGljaAojIG9uZSBpcyBpdCBpcyBtYWRlIGJ5IHRoZSBIZWJyZXdQcm9iZXIgYnkgY29tYmluaW5nIGZpbmFsLWxldHRlciBzY29yZXMKIyB3aXRoIHRoZSBzY29yZXMgb2YgdGhlIHR3byBTQkNoYXJTZXRQcm9iZXJzIHRvIHByb2R1Y2UgYSBmaW5hbCBhbnN3ZXIuCiMKIyBUaGUgU0JDU0dyb3VwUHJvYmVyIGlzIHJlc3BvbnNpYmxlIGZvciBzdHJpcHBpbmcgdGhlIG9yaWdpbmFsIHRleHQgb2YgSFRNTAojIHRhZ3MsIEVuZ2xpc2ggY2hhcmFjdGVycywgbnVtYmVycywgbG93LUFTQ0lJIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMsIHNwYWNlcwojIGFuZCBuZXcgbGluZXMuIEl0IHJlZHVjZXMgYW55IHNlcXVlbmNlIG9mIHN1Y2ggY2hhcmFjdGVycyB0byBhIHNpbmdsZSBzcGFjZS4KIyBUaGUgYnVmZmVyIGZlZCB0byBlYWNoIHByb2JlciBpbiB0aGUgU0JDUyBncm91cCBwcm9iZXIgaXMgcHVyZSB0ZXh0IGluCiMgaGlnaC1BU0NJSS4KIyBUaGUgdHdvIFNCQ2hhclNldFByb2JlcnMgKG1vZGVsIHByb2JlcnMpIHNoYXJlIHRoZSBzYW1lIGxhbmd1YWdlIG1vZGVsOgojIFdpbjEyNTVNb2RlbC4KIyBUaGUgZmlyc3QgU0JDaGFyU2V0UHJvYmVyIHVzZXMgdGhlIG1vZGVsIG5vcm1hbGx5IGFzIGFueSBvdGhlcgojIFNCQ2hhclNldFByb2JlciBkb2VzLCB0byByZWNvZ25pemUgd2luZG93cy0xMjU1LCB1cG9uIHdoaWNoIHRoaXMgbW9kZWwgd2FzCiMgYnVpbHQuIFRoZSBzZWNvbmQgU0JDaGFyU2V0UHJvYmVyIGlzIHRvbGQgdG8gbWFrZSB0aGUgcGFpci1vZi1sZXR0ZXIKIyBsb29rdXAgaW4gdGhlIGxhbmd1YWdlIG1vZGVsIGJhY2t3YXJkcy4gVGhpcyBpbiBwcmFjdGljZSBleGFjdGx5IHNpbXVsYXRlcwojIGEgdmlzdWFsIEhlYnJldyBtb2RlbCB1c2luZyB0aGUgd2luZG93cy0xMjU1IGxvZ2ljYWwgSGVicmV3IG1vZGVsLgojCiMgVGhlIEhlYnJld1Byb2JlciBpcyBub3QgdXNpbmcgYW55IGxhbmd1YWdlIG1vZGVsLiBBbGwgaXQgZG9lcyBpcyBsb29rIGZvcgojIGZpbmFsLWxldHRlciBldmlkZW5jZSBzdWdnZXN0aW5nIHRoZSB0ZXh0IGlzIGVpdGhlciBsb2dpY2FsIEhlYnJldyBvciB2aXN1YWwKIyBIZWJyZXcuIERpc2pvaW50ZWQgZnJvbSB0aGUgbW9kZWwgcHJvYmVycywgdGhlIHJlc3VsdHMgb2YgdGhlIEhlYnJld1Byb2JlcgojIGFsb25lIGFyZSBtZWFuaW5nbGVzcy4gSGVicmV3UHJvYmVyIGFsd2F5cyByZXR1cm5zIDAuMDAgYXMgY29uZmlkZW5jZQojIHNpbmNlIGl0IG5ldmVyIGlkZW50aWZpZXMgYSBjaGFyc2V0IGJ5IGl0c2VsZi4gSW5zdGVhZCwgdGhlIHBvaW50ZXIgdG8gdGhlCiMgSGVicmV3UHJvYmVyIGlzIHBhc3NlZCB0byB0aGUgbW9kZWwgcHJvYmVycyBhcyBhIGhlbHBlciAiTmFtZSBQcm9iZXIiLgojIFdoZW4gdGhlIEdyb3VwIHByb2JlciByZWNlaXZlcyBhIHBvc2l0aXZlIGlkZW50aWZpY2F0aW9uIGZyb20gYW55IHByb2JlciwKIyBpdCBhc2tzIGZvciB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldCBpZGVudGlmaWVkLiBJZiB0aGUgcHJvYmVyIHF1ZXJpZWQgaXMgYQojIEhlYnJldyBtb2RlbCBwcm9iZXIsIHRoZSBtb2RlbCBwcm9iZXIgZm9yd2FyZHMgdGhlIGNhbGwgdG8gdGhlCiMgSGVicmV3UHJvYmVyIHRvIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uLiBJbiB0aGUgSGVicmV3UHJvYmVyLCB0aGUKIyBkZWNpc2lvbiBpcyBtYWRlIGFjY29yZGluZyB0byB0aGUgZmluYWwtbGV0dGVycyBzY29yZXMgbWFpbnRhaW5lZCBhbmQgQm90aAojIG1vZGVsIHByb2JlcnMgc2NvcmVzLiBUaGUgYW5zd2VyIGlzIHJldHVybmVkIGluIHRoZSBmb3JtIG9mIHRoZSBuYW1lIG9mIHRoZQojIGNoYXJzZXQgaWRlbnRpZmllZCwgZWl0aGVyICJ3aW5kb3dzLTEyNTUiIG9yICJJU08tODg1OS04Ii4KCmNsYXNzIEhlYnJld1Byb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICMgd2luZG93cy0xMjU1IC8gSVNPLTg4NTktOCBjb2RlIHBvaW50cyBvZiBpbnRlcmVzdAogICAgRklOQUxfS0FGID0gMHhlYQogICAgTk9STUFMX0tBRiA9IDB4ZWIKICAgIEZJTkFMX01FTSA9IDB4ZWQKICAgIE5PUk1BTF9NRU0gPSAweGVlCiAgICBGSU5BTF9OVU4gPSAweGVmCiAgICBOT1JNQUxfTlVOID0gMHhmMAogICAgRklOQUxfUEUgPSAweGYzCiAgICBOT1JNQUxfUEUgPSAweGY0CiAgICBGSU5BTF9UU0FESSA9IDB4ZjUKICAgIE5PUk1BTF9UU0FESSA9IDB4ZjYKCiAgICAjIE1pbmltdW0gVmlzdWFsIHZzIExvZ2ljYWwgZmluYWwgbGV0dGVyIHNjb3JlIGRpZmZlcmVuY2UuCiAgICAjIElmIHRoZSBkaWZmZXJlbmNlIGlzIGJlbG93IHRoaXMsIGRvbid0IHJlbHkgc29sZWx5IG9uIHRoZSBmaW5hbCBsZXR0ZXIgc2NvcmUKICAgICMgZGlzdGFuY2UuCiAgICBNSU5fRklOQUxfQ0hBUl9ESVNUQU5DRSA9IDUKCiAgICAjIE1pbmltdW0gVmlzdWFsIHZzIExvZ2ljYWwgbW9kZWwgc2NvcmUgZGlmZmVyZW5jZS4KICAgICMgSWYgdGhlIGRpZmZlcmVuY2UgaXMgYmVsb3cgdGhpcywgZG9uJ3QgcmVseSBhdCBhbGwgb24gdGhlIG1vZGVsIHNjb3JlCiAgICAjIGRpc3RhbmNlLgogICAgTUlOX01PREVMX0RJU1RBTkNFID0gMC4wMQoKICAgIFZJU1VBTF9IRUJSRVdfTkFNRSA9ICJJU08tODg1OS04IgogICAgTE9HSUNBTF9IRUJSRVdfTkFNRSA9ICJ3aW5kb3dzLTEyNTUiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEhlYnJld1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSA9IE5vbmUKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSA9IE5vbmUKICAgICAgICBzZWxmLl9wcmV2ID0gTm9uZQogICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gTm9uZQogICAgICAgIHNlbGYuX2xvZ2ljYWxfcHJvYmVyID0gTm9uZQogICAgICAgIHNlbGYuX3Zpc3VhbF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSA9IDAKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSA9IDAKICAgICAgICAjIFRoZSB0d28gbGFzdCBjaGFyYWN0ZXJzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGJ1ZmZlciwKICAgICAgICAjIG1QcmV2IGFuZCBtQmVmb3JlUHJldiBhcmUgaW5pdGlhbGl6ZWQgdG8gc3BhY2UgaW4gb3JkZXIgdG8gc2ltdWxhdGUKICAgICAgICAjIGEgd29yZCBkZWxpbWl0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YQogICAgICAgIHNlbGYuX3ByZXYgPSAnICcKICAgICAgICBzZWxmLl9iZWZvcmVfcHJldiA9ICcgJwogICAgICAgICMgVGhlc2UgcHJvYmVycyBhcmUgb3duZWQgYnkgdGhlIGdyb3VwIHByb2Jlci4KCiAgICBkZWYgc2V0X21vZGVsX3Byb2JlcnMoc2VsZiwgbG9naWNhbFByb2JlciwgdmlzdWFsUHJvYmVyKToKICAgICAgICBzZWxmLl9sb2dpY2FsX3Byb2JlciA9IGxvZ2ljYWxQcm9iZXIKICAgICAgICBzZWxmLl92aXN1YWxfcHJvYmVyID0gdmlzdWFsUHJvYmVyCgogICAgZGVmIGlzX2ZpbmFsKHNlbGYsIGMpOgogICAgICAgIHJldHVybiBjIGluIFtzZWxmLkZJTkFMX0tBRiwgc2VsZi5GSU5BTF9NRU0sIHNlbGYuRklOQUxfTlVOLAogICAgICAgICAgICAgICAgICAgICBzZWxmLkZJTkFMX1BFLCBzZWxmLkZJTkFMX1RTQURJXQoKICAgIGRlZiBpc19ub25fZmluYWwoc2VsZiwgYyk6CiAgICAgICAgIyBUaGUgbm9ybWFsIFRzYWRpIGlzIG5vdCBhIGdvb2QgTm9uLUZpbmFsIGxldHRlciBkdWUgdG8gd29yZHMgbGlrZQogICAgICAgICMgJ2xlY2hvdGV0JyAodG8gY2hhdCkgY29udGFpbmluZyBhbiBhcG9zdHJvcGhlIGFmdGVyIHRoZSB0c2FkaS4gVGhpcwogICAgICAgICMgYXBvc3Ryb3BoZSBpcyBjb252ZXJ0ZWQgdG8gYSBzcGFjZSBpbiBGaWx0ZXJXaXRob3V0RW5nbGlzaExldHRlcnMKICAgICAgICAjIGNhdXNpbmcgdGhlIE5vbi1GaW5hbCB0c2FkaSB0byBhcHBlYXIgYXQgYW4gZW5kIG9mIGEgd29yZCBldmVuCiAgICAgICAgIyB0aG91Z2ggdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIG9yaWdpbmFsIHRleHQuCiAgICAgICAgIyBUaGUgbGV0dGVycyBQZSBhbmQgS2FmIHJhcmVseSBkaXNwbGF5IGEgcmVsYXRlZCBiZWhhdmlvciBvZiBub3QgYmVpbmcKICAgICAgICAjIGEgZ29vZCBOb24tRmluYWwgbGV0dGVyLiBXb3JkcyBsaWtlICdQb3AnLCAnV2luYW1wJyBhbmQgJ011YmFyYWsnCiAgICAgICAgIyBmb3IgZXhhbXBsZSBsZWdhbGx5IGVuZCB3aXRoIGEgTm9uLUZpbmFsIFBlIG9yIEthZi4gSG93ZXZlciwgdGhlCiAgICAgICAgIyBiZW5lZml0IG9mIHRoZXNlIGxldHRlcnMgYXMgTm9uLUZpbmFsIGxldHRlcnMgb3V0d2VpZ2hzIHRoZSBkYW1hZ2UKICAgICAgICAjIHNpbmNlIHRoZXNlIHdvcmRzIGFyZSBxdWl0ZSByYXJlLgogICAgICAgIHJldHVybiBjIGluIFtzZWxmLk5PUk1BTF9LQUYsIHNlbGYuTk9STUFMX01FTSwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5OT1JNQUxfTlVOLCBzZWxmLk5PUk1BTF9QRV0KCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBGaW5hbCBsZXR0ZXIgYW5hbHlzaXMgZm9yIGxvZ2ljYWwtdmlzdWFsIGRlY2lzaW9uLgogICAgICAgICMgTG9vayBmb3IgZXZpZGVuY2UgdGhhdCB0aGUgcmVjZWl2ZWQgYnVmZmVyIGlzIGVpdGhlciBsb2dpY2FsIEhlYnJldwogICAgICAgICMgb3IgdmlzdWFsIEhlYnJldy4KICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGNoZWNrZWQ6CiAgICAgICAgIyAxKSBBIHdvcmQgbG9uZ2VyIHRoYW4gMSBsZXR0ZXIsIGVuZGluZyB3aXRoIGEgZmluYWwgbGV0dGVyLiBUaGlzIGlzCiAgICAgICAgIyAgICBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHRleHQgaXMgbGFpZCBvdXQgIm5hdHVyYWxseSIgc2luY2UgdGhlCiAgICAgICAgIyAgICBmaW5hbCBsZXR0ZXIgcmVhbGx5IGFwcGVhcnMgYXQgdGhlIGVuZC4gKzEgZm9yIGxvZ2ljYWwgc2NvcmUuCiAgICAgICAgIyAyKSBBIHdvcmQgbG9uZ2VyIHRoYW4gMSBsZXR0ZXIsIGVuZGluZyB3aXRoIGEgTm9uLUZpbmFsIGxldHRlci4gSW4KICAgICAgICAjICAgIG5vcm1hbCBIZWJyZXcsIHdvcmRzIGVuZGluZyB3aXRoIEthZiwgTWVtLCBOdW4sIFBlIG9yIFRzYWRpLAogICAgICAgICMgICAgc2hvdWxkIG5vdCBlbmQgd2l0aCB0aGUgTm9uLUZpbmFsIGZvcm0gb2YgdGhhdCBsZXR0ZXIuIEV4Y2VwdGlvbnMKICAgICAgICAjICAgIHRvIHRoaXMgcnVsZSBhcmUgbWVudGlvbmVkIGFib3ZlIGluIGlzTm9uRmluYWwoKS4gVGhpcyBpcyBhbgogICAgICAgICMgICAgaW5kaWNhdGlvbiB0aGF0IHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGJhY2t3YXJkcy4gKzEgZm9yIHZpc3VhbAogICAgICAgICMgICAgc2NvcmUKICAgICAgICAjIDMpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgc3RhcnRpbmcgd2l0aCBhIGZpbmFsIGxldHRlci4gRmluYWwKICAgICAgICAjICAgIGxldHRlcnMgc2hvdWxkIG5vdCBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHdvcmQuIFRoaXMgaXMgYW4KICAgICAgICAjICAgIGluZGljYXRpb24gdGhhdCB0aGUgdGV4dCBpcyBsYWlkIG91dCBiYWNrd2FyZHMuICsxIGZvciB2aXN1YWwKICAgICAgICAjICAgIHNjb3JlLgogICAgICAgICMKICAgICAgICAjIFRoZSB2aXN1YWwgc2NvcmUgYW5kIGxvZ2ljYWwgc2NvcmUgYXJlIGFjY3VtdWxhdGVkIHRocm91Z2hvdXQgdGhlCiAgICAgICAgIyB0ZXh0IGFuZCBhcmUgZmluYWxseSBjaGVja2VkIGFnYWluc3QgZWFjaCBvdGhlciBpbiBHZXRDaGFyU2V0TmFtZSgpLgogICAgICAgICMgTm8gY2hlY2tpbmcgZm9yIGZpbmFsIGxldHRlcnMgaW4gdGhlIG1pZGRsZSBvZiB3b3JkcyBpcyBkb25lIHNpbmNlCiAgICAgICAgIyB0aGF0IGNhc2UgaXMgbm90IGFuIGluZGljYXRpb24gZm9yIGVpdGhlciBMb2dpY2FsIG9yIFZpc3VhbCB0ZXh0LgogICAgICAgICMKICAgICAgICAjIFdlIGF1dG9tYXRpY2FsbHkgZmlsdGVyIG91dCBhbGwgNy1iaXQgY2hhcmFjdGVycyAocmVwbGFjZSB0aGVtIHdpdGgKICAgICAgICAjIHNwYWNlcykgc28gdGhlIHdvcmQgYm91bmRhcnkgZGV0ZWN0aW9uIHdvcmtzIHByb3Blcmx5LiBbTUFQXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgICMgQm90aCBtb2RlbCBwcm9iZXJzIHNheSBpdCdzIG5vdCB0aGVtLiBObyByZWFzb24gdG8gY29udGludWUuCiAgICAgICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuTk9UX01FCgogICAgICAgIGJ5dGVfc3RyID0gc2VsZi5maWx0ZXJfaGlnaF9ieXRlX29ubHkoYnl0ZV9zdHIpCgogICAgICAgIGZvciBjdXIgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGlmIGN1ciA9PSAnICc6CiAgICAgICAgICAgICAgICAjIFdlIHN0YW5kIG9uIGEgc3BhY2UgLSBhIHdvcmQganVzdCBlbmRlZAogICAgICAgICAgICAgICAgaWYgc2VsZi5fYmVmb3JlX3ByZXYgIT0gJyAnOgogICAgICAgICAgICAgICAgICAgICMgbmV4dC10by1sYXN0IGNoYXIgd2FzIG5vdCBhIHNwYWNlIHNvIHNlbGYuX3ByZXYgaXMgbm90IGEKICAgICAgICAgICAgICAgICAgICAjIDEgbGV0dGVyIHdvcmQKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2ZpbmFsKHNlbGYuX3ByZXYpOgogICAgICAgICAgICAgICAgICAgICAgICAjIGNhc2UgKDEpIFstMjpub3Qgc3BhY2VdWy0xOmZpbmFsIGxldHRlcl1bY3VyOnNwYWNlXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgKz0gMQogICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5pc19ub25fZmluYWwoc2VsZi5fcHJldik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FzZSAoMikgWy0yOm5vdCBzcGFjZV1bLTE6Tm9uLUZpbmFsIGxldHRlcl1bCiAgICAgICAgICAgICAgICAgICAgICAgICMgIGN1cjpzcGFjZV0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBOb3Qgc3RhbmRpbmcgb24gYSBzcGFjZQogICAgICAgICAgICAgICAgaWYgKChzZWxmLl9iZWZvcmVfcHJldiA9PSAnICcpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pc19maW5hbChzZWxmLl9wcmV2KSkgYW5kIChjdXIgIT0gJyAnKSk6CiAgICAgICAgICAgICAgICAgICAgIyBjYXNlICgzKSBbLTI6c3BhY2VdWy0xOmZpbmFsIGxldHRlcl1bY3VyOm5vdCBzcGFjZV0KICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSArPSAxCiAgICAgICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gc2VsZi5fcHJldgogICAgICAgICAgICBzZWxmLl9wcmV2ID0gY3VyCgogICAgICAgICMgRm9yZXZlciBkZXRlY3RpbmcsIHRpbGwgdGhlIGVuZCBvciB1bnRpbCBib3RoIG1vZGVsIHByb2JlcnMgcmV0dXJuCiAgICAgICAgIyBQcm9iaW5nU3RhdGUuTk9UX01FIChoYW5kbGVkIGFib3ZlKQogICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuREVURUNUSU5HCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgICMgTWFrZSB0aGUgZGVjaXNpb246IGlzIGl0IExvZ2ljYWwgb3IgVmlzdWFsPwogICAgICAgICMgSWYgdGhlIGZpbmFsIGxldHRlciBzY29yZSBkaXN0YW5jZSBpcyBkb21pbmFudCBlbm91Z2gsIHJlbHkgb24gaXQuCiAgICAgICAgZmluYWxzdWIgPSBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgLSBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZQogICAgICAgIGlmIGZpbmFsc3ViID49IHNlbGYuTUlOX0ZJTkFMX0NIQVJfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKICAgICAgICBpZiBmaW5hbHN1YiA8PSAtc2VsZi5NSU5fRklOQUxfQ0hBUl9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgSXQncyBub3QgZG9taW5hbnQgZW5vdWdoLCB0cnkgdG8gcmVseSBvbiB0aGUgbW9kZWwgc2NvcmVzIGluc3RlYWQuCiAgICAgICAgbW9kZWxzdWIgPSAoc2VsZi5fbG9naWNhbF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgICAgIC0gc2VsZi5fdmlzdWFsX3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgIGlmIG1vZGVsc3ViID4gc2VsZi5NSU5fTU9ERUxfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKICAgICAgICBpZiBtb2RlbHN1YiA8IC1zZWxmLk1JTl9NT0RFTF9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgU3RpbGwgbm8gZ29vZCwgYmFjayB0byBmaW5hbCBsZXR0ZXIgZGlzdGFuY2UsIG1heWJlIGl0J2xsIHNhdmUgdGhlCiAgICAgICAgIyBkYXkuCiAgICAgICAgaWYgZmluYWxzdWIgPCAwLjA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlZJU1VBTF9IRUJSRVdfTkFNRQoKICAgICAgICAjIChmaW5hbHN1YiA+IDAgLSBMb2dpY2FsKSBvciAoZG9uJ3Qga25vdyB3aGF0IHRvIGRvKSBkZWZhdWx0IHRvCiAgICAgICAgIyBMb2dpY2FsLgogICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gJ0hlYnJldycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdGF0ZShzZWxmKToKICAgICAgICAjIFJlbWFpbiBhY3RpdmUgYXMgbG9uZyBhcyBhbnkgb2YgdGhlIG1vZGVsIHByb2JlcnMgYXJlIGFjdGl2ZS4KICAgICAgICBpZiAoc2VsZi5fbG9naWNhbF9wcm9iZXIuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRSkgYW5kIFwKICAgICAgICAgICAoc2VsZi5fdmlzdWFsX3Byb2Jlci5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FKToKICAgICAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLkRFVEVDVElORwpQSwMEFAAAAAAAAAAhAMIaOWGxZAAAsWQAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qaXNmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNhbXBsaW5nIGZyb20gYWJvdXQgMjBNIHRleHQgbWF0ZXJpYWxzIGluY2x1ZGUgbGl0ZXJhdHVyZSBhbmQgY29tcHV0ZXIgdGVjaG5vbG9neQojCiMgSmFwYW5lc2UgZnJlcXVlbmN5IHRhYmxlLCBhcHBsaWVkIHRvIGJvdGggUy1KSVMgYW5kIEVVQy1KUAojIFRoZXkgYXJlIHNvcnRlZCBpbiBvcmRlci4KCiMgMTI4ICAtLT4gMC43NzA5NAojIDI1NiAgLS0+IDAuODU3MTAKIyA1MTIgIC0tPiAwLjkyNjM1CiMgMTAyNCAtLT4gMC45NzEzMAojIDIwNDggLS0+IDAuOTk0MzEKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuOTI2MzUgLyAoMS0wLjkyNjM1KSA9IDEyLjU4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIgLyAoMjk2NSs2Mis4Mys4Ni01MTIpID0gMC4xOTEKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvLCAyNSUgb2YgSURSCgpKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAzLjAKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApKSVNfVEFCTEVfU0laRSA9IDQzNjgKCkpJU19DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgNDAsICAgMSwgICA2LCAxODIsIDE1MiwgMTgwLCAyOTUsMjEyNywgMjg1LCAzODEsMzI5NSw0MzA0LDMwNjgsNDYwNiwzMTY1LDM1MTAsICMgICAxNgozNTExLDE4MjIsMjc4NSw0NjA3LDExOTMsMjIyNiw1MDcwLDQ2MDgsIDE3MSwyOTk2LDEyNDcsICAxOCwgMTc5LDUwNzEsIDg1NiwxNjYxLCAjICAgMzIKMTI2Miw1MDcyLCA2MTksIDEyNywzNDMxLDM1MTIsMzIzMCwxODk5LDE3MDAsIDIzMiwgMjI4LDEyOTQsMTI5OCwgMjg0LCAyODMsMjA0MSwgIyAgIDQ4CjIwNDIsMTA2MSwxMDYyLCAgNDgsICA0OSwgIDQ0LCAgNDUsIDQzMywgNDM0LDEwNDAsMTA0MSwgOTk2LCA3ODcsMjk5NywxMjU1LDQzMDUsICMgICA2NAoyMTA4LDQ2MDksMTY4NCwxNjQ4LDUwNzMsNTA3NCw1MDc1LDUwNzYsNTA3Nyw1MDc4LDM2ODcsNTA3OSw0NjEwLDUwODAsMzkyNywzOTI4LCAjICAgODAKNTA4MSwzMjk2LDM0MzIsIDI5MCwyMjg1LDE0NzEsMjE4Nyw1MDgyLDI1ODAsMjgyNSwxMzAzLDIxNDAsMTczOSwxNDQ1LDI2OTEsMzM3NSwgIyAgIDk2CjE2OTEsMzI5Nyw0MzA2LDQzMDcsNDYxMSwgNDUyLDMzNzYsMTE4MiwyNzEzLDM2ODgsMzA2OSw0MzA4LDUwODMsNTA4NCw1MDg1LDUwODYsICMgIDExMgo1MDg3LDUwODgsNTA4OSw1MDkwLDUwOTEsNTA5Miw1MDkzLDUwOTQsNTA5NSw1MDk2LDUwOTcsNTA5OCw1MDk5LDUxMDAsNTEwMSw1MTAyLCAjICAxMjgKNTEwMyw1MTA0LDUxMDUsNTEwNiw1MTA3LDUxMDgsNTEwOSw1MTEwLDUxMTEsNTExMiw0MDk3LDUxMTMsNTExNCw1MTE1LDUxMTYsNTExNywgIyAgMTQ0CjUxMTgsNTExOSw1MTIwLDUxMjEsNTEyMiw1MTIzLDUxMjQsNTEyNSw1MTI2LDUxMjcsNTEyOCw1MTI5LDUxMzAsNTEzMSw1MTMyLDUxMzMsICMgIDE2MAo1MTM0LDUxMzUsNTEzNiw1MTM3LDUxMzgsNTEzOSw1MTQwLDUxNDEsNTE0Miw1MTQzLDUxNDQsNTE0NSw1MTQ2LDUxNDcsNTE0OCw1MTQ5LCAjICAxNzYKNTE1MCw1MTUxLDUxNTIsNDYxMiw1MTUzLDUxNTQsNTE1NSw1MTU2LDUxNTcsNTE1OCw1MTU5LDUxNjAsNTE2MSw1MTYyLDUxNjMsNTE2NCwgIyAgMTkyCjUxNjUsNTE2Niw1MTY3LDUxNjgsNTE2OSw1MTcwLDUxNzEsNTE3Miw1MTczLDUxNzQsNTE3NSwxNDcyLCA1OTgsIDYxOCwgODIwLDEyMDUsICMgIDIwOAoxMzA5LDE0MTIsMTg1OCwxMzA3LDE2OTIsNTE3Niw1MTc3LDUxNzgsNTE3OSw1MTgwLDUxODEsNTE4MiwxMTQyLDE0NTIsMTIzNCwxMTcyLCAjICAyMjQKMTg3NSwyMDQzLDIxNDksMTc5MywxMzgyLDI5NzMsIDkyNSwyNDA0LDEwNjcsMTI0MSwgOTYwLDEzNzcsMjkzNSwxNDkxLCA5MTksMTIxNywgIyAgMjQwCjE4NjUsMjAzMCwxNDA2LDE0OTksMjc0OSw0MDk4LDUxODMsNTE4NCw1MTg1LDUxODYsNTE4Nyw1MTg4LDI1NjEsNDA5OSwzMTE3LDE4MDQsICMgIDI1NgoyMDQ5LDM2ODksNDMwOSwzNTEzLDE2NjMsNTE4OSwzMTY2LDMxMTgsMzI5OCwxNTg3LDE1NjEsMzQzMyw1MTkwLDMxMTksMTYyNSwyOTk4LCAjICAyNzIKMzI5OSw0NjEzLDE3NjYsMzY5MCwyNzg2LDQ2MTQsNTE5MSw1MTkyLDUxOTMsNTE5NCwyMTYxLCAgMjYsMzM3NywgICAyLDM5MjksICAyMCwgIyAgMjg4CjM2OTEsICA0Nyw0MTAwLCAgNTAsICAxNywgIDE2LCAgMzUsIDI2OCwgIDI3LCAyNDMsICA0MiwgMTU1LCAgMjQsIDE1NCwgIDI5LCAxODQsICMgIDMwNAogICA0LCAgOTEsICAxNCwgIDkyLCAgNTMsIDM5NiwgIDMzLCAyODksICAgOSwgIDM3LCAgNjQsIDYyMCwgIDIxLCAgMzksIDMyMSwgICA1LCAjICAzMjAKICAxMiwgIDExLCAgNTIsICAxMywgICAzLCAyMDgsIDEzOCwgICAwLCAgIDcsICA2MCwgNTI2LCAxNDEsIDE1MSwxMDY5LCAxODEsIDI3NSwgIyAgMzM2CjE1OTEsICA4MywgMTMyLDE0NzUsIDEyNiwgMzMxLCA4MjksICAxNSwgIDY5LCAxNjAsICA1OSwgIDIyLCAxNTcsICA1NSwxMDc5LCAzMTIsICMgIDM1MgogMTA5LCAgMzgsICAyMywgIDI1LCAgMTAsICAxOSwgIDc5LDUxOTUsICA2MSwgMzgyLDExMjQsICAgOCwgIDMwLDUxOTYsNTE5Nyw1MTk4LCAjICAzNjgKNTE5OSw1MjAwLDUyMDEsNTIwMiw1MjAzLDUyMDQsNTIwNSw1MjA2LCAgODksICA2MiwgIDc0LCAgMzQsMjQxNiwgMTEyLCAxMzksIDE5NiwgIyAgMzg0CiAyNzEsIDE0OSwgIDg0LCA2MDcsIDEzMSwgNzY1LCAgNDYsICA4OCwgMTUzLCA2ODMsICA3NiwgODc0LCAxMDEsIDI1OCwgIDU3LCAgODAsICMgIDQwMAogIDMyLCAzNjQsIDEyMSwxNTA4LCAxNjksMTU0NywgIDY4LCAyMzUsIDE0NSwyOTk5LCAgNDEsIDM2MCwzMDI3LCAgNzAsICA2MywgIDMxLCAjICA0MTYKICA0MywgMjU5LCAyNjIsMTM4MywgIDk5LCA1MzMsIDE5NCwgIDY2LCAgOTMsIDg0NiwgMjE3LCAxOTIsICA1NiwgMTA2LCAgNTgsIDU2NSwgIyAgNDMyCiAyODAsIDI3MiwgMzExLCAyNTYsIDE0NiwgIDgyLCAzMDgsICA3MSwgMTAwLCAxMjgsIDIxNCwgNjU1LCAxMTAsIDI2MSwgMTA0LDExNDAsICMgIDQ0OAogIDU0LCAgNTEsICAzNiwgIDg3LCAgNjcsMzA3MCwgMTg1LDI2MTgsMjkzNiwyMDIwLCAgMjgsMTA2NiwyMzkwLDIwNTksNTIwNyw1MjA4LCAjICA0NjQKNTIwOSw1MjEwLDUyMTEsNTIxMiw1MjEzLDUyMTQsNTIxNSw1MjE2LDQ2MTUsNTIxNyw1MjE4LDUyMTksNTIyMCw1MjIxLDUyMjIsNTIyMywgIyAgNDgwCjUyMjQsNTIyNSw1MjI2LDUyMjcsNTIyOCw1MjI5LDUyMzAsNTIzMSw1MjMyLDUyMzMsNTIzNCw1MjM1LDUyMzYsMzUxNCw1MjM3LDUyMzgsICMgIDQ5Ngo1MjM5LDUyNDAsNTI0MSw1MjQyLDUyNDMsNTI0NCwyMjk3LDIwMzEsNDYxNiw0MzEwLDM2OTIsNTI0NSwzMDcxLDUyNDYsMzU5OCw1MjQ3LCAjICA1MTIKNDYxNywzMjMxLDM1MTUsNTI0OCw0MTAxLDQzMTEsNDYxOCwzODA4LDQzMTIsNDEwMiw1MjQ5LDQxMDMsNDEwNCwzNTk5LDUyNTAsNTI1MSwgIyAgNTI4CjUyNTIsNTI1Myw1MjU0LDUyNTUsNTI1Niw1MjU3LDUyNTgsNTI1OSw1MjYwLDUyNjEsNTI2Miw1MjYzLDUyNjQsNTI2NSw1MjY2LDUyNjcsICMgIDU0NAo1MjY4LDUyNjksNTI3MCw1MjcxLDUyNzIsNTI3Myw1Mjc0LDUyNzUsNTI3Niw1Mjc3LDUyNzgsNTI3OSw1MjgwLDUyODEsNTI4Miw1MjgzLCAjICA1NjAKNTI4NCw1Mjg1LDUyODYsNTI4Nyw1Mjg4LDUyODksNTI5MCw1MjkxLDUyOTIsNTI5Myw1Mjk0LDUyOTUsNTI5Niw1Mjk3LDUyOTgsNTI5OSwgIyAgNTc2CjUzMDAsNTMwMSw1MzAyLDUzMDMsNTMwNCw1MzA1LDUzMDYsNTMwNyw1MzA4LDUzMDksNTMxMCw1MzExLDUzMTIsNTMxMyw1MzE0LDUzMTUsICMgIDU5Mgo1MzE2LDUzMTcsNTMxOCw1MzE5LDUzMjAsNTMyMSw1MzIyLDUzMjMsNTMyNCw1MzI1LDUzMjYsNTMyNyw1MzI4LDUzMjksNTMzMCw1MzMxLCAjICA2MDgKNTMzMiw1MzMzLDUzMzQsNTMzNSw1MzM2LDUzMzcsNTMzOCw1MzM5LDUzNDAsNTM0MSw1MzQyLDUzNDMsNTM0NCw1MzQ1LDUzNDYsNTM0NywgIyAgNjI0CjUzNDgsNTM0OSw1MzUwLDUzNTEsNTM1Miw1MzUzLDUzNTQsNTM1NSw1MzU2LDUzNTcsNTM1OCw1MzU5LDUzNjAsNTM2MSw1MzYyLDUzNjMsICMgIDY0MAo1MzY0LDUzNjUsNTM2Niw1MzY3LDUzNjgsNTM2OSw1MzcwLDUzNzEsNTM3Miw1MzczLDUzNzQsNTM3NSw1Mzc2LDUzNzcsNTM3OCw1Mzc5LCAjICA2NTYKNTM4MCw1MzgxLCAzNjMsIDY0MiwyNzg3LDI4NzgsMjc4OCwyNzg5LDIzMTYsMzIzMiwyMzE3LDM0MzQsMjAxMSwgMTY1LDE5NDIsMzkzMCwgIyAgNjcyCjM5MzEsMzkzMiwzOTMzLDUzODIsNDYxOSw1MzgzLDQ2MjAsNTM4NCw1Mzg1LDUzODYsNTM4Nyw1Mzg4LDUzODksNTM5MCw1MzkxLDUzOTIsICMgIDY4OAo1MzkzLDUzOTQsNTM5NSw1Mzk2LDUzOTcsNTM5OCw1Mzk5LDU0MDAsNTQwMSw1NDAyLDU0MDMsNTQwNCw1NDA1LDU0MDYsNTQwNyw1NDA4LCAjICA3MDQKNTQwOSw1NDEwLDU0MTEsNTQxMiw1NDEzLDU0MTQsNTQxNSw1NDE2LDU0MTcsNTQxOCw1NDE5LDU0MjAsNTQyMSw1NDIyLDU0MjMsNTQyNCwgIyAgNzIwCjU0MjUsNTQyNiw1NDI3LDU0MjgsNTQyOSw1NDMwLDU0MzEsNTQzMiw1NDMzLDU0MzQsNTQzNSw1NDM2LDU0MzcsNTQzOCw1NDM5LDU0NDAsICMgIDczNgo1NDQxLDU0NDIsNTQ0Myw1NDQ0LDU0NDUsNTQ0Niw1NDQ3LDU0NDgsNTQ0OSw1NDUwLDU0NTEsNTQ1Miw1NDUzLDU0NTQsNTQ1NSw1NDU2LCAjICA3NTIKNTQ1Nyw1NDU4LDU0NTksNTQ2MCw1NDYxLDU0NjIsNTQ2Myw1NDY0LDU0NjUsNTQ2Niw1NDY3LDU0NjgsNTQ2OSw1NDcwLDU0NzEsNTQ3MiwgIyAgNzY4CjU0NzMsNTQ3NCw1NDc1LDU0NzYsNTQ3Nyw1NDc4LDU0NzksNTQ4MCw1NDgxLDU0ODIsNTQ4Myw1NDg0LDU0ODUsNTQ4Niw1NDg3LDU0ODgsICMgIDc4NAo1NDg5LDU0OTAsNTQ5MSw1NDkyLDU0OTMsNTQ5NCw1NDk1LDU0OTYsNTQ5Nyw1NDk4LDU0OTksNTUwMCw1NTAxLDU1MDIsNTUwMyw1NTA0LCAjICA4MDAKNTUwNSw1NTA2LDU1MDcsNTUwOCw1NTA5LDU1MTAsNTUxMSw1NTEyLDU1MTMsNTUxNCw1NTE1LDU1MTYsNTUxNyw1NTE4LDU1MTksNTUyMCwgIyAgODE2CjU1MjEsNTUyMiw1NTIzLDU1MjQsNTUyNSw1NTI2LDU1MjcsNTUyOCw1NTI5LDU1MzAsNTUzMSw1NTMyLDU1MzMsNTUzNCw1NTM1LDU1MzYsICMgIDgzMgo1NTM3LDU1MzgsNTUzOSw1NTQwLDU1NDEsNTU0Miw1NTQzLDU1NDQsNTU0NSw1NTQ2LDU1NDcsNTU0OCw1NTQ5LDU1NTAsNTU1MSw1NTUyLCAjICA4NDgKNTU1Myw1NTU0LDU1NTUsNTU1Niw1NTU3LDU1NTgsNTU1OSw1NTYwLDU1NjEsNTU2Miw1NTYzLDU1NjQsNTU2NSw1NTY2LDU1NjcsNTU2OCwgIyAgODY0CjU1NjksNTU3MCw1NTcxLDU1NzIsNTU3Myw1NTc0LDU1NzUsNTU3Niw1NTc3LDU1NzgsNTU3OSw1NTgwLDU1ODEsNTU4Miw1NTgzLDU1ODQsICMgIDg4MAo1NTg1LDU1ODYsNTU4Nyw1NTg4LDU1ODksNTU5MCw1NTkxLDU1OTIsNTU5Myw1NTk0LDU1OTUsNTU5Niw1NTk3LDU1OTgsNTU5OSw1NjAwLCAjICA4OTYKNTYwMSw1NjAyLDU2MDMsNTYwNCw1NjA1LDU2MDYsNTYwNyw1NjA4LDU2MDksNTYxMCw1NjExLDU2MTIsNTYxMyw1NjE0LDU2MTUsNTYxNiwgIyAgOTEyCjU2MTcsNTYxOCw1NjE5LDU2MjAsNTYyMSw1NjIyLDU2MjMsNTYyNCw1NjI1LDU2MjYsNTYyNyw1NjI4LDU2MjksNTYzMCw1NjMxLDU2MzIsICMgIDkyOAo1NjMzLDU2MzQsNTYzNSw1NjM2LDU2MzcsNTYzOCw1NjM5LDU2NDAsNTY0MSw1NjQyLDU2NDMsNTY0NCw1NjQ1LDU2NDYsNTY0Nyw1NjQ4LCAjICA5NDQKNTY0OSw1NjUwLDU2NTEsNTY1Miw1NjUzLDU2NTQsNTY1NSw1NjU2LDU2NTcsNTY1OCw1NjU5LDU2NjAsNTY2MSw1NjYyLDU2NjMsNTY2NCwgIyAgOTYwCjU2NjUsNTY2Niw1NjY3LDU2NjgsNTY2OSw1NjcwLDU2NzEsNTY3Miw1NjczLDU2NzQsNTY3NSw1Njc2LDU2NzcsNTY3OCw1Njc5LDU2ODAsICMgIDk3Ngo1NjgxLDU2ODIsNTY4Myw1Njg0LDU2ODUsNTY4Niw1Njg3LDU2ODgsNTY4OSw1NjkwLDU2OTEsNTY5Miw1NjkzLDU2OTQsNTY5NSw1Njk2LCAjICA5OTIKNTY5Nyw1Njk4LDU2OTksNTcwMCw1NzAxLDU3MDIsNTcwMyw1NzA0LDU3MDUsNTcwNiw1NzA3LDU3MDgsNTcwOSw1NzEwLDU3MTEsNTcxMiwgIyAxMDA4CjU3MTMsNTcxNCw1NzE1LDU3MTYsNTcxNyw1NzE4LDU3MTksNTcyMCw1NzIxLDU3MjIsNTcyMyw1NzI0LDU3MjUsNTcyNiw1NzI3LDU3MjgsICMgMTAyNAo1NzI5LDU3MzAsNTczMSw1NzMyLDU3MzMsNTczNCw1NzM1LDU3MzYsNTczNyw1NzM4LDU3MzksNTc0MCw1NzQxLDU3NDIsNTc0Myw1NzQ0LCAjIDEwNDAKNTc0NSw1NzQ2LDU3NDcsNTc0OCw1NzQ5LDU3NTAsNTc1MSw1NzUyLDU3NTMsNTc1NCw1NzU1LDU3NTYsNTc1Nyw1NzU4LDU3NTksNTc2MCwgIyAxMDU2CjU3NjEsNTc2Miw1NzYzLDU3NjQsNTc2NSw1NzY2LDU3NjcsNTc2OCw1NzY5LDU3NzAsNTc3MSw1NzcyLDU3NzMsNTc3NCw1Nzc1LDU3NzYsICMgMTA3Mgo1Nzc3LDU3NzgsNTc3OSw1NzgwLDU3ODEsNTc4Miw1NzgzLDU3ODQsNTc4NSw1Nzg2LDU3ODcsNTc4OCw1Nzg5LDU3OTAsNTc5MSw1NzkyLCAjIDEwODgKNTc5Myw1Nzk0LDU3OTUsNTc5Niw1Nzk3LDU3OTgsNTc5OSw1ODAwLDU4MDEsNTgwMiw1ODAzLDU4MDQsNTgwNSw1ODA2LDU4MDcsNTgwOCwgIyAxMTA0CjU4MDksNTgxMCw1ODExLDU4MTIsNTgxMyw1ODE0LDU4MTUsNTgxNiw1ODE3LDU4MTgsNTgxOSw1ODIwLDU4MjEsNTgyMiw1ODIzLDU4MjQsICMgMTEyMAo1ODI1LDU4MjYsNTgyNyw1ODI4LDU4MjksNTgzMCw1ODMxLDU4MzIsNTgzMyw1ODM0LDU4MzUsNTgzNiw1ODM3LDU4MzgsNTgzOSw1ODQwLCAjIDExMzYKNTg0MSw1ODQyLDU4NDMsNTg0NCw1ODQ1LDU4NDYsNTg0Nyw1ODQ4LDU4NDksNTg1MCw1ODUxLDU4NTIsNTg1Myw1ODU0LDU4NTUsNTg1NiwgIyAxMTUyCjU4NTcsNTg1OCw1ODU5LDU4NjAsNTg2MSw1ODYyLDU4NjMsNTg2NCw1ODY1LDU4NjYsNTg2Nyw1ODY4LDU4NjksNTg3MCw1ODcxLDU4NzIsICMgMTE2OAo1ODczLDU4NzQsNTg3NSw1ODc2LDU4NzcsNTg3OCw1ODc5LDU4ODAsNTg4MSw1ODgyLDU4ODMsNTg4NCw1ODg1LDU4ODYsNTg4Nyw1ODg4LCAjIDExODQKNTg4OSw1ODkwLDU4OTEsNTg5Miw1ODkzLDU4OTQsNTg5NSw1ODk2LDU4OTcsNTg5OCw1ODk5LDU5MDAsNTkwMSw1OTAyLDU5MDMsNTkwNCwgIyAxMjAwCjU5MDUsNTkwNiw1OTA3LDU5MDgsNTkwOSw1OTEwLDU5MTEsNTkxMiw1OTEzLDU5MTQsNTkxNSw1OTE2LDU5MTcsNTkxOCw1OTE5LDU5MjAsICMgMTIxNgo1OTIxLDU5MjIsNTkyMyw1OTI0LDU5MjUsNTkyNiw1OTI3LDU5MjgsNTkyOSw1OTMwLDU5MzEsNTkzMiw1OTMzLDU5MzQsNTkzNSw1OTM2LCAjIDEyMzIKNTkzNyw1OTM4LDU5MzksNTk0MCw1OTQxLDU5NDIsNTk0Myw1OTQ0LDU5NDUsNTk0Niw1OTQ3LDU5NDgsNTk0OSw1OTUwLDU5NTEsNTk1MiwgIyAxMjQ4CjU5NTMsNTk1NCw1OTU1LDU5NTYsNTk1Nyw1OTU4LDU5NTksNTk2MCw1OTYxLDU5NjIsNTk2Myw1OTY0LDU5NjUsNTk2Niw1OTY3LDU5NjgsICMgMTI2NAo1OTY5LDU5NzAsNTk3MSw1OTcyLDU5NzMsNTk3NCw1OTc1LDU5NzYsNTk3Nyw1OTc4LDU5NzksNTk4MCw1OTgxLDU5ODIsNTk4Myw1OTg0LCAjIDEyODAKNTk4NSw1OTg2LDU5ODcsNTk4OCw1OTg5LDU5OTAsNTk5MSw1OTkyLDU5OTMsNTk5NCw1OTk1LDU5OTYsNTk5Nyw1OTk4LDU5OTksNjAwMCwgIyAxMjk2CjYwMDEsNjAwMiw2MDAzLDYwMDQsNjAwNSw2MDA2LDYwMDcsNjAwOCw2MDA5LDYwMTAsNjAxMSw2MDEyLDYwMTMsNjAxNCw2MDE1LDYwMTYsICMgMTMxMgo2MDE3LDYwMTgsNjAxOSw2MDIwLDYwMjEsNjAyMiw2MDIzLDYwMjQsNjAyNSw2MDI2LDYwMjcsNjAyOCw2MDI5LDYwMzAsNjAzMSw2MDMyLCAjIDEzMjgKNjAzMyw2MDM0LDYwMzUsNjAzNiw2MDM3LDYwMzgsNjAzOSw2MDQwLDYwNDEsNjA0Miw2MDQzLDYwNDQsNjA0NSw2MDQ2LDYwNDcsNjA0OCwgIyAxMzQ0CjYwNDksNjA1MCw2MDUxLDYwNTIsNjA1Myw2MDU0LDYwNTUsNjA1Niw2MDU3LDYwNTgsNjA1OSw2MDYwLDYwNjEsNjA2Miw2MDYzLDYwNjQsICMgMTM2MAo2MDY1LDYwNjYsNjA2Nyw2MDY4LDYwNjksNjA3MCw2MDcxLDYwNzIsNjA3Myw2MDc0LDYwNzUsNjA3Niw2MDc3LDYwNzgsNjA3OSw2MDgwLCAjIDEzNzYKNjA4MSw2MDgyLDYwODMsNjA4NCw2MDg1LDYwODYsNjA4Nyw2MDg4LDYwODksNjA5MCw2MDkxLDYwOTIsNjA5Myw2MDk0LDYwOTUsNjA5NiwgIyAxMzkyCjYwOTcsNjA5OCw2MDk5LDYxMDAsNjEwMSw2MTAyLDYxMDMsNjEwNCw2MTA1LDYxMDYsNjEwNyw2MTA4LDYxMDksNjExMCw2MTExLDYxMTIsICMgMTQwOAo2MTEzLDYxMTQsMjA0NCwyMDYwLDQ2MjEsIDk5NywxMjM1LCA0NzMsMTE4Niw0NjIyLCA5MjAsMzM3OCw2MTE1LDYxMTYsIDM3OSwxMTA4LCAjIDE0MjQKNDMxMywyNjU3LDI3MzUsMzkzNCw2MTE3LDM4MDksIDYzNiwzMjMzLCA1NzMsMTAyNiwzNjkzLDM0MzUsMjk3NCwzMzAwLDIyOTgsNDEwNSwgIyAxNDQwCiA4NTQsMjkzNywyNDYzLCAzOTMsMjU4MSwyNDE3LCA1MzksIDc1MiwxMjgwLDI3NTAsMjQ4MCwgMTQwLDExNjEsIDQ0MCwgNzA4LDE1NjksICMgMTQ1NgogNjY1LDI0OTcsMTc0NiwxMjkxLDE1MjMsMzAwMCwgMTY0LDE2MDMsIDg0NywxMzMxLCA1MzcsMTk5NywgNDg2LCA1MDgsMTY5MywyNDE4LCAjIDE0NzIKMTk3MCwyMjI3LCA4NzgsMTIyMCwgMjk5LDEwMzAsIDk2OSwgNjUyLDI3NTEsIDYyNCwxMTM3LDMzMDEsMjYxOSwgIDY1LDMzMDIsMjA0NSwgIyAxNDg4CjE3NjEsMTg1OSwzMTIwLDE5MzAsMzY5NCwzNTE2LCA2NjMsMTc2NywgODUyLCA4MzUsMzY5NSwgMjY5LCA3NjcsMjgyNiwyMzM5LDEzMDUsICMgMTUwNAogODk2LDExNTAsIDc3MCwxNjE2LDYxMTgsIDUwNiwxNTAyLDIwNzUsMTAxMiwyNTE5LCA3NzUsMjUyMCwyOTc1LDIzNDAsMjkzOCw0MzE0LCAjIDE1MjAKMzAyOCwyMDg2LDEyMjQsMTk0MywyMjg2LDYxMTksMzA3Miw0MzE1LDIyNDAsMTI3MywxOTg3LDM5MzUsMTU1NywgMTc1LCA1OTcsIDk4NSwgIyAxNTM2CjM1MTcsMjQxOSwyNTIxLDE0MTYsMzAyOSwgNTg1LCA5MzgsMTkzMSwxMDA3LDEwNTIsMTkzMiwxNjg1LDYxMjAsMzM3OSw0MzE2LDQ2MjMsICMgMTU1MgogODA0LCA1OTksMzEyMSwxMzMzLDIxMjgsMjUzOSwxMTU5LDE1NTQsMjAzMiwzODEwLCA2ODcsMjAzMywyOTA0LCA5NTIsIDY3NSwxNDY3LCAjIDE1NjgKMzQzNiw2MTIxLDIyNDEsMTA5NiwxNzg2LDI0NDAsMTU0MywxOTI0LCA5ODAsMTgxMywyMjI4LCA3ODEsMjY5MiwxODc5LCA3MjgsMTkxOCwgIyAxNTg0CjM2OTYsNDYyNCwgNTQ4LDE5NTAsNDYyNSwxODA5LDEwODgsMTM1NiwzMzAzLDI1MjIsMTk0NCwgNTAyLCA5NzIsIDM3MywgNTEzLDI4MjcsICMgMTYwMAogNTg2LDIzNzcsMjM5MSwxMDAzLDE5NzYsMTYzMSw2MTIyLDI0NjQsMTA4NCwgNjQ4LDE3NzYsNDYyNiwyMTQxLCAzMjQsIDk2MiwyMDEyLCAjIDE2MTYKMjE3NywyMDc2LDEzODQsIDc0MiwyMTc4LDE0NDgsMTE3MywxODEwLCAyMjIsIDEwMiwgMzAxLCA0NDUsIDEyNSwyNDIwLCA2NjIsMjQ5OCwgIyAxNjMyCiAyNzcsIDIwMCwxNDc2LDExNjUsMTA2OCwgMjI0LDI1NjIsMTM3OCwxNDQ2LCA0NTAsMTg4MCwgNjU5LCA3OTEsIDU4Miw0NjI3LDI5MzksICMgMTY0OAozOTM2LDE1MTYsMTI3NCwgNTU1LDIwOTksMzY5NywxMDIwLDEzODksMTUyNiwzMzgwLDE3NjIsMTcyMywxNzg3LDIyMjksIDQxMiwyMTE0LCAjIDE2NjQKMTkwMCwyMzkyLDM1MTgsIDUxMiwyNTk3LCA0MjcsMTkyNSwyMzQxLDMxMjIsMTY1MywxNjg2LDI0NjUsMjQ5OSwgNjk3LCAzMzAsIDI3MywgIyAxNjgwCiAzODAsMjE2MiwgOTUxLCA4MzIsIDc4MCwgOTkxLDEzMDEsMzA3MywgOTY1LDIyNzAsMzUxOSwgNjY4LDI1MjMsMjYzNiwxMjg2LCA1MzUsICMgMTY5NgoxNDA3LCA1MTgsIDY3MSwgOTU3LDI2NTgsMjM3OCwgMjY3LCA2MTEsMjE5NywzMDMwLDYxMjMsIDI0OCwyMjk5LCA5NjcsMTc5OSwyMzU2LCAjIDE3MTIKIDg1MCwxNDE4LDM0MzcsMTg3NiwxMjU2LDE0ODAsMjgyOCwxNzE4LDYxMjQsNjEyNSwxNzU1LDE2NjQsMjQwNSw2MTI2LDQ2MjgsMjg3OSwgIyAxNzI4CjI4MjksIDQ5OSwyMTc5LCA2NzYsNDYyOSwgNTU3LDIzMjksMjIxNCwyMDkwLCAzMjUsMzIzNCwgNDY0LCA4MTEsMzAwMSwgOTkyLDIzNDIsICMgMTc0NAoyNDgxLDEyMzIsMTQ2OSwgMzAzLDIyNDIsIDQ2NiwxMDcwLDIxNjMsIDYwMywxNzc3LDIwOTEsNDYzMCwyNzUyLDQ2MzEsMjcxNCwgMzIyLCAjIDE3NjAKMjY1OSwxOTY0LDE3NjgsIDQ4MSwyMTg4LDE0NjMsMjMzMCwyODU3LDM2MDAsMjA5MiwzMDMxLDI0MjEsNDYzMiwyMzE4LDIwNzAsMTg0OSwgIyAxNzc2CjI1OTgsNDYzMywxMzAyLDIyNTQsMTY2OCwxNzAxLDI0MjIsMzgxMSwyOTA1LDMwMzIsMzEyMywyMDQ2LDQxMDYsMTc2MywxNjk0LDQ2MzQsICMgMTc5MgoxNjA0LCA5NDMsMTcyNCwxNDU0LCA5MTcsIDg2OCwyMjE1LDExNjksMjk0MCwgNTUyLDExNDUsMTgwMCwxMjI4LDE4MjMsMTk1NSwgMzE2LCAjIDE4MDgKMTA4MCwyNTEwLCAzNjEsMTgwNywyODMwLDQxMDcsMjY2MCwzMzgxLDEzNDYsMTQyMywxMTM0LDQxMDgsNjEyNywgNTQxLDEyNjMsMTIyOSwgIyAxODI0CjExNDgsMjU0MCwgNTQ1LCA0NjUsMTgzMywyODgwLDM0MzgsMTkwMSwzMDc0LDI0ODIsIDgxNiwzOTM3LCA3MTMsMTc4OCwyNTAwLCAxMjIsICMgMTg0MAoxNTc1LCAxOTUsMTQ1MSwyNTAxLDExMTEsNjEyOCwgODU5LCAzNzQsMTIyNSwyMjQzLDI0ODMsNDMxNywgMzkwLDEwMzMsMzQzOSwzMDc1LCAjIDE4NTYKMjUyNCwxNjg3LCAyNjYsIDc5MywxNDQwLDI1OTksIDk0NiwgNzc5LCA4MDIsIDUwNywgODk3LDEwODEsIDUyOCwyMTg5LDEyOTIsIDcxMSwgIyAxODcyCjE4NjYsMTcyNSwxMTY3LDE2NDAsIDc1MywgMzk4LDI2NjEsMTA1MywgMjQ2LCAzNDgsNDMxOCwgMTM3LDEwMjQsMzQ0MCwxNjAwLDIwNzcsICMgMTg4OAoyMTI5LCA4MjUsNDMxOSwgNjk4LCAyMzgsIDUyMSwgMTg3LDIzMDAsMTE1NywyNDIzLDE2NDEsMTYwNSwxNDY0LDE2MTAsMTA5NywyNTQxLCAjIDE5MDQKMTI2MCwxNDM2LCA3NTksMjI1NSwxODE0LDIxNTAsIDcwNSwzMjM1LCA0MDksMjU2MywzMzA0LCA1NjEsMzAzMywyMDA1LDI1NjQsIDcyNiwgIyAxOTIwCjE5NTYsMjM0MywzNjk4LDQxMDksIDk0OSwzODEyLDM4MTMsMzUyMCwxNjY5LCA2NTMsMTM3OSwyNTI1LCA4ODEsMjE5OCwgNjMyLDIyNTYsICMgMTkzNgoxMDI3LCA3NzgsMTA3NCwgNzMzLDE5NTcsIDUxNCwxNDgxLDI0NjYsIDU1NCwyMTgwLCA3MDIsMzkzOCwxNjA2LDEwMTcsMTM5OCw2MTI5LCAjIDE5NTIKMTM4MCwzNTIxLCA5MjEsIDk5MywxMzEzLCA1OTQsIDQ0OSwxNDg5LDE2MTcsMTE2NiwgNzY4LDE0MjYsMTM2MCwgNDk1LDE3OTQsMzYwMSwgIyAxOTY4CjExNzcsMzYwMiwxMTcwLDQzMjAsMjM0NCwgNDc2LCA0MjUsMzE2Nyw0NjM1LDMxNjgsMTQyNCwgNDAxLDI2NjIsMTE3MSwzMzgyLDE5OTgsICMgMTk4NAoxMDg5LDQxMTAsIDQ3NywzMTY5LCA0NzQsNjEzMCwxOTA5LCA1OTYsMjgzMSwxODQyLCA0OTQsIDY5MywxMDUxLDEwMjgsMTIwNywzMDc2LCAjIDIwMDAKIDYwNiwyMTE1LCA3MjcsMjc5MCwxNDczLDExMTUsIDc0MywzNTIyLCA2MzAsIDgwNSwxNTMyLDQzMjEsMjAyMSwgMzY2LDEwNTcsIDgzOCwgIyAyMDE2CiA2ODQsMTExNCwyMTQyLDQzMjIsMjA1MCwxNDkyLDE4OTIsMTgwOCwyMjcxLDM4MTQsMjQyNCwxOTcxLDE0NDcsMTM3MywzMzA1LDEwOTAsICMgMjAzMgoxNTM2LDM5MzksMzUyMywzMzA2LDE0NTUsMjE5OSwgMzM2LCAzNjksMjMzMSwxMDM1LCA1ODQsMjM5MywgOTAyLCA3MTgsMjYwMCw2MTMxLCAjIDIwNDgKMjc1MywgNDYzLDIxNTEsMTE0OSwxNjExLDI0NjcsIDcxNSwxMzA4LDMxMjQsMTI2OCwgMzQzLDE0MTMsMzIzNiwxNTE3LDEzNDcsMjY2MywgIyAyMDY0CjIwOTMsMzk0MCwyMDIyLDExMzEsMTU1MywyMTAwLDI5NDEsMTQyNywzNDQxLDI5NDIsMTMyMywyNDg0LDYxMzIsMTk4MCwgODcyLDIzNjgsICMgMjA4MAoyNDQxLDI5NDMsIDMyMCwyMzY5LDIxMTYsMTA4MiwgNjc5LDE5MzMsMzk0MSwyNzkxLDM4MTUsIDYyNSwxMTQzLDIwMjMsIDQyMiwyMjAwLCAjIDIwOTYKMzgxNiw2MTMzLCA3MzAsMTY5NSwgMzU2LDIyNTcsMTYyNiwyMzAxLDI4NTgsMjYzNywxNjI3LDE3NzgsIDkzNywgODgzLDI5MDYsMjY5MywgIyAyMTEyCjMwMDIsMTc2OSwxMDg2LCA0MDAsMTA2MywxMzI1LDMzMDcsMjc5Miw0MTExLDMwNzcsIDQ1NiwyMzQ1LDEwNDYsIDc0Nyw2MTM0LDE1MjQsICMgMjEyOAogODg0LDEwOTQsMzM4MywxNDc0LDIxNjQsMTA1OSwgOTc0LDE2ODgsMjE4MSwyMjU4LDEwNDcsIDM0NSwxNjY1LDExODcsIDM1OCwgODc1LCAjIDIxNDQKMzE3MCwgMzA1LCA2NjAsMzUyNCwyMTkwLDEzMzQsMTEzNSwzMTcxLDE1NDAsMTY0OSwyNTQyLDE1MjcsIDkyNywgOTY4LDI3OTMsIDg4NSwgIyAyMTYwCjE5NzIsMTg1MCwgNDgyLCA1MDAsMjYzOCwxMjE4LDExMDksMTA4NSwyNTQzLDE2NTQsMjAzNCwgODc2LCAgNzgsMjI4NywxNDgyLDEyNzcsICMgMjE3NgogODYxLDE2NzUsMTA4MywxNzc5LCA3MjQsMjc1NCwgNDU0LCAzOTcsMTEzMiwxNjEyLDIzMzIsIDg5MywgNjcyLDEyMzcsIDI1NywyMjU5LCAjIDIxOTIKMjM3MCwgMTM1LDMzODQsIDMzNywyMjQ0LCA1NDcsIDM1MiwgMzQwLCA3MDksMjQ4NSwxNDAwLCA3ODgsMTEzOCwyNTExLCA1NDAsIDc3MiwgIyAyMjA4CjE2ODIsMjI2MCwyMjcyLDI1NDQsMjAxMywxODQzLDE5MDIsNDYzNiwxOTk5LDE1NjIsMjI4OCw0NjM3LDIyMDEsMTQwMywxNTMzLCA0MDcsICMgMjIyNAogNTc2LDMzMDgsMTI1NCwyMDcxLCA5NzgsMzM4NSwgMTcwLCAxMzYsMTIwMSwzMTI1LDI2NjQsMzE3MiwyMzk0LCAyMTMsIDkxMiwgODczLCAjIDIyNDAKMzYwMywxNzEzLDIyMDIsIDY5OSwzNjA0LDM2OTksIDgxMywzNDQyLCA0OTMsIDUzMSwxMDU0LCA0NjgsMjkwNywxNDgzLCAzMDQsIDI4MSwgIyAyMjU2CjQxMTIsMTcyNiwxMjUyLDIwOTQsIDMzOSwyMzE5LDIxMzAsMjYzOSwgNzU2LDE1NjMsMjk0NCwgNzQ4LCA1NzEsMjk3NiwxNTg4LDI0MjUsICMgMjI3MgoyNzE1LDE4NTEsMTQ2MCwyNDI2LDE1MjgsMTM5MiwxOTczLDMyMzcsIDI4OCwzMzA5LCA2ODUsMzM4NiwgMjk2LCA4OTIsMjcxNiwyMjE2LCAjIDIyODgKMTU3MCwyMjQ1LCA3MjIsMTc0NywyMjE3LCA5MDUsMzIzOCwxMTAzLDYxMzUsMTg5MywxNDQxLDE5NjUsIDI1MSwxODA1LDIzNzEsMzcwMCwgIyAyMzA0CjI2MDEsMTkxOSwxMDc4LCAgNzUsMjE4MiwxNTA5LDE1OTIsMTI3MCwyNjQwLDQ2MzgsMjE1Miw2MTM2LDMzMTAsMzgxNywgNTI0LCA3MDYsICMgMjMyMAoxMDc1LCAyOTIsMzgxOCwxNzU2LDI2MDIsIDMxNywgIDk4LDMxNzMsMzYwNSwzNTI1LDE4NDQsMjIxOCwzODE5LDI1MDIsIDgxNCwgNTY3LCAjIDIzMzYKIDM4NSwyOTA4LDE1MzQsNjEzNywgNTM0LDE2NDIsMzIzOSwgNzk3LDYxMzgsMTY3MCwxNTI5LCA5NTMsNDMyMywgMTg4LDEwNzEsIDUzOCwgIyAyMzUyCiAxNzgsIDcyOSwzMjQwLDIxMDksMTIyNiwxMzc0LDIwMDAsMjM1NywyOTc3LCA3MzEsMjQ2OCwxMTE2LDIwMTQsMjA1MSw2MTM5LDEyNjEsICMgMjM2OAoxNTkzLCA4MDMsMjg1OSwyNzM2LDM0NDMsIDU1NiwgNjgyLCA4MjMsMTU0MSw2MTQwLDEzNjksMjI4OSwxNzA2LDI3OTQsIDg0NSwgNDYyLCAjIDIzODQKMjYwMywyNjY1LDEzNjEsIDM4NywgMTYyLDIzNTgsMTc0MCwgNzM5LDE3NzAsMTcyMCwxMzA0LDE0MDEsMzI0MSwxMDQ5LCA2MjcsMTU3MSwgIyAyNDAwCjI0MjcsMzUyNiwxODc3LDM5NDIsMTg1MiwxNTAwLCA0MzEsMTkxMCwxNTAzLCA2NzcsIDI5NywyNzk1LCAyODYsMTQzMywxMDM4LDExOTgsICMgMjQxNgoyMjkwLDExMzMsMTU5Niw0MTEzLDQ2MzksMjQ2OSwxNTEwLDE0ODQsMzk0Myw2MTQxLDI0NDIsIDEwOCwgNzEyLDQ2NDAsMjM3MiwgODY2LCAjIDI0MzIKMzcwMSwyNzU1LDMyNDIsMTM0OCwgODM0LDE5NDUsMTQwOCwzNTI3LDIzOTUsMzI0MywxODExLCA4MjQsIDk5NCwxMTc5LDIxMTAsMTU0OCwgIyAyNDQ4CjE0NTMsIDc5MCwzMDAzLCA2OTAsNDMyNCw0MzI1LDI4MzIsMjkwOSwzODIwLDE4NjAsMzgyMSwgMjI1LDE3NDgsIDMxMCwgMzQ2LDE3ODAsICMgMjQ2NAoyNDcwLCA4MjEsMTk5MywyNzE3LDI3OTYsIDgyOCwgODc3LDM1MjgsMjg2MCwyNDcxLDE3MDIsMjE2NSwyOTEwLDI0ODYsMTc4OSwgNDUzLCAjIDI0ODAKIDM1OSwyMjkxLDE2NzYsICA3MywxMTY0LDE0NjEsMTEyNywzMzExLCA0MjEsIDYwNCwgMzE0LDEwMzcsIDU4OSwgMTE2LDI0ODcsIDczNywgIyAyNDk2CiA4MzcsMTE4MCwgMTExLCAyNDQsIDczNSw2MTQyLDIyNjEsMTg2MSwxMzYyLCA5ODYsIDUyMywgNDE4LCA1ODEsMjY2NiwzODIyLCAxMDMsICMgMjUxMgogODU1LCA1MDMsMTQxNCwxODY3LDI0ODgsMTA5MSwgNjU3LDE1OTcsIDk3OSwgNjA1LDEzMTYsNDY0MSwxMDIxLDI0NDMsMjA3OCwyMDAxLCAjIDI1MjgKMTIwOSwgIDk2LCA1ODcsMjE2NiwxMDMyLCAyNjAsMTA3MiwyMTUzLCAxNzMsICA5NCwgMjI2LDMyNDQsIDgxOSwyMDA2LDQ2NDIsNDExNCwgIyAyNTQ0CjIyMDMsIDIzMSwxNzQ0LCA3ODIsICA5NywyNjY3LCA3ODYsMzM4NywgODg3LCAzOTEsIDQ0MiwyMjE5LDQzMjYsMTQyNSw2MTQzLDI2OTQsICMgMjU2MAogNjMzLDE1NDQsMTIwMiwgNDgzLDIwMTUsIDU5MiwyMDUyLDE5NTgsMjQ3MiwxNjU1LCA0MTksIDEyOSw0MzI3LDM0NDQsMzMxMiwxNzE0LCAjIDI1NzYKMTI1NywzMDc4LDQzMjgsMTUxOCwxMDk4LCA4NjUsMTMxMCwxMDE5LDE4ODUsMTUxMiwxNzM0LCA0NjksMjQ0NCwgMTQ4LCA3NzMsIDQzNiwgIyAyNTkyCjE4MTUsMTg2OCwxMTI4LDEwNTUsNDMyOSwxMjQ1LDI3NTYsMzQ0NSwyMTU0LDE5MzQsMTAzOSw0NjQzLCA1NzksMTIzOCwgOTMyLDIzMjAsICMgMjYwOAogMzUzLCAyMDUsIDgwMSwgMTE1LDI0MjgsIDk0NCwyMzIxLDE4ODEsIDM5OSwyNTY1LDEyMTEsIDY3OCwgNzY2LDM5NDQsIDMzNSwyMTAxLCAjIDI2MjQKMTQ1OSwxNzgxLDE0MDIsMzk0NSwyNzM3LDIxMzEsMTAxMCwgODQ0LCA5ODEsMTMyNiwxMDEzLCA1NTAsMTgxNiwxNTQ1LDI2MjAsMTMzNSwgIyAyNjQwCjEwMDgsIDM3MSwyODgxLCA5MzYsMTQxOSwxNjEzLDM1MjksMTQ1NiwxMzk1LDIyNzMsMTgzNCwyNjA0LDEzMTcsMjczOCwyNTAzLCA0MTYsICMgMjY1NgoxNjQzLDQzMzAsIDgwNiwxMTI2LCAyMjksIDU5MSwzOTQ2LDEzMTQsMTk4MSwxNTc2LDE4MzcsMTY2NiwgMzQ3LDE3OTAsIDk3NywzMzEzLCAjIDI2NzIKIDc2NCwyODYxLDE4NTMsIDY4OCwyNDI5LDE5MjAsMTQ2MiwgIDc3LCA1OTUsIDQxNSwyMDAyLDMwMzQsIDc5OCwxMTkyLDQxMTUsNjE0NCwgIyAyNjg4CjI5NzgsNDMzMSwzMDM1LDI2OTUsMjU4MiwyMDcyLDI1NjYsIDQzMCwyNDMwLDE3MjcsIDg0MiwxMzk2LDM5NDcsMzcwMiwgNjEzLCAzNzcsICMgMjcwNAogMjc4LCAyMzYsMTQxNywzMzg4LDMzMTQsMzE3NCwgNzU3LDE4NjksIDEwNywzNTMwLDYxNDUsMTE5NCwgNjIzLDIyNjIsIDIwNywxMjUzLCAjIDI3MjAKMjE2NywzNDQ2LDM5NDgsIDQ5MiwxMTE3LDE5MzUsIDUzNiwxODM4LDI3NTcsMTI0Niw0MzMyLCA2OTYsMjA5NSwyNDA2LDEzOTMsMTU3MiwgIyAyNzM2CjMxNzUsMTc4MiwgNTgzLCAxOTAsIDI1MywxMzkwLDIyMzAsIDgzMCwzMTI2LDMzODksIDkzNCwzMjQ1LDE3MDMsMTc0OSwyOTc5LDE4NzAsICMgMjc1MgoyNTQ1LDE2NTYsMjIwNCwgODY5LDIzNDYsNDExNiwzMTc2LDE4MTcsIDQ5NiwxNzY0LDQ2NDQsIDk0MiwxNTA0LCA0MDQsMTkwMywxMTIyLCAjIDI3NjgKMTU4MCwzNjA2LDI5NDUsMTAyMiwgNTE1LCAzNzIsMTczNSwgOTU1LDI0MzEsMzAzNiw2MTQ2LDI3OTcsMTExMCwyMzAyLDI3OTgsIDYxNywgIyAyNzg0CjYxNDcsIDQ0MSwgNzYyLDE3NzEsMzQ0NywzNjA3LDM2MDgsMTkwNCwgODQwLDMwMzcsICA4NiwgOTM5LDEzODUsIDU3MiwxMzcwLDI0NDUsICMgMjgwMAoxMzM2LCAxMTQsMzcwMywgODk4LCAyOTQsIDIwMywzMzE1LCA3MDMsMTU4MywyMjc0LCA0MjksIDk2MSw0MzMzLDE4NTQsMTk1MSwzMzkwLCAjIDI4MTYKMjM3MywzNzA0LDQzMzQsMTMxOCwxMzgxLCA5NjYsMTkxMSwyMzIyLDEwMDYsMTE1NSwgMzA5LCA5ODksIDQ1OCwyNzE4LDE3OTUsMTM3MiwgIyAyODMyCjEyMDMsIDI1MiwxNjg5LDEzNjMsMzE3NywgNTE3LDE5MzYsIDE2OCwxNDkwLCA1NjIsIDE5MywzODIzLDEwNDIsNDExNywxODM1LCA1NTEsICMgMjg0OAogNDcwLDQ2NDUsIDM5NSwgNDg5LDM0NDgsMTg3MSwxNDY1LDI1ODMsMjY0MSwgNDE3LDE0OTMsIDI3OSwxMjk1LCA1MTEsMTIzNiwxMTE5LCAjIDI4NjQKICA3MiwxMjMxLDE5ODIsMTgxMiwzMDA0LCA4NzEsMTU2NCwgOTg0LDM0NDksMTY2NywyNjk2LDIwOTYsNDY0NiwyMzQ3LDI4MzMsMTY3MywgIyAyODgwCjM2MDksIDY5NSwzMjQ2LDI2NjgsIDgwNywxMTgzLDQ2NDcsIDg5MCwgMzg4LDIzMzMsMTgwMSwxNDU3LDI5MTEsMTc2NSwxNDc3LDEwMzEsICMgMjg5NgozMzE2LDMzMTcsMTI3OCwzMzkxLDI3OTksMjI5MiwyNTI2LCAxNjMsMzQ1MCw0MzM1LDI2NjksMTQwNCwxODAyLDYxNDgsMjMyMywyNDA3LCAjIDI5MTIKMTU4NCwxNzI4LDE0OTQsMTgyNCwxMjY5LCAyOTgsIDkwOSwzMzE4LDEwMzQsMTYzMiwgMzc1LCA3NzYsMTY4MywyMDYxLCAyOTEsIDIxMCwgIyAyOTI4CjExMjMsIDgwOSwxMjQ5LDEwMDIsMjY0MiwzMDM4LCAyMDYsMTAxMSwyMTMyLCAxNDQsIDk3NSwgODgyLDE1NjUsIDM0MiwgNjY3LCA3NTQsICMgMjk0NAoxNDQyLDIxNDMsMTI5OSwyMzAzLDIwNjIsIDQ0NywgNjI2LDIyMDUsMTIyMSwyNzM5LDI5MTIsMTE0NCwxMjE0LDIyMDYsMjU4NCwgNzYwLCAjIDI5NjAKMTcxNSwgNjE0LCA5NTAsMTI4MSwyNjcwLDI2MjEsIDgxMCwgNTc3LDEyODcsMjU0Niw0NjQ4LCAyNDIsMjE2OCwgMjUwLDI2NDMsIDY5MSwgIyAyOTc2CiAxMjMsMjY0NCwgNjQ3LCAzMTMsMTAyOSwgNjg5LDEzNTcsMjk0NiwxNjUwLCAyMTYsIDc3MSwxMzM5LDEzMDYsIDgwOCwyMDYzLCA1NDksICMgMjk5MgogOTEzLDEzNzEsMjkxMywyOTE0LDYxNDksMTQ2NiwxMDkyLDExNzQsMTE5NiwxMzExLDI2MDUsMjM5NiwxNzgzLDE3OTYsMzA3OSwgNDA2LCAjIDMwMDgKMjY3MSwyMTE3LDM5NDksNDY0OSwgNDg3LDE4MjUsMjIyMCw2MTUwLDI5MTUsIDQ0OCwyMzQ4LDEwNzMsNjE1MSwyMzk3LDE3MDcsIDEzMCwgIyAzMDI0CiA5MDAsMTU5OCwgMzI5LCAxNzYsMTk1OSwyNTI3LDE2MjAsNjE1MiwyMjc1LDQzMzYsMzMxOSwxOTgzLDIxOTEsMzcwNSwzNjEwLDIxNTUsICMgMzA0MAozNzA2LDE5MTIsMTUxMywxNjE0LDYxNTMsMTk4OCwgNjQ2LCAzOTIsMjMwNCwxNTg5LDMzMjAsMzAzOSwxODI2LDEyMzksMTM1MiwxMzQwLCAjIDMwNTYKMjkxNiwgNTA1LDI1NjcsMTcwOSwxNDM3LDI0MDgsMjU0NywgOTA2LDYxNTQsMjY3MiwgMzg0LDE0NTgsMTU5NCwxMTAwLDEzMjksIDcxMCwgIyAzMDcyCiA0MjMsMzUzMSwyMDY0LDIyMzEsMjYyMiwxOTg5LDI2NzMsMTA4NywxODgyLCAzMzMsIDg0MSwzMDA1LDEyOTYsMjg4MiwyMzc5LCA1ODAsICMgMzA4OAoxOTM3LDE4MjcsMTI5MywyNTg1LCA2MDEsIDU3NCwgMjQ5LDE3NzIsNDExOCwyMDc5LDExMjAsIDY0NSwgOTAxLDExNzYsMTY5MCwgNzk1LCAjIDMxMDQKMjIwNywgNDc4LDE0MzQsIDUxNiwxMTkwLDE1MzAsIDc2MSwyMDgwLCA5MzAsMTI2NCwgMzU1LCA0MzUsMTU1MiwgNjQ0LDE3OTEsIDk4NywgIyAzMTIwCiAyMjAsMTM2NCwxMTYzLDExMjEsMTUzOCwgMzA2LDIxNjksMTMyNywxMjIyLCA1NDYsMjY0NSwgMjE4LCAyNDEsIDYxMCwxNzA0LDMzMjEsICMgMzEzNgoxOTg0LDE4MzksMTk2NiwyNTI4LCA0NTEsNjE1NSwyNTg2LDM3MDcsMjU2OCwgOTA3LDMxNzgsIDI1NCwyOTQ3LCAxODYsMTg0NSw0NjUwLCAjIDMxNTIKIDc0NSwgNDMyLDE3NTcsIDQyOCwxNjMzLCA4ODgsMjI0NiwyMjIxLDI0ODksMzYxMSwyMTE4LDEyNTgsMTI2NSwgOTU2LDMxMjcsMTc4NCwgIyAzMTY4CjQzMzcsMjQ5MCwgMzE5LCA1MTAsIDExOSwgNDU3LDM2MTIsIDI3NCwyMDM1LDIwMDcsNDY1MSwxNDA5LDMxMjgsIDk3MCwyNzU4LCA1OTAsICMgMzE4NAoyODAwLCA2NjEsMjI0Nyw0NjUyLDIwMDgsMzk1MCwxNDIwLDE1NDksMzA4MCwzMzIyLDM5NTEsMTY1MSwxMzc1LDIxMTEsIDQ4NSwyNDkxLCAjIDMyMDAKMTQyOSwxMTU2LDYxNTYsMjU0OCwyMTgzLDE0OTUsIDgzMSwxODQwLDI1MjksMjQ0NiwgNTAxLDE2NTcsIDMwNywxODk0LDMyNDcsMTM0MSwgIyAzMjE2CiA2NjYsIDg5OSwyMTU2LDE1MzksMjU0OSwxNTU5LCA4ODYsIDM0OSwyMjA4LDMwODEsMjMwNSwxNzM2LDM4MjQsMjE3MCwyNzU5LDEwMTQsICMgMzIzMgoxOTEzLDEzODYsIDU0MiwxMzk3LDI5NDgsIDQ5MCwgMzY4LCA3MTYsIDM2MiwgMTU5LCAyODIsMjU2OSwxMTI5LDE2NTgsMTI4OCwxNzUwLCAjIDMyNDgKMjY3NCwgMjc2LCA2NDksMjAxNiwgNzUxLDE0OTYsIDY1OCwxODE4LDEyODQsMTg2MiwyMjA5LDIwODcsMjUxMiwzNDUxLCA2MjIsMjgzNCwgIyAzMjY0CiAzNzYsIDExNywxMDYwLDIwNTMsMTIwOCwxNzIxLDExMDEsMTQ0MywgMjQ3LDEyNTAsMzE3OSwxNzkyLDM5NTIsMjc2MCwyMzk4LDM5NTMsICMgMzI4MAo2MTU3LDIxNDQsMzcwOCwgNDQ2LDI0MzIsMTE1MSwyNTcwLDM0NTIsMjQ0NywyNzYxLDI4MzUsMTIxMCwyNDQ4LDMwODIsIDQyNCwyMjIyLCAjIDMyOTYKMTI1MSwyNDQ5LDIxMTksMjgzNiwgNTA0LDE1ODEsNDMzOCwgNjAyLCA4MTcsIDg1NywzODI1LDIzNDksMjMwNiwgMzU3LDM4MjYsMTQ3MCwgIyAzMzEyCjE4ODMsMjg4MywgMjU1LCA5NTgsIDkyOSwyOTE3LDMyNDgsIDMwMiw0NjUzLDEwNTAsMTI3MSwxNzUxLDIzMDcsMTk1MiwxNDMwLDI2OTcsICMgMzMyOAoyNzE5LDIzNTksIDM1NCwzMTgwLCA3NzcsIDE1OCwyMDM2LDQzMzksMTY1OSw0MzQwLDQ2NTQsMjMwOCwyOTQ5LDIyNDgsMTE0NiwyMjMyLCAjIDMzNDQKMzUzMiwyNzIwLDE2OTYsMjYyMywzODI3LDYxNTgsMzEyOSwxNTUwLDI2OTgsMTQ4NSwxMjk3LDE0MjgsIDYzNywgOTMxLDI3MjEsMjE0NSwgIyAzMzYwCiA5MTQsMjU1MCwyNTg3LCAgODEsMjQ1MCwgNjEyLCA4MjcsMjY0NiwxMjQyLDQ2NTUsMTExOCwyODg0LCA0NzIsMTg1NSwzMTgxLDM1MzMsICMgMzM3NgozNTM0LCA1NjksMTM1MywyNjk5LDEyNDQsMTc1OCwyNTg4LDQxMTksMjAwOSwyNzYyLDIxNzEsMzcwOSwxMzEyLDE1MzEsNjE1OSwxMTUyLCAjIDMzOTIKMTkzOCwgMTM0LDE4MzAsIDQ3MSwzNzEwLDIyNzYsMTExMiwxNTM1LDMzMjMsMzQ1MywzNTM1LCA5ODIsMTMzNywyOTUwLCA0ODgsIDgyNiwgIyAzNDA4CiA2NzQsMTA1OCwxNjI4LDQxMjAsMjAxNywgNTIyLDIzOTksIDIxMSwgNTY4LDEzNjcsMzQ1NCwgMzUwLCAyOTMsMTg3MiwxMTM5LDMyNDksICMgMzQyNAoxMzk5LDE5NDYsMzAwNiwxMzAwLDIzNjAsMzMyNCwgNTg4LCA3MzYsNjE2MCwyNjA2LCA3NDQsIDY2OSwzNTM2LDM4MjgsNjE2MSwxMzU4LCAjIDM0NDAKIDE5OSwgNzIzLCA4NDgsIDkzMywgODUxLDE5MzksMTUwNSwxNTE0LDEzMzgsMTYxOCwxODMxLDQ2NTYsMTYzNCwzNjEzLCA0NDMsMjc0MCwgIyAzNDU2CjM4MjksIDcxNywxOTQ3LCA0OTEsMTkxNCw2MTYyLDI1NTEsMTU0Miw0MTIxLDEwMjUsNjE2MywxMDk5LDEyMjMsIDE5OCwzMDQwLDI3MjIsICMgMzQ3MgogMzcwLCA0MTAsMTkwNSwyNTg5LCA5OTgsMTI0OCwzMTgyLDIzODAsIDUxOSwxNDQ5LDQxMjIsMTcxMCwgOTQ3LCA5MjgsMTE1Myw0MzQxLCAjIDM0ODgKMjI3NywgMzQ0LDI2MjQsMTUxMSwgNjE1LCAxMDUsIDE2MSwxMjEyLDEwNzYsMTk2MCwzMTMwLDIwNTQsMTkyNiwxMTc1LDE5MDYsMjQ3MywgIyAzNTA0CiA0MTQsMTg3MywyODAxLDYxNjQsMjMwOSwgMzE1LDEzMTksMzMyNSwgMzE4LDIwMTgsMjE0NiwyMTU3LCA5NjMsIDYzMSwgMjIzLDQzNDIsICMgMzUyMAo0MzQzLDI2NzUsIDQ3OSwzNzExLDExOTcsMjYyNSwzNzEyLDI2NzYsMjM2MSw2MTY1LDQzNDQsNDEyMyw2MTY2LDI0NTEsMzE4MywxODg2LCAjIDM1MzYKMjE4NCwxNjc0LDEzMzAsMTcxMSwxNjM1LDE1MDYsIDc5OSwgMjE5LDMyNTAsMzA4MywzOTU0LDE2NzcsMzcxMywzMzI2LDIwODEsMzYxNCwgIyAzNTUyCjE2NTIsMjA3Myw0NjU3LDExNDcsMzA0MSwxNzUyLCA2NDMsMTk2MSwgMTQ3LDE5NzQsMzk1NSw2MTY3LDE3MTYsMjAzNywgOTE4LDMwMDcsICMgMzU2OAoxOTk0LCAxMjAsMTUzNywgMTE4LCA2MDksMzE4NCw0MzQ1LCA3NDAsMzQ1NSwxMjE5LCAzMzIsMTYxNSwzODMwLDYxNjgsMTYyMSwyOTgwLCAjIDM1ODQKMTU4MiwgNzgzLCAyMTIsIDU1MywyMzUwLDM3MTQsMTM0OSwyNDMzLDIwODIsNDEyNCwgODg5LDYxNjksMjMxMCwxMjc1LDE0MTAsIDk3MywgIyAzNjAwCiAxNjYsMTMyMCwzNDU2LDE3OTcsMTIxNSwzMTg1LDI4ODUsMTg0NiwyNTkwLDI3NjMsNDY1OCwgNjI5LCA4MjIsMzAwOCwgNzYzLCA5NDAsICMgMzYxNgoxOTkwLDI4NjIsIDQzOSwyNDA5LDE1NjYsMTI0MCwxNjIyLCA5MjYsMTI4MiwxOTA3LDI3NjQsIDY1NCwyMjEwLDE2MDcsIDMyNywxMTMwLCAjIDM2MzIKMzk1NiwxNjc4LDE2MjMsNjE3MCwyNDM0LDIxOTIsIDY4NiwgNjA4LDM4MzEsMzcxNSwgOTAzLDM5NTcsMzA0Miw2MTcxLDI3NDEsMTUyMiwgIyAzNjQ4CjE5MTUsMTEwNSwxNTU1LDI1NTIsMTM1OSwgMzIzLDMyNTEsNDM0NiwzNDU3LCA3MzgsMTM1NCwyNTUzLDIzMTEsMjMzNCwxODI4LDIwMDMsICMgMzY2NAozODMyLDE3NTMsMjM1MSwxMjI3LDYxNzIsMTg4Nyw0MTI1LDE0NzgsNjE3MywyNDEwLDE4NzQsMTcxMiwxODQ3LCA1MjAsMTIwNCwyNjA3LCAjIDM2ODAKIDI2NCw0NjU5LCA4MzYsMjY3NywyMTAyLCA2MDAsNDY2MCwzODMzLDIyNzgsMzA4NCw2MTc0LDQzNDcsMzYxNSwxMzQyLCA2NDAsIDUzMiwgIyAzNjk2CiA1NDMsMjYwOCwxODg4LDI0MDAsMjU5MSwxMDA5LDQzNDgsMTQ5NywgMzQxLDE3MzcsMzYxNiwyNzIzLDEzOTQsIDUyOSwzMjUyLDEzMjEsICMgMzcxMgogOTgzLDQ2NjEsMTUxNSwyMTIwLCA5NzEsMjU5MiwgOTI0LCAyODcsMTY2MiwzMTg2LDQzNDksMjcwMCw0MzUwLDE1MTksIDkwOCwxOTQ4LCAjIDM3MjgKMjQ1MiwgMTU2LCA3OTYsMTYyOSwxNDg2LDIyMjMsMjA1NSwgNjk0LDQxMjYsMTI1OSwxMDM2LDMzOTIsMTIxMywyMjQ5LDI3NDIsMTg4OSwgIyAzNzQ0CjEyMzAsMzk1OCwxMDE1LCA5MTAsIDQwOCwgNTU5LDM2MTcsNDY2MiwgNzQ2LCA3MjUsIDkzNSw0NjYzLDM5NTksMzAwOSwxMjg5LCA1NjMsICMgMzc2MAogODY3LDQ2NjQsMzk2MCwxNTY3LDI5ODEsMjAzOCwyNjI2LCA5ODgsMjI2MywyMzgxLDQzNTEsIDE0MywyMzc0LCA3MDQsMTg5NSw2MTc1LCAjIDM3NzYKMTE4OCwzNzE2LDIwODgsIDY3MywzMDg1LDIzNjIsNDM1MiwgNDg0LDE2MDgsMTkyMSwyNzY1LDI5MTgsIDIxNSwgOTA0LDM2MTgsMzUzNywgIyAzNzkyCiA4OTQsIDUwOSwgOTc2LDMwNDMsMjcwMSwzOTYxLDQzNTMsMjgzNywyOTgyLCA0OTgsNjE3Niw2MTc3LDExMDIsMzUzOCwxMzMyLDMzOTMsICMgMzgwOAoxNDg3LDE2MzYsMTYzNywgMjMzLCAyNDUsMzk2MiwgMzgzLCA2NTAsIDk5NSwzMDQ0LCA0NjAsMTUyMCwxMjA2LDIzNTIsIDc0OSwzMzI3LCAjIDM4MjQKIDUzMCwgNzAwLCAzODksMTQzOCwxNTYwLDE3NzMsMzk2MywyMjY0LCA3MTksMjk1MSwyNzI0LDM4MzQsIDg3MCwxODMyLDE2NDQsMTAwMCwgIyAzODQwCiA4MzksMjQ3NCwzNzE3LCAxOTcsMTYzMCwzMzk0LCAzNjUsMjg4NiwzOTY0LDEyODUsMjEzMywgNzM0LCA5MjIsIDgxOCwxMTA2LCA3MzIsICMgMzg1NgogNDgwLDIwODMsMTc3NCwzNDU4LCA5MjMsMjI3OSwxMzUwLCAyMjEsMzA4NiwgIDg1LDIyMzMsMjIzNCwzODM1LDE1ODUsMzAxMCwyMTQ3LCAjIDM4NzIKMTM4NywxNzA1LDIzODIsMTYxOSwyNDc1LCAxMzMsIDIzOSwyODAyLDE5OTEsMTAxNiwyMDg0LDIzODMsIDQxMSwyODM4LDExMTMsIDY1MSwgIyAzODg4CjE5ODUsMTE2MCwzMzI4LCA5OTAsMTg2MywzMDg3LDEwNDgsMTI3NiwyNjQ3LCAyNjUsMjYyNywxNTk5LDMyNTMsMjA1NiwgMTUwLCA2MzgsICMgMzkwNAoyMDE5LCA2NTYsIDg1MywgMzI2LDE0NzksIDY4MCwxNDM5LDQzNTQsMTAwMSwxNzU5LCA0MTMsMzQ1OSwzMzk1LDI0OTIsMTQzMSwgNDU5LCAjIDM5MjAKNDM1NSwxMTI1LDMzMjksMjI2NSwxOTUzLDE0NTAsMjA2NSwyODYzLCA4NDksIDM1MSwyNjc4LDMxMzEsMzI1NCwzMjU1LDExMDQsMTU3NywgIyAzOTM2CiAyMjcsMTM1MSwxNjQ1LDI0NTMsMjE5MywxNDIxLDI4ODcsIDgxMiwyMTIxLCA2MzQsICA5NSwyNDM1LCAyMDEsMjMxMiw0NjY1LDE2NDYsICMgMzk1MgoxNjcxLDI3NDMsMTYwMSwyNTU0LDI3MDIsMjY0OCwyMjgwLDEzMTUsMTM2NiwyMDg5LDMxMzIsMTU3MywzNzE4LDM5NjUsMTcyOSwxMTg5LCAjIDM5NjgKIDMyOCwyNjc5LDEwNzcsMTk0MCwxMTM2LCA1NTgsMTI4MywgOTY0LDExOTUsIDYyMSwyMDc0LDExOTksMTc0MywzNDYwLDM2MTksMTg5NiwgIyAzOTg0CjE5MTYsMTg5MCwzODM2LDI5NTIsMTE1NCwyMTEyLDEwNjQsIDg2MiwgMzc4LDMwMTEsMjA2NiwyMTEzLDI4MDMsMTU2OCwyODM5LDYxNzgsICMgNDAwMAozMDg4LDI5MTksMTk0MSwxNjYwLDIwMDQsMTk5MiwyMTk0LCAxNDIsIDcwNywxNTkwLDE3MDgsMTYyNCwxOTIyLDEwMjMsMTgzNiwxMjMzLCAjIDQwMTYKMTAwNCwyMzEzLCA3ODksIDc0MSwzNjIwLDYxNzksMTYwOSwyNDExLDEyMDAsNDEyNywzNzE5LDM3MjAsNDY2NiwyMDU3LDM3MjEsIDU5MywgIyA0MDMyCjI4NDAsIDM2NywyOTIwLDE4NzgsNjE4MCwzNDYxLDE1MjEsIDYyOCwxMTY4LCA2OTIsMjIxMSwyNjQ5LCAzMDAsIDcyMCwyMDY3LDI1NzEsICMgNDA0OAoyOTUzLDMzOTYsIDk1OSwyNTA0LDM5NjYsMzUzOSwzNDYyLDE5NzcsIDcwMSw2MTgxLCA5NTQsMTA0MywgODAwLCA2ODEsIDE4MywzNzIyLCAjIDQwNjQKMTgwMywxNzMwLDM1NDAsNDEyOCwyMTAzLCA4MTUsMjMxNCwgMTc0LCA0NjcsIDIzMCwyNDU0LDEwOTMsMjEzNCwgNzU1LDM1NDEsMzM5NywgIyA0MDgwCjExNDEsMTE2Miw2MTgyLDE3MzgsMjAzOSwgMjcwLDMyNTYsMjUxMywxMDA1LDE2NDcsMjE4NSwzODM3LCA4NTgsMTY3OSwxODk3LDE3MTksICMgNDA5NgoyOTU0LDIzMjQsMTgwNiwgNDAyLCA2NzAsIDE2Nyw0MTI5LDE0OTgsMjE1OCwyMTA0LCA3NTAsNjE4MywgOTE1LCAxODksMTY4MCwxNTUxLCAjIDQxMTIKIDQ1NSw0MzU2LDE1MDEsMjQ1NSwgNDA1LDEwOTUsMjk1NSwgMzM4LDE1ODYsMTI2NiwxODE5LCA1NzAsIDY0MSwxMzI0LCAyMzcsMTU1NiwgIyA0MTI4CjI2NTAsMTM4OCwzNzIzLDYxODQsMTM2OCwyMzg0LDEzNDMsMTk3OCwzMDg5LDI0MzYsIDg3OSwzNzI0LCA3OTIsMTE5MSwgNzU4LDMwMTIsICMgNDE0NAoxNDExLDIxMzUsMTMyMiw0MzU3LCAyNDAsNDY2NywxODQ4LDM3MjUsMTU3NCw2MTg1LCA0MjAsMzA0NSwxNTQ2LDEzOTEsIDcxNCw0MzU4LCAjIDQxNjAKMTk2NywgOTQxLDE4NjQsIDg2MywgNjY0LCA0MjYsIDU2MCwxNzMxLDI2ODAsMTc4NSwyODY0LDE5NDksMjM2MywgNDAzLDMzMzAsMTQxNSwgIyA0MTc2CjEyNzksMjEzNiwxNjk3LDIzMzUsIDIwNCwgNzIxLDIwOTcsMzgzOCwgIDkwLDYxODYsMjA4NSwyNTA1LCAxOTEsMzk2NywgMTI0LDIxNDgsICMgNDE5MgoxMzc2LDE3OTgsMTE3OCwxMTA3LDE4OTgsMTQwNSwgODYwLDQzNTksMTI0MywxMjcyLDIzNzUsMjk4MywxNTU4LDI0NTYsMTYzOCwgMTEzLCAjIDQyMDgKMzYyMSwgNTc4LDE5MjMsMjYwOSwgODgwLCAzODYsNDEzMCwgNzg0LDIxODYsMjI2NiwxNDIyLDI5NTYsMjE3MiwxNzIyLCA0OTcsIDI2MywgIyA0MjI0CjI1MTQsMTI2NywyNDEyLDI2MTAsIDE3NywyNzAzLDM1NDIsIDc3NCwxOTI3LDEzNDQsIDYxNiwxNDMyLDE1OTUsMTAxOCwgMTcyLDQzNjAsICMgNDI0MAoyMzI1LCA5MTEsNDM2MSwgNDM4LDE0NjgsMzYyMiwgNzk0LDM5NjgsMjAyNCwyMTczLDE2ODEsMTgyOSwyOTU3LCA5NDUsIDg5NSwzMDkwLCAjIDQyNTYKIDU3NSwyMjEyLDI0NzYsIDQ3NSwyNDAxLDI2ODEsIDc4NSwyNzQ0LDE3NDUsMjI5MywyNTU1LDE5NzUsMzEzMywyODY1LCAzOTQsNDY2OCwgIyA0MjcyCjM4MzksIDYzNSw0MTMxLCA2MzksIDIwMiwxNTA3LDIxOTUsMjc2NiwxMzQ1LDE0MzUsMjU3MiwzNzI2LDE5MDgsMTE4NCwxMTgxLDI0NTcsICMgNDI4OAozNzI3LDMxMzQsNDM2MiwgODQzLDI2MTEsIDQzNywgOTE2LDQ2NjksIDIzNCwgNzY5LDE4ODQsMzA0NiwzMDQ3LDM2MjMsIDgzMyw2MTg3LCAjIDQzMDQKMTYzOSwyMjUwLDI0MDIsMTM1NSwxMTg1LDIwMTAsMjA0NywgOTk5LCA1MjUsMTczMiwxMjkwLDE0ODgsMjYxMiwgOTQ4LDE1NzgsMzcyOCwgIyA0MzIwCjI0MTMsMjQ3NywxMjE2LDI3MjUsMjE1OSwgMzM0LDM4NDAsMTMyOCwzNjI0LDI5MjEsMTUyNSw0MTMyLCA1NjQsMTA1NiwgODkxLDQzNjMsICMgNDMzNgoxNDQ0LDE2OTgsMjM4NSwyMjUxLDM3MjksMTM2NSwyMjgxLDIyMzUsMTcxNyw2MTg4LCA4NjQsMzg0MSwyNTE1LCA0NDQsIDUyNywyNzY3LCAjIDQzNTIKMjkyMiwzNjI1LCA1NDQsIDQ2MSw2MTg5LCA1NjYsIDIwOSwyNDM3LDMzOTgsMjA5OCwxMDY1LDIwNjgsMzMzMSwzNjI2LDMyNTcsMjEzNywgIyA0MzY4ICAjbGFzdCA1MTIKKQoKClBLAwQUAAAAAAAAACEABnklartMAAC7TAAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCiMgVGhpcyBpcyBoaXJhZ2FuYSAyLWNoYXIgc2VxdWVuY2UgdGFibGUsIHRoZSBudW1iZXIgaW4gZWFjaCBjZWxsIHJlcHJlc2VudHMgaXRzIGZyZXF1ZW5jeSBjYXRlZ29yeQpqcDJDaGFyQ29udGV4dCA9ICgKKDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSksCigyLDQsMCw0LDAsMywwLDQsMCwzLDQsNCw0LDIsNCwzLDMsNCwzLDIsMywzLDQsMiwzLDMsMywyLDQsMSw0LDMsMywxLDUsNCwzLDQsMyw0LDMsNSwzLDAsMyw1LDQsMiwwLDMsMSwwLDMsMywwLDMsMywwLDEsMSwwLDQsMywwLDMsMywwLDQsMCwyLDAsMyw1LDUsNSw1LDQsMCw0LDEsMCwzLDQpLAooMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyKSwKKDAsNCwwLDUsMCw1LDAsNCwwLDQsNSw0LDQsMyw1LDMsNSwxLDUsMyw0LDMsNCw0LDMsNCwzLDMsNCwzLDUsNCw0LDMsNSw1LDMsNSw1LDUsMyw1LDUsMyw0LDUsNSwzLDEsMywyLDAsMyw0LDAsNCwyLDAsNCwyLDEsNSwzLDIsMyw1LDAsNCwwLDIsMCw1LDQsNCw1LDQsNSwwLDQsMCwwLDQsNCksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCwzLDAsNCwwLDMsMCwzLDAsNCw1LDQsMywzLDMsMyw0LDMsNSw0LDQsMyw1LDQsNCwzLDQsMyw0LDQsNCw0LDUsMyw0LDQsMyw0LDUsNSw0LDUsNSwxLDQsNSw0LDMsMCwzLDMsMSwzLDMsMCw0LDQsMCwzLDMsMSw1LDMsMywzLDUsMCw0LDAsMywwLDQsNCwzLDQsMywzLDAsNCwxLDEsMyw0KSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDQsMCwzLDAsMywwLDQsMCwzLDQsNCwzLDIsMiwxLDIsMSwzLDEsMywzLDMsMywzLDQsMywxLDMsMyw1LDMsMywwLDQsMywwLDUsNCwzLDMsNSw0LDQsMyw0LDQsNSwwLDEsMiwwLDEsMiwwLDIsMiwwLDEsMCwwLDUsMiwyLDEsNCwwLDMsMCwxLDAsNCw0LDMsNSw0LDMsMCwyLDEsMCw0LDMpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsMywwLDUsMCw0LDAsMiwxLDQsNCwyLDQsMSw0LDIsNCwyLDQsMywzLDMsNCwzLDMsMywzLDEsNCwyLDMsMywzLDEsNCw0LDEsMSwxLDQsMywzLDIsMCwyLDQsMywyLDAsMywzLDAsMywxLDEsMCwwLDAsMywzLDAsNCwyLDIsMyw0LDAsNCwwLDMsMCw0LDQsNSwzLDQsNCwwLDMsMCwwLDEsNCksCigxLDQsMCw0LDAsNCwwLDQsMCwzLDUsNCw0LDMsNCwzLDUsNCwzLDMsNCwzLDUsNCw0LDQsNCwzLDQsMiw0LDMsMywxLDUsNCwzLDIsNCw1LDQsNSw1LDQsNCw1LDQsNCwwLDMsMiwyLDMsMywwLDQsMywxLDMsMiwxLDQsMywzLDQsNSwwLDMsMCwyLDAsNCw1LDUsNCw1LDQsMCw0LDAsMCw1LDQpLAooMCw1LDAsNSwwLDQsMCwzLDAsNCw0LDMsNCwzLDMsMyw0LDAsNCw0LDQsMyw0LDMsNCwzLDMsMSw0LDIsNCwzLDQsMCw1LDQsMSw0LDUsNCw0LDUsMywyLDQsMyw0LDMsMiw0LDEsMywzLDMsMiwzLDIsMCw0LDMsMyw0LDMsMywzLDQsMCw0LDAsMywwLDQsNSw0LDQsNCwzLDAsNCwxLDAsMSwzKSwKKDAsMywxLDQsMCwzLDAsMiwwLDMsNCw0LDMsMSw0LDIsMywzLDQsMyw0LDMsNCwzLDQsNCwzLDIsMywxLDUsNCw0LDEsNCw0LDMsNSw0LDQsMyw1LDUsNCwzLDQsNCwzLDEsMiwzLDEsMiwyLDAsMywyLDAsMywxLDAsNSwzLDMsMyw0LDMsMywzLDMsNCw0LDQsNCw1LDQsMiwwLDMsMywyLDQsMyksCigwLDIsMCwzLDAsMSwwLDEsMCwwLDMsMiwwLDAsMiwwLDEsMCwyLDEsMywzLDMsMSwyLDMsMSwwLDEsMCw0LDIsMSwxLDMsMywwLDQsMywzLDEsNCwzLDMsMCwzLDMsMiwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDQsMSwwLDIsMywyLDIsMiwxLDMsMywzLDQsNCwzLDIsMCwzLDEsMCwzLDMpLAooMCw0LDAsNCwwLDMsMCwzLDAsNCw0LDQsMywzLDMsMywzLDMsNCwzLDQsMiw0LDMsNCwzLDMsMiw0LDMsNCw1LDQsMSw0LDUsMyw1LDQsNSwzLDUsNCwwLDMsNSw1LDMsMSwzLDMsMiwyLDMsMCwzLDQsMSwzLDMsMiw0LDMsMywzLDQsMCw0LDAsMywwLDQsNSw0LDQsNSwzLDAsNCwxLDAsMyw0KSwKKDAsMiwwLDMsMCwzLDAsMCwwLDIsMiwyLDEsMCwxLDAsMCwwLDMsMCwzLDAsMywwLDEsMywxLDAsMywxLDMsMywzLDEsMywzLDMsMCwxLDMsMSwzLDQsMCwwLDMsMSwxLDAsMywyLDAsMCwwLDAsMSwzLDAsMSwwLDAsMywzLDIsMCwzLDAsMCwwLDAsMCwzLDQsMyw0LDMsMywwLDMsMCwwLDIsMyksCigyLDMsMCwzLDAsMiwwLDEsMCwzLDMsNCwzLDEsMywxLDEsMSwzLDEsNCwzLDQsMywzLDMsMCwwLDMsMSw1LDQsMywxLDQsMywyLDUsNSw0LDQsNCw0LDMsMyw0LDQsNCwwLDIsMSwxLDMsMiwwLDEsMiwwLDAsMSwwLDQsMSwzLDMsMywwLDMsMCwxLDAsNCw0LDQsNSw1LDMsMCwyLDAsMCw0LDQpLAooMCwyLDAsMSwwLDMsMSwzLDAsMiwzLDMsMywwLDMsMSwwLDAsMywwLDMsMiwzLDEsMywyLDEsMSwwLDAsNCwyLDEsMCwyLDMsMSw0LDMsMiwwLDQsNCwzLDEsMywxLDMsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCw0LDEsMSwxLDIsMCwzLDAsMCwwLDMsNCwyLDQsMywyLDAsMSwwLDAsMywzKSwKKDAsMSwwLDQsMCw1LDAsNCwwLDIsNCw0LDIsMywzLDIsMywzLDUsMywzLDMsNCwzLDQsMiwzLDAsNCwzLDMsMyw0LDEsNCwzLDIsMSw1LDUsMyw0LDUsMSwzLDUsNCwyLDAsMywzLDAsMSwzLDAsNCwyLDAsMSwzLDEsNCwzLDMsMywzLDAsMywwLDEsMCwzLDQsNCw0LDUsNSwwLDMsMCwxLDQsNSksCigwLDIsMCwzLDAsMywwLDAsMCwyLDMsMSwzLDAsNCwwLDEsMSwzLDAsMyw0LDMsMiwzLDEsMCwzLDMsMiwzLDEsMywwLDIsMywwLDIsMSw0LDEsMiwyLDAsMCwzLDMsMCwwLDIsMCwwLDAsMSwwLDAsMCwwLDIsMiwwLDMsMiwxLDMsMywwLDIsMCwyLDAsMCwzLDMsMSwyLDQsMCwzLDAsMiwyLDMpLAooMiw0LDAsNSwwLDQsMCw0LDAsMiw0LDQsNCwzLDQsMywzLDMsMSwyLDQsMyw0LDMsNCw0LDUsMCwzLDMsMywzLDIsMCw0LDMsMSw0LDMsNCwxLDQsNCwzLDMsNCw0LDMsMSwyLDMsMCw0LDIsMCw0LDEsMCwzLDMsMCw0LDMsMywzLDQsMCw0LDAsMiwwLDMsNSwzLDQsNSwyLDAsMywwLDAsNCw1KSwKKDAsMywwLDQsMCwxLDAsMSwwLDEsMywyLDIsMSwzLDAsMywwLDIsMCwyLDAsMywwLDIsMCwwLDAsMSwwLDEsMSwwLDAsMywxLDAsMCwwLDQsMCwzLDEsMCwyLDEsMywwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsNCwyLDIsMywxLDAsMywwLDAsMCwxLDQsNCw0LDMsMCwwLDQsMCwwLDEsNCksCigxLDQsMSw1LDAsMywwLDMsMCw0LDUsNCw0LDMsNSwzLDMsNCw0LDMsNCwxLDMsMywzLDMsMiwxLDQsMSw1LDQsMywxLDQsNCwzLDUsNCw0LDMsNSw0LDMsMyw0LDQsNCwwLDMsMywxLDIsMywwLDMsMSwwLDMsMywwLDUsNCw0LDQsNCw0LDQsMywzLDUsNCw0LDMsMyw1LDQsMCwzLDIsMCw0LDQpLAooMCwyLDAsMywwLDEsMCwwLDAsMSwzLDMsMywyLDQsMSwzLDAsMywxLDMsMCwyLDIsMSwxLDAsMCwyLDAsNCwzLDEsMCw0LDMsMCw0LDQsNCwxLDQsMywxLDEsMywzLDEsMCwyLDAsMCwxLDMsMCwwLDAsMCwyLDAsMCw0LDMsMiw0LDMsNSw0LDMsMywzLDQsMywzLDQsMywzLDAsMiwxLDAsMywzKSwKKDAsMiwwLDQsMCwzLDAsMiwwLDIsNSw1LDMsNCw0LDQsNCwxLDQsMywzLDAsNCwzLDQsMywxLDMsMywyLDQsMywwLDMsNCwzLDAsMyw0LDQsMiw0LDQsMCw0LDUsMywzLDIsMiwxLDEsMSwyLDAsMSw1LDAsMywzLDIsNCwzLDMsMyw0LDAsMywwLDIsMCw0LDQsMyw1LDUsMCwwLDMsMCwyLDMsMyksCigwLDMsMCw0LDAsMywwLDEsMCwzLDQsMywzLDEsMywzLDMsMCwzLDEsMywwLDQsMywzLDEsMSwwLDMsMCwzLDMsMCwwLDQsNCwwLDEsNSw0LDMsMyw1LDAsMywzLDQsMywwLDIsMCwxLDEsMSwwLDEsMywwLDEsMiwxLDMsMywyLDMsMywwLDMsMCwxLDAsMSwzLDMsNCw0LDEsMCwxLDIsMiwxLDMpLAooMCwxLDAsNCwwLDQsMCwzLDAsMSwzLDMsMywyLDMsMSwxLDAsMywwLDMsMyw0LDMsMiw0LDIsMCwxLDAsNCwzLDIsMCw0LDMsMCw1LDMsMywyLDQsNCw0LDMsMywzLDQsMCwxLDMsMCwwLDEsMCwwLDEsMCwwLDAsMCw0LDIsMywzLDMsMCwzLDAsMCwwLDQsNCw0LDUsMywyLDAsMywzLDAsMyw1KSwKKDAsMiwwLDMsMCwwLDAsMywwLDEsMywwLDIsMCwwLDAsMSwwLDMsMSwxLDMsMywwLDAsMywwLDAsMywwLDIsMywxLDAsMywxLDAsMywzLDIsMCw0LDIsMiwwLDIsMCwwLDAsNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwxLDIsMCwxLDAsMSwwLDAsMCwxLDMsMSwyLDAsMCwwLDEsMCwwLDEsNCksCigwLDMsMCwzLDAsNSwwLDEsMCwyLDQsMywxLDMsMywyLDEsMSw1LDIsMSwwLDUsMSwyLDAsMCwwLDMsMywyLDIsMywyLDQsMywwLDAsMywzLDEsMywzLDAsMiw1LDMsNCwwLDMsMywwLDEsMiwwLDIsMiwwLDMsMiwwLDIsMiwzLDMsMywwLDIsMCwxLDAsMyw0LDQsMiw1LDQsMCwzLDAsMCwzLDUpLAooMCwzLDAsMywwLDMsMCwxLDAsMywzLDMsMywwLDMsMCwyLDAsMiwxLDEsMCwyLDAsMSwwLDAsMCwyLDEsMCwwLDEsMCwzLDIsMCwwLDMsMywxLDIsMywxLDAsMywzLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDMsMSwyLDMsMCwzLDAsMSwwLDMsMiwxLDAsNCwzLDAsMSwxLDAsMywzKSwKKDAsNCwwLDUsMCwzLDAsMywwLDQsNSw1LDQsMyw1LDMsNCwzLDUsMywzLDIsNSwzLDQsNCw0LDMsNCwzLDQsNSw1LDMsNCw0LDMsNCw0LDUsNCw0LDQsMyw0LDUsNSw0LDIsMyw0LDIsMyw0LDAsMywzLDEsNCwzLDIsNCwzLDMsNSw1LDAsMywwLDMsMCw1LDUsNSw1LDQsNCwwLDQsMCwxLDQsNCksCigwLDQsMCw0LDAsMywwLDMsMCwzLDUsNCw0LDIsMywyLDUsMSwzLDIsNSwxLDQsMiwzLDIsMywzLDQsMywzLDMsMywyLDUsNCwxLDMsMyw1LDMsNCw0LDAsNCw0LDMsMSwxLDMsMSwwLDIsMywwLDIsMywwLDMsMCwwLDQsMywxLDMsNCwwLDMsMCwyLDAsNCw0LDQsMyw0LDUsMCw0LDAsMCwzLDQpLAooMCwzLDAsMywwLDMsMSwyLDAsMyw0LDQsMywzLDMsMCwyLDIsNCwzLDMsMSwzLDMsMywxLDEsMCwzLDEsNCwzLDIsMyw0LDQsMiw0LDQsNCwzLDQsNCwzLDIsNCw0LDMsMSwzLDMsMSwzLDMsMCw0LDEsMCwyLDIsMSw0LDMsMiwzLDMsNSw0LDMsMyw1LDQsNCwzLDMsMCw0LDAsMywyLDIsNCw0KSwKKDAsMiwwLDEsMCwwLDAsMCwwLDEsMiwxLDMsMCwwLDAsMCwwLDIsMCwxLDIsMSwwLDAsMSwwLDAsMCwwLDMsMCwwLDEsMCwxLDEsMywxLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwxLDIsMiwwLDMsNCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDEsMSksCigwLDEsMCwwLDAsMSwwLDAsMCwwLDQsMCw0LDEsNCwwLDMsMCw0LDAsMywwLDQsMCwzLDAsMywwLDQsMSw1LDEsNCwwLDAsMywwLDUsMCw1LDIsMCwxLDAsMCwwLDIsMSw0LDAsMSwzLDAsMCwzLDAsMCwzLDEsMSw0LDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDApLAooMSw0LDAsNSwwLDMsMCwyLDAsMyw1LDQsNCwzLDQsMyw1LDMsNCwzLDMsMCw0LDMsMywzLDMsMywzLDIsNCw0LDMsMSwzLDQsNCw1LDQsNCwzLDQsNCwxLDMsNSw0LDMsMywzLDEsMiwyLDMsMywxLDMsMSwzLDMsMyw1LDMsMyw0LDUsMCwzLDAsMywwLDMsNCwzLDQsNCwzLDAsMywwLDIsNCwzKSwKKDAsMSwwLDQsMCwwLDAsMCwwLDEsNCwwLDQsMSw0LDIsNCwwLDMsMCwxLDAsMSwwLDAsMCwwLDAsMiwwLDMsMSwxLDEsMCwzLDAsMCwwLDEsMiwxLDAsMCwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwzLDAsMCwwLDAsMywyLDAsMiwyLDAsMSwwLDAsMCwyLDMsMiwzLDMsMCwwLDAsMCwyLDEsMCksCigwLDUsMSw1LDAsMywwLDMsMCw1LDQsNCw1LDEsNSwzLDMsMCw0LDMsNCwzLDUsMyw0LDMsMywyLDQsMyw0LDMsMywwLDMsMywxLDQsNCwzLDQsNCw0LDMsNCw1LDUsMywyLDMsMSwxLDMsMywxLDMsMSwxLDMsMywyLDQsNSwzLDMsNSwwLDQsMCwzLDAsNCw0LDMsNSwzLDMsMCwzLDQsMCw0LDMpLAooMCw1LDAsNSwwLDMsMCwyLDAsNCw0LDMsNSwyLDQsMywzLDMsNCw0LDQsMyw1LDMsNSwzLDMsMSw0LDAsNCwzLDMsMCwzLDMsMCw0LDQsNCw0LDUsNCwzLDMsNSw1LDMsMiwzLDEsMiwzLDIsMCwxLDAsMCwzLDIsMiw0LDQsMywxLDUsMCw0LDAsMywwLDQsMywxLDMsMiwxLDAsMywzLDAsMywzKSwKKDAsNCwwLDUsMCw1LDAsNCwwLDQsNSw1LDUsMyw0LDMsMywyLDUsNCw0LDMsNSwzLDUsMyw0LDAsNCwzLDQsNCwzLDIsNCw0LDMsNCw1LDQsNCw1LDUsMCwzLDUsNSw0LDEsMywzLDIsMywzLDEsMywxLDAsNCwzLDEsNCw0LDMsNCw1LDAsNCwwLDIsMCw0LDMsNCw0LDMsMywwLDQsMCwwLDUsNSksCigwLDQsMCw0LDAsNSwwLDEsMSwzLDMsNCw0LDMsNCwxLDMsMCw1LDEsMywwLDMsMSwzLDEsMSwwLDMsMCwzLDMsNCwwLDQsMywwLDQsNCw0LDMsNCw0LDAsMyw1LDQsMSwwLDMsMCwwLDIsMywwLDMsMSwwLDMsMSwwLDMsMiwxLDMsNSwwLDMsMCwxLDAsMywyLDMsMyw0LDQsMCwyLDIsMCw0LDQpLAooMiw0LDAsNSwwLDQsMCwzLDAsNCw1LDUsNCwzLDUsMyw1LDMsNSwzLDUsMiw1LDMsNCwzLDMsNCwzLDQsNSwzLDIsMSw1LDQsMywyLDMsNCw1LDMsNCwxLDIsNSw0LDMsMCwzLDMsMCwzLDIsMCwyLDMsMCw0LDEsMCwzLDQsMywzLDUsMCwzLDAsMSwwLDQsNSw1LDUsNCwzLDAsNCwyLDAsMyw1KSwKKDAsNSwwLDQsMCw0LDAsMiwwLDUsNCwzLDQsMyw0LDMsMywzLDQsMyw0LDIsNSwzLDUsMyw0LDEsNCwzLDQsNCw0LDAsMyw1LDAsNCw0LDQsNCw1LDMsMSwzLDQsNSwzLDMsMywzLDMsMywzLDAsMiwyLDAsMywzLDIsNCwzLDMsMyw1LDMsNCwxLDMsMyw1LDMsMiwwLDAsMCwwLDQsMywxLDMsMyksCigwLDEsMCwzLDAsMywwLDEsMCwxLDMsMywzLDIsMywzLDMsMCwzLDAsMCwwLDMsMSwzLDAsMCwwLDIsMiwyLDMsMCwwLDMsMiwwLDEsMiw0LDEsMywzLDAsMCwzLDMsMywwLDEsMCwwLDIsMSwwLDAsMywwLDMsMSwwLDMsMCwwLDEsMywwLDIsMCwxLDAsMywzLDEsMywzLDAsMCwxLDEsMCwzLDMpLAooMCwyLDAsMywwLDIsMSw0LDAsMiwyLDMsMSwxLDMsMSwxLDAsMiwwLDMsMSwyLDMsMSwzLDAsMCwxLDAsNCwzLDIsMywzLDMsMSw0LDIsMywzLDMsMywxLDAsMywxLDQsMCwxLDEsMCwxLDIsMCwxLDEsMCwxLDEsMCwzLDEsMywyLDIsMCwxLDAsMCwwLDIsMywzLDMsMSwwLDAsMCwwLDAsMiwzKSwKKDAsNSwwLDQsMCw1LDAsMiwwLDQsNSw1LDMsMyw0LDMsMywxLDUsNCw0LDIsNCw0LDQsMyw0LDIsNCwzLDUsNSw0LDMsMyw0LDMsMyw1LDUsNCw1LDUsMSwzLDQsNSwzLDEsNCwzLDEsMywzLDAsMywzLDEsNCwzLDEsNCw1LDMsMyw1LDAsNCwwLDMsMCw1LDMsMywxLDQsMywwLDQsMCwxLDUsMyksCigwLDUsMCw1LDAsNCwwLDIsMCw0LDQsMyw0LDMsMywzLDMsMyw1LDQsNCw0LDQsNCw0LDUsMywzLDUsMiw0LDQsNCwzLDQsNCwzLDMsNCw0LDUsNSwzLDMsNCwzLDQsMywzLDQsMywzLDMsMywxLDIsMiwxLDQsMywzLDUsNCw0LDMsNCwwLDQsMCwzLDAsNCw0LDQsNCw0LDEsMCw0LDIsMCwyLDQpLAooMCw0LDAsNCwwLDMsMCwxLDAsMyw1LDIsMywwLDMsMCwyLDEsNCwyLDMsMyw0LDEsNCwzLDMsMiw0LDEsMywzLDMsMCwzLDMsMCwwLDMsMywzLDUsMywzLDMsMywzLDIsMCwyLDAsMCwyLDAsMCwyLDAsMCwxLDAsMCwzLDEsMiwyLDMsMCwzLDAsMiwwLDQsNCwzLDMsNCwxLDAsMywwLDAsMiw0KSwKKDAsMCwwLDQsMCwwLDAsMCwwLDAsMSwwLDEsMCwyLDAsMCwwLDAsMCwxLDAsMiwwLDEsMCwwLDAsMCwwLDMsMSwzLDAsMywyLDAsMCwwLDEsMCwzLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsNCwwLDIsMCwwLDAsMCwwLDAsMiksCigwLDIsMSwzLDAsMiwwLDIsMCwzLDMsMywzLDEsMywxLDMsMywzLDMsMywzLDQsMiwyLDEsMiwxLDQsMCw0LDMsMSwzLDMsMywyLDQsMyw1LDQsMywzLDMsMywzLDMsMywwLDEsMywwLDIsMCwwLDEsMCwwLDEsMCwwLDQsMiwwLDIsMywwLDMsMywwLDMsMyw0LDIsMywxLDQsMCwxLDIsMCwyLDMpLAooMCwzLDAsMywwLDEsMCwzLDAsMiwzLDMsMywwLDMsMSwyLDAsMywzLDIsMywzLDIsMywyLDMsMSwzLDAsNCwzLDIsMCwzLDMsMSw0LDMsMywyLDMsNCwzLDEsMywzLDEsMSwwLDEsMSwwLDEsMCwxLDAsMSwwLDAsMCw0LDEsMSwwLDMsMCwzLDEsMCwyLDMsMywzLDMsMywxLDAsMCwyLDAsMywzKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDIsMCwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDMsMCwzLDAsMywxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMiwwLDIsMywwLDAsMCwwLDAsMCwwLDAsMyksCigwLDIsMCwzLDEsMywwLDMsMCwyLDMsMywzLDEsMywxLDMsMSwzLDEsMywzLDMsMSwzLDAsMiwzLDEsMSw0LDMsMywyLDMsMywxLDIsMiw0LDEsMywzLDAsMSw0LDIsMywwLDEsMywwLDMsMCwwLDEsMywwLDIsMCwwLDMsMywyLDEsMywwLDMsMCwyLDAsMyw0LDQsNCwzLDEsMCwzLDAsMCwzLDMpLAooMCwyLDAsMSwwLDIsMCwwLDAsMSwzLDIsMiwxLDMsMCwxLDEsMywwLDMsMiwzLDEsMiwwLDIsMCwxLDEsMywzLDMsMCwzLDMsMSwxLDIsMywyLDMsMywxLDIsMywyLDAsMCwxLDAsMCwwLDAsMCwwLDMsMCwxLDAsMCwyLDEsMiwxLDMsMCwzLDAsMCwwLDMsNCw0LDQsMywyLDAsMiwwLDAsMiw0KSwKKDAsMCwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMywxLDAsMCwwLDAsMCwwLDAsMyksCigwLDMsMCwzLDAsMiwwLDMsMCwzLDMsMywyLDMsMiwyLDIsMCwzLDEsMywzLDMsMiwzLDMsMCwwLDMsMCwzLDIsMiwwLDIsMywxLDQsMyw0LDMsMywyLDMsMSw1LDQsNCwwLDMsMSwyLDEsMywwLDMsMSwxLDIsMCwyLDMsMSwzLDEsMywwLDMsMCwxLDAsMywzLDQsNCwyLDEsMCwyLDEsMCwyLDQpLAooMCwxLDAsMywwLDEsMCwyLDAsMSw0LDIsNSwxLDQsMCwyLDAsMiwxLDMsMSw0LDAsMiwxLDAsMCwyLDEsNCwxLDEsMCwzLDMsMCw1LDEsMywyLDMsMywxLDAsMywyLDMsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCw0LDAsMSwwLDMsMCwyLDAsMSwwLDMsMywzLDQsMywzLDAsMCwwLDAsMiwzKSwKKDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMSwwLDAsMSwwLDAsMCwwLDAsMyksCigwLDEsMCwzLDAsNCwwLDMsMCwyLDQsMywxLDAsMywyLDIsMSwzLDEsMiwyLDMsMSwxLDEsMiwxLDMsMCwxLDIsMCwxLDMsMiwxLDMsMCw1LDUsMSwwLDAsMSwzLDIsMSwwLDMsMCwwLDEsMCwwLDAsMCwwLDMsNCwwLDEsMSwxLDMsMiwwLDIsMCwxLDAsMiwzLDMsMSwyLDMsMCwxLDAsMSwwLDQpLAooMCwwLDAsMSwwLDMsMCwzLDAsMiwyLDEsMCwwLDQsMCwzLDAsMywxLDMsMCwzLDAsMywwLDEsMCwzLDAsMywxLDMsMCwzLDMsMCwwLDEsMiwxLDEsMSwwLDEsMiwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDIsMSwyLDAsMCwyLDAsMCwwLDAsMiwzLDMsMywzLDAsMCwwLDAsMSw0KSwKKDAsMCwwLDMsMCwzLDAsMCwwLDAsMywxLDEsMCwzLDAsMSwwLDIsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDMsMCwyLDAsMiwzLDAsMCwyLDIsMywxLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMiwwLDAsMCwwLDIsMyksCigyLDQsMCw1LDAsNSwwLDQsMCwzLDQsMywzLDMsNCwzLDMsMyw0LDMsNCw0LDUsNCw1LDUsNSwyLDMsMCw1LDUsNCwxLDUsNCwzLDEsNSw0LDMsNCw0LDMsMyw0LDMsMywwLDMsMiwwLDIsMywwLDMsMCwwLDMsMywwLDUsMywyLDMsMywwLDMsMCwzLDAsMyw0LDUsNCw1LDMsMCw0LDMsMCwzLDQpLAooMCwzLDAsMywwLDMsMCwzLDAsMywzLDQsMywyLDMsMiwzLDAsNCwzLDMsMywzLDMsMywzLDMsMCwzLDIsNCwzLDMsMSwzLDQsMyw0LDQsNCwzLDQsNCwzLDIsNCw0LDEsMCwyLDAsMCwxLDEsMCwyLDAsMCwzLDEsMCw1LDMsMiwxLDMsMCwzLDAsMSwyLDQsMywyLDQsMywzLDAsMywyLDAsNCw0KSwKKDAsMywwLDMsMCwxLDAsMCwwLDEsNCwzLDMsMiwzLDEsMywxLDQsMiwzLDIsNCwyLDMsNCwzLDAsMiwyLDMsMywzLDAsMywzLDMsMCwzLDQsMSwzLDMsMCwzLDQsMywzLDAsMSwxLDAsMSwwLDAsMCw0LDAsMywwLDAsMywxLDIsMSwzLDAsNCwwLDEsMCw0LDMsMyw0LDMsMywwLDIsMCwwLDMsMyksCigwLDMsMCw0LDAsMSwwLDMsMCwzLDQsMywzLDAsMywzLDMsMSwzLDEsMywzLDQsMywzLDMsMCwwLDMsMSw1LDMsMywxLDMsMywyLDUsNCwzLDMsNCw1LDMsMiw1LDMsNCwwLDEsMCwwLDAsMCwwLDIsMCwwLDEsMSwwLDQsMiwyLDEsMywwLDMsMCwyLDAsNCw0LDMsNSwzLDIsMCwxLDEsMCwzLDQpLAooMCw1LDAsNCwwLDUsMCwyLDAsNCw0LDMsMywyLDMsMywzLDEsNCwzLDQsMSw1LDMsNCwzLDQsMCw0LDIsNCwzLDQsMSw1LDQsMCw0LDQsNCw0LDUsNCwxLDMsNSw0LDIsMSw0LDEsMSwzLDIsMCwzLDEsMCwzLDIsMSw0LDMsMywzLDQsMCw0LDAsMywwLDQsNCw0LDMsMywzLDAsNCwyLDAsMyw0KSwKKDEsNCwwLDQsMCwzLDAsMSwwLDMsMywzLDEsMSwzLDMsMiwyLDMsMywxLDAsMywyLDIsMSwyLDAsMywxLDIsMSwyLDAsMywyLDAsMiwyLDMsMyw0LDMsMCwzLDMsMSwyLDAsMSwxLDMsMSwyLDAsMCwzLDAsMSwxLDAsMywyLDIsMywzLDAsMywwLDAsMCwyLDMsMyw0LDMsMywwLDEsMCwwLDEsNCksCigwLDQsMCw0LDAsNCwwLDAsMCwzLDQsNCwzLDEsNCwyLDMsMiwzLDMsMywxLDQsMyw0LDAsMywwLDQsMiwzLDMsMiwyLDUsNCwyLDEsMyw0LDMsNCwzLDEsMywzLDQsMiwwLDIsMSwwLDMsMywwLDAsMiwwLDMsMSwwLDQsNCwzLDQsMywwLDQsMCwxLDAsMiw0LDQsNCw0LDQsMCwzLDIsMCwzLDMpLAooMCwwLDAsMSwwLDQsMCwwLDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwzLDIsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwyKSwKKDAsMiwwLDMsMCw0LDAsNCwwLDEsMywzLDMsMCw0LDAsMiwxLDIsMSwxLDEsMiwwLDMsMSwxLDAsMSwwLDMsMSwwLDAsMywzLDIsMCwxLDEsMCwwLDAsMCwwLDEsMCwyLDAsMiwyLDAsMywxLDAsMCwxLDAsMSwxLDAsMSwyLDAsMywwLDAsMCwwLDEsMCwwLDMsMyw0LDMsMSwwLDEsMCwzLDAsMiksCigwLDAsMCwzLDAsNSwwLDAsMCwwLDEsMCwyLDAsMywxLDAsMSwzLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDQsMCwwLDAsMiwzLDAsMSw0LDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDMsMCwwLDAsMCwwLDMpLAooMCwyLDAsNSwwLDUsMCwxLDAsMiw0LDMsMywyLDUsMSwzLDIsMywzLDMsMCw0LDEsMiwwLDMsMCw0LDAsMiwyLDEsMSw1LDMsMCwwLDEsNCwyLDMsMiwwLDMsMywzLDIsMCwyLDQsMSwxLDIsMCwxLDEsMCwzLDEsMCwxLDMsMSwyLDMsMCwyLDAsMCwwLDEsMyw1LDQsNCw0LDAsMywwLDAsMSwzKSwKKDAsNCwwLDUsMCw0LDAsNCwwLDQsNSw0LDMsMyw0LDMsMywzLDQsMyw0LDQsNSwzLDQsNSw0LDIsNCwyLDMsNCwzLDEsNCw0LDEsMyw1LDQsNCw1LDUsNCw0LDUsNSw1LDIsMywzLDEsNCwzLDEsMywzLDAsMywzLDEsNCwzLDQsNCw0LDAsMywwLDQsMCwzLDMsNCw0LDUsMCwwLDQsMywwLDQsNSksCigwLDQsMCw0LDAsMywwLDMsMCwzLDQsNCw0LDMsMywyLDQsMyw0LDMsNCwzLDUsMyw0LDMsMiwxLDQsMiw0LDQsMywxLDMsNCwyLDQsNSw1LDMsNCw1LDQsMSw1LDQsMywwLDMsMiwyLDMsMiwxLDMsMSwwLDMsMywzLDUsMywzLDMsNSw0LDQsMiwzLDMsNCwzLDMsMywyLDEsMCwzLDIsMSw0LDMpLAooMCw0LDAsNSwwLDQsMCwzLDAsMyw1LDUsMywyLDQsMyw0LDAsNSw0LDQsMSw0LDQsNCwzLDMsMyw0LDMsNSw1LDIsMywzLDQsMSwyLDUsNSwzLDUsNSwyLDMsNSw1LDQsMCwzLDIsMCwzLDMsMSwxLDUsMSw0LDEsMCw0LDMsMiwzLDUsMCw0LDAsMywwLDUsNCwzLDQsMywwLDAsNCwxLDAsNCw0KSwKKDEsMywwLDQsMCwyLDAsMiwwLDIsNSw1LDMsMywzLDMsMywwLDQsMiwzLDQsNCw0LDMsNCwwLDAsMyw0LDUsNCwzLDMsMywzLDIsNSw1LDQsNSw1LDUsNCwzLDUsNSw1LDEsMywxLDAsMSwwLDAsMywyLDAsNCwyLDAsNSwyLDMsMiw0LDEsMywwLDMsMCw0LDUsNCw1LDQsMywwLDQsMiwwLDUsNCksCigwLDMsMCw0LDAsNSwwLDMsMCwzLDQsNCwzLDIsMywyLDMsMywzLDMsMywyLDQsMywzLDIsMiwwLDMsMywzLDMsMywxLDMsMywzLDAsNCw0LDMsNCw0LDEsMSw0LDQsMiwwLDMsMSwwLDEsMSwwLDQsMSwwLDIsMywxLDMsMywxLDMsNCwwLDMsMCwxLDAsMywxLDMsMCwwLDEsMCwyLDAsMCw0LDQpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsMywwLDMsMCwyLDAsMywwLDEsNSw0LDMsMywzLDEsNCwyLDEsMiwzLDQsNCwyLDQsNCw1LDAsMywxLDQsMyw0LDAsNCwzLDMsMywyLDMsMiw1LDMsNCwzLDIsMiwzLDAsMCwzLDAsMiwxLDAsMSwyLDAsMCwwLDAsMiwxLDEsMywxLDAsMiwwLDQsMCwzLDQsNCw0LDUsMiwwLDIsMCwwLDEsMyksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwxLDEsMCwwLDEsMSwwLDAsMCw0LDIsMSwxLDAsMSwwLDMsMiwwLDAsMywxLDEsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwxLDAsMCwwLDIsMCwwLDAsMSw0LDAsNCwyLDEsMCwwLDAsMCwwLDEpLAooMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMywxLDAsMCwwLDIsMCwyLDEsMCwwLDEsMiwxLDAsMSwxLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDMsMSwwLDAsMCwwLDAsMSwwLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwyKSwKKDAsNCwwLDQsMCw0LDAsMywwLDQsNCwzLDQsMiw0LDMsMiwwLDQsNCw0LDMsNSwzLDUsMywzLDIsNCwyLDQsMyw0LDMsMSw0LDAsMiwzLDQsNCw0LDMsMywzLDQsNCw0LDMsNCwxLDMsNCwzLDIsMSwyLDEsMywzLDMsNCw0LDMsMyw1LDAsNCwwLDMsMCw0LDMsMywzLDIsMSwwLDMsMCwwLDMsMyksCigwLDQsMCwzLDAsMywwLDMsMCwzLDUsNSwzLDMsMywzLDQsMyw0LDMsMywzLDQsNCw0LDMsMywzLDMsNCwzLDUsMywzLDEsMywyLDQsNSw1LDUsNSw0LDMsNCw1LDUsMywyLDIsMywzLDMsMywyLDMsMywxLDIsMywyLDQsMywzLDMsNCwwLDQsMCwyLDAsNCwzLDIsMiwxLDIsMCwzLDAsMCw0LDEpLAopCgpjbGFzcyBKYXBhbmVzZUNvbnRleHRBbmFseXNpcyhvYmplY3QpOgogICAgTlVNX09GX0NBVEVHT1JZID0gNgogICAgRE9OVF9LTk9XID0gLTEKICAgIEVOT1VHSF9SRUxfVEhSRVNIT0xEID0gMTAwCiAgICBNQVhfUkVMX1RIUkVTSE9MRCA9IDEwMDAKICAgIE1JTklNVU1fREFUQV9USFJFU0hPTEQgPSA0CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX3RvdGFsX3JlbCA9IE5vbmUKICAgICAgICBzZWxmLl9yZWxfc2FtcGxlID0gTm9uZQogICAgICAgIHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bSA9IE5vbmUKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfb3JkZXIgPSBOb25lCiAgICAgICAgc2VsZi5fZG9uZSA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fdG90YWxfcmVsID0gMCAgIyB0b3RhbCBzZXF1ZW5jZSByZWNlaXZlZAogICAgICAgICMgY2F0ZWdvcnkgY291bnRlcnMsIGVhY2ggaW50ZWdlciBjb3VudHMgc2VxdWVuY2UgaW4gaXRzIGNhdGVnb3J5CiAgICAgICAgc2VsZi5fcmVsX3NhbXBsZSA9IFswXSAqIHNlbGYuTlVNX09GX0NBVEVHT1JZCiAgICAgICAgIyBpZiBsYXN0IGJ5dGUgaW4gY3VycmVudCBidWZmZXIgaXMgbm90IHRoZSBsYXN0IGJ5dGUgb2YgYSBjaGFyYWN0ZXIsCiAgICAgICAgIyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCBpbiBuZXh0IGJ1ZmZlcgogICAgICAgIHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bSA9IDAKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfb3JkZXIgPSAtMSAgIyBUaGUgb3JkZXIgb2YgcHJldmlvdXMgY2hhcgogICAgICAgICMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBUcnVlLCBkZXRlY3Rpb24gaXMgZG9uZSBhbmQgY29uY2x1c2lvbiBoYXMKICAgICAgICAjIGJlZW4gbWFkZQogICAgICAgIHNlbGYuX2RvbmUgPSBGYWxzZQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyLCBudW1fYnl0ZXMpOgogICAgICAgIGlmIHNlbGYuX2RvbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFRoZSBidWZmZXIgd2UgZ290IGlzIGJ5dGUgb3JpZW50ZWQsIGFuZCBhIGNoYXJhY3RlciBtYXkgc3BhbiBpbiBtb3JlIHRoYW4gb25lCiAgICAgICAgIyBidWZmZXJzLiBJbiBjYXNlIHRoZSBsYXN0IG9uZSBvciB0d28gYnl0ZSBpbiBsYXN0IGJ1ZmZlciBpcyBub3QKICAgICAgICAjIGNvbXBsZXRlLCB3ZSByZWNvcmQgaG93IG1hbnkgYnl0ZSBuZWVkZWQgdG8gY29tcGxldGUgdGhhdCBjaGFyYWN0ZXIKICAgICAgICAjIGFuZCBza2lwIHRoZXNlIGJ5dGVzIGhlcmUuICBXZSBjYW4gY2hvb3NlIHRvIHJlY29yZCB0aG9zZSBieXRlcyBhcwogICAgICAgICMgd2VsbCBhbmQgYW5hbHlzZSB0aGUgY2hhcmFjdGVyIG9uY2UgaXQgaXMgY29tcGxldGUsIGJ1dCBzaW5jZSBhCiAgICAgICAgIyBjaGFyYWN0ZXIgd2lsbCBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UsIGJ5IHNpbXBseSBza2lwcGluZwogICAgICAgICMgdGhpcyBjaGFyYWN0ZXIgd2lsbCBzaW1wbHkgb3VyIGxvZ2ljIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLgogICAgICAgIGkgPSBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0KICAgICAgICB3aGlsZSBpIDwgbnVtX2J5dGVzOgogICAgICAgICAgICBvcmRlciwgY2hhcl9sZW4gPSBzZWxmLmdldF9vcmRlcihieXRlX3N0cltpOmkgKyAyXSkKICAgICAgICAgICAgaSArPSBjaGFyX2xlbgogICAgICAgICAgICBpZiBpID4gbnVtX2J5dGVzOgogICAgICAgICAgICAgICAgc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtID0gaSAtIG51bV9ieXRlcwogICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gLTEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIChvcmRlciAhPSAtMSkgYW5kIChzZWxmLl9sYXN0X2NoYXJfb3JkZXIgIT0gLTEpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvdGFsX3JlbCArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fdG90YWxfcmVsID4gc2VsZi5NQVhfUkVMX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWxfc2FtcGxlW2pwMkNoYXJDb250ZXh0W3NlbGYuX2xhc3RfY2hhcl9vcmRlcl1bb3JkZXJdXSArPSAxCiAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJfb3JkZXIgPSBvcmRlcgoKICAgIGRlZiBnb3RfZW5vdWdoX2RhdGEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RvdGFsX3JlbCA+IHNlbGYuRU5PVUdIX1JFTF9USFJFU0hPTEQKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgIyBUaGlzIGlzIGp1c3Qgb25lIHdheSB0byBjYWxjdWxhdGUgY29uZmlkZW5jZS4gSXQgd29ya3Mgd2VsbCBmb3IgbWUuCiAgICAgICAgaWYgc2VsZi5fdG90YWxfcmVsID4gc2VsZi5NSU5JTVVNX0RBVEFfVEhSRVNIT0xEOgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX3RvdGFsX3JlbCAtIHNlbGYuX3JlbF9zYW1wbGVbMF0pIC8gc2VsZi5fdG90YWxfcmVsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuRE9OVF9LTk9XCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgcmV0dXJuIC0xLCAxCgpjbGFzcyBTSklTQ29udGV4dEFuYWx5c2lzKEphcGFuZXNlQ29udGV4dEFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTSklTQ29udGV4dEFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcnNldF9uYW1lID0gIlNISUZUX0pJUyIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NoYXJzZXRfbmFtZQoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGlmIG5vdCBieXRlX3N0cjoKICAgICAgICAgICAgcmV0dXJuIC0xLCAxCiAgICAgICAgIyBmaW5kIG91dCBjdXJyZW50IGNoYXIncyBieXRlIGxlbmd0aAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmICgweDgxIDw9IGZpcnN0X2NoYXIgPD0gMHg5Rikgb3IgKDB4RTAgPD0gZmlyc3RfY2hhciA8PSAweEZDKToKICAgICAgICAgICAgY2hhcl9sZW4gPSAyCiAgICAgICAgICAgIGlmIChmaXJzdF9jaGFyID09IDB4ODcpIG9yICgweEZBIDw9IGZpcnN0X2NoYXIgPD0gMHhGQyk6CiAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X25hbWUgPSAiQ1A5MzIiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcl9sZW4gPSAxCgogICAgICAgICMgcmV0dXJuIGl0cyBvcmRlciBpZiBpdCBpcyBoaXJhZ2FuYQogICAgICAgIGlmIGxlbihieXRlX3N0cikgPiAxOgogICAgICAgICAgICBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzFdCiAgICAgICAgICAgIGlmIChmaXJzdF9jaGFyID09IDIwMikgYW5kICgweDlGIDw9IHNlY29uZF9jaGFyIDw9IDB4RjEpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZF9jaGFyIC0gMHg5RiwgY2hhcl9sZW4KCiAgICAgICAgcmV0dXJuIC0xLCBjaGFyX2xlbgoKY2xhc3MgRVVDSlBDb250ZXh0QW5hbHlzaXMoSmFwYW5lc2VDb250ZXh0QW5hbHlzaXMpOgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgaWYgbm90IGJ5dGVfc3RyOgogICAgICAgICAgICByZXR1cm4gLTEsIDEKICAgICAgICAjIGZpbmQgb3V0IGN1cnJlbnQgY2hhcidzIGJ5dGUgbGVuZ3RoCiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMHg4RSkgb3IgKDB4QTEgPD0gZmlyc3RfY2hhciA8PSAweEZFKToKICAgICAgICAgICAgY2hhcl9sZW4gPSAyCiAgICAgICAgZWxpZiBmaXJzdF9jaGFyID09IDB4OEY6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMQoKICAgICAgICAjIHJldHVybiBpdHMgb3JkZXIgaWYgaXQgaXMgaGlyYWdhbmEKICAgICAgICBpZiBsZW4oYnl0ZV9zdHIpID4gMToKICAgICAgICAgICAgc2Vjb25kX2NoYXIgPSBieXRlX3N0clsxXQogICAgICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAweEE0KSBhbmQgKDB4QTEgPD0gc2Vjb25kX2NoYXIgPD0gMHhGMyk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vjb25kX2NoYXIgLSAweEExLCBjaGFyX2xlbgoKICAgICAgICByZXR1cm4gLTEsIGNoYXJfbGVuCgoKUEsDBBQAAAAAAAAAIQDwaMnKJzIAACcyAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKIyB0aGlzIHRhYmxlIGlzIG1vZGlmaWVkIGJhc2Ugb24gd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwLCBzbwojIG9ubHkgbnVtYmVyIDw2NCBpcyBzdXJlIHZhbGlkCgpMYXRpbjVfQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA3NywgOTAsIDk5LDEwMCwgNzIsMTA5LDEwNywxMDEsIDc5LDE4NSwgODEsMTAyLCA3NiwgOTQsIDgyLCAgIyA0MAoxMTAsMTg2LDEwOCwgOTEsIDc0LDExOSwgODQsIDk2LDExMSwxODcsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjUsIDY5LCA3MCwgNjYsIDYzLCA2OCwxMTIsMTAzLCA5MiwxOTQsMTA0LCA5NSwgODYsIDg3LCA3MSwgICMgNjAKMTE2LDE5NSwgODUsIDkzLCA5NywxMTMsMTk2LDE5NywxOTgsMTk5LDIwMCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksICAjIDgwCjIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwgICMgOTAKIDgxLDIyNiwyMjcsMjI4LDIyOSwyMzAsMTA1LDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LCA0NSwyMzcsMjM4LCAgIyBhMAogMzEsIDMyLCAzNSwgNDMsIDM3LCA0NCwgNTUsIDQ3LCA0MCwgNTksIDMzLCA0NiwgMzgsIDM2LCA0MSwgMzAsICAjIGIwCiAzOSwgMjgsIDM0LCA1MSwgNDgsIDQ5LCA1MywgNTAsIDU0LCA1NywgNjEsMjM5LCA2NywyNDAsIDYwLCA1NiwgICMgYzAKICAxLCAxOCwgIDksIDIwLCAxMSwgIDMsIDIzLCAxNSwgIDIsIDI2LCAxMiwgMTAsIDE0LCAgNiwgIDQsIDEzLCAgIyBkMAogIDcsICA4LCAgNSwgMTksIDI5LCAyNSwgMjIsIDIxLCAyNywgMjQsIDE3LCA3NSwgNTIsMjQxLCA0MiwgMTYsICAjIGUwCiA2MiwyNDIsMjQzLDI0NCwgNTgsMjQ1LCA5OCwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwgOTEsMjUyLDI1MywgICMgZjAKKQoKd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgNzcsIDkwLCA5OSwxMDAsIDcyLDEwOSwxMDcsMTAxLCA3OSwxODUsIDgxLDEwMiwgNzYsIDk0LCA4MiwgICMgNDAKMTEwLDE4NiwxMDgsIDkxLCA3NCwxMTksIDg0LCA5NiwxMTEsMTg3LDExNSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDY1LCA2OSwgNzAsIDY2LCA2MywgNjgsMTEyLDEwMywgOTIsMTk0LDEwNCwgOTUsIDg2LCA4NywgNzEsICAjIDYwCjExNiwxOTUsIDg1LCA5MywgOTcsMTEzLDE5NiwxOTcsMTk4LDE5OSwyMDAsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywxMjAsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLCAgIyA4MAoyMjEsIDc4LCA2NCwgODMsMTIxLCA5OCwxMTcsMTA1LDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksICAjIDkwCiA4OCwyMzAsMjMxLDIzMiwyMzMsMTIyLCA4OSwxMDYsMjM0LDIzNSwyMzYsMjM3LDIzOCwgNDUsMjM5LDI0MCwgICMgYTAKIDczLCA4MCwxMTgsMTE0LDI0MSwyNDIsMjQzLDI0NCwyNDUsIDYyLCA1OCwyNDYsMjQ3LDI0OCwyNDksMjUwLCAgIyBiMAogMzEsIDMyLCAzNSwgNDMsIDM3LCA0NCwgNTUsIDQ3LCA0MCwgNTksIDMzLCA0NiwgMzgsIDM2LCA0MSwgMzAsICAjIGMwCiAzOSwgMjgsIDM0LCA1MSwgNDgsIDQ5LCA1MywgNTAsIDU0LCA1NywgNjEsMjUxLCA2NywyNTIsIDYwLCA1NiwgICMgZDAKICAxLCAxOCwgIDksIDIwLCAxMSwgIDMsIDIzLCAxNSwgIDIsIDI2LCAxMiwgMTAsIDE0LCAgNiwgIDQsIDEzLCAgIyBlMAogIDcsICA4LCAgNSwgMTksIDI5LCAyNSwgMjIsIDIxLCAyNywgMjQsIDE3LCA3NSwgNTIsMjUzLCA0MiwgMTYsICAjIGYwCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTYuOTM5MiUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczozLjA2MTglCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC4yOTkyJQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDAyMCUKQnVsZ2FyaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDIsMiwzLDIsMiwxLDIsMiwKMywxLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMywzLDMsMCwzLDEsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDIsMiwyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwzLDIsMywzLDMsMywzLDMsMywzLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMywyLDMsMywzLDMsMywzLDMsMywwLDMsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwyLDEsMywzLDMsMywyLDIsMiwxLDEsMiwwLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDIsMywyLDIsMywzLDEsMSwyLDMsMywyLDMsMywzLDMsMiwxLDIsMCwyLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywxLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMiwzLDMsMSwzLDAsMywwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywxLDMsMywyLDMsMywzLDEsMywzLDIsMywyLDIsMiwwLDAsMiwwLDIsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDIsMiwzLDMsMywxLDIsMiwzLDIsMSwxLDIsMCwyLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywyLDMsMywxLDIsMywyLDIsMiwzLDMsMywzLDMsMiwyLDMsMSwyLDAsMiwxLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywxLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMywyLDIsMiwzLDEsMiwwLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDEsMiwyLDEsMywxLDMsMiwyLDMsMCwwLDEsMCwxLDAsMSwwLDAsCjAsMCwwLDEsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDIsMiwzLDIsMiwzLDEsMiwxLDEsMSwyLDMsMSwzLDEsMiwyLDAsMSwxLDEsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywxLDMsMiwyLDMsMywxLDIsMywxLDEsMywzLDMsMywxLDIsMiwxLDEsMSwwLDIsMCwyLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDIsMiwzLDMsMywyLDIsMSwxLDIsMCwyLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywwLDEsMiwxLDMsMywyLDMsMywzLDMsMywyLDMsMiwxLDAsMywxLDIsMSwyLDEsMiwzLDIsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwxLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMSwzLDMsMiwzLDMsMiwyLDIsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMCwzLDMsMywzLDMsMiwxLDEsMiwxLDMsMywwLDMsMSwxLDEsMSwzLDIsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDIsMiwyLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMywxLDMsMywyLDMsMiwyLDIsMywwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMywyLDIsMywyLDEsMSwxLDEsMSwzLDEsMywxLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMiwzLDIsMCwzLDIsMCwzLDAsMiwwLDAsMiwxLDMsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywyLDEsMSwxLDEsMiwxLDEsMiwxLDEsMSwyLDIsMSwyLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMiwxLDMsMSwxLDIsMSwzLDIsMSwxLDAsMSwyLDMsMiwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMiwyLDEsMCwxLDAsMCwxLDAsMCwwLDIsMSwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMiwzLDIsMywzLDEsMywyLDEsMSwxLDIsMSwxLDIsMSwzLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMiwzLDMsMiwzLDIsMiwyLDMsMSwyLDIsMSwxLDIsMSwxLDIsMiwwLDEsMSwwLDEsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMSwzLDEsMCwyLDIsMSwzLDIsMSwwLDAsMiwwLDIsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMSwyLDAsMiwzLDEsMiwzLDIsMCwxLDMsMSwyLDEsMSwxLDAsMCwxLDAsMCwyLDIsMiwzLAoyLDIsMiwyLDEsMiwxLDEsMiwyLDEsMSwyLDAsMSwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDEsMSwwLDEsCjMsMywzLDMsMywyLDEsMiwyLDEsMiwwLDIsMCwxLDAsMSwyLDEsMiwxLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMiwzLDMsMSwxLDMsMSwwLDMsMiwxLDAsMCwwLDEsMiwwLDIsMCwxLDAsMCwwLDEsMCwxLDIsMSwyLDIsCjEsMSwxLDEsMSwxLDEsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMiwxLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwKMywxLDAsMSwwLDIsMywyLDIsMiwzLDIsMiwyLDIsMiwxLDAsMiwxLDIsMSwxLDEsMCwxLDIsMSwyLDIsMiwxLAoxLDEsMiwyLDIsMiwxLDIsMSwxLDAsMSwyLDEsMiwyLDIsMSwxLDEsMCwxLDEsMSwxLDIsMCwxLDAsMCwwLDAsCjIsMywyLDMsMywwLDAsMiwxLDAsMiwxLDAsMCwwLDAsMiwzLDAsMiwwLDAsMCwwLDAsMSwwLDAsMiwwLDEsMiwKMiwxLDIsMSwyLDIsMSwxLDEsMiwxLDEsMSwwLDEsMiwyLDEsMSwxLDEsMSwwLDEsMSwxLDAsMCwxLDIsMCwwLAozLDMsMiwyLDMsMCwyLDMsMSwxLDIsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsMSwwLDEsMCwxLDIsMCwyLDIsCjEsMSwxLDEsMiwxLDAsMSwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwKMiwzLDIsMywzLDAsMCwzLDAsMSwxLDAsMSwwLDAsMCwyLDIsMSwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwyLAoyLDIsMSwxLDEsMSwxLDIsMiwyLDEsMCwyLDAsMSwwLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjMsMywzLDMsMiwyLDIsMiwyLDAsMiwxLDEsMSwxLDIsMSwyLDEsMSwwLDIsMCwxLDAsMSwwLDAsMiwwLDEsMiwKMSwxLDEsMSwxLDEsMSwyLDIsMSwxLDAsMiwwLDEsMCwyLDAsMCwxLDEsMSwwLDAsMiwwLDAsMCwxLDEsMCwwLAoyLDMsMywzLDMsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDIsMCwxLDIsCjIsMiwyLDEsMSwyLDEsMSwyLDIsMiwxLDIsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwKMiwzLDMsMywzLDAsMiwyLDAsMiwxLDAsMCwwLDEsMSwxLDIsMCwyLDAsMCwwLDMsMCwwLDAsMCwyLDAsMiwyLAoxLDEsMSwyLDEsMiwxLDEsMiwyLDIsMSwyLDAsMSwxLDEsMCwxLDEsMSwxLDAsMiwxLDAsMCwwLDEsMSwwLDAsCjIsMywzLDMsMywwLDIsMSwwLDAsMiwwLDAsMCwwLDAsMSwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDEsMiwKMSwxLDEsMiwxLDEsMSwxLDIsMiwyLDAsMSwwLDEsMSwxLDAsMCwxLDEsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLAozLDMsMiwyLDMsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDIsCjEsMSwxLDEsMSwyLDEsMSwyLDIsMSwyLDIsMSwwLDEsMSwxLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwKMywxLDAsMSwwLDIsMiwyLDIsMywyLDEsMSwxLDIsMywwLDAsMSwwLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLAoxLDIsMiwxLDIsMSwyLDIsMSwxLDAsMSwyLDEsMiwyLDEsMSwxLDAsMCwxLDEsMSwyLDEsMCwxLDAsMCwwLDAsCjIsMSwwLDEsMCwzLDEsMiwyLDIsMiwxLDIsMiwxLDEsMSwwLDIsMSwyLDIsMSwxLDIsMSwxLDAsMiwxLDEsMSwKMSwyLDIsMiwyLDIsMiwyLDEsMiwwLDEsMSwwLDIsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLAoyLDEsMSwxLDEsMiwyLDIsMiwxLDIsMiwyLDEsMiwyLDEsMSwyLDEsMiwzLDIsMiwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMywyLDAsMSwyLDAsMSwyLDEsMSwwLDEsMCwxLDIsMSwyLDAsMCwwLDEsMSwwLDAsMCwxLDAsMCwyLAoxLDEsMCwwLDEsMSwwLDEsMSwxLDEsMCwyLDAsMSwxLDEsMCwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsCjIsMCwwLDAsMCwxLDIsMiwyLDIsMiwyLDIsMSwyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMiwxLDEsMSwKMSwyLDIsMiwyLDEsMSwyLDEsMiwxLDEsMSwwLDIsMSwyLDEsMSwxLDAsMiwxLDEsMSwxLDAsMSwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsCjEsMSwwLDEsMCwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMywyLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwyLAoxLDEsMSwxLDEsMSwwLDAsMiwyLDIsMiwyLDAsMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMywxLDIsMSwwLDEsMSwwLDIsMiwyLDAsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDEsMiwKMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLAoyLDIsMiwyLDIsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDIsCjEsMSwxLDEsMSwwLDAsMSwyLDEsMSwwLDEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwyLDAsMSwxLDAsMCwwLDEsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLAowLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDMsMiwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMiwKMSwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMSwwLDEsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMiwyLDIsMSwyLDEsMiwyLDEsMSwyLDEsMSwxLDAsMSwxLDEsMSwyLDAsMSwwLDEsMSwxLDEsMCwxLDEsCjEsMSwyLDEsMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwzLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMSwwLDAsMSwwLDIsMCwwLDAsMCwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwKMCwyLDAsMSwwLDAsMSwxLDIsMCwxLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwxLDEsMCwyLDEsMCwxLDEsMSwwLDAsMSwwLDIsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwyLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDEsMCwxLDEsMSwwLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMCwxLDIsMSwxLDEsMSwxLDEsMiwyLDEsMCwwLDEsMCwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwKMSwxLDIsMSwxLDEsMSwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMSwyLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMCwxLDEsMCwxLDEsMSwwLDAsMSwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAoxLDAsMSwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDAsMiwwLDAsMiwwLDEsMCwwLDEsMCwwLDEsCjEsMSwwLDAsMSwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLAoxLDEsMSwxLDEsMSwxLDIsMCwwLDAsMCwwLDAsMiwxLDAsMSwxLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDAsMSwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKKQoKTGF0aW41QnVsZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW41X0J1bGdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEJ1bGdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTY5MzkyLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS01IiwKICAnbGFuZ3VhZ2UnOiAnQnVsZ2FpcmFuJywKfQoKV2luMTI1MUJ1bGdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTFCdWxnYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBCdWxnYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk2OTM5MiwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUxIiwKICAnbGFuZ3VhZ2UnOiAnQnVsZ2FyaWFuJywKfQpQSwMEFAAAAAAAAAAhAMjxVpscRgAAHEYAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBLT0k4LVIgbGFuZ3VhZ2UgbW9kZWwKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKS09JOFJfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsICAjIDgwCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwgICMgOTAKMjIzLDIyNCwyMjUsIDY4LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LCAgIyBhMAoyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsICAjIGIwCiAyNywgIDMsIDIxLCAyOCwgMTMsICAyLCAzOSwgMTksIDI2LCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgICMgYzAKIDE1LCAxNiwgIDksICA3LCAgNiwgMTQsIDI0LCAxMCwgMTcsIDE4LCAyMCwgMjUsIDMwLCAyOSwgMjIsIDU0LCAgIyBkMAogNTksIDM3LCA0NCwgNTgsIDQxLCA0OCwgNTMsIDQ2LCA1NSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsICAjIGUwCiAzNSwgNDMsIDQ1LCAzMiwgNDAsIDUyLCA1NiwgMzMsIDYxLCA2MiwgNTEsIDU3LCA0NywgNjMsIDUwLCA3MCwgICMgZjAKKQoKd2luMTI1MV9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCjIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsIDY4LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsIDE2LAopCgpsYXRpbjVfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywgMTYsCjIzOSwgNjgsMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1NSwKKQoKbWFjQ3lyaWxsaWNfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwgNjgsIDE2LAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LDI1NSwKKQoKSUJNODU1X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LCA2OCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LAoyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywgMjcsIDU5LCA1NCwgNzAsCiAgMywgMzcsIDIxLCA0NCwgMjgsIDU4LCAxMywgNDEsICAyLCA0OCwgMzksIDUzLCAxOSwgNDYsMjE4LDIxOSwKMjIwLDIyMSwyMjIsMjIzLDIyNCwgMjYsIDU1LCAgNCwgNDIsMjI1LDIyNiwyMjcsMjI4LCAyMywgNjAsMjI5LAoyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwgMTEsIDM2LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsCiAgOCwgNDksIDEyLCAzOCwgIDUsIDMxLCAgMSwgMzQsIDE1LDI0NCwyNDUsMjQ2LDI0NywgMzUsIDE2LDI0OCwKIDQzLCAgOSwgNDUsICA3LCAzMiwgIDYsIDQwLCAxNCwgNTIsIDI0LCA1NiwgMTAsIDMzLCAxNywgNjEsMjQ5LAoyNTAsIDE4LCA2MiwgMjAsIDUxLCAyNSwgNTcsIDMwLCA0NywgMjksIDYzLCAyMiwgNTAsMjUxLDI1MiwyNTUsCikKCklCTTg2Nl9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LCAxNiwKMjM5LCA2OCwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjU1LAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk3LjY2MDElCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6IDIuMzM4OSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAgMC4xMjM3JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogICAwLjAwMDklClJ1c3NpYW5MYW5nTW9kZWwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMywzLDMsMywxLDMsMywzLDIsMywyLDMsMywKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMiwyLDIsMiwyLDAsMCwyLAozLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMiwzLDMsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwKMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsCjAsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDIsMiwyLDMsMSwzLDMsMSwzLDMsMywzLDIsMiwzLDAsMiwyLDIsMywzLDIsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDIsMiwzLDIsMywzLDMsMiwxLDIsMiwwLDEsMiwyLDIsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDMsMCwyLDIsMywzLDIsMSwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMSwyLDMsMiwyLDMsMiwzLDMsMywzLDIsMiwzLDAsMywyLDIsMywxLDEsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDIsMywzLDMsMywyLDIsMiwwLDMsMywzLDIsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywzLDIsMywyLDIsMCwxLDMsMiwxLDIsMiwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwxLDMsMCwxLDEsMSwxLDIsMSwxLDAsMiwyLDIsMSwyLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDIsMiwyLDIsMSwzLDIsMywyLDMsMiwxLDIsMiwwLDEsMSwyLDEsMiwxLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMywyLDMsMywzLDIsMiwyLDIsMCwyLDIsMiwyLDMsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMiwyLDMsMywzLDMsMywzLDMsMywzLDEsMywyLDAsMCwzLDMsMywzLDIsMywzLDMsMywyLDMsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywzLDIsMiwzLDMsMCwyLDEsMCwzLDIsMywyLDMsMCwwLDEsMiwwLDAsMSwwLDEsMiwxLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMywwLDIsMywzLDMsMywyLDMsMywzLDMsMSwyLDIsMCwwLDIsMywyLDIsMiwzLDIsMywyLDIsMywwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMCwyLDMsMiwzLDAsMSwyLDMsMywyLDAsMiwzLDAsMCwyLDMsMiwyLDAsMSwzLDEsMywyLDIsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwzLDAsMiwzLDMsMywzLDMsMywzLDMsMiwxLDMsMiwwLDAsMiwyLDMsMywzLDIsMywzLDAsMiwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDIsMywzLDIsMiwyLDMsMywwLDAsMSwxLDEsMSwxLDIsMCwwLDEsMSwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywzLDMsMCwzLDIsMywzLDIsMywyLDAsMiwxLDAsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwyLDIsMiwzLDEsMywyLDMsMSwxLDIsMSwwLDIsMiwyLDIsMSwzLDEsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMywzLDMsMywzLDEsMiwyLDEsMywxLDAsMywwLDAsMywwLDAsMCwxLDEsMCwxLDIsMSwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMSwxLDMsMywzLDIsMiwxLDIsMiwzLDEsMSwyLDAsMCwyLDIsMSwzLDAsMCwyLDEsMSwyLDEsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDMsMywzLDEsMiwyLDIsMSwyLDEsMywzLDEsMSwyLDEsMiwxLDIsMiwwLDIsMCwwLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMywyLDEsMywyLDIsMywyLDAsMywyLDAsMywwLDEsMCwxLDEsMCwwLDEsMSwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMywzLDMsMiwyLDIsMywzLDEsMiwxLDIsMSwwLDEsMCwxLDEsMCwxLDAsMCwyLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMSwyLDMsMywyLDIsMSwyLDIsMywwLDIsMSwwLDAsMiwyLDMsMiwxLDIsMiwyLDIsMiwzLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMSwxLDAsMSwxLDIsMiwxLDEsMywwLDAsMSwzLDEsMSwxLDAsMCwwLDEsMCwxLDEsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDMsMywzLDIsMCwwLDAsMiwxLDAsMSwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMCwyLDMsMiwyLDIsMSwyLDIsMiwxLDIsMSwwLDAsMSwxLDEsMCwyLDAsMSwxLDEsMCwwLDEsMSwKMSwwLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMCwwLDAsMCwxLDAsMCwwLDAsMywwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsCjEsMCwxLDAsMSwyLDAsMCwxLDEsMiwxLDAsMSwxLDEsMSwwLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwxLDEsMCwKMiwyLDMsMiwyLDIsMywxLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDAsMiwxLAoxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDAsCjMsMywzLDIsMiwyLDIsMywyLDIsMSwxLDIsMiwyLDIsMSwxLDMsMSwyLDEsMiwwLDAsMSwxLDAsMSwwLDIsMSwKMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMCwxLDAsMCwxLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLAoyLDAsMCwxLDAsMywyLDIsMiwyLDEsMiwxLDIsMSwyLDAsMCwwLDIsMSwyLDIsMSwxLDIsMiwwLDEsMSwwLDIsCjEsMSwxLDEsMSwwLDEsMSwxLDIsMSwxLDEsMiwxLDAsMSwyLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwwLDAsMSwKMSwzLDIsMiwyLDEsMSwxLDIsMywwLDAsMCwwLDIsMCwyLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwxLAoxLDAsMSwxLDAsMSwwLDEsMSwwLDEsMSwwLDIsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsCjIsMywyLDMsMiwxLDIsMiwyLDIsMSwwLDAsMCwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDIsMSwKMSwxLDIsMSwwLDIsMCwwLDEsMCwxLDAsMCwxLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAozLDAsMCwxLDAsMiwyLDIsMywyLDIsMiwyLDIsMiwyLDAsMCwwLDIsMSwyLDEsMSwxLDIsMiwwLDAsMCwxLDIsCjEsMSwxLDEsMSwwLDEsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDAsMSwKMiwzLDIsMywzLDIsMCwxLDEsMSwwLDAsMSwwLDIsMCwxLDEsMywxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwxLAoxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjIsMywzLDMsMywxLDIsMiwyLDIsMCwxLDEsMCwyLDEsMSwxLDIsMSwwLDEsMSwwLDAsMSwwLDEsMCwwLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDIsMCwwLDEsMSwyLDIsMSwwLDAsMiwwLDEsMSwzLDAsMCwxLDAsMCwwLDAsMCwxLDAsMSwyLDEsCjEsMSwyLDAsMSwxLDEsMCwxLDAsMSwxLDAsMSwwLDEsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwKMSwzLDIsMywyLDEsMCwwLDIsMiwyLDAsMSwwLDIsMCwxLDEsMSwwLDEsMCwwLDAsMywwLDEsMSwwLDAsMiwxLAoxLDEsMSwwLDEsMSwwLDAsMCwwLDEsMSwwLDEsMCwwLDIsMSwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMSwxLDAsCjMsMSwyLDEsMSwyLDIsMiwyLDIsMiwxLDIsMiwxLDEsMCwwLDAsMiwyLDIsMCwwLDAsMSwyLDEsMCwxLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwyLDEsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMCwxLAozLDAsMCwwLDAsMiwwLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMSwxLDAsMSwwLDEsMSwwLDAsMSwwLDEsCjEsMSwwLDAsMSwwLDAsMCwxLDAsMSwxLDAsMCwxLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMSwKMSwzLDMsMiwyLDAsMCwwLDIsMiwwLDAsMCwxLDIsMCwxLDEsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwxLAowLDEsMSwwLDAsMSwxLDAsMCwwLDEsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjIsMywyLDMsMiwwLDAsMCwwLDEsMSwwLDAsMCwyLDAsMiwwLDIsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDEsMSwKMSwxLDIsMCwxLDIsMSwwLDEsMSwyLDEsMSwxLDEsMSwyLDEsMSwwLDEsMCwwLDEsMSwxLDEsMSwwLDEsMSwwLAoxLDMsMiwyLDIsMSwwLDAsMiwyLDEsMCwxLDIsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDEsCjAsMCwxLDEsMCwxLDEsMCwwLDEsMSwwLDEsMSwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwwLDIsMywxLDIsMiwyLDIsMiwyLDEsMSwwLDAsMCwxLDAsMSwwLDIsMSwxLDEsMCwwLDAsMCwxLAoxLDEsMCwxLDEsMCwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjIsMCwyLDAsMCwxLDAsMywyLDEsMiwxLDIsMiwwLDEsMCwwLDAsMiwxLDAsMCwyLDEsMSwxLDEsMCwyLDAsMiwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMCwxLDAsMCwxLAoxLDIsMiwyLDIsMSwwLDAsMSwwLDAsMCwwLDAsMiwwLDEsMSwxLDEsMCwwLDAsMCwxLDAsMSwyLDAsMCwyLDAsCjEsMCwxLDEsMSwyLDEsMCwxLDAsMSwxLDAsMCwxLDAsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsMCwxLDEsMCwKMiwxLDIsMiwyLDAsMywwLDEsMSwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDAsMCwxLDEsMSwwLDAsMSwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjEsMiwyLDMsMiwyLDAsMCwxLDEsMiwwLDEsMiwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLAoyLDIsMSwxLDIsMSwyLDIsMiwyLDIsMSwyLDIsMCwxLDAsMCwwLDEsMiwyLDIsMSwyLDEsMSwxLDEsMSwyLDEsCjEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwxLDEsMSwwLDEsMSwwLDAsMSwKMSwyLDIsMiwyLDAsMSwwLDIsMiwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAowLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwxLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwwLDAsMiwyLDIsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsCjAsMSwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwwLDAsMSwwLDAsMSwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDAsMiwwLDAsMCwxLAowLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMSwxLDIsMCwyLDEsMSwxLDEsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMSwKMCwwLDEsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMiwxLDIsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwxLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMSwwLDAsMCwwLDIsMCwxLDIsMSwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDAsMCwxLAowLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjIsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMSwxLDAsMSwwLDEsMCwwLDEsMSwxLDEsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMCwxLDEsMCwxLDAsMSwwLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMSwwLDEsMCwwLDAsCjAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAopCgpLb2k4ck1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IEtPSThSX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiS09JOC1SIiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCldpbjEyNTFDeXJpbGxpY01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTFfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTEiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKTGF0aW41Q3lyaWxsaWNNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBsYXRpbjVfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS01IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCk1hY0N5cmlsbGljTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogbWFjQ3lyaWxsaWNfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJNYWNDeXJpbGxpYyIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpJYm04NjZNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBJQk04NjZfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJQk04NjYiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKSWJtODU1TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogSUJNODU1X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSUJNODU1IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KUEsDBBQAAAAAAAAAIQD+u68pkDEAAJAxAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpMYXRpbjdfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA4MiwxMDAsMTA0LCA5NCwgOTgsMTAxLDExNiwxMDIsMTExLDE4NywxMTcsIDkyLCA4OCwxMTMsIDg1LCAgIyA0MAogNzksMTE4LDEwNSwgODMsIDY3LDExNCwxMTksIDk1LCA5OSwxMDksMTg4LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzIsIDcwLCA4MCwgODEsIDYwLCA5NiwgOTMsIDg5LCA2OCwxMjAsIDk3LCA3NywgODYsIDY5LCA1NSwgICMgNjAKIDc4LDExNSwgNjUsIDY2LCA1OCwgNzYsMTA2LDEwMywgODcsMTA3LDExMiwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDgwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgOTAKMjUzLDIzMywgOTAsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCA3NCwyNTMsMjUzLCAgIyBhMAoyNTMsMjUzLDI1MywyNTMsMjQ3LDI0OCwgNjEsIDM2LCA0NiwgNzEsIDczLDI1MywgNTQsMjUzLDEwOCwxMjMsICAjIGIwCjExMCwgMzEsIDUxLCA0MywgNDEsIDM0LCA5MSwgNDAsIDUyLCA0NywgNDQsIDUzLCAzOCwgNDksIDU5LCAzOSwgICMgYzAKIDM1LCA0OCwyNTAsIDM3LCAzMywgNDUsIDU2LCA1MCwgODQsIDU3LDEyMCwxMjEsIDE3LCAxOCwgMjIsIDE1LCAgIyBkMAoxMjQsICAxLCAyOSwgMjAsIDIxLCAgMywgMzIsIDEzLCAyNSwgIDUsIDExLCAxNiwgMTAsICA2LCAzMCwgIDQsICAjIGUwCiAgOSwgIDgsIDE0LCAgNywgIDIsIDEyLCAyOCwgMjMsIDQyLCAyNCwgNjQsIDc1LCAxOSwgMjYsIDI3LDI1MywgICMgZjAKKQoKd2luMTI1M19jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDgyLDEwMCwxMDQsIDk0LCA5OCwxMDEsMTE2LDEwMiwxMTEsMTg3LDExNywgOTIsIDg4LDExMywgODUsICAjIDQwCiA3OSwxMTgsMTA1LCA4MywgNjcsMTE0LDExOSwgOTUsIDk5LDEwOSwxODgsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MiwgNzAsIDgwLCA4MSwgNjAsIDk2LCA5MywgODksIDY4LDEyMCwgOTcsIDc3LCA4NiwgNjksIDU1LCAgIyA2MAogNzgsMTE1LCA2NSwgNjYsIDU4LCA3NiwxMDYsMTAzLCA4NywxMDcsMTEyLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgODAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA5MAoyNTMsMjMzLCA2MSwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsIDc0LDI1MywyNTMsICAjIGEwCjI1MywyNTMsMjUzLDI1MywyNDcsMjUzLDI1MywgMzYsIDQ2LCA3MSwgNzMsMjUzLCA1NCwyNTMsMTA4LDEyMywgICMgYjAKMTEwLCAzMSwgNTEsIDQzLCA0MSwgMzQsIDkxLCA0MCwgNTIsIDQ3LCA0NCwgNTMsIDM4LCA0OSwgNTksIDM5LCAgIyBjMAogMzUsIDQ4LDI1MCwgMzcsIDMzLCA0NSwgNTYsIDUwLCA4NCwgNTcsMTIwLDEyMSwgMTcsIDE4LCAyMiwgMTUsICAjIGQwCjEyNCwgIDEsIDI5LCAyMCwgMjEsICAzLCAzMiwgMTMsIDI1LCAgNSwgMTEsIDE2LCAxMCwgIDYsIDMwLCAgNCwgICMgZTAKICA5LCAgOCwgMTQsICA3LCAgMiwgMTIsIDI4LCAyMywgNDIsIDI0LCA2NCwgNzUsIDE5LCAyNiwgMjcsMjUzLCAgIyBmMAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk4LjI4NTElCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6MS43MDAxJQojIHJlc3QgIHNlcXVlbmNlczogICAgIDAuMDM1OSUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjAxNDglCkdyZWVrTGFuZ01vZGVsID0gKAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMiwyLDMsMywzLDMsMywzLDMsMywxLDMsMywzLDAsMiwyLDMsMywwLDMsMCwzLDIsMCwzLDMsMywwLAozLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDAsMywzLDAsMywyLDMsMywwLDMsMiwzLDMsMywwLDAsMywwLDMsMCwzLDMsMiwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywyLDIsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMywwLDIsMywzLDAsMywzLDMsMywyLDMsMywzLDAsCjIsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMiwxLDMsMywzLDMsMiwzLDMsMiwzLDMsMiwwLAowLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywwLDMsMywzLDMsMywzLDAsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMiwzLDMsMCwKMiwwLDEsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDMsMCwwLDAsMCwzLDMsMCwzLDEsMywzLDMsMCwzLDMsMCwzLDMsMywzLDAsMCwwLDAsCjIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMCwzLDAsMywzLDMsMywzLDAsMywyLDIsMiwzLDAsMiwzLDMsMywzLDMsMiwzLDMsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDMsMiwyLDIsMywzLDMsMywwLDMsMSwzLDMsMywzLDIsMywzLDMsMywzLDMsMywyLDIsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDAsMywwLDAsMCwzLDMsMiwzLDMsMywzLDMsMCwwLDMsMiwzLDAsMiwzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMywwLDAsMywzLDAsMiwzLDAsMywwLDMsMywzLDAsMCwzLDAsMywwLDIsMiwzLDMsMCwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMCwzLDIsMywzLDMsMywwLDMsMywzLDMsMywwLDMsMywyLDMsMiwzLDMsMiwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywyLDMsMiwzLDMsMywzLDMsMywwLDIsMywyLDMsMiwyLDIsMywyLDMsMywyLDMsMCwyLDIsMiwzLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMywzLDMsMiwzLDMsMCwwLDMsMCwzLDAsMCwwLDMsMiwwLDMsMCwzLDAsMCwyLDAsMiwwLAowLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMCwzLDMsMywzLDMsMywwLDMsMywwLDMsMCwwLDAsMywzLDAsMywzLDMsMCwwLDEsMiwzLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwwLDAsMywyLDIsMywzLDAsMywzLDMsMywzLDIsMSwzLDAsMywyLDMsMywyLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDMsMCwyLDMsMywzLDMsMywzLDAsMCwzLDAsMywwLDAsMCwzLDMsMCwzLDIsMywwLDAsMywzLDMsMCwKMywwLDAsMCwyLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMCwzLDMsMywzLDMsMywwLDAsMywwLDMsMCwwLDAsMywyLDAsMywyLDMsMCwwLDMsMiwzLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMSwyLDIsMywzLDMsMywzLDMsMCwyLDMsMCwzLDAsMCwwLDMsMywwLDMsMCwyLDAsMCwyLDMsMSwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDMsMCwzLDAsMywzLDIsMywwLDMsMywzLDMsMywzLDAsMywzLDMsMCwyLDMsMCwwLDMsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywwLDAsMywwLDAsMCwzLDMsMCwzLDAsMiwzLDMsMCwwLDMsMCwzLDAsMywzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMywzLDMsMywzLDMsMCwwLDMsMCwyLDAsMCwwLDMsMywwLDMsMCwzLDAsMCwyLDAsMiwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDMsMCwzLDAsMiwwLDMsMiwwLDMsMiwzLDIsMywwLDAsMywyLDMsMiwzLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMiwzLDMsMywzLDMsMCwwLDAsMywwLDIsMSwwLDAsMywyLDIsMiwwLDMsMCwwLDIsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMiwwLDMsMCwzLDAsMywzLDAsMiwxLDIsMywzLDAsMCwzLDAsMywwLDMsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDMsMywwLDMsMywzLDMsMywzLDAsMiwzLDAsMywwLDAsMCwyLDEsMCwyLDIsMywwLDAsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMiwzLDMsMywyLDMsMCwwLDEsMywwLDIsMCwwLDAsMCwzLDAsMSwwLDIsMCwwLDEsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMSwwLDMsMCwwLDAsMywyLDAsMywyLDMsMywzLDAsMCwzLDAsMywyLDIsMiwxLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDAsMCwzLDAsMCwwLDAsMiwwLDIsMywzLDIsMiwyLDIsMywwLDIsMCwyLDIsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMiwwLDAsMCwwLDAsMCwyLDMsMCwyLDAsMiwzLDIsMCwwLDMsMCwzLDAsMywxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMywyLDMsMywyLDIsMywwLDIsMCwzLDAsMCwwLDIsMCwwLDAsMCwxLDIsMCwyLDAsMiwwLAowLDIsMCwyLDAsMiwyLDAsMCwxLDAsMiwyLDIsMCwyLDIsMiwwLDIsMiwyLDAsMCwyLDAsMCwxLDAsMCwwLDAsCjAsMiwwLDMsMywyLDAsMCwwLDAsMCwwLDEsMywwLDIsMCwyLDIsMiwwLDAsMiwwLDMsMCwwLDIsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwyLDMsMiwwLDIsMiwwLDIsMCwyLDIsMCwyLDAsMiwyLDIsMCwwLDAsMCwwLDAsMiwzLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDAsMiwyLDAsMCwwLDIsMSwwLDIsMiwwLDAsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwKMCwwLDIsMSwwLDIsMywyLDIsMywyLDMsMiwwLDAsMywzLDMsMCwwLDMsMiwwLDAsMCwxLDEsMCwyLDAsMiwyLAowLDIsMCwyLDAsMiwyLDAsMCwyLDAsMiwyLDIsMCwyLDIsMiwyLDAsMCwyLDAsMCwwLDIsMCwxLDAsMCwwLDAsCjAsMywwLDMsMywyLDIsMCwzLDAsMCwwLDIsMiwwLDIsMiwyLDEsMiwwLDAsMSwyLDIsMCwwLDMsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMSwyLDAsMCwwLDAsMCwwLDAsMiwyLDAsMSwwLDAsMiwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMywyLDIsMCwwLDAsMiwwLDIsMywzLDAsMiwwLDAsMCwwLDAsMCwyLDIsMiwwLDIsMiwwLDIsMCwyLAowLDIsMiwwLDAsMiwyLDIsMiwxLDAsMCwyLDIsMCwyLDAsMCwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMiwwLDMsMiwzLDAsMCwwLDMsMCwwLDIsMiwwLDIsMCwyLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwKMCwwLDIsMiwwLDAsMiwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMywyLDAsMiwyLDIsMiwyLDAsMCwwLDIsMCwwLDAsMCwyLDAsMSwwLDAsMiwwLDEsMCwwLDAsCjAsMiwyLDIsMCwyLDIsMCwxLDIsMCwyLDIsMiwwLDIsMiwyLDIsMSwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwyLDAsMiwyLDAsMCwwLDAsMSwyLDEsMCwwLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMiwzLDAsMCwyLDAsMCwwLDIsMiwwLDIsMCwwLDAsMSwwLDAsMiwwLDIsMCwyLDIsMCwwLDAsMCwKMCwwLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDIsMiwzLDIsMiwwLDAsMCwwLDAsMCwxLDMsMCwyLDAsMiwyLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMiwwLDMsMiwwLDIsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDAsMiwwLDAsMCwwLDEsMSwwLDAsMiwxLDIsMCwyLDIsMCwxLDAsMCwxLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMywwLDIsMiwyLDAsMCwyLDAsMCwwLDIsMCwwLDAsMiwzLDAsMiwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMSwyLDIsMSwwLDAsMCwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwxLDIsMCwyLDIsMCwyLDAsMCwyLDAsMCwwLDAsMSwyLDEsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMCwwLDAsMywxLDIsMiwwLDIsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDMsMCwwLDAsMCwyLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwxLDAsMiwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMiwKMCwyLDIsMCwwLDIsMiwyLDIsMiwwLDEsMiwwLDAsMCwyLDIsMCwxLDAsMiwwLDAsMiwyLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDAsMiwyLDEsMCwxLDAsMSwwLDIsMiwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwyLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMiwyLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwyLAowLDIsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDIsMCwwLDAsCjAsMiwyLDIsMiwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMSwKMCwwLDIsMCwwLDAsMCwxLDIsMCwwLDAsMCwwLDAsMiwyLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDIsMCwyLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMiwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsCjAsMCwxLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwyLAowLDAsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMiwxLDAsMCwwLDAsMCwwLDIsMCwwLDIsMCwyLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMiwKMCwwLDIsMCwwLDIsMCwyLDIsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwyLDIsMCwyLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMiwwLDAsMCwwLDAsCjAsMiwyLDIsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMSwKMCwwLDAsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDAsMCwyLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDIsMCwwLDAsCjAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwyLDAsMiwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKTGF0aW43R3JlZWtNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBMYXRpbjdfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogR3JlZWtMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk4Mjg1MSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktNyIsCiAgJ2xhbmd1YWdlJzogJ0dyZWVrJywKfQoKV2luMTI1M0dyZWVrTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1M19jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBHcmVla0xhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTgyODUxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTMiLAogICdsYW5ndWFnZSc6ICdHcmVlaycsCn0KUEsDBBQAAAAAAAAAIQCPZq0YUSwAAFEsAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2hlYnJld21vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgICAgICAgICAgU2ltb24gTW9udGFndQojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDUKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBTaG9zaGFubmFoIEZvcmJlcyAtIG9yaWdpbmFsIEMgY29kZSAoPykKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgV2luZG93cy0xMjU1IGxhbmd1YWdlIG1vZGVsCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CldJTjEyNTVfQ0hBUl9UT19PUkRFUl9NQVAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA2OSwgOTEsIDc5LCA4MCwgOTIsIDg5LCA5NywgOTAsIDY4LDExMSwxMTIsIDgyLCA3MywgOTUsIDg1LCAgIyA0MAogNzgsMTIxLCA4NiwgNzEsIDY3LDEwMiwxMDcsIDg0LDExNCwxMDMsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNTAsIDc0LCA2MCwgNjEsIDQyLCA3NiwgNzAsIDY0LCA1MywxMDUsIDkzLCA1NiwgNjUsIDU0LCA0OSwgICMgNjAKIDY2LDExMCwgNTEsIDQzLCA0NCwgNjMsIDgxLCA3NywgOTgsIDc1LDEwOCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxMjQsMjAyLDIwMywyMDQsMjA1LCA0MCwgNTgsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsCjIxNSwgODMsIDUyLCA0NywgNDYsIDcyLCAzMiwgOTQsMjE2LDExMywyMTcsMTA5LDIxOCwyMTksMjIwLDIyMSwKIDM0LDExNiwyMjIsMTE4LDEwMCwyMjMsMjI0LDExNywxMTksMTA0LDEyNSwyMjUsMjI2LCA4NywgOTksMjI3LAoxMDYsMTIyLDEyMywyMjgsIDU1LDIyOSwyMzAsMTAxLDIzMSwyMzIsMTIwLDIzMywgNDgsIDM5LCA1NywyMzQsCiAzMCwgNTksIDQxLCA4OCwgMzMsIDM3LCAzNiwgMzEsIDI5LCAzNSwyMzUsIDYyLCAyOCwyMzYsMTI2LDIzNywKMjM4LCAzOCwgNDUsMjM5LDI0MCwyNDEsMjQyLDI0MywxMjcsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLAogIDksICA4LCAyMCwgMTYsICAzLCAgMiwgMjQsIDE0LCAyMiwgIDEsIDI1LCAxNSwgIDQsIDExLCAgNiwgMjMsCiAxMiwgMTksIDEzLCAyNiwgMTgsIDI3LCAyMSwgMTcsICA3LCAxMCwgIDUsMjUxLDI1MiwxMjgsIDk2LDI1MywKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5OC40MDA0JQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOiAxLjU5ODElCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgIDAuMDg3JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogICAwLjAwMTUlCkhFQlJFV19MQU5HX01PREVMID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMSwyLDAsMSwwLDAsCjMsMCwzLDEsMCwwLDEsMywyLDAsMSwxLDIsMCwyLDIsMiwxLDEsMSwxLDIsMSwxLDEsMiwwLDAsMiwyLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLAoxLDIsMSwyLDEsMiwwLDAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwKMSwyLDEsMywxLDEsMCwwLDIsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMCwxLDIsMiwxLDMsCjEsMiwxLDEsMiwyLDAsMCwyLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDIsMiwyLDIsMywyLAoxLDIsMSwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMiwzLDIsMiwzLDIsMiwyLDEsMiwyLDIsMiwKMSwyLDEsMSwyLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMCwyLDIsMiwyLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywwLDIsMiwyLAowLDIsMSwyLDIsMiwwLDAsMiwxLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLDIsMywyLDIsMiwKMSwyLDEsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDAsMiwwLDIsCjAsMiwxLDIsMiwyLDAsMCwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDIsMiwzLDIsMSwyLDEsMSwxLAowLDEsMSwxLDEsMSwzLDAsMSwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsCjAsMiwwLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDEsMiwzLDMsMiwzLDMsMywzLDIsMywyLDEsMiwwLDIsMSwyLAowLDIsMCwyLDIsMiwwLDAsMSwyLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMSwyLDIsMywzLDIsMywyLDMsMiwyLDMsMSwyLDIsMCwyLDIsMiwKMCwyLDEsMiwyLDIsMCwwLDEsMiwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwyLDIsMywzLDMsMywxLDMsMiwyLDIsCjAsMiwwLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywyLDMsMiwyLDIsMSwyLDIsMCwyLDIsMiwyLAowLDIsMCwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDEsMywyLDMsMywyLDMsMywyLDIsMSwyLDIsMiwyLDIsMiwKMCwyLDEsMiwxLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMiwzLDMsMiwzLDMsMywzLDIsMywyLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDEsCjAsMiwwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwxLDIsMywzLDMsMywzLDMsMywyLDMsMiwzLDIsMSwyLDMsMCwyLDEsMiwyLAowLDIsMSwxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywyLDEsMywxLDIsMiwyLDEsMiwzLDMsMSwyLDEsMiwyLDIsMiwKMCwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDAsMiwzLDMsMywxLDMsMywzLDEsMiwyLDIsMiwxLDEsMiwyLDIsMiwyLDIsCjAsMiwwLDEsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDIsMywzLDMsMiwxLDIsMywyLDMsMiwyLDIsMiwxLDIsMSwxLDEsMiwyLAowLDIsMSwxLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMiwzLDMsMiwzLDEsMiwyLDIsMiwzLDIsMywxLDEsMiwyLDEsMiwyLDEsMSwwLDIsMiwyLDIsCjAsMSwwLDEsMiwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywwLDAsMSwxLDAsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDAsMSwwLDEsMSwwLDEsMSwwLDAsMCwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDEsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMSwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMiwyLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwwLDMsMywzLAowLDMsMCwyLDIsMiwyLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjIsMiwyLDMsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwyLDIsMiwxLDEsMSwyLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMCwyLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMSwwLDIsMSwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMSwxLDIsMiwyLDIsMiwxLDIsMiwyLDEsMSwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMCwxLDEsMSwxLDAsCjAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDEsMSwxLDEsMiwxLDEsMiwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMSwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwyLDIsMiwxLDIsMSwyLDEsMSwxLDEsMCwwLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwxLDIsMSwxLDIsMSwxLDEsMiwxLDIsMSwyLDAsMSwwLDEsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDEsMiwyLDIsMSwyLDIsMiwyLDIsMiwyLDIsMSwyLDEsMSwxLDEsMSwxLDIsMSwyLDEsMSwwLDEsMCwxLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDEsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsCjAsMSwxLDEsMiwxLDIsMiwyLDAsMiwwLDIsMCwxLDEsMiwxLDEsMSwxLDIsMSwwLDEsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwxLDAsMCwwLDAsMCwxLDAsMSwyLDIsMCwxLDAsMCwxLDEsMiwyLDEsMiwwLDIsMCwwLDAsMSwyLDAsMSwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDIsMSwyLDAsMiwwLDAsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDEsMSwxLDIsMiwwLDAsMSwwLDAsMCwxLDAsMCwxLAoxLDEsMiwxLDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwyLDEsCjAsMiwwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDAsMCwxLDAsMSwxLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwxLDEsMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDEsMSwxLDAsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDAsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwxLDAsMSwwLDAsMSwxLDIsMSwxLDIsMCwxLDAsMCwwLDEsMSwwLDEsCjEsMCwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDAsMCwyLDEsMSwyLDAsMiwwLDAsMCwxLDEsMCwxLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMiwxLDEsMCwxLDAsMCwyLDIsMSwyLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwKMiwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDEsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMiwwLDAsMCwwLDIsMSwxLDEsMCwyLDEsMSwwLDAsMCwyLDEsMCwxLAoxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDIsMCwxLDAsMCwxLDEsMCwyLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwKMiwyLDEsMSwxLDAsMSwxLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDEsMSwwLDEsMiwxLDAsMiwwLDAsMCwxLDEsMCwxLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsCjAsMSwwLDAsMiwwLDIsMSwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDIsMCwxLDAsMCwxLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMSwKMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsMSwwLDAsMiwxLDEsMSwxLDEsMCwxLDAsMCwwLDAsMSwwLDEsCjAsMSwxLDEsMiwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDEsMCwwLDAsMCwwLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsMCwKKQoKV2luMTI1NUhlYnJld01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IFdJTjEyNTVfQ0hBUl9UT19PUkRFUl9NQVAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogSEVCUkVXX0xBTkdfTU9ERUwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk4NDAwNCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjU1IiwKICAnbGFuZ3VhZ2UnOiAnSGVicmV3JywKfQpQSwMEFAAAAAAAAAAhAMPBVYAwMQAAMDEAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naHVuZ2FyaWFubW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpMYXRpbjJfSHVuZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCAyOCwgNDAsIDU0LCA0NSwgMzIsIDUwLCA0OSwgMzgsIDM5LCA1MywgMzYsIDQxLCAzNCwgMzUsIDQ3LAogNDYsIDcxLCA0MywgMzMsIDM3LCA1NywgNDgsIDY0LCA2OCwgNTUsIDUyLDI1MywyNTMsMjUzLDI1MywyNTMsCjI1MywgIDIsIDE4LCAyNiwgMTcsICAxLCAyNywgMTIsIDIwLCAgOSwgMjIsICA3LCAgNiwgMTMsICA0LCAgOCwKIDIzLCA2NywgMTAsICA1LCAgMywgMjEsIDE5LCA2NSwgNjIsIDE2LCAxMSwyNTMsMjUzLDI1MywyNTMsMjUzLAoxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsCjE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LCA3NSwxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LAogNzksMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsCjIyMSwgNTEsIDgxLDIyMiwgNzgsMjIzLDIyNCwyMjUsMjI2LCA0NCwyMjcsMjI4LDIyOSwgNjEsMjMwLDIzMSwKMjMyLDIzMywyMzQsIDU4LDIzNSwgNjYsIDU5LDIzNiwyMzcsMjM4LCA2MCwgNjksIDYzLDIzOSwyNDAsMjQxLAogODIsIDE0LCA3NCwyNDIsIDcwLCA4MCwyNDMsIDcyLDI0NCwgMTUsIDgzLCA3NywgODQsIDMwLCA3NiwgODUsCjI0NSwyNDYsMjQ3LCAyNSwgNzMsIDQyLCAyNCwyNDgsMjQ5LDI1MCwgMzEsIDU2LCAyOSwyNTEsMjUyLDI1MywKKQoKd2luMTI1MEh1bmdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgMjgsIDQwLCA1NCwgNDUsIDMyLCA1MCwgNDksIDM4LCAzOSwgNTMsIDM2LCA0MSwgMzQsIDM1LCA0NywKIDQ2LCA3MiwgNDMsIDMzLCAzNywgNTcsIDQ4LCA2NCwgNjgsIDU1LCA1MiwyNTMsMjUzLDI1MywyNTMsMjUzLAoyNTMsICAyLCAxOCwgMjYsIDE3LCAgMSwgMjcsIDEyLCAyMCwgIDksIDIyLCAgNywgIDYsIDEzLCAgNCwgIDgsCiAyMywgNjcsIDEwLCAgNSwgIDMsIDIxLCAxOSwgNjUsIDYyLCAxNiwgMTEsMjUzLDI1MywyNTMsMjUzLDI1MywKMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LAoxNzcsMTc4LDE3OSwxODAsIDc4LDE4MSwgNjksMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywgNzYsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKIDgxLDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLAoyMjEsIDUxLCA4MywyMjIsIDgwLDIyMywyMjQsMjI1LDIyNiwgNDQsMjI3LDIyOCwyMjksIDYxLDIzMCwyMzEsCjIzMiwyMzMsMjM0LCA1OCwyMzUsIDY2LCA1OSwyMzYsMjM3LDIzOCwgNjAsIDcwLCA2MywyMzksMjQwLDI0MSwKIDg0LCAxNCwgNzUsMjQyLCA3MSwgODIsMjQzLCA3MywyNDQsIDE1LCA4NSwgNzksIDg2LCAzMCwgNzcsIDg3LAoyNDUsMjQ2LDI0NywgMjUsIDc0LCA0MiwgMjQsMjQ4LDI0OSwyNTAsIDMxLCA1NiwgMjksMjUxLDI1MiwyNTMsCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTQuNzM2OCUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczo1LjI2MjMlCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC44ODk0JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDAwOSUKSHVuZ2FyaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMiwyLDMsMywxLDEsMiwyLDIsMiwyLDEsMiwKMywyLDIsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMSwyLDMsMywzLDMsMiwzLDMsMSwxLDMsMywwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsCjMsMiwxLDMsMywzLDMsMywyLDMsMywzLDMsMywxLDEsMiwzLDMsMywzLDMsMywzLDEsMSwzLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDIsMywzLDMsMSwzLDMsMywzLDMsMSwzLDMsMiwyLDAsMywyLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDMsMywzLDMsMywyLDMsMywyLDIsMywyLDMsMiwwLDMsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDIsMywzLDMsMSwyLDMsMiwyLDMsMSwyLDMsMywyLDIsMCwzLDMsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMywyLDMsMywzLDMsMiwzLDMsMywzLDAsMiwzLDIsCjAsMCwwLDEsMSwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwxLDMsMywyLDEsMywyLDIsMywyLDEsMywyLDIsMSwwLDMsMywxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDMsMywzLDMsMywxLDIsMywzLDMsMywxLDIsMSwzLDMsMywzLDIsMiwzLDEsMSwzLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywyLDEsMywzLDMsMywzLDIsMiwxLDMsMywzLDAsMSwxLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMywzLDMsMiwwLDMsMiwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwzLDIsMywzLDMsMSwzLDIsMiwyLDMsMSwxLDMsMywxLDEsMCwzLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDIsMywzLDMsMiwzLDMsMywzLDMsMSwyLDMsMiwyLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDIsMywxLDMsMywyLDIsMSwzLDMsMywxLDEsMywxLDIsMywyLDMsMiwyLDIsMSwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDMsMywzLDMsMywxLDIsMywzLDMsMywxLDIsMSwzLDMsMywyLDIsMywyLDEsMCwzLDIsMCwxLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwxLDAsMywzLDMsMywwLDIsMywwLDAsMiwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywyLDIsMiwyLDMsMywwLDEsMiwzLDIsMywyLDIsMywyLDEsMiwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDEsMiwzLDMsMywyLDEsMiwzLDMsMiwyLDIsMywyLDMsMywxLDMsMywxLDEsMCwyLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDIsMiwyLDIsMywzLDMsMSwxLDEsMywzLDEsMSwzLDEsMSwzLDIsMSwyLDMsMSwxLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwxLDIsMSwxLDMsMywxLDEsMSwxLDMsMywxLDEsMiwyLDEsMiwxLDEsMiwyLDEsMSwwLDIsMiwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMSwyLDEsMSwzLDMsMSwwLDEsMSwzLDMsMiwwLDEsMSwyLDMsMSwwLDIsMiwxLDAsMCwxLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDIsMSwzLDMsMywzLDMsMSwyLDMsMiwzLDMsMiwxLDEsMywyLDMsMiwxLDIsMiwwLDEsMiwxLDAsMCwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywyLDIsMiwyLDMsMSwyLDIsMSwxLDMsMywwLDMsMiwxLDIsMywyLDEsMywzLDEsMSwwLDIsMSwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMiwzLDMsMywyLDEsMSwzLDMsMSwxLDEsMiwyLDMsMiwzLDIsMiwyLDEsMCwyLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDMsMywzLDMsMCwwLDMsMywyLDMsMCwwLDAsMiwzLDMsMSwwLDEsMiwwLDAsMSwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDIsMywzLDMsMywzLDEsMiwzLDMsMiwyLDEsMSwwLDMsMywyLDIsMSwyLDIsMSwwLDIsMiwwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDIsMSwzLDEsMiwzLDMsMiwyLDEsMSwyLDIsMSwxLDEsMSwzLDIsMSwxLDEsMSwyLDEsMCwxLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywxLDEsMSwxLDEsMywzLDMsMCwxLDEsMywzLDEsMSwxLDEsMSwyLDIsMCwzLDEsMSwyLDAsMiwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywxLDAsMSwyLDEsMiwyLDAsMSwyLDMsMSwyLDAsMCwwLDIsMSwxLDEsMSwxLDIsMCwwLDEsMSwwLDAsMCwwLAoxLDIsMSwyLDIsMiwxLDIsMSwyLDAsMiwwLDIsMiwxLDEsMiwxLDEsMiwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsCjEsMSwxLDIsMywyLDMsMywwLDEsMiwyLDMsMSwwLDEsMCwyLDEsMiwyLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDMsMiwyLDEsMCwwLDMsMiwzLDIsMCwwLDAsMSwxLDMsMCwwLDEsMSwwLDAsMiwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMiwyLDMsMywxLDAsMSwzLDIsMywxLDEsMSwwLDEsMSwxLDEsMSwzLDEsMCwwLDIsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDEsMiwyLDIsMSwwLDEsMiwzLDMsMiwwLDAsMCwyLDEsMSwxLDIsMSwxLDEsMCwxLDEsMSwwLDAsMCwKMSwyLDIsMiwyLDIsMSwxLDEsMiwwLDIsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwxLAozLDIsMiwxLDAsMCwxLDEsMiwyLDAsMywwLDEsMiwxLDEsMCwwLDEsMSwxLDAsMSwxLDEsMSwwLDIsMSwxLDEsCjIsMiwxLDEsMSwyLDEsMiwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMiwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwKMiwzLDMsMCwxLDAsMCwwLDMsMywxLDAsMCwxLDIsMiwxLDAsMCwwLDAsMiwwLDAsMSwxLDEsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwxLDAsMSwxLDAsMSwxLDEsMCwxLDIsMSwxLDAsMSwxLDEsMSwxLDEsMSwwLDEsCjIsMywzLDAsMSwwLDAsMCwyLDIsMCwwLDAsMCwxLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwwLDEsMCwKMiwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwxLDIsMCwxLDEsMSwxLDEsMCwxLAozLDIsMiwwLDEsMCwxLDAsMiwzLDIsMCwwLDEsMiwyLDEsMCwwLDEsMSwxLDAsMCwyLDEsMCwxLDIsMiwxLDEsCjIsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwwLDIsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDIsMSwxLDAsMSwKMiwyLDIsMCwwLDEsMCwwLDIsMiwxLDEsMCwwLDIsMSwxLDAsMCwwLDEsMiwwLDAsMiwxLDAsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMiwxLDIsMSwxLDEsMiwyLDEsMSwyLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsCjEsMiwzLDAsMCwwLDEsMCwzLDIsMSwwLDAsMSwyLDEsMSwwLDAsMCwwLDIsMSwwLDEsMSwwLDAsMiwxLDIsMSwKMSwxLDAsMCwwLDEsMCwxLDEsMSwxLDEsMiwwLDAsMSwwLDAsMCwyLDAsMCwxLDEsMSwxLDEsMSwxLDEsMCwxLAozLDAsMCwyLDEsMiwyLDEsMCwwLDIsMSwyLDIsMCwwLDAsMiwxLDEsMSwwLDEsMSwwLDAsMSwxLDIsMCwwLDAsCjEsMiwxLDIsMiwxLDEsMiwxLDIsMCwxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwwLDAsMSwxLDEsMSwwLDAsMSwKMSwzLDIsMCwwLDAsMSwwLDIsMiwyLDAsMCwwLDIsMiwxLDAsMCwwLDAsMywxLDEsMSwxLDAsMCwyLDEsMSwxLAoyLDEsMCwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMCwyLDEsMCwwLDEsMCwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsCjIsMywyLDAsMCwwLDEsMCwyLDIsMCwwLDAsMCwyLDEsMSwwLDAsMCwwLDIsMSwwLDEsMSwwLDAsMiwxLDEsMCwKMiwxLDEsMSwxLDIsMSwyLDEsMiwwLDEsMSwxLDAsMiwxLDEsMSwyLDEsMSwxLDEsMCwxLDEsMSwxLDEsMCwxLAozLDEsMSwyLDIsMiwzLDIsMSwxLDIsMiwxLDEsMCwxLDAsMiwyLDEsMSwxLDEsMSwwLDAsMSwxLDAsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDIsMiwxLDAsMCwwLDEsMSwwLDAsMSwyLDAsMCwyLDEsMSwxLAoyLDIsMSwxLDEsMiwxLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLDIsMSwxLDEsMSwwLDEsMiwxLDEsMSwwLDEsCjEsMCwwLDEsMiwzLDIsMSwwLDAsMiwwLDEsMSwwLDAsMCwxLDEsMSwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwKMSwyLDEsMiwxLDIsMSwxLDEsMiwwLDIsMSwxLDEsMCwxLDIsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMiwwLDAsMCwwLDAsMSwxLDIsMSwwLDAsMSwxLDEsMCwwLDAsMCwyLDAsMCwxLDEsMCwwLDIsMSwxLDEsCjIsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwwLDIsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMSwKMSwyLDIsMCwxLDEsMSwwLDIsMiwyLDAsMCwwLDMsMiwxLDAsMCwwLDEsMSwwLDAsMSwxLDAsMSwxLDEsMCwwLAoxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMCwwLDEsMSwxLDAsMSwwLDEsCjIsMSwwLDIsMSwxLDIsMiwxLDEsMiwxLDEsMSwwLDAsMCwxLDEsMCwxLDEsMSwxLDAsMCwxLDEsMSwwLDAsMCwKMSwyLDIsMiwyLDIsMSwxLDEsMiwwLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwwLDAsMSwwLAoxLDIsMywwLDAsMCwxLDAsMiwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDIsMCwxLDAsCjIsMSwxLDEsMSwxLDAsMiwwLDAsMCwxLDIsMSwxLDEsMSwwLDEsMiwwLDEsMCwxLDAsMSwxLDEsMCwxLDAsMSwKMiwyLDIsMCwwLDAsMSwwLDIsMSwyLDAsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwyLDEsMCwxLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMiwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMCwwLDEsMCwyLDIsMiwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDIsMCwwLDEsMSwxLDAsMSwKMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMSwwLDAsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDAsMCwxLAoxLDAsMCwxLDAsMSwyLDEsMCwwLDEsMSwxLDIsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsCjAsMiwxLDIsMSwxLDEsMSwxLDIsMCwyLDAsMSwxLDAsMSwyLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwxLDEsMCwxLDIsMCwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwyLDEsMCwxLAoyLDIsMSwxLDEsMSwxLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLDIsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMiwwLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwxLDAsMSwwLDAsMCwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMCwxLAoxLDEsMiwwLDAsMywxLDAsMiwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDEsMCwxLDAsCjEsMiwxLDAsMSwxLDEsMiwxLDEsMCwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwKMiwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwyLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMCwwLDEsMSwxLDEsMSwwLDEsCjIsMSwxLDEsMiwxLDEsMSwwLDEsMSwyLDEsMCwwLDAsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMCwxLDEsMSwxLDEsMCwwLDEsMSwyLDEsMCwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMSwwLDEsMCwwLDAsCjEsMiwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwwLDAsMCwxLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwxLDIsMCwwLDEsMCwwLDEsMCwxLDAsMCwwLAowLDEsMSwxLDEsMSwxLDEsMSwyLDAsMSwxLDEsMSwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDEsMSwwLDAsMiwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMCwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDAsMCwxLDEsMCwxLDAsMSwwLDAsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDAsMSwwLDAsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDEsMCwwLDEsMCwxLDAsMSwxLDEsMCwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKTGF0aW4ySHVuZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW4yX0h1bmdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEh1bmdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTQ3MzY4LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTIiLAogICdsYW5ndWFnZSc6ICdIdW5nYXJpYW4nLAp9CgpXaW4xMjUwSHVuZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1MEh1bmdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEh1bmdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTQ3MzY4LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MCIsCiAgJ2xhbmd1YWdlJzogJ0h1bmdhcmlhbicsCn0KUEsDBBQAAAAAAAAAIQAiD9I/GiwAABosAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3RoYWltb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgVGhlIGZvbGxvd2luZyByZXN1bHQgZm9yIHRoYWkgd2FzIGNvbGxlY3RlZCBmcm9tIGEgbGltaXRlZCBzYW1wbGUgKDFNKS4KCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6ClRJUzYyMENoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxODIsMTA2LDEwNywxMDAsMTgzLDE4NCwxODUsMTAxLCA5NCwxODYsMTg3LDEwOCwxMDksMTEwLDExMSwgICMgNDAKMTg4LDE4OSwxOTAsIDg5LCA5NSwxMTIsMTEzLDE5MSwxOTIsMTkzLDE5NCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDY0LCA3MiwgNzMsMTE0LCA3NCwxMTUsMTE2LDEwMiwgODEsMjAxLDExNywgOTAsMTAzLCA3OCwgODIsICAjIDYwCiA5NiwyMDIsIDkxLCA3OSwgODQsMTA0LDEwNSwgOTcsIDk4LCA5MiwyMDMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjA5LDIxMCwyMTEsMjEyLDIxMywgODgsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDExOCwyMjEsMjIyLAoyMjMsMjI0LCA5OSwgODUsIDgzLDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsCjIzNiwgIDUsIDMwLDIzNywgMjQsMjM4LCA3NSwgIDgsIDI2LCA1MiwgMzQsIDUxLDExOSwgNDcsIDU4LCA1NywKIDQ5LCA1MywgNTUsIDQzLCAyMCwgMTksIDQ0LCAxNCwgNDgsICAzLCAxNywgMjUsIDM5LCA2MiwgMzEsIDU0LAogNDUsICA5LCAxNiwgIDIsIDYxLCAxNSwyMzksIDEyLCA0MiwgNDYsIDE4LCAyMSwgNzYsICA0LCA2NiwgNjMsCiAyMiwgMTAsICAxLCAzNiwgMjMsIDEzLCA0MCwgMjcsIDMyLCAzNSwgODYsMjQwLDI0MSwyNDIsMjQzLDI0NCwKIDExLCAyOCwgNDEsIDI5LCAzMywyNDUsIDUwLCAzNywgIDYsICA3LCA2NywgNzcsIDM4LCA5MywyNDYsMjQ3LAogNjgsIDU2LCA1OSwgNjUsIDY5LCA2MCwgNzAsIDgwLCA3MSwgODcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTIuNjM4NiUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczo3LjMxNzclCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMS4wMjMwJQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDQzNiUKVGhhaUxhbmdNb2RlbCA9ICgKMCwxLDMsMywzLDMsMCwwLDMsMywwLDMsMywwLDMsMywzLDMsMywzLDMsMywwLDAsMywzLDMsMCwzLDMsMywzLAowLDMsMywwLDAsMCwxLDMsMCwzLDMsMiwzLDMsMCwxLDIsMywzLDMsMywwLDIsMCwyLDAsMCwzLDIsMSwyLDIsCjMsMCwzLDMsMiwzLDAsMCwzLDMsMCwzLDMsMCwzLDMsMywzLDMsMywzLDMsMywwLDMsMiwzLDAsMiwyLDIsMywKMCwyLDMsMCwwLDAsMCwxLDAsMSwyLDMsMSwxLDMsMiwyLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLAozLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDMsMywyLDMsMiwzLDMsMiwyLDIsCjMsMSwyLDMsMCwzLDMsMiwyLDEsMiwzLDMsMSwyLDAsMSwzLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwKMywzLDIsMiwzLDMsMywzLDEsMiwzLDMsMywzLDMsMiwyLDIsMiwzLDMsMiwyLDMsMywyLDIsMywyLDMsMiwyLAozLDMsMSwyLDMsMSwyLDIsMywzLDEsMCwyLDEsMCwwLDMsMSwyLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsCjMsMywzLDMsMywzLDIsMiwzLDMsMywzLDIsMywyLDIsMywzLDIsMiwzLDIsMiwyLDIsMSwxLDMsMSwyLDEsMSwKMywyLDEsMCwyLDEsMCwxLDAsMSwxLDAsMSwxLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDMsMiwzLDMsMiwyLDMsMiwzLDMsMiwzLDEsMSwyLDMsMiwyLDIsMywyLDIsMiwyLDIsMSwyLDEsCjIsMiwxLDEsMywzLDIsMSwwLDEsMiwyLDAsMSwzLDAsMCwwLDEsMSwwLDAsMCwwLDAsMiwzLDAsMCwyLDEsMSwKMywzLDIsMywzLDIsMCwwLDMsMywwLDMsMywwLDIsMiwzLDEsMiwyLDEsMSwxLDAsMiwyLDIsMCwyLDIsMSwxLAowLDIsMSwwLDIsMCwwLDIsMCwxLDAsMCwxLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywyLDMsMywyLDAsMCwzLDMsMCwyLDMsMCwyLDEsMiwyLDIsMiwxLDIsMCwwLDIsMiwyLDAsMiwyLDEsMSwKMCwyLDEsMCwyLDAsMCwyLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwzLDIsMywyLDAsMiwyLDEsMywyLDEsMywyLDEsMiwzLDIsMiwzLDAsMiwzLDIsMiwxLDIsMiwyLDIsCjEsMiwyLDAsMCwwLDAsMiwwLDEsMiwwLDEsMSwxLDAsMSwwLDMsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDIsMywzLDIsMywyLDIsMiwzLDIsMiwzLDIsMiwxLDIsMywyLDIsMywxLDMsMiwyLDIsMywyLDIsMiwzLAozLDIsMSwzLDAsMSwxLDEsMCwyLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsCjEsMCwwLDMsMCwzLDMsMywzLDMsMCwwLDMsMCwyLDIsMywzLDMsMywzLDAsMCwwLDEsMSwzLDAsMCwwLDAsMiwKMCwwLDEsMCwwLDAsMCwwLDAsMCwyLDMsMCwwLDAsMywwLDIsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMywzLDMsMywwLDAsMiwzLDAsMCwzLDAsMywzLDIsMywzLDMsMywzLDAsMCwzLDMsMywwLDAsMCwzLDMsCjAsMCwzLDAsMCwwLDAsMiwwLDAsMiwxLDEsMywwLDAsMSwwLDAsMiwzLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywyLDMsMywzLDMsMywzLDMsMSwyLDEsMywzLDIsMiwxLDIsMiwyLDMsMSwxLDIsMCwyLDEsMiwxLAoyLDIsMSwwLDAsMCwxLDEsMCwxLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwyLDEsMiwzLDMsMywwLDIsMCwyLDIsMCwyLDEsMywyLDIsMSwyLDEsMCwwLDIsMiwxLDAsMiwxLDIsMiwKMCwxLDEsMCwwLDAsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMSwzLDMsMSwxLDMsMCwyLDMsMSwxLDMsMiwxLDEsMiwwLDIsMiwzLDIsMSwxLDEsMSwxLDIsCjMsMCwwLDEsMywxLDIsMSwyLDAsMywwLDAsMCwxLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKMywzLDEsMSwzLDIsMywzLDMsMSwzLDIsMSwzLDIsMSwzLDIsMiwyLDIsMSwzLDMsMSwyLDEsMywxLDIsMywwLAoyLDEsMSwzLDIsMiwyLDEsMiwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsCjMsMywyLDMsMiwzLDMsMiwzLDIsMywyLDMsMywyLDEsMCwzLDIsMiwyLDEsMiwyLDIsMSwyLDIsMSwyLDEsMSwKMiwyLDIsMywwLDEsMywxLDEsMSwxLDAsMSwxLDAsMiwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMywyLDIsMSwxLDMsMiwzLDIsMywyLDAsMywyLDIsMSwyLDAsMiwyLDIsMSwyLDIsMiwyLDEsCjMsMiwxLDIsMiwxLDAsMiwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDIsMywxLDIsMywzLDIsMiwzLDAsMSwxLDIsMCwzLDMsMiwyLDMsMCwxLDEsMywwLDAsMCwwLAozLDEsMCwzLDMsMCwyLDAsMiwxLDAsMCwzLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMywyLDMsMywwLDEsMywxLDEsMiwxLDIsMSwxLDMsMSwxLDAsMiwzLDEsMSwxLDEsMSwxLDEsMSwKMywxLDEsMiwyLDIsMiwxLDEsMSwwLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDIsMiwxLDEsMiwxLDMsMywyLDMsMiwyLDMsMiwyLDMsMSwyLDIsMSwyLDAsMywyLDEsMiwyLDIsMiwyLDEsCjMsMiwxLDIsMiwyLDEsMSwxLDEsMCwwLDEsMSwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDEsMywzLDAsMiwxLDAsMywyLDAsMCwzLDEsMCwxLDEsMCwxLDAsMCwwLDAsMCwxLAoxLDAsMCwxLDAsMywyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwyLDIsMiwzLDAsMCwxLDMsMCwzLDIsMCwzLDIsMiwzLDMsMywzLDMsMSwwLDIsMiwyLDAsMiwyLDEsMiwKMCwyLDMsMCwwLDAsMCwxLDAsMSwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDAsMiwzLDEsMywzLDIsMywzLDAsMywzLDAsMywyLDIsMywyLDMsMywzLDAsMCwyLDIsMywwLDEsMSwxLDMsCjAsMCwzLDAsMCwwLDIsMiwwLDEsMywwLDEsMiwyLDIsMywwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwKMywyLDMsMywyLDAsMywzLDIsMiwzLDEsMywyLDEsMywyLDAsMSwyLDIsMCwyLDMsMiwxLDAsMywwLDAsMCwwLAozLDAsMCwyLDMsMSwzLDAsMCwzLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwzLDIsMiwyLDEsMiwwLDEsMywxLDEsMywxLDMsMCwwLDIsMSwxLDEsMSwyLDEsMSwxLDAsMiwxLDAsMSwKMSwyLDAsMCwwLDMsMSwxLDAsMCwwLDAsMSwwLDEsMCwwLDEsMCwxLDAsMCwwLDAsMCwzLDEsMCwwLDAsMSwwLAozLDMsMywzLDIsMiwyLDIsMiwxLDMsMSwxLDEsMiwwLDEsMSwyLDEsMiwxLDMsMiwwLDAsMywxLDEsMSwxLDEsCjMsMSwwLDIsMywwLDAsMCwzLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMiwzLDAsMywzLDAsMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDMsMSwzLDAsMCwxLDIsMCwwLDIsMCwzLDMsMiwzLDMsMywyLDMsMCwwLDIsMiwyLDAsMCwwLDIsMiwKMCwwLDEsMCwwLDAsMCwzLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwzLDEsMywzLDAsMCwxLDAsMywwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMiwzLDEsMiwzLDEsMCwzLDAsMiwyLDEsMCwyLDEsMSwyLDAsMSwwLDAsMSwxLDEsMSwwLDEsMCwwLAoxLDAsMCwwLDAsMSwxLDAsMywwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwxLDAsMSwxLDEsMywxLDIsMiwyLDIsMiwyLDEsMSwxLDEsMCwzLDEsMCwxLDMsMSwxLDEsMSwKMSwxLDAsMiwwLDEsMywxLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwxLAozLDAsMiwyLDEsMywzLDIsMywzLDAsMSwxLDAsMiwyLDEsMiwxLDMsMywxLDAsMCwzLDIsMCwwLDAsMCwyLDEsCjAsMSwwLDAsMCwwLDEsMiwwLDEsMSwzLDEsMSwyLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDEsMCwwLDAsMywwLDAsMywwLDMsMSwwLDEsMSwxLDMsMiwwLDAsMCwzLDAsMCwwLDAsMiwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDMsMiwxLDMsMywxLDIsMiwwLDEsMiwxLDAsMSwyLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsMCwKMywwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMSwyLDAsMywzLDMsMiwyLDAsMSwxLDAsMSwzLDAsMCwwLDIsMiwwLDAsMCwwLDMsMSwwLDEsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDIsMywxLDIsMCwwLDIsMSwwLDMsMSwwLDEsMiwwLDEsMSwxLDEsMywwLDAsMywxLDEsMCwyLDIsMSwxLAowLDIsMCwwLDAsMCwwLDEsMCwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDMsMSwyLDAsMCwyLDIsMCwxLDIsMCwxLDAsMSwzLDEsMiwxLDAsMCwwLDIsMCwzLDAsMCwwLDEsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMSwxLDIsMiwwLDAsMCwyLDAsMiwxLDAsMSwxLDAsMSwxLDEsMiwxLDAsMCwxLDEsMSwwLDIsMSwxLDEsCjAsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwKMCwwLDAsMiwwLDEsMywxLDEsMSwxLDAsMCwwLDAsMywyLDAsMSwwLDAsMCwxLDIsMCwwLDAsMSwwLDAsMCwwLAowLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwzLDMsMywzLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMiwzLDIsMiwwLDAsMCwxLDAsMCwwLDAsMiwzLDIsMSwyLDIsMywwLDAsMCwyLDMsMSwwLDAsMCwxLDEsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMiwwLDEsMCwwLDAsMCwyLDAsMiwwLDEsMCwwLDAsMSwxLDAsMCwwLDIsMSwwLDEsMCwxLDEsMCwwLAowLDEsMCwyLDAsMCwxLDAsMywwLDEsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDAsMCwxLDAsMCwwLDAsMCwxLDEsMiwwLDAsMCwwLDEsMCwwLDEsMywxLDAsMCwwLDAsMSwxLDAsMCwKMCwxLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwxLDEsMSwyLDMsMCwwLDIsMSwxLDEsMSwxLDAsMiwxLDEsMCwwLDAsMiwxLDAsMSwyLDEsMSwwLDEsCjIsMSwwLDMsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwzLDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLAowLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDAsMCwwLDAsMCwwLDEsMiwxLDAsMSwxLDAsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDMsMCwxLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwxLDIsMCwwLDAsMCwwLAozLDMsMCwwLDEsMSwyLDAsMCwxLDIsMSwwLDEsMSwxLDAsMSwxLDAsMCwyLDEsMSwwLDEsMCwwLDEsMSwxLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMSwwLDAsMCwwLDEsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywwLDAsMSwxLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDAsMSwyLDAsMSwyLDAsMCwxLDEsMCwyLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCwwLAoxLDAsMCwxLDAsMSwxLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMSwwLDIsMSwzLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMywKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDEsMCwxLDAsMCwyLDAsMCwyLDAsMCwxLDEsMiwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLAoxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMSwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMywwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwyLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwxLDAsMCwyLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKClRJUzYyMFRoYWlNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBUSVM2MjBDaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBUaGFpTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45MjYzODYsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIlRJUy02MjAiLAogICdsYW5ndWFnZSc6ICdUaGFpJywKfQpQSwMEFAAAAAAAAAAhALUyw2ReKwAAXisAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgw5Z6Z8O8ciBCYXNrxLFuIC0gVHVya2lzaCBMYW5ndWFnZSBNb2RlbAojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW41X1R1cmtpc2hDaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsIDIzLCAzNywgNDcsIDM5LCAyOSwgNTIsIDM2LCA0NSwgNTMsIDYwLCAxNiwgNDksIDIwLCA0NiwgNDIsCiA0OCwgNjksIDQ0LCAzNSwgMzEsIDUxLCAzOCwgNjIsIDY1LCA0MywgNTYsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LCAgMSwgMjEsIDI4LCAxMiwgIDIsIDE4LCAyNywgMjUsICAzLCAyNCwgMTAsICA1LCAxMywgIDQsIDE1LAogMjYsIDY0LCAgNywgIDgsICA5LCAxNCwgMzIsIDU3LCA1OCwgMTEsIDIyLDI1NSwyNTUsMjU1LDI1NSwyNTUsCjE4MCwxNzksMTc4LDE3NywxNzYsMTc1LDE3NCwxNzMsMTcyLDE3MSwxNzAsMTY5LDE2OCwxNjcsMTY2LDE2NSwKMTY0LDE2MywxNjIsMTYxLDE2MCwxNTksMTAxLDE1OCwxNTcsMTU2LDE1NSwxNTQsMTUzLDE1MiwxNTEsMTA2LAoxNTAsMTQ5LDE0OCwxNDcsMTQ2LDE0NSwxNDQsMTAwLDE0MywxNDIsMTQxLDE0MCwxMzksMTM4LDEzNywxMzYsCiA5NCwgODAsIDkzLDEzNSwxMDUsMTM0LDEzMywgNjMsMTMyLDEzMSwxMzAsMTI5LDEyOCwxMjcsMTI2LDEyNSwKMTI0LDEwNCwgNzMsIDk5LCA3OSwgODUsMTIzLCA1NCwxMjIsIDk4LCA5MiwxMjEsMTIwLCA5MSwxMDMsMTE5LAogNjgsMTE4LDExNywgOTcsMTE2LDExNSwgNTAsIDkwLDExNCwxMTMsMTEyLDExMSwgNTUsIDQxLCA0MCwgODYsCiA4OSwgNzAsIDU5LCA3OCwgNzEsIDgyLCA4OCwgMzMsIDc3LCA2NiwgODQsIDgzLDExMCwgNzUsIDYxLCA5NiwKIDMwLCA2NywxMDksIDc0LCA4NywxMDIsIDM0LCA5NSwgODEsMTA4LCA3NiwgNzIsIDE3LCAgNiwgMTksMTA3LAopCgpUdXJraXNoTGFuZ01vZGVsID0gKAozLDIsMywzLDMsMSwzLDMsMywzLDMsMywzLDMsMiwxLDEsMywzLDEsMywzLDAsMywzLDMsMywzLDAsMywxLDMsCjMsMiwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMSwwLDAsMSwKMywyLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDMsMSwwLDMsMywxLDMsMywwLDMsMywzLDMsMywwLDMsMCwzLAozLDEsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDEsCjMsMywyLDMsMywwLDMsMywzLDMsMywzLDMsMiwzLDEsMSwzLDMsMCwzLDMsMSwyLDMsMywzLDMsMCwzLDAsMywKMywxLDEsMCwwLDAsMSwwLDAsMCwwLDEsMSwwLDEsMiwxLDAsMCwwLDEsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywxLDMsMywyLDAsMywyLDEsMiwyLDEsMywzLDAsMCwwLDIsCjIsMiwwLDEsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMSwwLDAsMSwKMywzLDMsMiwzLDMsMSwyLDMsMywzLDMsMywzLDMsMSwzLDIsMSwwLDMsMiwwLDEsMiwzLDMsMiwxLDAsMCwyLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsCjEsMCwxLDMsMywxLDMsMywzLDMsMywzLDMsMSwyLDAsMCwyLDMsMCwyLDMsMCwwLDIsMiwyLDMsMCwzLDAsMSwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDAsMywyLDAsMiwzLDIsMywzLDEsMCwwLDIsCjMsMiwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMiwwLDAsMSwKMywzLDMsMiwzLDMsMiwzLDMsMywzLDIsMywzLDMsMCwzLDMsMCwwLDIsMSwwLDAsMiwzLDIsMiwwLDAsMCwyLAoyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLDAsMSwwLDIsMCwwLDEsCjMsMywzLDIsMywzLDMsMywzLDMsMywyLDMsMywzLDAsMywyLDAsMSwzLDIsMSwxLDMsMiwzLDIsMSwwLDAsMiwKMiwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLAozLDMsMywyLDMsMywzLDMsMywzLDMsMiwzLDMsMywwLDMsMiwyLDAsMiwzLDAsMCwyLDIsMiwyLDAsMCwwLDIsCjMsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwKMywzLDMsMywzLDMsMywyLDIsMiwyLDMsMiwzLDMsMCwzLDMsMSwxLDIsMiwwLDAsMiwyLDMsMiwwLDAsMSwzLAowLDMsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDEsCjMsMywzLDIsMywzLDMsMiwxLDIsMiwzLDIsMywzLDAsMywyLDAsMCwxLDEsMCwxLDEsMiwxLDIsMCwwLDAsMSwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLAozLDMsMywyLDMsMywyLDMsMiwyLDIsMywzLDMsMywxLDMsMSwxLDAsMywyLDEsMSwzLDMsMiwzLDEsMCwwLDEsCjEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMiwwLDAsMSwKMywyLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDIsMSwwLDMsMywxLDMsMywwLDEsMywzLDIsMywwLDMsMCwzLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjIsMiwyLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDAsMCwzLDIsMCwzLDMsMCwzLDIsMywzLDMsMCwzLDEsMywKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDIsMCwxLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwxLDAsMCwxLAozLDMsMywxLDIsMywzLDEsMCwwLDEsMCwwLDMsMywyLDMsMCwwLDIsMCwwLDIsMCwyLDAsMCwwLDIsMCwyLDAsCjAsMywxLDAsMSwwLDAsMCwyLDIsMSwwLDEsMSwyLDEsMiwyLDIsMCwyLDEsMSwwLDAsMCwyLDAsMCwwLDAsMCwKMSwyLDEsMywzLDAsMywzLDMsMywzLDIsMywwLDAsMCwwLDIsMywwLDIsMywxLDAsMiwzLDEsMywwLDMsMCwyLAozLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMywzLDIsMiwzLDIsMiwwLDEsMiwzLDAsMSwyLDEsMCwxLDAsMCwwLDEsMCwyLDIsMCwwLDAsMSwKMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLAozLDMsMywxLDMsMywxLDEsMywzLDEsMSwzLDMsMSwwLDIsMSwyLDAsMiwxLDAsMCwxLDEsMiwxLDAsMCwwLDIsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwwLDIsMSwzLDAsMCwyLDAsMCwzLDMsMCwzLDAsMCwxLDAsMSwyLDAsMCwxLDEsMiwyLDAsMSwwLAowLDEsMiwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMSwxLDEsMiwyLDEsMiwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjMsMywzLDIsMywyLDMsMywwLDIsMiwyLDMsMywzLDAsMywwLDAsMCwyLDIsMCwxLDIsMSwxLDEsMCwwLDAsMSwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAozLDMsMywzLDMsMywyLDEsMiwyLDMsMywzLDMsMiwwLDIsMCwwLDAsMiwyLDAsMCwyLDEsMywzLDAsMCwxLDEsCjEsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwKMSwxLDIsMywzLDAsMywzLDMsMywzLDMsMiwyLDAsMiwwLDIsMywyLDMsMiwyLDIsMiwyLDIsMiwxLDMsMiwzLAoyLDAsMiwxLDIsMiwyLDIsMSwxLDIsMiwxLDIsMiwxLDIsMCwwLDIsMSwxLDAsMiwxLDAsMCwxLDAsMCwwLDEsCjIsMywzLDEsMSwxLDAsMSwxLDEsMiwzLDIsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMiwzLDIsMywyLDIsMSwzLDMsMywwLDIsMSwyLDAsMiwxLDAsMCwxLDEsMSwxLDEsMCwwLDEsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwKMywzLDMsMiwzLDMsMywzLDMsMiwzLDEsMiwzLDMsMSwyLDAsMCwwLDAsMCwwLDAsMywyLDEsMSwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDMsMiwxLDEsMSwxLDEsMywzLDAsMywxLDAsMCwxLDEsMCwwLDMsMSwyLDEsMCwwLDAsMCwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAozLDMsMywyLDIsMywyLDIsMiwzLDIsMSwxLDMsMywwLDMsMCwwLDAsMCwxLDAsMCwzLDEsMSwyLDAsMCwwLDEsCjEsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwxLDEsMywzLDAsMywzLDMsMywzLDIsMiwyLDEsMiwwLDIsMSwyLDIsMSwxLDAsMSwyLDIsMiwyLDIsMiwyLAowLDAsMiwxLDIsMSwyLDEsMCwxLDEsMywxLDIsMSwxLDIsMCwwLDIsMCwxLDAsMSwwLDEsMCwwLDAsMSwwLDEsCjMsMywzLDEsMywzLDMsMCwxLDEsMCwyLDIsMywxLDAsMywwLDAsMCwxLDAsMCwwLDEsMCwwLDEsMCwxLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMiwyLDEsMCwwLDEsMCwwLDMsMywxLDMsMCwwLDEsMSwwLDIsMCwzLDAsMCwwLDIsMCwxLDEsCjAsMSwyLDAsMSwyLDIsMCwyLDIsMiwyLDEsMCwyLDEsMSwwLDIsMCwyLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwzLDIsMywyLDAsMiwyLDIsMSwzLDIsMCwyLDEsMiwwLDEsMiwwLDAsMSwwLDIsMiwwLDAsMCwyLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsCjMsMywzLDAsMywzLDEsMSwyLDMsMSwwLDMsMiwzLDAsMywwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwKMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDMsMCwzLDMsMiwzLDMsMiwyLDAsMCwwLDAsMSwyLDAsMSwzLDAsMCwwLDMsMSwxLDAsMywwLDIsCjIsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwyLDIsMSwwLDMsMSwxLDEsMSwzLDMsMiwzLDAsMCwxLDAsMSwyLDAsMiwyLDAsMiwyLDAsMiwxLAowLDIsMiwxLDEsMSwxLDAsMiwxLDEsMCwxLDEsMSwxLDIsMSwyLDEsMiwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMSwxLDMsMCwwLDEsMSwwLDAsMiwyLDAsMywwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwKMCwzLDEsMCwxLDAsMSwwLDIsMCwwLDEsMCwxLDAsMSwxLDEsMiwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMCwyLDAsMSwxLDEsMCwwLDMsMywwLDIsMCwwLDEsMCwwLDIsMSwxLDAsMSwwLDEsMCwxLDAsCjAsMiwwLDEsMiwwLDIsMCwyLDEsMSwwLDEsMCwyLDEsMSwwLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwKMywyLDMsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDIsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLAowLDAsMSwxLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwyLDEsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMCwyLDMsMCwwLDEsMCwxLDAsMiwzLDIsMywwLDAsMSwzLDAsMiwxLDAsMCwwLDAsMiwwLDEsMCwKMCwyLDEsMCwwLDEsMSwwLDIsMSwwLDAsMSwwLDAsMSwxLDAsMSwxLDIsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLAozLDIsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDMsMSwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywzLDAsMiwzLDIsMiwxLDIsMiwxLDEsMiwwLDEsMywyLDIsMiwwLDAsMiwyLDAsMCwwLDEsMiwxLAozLDAsMiwxLDEsMCwxLDEsMSwwLDEsMiwyLDIsMSwxLDIsMCwwLDAsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDIsMywwLDMsMywzLDIsMiwyLDIsMSwwLDEsMCwxLDAsMSwyLDIsMCwwLDIsMiwxLDMsMSwxLDIsMSwKMCwwLDEsMSwyLDAsMSwxLDAsMCwxLDIsMCwyLDEsMSwyLDAsMCwxLDAsMCwwLDEsMCwxLDAsMSwwLDAsMCwwLAozLDMsMiwwLDAsMywxLDAsMCwwLDAsMCwwLDMsMiwxLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMiwxLDEsMCwwLDEsMCwxLDIsMCwwLDEsMSwwLDAsMiwxLDEsMSwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMCwwLDEsMCwwLDAsMCwxLDAsMCwzLDMsMiwyLDAsMCwxLDAsMCwyLDAsMSwwLDAsMCwyLDAsMSwwLAowLDAsMSwxLDAsMCwyLDAsMiwxLDAsMCwxLDEsMiwxLDIsMCwyLDEsMiwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsCjMsMywyLDAsMCwyLDIsMCwwLDAsMSwxLDAsMiwyLDEsMywxLDAsMSwwLDEsMiwwLDAsMCwwLDAsMSwwLDEsMCwKMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDAsMCwwLDEsMCwwLDEsMCwwLDIsMywxLDIsMCwwLDEsMCwwLDIsMCwwLDAsMSwwLDIsMCwyLDAsCjAsMSwxLDIsMiwxLDIsMCwyLDEsMSwwLDAsMSwxLDAsMSwxLDEsMSwyLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwyLDEsMiwxLDAsMCwxLDEsMCwzLDMsMSwyLDAsMCwxLDAsMCwyLDAsMiwwLDEsMSwyLDAsMCwwLAowLDAsMSwxLDEsMSwyLDAsMSwxLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsCjMsMywzLDAsMiwyLDMsMiwwLDAsMSwwLDAsMiwzLDEsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMiwwLDAsMCwKMCwxLDEsMCwwLDAsMSwwLDAsMSwwLDEsMSwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMiwyLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMCwyLDEsMSwwLDEsMCwyLDEsMSwwLDAsMSwxLDIsMSwwLDIsMCwyLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwKMCwwLDAsMiwyLDAsMiwxLDEsMSwxLDIsMiwwLDAsMSwwLDEsMCwwLDEsMywwLDAsMCwwLDEsMCwwLDIsMSwwLAowLDAsMSwwLDEsMCwwLDAsMCwwLDIsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDIsMywwLDIsMywxLDIsMiwwLDIsMCwwLDIsMCwyLDEsMSwxLDIsMSwwLDAsMSwyLDEsMSwyLDEsMCwKMSwwLDIsMCwxLDAsMSwxLDAsMCwyLDIsMSwyLDEsMSwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMSwyLDAsMCwwLDEsMCwwLDMsMiwwLDEsMCwwLDEsMCwwLDIsMCwwLDAsMSwyLDEsMCwxLDAsCjAsMCwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMiwyLDAsMiwyLDEsMSwwLDEsMSwxLDEsMSwwLDAsMSwyLDEsMSwxLDAsMSwwLDAsMCwxLDEsMSwxLAowLDAsMiwxLDAsMSwxLDEsMCwxLDEsMiwxLDIsMSwxLDIsMCwxLDEsMiwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwyLDAsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwKMCwyLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDIsMCwyLDIsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjIsMCwxLDAsMSwwLDEsMSwwLDAsMSwyLDAsMSwwLDEsMSwwLDAsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDIsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMSwyLDAsMSwwLAowLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMSwwLDEsMSwxLDAsMCwwLDAsMSwyLDAsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAoxLDEsMiwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwKMCwwLDEsMiwyLDAsMiwxLDIsMSwxLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwwLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjIsMiwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwyLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKTGF0aW41VHVya2lzaE1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluNV9UdXJraXNoQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogVHVya2lzaExhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTcwMjkwLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTkiLAogICdsYW5ndWFnZSc6ICdUdXJraXNoJywKfQpQSwMEFAAAAAAAAAAhAOTs8KT6FAAA+hQAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKCkZSRVFfQ0FUX05VTSA9IDQKClVERiA9IDAgICMgdW5kZWZpbmVkCk9USCA9IDEgICMgb3RoZXIKQVNDID0gMiAgIyBhc2NpaSBjYXBpdGFsIGxldHRlcgpBU1MgPSAzICAjIGFzY2lpIHNtYWxsIGxldHRlcgpBQ1YgPSA0ICAjIGFjY2VudCBjYXBpdGFsIHZvd2VsCkFDTyA9IDUgICMgYWNjZW50IGNhcGl0YWwgb3RoZXIKQVNWID0gNiAgIyBhY2NlbnQgc21hbGwgdm93ZWwKQVNPID0gNyAgIyBhY2NlbnQgc21hbGwgb3RoZXIKQ0xBU1NfTlVNID0gOCAgIyB0b3RhbCBjbGFzc2VzCgpMYXRpbjFfQ2hhclRvQ2xhc3MgPSAoCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDAwIC0gMDcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMDggLSAwRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAxMCAtIDE3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDE4IC0gMUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMjAgLSAyNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAyOCAtIDJGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDMwIC0gMzcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMzggLSAzRgogICAgT1RILCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsICAgIyA0MCAtIDQ3CiAgICBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgICAjIDQ4IC0gNEYKICAgIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCAgICMgNTAgLSA1NwogICAgQVNDLCBBU0MsIEFTQywgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA1OCAtIDVGCiAgICBPVEgsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgICAjIDYwIC0gNjcKICAgIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCAgICMgNjggLSA2RgogICAgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsICAgIyA3MCAtIDc3CiAgICBBU1MsIEFTUywgQVNTLCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDc4IC0gN0YKICAgIE9USCwgVURGLCBPVEgsIEFTTywgT1RILCBPVEgsIE9USCwgT1RILCAgICMgODAgLSA4NwogICAgT1RILCBPVEgsIEFDTywgT1RILCBBQ08sIFVERiwgQUNPLCBVREYsICAgIyA4OCAtIDhGCiAgICBVREYsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDkwIC0gOTcKICAgIE9USCwgT1RILCBBU08sIE9USCwgQVNPLCBVREYsIEFTTywgQUNPLCAgICMgOTggLSA5RgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBBMCAtIEE3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEE4IC0gQUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQjAgLSBCNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBCOCAtIEJGCiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ08sIEFDTywgICAjIEMwIC0gQzcKICAgIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCAgICMgQzggLSBDRgogICAgQUNPLCBBQ08sIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBPVEgsICAgIyBEMCAtIEQ3CiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNPLCBBQ08sIEFDTywgICAjIEQ4IC0gREYKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTTywgQVNPLCAgICMgRTAgLSBFNwogICAgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsICAgIyBFOCAtIEVGCiAgICBBU08sIEFTTywgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIE9USCwgICAjIEYwIC0gRjcKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU08sIEFTTywgQVNPLCAgICMgRjggLSBGRgopCgojIDAgOiBpbGxlZ2FsCiMgMSA6IHZlcnkgdW5saWtlbHkKIyAyIDogbm9ybWFsCiMgMyA6IHZlcnkgbGlrZWx5CkxhdGluMUNsYXNzTW9kZWwgPSAoCiMgVURGIE9USCBBU0MgQVNTIEFDViBBQ08gQVNWIEFTTwogICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAjIFVERgogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIE9USAogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIEFTQwogICAgMCwgIDMsICAzLCAgMywgIDEsICAxLCAgMywgIDMsICAjIEFTUwogICAgMCwgIDMsICAzLCAgMywgIDEsICAyLCAgMSwgIDIsICAjIEFDVgogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIEFDTwogICAgMCwgIDMsICAxLCAgMywgIDEsICAxLCAgMSwgIDMsICAjIEFTVgogICAgMCwgIDMsICAxLCAgMywgIDEsICAxLCAgMywgIDMsICAjIEFTTwopCgoKY2xhc3MgTGF0aW4xUHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKExhdGluMVByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9jbGFzcyA9IE5vbmUKICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9jbGFzcyA9IE9USAogICAgICAgIHNlbGYuX2ZyZXFfY291bnRlciA9IFswXSAqIEZSRVFfQ0FUX05VTQogICAgICAgIENoYXJTZXRQcm9iZXIucmVzZXQoc2VsZikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJJU08tODg1OS0xIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBieXRlX3N0ciA9IHNlbGYuZmlsdGVyX3dpdGhfZW5nbGlzaF9sZXR0ZXJzKGJ5dGVfc3RyKQogICAgICAgIGZvciBjIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBjaGFyX2NsYXNzID0gTGF0aW4xX0NoYXJUb0NsYXNzW2NdCiAgICAgICAgICAgIGZyZXEgPSBMYXRpbjFDbGFzc01vZGVsWyhzZWxmLl9sYXN0X2NoYXJfY2xhc3MgKiBDTEFTU19OVU0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhcl9jbGFzc10KICAgICAgICAgICAgaWYgZnJlcSA9PSAwOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXJbZnJlcV0gKz0gMQogICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBjaGFyX2NsYXNzCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgcmV0dXJuIDAuMDEKCiAgICAgICAgdG90YWwgPSBzdW0oc2VsZi5fZnJlcV9jb3VudGVyKQogICAgICAgIGlmIHRvdGFsIDwgMC4wMToKICAgICAgICAgICAgY29uZmlkZW5jZSA9IDAuMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAoKHNlbGYuX2ZyZXFfY291bnRlclszXSAtIHNlbGYuX2ZyZXFfY291bnRlclsxXSAqIDIwLjApCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyB0b3RhbCkKICAgICAgICBpZiBjb25maWRlbmNlIDwgMC4wOgogICAgICAgICAgICBjb25maWRlbmNlID0gMC4wCiAgICAgICAgIyBsb3dlciB0aGUgY29uZmlkZW5jZSBvZiBsYXRpbjEgc28gdGhhdCBvdGhlciBtb3JlIGFjY3VyYXRlCiAgICAgICAgIyBkZXRlY3RvciBjYW4gdGFrZSBwcmlvcml0eS4KICAgICAgICBjb25maWRlbmNlID0gY29uZmlkZW5jZSAqIDAuNzMKICAgICAgICByZXR1cm4gY29uZmlkZW5jZQpQSwMEFAAAAAAAAAAhADZ1GE1VDQAAVQ0AADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNoYXJzZXRwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojICAgUHJvb2Zwb2ludCwgSW5jLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQoKCmNsYXNzIE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICAiIiIKICAgIE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzdXBlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5fX2luaXRfXyhsYW5nX2ZpbHRlcj1sYW5nX2ZpbHRlcikKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IE5vbmUKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IE5vbmUKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBbMCwgMF0KCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIGlmIHNlbGYuY29kaW5nX3NtOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5yZXNldCgpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXI6CiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLnJlc2V0KCkKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBbMCwgMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJ5dGVfc3RyKSk6CiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYnl0ZV9zdHJbaV0pCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgcHJvYmVyIGhpdCBlcnJvciBhdCBieXRlICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcnNldF9uYW1lLCBzZWxmLmxhbmd1YWdlLCBpKQogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGNoYXJfbGVuID0gc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpCiAgICAgICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzFdID0gYnl0ZV9zdHJbMF0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCgogICAgICAgIHNlbGYuX2xhc3RfY2hhclswXSA9IGJ5dGVfc3RyWy0xXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIChzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5nb3RfZW5vdWdoX2RhdGEoKSBhbmQKICAgICAgICAgICAgICAgICAgICAoc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQpKToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpClBLAwQUAAAAAAAAACEArdMRqNwHAADcBwAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3Nncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBQcm9vZnBvaW50LCBJbmMuCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLnV0Zjhwcm9iZXIgaW1wb3J0IFVURjhQcm9iZXIKZnJvbSAuc2ppc3Byb2JlciBpbXBvcnQgU0pJU1Byb2Jlcgpmcm9tIC5ldWNqcHByb2JlciBpbXBvcnQgRVVDSlBQcm9iZXIKZnJvbSAuZ2IyMzEycHJvYmVyIGltcG9ydCBHQjIzMTJQcm9iZXIKZnJvbSAuZXVja3Jwcm9iZXIgaW1wb3J0IEVVQ0tSUHJvYmVyCmZyb20gLmNwOTQ5cHJvYmVyIGltcG9ydCBDUDk0OVByb2Jlcgpmcm9tIC5iaWc1cHJvYmVyIGltcG9ydCBCaWc1UHJvYmVyCmZyb20gLmV1Y3R3cHJvYmVyIGltcG9ydCBFVUNUV1Byb2JlcgoKCmNsYXNzIE1CQ1NHcm91cFByb2JlcihDaGFyU2V0R3JvdXBQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKE1CQ1NHcm91cFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5wcm9iZXJzID0gWwogICAgICAgICAgICBVVEY4UHJvYmVyKCksCiAgICAgICAgICAgIFNKSVNQcm9iZXIoKSwKICAgICAgICAgICAgRVVDSlBQcm9iZXIoKSwKICAgICAgICAgICAgR0IyMzEyUHJvYmVyKCksCiAgICAgICAgICAgIEVVQ0tSUHJvYmVyKCksCiAgICAgICAgICAgIENQOTQ5UHJvYmVyKCksCiAgICAgICAgICAgIEJpZzVQcm9iZXIoKSwKICAgICAgICAgICAgRVVDVFdQcm9iZXIoKQogICAgICAgIF0KICAgICAgICBzZWxmLnJlc2V0KCkKUEsDBBQAAAAAAAAAIQBp9uEPiWMAAIljAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc3NtLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBNYWNoaW5lU3RhdGUKCiMgQklHNQoKQklHNV9DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcgICAgI2FsbG93IDB4MDAgYXMgbGVnYWwgdmFsdWUKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDEsICAjIDc4IC0gN2YKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODAgLSA4NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA4OCAtIDhmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDkwIC0gOTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTggLSA5ZgogICAgNCwzLDMsMywzLDMsMywzLCAgIyBhMCAtIGE3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGE4IC0gYWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgYjAgLSBiNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBiOCAtIGJmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGMwIC0gYzcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYzggLSBjZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBkMCAtIGQ3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywzLDMsMCAgIyBmOCAtIGZmCikKCkJJRzVfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCMxMC0xNwopCgpCSUc1X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDIsIDApCgpCSUc1X1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEJJRzVfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA1LAogICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEJJRzVfU1QsCiAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogQklHNV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAnbmFtZSc6ICdCaWc1J30KCiMgQ1A5NDkKCkNQOTQ5X0NMUyAgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDAsMCwgICMgMDAgLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwwLDEsMSwxLDEsICAjIDEwIC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzZgogICAgMSw0LDQsNCw0LDQsNCw0LCA0LDQsNCw0LDQsNCw0LDQsICAjIDQwIC0gNGYKICAgIDQsNCw1LDUsNSw1LDUsNSwgNSw1LDUsMSwxLDEsMSwxLCAgIyA1MCAtIDVmCiAgICAxLDUsNSw1LDUsNSw1LDUsIDUsNSw1LDUsNSw1LDUsNSwgICMgNjAgLSA2ZgogICAgNSw1LDUsNSw1LDUsNSw1LCA1LDUsNSwxLDEsMSwxLDEsICAjIDcwIC0gN2YKICAgIDAsNiw2LDYsNiw2LDYsNiwgNiw2LDYsNiw2LDYsNiw2LCAgIyA4MCAtIDhmCiAgICA2LDYsNiw2LDYsNiw2LDYsIDYsNiw2LDYsNiw2LDYsNiwgICMgOTAgLSA5ZgogICAgNiw3LDcsNyw3LDcsNyw3LCA3LDcsNyw3LDcsOCw4LDgsICAjIGEwIC0gYWYKICAgIDcsNyw3LDcsNyw3LDcsNywgNyw3LDcsNyw3LDcsNyw3LCAgIyBiMCAtIGJmCiAgICA3LDcsNyw3LDcsNyw5LDIsIDIsMywyLDIsMiwyLDIsMiwgICMgYzAgLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGVmCiAgICAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMCwgICMgZjAgLSBmZgopCgpDUDk0OV9TVCA9ICgKI2Nscz0gICAgMCAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcgICAgICA4ICAgICAgOSAgIyBwcmV2aW91cyBzdGF0ZSA9CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDQsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsICMgTWFjaGluZVN0YXRlLlNUQVJUCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICMgTWFjaGluZVN0YXRlLkVSUk9SCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCAjIE1hY2hpbmVTdGF0ZS5JVFNfTUUKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyAzCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgNAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDUKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyA2CikKCkNQOTQ5X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDIsIDAsIDEsIDEsIDIsIDIsIDAsIDIpCgpDUDk0OV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBDUDk0OV9DTFMsCiAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxMCwKICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogQ1A5NDlfU1QsCiAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IENQOTQ5X0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAnbmFtZSc6ICdDUDk0OSd9CgojIEVVQy1KUAoKRVVDSlBfQ0xTID0gKAogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAwMCAtIDA3CiAgICA0LDQsNCw0LDQsNCw1LDUsICAjIDA4IC0gMGYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMTAgLSAxNwogICAgNCw0LDQsNSw0LDQsNCw0LCAgIyAxOCAtIDFmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDIwIC0gMjcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMjggLSAyZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAzMCAtIDM3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDM4IC0gM2YKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNDAgLSA0NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA0OCAtIDRmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDUwIC0gNTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNTggLSA1ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA2MCAtIDY3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDY4IC0gNmYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNzAgLSA3NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA3OCAtIDdmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIDgwIC0gODcKICAgIDUsNSw1LDUsNSw1LDEsMywgICMgODggLSA4ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA5MCAtIDk3CiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIDk4IC0gOWYKICAgIDUsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCwwLDUgICMgZjggLSBmZgopCgpFVUNKUF9TVCA9ICgKICAgICAgICAgIDMsICAgICA0LCAgICAgMywgICAgIDUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgICAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQjMjAtMjcKKQoKRVVDSlBfQ0hBUl9MRU5fVEFCTEUgPSAoMiwgMiwgMiwgMywgMSwgMCkKCkVVQ0pQX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEVVQ0pQX0NMUywKICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ0pQX1NULAogICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBFVUNKUF9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRVVDLUpQJ30KCiMgRVVDLUtSCgpFVUNLUl9DTFMgID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3CiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDAgLSA0NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0OCAtIDRmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDUwIC0gNTcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTggLSA1ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2MCAtIDY3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDY4IC0gNmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzAgLSA3NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDMsMywzLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDMsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CiAgICAyLDIsMiwyLDIsMiwyLDAgICAjIGY4IC0gZmYKKQoKRVVDS1JfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzA4LTBmCikKCkVVQ0tSX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDIsIDApCgpFVUNLUl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNLUl9DTFMsCiAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNCwKICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ0tSX1NULAogICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDS1JfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAnbmFtZSc6ICdFVUMtS1InfQoKIyBFVUMtVFcKCkVVQ1RXX0NMUyA9ICgKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMDAgLSAwNwogICAgMiwyLDIsMiwyLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDEwIC0gMTcKICAgIDIsMiwyLDAsMiwyLDIsMiwgICMgMTggLSAxZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAyMCAtIDI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDI4IC0gMmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMzAgLSAzNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCw2LDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDMsNCw0LDQsNCw0LDQsICAjIGEwIC0gYTcKICAgIDUsNSwxLDEsMSwxLDEsMSwgICMgYTggLSBhZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyBiMCAtIGI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIGI4IC0gYmYKICAgIDEsMSwzLDEsMywzLDMsMywgICMgYzAgLSBjNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBjOCAtIGNmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQwIC0gZDcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDggLSBkZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBlMCAtIGU3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGU4IC0gZWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZjAgLSBmNwogICAgMywzLDMsMywzLDMsMywwICAgIyBmOCAtIGZmCikKCkVVQ1RXX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLCAgICAgMywgICAgIDMsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgIE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICAgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMyMC0yNwogICAgTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMjgtMmYKKQoKRVVDVFdfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMSwgMiwgMiwgMiwgMykKCkVVQ1RXX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEVVQ1RXX0NMUywKICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA3LAogICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogRVVDVFdfU1QsCiAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBFVUNUV19DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICduYW1lJzogJ3gtZXVjLXR3J30KCiMgR0IyMzEyCgpHQjIzMTJfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3CiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMywzLDMsMywzLDMsMywzLCAgIyAzMCAtIDM3CiAgICAzLDMsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiw0LCAgIyA3OCAtIDdmCiAgICA1LDYsNiw2LDYsNiw2LDYsICAjIDgwIC0gODcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgODggLSA4ZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyA5MCAtIDk3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIDk4IC0gOWYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYTAgLSBhNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBhOCAtIGFmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGIwIC0gYjcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYjggLSBiZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBjMCAtIGM3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGM4IC0gY2YKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDAgLSBkNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkOCAtIGRmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGUwIC0gZTcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZTggLSBlZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBmMCAtIGY3CiAgICA2LDYsNiw2LDYsNiw2LDAgICAjIGY4IC0gZmYKKQoKR0IyMzEyX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwjMTAtMTcKICAgICAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzI4LTJmCikKCiMgVG8gYmUgYWNjdXJhdGUsIHRoZSBsZW5ndGggb2YgY2xhc3MgNiBjYW4gYmUgZWl0aGVyIDIgb3IgNC4KIyBCdXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkaXNjcmltaW5hdGUgYmV0d2VlbiB0aGUgdHdvIHNpbmNlCiMgaXQgaXMgdXNlZCBmb3IgZnJlcXVlbmN5IGFuYWx5c2lzIG9ubHksIGFuZCB3ZSBhcmUgdmFsaWRhdGluZwojIGVhY2ggY29kZSByYW5nZSB0aGVyZSBhcyB3ZWxsLiBTbyBpdCBpcyBzYWZlIHRvIHNldCBpdCB0byBiZQojIDIgaGVyZS4KR0IyMzEyX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDEsIDEsIDEsIDIpCgpHQjIzMTJfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogR0IyMzEyX0NMUywKICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA3LAogICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogR0IyMzEyX1NULAogICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogR0IyMzEyX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnR0IyMzEyJ30KCiMgU2hpZnRfSklTCgpTSklTX0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsMSwgICMgNzggLSA3ZgogICAgMywzLDMsMywzLDIsMiwzLCAgIyA4MCAtIDg3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIDg4IC0gOGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgOTAgLSA5NwogICAgMywzLDMsMywzLDMsMywzLCAgIyA5OCAtIDlmCiAgICAjMHhhMCBpcyBpbGxlZ2FsIGluIHNqaXMgZW5jb2RpbmcsIGJ1dCBzb21lIHBhZ2VzIGRvZXMKICAgICNjb250YWluIHN1Y2ggYnl0ZS4gV2UgbmVlZCB0byBiZSBtb3JlIGVycm9yIGZvcmdpdmVuLgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDQsNCw0LCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywwLDAsMCkgICMgZjggLSBmZgoKClNKSVNfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzEwLTE3CikKClNKSVNfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMSwgMiwgMCwgMCkKClNKSVNfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogU0pJU19DTFMsCiAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBTSklTX1NULAogICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBTSklTX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAnbmFtZSc6ICdTaGlmdF9KSVMnfQoKIyBVQ1MyLUJFCgpVQ1MyQkVfQ0xTID0gKAogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CiAgICAwLDAsMSwwLDAsMiwwLDAsICAjIDA4IC0gMGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwogICAgMCwwLDAsMywwLDAsMCwwLCAgIyAxOCAtIDFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKICAgIDAsMywzLDMsMywzLDAsMCwgICMgMjggLSAyZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTAgLSBhNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhOCAtIGFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGIwIC0gYjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjggLSBiZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjMCAtIGM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGM4IC0gY2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDAgLSBkNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCw0LDUgICAjIGY4IC0gZmYKKQoKVUNTMkJFX1NUICA9ICgKICAgICAgICAgIDUsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICAgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5JVFNfTUUsICAgICA2LCAgICAgNiwjMTgtMWYKICAgICAgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA1LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLCMyMC0yNwogICAgICAgICAgNSwgICAgIDgsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAgICAgNiwgICAgIDYsIzI4LTJmCiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMzAtMzcKKQoKVUNTMkJFX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDAsIDIsIDIpCgpVQ1MyQkVfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogVUNTMkJFX0NMUywKICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogVUNTMkJFX1NULAogICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogVUNTMkJFX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTE2QkUnfQoKIyBVQ1MyLUxFCgpVQ1MyTEVfQ0xTID0gKAogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CiAgICAwLDAsMSwwLDAsMiwwLDAsICAjIDA4IC0gMGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwogICAgMCwwLDAsMywwLDAsMCwwLCAgIyAxOCAtIDFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKICAgIDAsMywzLDMsMywzLDAsMCwgICMgMjggLSAyZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTAgLSBhNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhOCAtIGFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGIwIC0gYjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjggLSBiZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjMCAtIGM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGM4IC0gY2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDAgLSBkNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCw0LDUgICAjIGY4IC0gZmYKKQoKVUNTMkxFX1NUID0gKAogICAgICAgICAgNiwgICAgIDYsICAgICA3LCAgICAgNiwgICAgIDQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICAgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsICAgICA2LCMxOC0xZgogICAgICAgICAgNywgICAgIDYsICAgICA4LCAgICAgOCwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsIzIwLTI3CiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwjMjgtMmYKICAgICAgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMzMC0zNwopCgpVQ1MyTEVfQ0hBUl9MRU5fVEFCTEUgPSAoMiwgMiwgMiwgMiwgMiwgMikKClVDUzJMRV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBVQ1MyTEVfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFVDUzJMRV9TVCwKICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBVQ1MyTEVfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTE2TEUnfQoKIyBVVEYtOAoKVVRGOF9DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcgICNhbGxvdyAweDAwIGFzIGEgbGVnYWwgdmFsdWUKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0MCAtIDQ3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQ4IC0gNGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTAgLSA1NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1OCAtIDVmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDYwIC0gNjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjggLSA2ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3MCAtIDc3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDc4IC0gN2YKICAgIDIsMiwyLDIsMywzLDMsMywgICMgODAgLSA4NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA4OCAtIDhmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDkwIC0gOTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTggLSA5ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBhMCAtIGE3CiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGE4IC0gYWYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYjAgLSBiNwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBiOCAtIGJmCiAgICAwLDAsNiw2LDYsNiw2LDYsICAjIGMwIC0gYzcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYzggLSBjZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkMCAtIGQ3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQ4IC0gZGYKICAgIDcsOCw4LDgsOCw4LDgsOCwgICMgZTAgLSBlNwogICAgOCw4LDgsOCw4LDksOCw4LCAgIyBlOCAtIGVmCiAgICAxMCwxMSwxMSwxMSwxMSwxMSwxMSwxMSwgICMgZjAgLSBmNwogICAgMTIsMTMsMTMsMTMsMTQsMTUsMCwwICAgICMgZjggLSBmZgopCgpVVEY4X1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICAxMiwgICAxMCwjMDAtMDcKICAgICAgICAgOSwgICAgIDExLCAgICAgOCwgICAgIDcsICAgICA2LCAgICAgNSwgICAgIDQsICAgIDMsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMjgtMmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzMwLTM3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMzOC0zZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNDAtNDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzQ4LTRmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNywgICAgIDcsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM1MC01NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNTgtNWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzYwLTY3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM2OC02ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDksICAgICA5LCAgICAgOSwgICAgIDksTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNzAtNzcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzc4LTdmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgOSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM4MC04NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjODgtOGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgIDEyLCAgICAxMiwgICAgMTIsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzkwLTk3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM5OC05ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgMTIsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYTAtYTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2E4LWFmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAxMiwgICAgMTIsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNiMC1iNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYjgtYmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2MwLWM3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SICNjOC1jZgopCgpVVEY4X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDAsIDAsIDAsIDAsIDIsIDMsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYpCgpVVEY4X1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFVURjhfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxNiwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBVVEY4X1NULAogICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFVURjhfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTgnfQpQSwMEFAAAAAAAAAAhAB517x4ZFgAAGRYAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zYmNoYXJzZXRwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBDaGFyYWN0ZXJDYXRlZ29yeSwgUHJvYmluZ1N0YXRlLCBTZXF1ZW5jZUxpa2VsaWhvb2QKCgpjbGFzcyBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIFNBTVBMRV9TSVpFID0gNjQKICAgIFNCX0VOT1VHSF9SRUxfVEhSRVNIT0xEID0gMTAyNCAgIyAgMC4yNSAqIFNBTVBMRV9TSVpFXjIKICAgIFBPU0lUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRCA9IDAuOTUKICAgIE5FR0FUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRCA9IDAuMDUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWwsIHJldmVyc2VkPUZhbHNlLCBuYW1lX3Byb2Jlcj1Ob25lKToKICAgICAgICBzdXBlcihTaW5nbGVCeXRlQ2hhclNldFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX21vZGVsID0gbW9kZWwKICAgICAgICAjIFRSVUUgaWYgd2UgbmVlZCB0byByZXZlcnNlIGV2ZXJ5IHBhaXIgaW4gdGhlIG1vZGVsIGxvb2t1cAogICAgICAgIHNlbGYuX3JldmVyc2VkID0gcmV2ZXJzZWQKICAgICAgICAjIE9wdGlvbmFsIGF1eGlsaWFyeSBwcm9iZXIgZm9yIG5hbWUgZGVjaXNpb24KICAgICAgICBzZWxmLl9uYW1lX3Byb2JlciA9IG5hbWVfcHJvYmVyCiAgICAgICAgc2VsZi5fbGFzdF9vcmRlciA9IE5vbmUKICAgICAgICBzZWxmLl9zZXFfY291bnRlcnMgPSBOb25lCiAgICAgICAgc2VsZi5fdG90YWxfc2VxcyA9IE5vbmUKICAgICAgICBzZWxmLl90b3RhbF9jaGFyID0gTm9uZQogICAgICAgIHNlbGYuX2ZyZXFfY2hhciA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICAjIGNoYXIgb3JkZXIgb2YgbGFzdCBjaGFyYWN0ZXIKICAgICAgICBzZWxmLl9sYXN0X29yZGVyID0gMjU1CiAgICAgICAgc2VsZi5fc2VxX2NvdW50ZXJzID0gWzBdICogU2VxdWVuY2VMaWtlbGlob29kLmdldF9udW1fY2F0ZWdvcmllcygpCiAgICAgICAgc2VsZi5fdG90YWxfc2VxcyA9IDAKICAgICAgICBzZWxmLl90b3RhbF9jaGFyID0gMAogICAgICAgICMgY2hhcmFjdGVycyB0aGF0IGZhbGwgaW4gb3VyIHNhbXBsaW5nIHJhbmdlCiAgICAgICAgc2VsZi5fZnJlcV9jaGFyID0gMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9uYW1lX3Byb2JlcjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVfcHJvYmVyLmNoYXJzZXRfbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2RlbFsnY2hhcnNldF9uYW1lJ10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9uYW1lX3Byb2JlcjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVfcHJvYmVyLmxhbmd1YWdlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsLmdldCgnbGFuZ3VhZ2UnKQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBpZiBub3Qgc2VsZi5fbW9kZWxbJ2tlZXBfZW5nbGlzaF9sZXR0ZXInXToKICAgICAgICAgICAgYnl0ZV9zdHIgPSBzZWxmLmZpbHRlcl9pbnRlcm5hdGlvbmFsX3dvcmRzKGJ5dGVfc3RyKQogICAgICAgIGlmIG5vdCBieXRlX3N0cjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICBjaGFyX3RvX29yZGVyX21hcCA9IHNlbGYuX21vZGVsWydjaGFyX3RvX29yZGVyX21hcCddCiAgICAgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKGJ5dGVfc3RyKToKICAgICAgICAgICAgIyBYWFg6IE9yZGVyIGlzIGluIHJhbmdlIDEtNjQsIHNvIG9uZSB3b3VsZCB0aGluayB3ZSB3YW50IDAtNjMgaGVyZSwKICAgICAgICAgICAgIyAgICAgIGJ1dCB0aGF0IGxlYWRzIHRvIDI3IG1vcmUgdGVzdCBmYWlsdXJlcyB0aGFuIGJlZm9yZS4KICAgICAgICAgICAgb3JkZXIgPSBjaGFyX3RvX29yZGVyX21hcFtjXQogICAgICAgICAgICAjIFhYWDogVGhpcyB3YXMgU1lNQk9MX0NBVF9PUkRFUiBiZWZvcmUsIHdpdGggYSB2YWx1ZSBvZiAyNTAsIGJ1dAogICAgICAgICAgICAjICAgICAgQ2hhcmFjdGVyQ2F0ZWdvcnkuU1lNQk9MIGlzIGFjdHVhbGx5IDI1Mywgc28gd2UgdXNlIENPTlRST0wKICAgICAgICAgICAgIyAgICAgIHRvIG1ha2UgaXQgY2xvc2VyIHRvIHRoZSBvcmlnaW5hbCBpbnRlbnQuIFRoZSBvbmx5IGRpZmZlcmVuY2UKICAgICAgICAgICAgIyAgICAgIGlzIHdoZXRoZXIgb3Igbm90IHdlIGNvdW50IGRpZ2l0cyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzIGZvcgogICAgICAgICAgICAjICAgICAgX3RvdGFsX2NoYXIgcHVycG9zZXMuCiAgICAgICAgICAgIGlmIG9yZGVyIDwgQ2hhcmFjdGVyQ2F0ZWdvcnkuQ09OVFJPTDoKICAgICAgICAgICAgICAgIHNlbGYuX3RvdGFsX2NoYXIgKz0gMQogICAgICAgICAgICBpZiBvcmRlciA8IHNlbGYuU0FNUExFX1NJWkU6CiAgICAgICAgICAgICAgICBzZWxmLl9mcmVxX2NoYXIgKz0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5fbGFzdF9vcmRlciA8IHNlbGYuU0FNUExFX1NJWkU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfc2VxcyArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3JldmVyc2VkOgogICAgICAgICAgICAgICAgICAgICAgICBpID0gKHNlbGYuX2xhc3Rfb3JkZXIgKiBzZWxmLlNBTVBMRV9TSVpFKSArIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gc2VsZi5fbW9kZWxbJ3ByZWNlZGVuY2VfbWF0cml4J11baV0KICAgICAgICAgICAgICAgICAgICBlbHNlOiAgIyByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgbGV0dGVycyBpbiB0aGUgbG9va3VwCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAob3JkZXIgKiBzZWxmLlNBTVBMRV9TSVpFKSArIHNlbGYuX2xhc3Rfb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBzZWxmLl9tb2RlbFsncHJlY2VkZW5jZV9tYXRyaXgnXVtpXQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlcV9jb3VudGVyc1ttb2RlbF0gKz0gMQogICAgICAgICAgICBzZWxmLl9sYXN0X29yZGVyID0gb3JkZXIKCiAgICAgICAgY2hhcnNldF9uYW1lID0gc2VsZi5fbW9kZWxbJ2NoYXJzZXRfbmFtZSddCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiBzZWxmLl90b3RhbF9zZXFzID4gc2VsZi5TQl9FTk9VR0hfUkVMX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBzZWxmLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgICAgIGlmIGNvbmZpZGVuY2UgPiBzZWxmLlBPU0lUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgY29uZmlkZW5jZSA9ICVzLCB3ZSBoYXZlIGEgd2lubmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUsIGNvbmZpZGVuY2UpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGVsaWYgY29uZmlkZW5jZSA8IHNlbGYuTkVHQVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyBjb25maWRlbmNlID0gJXMsIGJlbG93IG5lZ2F0aXZlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvcnRjdXQgdGhyZXNoaG9sZCAlcycsIGNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTkVHQVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICByID0gMC4wMQogICAgICAgIGlmIHNlbGYuX3RvdGFsX3NlcXMgPiAwOgogICAgICAgICAgICByID0gKCgxLjAgKiBzZWxmLl9zZXFfY291bnRlcnNbU2VxdWVuY2VMaWtlbGlob29kLlBPU0lUSVZFXSkgLwogICAgICAgICAgICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgLyBzZWxmLl9tb2RlbFsndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyddKQogICAgICAgICAgICByID0gciAqIHNlbGYuX2ZyZXFfY2hhciAvIHNlbGYuX3RvdGFsX2NoYXIKICAgICAgICAgICAgaWYgciA+PSAxLjA6CiAgICAgICAgICAgICAgICByID0gMC45OQogICAgICAgIHJldHVybiByClBLAwQUAAAAAAAAACEAiv5PoNoNAADaDQAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY3Nncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLnNiY2hhcnNldHByb2JlciBpbXBvcnQgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAubGFuZ2N5cmlsbGljbW9kZWwgaW1wb3J0IChXaW4xMjUxQ3lyaWxsaWNNb2RlbCwgS29pOHJNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRpbjVDeXJpbGxpY01vZGVsLCBNYWNDeXJpbGxpY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElibTg2Nk1vZGVsLCBJYm04NTVNb2RlbCkKZnJvbSAubGFuZ2dyZWVrbW9kZWwgaW1wb3J0IExhdGluN0dyZWVrTW9kZWwsIFdpbjEyNTNHcmVla01vZGVsCmZyb20gLmxhbmdidWxnYXJpYW5tb2RlbCBpbXBvcnQgTGF0aW41QnVsZ2FyaWFuTW9kZWwsIFdpbjEyNTFCdWxnYXJpYW5Nb2RlbAojIGZyb20gLmxhbmdodW5nYXJpYW5tb2RlbCBpbXBvcnQgTGF0aW4ySHVuZ2FyaWFuTW9kZWwsIFdpbjEyNTBIdW5nYXJpYW5Nb2RlbApmcm9tIC5sYW5ndGhhaW1vZGVsIGltcG9ydCBUSVM2MjBUaGFpTW9kZWwKZnJvbSAubGFuZ2hlYnJld21vZGVsIGltcG9ydCBXaW4xMjU1SGVicmV3TW9kZWwKZnJvbSAuaGVicmV3cHJvYmVyIGltcG9ydCBIZWJyZXdQcm9iZXIKZnJvbSAubGFuZ3R1cmtpc2htb2RlbCBpbXBvcnQgTGF0aW41VHVya2lzaE1vZGVsCgoKY2xhc3MgU0JDU0dyb3VwUHJvYmVyKENoYXJTZXRHcm91cFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0JDU0dyb3VwUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5wcm9iZXJzID0gWwogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUxQ3lyaWxsaWNNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKEtvaThyTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTWFjQ3lyaWxsaWNNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKElibTg2Nk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoSWJtODU1TW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjdHcmVla01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1M0dyZWVrTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVCdWxnYXJpYW5Nb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTFCdWxnYXJpYW5Nb2RlbCksCiAgICAgICAgICAgICMgVE9ETzogUmVzdG9yZSBIdW5nYXJpYW4gZW5jb2RpbmdzIChpc28tODg1OS0yIGFuZCB3aW5kb3dzLTEyNTApCiAgICAgICAgICAgICMgICAgICAgYWZ0ZXIgd2UgcmV0cmFpbiBtb2RlbC4KICAgICAgICAgICAgIyBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjJIdW5nYXJpYW5Nb2RlbCksCiAgICAgICAgICAgICMgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1MEh1bmdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoVElTNjIwVGhhaU1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW41VHVya2lzaE1vZGVsKSwKICAgICAgICBdCiAgICAgICAgaGVicmV3X3Byb2JlciA9IEhlYnJld1Byb2JlcigpCiAgICAgICAgbG9naWNhbF9oZWJyZXdfcHJvYmVyID0gU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1NUhlYnJld01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCBoZWJyZXdfcHJvYmVyKQogICAgICAgIHZpc3VhbF9oZWJyZXdfcHJvYmVyID0gU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1NUhlYnJld01vZGVsLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVicmV3X3Byb2JlcikKICAgICAgICBoZWJyZXdfcHJvYmVyLnNldF9tb2RlbF9wcm9iZXJzKGxvZ2ljYWxfaGVicmV3X3Byb2JlciwgdmlzdWFsX2hlYnJld19wcm9iZXIpCiAgICAgICAgc2VsZi5wcm9iZXJzLmV4dGVuZChbaGVicmV3X3Byb2JlciwgbG9naWNhbF9oZWJyZXdfcHJvYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbF9oZWJyZXdfcHJvYmVyXSkKCiAgICAgICAgc2VsZi5yZXNldCgpClBLAwQUAAAAAAAAACEA1pFnMr4OAAC+DgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IFNKSVNEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5qcGNudHggaW1wb3J0IFNKSVNDb250ZXh0QW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBTSklTX1NNX01PREVMCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQoKCmNsYXNzIFNKSVNQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKFNKSVNfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplciA9IFNKSVNDb250ZXh0QW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihTSklTUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGV4dF9hbmFseXplci5jaGFyc2V0X25hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkphcGFuZXNlIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYnl0ZV9zdHIpKToKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhclsyIC0gY2hhcl9sZW46XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgKyAxIC0gY2hhcl9sZW46aSArIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNoYXJfbGVuXSwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuY29udGV4dF9hbmFseXplci5nb3RfZW5vdWdoX2RhdGEoKSBhbmQKICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBjb250ZXh0X2NvbmYgPSBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIGRpc3RyaWJfY29uZiA9IHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICByZXR1cm4gbWF4KGNvbnRleHRfY29uZiwgZGlzdHJpYl9jb25mKQpQSwMEFAAAAAAAAAAhAHWARz3FMAAAxTAAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIiIiCk1vZHVsZSBjb250YWluaW5nIHRoZSBVbml2ZXJzYWxEZXRlY3RvciBkZXRlY3RvciBjbGFzcywgd2hpY2ggaXMgdGhlIHByaW1hcnkKY2xhc3MgYSB1c2VyIG9mIGBgY2hhcmRldGBgIHNob3VsZCB1c2UuCgo6YXV0aG9yOiBNYXJrIFBpbGdyaW0gKGluaXRpYWwgcG9ydCB0byBQeXRob24pCjphdXRob3I6IFNoeSBTaGFsb20gKG9yaWdpbmFsIEMgY29kZSkKOmF1dGhvcjogRGFuIEJsYW5jaGFyZCAobWFqb3IgcmVmYWN0b3JpbmcgZm9yIDMuMCkKOmF1dGhvcjogSWFuIENvcmRhc2NvCiIiIgoKCmltcG9ydCBjb2RlY3MKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgpmcm9tIC5jaGFyc2V0Z3JvdXBwcm9iZXIgaW1wb3J0IENoYXJTZXRHcm91cFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgSW5wdXRTdGF0ZSwgTGFuZ3VhZ2VGaWx0ZXIsIFByb2JpbmdTdGF0ZQpmcm9tIC5lc2Nwcm9iZXIgaW1wb3J0IEVzY0NoYXJTZXRQcm9iZXIKZnJvbSAubGF0aW4xcHJvYmVyIGltcG9ydCBMYXRpbjFQcm9iZXIKZnJvbSAubWJjc2dyb3VwcHJvYmVyIGltcG9ydCBNQkNTR3JvdXBQcm9iZXIKZnJvbSAuc2Jjc2dyb3VwcHJvYmVyIGltcG9ydCBTQkNTR3JvdXBQcm9iZXIKCgpjbGFzcyBVbml2ZXJzYWxEZXRlY3RvcihvYmplY3QpOgogICAgIiIiCiAgICBUaGUgYGBVbml2ZXJzYWxEZXRlY3RvcmBgIGNsYXNzIHVuZGVybGllcyB0aGUgYGBjaGFyZGV0LmRldGVjdGBgIGZ1bmN0aW9uCiAgICBhbmQgY29vcmRpbmF0ZXMgYWxsIG9mIHRoZSBkaWZmZXJlbnQgY2hhcnNldCBwcm9iZXJzLgoKICAgIFRvIGdldCBhIGBgZGljdGBgIGNvbnRhaW5pbmcgYW4gZW5jb2RpbmcgYW5kIGl0cyBjb25maWRlbmNlLCB5b3UgY2FuIHNpbXBseQogICAgcnVuOgoKICAgIC4uIGNvZGU6OgoKICAgICAgICAgICAgdSA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgICAgICAgICAgdS5mZWVkKHNvbWVfYnl0ZXMpCiAgICAgICAgICAgIHUuY2xvc2UoKQogICAgICAgICAgICBkZXRlY3RlZCA9IHUucmVzdWx0CgogICAgIiIiCgogICAgTUlOSU1VTV9USFJFU0hPTEQgPSAwLjIwCiAgICBISUdIX0JZVEVfREVURUNUT1IgPSByZS5jb21waWxlKGInW1x4ODAtXHhGRl0nKQogICAgRVNDX0RFVEVDVE9SID0gcmUuY29tcGlsZShiJyhcMDMzfH57KScpCiAgICBXSU5fQllURV9ERVRFQ1RPUiA9IHJlLmNvbXBpbGUoYidbXHg4MC1ceDlGXScpCiAgICBJU09fV0lOX01BUCA9IHsnaXNvLTg4NTktMSc6ICdXaW5kb3dzLTEyNTInLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTInOiAnV2luZG93cy0xMjUwJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS01JzogJ1dpbmRvd3MtMTI1MScsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNic6ICdXaW5kb3dzLTEyNTYnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTcnOiAnV2luZG93cy0xMjUzJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS04JzogJ1dpbmRvd3MtMTI1NScsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktOSc6ICdXaW5kb3dzLTEyNTQnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTEzJzogJ1dpbmRvd3MtMTI1Nyd9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPUxhbmd1YWdlRmlsdGVyLkFMTCk6CiAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyID0gTm9uZQogICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycyA9IFtdCiAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCiAgICAgICAgc2VsZi5kb25lID0gTm9uZQogICAgICAgIHNlbGYuX2dvdF9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IE5vbmUKICAgICAgICBzZWxmLmxhbmdfZmlsdGVyID0gbGFuZ19maWx0ZXIKICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgICAgIHNlbGYuX2hhc193aW5fYnl0ZXMgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc2V0IHRoZSBVbml2ZXJzYWxEZXRlY3RvciBhbmQgYWxsIG9mIGl0cyBwcm9iZXJzIGJhY2sgdG8gdGhlaXIKICAgICAgICBpbml0aWFsIHN0YXRlcy4gIFRoaXMgaXMgY2FsbGVkIGJ5IGBgX19pbml0X19gYCwgc28geW91IG9ubHkgbmVlZCB0bwogICAgICAgIGNhbGwgdGhpcyBkaXJlY3RseSBpbiBiZXR3ZWVuIGFuYWx5c2VzIG9mIGRpZmZlcmVudCBkb2N1bWVudHMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogTm9uZSwgJ2NvbmZpZGVuY2UnOiAwLjAsICdsYW5ndWFnZSc6IE5vbmV9CiAgICAgICAgc2VsZi5kb25lID0gRmFsc2UKICAgICAgICBzZWxmLl9nb3RfZGF0YSA9IEZhbHNlCiAgICAgICAgc2VsZi5faGFzX3dpbl9ieXRlcyA9IEZhbHNlCiAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBJbnB1dFN0YXRlLlBVUkVfQVNDSUkKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBiJycKICAgICAgICBpZiBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXI6CiAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5yZXNldCgpCiAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgIHByb2Jlci5yZXNldCgpCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGEgY2h1bmsgb2YgYSBkb2N1bWVudCBhbmQgZmVlZHMgaXQgdGhyb3VnaCBhbGwgb2YgdGhlIHJlbGV2YW50CiAgICAgICAgY2hhcnNldCBwcm9iZXJzLgoKICAgICAgICBBZnRlciBjYWxsaW5nIGBgZmVlZGBgLCB5b3UgY2FuIGNoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgYGBkb25lYGAKICAgICAgICBhdHRyaWJ1dGUgdG8gc2VlIGlmIHlvdSBuZWVkIHRvIGNvbnRpbnVlIGZlZWRpbmcgdGhlCiAgICAgICAgYGBVbml2ZXJzYWxEZXRlY3RvcmBgIG1vcmUgZGF0YSwgb3IgaWYgaXQgaGFzIG1hZGUgYSBwcmVkaWN0aW9uCiAgICAgICAgKGluIHRoZSBgYHJlc3VsdGBgIGF0dHJpYnV0ZSkuCgogICAgICAgIC4uIG5vdGU6OgogICAgICAgICAgIFlvdSBzaG91bGQgYWx3YXlzIGNhbGwgYGBjbG9zZWBgIHdoZW4geW91J3JlIGRvbmUgZmVlZGluZyBpbiB5b3VyCiAgICAgICAgICAgZG9jdW1lbnQgaWYgYGBkb25lYGAgaXMgbm90IGFscmVhZHkgYGBUcnVlYGAuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbm90IGxlbihieXRlX3N0cik6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShieXRlX3N0ciwgYnl0ZWFycmF5KToKICAgICAgICAgICAgYnl0ZV9zdHIgPSBieXRlYXJyYXkoYnl0ZV9zdHIpCgogICAgICAgICMgRmlyc3QgY2hlY2sgZm9yIGtub3duIEJPTXMsIHNpbmNlIHRoZXNlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QKICAgICAgICBpZiBub3Qgc2VsZi5fZ290X2RhdGE6CiAgICAgICAgICAgICMgSWYgdGhlIGRhdGEgc3RhcnRzIHdpdGggQk9NLCB3ZSBrbm93IGl0IGlzIFVURgogICAgICAgICAgICBpZiBieXRlX3N0ci5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGOCk6CiAgICAgICAgICAgICAgICAjIEVGIEJCIEJGICBVVEYtOCB3aXRoIEJPTQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlVURi04LVNJRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQogICAgICAgICAgICBlbGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoKGNvZGVjcy5CT01fVVRGMzJfTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYzMl9CRSkpOgogICAgICAgICAgICAgICAgIyBGRiBGRSAwMCAwMCAgVVRGLTMyLCBsaXR0bGUtZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgIyAwMCAwMCBGRSBGRiAgVVRGLTMyLCBiaWctZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlVURi0zMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQogICAgICAgICAgICBlbGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoYidceEZFXHhGRlx4MDBceDAwJyk6CiAgICAgICAgICAgICAgICAjIEZFIEZGIDAwIDAwICBVQ1MtNCwgdW51c3VhbCBvY3RldCBvcmRlciBCT00gKDM0MTIpCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiWC1JU08tMTA2NDYtVUNTLTQtMzQxMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQogICAgICAgICAgICBlbGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoYidceDAwXHgwMFx4RkZceEZFJyk6CiAgICAgICAgICAgICAgICAjIDAwIDAwIEZGIEZFICBVQ1MtNCwgdW51c3VhbCBvY3RldCBvcmRlciBCT00gKDIxNDMpCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiWC1JU08tMTA2NDYtVUNTLTQtMjE0MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQogICAgICAgICAgICBlbGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoKGNvZGVjcy5CT01fTEUsIGNvZGVjcy5CT01fQkUpKToKICAgICAgICAgICAgICAgICMgRkYgRkUgIFVURi0xNiwgbGl0dGxlIGVuZGlhbiBCT00KICAgICAgICAgICAgICAgICMgRkUgRkYgIFVURi0xNiwgYmlnIGVuZGlhbiBCT00KICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJVVEYtMTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KCiAgICAgICAgICAgIHNlbGYuX2dvdF9kYXRhID0gVHJ1ZQogICAgICAgICAgICBpZiBzZWxmLnJlc3VsdFsnZW5jb2RpbmcnXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIElmIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmQgd2UndmUgb25seSBzZWUgQVNDSUkgc28gZmFyLCBjaGVjawogICAgICAgICMgZm9yIGhpZ2ggYnl0ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICBpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLlBVUkVfQVNDSUk6CiAgICAgICAgICAgIGlmIHNlbGYuSElHSF9CWVRFX0RFVEVDVE9SLnNlYXJjaChieXRlX3N0cik6CiAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IElucHV0U3RhdGUuSElHSF9CWVRFCiAgICAgICAgICAgIGVsaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgc2VsZi5FU0NfREVURUNUT1Iuc2VhcmNoKHNlbGYuX2xhc3RfY2hhciArIGJ5dGVfc3RyKToKICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gSW5wdXRTdGF0ZS5FU0NfQVNDSUkKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gYnl0ZV9zdHJbLTE6XQoKICAgICAgICAjIElmIHdlJ3ZlIHNlZW4gZXNjYXBlIHNlcXVlbmNlcywgdXNlIHRoZSBFc2NDaGFyU2V0UHJvYmVyLCB3aGljaAogICAgICAgICMgdXNlcyBhIHNpbXBsZSBzdGF0ZSBtYWNoaW5lIHRvIGNoZWNrIGZvciBrbm93biBlc2NhcGUgc2VxdWVuY2VzIGluCiAgICAgICAgIyBIWiBhbmQgSVNPLTIwMjIgZW5jb2RpbmdzLCBzaW5jZSB0aG9zZSBhcmUgdGhlIG9ubHkgZW5jb2RpbmdzIHRoYXQKICAgICAgICAjIHVzZSBzdWNoIHNlcXVlbmNlcy4KICAgICAgICBpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLkVTQ19BU0NJSToKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlcjoKICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlciA9IEVzY0NoYXJTZXRQcm9iZXIoc2VsZi5sYW5nX2ZpbHRlcikKICAgICAgICAgICAgaWYgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLmZlZWQoYnl0ZV9zdHIpID09IFByb2JpbmdTdGF0ZS5GT1VORF9JVDoKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLmdldF9jb25maWRlbmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLmxhbmd1YWdlfQogICAgICAgICAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQogICAgICAgICMgSWYgd2UndmUgc2VlbiBoaWdoIGJ5dGVzIChpLmUuLCB0aG9zZSB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMTI3KSwKICAgICAgICAjIHdlIG5lZWQgdG8gZG8gbW9yZSBjb21wbGljYXRlZCBjaGVja3MgdXNpbmcgYWxsIG91ciBtdWx0aS1ieXRlIGFuZAogICAgICAgICMgc2luZ2xlLWJ5dGUgcHJvYmVycyB0aGF0IGFyZSBsZWZ0LiAgVGhlIHNpbmdsZS1ieXRlIHByb2JlcnMKICAgICAgICAjIHVzZSBjaGFyYWN0ZXIgYmlncmFtIGRpc3RyaWJ1dGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZywgd2hlcmVhcwogICAgICAgICMgdGhlIG11bHRpLWJ5dGUgcHJvYmVycyB1c2UgYSBjb21iaW5hdGlvbiBvZiBjaGFyYWN0ZXIgdW5pZ3JhbSBhbmQKICAgICAgICAjIGJpZ3JhbSBkaXN0cmlidXRpb25zLgogICAgICAgIGVsaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5ISUdIX0JZVEU6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMgPSBbTUJDU0dyb3VwUHJvYmVyKHNlbGYubGFuZ19maWx0ZXIpXQogICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBjaGVja2luZyBub24tQ0pLIGVuY29kaW5ncywgdXNlIHNpbmdsZS1ieXRlIHByb2JlcgogICAgICAgICAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLk5PTl9DSks6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzLmFwcGVuZChTQkNTR3JvdXBQcm9iZXIoKSkKICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycy5hcHBlbmQoTGF0aW4xUHJvYmVyKCkpCiAgICAgICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgaWYgcHJvYmVyLmZlZWQoYnl0ZV9zdHIpID09IFByb2JpbmdTdGF0ZS5GT1VORF9JVDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiBwcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogcHJvYmVyLmdldF9jb25maWRlbmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogcHJvYmVyLmxhbmd1YWdlfQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBzZWxmLldJTl9CWVRFX0RFVEVDVE9SLnNlYXJjaChieXRlX3N0cik6CiAgICAgICAgICAgICAgICBzZWxmLl9oYXNfd2luX2J5dGVzID0gVHJ1ZQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTdG9wIGFuYWx5emluZyB0aGUgY3VycmVudCBkb2N1bWVudCBhbmQgY29tZSB1cCB3aXRoIGEgZmluYWwKICAgICAgICBwcmVkaWN0aW9uLgoKICAgICAgICA6cmV0dXJuczogIFRoZSBgYHJlc3VsdGBgIGF0dHJpYnV0ZSwgYSBgYGRpY3RgYCB3aXRoIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICBgZW5jb2RpbmdgLCBgY29uZmlkZW5jZWAsIGFuZCBgbGFuZ3VhZ2VgLgogICAgICAgICIiIgogICAgICAgICMgRG9uJ3QgYm90aGVyIHdpdGggY2hlY2tzIGlmIHdlJ3JlIGFscmVhZHkgZG9uZQogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0CiAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQoKICAgICAgICBpZiBub3Qgc2VsZi5fZ290X2RhdGE6CiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdubyBkYXRhIHJlY2VpdmVkIScpCgogICAgICAgICMgRGVmYXVsdCB0byBBU0NJSSBpZiBpdCBpcyBhbGwgd2UndmUgc2VlbiBzbyBmYXIKICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuUFVSRV9BU0NJSToKICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogJ2FzY2lpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQoKICAgICAgICAjIElmIHdlIGhhdmUgc2VlbiBub24tQVNDSUksIHJldHVybiB0aGUgYmVzdCB0aGF0IG1ldCBNSU5JTVVNX1RIUkVTSE9MRAogICAgICAgIGVsaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5ISUdIX0JZVEU6CiAgICAgICAgICAgIHByb2Jlcl9jb25maWRlbmNlID0gTm9uZQogICAgICAgICAgICBtYXhfcHJvYmVyX2NvbmZpZGVuY2UgPSAwLjAKICAgICAgICAgICAgbWF4X3Byb2JlciA9IE5vbmUKICAgICAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICBpZiBub3QgcHJvYmVyOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBwcm9iZXJfY29uZmlkZW5jZSA9IHByb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICBpZiBwcm9iZXJfY29uZmlkZW5jZSA+IG1heF9wcm9iZXJfY29uZmlkZW5jZToKICAgICAgICAgICAgICAgICAgICBtYXhfcHJvYmVyX2NvbmZpZGVuY2UgPSBwcm9iZXJfY29uZmlkZW5jZQogICAgICAgICAgICAgICAgICAgIG1heF9wcm9iZXIgPSBwcm9iZXIKICAgICAgICAgICAgaWYgbWF4X3Byb2JlciBhbmQgKG1heF9wcm9iZXJfY29uZmlkZW5jZSA+IHNlbGYuTUlOSU1VTV9USFJFU0hPTEQpOgogICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lID0gbWF4X3Byb2Jlci5jaGFyc2V0X25hbWUKICAgICAgICAgICAgICAgIGxvd2VyX2NoYXJzZXRfbmFtZSA9IG1heF9wcm9iZXIuY2hhcnNldF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBtYXhfcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgICAgICMgVXNlIFdpbmRvd3MgZW5jb2RpbmcgbmFtZSBpbnN0ZWFkIG9mIElTTy04ODU5IGlmIHdlIHNhdyBhbnkKICAgICAgICAgICAgICAgICMgZXh0cmEgV2luZG93cy1zcGVjaWZpYyBieXRlcwogICAgICAgICAgICAgICAgaWYgbG93ZXJfY2hhcnNldF9uYW1lLnN0YXJ0c3dpdGgoJ2lzby04ODU5Jyk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faGFzX3dpbl9ieXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lID0gc2VsZi5JU09fV0lOX01BUC5nZXQobG93ZXJfY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUpCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiBjaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IGNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiBtYXhfcHJvYmVyLmxhbmd1YWdlfQoKICAgICAgICAjIExvZyBhbGwgcHJvYmVyIGNvbmZpZGVuY2VzIGlmIG5vbmUgbWV0IE1JTklNVU1fVEhSRVNIT0xECiAgICAgICAgaWYgc2VsZi5sb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA9PSBsb2dnaW5nLkRFQlVHOgogICAgICAgICAgICBpZiBzZWxmLnJlc3VsdFsnZW5jb2RpbmcnXSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ25vIHByb2JlcnMgaGl0IG1pbmltdW0gdGhyZXNob2xkJykKICAgICAgICAgICAgICAgIGZvciBncm91cF9wcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBncm91cF9wcm9iZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShncm91cF9wcm9iZXIsIENoYXJTZXRHcm91cFByb2Jlcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9iZXIgaW4gZ3JvdXBfcHJvYmVyLnByb2JlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgY29uZmlkZW5jZSA9ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIubGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgY29uZmlkZW5jZSA9ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSkKICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHQKUEsDBBQAAAAAAAAAIQD1v7w9zgoAAM4KAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5tYmNzc20gaW1wb3J0IFVURjhfU01fTU9ERUwKCgoKY2xhc3MgVVRGOFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIE9ORV9DSEFSX1BST0IgPSAwLjUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoVVRGOFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKFVURjhfU01fTU9ERUwpCiAgICAgICAgc2VsZi5fbnVtX21iX2NoYXJzID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihVVEY4UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20ucmVzZXQoKQogICAgICAgIHNlbGYuX251bV9tYl9jaGFycyA9IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJ1dGYtOCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGMgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYykKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkgPj0gMjoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9udW1fbWJfY2hhcnMgKz0gMQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgdW5saWtlID0gMC45OQogICAgICAgIGlmIHNlbGYuX251bV9tYl9jaGFycyA8IDY6CiAgICAgICAgICAgIHVubGlrZSAqPSBzZWxmLk9ORV9DSEFSX1BST0IgKiogc2VsZi5fbnVtX21iX2NoYXJzCiAgICAgICAgICAgIHJldHVybiAxLjAgLSB1bmxpa2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdW5saWtlClBLAwQUAAAAAAAAACEAR8eQ1/IAAADyAAAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3ZlcnNpb24ucHkiIiIKVGhpcyBtb2R1bGUgZXhpc3RzIG9ubHkgdG8gc2ltcGxpZnkgcmV0cmlldmluZyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgY2hhcmRldApmcm9tIHdpdGhpbiBzZXR1cC5weSBhbmQgZnJvbSBjaGFyZGV0IHN1YnBhY2thZ2VzLgoKOmF1dGhvcjogRGFuIEJsYW5jaGFyZCAoZGFuLmJsYW5jaGFyZEBnbWFpbC5jb20pCiIiIgoKX192ZXJzaW9uX18gPSAiMy4wLjQiClZFUlNJT04gPSBfX3ZlcnNpb25fXy5zcGxpdCgnLicpClBLAwQUAAAAAAAAACEAWNRpOfAAAADwAAAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9fX2luaXRfXy5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmZyb20gLmluaXRpYWxpc2UgaW1wb3J0IGluaXQsIGRlaW5pdCwgcmVpbml0LCBjb2xvcmFtYV90ZXh0CmZyb20gLmFuc2kgaW1wb3J0IEZvcmUsIEJhY2ssIFN0eWxlLCBDdXJzb3IKZnJvbSAuYW5zaXRvd2luMzIgaW1wb3J0IEFuc2lUb1dpbjMyCgpfX3ZlcnNpb25fXyA9ICcwLjMuNycKClBLAwQUAAAAAAAAACEAPhWnX9wJAADcCQAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KJycnClRoaXMgbW9kdWxlIGdlbmVyYXRlcyBBTlNJIGNoYXJhY3RlciBjb2RlcyB0byBwcmludGluZyBjb2xvcnMgdG8gdGVybWluYWxzLgpTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZQonJycKCkNTSSA9ICdcMDMzWycKT1NDID0gJ1wwMzNdJwpCRUwgPSAnXDAwNycKCgpkZWYgY29kZV90b19jaGFycyhjb2RlKToKICAgIHJldHVybiBDU0kgKyBzdHIoY29kZSkgKyAnbScKCmRlZiBzZXRfdGl0bGUodGl0bGUpOgogICAgcmV0dXJuIE9TQyArICcyOycgKyB0aXRsZSArIEJFTAoKZGVmIGNsZWFyX3NjcmVlbihtb2RlPTIpOgogICAgcmV0dXJuIENTSSArIHN0cihtb2RlKSArICdKJwoKZGVmIGNsZWFyX2xpbmUobW9kZT0yKToKICAgIHJldHVybiBDU0kgKyBzdHIobW9kZSkgKyAnSycKCgpjbGFzcyBBbnNpQ29kZXMob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIHRoZSBzdWJjbGFzc2VzIGRlY2xhcmUgY2xhc3MgYXR0cmlidXRlcyB3aGljaCBhcmUgbnVtYmVycy4KICAgICAgICAjIFVwb24gaW5zdGFudGlhdGlvbiB3ZSBkZWZpbmUgaW5zdGFuY2UgYXR0cmlidXRlcywgd2hpY2ggYXJlIHRoZSBzYW1lCiAgICAgICAgIyBhcyB0aGUgY2xhc3MgYXR0cmlidXRlcyBidXQgd3JhcHBlZCB3aXRoIHRoZSBBTlNJIGVzY2FwZSBzZXF1ZW5jZQogICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKToKICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGNvZGVfdG9fY2hhcnModmFsdWUpKQoKCmNsYXNzIEFuc2lDdXJzb3Iob2JqZWN0KToKICAgIGRlZiBVUChzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnQScKICAgIGRlZiBET1dOKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdCJwogICAgZGVmIEZPUldBUkQoc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0MnCiAgICBkZWYgQkFDSyhzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnRCcKICAgIGRlZiBQT1Moc2VsZiwgeD0xLCB5PTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIoeSkgKyAnOycgKyBzdHIoeCkgKyAnSCcKCgpjbGFzcyBBbnNpRm9yZShBbnNpQ29kZXMpOgogICAgQkxBQ0sgICAgICAgICAgID0gMzAKICAgIFJFRCAgICAgICAgICAgICA9IDMxCiAgICBHUkVFTiAgICAgICAgICAgPSAzMgogICAgWUVMTE9XICAgICAgICAgID0gMzMKICAgIEJMVUUgICAgICAgICAgICA9IDM0CiAgICBNQUdFTlRBICAgICAgICAgPSAzNQogICAgQ1lBTiAgICAgICAgICAgID0gMzYKICAgIFdISVRFICAgICAgICAgICA9IDM3CiAgICBSRVNFVCAgICAgICAgICAgPSAzOQoKICAgICMgVGhlc2UgYXJlIGZhaXJseSB3ZWxsIHN1cHBvcnRlZCwgYnV0IG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KICAgIExJR0hUQkxBQ0tfRVggICA9IDkwCiAgICBMSUdIVFJFRF9FWCAgICAgPSA5MQogICAgTElHSFRHUkVFTl9FWCAgID0gOTIKICAgIExJR0hUWUVMTE9XX0VYICA9IDkzCiAgICBMSUdIVEJMVUVfRVggICAgPSA5NAogICAgTElHSFRNQUdFTlRBX0VYID0gOTUKICAgIExJR0hUQ1lBTl9FWCAgICA9IDk2CiAgICBMSUdIVFdISVRFX0VYICAgPSA5NwoKCmNsYXNzIEFuc2lCYWNrKEFuc2lDb2Rlcyk6CiAgICBCTEFDSyAgICAgICAgICAgPSA0MAogICAgUkVEICAgICAgICAgICAgID0gNDEKICAgIEdSRUVOICAgICAgICAgICA9IDQyCiAgICBZRUxMT1cgICAgICAgICAgPSA0MwogICAgQkxVRSAgICAgICAgICAgID0gNDQKICAgIE1BR0VOVEEgICAgICAgICA9IDQ1CiAgICBDWUFOICAgICAgICAgICAgPSA0NgogICAgV0hJVEUgICAgICAgICAgID0gNDcKICAgIFJFU0VUICAgICAgICAgICA9IDQ5CgogICAgIyBUaGVzZSBhcmUgZmFpcmx5IHdlbGwgc3VwcG9ydGVkLCBidXQgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgogICAgTElHSFRCTEFDS19FWCAgID0gMTAwCiAgICBMSUdIVFJFRF9FWCAgICAgPSAxMDEKICAgIExJR0hUR1JFRU5fRVggICA9IDEwMgogICAgTElHSFRZRUxMT1dfRVggID0gMTAzCiAgICBMSUdIVEJMVUVfRVggICAgPSAxMDQKICAgIExJR0hUTUFHRU5UQV9FWCA9IDEwNQogICAgTElHSFRDWUFOX0VYICAgID0gMTA2CiAgICBMSUdIVFdISVRFX0VYICAgPSAxMDcKCgpjbGFzcyBBbnNpU3R5bGUoQW5zaUNvZGVzKToKICAgIEJSSUdIVCAgICA9IDEKICAgIERJTSAgICAgICA9IDIKICAgIE5PUk1BTCAgICA9IDIyCiAgICBSRVNFVF9BTEwgPSAwCgpGb3JlICAgPSBBbnNpRm9yZSgpCkJhY2sgICA9IEFuc2lCYWNrKCkKU3R5bGUgID0gQW5zaVN0eWxlKCkKQ3Vyc29yID0gQW5zaUN1cnNvcigpClBLAwQUAAAAAAAAACEAx2PA2cQlAADEJQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpdG93aW4zMi5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBvcwoKZnJvbSAuYW5zaSBpbXBvcnQgQW5zaUZvcmUsIEFuc2lCYWNrLCBBbnNpU3R5bGUsIFN0eWxlCmZyb20gLndpbnRlcm0gaW1wb3J0IFdpblRlcm0sIFdpbkNvbG9yLCBXaW5TdHlsZQpmcm9tIC53aW4zMiBpbXBvcnQgd2luZGxsLCB3aW5hcGlfdGVzdAoKCndpbnRlcm0gPSBOb25lCmlmIHdpbmRsbCBpcyBub3QgTm9uZToKICAgIHdpbnRlcm0gPSBXaW5UZXJtKCkKCgpkZWYgaXNfc3RyZWFtX2Nsb3NlZChzdHJlYW0pOgogICAgcmV0dXJuIG5vdCBoYXNhdHRyKHN0cmVhbSwgJ2Nsb3NlZCcpIG9yIHN0cmVhbS5jbG9zZWQKCgpkZWYgaXNfYV90dHkoc3RyZWFtKToKICAgIHJldHVybiBoYXNhdHRyKHN0cmVhbSwgJ2lzYXR0eScpIGFuZCBzdHJlYW0uaXNhdHR5KCkKCgpjbGFzcyBTdHJlYW1XcmFwcGVyKG9iamVjdCk6CiAgICAnJycKICAgIFdyYXBzIGEgc3RyZWFtIChzdWNoIGFzIHN0ZG91dCksIGFjdGluZyBhcyBhIHRyYW5zcGFyZW50IHByb3h5IGZvciBhbGwKICAgIGF0dHJpYnV0ZSBhY2Nlc3MgYXBhcnQgZnJvbSBtZXRob2QgJ3dyaXRlKCknLCB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gb3VyCiAgICBDb252ZXJ0ZXIgaW5zdGFuY2UuCiAgICAnJycKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cmFwcGVkLCBjb252ZXJ0ZXIpOgogICAgICAgICMgZG91YmxlLXVuZGVyc2NvcmUgZXZlcnl0aGluZyB0byBwcmV2ZW50IGNsYXNoZXMgd2l0aCBuYW1lcyBvZgogICAgICAgICMgYXR0cmlidXRlcyBvbiB0aGUgd3JhcHBlZCBzdHJlYW0gb2JqZWN0LgogICAgICAgIHNlbGYuX193cmFwcGVkID0gd3JhcHBlZAogICAgICAgIHNlbGYuX19jb252ZXJ0b3IgPSBjb252ZXJ0ZXIKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX3dyYXBwZWQsIG5hbWUpCgogICAgZGVmIHdyaXRlKHNlbGYsIHRleHQpOgogICAgICAgIHNlbGYuX19jb252ZXJ0b3Iud3JpdGUodGV4dCkKCgpjbGFzcyBBbnNpVG9XaW4zMihvYmplY3QpOgogICAgJycnCiAgICBJbXBsZW1lbnRzIGEgJ3dyaXRlKCknIG1ldGhvZCB3aGljaCwgb24gV2luZG93cywgd2lsbCBzdHJpcCBBTlNJIGNoYXJhY3RlcgogICAgc2VxdWVuY2VzIGZyb20gdGhlIHRleHQsIGFuZCBpZiBvdXRwdXR0aW5nIHRvIGEgdHR5LCB3aWxsIGNvbnZlcnQgdGhlbSBpbnRvCiAgICB3aW4zMiBmdW5jdGlvbiBjYWxscy4KICAgICcnJwogICAgQU5TSV9DU0lfUkUgPSByZS5jb21waWxlKCdcMDAxP1wwMzNcWygoPzpcZHw7KSopKFthLXpBLVpdKVwwMDI/JykgICAgICMgQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyCiAgICBBTlNJX09TQ19SRSA9IHJlLmNvbXBpbGUoJ1wwMDE/XDAzM1xdKCg/Oi58OykqPykoXHgwNylcMDAyPycpICAgICAgICAgIyBPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCwgY29udmVydD1Ob25lLCBzdHJpcD1Ob25lLCBhdXRvcmVzZXQ9RmFsc2UpOgogICAgICAgICMgVGhlIHdyYXBwZWQgc3RyZWFtIChub3JtYWxseSBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIpCiAgICAgICAgc2VsZi53cmFwcGVkID0gd3JhcHBlZAoKICAgICAgICAjIHNob3VsZCB3ZSByZXNldCBjb2xvcnMgdG8gZGVmYXVsdHMgYWZ0ZXIgZXZlcnkgLndyaXRlKCkKICAgICAgICBzZWxmLmF1dG9yZXNldCA9IGF1dG9yZXNldAoKICAgICAgICAjIGNyZWF0ZSB0aGUgcHJveHkgd3JhcHBpbmcgb3VyIG91dHB1dCBzdHJlYW0KICAgICAgICBzZWxmLnN0cmVhbSA9IFN0cmVhbVdyYXBwZXIod3JhcHBlZCwgc2VsZikKCiAgICAgICAgb25fd2luZG93cyA9IG9zLm5hbWUgPT0gJ250JwogICAgICAgICMgV2UgdGVzdCBpZiB0aGUgV2luQVBJIHdvcmtzLCBiZWNhdXNlIGV2ZW4gaWYgd2UgYXJlIG9uIFdpbmRvd3MKICAgICAgICAjIHdlIG1heSBiZSB1c2luZyBhIHRlcm1pbmFsIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZSBXaW5BUEkKICAgICAgICAjIChlLmcuIEN5Z3dpbiBUZXJtaW5hbCkuIEluIHRoaXMgY2FzZSBpdCdzIHVwIHRvIHRoZSB0ZXJtaW5hbAogICAgICAgICMgdG8gc3VwcG9ydCB0aGUgQU5TSSBjb2Rlcy4KICAgICAgICBjb252ZXJzaW9uX3N1cHBvcnRlZCA9IG9uX3dpbmRvd3MgYW5kIHdpbmFwaV90ZXN0KCkKCiAgICAgICAgIyBzaG91bGQgd2Ugc3RyaXAgQU5TSSBzZXF1ZW5jZXMgZnJvbSBvdXIgb3V0cHV0PwogICAgICAgIGlmIHN0cmlwIGlzIE5vbmU6CiAgICAgICAgICAgIHN0cmlwID0gY29udmVyc2lvbl9zdXBwb3J0ZWQgb3IgKG5vdCBpc19zdHJlYW1fY2xvc2VkKHdyYXBwZWQpIGFuZCBub3QgaXNfYV90dHkod3JhcHBlZCkpCiAgICAgICAgc2VsZi5zdHJpcCA9IHN0cmlwCgogICAgICAgICMgc2hvdWxkIHdlIHNob3VsZCBjb252ZXJ0IEFOU0kgc2VxdWVuY2VzIGludG8gd2luMzIgY2FsbHM/CiAgICAgICAgaWYgY29udmVydCBpcyBOb25lOgogICAgICAgICAgICBjb252ZXJ0ID0gY29udmVyc2lvbl9zdXBwb3J0ZWQgYW5kIG5vdCBpc19zdHJlYW1fY2xvc2VkKHdyYXBwZWQpIGFuZCBpc19hX3R0eSh3cmFwcGVkKQogICAgICAgIHNlbGYuY29udmVydCA9IGNvbnZlcnQKCiAgICAgICAgIyBkaWN0IG9mIGFuc2kgY29kZXMgdG8gd2luMzIgZnVuY3Rpb25zIGFuZCBwYXJhbWV0ZXJzCiAgICAgICAgc2VsZi53aW4zMl9jYWxscyA9IHNlbGYuZ2V0X3dpbjMyX2NhbGxzKCkKCiAgICAgICAgIyBhcmUgd2Ugd3JhcHBpbmcgc3RkZXJyPwogICAgICAgIHNlbGYub25fc3RkZXJyID0gc2VsZi53cmFwcGVkIGlzIHN5cy5zdGRlcnIKCiAgICBkZWYgc2hvdWxkX3dyYXAoc2VsZik6CiAgICAgICAgJycnCiAgICAgICAgVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGFjdHVhbGx5IG5lZWRlZC4gSWYgZmFsc2UsIHRoZW4gdGhlIG91dHB1dAogICAgICAgIHN0cmVhbSB3aWxsIG5vdCBiZSBhZmZlY3RlZCwgbm9yIHdpbGwgd2luMzIgY2FsbHMgYmUgaXNzdWVkLCBzbwogICAgICAgIHdyYXBwaW5nIHN0ZG91dCBpcyBub3QgYWN0dWFsbHkgcmVxdWlyZWQuIFRoaXMgd2lsbCBnZW5lcmFsbHkgYmUKICAgICAgICBGYWxzZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHVubGVzcyBvcHRpb25hbCBmdW5jdGlvbmFsaXR5IGxpa2UKICAgICAgICBhdXRvcmVzZXQgaGFzIGJlZW4gcmVxdWVzdGVkIHVzaW5nIGt3YXJncyB0byBpbml0KCkKICAgICAgICAnJycKICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0IG9yIHNlbGYuc3RyaXAgb3Igc2VsZi5hdXRvcmVzZXQKCiAgICBkZWYgZ2V0X3dpbjMyX2NhbGxzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuY29udmVydCBhbmQgd2ludGVybToKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5SRVNFVF9BTEw6ICh3aW50ZXJtLnJlc2V0X2FsbCwgKSwKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5CUklHSFQ6ICh3aW50ZXJtLnN0eWxlLCBXaW5TdHlsZS5CUklHSFQpLAogICAgICAgICAgICAgICAgQW5zaVN0eWxlLkRJTTogKHdpbnRlcm0uc3R5bGUsIFdpblN0eWxlLk5PUk1BTCksCiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuTk9STUFMOiAod2ludGVybS5zdHlsZSwgV2luU3R5bGUuTk9STUFMKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkJMQUNLOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTEFDSyksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5SRUQ6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLlJFRCksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5HUkVFTjogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFRU4pLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuWUVMTE9XOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5ZRUxMT1cpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuQkxVRTogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxVRSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5NQUdFTlRBOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5NQUdFTlRBKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkNZQU46ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkNZQU4pLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuV0hJVEU6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRVkpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuUkVTRVQ6ICh3aW50ZXJtLmZvcmUsICksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVEJMQUNLX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTEFDSywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVFJFRF9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuUkVELCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUR1JFRU5fRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRUVOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUWUVMTE9XX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5ZRUxMT1csIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRCTFVFX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTFVFLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUTUFHRU5UQV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuTUFHRU5UQSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVENZQU5fRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkNZQU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRXSElURV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFWSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5CTEFDSzogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxBQ0spLAogICAgICAgICAgICAgICAgQW5zaUJhY2suUkVEOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5SRUQpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suR1JFRU46ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRUVOKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLllFTExPVzogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuWUVMTE9XKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkJMVUU6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMVUUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTUFHRU5UQTogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuTUFHRU5UQSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5DWUFOOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5DWUFOKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLldISVRFOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVZKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLlJFU0VUOiAod2ludGVybS5iYWNrLCApLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRCTEFDS19FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxBQ0ssIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRSRURfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLlJFRCwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVEdSRUVOX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVFTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVFlFTExPV19FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuWUVMTE9XLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQkxVRV9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxVRSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVE1BR0VOVEFfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLk1BR0VOVEEsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRDWUFOX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5DWUFOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUV0hJVEVfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRVksIFRydWUpLAogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpY3QoKQoKICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKICAgICAgICBpZiBzZWxmLnN0cmlwIG9yIHNlbGYuY29udmVydDoKICAgICAgICAgICAgc2VsZi53cml0ZV9hbmRfY29udmVydCh0ZXh0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZSh0ZXh0KQogICAgICAgICAgICBzZWxmLndyYXBwZWQuZmx1c2goKQogICAgICAgIGlmIHNlbGYuYXV0b3Jlc2V0OgogICAgICAgICAgICBzZWxmLnJlc2V0X2FsbCgpCgoKICAgIGRlZiByZXNldF9hbGwoc2VsZik6CiAgICAgICAgaWYgc2VsZi5jb252ZXJ0OgogICAgICAgICAgICBzZWxmLmNhbGxfd2luMzIoJ20nLCAoMCwpKQogICAgICAgIGVsaWYgbm90IHNlbGYuc3RyaXAgYW5kIG5vdCBpc19zdHJlYW1fY2xvc2VkKHNlbGYud3JhcHBlZCk6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZShTdHlsZS5SRVNFVF9BTEwpCgoKICAgIGRlZiB3cml0ZV9hbmRfY29udmVydChzZWxmLCB0ZXh0KToKICAgICAgICAnJycKICAgICAgICBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBvdXIgd3JhcHBlZCBzdHJlYW0sIHN0cmlwcGluZyBhbnkgQU5TSQogICAgICAgIHNlcXVlbmNlcyBmcm9tIHRoZSB0ZXh0LCBhbmQgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gaW50byB3aW4zMgogICAgICAgIGNhbGxzLgogICAgICAgICcnJwogICAgICAgIGN1cnNvciA9IDAKICAgICAgICB0ZXh0ID0gc2VsZi5jb252ZXJ0X29zYyh0ZXh0KQogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLkFOU0lfQ1NJX1JFLmZpbmRpdGVyKHRleHQpOgogICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCiAgICAgICAgICAgIHNlbGYud3JpdGVfcGxhaW5fdGV4dCh0ZXh0LCBjdXJzb3IsIHN0YXJ0KQogICAgICAgICAgICBzZWxmLmNvbnZlcnRfYW5zaSgqbWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgICAgIGN1cnNvciA9IGVuZAogICAgICAgIHNlbGYud3JpdGVfcGxhaW5fdGV4dCh0ZXh0LCBjdXJzb3IsIGxlbih0ZXh0KSkKCgogICAgZGVmIHdyaXRlX3BsYWluX3RleHQoc2VsZiwgdGV4dCwgc3RhcnQsIGVuZCk6CiAgICAgICAgaWYgc3RhcnQgPCBlbmQ6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZSh0ZXh0W3N0YXJ0OmVuZF0pCiAgICAgICAgICAgIHNlbGYud3JhcHBlZC5mbHVzaCgpCgoKICAgIGRlZiBjb252ZXJ0X2Fuc2koc2VsZiwgcGFyYW1zdHJpbmcsIGNvbW1hbmQpOgogICAgICAgIGlmIHNlbGYuY29udmVydDoKICAgICAgICAgICAgcGFyYW1zID0gc2VsZi5leHRyYWN0X3BhcmFtcyhjb21tYW5kLCBwYXJhbXN0cmluZykKICAgICAgICAgICAgc2VsZi5jYWxsX3dpbjMyKGNvbW1hbmQsIHBhcmFtcykKCgogICAgZGVmIGV4dHJhY3RfcGFyYW1zKHNlbGYsIGNvbW1hbmQsIHBhcmFtc3RyaW5nKToKICAgICAgICBpZiBjb21tYW5kIGluICdIZic6CiAgICAgICAgICAgIHBhcmFtcyA9IHR1cGxlKGludChwKSBpZiBsZW4ocCkgIT0gMCBlbHNlIDEgZm9yIHAgaW4gcGFyYW1zdHJpbmcuc3BsaXQoJzsnKSkKICAgICAgICAgICAgd2hpbGUgbGVuKHBhcmFtcykgPCAyOgogICAgICAgICAgICAgICAgIyBkZWZhdWx0czoKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyArICgxLCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXJhbXMgPSB0dXBsZShpbnQocCkgZm9yIHAgaW4gcGFyYW1zdHJpbmcuc3BsaXQoJzsnKSBpZiBsZW4ocCkgIT0gMCkKICAgICAgICAgICAgaWYgbGVuKHBhcmFtcykgPT0gMDoKICAgICAgICAgICAgICAgICMgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICBpZiBjb21tYW5kIGluICdKS20nOgogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgwLCkKICAgICAgICAgICAgICAgIGVsaWYgY29tbWFuZCBpbiAnQUJDRCc6CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gKDEsKQoKICAgICAgICByZXR1cm4gcGFyYW1zCgoKICAgIGRlZiBjYWxsX3dpbjMyKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CiAgICAgICAgaWYgY29tbWFuZCA9PSAnbSc6CiAgICAgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CiAgICAgICAgICAgICAgICBpZiBwYXJhbSBpbiBzZWxmLndpbjMyX2NhbGxzOgogICAgICAgICAgICAgICAgICAgIGZ1bmNfYXJncyA9IHNlbGYud2luMzJfY2FsbHNbcGFyYW1dCiAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGZ1bmNfYXJnc1swXQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBmdW5jX2FyZ3NbMTpdCiAgICAgICAgICAgICAgICAgICAga3dhcmdzID0gZGljdChvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgICAgICAgICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdKJzoKICAgICAgICAgICAgd2ludGVybS5lcmFzZV9zY3JlZW4ocGFyYW1zWzBdLCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdLJzoKICAgICAgICAgICAgd2ludGVybS5lcmFzZV9saW5lKHBhcmFtc1swXSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSGYnOiAgICAgIyBjdXJzb3IgcG9zaXRpb24gLSBhYnNvbHV0ZQogICAgICAgICAgICB3aW50ZXJtLnNldF9jdXJzb3JfcG9zaXRpb24ocGFyYW1zLCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdBQkNEJzogICAjIGN1cnNvciBwb3NpdGlvbiAtIHJlbGF0aXZlCiAgICAgICAgICAgIG4gPSBwYXJhbXNbMF0KICAgICAgICAgICAgIyBBIC0gdXAsIEIgLSBkb3duLCBDIC0gZm9yd2FyZCwgRCAtIGJhY2sKICAgICAgICAgICAgeCwgeSA9IHsnQSc6ICgwLCAtbiksICdCJzogKDAsIG4pLCAnQyc6IChuLCAwKSwgJ0QnOiAoLW4sIDApfVtjb21tYW5kXQogICAgICAgICAgICB3aW50ZXJtLmN1cnNvcl9hZGp1c3QoeCwgeSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQoKCiAgICBkZWYgY29udmVydF9vc2Moc2VsZiwgdGV4dCk6CiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuQU5TSV9PU0NfUkUuZmluZGl0ZXIodGV4dCk6CiAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKCkKICAgICAgICAgICAgdGV4dCA9IHRleHRbOnN0YXJ0XSArIHRleHRbZW5kOl0KICAgICAgICAgICAgcGFyYW1zdHJpbmcsIGNvbW1hbmQgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBpZiBjb21tYW5kIGluICdceDA3JzogICAgICAgIyBceDA3ID0gQkVMCiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXN0cmluZy5zcGxpdCgiOyIpCiAgICAgICAgICAgICAgICAjIDAgLSBjaGFuZ2UgdGl0bGUgYW5kIGljb24gKHdlIHdpbGwgb25seSBjaGFuZ2UgdGl0bGUpCiAgICAgICAgICAgICAgICAjIDEgLSBjaGFuZ2UgaWNvbiAod2UgZG9uJ3Qgc3VwcG9ydCB0aGlzKQogICAgICAgICAgICAgICAgIyAyIC0gY2hhbmdlIHRpdGxlCiAgICAgICAgICAgICAgICBpZiBwYXJhbXNbMF0gaW4gJzAyJzoKICAgICAgICAgICAgICAgICAgICB3aW50ZXJtLnNldF90aXRsZShwYXJhbXNbMV0pCiAgICAgICAgcmV0dXJuIHRleHQKUEsDBBQAAAAAAAAAIQB91tgvfQcAAH0HAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2luaXRpYWxpc2UucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgppbXBvcnQgYXRleGl0CmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBzeXMKCmZyb20gLmFuc2l0b3dpbjMyIGltcG9ydCBBbnNpVG9XaW4zMgoKCm9yaWdfc3Rkb3V0ID0gTm9uZQpvcmlnX3N0ZGVyciA9IE5vbmUKCndyYXBwZWRfc3Rkb3V0ID0gTm9uZQp3cmFwcGVkX3N0ZGVyciA9IE5vbmUKCmF0ZXhpdF9kb25lID0gRmFsc2UKCgpkZWYgcmVzZXRfYWxsKCk6CiAgICBpZiBBbnNpVG9XaW4zMiBpcyBub3QgTm9uZTogICAgIyBJc3N1ZSAjNzQ6IG9iamVjdHMgbWlnaHQgYmVjb21lIE5vbmUgYXQgZXhpdAogICAgICAgIEFuc2lUb1dpbjMyKG9yaWdfc3Rkb3V0KS5yZXNldF9hbGwoKQoKCmRlZiBpbml0KGF1dG9yZXNldD1GYWxzZSwgY29udmVydD1Ob25lLCBzdHJpcD1Ob25lLCB3cmFwPVRydWUpOgoKICAgIGlmIG5vdCB3cmFwIGFuZCBhbnkoW2F1dG9yZXNldCwgY29udmVydCwgc3RyaXBdKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3cmFwPUZhbHNlIGNvbmZsaWN0cyB3aXRoIGFueSBvdGhlciBhcmc9VHJ1ZScpCgogICAgZ2xvYmFsIHdyYXBwZWRfc3Rkb3V0LCB3cmFwcGVkX3N0ZGVycgogICAgZ2xvYmFsIG9yaWdfc3Rkb3V0LCBvcmlnX3N0ZGVycgoKICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCgogICAgaWYgc3lzLnN0ZG91dCBpcyBOb25lOgogICAgICAgIHdyYXBwZWRfc3Rkb3V0ID0gTm9uZQogICAgZWxzZToKICAgICAgICBzeXMuc3Rkb3V0ID0gd3JhcHBlZF9zdGRvdXQgPSBcCiAgICAgICAgICAgIHdyYXBfc3RyZWFtKG9yaWdfc3Rkb3V0LCBjb252ZXJ0LCBzdHJpcCwgYXV0b3Jlc2V0LCB3cmFwKQogICAgaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgICAgIHdyYXBwZWRfc3RkZXJyID0gTm9uZQogICAgZWxzZToKICAgICAgICBzeXMuc3RkZXJyID0gd3JhcHBlZF9zdGRlcnIgPSBcCiAgICAgICAgICAgIHdyYXBfc3RyZWFtKG9yaWdfc3RkZXJyLCBjb252ZXJ0LCBzdHJpcCwgYXV0b3Jlc2V0LCB3cmFwKQoKICAgIGdsb2JhbCBhdGV4aXRfZG9uZQogICAgaWYgbm90IGF0ZXhpdF9kb25lOgogICAgICAgIGF0ZXhpdC5yZWdpc3RlcihyZXNldF9hbGwpCiAgICAgICAgYXRleGl0X2RvbmUgPSBUcnVlCgoKZGVmIGRlaW5pdCgpOgogICAgaWYgb3JpZ19zdGRvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0CiAgICBpZiBvcmlnX3N0ZGVyciBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3RkZXJyID0gb3JpZ19zdGRlcnIKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgY29sb3JhbWFfdGV4dCgqYXJncywgKiprd2FyZ3MpOgogICAgaW5pdCgqYXJncywgKiprd2FyZ3MpCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgZGVpbml0KCkKCgpkZWYgcmVpbml0KCk6CiAgICBpZiB3cmFwcGVkX3N0ZG91dCBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3Rkb3V0ID0gd3JhcHBlZF9zdGRvdXQKICAgIGlmIHdyYXBwZWRfc3RkZXJyIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRlcnIgPSB3cmFwcGVkX3N0ZGVycgoKCmRlZiB3cmFwX3N0cmVhbShzdHJlYW0sIGNvbnZlcnQsIHN0cmlwLCBhdXRvcmVzZXQsIHdyYXApOgogICAgaWYgd3JhcDoKICAgICAgICB3cmFwcGVyID0gQW5zaVRvV2luMzIoc3RyZWFtLAogICAgICAgICAgICBjb252ZXJ0PWNvbnZlcnQsIHN0cmlwPXN0cmlwLCBhdXRvcmVzZXQ9YXV0b3Jlc2V0KQogICAgICAgIGlmIHdyYXBwZXIuc2hvdWxkX3dyYXAoKToKICAgICAgICAgICAgc3RyZWFtID0gd3JhcHBlci5zdHJlYW0KICAgIHJldHVybiBzdHJlYW0KCgpQSwMEFAAAAAAAAAAhAA1toj31FAAA9RQAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2luMzIucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgoKIyBmcm9tIHdpbmJhc2UuaApTVERPVVQgPSAtMTEKU1RERVJSID0gLTEyCgp0cnk6CiAgICBpbXBvcnQgY3R5cGVzCiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgTGlicmFyeUxvYWRlcgogICAgd2luZGxsID0gTGlicmFyeUxvYWRlcihjdHlwZXMuV2luRExMKQogICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEltcG9ydEVycm9yKToKICAgIHdpbmRsbCA9IE5vbmUKICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlID0gbGFtYmRhICpfOiBOb25lCiAgICB3aW5hcGlfdGVzdCA9IGxhbWJkYSAqXzogTm9uZQplbHNlOgogICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmLCBTdHJ1Y3R1cmUsIGNfY2hhciwgUE9JTlRFUgoKICAgIENPT1JEID0gd2ludHlwZXMuX0NPT1JECgogICAgY2xhc3MgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8oU3RydWN0dXJlKToKICAgICAgICAiIiJzdHJ1Y3QgaW4gd2luY29uLmguIiIiCiAgICAgICAgX2ZpZWxkc18gPSBbCiAgICAgICAgICAgICgiZHdTaXplIiwgQ09PUkQpLAogICAgICAgICAgICAoImR3Q3Vyc29yUG9zaXRpb24iLCBDT09SRCksCiAgICAgICAgICAgICgid0F0dHJpYnV0ZXMiLCB3aW50eXBlcy5XT1JEKSwKICAgICAgICAgICAgKCJzcldpbmRvdyIsIHdpbnR5cGVzLlNNQUxMX1JFQ1QpLAogICAgICAgICAgICAoImR3TWF4aW11bVdpbmRvd1NpemUiLCBDT09SRCksCiAgICAgICAgXQogICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gJyglZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCknICUgKAogICAgICAgICAgICAgICAgc2VsZi5kd1NpemUuWSwgc2VsZi5kd1NpemUuWAogICAgICAgICAgICAgICAgLCBzZWxmLmR3Q3Vyc29yUG9zaXRpb24uWSwgc2VsZi5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICAgICAgICAgICwgc2VsZi53QXR0cmlidXRlcwogICAgICAgICAgICAgICAgLCBzZWxmLnNyV2luZG93LlRvcCwgc2VsZi5zcldpbmRvdy5MZWZ0LCBzZWxmLnNyV2luZG93LkJvdHRvbSwgc2VsZi5zcldpbmRvdy5SaWdodAogICAgICAgICAgICAgICAgLCBzZWxmLmR3TWF4aW11bVdpbmRvd1NpemUuWSwgc2VsZi5kd01heGltdW1XaW5kb3dTaXplLlgKICAgICAgICAgICAgKQoKICAgIF9HZXRTdGRIYW5kbGUgPSB3aW5kbGwua2VybmVsMzIuR2V0U3RkSGFuZGxlCiAgICBfR2V0U3RkSGFuZGxlLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgXQogICAgX0dldFN0ZEhhbmRsZS5yZXN0eXBlID0gd2ludHlwZXMuSEFORExFCgogICAgX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvID0gd2luZGxsLmtlcm5lbDMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8uYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIFBPSU5URVIoQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8pLAogICAgXQogICAgX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX1NldENvbnNvbGVUZXh0QXR0cmlidXRlID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVUZXh0QXR0cmlidXRlCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIHdpbnR5cGVzLldPUkQsCiAgICBdCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbgogICAgX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgQ09PUkQsCiAgICBdCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQSA9IHdpbmRsbC5rZXJuZWwzMi5GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEKICAgIF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIGNfY2hhciwKICAgICAgICB3aW50eXBlcy5EV09SRCwKICAgICAgICBDT09SRCwKICAgICAgICBQT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwKICAgIF0KICAgIF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUgPSB3aW5kbGwua2VybmVsMzIuRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgd2ludHlwZXMuV09SRCwKICAgICAgICB3aW50eXBlcy5EV09SRCwKICAgICAgICBDT09SRCwKICAgICAgICBQT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwKICAgIF0KICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9TZXRDb25zb2xlVGl0bGVXID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVUaXRsZUEKICAgIF9TZXRDb25zb2xlVGl0bGVXLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkxQQ1NUUgogICAgXQogICAgX1NldENvbnNvbGVUaXRsZVcucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBoYW5kbGVzID0gewogICAgICAgIFNURE9VVDogX0dldFN0ZEhhbmRsZShTVERPVVQpLAogICAgICAgIFNUREVSUjogX0dldFN0ZEhhbmRsZShTVERFUlIpLAogICAgfQoKICAgIGRlZiB3aW5hcGlfdGVzdCgpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbU1RET1VUXQogICAgICAgIGNzYmkgPSBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTygpCiAgICAgICAgc3VjY2VzcyA9IF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbygKICAgICAgICAgICAgaGFuZGxlLCBieXJlZihjc2JpKSkKICAgICAgICByZXR1cm4gYm9vbChzdWNjZXNzKQoKICAgIGRlZiBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdHJlYW1faWQ9U1RET1VUKToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBjc2JpID0gQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8oKQogICAgICAgIHN1Y2Nlc3MgPSBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oCiAgICAgICAgICAgIGhhbmRsZSwgYnlyZWYoY3NiaSkpCiAgICAgICAgcmV0dXJuIGNzYmkKCiAgICBkZWYgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3RyZWFtX2lkLCBhdHRycyk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoYW5kbGUsIGF0dHJzKQoKICAgIGRlZiBTZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oc3RyZWFtX2lkLCBwb3NpdGlvbiwgYWRqdXN0PVRydWUpOgogICAgICAgIHBvc2l0aW9uID0gQ09PUkQoKnBvc2l0aW9uKQogICAgICAgICMgSWYgdGhlIHBvc2l0aW9uIGlzIG91dCBvZiByYW5nZSwgZG8gbm90aGluZy4KICAgICAgICBpZiBwb3NpdGlvbi5ZIDw9IDAgb3IgcG9zaXRpb24uWCA8PSAwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICAjIEFkanVzdCBmb3IgV2luZG93cycgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uOgogICAgICAgICMgICAgMS4gYmVpbmcgMC1iYXNlZCwgd2hpbGUgQU5TSSBpcyAxLWJhc2VkLgogICAgICAgICMgICAgMi4gZXhwZWN0aW5nICh4LHkpLCB3aGlsZSBBTlNJIHVzZXMgKHkseCkuCiAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24gPSBDT09SRChwb3NpdGlvbi5ZIC0gMSwgcG9zaXRpb24uWCAtIDEpCiAgICAgICAgaWYgYWRqdXN0OgogICAgICAgICAgICAjIEFkanVzdCBmb3Igdmlld3BvcnQncyBzY3JvbGwgcG9zaXRpb24KICAgICAgICAgICAgc3IgPSBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhTVERPVVQpLnNyV2luZG93CiAgICAgICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uLlkgKz0gc3IuVG9wCiAgICAgICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uLlggKz0gc3IuTGVmdAogICAgICAgICMgUmVzdW1lIG5vcm1hbCBwcm9jZXNzaW5nCiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBhZGp1c3RlZF9wb3NpdGlvbikKCiAgICBkZWYgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoc3RyZWFtX2lkLCBjaGFyLCBsZW5ndGgsIHN0YXJ0KToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBjaGFyID0gY19jaGFyKGNoYXIuZW5jb2RlKCkpCiAgICAgICAgbGVuZ3RoID0gd2ludHlwZXMuRFdPUkQobGVuZ3RoKQogICAgICAgIG51bV93cml0dGVuID0gd2ludHlwZXMuRFdPUkQoMCkKICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIGhhcmQtY29kZWQgZm9yIEFOU0kgKHZzIHdpZGUpIGJ5dGVzLgogICAgICAgIHN1Y2Nlc3MgPSBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBKAogICAgICAgICAgICBoYW5kbGUsIGNoYXIsIGxlbmd0aCwgc3RhcnQsIGJ5cmVmKG51bV93cml0dGVuKSkKICAgICAgICByZXR1cm4gbnVtX3dyaXR0ZW4udmFsdWUKCiAgICBkZWYgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoc3RyZWFtX2lkLCBhdHRyLCBsZW5ndGgsIHN0YXJ0KToKICAgICAgICAnJycgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoIGhDb25zb2xlLCBjc2JpLndBdHRyaWJ1dGVzLCBkd0NvblNpemUsIGNvb3JkU2NyZWVuLCAmY0NoYXJzV3JpdHRlbiApJycnCiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgYXR0cmlidXRlID0gd2ludHlwZXMuV09SRChhdHRyKQogICAgICAgIGxlbmd0aCA9IHdpbnR5cGVzLkRXT1JEKGxlbmd0aCkKICAgICAgICBudW1fd3JpdHRlbiA9IHdpbnR5cGVzLkRXT1JEKDApCiAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBoYXJkLWNvZGVkIGZvciBBTlNJICh2cyB3aWRlKSBieXRlcy4KICAgICAgICByZXR1cm4gX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKAogICAgICAgICAgICBoYW5kbGUsIGF0dHJpYnV0ZSwgbGVuZ3RoLCBzdGFydCwgYnlyZWYobnVtX3dyaXR0ZW4pKQoKICAgIGRlZiBTZXRDb25zb2xlVGl0bGUodGl0bGUpOgogICAgICAgIHJldHVybiBfU2V0Q29uc29sZVRpdGxlVyh0aXRsZSkKUEsDBBQAAAAAAAAAIQB3e2chkhgAAJIYAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbnRlcm0ucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgpmcm9tIC4gaW1wb3J0IHdpbjMyCgoKIyBmcm9tIHdpbmNvbi5oCmNsYXNzIFdpbkNvbG9yKG9iamVjdCk6CiAgICBCTEFDSyAgID0gMAogICAgQkxVRSAgICA9IDEKICAgIEdSRUVOICAgPSAyCiAgICBDWUFOICAgID0gMwogICAgUkVEICAgICA9IDQKICAgIE1BR0VOVEEgPSA1CiAgICBZRUxMT1cgID0gNgogICAgR1JFWSAgICA9IDcKCiMgZnJvbSB3aW5jb24uaApjbGFzcyBXaW5TdHlsZShvYmplY3QpOgogICAgTk9STUFMICAgICAgICAgICAgICA9IDB4MDAgIyBkaW0gdGV4dCwgZGltIGJhY2tncm91bmQKICAgIEJSSUdIVCAgICAgICAgICAgICAgPSAweDA4ICMgYnJpZ2h0IHRleHQsIGRpbSBiYWNrZ3JvdW5kCiAgICBCUklHSFRfQkFDS0dST1VORCAgID0gMHg4MCAjIGRpbSB0ZXh0LCBicmlnaHQgYmFja2dyb3VuZAoKY2xhc3MgV2luVGVybShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9kZWZhdWx0ID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8od2luMzIuU1RET1VUKS53QXR0cmlidXRlcwogICAgICAgIHNlbGYuc2V0X2F0dHJzKHNlbGYuX2RlZmF1bHQpCiAgICAgICAgc2VsZi5fZGVmYXVsdF9mb3JlID0gc2VsZi5fZm9yZQogICAgICAgIHNlbGYuX2RlZmF1bHRfYmFjayA9IHNlbGYuX2JhY2sKICAgICAgICBzZWxmLl9kZWZhdWx0X3N0eWxlID0gc2VsZi5fc3R5bGUKICAgICAgICAjIEluIG9yZGVyIHRvIGVtdWxhdGUgTElHSFRfRVggaW4gd2luZG93cywgd2UgYm9ycm93IHRoZSBCUklHSFQgc3R5bGUuCiAgICAgICAgIyBTbyB0aGF0IExJR0hUX0VYIGNvbG9ycyBhbmQgQlJJR0hUIHN0eWxlIGRvIG5vdCBjbG9iYmVyIGVhY2ggb3RoZXIsCiAgICAgICAgIyB3ZSB0cmFjayB0aGVtIHNlcGFyYXRlbHksIHNpbmNlIExJR0hUX0VYIGlzIG92ZXJ3cml0dGVuIGJ5IEZvcmUvQmFjawogICAgICAgICMgYW5kIEJSSUdIVCBpcyBvdmVyd3JpdHRlbiBieSBTdHlsZSBjb2Rlcy4KICAgICAgICBzZWxmLl9saWdodCA9IDAKCiAgICBkZWYgZ2V0X2F0dHJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9mb3JlICsgc2VsZi5fYmFjayAqIDE2ICsgKHNlbGYuX3N0eWxlIHwgc2VsZi5fbGlnaHQpCgogICAgZGVmIHNldF9hdHRycyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fZm9yZSA9IHZhbHVlICYgNwogICAgICAgIHNlbGYuX2JhY2sgPSAodmFsdWUgPj4gNCkgJiA3CiAgICAgICAgc2VsZi5fc3R5bGUgPSB2YWx1ZSAmIChXaW5TdHlsZS5CUklHSFQgfCBXaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORCkKCiAgICBkZWYgcmVzZXRfYWxsKHNlbGYsIG9uX3N0ZGVycj1Ob25lKToKICAgICAgICBzZWxmLnNldF9hdHRycyhzZWxmLl9kZWZhdWx0KQogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUoYXR0cnM9c2VsZi5fZGVmYXVsdCkKCiAgICBkZWYgZm9yZShzZWxmLCBmb3JlPU5vbmUsIGxpZ2h0PUZhbHNlLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIGZvcmUgaXMgTm9uZToKICAgICAgICAgICAgZm9yZSA9IHNlbGYuX2RlZmF1bHRfZm9yZQogICAgICAgIHNlbGYuX2ZvcmUgPSBmb3JlCiAgICAgICAgIyBFbXVsYXRlIExJR0hUX0VYIHdpdGggQlJJR0hUIFN0eWxlCiAgICAgICAgaWYgbGlnaHQ6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0IHw9IFdpblN0eWxlLkJSSUdIVAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0ICY9IH5XaW5TdHlsZS5CUklHSFQKICAgICAgICBzZWxmLnNldF9jb25zb2xlKG9uX3N0ZGVycj1vbl9zdGRlcnIpCgogICAgZGVmIGJhY2soc2VsZiwgYmFjaz1Ob25lLCBsaWdodD1GYWxzZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBiYWNrIGlzIE5vbmU6CiAgICAgICAgICAgIGJhY2sgPSBzZWxmLl9kZWZhdWx0X2JhY2sKICAgICAgICBzZWxmLl9iYWNrID0gYmFjawogICAgICAgICMgRW11bGF0ZSBMSUdIVF9FWCB3aXRoIEJSSUdIVF9CQUNLR1JPVU5EIFN0eWxlCiAgICAgICAgaWYgbGlnaHQ6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0IHw9IFdpblN0eWxlLkJSSUdIVF9CQUNLR1JPVU5ECiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbGlnaHQgJj0gfldpblN0eWxlLkJSSUdIVF9CQUNLR1JPVU5ECiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBzdHlsZShzZWxmLCBzdHlsZT1Ob25lLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIHN0eWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHN0eWxlID0gc2VsZi5fZGVmYXVsdF9zdHlsZQogICAgICAgIHNlbGYuX3N0eWxlID0gc3R5bGUKICAgICAgICBzZWxmLnNldF9jb25zb2xlKG9uX3N0ZGVycj1vbl9zdGRlcnIpCgogICAgZGVmIHNldF9jb25zb2xlKHNlbGYsIGF0dHJzPU5vbmUsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgYXR0cnMgaXMgTm9uZToKICAgICAgICAgICAgYXR0cnMgPSBzZWxmLmdldF9hdHRycygpCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICB3aW4zMi5TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoYW5kbGUsIGF0dHJzKQoKICAgIGRlZiBnZXRfcG9zaXRpb24oc2VsZiwgaGFuZGxlKToKICAgICAgICBwb3NpdGlvbiA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGhhbmRsZSkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICMgQmVjYXVzZSBXaW5kb3dzIGNvb3JkaW5hdGVzIGFyZSAwLWJhc2VkLAogICAgICAgICMgYW5kIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbiBleHBlY3RzIDEtYmFzZWQuCiAgICAgICAgcG9zaXRpb24uWCArPSAxCiAgICAgICAgcG9zaXRpb24uWSArPSAxCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uCgogICAgZGVmIHNldF9jdXJzb3JfcG9zaXRpb24oc2VsZiwgcG9zaXRpb249Tm9uZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBwb3NpdGlvbiBpcyBOb25lOgogICAgICAgICAgICAjIEknbSBub3QgY3VycmVudGx5IHRyYWNraW5nIHRoZSBwb3NpdGlvbiwgc28gdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgIyBwb3NpdGlvbiA9IHNlbGYuZ2V0X3Bvc2l0aW9uKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBwb3NpdGlvbikKCiAgICBkZWYgY3Vyc29yX2FkanVzdChzZWxmLCB4LCB5LCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgcG9zaXRpb24gPSBzZWxmLmdldF9wb3NpdGlvbihoYW5kbGUpCiAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24gPSAocG9zaXRpb24uWSArIHksIHBvc2l0aW9uLlggKyB4KQogICAgICAgIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsIGFkanVzdGVkX3Bvc2l0aW9uLCBhZGp1c3Q9RmFsc2UpCgogICAgZGVmIGVyYXNlX3NjcmVlbihzZWxmLCBtb2RlPTAsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgIyAwIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgc2NyZWVuLgogICAgICAgICMgMSBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcmVlbi4KICAgICAgICAjIDIgc2hvdWxkIGNsZWFyIHRoZSBlbnRpcmUgc2NyZWVuLCBhbmQgbW92ZSBjdXJzb3IgdG8gKDEsMSkKICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIGNzYmkgPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpCiAgICAgICAgIyBnZXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgY2VsbHMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgY2VsbHNfaW5fc2NyZWVuID0gY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdTaXplLlkKICAgICAgICAjIGdldCBudW1iZXIgb2YgY2hhcmFjdGVyIGNlbGxzIGJlZm9yZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbgogICAgICAgIGNlbGxzX2JlZm9yZV9jdXJzb3IgPSBjc2JpLmR3U2l6ZS5YICogY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkgKyBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgIGlmIG1vZGUgPT0gMDoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2luX3NjcmVlbiAtIGNlbGxzX2JlZm9yZV9jdXJzb3IKICAgICAgICBpZiBtb2RlID09IDE6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCAwKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2JlZm9yZV9jdXJzb3IKICAgICAgICBlbGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIDApCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY2VsbHNfaW5fc2NyZWVuCiAgICAgICAgIyBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIHdpdGggYmxhbmtzCiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoaGFuZGxlLCAnICcsIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgICMgbm93IHNldCB0aGUgYnVmZmVyJ3MgYXR0cmlidXRlcyBhY2NvcmRpbmdseQogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGhhbmRsZSwgc2VsZi5nZXRfYXR0cnMoKSwgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCiAgICAgICAgaWYgbW9kZSA9PSAyOgogICAgICAgICAgICAjIHB1dCB0aGUgY3Vyc29yIHdoZXJlIG5lZWRlZAogICAgICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCAoMSwgMSkpCgogICAgZGVmIGVyYXNlX2xpbmUoc2VsZiwgbW9kZT0wLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgICMgMCBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCiAgICAgICAgIyAxIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KICAgICAgICAjIDIgc2hvdWxkIGNsZWFyIHRoZSBlbnRpcmUgbGluZS4KICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIGNzYmkgPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpCiAgICAgICAgaWYgbW9kZSA9PSAwOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gY3NiaS5kd0N1cnNvclBvc2l0aW9uCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY3NiaS5kd1NpemUuWCAtIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgaWYgbW9kZSA9PSAxOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkpCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY3NiaS5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICBlbGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdTaXplLlgKICAgICAgICAjIGZpbGwgdGhlIGVudGlyZSBzY3JlZW4gd2l0aCBibGFua3MKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihoYW5kbGUsICcgJywgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCiAgICAgICAgIyBub3cgc2V0IHRoZSBidWZmZXIncyBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoaGFuZGxlLCBzZWxmLmdldF9hdHRycygpLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKCiAgICBkZWYgc2V0X3RpdGxlKHNlbGYsIHRpdGxlKToKICAgICAgICB3aW4zMi5TZXRDb25zb2xlVGl0bGUodGl0bGUpClBLAwQUAAAAAAAAACEAJpxRl0UCAABFAgAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19faW5pdF9fLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKaW1wb3J0IGxvZ2dpbmcKCl9fdmVyc2lvbl9fID0gJzAuMi40JwoKY2xhc3MgRGlzdGxpYkV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgcGFzcwoKdHJ5OgogICAgZnJvbSBsb2dnaW5nIGltcG9ydCBOdWxsSGFuZGxlcgpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKICAgICAgICBkZWYgaGFuZGxlKHNlbGYsIHJlY29yZCk6IHBhc3MKICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOiBwYXNzCiAgICAgICAgZGVmIGNyZWF0ZUxvY2soc2VsZik6IHNlbGYubG9jayA9IE5vbmUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQpsb2dnZXIuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQpQSwMEFAAAAAAAAAAhACPvZ/wSAQAAEgEAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvX19pbml0X18ucHkiIiJNb2R1bGVzIGNvcGllZCBmcm9tIFB5dGhvbiAzIHN0YW5kYXJkIGxpYnJhcmllcywgZm9yIGludGVybmFsIHVzZSBvbmx5LgoKSW5kaXZpZHVhbCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIGQyLl9iYWNrcG9ydC5taXNjLiAgSW50ZW5kZWQKdXNhZ2UgaXMgdG8gYWx3YXlzIGltcG9ydCB0aGluZ3MgbWlzc2luZyBmcm9tIDMuMSBmcm9tIHRoYXQgbW9kdWxlOiB0aGUKYnVpbHQtaW4vc3RkbGliIG9iamVjdHMgd2lsbCBiZSB1c2VkIGlmIGZvdW5kLgoiIiIKUEsDBBQAAAAAAAAAIQCvii9lywMAAMsDAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiQmFja3BvcnRzIGZvciBpbmRpdmlkdWFsIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucy4iIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCgpfX2FsbF9fID0gWydjYWNoZV9mcm9tX3NvdXJjZScsICdjYWxsYWJsZScsICdmc2VuY29kZSddCgoKdHJ5OgogICAgZnJvbSBpbXAgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBjYWNoZV9mcm9tX3NvdXJjZShweV9maWxlLCBkZWJ1Zz1fX2RlYnVnX18pOgogICAgICAgIGV4dCA9IGRlYnVnIGFuZCAnYycgb3IgJ28nCiAgICAgICAgcmV0dXJuIHB5X2ZpbGUgKyBleHQKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDYWxsYWJsZQoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iaiwgQ2FsbGFibGUpCgoKdHJ5OgogICAgZnNlbmNvZGUgPSBvcy5mc2VuY29kZQpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBkZWYgZnNlbmNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pClBLAwQUAAAAAAAAACEA4mI90C9kAAAvZAAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvcHlpbmcgYW5kIGFyY2hpdmluZyBmaWxlcyBhbmQgZGlyZWN0b3J5IHRyZWVzLgoKWFhYIFRoZSBmdW5jdGlvbnMgaGVyZSBkb24ndCBjb3B5IHRoZSByZXNvdXJjZSBmb3JrIG9yIG90aGVyIG1ldGFkYXRhIG9uIE1hYy4KCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHN0YXQKZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoCmltcG9ydCBmbm1hdGNoCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZXJybm8KZnJvbSAuIGltcG9ydCB0YXJmaWxlCgp0cnk6CiAgICBpbXBvcnQgYnoyCiAgICBfQloyX1NVUFBPUlRFRCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgX0JaMl9TVVBQT1JURUQgPSBGYWxzZQoKdHJ5OgogICAgZnJvbSBwd2QgaW1wb3J0IGdldHB3bmFtCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGdldHB3bmFtID0gTm9uZQoKdHJ5OgogICAgZnJvbSBncnAgaW1wb3J0IGdldGdybmFtCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGdldGdybmFtID0gTm9uZQoKX19hbGxfXyA9IFsiY29weWZpbGVvYmoiLCAiY29weWZpbGUiLCAiY29weW1vZGUiLCAiY29weXN0YXQiLCAiY29weSIsICJjb3B5MiIsCiAgICAgICAgICAgImNvcHl0cmVlIiwgIm1vdmUiLCAicm10cmVlIiwgIkVycm9yIiwgIlNwZWNpYWxGaWxlRXJyb3IiLAogICAgICAgICAgICJFeGVjRXJyb3IiLCAibWFrZV9hcmNoaXZlIiwgImdldF9hcmNoaXZlX2Zvcm1hdHMiLAogICAgICAgICAgICJyZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCIsICJ1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0IiwKICAgICAgICAgICAiZ2V0X3VucGFja19mb3JtYXRzIiwgInJlZ2lzdGVyX3VucGFja19mb3JtYXQiLAogICAgICAgICAgICJ1bnJlZ2lzdGVyX3VucGFja19mb3JtYXQiLCAidW5wYWNrX2FyY2hpdmUiLCAiaWdub3JlX3BhdHRlcm5zIl0KCmNsYXNzIEVycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgcGFzcwoKY2xhc3MgU3BlY2lhbEZpbGVFcnJvcihFbnZpcm9ubWVudEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRyeWluZyB0byBkbyBhIGtpbmQgb2Ygb3BlcmF0aW9uIChlLmcuIGNvcHlpbmcpIHdoaWNoIGlzCiAgICBub3Qgc3VwcG9ydGVkIG9uIGEgc3BlY2lhbCBmaWxlIChlLmcuIGEgbmFtZWQgcGlwZSkiIiIKCmNsYXNzIEV4ZWNFcnJvcihFbnZpcm9ubWVudEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGEgY29tbWFuZCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQiIiIKCmNsYXNzIFJlYWRFcnJvcihFbnZpcm9ubWVudEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGFuIGFyY2hpdmUgY2Fubm90IGJlIHJlYWQiIiIKCmNsYXNzIFJlZ2lzdHJ5RXJyb3IoRXhjZXB0aW9uKToKICAgICIiIlJhaXNlZCB3aGVuIGEgcmVnaXN0cnkgb3BlcmF0aW9uIHdpdGggdGhlIGFyY2hpdmluZwogICAgYW5kIHVucGFja2luZyByZWdpc3RyaWVzIGZhaWxzIiIiCgoKdHJ5OgogICAgV2luZG93c0Vycm9yCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBXaW5kb3dzRXJyb3IgPSBOb25lCgpkZWYgY29weWZpbGVvYmooZnNyYywgZmRzdCwgbGVuZ3RoPTE2KjEwMjQpOgogICAgIiIiY29weSBkYXRhIGZyb20gZmlsZS1saWtlIG9iamVjdCBmc3JjIHRvIGZpbGUtbGlrZSBvYmplY3QgZmRzdCIiIgogICAgd2hpbGUgMToKICAgICAgICBidWYgPSBmc3JjLnJlYWQobGVuZ3RoKQogICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmRzdC53cml0ZShidWYpCgpkZWYgX3NhbWVmaWxlKHNyYywgZHN0KToKICAgICMgTWFjaW50b3NoLCBVbml4LgogICAgaWYgaGFzYXR0cihvcy5wYXRoLCAnc2FtZWZpbGUnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKHNyYywgZHN0KQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEFsbCBvdGhlciBwbGF0Zm9ybXM6IGNoZWNrIGZvciBzYW1lIHBhdGhuYW1lLgogICAgcmV0dXJuIChvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChzcmMpKSA9PQogICAgICAgICAgICBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChkc3QpKSkKCmRlZiBjb3B5ZmlsZShzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGRhdGEgZnJvbSBzcmMgdG8gZHN0IiIiCiAgICBpZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgogICAgICAgIHJhaXNlIEVycm9yKCJgJXNgIGFuZCBgJXNgIGFyZSB0aGUgc2FtZSBmaWxlIiAlIChzcmMsIGRzdCkpCgogICAgZm9yIGZuIGluIFtzcmMsIGRzdF06CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdCA9IG9zLnN0YXQoZm4pCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICMgRmlsZSBtb3N0IGxpa2VseSBkb2VzIG5vdCBleGlzdAogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFggV2hhdCBhYm91dCBvdGhlciBzcGVjaWFsIGZpbGVzPyAoc29ja2V0cywgZGV2aWNlcy4uLikKICAgICAgICAgICAgaWYgc3RhdC5TX0lTRklGTyhzdC5zdF9tb2RlKToKICAgICAgICAgICAgICAgIHJhaXNlIFNwZWNpYWxGaWxlRXJyb3IoImAlc2AgaXMgYSBuYW1lZCBwaXBlIiAlIGZuKQoKICAgIHdpdGggb3BlbihzcmMsICdyYicpIGFzIGZzcmM6CiAgICAgICAgd2l0aCBvcGVuKGRzdCwgJ3diJykgYXMgZmRzdDoKICAgICAgICAgICAgY29weWZpbGVvYmooZnNyYywgZmRzdCkKCmRlZiBjb3B5bW9kZShzcmMsIGRzdCk6CiAgICAiIiJDb3B5IG1vZGUgYml0cyBmcm9tIHNyYyB0byBkc3QiIiIKICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgogICAgICAgIHN0ID0gb3Muc3RhdChzcmMpCiAgICAgICAgbW9kZSA9IHN0YXQuU19JTU9ERShzdC5zdF9tb2RlKQogICAgICAgIG9zLmNobW9kKGRzdCwgbW9kZSkKCmRlZiBjb3B5c3RhdChzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGFsbCBzdGF0IGluZm8gKG1vZGUgYml0cywgYXRpbWUsIG10aW1lLCBmbGFncykgZnJvbSBzcmMgdG8gZHN0IiIiCiAgICBzdCA9IG9zLnN0YXQoc3JjKQogICAgbW9kZSA9IHN0YXQuU19JTU9ERShzdC5zdF9tb2RlKQogICAgaWYgaGFzYXR0cihvcywgJ3V0aW1lJyk6CiAgICAgICAgb3MudXRpbWUoZHN0LCAoc3Quc3RfYXRpbWUsIHN0LnN0X210aW1lKSkKICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgogICAgICAgIG9zLmNobW9kKGRzdCwgbW9kZSkKICAgIGlmIGhhc2F0dHIob3MsICdjaGZsYWdzJykgYW5kIGhhc2F0dHIoc3QsICdzdF9mbGFncycpOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MuY2hmbGFncyhkc3QsIHN0LnN0X2ZsYWdzKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIHdoeToKICAgICAgICAgICAgaWYgKG5vdCBoYXNhdHRyKGVycm5vLCAnRU9QTk9UU1VQUCcpIG9yCiAgICAgICAgICAgICAgICB3aHkuZXJybm8gIT0gZXJybm8uRU9QTk9UU1VQUCk6CiAgICAgICAgICAgICAgICByYWlzZQoKZGVmIGNvcHkoc3JjLCBkc3QpOgogICAgIiIiQ29weSBkYXRhIGFuZCBtb2RlIGJpdHMgKCJjcCBzcmMgZHN0IikuCgogICAgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhIGRpcmVjdG9yeS4KCiAgICAiIiIKICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCiAgICBjb3B5ZmlsZShzcmMsIGRzdCkKICAgIGNvcHltb2RlKHNyYywgZHN0KQoKZGVmIGNvcHkyKHNyYywgZHN0KToKICAgICIiIkNvcHkgZGF0YSBhbmQgYWxsIHN0YXQgaW5mbyAoImNwIC1wIHNyYyBkc3QiKS4KCiAgICBUaGUgZGVzdGluYXRpb24gbWF5IGJlIGEgZGlyZWN0b3J5LgoKICAgICIiIgogICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3QsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKICAgIGNvcHlmaWxlKHNyYywgZHN0KQogICAgY29weXN0YXQoc3JjLCBkc3QpCgpkZWYgaWdub3JlX3BhdHRlcm5zKCpwYXR0ZXJucyk6CiAgICAiIiJGdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGNvcHl0cmVlKCkgaWdub3JlIHBhcmFtZXRlci4KCiAgICBQYXR0ZXJucyBpcyBhIHNlcXVlbmNlIG9mIGdsb2Itc3R5bGUgcGF0dGVybnMKICAgIHRoYXQgYXJlIHVzZWQgdG8gZXhjbHVkZSBmaWxlcyIiIgogICAgZGVmIF9pZ25vcmVfcGF0dGVybnMocGF0aCwgbmFtZXMpOgogICAgICAgIGlnbm9yZWRfbmFtZXMgPSBbXQogICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICBpZ25vcmVkX25hbWVzLmV4dGVuZChmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikpCiAgICAgICAgcmV0dXJuIHNldChpZ25vcmVkX25hbWVzKQogICAgcmV0dXJuIF9pZ25vcmVfcGF0dGVybnMKCmRlZiBjb3B5dHJlZShzcmMsIGRzdCwgc3ltbGlua3M9RmFsc2UsIGlnbm9yZT1Ob25lLCBjb3B5X2Z1bmN0aW9uPWNvcHkyLAogICAgICAgICAgICAgaWdub3JlX2RhbmdsaW5nX3N5bWxpbmtzPUZhbHNlKToKICAgICIiIlJlY3Vyc2l2ZWx5IGNvcHkgYSBkaXJlY3RvcnkgdHJlZS4KCiAgICBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3Qgbm90IGFscmVhZHkgZXhpc3QuCiAgICBJZiBleGNlcHRpb24ocykgb2NjdXIsIGFuIEVycm9yIGlzIHJhaXNlZCB3aXRoIGEgbGlzdCBvZiByZWFzb25zLgoKICAgIElmIHRoZSBvcHRpb25hbCBzeW1saW5rcyBmbGFnIGlzIHRydWUsIHN5bWJvbGljIGxpbmtzIGluIHRoZQogICAgc291cmNlIHRyZWUgcmVzdWx0IGluIHN5bWJvbGljIGxpbmtzIGluIHRoZSBkZXN0aW5hdGlvbiB0cmVlOyBpZgogICAgaXQgaXMgZmFsc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXMgcG9pbnRlZCB0byBieSBzeW1ib2xpYwogICAgbGlua3MgYXJlIGNvcGllZC4gSWYgdGhlIGZpbGUgcG9pbnRlZCBieSB0aGUgc3ltbGluayBkb2Vzbid0CiAgICBleGlzdCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGxpc3Qgb2YgZXJyb3JzIHJhaXNlZCBpbgogICAgYW4gRXJyb3IgZXhjZXB0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNvcHkgcHJvY2Vzcy4KCiAgICBZb3UgY2FuIHNldCB0aGUgb3B0aW9uYWwgaWdub3JlX2RhbmdsaW5nX3N5bWxpbmtzIGZsYWcgdG8gdHJ1ZSBpZiB5b3UKICAgIHdhbnQgdG8gc2lsZW5jZSB0aGlzIGV4Y2VwdGlvbi4gTm90aWNlIHRoYXQgdGhpcyBoYXMgbm8gZWZmZWN0IG9uCiAgICBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IG9zLnN5bWxpbmsuCgogICAgVGhlIG9wdGlvbmFsIGlnbm9yZSBhcmd1bWVudCBpcyBhIGNhbGxhYmxlLiBJZiBnaXZlbiwgaXQKICAgIGlzIGNhbGxlZCB3aXRoIHRoZSBgc3JjYCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBkaXJlY3RvcnkKICAgIGJlaW5nIHZpc2l0ZWQgYnkgY29weXRyZWUoKSwgYW5kIGBuYW1lc2Agd2hpY2ggaXMgdGhlIGxpc3Qgb2YKICAgIGBzcmNgIGNvbnRlbnRzLCBhcyByZXR1cm5lZCBieSBvcy5saXN0ZGlyKCk6CgogICAgICAgIGNhbGxhYmxlKHNyYywgbmFtZXMpIC0+IGlnbm9yZWRfbmFtZXMKCiAgICBTaW5jZSBjb3B5dHJlZSgpIGlzIGNhbGxlZCByZWN1cnNpdmVseSwgdGhlIGNhbGxhYmxlIHdpbGwgYmUKICAgIGNhbGxlZCBvbmNlIGZvciBlYWNoIGRpcmVjdG9yeSB0aGF0IGlzIGNvcGllZC4gSXQgcmV0dXJucyBhCiAgICBsaXN0IG9mIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBgc3JjYCBkaXJlY3RvcnkgdGhhdCBzaG91bGQKICAgIG5vdCBiZSBjb3BpZWQuCgogICAgVGhlIG9wdGlvbmFsIGNvcHlfZnVuY3Rpb24gYXJndW1lbnQgaXMgYSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUgdXNlZAogICAgdG8gY29weSBlYWNoIGZpbGUuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHNvdXJjZSBwYXRoIGFuZCB0aGUKICAgIGRlc3RpbmF0aW9uIHBhdGggYXMgYXJndW1lbnRzLiBCeSBkZWZhdWx0LCBjb3B5MigpIGlzIHVzZWQsIGJ1dCBhbnkKICAgIGZ1bmN0aW9uIHRoYXQgc3VwcG9ydHMgdGhlIHNhbWUgc2lnbmF0dXJlIChsaWtlIGNvcHkoKSkgY2FuIGJlIHVzZWQuCgogICAgIiIiCiAgICBuYW1lcyA9IG9zLmxpc3RkaXIoc3JjKQogICAgaWYgaWdub3JlIGlzIG5vdCBOb25lOgogICAgICAgIGlnbm9yZWRfbmFtZXMgPSBpZ25vcmUoc3JjLCBuYW1lcykKICAgIGVsc2U6CiAgICAgICAgaWdub3JlZF9uYW1lcyA9IHNldCgpCgogICAgb3MubWFrZWRpcnMoZHN0KQogICAgZXJyb3JzID0gW10KICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgIGlmIG5hbWUgaW4gaWdub3JlZF9uYW1lczoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBzcmNuYW1lID0gb3MucGF0aC5qb2luKHNyYywgbmFtZSkKICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5qb2luKGRzdCwgbmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNyY25hbWUpOgogICAgICAgICAgICAgICAgbGlua3RvID0gb3MucmVhZGxpbmsoc3JjbmFtZSkKICAgICAgICAgICAgICAgIGlmIHN5bWxpbmtzOgogICAgICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsobGlua3RvLCBkc3RuYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBkYW5nbGluZyBzeW1saW5rIGlmIHRoZSBmbGFnIGlzIG9uCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxpbmt0bykgYW5kIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rczoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBsZXQgdGhlIGNvcHkgb2NjdXJzLiBjb3B5MiB3aWxsIHJhaXNlIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgICAgY29weV9mdW5jdGlvbihzcmNuYW1lLCBkc3RuYW1lKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoc3JjbmFtZSk6CiAgICAgICAgICAgICAgICBjb3B5dHJlZShzcmNuYW1lLCBkc3RuYW1lLCBzeW1saW5rcywgaWdub3JlLCBjb3B5X2Z1bmN0aW9uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXaWxsIHJhaXNlIGEgU3BlY2lhbEZpbGVFcnJvciBmb3IgdW5zdXBwb3J0ZWQgZmlsZSB0eXBlcwogICAgICAgICAgICAgICAgY29weV9mdW5jdGlvbihzcmNuYW1lLCBkc3RuYW1lKQogICAgICAgICMgY2F0Y2ggdGhlIEVycm9yIGZyb20gdGhlIHJlY3Vyc2l2ZSBjb3B5dHJlZSBzbyB0aGF0IHdlIGNhbgogICAgICAgICMgY29udGludWUgd2l0aCBvdGhlciBmaWxlcwogICAgICAgIGV4Y2VwdCBFcnJvciBhcyBlcnI6CiAgICAgICAgICAgIGVycm9ycy5leHRlbmQoZXJyLmFyZ3NbMF0pCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgd2h5OgogICAgICAgICAgICBlcnJvcnMuYXBwZW5kKChzcmNuYW1lLCBkc3RuYW1lLCBzdHIod2h5KSkpCiAgICB0cnk6CiAgICAgICAgY29weXN0YXQoc3JjLCBkc3QpCiAgICBleGNlcHQgT1NFcnJvciBhcyB3aHk6CiAgICAgICAgaWYgV2luZG93c0Vycm9yIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKHdoeSwgV2luZG93c0Vycm9yKToKICAgICAgICAgICAgIyBDb3B5aW5nIGZpbGUgYWNjZXNzIHRpbWVzIG1heSBmYWlsIG9uIFdpbmRvd3MKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVycm9ycy5leHRlbmQoKHNyYywgZHN0LCBzdHIod2h5KSkpCiAgICBpZiBlcnJvcnM6CiAgICAgICAgcmFpc2UgRXJyb3IoZXJyb3JzKQoKZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPU5vbmUpOgogICAgIiIiUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IHRyZWUuCgogICAgSWYgaWdub3JlX2Vycm9ycyBpcyBzZXQsIGVycm9ycyBhcmUgaWdub3JlZDsgb3RoZXJ3aXNlLCBpZiBvbmVycm9yCiAgICBpcyBzZXQsIGl0IGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIGVycm9yIHdpdGggYXJndW1lbnRzIChmdW5jLAogICAgcGF0aCwgZXhjX2luZm8pIHdoZXJlIGZ1bmMgaXMgb3MubGlzdGRpciwgb3MucmVtb3ZlLCBvciBvcy5ybWRpcjsKICAgIHBhdGggaXMgdGhlIGFyZ3VtZW50IHRvIHRoYXQgZnVuY3Rpb24gdGhhdCBjYXVzZWQgaXQgdG8gZmFpbDsgYW5kCiAgICBleGNfaW5mbyBpcyBhIHR1cGxlIHJldHVybmVkIGJ5IHN5cy5leGNfaW5mbygpLiAgSWYgaWdub3JlX2Vycm9ycwogICAgaXMgZmFsc2UgYW5kIG9uZXJyb3IgaXMgTm9uZSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KCiAgICAiIiIKICAgIGlmIGlnbm9yZV9lcnJvcnM6CiAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgogICAgICAgICAgICBwYXNzCiAgICBlbGlmIG9uZXJyb3IgaXMgTm9uZToKICAgICAgICBkZWYgb25lcnJvcigqYXJncyk6CiAgICAgICAgICAgIHJhaXNlCiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsocGF0aCk6CiAgICAgICAgICAgICMgc3ltbGlua3MgdG8gZGlyZWN0b3JpZXMgYXJlIGZvcmJpZGRlbiwgc2VlIGJ1ZyAjMTY2OQogICAgICAgICAgICByYWlzZSBPU0Vycm9yKCJDYW5ub3QgY2FsbCBybXRyZWUgb24gYSBzeW1ib2xpYyBsaW5rIikKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIG9uZXJyb3Iob3MucGF0aC5pc2xpbmssIHBhdGgsIHN5cy5leGNfaW5mbygpKQogICAgICAgICMgY2FuJ3QgY29udGludWUgZXZlbiBpZiBvbmVycm9yIGhvb2sgcmV0dXJucwogICAgICAgIHJldHVybgogICAgbmFtZXMgPSBbXQogICAgdHJ5OgogICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihwYXRoKQogICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgIG9uZXJyb3Iob3MubGlzdGRpciwgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCiAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgbW9kZSA9IG9zLmxzdGF0KGZ1bGxuYW1lKS5zdF9tb2RlCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICBtb2RlID0gMAogICAgICAgIGlmIHN0YXQuU19JU0RJUihtb2RlKToKICAgICAgICAgICAgcm10cmVlKGZ1bGxuYW1lLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmdWxsbmFtZSkKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgb25lcnJvcihvcy5yZW1vdmUsIGZ1bGxuYW1lLCBzeXMuZXhjX2luZm8oKSkKICAgIHRyeToKICAgICAgICBvcy5ybWRpcihwYXRoKQogICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgIG9uZXJyb3Iob3Mucm1kaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQoKCmRlZiBfYmFzZW5hbWUocGF0aCk6CiAgICAjIEEgYmFzZW5hbWUoKSB2YXJpYW50IHdoaWNoIGZpcnN0IHN0cmlwcyB0aGUgdHJhaWxpbmcgc2xhc2gsIGlmIHByZXNlbnQuCiAgICAjIFRodXMgd2UgYWx3YXlzIGdldCB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGgsIGV2ZW4gZm9yIGRpcmVjdG9yaWVzLgogICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUocGF0aC5yc3RyaXAob3MucGF0aC5zZXApKQoKZGVmIG1vdmUoc3JjLCBkc3QpOgogICAgIiIiUmVjdXJzaXZlbHkgbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGFub3RoZXIgbG9jYXRpb24uIFRoaXMgaXMKICAgIHNpbWlsYXIgdG8gdGhlIFVuaXggIm12IiBjb21tYW5kLgoKICAgIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYSBkaXJlY3RvcnksIHRoZSBzb3VyY2UKICAgIGlzIG1vdmVkIGluc2lkZSB0aGUgZGlyZWN0b3J5LiBUaGUgZGVzdGluYXRpb24gcGF0aCBtdXN0IG5vdCBhbHJlYWR5CiAgICBleGlzdC4KCiAgICBJZiB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSwgaXQgbWF5IGJlCiAgICBvdmVyd3JpdHRlbiBkZXBlbmRpbmcgb24gb3MucmVuYW1lKCkgc2VtYW50aWNzLgoKICAgIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBvbiBvdXIgY3VycmVudCBmaWxlc3lzdGVtLCB0aGVuIHJlbmFtZSgpIGlzIHVzZWQuCiAgICBPdGhlcndpc2UsIHNyYyBpcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGVuIHJlbW92ZWQuCiAgICBBIGxvdCBtb3JlIGNvdWxkIGJlIGRvbmUgaGVyZS4uLiAgQSBsb29rIGF0IGEgbXYuYyBzaG93cyBhIGxvdCBvZgogICAgdGhlIGlzc3VlcyB0aGlzIGltcGxlbWVudGF0aW9uIGdsb3NzZXMgb3Zlci4KCiAgICAiIiIKICAgIHJlYWxfZHN0ID0gZHN0CiAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CiAgICAgICAgaWYgX3NhbWVmaWxlKHNyYywgZHN0KToKICAgICAgICAgICAgIyBXZSBtaWdodCBiZSBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbSwKICAgICAgICAgICAgIyBwZXJmb3JtIHRoZSByZW5hbWUgYW55d2F5LgogICAgICAgICAgICBvcy5yZW5hbWUoc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZWFsX2RzdCA9IG9zLnBhdGguam9pbihkc3QsIF9iYXNlbmFtZShzcmMpKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlYWxfZHN0KToKICAgICAgICAgICAgcmFpc2UgRXJyb3IoIkRlc3RpbmF0aW9uIHBhdGggJyVzJyBhbHJlYWR5IGV4aXN0cyIgJSByZWFsX2RzdCkKICAgIHRyeToKICAgICAgICBvcy5yZW5hbWUoc3JjLCByZWFsX2RzdCkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKICAgICAgICAgICAgaWYgX2Rlc3RpbnNyYyhzcmMsIGRzdCk6CiAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigiQ2Fubm90IG1vdmUgYSBkaXJlY3RvcnkgJyVzJyBpbnRvIGl0c2VsZiAnJXMnLiIgJSAoc3JjLCBkc3QpKQogICAgICAgICAgICBjb3B5dHJlZShzcmMsIHJlYWxfZHN0LCBzeW1saW5rcz1UcnVlKQogICAgICAgICAgICBybXRyZWUoc3JjKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvcHkyKHNyYywgcmVhbF9kc3QpCiAgICAgICAgICAgIG9zLnVubGluayhzcmMpCgpkZWYgX2Rlc3RpbnNyYyhzcmMsIGRzdCk6CiAgICBzcmMgPSBhYnNwYXRoKHNyYykKICAgIGRzdCA9IGFic3BhdGgoZHN0KQogICAgaWYgbm90IHNyYy5lbmRzd2l0aChvcy5wYXRoLnNlcCk6CiAgICAgICAgc3JjICs9IG9zLnBhdGguc2VwCiAgICBpZiBub3QgZHN0LmVuZHN3aXRoKG9zLnBhdGguc2VwKToKICAgICAgICBkc3QgKz0gb3MucGF0aC5zZXAKICAgIHJldHVybiBkc3Quc3RhcnRzd2l0aChzcmMpCgpkZWYgX2dldF9naWQobmFtZSk6CiAgICAiIiJSZXR1cm5zIGEgZ2lkLCBnaXZlbiBhIGdyb3VwIG5hbWUuIiIiCiAgICBpZiBnZXRncm5hbSBpcyBOb25lIG9yIG5hbWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgdHJ5OgogICAgICAgIHJlc3VsdCA9IGdldGdybmFtKG5hbWUpCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiByZXN1bHRbMl0KICAgIHJldHVybiBOb25lCgpkZWYgX2dldF91aWQobmFtZSk6CiAgICAiIiJSZXR1cm5zIGFuIHVpZCwgZ2l2ZW4gYSB1c2VyIG5hbWUuIiIiCiAgICBpZiBnZXRwd25hbSBpcyBOb25lIG9yIG5hbWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgdHJ5OgogICAgICAgIHJlc3VsdCA9IGdldHB3bmFtKG5hbWUpCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiByZXN1bHRbMl0KICAgIHJldHVybiBOb25lCgpkZWYgX21ha2VfdGFyYmFsbChiYXNlX25hbWUsIGJhc2VfZGlyLCBjb21wcmVzcz0iZ3ppcCIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLAogICAgICAgICAgICAgICAgICBvd25lcj1Ob25lLCBncm91cD1Ob25lLCBsb2dnZXI9Tm9uZSk6CiAgICAiIiJDcmVhdGUgYSAocG9zc2libHkgY29tcHJlc3NlZCkgdGFyIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyCiAgICAnYmFzZV9kaXInLgoKICAgICdjb21wcmVzcycgbXVzdCBiZSAiZ3ppcCIgKHRoZSBkZWZhdWx0KSwgImJ6aXAyIiwgb3IgTm9uZS4KCiAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBvd25lciBhbmQgYSBncm91cCBmb3IgdGhlCiAgICBhcmNoaXZlIHRoYXQgaXMgYmVpbmcgYnVpbHQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgb3duZXIgYW5kIGdyb3VwCiAgICB3aWxsIGJlIHVzZWQuCgogICAgVGhlIG91dHB1dCB0YXIgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX25hbWUnICsgICIudGFyIiwgcG9zc2libHkgcGx1cwogICAgdGhlIGFwcHJvcHJpYXRlIGNvbXByZXNzaW9uIGV4dGVuc2lvbiAoIi5neiIsIG9yICIuYnoyIikuCgogICAgUmV0dXJucyB0aGUgb3V0cHV0IGZpbGVuYW1lLgogICAgIiIiCiAgICB0YXJfY29tcHJlc3Npb24gPSB7J2d6aXAnOiAnZ3onLCBOb25lOiAnJ30KICAgIGNvbXByZXNzX2V4dCA9IHsnZ3ppcCc6ICcuZ3onfQoKICAgIGlmIF9CWjJfU1VQUE9SVEVEOgogICAgICAgIHRhcl9jb21wcmVzc2lvblsnYnppcDInXSA9ICdiejInCiAgICAgICAgY29tcHJlc3NfZXh0WydiemlwMiddID0gJy5iejInCgogICAgIyBmbGFncyBmb3IgY29tcHJlc3Npb24gcHJvZ3JhbSwgZWFjaCBlbGVtZW50IG9mIGxpc3Qgd2lsbCBiZSBhbiBhcmd1bWVudAogICAgaWYgY29tcHJlc3MgaXMgbm90IE5vbmUgYW5kIGNvbXByZXNzIG5vdCBpbiBjb21wcmVzc19leHQ6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmFkIHZhbHVlIGZvciAnY29tcHJlc3MnLCBvciBjb21wcmVzc2lvbiBmb3JtYXQgbm90ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgOiB7MH0iLmZvcm1hdChjb21wcmVzcykpCgogICAgYXJjaGl2ZV9uYW1lID0gYmFzZV9uYW1lICsgJy50YXInICsgY29tcHJlc3NfZXh0LmdldChjb21wcmVzcywgJycpCiAgICBhcmNoaXZlX2RpciA9IG9zLnBhdGguZGlybmFtZShhcmNoaXZlX25hbWUpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfZGlyKToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAlcyIsIGFyY2hpdmVfZGlyKQogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICBvcy5tYWtlZGlycyhhcmNoaXZlX2RpcikKCiAgICAjIGNyZWF0aW5nIHRoZSB0YXJiYWxsCiAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nIHRhciBhcmNoaXZlJykKCiAgICB1aWQgPSBfZ2V0X3VpZChvd25lcikKICAgIGdpZCA9IF9nZXRfZ2lkKGdyb3VwKQoKICAgIGRlZiBfc2V0X3VpZF9naWQodGFyaW5mbyk6CiAgICAgICAgaWYgZ2lkIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJpbmZvLmdpZCA9IGdpZAogICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JvdXAKICAgICAgICBpZiB1aWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRhcmluZm8udWlkID0gdWlkCiAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSBvd25lcgogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfbmFtZSwgJ3d8JXMnICUgdGFyX2NvbXByZXNzaW9uW2NvbXByZXNzXSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhci5hZGQoYmFzZV9kaXIsIGZpbHRlcj1fc2V0X3VpZF9naWQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgdGFyLmNsb3NlKCkKCiAgICByZXR1cm4gYXJjaGl2ZV9uYW1lCgpkZWYgX2NhbGxfZXh0ZXJuYWxfemlwKGJhc2VfZGlyLCB6aXBfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UsIGRyeV9ydW49RmFsc2UpOgogICAgIyBYWFggc2VlIGlmIHdlIHdhbnQgdG8ga2VlcCBhbiBleHRlcm5hbCBjYWxsIGhlcmUKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgemlwb3B0aW9ucyA9ICItciIKICAgIGVsc2U6CiAgICAgICAgemlwb3B0aW9ucyA9ICItcnEiCiAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgogICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCiAgICB0cnk6CiAgICAgICAgc3Bhd24oWyJ6aXAiLCB6aXBvcHRpb25zLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyXSwgZHJ5X3J1bj1kcnlfcnVuKQogICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvcjoKICAgICAgICAjIFhYWCByZWFsbHkgc2hvdWxkIGRpc3Rpbmd1aXNoIGJldHdlZW4gImNvdWxkbid0IGZpbmQKICAgICAgICAjIGV4dGVybmFsICd6aXAnIGNvbW1hbmQiIGFuZCAiemlwIGZhaWxlZCIuCiAgICAgICAgcmFpc2UgRXhlY0Vycm9yKCJ1bmFibGUgdG8gY3JlYXRlIHppcCBmaWxlICclcyc6ICIKICAgICAgICAgICAgImNvdWxkIG5laXRoZXIgaW1wb3J0IHRoZSAnemlwZmlsZScgbW9kdWxlIG5vciAiCiAgICAgICAgICAgICJmaW5kIGEgc3RhbmRhbG9uZSB6aXAgdXRpbGl0eSIpICUgemlwX2ZpbGVuYW1lCgpkZWYgX21ha2VfemlwZmlsZShiYXNlX25hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgbG9nZ2VyPU5vbmUpOgogICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuCgogICAgVGhlIG91dHB1dCB6aXAgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX25hbWUnICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlCiAgICAiemlwZmlsZSIgUHl0aG9uIG1vZHVsZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgSW5mb1pJUCAiemlwIiB1dGlsaXR5CiAgICAoaWYgaW5zdGFsbGVkIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMKICAgIGF2YWlsYWJsZSwgcmFpc2VzIEV4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAKICAgIGZpbGUuCiAgICAiIiIKICAgIHppcF9maWxlbmFtZSA9IGJhc2VfbmFtZSArICIuemlwIgogICAgYXJjaGl2ZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYmFzZV9uYW1lKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX2Rpcik6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJXMiLCBhcmNoaXZlX2RpcikKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJjaGl2ZV9kaXIpCgogICAgIyBJZiB6aXBmaWxlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLCB0cnkgc3Bhd25pbmcgYW4gZXh0ZXJuYWwgJ3ppcCcKICAgICMgY29tbWFuZC4KICAgIHRyeToKICAgICAgICBpbXBvcnQgemlwZmlsZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHppcGZpbGUgPSBOb25lCgogICAgaWYgemlwZmlsZSBpcyBOb25lOgogICAgICAgIF9jYWxsX2V4dGVybmFsX3ppcChiYXNlX2RpciwgemlwX2ZpbGVuYW1lLCB2ZXJib3NlLCBkcnlfcnVuKQogICAgZWxzZToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCgogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKCiAgICAgICAgICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoYmFzZV9kaXIpOgogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgemlwLndyaXRlKHBhdGgsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgJyVzJyIsIHBhdGgpCiAgICAgICAgICAgIHppcC5jbG9zZSgpCgogICAgcmV0dXJuIHppcF9maWxlbmFtZQoKX0FSQ0hJVkVfRk9STUFUUyA9IHsKICAgICdnenRhcic6IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdnemlwJyldLCAiZ3ppcCdlZCB0YXItZmlsZSIpLAogICAgJ2J6dGFyJzogKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2J6aXAyJyldLCAiYnppcDInZWQgdGFyLWZpbGUiKSwKICAgICd0YXInOiAgIChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsIE5vbmUpXSwgInVuY29tcHJlc3NlZCB0YXIgZmlsZSIpLAogICAgJ3ppcCc6ICAgKF9tYWtlX3ppcGZpbGUsIFtdLCAiWklQIGZpbGUiKSwKICAgIH0KCmlmIF9CWjJfU1VQUE9SVEVEOgogICAgX0FSQ0hJVkVfRk9STUFUU1snYnp0YXInXSA9IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdiemlwMicpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnppcDInZWQgdGFyLWZpbGUiKQoKZGVmIGdldF9hcmNoaXZlX2Zvcm1hdHMoKToKICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzIGZvciBhcmNoaXZpbmcgYW5kIHVuYXJjaGl2aW5nLgoKICAgIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgaXMgYSB0dXBsZSAobmFtZSwgZGVzY3JpcHRpb24pCiAgICAiIiIKICAgIGZvcm1hdHMgPSBbKG5hbWUsIHJlZ2lzdHJ5WzJdKSBmb3IgbmFtZSwgcmVnaXN0cnkgaW4KICAgICAgICAgICAgICAgX0FSQ0hJVkVfRk9STUFUUy5pdGVtcygpXQogICAgZm9ybWF0cy5zb3J0KCkKICAgIHJldHVybiBmb3JtYXRzCgpkZWYgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQobmFtZSwgZnVuY3Rpb24sIGV4dHJhX2FyZ3M9Tm9uZSwgZGVzY3JpcHRpb249JycpOgogICAgIiIiUmVnaXN0ZXJzIGFuIGFyY2hpdmUgZm9ybWF0LgoKICAgIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdC4gZnVuY3Rpb24gaXMgdGhlIGNhbGxhYmxlIHRoYXQgd2lsbCBiZQogICAgdXNlZCB0byBjcmVhdGUgYXJjaGl2ZXMuIElmIHByb3ZpZGVkLCBleHRyYV9hcmdzIGlzIGEgc2VxdWVuY2Ugb2YKICAgIChuYW1lLCB2YWx1ZSkgdHVwbGVzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYWJsZS4KICAgIGRlc2NyaXB0aW9uIGNhbiBiZSBwcm92aWRlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0LCBhbmQgd2lsbCBiZSByZXR1cm5lZAogICAgYnkgdGhlIGdldF9hcmNoaXZlX2Zvcm1hdHMoKSBmdW5jdGlvbi4KICAgICIiIgogICAgaWYgZXh0cmFfYXJncyBpcyBOb25lOgogICAgICAgIGV4dHJhX2FyZ3MgPSBbXQogICAgaWYgbm90IGlzaW5zdGFuY2UoZnVuY3Rpb24sIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RoZSAlcyBvYmplY3QgaXMgbm90IGNhbGxhYmxlJyAlIGZ1bmN0aW9uKQogICAgaWYgbm90IGlzaW5zdGFuY2UoZXh0cmFfYXJncywgKHR1cGxlLCBsaXN0KSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHRyYV9hcmdzIG5lZWRzIHRvIGJlIGEgc2VxdWVuY2UnKQogICAgZm9yIGVsZW1lbnQgaW4gZXh0cmFfYXJnczoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlbGVtZW50LCAodHVwbGUsIGxpc3QpKSBvciBsZW4oZWxlbWVudCkgIT0yOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4dHJhX2FyZ3MgZWxlbWVudHMgYXJlIDogKGFyZ19uYW1lLCB2YWx1ZSknKQoKICAgIF9BUkNISVZFX0ZPUk1BVFNbbmFtZV0gPSAoZnVuY3Rpb24sIGV4dHJhX2FyZ3MsIGRlc2NyaXB0aW9uKQoKZGVmIHVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQobmFtZSk6CiAgICBkZWwgX0FSQ0hJVkVfRk9STUFUU1tuYW1lXQoKZGVmIG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsIGZvcm1hdCwgcm9vdF9kaXI9Tm9uZSwgYmFzZV9kaXI9Tm9uZSwgdmVyYm9zZT0wLAogICAgICAgICAgICAgICAgIGRyeV9ydW49MCwgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSwgbG9nZ2VyPU5vbmUpOgogICAgIiIiQ3JlYXRlIGFuIGFyY2hpdmUgZmlsZSAoZWcuIHppcCBvciB0YXIpLgoKICAgICdiYXNlX25hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZSwgbWludXMgYW55IGZvcm1hdC1zcGVjaWZpYwogICAgZXh0ZW5zaW9uOyAnZm9ybWF0JyBpcyB0aGUgYXJjaGl2ZSBmb3JtYXQ6IG9uZSBvZiAiemlwIiwgInRhciIsICJienRhciIKICAgIG9yICJnenRhciIuCgogICAgJ3Jvb3RfZGlyJyBpcyBhIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZQogICAgYXJjaGl2ZTsgaWUuIHdlIHR5cGljYWxseSBjaGRpciBpbnRvICdyb290X2RpcicgYmVmb3JlIGNyZWF0aW5nIHRoZQogICAgYXJjaGl2ZS4gICdiYXNlX2RpcicgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSBzdGFydCBhcmNoaXZpbmcgZnJvbTsKICAgIGllLiAnYmFzZV9kaXInIHdpbGwgYmUgdGhlIGNvbW1vbiBwcmVmaXggb2YgYWxsIGZpbGVzIGFuZAogICAgZGlyZWN0b3JpZXMgaW4gdGhlIGFyY2hpdmUuICAncm9vdF9kaXInIGFuZCAnYmFzZV9kaXInIGJvdGggZGVmYXVsdAogICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBmaWxlLgoKICAgICdvd25lcicgYW5kICdncm91cCcgYXJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBhcmNoaXZlLiBCeSBkZWZhdWx0LAogICAgdXNlcyB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAuCiAgICAiIiIKICAgIHNhdmVfY3dkID0gb3MuZ2V0Y3dkKCkKICAgIGlmIHJvb3RfZGlyIGlzIG5vdCBOb25lOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJjaGFuZ2luZyBpbnRvICclcyciLCByb290X2RpcikKICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9uYW1lKQogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICBvcy5jaGRpcihyb290X2RpcikKCiAgICBpZiBiYXNlX2RpciBpcyBOb25lOgogICAgICAgIGJhc2VfZGlyID0gb3MuY3VyZGlyCgogICAga3dhcmdzID0geydkcnlfcnVuJzogZHJ5X3J1biwgJ2xvZ2dlcic6IGxvZ2dlcn0KCiAgICB0cnk6CiAgICAgICAgZm9ybWF0X2luZm8gPSBfQVJDSElWRV9GT1JNQVRTW2Zvcm1hdF0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGFyY2hpdmUgZm9ybWF0ICclcyciICUgZm9ybWF0KQoKICAgIGZ1bmMgPSBmb3JtYXRfaW5mb1swXQogICAgZm9yIGFyZywgdmFsIGluIGZvcm1hdF9pbmZvWzFdOgogICAgICAgIGt3YXJnc1thcmddID0gdmFsCgogICAgaWYgZm9ybWF0ICE9ICd6aXAnOgogICAgICAgIGt3YXJnc1snb3duZXInXSA9IG93bmVyCiAgICAgICAga3dhcmdzWydncm91cCddID0gZ3JvdXAKCiAgICB0cnk6CiAgICAgICAgZmlsZW5hbWUgPSBmdW5jKGJhc2VfbmFtZSwgYmFzZV9kaXIsICoqa3dhcmdzKQogICAgZmluYWxseToKICAgICAgICBpZiByb290X2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJjaGFuZ2luZyBiYWNrIHRvICclcyciLCBzYXZlX2N3ZCkKICAgICAgICAgICAgb3MuY2hkaXIoc2F2ZV9jd2QpCgogICAgcmV0dXJuIGZpbGVuYW1lCgoKZGVmIGdldF91bnBhY2tfZm9ybWF0cygpOgogICAgIiIiUmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMgZm9yIHVucGFja2luZy4KCiAgICBFYWNoIGVsZW1lbnQgb2YgdGhlIHJldHVybmVkIHNlcXVlbmNlIGlzIGEgdHVwbGUKICAgIChuYW1lLCBleHRlbnNpb25zLCBkZXNjcmlwdGlvbikKICAgICIiIgogICAgZm9ybWF0cyA9IFsobmFtZSwgaW5mb1swXSwgaW5mb1szXSkgZm9yIG5hbWUsIGluZm8gaW4KICAgICAgICAgICAgICAgX1VOUEFDS19GT1JNQVRTLml0ZW1zKCldCiAgICBmb3JtYXRzLnNvcnQoKQogICAgcmV0dXJuIGZvcm1hdHMKCmRlZiBfY2hlY2tfdW5wYWNrX29wdGlvbnMoZXh0ZW5zaW9ucywgZnVuY3Rpb24sIGV4dHJhX2FyZ3MpOgogICAgIiIiQ2hlY2tzIHdoYXQgZ2V0cyByZWdpc3RlcmVkIGFzIGFuIHVucGFja2VyLiIiIgogICAgIyBmaXJzdCBtYWtlIHN1cmUgbm8gb3RoZXIgdW5wYWNrZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBleHRlbnNpb24KICAgIGV4aXN0aW5nX2V4dGVuc2lvbnMgPSB7fQogICAgZm9yIG5hbWUsIGluZm8gaW4gX1VOUEFDS19GT1JNQVRTLml0ZW1zKCk6CiAgICAgICAgZm9yIGV4dCBpbiBpbmZvWzBdOgogICAgICAgICAgICBleGlzdGluZ19leHRlbnNpb25zW2V4dF0gPSBuYW1lCgogICAgZm9yIGV4dGVuc2lvbiBpbiBleHRlbnNpb25zOgogICAgICAgIGlmIGV4dGVuc2lvbiBpbiBleGlzdGluZ19leHRlbnNpb25zOgogICAgICAgICAgICBtc2cgPSAnJXMgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciAiJXMiJwogICAgICAgICAgICByYWlzZSBSZWdpc3RyeUVycm9yKG1zZyAlIChleHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX2V4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCgogICAgaWYgbm90IGlzaW5zdGFuY2UoZnVuY3Rpb24sIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RoZSByZWdpc3RlcmVkIGZ1bmN0aW9uIG11c3QgYmUgYSBjYWxsYWJsZScpCgoKZGVmIHJlZ2lzdGVyX3VucGFja19mb3JtYXQobmFtZSwgZXh0ZW5zaW9ucywgZnVuY3Rpb24sIGV4dHJhX2FyZ3M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249JycpOgogICAgIiIiUmVnaXN0ZXJzIGFuIHVucGFjayBmb3JtYXQuCgogICAgYG5hbWVgIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuIGBleHRlbnNpb25zYCBpcyBhIGxpc3Qgb2YgZXh0ZW5zaW9ucwogICAgY29ycmVzcG9uZGluZyB0byB0aGUgZm9ybWF0LgoKICAgIGBmdW5jdGlvbmAgaXMgdGhlIGNhbGxhYmxlIHRoYXQgd2lsbCBiZQogICAgdXNlZCB0byB1bnBhY2sgYXJjaGl2ZXMuIFRoZSBjYWxsYWJsZSB3aWxsIHJlY2VpdmUgYXJjaGl2ZXMgdG8gdW5wYWNrLgogICAgSWYgaXQncyB1bmFibGUgdG8gaGFuZGxlIGFuIGFyY2hpdmUsIGl0IG5lZWRzIHRvIHJhaXNlIGEgUmVhZEVycm9yCiAgICBleGNlcHRpb24uCgogICAgSWYgcHJvdmlkZWQsIGBleHRyYV9hcmdzYCBpcyBhIHNlcXVlbmNlIG9mCiAgICAobmFtZSwgdmFsdWUpIHR1cGxlcyB0aGF0IHdpbGwgYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgY2FsbGFibGUuCiAgICBkZXNjcmlwdGlvbiBjYW4gYmUgcHJvdmlkZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCwgYW5kIHdpbGwgYmUgcmV0dXJuZWQKICAgIGJ5IHRoZSBnZXRfdW5wYWNrX2Zvcm1hdHMoKSBmdW5jdGlvbi4KICAgICIiIgogICAgaWYgZXh0cmFfYXJncyBpcyBOb25lOgogICAgICAgIGV4dHJhX2FyZ3MgPSBbXQogICAgX2NoZWNrX3VucGFja19vcHRpb25zKGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzKQogICAgX1VOUEFDS19GT1JNQVRTW25hbWVdID0gZXh0ZW5zaW9ucywgZnVuY3Rpb24sIGV4dHJhX2FyZ3MsIGRlc2NyaXB0aW9uCgpkZWYgdW5yZWdpc3Rlcl91bnBhY2tfZm9ybWF0KG5hbWUpOgogICAgIiIiUmVtb3ZlcyB0aGUgcGFjayBmb3JtYXQgZnJvbSB0aGUgcmVnaXN0cnkuIiIiCiAgICBkZWwgX1VOUEFDS19GT1JNQVRTW25hbWVdCgpkZWYgX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICBvcy5tYWtlZGlycyhkaXJuYW1lKQoKZGVmIF91bnBhY2tfemlwZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIpOgogICAgIiIiVW5wYWNrIHppcCBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKICAgICIiIgogICAgdHJ5OgogICAgICAgIGltcG9ydCB6aXBmaWxlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUmVhZEVycm9yKCd6bGliIG5vdCBzdXBwb3J0ZWQsIGNhbm5vdCB1bnBhY2sgdGhpcyBhcmNoaXZlLicpCgogICAgaWYgbm90IHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgUmVhZEVycm9yKCIlcyBpcyBub3QgYSB6aXAgZmlsZSIgJSBmaWxlbmFtZSkKCiAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgZm9yIGluZm8gaW4gemlwLmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCgogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICAjIGZpbGUKICAgICAgICAgICAgICAgIGRhdGEgPSB6aXAucmVhZChpbmZvLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAnd2InKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgZGVsIGRhdGEKICAgIGZpbmFsbHk6CiAgICAgICAgemlwLmNsb3NlKCkKCmRlZiBfdW5wYWNrX3RhcmZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyKToKICAgICIiIlVucGFjayB0YXIvdGFyLmd6L3Rhci5iejIgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCiAgICAiIiIKICAgIHRyeToKICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCiAgICBleGNlcHQgdGFyZmlsZS5UYXJFcnJvcjoKICAgICAgICByYWlzZSBSZWFkRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSBmaWxlbmFtZSkKICAgIHRyeToKICAgICAgICB0YXJvYmouZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIGZpbmFsbHk6CiAgICAgICAgdGFyb2JqLmNsb3NlKCkKCl9VTlBBQ0tfRk9STUFUUyA9IHsKICAgICdnenRhcic6IChbJy50YXIuZ3onLCAnLnRneiddLCBfdW5wYWNrX3RhcmZpbGUsIFtdLCAiZ3ppcCdlZCB0YXItZmlsZSIpLAogICAgJ3Rhcic6ICAgKFsnLnRhciddLCBfdW5wYWNrX3RhcmZpbGUsIFtdLCAidW5jb21wcmVzc2VkIHRhciBmaWxlIiksCiAgICAnemlwJzogICAoWycuemlwJ10sIF91bnBhY2tfemlwZmlsZSwgW10sICJaSVAgZmlsZSIpCiAgICB9CgppZiBfQloyX1NVUFBPUlRFRDoKICAgIF9VTlBBQ0tfRk9STUFUU1snYnp0YXInXSA9IChbJy5iejInXSwgX3VucGFja190YXJmaWxlLCBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnppcDInZWQgdGFyLWZpbGUiKQoKZGVmIF9maW5kX3VucGFja19mb3JtYXQoZmlsZW5hbWUpOgogICAgZm9yIG5hbWUsIGluZm8gaW4gX1VOUEFDS19GT1JNQVRTLml0ZW1zKCk6CiAgICAgICAgZm9yIGV4dGVuc2lvbiBpbiBpbmZvWzBdOgogICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aChleHRlbnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKICAgIHJldHVybiBOb25lCgpkZWYgdW5wYWNrX2FyY2hpdmUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyPU5vbmUsIGZvcm1hdD1Ob25lKToKICAgICIiIlVucGFjayBhbiBhcmNoaXZlLgoKICAgIGBmaWxlbmFtZWAgaXMgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUuCgogICAgYGV4dHJhY3RfZGlyYCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGFyY2hpdmUKICAgIGlzIHVucGFja2VkLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIHVzZWQuCgogICAgYGZvcm1hdGAgaXMgdGhlIGFyY2hpdmUgZm9ybWF0OiBvbmUgb2YgInppcCIsICJ0YXIiLCBvciAiZ3p0YXIiLiBPciBhbnkKICAgIG90aGVyIHJlZ2lzdGVyZWQgZm9ybWF0LiBJZiBub3QgcHJvdmlkZWQsIHVucGFja19hcmNoaXZlIHdpbGwgdXNlIHRoZQogICAgZmlsZW5hbWUgZXh0ZW5zaW9uIGFuZCBzZWUgaWYgYW4gdW5wYWNrZXIgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoYXQKICAgIGV4dGVuc2lvbi4KCiAgICBJbiBjYXNlIG5vbmUgaXMgZm91bmQsIGEgVmFsdWVFcnJvciBpcyByYWlzZWQuCiAgICAiIiIKICAgIGlmIGV4dHJhY3RfZGlyIGlzIE5vbmU6CiAgICAgICAgZXh0cmFjdF9kaXIgPSBvcy5nZXRjd2QoKQoKICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvcm1hdF9pbmZvID0gX1VOUEFDS19GT1JNQVRTW2Zvcm1hdF0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVua25vd24gdW5wYWNrIGZvcm1hdCAnezB9JyIuZm9ybWF0KGZvcm1hdCkpCgogICAgICAgIGZ1bmMgPSBmb3JtYXRfaW5mb1sxXQogICAgICAgIGZ1bmMoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCAqKmRpY3QoZm9ybWF0X2luZm9bMl0pKQogICAgZWxzZToKICAgICAgICAjIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgcmVnaXN0ZXJlZCB1bnBhY2tlcnMgc3VwcG9ydGVkIGV4dGVuc2lvbnMKICAgICAgICBmb3JtYXQgPSBfZmluZF91bnBhY2tfZm9ybWF0KGZpbGVuYW1lKQogICAgICAgIGlmIGZvcm1hdCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIlVua25vd24gYXJjaGl2ZSBmb3JtYXQgJ3swfSciLmZvcm1hdChmaWxlbmFtZSkpCgogICAgICAgIGZ1bmMgPSBfVU5QQUNLX0ZPUk1BVFNbZm9ybWF0XVsxXQogICAgICAgIGt3YXJncyA9IGRpY3QoX1VOUEFDS19GT1JNQVRTW2Zvcm1hdF1bMl0pCiAgICAgICAgZnVuYyhmaWxlbmFtZSwgZXh0cmFjdF9kaXIsICoqa3dhcmdzKQpQSwMEFAAAAAAAAAAhAG8WAK05CgAAOQoAADsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLmNmZ1twb3NpeF9wcmVmaXhdCiMgQ29uZmlndXJhdGlvbiBkaXJlY3Rvcmllcy4gIFNvbWUgb2YgdGhlc2UgY29tZSBzdHJhaWdodCBvdXQgb2YgdGhlCiMgY29uZmlndXJlIHNjcmlwdC4gIFRoZXkgYXJlIGZvciBpbXBsZW1lbnRpbmcgdGhlIG90aGVyIHZhcmlhYmxlcywgbm90IHRvCiMgYmUgdXNlZCBkaXJlY3RseSBpbiBbcmVzb3VyY2VfbG9jYXRpb25zXS4KY29uZmRpciA9IC9ldGMKZGF0YWRpciA9IC91c3Ivc2hhcmUKbGliZGlyID0gL3Vzci9saWIKc3RhdGVkaXIgPSAvdmFyCiMgVXNlciByZXNvdXJjZSBkaXJlY3RvcnkKbG9jYWwgPSB+Ly5sb2NhbC97ZGlzdHJpYnV0aW9uLm5hbWV9CgpzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3BsYXRiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7cGxhdGJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9e2FiaWZsYWdzfQpwbGF0aW5jbHVkZSA9IHtwbGF0YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH17YWJpZmxhZ3N9CmRhdGEgPSB7YmFzZX0KCltwb3NpeF9ob21lXQpzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgpwbGF0c3RkbGliID0ge2Jhc2V9L2xpYi9weXRob24KcHVyZWxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCnBsYXRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgppbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9uCnBsYXRpbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9uCnNjcmlwdHMgPSB7YmFzZX0vYmluCmRhdGEgPSB7YmFzZX0KCltudF0Kc3RkbGliID0ge2Jhc2V9L0xpYgpwbGF0c3RkbGliID0ge2Jhc2V9L0xpYgpwdXJlbGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnBsYXRpbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKc2NyaXB0cyA9IHtiYXNlfS9TY3JpcHRzCmRhdGEgPSB7YmFzZX0KCltvczJdCnN0ZGxpYiA9IHtiYXNlfS9MaWIKcGxhdHN0ZGxpYiA9IHtiYXNlfS9MaWIKcHVyZWxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpwbGF0aW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnNjcmlwdHMgPSB7YmFzZX0vU2NyaXB0cwpkYXRhID0ge2Jhc2V9Cgpbb3MyX2hvbWVdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0Kc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9CgpbbnRfdXNlcl0Kc3RkbGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9JbmNsdWRlCnNjcmlwdHMgPSB7dXNlcmJhc2V9L1NjcmlwdHMKZGF0YSA9IHt1c2VyYmFzZX0KCltwb3NpeF91c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwdXJlbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnNjcmlwdHMgPSB7dXNlcmJhc2V9L2JpbgpkYXRhID0ge3VzZXJiYXNlfQoKW29zeF9mcmFtZXdvcmtfdXNlcl0Kc3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uCnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24KcHVyZWxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9pbmNsdWRlCnNjcmlwdHMgPSB7dXNlcmJhc2V9L2JpbgpkYXRhID0ge3VzZXJiYXNlfQpQSwMEFAAAAAAAAAAhADYPUtZLaQAAS2kAADoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkFjY2VzcyB0byBQeXRob24ncyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiIiIgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKZnJvbSBvcy5wYXRoIGltcG9ydCBwYXJkaXIsIHJlYWxwYXRoCnRyeToKICAgIGltcG9ydCBjb25maWdwYXJzZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IENvbmZpZ1BhcnNlciBhcyBjb25maWdwYXJzZXIKCgpfX2FsbF9fID0gWwogICAgJ2dldF9jb25maWdfaF9maWxlbmFtZScsCiAgICAnZ2V0X2NvbmZpZ192YXInLAogICAgJ2dldF9jb25maWdfdmFycycsCiAgICAnZ2V0X21ha2VmaWxlX2ZpbGVuYW1lJywKICAgICdnZXRfcGF0aCcsCiAgICAnZ2V0X3BhdGhfbmFtZXMnLAogICAgJ2dldF9wYXRocycsCiAgICAnZ2V0X3BsYXRmb3JtJywKICAgICdnZXRfcHl0aG9uX3ZlcnNpb24nLAogICAgJ2dldF9zY2hlbWVfbmFtZXMnLAogICAgJ3BhcnNlX2NvbmZpZ19oJywKXQoKCmRlZiBfc2FmZV9yZWFscGF0aChwYXRoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gcmVhbHBhdGgocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHJldHVybiBwYXRoCgoKaWYgc3lzLmV4ZWN1dGFibGU6CiAgICBfUFJPSkVDVF9CQVNFID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKZWxzZToKICAgICMgc3lzLmV4ZWN1dGFibGUgY2FuIGJlIGVtcHR5IGlmIGFyZ3ZbMF0gaGFzIGJlZW4gY2hhbmdlZCBhbmQgUHl0aG9uIGlzCiAgICAjIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgcmVhbCBwcm9ncmFtIG5hbWUKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5nZXRjd2QoKSkKCmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgInBjYnVpbGQiIGluIF9QUk9KRUNUX0JBU0VbLTg6XS5sb3dlcigpOgogICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIpKQojIFBDL1ZTNy4xCmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNcXHYiIGluIF9QUk9KRUNUX0JBU0VbLTEwOl0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyLCBwYXJkaXIpKQojIFBDL0FNRDY0CmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNidWlsZFxcYW1kNjQiIGluIF9QUk9KRUNUX0JBU0VbLTE0Ol0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyLCBwYXJkaXIpKQoKCmRlZiBpc19weXRob25fYnVpbGQoKToKICAgIGZvciBmbiBpbiAoIlNldHVwLmRpc3QiLCAiU2V0dXAubG9jYWwiKToKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIk1vZHVsZXMiLCBmbikpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgpfUFlUSE9OX0JVSUxEID0gaXNfcHl0aG9uX2J1aWxkKCkKCl9jZmdfcmVhZCA9IEZhbHNlCgpkZWYgX2Vuc3VyZV9jZmdfcmVhZCgpOgogICAgZ2xvYmFsIF9jZmdfcmVhZAogICAgaWYgbm90IF9jZmdfcmVhZDoKICAgICAgICBmcm9tIC4ucmVzb3VyY2VzIGltcG9ydCBmaW5kZXIKICAgICAgICBiYWNrcG9ydF9wYWNrYWdlID0gX19uYW1lX18ucnNwbGl0KCcuJywgMSlbMF0KICAgICAgICBfZmluZGVyID0gZmluZGVyKGJhY2twb3J0X3BhY2thZ2UpCiAgICAgICAgX2NmZ2ZpbGUgPSBfZmluZGVyLmZpbmQoJ3N5c2NvbmZpZy5jZmcnKQogICAgICAgIGFzc2VydCBfY2ZnZmlsZSwgJ3N5c2NvbmZpZy5jZmcgZXhpc3RzJwogICAgICAgIHdpdGggX2NmZ2ZpbGUuYXNfc3RyZWFtKCkgYXMgczoKICAgICAgICAgICAgX1NDSEVNRVMucmVhZGZwKHMpCiAgICAgICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICAgICAgZm9yIHNjaGVtZSBpbiAoJ3Bvc2l4X3ByZWZpeCcsICdwb3NpeF9ob21lJyk6CiAgICAgICAgICAgICAgICBfU0NIRU1FUy5zZXQoc2NoZW1lLCAnaW5jbHVkZScsICd7c3JjZGlyfS9JbmNsdWRlJykKICAgICAgICAgICAgICAgIF9TQ0hFTUVTLnNldChzY2hlbWUsICdwbGF0aW5jbHVkZScsICd7cHJvamVjdGJhc2V9Ly4nKQoKICAgICAgICBfY2ZnX3JlYWQgPSBUcnVlCgoKX1NDSEVNRVMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKX1ZBUl9SRVBMID0gcmUuY29tcGlsZShyJ1x7KFtee10qPylcfScpCgpkZWYgX2V4cGFuZF9nbG9iYWxzKGNvbmZpZyk6CiAgICBfZW5zdXJlX2NmZ19yZWFkKCkKICAgIGlmIGNvbmZpZy5oYXNfc2VjdGlvbignZ2xvYmFscycpOgogICAgICAgIGdsb2JhbHMgPSBjb25maWcuaXRlbXMoJ2dsb2JhbHMnKQogICAgZWxzZToKICAgICAgICBnbG9iYWxzID0gdHVwbGUoKQoKICAgIHNlY3Rpb25zID0gY29uZmlnLnNlY3Rpb25zKCkKICAgIGZvciBzZWN0aW9uIGluIHNlY3Rpb25zOgogICAgICAgIGlmIHNlY3Rpb24gPT0gJ2dsb2JhbHMnOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIGdsb2JhbHM6CiAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb25maWcuc2V0KHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCiAgICBjb25maWcucmVtb3ZlX3NlY3Rpb24oJ2dsb2JhbHMnKQoKICAgICMgbm93IGV4cGFuZGluZyBsb2NhbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2ZnIGZpbGUKICAgICMKICAgIGZvciBzZWN0aW9uIGluIGNvbmZpZy5zZWN0aW9ucygpOgogICAgICAgIHZhcmlhYmxlcyA9IGRpY3QoY29uZmlnLml0ZW1zKHNlY3Rpb24pKQoKICAgICAgICBkZWYgX3JlcGxhY2VyKG1hdGNob2JqKToKICAgICAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gdmFyaWFibGVzOgogICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlc1tuYW1lXQogICAgICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKCiAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gY29uZmlnLml0ZW1zKHNlY3Rpb24pOgogICAgICAgICAgICBjb25maWcuc2V0KHNlY3Rpb24sIG9wdGlvbiwgX1ZBUl9SRVBMLnN1YihfcmVwbGFjZXIsIHZhbHVlKSkKCiNfZXhwYW5kX2dsb2JhbHMoX1NDSEVNRVMpCgogIyBGSVhNRSBkb24ndCByZWx5IG9uIHN5cy52ZXJzaW9uIGhlcmUsIGl0cyBmb3JtYXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsCiAjIG9mIENQeXRob24sIHVzZSBzeXMudmVyc2lvbl9pbmZvIG9yIHN5cy5oZXh2ZXJzaW9uCl9QWV9WRVJTSU9OID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQpfUFlfVkVSU0lPTl9TSE9SVCA9IHN5cy52ZXJzaW9uWzozXQpfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCl9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCl9FWEVDX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQpfQ09ORklHX1ZBUlMgPSBOb25lCl9VU0VSX0JBU0UgPSBOb25lCgoKZGVmIF9zdWJzdF92YXJzKHBhdGgsIGxvY2FsX3ZhcnMpOgogICAgIiIiSW4gdGhlIHN0cmluZyBgcGF0aGAsIHJlcGxhY2UgdG9rZW5zIGxpa2Uge3NvbWUudGhpbmd9IHdpdGggdGhlCiAgICBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gdGhlIG1hcCBgbG9jYWxfdmFyc2AuCgogICAgSWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyB2YWx1ZSwgbGVhdmUgdGhlIHRva2VuIHVuY2hhbmdlZC4KICAgICIiIgogICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgaWYgbmFtZSBpbiBsb2NhbF92YXJzOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfdmFyc1tuYW1lXQogICAgICAgIGVsaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICByZXR1cm4gb3MuZW52aXJvbltuYW1lXQogICAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgwKQogICAgcmV0dXJuIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCBwYXRoKQoKCmRlZiBfZXh0ZW5kX2RpY3QodGFyZ2V0X2RpY3QsIG90aGVyX2RpY3QpOgogICAgdGFyZ2V0X2tleXMgPSB0YXJnZXRfZGljdC5rZXlzKCkKICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyX2RpY3QuaXRlbXMoKToKICAgICAgICBpZiBrZXkgaW4gdGFyZ2V0X2tleXM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdGFyZ2V0X2RpY3Rba2V5XSA9IHZhbHVlCgoKZGVmIF9leHBhbmRfdmFycyhzY2hlbWUsIHZhcnMpOgogICAgcmVzID0ge30KICAgIGlmIHZhcnMgaXMgTm9uZToKICAgICAgICB2YXJzID0ge30KICAgIF9leHRlbmRfZGljdCh2YXJzLCBnZXRfY29uZmlnX3ZhcnMoKSkKCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfU0NIRU1FUy5pdGVtcyhzY2hlbWUpOgogICAgICAgIGlmIG9zLm5hbWUgaW4gKCdwb3NpeCcsICdudCcpOgogICAgICAgICAgICB2YWx1ZSA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWx1ZSkKICAgICAgICByZXNba2V5XSA9IG9zLnBhdGgubm9ybXBhdGgoX3N1YnN0X3ZhcnModmFsdWUsIHZhcnMpKQogICAgcmV0dXJuIHJlcwoKCmRlZiBmb3JtYXRfdmFsdWUodmFsdWUsIHZhcnMpOgogICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgaWYgbmFtZSBpbiB2YXJzOgogICAgICAgICAgICByZXR1cm4gdmFyc1tuYW1lXQogICAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgwKQogICAgcmV0dXJuIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCB2YWx1ZSkKCgpkZWYgX2dldF9kZWZhdWx0X3NjaGVtZSgpOgogICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICMgdGhlIGRlZmF1bHQgc2NoZW1lIGZvciBwb3NpeCBpcyBwb3NpeF9wcmVmaXgKICAgICAgICByZXR1cm4gJ3Bvc2l4X3ByZWZpeCcKICAgIHJldHVybiBvcy5uYW1lCgoKZGVmIF9nZXR1c2VyYmFzZSgpOgogICAgZW52X2Jhc2UgPSBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVVNFUkJBU0UiLCBOb25lKQoKICAgIGRlZiBqb2ludXNlcigqYXJncyk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oKmFyZ3MpKQoKICAgICMgd2hhdCBhYm91dCAnb3MyZW14JywgJ3Jpc2NvcycgPwogICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgIGJhc2UgPSBvcy5lbnZpcm9uLmdldCgiQVBQREFUQSIpIG9yICJ+IgogICAgICAgIGlmIGVudl9iYXNlOgogICAgICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gam9pbnVzZXIoYmFzZSwgIlB5dGhvbiIpCgogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIGZyYW1ld29yayA9IGdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKQogICAgICAgIGlmIGZyYW1ld29yazoKICAgICAgICAgICAgaWYgZW52X2Jhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBqb2ludXNlcigifiIsICJMaWJyYXJ5IiwgZnJhbWV3b3JrLCAiJWQuJWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvWzoyXSkKCiAgICBpZiBlbnZfYmFzZToKICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGpvaW51c2VyKCJ+IiwgIi5sb2NhbCIpCgoKZGVmIF9wYXJzZV9tYWtlZmlsZShmaWxlbmFtZSwgdmFycz1Ob25lKToKICAgICIiIlBhcnNlIGEgTWFrZWZpbGUtc3R5bGUgZmlsZS4KCiAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KICAgIG9wdGlvbmFsIGRpY3Rpb25hcnkgaXMgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGl0IGlzCiAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KICAgICIiIgogICAgIyBSZWdleGVzIG5lZWRlZCBmb3IgcGFyc2luZyBNYWtlZmlsZSAoYW5kIHNpbWlsYXIgc3ludGF4ZXMsCiAgICAjIGxpa2Ugb2xkLXN0eWxlIFNldHVwIGZpbGVzKS4KICAgIF92YXJpYWJsZV9yeCA9IHJlLmNvbXBpbGUoIihbYS16QS1aXVthLXpBLVowLTlfXSspXHMqPVxzKiguKikiKQogICAgX2ZpbmR2YXIxX3J4ID0gcmUuY29tcGlsZShyIlwkXCgoW0EtWmEtel1bQS1aYS16MC05X10qKVwpIikKICAgIF9maW5kdmFyMl9yeCA9IHJlLmNvbXBpbGUociJcJHsoW0EtWmEtel1bQS1aYS16MC05X10qKX0iKQoKICAgIGlmIHZhcnMgaXMgTm9uZToKICAgICAgICB2YXJzID0ge30KICAgIGRvbmUgPSB7fQogICAgbm90ZG9uZSA9IHt9CgogICAgd2l0aCBjb2RlY3Mub3BlbihmaWxlbmFtZSwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKSBhcyBmOgogICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIGxpbmUuc3RyaXAoKSA9PSAnJzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBtID0gX3ZhcmlhYmxlX3J4Lm1hdGNoKGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKICAgICAgICAgICAgdiA9IHYuc3RyaXAoKQogICAgICAgICAgICAjIGAkJCcgaXMgYSBsaXRlcmFsIGAkJyBpbiBtYWtlCiAgICAgICAgICAgIHRtcHYgPSB2LnJlcGxhY2UoJyQkJywgJycpCgogICAgICAgICAgICBpZiAiJCIgaW4gdG1wdjoKICAgICAgICAgICAgICAgIG5vdGRvbmVbbl0gPSB2CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbGl0ZXJhbCBgJCcKICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdi5yZXBsYWNlKCckJCcsICckJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IHYKCiAgICAjIGRvIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZQogICAgdmFyaWFibGVzID0gbGlzdChub3Rkb25lLmtleXMoKSkKCiAgICAjIFZhcmlhYmxlcyB3aXRoIGEgJ1BZXycgcHJlZml4IGluIHRoZSBtYWtlZmlsZS4gVGhlc2UgbmVlZCB0bwogICAgIyBiZSBtYWRlIGF2YWlsYWJsZSB3aXRob3V0IHRoYXQgcHJlZml4IHRocm91Z2ggc3lzY29uZmlnLgogICAgIyBTcGVjaWFsIGNhcmUgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHZhcmlhYmxlIGV4cGFuc2lvbiB3b3JrcywgZXZlbgogICAgIyBpZiB0aGUgZXhwYW5zaW9uIHVzZXMgdGhlIG5hbWUgd2l0aG91dCBhIHByZWZpeC4KICAgIHJlbmFtZWRfdmFyaWFibGVzID0gKCdDRkxBR1MnLCAnTERGTEFHUycsICdDUFBGTEFHUycpCgogICAgd2hpbGUgbGVuKHZhcmlhYmxlcykgPiAwOgogICAgICAgIGZvciBuYW1lIGluIHR1cGxlKHZhcmlhYmxlcyk6CiAgICAgICAgICAgIHZhbHVlID0gbm90ZG9uZVtuYW1lXQogICAgICAgICAgICBtID0gX2ZpbmR2YXIxX3J4LnNlYXJjaCh2YWx1ZSkgb3IgX2ZpbmR2YXIyX3J4LnNlYXJjaCh2YWx1ZSkKICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIG4gPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG4gaW4gZG9uZToKICAgICAgICAgICAgICAgICAgICBpdGVtID0gc3RyKGRvbmVbbl0pCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gbm90ZG9uZToKICAgICAgICAgICAgICAgICAgICAjIGdldCBpdCBvbiBhIHN1YnNlcXVlbnQgcm91bmQKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgICAgICAgICAjIGRvIGl0IGxpa2UgbWFrZTogZmFsbCBiYWNrIHRvIGVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG9zLmVudmlyb25bbl0KCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gcmVuYW1lZF92YXJpYWJsZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzd2l0aCgnUFlfJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMzpdIGluIHJlbmFtZWRfdmFyaWFibGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9ICIiCgogICAgICAgICAgICAgICAgICAgIGVsaWYgJ1BZXycgKyBuIGluIG5vdGRvbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0cihkb25lWydQWV8nICsgbl0pCgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gaXRlbSA9ICIiCgogICAgICAgICAgICAgICAgaWYgZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSB2YWx1ZVttLmVuZCgpOl0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzptLnN0YXJ0KCldICsgaXRlbSArIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgaWYgIiQiIGluIGFmdGVyOgogICAgICAgICAgICAgICAgICAgICAgICBub3Rkb25lW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgoJ1BZXycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVszOl0gaW4gcmVuYW1lZF92YXJpYWJsZXMpOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzM6XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gZG9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGJvZ3VzIHZhcmlhYmxlIHJlZmVyZW5jZSAoZS5nLiAicHJlZml4PSQvb3B0L3B5dGhvbiIpOwogICAgICAgICAgICAgICAgIyBqdXN0IGRyb3AgaXQgc2luY2Ugd2UgY2FuJ3QgZGVhbAogICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKG5hbWUpCgogICAgIyBzdHJpcCBzcHVyaW91cyBzcGFjZXMKICAgIGZvciBrLCB2IGluIGRvbmUuaXRlbXMoKToKICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CiAgICAgICAgICAgIGRvbmVba10gPSB2LnN0cmlwKCkKCiAgICAjIHNhdmUgdGhlIHJlc3VsdHMgaW4gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5CiAgICB2YXJzLnVwZGF0ZShkb25lKQogICAgcmV0dXJuIHZhcnMKCgpkZWYgZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCk6CiAgICAiIiJSZXR1cm4gdGhlIHBhdGggb2YgdGhlIE1ha2VmaWxlLiIiIgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNYWtlZmlsZSIpCiAgICBpZiBoYXNhdHRyKHN5cywgJ2FiaWZsYWdzJyk6CiAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZy0lcyVzJyAlIChfUFlfVkVSU0lPTl9TSE9SVCwgc3lzLmFiaWZsYWdzKQogICAgZWxzZToKICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnJwogICAgcmV0dXJuIG9zLnBhdGguam9pbihnZXRfcGF0aCgnc3RkbGliJyksIGNvbmZpZ19kaXJfbmFtZSwgJ01ha2VmaWxlJykKCgpkZWYgX2luaXRfcG9zaXgodmFycyk6CiAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCiAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBNYWtlZmlsZToKICAgIG1ha2VmaWxlID0gZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCkKICAgIHRyeToKICAgICAgICBfcGFyc2VfbWFrZWZpbGUobWFrZWZpbGUsIHZhcnMpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOgogICAgICAgIG1zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIG1ha2VmaWxlCiAgICAgICAgaWYgaGFzYXR0cihlLCAic3RyZXJyb3IiKToKICAgICAgICAgICAgbXNnID0gbXNnICsgIiAoJXMpIiAlIGUuc3RyZXJyb3IKICAgICAgICByYWlzZSBJT0Vycm9yKG1zZykKICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6CiAgICBjb25maWdfaCA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKGNvbmZpZ19oKSBhcyBmOgogICAgICAgICAgICBwYXJzZV9jb25maWdfaChmLCB2YXJzKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZToKICAgICAgICBtc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBjb25maWdfaAogICAgICAgIGlmIGhhc2F0dHIoZSwgInN0cmVycm9yIik6CiAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCiAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCiAgICAjIE9uIEFJWCwgdGhlcmUgYXJlIHdyb25nIHBhdGhzIHRvIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiB0aGUgTWFrZWZpbGUKICAgICMgLS0gdGhlc2UgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBQeXRob24gc291cmNlLCBidXQgd2hlbiBpbnN0YWxsZWQKICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICB2YXJzWydMRFNIQVJFRCddID0gdmFyc1snQkxEU0hBUkVEJ10KCgpkZWYgX2luaXRfbm9uX3Bvc2l4KHZhcnMpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBOVCIiIgogICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcwogICAgdmFyc1snTElCREVTVCddID0gZ2V0X3BhdGgoJ3N0ZGxpYicpCiAgICB2YXJzWydCSU5MSUJERVNUJ10gPSBnZXRfcGF0aCgncGxhdHN0ZGxpYicpCiAgICB2YXJzWydJTkNMVURFUFknXSA9IGdldF9wYXRoKCdpbmNsdWRlJykKICAgIHZhcnNbJ1NPJ10gPSAnLnB5ZCcKICAgIHZhcnNbJ0VYRSddID0gJy5leGUnCiAgICB2YXJzWydWRVJTSU9OJ10gPSBfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QKICAgIHZhcnNbJ0JJTkRJUiddID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKCiMKIyBwdWJsaWMgQVBJcwojCgoKZGVmIHBhcnNlX2NvbmZpZ19oKGZwLCB2YXJzPU5vbmUpOgogICAgIiIiUGFyc2UgYSBjb25maWcuaC1zdHlsZSBmaWxlLgoKICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgaXMgcmV0dXJuZWQuICBJZiBhbgogICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBkZWZpbmVfcnggPSByZS5jb21waWxlKCIjZGVmaW5lIChbQS1aXVtBLVphLXowLTlfXSspICguKilcbiIpCiAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVphLXowLTlfXSspIFsqXS9cbiIpCgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICBicmVhawogICAgICAgIG0gPSBkZWZpbmVfcngubWF0Y2gobGluZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ID0gaW50KHYpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICB2YXJzW25dID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG0gPSB1bmRlZl9yeC5tYXRjaChsaW5lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgdmFyc1ttLmdyb3VwKDEpXSA9IDAKICAgIHJldHVybiB2YXJzCgoKZGVmIGdldF9jb25maWdfaF9maWxlbmFtZSgpOgogICAgIiIiUmV0dXJuIHRoZSBwYXRoIG9mIHB5Y29uZmlnLmguIiIiCiAgICBpZiBfUFlUSE9OX0JVSUxEOgogICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKICAgICAgICAgICAgaW5jX2RpciA9IG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiUEMiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluY19kaXIgPSBfUFJPSkVDVF9CQVNFCiAgICBlbHNlOgogICAgICAgIGluY19kaXIgPSBnZXRfcGF0aCgncGxhdGluY2x1ZGUnKQogICAgcmV0dXJuIG9zLnBhdGguam9pbihpbmNfZGlyLCAncHljb25maWcuaCcpCgoKZGVmIGdldF9zY2hlbWVfbmFtZXMoKToKICAgICIiIlJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHNjaGVtZXMgbmFtZXMuIiIiCiAgICByZXR1cm4gdHVwbGUoc29ydGVkKF9TQ0hFTUVTLnNlY3Rpb25zKCkpKQoKCmRlZiBnZXRfcGF0aF9uYW1lcygpOgogICAgIiIiUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgcGF0aHMgbmFtZXMuIiIiCiAgICAjIHh4eCBzZWUgaWYgd2Ugd2FudCBhIHN0YXRpYyBsaXN0CiAgICByZXR1cm4gX1NDSEVNRVMub3B0aW9ucygncG9zaXhfcHJlZml4JykKCgpkZWYgZ2V0X3BhdGhzKHNjaGVtZT1fZ2V0X2RlZmF1bHRfc2NoZW1lKCksIHZhcnM9Tm9uZSwgZXhwYW5kPVRydWUpOgogICAgIiIiUmV0dXJuIGEgbWFwcGluZyBjb250YWluaW5nIGFuIGluc3RhbGwgc2NoZW1lLgoKICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbAogICAgcmV0dXJuIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCiAgICAiIiIKICAgIF9lbnN1cmVfY2ZnX3JlYWQoKQogICAgaWYgZXhwYW5kOgogICAgICAgIHJldHVybiBfZXhwYW5kX3ZhcnMoc2NoZW1lLCB2YXJzKQogICAgZWxzZToKICAgICAgICByZXR1cm4gZGljdChfU0NIRU1FUy5pdGVtcyhzY2hlbWUpKQoKCmRlZiBnZXRfcGF0aChuYW1lLCBzY2hlbWU9X2dldF9kZWZhdWx0X3NjaGVtZSgpLCB2YXJzPU5vbmUsIGV4cGFuZD1UcnVlKToKICAgICIiIlJldHVybiBhIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgc2NoZW1lLgoKICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuCiAgICAiIiIKICAgIHJldHVybiBnZXRfcGF0aHMoc2NoZW1lLCB2YXJzLCBleHBhbmQpW25hbWVdCgoKZGVmIGdldF9jb25maWdfdmFycygqYXJncyk6CiAgICAiIiJXaXRoIG5vIGFyZ3VtZW50cywgcmV0dXJuIGEgZGljdGlvbmFyeSBvZiBhbGwgY29uZmlndXJhdGlvbgogICAgdmFyaWFibGVzIHJlbGV2YW50IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KCiAgICBPbiBVbml4LCB0aGlzIG1lYW5zIGV2ZXJ5IHZhcmlhYmxlIGRlZmluZWQgaW4gUHl0aG9uJ3MgaW5zdGFsbGVkIE1ha2VmaWxlOwogICAgT24gV2luZG93cyBhbmQgTWFjIE9TIGl0J3MgYSBtdWNoIHNtYWxsZXIgc2V0LgoKICAgIFdpdGggYXJndW1lbnRzLCByZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyB0aGF0IHJlc3VsdCBmcm9tIGxvb2tpbmcgdXAKICAgIGVhY2ggYXJndW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZGljdGlvbmFyeS4KICAgICIiIgogICAgZ2xvYmFsIF9DT05GSUdfVkFSUwogICAgaWYgX0NPTkZJR19WQVJTIGlzIE5vbmU6CiAgICAgICAgX0NPTkZJR19WQVJTID0ge30KICAgICAgICAjIE5vcm1hbGl6ZWQgdmVyc2lvbnMgb2YgcHJlZml4IGFuZCBleGVjX3ByZWZpeCBhcmUgaGFuZHkgdG8gaGF2ZTsKICAgICAgICAjIGluIGZhY3QsIHRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgdmVyc2lvbnMgdXNlZCBtb3N0IHBsYWNlcyBpbiB0aGUKICAgICAgICAjIGRpc3R1dGlsczIgbW9kdWxlLgogICAgICAgIF9DT05GSUdfVkFSU1sncHJlZml4J10gPSBfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydleGVjX3ByZWZpeCddID0gX0VYRUNfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uJ10gPSBfUFlfVkVSU0lPTgogICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9zaG9ydCddID0gX1BZX1ZFUlNJT05fU0hPUlQKICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KICAgICAgICBfQ09ORklHX1ZBUlNbJ2Jhc2UnXSA9IF9QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ3BsYXRiYXNlJ10gPSBfRVhFQ19QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ3Byb2plY3RiYXNlJ10gPSBfUFJPSkVDVF9CQVNFCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ2FiaWZsYWdzJ10gPSBzeXMuYWJpZmxhZ3MKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgc3lzLmFiaWZsYWdzIG1heSBub3QgYmUgZGVmaW5lZCBvbiBhbGwgcGxhdGZvcm1zLgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ2FiaWZsYWdzJ10gPSAnJwoKICAgICAgICBpZiBvcy5uYW1lIGluICgnbnQnLCAnb3MyJyk6CiAgICAgICAgICAgIF9pbml0X25vbl9wb3NpeChfQ09ORklHX1ZBUlMpCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICBfaW5pdF9wb3NpeChfQ09ORklHX1ZBUlMpCiAgICAgICAgIyBTZXR0aW5nICd1c2VyYmFzZScgaXMgZG9uZSBiZWxvdyB0aGUgY2FsbCB0byB0aGUKICAgICAgICAjIGluaXQgZnVuY3Rpb24gdG8gZW5hYmxlIHVzaW5nICdnZXRfY29uZmlnX3ZhcicgaW4KICAgICAgICAjIHRoZSBpbml0LWZ1bmN0aW9uLgogICAgICAgIGlmIHN5cy52ZXJzaW9uID49ICcyLjYnOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3VzZXJiYXNlJ10gPSBfZ2V0dXNlcmJhc2UoKQoKICAgICAgICBpZiAnc3JjZGlyJyBub3QgaW4gX0NPTkZJR19WQVJTOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gX1BST0pFQ1RfQkFTRQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBfc2FmZV9yZWFscGF0aChfQ09ORklHX1ZBUlNbJ3NyY2RpciddKQoKICAgICAgICAjIENvbnZlcnQgc3JjZGlyIGludG8gYW4gYWJzb2x1dGUgcGF0aCBpZiBpdCBhcHBlYXJzIG5lY2Vzc2FyeS4KICAgICAgICAjIE5vcm1hbGx5IGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBIb3dldmVyLCBkdXJpbmcKICAgICAgICAjIHRlc3RpbmcsIGZvciBleGFtcGxlLCB3ZSBtaWdodCBiZSBydW5uaW5nIGEgbm9uLWluc3RhbGxlZCBweXRob24KICAgICAgICAjIGZyb20gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LgogICAgICAgIGlmIF9QWVRIT05fQlVJTEQgYW5kIG9zLm5hbWUgPT0gInBvc2l4IjoKICAgICAgICAgICAgYmFzZSA9IF9QUk9KRUNUX0JBU0UKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBjd2QgPSBOb25lCiAgICAgICAgICAgIGlmIChub3Qgb3MucGF0aC5pc2FicyhfQ09ORklHX1ZBUlNbJ3NyY2RpciddKSBhbmQKICAgICAgICAgICAgICAgIGJhc2UgIT0gY3dkKToKICAgICAgICAgICAgICAgICMgc3JjZGlyIGlzIHJlbGF0aXZlIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBzYW1lIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBhcyB0aGUgZXhlY3V0YWJsZS4gQXNzdW1lIGV4ZWN1dGFibGUgaXMgaW4gdGhlIGJ1aWxkCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSBhbmQgbWFrZSBzcmNkaXIgYWJzb2x1dGUuCiAgICAgICAgICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgX0NPTkZJR19WQVJTWydzcmNkaXInXSkKICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBvcy5wYXRoLm5vcm1wYXRoKHNyY2RpcikKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICBrZXJuZWxfdmVyc2lvbiA9IG9zLnVuYW1lKClbMl0gICMgS2VybmVsIHZlcnNpb24gKDguNC4zKQogICAgICAgICAgICBtYWpvcl92ZXJzaW9uID0gaW50KGtlcm5lbF92ZXJzaW9uLnNwbGl0KCcuJylbMF0pCgogICAgICAgICAgICBpZiBtYWpvcl92ZXJzaW9uIDwgODoKICAgICAgICAgICAgICAgICMgT24gbWFjT1MgYmVmb3JlIDEwLjQsIGNoZWNrIGlmIC1hcmNoIGFuZCAtaXN5c3Jvb3QKICAgICAgICAgICAgICAgICMgYXJlIGluIENGTEFHUyBvciBMREZMQUdTIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZS4KICAgICAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgd2hlbiBidWlsZGluZyBleHRlbnNpb25zIG9uIGEgMTAuMyBzeXN0ZW0KICAgICAgICAgICAgICAgICMgdXNpbmcgYSB1bml2ZXJzYWwgYnVpbGQgb2YgcHl0aG9uLgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgogICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBhcmNoaXRlY3R1cmUgZmxhZ3MgdXNpbmcKICAgICAgICAgICAgICAgICMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICAgICAgICAgICAgICAjIE5PVEU6IFRoaXMgbmFtZSB3YXMgaW50cm9kdWNlZCBieSBBcHBsZSBpbiBPU1ggMTAuNSBhbmQKICAgICAgICAgICAgICAgICMgaXMgdXNlZCBieSBzZXZlcmFsIHNjcmlwdGluZyBsYW5ndWFnZXMgZGlzdHJpYnV0ZWQgd2l0aAogICAgICAgICAgICAgICAgIyB0aGF0IE9TIHJlbGVhc2UuCiAgICAgICAgICAgICAgICBpZiAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgICAgICAgIGFyY2ggPSBvcy5lbnZpcm9uWydBUkNIRkxBR1MnXQogICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzICsgJyAnICsgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCgogICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBvbiBPU1ggMTAuNSBvciBsYXRlciBhbmQgdGhlIHVzZXIgdHJpZXMgdG8KICAgICAgICAgICAgICAgICMgY29tcGlsZXMgYW4gZXh0ZW5zaW9uIHVzaW5nIGFuIFNESyB0aGF0IGlzIG5vdCBwcmVzZW50CiAgICAgICAgICAgICAgICAjIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUgaXQgaXMgYmV0dGVyIHRvIG5vdCB1c2UgYW4gU0RLCiAgICAgICAgICAgICAgICAjIHRoYW4gdG8gZmFpbC4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgVGhlIG1ham9yIHVzZWNhc2UgZm9yIHRoaXMgaXMgdXNlcnMgdXNpbmcgYSBQeXRob24ub3JnCiAgICAgICAgICAgICAgICAjIGJpbmFyeSBpbnN0YWxsZXIgIG9uIE9TWCAxMC42OiB0aGF0IGluc3RhbGxlciB1c2VzCiAgICAgICAgICAgICAgICAjIHRoZSAxMC40dSBTREssIGJ1dCB0aGF0IFNESyBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICMgd2hlbiB5b3UgaW5zdGFsbCBYY29kZS4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIENGTEFHUyA9IF9DT05GSUdfVkFSUy5nZXQoJ0NGTEFHUycsICcnKQogICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaCgnLWlzeXNyb290XHMrKFxTKyknLCBDRkxBR1MpCiAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNkayA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2RrKToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfQ09ORklHX1ZBUlNba2V5XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdFxzK1xTKyhcc3wkKScsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCgogICAgaWYgYXJnczoKICAgICAgICB2YWxzID0gW10KICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgogICAgICAgICAgICB2YWxzLmFwcGVuZChfQ09ORklHX1ZBUlMuZ2V0KG5hbWUpKQogICAgICAgIHJldHVybiB2YWxzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBfQ09ORklHX1ZBUlMKCgpkZWYgZ2V0X2NvbmZpZ192YXIobmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlIHZhcmlhYmxlIHVzaW5nIHRoZSBkaWN0aW9uYXJ5IHJldHVybmVkIGJ5CiAgICAnZ2V0X2NvbmZpZ192YXJzKCknLgoKICAgIEVxdWl2YWxlbnQgdG8gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCiAgICAiIiIKICAgIHJldHVybiBnZXRfY29uZmlnX3ZhcnMoKS5nZXQobmFtZSkKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IHBsYXRmb3JtLgoKICAgIFRoaXMgaXMgdXNlZCBtYWlubHkgdG8gZGlzdGluZ3Vpc2ggcGxhdGZvcm0tc3BlY2lmaWMgYnVpbGQgZGlyZWN0b3JpZXMgYW5kCiAgICBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsdCBkaXN0cmlidXRpb25zLiAgVHlwaWNhbGx5IGluY2x1ZGVzIHRoZSBPUyBuYW1lCiAgICBhbmQgdmVyc2lvbiBhbmQgdGhlIGFyY2hpdGVjdHVyZSAoYXMgc3VwcGxpZWQgYnkgJ29zLnVuYW1lKCknKSwKICAgIGFsdGhvdWdoIHRoZSBleGFjdCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBkZXBlbmRzIG9uIHRoZSBPUzsgZWcuIGZvciBJUklYCiAgICB0aGUgYXJjaGl0ZWN0dXJlIGlzbid0IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgKElSSVggb25seSBydW5zIG9uIFNHSQogICAgaGFyZHdhcmUpLCBidXQgZm9yIExpbnV4IHRoZSBrZXJuZWwgdmVyc2lvbiBpc24ndCBwYXJ0aWN1bGFybHkKICAgIGltcG9ydGFudC4KCiAgICBFeGFtcGxlcyBvZiByZXR1cm5lZCB2YWx1ZXM6CiAgICAgICBsaW51eC1pNTg2CiAgICAgICBsaW51eC1hbHBoYSAoPykKICAgICAgIHNvbGFyaXMtMi42LXN1bjR1CiAgICAgICBpcml4LTUuMwogICAgICAgaXJpeDY0LTYuMgoKICAgIFdpbmRvd3Mgd2lsbCByZXR1cm4gb25lIG9mOgogICAgICAgd2luLWFtZDY0ICg2NGJpdCBXaW5kb3dzIG9uIEFNRDY0IChha2EgeDg2XzY0LCBJbnRlbDY0LCBFTTY0VCwgZXRjKQogICAgICAgd2luLWlhNjQgKDY0Yml0IFdpbmRvd3Mgb24gSXRhbml1bSkKICAgICAgIHdpbjMyIChhbGwgb3RoZXJzIC0gc3BlY2lmaWNhbGx5LCBzeXMucGxhdGZvcm0gaXMgcmV0dXJuZWQpCgogICAgRm9yIG90aGVyIG5vbi1QT1NJWCBwbGF0Zm9ybXMsIGN1cnJlbnRseSBqdXN0IHJldHVybnMgJ3N5cy5wbGF0Zm9ybScuCiAgICAiIiIKICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAjIHNuaWZmIHN5cy52ZXJzaW9uIGZvciBhcmNoaXRlY3R1cmUuCiAgICAgICAgcHJlZml4ID0gIiBiaXQgKCIKICAgICAgICBpID0gc3lzLnZlcnNpb24uZmluZChwcmVmaXgpCiAgICAgICAgaWYgaSA9PSAtMToKICAgICAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQogICAgICAgIGogPSBzeXMudmVyc2lvbi5maW5kKCIpIiwgaSkKICAgICAgICBsb29rID0gc3lzLnZlcnNpb25baStsZW4ocHJlZml4KTpqXS5sb3dlcigpCiAgICAgICAgaWYgbG9vayA9PSAnYW1kNjQnOgogICAgICAgICAgICByZXR1cm4gJ3dpbi1hbWQ2NCcKICAgICAgICBpZiBsb29rID09ICdpdGFuaXVtJzoKICAgICAgICAgICAgcmV0dXJuICd3aW4taWE2NCcKICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCgogICAgaWYgb3MubmFtZSAhPSAicG9zaXgiIG9yIG5vdCBoYXNhdHRyKG9zLCAndW5hbWUnKToKICAgICAgICAjIFhYWCB3aGF0IGFib3V0IHRoZSBhcmNoaXRlY3R1cmU/IE5UIGlzIEludGVsIG9yIEFscGhhLAogICAgICAgICMgTWFjIE9TIGlzIE02OGsgb3IgUFBDLCBldGMuCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQoKICAgICMgVHJ5IHRvIGRpc3Rpbmd1aXNoIHZhcmlvdXMgZmxhdm91cnMgb2YgVW5peAogICAgb3NuYW1lLCBob3N0LCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lID0gb3MudW5hbWUoKQoKICAgICMgQ29udmVydCB0aGUgT1MgbmFtZSB0byBsb3dlcmNhc2UsIHJlbW92ZSAnLycgY2hhcmFjdGVycwogICAgIyAodG8gYWNjb21tb2RhdGUgQlNEL09TKSwgYW5kIHRyYW5zbGF0ZSBzcGFjZXMgKGZvciAiUG93ZXIgTWFjaW50b3NoIikKICAgIG9zbmFtZSA9IG9zbmFtZS5sb3dlcigpLnJlcGxhY2UoJy8nLCAnJykKICAgIG1hY2hpbmUgPSBtYWNoaW5lLnJlcGxhY2UoJyAnLCAnXycpCiAgICBtYWNoaW5lID0gbWFjaGluZS5yZXBsYWNlKCcvJywgJy0nKQoKICAgIGlmIG9zbmFtZVs6NV0gPT0gImxpbnV4IjoKICAgICAgICAjIEF0IGxlYXN0IG9uIExpbnV4L0ludGVsLCAnbWFjaGluZScgaXMgdGhlIHByb2Nlc3NvciAtLQogICAgICAgICMgaTM4NiwgZXRjLgogICAgICAgICMgWFhYIHdoYXQgYWJvdXQgQWxwaGEsIFNQQVJDLCBldGM/CiAgICAgICAgcmV0dXJuICAiJXMtJXMiICUgKG9zbmFtZSwgbWFjaGluZSkKICAgIGVsaWYgb3NuYW1lWzo1XSA9PSAic3Vub3MiOgogICAgICAgIGlmIHJlbGVhc2VbMF0gPj0gIjUiOiAgICAgICAgICAgIyBTdW5PUyA1ID09IFNvbGFyaXMgMgogICAgICAgICAgICBvc25hbWUgPSAic29sYXJpcyIKICAgICAgICAgICAgcmVsZWFzZSA9ICIlZC4lcyIgJSAoaW50KHJlbGVhc2VbMF0pIC0gMywgcmVsZWFzZVsyOl0pCiAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gc3RhbmRhcmQgb3NuYW1lLXJlbGVhc2UtbWFjaGluZSByZXByZXNlbnRhdGlvbgogICAgZWxpZiBvc25hbWVbOjRdID09ICJpcml4IjogICAgICAgICAgICAgICMgY291bGQgYmUgImlyaXg2NCIhCiAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAob3NuYW1lLCByZWxlYXNlKQogICAgZWxpZiBvc25hbWVbOjNdID09ICJhaXgiOgogICAgICAgIHJldHVybiAiJXMtJXMuJXMiICUgKG9zbmFtZSwgdmVyc2lvbiwgcmVsZWFzZSkKICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiY3lnd2luIjoKICAgICAgICBvc25hbWUgPSAiY3lnd2luIgogICAgICAgIHJlbF9yZSA9IHJlLmNvbXBpbGUocidbXGQuXSsnKQogICAgICAgIG0gPSByZWxfcmUubWF0Y2gocmVsZWFzZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICByZWxlYXNlID0gbS5ncm91cCgpCiAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImRhcndpbiI6CiAgICAgICAgIwogICAgICAgICMgRm9yIG91ciBwdXJwb3Nlcywgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSB2ZXJzaW9uIGZyb20KICAgICAgICAjIGRpc3R1dGlscycgcGVyc3BlY3RpdmUgaXMgd2hhdCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaXMgc2V0CiAgICAgICAgIyB0by4gVGhpcyBtYWtlcyB0aGUgY29tcGF0aWJpbGl0eSBzdG9yeSBhIGJpdCBtb3JlIHNhbmUgYmVjYXVzZSB0aGUKICAgICAgICAjIG1hY2hpbmUgaXMgZ29pbmcgdG8gY29tcGlsZSBhbmQgbGluayBhcyBpZiBpdCB3ZXJlCiAgICAgICAgIyBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCiAgICAgICAgY2ZndmFycyA9IGdldF9jb25maWdfdmFycygpCiAgICAgICAgbWFjdmVyID0gY2ZndmFycy5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpCgogICAgICAgIGlmIFRydWU6CiAgICAgICAgICAgICMgQWx3YXlzIGNhbGN1bGF0ZSB0aGUgcmVsZWFzZSBvZiB0aGUgcnVubmluZyBtYWNoaW5lLAogICAgICAgICAgICAjIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGJ1aWxkIGZhdCBiaW5hcmllcyBvciBub3QuCgogICAgICAgICAgICBtYWNyZWxlYXNlID0gbWFjdmVyCiAgICAgICAgICAgICMgR2V0IHRoZSBzeXN0ZW0gdmVyc2lvbi4gUmVhZGluZyB0aGlzIHBsaXN0IGlzIGEgZG9jdW1lbnRlZAogICAgICAgICAgICAjIHdheSB0byBnZXQgdGhlIHN5c3RlbSB2ZXJzaW9uIChzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgICAgICMgdGhlIEdlc3RhbHQgTWFuYWdlcikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZiA9IG9wZW4oJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBhIHBsYWluIGRhcndpbiBib3gsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgIyBiZWhhdmlvdXIuCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaChyJzxrZXk+UHJvZHVjdFVzZXJWaXNpYmxlVmVyc2lvbjwva2V5PlxzKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInPHN0cmluZz4oLio/KTwvc3RyaW5nPicsIGYucmVhZCgpKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbWFjcmVsZWFzZSA9ICcuJy5qb2luKG0uZ3JvdXAoMSkuc3BsaXQoJy4nKVs6Ml0pCiAgICAgICAgICAgICAgICAjIGVsc2U6IGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKCiAgICAgICAgaWYgbm90IG1hY3ZlcjoKICAgICAgICAgICAgbWFjdmVyID0gbWFjcmVsZWFzZQoKICAgICAgICBpZiBtYWN2ZXI6CiAgICAgICAgICAgIHJlbGVhc2UgPSBtYWN2ZXIKICAgICAgICAgICAgb3NuYW1lID0gIm1hY29zeCIKCiAgICAgICAgICAgIGlmICgobWFjcmVsZWFzZSArICcuJykgPj0gJzEwLjQuJyBhbmQKICAgICAgICAgICAgICAgICctYXJjaCcgaW4gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KCdDRkxBR1MnLCAnJykuc3RyaXAoKSk6CiAgICAgICAgICAgICAgICAjIFRoZSB1bml2ZXJzYWwgYnVpbGQgd2lsbCBidWlsZCBmYXQgYmluYXJpZXMsIGJ1dCBub3Qgb24KICAgICAgICAgICAgICAgICMgc3lzdGVtcyBiZWZvcmUgMTAuNAogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgIyBUcnkgdG8gZGV0ZWN0IDQtd2F5IHVuaXZlcnNhbCBidWlsZHMsIHRob3NlIGhhdmUgbWFjaGluZS10eXBlCiAgICAgICAgICAgICAgICAjICd1bml2ZXJzYWwnIGluc3RlYWQgb2YgJ2ZhdCcuCgogICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCiAgICAgICAgICAgICAgICBjZmxhZ3MgPSBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ0NGTEFHUycpCgogICAgICAgICAgICAgICAgYXJjaHMgPSByZS5maW5kYWxsKCctYXJjaFxzKyhcUyspJywgY2ZsYWdzKQogICAgICAgICAgICAgICAgYXJjaHMgPSB0dXBsZShzb3J0ZWQoc2V0KGFyY2hzKSkpCgogICAgICAgICAgICAgICAgaWYgbGVuKGFyY2hzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBhcmNoc1swXQogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ludGVsJwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0MycKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDY0JwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3BwYzY0JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAndW5pdmVyc2FsJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IG1hY2hpbmUgdmFsdWUgZm9yIGFyY2hzPSVyIiAlIChhcmNocywpKQoKICAgICAgICAgICAgZWxpZiBtYWNoaW5lID09ICdpMzg2JzoKICAgICAgICAgICAgICAgICMgT24gT1NYIHRoZSBtYWNoaW5lIHR5cGUgcmV0dXJuZWQgYnkgdW5hbWUgaXMgYWx3YXlzIHRoZQogICAgICAgICAgICAgICAgIyAzMi1iaXQgdmFyaWFudCwgZXZlbiBpZiB0aGUgZXhlY3V0YWJsZSBhcmNoaXRlY3R1cmUgaXMKICAgICAgICAgICAgICAgICMgdGhlIDY0LWJpdCB2YXJpYW50CiAgICAgICAgICAgICAgICBpZiBzeXMubWF4c2l6ZSA+PSAyKiozMjoKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3g4Nl82NCcKCiAgICAgICAgICAgIGVsaWYgbWFjaGluZSBpbiAoJ1Bvd2VyUEMnLCAnUG93ZXJfTWFjaW50b3NoJyk6CiAgICAgICAgICAgICAgICAjIFBpY2sgYSBzYW5lIG5hbWUgZm9yIHRoZSBQUEMgYXJjaGl0ZWN0dXJlLgogICAgICAgICAgICAgICAgIyBTZWUgJ2kzODYnIGNhc2UKICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhzaXplID49IDIqKjMyOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjJwoKICAgIHJldHVybiAiJXMtJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKCgpkZWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk6CiAgICByZXR1cm4gX1BZX1ZFUlNJT05fU0hPUlQKCgpkZWYgX3ByaW50X2RpY3QodGl0bGUsIGRhdGEpOgogICAgZm9yIGluZGV4LCAoa2V5LCB2YWx1ZSkgaW4gZW51bWVyYXRlKHNvcnRlZChkYXRhLml0ZW1zKCkpKToKICAgICAgICBpZiBpbmRleCA9PSAwOgogICAgICAgICAgICBwcmludCgnJXM6ICcgJSAodGl0bGUpKQogICAgICAgIHByaW50KCdcdCVzID0gIiVzIicgJSAoa2V5LCB2YWx1ZSkpCgoKZGVmIF9tYWluKCk6CiAgICAiIiJEaXNwbGF5IGFsbCBpbmZvcm1hdGlvbiBzeXNjb25maWcgZGV0YWlucy4iIiIKICAgIHByaW50KCdQbGF0Zm9ybTogIiVzIicgJSBnZXRfcGxhdGZvcm0oKSkKICAgIHByaW50KCdQeXRob24gdmVyc2lvbjogIiVzIicgJSBnZXRfcHl0aG9uX3ZlcnNpb24oKSkKICAgIHByaW50KCdDdXJyZW50IGluc3RhbGxhdGlvbiBzY2hlbWU6ICIlcyInICUgX2dldF9kZWZhdWx0X3NjaGVtZSgpKQogICAgcHJpbnQoKQogICAgX3ByaW50X2RpY3QoJ1BhdGhzJywgZ2V0X3BhdGhzKCkpCiAgICBwcmludCgpCiAgICBfcHJpbnRfZGljdCgnVmFyaWFibGVzJywgZ2V0X2NvbmZpZ192YXJzKCkpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIF9tYWluKCkKUEsDBBQAAAAAAAAAIQBEQh9D1GkBANRpAQA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3RhcmZpbGUucHkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHRhcmZpbGUucHkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDb3B5cmlnaHQgKEMpIDIwMDIgTGFycyBHdXN0YWViZWwgPGxhcnNAZ3VzdGFlYmVsLmRlPgojIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMKIyBQZXJtaXNzaW9uICBpcyAgaGVyZWJ5IGdyYW50ZWQsICBmcmVlICBvZiBjaGFyZ2UsICB0byAgYW55IHBlcnNvbgojIG9idGFpbmluZyBhICBjb3B5IG9mICB0aGlzIHNvZnR3YXJlICBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCiMgZmlsZXMgICh0aGUgICJTb2Z0d2FyZSIpLCAgdG8gICBkZWFsICBpbiAgdGhlICBTb2Z0d2FyZSAgIHdpdGhvdXQKIyByZXN0cmljdGlvbiwgIGluY2x1ZGluZyAgd2l0aG91dCBsaW1pdGF0aW9uICB0aGUgIHJpZ2h0cyB0byAgdXNlLAojIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzICBvZiAgdGhlICBTb2Z0d2FyZSwgIGFuZCB0byAgcGVybWl0ICBwZXJzb25zICB0byAgd2hvbSB0aGUKIyBTb2Z0d2FyZSAgaXMgIGZ1cm5pc2hlZCAgdG8gIGRvICBzbywgIHN1YmplY3QgIHRvICB0aGUgIGZvbGxvd2luZwojIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UgYW5kIHRoaXMgIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsICBiZQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSAgS0lORCwKIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEIFRPICBUSEUgV0FSUkFOVElFUwojIE9GICBNRVJDSEFOVEFCSUxJVFksICBGSVRORVNTICAgRk9SICBBICBQQVJUSUNVTEFSICAgUFVSUE9TRSAgQU5ECiMgTk9OSU5GUklOR0VNRU5ULiAgSU4gIE5PICBFVkVOVCBTSEFMTCAgVEhFICBBVVRIT1JTICBPUiBDT1BZUklHSFQKIyBIT0xERVJTICBCRSBMSUFCTEUgIEZPUiBBTlkgIENMQUlNLCBEQU1BR0VTICBPUiBPVEhFUiAgTElBQklMSVRZLAojIFdIRVRIRVIgIElOIEFOICBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUICBPUiBPVEhFUldJU0UsICBBUklTSU5HCiMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgojIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgoiIiJSZWFkIGZyb20gYW5kIHdyaXRlIHRvIHRhciBmb3JtYXQgYXJjaGl2ZXMuCiIiIgoKX192ZXJzaW9uX18gPSAiJFJldmlzaW9uJCIKCnZlcnNpb24gICAgID0gIjAuOS4wIgpfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3RcdTAwZTRiZWwgKGxhcnNAZ3VzdGFlYmVsLmRlKSIKX19kYXRlX18gICAgPSAiJERhdGU6IDIwMTEtMDItMjUgMTc6NDI6MDEgKzAyMDAgKEZyaSwgMjUgRmViIDIwMTEpICQiCl9fY3ZzaWRfXyAgID0gIiRJZDogdGFyZmlsZS5weSA4ODU4NiAyMDExLTAyLTI1IDE1OjQyOjAxWiBtYXJjLWFuZHJlLmxlbWJ1cmcgJCIKX19jcmVkaXRzX18gPSAiR3VzdGF2byBOaWVtZXllciwgTmllbHMgR3VzdFx1MDBlNGJlbCwgUmljaGFyZCBUb3duc2VuZC4iCgojLS0tLS0tLS0tCiMgSW1wb3J0cwojLS0tLS0tLS0tCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBzdGF0CmltcG9ydCBlcnJubwppbXBvcnQgdGltZQppbXBvcnQgc3RydWN0CmltcG9ydCBjb3B5CmltcG9ydCByZQoKdHJ5OgogICAgaW1wb3J0IGdycCwgcHdkCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGdycCA9IHB3ZCA9IE5vbmUKCiMgb3Muc3ltbGluayBvbiBXaW5kb3dzIHByaW9yIHRvIDYuMCByYWlzZXMgTm90SW1wbGVtZW50ZWRFcnJvcgpzeW1saW5rX2V4Y2VwdGlvbiA9IChBdHRyaWJ1dGVFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcikKdHJ5OgogICAgIyBXaW5kb3dzRXJyb3IgKDEzMTQpIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBjYWxsZXIgZG9lcyBub3QgaG9sZCB0aGUKICAgICMgU2VDcmVhdGVTeW1ib2xpY0xpbmtQcml2aWxlZ2UgcHJpdmlsZWdlCiAgICBzeW1saW5rX2V4Y2VwdGlvbiArPSAoV2luZG93c0Vycm9yLCkKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHBhc3MKCiMgZnJvbSB0YXJmaWxlIGltcG9ydCAqCl9fYWxsX18gPSBbIlRhckZpbGUiLCAiVGFySW5mbyIsICJpc190YXJmaWxlIiwgIlRhckVycm9yIl0KCmlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCmVsc2U6CiAgICBpbXBvcnQgYnVpbHRpbnMKCl9vcGVuID0gYnVpbHRpbnMub3BlbiAgICMgU2luY2UgJ29wZW4nIGlzIFRhckZpbGUub3BlbgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHRhciBjb25zdGFudHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpOVUwgPSBiIlwwIiAgICAgICAgICAgICAgICAgICAgICMgdGhlIG51bGwgY2hhcmFjdGVyCkJMT0NLU0laRSA9IDUxMiAgICAgICAgICAgICAgICAgIyBsZW5ndGggb2YgcHJvY2Vzc2luZyBibG9ja3MKUkVDT1JEU0laRSA9IEJMT0NLU0laRSAqIDIwICAgICAjIGxlbmd0aCBvZiByZWNvcmRzCkdOVV9NQUdJQyA9IGIidXN0YXIgIFwwIiAgICAgICAgIyBtYWdpYyBnbnUgdGFyIHN0cmluZwpQT1NJWF9NQUdJQyA9IGIidXN0YXJceDAwMDAiICAgICMgbWFnaWMgcG9zaXggdGFyIHN0cmluZwoKTEVOR1RIX05BTUUgPSAxMDAgICAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZW5hbWUKTEVOR1RIX0xJTksgPSAxMDAgICAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgbGlua25hbWUKTEVOR1RIX1BSRUZJWCA9IDE1NSAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKClJFR1RZUEUgPSBiIjAiICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKQVJFR1RZUEUgPSBiIlwwIiAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQpMTktUWVBFID0gYiIxIiAgICAgICAgICAgICAgICAgICMgbGluayAoaW5zaWRlIHRhcmZpbGUpClNZTVRZUEUgPSBiIjIiICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCkNIUlRZUEUgPSBiIjMiICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UKQkxLVFlQRSA9IGIiNCIgICAgICAgICAgICAgICAgICAjIGJsb2NrIHNwZWNpYWwgZGV2aWNlCkRJUlRZUEUgPSBiIjUiICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKRklGT1RZUEUgPSBiIjYiICAgICAgICAgICAgICAgICAjIGZpZm8gc3BlY2lhbCBkZXZpY2UKQ09OVFRZUEUgPSBiIjciICAgICAgICAgICAgICAgICAjIGNvbnRpZ3VvdXMgZmlsZQoKR05VVFlQRV9MT05HTkFNRSA9IGIiTCIgICAgICAgICAjIEdOVSB0YXIgbG9uZ25hbWUKR05VVFlQRV9MT05HTElOSyA9IGIiSyIgICAgICAgICAjIEdOVSB0YXIgbG9uZ2xpbmsKR05VVFlQRV9TUEFSU0UgPSBiIlMiICAgICAgICAgICAjIEdOVSB0YXIgc3BhcnNlIGZpbGUKClhIRFRZUEUgPSBiIngiICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZXh0ZW5kZWQgaGVhZGVyClhHTFRZUEUgPSBiImciICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZ2xvYmFsIGhlYWRlcgpTT0xBUklTX1hIRFRZUEUgPSBiIlgiICAgICAgICAgICMgU29sYXJpcyBleHRlbmRlZCBoZWFkZXIKClVTVEFSX0ZPUk1BVCA9IDAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTE5ODggKHVzdGFyKSBmb3JtYXQKR05VX0ZPUk1BVCA9IDEgICAgICAgICAgICAgICAgICAjIEdOVSB0YXIgZm9ybWF0ClBBWF9GT1JNQVQgPSAyICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgKHBheCkgZm9ybWF0CkRFRkFVTFRfRk9STUFUID0gR05VX0ZPUk1BVAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHRhcmZpbGUgY29uc3RhbnRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBGaWxlIHR5cGVzIHRoYXQgdGFyZmlsZSBzdXBwb3J0czoKU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLAogICAgICAgICAgICAgICAgICAgU1lNVFlQRSwgRElSVFlQRSwgRklGT1RZUEUsCiAgICAgICAgICAgICAgICAgICBDT05UVFlQRSwgQ0hSVFlQRSwgQkxLVFlQRSwKICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCiAgICAgICAgICAgICAgICAgICBHTlVUWVBFX1NQQVJTRSkKCiMgRmlsZSB0eXBlcyB0aGF0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KUkVHVUxBUl9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwKICAgICAgICAgICAgICAgICBDT05UVFlQRSwgR05VVFlQRV9TUEFSU0UpCgojIEZpbGUgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgR05VIHRhciBmb3JtYXQuCkdOVV9UWVBFUyA9IChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCgojIEZpZWxkcyBmcm9tIGEgcGF4IGhlYWRlciB0aGF0IG92ZXJyaWRlIGEgVGFySW5mbyBhdHRyaWJ1dGUuClBBWF9GSUVMRFMgPSAoInBhdGgiLCAibGlua3BhdGgiLCAic2l6ZSIsICJtdGltZSIsCiAgICAgICAgICAgICAgInVpZCIsICJnaWQiLCAidW5hbWUiLCAiZ25hbWUiKQoKIyBGaWVsZHMgZnJvbSBhIHBheCBoZWFkZXIgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgaGRyY2hhcnNldC4KUEFYX05BTUVfRklFTERTID0gc2V0KCgicGF0aCIsICJsaW5rcGF0aCIsICJ1bmFtZSIsICJnbmFtZSIpKQoKIyBGaWVsZHMgaW4gYSBwYXggaGVhZGVyIHRoYXQgYXJlIG51bWJlcnMsIGFsbCBvdGhlciBmaWVsZHMKIyBhcmUgdHJlYXRlZCBhcyBzdHJpbmdzLgpQQVhfTlVNQkVSX0ZJRUxEUyA9IHsKICAgICJhdGltZSI6IGZsb2F0LAogICAgImN0aW1lIjogZmxvYXQsCiAgICAibXRpbWUiOiBmbG9hdCwKICAgICJ1aWQiOiBpbnQsCiAgICAiZ2lkIjogaW50LAogICAgInNpemUiOiBpbnQKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJpdHMgdXNlZCBpbiB0aGUgbW9kZSBmaWVsZCwgdmFsdWVzIGluIG9jdGFsLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNfSUZMTksgPSAwbzEyMDAwMCAgICAgICAgIyBzeW1ib2xpYyBsaW5rClNfSUZSRUcgPSAwbzEwMDAwMCAgICAgICAgIyByZWd1bGFyIGZpbGUKU19JRkJMSyA9IDBvMDYwMDAwICAgICAgICAjIGJsb2NrIGRldmljZQpTX0lGRElSID0gMG8wNDAwMDAgICAgICAgICMgZGlyZWN0b3J5ClNfSUZDSFIgPSAwbzAyMDAwMCAgICAgICAgIyBjaGFyYWN0ZXIgZGV2aWNlClNfSUZJRk8gPSAwbzAxMDAwMCAgICAgICAgIyBmaWZvCgpUU1VJRCAgID0gMG80MDAwICAgICAgICAgICMgc2V0IFVJRCBvbiBleGVjdXRpb24KVFNHSUQgICA9IDBvMjAwMCAgICAgICAgICAjIHNldCBHSUQgb24gZXhlY3V0aW9uClRTVlRYICAgPSAwbzEwMDAgICAgICAgICAgIyByZXNlcnZlZAoKVFVSRUFEICA9IDBvNDAwICAgICAgICAgICAjIHJlYWQgYnkgb3duZXIKVFVXUklURSA9IDBvMjAwICAgICAgICAgICAjIHdyaXRlIGJ5IG93bmVyClRVRVhFQyAgPSAwbzEwMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvd25lcgpUR1JFQUQgID0gMG8wNDAgICAgICAgICAgICMgcmVhZCBieSBncm91cApUR1dSSVRFID0gMG8wMjAgICAgICAgICAgICMgd3JpdGUgYnkgZ3JvdXAKVEdFWEVDICA9IDBvMDEwICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IGdyb3VwClRPUkVBRCAgPSAwbzAwNCAgICAgICAgICAgIyByZWFkIGJ5IG90aGVyClRPV1JJVEUgPSAwbzAwMiAgICAgICAgICAgIyB3cml0ZSBieSBvdGhlcgpUT0VYRUMgID0gMG8wMDEgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3RoZXIKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBpbml0aWFsaXphdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgogICAgRU5DT0RJTkcgPSAidXRmLTgiCmVsc2U6CiAgICBFTkNPRElORyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkZWYgc3RuKHMsIGxlbmd0aCwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAiIiJDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbnVsbC10ZXJtaW5hdGVkIGJ5dGVzIG9iamVjdC4KICAgICIiIgogICAgcyA9IHMuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCiAgICByZXR1cm4gc1s6bGVuZ3RoXSArIChsZW5ndGggLSBsZW4ocykpICogTlVMCgpkZWYgbnRzKHMsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgIiIiQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBieXRlcyBvYmplY3QgdG8gYSBzdHJpbmcuCiAgICAiIiIKICAgIHAgPSBzLmZpbmQoYiJcMCIpCiAgICBpZiBwICE9IC0xOgogICAgICAgIHMgPSBzWzpwXQogICAgcmV0dXJuIHMuZGVjb2RlKGVuY29kaW5nLCBlcnJvcnMpCgpkZWYgbnRpKHMpOgogICAgIiIiQ29udmVydCBhIG51bWJlciBmaWVsZCB0byBhIHB5dGhvbiBudW1iZXIuCiAgICAiIiIKICAgICMgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBlbmNvZGluZ3MgZm9yIGEgbnVtYmVyIGZpZWxkLCBzZWUKICAgICMgaXRuKCkgYmVsb3cuCiAgICBpZiBzWzBdICE9IGNocigwbzIwMCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBuID0gaW50KG50cyhzLCAiYXNjaWkiLCAic3RyaWN0Iikgb3IgIjAiLCA4KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyRXJyb3IoImludmFsaWQgaGVhZGVyIikKICAgIGVsc2U6CiAgICAgICAgbiA9IDAKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocykgLSAxKToKICAgICAgICAgICAgbiA8PD0gOAogICAgICAgICAgICBuICs9IG9yZChzW2kgKyAxXSkKICAgIHJldHVybiBuCgpkZWYgaXRuKG4sIGRpZ2l0cz04LCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQpOgogICAgIiIiQ29udmVydCBhIHB5dGhvbiBudW1iZXIgdG8gYSBudW1iZXIgZmllbGQuCiAgICAiIiIKICAgICMgUE9TSVggMTAwMy4xLTE5ODggcmVxdWlyZXMgbnVtYmVycyB0byBiZSBlbmNvZGVkIGFzIGEgc3RyaW5nIG9mCiAgICAjIG9jdGFsIGRpZ2l0cyBmb2xsb3dlZCBieSBhIG51bGwtYnl0ZSwgdGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvCiAgICAjICg4KiooZGlnaXRzLTEpKS0xLiBHTlUgdGFyIGFsbG93cyBzdG9yaW5nIG51bWJlcnMgZ3JlYXRlciB0aGFuCiAgICAjIHRoYXQgaWYgbmVjZXNzYXJ5LiBBIGxlYWRpbmcgMG8yMDAgYnl0ZSBpbmRpY2F0ZXMgdGhpcyBwYXJ0aWN1bGFyCiAgICAjIGVuY29kaW5nLCB0aGUgZm9sbG93aW5nIGRpZ2l0cy0xIGJ5dGVzIGFyZSBhIGJpZy1lbmRpYW4KICAgICMgcmVwcmVzZW50YXRpb24uIFRoaXMgYWxsb3dzIHZhbHVlcyB1cCB0byAoMjU2KiooZGlnaXRzLTEpKS0xLgogICAgaWYgMCA8PSBuIDwgOCAqKiAoZGlnaXRzIC0gMSk6CiAgICAgICAgcyA9ICgiJTAqbyIgJSAoZGlnaXRzIC0gMSwgbikpLmVuY29kZSgiYXNjaWkiKSArIE5VTAogICAgZWxzZToKICAgICAgICBpZiBmb3JtYXQgIT0gR05VX0ZPUk1BVCBvciBuID49IDI1NiAqKiAoZGlnaXRzIC0gMSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm92ZXJmbG93IGluIG51bWJlciBmaWVsZCIpCgogICAgICAgIGlmIG4gPCAwOgogICAgICAgICAgICAjIFhYWCBXZSBtaW1pYyBHTlUgdGFyJ3MgYmVoYXZpb3VyIHdpdGggbmVnYXRpdmUgbnVtYmVycywKICAgICAgICAgICAgIyB0aGlzIGNvdWxkIHJhaXNlIE92ZXJmbG93RXJyb3IuCiAgICAgICAgICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCJMIiwgc3RydWN0LnBhY2soImwiLCBuKSlbMF0KCiAgICAgICAgcyA9IGJ5dGVhcnJheSgpCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGlnaXRzIC0gMSk6CiAgICAgICAgICAgIHMuaW5zZXJ0KDAsIG4gJiAwbzM3NykKICAgICAgICAgICAgbiA+Pj0gOAogICAgICAgIHMuaW5zZXJ0KDAsIDBvMjAwKQogICAgcmV0dXJuIHMKCmRlZiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGEgbWVtYmVyJ3MgaGVhZGVyIGJ5IHN1bW1pbmcgdXAgYWxsCiAgICAgICBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGNoa3N1bSBmaWVsZCB3aGljaCBpcyB0cmVhdGVkIGFzIGlmCiAgICAgICBpdCB3YXMgZmlsbGVkIHdpdGggc3BhY2VzLiBBY2NvcmRpbmcgdG8gdGhlIEdOVSB0YXIgc291cmNlcywKICAgICAgIHNvbWUgdGFycyAoU3VuIGFuZCBOZVhUKSBjYWxjdWxhdGUgY2hrc3VtIHdpdGggc2lnbmVkIGNoYXIsCiAgICAgICB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCBpZiB0aGVyZSBhcmUgY2hhcnMgaW4gdGhlIGJ1ZmZlciB3aXRoCiAgICAgICB0aGUgaGlnaCBiaXQgc2V0LiBTbyB3ZSBjYWxjdWxhdGUgdHdvIGNoZWNrc3VtcywgdW5zaWduZWQgYW5kCiAgICAgICBzaWduZWQuCiAgICAiIiIKICAgIHVuc2lnbmVkX2Noa3N1bSA9IDI1NiArIHN1bShzdHJ1Y3QudW5wYWNrKCIxNDhCIiwgYnVmWzoxNDhdKSArIHN0cnVjdC51bnBhY2soIjM1NkIiLCBidWZbMTU2OjUxMl0pKQogICAgc2lnbmVkX2Noa3N1bSA9IDI1NiArIHN1bShzdHJ1Y3QudW5wYWNrKCIxNDhiIiwgYnVmWzoxNDhdKSArIHN0cnVjdC51bnBhY2soIjM1NmIiLCBidWZbMTU2OjUxMl0pKQogICAgcmV0dXJuIHVuc2lnbmVkX2Noa3N1bSwgc2lnbmVkX2Noa3N1bQoKZGVmIGNvcHlmaWxlb2JqKHNyYywgZHN0LCBsZW5ndGg9Tm9uZSk6CiAgICAiIiJDb3B5IGxlbmd0aCBieXRlcyBmcm9tIGZpbGVvYmogc3JjIHRvIGZpbGVvYmogZHN0LgogICAgICAgSWYgbGVuZ3RoIGlzIE5vbmUsIGNvcHkgdGhlIGVudGlyZSBjb250ZW50LgogICAgIiIiCiAgICBpZiBsZW5ndGggPT0gMDoKICAgICAgICByZXR1cm4KICAgIGlmIGxlbmd0aCBpcyBOb25lOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKDE2KjEwMjQpCiAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBkc3Qud3JpdGUoYnVmKQogICAgICAgIHJldHVybgoKICAgIEJVRlNJWkUgPSAxNiAqIDEwMjQKICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbmd0aCwgQlVGU0laRSkKICAgIGZvciBiIGluIHJhbmdlKGJsb2Nrcyk6CiAgICAgICAgYnVmID0gc3JjLnJlYWQoQlVGU0laRSkKICAgICAgICBpZiBsZW4oYnVmKSA8IEJVRlNJWkU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImVuZCBvZiBmaWxlIHJlYWNoZWQiKQogICAgICAgIGRzdC53cml0ZShidWYpCgogICAgaWYgcmVtYWluZGVyICE9IDA6CiAgICAgICAgYnVmID0gc3JjLnJlYWQocmVtYWluZGVyKQogICAgICAgIGlmIGxlbihidWYpIDwgcmVtYWluZGVyOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKICAgICAgICBkc3Qud3JpdGUoYnVmKQogICAgcmV0dXJuCgpmaWxlbW9kZV90YWJsZSA9ICgKICAgICgoU19JRkxOSywgICAgICAibCIpLAogICAgIChTX0lGUkVHLCAgICAgICItIiksCiAgICAgKFNfSUZCTEssICAgICAgImIiKSwKICAgICAoU19JRkRJUiwgICAgICAiZCIpLAogICAgIChTX0lGQ0hSLCAgICAgICJjIiksCiAgICAgKFNfSUZJRk8sICAgICAgInAiKSksCgogICAgKChUVVJFQUQsICAgICAgICJyIiksKSwKICAgICgoVFVXUklURSwgICAgICAidyIpLCksCiAgICAoKFRVRVhFQ3xUU1VJRCwgInMiKSwKICAgICAoVFNVSUQsICAgICAgICAiUyIpLAogICAgIChUVUVYRUMsICAgICAgICJ4IikpLAoKICAgICgoVEdSRUFELCAgICAgICAiciIpLCksCiAgICAoKFRHV1JJVEUsICAgICAgInciKSwpLAogICAgKChUR0VYRUN8VFNHSUQsICJzIiksCiAgICAgKFRTR0lELCAgICAgICAgIlMiKSwKICAgICAoVEdFWEVDLCAgICAgICAieCIpKSwKCiAgICAoKFRPUkVBRCwgICAgICAgInIiKSwpLAogICAgKChUT1dSSVRFLCAgICAgICJ3IiksKSwKICAgICgoVE9FWEVDfFRTVlRYLCAidCIpLAogICAgIChUU1ZUWCwgICAgICAgICJUIiksCiAgICAgKFRPRVhFQywgICAgICAgIngiKSkKKQoKZGVmIGZpbGVtb2RlKG1vZGUpOgogICAgIiIiQ29udmVydCBhIGZpbGUncyBtb2RlIHRvIGEgc3RyaW5nIG9mIHRoZSBmb3JtCiAgICAgICAtcnd4cnd4cnd4LgogICAgICAgVXNlZCBieSBUYXJGaWxlLmxpc3QoKQogICAgIiIiCiAgICBwZXJtID0gW10KICAgIGZvciB0YWJsZSBpbiBmaWxlbW9kZV90YWJsZToKICAgICAgICBmb3IgYml0LCBjaGFyIGluIHRhYmxlOgogICAgICAgICAgICBpZiBtb2RlICYgYml0ID09IGJpdDoKICAgICAgICAgICAgICAgIHBlcm0uYXBwZW5kKGNoYXIpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBlcm0uYXBwZW5kKCItIikKICAgIHJldHVybiAiIi5qb2luKHBlcm0pCgpjbGFzcyBUYXJFcnJvcihFeGNlcHRpb24pOgogICAgIiIiQmFzZSBleGNlcHRpb24uIiIiCiAgICBwYXNzCmNsYXNzIEV4dHJhY3RFcnJvcihUYXJFcnJvcik6CiAgICAiIiJHZW5lcmFsIGV4Y2VwdGlvbiBmb3IgZXh0cmFjdCBlcnJvcnMuIiIiCiAgICBwYXNzCmNsYXNzIFJlYWRFcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVucmVhZGFibGUgdGFyIGFyY2hpdmVzLiIiIgogICAgcGFzcwpjbGFzcyBDb21wcmVzc2lvbkVycm9yKFRhckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5hdmFpbGFibGUgY29tcHJlc3Npb24gbWV0aG9kcy4iIiIKICAgIHBhc3MKY2xhc3MgU3RyZWFtRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bnN1cHBvcnRlZCBvcGVyYXRpb25zIG9uIHN0cmVhbS1saWtlIFRhckZpbGVzLiIiIgogICAgcGFzcwpjbGFzcyBIZWFkZXJFcnJvcihUYXJFcnJvcik6CiAgICAiIiJCYXNlIGV4Y2VwdGlvbiBmb3IgaGVhZGVyIGVycm9ycy4iIiIKICAgIHBhc3MKY2xhc3MgRW1wdHlIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIGVtcHR5IGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIFRydW5jYXRlZEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdHJ1bmNhdGVkIGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIEVPRkhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgZW5kIG9mIGZpbGUgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgSW52YWxpZEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgaW52YWxpZCBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBTdWJzZXF1ZW50SGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBtaXNzaW5nIGFuZCBpbnZhbGlkIGV4dGVuZGVkIGhlYWRlcnMuIiIiCiAgICBwYXNzCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaW50ZXJuYWwgc3RyZWFtIGludGVyZmFjZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIF9Mb3dMZXZlbEZpbGUob2JqZWN0KToKICAgICIiIkxvdy1sZXZlbCBmaWxlIG9iamVjdC4gU3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZy4KICAgICAgIEl0IGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZmlsZSBvYmplY3QgZm9yIHN0cmVhbWluZwogICAgICAgYWNjZXNzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGUpOgogICAgICAgIG1vZGUgPSB7CiAgICAgICAgICAgICJyIjogb3MuT19SRE9OTFksCiAgICAgICAgICAgICJ3Ijogb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19UUlVOQywKICAgICAgICB9W21vZGVdCiAgICAgICAgaWYgaGFzYXR0cihvcywgIk9fQklOQVJZIik6CiAgICAgICAgICAgIG1vZGUgfD0gb3MuT19CSU5BUlkKICAgICAgICBzZWxmLmZkID0gb3Mub3BlbihuYW1lLCBtb2RlLCAwbzY2NikKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgb3MuY2xvc2Uoc2VsZi5mZCkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKICAgICAgICByZXR1cm4gb3MucmVhZChzZWxmLmZkLCBzaXplKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICBvcy53cml0ZShzZWxmLmZkLCBzKQoKY2xhc3MgX1N0cmVhbShvYmplY3QpOgogICAgIiIiQ2xhc3MgdGhhdCBzZXJ2ZXMgYXMgYW4gYWRhcHRlciBiZXR3ZWVuIFRhckZpbGUgYW5kCiAgICAgICBhIHN0cmVhbS1saWtlIG9iamVjdC4gIFRoZSBzdHJlYW0tbGlrZSBvYmplY3Qgb25seQogICAgICAgbmVlZHMgdG8gaGF2ZSBhIHJlYWQoKSBvciB3cml0ZSgpIG1ldGhvZCBhbmQgaXMgYWNjZXNzZWQKICAgICAgIGJsb2Nrd2lzZS4gIFVzZSBvZiBnemlwIG9yIGJ6aXAyIGNvbXByZXNzaW9uIGlzIHBvc3NpYmxlLgogICAgICAgQSBzdHJlYW0tbGlrZSBvYmplY3QgY291bGQgYmUgZm9yIGV4YW1wbGU6IHN5cy5zdGRpbiwKICAgICAgIHN5cy5zdGRvdXQsIGEgc29ja2V0LCBhIHRhcGUgZGV2aWNlIGV0Yy4KCiAgICAgICBfU3RyZWFtIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBpbnRlcm5hbGx5LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBfU3RyZWFtIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQogICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKICAgICAgICAgICAgZmlsZW9iaiA9IF9Mb3dMZXZlbEZpbGUobmFtZSwgbW9kZSkKICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IEZhbHNlCgogICAgICAgIGlmIGNvbXB0eXBlID09ICcqJzoKICAgICAgICAgICAgIyBFbmFibGUgdHJhbnNwYXJlbnQgY29tcHJlc3Npb24gZGV0ZWN0aW9uIGZvciB0aGUKICAgICAgICAgICAgIyBzdHJlYW0gaW50ZXJmYWNlCiAgICAgICAgICAgIGZpbGVvYmogPSBfU3RyZWFtUHJveHkoZmlsZW9iaikKICAgICAgICAgICAgY29tcHR5cGUgPSBmaWxlb2JqLmdldGNvbXB0eXBlKCkKCiAgICAgICAgc2VsZi5uYW1lICAgICA9IG5hbWUgb3IgIiIKICAgICAgICBzZWxmLm1vZGUgICAgID0gbW9kZQogICAgICAgIHNlbGYuY29tcHR5cGUgPSBjb21wdHlwZQogICAgICAgIHNlbGYuZmlsZW9iaiAgPSBmaWxlb2JqCiAgICAgICAgc2VsZi5idWZzaXplICA9IGJ1ZnNpemUKICAgICAgICBzZWxmLmJ1ZiAgICAgID0gYiIiCiAgICAgICAgc2VsZi5wb3MgICAgICA9IDAKICAgICAgICBzZWxmLmNsb3NlZCAgID0gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBjb21wdHlwZSA9PSAiZ3oiOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGltcG9ydCB6bGliCiAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiemxpYiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgICAgICAgICAgICBzZWxmLnpsaWIgPSB6bGliCiAgICAgICAgICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoYiIiKQogICAgICAgICAgICAgICAgaWYgbW9kZSA9PSAiciI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5pdF9yZWFkX2d6KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5pdF93cml0ZV9neigpCgogICAgICAgICAgICBpZiBjb21wdHlwZSA9PSAiYnoyIjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYnoyCiAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKICAgICAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGJ1ZiA9IGIiIgogICAgICAgICAgICAgICAgICAgIHNlbGYuY21wID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY21wID0gYnoyLkJaMkNvbXByZXNzb3IoKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKICAgICAgICAgICAgcmFpc2UKCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJjbG9zZWQiKSBhbmQgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX2luaXRfd3JpdGVfZ3ooc2VsZik6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuY29tcHJlc3NvYmooOSwgc2VsZi56bGliLkRFRkxBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLnpsaWIuTUFYX1dCSVRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuemxpYi5ERUZfTUVNX0xFVkVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCiAgICAgICAgdGltZXN0YW1wID0gc3RydWN0LnBhY2soIjxMIiwgaW50KHRpbWUudGltZSgpKSkKICAgICAgICBzZWxmLl9fd3JpdGUoYiJcMDM3XDIxM1wwMTBcMDEwIiArIHRpbWVzdGFtcCArIGIiXDAwMlwzNzciKQogICAgICAgIGlmIHNlbGYubmFtZS5lbmRzd2l0aCgiLmd6Iik6CiAgICAgICAgICAgIHNlbGYubmFtZSA9IHNlbGYubmFtZVs6LTNdCiAgICAgICAgIyBSRkMxOTUyIHNheXMgd2UgbXVzdCB1c2UgSVNPLTg4NTktMSBmb3IgdGhlIEZOQU1FIGZpZWxkLgogICAgICAgIHNlbGYuX193cml0ZShzZWxmLm5hbWUuZW5jb2RlKCJpc28tODg1OS0xIiwgInJlcGxhY2UiKSArIE5VTCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIiIiV3JpdGUgc3RyaW5nIHMgdG8gdGhlIHN0cmVhbS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJneiI6CiAgICAgICAgICAgIHNlbGYuY3JjID0gc2VsZi56bGliLmNyYzMyKHMsIHNlbGYuY3JjKQogICAgICAgIHNlbGYucG9zICs9IGxlbihzKQogICAgICAgIGlmIHNlbGYuY29tcHR5cGUgIT0gInRhciI6CiAgICAgICAgICAgIHMgPSBzZWxmLmNtcC5jb21wcmVzcyhzKQogICAgICAgIHNlbGYuX193cml0ZShzKQoKICAgIGRlZiBfX3dyaXRlKHNlbGYsIHMpOgogICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0gaWYgYSB3aG9sZSBuZXcgYmxvY2sKICAgICAgICAgICBpcyByZWFkeSB0byBiZSB3cml0dGVuLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYnVmICs9IHMKICAgICAgICB3aGlsZSBsZW4oc2VsZi5idWYpID4gc2VsZi5idWZzaXplOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWZbOnNlbGYuYnVmc2l6ZV0pCiAgICAgICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2VsZi5idWZzaXplOl0KCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIF9TdHJlYW0gb2JqZWN0LiBObyBvcGVyYXRpb24gc2hvdWxkIGJlCiAgICAgICAgICAgZG9uZSBvbiBpdCBhZnRlcndhcmRzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5jb21wdHlwZSAhPSAidGFyIjoKICAgICAgICAgICAgc2VsZi5idWYgKz0gc2VsZi5jbXAuZmx1c2goKQoKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciIGFuZCBzZWxmLmJ1ZjoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuYnVmKQogICAgICAgICAgICBzZWxmLmJ1ZiA9IGIiIgogICAgICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJneiI6CiAgICAgICAgICAgICAgICAjIFRoZSBuYXRpdmUgemxpYiBjcmMgaXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIGJ1dAogICAgICAgICAgICAgICAgIyB0aGUgUHl0aG9uIHdyYXBwZXIgaW1wbGljaXRseSBjYXN0cyB0aGF0IHRvIGEgc2lnbmVkIEMKICAgICAgICAgICAgICAgICMgbG9uZy4gIFNvLCBvbiBhIDMyLWJpdCBib3ggc2VsZi5jcmMgbWF5ICJsb29rIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICMgd2hpbGUgdGhlIHNhbWUgY3JjIG9uIGEgNjQtYml0IGJveCBtYXkgImxvb2sgcG9zaXRpdmUiLgogICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBpcmtzb21lIHdhcm5pbmdzIGZyb20gdGhlIGBzdHJ1Y3RgIG1vZHVsZSwgZm9yY2UKICAgICAgICAgICAgICAgICMgaXQgdG8gbG9vayBwb3NpdGl2ZSBvbiBhbGwgYm94ZXMuCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5jcmMgJiAweGZmZmZmZmZmKSkKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLnBvcyAmIDB4ZmZmZkZGRkYpKQoKICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKCiAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCgogICAgZGVmIF9pbml0X3JlYWRfZ3ooc2VsZik6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBmb3IgcmVhZGluZyBhIGd6aXAgY29tcHJlc3NlZCBmaWxlb2JqLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY21wID0gc2VsZi56bGliLmRlY29tcHJlc3NvYmooLXNlbGYuemxpYi5NQVhfV0JJVFMpCiAgICAgICAgc2VsZi5kYnVmID0gYiIiCgogICAgICAgICMgdGFrZW4gZnJvbSBnemlwLkd6aXBGaWxlIHdpdGggc29tZSBhbHRlcmF0aW9ucwogICAgICAgIGlmIHNlbGYuX19yZWFkKDIpICE9IGIiXDAzN1wyMTMiOgogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCiAgICAgICAgaWYgc2VsZi5fX3JlYWQoMSkgIT0gYiJcMDEwIjoKICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIikKCiAgICAgICAgZmxhZyA9IG9yZChzZWxmLl9fcmVhZCgxKSkKICAgICAgICBzZWxmLl9fcmVhZCg2KQoKICAgICAgICBpZiBmbGFnICYgNDoKICAgICAgICAgICAgeGxlbiA9IG9yZChzZWxmLl9fcmVhZCgxKSkgKyAyNTYgKiBvcmQoc2VsZi5fX3JlYWQoMSkpCiAgICAgICAgICAgIHNlbGYucmVhZCh4bGVuKQogICAgICAgIGlmIGZsYWcgJiA4OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCiAgICAgICAgICAgICAgICBpZiBub3QgcyBvciBzID09IE5VTDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGZsYWcgJiAxNjoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fcmVhZCgxKQogICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBmbGFnICYgMjoKICAgICAgICAgICAgc2VsZi5fX3JlYWQoMikKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5wb3MKCiAgICBkZWYgc2VlayhzZWxmLCBwb3M9MCk6CiAgICAgICAgIiIiU2V0IHRoZSBzdHJlYW0ncyBmaWxlIHBvaW50ZXIgdG8gcG9zLiBOZWdhdGl2ZSBzZWVraW5nCiAgICAgICAgICAgaXMgZm9yYmlkZGVuLgogICAgICAgICIiIgogICAgICAgIGlmIHBvcyAtIHNlbGYucG9zID49IDA6CiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHBvcyAtIHNlbGYucG9zLCBzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGJsb2Nrcyk6CiAgICAgICAgICAgICAgICBzZWxmLnJlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBzZWxmLnJlYWQocmVtYWluZGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJzZWVraW5nIGJhY2t3YXJkcyBpcyBub3QgYWxsb3dlZCIpCiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgc2l6ZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICAgIElmIHNpemUgaXMgbm90IGRlZmluZWQsIHJldHVybiBhbGwgYnl0ZXMgb2YgdGhlIHN0cmVhbQogICAgICAgICAgIHVwIHRvIEVPRi4KICAgICAgICAiIiIKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIHQgPSBbXQogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICB0LmFwcGVuZChidWYpCiAgICAgICAgICAgIGJ1ZiA9ICIiLmpvaW4odCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNpemUpCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIF9yZWFkKHNlbGYsIHNpemUpOgogICAgICAgICIiIlJldHVybiBzaXplIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJ0YXIiOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWQoc2l6ZSkKCiAgICAgICAgYyA9IGxlbihzZWxmLmRidWYpCiAgICAgICAgd2hpbGUgYyA8IHNpemU6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX19yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY21wLmRlY29tcHJlc3MoYnVmKQogICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEiKQogICAgICAgICAgICBzZWxmLmRidWYgKz0gYnVmCiAgICAgICAgICAgIGMgKz0gbGVuKGJ1ZikKICAgICAgICBidWYgPSBzZWxmLmRidWZbOnNpemVdCiAgICAgICAgc2VsZi5kYnVmID0gc2VsZi5kYnVmW3NpemU6XQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgogICAgICAgICIiIlJldHVybiBzaXplIGJ5dGVzIGZyb20gc3RyZWFtLiBJZiBpbnRlcm5hbCBidWZmZXIgaXMgZW1wdHksCiAgICAgICAgICAgcmVhZCBhbm90aGVyIGJsb2NrIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAiIiIKICAgICAgICBjID0gbGVuKHNlbGYuYnVmKQogICAgICAgIHdoaWxlIGMgPCBzaXplOgogICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLmJ1ZiArPSBidWYKICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgIGJ1ZiA9IHNlbGYuYnVmWzpzaXplXQogICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2l6ZTpdCiAgICAgICAgcmV0dXJuIGJ1ZgojIGNsYXNzIF9TdHJlYW0KCmNsYXNzIF9TdHJlYW1Qcm94eShvYmplY3QpOgogICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCiAgICAgICBkZXRlY3Rpb24gZm9yIHRoZSBTdHJlYW0gaW50ZXJmYWNlIChtb2RlICdyfConKS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5maWxlb2JqLnJlYWQKICAgICAgICByZXR1cm4gc2VsZi5idWYKCiAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5idWYuc3RhcnRzd2l0aChiIlwwMzdcMjEzXDAxMCIpOgogICAgICAgICAgICByZXR1cm4gImd6IgogICAgICAgIGlmIHNlbGYuYnVmLnN0YXJ0c3dpdGgoYiJCWmg5MSIpOgogICAgICAgICAgICByZXR1cm4gImJ6MiIKICAgICAgICByZXR1cm4gInRhciIKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKIyBjbGFzcyBTdHJlYW1Qcm94eQoKY2xhc3MgX0JaMlByb3h5KG9iamVjdCk6CiAgICAiIiJTbWFsbCBwcm94eSBjbGFzcyB0aGF0IGVuYWJsZXMgZXh0ZXJuYWwgZmlsZSBvYmplY3QKICAgICAgIHN1cHBvcnQgZm9yICJyOmJ6MiIgYW5kICJ3OmJ6MiIgbW9kZXMuIFRoaXMgaXMgYWN0dWFsbHkKICAgICAgIGEgd29ya2Fyb3VuZCBmb3IgYSBsaW1pdGF0aW9uIGluIGJ6MiBtb2R1bGUncyBCWjJGaWxlCiAgICAgICBjbGFzcyB3aGljaCAodW5saWtlIGd6aXAuR3ppcEZpbGUpIGhhcyBubyBzdXBwb3J0IGZvcgogICAgICAgYSBmaWxlIG9iamVjdCBhcmd1bWVudC4KICAgICIiIgoKICAgIGJsb2Nrc2l6ZSA9IDE2ICogMTAyNAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBtb2RlKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgc2VsZi5tb2RlID0gbW9kZQogICAgICAgIHNlbGYubmFtZSA9IGdldGF0dHIoc2VsZi5maWxlb2JqLCAibmFtZSIsIE5vbmUpCiAgICAgICAgc2VsZi5pbml0KCkKCiAgICBkZWYgaW5pdChzZWxmKToKICAgICAgICBpbXBvcnQgYnoyCiAgICAgICAgc2VsZi5wb3MgPSAwCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKICAgICAgICAgICAgc2VsZi5iejJvYmogPSBiejIuQloyRGVjb21wcmVzc29yKCkKICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5idWYgPSBiIiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKICAgICAgICB4ID0gbGVuKHNlbGYuYnVmKQogICAgICAgIHdoaWxlIHggPCBzaXplOgogICAgICAgICAgICByYXcgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJsb2Nrc2l6ZSkKICAgICAgICAgICAgaWYgbm90IHJhdzoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmJ6Mm9iai5kZWNvbXByZXNzKHJhdykKICAgICAgICAgICAgc2VsZi5idWYgKz0gZGF0YQogICAgICAgICAgICB4ICs9IGxlbihkYXRhKQoKICAgICAgICBidWYgPSBzZWxmLmJ1Zls6c2l6ZV0KICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NpemU6XQogICAgICAgIHNlbGYucG9zICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcyk6CiAgICAgICAgaWYgcG9zIDwgc2VsZi5wb3M6CiAgICAgICAgICAgIHNlbGYuaW5pdCgpCiAgICAgICAgc2VsZi5yZWFkKHBvcyAtIHNlbGYucG9zKQoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKICAgICAgICBzZWxmLnBvcyArPSBsZW4oZGF0YSkKICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5jb21wcmVzcyhkYXRhKQogICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyI6CiAgICAgICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmZsdXNoKCkKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHJhdykKIyBjbGFzcyBfQloyUHJveHkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHRyYWN0aW9uIGZpbGUgb2JqZWN0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgX0ZpbGVJbkZpbGUob2JqZWN0KToKICAgICIiIkEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBmaWxlIG9iamVjdCB0aGF0CiAgICAgICBwcm92aWRlcyBhIHBhcnQgb2YgaXRzIGRhdGEgYXMgYW4gaW5kaXZpZHVhbCBmaWxlCiAgICAgICBvYmplY3QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgb2Zmc2V0LCBzaXplLCBibG9ja2luZm89Tm9uZSk6CiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgc2VsZi5zaXplID0gc2l6ZQogICAgICAgIHNlbGYucG9zaXRpb24gPSAwCgogICAgICAgIGlmIGJsb2NraW5mbyBpcyBOb25lOgogICAgICAgICAgICBibG9ja2luZm8gPSBbKDAsIHNpemUpXQoKICAgICAgICAjIENvbnN0cnVjdCBhIG1hcCB3aXRoIGRhdGEgYW5kIHplcm8gYmxvY2tzLgogICAgICAgIHNlbGYubWFwX2luZGV4ID0gMAogICAgICAgIHNlbGYubWFwID0gW10KICAgICAgICBsYXN0cG9zID0gMAogICAgICAgIHJlYWxwb3MgPSBzZWxmLm9mZnNldAogICAgICAgIGZvciBvZmZzZXQsIHNpemUgaW4gYmxvY2tpbmZvOgogICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgogICAgICAgICAgICAgICAgc2VsZi5tYXAuYXBwZW5kKChGYWxzZSwgbGFzdHBvcywgb2Zmc2V0LCBOb25lKSkKICAgICAgICAgICAgc2VsZi5tYXAuYXBwZW5kKChUcnVlLCBvZmZzZXQsIG9mZnNldCArIHNpemUsIHJlYWxwb3MpKQogICAgICAgICAgICByZWFscG9zICs9IHNpemUKICAgICAgICAgICAgbGFzdHBvcyA9IG9mZnNldCArIHNpemUKICAgICAgICBpZiBsYXN0cG9zIDwgc2VsZi5zaXplOgogICAgICAgICAgICBzZWxmLm1hcC5hcHBlbmQoKEZhbHNlLCBsYXN0cG9zLCBzZWxmLnNpemUsIE5vbmUpKQoKICAgIGRlZiBzZWVrYWJsZShzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLmZpbGVvYmosICJzZWVrYWJsZSIpOgogICAgICAgICAgICAjIFhYWCBnemlwLkd6aXBGaWxlIGFuZCBiejIuQloyRmlsZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmouc2Vla2FibGUoKQoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBvc2l0aW9uCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zaXRpb24pOgogICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBvc2l0aW9uID0gcG9zaXRpb24KCiAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgogICAgICAgICIiIlJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgc2l6ZSA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zaXRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICBzaXplID0gbWluKHNpemUsIHNlbGYuc2l6ZSAtIHNlbGYucG9zaXRpb24pCgogICAgICAgIGJ1ZiA9IGIiIgogICAgICAgIHdoaWxlIHNpemUgPiAwOgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgZGF0YSwgc3RhcnQsIHN0b3AsIG9mZnNldCA9IHNlbGYubWFwW3NlbGYubWFwX2luZGV4XQogICAgICAgICAgICAgICAgaWYgc3RhcnQgPD0gc2VsZi5wb3NpdGlvbiA8IHN0b3A6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBfaW5kZXggKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWFwX2luZGV4ID09IGxlbihzZWxmLm1hcCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFwX2luZGV4ID0gMAogICAgICAgICAgICBsZW5ndGggPSBtaW4oc2l6ZSwgc3RvcCAtIHNlbGYucG9zaXRpb24pCiAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhvZmZzZXQgKyAoc2VsZi5wb3NpdGlvbiAtIHN0YXJ0KSkKICAgICAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZChsZW5ndGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWYgKz0gTlVMICogbGVuZ3RoCiAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoCiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuZ3RoCiAgICAgICAgcmV0dXJuIGJ1ZgojY2xhc3MgX0ZpbGVJbkZpbGUKCgpjbGFzcyBFeEZpbGVPYmplY3Qob2JqZWN0KToKICAgICIiIkZpbGUtbGlrZSBvYmplY3QgZm9yIHJlYWRpbmcgYW4gYXJjaGl2ZSBtZW1iZXIuCiAgICAgICBJcyByZXR1cm5lZCBieSBUYXJGaWxlLmV4dHJhY3RmaWxlKCkuCiAgICAiIiIKICAgIGJsb2Nrc2l6ZSA9IDEwMjQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSwgdGFyaW5mbyk6CiAgICAgICAgc2VsZi5maWxlb2JqID0gX0ZpbGVJbkZpbGUodGFyZmlsZS5maWxlb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8uc3BhcnNlKQogICAgICAgIHNlbGYubmFtZSA9IHRhcmluZm8ubmFtZQogICAgICAgIHNlbGYubW9kZSA9ICJyIgogICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKICAgICAgICBzZWxmLnNpemUgPSB0YXJpbmZvLnNpemUKCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IDAKICAgICAgICBzZWxmLmJ1ZmZlciA9IGIiIgoKICAgIGRlZiByZWFkYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiB3cml0YWJsZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgc2Vla2FibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5zZWVrYWJsZSgpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcyBmcm9tIHRoZSBmaWxlLiBJZiBzaXplIGlzIG5vdAogICAgICAgICAgIHByZXNlbnQgb3IgTm9uZSwgcmVhZCBhbGwgZGF0YSB1bnRpbCBFT0YgaXMgcmVhY2hlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCgogICAgICAgIGJ1ZiA9IGIiIgogICAgICAgIGlmIHNlbGYuYnVmZmVyOgogICAgICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcgogICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBiIiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyWzpzaXplXQogICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltzaXplOl0KCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZChzaXplIC0gbGVuKGJ1ZikpCgogICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgIyBYWFggVGV4dElPV3JhcHBlciB1c2VzIHRoZSByZWFkMSgpIG1ldGhvZC4KICAgIHJlYWQxID0gcmVhZAoKICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKICAgICAgICAiIiJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLiBJZiBzaXplIGlzIHByZXNlbnQKICAgICAgICAgICBhbmQgbm9uLW5lZ2F0aXZlLCByZXR1cm4gYSBzdHJpbmcgd2l0aCBhdCBtb3N0IHRoYXQKICAgICAgICAgICBzaXplLCB3aGljaCBtYXkgYmUgYW4gaW5jb21wbGV0ZSBsaW5lLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgcG9zID0gc2VsZi5idWZmZXIuZmluZChiIlxuIikgKyAxCiAgICAgICAgaWYgcG9zID09IDA6CiAgICAgICAgICAgICMgbm8gbmV3bGluZSBmb3VuZC4KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQogICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgKz0gYnVmCiAgICAgICAgICAgICAgICBpZiBub3QgYnVmIG9yIGIiXG4iIGluIGJ1ZjoKICAgICAgICAgICAgICAgICAgICBwb3MgPSBzZWxmLmJ1ZmZlci5maW5kKGIiXG4iKSArIDEKICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBuZXdsaW5lIGZvdW5kLgogICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBsZW4oc2VsZi5idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgc2l6ZSAhPSAtMToKICAgICAgICAgICAgcG9zID0gbWluKHNpemUsIHBvcykKCiAgICAgICAgYnVmID0gc2VsZi5idWZmZXJbOnBvc10KICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3BvczpdCiAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgcmVhZGxpbmVzKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGxpc3Qgd2l0aCBhbGwgcmVtYWluaW5nIGxpbmVzLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCgogICAgICAgIHJldHVybiBzZWxmLnBvc2l0aW9uCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9b3MuU0VFS19TRVQpOgogICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCgogICAgICAgIGlmIHdoZW5jZSA9PSBvcy5TRUVLX1NFVDoKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1pbihtYXgocG9zLCAwKSwgc2VsZi5zaXplKQogICAgICAgIGVsaWYgd2hlbmNlID09IG9zLlNFRUtfQ1VSOgogICAgICAgICAgICBpZiBwb3MgPCAwOgogICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1heChzZWxmLnBvc2l0aW9uICsgcG9zLCAwKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1pbihzZWxmLnBvc2l0aW9uICsgcG9zLCBzZWxmLnNpemUpCiAgICAgICAgZWxpZiB3aGVuY2UgPT0gb3MuU0VFS19FTkQ6CiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgobWluKHNlbGYuc2l6ZSArIHBvcywgc2VsZi5zaXplKSwgMCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IikKCiAgICAgICAgc2VsZi5idWZmZXIgPSBiIiIKICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLnBvc2l0aW9uKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIkdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBmaWxlJ3MgbGluZXMuCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHlpZWxkIGxpbmUKI2NsYXNzIEV4RmlsZU9iamVjdAoKIy0tLS0tLS0tLS0tLS0tLS0tLQojIEV4cG9ydGVkIENsYXNzZXMKIy0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBUYXJJbmZvKG9iamVjdCk6CiAgICAiIiJJbmZvcm1hdGlvbmFsIGNsYXNzIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxzIGFib3V0IGFuCiAgICAgICBhcmNoaXZlIG1lbWJlciBnaXZlbiBieSBhIHRhciBoZWFkZXIgYmxvY2suCiAgICAgICBUYXJJbmZvIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IFRhckZpbGUuZ2V0bWVtYmVyKCksCiAgICAgICBUYXJGaWxlLmdldG1lbWJlcnMoKSBhbmQgVGFyRmlsZS5nZXR0YXJpbmZvKCkgYW5kIGFyZQogICAgICAgdXN1YWxseSBjcmVhdGVkIGludGVybmFsbHkuCiAgICAiIiIKCiAgICBfX3Nsb3RzX18gPSAoIm5hbWUiLCAibW9kZSIsICJ1aWQiLCAiZ2lkIiwgInNpemUiLCAibXRpbWUiLAogICAgICAgICAgICAgICAgICJjaGtzdW0iLCAidHlwZSIsICJsaW5rbmFtZSIsICJ1bmFtZSIsICJnbmFtZSIsCiAgICAgICAgICAgICAgICAgImRldm1ham9yIiwgImRldm1pbm9yIiwKICAgICAgICAgICAgICAgICAib2Zmc2V0IiwgIm9mZnNldF9kYXRhIiwgInBheF9oZWFkZXJzIiwgInNwYXJzZSIsCiAgICAgICAgICAgICAgICAgInRhcmZpbGUiLCAiX3NwYXJzZV9zdHJ1Y3RzIiwgIl9saW5rX3RhcmdldCIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IiIpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0LiBuYW1lIGlzIHRoZSBvcHRpb25hbCBuYW1lCiAgICAgICAgICAgb2YgdGhlIG1lbWJlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lCiAgICAgICAgc2VsZi5tb2RlID0gMG82NDQgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCiAgICAgICAgc2VsZi51aWQgPSAwICAgICAgICAgICAgIyB1c2VyIGlkCiAgICAgICAgc2VsZi5naWQgPSAwICAgICAgICAgICAgIyBncm91cCBpZAogICAgICAgIHNlbGYuc2l6ZSA9IDAgICAgICAgICAgICMgZmlsZSBzaXplCiAgICAgICAgc2VsZi5tdGltZSA9IDAgICAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZQogICAgICAgIHNlbGYuY2hrc3VtID0gMCAgICAgICAgICMgaGVhZGVyIGNoZWNrc3VtCiAgICAgICAgc2VsZi50eXBlID0gUkVHVFlQRSAgICAgIyBtZW1iZXIgdHlwZQogICAgICAgIHNlbGYubGlua25hbWUgPSAiIiAgICAgICMgbGluayBuYW1lCiAgICAgICAgc2VsZi51bmFtZSA9ICIiICAgICAgICAgIyB1c2VyIG5hbWUKICAgICAgICBzZWxmLmduYW1lID0gIiIgICAgICAgICAjIGdyb3VwIG5hbWUKICAgICAgICBzZWxmLmRldm1ham9yID0gMCAgICAgICAjIGRldmljZSBtYWpvciBudW1iZXIKICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAjIGRldmljZSBtaW5vciBudW1iZXIKCiAgICAgICAgc2VsZi5vZmZzZXQgPSAwICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCgogICAgICAgIHNlbGYuc3BhcnNlID0gTm9uZSAgICAgICMgc3BhcnNlIG1lbWJlciBpbmZvcm1hdGlvbgogICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSB7fSAgICMgcGF4IGhlYWRlciBpbmZvcm1hdGlvbgoKICAgICMgSW4gcGF4IGhlYWRlcnMgdGhlICJuYW1lIiBhbmQgImxpbmtuYW1lIiBmaWVsZCBhcmUgY2FsbGVkCiAgICAjICJwYXRoIiBhbmQgImxpbmtwYXRoIi4KICAgIGRlZiBfZ2V0cGF0aChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAgICBkZWYgX3NldHBhdGgoc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgcGF0aCA9IHByb3BlcnR5KF9nZXRwYXRoLCBfc2V0cGF0aCkKCiAgICBkZWYgX2dldGxpbmtwYXRoKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmxpbmtuYW1lCiAgICBkZWYgX3NldGxpbmtwYXRoKHNlbGYsIGxpbmtuYW1lKToKICAgICAgICBzZWxmLmxpbmtuYW1lID0gbGlua25hbWUKICAgIGxpbmtwYXRoID0gcHJvcGVydHkoX2dldGxpbmtwYXRoLCBfc2V0bGlua3BhdGgpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKCiAgICBkZWYgZ2V0X2luZm8oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBhcyBhIGRpY3Rpb25hcnkuCiAgICAgICAgIiIiCiAgICAgICAgaW5mbyA9IHsKICAgICAgICAgICAgIm5hbWUiOiAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAibW9kZSI6ICAgICBzZWxmLm1vZGUgJiAwbzc3NzcsCiAgICAgICAgICAgICJ1aWQiOiAgICAgIHNlbGYudWlkLAogICAgICAgICAgICAiZ2lkIjogICAgICBzZWxmLmdpZCwKICAgICAgICAgICAgInNpemUiOiAgICAgc2VsZi5zaXplLAogICAgICAgICAgICAibXRpbWUiOiAgICBzZWxmLm10aW1lLAogICAgICAgICAgICAiY2hrc3VtIjogICBzZWxmLmNoa3N1bSwKICAgICAgICAgICAgInR5cGUiOiAgICAgc2VsZi50eXBlLAogICAgICAgICAgICAibGlua25hbWUiOiBzZWxmLmxpbmtuYW1lLAogICAgICAgICAgICAidW5hbWUiOiAgICBzZWxmLnVuYW1lLAogICAgICAgICAgICAiZ25hbWUiOiAgICBzZWxmLmduYW1lLAogICAgICAgICAgICAiZGV2bWFqb3IiOiBzZWxmLmRldm1ham9yLAogICAgICAgICAgICAiZGV2bWlub3IiOiBzZWxmLmRldm1pbm9yCiAgICAgICAgfQoKICAgICAgICBpZiBpbmZvWyJ0eXBlIl0gPT0gRElSVFlQRSBhbmQgbm90IGluZm9bIm5hbWUiXS5lbmRzd2l0aCgiLyIpOgogICAgICAgICAgICBpbmZvWyJuYW1lIl0gKz0gIi8iCgogICAgICAgIHJldHVybiBpbmZvCgogICAgZGVmIHRvYnVmKHNlbGYsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCwgZW5jb2Rpbmc9RU5DT0RJTkcsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIik6CiAgICAgICAgIiIiUmV0dXJuIGEgdGFyIGhlYWRlciBhcyBhIHN0cmluZyBvZiA1MTIgYnl0ZSBibG9ja3MuCiAgICAgICAgIiIiCiAgICAgICAgaW5mbyA9IHNlbGYuZ2V0X2luZm8oKQoKICAgICAgICBpZiBmb3JtYXQgPT0gVVNUQVJfRk9STUFUOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfdXN0YXJfaGVhZGVyKGluZm8sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgZWxpZiBmb3JtYXQgPT0gR05VX0ZPUk1BVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoaW5mbywgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBlbGlmIGZvcm1hdCA9PSBQQVhfRk9STUFUOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfcGF4X2hlYWRlcihpbmZvLCBlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGZvcm1hdCIpCgogICAgZGVmIGNyZWF0ZV91c3Rhcl9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suCiAgICAgICAgIiIiCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCgogICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsaW5rbmFtZSBpcyB0b28gbG9uZyIpCgogICAgICAgIGlmIGxlbihpbmZvWyJuYW1lIl0pID4gTEVOR1RIX05BTUU6CiAgICAgICAgICAgIGluZm9bInByZWZpeCJdLCBpbmZvWyJuYW1lIl0gPSBzZWxmLl9wb3NpeF9zcGxpdF9uYW1lKGluZm9bIm5hbWUiXSkKCiAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCBlbmNvZGluZywgZXJyb3JzKQoKICAgIGRlZiBjcmVhdGVfZ251X2hlYWRlcihzZWxmLCBpbmZvLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIEdOVSBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCiAgICAgICAgIiIiCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQwoKICAgICAgICBidWYgPSBiIiIKICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibGlua25hbWUiXSwgR05VVFlQRV9MT05HTElOSywgZW5jb2RpbmcsIGVycm9ycykKCiAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibmFtZSJdLCBHTlVUWVBFX0xPTkdOQU1FLCBlbmNvZGluZywgZXJyb3JzKQoKICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBHTlVfRk9STUFULCBlbmNvZGluZywgZXJyb3JzKQoKICAgIGRlZiBjcmVhdGVfcGF4X2hlYWRlcihzZWxmLCBpbmZvLCBlbmNvZGluZyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suIElmIGl0IGNhbm5vdCBiZQogICAgICAgICAgIHJlcHJlc2VudGVkIHRoaXMgd2F5LCBwcmVwZW5kIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBzZXF1ZW5jZQogICAgICAgICAgIHdpdGggc3VwcGxlbWVudCBpbmZvcm1hdGlvbi4KICAgICAgICAiIiIKICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKICAgICAgICBwYXhfaGVhZGVycyA9IHNlbGYucGF4X2hlYWRlcnMuY29weSgpCgogICAgICAgICMgVGVzdCBzdHJpbmcgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxlbmd0aCBvciBjYW5ub3QKICAgICAgICAjIGJlIHJlcHJlc2VudGVkIGluIEFTQ0lJIGVuY29kaW5nLgogICAgICAgIGZvciBuYW1lLCBobmFtZSwgbGVuZ3RoIGluICgKICAgICAgICAgICAgICAgICgibmFtZSIsICJwYXRoIiwgTEVOR1RIX05BTUUpLCAoImxpbmtuYW1lIiwgImxpbmtwYXRoIiwgTEVOR1RIX0xJTkspLAogICAgICAgICAgICAgICAgKCJ1bmFtZSIsICJ1bmFtZSIsIDMyKSwgKCJnbmFtZSIsICJnbmFtZSIsIDMyKSk6CgogICAgICAgICAgICBpZiBobmFtZSBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgVHJ5IHRvIGVuY29kZSB0aGUgc3RyaW5nIGFzIEFTQ0lJLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbmZvW25hbWVdLmVuY29kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IGluZm9bbmFtZV0KICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBsZW4oaW5mb1tuYW1lXSkgPiBsZW5ndGg6CiAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSBpbmZvW25hbWVdCgogICAgICAgICMgVGVzdCBudW1iZXIgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxpbWl0IG9yIHZhbHVlcwogICAgICAgICMgdGhhdCBsaWtlIHRvIGJlIHN0b3JlZCBhcyBmbG9hdC4KICAgICAgICBmb3IgbmFtZSwgZGlnaXRzIGluICgoInVpZCIsIDgpLCAoImdpZCIsIDgpLCAoInNpemUiLCAxMiksICgibXRpbWUiLCAxMikpOgogICAgICAgICAgICBpZiBuYW1lIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAgICAgIyBUaGUgcGF4IGhlYWRlciBoYXMgcHJpb3JpdHkuIEF2b2lkIG92ZXJmbG93LgogICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdCiAgICAgICAgICAgIGlmIG5vdCAwIDw9IHZhbCA8IDggKiogKGRpZ2l0cyAtIDEpIG9yIGlzaW5zdGFuY2UodmFsLCBmbG9hdCk6CiAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tuYW1lXSA9IHN0cih2YWwpCiAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAoKICAgICAgICAjIENyZWF0ZSBhIHBheCBleHRlbmRlZCBoZWFkZXIgaWYgbmVjZXNzYXJ5LgogICAgICAgIGlmIHBheF9oZWFkZXJzOgogICAgICAgICAgICBidWYgPSBzZWxmLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzLCBYSERUWVBFLCBlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWYgPSBiIiIKCiAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCAiYXNjaWkiLCAicmVwbGFjZSIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgY3JlYXRlX3BheF9nbG9iYWxfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgcGF4IGdsb2JhbCBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycywgWEdMVFlQRSwgInV0ZjgiKQoKICAgIGRlZiBfcG9zaXhfc3BsaXRfbmFtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJTcGxpdCBhIG5hbWUgbG9uZ2VyIHRoYW4gMTAwIGNoYXJzIGludG8gYSBwcmVmaXgKICAgICAgICAgICBhbmQgYSBuYW1lIHBhcnQuCiAgICAgICAgIiIiCiAgICAgICAgcHJlZml4ID0gbmFtZVs6TEVOR1RIX1BSRUZJWCArIDFdCiAgICAgICAgd2hpbGUgcHJlZml4IGFuZCBwcmVmaXhbLTFdICE9ICIvIjoKICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KCiAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCk6XQogICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCgogICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQogICAgICAgIHJldHVybiBwcmVmaXgsIG5hbWUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9oZWFkZXIoaW5mbywgZm9ybWF0LCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gYSBoZWFkZXIgYmxvY2suIGluZm8gaXMgYSBkaWN0aW9uYXJ5IHdpdGggZmlsZQogICAgICAgICAgIGluZm9ybWF0aW9uLCBmb3JtYXQgbXVzdCBiZSBvbmUgb2YgdGhlICpfRk9STUFUIGNvbnN0YW50cy4KICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IFsKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJuYW1lIiwgIiIpLCAxMDAsIGVuY29kaW5nLCBlcnJvcnMpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoIm1vZGUiLCAwKSAmIDBvNzc3NywgOCwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJ1aWQiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJnaWQiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJzaXplIiwgMCksIDEyLCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoIm10aW1lIiwgMCksIDEyLCBmb3JtYXQpLAogICAgICAgICAgICBiIiAgICAgICAgIiwgIyBjaGVja3N1bSBmaWVsZAogICAgICAgICAgICBpbmZvLmdldCgidHlwZSIsIFJFR1RZUEUpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoImxpbmtuYW1lIiwgIiIpLCAxMDAsIGVuY29kaW5nLCBlcnJvcnMpLAogICAgICAgICAgICBpbmZvLmdldCgibWFnaWMiLCBQT1NJWF9NQUdJQyksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgidW5hbWUiLCAiIiksIDMyLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJnbmFtZSIsICIiKSwgMzIsIGVuY29kaW5nLCBlcnJvcnMpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1ham9yIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZGV2bWlub3IiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJwcmVmaXgiLCAiIiksIDE1NSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBdCgogICAgICAgIGJ1ZiA9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCBiIiIuam9pbihwYXJ0cykpCiAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCiAgICAgICAgYnVmID0gYnVmWzotMzY0XSArICgiJTA2b1wwIiAlIGNoa3N1bSkuZW5jb2RlKCJhc2NpaSIpICsgYnVmWy0zNTc6XQogICAgICAgIHJldHVybiBidWYKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9wYXlsb2FkKHBheWxvYWQpOgogICAgICAgICIiIlJldHVybiB0aGUgc3RyaW5nIHBheWxvYWQgZmlsbGVkIHdpdGggemVybyBieXRlcwogICAgICAgICAgIHVwIHRvIHRoZSBuZXh0IDUxMiBieXRlIGJvcmRlci4KICAgICAgICAiIiIKICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocGF5bG9hZCksIEJMT0NLU0laRSkKICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICBwYXlsb2FkICs9IChCTE9DS1NJWkUgLSByZW1haW5kZXIpICogTlVMCiAgICAgICAgcmV0dXJuIHBheWxvYWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfY3JlYXRlX2dudV9sb25nX2hlYWRlcihjbHMsIG5hbWUsIHR5cGUsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiBhIEdOVVRZUEVfTE9OR05BTUUgb3IgR05VVFlQRV9MT05HTElOSyBzZXF1ZW5jZQogICAgICAgICAgIGZvciBuYW1lLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBuYW1lLmVuY29kZShlbmNvZGluZywgZXJyb3JzKSArIE5VTAoKICAgICAgICBpbmZvID0ge30KICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BMb25nTGluayIKICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCiAgICAgICAgaW5mb1sic2l6ZSJdID0gbGVuKG5hbWUpCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQwoKICAgICAgICAjIGNyZWF0ZSBleHRlbmRlZCBoZWFkZXIgKyBuYW1lIGJsb2Nrcy4KICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgZW5jb2RpbmcsIGVycm9ycykgKyBcCiAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKG5hbWUpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgdHlwZSwgZW5jb2RpbmcpOgogICAgICAgICIiIlJldHVybiBhIFBPU0lYLjEtMjAwOCBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyIHNlcXVlbmNlCiAgICAgICAgICAgdGhhdCBjb250YWlucyBhIGxpc3Qgb2Yga2V5d29yZCwgdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMKICAgICAgICAgICBtdXN0IGJlIHN0cmluZ3MuCiAgICAgICAgIiIiCiAgICAgICAgIyBDaGVjayBpZiBvbmUgb2YgdGhlIGZpZWxkcyBjb250YWlucyBzdXJyb2dhdGUgY2hhcmFjdGVycyBhbmQgdGhlcmVieQogICAgICAgICMgZm9yY2VzIGhkcmNoYXJzZXQ9QklOQVJZLCBzZWUgX3Byb2NfcGF4KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgYmluYXJ5ID0gRmFsc2UKICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gcGF4X2hlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmFsdWUuZW5jb2RlKCJ1dGY4IiwgInN0cmljdCIpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICAgICBiaW5hcnkgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByZWNvcmRzID0gYiIiCiAgICAgICAgaWYgYmluYXJ5OgogICAgICAgICAgICAjIFB1dCB0aGUgaGRyY2hhcnNldCBmaWVsZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIuCiAgICAgICAgICAgIHJlY29yZHMgKz0gYiIyMSBoZHJjaGFyc2V0PUJJTkFSWVxuIgoKICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gcGF4X2hlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKCJ1dGY4IikKICAgICAgICAgICAgaWYgYmluYXJ5OgogICAgICAgICAgICAgICAgIyBUcnkgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiBgdmFsdWUnLgogICAgICAgICAgICAgICAgIyBOZWVkbGVzcyB0byBzYXksIHRoYXQgdGhlIGVuY29kaW5nIG11c3QgbWF0Y2ggdGhlIHN0cmluZy4KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKGVuY29kaW5nLCAic3Vycm9nYXRlZXNjYXBlIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCJ1dGY4IikKCiAgICAgICAgICAgIGwgPSBsZW4oa2V5d29yZCkgKyBsZW4odmFsdWUpICsgMyAgICMgJyAnICsgJz0nICsgJ1xuJwogICAgICAgICAgICBuID0gcCA9IDAKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIG4gPSBsICsgbGVuKHN0cihwKSkKICAgICAgICAgICAgICAgIGlmIG4gPT0gcDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgcCA9IG4KICAgICAgICAgICAgcmVjb3JkcyArPSBieXRlcyhzdHIocCksICJhc2NpaSIpICsgYiIgIiArIGtleXdvcmQgKyBiIj0iICsgdmFsdWUgKyBiIlxuIgoKICAgICAgICAjIFdlIHVzZSBhIGhhcmRjb2RlZCAiLi8uL0BQYXhIZWFkZXIiIG5hbWUgbGlrZSBzdGFyIGRvZXMKICAgICAgICAjIGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IFBPU0lYIHJlY29tbWVuZHMuCiAgICAgICAgaW5mbyA9IHt9CiAgICAgICAgaW5mb1sibmFtZSJdID0gIi4vLi9AUGF4SGVhZGVyIgogICAgICAgIGluZm9bInR5cGUiXSA9IHR5cGUKICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4ocmVjb3JkcykKICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKCiAgICAgICAgIyBDcmVhdGUgcGF4IGhlYWRlciArIHJlY29yZCBibG9ja3MuCiAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsICJhc2NpaSIsICJyZXBsYWNlIikgKyBcCiAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKHJlY29yZHMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1ZiwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QgZnJvbSBhIDUxMiBieXRlIGJ5dGVzIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4oYnVmKSA9PSAwOgogICAgICAgICAgICByYWlzZSBFbXB0eUhlYWRlckVycm9yKCJlbXB0eSBoZWFkZXIiKQogICAgICAgIGlmIGxlbihidWYpICE9IEJMT0NLU0laRToKICAgICAgICAgICAgcmFpc2UgVHJ1bmNhdGVkSGVhZGVyRXJyb3IoInRydW5jYXRlZCBoZWFkZXIiKQogICAgICAgIGlmIGJ1Zi5jb3VudChOVUwpID09IEJMT0NLU0laRToKICAgICAgICAgICAgcmFpc2UgRU9GSGVhZGVyRXJyb3IoImVuZCBvZiBmaWxlIGhlYWRlciIpCgogICAgICAgIGNoa3N1bSA9IG50aShidWZbMTQ4OjE1Nl0pCiAgICAgICAgaWYgY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlckVycm9yKCJiYWQgY2hlY2tzdW0iKQoKICAgICAgICBvYmogPSBjbHMoKQogICAgICAgIG9iai5uYW1lID0gbnRzKGJ1ZlswOjEwMF0sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLm1vZGUgPSBudGkoYnVmWzEwMDoxMDhdKQogICAgICAgIG9iai51aWQgPSBudGkoYnVmWzEwODoxMTZdKQogICAgICAgIG9iai5naWQgPSBudGkoYnVmWzExNjoxMjRdKQogICAgICAgIG9iai5zaXplID0gbnRpKGJ1ZlsxMjQ6MTM2XSkKICAgICAgICBvYmoubXRpbWUgPSBudGkoYnVmWzEzNjoxNDhdKQogICAgICAgIG9iai5jaGtzdW0gPSBjaGtzdW0KICAgICAgICBvYmoudHlwZSA9IGJ1ZlsxNTY6MTU3XQogICAgICAgIG9iai5saW5rbmFtZSA9IG50cyhidWZbMTU3OjI1N10sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLnVuYW1lID0gbnRzKGJ1ZlsyNjU6Mjk3XSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmouZ25hbWUgPSBudHMoYnVmWzI5NzozMjldLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai5kZXZtYWpvciA9IG50aShidWZbMzI5OjMzN10pCiAgICAgICAgb2JqLmRldm1pbm9yID0gbnRpKGJ1ZlszMzc6MzQ1XSkKICAgICAgICBwcmVmaXggPSBudHMoYnVmWzM0NTo1MDBdLCBlbmNvZGluZywgZXJyb3JzKQoKICAgICAgICAjIE9sZCBWNyB0YXIgZm9ybWF0IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCiAgICAgICAgIyBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KICAgICAgICBpZiBvYmoudHlwZSA9PSBBUkVHVFlQRSBhbmQgb2JqLm5hbWUuZW5kc3dpdGgoIi8iKToKICAgICAgICAgICAgb2JqLnR5cGUgPSBESVJUWVBFCgogICAgICAgICMgVGhlIG9sZCBHTlUgc3BhcnNlIGZvcm1hdCBvY2N1cGllcyBzb21lIG9mIHRoZSB1bnVzZWQKICAgICAgICAjIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIHVwIHRvIDQgc3BhcnNlIHN0cnVjdHVyZXMuCiAgICAgICAgIyBTYXZlIHRoZSB0aGVtIGZvciBsYXRlciBwcm9jZXNzaW5nIGluIF9wcm9jX3NwYXJzZSgpLgogICAgICAgIGlmIG9iai50eXBlID09IEdOVVRZUEVfU1BBUlNFOgogICAgICAgICAgICBwb3MgPSAzODYKICAgICAgICAgICAgc3RydWN0cyA9IFtdCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG50aShidWZbcG9zOnBvcyArIDEyXSkKICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHN0cnVjdHMuYXBwZW5kKChvZmZzZXQsIG51bWJ5dGVzKSkKICAgICAgICAgICAgICAgIHBvcyArPSAyNAogICAgICAgICAgICBpc2V4dGVuZGVkID0gYm9vbChidWZbNDgyXSkKICAgICAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQogICAgICAgICAgICBvYmouX3NwYXJzZV9zdHJ1Y3RzID0gKHN0cnVjdHMsIGlzZXh0ZW5kZWQsIG9yaWdzaXplKQoKICAgICAgICAjIFJlbW92ZSByZWR1bmRhbnQgc2xhc2hlcyBmcm9tIGRpcmVjdG9yaWVzLgogICAgICAgIGlmIG9iai5pc2RpcigpOgogICAgICAgICAgICBvYmoubmFtZSA9IG9iai5uYW1lLnJzdHJpcCgiLyIpCgogICAgICAgICMgUmVjb25zdHJ1Y3QgYSB1c3RhciBsb25nbmFtZS4KICAgICAgICBpZiBwcmVmaXggYW5kIG9iai50eXBlIG5vdCBpbiBHTlVfVFlQRVM6CiAgICAgICAgICAgIG9iai5uYW1lID0gcHJlZml4ICsgIi8iICsgb2JqLm5hbWUKICAgICAgICByZXR1cm4gb2JqCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbXRhcmZpbGUoY2xzLCB0YXJmaWxlKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgVGFySW5mbyBvYmplY3QgZnJvbSBUYXJGaWxlIG9iamVjdAogICAgICAgICAgIHRhcmZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgIG9iaiA9IGNscy5mcm9tYnVmKGJ1ZiwgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgb2JqLm9mZnNldCA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkgLSBCTE9DS1NJWkUKICAgICAgICByZXR1cm4gb2JqLl9wcm9jX21lbWJlcih0YXJmaWxlKQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBUaGUgZm9sbG93aW5nIGFyZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYQogICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBfcHJvY19tZW1iZXIoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhCiAgICAjIHN1YmNsYXNzIHRvIGFkZCBjdXN0b20gX3Byb2NfKigpIG1ldGhvZHMuIEEgX3Byb2NfKigpIG1ldGhvZCBNVVNUCiAgICAjIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCiAgICAjIG9wZXJhdGlvbnM6CiAgICAjIDEuIFNldCBzZWxmLm9mZnNldF9kYXRhIHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MgYmVnaW4sCiAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdGhhdCBmb2xsb3dzLgogICAgIyAyLiBTZXQgdGFyZmlsZS5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCiAgICAjICAgIGJlZ2luLgogICAgIyAzLiBSZXR1cm4gc2VsZiBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgogICAgZGVmIF9wcm9jX21lbWJlcihzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJDaG9vc2UgdGhlIHJpZ2h0IHByb2Nlc3NpbmcgbWV0aG9kIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB0eXBlIGFuZCBjYWxsIGl0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudHlwZSBpbiAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX2dudWxvbmcodGFyZmlsZSkKICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2Nfc3BhcnNlKHRhcmZpbGUpCiAgICAgICAgZWxpZiBzZWxmLnR5cGUgaW4gKFhIRFRZUEUsIFhHTFRZUEUsIFNPTEFSSVNfWEhEVFlQRSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3BheCh0YXJmaWxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX2J1aWx0aW4odGFyZmlsZSkKCiAgICBkZWYgX3Byb2NfYnVpbHRpbihzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGEgYnVpbHRpbiB0eXBlIG9yIGFuIHVua25vd24gdHlwZSB3aGljaAogICAgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQogICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEKICAgICAgICBpZiBzZWxmLmlzcmVnKCkgb3Igc2VsZi50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgogICAgICAgICAgICBvZmZzZXQgKz0gc2VsZi5fYmxvY2soc2VsZi5zaXplKQogICAgICAgIHRhcmZpbGUub2Zmc2V0ID0gb2Zmc2V0CgogICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggc2F2ZWQgZ2xvYmFsCiAgICAgICAgIyBoZWFkZXIgaW5mb3JtYXRpb24uCiAgICAgICAgc2VsZi5fYXBwbHlfcGF4X2luZm8odGFyZmlsZS5wYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9wcm9jX2dudWxvbmcoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQogICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KICAgICAgICAiIiIKICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQoKICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG5leHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCiAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yOgogICAgICAgICAgICByYWlzZSBTdWJzZXF1ZW50SGVhZGVyRXJyb3IoIm1pc3Npbmcgb3IgYmFkIHN1YnNlcXVlbnQgaGVhZGVyIikKCiAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAogICAgICAgICMgdGhlIGxvbmduYW1lIGluZm9ybWF0aW9uLgogICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKICAgICAgICBpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKICAgICAgICAgICAgbmV4dC5uYW1lID0gbnRzKGJ1ZiwgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKICAgICAgICAgICAgbmV4dC5saW5rbmFtZSA9IG50cyhidWYsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQoKICAgICAgICByZXR1cm4gbmV4dAoKICAgIGRlZiBfcHJvY19zcGFyc2Uoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSBzcGFyc2UgaGVhZGVyIHBsdXMgZXh0cmEgaGVhZGVycy4KICAgICAgICAiIiIKICAgICAgICAjIFdlIGFscmVhZHkgY29sbGVjdGVkIHNvbWUgc3BhcnNlIHN0cnVjdHVyZXMgaW4gZnJvbWJ1ZigpLgogICAgICAgIHN0cnVjdHMsIGlzZXh0ZW5kZWQsIG9yaWdzaXplID0gc2VsZi5fc3BhcnNlX3N0cnVjdHMKICAgICAgICBkZWwgc2VsZi5fc3BhcnNlX3N0cnVjdHMKCiAgICAgICAgIyBDb2xsZWN0IHNwYXJzZSBzdHJ1Y3R1cmVzIGZyb20gZXh0ZW5kZWQgaGVhZGVyIGJsb2Nrcy4KICAgICAgICB3aGlsZSBpc2V4dGVuZGVkOgogICAgICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgICAgIHBvcyA9IDAKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjEpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG50aShidWZbcG9zOnBvcyArIDEyXSkKICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIG9mZnNldCBhbmQgbnVtYnl0ZXM6CiAgICAgICAgICAgICAgICAgICAgc3RydWN0cy5hcHBlbmQoKG9mZnNldCwgbnVtYnl0ZXMpKQogICAgICAgICAgICAgICAgcG9zICs9IDI0CiAgICAgICAgICAgIGlzZXh0ZW5kZWQgPSBib29sKGJ1Zls1MDRdKQogICAgICAgIHNlbGYuc3BhcnNlID0gc3RydWN0cwoKICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQogICAgICAgIHRhcmZpbGUub2Zmc2V0ID0gc2VsZi5vZmZzZXRfZGF0YSArIHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkKICAgICAgICBzZWxmLnNpemUgPSBvcmlnc2l6ZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9wcm9jX3BheChzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGFuIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgICAgUE9TSVguMS0yMDA4LgogICAgICAgICIiIgogICAgICAgICMgUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLgogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCgogICAgICAgICMgQSBwYXggaGVhZGVyIHN0b3JlcyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZm9yIGVpdGhlcgogICAgICAgICMgdGhlIGZvbGxvd2luZyBmaWxlIChleHRlbmRlZCkgb3IgYWxsIGZvbGxvd2luZyBmaWxlcwogICAgICAgICMgKGdsb2JhbCkuCiAgICAgICAgaWYgc2VsZi50eXBlID09IFhHTFRZUEU6CiAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKCiAgICAgICAgIyBDaGVjayBpZiB0aGUgcGF4IGhlYWRlciBjb250YWlucyBhIGhkcmNoYXJzZXQgZmllbGQuIFRoaXMgdGVsbHMgdXMKICAgICAgICAjIHRoZSBlbmNvZGluZyBvZiB0aGUgcGF0aCwgbGlua3BhdGgsIHVuYW1lIGFuZCBnbmFtZSBmaWVsZHMuIE5vcm1hbGx5LAogICAgICAgICMgdGhlc2UgZmllbGRzIGFyZSBVVEYtOCBlbmNvZGVkIGJ1dCBzaW5jZSBQT1NJWC4xLTIwMDggdGFyCiAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgYXJlIGFsbG93ZWQgdG8gc3RvcmUgdGhlbSBhcyByYXcgYmluYXJ5IHN0cmluZ3MgaWYKICAgICAgICAjIHRoZSB0cmFuc2xhdGlvbiB0byBVVEYtOCBmYWlscy4KICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChiciJcZCsgaGRyY2hhcnNldD0oW15cbl0rKVxuIiwgYnVmKQogICAgICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXhfaGVhZGVyc1siaGRyY2hhcnNldCJdID0gbWF0Y2guZ3JvdXAoMSkuZGVjb2RlKCJ1dGY4IikKCiAgICAgICAgIyBGb3IgdGhlIHRpbWUgYmVpbmcsIHdlIGRvbid0IGNhcmUgYWJvdXQgYW55dGhpbmcgb3RoZXIgdGhhbiAiQklOQVJZIi4KICAgICAgICAjIFRoZSBvbmx5IG90aGVyIHZhbHVlIHRoYXQgaXMgY3VycmVudGx5IGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkIGlzCiAgICAgICAgIyAiSVNPLUlSIDEwNjQ2IDIwMDAgVVRGLTgiIGluIG90aGVyIHdvcmRzIFVURi04LgogICAgICAgIGhkcmNoYXJzZXQgPSBwYXhfaGVhZGVycy5nZXQoImhkcmNoYXJzZXQiKQogICAgICAgIGlmIGhkcmNoYXJzZXQgPT0gIkJJTkFSWSI6CiAgICAgICAgICAgIGVuY29kaW5nID0gdGFyZmlsZS5lbmNvZGluZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVuY29kaW5nID0gInV0ZjgiCgogICAgICAgICMgUGFyc2UgcGF4IGhlYWRlciBpbmZvcm1hdGlvbi4gQSByZWNvcmQgbG9va3MgbGlrZSB0aGF0OgogICAgICAgICMgIiVkICVzPSVzXG4iICUgKGxlbmd0aCwga2V5d29yZCwgdmFsdWUpLiBsZW5ndGggaXMgdGhlIHNpemUKICAgICAgICAjIG9mIHRoZSBjb21wbGV0ZSByZWNvcmQgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmIGFuZAogICAgICAgICMgdGhlIG5ld2xpbmUuIGtleXdvcmQgYW5kIHZhbHVlIGFyZSBib3RoIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUoYnIiKFxkKykgKFtePV0rKT0iKQogICAgICAgIHBvcyA9IDAKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBtYXRjaCA9IHJlZ2V4Lm1hdGNoKGJ1ZiwgcG9zKQogICAgICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgbGVuZ3RoLCBrZXl3b3JkID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgbGVuZ3RoID0gaW50KGxlbmd0aCkKICAgICAgICAgICAgdmFsdWUgPSBidWZbbWF0Y2guZW5kKDIpICsgMTptYXRjaC5zdGFydCgxKSArIGxlbmd0aCAtIDFdCgogICAgICAgICAgICAjIE5vcm1hbGx5LCB3ZSBjb3VsZCBqdXN0IHVzZSAidXRmOCIgYXMgdGhlIGVuY29kaW5nIGFuZCAic3RyaWN0IgogICAgICAgICAgICAjIGFzIHRoZSBlcnJvciBoYW5kbGVyLCBidXQgd2UgYmV0dGVyIG5vdCB0YWtlIHRoZSByaXNrLiBGb3IKICAgICAgICAgICAgIyBleGFtcGxlLCBHTlUgdGFyIDw9IDEuMjMgaXMga25vd24gdG8gc3RvcmUgZmlsZW5hbWVzIGl0IGNhbm5vdAogICAgICAgICAgICAjIHRyYW5zbGF0ZSB0byBVVEYtOCBhcyByYXcgc3RyaW5ncyAodW5mb3J0dW5hdGVseSB3aXRob3V0IGEKICAgICAgICAgICAgIyBoZHJjaGFyc2V0PUJJTkFSWSBoZWFkZXIpLgogICAgICAgICAgICAjIFdlIGZpcnN0IHRyeSB0aGUgc3RyaWN0IHN0YW5kYXJkIGVuY29kaW5nLCBhbmQgaWYgdGhhdCBmYWlscyB3ZQogICAgICAgICAgICAjIGZhbGwgYmFjayBvbiB0aGUgdXNlcidzIGVuY29kaW5nIGFuZCBlcnJvciBoYW5kbGVyLgogICAgICAgICAgICBrZXl3b3JkID0gc2VsZi5fZGVjb2RlX3BheF9maWVsZChrZXl3b3JkLCAidXRmOCIsICJ1dGY4IiwKICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLmVycm9ycykKICAgICAgICAgICAgaWYga2V5d29yZCBpbiBQQVhfTkFNRV9GSUVMRFM6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2RlY29kZV9wYXhfZmllbGQodmFsdWUsIGVuY29kaW5nLCB0YXJmaWxlLmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLmVycm9ycykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZGVjb2RlX3BheF9maWVsZCh2YWx1ZSwgInV0ZjgiLCAidXRmOCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuZXJyb3JzKQoKICAgICAgICAgICAgcGF4X2hlYWRlcnNba2V5d29yZF0gPSB2YWx1ZQogICAgICAgICAgICBwb3MgKz0gbGVuZ3RoCgogICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyLgogICAgICAgIHRyeToKICAgICAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFN1YnNlcXVlbnRIZWFkZXJFcnJvcigibWlzc2luZyBvciBiYWQgc3Vic2VxdWVudCBoZWFkZXIiKQoKICAgICAgICAjIFByb2Nlc3MgR05VIHNwYXJzZSBpbmZvcm1hdGlvbi4KICAgICAgICBpZiAiR05VLnNwYXJzZS5tYXAiIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAjIEdOVSBleHRlbmRlZCBzcGFyc2UgZm9ybWF0IHZlcnNpb24gMC4xLgogICAgICAgICAgICBzZWxmLl9wcm9jX2dudXNwYXJzZV8wMShuZXh0LCBwYXhfaGVhZGVycykKCiAgICAgICAgZWxpZiAiR05VLnNwYXJzZS5zaXplIiBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgIyBHTlUgZXh0ZW5kZWQgc3BhcnNlIGZvcm1hdCB2ZXJzaW9uIDAuMC4KICAgICAgICAgICAgc2VsZi5fcHJvY19nbnVzcGFyc2VfMDAobmV4dCwgcGF4X2hlYWRlcnMsIGJ1ZikKCiAgICAgICAgZWxpZiBwYXhfaGVhZGVycy5nZXQoIkdOVS5zcGFyc2UubWFqb3IiKSA9PSAiMSIgYW5kIHBheF9oZWFkZXJzLmdldCgiR05VLnNwYXJzZS5taW5vciIpID09ICIwIjoKICAgICAgICAgICAgIyBHTlUgZXh0ZW5kZWQgc3BhcnNlIGZvcm1hdCB2ZXJzaW9uIDEuMC4KICAgICAgICAgICAgc2VsZi5fcHJvY19nbnVzcGFyc2VfMTAobmV4dCwgcGF4X2hlYWRlcnMsIHRhcmZpbGUpCgogICAgICAgIGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgU09MQVJJU19YSERUWVBFKToKICAgICAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCB0aGUgZXh0ZW5kZWQgaGVhZGVyIGluZm8uCiAgICAgICAgICAgIG5leHQuX2FwcGx5X3BheF9pbmZvKHBheF9oZWFkZXJzLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKICAgICAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAoKICAgICAgICAgICAgaWYgInNpemUiIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAgICAgIyBJZiB0aGUgZXh0ZW5kZWQgaGVhZGVyIHJlcGxhY2VzIHRoZSBzaXplIGZpZWxkLAogICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQKICAgICAgICAgICAgICAgICMgaGVhZGVyIHN0YXJ0cy4KICAgICAgICAgICAgICAgIG9mZnNldCA9IG5leHQub2Zmc2V0X2RhdGEKICAgICAgICAgICAgICAgIGlmIG5leHQuaXNyZWcoKSBvciBuZXh0LnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbmV4dC5fYmxvY2sobmV4dC5zaXplKQogICAgICAgICAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKCiAgICAgICAgcmV0dXJuIG5leHQKCiAgICBkZWYgX3Byb2NfZ251c3BhcnNlXzAwKHNlbGYsIG5leHQsIHBheF9oZWFkZXJzLCBidWYpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgdGFyIGV4dGVuZGVkIHNwYXJzZSBoZWFkZXIsIHZlcnNpb24gMC4wLgogICAgICAgICIiIgogICAgICAgIG9mZnNldHMgPSBbXQogICAgICAgIGZvciBtYXRjaCBpbiByZS5maW5kaXRlcihiciJcZCsgR05VLnNwYXJzZS5vZmZzZXQ9KFxkKylcbiIsIGJ1Zik6CiAgICAgICAgICAgIG9mZnNldHMuYXBwZW5kKGludChtYXRjaC5ncm91cCgxKSkpCiAgICAgICAgbnVtYnl0ZXMgPSBbXQogICAgICAgIGZvciBtYXRjaCBpbiByZS5maW5kaXRlcihiciJcZCsgR05VLnNwYXJzZS5udW1ieXRlcz0oXGQrKVxuIiwgYnVmKToKICAgICAgICAgICAgbnVtYnl0ZXMuYXBwZW5kKGludChtYXRjaC5ncm91cCgxKSkpCiAgICAgICAgbmV4dC5zcGFyc2UgPSBsaXN0KHppcChvZmZzZXRzLCBudW1ieXRlcykpCgogICAgZGVmIF9wcm9jX2dudXNwYXJzZV8wMShzZWxmLCBuZXh0LCBwYXhfaGVhZGVycyk6CiAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSB0YXIgZXh0ZW5kZWQgc3BhcnNlIGhlYWRlciwgdmVyc2lvbiAwLjEuCiAgICAgICAgIiIiCiAgICAgICAgc3BhcnNlID0gW2ludCh4KSBmb3IgeCBpbiBwYXhfaGVhZGVyc1siR05VLnNwYXJzZS5tYXAiXS5zcGxpdCgiLCIpXQogICAgICAgIG5leHQuc3BhcnNlID0gbGlzdCh6aXAoc3BhcnNlWzo6Ml0sIHNwYXJzZVsxOjoyXSkpCgogICAgZGVmIF9wcm9jX2dudXNwYXJzZV8xMChzZWxmLCBuZXh0LCBwYXhfaGVhZGVycywgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSB0YXIgZXh0ZW5kZWQgc3BhcnNlIGhlYWRlciwgdmVyc2lvbiAxLjAuCiAgICAgICAgIiIiCiAgICAgICAgZmllbGRzID0gTm9uZQogICAgICAgIHNwYXJzZSA9IFtdCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgIGZpZWxkcywgYnVmID0gYnVmLnNwbGl0KGIiXG4iLCAxKQogICAgICAgIGZpZWxkcyA9IGludChmaWVsZHMpCiAgICAgICAgd2hpbGUgbGVuKHNwYXJzZSkgPCBmaWVsZHMgKiAyOgogICAgICAgICAgICBpZiBiIlxuIiBub3QgaW4gYnVmOgogICAgICAgICAgICAgICAgYnVmICs9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICAgICAgbnVtYmVyLCBidWYgPSBidWYuc3BsaXQoYiJcbiIsIDEpCiAgICAgICAgICAgIHNwYXJzZS5hcHBlbmQoaW50KG51bWJlcikpCiAgICAgICAgbmV4dC5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKICAgICAgICBuZXh0LnNwYXJzZSA9IGxpc3QoemlwKHNwYXJzZVs6OjJdLCBzcGFyc2VbMTo6Ml0pKQoKICAgIGRlZiBfYXBwbHlfcGF4X2luZm8oc2VsZiwgcGF4X2hlYWRlcnMsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJlcGxhY2UgZmllbGRzIHdpdGggc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIGZyb20gYSBwcmV2aW91cwogICAgICAgICAgIHBheCBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyLgogICAgICAgICIiIgogICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXl3b3JkID09ICJHTlUuc3BhcnNlLm5hbWUiOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAicGF0aCIsIHZhbHVlKQogICAgICAgICAgICBlbGlmIGtleXdvcmQgPT0gIkdOVS5zcGFyc2Uuc2l6ZSI6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICJzaXplIiwgaW50KHZhbHVlKSkKICAgICAgICAgICAgZWxpZiBrZXl3b3JkID09ICJHTlUuc3BhcnNlLnJlYWxzaXplIjoKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgInNpemUiLCBpbnQodmFsdWUpKQogICAgICAgICAgICBlbGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX05VTUJFUl9GSUVMRFM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBBWF9OVU1CRVJfRklFTERTW2tleXdvcmRdKHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDAKICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgPT0gInBhdGgiOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucnN0cmlwKCIvIikKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5d29yZCwgdmFsdWUpCgogICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycy5jb3B5KCkKCiAgICBkZWYgX2RlY29kZV9wYXhfZmllbGQoc2VsZiwgdmFsdWUsIGVuY29kaW5nLCBmYWxsYmFja19lbmNvZGluZywgZmFsbGJhY2tfZXJyb3JzKToKICAgICAgICAiIiJEZWNvZGUgYSBzaW5nbGUgZmllbGQgZnJvbSBhIHBheCByZWNvcmQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKGVuY29kaW5nLCAic3RyaWN0IikKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKGZhbGxiYWNrX2VuY29kaW5nLCBmYWxsYmFja19lcnJvcnMpCgogICAgZGVmIF9ibG9jayhzZWxmLCBjb3VudCk6CiAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAogICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KICAgICAgICAiIiIKICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQogICAgICAgIGlmIHJlbWFpbmRlcjoKICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCgogICAgZGVmIGlzcmVnKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gUkVHVUxBUl9UWVBFUwogICAgZGVmIGlzZmlsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5pc3JlZygpCiAgICBkZWYgaXNkaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBESVJUWVBFCiAgICBkZWYgaXNzeW0oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBTWU1UWVBFCiAgICBkZWYgaXNsbmsoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBMTktUWVBFCiAgICBkZWYgaXNjaHIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBDSFJUWVBFCiAgICBkZWYgaXNibGsoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBCTEtUWVBFCiAgICBkZWYgaXNmaWZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRklGT1RZUEUKICAgIGRlZiBpc3NwYXJzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zcGFyc2UgaXMgbm90IE5vbmUKICAgIGRlZiBpc2RldihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIChDSFJUWVBFLCBCTEtUWVBFLCBGSUZPVFlQRSkKIyBjbGFzcyBUYXJJbmZvCgpjbGFzcyBUYXJGaWxlKG9iamVjdCk6CiAgICAiIiJUaGUgVGFyRmlsZSBDbGFzcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGFyIGFyY2hpdmVzLgogICAgIiIiCgogICAgZGVidWcgPSAwICAgICAgICAgICAgICAgICAgICMgTWF5IGJlIHNldCBmcm9tIDAgKG5vIG1zZ3MpIHRvIDMgKGFsbCBtc2dzKQoKICAgIGRlcmVmZXJlbmNlID0gRmFsc2UgICAgICAgICAjIElmIHRydWUsIGFkZCBjb250ZW50IG9mIGxpbmtlZCBmaWxlIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFyIGZpbGUsIGVsc2UgdGhlIGxpbmsuCgogICAgaWdub3JlX3plcm9zID0gRmFsc2UgICAgICAgICMgSWYgdHJ1ZSwgc2tpcHMgZW1wdHkgb3IgaW52YWxpZCBibG9ja3MgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZXMgcHJvY2Vzc2luZy4KCiAgICBlcnJvcmxldmVsID0gMSAgICAgICAgICAgICAgIyBJZiAwLCBmYXRhbCBlcnJvcnMgb25seSBhcHBlYXIgaW4gZGVidWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1lc3NhZ2VzIChpZiBkZWJ1ZyA+PSAwKS4gSWYgPiAwLCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxlciBhcyBleGNlcHRpb25zLgoKICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUICAgICAjIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gYXJjaGl2ZS4KCiAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBFbmNvZGluZyBmb3IgOC1iaXQgY2hhcmFjdGVyIHN0cmluZ3MuCgogICAgZXJyb3JzID0gTm9uZSAgICAgICAgICAgICAgICMgRXJyb3IgaGFuZGxlciBmb3IgdW5pY29kZSBjb252ZXJzaW9uLgoKICAgIHRhcmluZm8gPSBUYXJJbmZvICAgICAgICAgICAjIFRoZSBkZWZhdWx0IFRhckluZm8gY2xhc3MgdG8gdXNlLgoKICAgIGZpbGVvYmplY3QgPSBFeEZpbGVPYmplY3QgICAjIFRoZSBkZWZhdWx0IEV4RmlsZU9iamVjdCBjbGFzcyB0byB1c2UuCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgZm9ybWF0PU5vbmUsCiAgICAgICAgICAgIHRhcmluZm89Tm9uZSwgZGVyZWZlcmVuY2U9Tm9uZSwgaWdub3JlX3plcm9zPU5vbmUsIGVuY29kaW5nPU5vbmUsCiAgICAgICAgICAgIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIiwgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKICAgICAgICAiIiJPcGVuIGFuICh1bmNvbXByZXNzZWQpIHRhciBhcmNoaXZlIGBuYW1lJy4gYG1vZGUnIGlzIGVpdGhlciAncicgdG8KICAgICAgICAgICByZWFkIGZyb20gYW4gZXhpc3RpbmcgYXJjaGl2ZSwgJ2EnIHRvIGFwcGVuZCBkYXRhIHRvIGFuIGV4aXN0aW5nCiAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKICAgICAgICAgICBkZWZhdWx0cyB0byAncicuCiAgICAgICAgICAgSWYgYGZpbGVvYmonIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgZGF0YS4gSWYgaXQKICAgICAgICAgICBjYW4gYmUgZGV0ZXJtaW5lZCwgYG1vZGUnIGlzIG92ZXJyaWRkZW4gYnkgYGZpbGVvYmoncyBtb2RlLgogICAgICAgICAgIGBmaWxlb2JqJyBpcyBub3QgY2xvc2VkLCB3aGVuIFRhckZpbGUgaXMgY2xvc2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQogICAgICAgIHNlbGYubW9kZSA9IG1vZGUKICAgICAgICBzZWxmLl9tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQoKICAgICAgICBpZiBub3QgZmlsZW9iajoKICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICAgICAgIyBDcmVhdGUgbm9uZXhpc3RlbnQgZmlsZXMgaW4gYXBwZW5kIG1vZGUuCiAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAidyIKICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSAid2IiCiAgICAgICAgICAgIGZpbGVvYmogPSBibHRuX29wZW4obmFtZSwgc2VsZi5fbW9kZSkKICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBoYXNhdHRyKGZpbGVvYmosICJuYW1lIik6CiAgICAgICAgICAgICAgICBuYW1lID0gZmlsZW9iai5uYW1lCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZmlsZW9iaiwgIm1vZGUiKToKICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSBmaWxlb2JqLm1vZGUKICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgobmFtZSkgaWYgbmFtZSBlbHNlIE5vbmUKICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCgogICAgICAgICMgSW5pdCBhdHRyaWJ1dGVzLgogICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnRhcmluZm8gPSB0YXJpbmZvCiAgICAgICAgaWYgZGVyZWZlcmVuY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZGVyZWZlcmVuY2UgPSBkZXJlZmVyZW5jZQogICAgICAgIGlmIGlnbm9yZV96ZXJvcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pZ25vcmVfemVyb3MgPSBpZ25vcmVfemVyb3MKICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCiAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKCiAgICAgICAgaWYgcGF4X2hlYWRlcnMgaXMgbm90IE5vbmUgYW5kIHNlbGYuZm9ybWF0ID09IFBBWF9GT1JNQVQ6CiAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSB7fQoKICAgICAgICBpZiBkZWJ1ZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IGRlYnVnCiAgICAgICAgaWYgZXJyb3JsZXZlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5lcnJvcmxldmVsID0gZXJyb3JsZXZlbAoKICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMuCiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQogICAgICAgIHNlbGYubWVtYmVycyA9IFtdICAgICAgICMgbGlzdCBvZiBtZW1iZXJzIGFzIFRhckluZm8gb2JqZWN0cwogICAgICAgIHNlbGYuX2xvYWRlZCA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAogICAgICAgIHNlbGYub2Zmc2V0ID0gc2VsZi5maWxlb2JqLnRlbGwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCiAgICAgICAgc2VsZi5pbm9kZXMgPSB7fSAgICAgICAgIyBkaWN0aW9uYXJ5IGNhY2hpbmcgdGhlIGlub2RlcyBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgogICAgICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBzZWxmLm5leHQoKQoKICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIjoKICAgICAgICAgICAgICAgICMgTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLAogICAgICAgICAgICAgICAgIyBiZWZvcmUgdGhlIGZpcnN0IGVtcHR5IGJsb2NrLgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8uZnJvbXRhcmZpbGUoc2VsZikKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZIZWFkZXJFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKCiAgICAgICAgICAgICAgICBpZiBzZWxmLnBheF9oZWFkZXJzOgogICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYudGFyaW5mby5jcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKICAgICAgICAgICAgcmFpc2UKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQmVsb3cgYXJlIHRoZSBjbGFzc21ldGhvZHMgd2hpY2ggYWN0IGFzIGFsdGVybmF0ZSBjb25zdHJ1Y3RvcnMgdG8gdGhlCiAgICAjIFRhckZpbGUgY2xhc3MuIFRoZSBvcGVuKCkgbWV0aG9kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGlzIG5lZWRlZCBmb3IKICAgICMgcHVibGljIHVzZTsgaXQgaXMgdGhlICJzdXBlciItY29uc3RydWN0b3IgYW5kIGlzIGFibGUgdG8gc2VsZWN0IGFuCiAgICAjIGFkZXF1YXRlICJzdWIiLWNvbnN0cnVjdG9yIGZvciBhIHBhcnRpY3VsYXIgY29tcHJlc3Npb24gdXNpbmcgdGhlIG1hcHBpbmcKICAgICMgZnJvbSBPUEVOX01FVEguCiAgICAjCiAgICAjIFRoaXMgY29uY2VwdCBhbGxvd3Mgb25lIHRvIHN1YmNsYXNzIFRhckZpbGUgd2l0aG91dCBsb3NpbmcgdGhlIGNvbWZvcnQgb2YKICAgICMgdGhlIHN1cGVyLWNvbnN0cnVjdG9yLiBBIHN1Yi1jb25zdHJ1Y3RvciBpcyByZWdpc3RlcmVkIGFuZCBtYWRlIGF2YWlsYWJsZQogICAgIyBieSBhZGRpbmcgaXQgdG8gdGhlIG1hcHBpbmcgaW4gT1BFTl9NRVRILgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9UkVDT1JEU0laRSwgKiprd2FyZ3MpOgogICAgICAgICIiIk9wZW4gYSB0YXIgYXJjaGl2ZSBmb3IgcmVhZGluZywgd3JpdGluZyBvciBhcHBlbmRpbmcuIFJldHVybgogICAgICAgICAgIGFuIGFwcHJvcHJpYXRlIFRhckZpbGUgY2xhc3MuCgogICAgICAgICAgIG1vZGU6CiAgICAgICAgICAgJ3InIG9yICdyOionIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgogICAgICAgICAgICdyOicgICAgICAgICBvcGVuIGZvciByZWFkaW5nIGV4Y2x1c2l2ZWx5IHVuY29tcHJlc3NlZAogICAgICAgICAgICdyOmd6JyAgICAgICBvcGVuIGZvciByZWFkaW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbgogICAgICAgICAgICdyOmJ6MicgICAgICBvcGVuIGZvciByZWFkaW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KICAgICAgICAgICAnYScgb3IgJ2E6JyAgb3BlbiBmb3IgYXBwZW5kaW5nLCBjcmVhdGluZyB0aGUgZmlsZSBpZiBuZWNlc3NhcnkKICAgICAgICAgICAndycgb3IgJ3c6JyAgb3BlbiBmb3Igd3JpdGluZyB3aXRob3V0IGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3c6Z3onICAgICAgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3c6YnoyJyAgICAgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgoKICAgICAgICAgICAncnwqJyAgICAgICAgb3BlbiBhIHN0cmVhbSBvZiB0YXIgYmxvY2tzIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgICAgICAncnwnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MgZm9yIHJlYWRpbmcKICAgICAgICAgICAncnxneicgICAgICAgb3BlbiBhIGd6aXAgY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcwogICAgICAgICAgICdyfGJ6MicgICAgICBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcwogICAgICAgICAgICd3fCcgICAgICAgICBvcGVuIGFuIHVuY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKICAgICAgICAgICAnd3xneicgICAgICAgb3BlbiBhIGd6aXAgY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKICAgICAgICAgICAnd3xiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBuYW1lIGFuZCBub3QgZmlsZW9iajoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm90aGluZyB0byBvcGVuIikKCiAgICAgICAgaWYgbW9kZSBpbiAoInIiLCAicjoqIik6CiAgICAgICAgICAgICMgRmluZCBvdXQgd2hpY2ggKm9wZW4oKSBpcyBhcHByb3ByaWF0ZSBmb3Igb3BlbmluZyB0aGUgZmlsZS4KICAgICAgICAgICAgZm9yIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CiAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzYXZlZF9wb3MgPSBmaWxlb2JqLnRlbGwoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsICJyIiwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvcikgYXMgZToKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoc2F2ZWRfcG9zKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHN1Y2Nlc3NmdWxseSIpCgogICAgICAgIGVsaWYgIjoiIGluIG1vZGU6CiAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoIjoiLCAxKQogICAgICAgICAgICBmaWxlbW9kZSA9IGZpbGVtb2RlIG9yICJyIgogICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCgogICAgICAgICAgICAjIFNlbGVjdCB0aGUgKm9wZW4oKSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8KICAgICAgICAgICAgIyBnaXZlbiBjb21wcmVzc2lvbi4KICAgICAgICAgICAgaWYgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCiAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsIGZpbGVtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKCiAgICAgICAgZWxpZiAifCIgaW4gbW9kZToKICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgifCIsIDEpCiAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCiAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKCiAgICAgICAgICAgIGlmIGZpbGVtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQoKICAgICAgICAgICAgc3RyZWFtID0gX1N0cmVhbShuYW1lLCBmaWxlbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHQgPSBjbHMobmFtZSwgZmlsZW1vZGUsIHN0cmVhbSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIHQKCiAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6CiAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5kaXNjZXJuaWJsZSBtb2RlIikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiB0YXJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICIiIk9wZW4gdW5jb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGd6b3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGd6aXAKICAgICAgICAgICAgZ3ppcC5HemlwRmlsZQogICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiZ3ppcCBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCgogICAgICAgIGV4dGZpbGVvYmogPSBmaWxlb2JqIGlzIG5vdCBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlb2JqID0gZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlICsgImIiLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKQogICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgIGlmIG5vdCBleHRmaWxlb2JqIGFuZCBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGlmIG5vdCBleHRmaWxlb2JqIGFuZCBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IGV4dGZpbGVvYmoKICAgICAgICByZXR1cm4gdAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ6Mm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBjb21wcmVzc2xldmVsPTksICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIGJ6aXAyIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJydyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnLiIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZmlsZW9iaiA9IF9CWjJQcm94eShmaWxlb2JqLCBtb2RlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCgogICAgICAgIHRyeToKICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IpOgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICByZXR1cm4gdAoKICAgICMgQWxsICpvcGVuKCkgbWV0aG9kcyBhcmUgcmVnaXN0ZXJlZCBoZXJlLgogICAgT1BFTl9NRVRIID0gewogICAgICAgICJ0YXIiOiAidGFyb3BlbiIsICAgIyB1bmNvbXByZXNzZWQgdGFyCiAgICAgICAgImd6IjogICJnem9wZW4iLCAgICAjIGd6aXAgY29tcHJlc3NlZCB0YXIKICAgICAgICAiYnoyIjogImJ6Mm9wZW4iICAgICMgYnppcDIgY29tcHJlc3NlZCB0YXIKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVGhlIHB1YmxpYyBtZXRob2RzIHdoaWNoIFRhckZpbGUgcHJvdmlkZXM6CgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBUYXJGaWxlLiBJbiB3cml0ZS1tb2RlLCB0d28gZmluaXNoaW5nIHplcm8gYmxvY2tzIGFyZQogICAgICAgICAgIGFwcGVuZGVkIHRvIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFICogMikpCiAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IChCTE9DS1NJWkUgKiAyKQogICAgICAgICAgICAjIGZpbGwgdXAgdGhlIGVuZCB3aXRoIHplcm8tYmxvY2tzCiAgICAgICAgICAgICMgKGxpa2Ugb3B0aW9uIC1iMjAgZm9yIHRhciBkb2VzKQogICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChzZWxmLm9mZnNldCwgUkVDT1JEU0laRSkKICAgICAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoUkVDT1JEU0laRSAtIHJlbWFpbmRlcikpCgogICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQoKICAgIGRlZiBnZXRtZW1iZXIoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgVGFySW5mbyBvYmplY3QgZm9yIG1lbWJlciBgbmFtZScuIElmIGBuYW1lJyBjYW4gbm90IGJlCiAgICAgICAgICAgZm91bmQgaW4gdGhlIGFyY2hpdmUsIEtleUVycm9yIGlzIHJhaXNlZC4gSWYgYSBtZW1iZXIgb2NjdXJzIG1vcmUKICAgICAgICAgICB0aGFuIG9uY2UgaW4gdGhlIGFyY2hpdmUsIGl0cyBsYXN0IG9jY3VycmVuY2UgaXMgYXNzdW1lZCB0byBiZSB0aGUKICAgICAgICAgICBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICB0YXJpbmZvID0gc2VsZi5fZ2V0bWVtYmVyKG5hbWUpCiAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiZmlsZW5hbWUgJXIgbm90IGZvdW5kIiAlIG5hbWUpCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBkZWYgZ2V0bWVtYmVycyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIFRhckluZm8gb2JqZWN0cy4gVGhlCiAgICAgICAgICAgbGlzdCBoYXMgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIG1lbWJlcnMgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soKQogICAgICAgIGlmIG5vdCBzZWxmLl9sb2FkZWQ6ICAgICMgaWYgd2Ugd2FudCB0byBvYnRhaW4gYSBsaXN0IG9mCiAgICAgICAgICAgIHNlbGYuX2xvYWQoKSAgICAgICAgIyBhbGwgbWVtYmVycywgd2UgZmlyc3QgaGF2ZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2NhbiB0aGUgd2hvbGUgYXJjaGl2ZS4KICAgICAgICByZXR1cm4gc2VsZi5tZW1iZXJzCgogICAgZGVmIGdldG5hbWVzKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgdGhlaXIgbmFtZXMuIEl0IGhhcwogICAgICAgICAgIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW3RhcmluZm8ubmFtZSBmb3IgdGFyaW5mbyBpbiBzZWxmLmdldG1lbWJlcnMoKV0KCiAgICBkZWYgZ2V0dGFyaW5mbyhzZWxmLCBuYW1lPU5vbmUsIGFyY25hbWU9Tm9uZSwgZmlsZW9iaj1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmb3IgZWl0aGVyIHRoZSBmaWxlIGBuYW1lJyBvciB0aGUgZmlsZQogICAgICAgICAgIG9iamVjdCBgZmlsZW9iaicgKHVzaW5nIG9zLmZzdGF0IG9uIGl0cyBmaWxlIGRlc2NyaXB0b3IpLiBZb3UgY2FuCiAgICAgICAgICAgbW9kaWZ5IHNvbWUgb2YgdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGJlZm9yZSB5b3UgYWRkIGl0IHVzaW5nCiAgICAgICAgICAgYWRkZmlsZSgpLiBJZiBnaXZlbiwgYGFyY25hbWUnIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUKICAgICAgICAgICBmaWxlIGluIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgICMgV2hlbiBmaWxlb2JqIGlzIGdpdmVuLCByZXBsYWNlIG5hbWUgYnkKICAgICAgICAjIGZpbGVvYmoncyByZWFsIG5hbWUuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQoKICAgICAgICAjIEJ1aWxkaW5nIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIyBCYWNrd2FyZCBzbGFzaGVzIGFyZSBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzLAogICAgICAgICMgQWJzb2x1dGUgcGF0aHMgYXJlIHR1cm5lZCB0byByZWxhdGl2ZSBwYXRocy4KICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCiAgICAgICAgZHJ2LCBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpCiAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUucmVwbGFjZShvcy5zZXAsICIvIikKICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5sc3RyaXAoIi8iKQoKICAgICAgICAjIE5vdywgZmlsbCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aAogICAgICAgICMgaW5mb3JtYXRpb24gc3BlY2lmaWMgZm9yIHRoZSBmaWxlLgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8oKQogICAgICAgIHRhcmluZm8udGFyZmlsZSA9IHNlbGYKCiAgICAgICAgIyBVc2Ugb3Muc3RhdCBvciBvcy5sc3RhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtCiAgICAgICAgIyBhbmQgaWYgc3ltbGlua3Mgc2hhbGwgYmUgcmVzb2x2ZWQuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibHN0YXQiKSBhbmQgbm90IHNlbGYuZGVyZWZlcmVuY2U6CiAgICAgICAgICAgICAgICBzdGF0cmVzID0gb3MubHN0YXQobmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5zdGF0KG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmZzdGF0KGZpbGVvYmouZmlsZW5vKCkpCiAgICAgICAgbGlua25hbWUgPSAiIgoKICAgICAgICBzdG1kID0gc3RhdHJlcy5zdF9tb2RlCiAgICAgICAgaWYgc3RhdC5TX0lTUkVHKHN0bWQpOgogICAgICAgICAgICBpbm9kZSA9IChzdGF0cmVzLnN0X2lubywgc3RhdHJlcy5zdF9kZXYpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRlcmVmZXJlbmNlIGFuZCBzdGF0cmVzLnN0X25saW5rID4gMSBhbmQgXAogICAgICAgICAgICAgICAgICAgIGlub2RlIGluIHNlbGYuaW5vZGVzIGFuZCBhcmNuYW1lICE9IHNlbGYuaW5vZGVzW2lub2RlXToKICAgICAgICAgICAgICAgICMgSXMgaXQgYSBoYXJkbGluayB0byBhbiBhbHJlYWR5CiAgICAgICAgICAgICAgICAjIGFyY2hpdmVkIGZpbGU/CiAgICAgICAgICAgICAgICB0eXBlID0gTE5LVFlQRQogICAgICAgICAgICAgICAgbGlua25hbWUgPSBzZWxmLmlub2Rlc1tpbm9kZV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhlIGlub2RlIGlzIGFkZGVkIG9ubHkgaWYgaXRzIHZhbGlkLgogICAgICAgICAgICAgICAgIyBGb3Igd2luMzIgaXQgaXMgYWx3YXlzIDAuCiAgICAgICAgICAgICAgICB0eXBlID0gUkVHVFlQRQogICAgICAgICAgICAgICAgaWYgaW5vZGVbMF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbm9kZXNbaW5vZGVdID0gYXJjbmFtZQogICAgICAgIGVsaWYgc3RhdC5TX0lTRElSKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gRElSVFlQRQogICAgICAgIGVsaWYgc3RhdC5TX0lTRklGTyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IEZJRk9UWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBTWU1UWVBFCiAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucmVhZGxpbmsobmFtZSkKICAgICAgICBlbGlmIHN0YXQuU19JU0NIUihzdG1kKToKICAgICAgICAgICAgdHlwZSA9IENIUlRZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0JMSyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IEJMS1RZUEUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIEZpbGwgdGhlIFRhckluZm8gb2JqZWN0IHdpdGggYWxsCiAgICAgICAgIyBpbmZvcm1hdGlvbiB3ZSBjYW4gZ2V0LgogICAgICAgIHRhcmluZm8ubmFtZSA9IGFyY25hbWUKICAgICAgICB0YXJpbmZvLm1vZGUgPSBzdG1kCiAgICAgICAgdGFyaW5mby51aWQgPSBzdGF0cmVzLnN0X3VpZAogICAgICAgIHRhcmluZm8uZ2lkID0gc3RhdHJlcy5zdF9naWQKICAgICAgICBpZiB0eXBlID09IFJFR1RZUEU6CiAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IHN0YXRyZXMuc3Rfc2l6ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IDAKICAgICAgICB0YXJpbmZvLm10aW1lID0gc3RhdHJlcy5zdF9tdGltZQogICAgICAgIHRhcmluZm8udHlwZSA9IHR5cGUKICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGlua25hbWUKICAgICAgICBpZiBwd2Q6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSBwd2QuZ2V0cHd1aWQodGFyaW5mby51aWQpWzBdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBpZiBncnA6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgPSBncnAuZ2V0Z3JnaWQodGFyaW5mby5naWQpWzBdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgdHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJtYWpvciIpIGFuZCBoYXNhdHRyKG9zLCAibWlub3IiKToKICAgICAgICAgICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBvcy5tYWpvcihzdGF0cmVzLnN0X3JkZXYpCiAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gb3MubWlub3Ioc3RhdHJlcy5zdF9yZGV2KQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgZGVmIGxpc3Qoc2VsZiwgdmVyYm9zZT1UcnVlKToKICAgICAgICAiIiJQcmludCBhIHRhYmxlIG9mIGNvbnRlbnRzIHRvIHN5cy5zdGRvdXQuIElmIGB2ZXJib3NlJyBpcyBGYWxzZSwgb25seQogICAgICAgICAgIHRoZSBuYW1lcyBvZiB0aGUgbWVtYmVycyBhcmUgcHJpbnRlZC4gSWYgaXQgaXMgVHJ1ZSwgYW4gYGxzIC1sJy1saWtlCiAgICAgICAgICAgb3V0cHV0IGlzIHByb2R1Y2VkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCkKCiAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZjoKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHByaW50KGZpbGVtb2RlKHRhcmluZm8ubW9kZSksIGVuZD0nICcpCiAgICAgICAgICAgICAgICBwcmludCgiJXMvJXMiICUgKHRhcmluZm8udW5hbWUgb3IgdGFyaW5mby51aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgb3IgdGFyaW5mby5naWQpLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2NocigpIG9yIHRhcmluZm8uaXNibGsoKToKICAgICAgICAgICAgICAgICAgICBwcmludCgiJTEwcyIgJSAoIiVkLCVkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHRhcmluZm8uZGV2bWFqb3IsIHRhcmluZm8uZGV2bWlub3IpKSwgZW5kPScgJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiUxMGQiICUgdGFyaW5mby5zaXplLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgcHJpbnQoIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIgXAogICAgICAgICAgICAgICAgICAgICAgJSB0aW1lLmxvY2FsdGltZSh0YXJpbmZvLm10aW1lKVs6Nl0sIGVuZD0nICcpCgogICAgICAgICAgICBwcmludCh0YXJpbmZvLm5hbWUgKyAoIi8iIGlmIHRhcmluZm8uaXNkaXIoKSBlbHNlICIiKSwgZW5kPScgJykKCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIi0+IiwgdGFyaW5mby5saW5rbmFtZSwgZW5kPScgJykKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKICAgICAgICAgICAgICAgICAgICBwcmludCgibGluayB0byIsIHRhcmluZm8ubGlua25hbWUsIGVuZD0nICcpCiAgICAgICAgICAgIHByaW50KCkKCiAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGFyY25hbWU9Tm9uZSwgcmVjdXJzaXZlPVRydWUsIGV4Y2x1ZGU9Tm9uZSwgZmlsdGVyPU5vbmUpOgogICAgICAgICIiIkFkZCB0aGUgZmlsZSBgbmFtZScgdG8gdGhlIGFyY2hpdmUuIGBuYW1lJyBtYXkgYmUgYW55IHR5cGUgb2YgZmlsZQogICAgICAgICAgIChkaXJlY3RvcnksIGZpZm8sIHN5bWJvbGljIGxpbmssIGV0Yy4pLiBJZiBnaXZlbiwgYGFyY25hbWUnCiAgICAgICAgICAgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLgogICAgICAgICAgIERpcmVjdG9yaWVzIGFyZSBhZGRlZCByZWN1cnNpdmVseSBieSBkZWZhdWx0LiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5CiAgICAgICAgICAgc2V0dGluZyBgcmVjdXJzaXZlJyB0byBGYWxzZS4gYGV4Y2x1ZGUnIGlzIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQKICAgICAgICAgICByZXR1cm4gVHJ1ZSBmb3IgZWFjaCBmaWxlbmFtZSB0byBiZSBleGNsdWRlZC4gYGZpbHRlcicgaXMgYSBmdW5jdGlvbgogICAgICAgICAgIHRoYXQgZXhwZWN0cyBhIFRhckluZm8gb2JqZWN0IGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBjaGFuZ2VkCiAgICAgICAgICAgVGFySW5mbyBvYmplY3QsIGlmIGl0IHJldHVybnMgTm9uZSB0aGUgVGFySW5mbyBvYmplY3Qgd2lsbCBiZQogICAgICAgICAgIGV4Y2x1ZGVkIGZyb20gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soImF3IikKCiAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgogICAgICAgICAgICBhcmNuYW1lID0gbmFtZQoKICAgICAgICAjIEV4Y2x1ZGUgcGF0aG5hbWVzLgogICAgICAgIGlmIGV4Y2x1ZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIGZpbHRlciBhcmd1bWVudCBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCiAgICAgICAgICAgIGlmIGV4Y2x1ZGUobmFtZSk6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IEV4Y2x1ZGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTa2lwIGlmIHNvbWVib2R5IHRyaWVzIHRvIGFyY2hpdmUgdGhlIGFyY2hpdmUuLi4KICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguYWJzcGF0aChuYW1lKSA9PSBzZWxmLm5hbWU6CiAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogU2tpcHBlZCAlciIgJSBuYW1lKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fZGJnKDEsIG5hbWUpCgogICAgICAgICMgQ3JlYXRlIGEgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgZmlsZS4KICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXR0YXJpbmZvKG5hbWUsIGFyY25hbWUpCgogICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbnN1cHBvcnRlZCB0eXBlICVyIiAlIG5hbWUpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIENoYW5nZSBvciBleGNsdWRlIHRoZSBUYXJJbmZvIG9iamVjdC4KICAgICAgICBpZiBmaWx0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRhcmluZm8gPSBmaWx0ZXIodGFyaW5mbykKICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBFeGNsdWRlZCAlciIgJSBuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXBwZW5kIHRoZSB0YXIgaGVhZGVyIGFuZCBkYXRhIHRvIHRoZSBhcmNoaXZlLgogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgZiA9IGJsdG5fb3BlbihuYW1lLCAicmIiKQogICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbywgZikKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgogICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKICAgICAgICAgICAgaWYgcmVjdXJzaXZlOgogICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihuYW1lKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChvcy5wYXRoLmpvaW4obmFtZSwgZiksIG9zLnBhdGguam9pbihhcmNuYW1lLCBmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSwgZXhjbHVkZSwgZmlsdGVyPWZpbHRlcikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8pCgogICAgZGVmIGFkZGZpbGUoc2VsZiwgdGFyaW5mbywgZmlsZW9iaj1Ob25lKToKICAgICAgICAiIiJBZGQgdGhlIFRhckluZm8gb2JqZWN0IGB0YXJpbmZvJyB0byB0aGUgYXJjaGl2ZS4gSWYgYGZpbGVvYmonIGlzCiAgICAgICAgICAgZ2l2ZW4sIHRhcmluZm8uc2l6ZSBieXRlcyBhcmUgcmVhZCBmcm9tIGl0IGFuZCBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KICAgICAgICAgICBZb3UgY2FuIGNyZWF0ZSBUYXJJbmZvIG9iamVjdHMgdXNpbmcgZ2V0dGFyaW5mbygpLgogICAgICAgICAgIE9uIFdpbmRvd3MgcGxhdGZvcm1zLCBgZmlsZW9iaicgc2hvdWxkIGFsd2F5cyBiZSBvcGVuZWQgd2l0aCBtb2RlCiAgICAgICAgICAgJ3JiJyB0byBhdm9pZCBpcnJpdGF0aW9uIGFib3V0IHRoZSBmaWxlIHNpemUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soImF3IikKCiAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQoKICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYuZm9ybWF0LCBzZWxmLmVuY29kaW5nLCBzZWxmLmVycm9ycykKICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCgogICAgICAgICMgSWYgdGhlcmUncyBkYXRhIHRvIGZvbGxvdywgYXBwZW5kIGl0LgogICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvcHlmaWxlb2JqKGZpbGVvYmosIHNlbGYuZmlsZW9iaiwgdGFyaW5mby5zaXplKQogICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZCh0YXJpbmZvLnNpemUsIEJMT0NLU0laRSkKICAgICAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSkKICAgICAgICAgICAgICAgIGJsb2NrcyArPSAxCiAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGJsb2NrcyAqIEJMT0NLU0laRQoKICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCgogICAgZGVmIGV4dHJhY3RhbGwoc2VsZiwgcGF0aD0iLiIsIG1lbWJlcnM9Tm9uZSk6CiAgICAgICAgIiIiRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKICAgICAgICAgICBkaXJlY3RvcnkgYW5kIHNldCBvd25lciwgbW9kaWZpY2F0aW9uIHRpbWUgYW5kIHBlcm1pc3Npb25zIG9uCiAgICAgICAgICAgZGlyZWN0b3JpZXMgYWZ0ZXJ3YXJkcy4gYHBhdGgnIHNwZWNpZmllcyBhIGRpZmZlcmVudCBkaXJlY3RvcnkKICAgICAgICAgICB0byBleHRyYWN0IHRvLiBgbWVtYmVycycgaXMgb3B0aW9uYWwgYW5kIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlCiAgICAgICAgICAgbGlzdCByZXR1cm5lZCBieSBnZXRtZW1iZXJzKCkuCiAgICAgICAgIiIiCiAgICAgICAgZGlyZWN0b3JpZXMgPSBbXQoKICAgICAgICBpZiBtZW1iZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIG1lbWJlcnMgPSBzZWxmCgogICAgICAgIGZvciB0YXJpbmZvIGluIG1lbWJlcnM6CiAgICAgICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgICAgICMgRXh0cmFjdCBkaXJlY3RvcmllcyB3aXRoIGEgc2FmZSBtb2RlLgogICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCiAgICAgICAgICAgICAgICB0YXJpbmZvLm1vZGUgPSAwbzcwMAogICAgICAgICAgICAjIERvIG5vdCBzZXRfYXR0cnMgZGlyZWN0b3JpZXMsIGFzIHdlIHdpbGwgZG8gdGhhdCBmdXJ0aGVyIGRvd24KICAgICAgICAgICAgc2VsZi5leHRyYWN0KHRhcmluZm8sIHBhdGgsIHNldF9hdHRycz1ub3QgdGFyaW5mby5pc2RpcigpKQoKICAgICAgICAjIFJldmVyc2Ugc29ydCBkaXJlY3Rvcmllcy4KICAgICAgICBkaXJlY3Rvcmllcy5zb3J0KGtleT1sYW1iZGEgYTogYS5uYW1lKQogICAgICAgIGRpcmVjdG9yaWVzLnJldmVyc2UoKQoKICAgICAgICAjIFNldCBjb3JyZWN0IG93bmVyLCBtdGltZSBhbmQgZmlsZW1vZGUgb24gZGlyZWN0b3JpZXMuCiAgICAgICAgZm9yIHRhcmluZm8gaW4gZGlyZWN0b3JpZXM6CiAgICAgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNob3duKHRhcmluZm8sIGRpcnBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLnV0aW1lKHRhcmluZm8sIGRpcnBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmNobW9kKHRhcmluZm8sIGRpcnBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBFeHRyYWN0RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDE6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlKQoKICAgIGRlZiBleHRyYWN0KHNlbGYsIG1lbWJlciwgcGF0aD0iIiwgc2V0X2F0dHJzPVRydWUpOgogICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKICAgICAgICAgICB1c2luZyBpdHMgZnVsbCBuYW1lLiBJdHMgZmlsZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgYXMgYWNjdXJhdGVseQogICAgICAgICAgIGFzIHBvc3NpYmxlLiBgbWVtYmVyJyBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBZb3UgY2FuCiAgICAgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdXNpbmcgYHBhdGgnLiBGaWxlIGF0dHJpYnV0ZXMgKG93bmVyLAogICAgICAgICAgIG10aW1lLCBtb2RlKSBhcmUgc2V0IHVubGVzcyBgc2V0X2F0dHJzJyBpcyBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiciIpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBzdHIpOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhcmluZm8gPSBtZW1iZXIKCiAgICAgICAgIyBQcmVwYXJlIHRoZSBsaW5rIHRhcmdldCBmb3IgbWFrZWxpbmsoKS4KICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCk6CiAgICAgICAgICAgIHRhcmluZm8uX2xpbmtfdGFyZ2V0ID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubGlua25hbWUpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIodGFyaW5mbywgb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9hdHRycz1zZXRfYXR0cnMpCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMDoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBlLmZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlLnN0cmVycm9yKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzICVyIiAlIChlLnN0cmVycm9yLCBlLmZpbGVuYW1lKSkKICAgICAgICBleGNlcHQgRXh0cmFjdEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDE6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlKQoKICAgIGRlZiBleHRyYWN0ZmlsZShzZWxmLCBtZW1iZXIpOgogICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUgb2JqZWN0LiBgbWVtYmVyJyBtYXkgYmUKICAgICAgICAgICBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIElmIGBtZW1iZXInIGlzIGEgcmVndWxhciBmaWxlLCBhCiAgICAgICAgICAgZmlsZS1saWtlIG9iamVjdCBpcyByZXR1cm5lZC4gSWYgYG1lbWJlcicgaXMgYSBsaW5rLCBhIGZpbGUtbGlrZQogICAgICAgICAgIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsaW5rJ3MgdGFyZ2V0LiBJZiBgbWVtYmVyJyBpcyBub25lIG9mCiAgICAgICAgICAgdGhlIGFib3ZlLCBOb25lIGlzIHJldHVybmVkLgogICAgICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZwogICAgICAgICAgIG1ldGhvZHM6IHJlYWQoKSwgcmVhZGxpbmUoKSwgcmVhZGxpbmVzKCksIHNlZWsoKSBhbmQgdGVsbCgpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soInIiKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgc3RyKToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCgogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQoKICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAjIElmIGEgbWVtYmVyJ3MgdHlwZSBpcyB1bmtub3duLCBpdCBpcyB0cmVhdGVkIGFzIGEKICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUuCiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmlsZW9iaiwgX1N0cmVhbSk6CiAgICAgICAgICAgICAgICAjIEEgc21hbGwgYnV0IHVnbHkgd29ya2Fyb3VuZCBmb3IgdGhlIGNhc2UgdGhhdCBzb21lb25lIHRyaWVzCiAgICAgICAgICAgICAgICAjIHRvIGV4dHJhY3QgYSAoc3ltKWxpbmsgYXMgYSBmaWxlLW9iamVjdCBmcm9tIGEgbm9uLXNlZWthYmxlCiAgICAgICAgICAgICAgICAjIHN0cmVhbSBvZiB0YXIgYmxvY2tzLgogICAgICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IoImNhbm5vdCBleHRyYWN0IChzeW0pbGluayBhcyBmaWxlIG9iamVjdCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEEgKHN5bSlsaW5rJ3MgZmlsZSBvYmplY3QgaXMgaXRzIHRhcmdldCdzIGZpbGUgb2JqZWN0LgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdGZpbGUoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIElmIHRoZXJlJ3Mgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbWJlciAoZGlyZWN0b3J5LCBjaHJkZXYsCiAgICAgICAgICAgICMgYmxrZGV2LCBldGMuKSwgcmV0dXJuIE5vbmUgaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0LgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfZXh0cmFjdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCwgc2V0X2F0dHJzPVRydWUpOgogICAgICAgICIiIkV4dHJhY3QgdGhlIFRhckluZm8gb2JqZWN0IHRhcmluZm8gdG8gYSBwaHlzaWNhbAogICAgICAgICAgIGZpbGUgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyBGZXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZm9yIHRoZSBnaXZlbiBuYW1lCiAgICAgICAgIyBhbmQgYnVpbGQgdGhlIGRlc3RpbmF0aW9uIHBhdGhuYW1lLCByZXBsYWNpbmcKICAgICAgICAjIGZvcndhcmQgc2xhc2hlcyB0byBwbGF0Zm9ybSBzcGVjaWZpYyBzZXBhcmF0b3JzLgogICAgICAgIHRhcmdldHBhdGggPSB0YXJnZXRwYXRoLnJzdHJpcCgiLyIpCiAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKCiAgICAgICAgIyBDcmVhdGUgYWxsIHVwcGVyIGRpcmVjdG9yaWVzLgogICAgICAgIHVwcGVyZGlycyA9IG9zLnBhdGguZGlybmFtZSh0YXJnZXRwYXRoKQogICAgICAgIGlmIHVwcGVyZGlycyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVwcGVyZGlycyk6CiAgICAgICAgICAgICMgQ3JlYXRlIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBhcmNoaXZlIHdpdGgKICAgICAgICAgICAgIyBkZWZhdWx0IHBlcm1pc3Npb25zLgogICAgICAgICAgICBvcy5tYWtlZGlycyh1cHBlcmRpcnMpCgogICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCAiJXMgLT4gJXMiICUgKHRhcmluZm8ubmFtZSwgdGFyaW5mby5saW5rbmFtZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsIHRhcmluZm8ubmFtZSkKCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWRpcih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2ZpZm8oKToKICAgICAgICAgICAgc2VsZi5tYWtlZmlmbyh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2NocigpIG9yIHRhcmluZm8uaXNibGsoKToKICAgICAgICAgICAgc2VsZi5tYWtlZGV2KHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBzZWxmLm1ha2VsaW5rKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgc2VsZi5tYWtldW5rbm93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKCiAgICAgICAgaWYgc2V0X2F0dHJzOgogICAgICAgICAgICBzZWxmLmNob3duKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBzZWxmLmNobW9kKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLnV0aW1lKHRhcmluZm8sIHRhcmdldHBhdGgpCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEJlbG93IGFyZSB0aGUgZGlmZmVyZW50IGZpbGUgbWV0aG9kcy4gVGhleSBhcmUgY2FsbGVkIHZpYQogICAgIyBfZXh0cmFjdF9tZW1iZXIoKSB3aGVuIGV4dHJhY3QoKSBpcyBjYWxsZWQuIFRoZXkgY2FuIGJlIHJlcGxhY2VkIGluIGEKICAgICMgc3ViY2xhc3MgdG8gaW1wbGVtZW50IG90aGVyIGZ1bmN0aW9uYWxpdHkuCgogICAgZGVmIG1ha2VkaXIoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGRpcmVjdG9yeSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVXNlIGEgc2FmZSBtb2RlIGZvciB0aGUgZGlyZWN0b3J5LCB0aGUgcmVhbCBtb2RlIGlzIHNldAogICAgICAgICAgICAjIGxhdGVyIGluIF9leHRyYWN0X21lbWJlcigpLgogICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoLCAwbzcwMCkKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIG1ha2VmaWxlKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHNvdXJjZSA9IHNlbGYuZmlsZW9iagogICAgICAgIHNvdXJjZS5zZWVrKHRhcmluZm8ub2Zmc2V0X2RhdGEpCiAgICAgICAgdGFyZ2V0ID0gYmx0bl9vcGVuKHRhcmdldHBhdGgsICJ3YiIpCiAgICAgICAgaWYgdGFyaW5mby5zcGFyc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBvZmZzZXQsIHNpemUgaW4gdGFyaW5mby5zcGFyc2U6CiAgICAgICAgICAgICAgICB0YXJnZXQuc2VlayhvZmZzZXQpCiAgICAgICAgICAgICAgICBjb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCwgc2l6ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCwgdGFyaW5mby5zaXplKQogICAgICAgIHRhcmdldC5zZWVrKHRhcmluZm8uc2l6ZSkKICAgICAgICB0YXJnZXQudHJ1bmNhdGUoKQogICAgICAgIHRhcmdldC5jbG9zZSgpCgogICAgZGVmIG1ha2V1bmtub3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBmaWxlIGZyb20gYSBUYXJJbmZvIG9iamVjdCB3aXRoIGFuIHVua25vd24gdHlwZQogICAgICAgICAgIGF0IHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogVW5rbm93biBmaWxlIHR5cGUgJXIsICIgXAogICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGVkIGFzIHJlZ3VsYXIgZmlsZS4iICUgdGFyaW5mby50eXBlKQoKICAgIGRlZiBtYWtlZmlmbyhzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlmbyBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWtmaWZvIik6CiAgICAgICAgICAgIG9zLm1rZmlmbyh0YXJnZXRwYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiZmlmbyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCgogICAgZGVmIG1ha2VkZXYoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2UgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJta25vZCIpIG9yIG5vdCBoYXNhdHRyKG9zLCAibWFrZWRldiIpOgogICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoInNwZWNpYWwgZGV2aWNlcyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCgogICAgICAgIG1vZGUgPSB0YXJpbmZvLm1vZGUKICAgICAgICBpZiB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgIG1vZGUgfD0gc3RhdC5TX0lGQkxLCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kZSB8PSBzdGF0LlNfSUZDSFIKCiAgICAgICAgb3MubWtub2QodGFyZ2V0cGF0aCwgbW9kZSwKICAgICAgICAgICAgICAgICBvcy5tYWtlZGV2KHRhcmluZm8uZGV2bWFqb3IsIHRhcmluZm8uZGV2bWlub3IpKQoKICAgIGRlZiBtYWtlbGluayhzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgKHN5bWJvbGljKSBsaW5rIGNhbGxlZCB0YXJnZXRwYXRoLiBJZiBpdCBjYW5ub3QgYmUgY3JlYXRlZAogICAgICAgICAgKHBsYXRmb3JtIGxpbWl0YXRpb24pLCB3ZSB0cnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQogICAgICAgICAgaW5zdGVhZCBvZiBhIGxpbmsuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcy4KICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgb3Muc3ltbGluayh0YXJpbmZvLmxpbmtuYW1lLCB0YXJnZXRwYXRoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBTZWUgZXh0cmFjdCgpLgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyaW5mby5fbGlua190YXJnZXQpOgogICAgICAgICAgICAgICAgICAgIG9zLmxpbmsodGFyaW5mby5fbGlua190YXJnZXQsIHRhcmdldHBhdGgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cGF0aCkKICAgICAgICBleGNlcHQgc3ltbGlua19leGNlcHRpb246CiAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZSh0YXJpbmZvLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gdGFyaW5mby5saW5rbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRwYXRoKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoInVuYWJsZSB0byByZXNvbHZlIGxpbmsgaW5zaWRlIGFyY2hpdmUiKQoKICAgIGRlZiBjaG93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJTZXQgb3duZXIgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KICAgICAgICAiIiIKICAgICAgICBpZiBwd2QgYW5kIGhhc2F0dHIob3MsICJnZXRldWlkIikgYW5kIG9zLmdldGV1aWQoKSA9PSAwOgogICAgICAgICAgICAjIFdlIGhhdmUgdG8gYmUgcm9vdCB0byBkbyBzby4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZyA9IGdycC5nZXRncm5hbSh0YXJpbmZvLmduYW1lKVsyXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBnID0gdGFyaW5mby5naWQKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdSA9IHB3ZC5nZXRwd25hbSh0YXJpbmZvLnVuYW1lKVsyXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICB1ID0gdGFyaW5mby51aWQKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpIGFuZCBoYXNhdHRyKG9zLCAibGNob3duIik6CiAgICAgICAgICAgICAgICAgICAgb3MubGNob3duKHRhcmdldHBhdGgsIHUsIGcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAib3MyZW14IjoKICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBvd25lciIpCgogICAgZGVmIGNobW9kKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBmaWxlIHBlcm1pc3Npb25zIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldHBhdGgsIHRhcmluZm8ubW9kZSkKICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBtb2RlIikKCiAgICBkZWYgdXRpbWUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiU2V0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICd1dGltZScpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLnV0aW1lKHRhcmdldHBhdGgsICh0YXJpbmZvLm10aW1lLCB0YXJpbmZvLm10aW1lKSkKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiKQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IG1lbWJlciBvZiB0aGUgYXJjaGl2ZSBhcyBhIFRhckluZm8gb2JqZWN0LCB3aGVuCiAgICAgICAgICAgVGFyRmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFJldHVybiBOb25lIGlmIHRoZXJlIGlzIG5vIG1vcmUKICAgICAgICAgICBhdmFpbGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soInJhIikKICAgICAgICBpZiBzZWxmLmZpcnN0bWVtYmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtID0gc2VsZi5maXJzdG1lbWJlcgogICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICByZXR1cm4gbQoKICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCiAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQpCiAgICAgICAgdGFyaW5mbyA9IE5vbmUKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvLmZyb210YXJmaWxlKHNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQogICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMiICUgKHNlbGYub2Zmc2V0LCBlKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLm9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgIGV4Y2VwdCBFbXB0eUhlYWRlckVycm9yOgogICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImVtcHR5IGZpbGUiKQogICAgICAgICAgICBleGNlcHQgVHJ1bmNhdGVkSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKICAgICAgICAgICAgZXhjZXB0IFN1YnNlcXVlbnRIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgdGFyaW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgTGl0dGxlIGhlbHBlciBtZXRob2RzOgoKICAgIGRlZiBfZ2V0bWVtYmVyKHNlbGYsIG5hbWUsIHRhcmluZm89Tm9uZSwgbm9ybWFsaXplPUZhbHNlKToKICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgogICAgICAgICAgIElmIHRhcmluZm8gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAgICIiIgogICAgICAgICMgRW5zdXJlIHRoYXQgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIGxvYWRlZC4KICAgICAgICBtZW1iZXJzID0gc2VsZi5nZXRtZW1iZXJzKCkKCiAgICAgICAgIyBMaW1pdCB0aGUgbWVtYmVyIHNlYXJjaCBsaXN0IHVwIHRvIHRhcmluZm8uCiAgICAgICAgaWYgdGFyaW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgbWVtYmVycyA9IG1lbWJlcnNbOm1lbWJlcnMuaW5kZXgodGFyaW5mbyldCgogICAgICAgIGlmIG5vcm1hbGl6ZToKICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgobmFtZSkKCiAgICAgICAgZm9yIG1lbWJlciBpbiByZXZlcnNlZChtZW1iZXJzKToKICAgICAgICAgICAgaWYgbm9ybWFsaXplOgogICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG1lbWJlci5uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBtZW1iZXIubmFtZQoKICAgICAgICAgICAgaWYgbmFtZSA9PSBtZW1iZXJfbmFtZToKICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXIKCiAgICBkZWYgX2xvYWQoc2VsZik6CiAgICAgICAgIiIiUmVhZCB0aHJvdWdoIHRoZSBlbnRpcmUgYXJjaGl2ZSBmaWxlIGFuZCBsb29rIGZvciByZWFkYWJsZQogICAgICAgICAgIG1lbWJlcnMuCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCiAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgIGRlZiBfY2hlY2soc2VsZiwgbW9kZT1Ob25lKToKICAgICAgICAiIiJDaGVjayBpZiBUYXJGaWxlIGlzIHN0aWxsIG9wZW4sIGFuZCBpZiB0aGUgb3BlcmF0aW9uJ3MgbW9kZQogICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIFRhckZpbGUncyBtb2RlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCIlcyBpcyBjbG9zZWQiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCiAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5tb2RlIG5vdCBpbiBtb2RlOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJiYWQgb3BlcmF0aW9uIGZvciBtb2RlICVyIiAlIHNlbGYubW9kZSkKCiAgICBkZWYgX2ZpbmRfbGlua190YXJnZXQoc2VsZiwgdGFyaW5mbyk6CiAgICAgICAgIiIiRmluZCB0aGUgdGFyZ2V0IG1lbWJlciBvZiBhIHN5bWxpbmsgb3IgaGFyZGxpbmsgbWVtYmVyIGluIHRoZQogICAgICAgICAgIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAjIEFsd2F5cyBzZWFyY2ggdGhlIGVudGlyZSBhcmNoaXZlLgogICAgICAgICAgICBsaW5rbmFtZSA9IG9zLnBhdGguZGlybmFtZSh0YXJpbmZvLm5hbWUpICsgIi8iICsgdGFyaW5mby5saW5rbmFtZQogICAgICAgICAgICBsaW1pdCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFNlYXJjaCB0aGUgYXJjaGl2ZSBiZWZvcmUgdGhlIGxpbmssIGJlY2F1c2UgYSBoYXJkIGxpbmsgaXMKICAgICAgICAgICAgIyBqdXN0IGEgcmVmZXJlbmNlIHRvIGFuIGFscmVhZHkgYXJjaGl2ZWQgZmlsZS4KICAgICAgICAgICAgbGlua25hbWUgPSB0YXJpbmZvLmxpbmtuYW1lCiAgICAgICAgICAgIGxpbWl0ID0gdGFyaW5mbwoKICAgICAgICBtZW1iZXIgPSBzZWxmLl9nZXRtZW1iZXIobGlua25hbWUsIHRhcmluZm89bGltaXQsIG5vcm1hbGl6ZT1UcnVlKQogICAgICAgIGlmIG1lbWJlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigibGlua25hbWUgJXIgbm90IGZvdW5kIiAlIGxpbmtuYW1lKQogICAgICAgIHJldHVybiBtZW1iZXIKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fbG9hZGVkOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRhckl0ZXIoc2VsZikKCiAgICBkZWYgX2RiZyhzZWxmLCBsZXZlbCwgbXNnKToKICAgICAgICAiIiJXcml0ZSBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICBzZWxmLl9jaGVjaygpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgaWYgdHlwZSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZC4gV2UgbXVzdCBub3QgY2FsbCBjbG9zZSgpIGJlY2F1c2UKICAgICAgICAgICAgIyBpdCB3b3VsZCB0cnkgdG8gd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzIGFuZCBwYWRkaW5nLgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQojIGNsYXNzIFRhckZpbGUKCmNsYXNzIFRhckl0ZXIob2JqZWN0KToKICAgICIiIkl0ZXJhdG9yIENsYXNzLgoKICAgICAgIGZvciB0YXJpbmZvIGluIFRhckZpbGUoLi4uKToKICAgICAgICAgICBzdWl0ZS4uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKICAgICAgICBzZWxmLmluZGV4ID0gMAogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIlJldHVybiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19uZXh0X18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IGl0ZW0gdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCiAgICAgICAgICAgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KICAgICAgICAiIiIKICAgICAgICAjIEZpeCBmb3IgU0YgIzExMDA0Mjk6IFVuZGVyIHJhcmUgY2lyY3Vtc3RhbmNlcyBpdCBjYW4KICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKICAgICAgICAjIHdoaWNoIHdpbGwgY2F1c2UgVGFySXRlciB0byBzdG9wIHByZW1hdHVyZWx5LgogICAgICAgIGlmIG5vdCBzZWxmLnRhcmZpbGUuX2xvYWRlZDoKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKICAgICAgICAgICAgaWYgbm90IHRhcmluZm86CiAgICAgICAgICAgICAgICBzZWxmLnRhcmZpbGUuX2xvYWRlZCA9IFRydWUKICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm1lbWJlcnNbc2VsZi5pbmRleF0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgc2VsZi5pbmRleCArPSAxCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBuZXh0ID0gX19uZXh0X18gIyBmb3IgUHl0aG9uIDIueAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgZXhwb3J0ZWQgZnVuY3Rpb25zCiMtLS0tLS0tLS0tLS0tLS0tLS0tLQpkZWYgaXNfdGFyZmlsZShuYW1lKToKICAgICIiIlJldHVybiBUcnVlIGlmIG5hbWUgcG9pbnRzIHRvIGEgdGFyIGFyY2hpdmUgdGhhdCB3ZQogICAgICAgYXJlIGFibGUgdG8gaGFuZGxlLCBlbHNlIHJldHVybiBGYWxzZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHQgPSBvcGVuKG5hbWUpCiAgICAgICAgdC5jbG9zZSgpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBUYXJFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKCmJsdG5fb3BlbiA9IG9wZW4Kb3BlbiA9IFRhckZpbGUub3BlbgpQSwMEFAAAAAAAAAAhAF8Jc2BhnwAAYZ8AAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9jb21wYXQucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCmlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGZyb20gdHlwZXMgaW1wb3J0IEZpbGVUeXBlIGFzIGZpbGVfdHlwZQogICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCiAgICBpbXBvcnQgQ29uZmlnUGFyc2VyIGFzIGNvbmZpZ3BhcnNlcgogICAgZnJvbSAuX2JhY2twb3J0IGltcG9ydCBzaHV0aWwKICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCB1cmxzcGxpdCwgdXJsdW5zcGxpdAogICAgZnJvbSB1cmxsaWIgaW1wb3J0ICh1cmxyZXRyaWV2ZSwgcXVvdGUgYXMgX3F1b3RlLCB1bnF1b3RlLCB1cmwycGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybCwgQ29udGVudFRvb1Nob3J0RXJyb3IsIHNwbGl0dHlwZSkKCiAgICBkZWYgcXVvdGUocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKICAgICAgICAgICAgcyA9IHMuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIF9xdW90ZShzKQoKICAgIGltcG9ydCB1cmxsaWIyCiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IChSZXF1ZXN0LCB1cmxvcGVuLCBVUkxFcnJvciwgSFRUUEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2ljQXV0aEhhbmRsZXIsIEhUVFBQYXNzd29yZE1nciwKICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3BlbmVyKQogICAgaWYgc3NsOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgSFRUUFNIYW5kbGVyCiAgICBpbXBvcnQgaHR0cGxpYgogICAgaW1wb3J0IHhtbHJwY2xpYgogICAgaW1wb3J0IFF1ZXVlIGFzIHF1ZXVlCiAgICBmcm9tIEhUTUxQYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKICAgIGltcG9ydCBodG1sZW50aXR5ZGVmcwogICAgcmF3X2lucHV0ID0gcmF3X2lucHV0CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaWZpbHRlciBhcyBmaWx0ZXIKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyZmFsc2UgYXMgZmlsdGVyZmFsc2UKCiAgICBfdXNlcnByb2cgPSBOb25lCiAgICBkZWYgc3BsaXR1c2VyKGhvc3QpOgogICAgICAgICIiInNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScuIiIiCiAgICAgICAgZ2xvYmFsIF91c2VycHJvZwogICAgICAgIGlmIF91c2VycHJvZyBpcyBOb25lOgogICAgICAgICAgICBpbXBvcnQgcmUKICAgICAgICAgICAgX3VzZXJwcm9nID0gcmUuY29tcGlsZSgnXiguKilAKC4qKSQnKQoKICAgICAgICBtYXRjaCA9IF91c2VycHJvZy5tYXRjaChob3N0KQogICAgICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKICAgICAgICByZXR1cm4gTm9uZSwgaG9zdAoKZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgZnJvbSBpbyBpbXBvcnQgVGV4dElPV3JhcHBlciBhcyBmaWxlX3R5cGUKICAgIGltcG9ydCBidWlsdGlucwogICAgaW1wb3J0IGNvbmZpZ3BhcnNlcgogICAgaW1wb3J0IHNodXRpbAogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0ICh1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgc3BsaXR1c2VyLCBxdW90ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5xdW90ZSwgdXJsc3BsaXQsIHVybHVuc3BsaXQsIHNwbGl0dHlwZSkKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0ICh1cmxvcGVuLCB1cmxyZXRyaWV2ZSwgUmVxdWVzdCwgdXJsMnBhdGhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzaWNBdXRoSGFuZGxlciwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wZW5lcikKICAgIGlmIHNzbDoKICAgICAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCBIVFRQU0hhbmRsZXIKICAgIGZyb20gdXJsbGliLmVycm9yIGltcG9ydCBIVFRQRXJyb3IsIFVSTEVycm9yLCBDb250ZW50VG9vU2hvcnRFcnJvcgogICAgaW1wb3J0IGh0dHAuY2xpZW50IGFzIGh0dHBsaWIKICAgIGltcG9ydCB1cmxsaWIucmVxdWVzdCBhcyB1cmxsaWIyCiAgICBpbXBvcnQgeG1scnBjLmNsaWVudCBhcyB4bWxycGNsaWIKICAgIGltcG9ydCBxdWV1ZQogICAgZnJvbSBodG1sLnBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgogICAgaW1wb3J0IGh0bWwuZW50aXRpZXMgYXMgaHRtbGVudGl0eWRlZnMKICAgIHJhd19pbnB1dCA9IGlucHV0CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgZmlsdGVyZmFsc2UKICAgIGZpbHRlciA9IGZpbHRlcgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBDZXJ0aWZpY2F0ZUVycm9yCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCgogICAgZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjEyNSNzZWN0aW9uLTYuNC4zCiAgICAgICAgIiIiCiAgICAgICAgcGF0cyA9IFtdCiAgICAgICAgaWYgbm90IGRuOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcGFydHMgPSBkbi5zcGxpdCgnLicpCiAgICAgICAgbGVmdG1vc3QsIHJlbWFpbmRlciA9IHBhcnRzWzBdLCBwYXJ0c1sxOl0KCiAgICAgICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgICAgIGlmIHdpbGRjYXJkcyA+IG1heF93aWxkY2FyZHM6CiAgICAgICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgICAgICMgcG9saWN5IGFtb25nIFNTTCBpbXBsZW1lbnRhdGlvbnMgc2hvd2VkIGl0IHRvIGJlIGEKICAgICAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgICAgICJ0b28gbWFueSB3aWxkY2FyZHMgaW4gY2VydGlmaWNhdGUgRE5TIG5hbWU6ICIgKyByZXByKGRuKSkKCiAgICAgICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICAgICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICAgICAgcmV0dXJuIGRuLmxvd2VyKCkgPT0gaG9zdG5hbWUubG93ZXIoKQoKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAgICAgIyB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGNvbXByaXNlcyBhIGxhYmVsIG90aGVyIHRoYW4gdGhlIGxlZnQtbW9zdCBsYWJlbC4KICAgICAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICAgICAjIGZyYWdtZW50LgogICAgICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAzLgogICAgICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgICAgICMgVS1sYWJlbCBvZiBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZS4KICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSwgJyonIG1hdGNoZXMgYW55IGRvdGxlc3Mgc3RyaW5nLCBlLmcuIHd3dyoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAgICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICAgICAgZm9yIGZyYWcgaW4gcmVtYWluZGVyOgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICAgICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSwgbWF0Y2hfaG9zdG5hbWUgbmVlZHMgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBzb2NrZXQgb3IgU1NMIGNvbnRleHQgd2l0aCBlaXRoZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRVJUX09QVElPTkFMIG9yIENFUlRfUkVRVUlSRUQiKQogICAgICAgIGRuc25hbWVzID0gW10KICAgICAgICBzYW4gPSBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSkKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAgICAgIyBpbiBzdWJqZWN0QWx0TmFtZQogICAgICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgICAgICMgWFhYIGFjY29yZGluZyB0byBSRkMgMjgxOCwgdGhlIG1vc3Qgc3BlY2lmaWMgQ29tbW9uIE5hbWUKICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBsZW4oZG5zbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsICcsICcuam9pbihtYXAocmVwciwgZG5zbmFtZXMpKSkpCiAgICAgICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoICVyIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJubyBhcHByb3ByaWF0ZSBjb21tb25OYW1lIG9yICIKICAgICAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpCgoKdHJ5OgogICAgZnJvbSB0eXBlcyBpbXBvcnQgU2ltcGxlTmFtZXNwYWNlIGFzIENvbnRhaW5lcgpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIENvbnRhaW5lcihvYmplY3QpOgogICAgICAgICIiIgogICAgICAgIEEgZ2VuZXJpYyBjb250YWluZXIgZm9yIHdoZW4gbXVsdGlwbGUgdmFsdWVzIG5lZWQgdG8gYmUgcmV0dXJuZWQKICAgICAgICAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShrd2FyZ3MpCgoKdHJ5OgogICAgZnJvbSBzaHV0aWwgaW1wb3J0IHdoaWNoCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgIyBJbXBsZW1lbnRhdGlvbiBmcm9tIFB5dGhvbiAzLjMKICAgIGRlZiB3aGljaChjbWQsIG1vZGU9b3MuRl9PSyB8IG9zLlhfT0ssIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiR2l2ZW4gYSBjb21tYW5kLCBtb2RlLCBhbmQgYSBQQVRIIHN0cmluZywgcmV0dXJuIHRoZSBwYXRoIHdoaWNoCiAgICAgICAgY29uZm9ybXMgdG8gdGhlIGdpdmVuIG1vZGUgb24gdGhlIFBBVEgsIG9yIE5vbmUgaWYgdGhlcmUgaXMgbm8gc3VjaAogICAgICAgIGZpbGUuCgogICAgICAgIGBtb2RlYCBkZWZhdWx0cyB0byBvcy5GX09LIHwgb3MuWF9PSy4gYHBhdGhgIGRlZmF1bHRzIHRvIHRoZSByZXN1bHQKICAgICAgICBvZiBvcy5lbnZpcm9uLmdldCgiUEFUSCIpLCBvciBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY3VzdG9tIHNlYXJjaAogICAgICAgIHBhdGguCgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgdGhhdCBhIGdpdmVuIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIGNvcnJlY3QgbW9kZS4KICAgICAgICAjIEFkZGl0aW9uYWxseSBjaGVjayB0aGF0IGBmaWxlYCBpcyBub3QgYSBkaXJlY3RvcnksIGFzIG9uIFdpbmRvd3MKICAgICAgICAjIGRpcmVjdG9yaWVzIHBhc3MgdGhlIG9zLmFjY2VzcyBjaGVjay4KICAgICAgICBkZWYgX2FjY2Vzc19jaGVjayhmbiwgbW9kZSk6CiAgICAgICAgICAgIHJldHVybiAob3MucGF0aC5leGlzdHMoZm4pIGFuZCBvcy5hY2Nlc3MoZm4sIG1vZGUpCiAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGZuKSkKCiAgICAgICAgIyBJZiB3ZSdyZSBnaXZlbiBhIHBhdGggd2l0aCBhIGRpcmVjdG9yeSBwYXJ0LCBsb29rIGl0IHVwIGRpcmVjdGx5IHJhdGhlcgogICAgICAgICMgdGhhbiByZWZlcnJpbmcgdG8gUEFUSCBkaXJlY3Rvcmllcy4gVGhpcyBpbmNsdWRlcyBjaGVja2luZyByZWxhdGl2ZSB0byB0aGUKICAgICAgICAjIGN1cnJlbnQgZGlyZWN0b3J5LCBlLmcuIC4vc2NyaXB0CiAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGNtZCk6CiAgICAgICAgICAgIGlmIF9hY2Nlc3NfY2hlY2soY21kLCBtb2RlKToKICAgICAgICAgICAgICAgIHJldHVybiBjbWQKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gb3MuZW52aXJvbi5nZXQoIlBBVEgiLCBvcy5kZWZwYXRoKQogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KG9zLnBhdGhzZXApCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgICAgICAjIFRoZSBjdXJyZW50IGRpcmVjdG9yeSB0YWtlcyBwcmVjZWRlbmNlIG9uIFdpbmRvd3MuCiAgICAgICAgICAgIGlmIG5vdCBvcy5jdXJkaXIgaW4gcGF0aDoKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKCiAgICAgICAgICAgICMgUEFUSEVYVCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgb24gV2luZG93cy4KICAgICAgICAgICAgcGF0aGV4dCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIRVhUIiwgIiIpLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgICAgICMgU2VlIGlmIHRoZSBnaXZlbiBmaWxlIG1hdGNoZXMgYW55IG9mIHRoZSBleHBlY3RlZCBwYXRoIGV4dGVuc2lvbnMuCiAgICAgICAgICAgICMgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNob3J0IGNpcmN1aXQgd2hlbiBnaXZlbiAicHl0aG9uLmV4ZSIuCiAgICAgICAgICAgICMgSWYgaXQgZG9lcyBtYXRjaCwgb25seSB0ZXN0IHRoYXQgb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byB0cnkKICAgICAgICAgICAgIyBvdGhlcnMuCiAgICAgICAgICAgIGlmIGFueShjbWQubG93ZXIoKS5lbmRzd2l0aChleHQubG93ZXIoKSkgZm9yIGV4dCBpbiBwYXRoZXh0KToKICAgICAgICAgICAgICAgIGZpbGVzID0gW2NtZF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVzID0gW2NtZCArIGV4dCBmb3IgZXh0IGluIHBhdGhleHRdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPbiBvdGhlciBwbGF0Zm9ybXMgeW91IGRvbid0IGhhdmUgdGhpbmdzIGxpa2UgUEFUSEVYVCB0byB0ZWxsIHlvdQogICAgICAgICAgICAjIHdoYXQgZmlsZSBzdWZmaXhlcyBhcmUgZXhlY3V0YWJsZSwgc28ganVzdCBwYXNzIG9uIGNtZCBhcy1pcy4KICAgICAgICAgICAgZmlsZXMgPSBbY21kXQoKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgZGlyIGluIHBhdGg6CiAgICAgICAgICAgIG5vcm1kaXIgPSBvcy5wYXRoLm5vcm1jYXNlKGRpcikKICAgICAgICAgICAgaWYgbm90IG5vcm1kaXIgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKG5vcm1kaXIpCiAgICAgICAgICAgICAgICBmb3IgdGhlZmlsZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGRpciwgdGhlZmlsZSkKICAgICAgICAgICAgICAgICAgICBpZiBfYWNjZXNzX2NoZWNrKG5hbWUsIG1vZGUpOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZQogICAgICAgIHJldHVybiBOb25lCgoKIyBaaXBGaWxlIGlzIGEgY29udGV4dCBtYW5hZ2VyIGluIDIuNywgYnV0IG5vdCBpbiAyLjYKCmZyb20gemlwZmlsZSBpbXBvcnQgWmlwRmlsZSBhcyBCYXNlWmlwRmlsZQoKaWYgaGFzYXR0cihCYXNlWmlwRmlsZSwgJ19fZW50ZXJfXycpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBaaXBGaWxlID0gQmFzZVppcEZpbGUKZWxzZToKICAgIGZyb20gemlwZmlsZSBpbXBvcnQgWmlwRXh0RmlsZSBhcyBCYXNlWmlwRXh0RmlsZQoKICAgIGNsYXNzIFppcEV4dEZpbGUoQmFzZVppcEV4dEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlKToKICAgICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoYmFzZS5fX2RpY3RfXykKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAjIHJldHVybiBOb25lLCBzbyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQsIGl0IHdpbGwgcHJvcGFnYXRlCgogICAgY2xhc3MgWmlwRmlsZShCYXNlWmlwRmlsZSk6CiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAjIHJldHVybiBOb25lLCBzbyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQsIGl0IHdpbGwgcHJvcGFnYXRlCgogICAgICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGJhc2UgPSBCYXNlWmlwRmlsZS5vcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIFppcEV4dEZpbGUoYmFzZSkKCnRyeToKICAgIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl9pbXBsZW1lbnRhdGlvbgpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZGVmIHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpOgogICAgICAgICIiIlJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLiIiIgogICAgICAgIGlmICdQeVB5JyBpbiBzeXMudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuICdQeVB5JwogICAgICAgIGlmIG9zLm5hbWUgPT0gJ2phdmEnOgogICAgICAgICAgICByZXR1cm4gJ0p5dGhvbicKICAgICAgICBpZiBzeXMudmVyc2lvbi5zdGFydHN3aXRoKCdJcm9uUHl0aG9uJyk6CiAgICAgICAgICAgIHJldHVybiAnSXJvblB5dGhvbicKICAgICAgICByZXR1cm4gJ0NQeXRob24nCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIC5fYmFja3BvcnQgaW1wb3J0IHN5c2NvbmZpZwoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2FsbGFibGUKCiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIENhbGxhYmxlKQoKCnRyeToKICAgIGZzZW5jb2RlID0gb3MuZnNlbmNvZGUKICAgIGZzZGVjb2RlID0gb3MuZnNkZWNvZGUKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBfZnNlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQogICAgaWYgX2ZzZW5jb2RpbmcgPT0gJ21iY3MnOgogICAgICAgIF9mc2Vycm9ycyA9ICdzdHJpY3QnCiAgICBlbHNlOgogICAgICAgIF9mc2Vycm9ycyA9ICdzdXJyb2dhdGVlc2NhcGUnCgogICAgZGVmIGZzZW5jb2RlKGZpbGVuYW1lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShfZnNlbmNvZGluZywgX2ZzZXJyb3JzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKCiAgICBkZWYgZnNkZWNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZGVjb2RlKF9mc2VuY29kaW5nLCBfZnNlcnJvcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQoKdHJ5OgogICAgZnJvbSB0b2tlbml6ZSBpbXBvcnQgZGV0ZWN0X2VuY29kaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvZGVjcyBpbXBvcnQgQk9NX1VURjgsIGxvb2t1cAogICAgaW1wb3J0IHJlCgogICAgY29va2llX3JlID0gcmUuY29tcGlsZSgiY29kaW5nWzo9XVxzKihbLVx3Ll0rKSIpCgogICAgZGVmIF9nZXRfbm9ybWFsX25hbWUob3JpZ19lbmMpOgogICAgICAgICIiIkltaXRhdGVzIGdldF9ub3JtYWxfbmFtZSBpbiB0b2tlbml6ZXIuYy4iIiIKICAgICAgICAjIE9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgMTIgY2hhcmFjdGVycy4KICAgICAgICBlbmMgPSBvcmlnX2VuY1s6MTJdLmxvd2VyKCkucmVwbGFjZSgiXyIsICItIikKICAgICAgICBpZiBlbmMgPT0gInV0Zi04IiBvciBlbmMuc3RhcnRzd2l0aCgidXRmLTgtIik6CiAgICAgICAgICAgIHJldHVybiAidXRmLTgiCiAgICAgICAgaWYgZW5jIGluICgibGF0aW4tMSIsICJpc28tODg1OS0xIiwgImlzby1sYXRpbi0xIikgb3IgXAogICAgICAgICAgIGVuYy5zdGFydHN3aXRoKCgibGF0aW4tMS0iLCAiaXNvLTg4NTktMS0iLCAiaXNvLWxhdGluLTEtIikpOgogICAgICAgICAgICByZXR1cm4gImlzby04ODU5LTEiCiAgICAgICAgcmV0dXJuIG9yaWdfZW5jCgogICAgZGVmIGRldGVjdF9lbmNvZGluZyhyZWFkbGluZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIGRldGVjdF9lbmNvZGluZygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBlbmNvZGluZyB0aGF0IHNob3VsZAogICAgICAgIGJlIHVzZWQgdG8gZGVjb2RlIGEgUHl0aG9uIHNvdXJjZSBmaWxlLiAgSXQgcmVxdWlyZXMgb25lIGFyZ3VtZW50LCByZWFkbGluZSwKICAgICAgICBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHRva2VuaXplKCkgZ2VuZXJhdG9yLgoKICAgICAgICBJdCB3aWxsIGNhbGwgcmVhZGxpbmUgYSBtYXhpbXVtIG9mIHR3aWNlLCBhbmQgcmV0dXJuIHRoZSBlbmNvZGluZyB1c2VkCiAgICAgICAgKGFzIGEgc3RyaW5nKSBhbmQgYSBsaXN0IG9mIGFueSBsaW5lcyAobGVmdCBhcyBieXRlcykgaXQgaGFzIHJlYWQgaW4uCgogICAgICAgIEl0IGRldGVjdHMgdGhlIGVuY29kaW5nIGZyb20gdGhlIHByZXNlbmNlIG9mIGEgdXRmLTggYm9tIG9yIGFuIGVuY29kaW5nCiAgICAgICAgY29va2llIGFzIHNwZWNpZmllZCBpbiBwZXAtMDI2My4gIElmIGJvdGggYSBib20gYW5kIGEgY29va2llIGFyZSBwcmVzZW50LAogICAgICAgIGJ1dCBkaXNhZ3JlZSwgYSBTeW50YXhFcnJvciB3aWxsIGJlIHJhaXNlZC4gIElmIHRoZSBlbmNvZGluZyBjb29raWUgaXMgYW4KICAgICAgICBpbnZhbGlkIGNoYXJzZXQsIHJhaXNlIGEgU3ludGF4RXJyb3IuICBOb3RlIHRoYXQgaWYgYSB1dGYtOCBib20gaXMgZm91bmQsCiAgICAgICAgJ3V0Zi04LXNpZycgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCBvZiAndXRmLTgnIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlbmFtZSA9IHJlYWRsaW5lLl9fc2VsZl9fLm5hbWUKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQogICAgICAgIGJvbV9mb3VuZCA9IEZhbHNlCiAgICAgICAgZW5jb2RpbmcgPSBOb25lCiAgICAgICAgZGVmYXVsdCA9ICd1dGYtOCcKICAgICAgICBkZWYgcmVhZF9vcl9zdG9wKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiByZWFkbGluZSgpCiAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwoKICAgICAgICBkZWYgZmluZF9jb29raWUobGluZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgRGVjb2RlIGFzIFVURi04LiBFaXRoZXIgdGhlIGxpbmUgaXMgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgICAjIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIGJlIHB1cmUgQVNDSUksIG9yIGl0IG11c3QgYmUgVVRGLTgKICAgICAgICAgICAgICAgICMgcGVyIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICBsaW5lX3N0cmluZyA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICBtc2cgPSAiaW52YWxpZCBvciBtaXNzaW5nIGVuY29kaW5nIGRlY2xhcmF0aW9uIgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJ3t9IGZvciB7IXJ9Jy5mb3JtYXQobXNnLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKG1zZykKCiAgICAgICAgICAgIG1hdGNoZXMgPSBjb29raWVfcmUuZmluZGFsbChsaW5lX3N0cmluZykKICAgICAgICAgICAgaWYgbm90IG1hdGNoZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbmNvZGluZyA9IF9nZXRfbm9ybWFsX25hbWUobWF0Y2hlc1swXSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXAoZW5jb2RpbmcpCiAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKICAgICAgICAgICAgICAgICMgVGhpcyBiZWhhdmlvdXIgbWltaWNzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gInVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBlbmNvZGluZyBmb3IgeyFyfToge30iLmZvcm1hdChmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQoKICAgICAgICAgICAgaWYgYm9tX2ZvdW5kOgogICAgICAgICAgICAgICAgaWYgY29kZWMubmFtZSAhPSAndXRmLTgnOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBiZWhhdmlvdXIgbWltaWNzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAnZW5jb2RpbmcgcHJvYmxlbTogdXRmLTgnCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gJ2VuY29kaW5nIHByb2JsZW0gZm9yIHshcn06IHV0Zi04Jy5mb3JtYXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQogICAgICAgICAgICAgICAgZW5jb2RpbmcgKz0gJy1zaWcnCiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZwoKICAgICAgICBmaXJzdCA9IHJlYWRfb3Jfc3RvcCgpCiAgICAgICAgaWYgZmlyc3Quc3RhcnRzd2l0aChCT01fVVRGOCk6CiAgICAgICAgICAgIGJvbV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgZmlyc3QgPSBmaXJzdFszOl0KICAgICAgICAgICAgZGVmYXVsdCA9ICd1dGYtOC1zaWcnCiAgICAgICAgaWYgbm90IGZpcnN0OgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdCwgW10KCiAgICAgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShmaXJzdCkKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3RdCgogICAgICAgIHNlY29uZCA9IHJlYWRfb3Jfc3RvcCgpCiAgICAgICAgaWYgbm90IHNlY29uZDoKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQsIFtmaXJzdF0KCiAgICAgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShzZWNvbmQpCiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0LCBzZWNvbmRdCgogICAgICAgIHJldHVybiBkZWZhdWx0LCBbZmlyc3QsIHNlY29uZF0KCiMgRm9yIGNvbnZlcnRpbmcgJiA8LT4gJmFtcDsgZXRjLgp0cnk6CiAgICBmcm9tIGh0bWwgaW1wb3J0IGVzY2FwZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGNnaSBpbXBvcnQgZXNjYXBlCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDQpOgogICAgdW5lc2NhcGUgPSBIVE1MUGFyc2VyKCkudW5lc2NhcGUKZWxzZToKICAgIGZyb20gaHRtbCBpbXBvcnQgdW5lc2NhcGUKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENoYWluTWFwCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZwoKICAgIHRyeToKICAgICAgICBmcm9tIHJlcHJsaWIgaW1wb3J0IHJlY3Vyc2l2ZV9yZXByIGFzIF9yZWN1cnNpdmVfcmVwcgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGRlZiBfcmVjdXJzaXZlX3JlcHIoZmlsbHZhbHVlPScuLi4nKToKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIERlY29yYXRvciB0byBtYWtlIGEgcmVwciBmdW5jdGlvbiByZXR1cm4gZmlsbHZhbHVlIGZvciBhIHJlY3Vyc2l2ZQogICAgICAgICAgICBjYWxsCiAgICAgICAgICAgICcnJwoKICAgICAgICAgICAgZGVmIGRlY29yYXRpbmdfZnVuY3Rpb24odXNlcl9mdW5jdGlvbik6CiAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcgPSBzZXQoKQoKICAgICAgICAgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGtleSA9IGlkKHNlbGYpLCBnZXRfaWRlbnQoKQogICAgICAgICAgICAgICAgICAgIGlmIGtleSBpbiByZXByX3J1bm5pbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxsdmFsdWUKICAgICAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcuYWRkKGtleSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfZnVuY3Rpb24oc2VsZikKICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcuZGlzY2FyZChrZXkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICAgICAgICAgICMgQ2FuJ3QgdXNlIGZ1bmN0b29scy53cmFwcygpIGhlcmUgYmVjYXVzZSBvZiBib290c3RyYXAgaXNzdWVzCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fbW9kdWxlX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX21vZHVsZV9fJykKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19kb2NfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fZG9jX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX25hbWVfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fbmFtZV9fJykKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19hbm5vdGF0aW9uc19fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19hbm5vdGF0aW9uc19fJywge30pCiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlcgoKICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRpbmdfZnVuY3Rpb24KCiAgICBjbGFzcyBDaGFpbk1hcChNdXRhYmxlTWFwcGluZyk6CiAgICAgICAgJycnIEEgQ2hhaW5NYXAgZ3JvdXBzIG11bHRpcGxlIGRpY3RzIChvciBvdGhlciBtYXBwaW5ncykgdG9nZXRoZXIKICAgICAgICB0byBjcmVhdGUgYSBzaW5nbGUsIHVwZGF0ZWFibGUgdmlldy4KCiAgICAgICAgVGhlIHVuZGVybHlpbmcgbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiBhIGxpc3QuICBUaGF0IGxpc3QgaXMgcHVibGljIGFuZCBjYW4KICAgICAgICBhY2Nlc3NlZCBvciB1cGRhdGVkIHVzaW5nIHRoZSAqbWFwcyogYXR0cmlidXRlLiAgVGhlcmUgaXMgbm8gb3RoZXIgc3RhdGUuCgogICAgICAgIExvb2t1cHMgc2VhcmNoIHRoZSB1bmRlcmx5aW5nIG1hcHBpbmdzIHN1Y2Nlc3NpdmVseSB1bnRpbCBhIGtleSBpcyBmb3VuZC4KICAgICAgICBJbiBjb250cmFzdCwgd3JpdGVzLCB1cGRhdGVzLCBhbmQgZGVsZXRpb25zIG9ubHkgb3BlcmF0ZSBvbiB0aGUgZmlyc3QKICAgICAgICBtYXBwaW5nLgoKICAgICAgICAnJycKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICptYXBzKToKICAgICAgICAgICAgJycnSW5pdGlhbGl6ZSBhIENoYWluTWFwIGJ5IHNldHRpbmcgKm1hcHMqIHRvIHRoZSBnaXZlbiBtYXBwaW5ncy4KICAgICAgICAgICAgSWYgbm8gbWFwcGluZ3MgYXJlIHByb3ZpZGVkLCBhIHNpbmdsZSBlbXB0eSBkaWN0aW9uYXJ5IGlzIHVzZWQuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgc2VsZi5tYXBzID0gbGlzdChtYXBzKSBvciBbe31dICAgICAgICAgICMgYWx3YXlzIGF0IGxlYXN0IG9uZSBtYXAKCiAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIGZvciBtYXBwaW5nIGluIHNlbGYubWFwczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZ1trZXldICAgICAgICAgICAgICMgY2FuJ3QgdXNlICdrZXkgaW4gbWFwcGluZycgd2l0aCBkZWZhdWx0ZGljdAogICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19taXNzaW5nX18oa2V5KSAgICAgICAgICAgICMgc3VwcG9ydCBzdWJjbGFzc2VzIHRoYXQgZGVmaW5lIF9fbWlzc2luZ19fCgogICAgICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldIGlmIGtleSBpbiBzZWxmIGVsc2UgZGVmYXVsdAoKICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxlbihzZXQoKS51bmlvbigqc2VsZi5tYXBzKSkgICAgICMgcmV1c2VzIHN0b3JlZCBoYXNoIHZhbHVlcyBpZiBwb3NzaWJsZQoKICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNldCgpLnVuaW9uKCpzZWxmLm1hcHMpKQoKICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHJldHVybiBhbnkoa2V5IGluIG0gZm9yIG0gaW4gc2VsZi5tYXBzKQoKICAgICAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBhbnkoc2VsZi5tYXBzKQoKICAgICAgICBAX3JlY3Vyc2l2ZV9yZXByKCkKICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiAnezAuX19jbGFzc19fLl9fbmFtZV9ffSh7MX0pJy5mb3JtYXQoCiAgICAgICAgICAgICAgICBzZWxmLCAnLCAnLmpvaW4obWFwKHJlcHIsIHNlbGYubWFwcykpKQoKICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgKmFyZ3MpOgogICAgICAgICAgICAnQ3JlYXRlIGEgQ2hhaW5NYXAgd2l0aCBhIHNpbmdsZSBkaWN0IGNyZWF0ZWQgZnJvbSB0aGUgaXRlcmFibGUuJwogICAgICAgICAgICByZXR1cm4gY2xzKGRpY3QuZnJvbWtleXMoaXRlcmFibGUsICphcmdzKSkKCiAgICAgICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgb3Igc3ViY2xhc3Mgd2l0aCBhIG5ldyBjb3B5IG9mIG1hcHNbMF0gYW5kIHJlZnMgdG8gbWFwc1sxOl0nCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLm1hcHNbMF0uY29weSgpLCAqc2VsZi5tYXBzWzE6XSkKCiAgICAgICAgX19jb3B5X18gPSBjb3B5CgogICAgICAgIGRlZiBuZXdfY2hpbGQoc2VsZik6ICAgICAgICAgICAgICAgICAgICAgICAgIyBsaWtlIERqYW5nbydzIENvbnRleHQucHVzaCgpCiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgd2l0aCBhIG5ldyBkaWN0IGZvbGxvd2VkIGJ5IGFsbCBwcmV2aW91cyBtYXBzLicKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHt9LCAqc2VsZi5tYXBzKQoKICAgICAgICBAcHJvcGVydHkKICAgICAgICBkZWYgcGFyZW50cyhzZWxmKTogICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlrZSBEamFuZ28ncyBDb250ZXh0LnBvcCgpCiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgZnJvbSBtYXBzWzE6XS4nCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqc2VsZi5tYXBzWzE6XSkKCiAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLm1hcHNbMF1ba2V5XSA9IHZhbHVlCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5tYXBzWzBdW2tleV0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0tleSBub3QgZm91bmQgaW4gdGhlIGZpcnN0IG1hcHBpbmc6IHshcn0nLmZvcm1hdChrZXkpKQoKICAgICAgICBkZWYgcG9waXRlbShzZWxmKToKICAgICAgICAgICAgJ1JlbW92ZSBhbmQgcmV0dXJuIGFuIGl0ZW0gcGFpciBmcm9tIG1hcHNbMF0uIFJhaXNlIEtleUVycm9yIGlzIG1hcHNbMF0gaXMgZW1wdHkuJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXBzWzBdLnBvcGl0ZW0oKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8ga2V5cyBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZy4nKQoKICAgICAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgogICAgICAgICAgICAnUmVtb3ZlICprZXkqIGZyb20gbWFwc1swXSBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gUmFpc2UgS2V5RXJyb3IgaWYgKmtleSogbm90IGluIG1hcHNbMF0uJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXBzWzBdLnBvcChrZXksICphcmdzKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignS2V5IG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZzogeyFyfScuZm9ybWF0KGtleSkpCgogICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgJ0NsZWFyIG1hcHNbMF0sIGxlYXZpbmcgbWFwc1sxOl0gaW50YWN0LicKICAgICAgICAgICAgc2VsZi5tYXBzWzBdLmNsZWFyKCkKCnRyeToKICAgIGZyb20gaW1wIGltcG9ydCBjYWNoZV9mcm9tX3NvdXJjZQpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZGVmIGNhY2hlX2Zyb21fc291cmNlKHBhdGgsIGRlYnVnX292ZXJyaWRlPU5vbmUpOgogICAgICAgIGFzc2VydCBwYXRoLmVuZHN3aXRoKCcucHknKQogICAgICAgIGlmIGRlYnVnX292ZXJyaWRlIGlzIE5vbmU6CiAgICAgICAgICAgIGRlYnVnX292ZXJyaWRlID0gX19kZWJ1Z19fCiAgICAgICAgaWYgZGVidWdfb3ZlcnJpZGU6CiAgICAgICAgICAgIHN1ZmZpeCA9ICdjJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1ZmZpeCA9ICdvJwogICAgICAgIHJldHVybiBwYXRoICsgc3VmZml4Cgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgojIyB7e3sgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvNTc2NjkzLyAocjkpCiMgQmFja3BvcnQgb2YgT3JkZXJlZERpY3QoKSBjbGFzcyB0aGF0IHJ1bnMgb24gUHl0aG9uIDIuNCwgMi41LCAyLjYsIDIuNyBhbmQgcHlweS4KIyBQYXNzZXMgUHl0aG9uMi43J3MgdGVzdCBzdWl0ZSBhbmQgaW5jb3Jwb3JhdGVzIGFsbCB0aGUgbGF0ZXN0IHVwZGF0ZXMuCiAgICB0cnk6CiAgICAgICAgZnJvbSB0aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkdW1teV90aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CgogICAgdHJ5OgogICAgICAgIGZyb20gX2FiY29sbCBpbXBvcnQgS2V5c1ZpZXcsIFZhbHVlc1ZpZXcsIEl0ZW1zVmlldwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCgogICAgY2xhc3MgT3JkZXJlZERpY3QoZGljdCk6CiAgICAgICAgJ0RpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyJwogICAgICAgICMgQW4gaW5oZXJpdGVkIGRpY3QgbWFwcyBrZXlzIHRvIHZhbHVlcy4KICAgICAgICAjIFRoZSBpbmhlcml0ZWQgZGljdCBwcm92aWRlcyBfX2dldGl0ZW1fXywgX19sZW5fXywgX19jb250YWluc19fLCBhbmQgZ2V0LgogICAgICAgICMgVGhlIHJlbWFpbmluZyBtZXRob2RzIGFyZSBvcmRlci1hd2FyZS4KICAgICAgICAjIEJpZy1PIHJ1bm5pbmcgdGltZXMgZm9yIGFsbCBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyBmb3IgcmVndWxhciBkaWN0aW9uYXJpZXMuCgogICAgICAgICMgVGhlIGludGVybmFsIHNlbGYuX19tYXAgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlua3MgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgICAgICAgIyBUaGUgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgc2VudGluZWwgZWxlbWVudC4KICAgICAgICAjIFRoZSBzZW50aW5lbCBlbGVtZW50IG5ldmVyIGdldHMgZGVsZXRlZCAodGhpcyBzaW1wbGlmaWVzIHRoZSBhbGdvcml0aG0pLgogICAgICAgICMgRWFjaCBsaW5rIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgbGVuZ3RoIHRocmVlOiAgW1BSRVYsIE5FWFQsIEtFWV0uCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKICAgICAgICAgICAgJycnSW5pdGlhbGl6ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkuICBTaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yCiAgICAgICAgICAgIHJlZ3VsYXIgZGljdGlvbmFyaWVzLCBidXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCByZWNvbW1lbmRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZWlyIGluc2VydGlvbiBvcmRlciBpcyBhcmJpdHJhcnkuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhwZWN0ZWQgYXQgbW9zdCAxIGFyZ3VtZW50cywgZ290ICVkJyAlIGxlbihhcmdzKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fX3Jvb3QKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5fX3Jvb3QgPSByb290ID0gW10gICAgICAgICAgICAgICAgICAgICAjIHNlbnRpbmVsIG5vZGUKICAgICAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgICAgIHNlbGYuX19tYXAgPSB7fQogICAgICAgICAgICBzZWxmLl9fdXBkYXRlKCphcmdzLCAqKmt3ZHMpCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CiAgICAgICAgICAgICdvZC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IG9kW2ldPXknCiAgICAgICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayB3aGljaCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZAogICAgICAgICAgICAjIGxpc3QsIGFuZCB0aGUgaW5oZXJpdGVkIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcga2V5L3ZhbHVlIHBhaXIuCiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KICAgICAgICAgICAgICAgIGxhc3RbMV0gPSByb290WzBdID0gc2VsZi5fX21hcFtrZXldID0gW2xhc3QsIHJvb3QsIGtleV0KICAgICAgICAgICAgZGljdF9zZXRpdGVtKHNlbGYsIGtleSwgdmFsdWUpCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXksIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKICAgICAgICAgICAgJ29kLl9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIG9kW3ldJwogICAgICAgICAgICAjIERlbGV0aW5nIGFuIGV4aXN0aW5nIGl0ZW0gdXNlcyBzZWxmLl9fbWFwIHRvIGZpbmQgdGhlIGxpbmsgd2hpY2ggaXMKICAgICAgICAgICAgIyB0aGVuIHJlbW92ZWQgYnkgdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIG5vZGVzLgogICAgICAgICAgICBkaWN0X2RlbGl0ZW0oc2VsZiwga2V5KQogICAgICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwga2V5ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQogICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgbGlua19uZXh0WzBdID0gbGlua19wcmV2CgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgJ29kLl9faXRlcl9fKCkgPD09PiBpdGVyKG9kKScKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGN1cnIgPSByb290WzFdCiAgICAgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgICAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgICAgICAnb2QuX19yZXZlcnNlZF9fKCkgPD09PiByZXZlcnNlZChvZCknCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBjdXJyID0gcm9vdFswXQogICAgICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgogICAgICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbMF0KCiAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAnb2QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIG9kLicKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fX21hcC5pdGVydmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgZGVsIG5vZGVbOl0KICAgICAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICAgICAgc2VsZi5fX21hcC5jbGVhcigpCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgICAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgICAgICAnJydvZC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZXR1cm4gYW5kIHJlbW92ZSBhIChrZXksIHZhbHVlKSBwYWlyLgogICAgICAgICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiBsYXN0IGlzIHRydWUgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGlmIGxhc3Q6CiAgICAgICAgICAgICAgICBsaW5rID0gcm9vdFswXQogICAgICAgICAgICAgICAgbGlua19wcmV2ID0gbGlua1swXQogICAgICAgICAgICAgICAgbGlua19wcmV2WzFdID0gcm9vdAogICAgICAgICAgICAgICAgcm9vdFswXSA9IGxpbmtfcHJldgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGluayA9IHJvb3RbMV0KICAgICAgICAgICAgICAgIGxpbmtfbmV4dCA9IGxpbmtbMV0KICAgICAgICAgICAgICAgIHJvb3RbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgICAgIGxpbmtfbmV4dFswXSA9IHJvb3QKICAgICAgICAgICAga2V5ID0gbGlua1syXQogICAgICAgICAgICBkZWwgc2VsZi5fX21hcFtrZXldCiAgICAgICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5KQogICAgICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgICAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgLS0KCiAgICAgICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgICAgICdvZC5rZXlzKCkgLT4gbGlzdCBvZiBrZXlzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICAgICAnb2QudmFsdWVzKCkgLT4gbGlzdCBvZiB2YWx1ZXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KCiAgICAgICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlbXMoKSAtPiBsaXN0IG9mIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KCiAgICAgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmKQoKICAgICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAgICAgJ29kLml0ZXJ2YWx1ZXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIGluIG9kJwogICAgICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZltrXQoKICAgICAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcml0ZW1zIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBpbiBvZCcKICAgICAgICAgICAgZm9yIGsgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQoKICAgICAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgogICAgICAgICAgICAnJydvZC51cGRhdGUoRSwgKipGKSAtPiBOb25lLiAgVXBkYXRlIG9kIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLgoKICAgICAgICAgICAgSWYgRSBpcyBhIGRpY3QgaW5zdGFuY2UsIGRvZXM6ICAgICAgICAgICBmb3IgayBpbiBFOiBvZFtrXSA9IEVba10KICAgICAgICAgICAgSWYgRSBoYXMgYSAua2V5cygpIG1ldGhvZCwgZG9lczogICAgICAgICBmb3IgayBpbiBFLmtleXMoKTogb2Rba10gPSBFW2tdCiAgICAgICAgICAgIE9yIGlmIEUgaXMgYW4gaXRlcmFibGUgb2YgaXRlbXMsIGRvZXM6ICAgZm9yIGssIHYgaW4gRTogb2Rba10gPSB2CiAgICAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiAgICAgZm9yIGssIHYgaW4gRi5pdGVtcygpOiBvZFtrXSA9IHYKCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBsZW4oYXJncykgPiAyOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAoJWQgZ2l2ZW4pJyAlIChsZW4oYXJncyksKSkKICAgICAgICAgICAgZWxpZiBub3QgYXJnczoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbiknKQogICAgICAgICAgICBzZWxmID0gYXJnc1swXQogICAgICAgICAgICAjIE1ha2UgcHJvZ3Jlc3NpdmVseSB3ZWFrZXIgYXNzdW1wdGlvbnMgYWJvdXQgIm90aGVyIgogICAgICAgICAgICBvdGhlciA9ICgpCiAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgogICAgICAgICAgICAgICAgb3RoZXIgPSBhcmdzWzFdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3ZHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCgogICAgICAgIF9fdXBkYXRlID0gdXBkYXRlICAjIGxldCBzdWJjbGFzc2VzIG92ZXJyaWRlIHVwZGF0ZSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fCgogICAgICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICAgICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICAgICAnJydvZC5wb3Aoa1ssZF0pIC0+IHYsIHJlbW92ZSBzcGVjaWZpZWQga2V5IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KICAgICAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgICAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgICdvZC5zZXRkZWZhdWx0KGtbLGRdKSAtPiBvZC5nZXQoayxkKSwgYWxzbyBzZXQgb2Rba109ZCBpZiBrIG5vdCBpbiBvZCcKICAgICAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYsIF9yZXByX3J1bm5pbmc9Tm9uZSk6CiAgICAgICAgICAgICdvZC5fX3JlcHJfXygpIDw9PT4gcmVwcihvZCknCiAgICAgICAgICAgIGlmIG5vdCBfcmVwcl9ydW5uaW5nOiBfcmVwcl9ydW5uaW5nID0ge30KICAgICAgICAgICAgY2FsbF9rZXkgPSBpZChzZWxmKSwgX2dldF9pZGVudCgpCiAgICAgICAgICAgIGlmIGNhbGxfa2V5IGluIF9yZXByX3J1bm5pbmc6CiAgICAgICAgICAgICAgICByZXR1cm4gJy4uLicKICAgICAgICAgICAgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0gPSAxCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBkZWwgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0KCiAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgICAgICdSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nJwogICAgICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KICAgICAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICAgICAgZm9yIGsgaW4gdmFycyhPcmRlcmVkRGljdCgpKToKICAgICAgICAgICAgICAgIGluc3RfZGljdC5wb3AoaywgTm9uZSkKICAgICAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQoKICAgICAgICBkZWYgY29weShzZWxmKToKICAgICAgICAgICAgJ29kLmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBvZCcKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICAgICAgJycnT0QuZnJvbWtleXMoU1ssIHZdKSAtPiBOZXcgb3JkZXJlZCBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFMKICAgICAgICAgICAgYW5kIHZhbHVlcyBlcXVhbCB0byB2ICh3aGljaCBkZWZhdWx0cyB0byBOb25lKS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBkID0gY2xzKCkKICAgICAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIHJldHVybiBkCgogICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICAnJydvZC5fX2VxX18oeSkgPD09PiBvZD09eS4gIENvbXBhcmlzb24gdG8gYW5vdGhlciBPRCBpcyBvcmRlci1zZW5zaXRpdmUKICAgICAgICAgICAgd2hpbGUgY29tcGFyaXNvbiB0byBhIHJlZ3VsYXIgbWFwcGluZyBpcyBvcmRlci1pbnNlbnNpdGl2ZS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPcmRlcmVkRGljdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYpPT1sZW4ob3RoZXIpIGFuZCBzZWxmLml0ZW1zKCkgPT0gb3RoZXIuaXRlbXMoKQogICAgICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAgICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIG9ubHkgdXNlZCBpbiBQeXRob24gMi43IC0tCgogICAgICAgIGRlZiB2aWV3a2V5cyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXdrZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGtleXMiCiAgICAgICAgICAgIHJldHVybiBLZXlzVmlldyhzZWxmKQoKICAgICAgICBkZWYgdmlld3ZhbHVlcyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIHZhbHVlcyIKICAgICAgICAgICAgcmV0dXJuIFZhbHVlc1ZpZXcoc2VsZikKCiAgICAgICAgZGVmIHZpZXdpdGVtcyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBpdGVtcyIKICAgICAgICAgICAgcmV0dXJuIEl0ZW1zVmlldyhzZWxmKQoKdHJ5OgogICAgZnJvbSBsb2dnaW5nLmNvbmZpZyBpbXBvcnQgQmFzZUNvbmZpZ3VyYXRvciwgdmFsaWRfaWRlbnQKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIElERU5USUZJRVIgPSByZS5jb21waWxlKCdeW2Etel9dW2EtejAtOV9dKiQnLCByZS5JKQoKCiAgICBkZWYgdmFsaWRfaWRlbnQocyk6CiAgICAgICAgbSA9IElERU5USUZJRVIubWF0Y2gocykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXI6ICVyJyAlIHMpCiAgICAgICAgcmV0dXJuIFRydWUKCgogICAgIyBUaGUgQ29udmVydGluZ1hYWCBjbGFzc2VzIGFyZSB3cmFwcGVycyBhcm91bmQgc3RhbmRhcmQgUHl0aG9uIGNvbnRhaW5lcnMsCiAgICAjIGFuZCB0aGV5IHNlcnZlIHRvIGNvbnZlcnQgYW55IHN1aXRhYmxlIHZhbHVlcyBpbiB0aGUgY29udGFpbmVyLiBUaGUKICAgICMgY29udmVyc2lvbiBjb252ZXJ0cyBiYXNlIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIHRvIHRoZWlyIHdyYXBwZWQKICAgICMgZXF1aXZhbGVudHMsIHdoZXJlYXMgc3RyaW5ncyB3aGljaCBtYXRjaCBhIGNvbnZlcnNpb24gZm9ybWF0IGFyZSBjb252ZXJ0ZWQKICAgICMgYXBwcm9wcmlhdGVseS4KICAgICMKICAgICMgRWFjaCB3cmFwcGVyIHNob3VsZCBoYXZlIGEgY29uZmlndXJhdG9yIGF0dHJpYnV0ZSBob2xkaW5nIHRoZSBhY3R1YWwKICAgICMgY29uZmlndXJhdG9yIHRvIHVzZSBmb3IgY29udmVyc2lvbi4KCiAgICBjbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKICAgICAgICAiIiJBIGNvbnZlcnRpbmcgZGljdGlvbmFyeSB3cmFwcGVyLiIiIgoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgIHZhbHVlID0gZGljdC5nZXQoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGNsYXNzIENvbnZlcnRpbmdMaXN0KGxpc3QpOgogICAgICAgICIiIkEgY29udmVydGluZyBsaXN0IHdyYXBwZXIuIiIiCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBwb3Aoc2VsZiwgaWR4PS0xKToKICAgICAgICAgICAgdmFsdWUgPSBsaXN0LnBvcChzZWxmLCBpZHgpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQ29udmVydGluZ1R1cGxlKHR1cGxlKToKICAgICAgICAiIiJBIGNvbnZlcnRpbmcgdHVwbGUgd3JhcHBlci4iIiIKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSB0dXBsZS5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGNsYXNzIEJhc2VDb25maWd1cmF0b3Iob2JqZWN0KToKICAgICAgICAiIiIKICAgICAgICBUaGUgY29uZmlndXJhdG9yIGJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBzb21lIHVzZWZ1bCBkZWZhdWx0cy4KICAgICAgICAiIiIKCiAgICAgICAgQ09OVkVSVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ14oP1A8cHJlZml4PlthLXpdKyk6Ly8oP1A8c3VmZml4Pi4qKSQnKQoKICAgICAgICBXT1JEX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxzKihcdyspXHMqJykKICAgICAgICBET1RfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXC5ccyooXHcrKVxzKicpCiAgICAgICAgSU5ERVhfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXFtccyooXHcrKVxzKlxdXHMqJykKICAgICAgICBESUdJVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cZCskJykKCiAgICAgICAgdmFsdWVfY29udmVydGVycyA9IHsKICAgICAgICAgICAgJ2V4dCcgOiAnZXh0X2NvbnZlcnQnLAogICAgICAgICAgICAnY2ZnJyA6ICdjZmdfY29udmVydCcsCiAgICAgICAgfQoKICAgICAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG9uZSwgZS5nLiBpbXBvcnRsaWIKICAgICAgICBpbXBvcnRlciA9IHN0YXRpY21ldGhvZChfX2ltcG9ydF9fKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKICAgICAgICAgICAgc2VsZi5jb25maWcgPSBDb252ZXJ0aW5nRGljdChjb25maWcpCiAgICAgICAgICAgIHNlbGYuY29uZmlnLmNvbmZpZ3VyYXRvciA9IHNlbGYKCiAgICAgICAgZGVmIHJlc29sdmUoc2VsZiwgcyk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBSZXNvbHZlIHN0cmluZ3MgdG8gb2JqZWN0cyB1c2luZyBzdGFuZGFyZCBpbXBvcnQgYW5kIGF0dHJpYnV0ZQogICAgICAgICAgICBzeW50YXguCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBuYW1lID0gcy5zcGxpdCgnLicpCiAgICAgICAgICAgIHVzZWQgPSBuYW1lLnBvcCgwKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgIGZvciBmcmFnIGluIG5hbWU6CiAgICAgICAgICAgICAgICAgICAgdXNlZCArPSAnLicgKyBmcmFnCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBlLCB0YiA9IHN5cy5leGNfaW5mbygpWzE6XQogICAgICAgICAgICAgICAgdiA9IFZhbHVlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlICVyOiAlcycgJSAocywgZSkpCiAgICAgICAgICAgICAgICB2Ll9fY2F1c2VfXywgdi5fX3RyYWNlYmFja19fID0gZSwgdGIKICAgICAgICAgICAgICAgIHJhaXNlIHYKCiAgICAgICAgZGVmIGV4dF9jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBleHQ6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUodmFsdWUpCgogICAgICAgIGRlZiBjZmdfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgY2ZnOi8vIHByb3RvY29sLiIiIgogICAgICAgICAgICByZXN0ID0gdmFsdWUKICAgICAgICAgICAgbSA9IHNlbGYuV09SRF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVyIiAlIHZhbHVlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICBkID0gc2VsZi5jb25maWdbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgICNwcmludCBkLCByZXN0CiAgICAgICAgICAgICAgICB3aGlsZSByZXN0OgogICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLkRPVF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5JTkRFWF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBtLmdyb3VwcygpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ESUdJVF9QQVRURVJOLm1hdGNoKGlkeCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnQoaWR4KSAjIHRyeSBhcyBudW1iZXIgZmlyc3QgKG1vc3QgbGlrZWx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlICh2YWx1ZSwgcmVzdCkpCiAgICAgICAgICAgICNyZXN0IHNob3VsZCBiZSBlbXB0eQogICAgICAgICAgICByZXR1cm4gZAoKICAgICAgICBkZWYgY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDb252ZXJ0IHZhbHVlcyB0byBhbiBhcHByb3ByaWF0ZSB0eXBlLiBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyBhcmUKICAgICAgICAgICAgcmVwbGFjZWQgYnkgdGhlaXIgY29udmVydGluZyBhbHRlcm5hdGl2ZXMuIFN0cmluZ3MgYXJlIGNoZWNrZWQgdG8KICAgICAgICAgICAgc2VlIGlmIHRoZXkgaGF2ZSBhIGNvbnZlcnNpb24gZm9ybWF0IGFuZCBhcmUgY29udmVydGVkIGlmIHRoZXkgZG8uCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0RpY3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0RpY3QodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdMaXN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdMaXN0KHZhbHVlKQogICAgICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nVHVwbGUpIGFuZFwKICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nVHVwbGUodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIG0gPSBzZWxmLkNPTlZFUlRfUEFUVEVSTi5tYXRjaCh2YWx1ZSkKICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBkWydwcmVmaXgnXQogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IHNlbGYudmFsdWVfY29udmVydGVycy5nZXQocHJlZml4LCBOb25lKQogICAgICAgICAgICAgICAgICAgIGlmIGNvbnZlcnRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gZFsnc3VmZml4J10KICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gZ2V0YXR0cihzZWxmLCBjb252ZXJ0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydGVyKHN1ZmZpeCkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgICAgICIiIkNvbmZpZ3VyZSBhbiBvYmplY3Qgd2l0aCBhIHVzZXItc3VwcGxpZWQgZmFjdG9yeS4iIiIKICAgICAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICAgICAgaWYgbm90IGNhbGxhYmxlKGMpOgogICAgICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgICAgICBwcm9wcyA9IGNvbmZpZy5wb3AoJy4nLCBOb25lKQogICAgICAgICAgICAjIENoZWNrIGZvciB2YWxpZCBpZGVudGlmaWVycwogICAgICAgICAgICBrd2FyZ3MgPSBkaWN0KFsoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoayldKQogICAgICAgICAgICByZXN1bHQgPSBjKCoqa3dhcmdzKQogICAgICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBwcm9wcy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgYXNfdHVwbGUoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGxpc3RzIHRvIHR1cGxlcy4iIiIKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHR1cGxlKHZhbHVlKQogICAgICAgICAgICByZXR1cm4gdmFsdWUKUEsDBBQAAAAAAAAAIQA6CsO8CMIAAAjCAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvZGF0YWJhc2UucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJQRVAgMzc2IGltcGxlbWVudGF0aW9uLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYmFzZTY0CmltcG9ydCBjb2RlY3MKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHN5cwppbXBvcnQgemlwaW1wb3J0Cgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24sIHJlc291cmNlcwpmcm9tIC5jb21wYXQgaW1wb3J0IFN0cmluZ0lPCmZyb20gLnZlcnNpb24gaW1wb3J0IGdldF9zY2hlbWUsIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yCmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YSwgTUVUQURBVEFfRklMRU5BTUUsIFdIRUVMX01FVEFEQVRBX0ZJTEVOQU1FCmZyb20gLnV0aWwgaW1wb3J0IChwYXJzZV9yZXF1aXJlbWVudCwgY2FjaGVkX3Byb3BlcnR5LCBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgcmVhZF9leHBvcnRzLCB3cml0ZV9leHBvcnRzLCBDU1ZSZWFkZXIsIENTVldyaXRlcikKCgpfX2FsbF9fID0gWydEaXN0cmlidXRpb24nLCAnQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgJ0luc3RhbGxlZERpc3RyaWJ1dGlvbicsICdFZ2dJbmZvRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAnRGlzdHJpYnV0aW9uUGF0aCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpFWFBPUlRTX0ZJTEVOQU1FID0gJ3B5ZGlzdC1leHBvcnRzLmpzb24nCkNPTU1BTkRTX0ZJTEVOQU1FID0gJ3B5ZGlzdC1jb21tYW5kcy5qc29uJwoKRElTVF9GSUxFUyA9ICgnSU5TVEFMTEVSJywgTUVUQURBVEFfRklMRU5BTUUsICdSRUNPUkQnLCAnUkVRVUVTVEVEJywKICAgICAgICAgICAgICAnUkVTT1VSQ0VTJywgRVhQT1JUU19GSUxFTkFNRSwgJ1NIQVJFRCcpCgpESVNUSU5GT19FWFQgPSAnLmRpc3QtaW5mbycKCgpjbGFzcyBfQ2FjaGUob2JqZWN0KToKICAgICIiIgogICAgQSBzaW1wbGUgY2FjaGUgbWFwcGluZyBuYW1lcyBhbmQgLmRpc3QtaW5mbyBwYXRocyB0byBkaXN0cmlidXRpb25zCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLiBUaGVyZSBpcyBub3JtYWxseSBvbmUgZm9yIGVhY2ggRGlzdHJpYnV0aW9uUGF0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSB7fQogICAgICAgIHNlbGYucGF0aCA9IHt9CiAgICAgICAgc2VsZi5nZW5lcmF0ZWQgPSBGYWxzZQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciB0aGUgY2FjaGUsIHNldHRpbmcgaXQgdG8gaXRzIGluaXRpYWwgc3RhdGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lLmNsZWFyKCkKICAgICAgICBzZWxmLnBhdGguY2xlYXIoKQogICAgICAgIHNlbGYuZ2VuZXJhdGVkID0gRmFsc2UKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGRpc3RyaWJ1dGlvbiB0byB0aGUgY2FjaGUuCiAgICAgICAgOnBhcmFtIGRpc3Q6IFRoZSBkaXN0cmlidXRpb24gdG8gYWRkLgogICAgICAgICIiIgogICAgICAgIGlmIGRpc3QucGF0aCBub3QgaW4gc2VsZi5wYXRoOgogICAgICAgICAgICBzZWxmLnBhdGhbZGlzdC5wYXRoXSA9IGRpc3QKICAgICAgICAgICAgc2VsZi5uYW1lLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKS5hcHBlbmQoZGlzdCkKCgpjbGFzcyBEaXN0cmlidXRpb25QYXRoKG9iamVjdCk6CiAgICAiIiIKICAgIFJlcHJlc2VudHMgYSBzZXQgb2YgZGlzdHJpYnV0aW9ucyBpbnN0YWxsZWQgb24gYSBwYXRoICh0eXBpY2FsbHkgc3lzLnBhdGgpLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBpbmNsdWRlX2VnZz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGFuIGluc3RhbmNlIGZyb20gYSBwYXRoLCBvcHRpb25hbGx5IGluY2x1ZGluZyBsZWdhY3kgKGRpc3R1dGlscy8KICAgICAgICBzZXR1cHRvb2xzL2Rpc3RyaWJ1dGUpIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIHRvIHVzZSwgYXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiBJZiBub3Qgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgICAgICBzeXMucGF0aCBpcyB1c2VkLgogICAgICAgIDpwYXJhbSBpbmNsdWRlX2VnZzogSWYgVHJ1ZSwgdGhpcyBpbnN0YW5jZSB3aWxsIGxvb2sgZm9yIGFuZCByZXR1cm4gbGVnYWN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zIGFzIHdlbGwgYXMgdGhvc2UgYmFzZWQgb24gUEVQIDM3Ni4KICAgICAgICAiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKICAgICAgICBzZWxmLl9pbmNsdWRlX2Rpc3QgPSBUcnVlCiAgICAgICAgc2VsZi5faW5jbHVkZV9lZ2cgPSBpbmNsdWRlX2VnZwoKICAgICAgICBzZWxmLl9jYWNoZSA9IF9DYWNoZSgpCiAgICAgICAgc2VsZi5fY2FjaGVfZWdnID0gX0NhY2hlKCkKICAgICAgICBzZWxmLl9jYWNoZV9lbmFibGVkID0gVHJ1ZQogICAgICAgIHNlbGYuX3NjaGVtZSA9IGdldF9zY2hlbWUoJ2RlZmF1bHQnKQoKICAgIGRlZiBfZ2V0X2NhY2hlX2VuYWJsZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlX2VuYWJsZWQKCiAgICBkZWYgX3NldF9jYWNoZV9lbmFibGVkKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9jYWNoZV9lbmFibGVkID0gdmFsdWUKCiAgICBjYWNoZV9lbmFibGVkID0gcHJvcGVydHkoX2dldF9jYWNoZV9lbmFibGVkLCBfc2V0X2NhY2hlX2VuYWJsZWQpCgogICAgZGVmIGNsZWFyX2NhY2hlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFycyB0aGUgaW50ZXJuYWwgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGUuY2xlYXIoKQogICAgICAgIHNlbGYuX2NhY2hlX2VnZy5jbGVhcigpCgoKICAgIGRlZiBfeWllbGRfZGlzdHJpYnV0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZCAuZGlzdC1pbmZvIGFuZC9vciAuZWdnKC1pbmZvKSBkaXN0cmlidXRpb25zLgogICAgICAgICIiIgogICAgICAgICMgV2UgbmVlZCB0byBjaGVjayBpZiB3ZSd2ZSBzZWVuIHNvbWUgcmVzb3VyY2VzIGFscmVhZHksIGJlY2F1c2Ugb24KICAgICAgICAjIHNvbWUgTGludXggc3lzdGVtcyAoZS5nLiBzb21lIERlYmlhbi9VYnVudHUgdmFyaWFudHMpIHRoZXJlIGFyZQogICAgICAgICMgc3ltbGlua3Mgd2hpY2ggYWxpYXMgb3RoZXIgZmlsZXMgaW4gdGhlIGVudmlyb25tZW50LgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYucGF0aDoKICAgICAgICAgICAgZmluZGVyID0gcmVzb3VyY2VzLmZpbmRlcl9mb3JfcGF0aChwYXRoKQogICAgICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnJykKICAgICAgICAgICAgaWYgbm90IHIgb3Igbm90IHIuaXNfY29udGFpbmVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcnNldCA9IHNvcnRlZChyLnJlc291cmNlcykKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJzZXQ6CiAgICAgICAgICAgICAgICByID0gZmluZGVyLmZpbmQoZW50cnkpCiAgICAgICAgICAgICAgICBpZiBub3QgciBvciByLnBhdGggaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgc2VsZi5faW5jbHVkZV9kaXN0IGFuZCBlbnRyeS5lbmRzd2l0aChESVNUSU5GT19FWFQpOgogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX2ZpbGVuYW1lcyA9IFtNRVRBREFUQV9GSUxFTkFNRSwgV0hFRUxfTUVUQURBVEFfRklMRU5BTUVdCiAgICAgICAgICAgICAgICAgICAgZm9yIG1ldGFkYXRhX2ZpbGVuYW1lIGluIHBvc3NpYmxlX2ZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfcGF0aCA9IHBvc2l4cGF0aC5qb2luKGVudHJ5LCBtZXRhZGF0YV9maWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHlkaXN0ID0gZmluZGVyLmZpbmQobWV0YWRhdGFfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHlkaXN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhweWRpc3QuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShmaWxlb2JqPXN0cmVhbSwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgJXMnLCByLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIG5ld19kaXN0X2NsYXNzKHIucGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PXNlbGYpCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2luY2x1ZGVfZWdnIGFuZCBlbnRyeS5lbmRzd2l0aCgoJy5lZ2ctaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmVnZycpKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kICVzJywgci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHIucGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBvbGRfZGlzdF9jbGFzcyhyLnBhdGgsIHNlbGYpCgogICAgZGVmIF9nZW5lcmF0ZV9jYWNoZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTY2FuIHRoZSBwYXRoIGZvciBkaXN0cmlidXRpb25zIGFuZCBwb3B1bGF0ZSB0aGUgY2FjaGUgd2l0aAogICAgICAgIHRob3NlIHRoYXQgYXJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIGdlbl9kaXN0ID0gbm90IHNlbGYuX2NhY2hlLmdlbmVyYXRlZAogICAgICAgIGdlbl9lZ2cgPSBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgbm90IHNlbGYuX2NhY2hlX2VnZy5nZW5lcmF0ZWQKICAgICAgICBpZiBnZW5fZGlzdCBvciBnZW5fZWdnOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl95aWVsZF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpc3QsIEluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUuYWRkKGRpc3QpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2VnZy5hZGQoZGlzdCkKCiAgICAgICAgICAgIGlmIGdlbl9kaXN0OgogICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUuZ2VuZXJhdGVkID0gVHJ1ZQogICAgICAgICAgICBpZiBnZW5fZWdnOgogICAgICAgICAgICAgICAgc2VsZi5fY2FjaGVfZWdnLmdlbmVyYXRlZCA9IFRydWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBkaXN0aW5mb19kaXJuYW1lKGNscywgbmFtZSwgdmVyc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgVGhlICpuYW1lKiBhbmQgKnZlcnNpb24qIHBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyCiAgICAgICAgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLCBpLmUuIGFueSBgYCctJ2BgIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkCiAgICAgICAgd2l0aCBgYCdfJ2BgIG90aGVyIHRoYW4gdGhlIG9uZSBpbiBgYCdkaXN0LWluZm8nYGAgYW5kIHRoZSBvbmUKICAgICAgICBzZXBhcmF0aW5nIHRoZSBuYW1lIGZyb20gdGhlIHZlcnNpb24gbnVtYmVyLgoKICAgICAgICA6cGFyYW1ldGVyIG5hbWU6IGlzIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lIGJ5IHJlcGxhY2luZwogICAgICAgICAgICAgICAgICAgICAgICAgYW55IHJ1bnMgb2Ygbm9uLSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgICBgYCctJ2BgLgogICAgICAgIDp0eXBlIG5hbWU6IHN0cmluZwogICAgICAgIDpwYXJhbWV0ZXIgdmVyc2lvbjogaXMgY29udmVydGVkIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcuIFNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IGRvdHMpIGJlY29tZSBkYXNoZXMsIHdpdGggcnVucyBvZiBtdWx0aXBsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGVzIGNvbmRlbnNlZCB0byBhIHNpbmdsZSBkYXNoLgogICAgICAgIDp0eXBlIHZlcnNpb246IHN0cmluZwogICAgICAgIDpyZXR1cm5zOiBkaXJlY3RvcnkgbmFtZQogICAgICAgIDpydHlwZTogc3RyaW5nIiIiCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLScsICdfJykKICAgICAgICByZXR1cm4gJy0nLmpvaW4oW25hbWUsIHZlcnNpb25dKSArIERJU1RJTkZPX0VYVAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcm92aWRlcyBhbiBpdGVyYXRvciB0aGF0IGxvb2tzIGZvciBkaXN0cmlidXRpb25zIGFuZCByZXR1cm5zCiAgICAgICAgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIG9yCiAgICAgICAgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMgZm9yIGVhY2ggb25lIG9mIHRoZW0uCgogICAgICAgIDpydHlwZTogaXRlcmF0b3Igb2YgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIGFuZAogICAgICAgICAgICAgICAgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5feWllbGRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2NhY2hlKCkKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX2NhY2hlLnBhdGgudmFsdWVzKCk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgICAgICAgICBpZiBzZWxmLl9pbmNsdWRlX2VnZzoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX2NhY2hlX2VnZy5wYXRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBMb29rcyBmb3IgYSBuYW1lZCBkaXN0cmlidXRpb24gb24gdGhlIHBhdGguCgogICAgICAgIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgZm91bmQsIGFzIG5vIG1vcmUgdGhhbiBvbmUKICAgICAgICB2YWx1ZSBpcyBleHBlY3RlZC4gSWYgbm90aGluZyBpcyBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIDpydHlwZTogOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gLCA6Y2xhc3M6YEVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgICAgICAgICBvciBgYE5vbmVgYAogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCiAgICAgICAgaWYgbm90IHNlbGYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5ID09IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGlzdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfY2FjaGUoKQoKICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9jYWNoZS5uYW1lOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGUubmFtZVtuYW1lXVswXQogICAgICAgICAgICBlbGlmIHNlbGYuX2luY2x1ZGVfZWdnIGFuZCBuYW1lIGluIHNlbGYuX2NhY2hlX2VnZy5uYW1lOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGVfZWdnLm5hbWVbbmFtZV1bMF0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHByb3ZpZGVzX2Rpc3RyaWJ1dGlvbihzZWxmLCBuYW1lLCB2ZXJzaW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgYWxsIGRpc3RyaWJ1dGlvbnMgdG8gZmluZCB3aGljaCBkaXN0cmlidXRpb25zIHByb3ZpZGUgKm5hbWUqLgogICAgICAgIElmIGEgKnZlcnNpb24qIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IGZvdW5kLCBzaW5jZSBubyBtb3JlIHRoYW4KICAgICAgICBvbmUgdmFsdWVzIGFyZSBleHBlY3RlZC4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgZm91bmQsIHJldHVybnMgYGBOb25lYGAuCgogICAgICAgIDpwYXJhbWV0ZXIgdmVyc2lvbjogYSB2ZXJzaW9uIHNwZWNpZmllciB0aGF0IGluZGljYXRlcyB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQsIGNvbmZvcm1pbmcgdG8gdGhlIGZvcm1hdCBpbiBgYFBFUC0zNDVgYAoKICAgICAgICA6dHlwZSBuYW1lOiBzdHJpbmcKICAgICAgICA6dHlwZSB2ZXJzaW9uOiBzdHJpbmcKICAgICAgICAiIiIKICAgICAgICBtYXRjaGVyID0gTm9uZQogICAgICAgIGlmIG5vdCB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLl9zY2hlbWUubWF0Y2hlcignJXMgKCVzKScgJSAobmFtZSwgdmVyc2lvbikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBuYW1lIG9yIHZlcnNpb246ICVyLCAlcicgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB2ZXJzaW9uKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5nZXRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICBwcm92aWRlZCA9IGRpc3QucHJvdmlkZXMKCiAgICAgICAgICAgIGZvciBwIGluIHByb3ZpZGVkOgogICAgICAgICAgICAgICAgcF9uYW1lLCBwX3ZlciA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgICAgIGlmIG1hdGNoZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBpZiBwX25hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBwX25hbWUgPT0gbmFtZSBhbmQgbWF0Y2hlci5tYXRjaChwX3Zlcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZ2V0X2ZpbGVfcGF0aChzZWxmLCBuYW1lLCByZWxhdGl2ZV9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdubyBkaXN0cmlidXRpb24gbmFtZWQgJXIgZm91bmQnICUgbmFtZSkKICAgICAgICByZXR1cm4gZGlzdC5nZXRfcmVzb3VyY2VfcGF0aChyZWxhdGl2ZV9wYXRoKQoKICAgIGRlZiBnZXRfZXhwb3J0ZWRfZW50cmllcyhzZWxmLCBjYXRlZ29yeSwgbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIG9mIHRoZSBleHBvcnRlZCBlbnRyaWVzIGluIGEgcGFydGljdWxhciBjYXRlZ29yeS4KCiAgICAgICAgOnBhcmFtIGNhdGVnb3J5OiBUaGUgY2F0ZWdvcnkgdG8gc2VhcmNoIGZvciBlbnRyaWVzLgogICAgICAgIDpwYXJhbSBuYW1lOiBJZiBzcGVjaWZpZWQsIG9ubHkgZW50cmllcyB3aXRoIHRoYXQgbmFtZSBhcmUgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5nZXRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICByID0gZGlzdC5leHBvcnRzCiAgICAgICAgICAgIGlmIGNhdGVnb3J5IGluIHI6CiAgICAgICAgICAgICAgICBkID0gcltjYXRlZ29yeV0KICAgICAgICAgICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkW25hbWVdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZvciB2IGluIGQudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHYKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIgogICAgQSBiYXNlIGNsYXNzIGZvciBkaXN0cmlidXRpb25zLCB3aGV0aGVyIGluc3RhbGxlZCBvciBmcm9tIGluZGV4ZXMuCiAgICBFaXRoZXIgd2F5LCBpdCBtdXN0IGhhdmUgc29tZSBtZXRhZGF0YSwgc28gdGhhdCdzIGFsbCB0aGF0J3MgbmVlZGVkCiAgICBmb3IgY29uc3RydWN0aW9uLgogICAgIiIiCgogICAgYnVpbGRfdGltZV9kZXBlbmRlbmN5ID0gRmFsc2UKICAgICIiIgogICAgU2V0IHRvIFRydWUgaWYgaXQncyBrbm93biB0byBiZSBvbmx5IGEgYnVpbGQtdGltZSBkZXBlbmRlbmN5IChpLmUuCiAgICBub3QgbmVlZGVkIGFmdGVyIGluc3RhbGxhdGlvbikuCiAgICAiIiIKCiAgICByZXF1ZXN0ZWQgPSBGYWxzZQogICAgIiIiQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGBgUkVRVUVTVEVEYGAgbWV0YWRhdGEgZmlsZSBpcwogICAgcHJlc2VudCAoaW4gb3RoZXIgd29yZHMsIHdoZXRoZXIgdGhlIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBieSB1c2VyCiAgICByZXF1ZXN0IG9yIGl0IHdhcyBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5KS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBUaGUgaW5zdGFuY2Ugb2YgOmNsYXNzOmBNZXRhZGF0YWAgZGVzY3JpYmluZyB0aGlzCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQogICAgICAgIHNlbGYubmFtZSA9IG1ldGFkYXRhLm5hbWUKICAgICAgICBzZWxmLmtleSA9IHNlbGYubmFtZS5sb3dlcigpICAgICMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKICAgICAgICBzZWxmLnZlcnNpb24gPSBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgc2VsZi5sb2NhdG9yID0gTm9uZQogICAgICAgIHNlbGYuZGlnZXN0ID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gTm9uZSAgICAgICMgYWRkaXRpb25hbCBmZWF0dXJlcyByZXF1ZXN0ZWQKICAgICAgICBzZWxmLmNvbnRleHQgPSBOb25lICAgICAjIGVudmlyb25tZW50IG1hcmtlciBvdmVycmlkZXMKICAgICAgICBzZWxmLmRvd25sb2FkX3VybHMgPSBzZXQoKQogICAgICAgIHNlbGYuZGlnZXN0cyA9IHt9CgogICAgQHByb3BlcnR5CiAgICBkZWYgc291cmNlX3VybChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUaGUgc291cmNlIGFyY2hpdmUgZG93bmxvYWQgVVJMIGZvciB0aGlzIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YS5zb3VyY2VfdXJsCgogICAgZG93bmxvYWRfdXJsID0gc291cmNlX3VybCAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWVfYW5kX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSB1dGlsaXR5IHByb3BlcnR5IHdoaWNoIGRpc3BsYXlzIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIGluIHBhcmVudGhlc2VzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJvdmlkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBzZXQgb2YgZGlzdHJpYnV0aW9uIG5hbWVzIGFuZCB2ZXJzaW9ucyBwcm92aWRlZCBieSB0aGlzIGRpc3RyaWJ1dGlvbi4KICAgICAgICA6cmV0dXJuOiBBIHNldCBvZiAibmFtZSAodmVyc2lvbikiIHN0cmluZ3MuCiAgICAgICAgIiIiCiAgICAgICAgcGxpc3QgPSBzZWxmLm1ldGFkYXRhLnByb3ZpZGVzCiAgICAgICAgcyA9ICclcyAoJXMpJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpZiBzIG5vdCBpbiBwbGlzdDoKICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHMpCiAgICAgICAgcmV0dXJuIHBsaXN0CgogICAgZGVmIF9nZXRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcV9hdHRyKToKICAgICAgICBtZCA9IHNlbGYubWV0YWRhdGEKICAgICAgICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgcmVxdWlyZW1lbnRzIGZyb20gbWV0YWRhdGEgJXInLCBtZC50b2RpY3QoKSkKICAgICAgICByZXF0cyA9IGdldGF0dHIobWQsIHJlcV9hdHRyKQogICAgICAgIHJldHVybiBzZXQobWQuZ2V0X3JlcXVpcmVtZW50cyhyZXF0cywgZXh0cmFzPXNlbGYuZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9c2VsZi5jb250ZXh0KSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBydW5fcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ3J1bl9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWV0YV9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygnbWV0YV9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYnVpbGRfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ2J1aWxkX3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXN0X3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCd0ZXN0X3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXZfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ2Rldl9yZXF1aXJlcycpCgogICAgZGVmIG1hdGNoZXNfcmVxdWlyZW1lbnQoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBTYXkgaWYgdGhpcyBpbnN0YW5jZSBtYXRjaGVzIChmdWxmaWxscykgYSByZXF1aXJlbWVudC4KICAgICAgICA6cGFyYW0gcmVxOiBUaGUgcmVxdWlyZW1lbnQgdG8gbWF0Y2guCiAgICAgICAgOnJ0eXBlIHJlcTogc3RyCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiBpdCBtYXRjaGVzLCBlbHNlIEZhbHNlLgogICAgICAgICIiIgogICAgICAgICMgUmVxdWlyZW1lbnQgbWF5IGNvbnRhaW4gZXh0cmFzIC0gcGFyc2UgdG8gbG9zZSB0aG9zZQogICAgICAgICMgZnJvbSB3aGF0J3MgcGFzc2VkIHRvIHRoZSBtYXRjaGVyCiAgICAgICAgciA9IHBhcnNlX3JlcXVpcmVtZW50KHJlcSkKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYubWV0YWRhdGEuc2NoZW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKHIucmVxdWlyZW1lbnQpCiAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnY291bGQgbm90IHJlYWQgdmVyc2lvbiAlciAtIHVzaW5nIG5hbWUgb25seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSkKICAgICAgICAgICAgbmFtZSA9IHJlcS5zcGxpdCgpWzBdCiAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihuYW1lKQoKICAgICAgICBuYW1lID0gbWF0Y2hlci5rZXkgICAjIGNhc2UtaW5zZW5zaXRpdmUKCiAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBmb3IgcCBpbiBzZWxmLnByb3ZpZGVzOgogICAgICAgICAgICBwX25hbWUsIHBfdmVyID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBpZiBwX25hbWUgIT0gbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1hdGNoZXIubWF0Y2gocF92ZXIpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5zdGFuY2UsCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfdXJsOgogICAgICAgICAgICBzdWZmaXggPSAnIFslc10nICUgc2VsZi5zb3VyY2VfdXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJycKICAgICAgICByZXR1cm4gJzxEaXN0cmlidXRpb24gJXMgKCVzKSVzPicgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIHN1ZmZpeCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBTZWUgaWYgdGhpcyBkaXN0cmlidXRpb24gaXMgdGhlIHNhbWUgYXMgYW5vdGhlci4KICAgICAgICA6cGFyYW0gb3RoZXI6IFRoZSBkaXN0cmlidXRpb24gdG8gY29tcGFyZSB3aXRoLiBUbyBiZSBlcXVhbCB0byBvbmUKICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIuIGRpc3RyaWJ1dGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGFuZCBzb3VyY2VfdXJsLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgaXQgaXMgdGhlIHNhbWUsIGVsc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdHlwZShvdGhlcikgaXMgbm90IHR5cGUoc2VsZik6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gKHNlbGYubmFtZSA9PSBvdGhlci5uYW1lIGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID09IG90aGVyLnZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZV91cmwgPT0gb3RoZXIuc291cmNlX3VybCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbXB1dGUgaGFzaCBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZSBlcXVhbGl0eSB0ZXN0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNoKHNlbGYubmFtZSkgKyBoYXNoKHNlbGYudmVyc2lvbikgKyBoYXNoKHNlbGYuc291cmNlX3VybCkKCgpjbGFzcyBCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGluc3RhbGxlZCBkaXN0cmlidXRpb25zICh3aGV0aGVyIFBFUCAzNzYgb3IKICAgIGxlZ2FjeSkuCiAgICAiIiIKCiAgICBoYXNoZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGFkYXRhLCBwYXRoLCBlbnY9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEFuIGluc3RhbmNlIG9mIDpjbGFzczpgTWV0YWRhdGFgIHdoaWNoIGRlc2NyaWJlcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi4gVGhpcyB3aWxsIG5vcm1hbGx5IGhhdmUgYmVlbiBpbml0aWFsaXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIG1ldGFkYXRhIGZpbGUgaW4gdGhlIGBgcGF0aGBgLgogICAgICAgIDpwYXJhbSBwYXRoOiAgICAgVGhlIHBhdGggb2YgdGhlIGBgLmRpc3QtaW5mb2BgIG9yIGBgLmVnZy1pbmZvYGAKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBmb3IgdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAgICA6cGFyYW0gZW52OiAgICAgIFRoaXMgaXMgbm9ybWFsbHkgdGhlIDpjbGFzczpgRGlzdHJpYnV0aW9uUGF0aGAKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIHdoZXJlIHRoaXMgZGlzdHJpYnV0aW9uIHdhcyBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2luaXRfXyhtZXRhZGF0YSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5kaXN0X3BhdGggPSBlbnYKCiAgICBkZWYgZ2V0X2hhc2goc2VsZiwgZGF0YSwgaGFzaGVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaGFzaCBvZiBzb21lIGRhdGEsIHVzaW5nIGEgcGFydGljdWxhciBoYXNoIGFsZ29yaXRobSwgaWYKICAgICAgICBzcGVjaWZpZWQuCgogICAgICAgIDpwYXJhbSBkYXRhOiBUaGUgZGF0YSB0byBiZSBoYXNoZWQuCiAgICAgICAgOnR5cGUgZGF0YTogYnl0ZXMKICAgICAgICA6cGFyYW0gaGFzaGVyOiBUaGUgbmFtZSBvZiBhIGhhc2ggaW1wbGVtZW50YXRpb24sIHN1cHBvcnRlZCBieSBoYXNobGliLAogICAgICAgICAgICAgICAgICAgICAgIG9yIGBgTm9uZWBgLiBFeGFtcGxlcyBvZiB2YWxpZCB2YWx1ZXMgYXJlIGBgJ3NoYTEnYGAsCiAgICAgICAgICAgICAgICAgICAgICAgYGAnc2hhMjI0J2BgLCBgYCdzaGEzODQnYGAsICdgYHNoYTI1NidgYCwgYGAnbWQ1J2BgIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGBgJ3NoYTUxMidgYC4gSWYgbm8gaGFzaGVyIGlzIHNwZWNpZmllZCwgdGhlIGBgaGFzaGVyYGAKICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQuIElmIHRoZSBoYXNoZXIgaXMgZGV0ZXJtaW5lZCB0byBiZSBgYE5vbmVgYCwgTUQ1CiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhcyB0aGUgaGFzaGluZyBhbGdvcml0aG0uCiAgICAgICAgOnJldHVybnM6IFRoZSBoYXNoIG9mIHRoZSBkYXRhLiBJZiBhIGhhc2hlciB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCBoYXNoIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGhhc2hlcgogICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSAnPScuCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBpZiBoYXNoZXIgaXMgTm9uZToKICAgICAgICAgICAgaGFzaGVyID0gc2VsZi5oYXNoZXIKICAgICAgICBpZiBoYXNoZXIgaXMgTm9uZToKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGxpYi5tZDUKICAgICAgICAgICAgcHJlZml4ID0gJycKICAgICAgICBlbHNlOgogICAgICAgICAgICBoYXNoZXIgPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hlcikKICAgICAgICAgICAgcHJlZml4ID0gJyVzPScgJSBzZWxmLmhhc2hlcgogICAgICAgIGRpZ2VzdCA9IGhhc2hlcihkYXRhKS5kaWdlc3QoKQogICAgICAgIGRpZ2VzdCA9IGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gJyVzJXMnICUgKHByZWZpeCwgZGlnZXN0KQoKCmNsYXNzIEluc3RhbGxlZERpc3RyaWJ1dGlvbihCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgQ3JlYXRlZCB3aXRoIHRoZSAqcGF0aCogb2YgdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeSBwcm92aWRlZCB0byB0aGUKICAgIGNvbnN0cnVjdG9yLiBJdCByZWFkcyB0aGUgbWV0YWRhdGEgY29udGFpbmVkIGluIGBgcHlkaXN0Lmpzb25gYCB3aGVuIGl0IGlzCiAgICBpbnN0YW50aWF0ZWQuLCBvciB1c2VzIGEgcGFzc2VkIGluIE1ldGFkYXRhIGluc3RhbmNlICh1c2VmdWwgZm9yIHdoZW4KICAgIGRyeS1ydW4gbW9kZSBpcyBiZWluZyB1c2VkKS4KICAgICIiIgoKICAgIGhhc2hlciA9ICdzaGEyNTYnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIG1ldGFkYXRhPU5vbmUsIGVudj1Ob25lKToKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgocGF0aCkKICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSAoKQogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkIGFuZCBwYXRoIGluIGVudi5fY2FjaGUucGF0aDoKICAgICAgICAgICAgbWV0YWRhdGEgPSBlbnYuX2NhY2hlLnBhdGhbcGF0aF0ubWV0YWRhdGEKICAgICAgICBlbGlmIG1ldGFkYXRhIGlzIE5vbmU6CiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZChNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgIyBUZW1wb3JhcnkgLSBmb3IgV2hlZWwgMC4yMyBzdXBwb3J0CiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZChXSEVFTF9NRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgIyBUZW1wb3JhcnkgLSBmb3IgbGVnYWN5IHN1cHBvcnQKICAgICAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKCdNRVRBREFUQScpCiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25vICVzIGZvdW5kIGluICVzJyAlIChNRVRBREFUQV9GSUxFTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKSkKICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShmaWxlb2JqPXN0cmVhbSwgc2NoZW1lPSdsZWdhY3knKQoKICAgICAgICBzdXBlcihJbnN0YWxsZWREaXN0cmlidXRpb24sIHNlbGYpLl9faW5pdF9fKG1ldGFkYXRhLCBwYXRoLCBlbnYpCgogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICBlbnYuX2NhY2hlLmFkZChzZWxmKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnUkVRVUVTVEVEJykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UgKCkKICAgICAgICBzZWxmLnJlcXVlc3RlZCA9IHIgaXMgbm90IE5vbmUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8SW5zdGFsbGVkRGlzdHJpYnV0aW9uICVyICVzIGF0ICVyPicgJSAoCiAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzZWxmLnBhdGgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIF9nZXRfcmVjb3JkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIGZvciB0aGUgZGlzdHJpYnV0aW9uCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIHR1cGxlcyBvZiBwYXRoLCBoYXNoIGFuZCBzaXplLiBOb3RlIHRoYXQgaGFzaCBhbmQKICAgICAgICAgICAgICAgICBzaXplIG1pZ2h0IGJlIGBgTm9uZWBgIGZvciBzb21lIGVudHJpZXMuIFRoZSBwYXRoIGlzIGV4YWN0bHkKICAgICAgICAgICAgICAgICBhcyBzdG9yZWQgaW4gdGhlIGZpbGUgKHdoaWNoIGlzIGFzIGluIFBFUCAzNzYpLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdHMgPSBbXQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZSgnUkVDT1JEJykKICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1zdHJlYW0pIGFzIHJlY29yZF9yZWFkZXI6CiAgICAgICAgICAgICAgICAjIEJhc2UgbG9jYXRpb24gaXMgcGFyZW50IGRpciBvZiAuZGlzdC1pbmZvIGRpcgogICAgICAgICAgICAgICAgI2Jhc2VfbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgI2Jhc2VfbG9jYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9sb2NhdGlvbikKICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmVjb3JkX3JlYWRlcjoKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nID0gW05vbmUgZm9yIGkgaW4gcmFuZ2UobGVuKHJvdyksIDMpXQogICAgICAgICAgICAgICAgICAgIHBhdGgsIGNoZWNrc3VtLCBzaXplID0gcm93ICsgbWlzc2luZwogICAgICAgICAgICAgICAgICAgICNpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgICAgICAjICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy8nLCBvcy5zZXApCiAgICAgICAgICAgICAgICAgICAgIyAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2VfbG9jYXRpb24sIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKHBhdGgsIGNoZWNrc3VtLCBzaXplKSkKICAgICAgICByZXR1cm4gcmVzdWx0cwoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBleHBvcnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgaW5mb3JtYXRpb24gZXhwb3J0ZWQgYnkgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgOnJldHVybjogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvIGEgZGljdAogICAgICAgICAgICAgICAgIG9mIDpjbGFzczpgRXhwb3J0RW50cnlgIGluc3RhbmNlcyBkZXNjcmliaW5nIHRoZSBpbmRpdmlkdWFsCiAgICAgICAgICAgICAgICAgZXhwb3J0IGVudHJpZXMsIGFuZCBrZXllZCBieSBuYW1lLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKEVYUE9SVFNfRklMRU5BTUUpCiAgICAgICAgaWYgcjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZWFkX2V4cG9ydHMoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcmVhZF9leHBvcnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgZXhwb3J0cyBkYXRhIGZyb20gYSBmaWxlIGluIC5pbmkgZm9ybWF0LgoKICAgICAgICA6cmV0dXJuOiBBIGRpY3Rpb25hcnkgb2YgZXhwb3J0cywgbWFwcGluZyBhbiBleHBvcnQgY2F0ZWdvcnkgdG8gYSBsaXN0CiAgICAgICAgICAgICAgICAgb2YgOmNsYXNzOmBFeHBvcnRFbnRyeWAgaW5zdGFuY2VzIGRlc2NyaWJpbmcgdGhlIGluZGl2aWR1YWwKICAgICAgICAgICAgICAgICBleHBvcnQgZW50cmllcy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZShFWFBPUlRTX0ZJTEVOQU1FKQogICAgICAgIGlmIHI6CiAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRfZXhwb3J0cyhzdHJlYW0pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9leHBvcnRzKHNlbGYsIGV4cG9ydHMpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlIGEgZGljdGlvbmFyeSBvZiBleHBvcnRzIHRvIGEgZmlsZSBpbiAuaW5pIGZvcm1hdC4KICAgICAgICA6cGFyYW0gZXhwb3J0czogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIGEgbGlzdCBvZiA6Y2xhc3M6YEV4cG9ydEVudHJ5YCBpbnN0YW5jZXMgZGVzY3JpYmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBleHBvcnQgZW50cmllcy4KICAgICAgICAiIiIKICAgICAgICByZiA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoRVhQT1JUU19GSUxFTkFNRSkKICAgICAgICB3aXRoIG9wZW4ocmYsICd3JykgYXMgZjoKICAgICAgICAgICAgd3JpdGVfZXhwb3J0cyhleHBvcnRzLCBmKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfcGF0aChzZWxmLCByZWxhdGl2ZV9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBOT1RFOiBUaGlzIEFQSSBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCgogICAgICAgIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUKICAgICAgICBwYXRoLgoKICAgICAgICA6cGFyYW0gcmVsYXRpdmVfcGF0aDogVGhlIHBhdGgsIHJlbGF0aXZlIHRvIC5kaXN0LWluZm8sIG9mIHRoZSByZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBpbnRlcmVzdC4KICAgICAgICA6cmV0dXJuOiBUaGUgYWJzb2x1dGUgcGF0aCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgdG8gYmUgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKCdSRVNPVVJDRVMnKQogICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPXN0cmVhbSkgYXMgcmVzb3VyY2VzX3JlYWRlcjoKICAgICAgICAgICAgICAgIGZvciByZWxhdGl2ZSwgZGVzdGluYXRpb24gaW4gcmVzb3VyY2VzX3JlYWRlcjoKICAgICAgICAgICAgICAgICAgICBpZiByZWxhdGl2ZSA9PSByZWxhdGl2ZV9wYXRoOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb24KICAgICAgICByYWlzZSBLZXlFcnJvcignbm8gcmVzb3VyY2UgZmlsZSB3aXRoIHJlbGF0aXZlIHBhdGggJXIgJwogICAgICAgICAgICAgICAgICAgICAgICdpcyBpbnN0YWxsZWQnICUgcmVsYXRpdmVfcGF0aCkKCiAgICBkZWYgbGlzdF9pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBSRUNPUkRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIGEgdHVwbGUKICAgICAgICBgYChwYXRoLCBoYXNoLCBzaXplKWBgIGZvciBlYWNoIGxpbmUuCgogICAgICAgIDpyZXR1cm5zOiBpdGVyYXRvciBvZiAocGF0aCwgaGFzaCwgc2l6ZSkKICAgICAgICAiIiIKICAgICAgICBmb3IgcmVzdWx0IGluIHNlbGYuX2dldF9yZWNvcmRzKCk6CiAgICAgICAgICAgIHlpZWxkIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9pbnN0YWxsZWRfZmlsZXMoc2VsZiwgcGF0aHMsIHByZWZpeCwgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGVzIHRoZSBgYFJFQ09SRGBgIGZpbGUsIHVzaW5nIHRoZSBgYHBhdGhzYGAgaXRlcmFibGUgcGFzc2VkIGluLiBBbnkKICAgICAgICBleGlzdGluZyBgYFJFQ09SRGBgIGZpbGUgaXMgc2lsZW50bHkgb3ZlcndyaXR0ZW4uCgogICAgICAgIHByZWZpeCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVuIHRvIHdyaXRlIGFic29sdXRlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihwcmVmaXgsICcnKQogICAgICAgIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIGJhc2VfdW5kZXJfcHJlZml4ID0gYmFzZS5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKGJhc2UsICcnKQogICAgICAgIHJlY29yZF9wYXRoID0gc2VsZi5nZXRfZGlzdGluZm9fZmlsZSgnUkVDT1JEJykKICAgICAgICBsb2dnZXIuaW5mbygnY3JlYXRpbmcgJXMnLCByZWNvcmRfcGF0aCkKICAgICAgICBpZiBkcnlfcnVuOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHdpdGggQ1NWV3JpdGVyKHJlY29yZF9wYXRoKSBhcyB3cml0ZXI6CiAgICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKSBvciBwYXRoLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHB1dCBzaXplIGFuZCBoYXNoLCBhcyBpbiBQRVAtMzc2CiAgICAgICAgICAgICAgICAgICAgaGFzaF92YWx1ZSA9IHNpemUgPSAnJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzaXplID0gJyVkJyAlIG9zLnBhdGguZ2V0c2l6ZShwYXRoKQogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF92YWx1ZSA9IHNlbGYuZ2V0X2hhc2goZnAucmVhZCgpKQogICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGJhc2UpIG9yIChiYXNlX3VuZGVyX3ByZWZpeCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zdGFydHN3aXRoKHByZWZpeCkpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocGF0aCwgYmFzZSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocGF0aCwgaGFzaF92YWx1ZSwgc2l6ZSkpCgogICAgICAgICAgICAjIGFkZCB0aGUgUkVDT1JEIGZpbGUgaXRzZWxmCiAgICAgICAgICAgIGlmIHJlY29yZF9wYXRoLnN0YXJ0c3dpdGgoYmFzZSk6CiAgICAgICAgICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGgucmVscGF0aChyZWNvcmRfcGF0aCwgYmFzZSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWNvcmRfcGF0aCwgJycsICcnKSkKICAgICAgICByZXR1cm4gcmVjb3JkX3BhdGgKCiAgICBkZWYgY2hlY2tfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyB0aGF0IHRoZSBoYXNoZXMgYW5kIHNpemVzIG9mIHRoZSBmaWxlcyBpbiBgYFJFQ09SRGBgIGFyZQogICAgICAgIG1hdGNoZWQgYnkgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuIFJldHVybnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YKICAgICAgICBtaXNtYXRjaGVzLiBFYWNoIGVudHJ5IGluIHRoZSBtaXNtYXRjaCBsaXN0IHdpbGwgYmUgYSB0dXBsZSBjb25zaXN0aW5nCiAgICAgICAgb2YgdGhlIHBhdGgsICdleGlzdHMnLCAnc2l6ZScgb3IgJ2hhc2gnIGFjY29yZGluZyB0byB3aGF0IGRpZG4ndCBtYXRjaAogICAgICAgIChleGlzdGVuY2UgaXMgY2hlY2tlZCBmaXJzdCwgdGhlbiBzaXplLCB0aGVuIGhhc2gpLCB0aGUgZXhwZWN0ZWQKICAgICAgICB2YWx1ZSBhbmQgdGhlIGFjdHVhbCB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICByZWNvcmRfcGF0aCA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoJ1JFQ09SRCcpCiAgICAgICAgZm9yIHBhdGgsIGhhc2hfdmFsdWUsIHNpemUgaW4gc2VsZi5saXN0X2luc3RhbGxlZF9maWxlcygpOgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgcGF0aCkKICAgICAgICAgICAgaWYgcGF0aCA9PSByZWNvcmRfcGF0aDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnZXhpc3RzJywgVHJ1ZSwgRmFsc2UpKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgYWN0dWFsX3NpemUgPSBzdHIob3MucGF0aC5nZXRzaXplKHBhdGgpKQogICAgICAgICAgICAgICAgaWYgc2l6ZSBhbmQgYWN0dWFsX3NpemUgIT0gc2l6ZToKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ3NpemUnLCBzaXplLCBhY3R1YWxfc2l6ZSkpCiAgICAgICAgICAgICAgICBlbGlmIGhhc2hfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgaWYgJz0nIGluIGhhc2hfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlciA9IGhhc2hfdmFsdWUuc3BsaXQoJz0nLCAxKVswXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlciA9IE5vbmUKCiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9oYXNoID0gc2VsZi5nZXRfaGFzaChmLnJlYWQoKSwgaGFzaGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBhY3R1YWxfaGFzaCAhPSBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdoYXNoJywgaGFzaF92YWx1ZSwgYWN0dWFsX2hhc2gpKQogICAgICAgIHJldHVybiBtaXNtYXRjaGVzCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHNoYXJlZF9sb2NhdGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBkaWN0aW9uYXJ5IG9mIHNoYXJlZCBsb2NhdGlvbnMgd2hvc2Uga2V5cyBhcmUgaW4gdGhlIHNldCAncHJlZml4JywKICAgICAgICAncHVyZWxpYicsICdwbGF0bGliJywgJ3NjcmlwdHMnLCAnaGVhZGVycycsICdkYXRhJyBhbmQgJ25hbWVzcGFjZScuCiAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhhdCBjYXRlZ29yeSBmb3IKICAgICAgICB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIHRha2VzIGludG8gYWNjb3VudCBhbnkgcGF0aHMgc2VsZWN0ZWQgYnkgdGhlCiAgICAgICAgdXNlciBhdCBpbnN0YWxsYXRpb24gdGltZSAoZS5nLiB2aWEgY29tbWFuZC1saW5lIGFyZ3VtZW50cykuIEluIHRoZQogICAgICAgIGNhc2Ugb2YgdGhlICduYW1lc3BhY2UnIGtleSwgdGhpcyB3b3VsZCBiZSBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMKICAgICAgICBmb3IgdGhlIHJvb3RzIG9mIG5hbWVzcGFjZSBwYWNrYWdlcyBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgVGhlIGZpcnN0IHRpbWUgdGhpcyBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzCiAgICAgICAgcmVhZCBmcm9tIHRoZSBTSEFSRUQgZmlsZSBpbiB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBzaGFyZWRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdTSEFSRUQnKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNoYXJlZF9wYXRoKToKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihzaGFyZWRfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ25hbWVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldGRlZmF1bHQoa2V5LCBbXSkuYXBwZW5kKHZhbHVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9zaGFyZWRfbG9jYXRpb25zKHNlbGYsIHBhdGhzLCBkcnlfcnVuPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSBzaGFyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIFNIQVJFRCBmaWxlIGluIC5kaXN0LWluZm8uCiAgICAgICAgOnBhcmFtIHBhdGhzOiBBIGRpY3Rpb25hcnkgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgogICAgICAgIDptZXRoOmBzaGFyZWRfbG9jYXRpb25zYC4KICAgICAgICA6cGFyYW0gZHJ5X3J1bjogSWYgVHJ1ZSwgdGhlIGFjdGlvbiBpcyBsb2dnZWQgYnV0IG5vIGZpbGUgaXMgYWN0dWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KICAgICAgICA6cmV0dXJuOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB3cml0dGVuIHRvLgogICAgICAgICIiIgogICAgICAgIHNoYXJlZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ1NIQVJFRCcpCiAgICAgICAgbG9nZ2VyLmluZm8oJ2NyZWF0aW5nICVzJywgc2hhcmVkX3BhdGgpCiAgICAgICAgaWYgZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGtleSBpbiAoJ3ByZWZpeCcsICdsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKToKICAgICAgICAgICAgcGF0aCA9IHBhdGhzW2tleV0KICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoc1trZXldKToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM9JXMnICUgKGtleSwgIHBhdGgpKQogICAgICAgIGZvciBucyBpbiBwYXRocy5nZXQoJ25hbWVzcGFjZScsICgpKToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKCduYW1lc3BhY2U9JXMnICUgbnMpCgogICAgICAgIHdpdGggY29kZWNzLm9wZW4oc2hhcmVkX3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obGluZXMpKQogICAgICAgIHJldHVybiBzaGFyZWRfcGF0aAoKICAgIGRlZiBnZXRfZGlzdGluZm9fcmVzb3VyY2Uoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgcGF0aCBub3QgaW4gRElTVF9GSUxFUzoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBwYXRoIGZvciBhIGRpc3QtaW5mbyBmaWxlOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlIChwYXRoLCBzZWxmLnBhdGgpKQogICAgICAgIGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgoc2VsZi5wYXRoKQogICAgICAgIGlmIGZpbmRlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gZ2V0IGEgZmluZGVyIGZvciAlcycgJSBzZWxmLnBhdGgpCiAgICAgICAgcmV0dXJuIGZpbmRlci5maW5kKHBhdGgpCgogICAgZGVmIGdldF9kaXN0aW5mb19maWxlKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBwYXRoIGxvY2F0ZWQgdW5kZXIgdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeS4gUmV0dXJucyBhCiAgICAgICAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aC4KCiAgICAgICAgOnBhcmFtZXRlciBwYXRoOiBhIGBgJy8nYGAtc2VwYXJhdGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBgYC5kaXN0LWluZm9gYCBkaXJlY3Rvcnkgb3IgYW4gYWJzb2x1dGUgcGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIElmICpwYXRoKiBpcyBhbiBhYnNvbHV0ZSBwYXRoIGFuZCBkb2Vzbid0IHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGEgOmNsYXNzOmBEaXN0bGliRXhjZXB0aW9uYCBpcyByYWlzZWQKICAgICAgICA6dHlwZSBwYXRoOiBzdHIKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgaWYgaXQgaXMgYW4gYWJzb2x1dGUgcGF0aCAgIyBYWFggdXNlIHJlbHBhdGgsIGFkZCB0ZXN0cwogICAgICAgIGlmIHBhdGguZmluZChvcy5zZXApID49IDA6CiAgICAgICAgICAgICMgaXQncyBhbiBhYnNvbHV0ZSBwYXRoPwogICAgICAgICAgICBkaXN0aW5mb19kaXJuYW1lLCBwYXRoID0gcGF0aC5zcGxpdChvcy5zZXApWy0yOl0KICAgICAgICAgICAgaWYgZGlzdGluZm9fZGlybmFtZSAhPSBzZWxmLnBhdGguc3BsaXQob3Muc2VwKVstMV06CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICdkaXN0LWluZm8gZmlsZSAlciBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlICVyICVzICcKICAgICAgICAgICAgICAgICAgICAnZGlzdHJpYnV0aW9uJyAlIChwYXRoLCBzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikpCgogICAgICAgICMgVGhlIGZpbGUgbXVzdCBiZSByZWxhdGl2ZQogICAgICAgIGlmIHBhdGggbm90IGluIERJU1RfRklMRVM6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgcGF0aCBmb3IgYSBkaXN0LWluZm8gZmlsZTogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAocGF0aCwgc2VsZi5wYXRoKSkKCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIHBhdGgpCgogICAgZGVmIGxpc3RfZGlzdGluZm9fZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBSRUNPUkRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIHBhdGhzIGZvciBlYWNoIGxpbmUgaWYKICAgICAgICB0aGUgcGF0aCBpcyBwb2ludGluZyB0byBhIGZpbGUgbG9jYXRlZCBpbiB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5CiAgICAgICAgb3Igb25lIG9mIGl0cyBzdWJkaXJlY3Rvcmllcy4KCiAgICAgICAgOnJldHVybnM6IGl0ZXJhdG9yIG9mIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgZm9yIHBhdGgsIGNoZWNrc3VtLCBzaXplIGluIHNlbGYuX2dldF9yZWNvcmRzKCk6CiAgICAgICAgICAgICMgWFhYIGFkZCBzZXBhcmF0b3Igb3IgdXNlIHJlYWwgcmVscGF0aCBhbGdvCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBwYXRoKQogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoc2VsZi5wYXRoKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGgKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uob3RoZXIsIEluc3RhbGxlZERpc3RyaWJ1dGlvbikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPT0gb3RoZXIucGF0aCkKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAiIiJDcmVhdGVkIHdpdGggdGhlICpwYXRoKiBvZiB0aGUgYGAuZWdnLWluZm9gYCBkaXJlY3Rvcnkgb3IgZmlsZSBwcm92aWRlZAogICAgdG8gdGhlIGNvbnN0cnVjdG9yLiBJdCByZWFkcyB0aGUgbWV0YWRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGl0c2VsZiwgb3IKICAgIGlmIHRoZSBnaXZlbiBwYXRoIGhhcHBlbnMgdG8gYmUgYSBkaXJlY3RvcnksIHRoZSBtZXRhZGF0YSBpcyByZWFkIGZyb20gdGhlCiAgICBmaWxlIGBgUEtHLUlORk9gYCB1bmRlciB0aGF0IGRpcmVjdG9yeS4iIiIKCiAgICByZXF1ZXN0ZWQgPSBUcnVlICAgICMgYXMgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZywgYXNzdW1lIGl0IHdhcwogICAgc2hhcmVkX2xvY2F0aW9ucyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVudj1Ob25lKToKICAgICAgICBkZWYgc2V0X25hbWVfYW5kX3ZlcnNpb24ocywgbiwgdik6CiAgICAgICAgICAgIHMubmFtZSA9IG4KICAgICAgICAgICAgcy5rZXkgPSBuLmxvd2VyKCkgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgICAgIHMudmVyc2lvbiA9IHYKCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZGlzdF9wYXRoID0gZW52CiAgICAgICAgaWYgZW52IGFuZCBlbnYuX2NhY2hlX2VuYWJsZWQgYW5kIHBhdGggaW4gZW52Ll9jYWNoZV9lZ2cucGF0aDoKICAgICAgICAgICAgbWV0YWRhdGEgPSBlbnYuX2NhY2hlX2VnZy5wYXRoW3BhdGhdLm1ldGFkYXRhCiAgICAgICAgICAgIHNldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLl9nZXRfbWV0YWRhdGEocGF0aCkKCiAgICAgICAgICAgICMgTmVlZCB0byBiZSBzZXQgYmVmb3JlIGNhY2hpbmcKICAgICAgICAgICAgc2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZiwgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbikKCiAgICAgICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICAgICAgZW52Ll9jYWNoZV9lZ2cuYWRkKHNlbGYpCiAgICAgICAgc3VwZXIoRWdnSW5mb0Rpc3RyaWJ1dGlvbiwgc2VsZikuX19pbml0X18obWV0YWRhdGEsIHBhdGgsIGVudikKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBwYXRoKToKICAgICAgICByZXF1aXJlcyA9IE5vbmUKCiAgICAgICAgZGVmIHBhcnNlX3JlcXVpcmVzX2RhdGEoZGF0YSk6CiAgICAgICAgICAgICIiIkNyZWF0ZSBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZyb20gYSByZXF1aXJlcy50eHQgZmlsZS4KCiAgICAgICAgICAgICpkYXRhKjogdGhlIGNvbnRlbnRzIG9mIGEgc2V0dXB0b29scy1wcm9kdWNlZCByZXF1aXJlcy50eHQgZmlsZS4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdbJyk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuZXhwZWN0ZWQgbGluZTogcXVpdHRpbmcgcmVxdWlyZW1lbnQgc2NhbjogJXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChsaW5lKQogICAgICAgICAgICAgICAgaWYgbm90IHI6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ05vdCByZWNvZ25pc2VkIGFzIGEgcmVxdWlyZW1lbnQ6ICVyJywgbGluZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgci5leHRyYXM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2V4dHJhIHJlcXVpcmVtZW50cyBpbiByZXF1aXJlcy50eHQgYXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90IHN1cHBvcnRlZCcpCiAgICAgICAgICAgICAgICBpZiBub3Qgci5jb25zdHJhaW50czoKICAgICAgICAgICAgICAgICAgICByZXFzLmFwcGVuZChyLm5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnMgPSAnLCAnLmpvaW4oJyVzJXMnICUgYyBmb3IgYyBpbiByLmNvbnN0cmFpbnRzKQogICAgICAgICAgICAgICAgICAgIHJlcXMuYXBwZW5kKCclcyAoJXMpJyAlIChyLm5hbWUsIGNvbnMpKQogICAgICAgICAgICByZXR1cm4gcmVxcwoKICAgICAgICBkZWYgcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCk6CiAgICAgICAgICAgICIiIkNyZWF0ZSBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZyb20gYSByZXF1aXJlcy50eHQgZmlsZS4KCiAgICAgICAgICAgICpyZXFfcGF0aCo6IHRoZSBwYXRoIHRvIGEgc2V0dXB0b29scy1wcm9kdWNlZCByZXF1aXJlcy50eHQgZmlsZS4KICAgICAgICAgICAgIiIiCgogICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihyZXFfcGF0aCwgJ3InLCAndXRmLTgnKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZXNfZGF0YShmcC5yZWFkKCkpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4gcmVxcwoKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcuZWdnJyk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBtZXRhX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJywgJ1BLRy1JTkZPJykKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEocGF0aD1tZXRhX3BhdGgsIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdyZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19wYXRoKHJlcV9wYXRoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGSVhNRSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgemlwZmlsZSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICB6aXBmID0gemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGgpCiAgICAgICAgICAgICAgICBmaWxlb2JqID0gU3RyaW5nSU8oCiAgICAgICAgICAgICAgICAgICAgemlwZi5nZXRfZGF0YSgnRUdHLUlORk8vUEtHLUlORk8nKS5kZWNvZGUoJ3V0ZjgnKSkKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1maWxlb2JqLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHppcGYuZ2V0X2RhdGEoJ0VHRy1JTkZPL3JlcXVpcmVzLnR4dCcpCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19kYXRhKGRhdGEuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBOb25lCiAgICAgICAgZWxpZiBwYXRoLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdyZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19wYXRoKHJlcV9wYXRoKQogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnUEtHLUlORk8nKQogICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKHBhdGg9cGF0aCwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3BhdGggbXVzdCBlbmQgd2l0aCAuZWdnLWluZm8gb3IgLmVnZywgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3QgJXInICUgcGF0aCkKCiAgICAgICAgaWYgcmVxdWlyZXM6CiAgICAgICAgICAgIG1ldGFkYXRhLmFkZF9yZXF1aXJlbWVudHMocmVxdWlyZXMpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPEVnZ0luZm9EaXN0cmlidXRpb24gJXIgJXMgYXQgJXI+JyAlICgKICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIHNlbGYucGF0aCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKCiAgICBkZWYgY2hlY2tfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyB0aGF0IHRoZSBoYXNoZXMgYW5kIHNpemVzIG9mIHRoZSBmaWxlcyBpbiBgYFJFQ09SRGBgIGFyZQogICAgICAgIG1hdGNoZWQgYnkgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuIFJldHVybnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YKICAgICAgICBtaXNtYXRjaGVzLiBFYWNoIGVudHJ5IGluIHRoZSBtaXNtYXRjaCBsaXN0IHdpbGwgYmUgYSB0dXBsZSBjb25zaXN0aW5nCiAgICAgICAgb2YgdGhlIHBhdGgsICdleGlzdHMnLCAnc2l6ZScgb3IgJ2hhc2gnIGFjY29yZGluZyB0byB3aGF0IGRpZG4ndCBtYXRjaAogICAgICAgIChleGlzdGVuY2UgaXMgY2hlY2tlZCBmaXJzdCwgdGhlbiBzaXplLCB0aGVuIGhhc2gpLCB0aGUgZXhwZWN0ZWQKICAgICAgICB2YWx1ZSBhbmQgdGhlIGFjdHVhbCB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfcGF0aCk6CiAgICAgICAgICAgIGZvciBwYXRoLCBfLCBfIGluIHNlbGYubGlzdF9pbnN0YWxsZWRfZmlsZXMoKToKICAgICAgICAgICAgICAgIGlmIHBhdGggPT0gcmVjb3JkX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ2V4aXN0cycsIFRydWUsIEZhbHNlKSkKICAgICAgICByZXR1cm4gbWlzbWF0Y2hlcwoKICAgIGRlZiBsaXN0X2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYGluc3RhbGxlZC1maWxlcy50eHRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIGEgdHVwbGUKICAgICAgICBgYChwYXRoLCBoYXNoLCBzaXplKWBgIGZvciBlYWNoIGxpbmUuCgogICAgICAgIDpyZXR1cm5zOiBhIGxpc3Qgb2YgKHBhdGgsIGhhc2gsIHNpemUpCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfbWQ1KHBhdGgpOgogICAgICAgICAgICBmID0gb3BlbihwYXRoLCAncmInKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoY29udGVudCkuaGV4ZGlnZXN0KCkKCiAgICAgICAgZGVmIF9zaXplKHBhdGgpOgogICAgICAgICAgICByZXR1cm4gb3Muc3RhdChwYXRoKS5zdF9zaXplCgogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX3BhdGgpOgogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHJlY29yZF9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBsaW5lKSkKICAgICAgICAgICAgICAgICAgICAjICIuLyIgaXMgcHJlc2VudCBhcyBhIG1hcmtlciBiZXR3ZWVuIGluc3RhbGxlZCBmaWxlcwogICAgICAgICAgICAgICAgICAgICMgYW5kIGluc3RhbGxhdGlvbiBtZXRhZGF0YSBmaWxlcwogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ05vbi1leGlzdGVudCBmaWxlOiAlcycsIHApCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAuZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICAjb3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCBhbmQgZmFpbAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHApOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChwLCBfbWQ1KHApLCBfc2l6ZShwKSkpCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHJlY29yZF9wYXRoLCBOb25lLCBOb25lKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGxpc3RfZGlzdGluZm9fZmlsZXMoc2VsZiwgYWJzb2x1dGU9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgaW5zdGFsbGVkLWZpbGVzLnR4dGBgIGVudHJpZXMgYW5kIHJldHVybnMgcGF0aHMgZm9yCiAgICAgICAgZWFjaCBsaW5lIGlmIHRoZSBwYXRoIGlzIHBvaW50aW5nIHRvIGEgZmlsZSBsb2NhdGVkIGluIHRoZQogICAgICAgIGBgLmVnZy1pbmZvYGAgZGlyZWN0b3J5IG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMuCgogICAgICAgIDpwYXJhbWV0ZXIgYWJzb2x1dGU6IElmICphYnNvbHV0ZSogaXMgYGBUcnVlYGAsIGVhY2ggcmV0dXJuZWQgcGF0aCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIGludG8gYSBsb2NhbCBhYnNvbHV0ZSBwYXRoLiBPdGhlcndpc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3IHZhbHVlIGZyb20gYGBpbnN0YWxsZWQtZmlsZXMudHh0YGAgaXMgcmV0dXJuZWQuCiAgICAgICAgOnR5cGUgYWJzb2x1dGU6IGJvb2xlYW4KICAgICAgICA6cmV0dXJuczogaXRlcmF0b3Igb2YgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgIHdpdGggY29kZWNzLm9wZW4ocmVjb3JkX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJy4vJzoKICAgICAgICAgICAgICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbm90IHNraXA6CiAgICAgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYucGF0aCwgbGluZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgcC5zdGFydHN3aXRoKHNlbGYucGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFic29sdXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoaXNpbnN0YW5jZShvdGhlciwgRWdnSW5mb0Rpc3RyaWJ1dGlvbikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPT0gb3RoZXIucGF0aCkKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKbmV3X2Rpc3RfY2xhc3MgPSBJbnN0YWxsZWREaXN0cmlidXRpb24Kb2xkX2Rpc3RfY2xhc3MgPSBFZ2dJbmZvRGlzdHJpYnV0aW9uCgoKY2xhc3MgRGVwZW5kZW5jeUdyYXBoKG9iamVjdCk6CiAgICAiIiIKICAgIFJlcHJlc2VudHMgYSBkZXBlbmRlbmN5IGdyYXBoIGJldHdlZW4gZGlzdHJpYnV0aW9ucy4KCiAgICBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIGFyZSBzdG9yZWQgaW4gYW4gYGBhZGphY2VuY3lfbGlzdGBgIHRoYXQgbWFwcwogICAgZGlzdHJpYnV0aW9ucyB0byBhIGxpc3Qgb2YgYGAob3RoZXIsIGxhYmVsKWBgIHR1cGxlcyB3aGVyZSAgYGBvdGhlcmBgCiAgICBpcyBhIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGVkZ2UgaXMgbGFiZWxlZCB3aXRoIGBgbGFiZWxgYCAoaS5lLiB0aGUgdmVyc2lvbgogICAgc3BlY2lmaWVyLCBpZiBzdWNoIHdhcyBwcm92aWRlZCkuIEFsc28sIGZvciBtb3JlIGVmZmljaWVudCB0cmF2ZXJzYWwsIGZvcgogICAgZXZlcnkgZGlzdHJpYnV0aW9uIGBgeGBgLCBhIGxpc3Qgb2YgcHJlZGVjZXNzb3JzIGlzIGtlcHQgaW4KICAgIGBgcmV2ZXJzZV9saXN0W3hdYGAuIEFuIGVkZ2UgZnJvbSBkaXN0cmlidXRpb24gYGBhYGAgdG8KICAgIGRpc3RyaWJ1dGlvbiBgYGJgYCBtZWFucyB0aGF0IGBgYWBgIGRlcGVuZHMgb24gYGBiYGAuIElmIGFueSBtaXNzaW5nCiAgICBkZXBlbmRlbmNpZXMgYXJlIGZvdW5kLCB0aGV5IGFyZSBzdG9yZWQgaW4gYGBtaXNzaW5nYGAsIHdoaWNoIGlzIGEKICAgIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGRpc3RyaWJ1dGlvbnMgdG8gYSBsaXN0IG9mIHJlcXVpcmVtZW50cyB0aGF0IHdlcmUgbm90CiAgICBwcm92aWRlZCBieSBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmFkamFjZW5jeV9saXN0ID0ge30KICAgICAgICBzZWxmLnJldmVyc2VfbGlzdCA9IHt9CiAgICAgICAgc2VsZi5taXNzaW5nID0ge30KCiAgICBkZWYgYWRkX2Rpc3RyaWJ1dGlvbihzZWxmLCBkaXN0cmlidXRpb24pOgogICAgICAgICIiIkFkZCB0aGUgKmRpc3RyaWJ1dGlvbiogdG8gdGhlIGdyYXBoLgoKICAgICAgICA6dHlwZSBkaXN0cmlidXRpb246IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICAiIiIKICAgICAgICBzZWxmLmFkamFjZW5jeV9saXN0W2Rpc3RyaWJ1dGlvbl0gPSBbXQogICAgICAgIHNlbGYucmV2ZXJzZV9saXN0W2Rpc3RyaWJ1dGlvbl0gPSBbXQogICAgICAgICNzZWxmLm1pc3NpbmdbZGlzdHJpYnV0aW9uXSA9IFtdCgogICAgZGVmIGFkZF9lZGdlKHNlbGYsIHgsIHksIGxhYmVsPU5vbmUpOgogICAgICAgICIiIkFkZCBhbiBlZGdlIGZyb20gZGlzdHJpYnV0aW9uICp4KiB0byBkaXN0cmlidXRpb24gKnkqIHdpdGggdGhlIGdpdmVuCiAgICAgICAgKmxhYmVsKi4KCiAgICAgICAgOnR5cGUgeDogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgb3IKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICA6dHlwZSB5OiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBvcgogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgIDp0eXBlIGxhYmVsOiBgYHN0cmBgIG9yIGBgTm9uZWBgCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdFt4XS5hcHBlbmQoKHksIGxhYmVsKSkKICAgICAgICAjIG11bHRpcGxlIGVkZ2VzIGFyZSBhbGxvd2VkLCBzbyBiZSBjYXJlZnVsCiAgICAgICAgaWYgeCBub3QgaW4gc2VsZi5yZXZlcnNlX2xpc3RbeV06CiAgICAgICAgICAgIHNlbGYucmV2ZXJzZV9saXN0W3ldLmFwcGVuZCh4KQoKICAgIGRlZiBhZGRfbWlzc2luZyhzZWxmLCBkaXN0cmlidXRpb24sIHJlcXVpcmVtZW50KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBtaXNzaW5nICpyZXF1aXJlbWVudCogZm9yIHRoZSBnaXZlbiAqZGlzdHJpYnV0aW9uKi4KCiAgICAgICAgOnR5cGUgZGlzdHJpYnV0aW9uOiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgOnR5cGUgcmVxdWlyZW1lbnQ6IGBgc3RyYGAKICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJyVzIG1pc3NpbmcgJXInLCBkaXN0cmlidXRpb24sIHJlcXVpcmVtZW50KQogICAgICAgIHNlbGYubWlzc2luZy5zZXRkZWZhdWx0KGRpc3RyaWJ1dGlvbiwgW10pLmFwcGVuZChyZXF1aXJlbWVudCkKCiAgICBkZWYgX3JlcHJfZGlzdChzZWxmLCBkaXN0KToKICAgICAgICByZXR1cm4gJyVzICVzJyAlIChkaXN0Lm5hbWUsIGRpc3QudmVyc2lvbikKCiAgICBkZWYgcmVwcl9ub2RlKHNlbGYsIGRpc3QsIGxldmVsPTEpOgogICAgICAgICIiIlByaW50cyBvbmx5IGEgc3ViZ3JhcGgiIiIKICAgICAgICBvdXRwdXQgPSBbc2VsZi5fcmVwcl9kaXN0KGRpc3QpXQogICAgICAgIGZvciBvdGhlciwgbGFiZWwgaW4gc2VsZi5hZGphY2VuY3lfbGlzdFtkaXN0XToKICAgICAgICAgICAgZGlzdCA9IHNlbGYuX3JlcHJfZGlzdChvdGhlcikKICAgICAgICAgICAgaWYgbGFiZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBkaXN0ID0gJyVzIFslc10nICUgKGRpc3QsIGxhYmVsKQogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCcgICAgJyAqIGxldmVsICsgc3RyKGRpc3QpKQogICAgICAgICAgICBzdWJvdXRwdXQgPSBzZWxmLnJlcHJfbm9kZShvdGhlciwgbGV2ZWwgKyAxKQogICAgICAgICAgICBzdWJzID0gc3Vib3V0cHV0LnNwbGl0KCdcbicpCiAgICAgICAgICAgIG91dHB1dC5leHRlbmQoc3Vic1sxOl0pCiAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpCgogICAgZGVmIHRvX2RvdChzZWxmLCBmLCBza2lwX2Rpc2Nvbm5lY3RlZD1UcnVlKToKICAgICAgICAiIiJXcml0ZXMgYSBET1Qgb3V0cHV0IGZvciB0aGUgZ3JhcGggdG8gdGhlIHByb3ZpZGVkIGZpbGUgKmYqLgoKICAgICAgICBJZiAqc2tpcF9kaXNjb25uZWN0ZWQqIGlzIHNldCB0byBgYFRydWVgYCwgdGhlbiBhbGwgZGlzdHJpYnV0aW9ucwogICAgICAgIHRoYXQgYXJlIG5vdCBkZXBlbmRlbnQgb24gYW55IG90aGVyIGRpc3RyaWJ1dGlvbiBhcmUgc2tpcHBlZC4KCiAgICAgICAgOnR5cGUgZjogaGFzIHRvIHN1cHBvcnQgYGBmaWxlYGAtbGlrZSBvcGVyYXRpb25zCiAgICAgICAgOnR5cGUgc2tpcF9kaXNjb25uZWN0ZWQ6IGBgYm9vbGBgCiAgICAgICAgIiIiCiAgICAgICAgZGlzY29ubmVjdGVkID0gW10KCiAgICAgICAgZi53cml0ZSgiZGlncmFwaCBkZXBlbmRlbmNpZXMge1xuIikKICAgICAgICBmb3IgZGlzdCwgYWRqcyBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGxlbihhZGpzKSA9PSAwIGFuZCBub3Qgc2tpcF9kaXNjb25uZWN0ZWQ6CiAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGZvciBvdGhlciwgbGFiZWwgaW4gYWRqczoKICAgICAgICAgICAgICAgIGlmIG5vdCBsYWJlbCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyIlcyIgLT4gIiVzIiBbbGFiZWw9IiVzIl1cbicgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc3QubmFtZSwgb3RoZXIubmFtZSwgbGFiZWwpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiIC0+ICIlcyJcbicgJSAoZGlzdC5uYW1lLCBvdGhlci5uYW1lKSkKICAgICAgICBpZiBub3Qgc2tpcF9kaXNjb25uZWN0ZWQgYW5kIGxlbihkaXNjb25uZWN0ZWQpID4gMDoKICAgICAgICAgICAgZi53cml0ZSgnc3ViZ3JhcGggZGlzY29ubmVjdGVkIHtcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ2xhYmVsID0gIkRpc2Nvbm5lY3RlZCJcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ2JnY29sb3IgPSByZWRcbicpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXNjb25uZWN0ZWQ6CiAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiJyAlIGRpc3QubmFtZSkKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKICAgICAgICBmLndyaXRlKCd9XG4nKQoKICAgIGRlZiB0b3BvbG9naWNhbF9zb3J0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBlcmZvcm0gYSB0b3BvbG9naWNhbCBzb3J0IG9mIHRoZSBncmFwaC4KICAgICAgICA6cmV0dXJuOiBBIHR1cGxlLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB3aGljaCBpcyBhIHRvcG9sb2dpY2FsbHkgc29ydGVkCiAgICAgICAgICAgICAgICAgbGlzdCBvZiBkaXN0cmlidXRpb25zLCBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKICAgICAgICAgICAgICAgICBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBjYW5ub3QgYmUgc29ydGVkIGJlY2F1c2UgdGhleSBoYXZlCiAgICAgICAgICAgICAgICAgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBzbyBmb3JtIGEgY3ljbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAjIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFkamFjZW5jeSBsaXN0CiAgICAgICAgYWxpc3QgPSB7fQogICAgICAgIGZvciBrLCB2IGluIHNlbGYuYWRqYWNlbmN5X2xpc3QuaXRlbXMoKToKICAgICAgICAgICAgYWxpc3Rba10gPSB2WzpdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBTZWUgd2hhdCB3ZSBjYW4gcmVtb3ZlIGluIHRoaXMgcnVuCiAgICAgICAgICAgIHRvX3JlbW92ZSA9IFtdCiAgICAgICAgICAgIGZvciBrLCB2IGluIGxpc3QoYWxpc3QuaXRlbXMoKSlbOl06CiAgICAgICAgICAgICAgICBpZiBub3QgdjoKICAgICAgICAgICAgICAgICAgICB0b19yZW1vdmUuYXBwZW5kKGspCiAgICAgICAgICAgICAgICAgICAgZGVsIGFsaXN0W2tdCiAgICAgICAgICAgIGlmIG5vdCB0b19yZW1vdmU6CiAgICAgICAgICAgICAgICAjIFdoYXQncyBsZWZ0IGluIGFsaXN0IChpZiBhbnl0aGluZykgaXMgYSBjeWNsZS4KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgUmVtb3ZlIGZyb20gdGhlIGFkamFjZW5jeSBsaXN0IG9mIG90aGVycwogICAgICAgICAgICBmb3IgaywgdiBpbiBhbGlzdC5pdGVtcygpOgogICAgICAgICAgICAgICAgYWxpc3Rba10gPSBbKGQsIHIpIGZvciBkLCByIGluIHYgaWYgZCBub3QgaW4gdG9fcmVtb3ZlXQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ01vdmluZyB0byByZXN1bHQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgIFsnJXMgKCVzKScgJSAoZC5uYW1lLCBkLnZlcnNpb24pIGZvciBkIGluIHRvX3JlbW92ZV0pCiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQodG9fcmVtb3ZlKQogICAgICAgIHJldHVybiByZXN1bHQsIGxpc3QoYWxpc3Qua2V5cygpKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiJSZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhcGgiIiIKICAgICAgICBvdXRwdXQgPSBbXQogICAgICAgIGZvciBkaXN0LCBhZGpzIGluIHNlbGYuYWRqYWNlbmN5X2xpc3QuaXRlbXMoKToKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChzZWxmLnJlcHJfbm9kZShkaXN0KSkKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKG91dHB1dCkKCgpkZWYgbWFrZV9ncmFwaChkaXN0cywgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAiIiJNYWtlcyBhIGRlcGVuZGVuY3kgZ3JhcGggZnJvbSB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9ucy4KCiAgICA6cGFyYW1ldGVyIGRpc3RzOiBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucwogICAgOnR5cGUgZGlzdHM6IGxpc3Qgb2YgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgYW5kCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gIGluc3RhbmNlcwogICAgOnJ0eXBlOiBhIDpjbGFzczpgRGVwZW5kZW5jeUdyYXBoYCBpbnN0YW5jZQogICAgIiIiCiAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNjaGVtZSkKICAgIGdyYXBoID0gRGVwZW5kZW5jeUdyYXBoKCkKICAgIHByb3ZpZGVkID0ge30gICMgbWFwcyBuYW1lcyB0byBsaXN0cyBvZiAodmVyc2lvbiwgZGlzdCkgdHVwbGVzCgogICAgIyBmaXJzdCwgYnVpbGQgdGhlIGdyYXBoIGFuZCBmaW5kIG91dCB3aGF0J3MgcHJvdmlkZWQKICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgIGdyYXBoLmFkZF9kaXN0cmlidXRpb24oZGlzdCkKCiAgICAgICAgZm9yIHAgaW4gZGlzdC5wcm92aWRlczoKICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGQgdG8gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBwcm92aWRlZC5zZXRkZWZhdWx0KG5hbWUsIFtdKS5hcHBlbmQoKHZlcnNpb24sIGRpc3QpKQoKICAgICMgbm93IG1ha2UgdGhlIGVkZ2VzCiAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICByZXF1aXJlcyA9IChkaXN0LnJ1bl9yZXF1aXJlcyB8IGRpc3QubWV0YV9yZXF1aXJlcyB8CiAgICAgICAgICAgICAgICAgICAgZGlzdC5idWlsZF9yZXF1aXJlcyB8IGRpc3QuZGV2X3JlcXVpcmVzKQogICAgICAgIGZvciByZXEgaW4gcmVxdWlyZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyZXEpCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgICMgWFhYIGNvbXBhdC1tb2RlIGlmIGNhbm5vdCByZWFkIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnY291bGQgbm90IHJlYWQgdmVyc2lvbiAlciAtIHVzaW5nIG5hbWUgb25seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEpCiAgICAgICAgICAgICAgICBuYW1lID0gcmVxLnNwbGl0KClbMF0KICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihuYW1lKQoKICAgICAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCgogICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgaWYgbmFtZSBpbiBwcm92aWRlZDoKICAgICAgICAgICAgICAgIGZvciB2ZXJzaW9uLCBwcm92aWRlciBpbiBwcm92aWRlZFtuYW1lXToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlci5tYXRjaCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQoKICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGguYWRkX2VkZ2UoZGlzdCwgcHJvdmlkZXIsIHJlcSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbm90IG1hdGNoZWQ6CiAgICAgICAgICAgICAgICBncmFwaC5hZGRfbWlzc2luZyhkaXN0LCByZXEpCiAgICByZXR1cm4gZ3JhcGgKCgpkZWYgZ2V0X2RlcGVuZGVudF9kaXN0cyhkaXN0cywgZGlzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBnZW5lcmF0ZSBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmcm9tICpkaXN0cyogdGhhdCBhcmUKICAgIGRlcGVuZGVudCBvbiAqZGlzdCouCgogICAgOnBhcmFtIGRpc3RzOiBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucwogICAgOnBhcmFtIGRpc3Q6IGEgZGlzdHJpYnV0aW9uLCBtZW1iZXIgb2YgKmRpc3RzKiBmb3Igd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQKICAgICIiIgogICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZ2l2ZW4gZGlzdHJpYnV0aW9uICVyIGlzIG5vdCBhIG1lbWJlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgdGhlIGxpc3QnICUgZGlzdC5uYW1lKQogICAgZ3JhcGggPSBtYWtlX2dyYXBoKGRpc3RzKQoKICAgIGRlcCA9IFtkaXN0XSAgIyBkZXBlbmRlbnQgZGlzdHJpYnV0aW9ucwogICAgdG9kbyA9IGdyYXBoLnJldmVyc2VfbGlzdFtkaXN0XSAgIyBsaXN0IG9mIG5vZGVzIHdlIHNob3VsZCBpbnNwZWN0CgogICAgd2hpbGUgdG9kbzoKICAgICAgICBkID0gdG9kby5wb3AoKQogICAgICAgIGRlcC5hcHBlbmQoZCkKICAgICAgICBmb3Igc3VjYyBpbiBncmFwaC5yZXZlcnNlX2xpc3RbZF06CiAgICAgICAgICAgIGlmIHN1Y2Mgbm90IGluIGRlcDoKICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKHN1Y2MpCgogICAgZGVwLnBvcCgwKSAgIyByZW1vdmUgZGlzdCBmcm9tIGRlcCwgd2FzIHRoZXJlIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKICAgIHJldHVybiBkZXAKCgpkZWYgZ2V0X3JlcXVpcmVkX2Rpc3RzKGRpc3RzLCBkaXN0KToKICAgICIiIlJlY3Vyc2l2ZWx5IGdlbmVyYXRlIGEgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZyb20gKmRpc3RzKiB0aGF0IGFyZQogICAgcmVxdWlyZWQgYnkgKmRpc3QqLgoKICAgIDpwYXJhbSBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDpwYXJhbSBkaXN0OiBhIGRpc3RyaWJ1dGlvbiwgbWVtYmVyIG9mICpkaXN0cyogZm9yIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAiIiIKICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2dpdmVuIGRpc3RyaWJ1dGlvbiAlciBpcyBub3QgYSBtZW1iZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBsaXN0JyAlIGRpc3QubmFtZSkKICAgIGdyYXBoID0gbWFrZV9ncmFwaChkaXN0cykKCiAgICByZXEgPSBbXSAgIyByZXF1aXJlZCBkaXN0cmlidXRpb25zCiAgICB0b2RvID0gZ3JhcGguYWRqYWNlbmN5X2xpc3RbZGlzdF0gICMgbGlzdCBvZiBub2RlcyB3ZSBzaG91bGQgaW5zcGVjdAoKICAgIHdoaWxlIHRvZG86CiAgICAgICAgZCA9IHRvZG8ucG9wKClbMF0KICAgICAgICByZXEuYXBwZW5kKGQpCiAgICAgICAgZm9yIHByZWQgaW4gZ3JhcGguYWRqYWNlbmN5X2xpc3RbZF06CiAgICAgICAgICAgIGlmIHByZWQgbm90IGluIHJlcToKICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKHByZWQpCgogICAgcmV0dXJuIHJlcQoKCmRlZiBtYWtlX2Rpc3QobmFtZSwgdmVyc2lvbiwgKiprd2FyZ3MpOgogICAgIiIiCiAgICBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgbWFraW5nIGEgZGlzdCBnaXZlbiBqdXN0IGEgbmFtZSBhbmQgdmVyc2lvbi4KICAgICIiIgogICAgc3VtbWFyeSA9IGt3YXJncy5wb3AoJ3N1bW1hcnknLCAnUGxhY2Vob2xkZXIgZm9yIHN1bW1hcnknKQogICAgbWQgPSBNZXRhZGF0YSgqKmt3YXJncykKICAgIG1kLm5hbWUgPSBuYW1lCiAgICBtZC52ZXJzaW9uID0gdmVyc2lvbgogICAgbWQuc3VtbWFyeSA9IHN1bW1hcnkgb3IgJ1BsYWNlaG9sZGVyIGZvciBzdW1tYXJ5JwogICAgcmV0dXJuIERpc3RyaWJ1dGlvbihtZCkKUEsDBBQAAAAAAAAAIQCDOOItXVIAAF1SAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzIFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHRlbXBmaWxlCnRyeToKICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkdW1teV90aHJlYWRpbmcgaW1wb3J0IFRocmVhZAoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgKEhUVFBCYXNpY0F1dGhIYW5kbGVyLCBSZXF1ZXN0LCBIVFRQUGFzc3dvcmRNZ3IsCiAgICAgICAgICAgICAgICAgICAgIHVybHBhcnNlLCBidWlsZF9vcGVuZXIsIHN0cmluZ190eXBlcykKZnJvbSAudXRpbCBpbXBvcnQgY2FjaGVkX3Byb3BlcnR5LCB6aXBfZGlyLCBTZXJ2ZXJQcm94eQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpERUZBVUxUX0lOREVYID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGknCkRFRkFVTFRfUkVBTE0gPSAncHlwaScKCmNsYXNzIFBhY2thZ2VJbmRleChvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwYWNrYWdlIGluZGV4IGNvbXBhdGlibGUgd2l0aCBQeVBJLCB0aGUgUHl0aG9uCiAgICBQYWNrYWdlIEluZGV4LgogICAgIiIiCgogICAgYm91bmRhcnkgPSBiJy0tLS0tLS0tLS1UaElzX0lzX3RIZV9kaXN0bGliX2luZGV4X2JvdU5kYVJZXyQnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIG9mIHRoZSBpbmRleC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFVSTCBmb3IgUHlQSSBpcwogICAgICAgICAgICAgICAgICAgIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi51cmwgPSB1cmwgb3IgREVGQVVMVF9JTkRFWAogICAgICAgIHNlbGYucmVhZF9jb25maWd1cmF0aW9uKCkKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlKHNlbGYudXJsKQogICAgICAgIGlmIHBhcmFtcyBvciBxdWVyeSBvciBmcmFnIG9yIHNjaGVtZSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJyk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgcmVwb3NpdG9yeTogJXMnICUgc2VsZi51cmwpCiAgICAgICAgc2VsZi5wYXNzd29yZF9oYW5kbGVyID0gTm9uZQogICAgICAgIHNlbGYuc3NsX3ZlcmlmaWVyID0gTm9uZQogICAgICAgIHNlbGYuZ3BnID0gTm9uZQogICAgICAgIHNlbGYuZ3BnX2hvbWUgPSBOb25lCiAgICAgICAgc2VsZi5ycGNfcHJveHkgPSBOb25lCiAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICd3JykgYXMgc2luazoKICAgICAgICAgICAgIyBVc2UgZ3BnIGJ5IGRlZmF1bHQgcmF0aGVyIHRoYW4gZ3BnMiwgYXMgZ3BnMiBpbnNpc3RzIG9uCiAgICAgICAgICAgICMgcHJvbXB0aW5nIGZvciBwYXNzd29yZHMKICAgICAgICAgICAgZm9yIHMgaW4gKCdncGcnLCAnZ3BnMicpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzLCAnLS12ZXJzaW9uJ10sIHN0ZG91dD1zaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zaW5rKQogICAgICAgICAgICAgICAgICAgIGlmIHJjID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ3BnID0gcwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBfZ2V0X3B5cGlyY19jb21tYW5kKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgZGlzdHV0aWxzIGNvbW1hbmQgZm9yIGludGVyYWN0aW5nIHdpdGggUHlQSSBjb25maWd1cmF0aW9ucy4KICAgICAgICA6cmV0dXJuOiB0aGUgY29tbWFuZC4KICAgICAgICAiIiIKICAgICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KICAgICAgICBmcm9tIGRpc3R1dGlscy5jb25maWcgaW1wb3J0IFB5UElSQ0NvbW1hbmQKICAgICAgICBkID0gRGlzdHJpYnV0aW9uKCkKICAgICAgICByZXR1cm4gUHlQSVJDQ29tbWFuZChkKQoKICAgIGRlZiByZWFkX2NvbmZpZ3VyYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVhZCB0aGUgUHlQSSBhY2Nlc3MgY29uZmlndXJhdGlvbiBhcyBzdXBwb3J0ZWQgYnkgZGlzdHV0aWxzLCBnZXR0aW5nCiAgICAgICAgUHlQSSB0byBkbyB0aGUgYWN0dWFsIHdvcmsuIFRoaXMgcG9wdWxhdGVzIGBgdXNlcm5hbWVgYCwgYGBwYXNzd29yZGBgLAogICAgICAgIGBgcmVhbG1gYCBhbmQgYGB1cmxgYCBhdHRyaWJ1dGVzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgIyBnZXQgZGlzdHV0aWxzIHRvIGRvIHRoZSB3b3JrCiAgICAgICAgYyA9IHNlbGYuX2dldF9weXBpcmNfY29tbWFuZCgpCiAgICAgICAgYy5yZXBvc2l0b3J5ID0gc2VsZi51cmwKICAgICAgICBjZmcgPSBjLl9yZWFkX3B5cGlyYygpCiAgICAgICAgc2VsZi51c2VybmFtZSA9IGNmZy5nZXQoJ3VzZXJuYW1lJykKICAgICAgICBzZWxmLnBhc3N3b3JkID0gY2ZnLmdldCgncGFzc3dvcmQnKQogICAgICAgIHNlbGYucmVhbG0gPSBjZmcuZ2V0KCdyZWFsbScsICdweXBpJykKICAgICAgICBzZWxmLnVybCA9IGNmZy5nZXQoJ3JlcG9zaXRvcnknLCBzZWxmLnVybCkKCiAgICBkZWYgc2F2ZV9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNhdmUgdGhlIFB5UEkgYWNjZXNzIGNvbmZpZ3VyYXRpb24uIFlvdSBtdXN0IGhhdmUgc2V0IGBgdXNlcm5hbWVgYCBhbmQKICAgICAgICBgYHBhc3N3b3JkYGAgYXR0cmlidXRlcyBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KCiAgICAgICAgQWdhaW4sIGRpc3R1dGlscyBpcyB1c2VkIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICAjIGdldCBkaXN0dXRpbHMgdG8gZG8gdGhlIHdvcmsKICAgICAgICBjID0gc2VsZi5fZ2V0X3B5cGlyY19jb21tYW5kKCkKICAgICAgICBjLl9zdG9yZV9weXBpcmMoc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKCiAgICBkZWYgY2hlY2tfY3JlZGVudGlhbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgdGhhdCBgYHVzZXJuYW1lYGAgYW5kIGBgcGFzc3dvcmRgYCBoYXZlIGJlZW4gc2V0LCBhbmQgcmFpc2UgYW4KICAgICAgICBleGNlcHRpb24gaWYgbm90LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudXNlcm5hbWUgaXMgTm9uZSBvciBzZWxmLnBhc3N3b3JkIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3VzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIHNldCcpCiAgICAgICAgcG0gPSBIVFRQUGFzc3dvcmRNZ3IoKQogICAgICAgIF8sIG5ldGxvYywgXywgXywgXywgXyA9IHVybHBhcnNlKHNlbGYudXJsKQogICAgICAgIHBtLmFkZF9wYXNzd29yZChzZWxmLnJlYWxtLCBuZXRsb2MsIHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCiAgICAgICAgc2VsZi5wYXNzd29yZF9oYW5kbGVyID0gSFRUUEJhc2ljQXV0aEhhbmRsZXIocG0pCgogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciBhIGRpc3RyaWJ1dGlvbiBvbiBQeVBJLCB1c2luZyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEuCgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogQSA6Y2xhc3M6YE1ldGFkYXRhYCBpbnN0YW5jZSBkZWZpbmluZyBhdCBsZWFzdCBhIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGRpc3RyaWJ1dGlvbiB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZC4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmcm9tIFB5UEkgdXBvbiBzdWJtaXNzaW9uIG9mIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICBtZXRhZGF0YS52YWxpZGF0ZSgpCiAgICAgICAgZCA9IG1ldGFkYXRhLnRvZGljdCgpCiAgICAgICAgZFsnOmFjdGlvbiddID0gJ3ZlcmlmeScKICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChkLml0ZW1zKCksIFtdKQogICAgICAgIHJlc3BvbnNlID0gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKICAgICAgICBkWyc6YWN0aW9uJ10gPSAnc3VibWl0JwogICAgICAgIHJlcXVlc3QgPSBzZWxmLmVuY29kZV9yZXF1ZXN0KGQuaXRlbXMoKSwgW10pCiAgICAgICAgcmV0dXJuIHNlbGYuc2VuZF9yZXF1ZXN0KHJlcXVlc3QpCgogICAgZGVmIF9yZWFkZXIoc2VsZiwgbmFtZSwgc3RyZWFtLCBvdXRidWYpOgogICAgICAgICIiIgogICAgICAgIFRocmVhZCBydW5uZXIgZm9yIHJlYWRpbmcgbGluZXMgb2YgZnJvbSBhIHN1YnByb2Nlc3MgaW50byBhIGJ1ZmZlci4KCiAgICAgICAgOnBhcmFtIG5hbWU6IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHN0cmVhbSAodXNlZCBmb3IgbG9nZ2luZyBvbmx5KS4KICAgICAgICA6cGFyYW0gc3RyZWFtOiBUaGUgc3RyZWFtIHRvIHJlYWQgZnJvbS4gVGhpcyB3aWxsIHR5cGljYWxseSBhIHBpcGUKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0gb2YgYSBzdWJwcm9jZXNzLgogICAgICAgIDpwYXJhbSBvdXRidWY6IFRoZSBsaXN0IHRvIGFwcGVuZCB0aGUgcmVhZCBsaW5lcyB0by4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBzID0gc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IHM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzID0gcy5kZWNvZGUoJ3V0Zi04JykucnN0cmlwKCkKICAgICAgICAgICAgb3V0YnVmLmFwcGVuZChzKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzOiAlcycgJSAobmFtZSwgcykpCiAgICAgICAgc3RyZWFtLmNsb3NlKCkKCiAgICBkZWYgZ2V0X3NpZ25fY29tbWFuZChzZWxmLCBmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3VpdGFibGUgY29tbWFuZCBmb3Igc2lnbmluZyBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIHRvIGJlIHNpZ25lZC4KICAgICAgICA6cGFyYW0gc2lnbmVyOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmVyIG9mIHRoZSBmaWxlLgogICAgICAgIDpwYXJhbSBzaWduX3Bhc3N3b3JkOiBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHNpZ25lcidzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUga2V5IHVzZWQgZm9yIHNpZ25pbmcuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB2ZXJpZmljYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UncyBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgc2lnbmluZyBjb21tYW5kIGFzIGEgbGlzdCBzdWl0YWJsZSB0byBiZQogICAgICAgICAgICAgICAgIHBhc3NlZCB0byA6Y2xhc3M6YHN1YnByb2Nlc3MuUG9wZW5gLgogICAgICAgICIiIgogICAgICAgIGNtZCA9IFtzZWxmLmdwZywgJy0tc3RhdHVzLWZkJywgJzInLCAnLS1uby10dHknXQogICAgICAgIGlmIGtleXN0b3JlIGlzIE5vbmU6CiAgICAgICAgICAgIGtleXN0b3JlID0gc2VsZi5ncGdfaG9tZQogICAgICAgIGlmIGtleXN0b3JlOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLS1ob21lZGlyJywga2V5c3RvcmVdKQogICAgICAgIGlmIHNpZ25fcGFzc3dvcmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyctLWJhdGNoJywgJy0tcGFzc3BocmFzZS1mZCcsICcwJ10pCiAgICAgICAgdGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICBzZiA9IG9zLnBhdGguam9pbih0ZCwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkgKyAnLmFzYycpCiAgICAgICAgY21kLmV4dGVuZChbJy0tZGV0YWNoLXNpZ24nLCAnLS1hcm1vcicsICctLWxvY2FsLXVzZXInLAogICAgICAgICAgICAgICAgICAgIHNpZ25lciwgJy0tb3V0cHV0Jywgc2YsIGZpbGVuYW1lXSkKICAgICAgICBsb2dnZXIuZGVidWcoJ2ludm9raW5nOiAlcycsICcgJy5qb2luKGNtZCkpCiAgICAgICAgcmV0dXJuIGNtZCwgc2YKCiAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY21kLCBpbnB1dF9kYXRhPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJ1biBhIGNvbW1hbmQgaW4gYSBjaGlsZCBwcm9jZXNzICwgcGFzc2luZyBpdCBhbnkgaW5wdXQgZGF0YSBzcGVjaWZpZWQuCgogICAgICAgIDpwYXJhbSBjbWQ6IFRoZSBjb21tYW5kIHRvIHJ1bi4KICAgICAgICA6cGFyYW0gaW5wdXRfZGF0YTogSWYgc3BlY2lmaWVkLCB0aGlzIG11c3QgYmUgYSBieXRlIHN0cmluZyBjb250YWluaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgY2hpbGQgcHJvY2Vzcy4KICAgICAgICA6cmV0dXJuOiBBIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlIHN1YnByb2Nlc3MnIGV4aXQgY29kZSwgYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgbGluZXMgcmVhZCBmcm9tIHRoZSBzdWJwcm9jZXNzJyBgYHN0ZG91dGBgLCBhbmQgYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgbGluZXMgcmVhZCBmcm9tIHRoZSBzdWJwcm9jZXNzJyBgYHN0ZGVycmBgLgogICAgICAgICIiIgogICAgICAgIGt3YXJncyA9IHsKICAgICAgICAgICAgJ3N0ZG91dCc6IHN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuUElQRSwKICAgICAgICB9CiAgICAgICAgaWYgaW5wdXRfZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAga3dhcmdzWydzdGRpbiddID0gc3VicHJvY2Vzcy5QSVBFCiAgICAgICAgc3Rkb3V0ID0gW10KICAgICAgICBzdGRlcnIgPSBbXQogICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgKiprd2FyZ3MpCiAgICAgICAgIyBXZSBkb24ndCB1c2UgY29tbXVuaWNhdGUoKSBoZXJlIGJlY2F1c2Ugd2UgbWF5IG5lZWQgdG8KICAgICAgICAjIGdldCBjbGV2ZXIgd2l0aCBpbnRlcmFjdGluZyB3aXRoIHRoZSBjb21tYW5kCiAgICAgICAgdDEgPSBUaHJlYWQodGFyZ2V0PXNlbGYuX3JlYWRlciwgYXJncz0oJ3N0ZG91dCcsIHAuc3Rkb3V0LCBzdGRvdXQpKQogICAgICAgIHQxLnN0YXJ0KCkKICAgICAgICB0MiA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVyLCBhcmdzPSgnc3RkZXJyJywgcC5zdGRlcnIsIHN0ZGVycikpCiAgICAgICAgdDIuc3RhcnQoKQogICAgICAgIGlmIGlucHV0X2RhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoaW5wdXRfZGF0YSkKICAgICAgICAgICAgcC5zdGRpbi5jbG9zZSgpCgogICAgICAgIHAud2FpdCgpCiAgICAgICAgdDEuam9pbigpCiAgICAgICAgdDIuam9pbigpCiAgICAgICAgcmV0dXJuIHAucmV0dXJuY29kZSwgc3Rkb3V0LCBzdGRlcnIKCiAgICBkZWYgc2lnbl9maWxlKHNlbGYsIGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNpZ24gYSBmaWxlLgoKICAgICAgICA6cGFyYW0gZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB0byBiZSBzaWduZWQuCiAgICAgICAgOnBhcmFtIHNpZ25lcjogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25lciBvZiB0aGUgZmlsZS4KICAgICAgICA6cGFyYW0gc2lnbl9wYXNzd29yZDogVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBzaWduZXIncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gc2lnbmluZy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGluc3RhbmNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB3aGVyZSB0aGUgc2lnbmF0dXJlIGlzCiAgICAgICAgICAgICAgICAgc3RvcmVkLgogICAgICAgICIiIgogICAgICAgIGNtZCwgc2lnX2ZpbGUgPSBzZWxmLmdldF9zaWduX2NvbW1hbmQoZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlKQogICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IHNlbGYucnVuX2NvbW1hbmQoY21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbl9wYXNzd29yZC5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignc2lnbiBjb21tYW5kIGZhaWxlZCB3aXRoIGVycm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kZSAlcycgJSByYykKICAgICAgICByZXR1cm4gc2lnX2ZpbGUKCiAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgbWV0YWRhdGEsIGZpbGVuYW1lLCBzaWduZXI9Tm9uZSwgc2lnbl9wYXNzd29yZD1Ob25lLAogICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlPSdzZGlzdCcsIHB5dmVyc2lvbj0nc291cmNlJywga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVXBsb2FkIGEgcmVsZWFzZSBmaWxlIHRvIHRoZSBpbmRleC4KCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBIDpjbGFzczpgTWV0YWRhdGFgIGluc3RhbmNlIGRlZmluaW5nIGF0IGxlYXN0IGEgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZC4KICAgICAgICA6cGFyYW0gZmlsZW5hbWU6IFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZC4KICAgICAgICA6cGFyYW0gc2lnbmVyOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmVyIG9mIHRoZSBmaWxlLgogICAgICAgIDpwYXJhbSBzaWduX3Bhc3N3b3JkOiBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHNpZ25lcidzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUga2V5IHVzZWQgZm9yIHNpZ25pbmcuCiAgICAgICAgOnBhcmFtIGZpbGV0eXBlOiBUaGUgdHlwZSBvZiB0aGUgZmlsZSBiZWluZyB1cGxvYWRlZC4gVGhpcyBpcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHV0aWxzIGNvbW1hbmQgd2hpY2ggcHJvZHVjZWQgdGhhdCBmaWxlLCBlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgIGBgc2Rpc3RgYCBvciBgYGJkaXN0X3doZWVsYGAuCiAgICAgICAgOnBhcmFtIHB5dmVyc2lvbjogVGhlIHZlcnNpb24gb2YgUHl0aG9uIHdoaWNoIHRoZSByZWxlYXNlIHJlbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0by4gRm9yIGNvZGUgY29tcGF0aWJsZSB3aXRoIGFueSBQeXRob24sIHRoaXMgd291bGQKICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBgYHNvdXJjZWBgLCBvdGhlcndpc2UgaXQgd291bGQgYmUgZS5nLiBgYDMuMmBgLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gc2lnbmluZy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGluc3RhbmNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gUHlQSSB1cG9uIHN1Ym1pc3Npb24gb2YgdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ25vdCBmb3VuZDogJXMnICUgZmlsZW5hbWUpCiAgICAgICAgbWV0YWRhdGEudmFsaWRhdGUoKQogICAgICAgIGQgPSBtZXRhZGF0YS50b2RpY3QoKQogICAgICAgIHNpZ19maWxlID0gTm9uZQogICAgICAgIGlmIHNpZ25lcjoKICAgICAgICAgICAgaWYgbm90IHNlbGYuZ3BnOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHNpZ25pbmcgcHJvZ3JhbSBhdmFpbGFibGUgLSBub3Qgc2lnbmVkJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpZ19maWxlID0gc2VsZi5zaWduX2ZpbGUoZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2RhdGEgPSBmLnJlYWQoKQogICAgICAgIG1kNV9kaWdlc3QgPSBoYXNobGliLm1kNShmaWxlX2RhdGEpLmhleGRpZ2VzdCgpCiAgICAgICAgc2hhMjU2X2RpZ2VzdCA9IGhhc2hsaWIuc2hhMjU2KGZpbGVfZGF0YSkuaGV4ZGlnZXN0KCkKICAgICAgICBkLnVwZGF0ZSh7CiAgICAgICAgICAgICc6YWN0aW9uJzogJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgJ3Byb3RvY29sX3ZlcnNpb24nOiAnMScsCiAgICAgICAgICAgICdmaWxldHlwZSc6IGZpbGV0eXBlLAogICAgICAgICAgICAncHl2ZXJzaW9uJzogcHl2ZXJzaW9uLAogICAgICAgICAgICAnbWQ1X2RpZ2VzdCc6IG1kNV9kaWdlc3QsCiAgICAgICAgICAgICdzaGEyNTZfZGlnZXN0Jzogc2hhMjU2X2RpZ2VzdCwKICAgICAgICB9KQogICAgICAgIGZpbGVzID0gWygnY29udGVudCcsIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBmaWxlX2RhdGEpXQogICAgICAgIGlmIHNpZ19maWxlOgogICAgICAgICAgICB3aXRoIG9wZW4oc2lnX2ZpbGUsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICBzaWdfZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgoJ2dwZ19zaWduYXR1cmUnLCBvcy5wYXRoLmJhc2VuYW1lKHNpZ19maWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19kYXRhKSkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmRpcm5hbWUoc2lnX2ZpbGUpKQogICAgICAgIHJlcXVlc3QgPSBzZWxmLmVuY29kZV9yZXF1ZXN0KGQuaXRlbXMoKSwgZmlsZXMpCiAgICAgICAgcmV0dXJuIHNlbGYuc2VuZF9yZXF1ZXN0KHJlcXVlc3QpCgogICAgZGVmIHVwbG9hZF9kb2N1bWVudGF0aW9uKHNlbGYsIG1ldGFkYXRhLCBkb2NfZGlyKToKICAgICAgICAiIiIKICAgICAgICBVcGxvYWQgZG9jdW1lbnRhdGlvbiB0byB0aGUgaW5kZXguCgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogQSA6Y2xhc3M6YE1ldGFkYXRhYCBpbnN0YW5jZSBkZWZpbmluZyBhdCBsZWFzdCBhIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGRvY3VtZW50YXRpb24gdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkLgogICAgICAgIDpwYXJhbSBkb2NfZGlyOiBUaGUgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4gVGhpcyBzaG91bGQgYmUgdGhlIGRpcmVjdG9yeSB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBgYGluZGV4Lmh0bWxgYCBmb3IgdGhlIGRvY3VtZW50YXRpb24uCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBQeVBJIHVwb24gc3VibWlzc2lvbiBvZiB0aGUKICAgICAgICAgICAgICAgIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZG9jX2Rpcik6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ25vdCBhIGRpcmVjdG9yeTogJXInICUgZG9jX2RpcikKICAgICAgICBmbiA9IG9zLnBhdGguam9pbihkb2NfZGlyLCAnaW5kZXguaHRtbCcpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignbm90IGZvdW5kOiAlcicgJSBmbikKICAgICAgICBtZXRhZGF0YS52YWxpZGF0ZSgpCiAgICAgICAgbmFtZSwgdmVyc2lvbiA9IG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24KICAgICAgICB6aXBfZGF0YSA9IHppcF9kaXIoZG9jX2RpcikuZ2V0dmFsdWUoKQogICAgICAgIGZpZWxkcyA9IFsoJzphY3Rpb24nLCAnZG9jX3VwbG9hZCcpLAogICAgICAgICAgICAgICAgICAoJ25hbWUnLCBuYW1lKSwgKCd2ZXJzaW9uJywgdmVyc2lvbildCiAgICAgICAgZmlsZXMgPSBbKCdjb250ZW50JywgbmFtZSwgemlwX2RhdGEpXQogICAgICAgIHJlcXVlc3QgPSBzZWxmLmVuY29kZV9yZXF1ZXN0KGZpZWxkcywgZmlsZXMpCiAgICAgICAgcmV0dXJuIHNlbGYuc2VuZF9yZXF1ZXN0KHJlcXVlc3QpCgogICAgZGVmIGdldF92ZXJpZnlfY29tbWFuZChzZWxmLCBzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHN1aXRhYmxlIGNvbW1hbmQgZm9yIHZlcmlmeWluZyBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBzaWduYXR1cmVfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS4KICAgICAgICA6cGFyYW0gZGF0YV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBkYXRhLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdmVyaWZpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlJ3MgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIHZlcmlmeWluZyBjb21tYW5kIGFzIGEgbGlzdCBzdWl0YWJsZSB0byBiZQogICAgICAgICAgICAgICAgIHBhc3NlZCB0byA6Y2xhc3M6YHN1YnByb2Nlc3MuUG9wZW5gLgogICAgICAgICIiIgogICAgICAgIGNtZCA9IFtzZWxmLmdwZywgJy0tc3RhdHVzLWZkJywgJzInLCAnLS1uby10dHknXQogICAgICAgIGlmIGtleXN0b3JlIGlzIE5vbmU6CiAgICAgICAgICAgIGtleXN0b3JlID0gc2VsZi5ncGdfaG9tZQogICAgICAgIGlmIGtleXN0b3JlOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLS1ob21lZGlyJywga2V5c3RvcmVdKQogICAgICAgIGNtZC5leHRlbmQoWyctLXZlcmlmeScsIHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZV0pCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbnZva2luZzogJXMnLCAnICcuam9pbihjbWQpKQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgdmVyaWZ5X3NpZ25hdHVyZShzZWxmLCBzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBWZXJpZnkgYSBzaWduYXR1cmUgZm9yIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIHNpZ25hdHVyZV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLgogICAgICAgIDpwYXJhbSBkYXRhX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGRhdGEuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB2ZXJpZmljYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UncyBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkLCBlbHNlIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmdwZzoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndmVyaWZpY2F0aW9uIHVuYXZhaWxhYmxlIGJlY2F1c2UgZ3BnICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5hdmFpbGFibGUnKQogICAgICAgIGNtZCA9IHNlbGYuZ2V0X3ZlcmlmeV9jb21tYW5kKHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZSkKICAgICAgICByYywgc3Rkb3V0LCBzdGRlcnIgPSBzZWxmLnJ1bl9jb21tYW5kKGNtZCkKICAgICAgICBpZiByYyBub3QgaW4gKDAsIDEpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd2ZXJpZnkgY29tbWFuZCBmYWlsZWQgd2l0aCBlcnJvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvZGUgJXMnICUgcmMpCiAgICAgICAgcmV0dXJuIHJjID09IDAKCiAgICBkZWYgZG93bmxvYWRfZmlsZShzZWxmLCB1cmwsIGRlc3RmaWxlLCBkaWdlc3Q9Tm9uZSwgcmVwb3J0aG9vaz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBkb3dubG9hZGluZyBhIGZpbGUgZnJvbSBhbiBVUkwuCiAgICAgICAgTm9ybWFsbHksIHRoaXMgd2lsbCBiZSBhIGZpbGUgZnJvbSB0aGUgaW5kZXgsIHRob3VnaCBjdXJyZW50bHkKICAgICAgICBubyBjaGVjayBpcyBtYWRlIGZvciB0aGlzIChpLmUuIGEgZmlsZSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCiAgICAgICAgYW55d2hlcmUpLgoKICAgICAgICBUaGUgbWV0aG9kIGlzIGp1c3QgbGlrZSB0aGUgOmZ1bmM6YHVybHJldHJpZXZlYCBmdW5jdGlvbiBpbiB0aGUKICAgICAgICBzdGFuZGFyZCBsaWJyYXJ5LCBleGNlcHQgdGhhdCBpdCBhbGxvd3MgZGlnZXN0IGNvbXB1dGF0aW9uIHRvIGJlCiAgICAgICAgZG9uZSBkdXJpbmcgZG93bmxvYWQgYW5kIGNoZWNraW5nIHRoYXQgdGhlIGRvd25sb2FkZWQgZGF0YQogICAgICAgIG1hdGNoZWQgYW55IGV4cGVjdGVkIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQgKGFzc3VtZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdmlhIGFuIEhUVFAgR0VUIHJlcXVlc3QpLgogICAgICAgIDpwYXJhbSBkZXN0ZmlsZTogVGhlIHBhdGhuYW1lIHdoZXJlIHRoZSBkb3dubG9hZGVkIGZpbGUgaXMgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkLgogICAgICAgIDpwYXJhbSBkaWdlc3Q6IElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IGJlIGEgKGhhc2hlciwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUsIHdoZXJlIGhhc2hlciBpcyB0aGUgYWxnb3JpdGhtIHVzZWQgKGUuZy4KICAgICAgICAgICAgICAgICAgICAgICBgYCdtZDUnYGApIGFuZCBgYHZhbHVlYGAgaXMgdGhlIGV4cGVjdGVkIHZhbHVlLgogICAgICAgIDpwYXJhbSByZXBvcnRob29rOiBUaGUgc2FtZSBhcyBmb3IgOmZ1bmM6YHVybHJldHJpZXZlYCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgbGlicmFyeS4KICAgICAgICAiIiIKICAgICAgICBpZiBkaWdlc3QgaXMgTm9uZToKICAgICAgICAgICAgZGlnZXN0ZXIgPSBOb25lCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gZGlnZXN0IHNwZWNpZmllZCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaWdlc3QsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgaGFzaGVyLCBkaWdlc3QgPSBkaWdlc3QKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGhhc2hlciA9ICdtZDUnCiAgICAgICAgICAgIGRpZ2VzdGVyID0gZ2V0YXR0cihoYXNobGliLCBoYXNoZXIpKCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEaWdlc3Qgc3BlY2lmaWVkOiAlcycgJSBkaWdlc3QpCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgZXF1aXZhbGVudCB0byB1cmxyZXRyaWV2ZS4KICAgICAgICAjIFdlIG5lZWQgdG8gZG8gaXQgdGhpcyB3YXkgc28gdGhhdCB3ZSBjYW4gY29tcHV0ZSB0aGUKICAgICAgICAjIGRpZ2VzdCBvZiB0aGUgZmlsZSBhcyB3ZSBnby4KICAgICAgICB3aXRoIG9wZW4oZGVzdGZpbGUsICd3YicpIGFzIGRmcDoKICAgICAgICAgICAgIyBhZGRpbmZvdXJsIGlzIG5vdCBhIGNvbnRleHQgbWFuYWdlciBvbiAyLngKICAgICAgICAgICAgIyBzbyB3ZSBoYXZlIHRvIHVzZSB0cnkvZmluYWxseQogICAgICAgICAgICBzZnAgPSBzZWxmLnNlbmRfcmVxdWVzdChSZXF1ZXN0KHVybCkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBzZnAuaW5mbygpCiAgICAgICAgICAgICAgICBibG9ja3NpemUgPSA4MTkyCiAgICAgICAgICAgICAgICBzaXplID0gLTEKICAgICAgICAgICAgICAgIHJlYWQgPSAwCiAgICAgICAgICAgICAgICBibG9ja251bSA9IDAKICAgICAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgICAgICBzaXplID0gaW50KGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCiAgICAgICAgICAgICAgICBpZiByZXBvcnRob29rOgogICAgICAgICAgICAgICAgICAgIHJlcG9ydGhvb2soYmxvY2tudW0sIGJsb2Nrc2l6ZSwgc2l6ZSkKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBzZnAucmVhZChibG9ja3NpemUpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHJlYWQgKz0gbGVuKGJsb2NrKQogICAgICAgICAgICAgICAgICAgIGRmcC53cml0ZShibG9jaykKICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3RlcjoKICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0ZXIudXBkYXRlKGJsb2NrKQogICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiByZXBvcnRob29rOgogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rKGJsb2NrbnVtLCBibG9ja3NpemUsIHNpemUpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzZnAuY2xvc2UoKQoKICAgICAgICAjIGNoZWNrIHRoYXQgd2UgZ290IHRoZSB3aG9sZSBmaWxlLCBpZiB3ZSBjYW4KICAgICAgICBpZiBzaXplID49IDAgYW5kIHJlYWQgPCBzaXplOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJ3JldHJpZXZhbCBpbmNvbXBsZXRlOiBnb3Qgb25seSAlZCBvdXQgb2YgJWQgYnl0ZXMnCiAgICAgICAgICAgICAgICAlIChyZWFkLCBzaXplKSkKICAgICAgICAjIGlmIHdlIGhhdmUgYSBkaWdlc3QsIGl0IG11c3QgbWF0Y2guCiAgICAgICAgaWYgZGlnZXN0ZXI6CiAgICAgICAgICAgIGFjdHVhbCA9IGRpZ2VzdGVyLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGlmIGRpZ2VzdCAhPSBhY3R1YWw6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCclcyBkaWdlc3QgbWlzbWF0Y2ggZm9yICVzOiBleHBlY3RlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcywgZ290ICVzJyAlIChoYXNoZXIsIGRlc3RmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0LCBhY3R1YWwpKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RpZ2VzdCB2ZXJpZmllZDogJXMnLCBkaWdlc3QpCgogICAgZGVmIHNlbmRfcmVxdWVzdChzZWxmLCByZXEpOgogICAgICAgICIiIgogICAgICAgIFNlbmQgYSBzdGFuZGFyZCBsaWJyYXJ5IDpjbGFzczpgUmVxdWVzdGAgdG8gUHlQSSBhbmQgcmV0dXJuIGl0cwogICAgICAgIHJlc3BvbnNlLgoKICAgICAgICA6cGFyYW0gcmVxOiBUaGUgcmVxdWVzdCB0byBzZW5kLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIGZyb20gUHlQSSAoYSBzdGFuZGFyZCBsaWJyYXJ5IEhUVFBSZXNwb25zZSkuCiAgICAgICAgIiIiCiAgICAgICAgaGFuZGxlcnMgPSBbXQogICAgICAgIGlmIHNlbGYucGFzc3dvcmRfaGFuZGxlcjoKICAgICAgICAgICAgaGFuZGxlcnMuYXBwZW5kKHNlbGYucGFzc3dvcmRfaGFuZGxlcikKICAgICAgICBpZiBzZWxmLnNzbF92ZXJpZmllcjoKICAgICAgICAgICAgaGFuZGxlcnMuYXBwZW5kKHNlbGYuc3NsX3ZlcmlmaWVyKQogICAgICAgIG9wZW5lciA9IGJ1aWxkX29wZW5lcigqaGFuZGxlcnMpCiAgICAgICAgcmV0dXJuIG9wZW5lci5vcGVuKHJlcSkKCiAgICBkZWYgZW5jb2RlX3JlcXVlc3Qoc2VsZiwgZmllbGRzLCBmaWxlcyk6CiAgICAgICAgIiIiCiAgICAgICAgRW5jb2RlIGZpZWxkcyBhbmQgZmlsZXMgZm9yIHBvc3RpbmcgdG8gYW4gSFRUUCBzZXJ2ZXIuCgogICAgICAgIDpwYXJhbSBmaWVsZHM6IFRoZSBmaWVsZHMgdG8gc2VuZCBhcyBhIGxpc3Qgb2YgKGZpZWxkbmFtZSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVzLgogICAgICAgIDpwYXJhbSBmaWxlczogVGhlIGZpbGVzIHRvIHNlbmQgYXMgYSBsaXN0IG9mIChmaWVsZG5hbWUsIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgZmlsZV9ieXRlcykgdHVwbGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBBZGFwdGVkIGZyb20gcGFja2FnaW5nLCB3aGljaCBpbiB0dXJuIHdhcyBhZGFwdGVkIGZyb20KICAgICAgICAjIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzE0NjMwNgoKICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgYm91bmRhcnkgPSBzZWxmLmJvdW5kYXJ5CiAgICAgICAgZm9yIGssIHZhbHVlcyBpbiBmaWVsZHM6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQoKICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWVzOgogICAgICAgICAgICAgICAgcGFydHMuZXh0ZW5kKCgKICAgICAgICAgICAgICAgICAgICBiJy0tJyArIGJvdW5kYXJ5LAogICAgICAgICAgICAgICAgICAgICgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUKICAgICAgICAgICAgICAgICAgICAgaykuZW5jb2RlKCd1dGYtOCcpLAogICAgICAgICAgICAgICAgICAgIGInJywKICAgICAgICAgICAgICAgICAgICB2LmVuY29kZSgndXRmLTgnKSkpCiAgICAgICAgZm9yIGtleSwgZmlsZW5hbWUsIHZhbHVlIGluIGZpbGVzOgogICAgICAgICAgICBwYXJ0cy5leHRlbmQoKAogICAgICAgICAgICAgICAgYictLScgKyBib3VuZGFyeSwKICAgICAgICAgICAgICAgICgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyI7IGZpbGVuYW1lPSIlcyInICUKICAgICAgICAgICAgICAgICAoa2V5LCBmaWxlbmFtZSkpLmVuY29kZSgndXRmLTgnKSwKICAgICAgICAgICAgICAgIGInJywKICAgICAgICAgICAgICAgIHZhbHVlKSkKCiAgICAgICAgcGFydHMuZXh0ZW5kKChiJy0tJyArIGJvdW5kYXJ5ICsgYictLScsIGInJykpCgogICAgICAgIGJvZHkgPSBiJ1xyXG4nLmpvaW4ocGFydHMpCiAgICAgICAgY3QgPSBiJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PScgKyBib3VuZGFyeQogICAgICAgIGhlYWRlcnMgPSB7CiAgICAgICAgICAgICdDb250ZW50LXR5cGUnOiBjdCwKICAgICAgICAgICAgJ0NvbnRlbnQtbGVuZ3RoJzogc3RyKGxlbihib2R5KSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJlcXVlc3Qoc2VsZi51cmwsIGJvZHksIGhlYWRlcnMpCgogICAgZGVmIHNlYXJjaChzZWxmLCB0ZXJtcywgb3BlcmF0b3I9Tm9uZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXJtcywgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdGVybXMgPSB7J25hbWUnOiB0ZXJtc30KICAgICAgICBpZiBzZWxmLnJwY19wcm94eSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnJwY19wcm94eSA9IFNlcnZlclByb3h5KHNlbGYudXJsLCB0aW1lb3V0PTMuMCkKICAgICAgICByZXR1cm4gc2VsZi5ycGNfcHJveHkuc2VhcmNoKHRlcm1zLCBvcGVyYXRvciBvciAnYW5kJykKUEsDBBQAAAAAAAAAIQDRxXivRccAAEXHAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbG9jYXRvcnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoKaW1wb3J0IGd6aXAKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgcmUKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCmltcG9ydCB6bGliCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCAodXJsam9pbiwgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybDJwYXRobmFtZSwgcGF0aG5hbWUydXJsLAogICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgcXVvdGUsIHVuZXNjYXBlLCBzdHJpbmdfdHlwZXMsIGJ1aWxkX29wZW5lciwKICAgICAgICAgICAgICAgICAgICAgSFRUUFJlZGlyZWN0SGFuZGxlciBhcyBCYXNlUmVkaXJlY3RIYW5kbGVyLCB0ZXh0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QsIEhUVFBFcnJvciwgVVJMRXJyb3IpCmZyb20gLmRhdGFiYXNlIGltcG9ydCBEaXN0cmlidXRpb24sIERpc3RyaWJ1dGlvblBhdGgsIG1ha2VfZGlzdApmcm9tIC5tZXRhZGF0YSBpbXBvcnQgTWV0YWRhdGEKZnJvbSAudXRpbCBpbXBvcnQgKGNhY2hlZF9wcm9wZXJ0eSwgcGFyc2VfY3JlZGVudGlhbHMsIGVuc3VyZV9zbGFzaCwKICAgICAgICAgICAgICAgICAgIHNwbGl0X2ZpbGVuYW1lLCBnZXRfcHJvamVjdF9kYXRhLCBwYXJzZV9yZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgIHBhcnNlX25hbWVfYW5kX3ZlcnNpb24sIFNlcnZlclByb3h5LCBub3JtYWxpemVfbmFtZSkKZnJvbSAudmVyc2lvbiBpbXBvcnQgZ2V0X3NjaGVtZSwgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IKZnJvbSAud2hlZWwgaW1wb3J0IFdoZWVsLCBpc19jb21wYXRpYmxlCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkhBU0hFUl9IQVNIID0gcmUuY29tcGlsZSgnXihcdyspPShbYS1mMC05XSspJykKQ0hBUlNFVCA9IHJlLmNvbXBpbGUocic7XHMqY2hhcnNldFxzKj1ccyooLiopXHMqJCcsIHJlLkkpCkhUTUxfQ09OVEVOVF9UWVBFID0gcmUuY29tcGlsZSgndGV4dC9odG1sfGFwcGxpY2F0aW9uL3goaHQpP21sJykKREVGQVVMVF9JTkRFWCA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpJwoKZGVmIGdldF9hbGxfZGlzdHJpYnV0aW9uX25hbWVzKHVybD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGFsbCBkaXN0cmlidXRpb24gbmFtZXMga25vd24gYnkgYW4gaW5kZXguCiAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIG9mIHRoZSBpbmRleC4KICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwga25vd24gZGlzdHJpYnV0aW9uIG5hbWVzLgogICAgIiIiCiAgICBpZiB1cmwgaXMgTm9uZToKICAgICAgICB1cmwgPSBERUZBVUxUX0lOREVYCiAgICBjbGllbnQgPSBTZXJ2ZXJQcm94eSh1cmwsIHRpbWVvdXQ9My4wKQogICAgcmV0dXJuIGNsaWVudC5saXN0X3BhY2thZ2VzKCkKCmNsYXNzIFJlZGlyZWN0SGFuZGxlcihCYXNlUmVkaXJlY3RIYW5kbGVyKToKICAgICIiIgogICAgQSBjbGFzcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBzb21lIFB5dGhvbiAzLjIueCByZWxlYXNlcy4KICAgICIiIgogICAgIyBUaGVyZSdzIGEgYnVnIGluIHRoZSBiYXNlIHZlcnNpb24gZm9yIHNvbWUgMy4yLngKICAgICMgKGUuZy4gMy4yLjIgb24gVWJ1bnR1IE9uZWlyaWMpLiBJZiBhIExvY2F0aW9uIGhlYWRlcgogICAgIyByZXR1cm5zIGUuZy4gL2FiYywgaXQgYmFpbHMgYmVjYXVzZSBpdCBzYXlzIHRoZSBzY2hlbWUgJycKICAgICMgaXMgYm9ndXMsIHdoZW4gYWN0dWFsbHkgaXQgc2hvdWxkIHVzZSB0aGUgcmVxdWVzdCdzCiAgICAjIFVSTCBmb3IgdGhlIHNjaGVtZS4gU2VlIFB5dGhvbiBpc3N1ZSAjMTM2OTYuCiAgICBkZWYgaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKICAgICAgICAjIFNvbWUgc2VydmVycyAoaW5jb3JyZWN0bHkpIHJldHVybiBtdWx0aXBsZSBMb2NhdGlvbiBoZWFkZXJzCiAgICAgICAgIyAoc28gcHJvYmFibHkgc2FtZSBnb2VzIGZvciBVUkkpLiAgVXNlIGZpcnN0IGhlYWRlci4KICAgICAgICBuZXd1cmwgPSBOb25lCiAgICAgICAgZm9yIGtleSBpbiAoJ2xvY2F0aW9uJywgJ3VyaScpOgogICAgICAgICAgICBpZiBrZXkgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnNba2V5XQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBuZXd1cmwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdXJscGFydHMgPSB1cmxwYXJzZShuZXd1cmwpCiAgICAgICAgaWYgdXJscGFydHMuc2NoZW1lID09ICcnOgogICAgICAgICAgICBuZXd1cmwgPSB1cmxqb2luKHJlcS5nZXRfZnVsbF91cmwoKSwgbmV3dXJsKQogICAgICAgICAgICBpZiBoYXNhdHRyKGhlYWRlcnMsICdyZXBsYWNlX2hlYWRlcicpOgogICAgICAgICAgICAgICAgaGVhZGVycy5yZXBsYWNlX2hlYWRlcihrZXksIG5ld3VybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IG5ld3VybAogICAgICAgIHJldHVybiBCYXNlUmVkaXJlY3RIYW5kbGVyLmh0dHBfZXJyb3JfMzAyKHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzKQoKICAgIGh0dHBfZXJyb3JfMzAxID0gaHR0cF9lcnJvcl8zMDMgPSBodHRwX2Vycm9yXzMwNyA9IGh0dHBfZXJyb3JfMzAyCgpjbGFzcyBMb2NhdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIEEgYmFzZSBjbGFzcyBmb3IgbG9jYXRvcnMgLSB0aGluZ3MgdGhhdCBsb2NhdGUgZGlzdHJpYnV0aW9ucy4KICAgICIiIgogICAgc291cmNlX2V4dGVuc2lvbnMgPSAoJy50YXIuZ3onLCAnLnRhci5iejInLCAnLnRhcicsICcuemlwJywgJy50Z3onLCAnLnRieicpCiAgICBiaW5hcnlfZXh0ZW5zaW9ucyA9ICgnLmVnZycsICcuZXhlJywgJy53aGwnKQogICAgZXhjbHVkZWRfZXh0ZW5zaW9ucyA9ICgnLnBkZicsKQoKICAgICMgQSBsaXN0IG9mIHRhZ3MgaW5kaWNhdGluZyB3aGljaCB3aGVlbHMgeW91IHdhbnQgdG8gbWF0Y2guIFRoZSBkZWZhdWx0CiAgICAjIHZhbHVlIG9mIE5vbmUgbWF0Y2hlcyBhZ2FpbnN0IHRoZSB0YWdzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVubmluZwogICAgIyBQeXRob24uIElmIHlvdSB3YW50IHRvIG1hdGNoIG90aGVyIHZhbHVlcywgc2V0IHdoZWVsX3RhZ3Mgb24gYSBsb2NhdG9yCiAgICAjIGluc3RhbmNlIHRvIGEgbGlzdCBvZiB0dXBsZXMgKHB5dmVyLCBhYmksIGFyY2gpIHdoaWNoIHlvdSB3YW50IHRvIG1hdGNoLgogICAgd2hlZWxfdGFncyA9IE5vbmUKCiAgICBkb3dubG9hZGFibGVfZXh0ZW5zaW9ucyA9IHNvdXJjZV9leHRlbnNpb25zICsgKCcud2hsJywpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIHNjaGVtZTogQmVjYXVzZSBsb2NhdG9ycyBsb29rIGZvciBtb3N0IHJlY2VudCB2ZXJzaW9ucywgdGhleQogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8ga25vdyB0aGUgdmVyc2lvbiBzY2hlbWUgdG8gdXNlLiBUaGlzIHNwZWNpZmllcwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IFBFUC1yZWNvbW1lbmRlZCBzY2hlbWUgLSB1c2UgYGAnbGVnYWN5J2BgCiAgICAgICAgICAgICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gc3VwcG9ydCBleGlzdGluZyBkaXN0cmlidXRpb25zIG9uIFB5UEkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQogICAgICAgIHNlbGYuc2NoZW1lID0gc2NoZW1lCiAgICAgICAgIyBCZWNhdXNlIG9mIGJ1Z3MgaW4gc29tZSBvZiB0aGUgaGFuZGxlcnMgb24gc29tZSBvZiB0aGUgcGxhdGZvcm1zLAogICAgICAgICMgd2UgdXNlIG91ciBvd24gb3BlbmVyIHJhdGhlciB0aGFuIGp1c3QgdXNpbmcgdXJsb3Blbi4KICAgICAgICBzZWxmLm9wZW5lciA9IGJ1aWxkX29wZW5lcihSZWRpcmVjdEhhbmRsZXIoKSkKICAgICAgICAjIElmIGdldF9wcm9qZWN0KCkgaXMgY2FsbGVkIGZyb20gbG9jYXRlKCksIHRoZSBtYXRjaGVyIGluc3RhbmNlCiAgICAgICAgIyBpcyBzZXQgZnJvbSB0aGUgcmVxdWlyZW1lbnQgcGFzc2VkIHRvIGxvY2F0ZSgpLiBTZWUgaXNzdWUgIzE4IGZvcgogICAgICAgICMgd2h5IHRoaXMgY2FuIGJlIHVzZWZ1bCB0byBrbm93LgogICAgICAgIHNlbGYubWF0Y2hlciA9IE5vbmUKICAgICAgICBzZWxmLmVycm9ycyA9IHF1ZXVlLlF1ZXVlKCkKCiAgICBkZWYgZ2V0X2Vycm9ycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYW55IGVycm9ycyB3aGljaCBoYXZlIG9jY3VycmVkLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgd2hpbGUgbm90IHNlbGYuZXJyb3JzLmVtcHR5KCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZSA9IHNlbGYuZXJyb3JzLmdldChGYWxzZSkKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZSkKICAgICAgICAgICAgZXhjZXB0IHNlbGYuZXJyb3JzLkVtcHR5OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5lcnJvcnMudGFza19kb25lKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNsZWFyX2Vycm9ycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciBhbnkgZXJyb3JzIHdoaWNoIG1heSBoYXZlIGJlZW4gbG9nZ2VkLgogICAgICAgICIiIgogICAgICAgICMgSnVzdCBnZXQgdGhlIGVycm9ycyBhbmQgdGhyb3cgdGhlbSBhd2F5CiAgICAgICAgc2VsZi5nZXRfZXJyb3JzKCkKCiAgICBkZWYgY2xlYXJfY2FjaGUoc2VsZik6CiAgICAgICAgc2VsZi5fY2FjaGUuY2xlYXIoKQoKICAgIGRlZiBfZ2V0X3NjaGVtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc2NoZW1lCgogICAgZGVmIF9zZXRfc2NoZW1lKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9zY2hlbWUgPSB2YWx1ZQoKICAgIHNjaGVtZSA9IHByb3BlcnR5KF9nZXRfc2NoZW1lLCBfc2V0X3NjaGVtZSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIGdpdmVuIHByb2plY3QsIGdldCBhIGRpY3Rpb25hcnkgbWFwcGluZyBhdmFpbGFibGUgdmVyc2lvbnMgdG8gRGlzdHJpYnV0aW9uCiAgICAgICAgaW5zdGFuY2VzLgoKICAgICAgICBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgoKICAgICAgICBJZiBjYWxsZWQgZnJvbSBhIGxvY2F0ZSgpIHJlcXVlc3QsIHNlbGYubWF0Y2hlciB3aWxsIGJlIHNldCB0byBhCiAgICAgICAgbWF0Y2hlciBmb3IgdGhlIHJlcXVpcmVtZW50IHRvIHNhdGlzZnksIG90aGVyd2lzZSBpdCB3aWxsIGJlIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUGxlYXNlIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3MnKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUGxlYXNlIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3MnKQoKICAgIGRlZiBnZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBnaXZlbiBwcm9qZWN0LCBnZXQgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXZhaWxhYmxlIHZlcnNpb25zIHRvIERpc3RyaWJ1dGlvbgogICAgICAgIGluc3RhbmNlcy4KCiAgICAgICAgVGhpcyBjYWxscyBfZ2V0X3Byb2plY3QgdG8gZG8gYWxsIHRoZSB3b3JrLCBhbmQganVzdCBpbXBsZW1lbnRzIGEgY2FjaGluZyBsYXllciBvbiB0b3AuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fY2FjaGUgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZ2V0X3Byb2plY3QobmFtZSkKICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi5fY2FjaGU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlW25hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jbGVhcl9lcnJvcnMoKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXRfcHJvamVjdChuYW1lKQogICAgICAgICAgICBzZWxmLl9jYWNoZVtuYW1lXSA9IHJlc3VsdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc2NvcmVfdXJsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZSBhbiB1cmwgYSBzY29yZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjaG9vc2UgcHJlZmVycmVkIFVSTHMKICAgICAgICBmb3IgYSBnaXZlbiBwcm9qZWN0IHJlbGVhc2UuCiAgICAgICAgIiIiCiAgICAgICAgdCA9IHVybHBhcnNlKHVybCkKICAgICAgICBiYXNlbmFtZSA9IHBvc2l4cGF0aC5iYXNlbmFtZSh0LnBhdGgpCiAgICAgICAgY29tcGF0aWJsZSA9IFRydWUKICAgICAgICBpc193aGVlbCA9IGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykKICAgICAgICBpZiBpc193aGVlbDoKICAgICAgICAgICAgY29tcGF0aWJsZSA9IGlzX2NvbXBhdGlibGUoV2hlZWwoYmFzZW5hbWUpLCBzZWxmLndoZWVsX3RhZ3MpCiAgICAgICAgcmV0dXJuICh0LnNjaGVtZSAhPSAnaHR0cHMnLCAncHlwaS5weXRob24ub3JnJyBpbiB0Lm5ldGxvYywKICAgICAgICAgICAgICAgIGlzX3doZWVsLCBjb21wYXRpYmxlLCBiYXNlbmFtZSkKCiAgICBkZWYgcHJlZmVyX3VybChzZWxmLCB1cmwxLCB1cmwyKToKICAgICAgICAiIiIKICAgICAgICBDaG9vc2Ugb25lIG9mIHR3byBVUkxzIHdoZXJlIGJvdGggYXJlIGNhbmRpZGF0ZXMgZm9yIGRpc3RyaWJ1dGlvbgogICAgICAgIGFyY2hpdmVzIGZvciB0aGUgc2FtZSB2ZXJzaW9uIG9mIGEgZGlzdHJpYnV0aW9uIChmb3IgZXhhbXBsZSwKICAgICAgICAudGFyLmd6IHZzLiB6aXApLgoKICAgICAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmYXZvdXJzIGh0dHBzOi8vIFVSTHMgb3ZlciBodHRwOi8vLCBhcmNoaXZlcwogICAgICAgIGZyb20gUHlQSSBvdmVyIHRob3NlIGZyb20gb3RoZXIgbG9jYXRpb25zLCB3aGVlbCBjb21wYXRpYmlsaXR5IChpZiBhCiAgICAgICAgd2hlZWwpIGFuZCB0aGVuIHRoZSBhcmNoaXZlIG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gdXJsMgogICAgICAgIGlmIHVybDE6CiAgICAgICAgICAgIHMxID0gc2VsZi5zY29yZV91cmwodXJsMSkKICAgICAgICAgICAgczIgPSBzZWxmLnNjb3JlX3VybCh1cmwyKQogICAgICAgICAgICBpZiBzMSA+IHMyOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gdXJsMQogICAgICAgICAgICBpZiByZXN1bHQgIT0gdXJsMjoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm90IHJlcGxhY2luZyAlciB3aXRoICVyJywgdXJsMSwgdXJsMikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVwbGFjaW5nICVyIHdpdGggJXInLCB1cmwxLCB1cmwyKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc3BsaXRfZmlsZW5hbWUoc2VsZiwgZmlsZW5hbWUsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBzcGxpdCBhIGZpbGVuYW1lIGluIHByb2plY3QgbmFtZSwgdmVyc2lvbiBhbmQgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNwbGl0X2ZpbGVuYW1lKGZpbGVuYW1lLCBwcm9qZWN0X25hbWUpCgogICAgZGVmIGNvbnZlcnRfdXJsX3RvX2Rvd25sb2FkX2luZm8oc2VsZiwgdXJsLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIgogICAgICAgIFNlZSBpZiBhIFVSTCBpcyBhIGNhbmRpZGF0ZSBmb3IgYSBkb3dubG9hZCBVUkwgZm9yIGEgcHJvamVjdCAodGhlIFVSTAogICAgICAgIGhhcyB0eXBpY2FsbHkgYmVlbiBzY3JhcGVkIGZyb20gYW4gSFRNTCBwYWdlKS4KCiAgICAgICAgSWYgaXQgaXMsIGEgZGljdGlvbmFyeSBpcyByZXR1cm5lZCB3aXRoIGtleXMgIm5hbWUiLCAidmVyc2lvbiIsCiAgICAgICAgImZpbGVuYW1lIiBhbmQgInVybCI7IG90aGVyd2lzZSwgTm9uZSBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkZWYgc2FtZV9wcm9qZWN0KG5hbWUxLCBuYW1lMik6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVfbmFtZShuYW1lMSkgPT0gbm9ybWFsaXplX25hbWUobmFtZTIpCgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlKHVybCkKICAgICAgICBpZiBmcmFnLmxvd2VyKCkuc3RhcnRzd2l0aCgnZWdnPScpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzOiB2ZXJzaW9uIGhpbnQgaW4gZnJhZ21lbnQ6ICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgZnJhZykKICAgICAgICBtID0gSEFTSEVSX0hBU0gubWF0Y2goZnJhZykKICAgICAgICBpZiBtOgogICAgICAgICAgICBhbGdvLCBkaWdlc3QgPSBtLmdyb3VwcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWxnbywgZGlnZXN0ID0gTm9uZSwgTm9uZQogICAgICAgIG9yaWdwYXRoID0gcGF0aAogICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdID09ICcvJzoKICAgICAgICAgICAgcGF0aCA9IHBhdGhbOi0xXQogICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChwYXRoKQogICAgICAgICAgICAgICAgaWYgaXNfY29tcGF0aWJsZSh3aGVlbCwgc2VsZi53aGVlbF90YWdzKToKICAgICAgICAgICAgICAgICAgICBpZiBwcm9qZWN0X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gc2FtZV9wcm9qZWN0KHdoZWVsLm5hbWUsIHByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IHdoZWVsLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6IHdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiB3aGVlbC5maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgb3JpZ3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgJycpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24tdmVyc2lvbic6ICcsICcuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy4nLmpvaW4obGlzdCh2WzI6XSkpIGZvciB2IGluIHdoZWVsLnB5dmVyXSksCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnaW52YWxpZCBwYXRoIGZvciB3aGVlbDogJXMnLCBwYXRoKQogICAgICAgIGVsaWYgcGF0aC5lbmRzd2l0aChzZWxmLmRvd25sb2FkYWJsZV9leHRlbnNpb25zKToKICAgICAgICAgICAgcGF0aCA9IGZpbGVuYW1lID0gcG9zaXhwYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5kb3dubG9hZGFibGVfZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs6LWxlbihleHQpXQogICAgICAgICAgICAgICAgICAgIHQgPSBzZWxmLnNwbGl0X2ZpbGVuYW1lKHBhdGgsIHByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgdDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBtYXRjaCBmb3IgcHJvamVjdC92ZXJzaW9uOiAlcycsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiwgcHl2ZXIgPSB0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwcm9qZWN0X25hbWUgb3Igc2FtZV9wcm9qZWN0KHByb2plY3RfbmFtZSwgbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsJzogdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIG9yaWdwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCAnJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMncGFja2FnZXR5cGUnOiAnc2Rpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHl2ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydweXRob24tdmVyc2lvbiddID0gcHl2ZXIKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHJlc3VsdCBhbmQgYWxnbzoKICAgICAgICAgICAgcmVzdWx0Wyclc19kaWdlc3QnICUgYWxnb10gPSBkaWdlc3QKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9nZXRfZGlnZXN0KHNlbGYsIGluZm8pOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGRpZ2VzdCBmcm9tIGEgZGljdGlvbmFyeSBieSBsb29raW5nIGF0IGtleXMgb2YgdGhlIGZvcm0KICAgICAgICAnYWxnb19kaWdlc3QnLgoKICAgICAgICBSZXR1cm5zIGEgMi10dXBsZSAoYWxnbywgZGlnZXN0KSBpZiBmb3VuZCwgZWxzZSBOb25lLiBDdXJyZW50bHkKICAgICAgICBsb29rcyBvbmx5IGZvciBTSEEyNTYsIHRoZW4gTUQ1LgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBmb3IgYWxnbyBpbiAoJ3NoYTI1NicsICdtZDUnKToKICAgICAgICAgICAga2V5ID0gJyVzX2RpZ2VzdCcgJSBhbGdvCiAgICAgICAgICAgIGlmIGtleSBpbiBpbmZvOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gKGFsZ28sIGluZm9ba2V5XSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfdXBkYXRlX3ZlcnNpb25fZGF0YShzZWxmLCByZXN1bHQsIGluZm8pOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSBhIHJlc3VsdCBkaWN0aW9uYXJ5ICh0aGUgZmluYWwgcmVzdWx0IGZyb20gX2dldF9wcm9qZWN0KSB3aXRoIGEKICAgICAgICBkaWN0aW9uYXJ5IGZvciBhIHNwZWNpZmljIHZlcnNpb24sIHdoaWNoIHR5cGljYWxseSBob2xkcyBpbmZvcm1hdGlvbgogICAgICAgIGdsZWFuZWQgZnJvbSBhIGZpbGVuYW1lIG9yIFVSTCBmb3IgYW4gYXJjaGl2ZSBmb3IgdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gaW5mby5wb3AoJ25hbWUnKQogICAgICAgIHZlcnNpb24gPSBpbmZvLnBvcCgndmVyc2lvbicpCiAgICAgICAgaWYgdmVyc2lvbiBpbiByZXN1bHQ6CiAgICAgICAgICAgIGRpc3QgPSByZXN1bHRbdmVyc2lvbl0KICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdCA9IG1ha2VfZGlzdChuYW1lLCB2ZXJzaW9uLCBzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIG1kID0gZGlzdC5tZXRhZGF0YQogICAgICAgIGRpc3QuZGlnZXN0ID0gZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IGRpZ2VzdAogICAgICAgIGlmIG1kLnNvdXJjZV91cmwgIT0gaW5mb1sndXJsJ106CiAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBzZWxmLnByZWZlcl91cmwobWQuc291cmNlX3VybCwgdXJsKQogICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICByZXN1bHRbdmVyc2lvbl0gPSBkaXN0CgogICAgZGVmIGxvY2F0ZShzZWxmLCByZXF1aXJlbWVudCwgcHJlcmVsZWFzZXM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgdGhlIG1vc3QgcmVjZW50IGRpc3RyaWJ1dGlvbiB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbgogICAgICAgIHJlcXVpcmVtZW50LgoKICAgICAgICA6cGFyYW0gcmVxdWlyZW1lbnQ6IEEgcmVxdWlyZW1lbnQgb2YgdGhlIGZvcm0gJ2ZvbyAoMS4wKScgb3IgcGVyaGFwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbyAoPj0gMS4wLCA8IDIuMCwgIT0gMS4zKScKICAgICAgICA6cGFyYW0gcHJlcmVsZWFzZXM6IElmIGBgVHJ1ZWBgLCBhbGxvdyBwcmUtcmVsZWFzZSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbG9jYXRlZC4gT3RoZXJ3aXNlLCBwcmUtcmVsZWFzZSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCByZXR1cm5lZC4KICAgICAgICA6cmV0dXJuOiBBIDpjbGFzczpgRGlzdHJpYnV0aW9uYCBpbnN0YW5jZSwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaAogICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiBjb3VsZCBiZSBsb2NhdGVkLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICByID0gcGFyc2VfcmVxdWlyZW1lbnQocmVxdWlyZW1lbnQpCiAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdOb3QgYSB2YWxpZCByZXF1aXJlbWVudDogJXInICUgcmVxdWlyZW1lbnQpCiAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLnNjaGVtZSkKICAgICAgICBzZWxmLm1hdGNoZXIgPSBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIoci5yZXF1aXJlbWVudCkKICAgICAgICBsb2dnZXIuZGVidWcoJ21hdGNoZXI6ICVzICglcyknLCBtYXRjaGVyLCB0eXBlKG1hdGNoZXIpLl9fbmFtZV9fKQogICAgICAgIHZlcnNpb25zID0gc2VsZi5nZXRfcHJvamVjdChyLm5hbWUpCiAgICAgICAgaWYgbGVuKHZlcnNpb25zKSA+IDI6ICAgIyB1cmxzIGFuZCBkaWdlc3RzIGtleXMgYXJlIHByZXNlbnQKICAgICAgICAgICAgIyBzb21ldGltZXMsIHZlcnNpb25zIGFyZSBpbnZhbGlkCiAgICAgICAgICAgIHNsaXN0ID0gW10KICAgICAgICAgICAgdmNscyA9IG1hdGNoZXIudmVyc2lvbl9jbGFzcwogICAgICAgICAgICBmb3IgayBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgICAgIGlmIGsgaW4gKCd1cmxzJywgJ2RpZ2VzdHMnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVyLm1hdGNoKGspOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGRpZCBub3QgbWF0Y2ggJXInLCBtYXRjaGVyLCBrKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByZXJlbGVhc2VzIG9yIG5vdCB2Y2xzKGspLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoaykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc2tpcHBpbmcgcHJlLXJlbGVhc2UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uICVzIG9mICVzJywgaywgbWF0Y2hlci5uYW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvciBtYXRjaGluZyAlcyB3aXRoICVyJywgbWF0Y2hlciwgaykKICAgICAgICAgICAgICAgICAgICBwYXNzICMgc2xpc3QuYXBwZW5kKGspCiAgICAgICAgICAgIGlmIGxlbihzbGlzdCkgPiAxOgogICAgICAgICAgICAgICAgc2xpc3QgPSBzb3J0ZWQoc2xpc3QsIGtleT1zY2hlbWUua2V5KQogICAgICAgICAgICBpZiBzbGlzdDoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc29ydGVkIGxpc3Q6ICVzJywgc2xpc3QpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2xpc3RbLTFdCiAgICAgICAgICAgICAgICByZXN1bHQgPSB2ZXJzaW9uc1t2ZXJzaW9uXQogICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgaWYgci5leHRyYXM6CiAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmFzID0gci5leHRyYXMKICAgICAgICAgICAgcmVzdWx0LmRvd25sb2FkX3VybHMgPSB2ZXJzaW9ucy5nZXQoJ3VybHMnLCB7fSkuZ2V0KHZlcnNpb24sIHNldCgpKQogICAgICAgICAgICBkID0ge30KICAgICAgICAgICAgc2QgPSB2ZXJzaW9ucy5nZXQoJ2RpZ2VzdHMnLCB7fSkKICAgICAgICAgICAgZm9yIHVybCBpbiByZXN1bHQuZG93bmxvYWRfdXJsczoKICAgICAgICAgICAgICAgIGlmIHVybCBpbiBzZDoKICAgICAgICAgICAgICAgICAgICBkW3VybF0gPSBzZFt1cmxdCiAgICAgICAgICAgIHJlc3VsdC5kaWdlc3RzID0gZAogICAgICAgIHNlbGYubWF0Y2hlciA9IE5vbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUHlQSVJQQ0xvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIFhNTC1SUEMgdG8gbG9jYXRlIGRpc3RyaWJ1dGlvbnMuIEl0IHRoZXJlZm9yZQogICAgY2Fubm90IGJlIHVzZWQgd2l0aCBzaW1wbGUgbWlycm9ycyAodGhhdCBvbmx5IG1pcnJvciBmaWxlIGNvbnRlbnQpLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCB0byB1c2UgZm9yIFhNTC1SUEMuCiAgICAgICAgOnBhcmFtIGt3YXJnczogUGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKFB5UElSUENMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gdXJsCiAgICAgICAgc2VsZi5jbGllbnQgPSBTZXJ2ZXJQcm94eSh1cmwsIHRpbWVvdXQ9My4wKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNldChzZWxmLmNsaWVudC5saXN0X3BhY2thZ2VzKCkpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICB2ZXJzaW9ucyA9IHNlbGYuY2xpZW50LnBhY2thZ2VfcmVsZWFzZXMobmFtZSwgVHJ1ZSkKICAgICAgICBmb3IgdiBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgdXJscyA9IHNlbGYuY2xpZW50LnJlbGVhc2VfdXJscyhuYW1lLCB2KQogICAgICAgICAgICBkYXRhID0gc2VsZi5jbGllbnQucmVsZWFzZV9kYXRhKG5hbWUsIHYpCiAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICBtZXRhZGF0YS5uYW1lID0gZGF0YVsnbmFtZSddCiAgICAgICAgICAgIG1ldGFkYXRhLnZlcnNpb24gPSBkYXRhWyd2ZXJzaW9uJ10KICAgICAgICAgICAgbWV0YWRhdGEubGljZW5zZSA9IGRhdGEuZ2V0KCdsaWNlbnNlJykKICAgICAgICAgICAgbWV0YWRhdGEua2V5d29yZHMgPSBkYXRhLmdldCgna2V5d29yZHMnLCBbXSkKICAgICAgICAgICAgbWV0YWRhdGEuc3VtbWFyeSA9IGRhdGEuZ2V0KCdzdW1tYXJ5JykKICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihtZXRhZGF0YSkKICAgICAgICAgICAgaWYgdXJsczoKICAgICAgICAgICAgICAgIGluZm8gPSB1cmxzWzBdCiAgICAgICAgICAgICAgICBtZXRhZGF0YS5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0W3ZdID0gZGlzdAogICAgICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgICAgIGRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHYsIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBkaWdlc3QKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBQeVBJSlNPTkxvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIFB5UEkncyBKU09OIGludGVyZmFjZS4gSXQncyB2ZXJ5IGxpbWl0ZWQgaW4gZnVuY3Rpb25hbGl0eQogICAgYW5kIHByb2JhYmx5IG5vdCB3b3J0aCB1c2luZy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFB5UElKU09OTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5iYXNlX3VybCA9IGVuc3VyZV9zbGFzaCh1cmwpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgYXZhaWxhYmxlIGZyb20gdGhpcyBsb2NhdG9yJykKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgJyVzL2pzb24nICUgcXVvdGUobmFtZSkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXNwID0gc2VsZi5vcGVuZXIub3Blbih1cmwpCiAgICAgICAgICAgIGRhdGEgPSByZXNwLnJlYWQoKS5kZWNvZGUoKSAjIGZvciBub3cKICAgICAgICAgICAgZCA9IGpzb24ubG9hZHMoZGF0YSkKICAgICAgICAgICAgbWQgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIGRhdGEgPSBkWydpbmZvJ10KICAgICAgICAgICAgbWQubmFtZSA9IGRhdGFbJ25hbWUnXQogICAgICAgICAgICBtZC52ZXJzaW9uID0gZGF0YVsndmVyc2lvbiddCiAgICAgICAgICAgIG1kLmxpY2Vuc2UgPSBkYXRhLmdldCgnbGljZW5zZScpCiAgICAgICAgICAgIG1kLmtleXdvcmRzID0gZGF0YS5nZXQoJ2tleXdvcmRzJywgW10pCiAgICAgICAgICAgIG1kLnN1bW1hcnkgPSBkYXRhLmdldCgnc3VtbWFyeScpCiAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24obWQpCiAgICAgICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICAgICAgdXJscyA9IGRbJ3VybHMnXQogICAgICAgICAgICByZXN1bHRbbWQudmVyc2lvbl0gPSBkaXN0CiAgICAgICAgICAgIGZvciBpbmZvIGluIGRbJ3VybHMnXToKICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICBkaXN0LmRvd25sb2FkX3VybHMuYWRkKHVybCkKICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0c1t1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdChtZC52ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICMgTm93IGdldCBvdGhlciByZWxlYXNlcwogICAgICAgICAgICBmb3IgdmVyc2lvbiwgaW5mb3MgaW4gZFsncmVsZWFzZXMnXS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmVyc2lvbiA9PSBtZC52ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgYWxyZWFkeSBkb25lCiAgICAgICAgICAgICAgICBvbWQgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgICAgICBvbWQubmFtZSA9IG1kLm5hbWUKICAgICAgICAgICAgICAgIG9tZC52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgICAgICAgICAgb2Rpc3QgPSBEaXN0cmlidXRpb24ob21kKQogICAgICAgICAgICAgICAgb2Rpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdFt2ZXJzaW9uXSA9IG9kaXN0CiAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiBpbmZvczoKICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgICAgIG9kaXN0LmRvd25sb2FkX3VybHMuYWRkKHVybCkKICAgICAgICAgICAgICAgICAgICBvZGlzdC5kaWdlc3RzW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdCh2ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQojICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKIyAgICAgICAgICAgICAgICBtZC5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KIyAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKIyAgICAgICAgICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiMgICAgICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKIyAgICAgICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KIyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdChtZC52ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKIyAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZXJyb3JzLnB1dCh0ZXh0X3R5cGUoZSkpCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0pTT04gZmV0Y2ggZmFpbGVkOiAlcycsIGUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFBhZ2Uob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2NyYXBlZCBIVE1MIHBhZ2UuCiAgICAiIiIKICAgICMgVGhlIGZvbGxvd2luZyBzbGlnaHRseSBoYWlyeS1sb29raW5nIHJlZ2V4IGp1c3QgbG9va3MgZm9yIHRoZSBjb250ZW50cyBvZgogICAgIyBhbiBhbmNob3IgbGluaywgd2hpY2ggaGFzIGFuIGF0dHJpYnV0ZSAiaHJlZiIgZWl0aGVyIGltbWVkaWF0ZWx5IHByZWNlZGVkCiAgICAjIG9yIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgInJlbCIgYXR0cmlidXRlLiBUaGUgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKICAgICMgZGVjbGFyZWQgd2l0aCBkb3VibGUgcXVvdGVzLCBzaW5nbGUgcXVvdGVzIG9yIG5vIHF1b3RlcyAtIHdoaWNoIGxlYWRzIHRvCiAgICAjIHRoZSBsZW5ndGggb2YgdGhlIGV4cHJlc3Npb24uCiAgICBfaHJlZiA9IHJlLmNvbXBpbGUoIiIiCihyZWxccyo9XHMqKD86Iig/UDxyZWwxPlteIl0qKSJ8Jyg/UDxyZWwyPlteJ10qKSd8KD9QPHJlbDM+W14+XHNcbl0qKSlccyspPwpocmVmXHMqPVxzKig/OiIoP1A8dXJsMT5bXiJdKikifCcoP1A8dXJsMj5bXiddKiknfCg/UDx1cmwzPltePlxzXG5dKikpCihccytyZWxccyo9XHMqKD86Iig/UDxyZWw0PlteIl0qKSJ8Jyg/UDxyZWw1PlteJ10qKSd8KD9QPHJlbDY+W14+XHNcbl0qKSkpPwoiIiIsIHJlLkkgfCByZS5TIHwgcmUuWCkKICAgIF9iYXNlID0gcmUuY29tcGlsZShyIiIiPGJhc2VccytocmVmXHMqPVxzKlsnIl0/KFteJyI+XSspIiIiLCByZS5JIHwgcmUuUykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlIHdpdGggdGhlIFVuaWNvZGUgcGFnZSBjb250ZW50cyBhbmQgdGhlIFVSTCB0aGV5CiAgICAgICAgY2FtZSBmcm9tLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmJhc2VfdXJsID0gc2VsZi51cmwgPSB1cmwKICAgICAgICBtID0gc2VsZi5fYmFzZS5zZWFyY2goc2VsZi5kYXRhKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHNlbGYuYmFzZV91cmwgPSBtLmdyb3VwKDEpCgogICAgX2NsZWFuX3JlID0gcmUuY29tcGlsZShyJ1teYS16MC05JCYrLC86Oz0/QC4jJV9cXHwtXScsIHJlLkkpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGxpbmtzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgVVJMcyBvZiBhbGwgdGhlIGxpbmtzIG9uIGEgcGFnZSB0b2dldGhlciB3aXRoIGluZm9ybWF0aW9uCiAgICAgICAgYWJvdXQgdGhlaXIgInJlbCIgYXR0cmlidXRlLCBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggb25lcyB0byB0cmVhdCBhcwogICAgICAgIGRvd25sb2FkcyBhbmQgd2hpY2ggb25lcyB0byBxdWV1ZSBmb3IgZnVydGhlciBzY3JhcGluZy4KICAgICAgICAiIiIKICAgICAgICBkZWYgY2xlYW4odXJsKToKICAgICAgICAgICAgIlRpZHkgdXAgYW4gVVJMLiIKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcXVvdGUocGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCBmcmFnKSkKCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5faHJlZi5maW5kaXRlcihzZWxmLmRhdGEpOgogICAgICAgICAgICBkID0gbWF0Y2guZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICByZWwgPSAoZFsncmVsMSddIG9yIGRbJ3JlbDInXSBvciBkWydyZWwzJ10gb3IKICAgICAgICAgICAgICAgICAgIGRbJ3JlbDQnXSBvciBkWydyZWw1J10gb3IgZFsncmVsNiddKQogICAgICAgICAgICB1cmwgPSBkWyd1cmwxJ10gb3IgZFsndXJsMiddIG9yIGRbJ3VybDMnXQogICAgICAgICAgICB1cmwgPSB1cmxqb2luKHNlbGYuYmFzZV91cmwsIHVybCkKICAgICAgICAgICAgdXJsID0gdW5lc2NhcGUodXJsKQogICAgICAgICAgICB1cmwgPSBzZWxmLl9jbGVhbl9yZS5zdWIobGFtYmRhIG06ICclJSUyeCcgJSBvcmQobS5ncm91cCgwKSksIHVybCkKICAgICAgICAgICAgcmVzdWx0LmFkZCgodXJsLCByZWwpKQogICAgICAgICMgV2Ugc29ydCB0aGUgcmVzdWx0LCBob3BpbmcgdG8gYnJpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb25zCiAgICAgICAgIyB0byB0aGUgZnJvbnQKICAgICAgICByZXN1bHQgPSBzb3J0ZWQocmVzdWx0LCBrZXk9bGFtYmRhIHQ6IHRbMF0sIHJldmVyc2U9VHJ1ZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgU2ltcGxlU2NyYXBpbmdMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBBIGxvY2F0b3Igd2hpY2ggc2NyYXBlcyBIVE1MIHBhZ2VzIHRvIGxvY2F0ZSBkb3dubG9hZHMgZm9yIGEgZGlzdHJpYnV0aW9uLgogICAgVGhpcyBydW5zIG11bHRpcGxlIHRocmVhZHMgdG8gZG8gdGhlIEkvTzsgcGVyZm9ybWFuY2UgaXMgYXQgbGVhc3QgYXMgZ29vZAogICAgYXMgcGlwJ3MgUGFja2FnZUZpbmRlciwgd2hpY2ggd29ya3MgaW4gYW4gYW5hbG9nb3VzIGZhc2hpb24uCiAgICAiIiIKCiAgICAjIFRoZXNlIGFyZSB1c2VkIHRvIGRlYWwgd2l0aCB2YXJpb3VzIENvbnRlbnQtRW5jb2Rpbmcgc2NoZW1lcy4KICAgIGRlY29kZXJzID0gewogICAgICAgICdkZWZsYXRlJzogemxpYi5kZWNvbXByZXNzLAogICAgICAgICdnemlwJzogbGFtYmRhIGI6IGd6aXAuR3ppcEZpbGUoZmlsZW9iaj1CeXRlc0lPKGQpKS5yZWFkKCksCiAgICAgICAgJ25vbmUnOiBsYW1iZGEgYjogYiwKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCB0aW1lb3V0PU5vbmUsIG51bV93b3JrZXJzPTEwLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gdXJsOiBUaGUgcm9vdCBVUkwgdG8gdXNlIGZvciBzY3JhcGluZy4KICAgICAgICA6cGFyYW0gdGltZW91dDogVGhlIHRpbWVvdXQsIGluIHNlY29uZHMsIHRvIGJlIGFwcGxpZWQgdG8gcmVxdWVzdHMuCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVmYXVsdHMgdG8gYGBOb25lYGAgKG5vIHRpbWVvdXQgc3BlY2lmaWVkKS4KICAgICAgICA6cGFyYW0gbnVtX3dvcmtlcnM6IFRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgeW91IHdhbnQgdG8gZG8gSS9PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkZWZhdWx0cyB0byAxMC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoU2ltcGxlU2NyYXBpbmdMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gZW5zdXJlX3NsYXNoKHVybCkKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgc2VsZi5fcGFnZV9jYWNoZSA9IHt9CiAgICAgICAgc2VsZi5fc2VlbiA9IHNldCgpCiAgICAgICAgc2VsZi5fdG9fZmV0Y2ggPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5fYmFkX2hvc3RzID0gc2V0KCkKICAgICAgICBzZWxmLnNraXBfZXh0ZXJuYWxzID0gRmFsc2UKICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gbnVtX3dvcmtlcnMKICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKICAgICAgICAjIFNlZSBpc3N1ZSAjNDU6IHdlIG5lZWQgdG8gYmUgcmVzaWxpZW50IHdoZW4gdGhlIGxvY2F0b3IgaXMgdXNlZAogICAgICAgICMgaW4gYSB0aHJlYWQsIGUuZy4gd2l0aCBjb25jdXJyZW50LmZ1dHVyZXMuIFdlIGNhbid0IHVzZSBzZWxmLl9sb2NrCiAgICAgICAgIyBhcyBpdCBpcyBmb3IgY29vcmRpbmF0aW5nIG91ciBpbnRlcm5hbCB0aHJlYWRzIC0gdGhlIG9uZXMgY3JlYXRlZAogICAgICAgICMgaW4gX3ByZXBhcmVfdGhyZWFkcy4KICAgICAgICBzZWxmLl9ncGxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQoKICAgIGRlZiBfcHJlcGFyZV90aHJlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRocmVhZHMgYXJlIGNyZWF0ZWQgb25seSB3aGVuIGdldF9wcm9qZWN0IGlzIGNhbGxlZCwgYW5kIHRlcm1pbmF0ZQogICAgICAgIGJlZm9yZSBpdCByZXR1cm5zLiBUaGV5IGFyZSB0aGVyZSBwcmltYXJpbHkgdG8gcGFyYWxsZWxpc2UgSS9PIChpLmUuCiAgICAgICAgZmV0Y2hpbmcgd2ViIHBhZ2VzKS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl90aHJlYWRzID0gW10KICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLm51bV93b3JrZXJzKToKICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX2ZldGNoKQogICAgICAgICAgICB0LnNldERhZW1vbihUcnVlKQogICAgICAgICAgICB0LnN0YXJ0KCkKICAgICAgICAgICAgc2VsZi5fdGhyZWFkcy5hcHBlbmQodCkKCiAgICBkZWYgX3dhaXRfdGhyZWFkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZWxsIGFsbCB0aGUgdGhyZWFkcyB0byB0ZXJtaW5hdGUgKGJ5IHNlbmRpbmcgYSBzZW50aW5lbCB2YWx1ZSkgYW5kCiAgICAgICAgd2FpdCBmb3IgdGhlbSB0byBkbyBzby4KICAgICAgICAiIiIKICAgICAgICAjIE5vdGUgdGhhdCB5b3UgbmVlZCB0d28gbG9vcHMsIHNpbmNlIHlvdSBjYW4ndCBzYXkgd2hpY2gKICAgICAgICAjIHRocmVhZCB3aWxsIGdldCBlYWNoIHNlbnRpbmVsCiAgICAgICAgZm9yIHQgaW4gc2VsZi5fdGhyZWFkczoKICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KE5vbmUpICAgICMgc2VudGluZWwKICAgICAgICBmb3IgdCBpbiBzZWxmLl90aHJlYWRzOgogICAgICAgICAgICB0LmpvaW4oKQogICAgICAgIHNlbGYuX3RocmVhZHMgPSBbXQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgd2l0aCBzZWxmLl9ncGxvY2s6CiAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0CiAgICAgICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gbmFtZQogICAgICAgICAgICB1cmwgPSB1cmxqb2luKHNlbGYuYmFzZV91cmwsICclcy8nICUgcXVvdGUobmFtZSkpCiAgICAgICAgICAgIHNlbGYuX3NlZW4uY2xlYXIoKQogICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlLmNsZWFyKCkKICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV90aHJlYWRzKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdWV1ZWluZyAlcycsIHVybCkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnB1dCh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLl90b19mZXRjaC5qb2luKCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNlbGYuX3dhaXRfdGhyZWFkcygpCiAgICAgICAgICAgIGRlbCBzZWxmLnJlc3VsdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBwbGF0Zm9ybV9kZXBlbmRlbnQgPSByZS5jb21waWxlKHInXGIobGludXgtKGlcZDg2fHg4Nl82NHxhcm1cdyspfCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcid3aW4oMzJ8LWFtZDY0KXxtYWNvc3gtP1xkKylcYicsIHJlLkkpCgogICAgZGVmIF9pc19wbGF0Zm9ybV9kZXBlbmRlbnQoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBEb2VzIGFuIFVSTCByZWZlciB0byBhIHBsYXRmb3JtLXNwZWNpZmljIGRvd25sb2FkPwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBsYXRmb3JtX2RlcGVuZGVudC5zZWFyY2godXJsKQoKICAgIGRlZiBfcHJvY2Vzc19kb3dubG9hZChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIFNlZSBpZiBhbiBVUkwgaXMgYSBzdWl0YWJsZSBkb3dubG9hZCBmb3IgYSBwcm9qZWN0LgoKICAgICAgICBJZiBpdCBpcywgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3VsdCBkaWN0aW9uYXJ5IChmb3IKICAgICAgICBfZ2V0X3Byb2plY3QpIGFib3V0IHRoZSBzcGVjaWZpYyB2ZXJzaW9uIGl0J3MgZm9yLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpc24ndCBhY3R1YWxseSB1c2VkIG90aGVyIHRoYW4gYXMgYSBib29sZWFuCiAgICAgICAgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5faXNfcGxhdGZvcm1fZGVwZW5kZW50KHVybCk6CiAgICAgICAgICAgIGluZm8gPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIHNlbGYucHJvamVjdF9uYW1lKQogICAgICAgIGxvZ2dlci5kZWJ1ZygncHJvY2Vzc19kb3dubG9hZDogJXMgLT4gJXMnLCB1cmwsIGluZm8pCiAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOiAgICAjIG5lZWRlZCBiZWNhdXNlIHNlbGYucmVzdWx0IGlzIHNoYXJlZAogICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3ZlcnNpb25fZGF0YShzZWxmLnJlc3VsdCwgaW5mbykKICAgICAgICByZXR1cm4gaW5mbwoKICAgIGRlZiBfc2hvdWxkX3F1ZXVlKHNlbGYsIGxpbmssIHJlZmVycmVyLCByZWwpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSB3aGV0aGVyIGEgbGluayBVUkwgZnJvbSBhIHJlZmVycmluZyBwYWdlIGFuZCB3aXRoIGEKICAgICAgICBwYXJ0aWN1bGFyICJyZWwiIGF0dHJpYnV0ZSBzaG91bGQgYmUgcXVldWVkIGZvciBzY3JhcGluZy4KICAgICAgICAiIiIKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgXywgXywgXyA9IHVybHBhcnNlKGxpbmspCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aChzZWxmLnNvdXJjZV9leHRlbnNpb25zICsgc2VsZi5iaW5hcnlfZXh0ZW5zaW9ucyArCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y2x1ZGVkX2V4dGVuc2lvbnMpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgc2VsZi5za2lwX2V4dGVybmFscyBhbmQgbm90IGxpbmsuc3RhcnRzd2l0aChzZWxmLmJhc2VfdXJsKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIG5vdCByZWZlcnJlci5zdGFydHN3aXRoKHNlbGYuYmFzZV91cmwpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgcmVsIG5vdCBpbiAoJ2hvbWVwYWdlJywgJ2Rvd25sb2FkJyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycsICdmdHAnKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHNlbGYuX2lzX3BsYXRmb3JtX2RlcGVuZGVudChsaW5rKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0ID0gbmV0bG9jLnNwbGl0KCc6JywgMSlbMF0KICAgICAgICAgICAgaWYgaG9zdC5sb3dlcigpID09ICdsb2NhbGhvc3QnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBsb2dnZXIuZGVidWcoJ3Nob3VsZF9xdWV1ZTogJXMgKCVzKSBmcm9tICVzIC0+ICVzJywgbGluaywgcmVsLAogICAgICAgICAgICAgICAgICAgICByZWZlcnJlciwgcmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2ZldGNoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIFVSTCB0byBmZXRjaCBmcm9tIHRoZSB3b3JrIHF1ZXVlLCBnZXQgdGhlIEhUTUwgcGFnZSwgZXhhbWluZSBpdHMKICAgICAgICBsaW5rcyBmb3IgZG93bmxvYWQgY2FuZGlkYXRlcyBhbmQgY2FuZGlkYXRlcyBmb3IgZnVydGhlciBzY3JhcGluZy4KCiAgICAgICAgVGhpcyBpcyBhIGhhbmR5IG1ldGhvZCB0byBydW4gaW4gYSB0aHJlYWQuCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdXJsID0gc2VsZi5fdG9fZmV0Y2guZ2V0KCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgdXJsOgogICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBzZWxmLmdldF9wYWdlKHVybCkKICAgICAgICAgICAgICAgICAgICBpZiBwYWdlIGlzIE5vbmU6ICAgICMgZS5nLiBhZnRlciBhbiBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGZvciBsaW5rLCByZWwgaW4gcGFnZS5saW5rczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluayBub3QgaW4gc2VsZi5fc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlZW4uYWRkKGxpbmspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm90IHNlbGYuX3Byb2Nlc3NfZG93bmxvYWQobGluaykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2hvdWxkX3F1ZXVlKGxpbmssIHVybCwgcmVsKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdWV1ZWluZyAlcyBmcm9tICVzJywgbGluaywgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnB1dChsaW5rKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLnB1dCh0ZXh0X3R5cGUoZSkpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBkbyB0aGlzLCB0byBhdm9pZCBoYW5ncyA6LSkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnRhc2tfZG9uZSgpCiAgICAgICAgICAgIGlmIG5vdCB1cmw6CiAgICAgICAgICAgICAgICAjbG9nZ2VyLmRlYnVnKCdTZW50aW5lbCBzZWVuLCBxdWl0dGluZy4nKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZ2V0X3BhZ2Uoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIEhUTUwgZm9yIGFuIFVSTCwgcG9zc2libHkgZnJvbSBhbiBpbi1tZW1vcnkgY2FjaGUuCgogICAgICAgIFhYWCBUT0RPIE5vdGU6IHRoaXMgY2FjaGUgaXMgbmV2ZXIgYWN0dWFsbHkgY2xlYXJlZC4gSXQncyBhc3N1bWVkIHRoYXQKICAgICAgICB0aGUgZGF0YSB3b24ndCBnZXQgc3RhbGUgb3ZlciB0aGUgbGlmZXRpbWUgb2YgYSBsb2NhdG9yIGluc3RhbmNlIChub3QKICAgICAgICBuZWNlc3NhcmlseSB0cnVlIGZvciB0aGUgZGVmYXVsdF9sb2NhdG9yKS4KICAgICAgICAiIiIKICAgICAgICAjIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9FYXN5SW5zdGFsbCNwYWNrYWdlLWluZGV4LWFwaQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBfLCBfLCBfID0gdXJscGFyc2UodXJsKQogICAgICAgIGlmIHNjaGVtZSA9PSAnZmlsZScgYW5kIG9zLnBhdGguaXNkaXIodXJsMnBhdGhuYW1lKHBhdGgpKToKICAgICAgICAgICAgdXJsID0gdXJsam9pbihlbnN1cmVfc2xhc2godXJsKSwgJ2luZGV4Lmh0bWwnKQoKICAgICAgICBpZiB1cmwgaW4gc2VsZi5fcGFnZV9jYWNoZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcGFnZV9jYWNoZVt1cmxdCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0dXJuaW5nICVzIGZyb20gY2FjaGU6ICVzJywgdXJsLCByZXN1bHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaG9zdCA9IG5ldGxvYy5zcGxpdCgnOicsIDEpWzBdCiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICAgICAgaWYgaG9zdCBpbiBzZWxmLl9iYWRfaG9zdHM6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nICVzIGR1ZSB0byBiYWQgaG9zdCAlcycsIHVybCwgaG9zdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsnQWNjZXB0LWVuY29kaW5nJzogJ2lkZW50aXR5J30pCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyAlcycsIHVybCkKICAgICAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5vcGVuZXIub3BlbihyZXEsIHRpbWVvdXQ9c2VsZi50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hlZCAlcycsIHVybCkKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcC5pbmZvKCkKICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJywgJycpCiAgICAgICAgICAgICAgICAgICAgaWYgSFRNTF9DT05URU5UX1RZUEUubWF0Y2goY29udGVudF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfdXJsID0gcmVzcC5nZXR1cmwoKQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcC5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBoZWFkZXJzLmdldCgnQ29udGVudC1FbmNvZGluZycpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciA9IHNlbGYuZGVjb2RlcnNbZW5jb2RpbmddICAgIyBmYWlsIGlmIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRlY29kZXIoZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmLTgnCiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDSEFSU0VULnNlYXJjaChjb250ZW50X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuY29kaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoJ2xhdGluLTEnKSAgICAjIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBhZ2UoZGF0YSwgZmluYWxfdXJsKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlW2ZpbmFsX3VybF0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGV4Y2VwdCBIVFRQRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICBpZiBlLmNvZGUgIT0gNDA0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRmV0Y2ggZmFpbGVkOiAlczogJXMnLCB1cmwsIGUpCiAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9iYWRfaG9zdHMuYWRkKGhvc3QpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFnZV9jYWNoZVt1cmxdID0gcmVzdWx0ICAgIyBldmVuIGlmIE5vbmUgKGZhaWx1cmUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIF9kaXN0bmFtZV9yZSA9IHJlLmNvbXBpbGUoJzxhIGhyZWY9W14+XSo+KFtePF0rKTwnKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBwYWdlID0gc2VsZi5nZXRfcGFnZShzZWxmLmJhc2VfdXJsKQogICAgICAgIGlmIG5vdCBwYWdlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gZ2V0ICVzJyAlIHNlbGYuYmFzZV91cmwpCiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuX2Rpc3RuYW1lX3JlLmZpbmRpdGVyKHBhZ2UuZGF0YSk6CiAgICAgICAgICAgIHJlc3VsdC5hZGQobWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgRGlyZWN0b3J5TG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBjbGFzcyBsb2NhdGVzIGRpc3RyaWJ1dGlvbnMgaW4gYSBkaXJlY3RvcnkgdHJlZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gcGF0aDogVGhlIHJvb3Qgb2YgdGhlIGRpcmVjdG9yeSB0cmVlIHRvIHNlYXJjaC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvcjoKICAgICAgICAgICAgICAgICAgICAgICAqIHJlY3Vyc2l2ZSAtIGlmIFRydWUgKHRoZSBkZWZhdWx0KSwgc3ViZGlyZWN0b3JpZXMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlZCBpbnRvLiBJZiBGYWxzZSwgb25seSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2VhcmNoZWQsCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5yZWN1cnNpdmUgPSBrd2FyZ3MucG9wKCdyZWN1cnNpdmUnLCBUcnVlKQogICAgICAgIHN1cGVyKERpcmVjdG9yeUxvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdOb3QgYSBkaXJlY3Rvcnk6ICVyJyAlIHBhdGgpCiAgICAgICAgc2VsZi5iYXNlX2RpciA9IHBhdGgKCiAgICBkZWYgc2hvdWxkX2luY2x1ZGUoc2VsZiwgZmlsZW5hbWUsIHBhcmVudCk6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIGEgZmlsZW5hbWUgYmUgY29uc2lkZXJlZCBhcyBhIGNhbmRpZGF0ZSBmb3IgYSBkaXN0cmlidXRpb24KICAgICAgICBhcmNoaXZlPyBBcyB3ZWxsIGFzIHRoZSBmaWxlbmFtZSwgdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBpdAogICAgICAgIGlzIHByb3ZpZGVkLCB0aG91Z2ggbm90IHVzZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuZHN3aXRoKHNlbGYuZG93bmxvYWRhYmxlX2V4dGVuc2lvbnMpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJhc2VfZGlyKToKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfaW5jbHVkZShmbiwgcm9vdCk6CiAgICAgICAgICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsdW5wYXJzZSgoJ2ZpbGUnLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKGZuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsICcnLCAnJykpCiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3ZlcnNpb25fZGF0YShyZXN1bHQsIGluZm8pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJhc2VfZGlyKToKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfaW5jbHVkZShmbiwgcm9vdCk6CiAgICAgICAgICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsdW5wYXJzZSgoJ2ZpbGUnLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKGZuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsICcnLCAnJykpCiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChpbmZvWyduYW1lJ10pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgSlNPTkxvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIHNwZWNpYWwgZXh0ZW5kZWQgbWV0YWRhdGEgKG5vdCBhdmFpbGFibGUgb24gUHlQSSkgYW5kIGlzCiAgICB0aGUgYmFzaXMgb2YgcGVyZm9ybWFudCBkZXBlbmRlbmN5IHJlc29sdXRpb24gaW4gZGlzdGxpYi4gT3RoZXIgbG9jYXRvcnMKICAgIHJlcXVpcmUgYXJjaGl2ZSBkb3dubG9hZHMgYmVmb3JlIGRlcGVuZGVuY2llcyBjYW4gYmUgZGV0ZXJtaW5lZCEgQXMgeW91CiAgICBtaWdodCBpbWFnaW5lLCB0aGF0IGNhbiBiZSBzbG93LgogICAgIiIiCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBhdmFpbGFibGUgZnJvbSB0aGlzIGxvY2F0b3InKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgZGF0YSA9IGdldF9wcm9qZWN0X2RhdGEobmFtZSkKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBmb3IgaW5mbyBpbiBkYXRhLmdldCgnZmlsZXMnLCBbXSk6CiAgICAgICAgICAgICAgICBpZiBpbmZvWydwdHlwZSddICE9ICdzZGlzdCcgb3IgaW5mb1sncHl2ZXJzaW9uJ10gIT0gJ3NvdXJjZSc6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgV2UgZG9uJ3Qgc3RvcmUgc3VtbWFyeSBpbiBwcm9qZWN0IG1ldGFkYXRhIGFzIGl0IG1ha2VzCiAgICAgICAgICAgICAgICAjIHRoZSBkYXRhIGJpZ2dlciBmb3Igbm8gYmVuZWZpdCBkdXJpbmcgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgIyByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICBkaXN0ID0gbWFrZV9kaXN0KGRhdGFbJ25hbWUnXSwgaW5mb1sndmVyc2lvbiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5PWRhdGEuZ2V0KCdzdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGxhY2Vob2xkZXIgZm9yIHN1bW1hcnknKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgICAgICAgICBtZC5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgICMgVE9ETyBTSEEyNTYgZGlnZXN0CiAgICAgICAgICAgICAgICBpZiAnZGlnZXN0JyBpbiBpbmZvIGFuZCBpbmZvWydkaWdlc3QnXToKICAgICAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdCA9ICgnbWQ1JywgaW5mb1snZGlnZXN0J10pCiAgICAgICAgICAgICAgICBtZC5kZXBlbmRlbmNpZXMgPSBpbmZvLmdldCgncmVxdWlyZW1lbnRzJywge30pCiAgICAgICAgICAgICAgICBkaXN0LmV4cG9ydHMgPSBpbmZvLmdldCgnZXhwb3J0cycsIHt9KQogICAgICAgICAgICAgICAgcmVzdWx0W2Rpc3QudmVyc2lvbl0gPSBkaXN0CiAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KGRpc3QudmVyc2lvbiwgc2V0KCkpLmFkZChpbmZvWyd1cmwnXSkKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBEaXN0UGF0aExvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciBmaW5kcyBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyBpbiBhIHBhdGguIEl0IGNhbiBiZSB1c2VmdWwgZm9yCiAgICBhZGRpbmcgdG8gYW4gOmNsYXNzOmBBZ2dyZWdhdGluZ0xvY2F0b3JgLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdHBhdGgsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gZGlzdHBhdGg6IEEgOmNsYXNzOmBEaXN0cmlidXRpb25QYXRoYCBpbnN0YW5jZSB0byBzZWFyY2guCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoRGlzdFBhdGhMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkaXN0cGF0aCwgRGlzdHJpYnV0aW9uUGF0aCkKICAgICAgICBzZWxmLmRpc3RwYXRoID0gZGlzdHBhdGgKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIGRpc3QgPSBzZWxmLmRpc3RwYXRoLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgIGRpc3QudmVyc2lvbjogZGlzdCwKICAgICAgICAgICAgICAgICd1cmxzJzoge2Rpc3QudmVyc2lvbjogc2V0KFtkaXN0LnNvdXJjZV91cmxdKX0sCiAgICAgICAgICAgICAgICAnZGlnZXN0cyc6IHtkaXN0LnZlcnNpb246IHNldChbTm9uZV0pfQogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIEFnZ3JlZ2F0aW5nTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBjbGFzcyBhbGxvd3MgeW91IHRvIGNoYWluIGFuZC9vciBtZXJnZSBhIGxpc3Qgb2YgbG9jYXRvcnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbG9jYXRvcnMsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gbG9jYXRvcnM6IFRoZSBsaXN0IG9mIGxvY2F0b3JzIHRvIHNlYXJjaC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvcjoKICAgICAgICAgICAgICAgICAgICAgICAqIG1lcmdlIC0gaWYgRmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaCBmcm9tIGFueSBvZiB0aGUgbG9jYXRvcnMgaXMgcmV0dXJuZWQuIElmIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0cyBmcm9tIGFsbCBsb2NhdG9ycyBhcmUgbWVyZ2VkICh0aGlzIGNhbiBiZQogICAgICAgICAgICAgICAgICAgICAgICAgc2xvdykuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5tZXJnZSA9IGt3YXJncy5wb3AoJ21lcmdlJywgRmFsc2UpCiAgICAgICAgc2VsZi5sb2NhdG9ycyA9IGxvY2F0b3JzCiAgICAgICAgc3VwZXIoQWdncmVnYXRpbmdMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKCiAgICBkZWYgY2xlYXJfY2FjaGUoc2VsZik6CiAgICAgICAgc3VwZXIoQWdncmVnYXRpbmdMb2NhdG9yLCBzZWxmKS5jbGVhcl9jYWNoZSgpCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgbG9jYXRvci5jbGVhcl9jYWNoZSgpCgogICAgZGVmIF9zZXRfc2NoZW1lKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9zY2hlbWUgPSB2YWx1ZQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIGxvY2F0b3Iuc2NoZW1lID0gdmFsdWUKCiAgICBzY2hlbWUgPSBwcm9wZXJ0eShMb2NhdG9yLnNjaGVtZS5mZ2V0LCBfc2V0X3NjaGVtZSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgZCA9IGxvY2F0b3IuZ2V0X3Byb2plY3QobmFtZSkKICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgIGlmIHNlbGYubWVyZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSByZXN1bHQuZ2V0KCd1cmxzJywge30pCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0cyA9IHJlc3VsdC5nZXQoJ2RpZ2VzdHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICAjIG5leHQgbGluZSBjb3VsZCBvdmVyd3JpdGUgcmVzdWx0Wyd1cmxzJ10sIHJlc3VsdFsnZGlnZXN0cyddCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVwZGF0ZShkKQogICAgICAgICAgICAgICAgICAgIGRmID0gcmVzdWx0LmdldCgndXJscycpCiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZXMgYW5kIGRmOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBmaWxlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBkZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZltrXSB8PSB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmW2tdID0gdgogICAgICAgICAgICAgICAgICAgIGRkID0gcmVzdWx0LmdldCgnZGlnZXN0cycpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0cyBhbmQgZGQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGRkLnVwZGF0ZShkaWdlc3RzKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjMTguIElmIGFueSBkaXN0cyBhcmUgZm91bmQgYW5kIHdlJ3JlIGxvb2tpbmcKICAgICAgICAgICAgICAgICAgICAjIGZvciBzcGVjaWZpYyBjb25zdHJhaW50cywgd2Ugb25seSByZXR1cm4gc29tZXRoaW5nIGlmCiAgICAgICAgICAgICAgICAgICAgIyBhIG1hdGNoIGlzIGZvdW5kLiBGb3IgZXhhbXBsZSwgaWYgYSBEaXJlY3RvcnlMb2NhdG9yCiAgICAgICAgICAgICAgICAgICAgIyByZXR1cm5zIGp1c3QgZm9vICgxLjApIHdoaWxlIHdlJ3JlIGxvb2tpbmcgZm9yCiAgICAgICAgICAgICAgICAgICAgIyBmb28gKD49IDIuMCksIHdlJ2xsIHByZXRlbmQgdGhlcmUgd2FzIG5vdGhpbmcgdGhlcmUgc28KICAgICAgICAgICAgICAgICAgICAjIHRoYXQgc3Vic2VxdWVudCBsb2NhdG9ycyBjYW4gYmUgcXVlcmllZC4gT3RoZXJ3aXNlIHdlCiAgICAgICAgICAgICAgICAgICAgIyB3b3VsZCBqdXN0IHJldHVybiBmb28gKDEuMCkgd2hpY2ggd291bGQgdGhlbiBsZWFkIHRvIGEKICAgICAgICAgICAgICAgICAgICAjIGZhaWx1cmUgdG8gZmluZCBmb28gKD49IDIuMCksIGJlY2F1c2Ugb3RoZXIgbG9jYXRvcnMKICAgICAgICAgICAgICAgICAgICAjIHdlcmVuJ3Qgc2VhcmNoZWQuIE5vdGUgdGhhdCB0aGlzIG9ubHkgbWF0dGVycyB3aGVuCiAgICAgICAgICAgICAgICAgICAgIyBtZXJnZT1GYWxzZS4KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hdGNoZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXRjaGVyLm1hdGNoKGspOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgaWYgZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBsb2NhdG9yLmdldF9kaXN0cmlidXRpb25fbmFtZXMoKQogICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKIyBXZSB1c2UgYSBsZWdhY3kgc2NoZW1lIHNpbXBseSBiZWNhdXNlIG1vc3Qgb2YgdGhlIGRpc3RzIG9uIFB5UEkgdXNlIGxlZ2FjeQojIHZlcnNpb25zIHdoaWNoIGRvbid0IGNvbmZvcm0gdG8gUEVQIDQyNiAvIFBFUCA0NDAuCmRlZmF1bHRfbG9jYXRvciA9IEFnZ3JlZ2F0aW5nTG9jYXRvcigKICAgICAgICAgICAgICAgICAgICBKU09OTG9jYXRvcigpLAogICAgICAgICAgICAgICAgICAgIFNpbXBsZVNjcmFwaW5nTG9jYXRvcignaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9My4wKSwKICAgICAgICAgICAgICAgICAgICBzY2hlbWU9J2xlZ2FjeScpCgpsb2NhdGUgPSBkZWZhdWx0X2xvY2F0b3IubG9jYXRlCgpOQU1FX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInKD9QPG5hbWU+W1x3LV0rKVxzKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1woXHMqKD09XHMqKT8oP1A8dmVyPlteKV0rKVwpJCcpCgpjbGFzcyBEZXBlbmRlbmN5RmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIExvY2F0ZSBkZXBlbmRlbmNpZXMgZm9yIGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYXRvcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIGxvY2F0b3IKICAgICAgICB0byBsb2NhdGUgZGlzdHJpYnV0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmxvY2F0b3IgPSBsb2NhdG9yIG9yIGRlZmF1bHRfbG9jYXRvcgogICAgICAgIHNlbGYuc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLmxvY2F0b3Iuc2NoZW1lKQoKICAgIGRlZiBhZGRfZGlzdHJpYnV0aW9uKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGRpc3RyaWJ1dGlvbiB0byB0aGUgZmluZGVyLiBUaGlzIHdpbGwgdXBkYXRlIGludGVybmFsIGluZm9ybWF0aW9uCiAgICAgICAgYWJvdXQgd2hvIHByb3ZpZGVzIHdoYXQuCiAgICAgICAgOnBhcmFtIGRpc3Q6IFRoZSBkaXN0cmlidXRpb24gdG8gYWRkLgogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnYWRkaW5nIGRpc3RyaWJ1dGlvbiAlcycsIGRpc3QpCiAgICAgICAgbmFtZSA9IGRpc3Qua2V5CiAgICAgICAgc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdID0gZGlzdAogICAgICAgIHNlbGYuZGlzdHNbKG5hbWUsIGRpc3QudmVyc2lvbildID0gZGlzdAogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRkIHRvIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgc2VsZi5wcm92aWRlZC5zZXRkZWZhdWx0KG5hbWUsIHNldCgpKS5hZGQoKHZlcnNpb24sIGRpc3QpKQoKICAgIGRlZiByZW1vdmVfZGlzdHJpYnV0aW9uKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBmaW5kZXIuIFRoaXMgd2lsbCB1cGRhdGUgaW50ZXJuYWwKICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB3aG8gcHJvdmlkZXMgd2hhdC4KICAgICAgICA6cGFyYW0gZGlzdDogVGhlIGRpc3RyaWJ1dGlvbiB0byByZW1vdmUuCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZW1vdmluZyBkaXN0cmlidXRpb24gJXMnLCBkaXN0KQogICAgICAgIG5hbWUgPSBkaXN0LmtleQogICAgICAgIGRlbCBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0KICAgICAgICBkZWwgc2VsZi5kaXN0c1sobmFtZSwgZGlzdC52ZXJzaW9uKV0KICAgICAgICBmb3IgcCBpbiBkaXN0LnByb3ZpZGVzOgogICAgICAgICAgICBuYW1lLCB2ZXJzaW9uID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZSBmcm9tIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgcyA9IHNlbGYucHJvdmlkZWRbbmFtZV0KICAgICAgICAgICAgcy5yZW1vdmUoKHZlcnNpb24sIGRpc3QpKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGRlbCBzZWxmLnByb3ZpZGVkW25hbWVdCgogICAgZGVmIGdldF9tYXRjaGVyKHNlbGYsIHJlcXQpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIHZlcnNpb24gbWF0Y2hlciBmb3IgYSByZXF1aXJlbWVudC4KICAgICAgICA6cGFyYW0gcmVxdDogVGhlIHJlcXVpcmVtZW50CiAgICAgICAgOnR5cGUgcmVxdDogc3RyCiAgICAgICAgOnJldHVybjogQSB2ZXJzaW9uIG1hdGNoZXIgKGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0bGliLnZlcnNpb24uTWF0Y2hlcmApLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuc2NoZW1lLm1hdGNoZXIocmVxdCkKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgIyBYWFggY29tcGF0LW1vZGUgaWYgY2Fubm90IHJlYWQgdGhlIHZlcnNpb24KICAgICAgICAgICAgbmFtZSA9IHJlcXQuc3BsaXQoKVswXQogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5zY2hlbWUubWF0Y2hlcihuYW1lKQogICAgICAgIHJldHVybiBtYXRjaGVyCgogICAgZGVmIGZpbmRfcHJvdmlkZXJzKHNlbGYsIHJlcXQpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgdGhlIGRpc3RyaWJ1dGlvbnMgd2hpY2ggY2FuIGZ1bGZpbGwgYSByZXF1aXJlbWVudC4KCiAgICAgICAgOnBhcmFtIHJlcXQ6IFRoZSByZXF1aXJlbWVudC4KICAgICAgICAgOnR5cGUgcmVxdDogc3RyCiAgICAgICAgOnJldHVybjogQSBzZXQgb2YgZGlzdHJpYnV0aW9uIHdoaWNoIGNhbiBmdWxmaWxsIHRoZSByZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICBtYXRjaGVyID0gc2VsZi5nZXRfbWF0Y2hlcihyZXF0KQogICAgICAgIG5hbWUgPSBtYXRjaGVyLmtleSAgICMgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgcHJvdmlkZWQgPSBzZWxmLnByb3ZpZGVkCiAgICAgICAgaWYgbmFtZSBpbiBwcm92aWRlZDoKICAgICAgICAgICAgZm9yIHZlcnNpb24sIHByb3ZpZGVyIGluIHByb3ZpZGVkW25hbWVdOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlci5tYXRjaCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UKCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB0cnlfdG9fcmVwbGFjZShzZWxmLCBwcm92aWRlciwgb3RoZXIsIHByb2JsZW1zKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIHJlcGxhY2Ugb25lIHByb3ZpZGVyIHdpdGggYW5vdGhlci4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZAogICAgICAgIHdoZW4gcmVzb2x2aW5nIGRlcGVuZGVuY2llcyBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIGUuZy4gQSByZXF1aXJlcwogICAgICAgIChCID49IDEuMCkgd2hpbGUgQyByZXF1aXJlcyAoQiA+PSAxLjEpLgoKICAgICAgICBGb3Igc3VjY2Vzc2Z1bCByZXBsYWNlbWVudCwgYGBwcm92aWRlcmBgIG11c3QgbWVldCBhbGwgdGhlIHJlcXVpcmVtZW50cwogICAgICAgIHdoaWNoIGBgb3RoZXJgYCBmdWxmaWxscy4KCiAgICAgICAgOnBhcmFtIHByb3ZpZGVyOiBUaGUgcHJvdmlkZXIgd2UgYXJlIHRyeWluZyB0byByZXBsYWNlIHdpdGguCiAgICAgICAgOnBhcmFtIG90aGVyOiBUaGUgcHJvdmlkZXIgd2UncmUgdHJ5aW5nIHRvIHJlcGxhY2UuCiAgICAgICAgOnBhcmFtIHByb2JsZW1zOiBJZiBGYWxzZSBpcyByZXR1cm5lZCwgdGhpcyB3aWxsIGNvbnRhaW4gd2hhdAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMgcHJldmVudGVkIHJlcGxhY2VtZW50LiBUaGlzIGlzIGN1cnJlbnRseQogICAgICAgICAgICAgICAgICAgICAgICAgYSB0dXBsZSBvZiB0aGUgbGl0ZXJhbCBzdHJpbmcgJ2NhbnRyZXBsYWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgIGBgcHJvdmlkZXJgYCwgYGBvdGhlcmBgICBhbmQgdGhlIHNldCBvZiByZXF1aXJlbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYGBwcm92aWRlcmBgIGNvdWxkbid0IGZ1bGZpbGwuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB3ZSBjYW4gcmVwbGFjZSBgYG90aGVyYGAgd2l0aCBgYHByb3ZpZGVyYGAsIGVsc2UKICAgICAgICAgICAgICAgICBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBybGlzdCA9IHNlbGYucmVxdHNbb3RoZXJdCiAgICAgICAgdW5tYXRjaGVkID0gc2V0KCkKICAgICAgICBmb3IgcyBpbiBybGlzdDoKICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuZ2V0X21hdGNoZXIocykKICAgICAgICAgICAgaWYgbm90IG1hdGNoZXIubWF0Y2gocHJvdmlkZXIudmVyc2lvbik6CiAgICAgICAgICAgICAgICB1bm1hdGNoZWQuYWRkKHMpCiAgICAgICAgaWYgdW5tYXRjaGVkOgogICAgICAgICAgICAjIGNhbid0IHJlcGxhY2Ugb3RoZXIgd2l0aCBwcm92aWRlcgogICAgICAgICAgICBwcm9ibGVtcy5hZGQoKCdjYW50cmVwbGFjZScsIHByb3ZpZGVyLCBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQodW5tYXRjaGVkKSkpCiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBjYW4gcmVwbGFjZSBvdGhlciB3aXRoIHByb3ZpZGVyCiAgICAgICAgICAgIHNlbGYucmVtb3ZlX2Rpc3RyaWJ1dGlvbihvdGhlcikKICAgICAgICAgICAgZGVsIHNlbGYucmVxdHNbb3RoZXJdCiAgICAgICAgICAgIGZvciBzIGluIHJsaXN0OgogICAgICAgICAgICAgICAgc2VsZi5yZXF0cy5zZXRkZWZhdWx0KHByb3ZpZGVyLCBzZXQoKSkuYWRkKHMpCiAgICAgICAgICAgIHNlbGYuYWRkX2Rpc3RyaWJ1dGlvbihwcm92aWRlcikKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZmluZChzZWxmLCByZXF1aXJlbWVudCwgbWV0YV9leHRyYXM9Tm9uZSwgcHJlcmVsZWFzZXM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgYSBkaXN0cmlidXRpb24gYW5kIGFsbCBkaXN0cmlidXRpb25zIGl0IGRlcGVuZHMgb24uCgogICAgICAgIDpwYXJhbSByZXF1aXJlbWVudDogVGhlIHJlcXVpcmVtZW50IHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbiB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZCwgb3IgYSBEaXN0cmlidXRpb24gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFfZXh0cmFzOiBBIGxpc3Qgb2YgbWV0YSBleHRyYXMgc3VjaCBhcyA6dGVzdDosIDpidWlsZDogYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBvbi4KICAgICAgICA6cGFyYW0gcHJlcmVsZWFzZXM6IElmIGBgVHJ1ZWBgLCBhbGxvdyBwcmUtcmVsZWFzZSB2ZXJzaW9ucyB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgLSBvdGhlcndpc2UsIGRvbid0IHJldHVybiBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoZXkncmUgYWxsIHRoYXQncyBhdmFpbGFibGUuCgogICAgICAgIFJldHVybiBhIHNldCBvZiA6Y2xhc3M6YERpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzIGFuZCBhIHNldCBvZgogICAgICAgIHByb2JsZW1zLgoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9ucyByZXR1cm5lZCBzaG91bGQgYmUgc3VjaCB0aGF0IHRoZXkgaGF2ZSB0aGUKICAgICAgICA6YXR0cjpgcmVxdWlyZWRgIGF0dHJpYnV0ZSBzZXQgdG8gYGBUcnVlYGAgaWYgdGhleSB3ZXJlCiAgICAgICAgZnJvbSB0aGUgYGByZXF1aXJlbWVudGBgIHBhc3NlZCB0byBgYGZpbmQoKWBgLCBhbmQgdGhleSBoYXZlIHRoZQogICAgICAgIDphdHRyOmBidWlsZF90aW1lX2RlcGVuZGVuY3lgIGF0dHJpYnV0ZSBzZXQgdG8gYGBUcnVlYGAgdW5sZXNzIHRoZXkKICAgICAgICBhcmUgcG9zdC1pbnN0YWxsYXRpb24gZGVwZW5kZW5jaWVzIG9mIHRoZSBgYHJlcXVpcmVtZW50YGAuCgogICAgICAgIFRoZSBwcm9ibGVtcyBzaG91bGQgYmUgYSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBzdHJpbmcKICAgICAgICBgYCd1bnNhdGlzZmllZCdgYCBhbmQgdGhlIHJlcXVpcmVtZW50IHdoaWNoIGNvdWxkbid0IGJlIHNhdGlzZmllZAogICAgICAgIGJ5IGFueSBkaXN0cmlidXRpb24ga25vd24gdG8gdGhlIGxvY2F0b3IuCiAgICAgICAgIiIiCgogICAgICAgIHNlbGYucHJvdmlkZWQgPSB7fQogICAgICAgIHNlbGYuZGlzdHMgPSB7fQogICAgICAgIHNlbGYuZGlzdHNfYnlfbmFtZSA9IHt9CiAgICAgICAgc2VsZi5yZXF0cyA9IHt9CgogICAgICAgIG1ldGFfZXh0cmFzID0gc2V0KG1ldGFfZXh0cmFzIG9yIFtdKQogICAgICAgIGlmICc6KjonIGluIG1ldGFfZXh0cmFzOgogICAgICAgICAgICBtZXRhX2V4dHJhcy5yZW1vdmUoJzoqOicpCiAgICAgICAgICAgICMgOm1ldGE6IGFuZCA6cnVuOiBhcmUgaW1wbGljaXRseSBpbmNsdWRlZAogICAgICAgICAgICBtZXRhX2V4dHJhcyB8PSBzZXQoWyc6dGVzdDonLCAnOmJ1aWxkOicsICc6ZGV2OiddKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVtZW50LCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBkaXN0ID0gb2Rpc3QgPSByZXF1aXJlbWVudAogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3Bhc3NlZCAlcyBhcyByZXF1aXJlbWVudCcsIG9kaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3QgPSBvZGlzdCA9IHNlbGYubG9jYXRvci5sb2NhdGUocmVxdWlyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBsb2NhdGUgJXInICUgcmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbG9jYXRlZCAlcycsIG9kaXN0KQogICAgICAgIGRpc3QucmVxdWVzdGVkID0gVHJ1ZQogICAgICAgIHByb2JsZW1zID0gc2V0KCkKICAgICAgICB0b2RvID0gc2V0KFtkaXN0XSkKICAgICAgICBpbnN0YWxsX2Rpc3RzID0gc2V0KFtvZGlzdF0pCiAgICAgICAgd2hpbGUgdG9kbzoKICAgICAgICAgICAgZGlzdCA9IHRvZG8ucG9wKCkKICAgICAgICAgICAgbmFtZSA9IGRpc3Qua2V5ICAgICAjIGNhc2UtaW5zZW5zaXRpdmUKICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5kaXN0c19ieV9uYW1lOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfZGlzdHJpYnV0aW9uKGRpc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgICAgICAgICAgaWYgb3RoZXIgIT0gZGlzdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyeV90b19yZXBsYWNlKGRpc3QsIG90aGVyLCBwcm9ibGVtcykKCiAgICAgICAgICAgIGlyZXF0cyA9IGRpc3QucnVuX3JlcXVpcmVzIHwgZGlzdC5tZXRhX3JlcXVpcmVzCiAgICAgICAgICAgIHNyZXF0cyA9IGRpc3QuYnVpbGRfcmVxdWlyZXMKICAgICAgICAgICAgZXJlcXRzID0gc2V0KCkKICAgICAgICAgICAgaWYgZGlzdCBpbiBpbnN0YWxsX2Rpc3RzOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ3Rlc3QnLCAnYnVpbGQnLCAnZGV2Jyk6CiAgICAgICAgICAgICAgICAgICAgZSA9ICc6JXM6JyAlIGtleQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gbWV0YV9leHRyYXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGVyZXF0cyB8PSBnZXRhdHRyKGRpc3QsICclc19yZXF1aXJlcycgJSBrZXkpCiAgICAgICAgICAgIGFsbF9yZXF0cyA9IGlyZXF0cyB8IHNyZXF0cyB8IGVyZXF0cwogICAgICAgICAgICBmb3IgciBpbiBhbGxfcmVxdHM6CiAgICAgICAgICAgICAgICBwcm92aWRlcnMgPSBzZWxmLmZpbmRfcHJvdmlkZXJzKHIpCiAgICAgICAgICAgICAgICBpZiBub3QgcHJvdmlkZXJzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gcHJvdmlkZXJzIGZvdW5kIGZvciAlcicsIHIpCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBzZWxmLmxvY2F0b3IubG9jYXRlKHIsIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICAgICAgICAgICMgSWYgbm8gcHJvdmlkZXIgaXMgZm91bmQgYW5kIHdlIGRpZG4ndCBjb25zaWRlcgogICAgICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIGNvbnNpZGVyIHRoZW0gbm93LgogICAgICAgICAgICAgICAgICAgIGlmIHByb3ZpZGVyIGlzIE5vbmUgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBzZWxmLmxvY2F0b3IubG9jYXRlKHIsIHByZXJlbGVhc2VzPVRydWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3Qgc2F0aXNmeSAlcicsIHIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1zLmFkZCgoJ3Vuc2F0aXNmaWVkJywgcikpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbiwgdiA9IHByb3ZpZGVyLmtleSwgcHJvdmlkZXIudmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiwgdikgbm90IGluIHNlbGYuZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RvLmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgciBpbiBpcmVxdHMgYW5kIGRpc3QgaW4gaW5zdGFsbF9kaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfZGlzdHMuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGRpbmcgJXMgdG8gaW5zdGFsbF9kaXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubmFtZV9hbmRfdmVyc2lvbikKICAgICAgICAgICAgICAgIGZvciBwIGluIHByb3ZpZGVyczoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gcC5rZXkKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmRpc3RzX2J5X25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdHMuc2V0ZGVmYXVsdChwLCBzZXQoKSkuYWRkKHIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RoZXIgIT0gcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VlIGlmIG90aGVyIGNhbiBiZSByZXBsYWNlZCBieSBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyeV90b19yZXBsYWNlKHAsIG90aGVyLCBwcm9ibGVtcykKCiAgICAgICAgZGlzdHMgPSBzZXQoc2VsZi5kaXN0cy52YWx1ZXMoKSkKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgZGlzdC5idWlsZF90aW1lX2RlcGVuZGVuY3kgPSBkaXN0IG5vdCBpbiBpbnN0YWxsX2Rpc3RzCiAgICAgICAgICAgIGlmIGRpc3QuYnVpbGRfdGltZV9kZXBlbmRlbmN5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBpcyBhIGJ1aWxkLXRpbWUgZGVwZW5kZW5jeSBvbmx5LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdC5uYW1lX2FuZF92ZXJzaW9uKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnZmluZCBkb25lIGZvciAlcycsIG9kaXN0KQogICAgICAgIHJldHVybiBkaXN0cywgcHJvYmxlbXMKUEsDBBQAAAAAAAAAIQCGl7Wb2jkAANo5AAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFuaWZlc3QucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIgpDbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gYSBkaXN0cmlidXRpb24uCgpFcXVpdmFsZW50IHRvIGRpc3R1dGlscy5maWxlbGlzdCwgYnV0IGZpeGVzIHNvbWUgcHJvYmxlbXMuCiIiIgppbXBvcnQgZm5tYXRjaAppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IGZzZGVjb2RlCmZyb20gLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoKCl9fYWxsX18gPSBbJ01hbmlmZXN0J10KCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIyBhIFwgZm9sbG93ZWQgYnkgc29tZSBzcGFjZXMgKyBFT0wKX0NPTExBUFNFX1BBVFRFUk4gPSByZS5jb21waWxlKCdcXFx3KlxuJywgcmUuTSkKX0NPTU1FTlRFRF9MSU5FID0gcmUuY29tcGlsZSgnIy4qPyg/PVxuKXxcbig/PSQpJywgcmUuTSB8IHJlLlMpCgojCiMgRHVlIHRvIHRoZSBkaWZmZXJlbnQgcmVzdWx0cyByZXR1cm5lZCBieSBmbm1hdGNoLnRyYW5zbGF0ZSwgd2UgbmVlZAojIHRvIGRvIHNsaWdodGx5IGRpZmZlcmVudCBwcm9jZXNzaW5nIGZvciBQeXRob24gMi43IGFuZCAzLjIgLi4uIHRoaXMgbmVlZGVkCiMgdG8gYmUgYnJvdWdodCBpbiBmb3IgUHl0aG9uIDMuNiBvbndhcmRzLgojCl9QWVRIT05fVkVSU0lPTiA9IHN5cy52ZXJzaW9uX2luZm9bOjJdCgpjbGFzcyBNYW5pZmVzdChvYmplY3QpOgogICAgIiIiQSBsaXN0IG9mIGZpbGVzIGJ1aWx0IGJ5IG9uIGV4cGxvcmluZyB0aGUgZmlsZXN5c3RlbSBhbmQgZmlsdGVyZWQgYnkKICAgIGFwcGx5aW5nIHZhcmlvdXMgcGF0dGVybnMgdG8gd2hhdCB3ZSBmaW5kIHRoZXJlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2U9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGJhc2U6IFRoZSBiYXNlIGRpcmVjdG9yeSB0byBleHBsb3JlIHVuZGVyLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKGJhc2Ugb3Igb3MuZ2V0Y3dkKCkpKQogICAgICAgIHNlbGYucHJlZml4ID0gc2VsZi5iYXNlICsgb3Muc2VwCiAgICAgICAgc2VsZi5hbGxmaWxlcyA9IE5vbmUKICAgICAgICBzZWxmLmZpbGVzID0gc2V0KCkKCiAgICAjCiAgICAjIFB1YmxpYyBBUEkKICAgICMKCiAgICBkZWYgZmluZGFsbChzZWxmKToKICAgICAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciB0aGUgYmFzZSBhbmQgc2V0IGBgYWxsZmlsZXNgYCB0byB0aGUgYWJzb2x1dGUKICAgICAgICBwYXRobmFtZXMgb2YgZmlsZXMgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBzdGF0IGltcG9ydCBTX0lTUkVHLCBTX0lTRElSLCBTX0lTTE5LCgogICAgICAgIHNlbGYuYWxsZmlsZXMgPSBhbGxmaWxlcyA9IFtdCiAgICAgICAgcm9vdCA9IHNlbGYuYmFzZQogICAgICAgIHN0YWNrID0gW3Jvb3RdCiAgICAgICAgcG9wID0gc3RhY2sucG9wCiAgICAgICAgcHVzaCA9IHN0YWNrLmFwcGVuZAoKICAgICAgICB3aGlsZSBzdGFjazoKICAgICAgICAgICAgcm9vdCA9IHBvcCgpCiAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihyb290KQoKICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQoKICAgICAgICAgICAgICAgICMgQXZvaWQgZXhjZXNzIHN0YXQgY2FsbHMgLS0ganVzdCBvbmUgd2lsbCBkbywgdGhhbmsgeW91IQogICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCiAgICAgICAgICAgICAgICBtb2RlID0gc3RhdC5zdF9tb2RlCiAgICAgICAgICAgICAgICBpZiBTX0lTUkVHKG1vZGUpOgogICAgICAgICAgICAgICAgICAgIGFsbGZpbGVzLmFwcGVuZChmc2RlY29kZShmdWxsbmFtZSkpCiAgICAgICAgICAgICAgICBlbGlmIFNfSVNESVIobW9kZSkgYW5kIG5vdCBTX0lTTE5LKG1vZGUpOgogICAgICAgICAgICAgICAgICAgIHB1c2goZnVsbG5hbWUpCgogICAgZGVmIGFkZChzZWxmLCBpdGVtKToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBmaWxlIHRvIHRoZSBtYW5pZmVzdC4KCiAgICAgICAgOnBhcmFtIGl0ZW06IFRoZSBwYXRobmFtZSB0byBhZGQuIFRoaXMgY2FuIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpdGVtLnN0YXJ0c3dpdGgoc2VsZi5wcmVmaXgpOgogICAgICAgICAgICBpdGVtID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZSwgaXRlbSkKICAgICAgICBzZWxmLmZpbGVzLmFkZChvcy5wYXRoLm5vcm1wYXRoKGl0ZW0pKQoKICAgIGRlZiBhZGRfbWFueShzZWxmLCBpdGVtcyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgbGlzdCBvZiBmaWxlcyB0byB0aGUgbWFuaWZlc3QuCgogICAgICAgIDpwYXJhbSBpdGVtczogVGhlIHBhdGhuYW1lcyB0byBhZGQuIFRoZXNlIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZS4KICAgICAgICAiIiIKICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgc2VsZi5hZGQoaXRlbSkKCiAgICBkZWYgc29ydGVkKHNlbGYsIHdhbnRkaXJzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc29ydGVkIGZpbGVzIGluIGRpcmVjdG9yeSBvcmRlcgogICAgICAgICIiIgoKICAgICAgICBkZWYgYWRkX2RpcihkaXJzLCBkKToKICAgICAgICAgICAgZGlycy5hZGQoZCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdhZGRfZGlyIGFkZGVkICVzJywgZCkKICAgICAgICAgICAgaWYgZCAhPSBzZWxmLmJhc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQsIF8gPSBvcy5wYXRoLnNwbGl0KGQpCiAgICAgICAgICAgICAgICBhc3NlcnQgcGFyZW50IG5vdCBpbiAoJycsICcvJykKICAgICAgICAgICAgICAgIGFkZF9kaXIoZGlycywgcGFyZW50KQoKICAgICAgICByZXN1bHQgPSBzZXQoc2VsZi5maWxlcykgICAgIyBtYWtlIGEgY29weSEKICAgICAgICBpZiB3YW50ZGlyczoKICAgICAgICAgICAgZGlycyA9IHNldCgpCiAgICAgICAgICAgIGZvciBmIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIGFkZF9kaXIoZGlycywgb3MucGF0aC5kaXJuYW1lKGYpKQogICAgICAgICAgICByZXN1bHQgfD0gZGlycwogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKCpwYXRoX3R1cGxlKSBmb3IgcGF0aF90dXBsZSBpbgogICAgICAgICAgICAgICAgc29ydGVkKG9zLnBhdGguc3BsaXQocGF0aCkgZm9yIHBhdGggaW4gcmVzdWx0KV0KCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiQ2xlYXIgYWxsIGNvbGxlY3RlZCBmaWxlcy4iIiIKICAgICAgICBzZWxmLmZpbGVzID0gc2V0KCkKICAgICAgICBzZWxmLmFsbGZpbGVzID0gW10KCiAgICBkZWYgcHJvY2Vzc19kaXJlY3RpdmUoc2VsZiwgZGlyZWN0aXZlKToKICAgICAgICAiIiIKICAgICAgICBQcm9jZXNzIGEgZGlyZWN0aXZlIHdoaWNoIGVpdGhlciBhZGRzIHNvbWUgZmlsZXMgZnJvbSBgYGFsbGZpbGVzYGAgdG8KICAgICAgICBgYGZpbGVzYGAsIG9yIHJlbW92ZXMgc29tZSBmaWxlcyBmcm9tIGBgZmlsZXNgYC4KCiAgICAgICAgOnBhcmFtIGRpcmVjdGl2ZTogVGhlIGRpcmVjdGl2ZSB0byBwcm9jZXNzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggZGlzdHV0aWxzIGBgTUFOSUZFU1QuaW5gYCBmaWxlczoKCiAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZGlzdHV0aWxzL3NvdXJjZWRpc3QuaHRtbCNjb21tYW5kcwogICAgICAgICIiIgogICAgICAgICMgUGFyc2UgdGhlIGxpbmU6IHNwbGl0IGl0IHVwLCBtYWtlIHN1cmUgdGhlIHJpZ2h0IG51bWJlciBvZiB3b3JkcwogICAgICAgICMgaXMgdGhlcmUsIGFuZCByZXR1cm4gdGhlIHJlbGV2YW50IHdvcmRzLiAgJ2FjdGlvbicgaXMgYWx3YXlzCiAgICAgICAgIyBkZWZpbmVkOiBpdCdzIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgV2hpY2ggb2YgdGhlIG90aGVyCiAgICAgICAgIyB0aHJlZSBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHRoZSBhY3Rpb247IGl0J2xsIGJlIGVpdGhlcgogICAgICAgICMgcGF0dGVybnMsIChkaXIgYW5kIHBhdHRlcm5zKSwgb3IgKGRpcnBhdHRlcm4pLgogICAgICAgIGFjdGlvbiwgcGF0dGVybnMsIHRoZWRpciwgZGlycGF0dGVybiA9IHNlbGYuX3BhcnNlX2RpcmVjdGl2ZShkaXJlY3RpdmUpCgogICAgICAgICMgT0ssIG5vdyB3ZSBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyB2YWxpZCBhbmQgd2UgaGF2ZSB0aGUKICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiB3b3JkcyBvbiB0aGUgbGluZSBmb3IgdGhhdCBhY3Rpb24gLS0gc28gd2UKICAgICAgICAjIGNhbiBwcm9jZWVkIHdpdGggbWluaW1hbCBlcnJvci1jaGVja2luZy4KICAgICAgICBpZiBhY3Rpb24gPT0gJ2luY2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPVRydWUpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlcicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdleGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9VHJ1ZSkKICAgICAgICAgICAgICAgICNpZiBub3QgZm91bmQ6CiAgICAgICAgICAgICAgICAjICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICcKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgJ2ZvdW5kIG1hdGNoaW5nICVyJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1pbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1GYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9RmFsc2UpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlciBmb3VuZCBhbnl3aGVyZSBpbiAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdkaXN0cmlidXRpb24nLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgcHJlZml4PXRoZWRpcik6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZXIgZGlyZWN0b3J5ICVyJywgcGF0dGVybiwgdGhlZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD10aGVkaXIpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlciBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJXInLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCB0aGVkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdncmFmdCc6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWRpcnBhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGRpcmVjdG9yaWVzIGZvdW5kIG1hdGNoaW5nICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdwcnVuZSc6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWRpcnBhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZGlyZWN0b3JpZXMgZm91bmQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoaW5nICVyJywgZGlycGF0dGVybikKICAgICAgICBlbHNlOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYXMgaXQgc2hvdWxkIGJlIGNhdWdodCBpbgogICAgICAgICAgICAjIF9wYXJzZV90ZW1wbGF0ZV9saW5lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAnaW52YWxpZCBhY3Rpb24gJXInICUgYWN0aW9uKQoKICAgICMKICAgICMgUHJpdmF0ZSBBUEkKICAgICMKCiAgICBkZWYgX3BhcnNlX2RpcmVjdGl2ZShzZWxmLCBkaXJlY3RpdmUpOgogICAgICAgICIiIgogICAgICAgIFZhbGlkYXRlIGEgZGlyZWN0aXZlLgogICAgICAgIDpwYXJhbSBkaXJlY3RpdmU6IFRoZSBkaXJlY3RpdmUgdG8gdmFsaWRhdGUuCiAgICAgICAgOnJldHVybjogQSB0dXBsZSBvZiBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcl9wYXR0ZXJucwogICAgICAgICIiIgogICAgICAgIHdvcmRzID0gZGlyZWN0aXZlLnNwbGl0KCkKICAgICAgICBpZiBsZW4od29yZHMpID09IDEgYW5kIHdvcmRzWzBdIG5vdCBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWN1cnNpdmUtaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWN1cnNpdmUtZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmFmdCcsICdwcnVuZScpOgogICAgICAgICAgICAjIG5vIGFjdGlvbiBnaXZlbiwgbGV0J3MgdXNlIHRoZSBkZWZhdWx0ICdpbmNsdWRlJwogICAgICAgICAgICB3b3Jkcy5pbnNlcnQoMCwgJ2luY2x1ZGUnKQoKICAgICAgICBhY3Rpb24gPSB3b3Jkc1swXQogICAgICAgIHBhdHRlcm5zID0gdGhlZGlyID0gZGlyX3BhdHRlcm4gPSBOb25lCgogICAgICAgIGlmIGFjdGlvbiBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWluY2x1ZGUnLCAnZ2xvYmFsLWV4Y2x1ZGUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDI6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICclciBleHBlY3RzIDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4nICUgYWN0aW9uKQoKICAgICAgICAgICAgcGF0dGVybnMgPSBbY29udmVydF9wYXRoKHdvcmQpIGZvciB3b3JkIGluIHdvcmRzWzE6XV0KCiAgICAgICAgZWxpZiBhY3Rpb24gaW4gKCdyZWN1cnNpdmUtaW5jbHVkZScsICdyZWN1cnNpdmUtZXhjbHVkZScpOgogICAgICAgICAgICBpZiBsZW4od29yZHMpIDwgMzoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJyVyIGV4cGVjdHMgPGRpcj4gPHBhdHRlcm4xPiA8cGF0dGVybjI+IC4uLicgJSBhY3Rpb24pCgogICAgICAgICAgICB0aGVkaXIgPSBjb252ZXJ0X3BhdGgod29yZHNbMV0pCiAgICAgICAgICAgIHBhdHRlcm5zID0gW2NvbnZlcnRfcGF0aCh3b3JkKSBmb3Igd29yZCBpbiB3b3Jkc1syOl1dCgogICAgICAgIGVsaWYgYWN0aW9uIGluICgnZ3JhZnQnLCAncHJ1bmUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSAhPSAyOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnJXIgZXhwZWN0cyBhIHNpbmdsZSA8ZGlyX3BhdHRlcm4+JyAlIGFjdGlvbikKCiAgICAgICAgICAgIGRpcl9wYXR0ZXJuID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd1bmtub3duIGFjdGlvbiAlcicgJSBhY3Rpb24pCgogICAgICAgIHJldHVybiBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcl9wYXR0ZXJuCgogICAgZGVmIF9pbmNsdWRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9RmFsc2UpOgogICAgICAgICIiIlNlbGVjdCBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnc2VsZi5maWxlcycgdGhhdAogICAgICAgIG1hdGNoICdwYXR0ZXJuJywgYSBVbml4LXN0eWxlIHdpbGRjYXJkIChnbG9iKSBwYXR0ZXJuLgoKICAgICAgICBQYXR0ZXJucyBhcmUgbm90IHF1aXRlIHRoZSBzYW1lIGFzIGltcGxlbWVudGVkIGJ5IHRoZSAnZm5tYXRjaCcKICAgICAgICBtb2R1bGU6ICcqJyBhbmQgJz8nICBtYXRjaCBub24tc3BlY2lhbCBjaGFyYWN0ZXJzLCB3aGVyZSAic3BlY2lhbCIKICAgICAgICBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQ6IHNsYXNoIG9uIFVuaXg7IGNvbG9uLCBzbGFzaCwgYW5kIGJhY2tzbGFzaCBvbgogICAgICAgIERPUy9XaW5kb3dzOyBhbmQgY29sb24gb24gTWFjIE9TLgoKICAgICAgICBJZiAnYW5jaG9yJyBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gdGhlIHBhdHRlcm4gbWF0Y2ggaXMgbW9yZQogICAgICAgIHN0cmluZ2VudDogIioucHkiIHdpbGwgbWF0Y2ggImZvby5weSIgYnV0IG5vdCAiZm9vL2Jhci5weSIuICBJZgogICAgICAgICdhbmNob3InIGlzIGZhbHNlLCBib3RoIG9mIHRoZXNlIHdpbGwgbWF0Y2guCgogICAgICAgIElmICdwcmVmaXgnIGlzIHN1cHBsaWVkLCB0aGVuIG9ubHkgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggJ3ByZWZpeCcKICAgICAgICAoaXRzZWxmIGEgcGF0dGVybikgYW5kIGVuZGluZyB3aXRoICdwYXR0ZXJuJywgd2l0aCBhbnl0aGluZyBpbiBiZXR3ZWVuCiAgICAgICAgdGhlbSwgd2lsbCBtYXRjaC4gICdhbmNob3InIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoKICAgICAgICBJZiAnaXNfcmVnZXgnIGlzIHRydWUsICdhbmNob3InIGFuZCAncHJlZml4JyBhcmUgaWdub3JlZCwgYW5kCiAgICAgICAgJ3BhdHRlcm4nIGlzIGFzc3VtZWQgdG8gYmUgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWdleCBvciBhCiAgICAgICAgcmVnZXggb2JqZWN0IC0tIG5vIHRyYW5zbGF0aW9uIGlzIGRvbmUsIHRoZSByZWdleCBpcyBqdXN0IGNvbXBpbGVkCiAgICAgICAgYW5kIHVzZWQgYXMtaXMuCgogICAgICAgIFNlbGVjdGVkIHN0cmluZ3Mgd2lsbCBiZSBhZGRlZCB0byBzZWxmLmZpbGVzLgoKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBmaWxlcyBhcmUgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFggZG9jc3RyaW5nIGx5aW5nIGFib3V0IHdoYXQgdGhlIHNwZWNpYWwgY2hhcnMgYXJlPwogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBwYXR0ZXJuX3JlID0gc2VsZi5fdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQoKICAgICAgICAjIGRlbGF5ZWQgbG9hZGluZyBvZiBhbGxmaWxlcyBsaXN0CiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQoKICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmFsbGZpbGVzOgogICAgICAgICAgICBpZiBwYXR0ZXJuX3JlLnNlYXJjaChuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYWRkKG5hbWUpCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgX2V4Y2x1ZGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9VHJ1ZSwgcHJlZml4PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD1GYWxzZSk6CiAgICAgICAgIiIiUmVtb3ZlIHN0cmluZ3MgKHByZXN1bWFibHkgZmlsZW5hbWVzKSBmcm9tICdmaWxlcycgdGhhdCBtYXRjaAogICAgICAgICdwYXR0ZXJuJy4KCiAgICAgICAgT3RoZXIgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yICdpbmNsdWRlX3BhdHRlcm4oKScsIGFib3ZlLgogICAgICAgIFRoZSBsaXN0ICdzZWxmLmZpbGVzJyBpcyBtb2RpZmllZCBpbiBwbGFjZS4gUmV0dXJuIFRydWUgaWYgZmlsZXMgYXJlCiAgICAgICAgZm91bmQuCgogICAgICAgIFRoaXMgQVBJIGlzIHB1YmxpYyB0byBhbGxvdyBlLmcuIGV4Y2x1c2lvbiBvZiBTQ00gc3ViZGlycywgZS5nLiB3aGVuCiAgICAgICAgcGFja2FnaW5nIHNvdXJjZSBkaXN0cmlidXRpb25zCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIHBhdHRlcm5fcmUgPSBzZWxmLl90cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3IsIHByZWZpeCwgaXNfcmVnZXgpCiAgICAgICAgZm9yIGYgaW4gbGlzdChzZWxmLmZpbGVzKToKICAgICAgICAgICAgaWYgcGF0dGVybl9yZS5zZWFyY2goZik6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLnJlbW92ZShmKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIF90cmFuc2xhdGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9VHJ1ZSwgcHJlZml4PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PUZhbHNlKToKICAgICAgICAiIiJUcmFuc2xhdGUgYSBzaGVsbC1saWtlIHdpbGRjYXJkIHBhdHRlcm4gdG8gYSBjb21waWxlZCByZWd1bGFyCiAgICAgICAgZXhwcmVzc2lvbi4KCiAgICAgICAgUmV0dXJuIHRoZSBjb21waWxlZCByZWdleC4gIElmICdpc19yZWdleCcgdHJ1ZSwKICAgICAgICB0aGVuICdwYXR0ZXJuJyBpcyBkaXJlY3RseSBjb21waWxlZCB0byBhIHJlZ2V4IChpZiBpdCdzIGEgc3RyaW5nKQogICAgICAgIG9yIGp1c3QgcmV0dXJuZWQgYXMtaXMgKGFzc3VtZXMgaXQncyBhIHJlZ2V4IG9iamVjdCkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNfcmVnZXg6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgc3RyKToKICAgICAgICAgICAgICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybgoKICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPiAoMywgMik6CiAgICAgICAgICAgICMgZGl0Y2ggc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgIHN0YXJ0LCBfLCBlbmQgPSBzZWxmLl9nbG9iX3RvX3JlKCdfJykucGFydGl0aW9uKCdfJykKCiAgICAgICAgaWYgcGF0dGVybjoKICAgICAgICAgICAgcGF0dGVybl9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocGF0dGVybikKICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OID4gKDMsIDIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHBhdHRlcm5fcmUuc3RhcnRzd2l0aChzdGFydCkgYW5kIHBhdHRlcm5fcmUuZW5kc3dpdGgoZW5kKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnJwoKICAgICAgICBiYXNlID0gcmUuZXNjYXBlKG9zLnBhdGguam9pbihzZWxmLmJhc2UsICcnKSkKICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgZGl0Y2ggZW5kIG9mIHBhdHRlcm4gY2hhcmFjdGVyCiAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA8PSAoMywgMik6CiAgICAgICAgICAgICAgICBlbXB0eV9wYXR0ZXJuID0gc2VsZi5fZ2xvYl90b19yZSgnJykKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocHJlZml4KVs6LWxlbihlbXB0eV9wYXR0ZXJuKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocHJlZml4KQogICAgICAgICAgICAgICAgYXNzZXJ0IHByZWZpeF9yZS5zdGFydHN3aXRoKHN0YXJ0KSBhbmQgcHJlZml4X3JlLmVuZHN3aXRoKGVuZCkKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHByZWZpeF9yZVtsZW4oc3RhcnQpOiBsZW4ocHJlZml4X3JlKSAtIGxlbihlbmQpXQogICAgICAgICAgICBzZXAgPSBvcy5zZXAKICAgICAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CiAgICAgICAgICAgICAgICBzZXAgPSByJ1xcJwogICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9ICdeJyArIGJhc2UgKyBzZXAuam9pbigocHJlZml4X3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4qJyArIHBhdHRlcm5fcmUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHBhdHRlcm5fcmVbbGVuKHN0YXJ0KTogbGVuKHBhdHRlcm5fcmUpIC0gbGVuKGVuZCldCiAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gciclcyVzJXMlcy4qJXMlcycgJSAoc3RhcnQsIGJhc2UsIHByZWZpeF9yZSwgc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUsIGVuZCkKICAgICAgICBlbHNlOiAgIyBubyBwcmVmaXggLS0gcmVzcGVjdCBhbmNob3IgZmxhZwogICAgICAgICAgICBpZiBhbmNob3I6CiAgICAgICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnXicgKyBiYXNlICsgcGF0dGVybl9yZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gciclcyVzJXMnICUgKHN0YXJ0LCBiYXNlLCBwYXR0ZXJuX3JlW2xlbihzdGFydCk6XSkKCiAgICAgICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybl9yZSkKCiAgICBkZWYgX2dsb2JfdG9fcmUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSBnbG9iIHBhdHRlcm4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCgogICAgICAgIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZWdleC4gIERpZmZlcnMgZnJvbQogICAgICAgICdmbm1hdGNoLnRyYW5zbGF0ZSgpJyBpbiB0aGF0ICcqJyBkb2VzIG5vdCBtYXRjaCAic3BlY2lhbCBjaGFyYWN0ZXJzIgogICAgICAgICh3aGljaCBhcmUgcGxhdGZvcm0tc3BlY2lmaWMpLgogICAgICAgICIiIgogICAgICAgIHBhdHRlcm5fcmUgPSBmbm1hdGNoLnRyYW5zbGF0ZShwYXR0ZXJuKQoKICAgICAgICAjICc/JyBhbmQgJyonIGluIHRoZSBnbG9iIHBhdHRlcm4gYmVjb21lICcuJyBhbmQgJy4qJyBpbiB0aGUgUkUsIHdoaWNoCiAgICAgICAgIyBJTUhPIGlzIHdyb25nIC0tICc/JyBhbmQgJyonIGFyZW4ndCBzdXBwb3NlZCB0byBtYXRjaCBzbGFzaCBpbiBVbml4LAogICAgICAgICMgYW5kIGJ5IGV4dGVuc2lvbiB0aGV5IHNob3VsZG4ndCBtYXRjaCBzdWNoICJzcGVjaWFsIGNoYXJhY3RlcnMiIHVuZGVyCiAgICAgICAgIyBhbnkgT1MuICBTbyBjaGFuZ2UgYWxsIG5vbi1lc2NhcGVkIGRvdHMgaW4gdGhlIFJFIHRvIG1hdGNoIGFueQogICAgICAgICMgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChjdXJyZW50bHk6IGp1c3Qgb3Muc2VwKS4KICAgICAgICBzZXAgPSBvcy5zZXAKICAgICAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKICAgICAgICAgICAgIyB3ZSdyZSB1c2luZyBhIHJlZ2V4IHRvIG1hbmlwdWxhdGUgYSByZWdleCwgc28gd2UgbmVlZAogICAgICAgICAgICAjIHRvIGVzY2FwZSB0aGUgYmFja3NsYXNoIHR3aWNlCiAgICAgICAgICAgIHNlcCA9IHInXFxcXCcKICAgICAgICBlc2NhcGVkID0gcidcMVteJXNdJyAlIHNlcAogICAgICAgIHBhdHRlcm5fcmUgPSByZS5zdWIocicoKD88IVxcKShcXFxcKSopXC4nLCBlc2NhcGVkLCBwYXR0ZXJuX3JlKQogICAgICAgIHJldHVybiBwYXR0ZXJuX3JlClBLAwQUAAAAAAAAACEAPRGuAooYAACKGAAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hcmtlcnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJQYXJzZXIgZm9yIHRoZSBlbnZpcm9ubWVudCBtYXJrZXJzIG1pY3JvLWxhbmd1YWdlIGRlZmluZWQgaW4gUEVQIDM0NS4iIiIKCmltcG9ydCBhc3QKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHBsYXRmb3JtCgpmcm9tIC5jb21wYXQgaW1wb3J0IHB5dGhvbl9pbXBsZW1lbnRhdGlvbiwgc3RyaW5nX3R5cGVzCmZyb20gLnV0aWwgaW1wb3J0IGluX3ZlbnYKCl9fYWxsX18gPSBbJ2ludGVycHJldCddCgoKY2xhc3MgRXZhbHVhdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIEEgbGltaXRlZCBldmFsdWF0b3IgZm9yIFB5dGhvbiBleHByZXNzaW9ucy4KICAgICIiIgoKICAgIG9wZXJhdG9ycyA9IHsKICAgICAgICAnZXEnOiBsYW1iZGEgeCwgeTogeCA9PSB5LAogICAgICAgICdndCc6IGxhbWJkYSB4LCB5OiB4ID4geSwKICAgICAgICAnZ3RlJzogbGFtYmRhIHgsIHk6IHggPj0geSwKICAgICAgICAnaW4nOiBsYW1iZGEgeCwgeTogeCBpbiB5LAogICAgICAgICdsdCc6IGxhbWJkYSB4LCB5OiB4IDwgeSwKICAgICAgICAnbHRlJzogbGFtYmRhIHgsIHk6IHggPD0geSwKICAgICAgICAnbm90JzogbGFtYmRhIHg6IG5vdCB4LAogICAgICAgICdub3RlcSc6IGxhbWJkYSB4LCB5OiB4ICE9IHksCiAgICAgICAgJ25vdGluJzogbGFtYmRhIHgsIHk6IHggbm90IGluIHksCiAgICB9CgogICAgYWxsb3dlZF92YWx1ZXMgPSB7CiAgICAgICAgJ3N5c19wbGF0Zm9ybSc6IHN5cy5wbGF0Zm9ybSwKICAgICAgICAncHl0aG9uX3ZlcnNpb24nOiAnJXMuJXMnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgIyBwYXJzaW5nIHN5cy5wbGF0Zm9ybSBpcyBub3QgcmVsaWFibGUsIGJ1dCB0aGVyZSBpcyBubyBvdGhlcgogICAgICAgICMgd2F5IHRvIGdldCBlLmcuIDIuNy4yKywgYW5kIHRoZSBQRVAgaXMgZGVmaW5lZCB3aXRoIHN5cy52ZXJzaW9uCiAgICAgICAgJ3B5dGhvbl9mdWxsX3ZlcnNpb24nOiBzeXMudmVyc2lvbi5zcGxpdCgnICcsIDEpWzBdLAogICAgICAgICdvc19uYW1lJzogb3MubmFtZSwKICAgICAgICAncGxhdGZvcm1faW5fdmVudic6IHN0cihpbl92ZW52KCkpLAogICAgICAgICdwbGF0Zm9ybV9yZWxlYXNlJzogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICdwbGF0Zm9ybV92ZXJzaW9uJzogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICdwbGF0Zm9ybV9tYWNoaW5lJzogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nOiBweXRob25faW1wbGVtZW50YXRpb24oKSwKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGV4dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gY29udGV4dDogSWYgc3BlY2lmaWVkLCBuYW1lcyBhcmUgbG9va2VkIHVwIGluIHRoaXMgbWFwcGluZy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0IG9yIHt9CiAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lCgogICAgZGVmIGdldF9mcmFnbWVudChzZWxmLCBvZmZzZXQpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgcGFydCBvZiB0aGUgc291cmNlIHdoaWNoIGlzIGNhdXNpbmcgYSBwcm9ibGVtLgogICAgICAgICIiIgogICAgICAgIGZyYWdtZW50X2xlbiA9IDEwCiAgICAgICAgcyA9ICclcicgJSAoc2VsZi5zb3VyY2Vbb2Zmc2V0Om9mZnNldCArIGZyYWdtZW50X2xlbl0pCiAgICAgICAgaWYgb2Zmc2V0ICsgZnJhZ21lbnRfbGVuIDwgbGVuKHNlbGYuc291cmNlKToKICAgICAgICAgICAgcyArPSAnLi4uJwogICAgICAgIHJldHVybiBzCgogICAgZGVmIGdldF9oYW5kbGVyKHNlbGYsIG5vZGVfdHlwZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCBBU1Qgbm9kZSB0eXBlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICdkb18lcycgJSBub2RlX3R5cGUsIE5vbmUpCgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIG5vZGUsIGZpbGVuYW1lPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEV2YWx1YXRlIGEgc291cmNlIHN0cmluZyBvciBub2RlLCB1c2luZyBgYGZpbGVuYW1lYGAgd2hlbgogICAgICAgIGRpc3BsYXlpbmcgZXJyb3JzLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBub2RlCiAgICAgICAgICAgIGt3YXJncyA9IHsnbW9kZSc6ICdldmFsJ30KICAgICAgICAgICAgaWYgZmlsZW5hbWU6CiAgICAgICAgICAgICAgICBrd2FyZ3NbJ2ZpbGVuYW1lJ10gPSBmaWxlbmFtZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBub2RlID0gYXN0LnBhcnNlKG5vZGUsICoqa3dhcmdzKQogICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLmdldF9mcmFnbWVudChlLm9mZnNldCkKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdzeW50YXggZXJyb3IgJXMnICUgcykKICAgICAgICBub2RlX3R5cGUgPSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCiAgICAgICAgaGFuZGxlciA9IHNlbGYuZ2V0X2hhbmRsZXIobm9kZV90eXBlKQogICAgICAgIGlmIGhhbmRsZXIgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIHMgPSAnKHNvdXJjZSBub3QgYXZhaWxhYmxlKScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLmdldF9mcmFnbWVudChub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJkb24ndCBrbm93IGhvdyB0byBldmFsdWF0ZSAlciAlcyIgJSAoCiAgICAgICAgICAgICAgICBub2RlX3R5cGUsIHMpKQogICAgICAgIHJldHVybiBoYW5kbGVyKG5vZGUpCgogICAgZGVmIGdldF9hdHRyX2tleShzZWxmLCBub2RlKToKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShub2RlLCBhc3QuQXR0cmlidXRlKSwgJ2F0dHJpYnV0ZSBub2RlIGV4cGVjdGVkJwogICAgICAgIHJldHVybiAnJXMuJXMnICUgKG5vZGUudmFsdWUuaWQsIG5vZGUuYXR0cikKCiAgICBkZWYgZG9fYXR0cmlidXRlKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIGFzdC5OYW1lKToKICAgICAgICAgICAgdmFsaWQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGtleSA9IHNlbGYuZ2V0X2F0dHJfa2V5KG5vZGUpCiAgICAgICAgICAgIHZhbGlkID0ga2V5IGluIHNlbGYuY29udGV4dCBvciBrZXkgaW4gc2VsZi5hbGxvd2VkX3ZhbHVlcwogICAgICAgIGlmIG5vdCB2YWxpZDoKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ2ludmFsaWQgZXhwcmVzc2lvbjogJXMnICUga2V5KQogICAgICAgIGlmIGtleSBpbiBzZWxmLmNvbnRleHQ6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29udGV4dFtrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5hbGxvd2VkX3ZhbHVlc1trZXldCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19ib29sb3Aoc2VsZiwgbm9kZSk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5ldmFsdWF0ZShub2RlLnZhbHVlc1swXSkKICAgICAgICBpc19vciA9IG5vZGUub3AuX19jbGFzc19fIGlzIGFzdC5PcgogICAgICAgIGlzX2FuZCA9IG5vZGUub3AuX19jbGFzc19fIGlzIGFzdC5BbmQKICAgICAgICBhc3NlcnQgaXNfb3Igb3IgaXNfYW5kCiAgICAgICAgaWYgKGlzX2FuZCBhbmQgcmVzdWx0KSBvciAoaXNfb3IgYW5kIG5vdCByZXN1bHQpOgogICAgICAgICAgICBmb3IgbiBpbiBub2RlLnZhbHVlc1sxOl06CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmV2YWx1YXRlKG4pCiAgICAgICAgICAgICAgICBpZiAoaXNfb3IgYW5kIHJlc3VsdCkgb3IgKGlzX2FuZCBhbmQgbm90IHJlc3VsdCk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGRvX2NvbXBhcmUoc2VsZiwgbm9kZSk6CiAgICAgICAgZGVmIHNhbml0eV9jaGVjayhsaHNub2RlLCByaHNub2RlKToKICAgICAgICAgICAgdmFsaWQgPSBUcnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzbm9kZSwgYXN0LlN0cikgYW5kIGlzaW5zdGFuY2Uocmhzbm9kZSwgYXN0LlN0cik6CiAgICAgICAgICAgICAgICB2YWxpZCA9IEZhbHNlCiAgICAgICAgICAgICNlbGlmIChpc2luc3RhbmNlKGxoc25vZGUsIGFzdC5BdHRyaWJ1dGUpCiAgICAgICAgICAgICMgICAgICBhbmQgaXNpbnN0YW5jZShyaHNub2RlLCBhc3QuQXR0cmlidXRlKSk6CiAgICAgICAgICAgICMgICAga2xocyA9IHNlbGYuZ2V0X2F0dHJfa2V5KGxoc25vZGUpCiAgICAgICAgICAgICMgICAga3JocyA9IHNlbGYuZ2V0X2F0dHJfa2V5KHJoc25vZGUpCiAgICAgICAgICAgICMgICAgdmFsaWQgPSBrbGhzICE9IGtyaHMKICAgICAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuZ2V0X2ZyYWdtZW50KG5vZGUuY29sX29mZnNldCkKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdJbnZhbGlkIGNvbXBhcmlzb246ICVzJyAlIHMpCgogICAgICAgIGxoc25vZGUgPSBub2RlLmxlZnQKICAgICAgICBsaHMgPSBzZWxmLmV2YWx1YXRlKGxoc25vZGUpCiAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGZvciBvcCwgcmhzbm9kZSBpbiB6aXAobm9kZS5vcHMsIG5vZGUuY29tcGFyYXRvcnMpOgogICAgICAgICAgICBzYW5pdHlfY2hlY2sobGhzbm9kZSwgcmhzbm9kZSkKICAgICAgICAgICAgb3AgPSBvcC5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQogICAgICAgICAgICBpZiBvcCBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigndW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAlcicgJSBvcCkKICAgICAgICAgICAgcmhzID0gc2VsZi5ldmFsdWF0ZShyaHNub2RlKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm9wZXJhdG9yc1tvcF0obGhzLCByaHMpCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBsaHMgPSByaHMKICAgICAgICAgICAgbGhzbm9kZSA9IHJoc25vZGUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGRvX2V4cHJlc3Npb24oc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZXZhbHVhdGUobm9kZS5ib2R5KQoKICAgIGRlZiBkb19uYW1lKHNlbGYsIG5vZGUpOgogICAgICAgIHZhbGlkID0gRmFsc2UKICAgICAgICBpZiBub2RlLmlkIGluIHNlbGYuY29udGV4dDoKICAgICAgICAgICAgdmFsaWQgPSBUcnVlCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29udGV4dFtub2RlLmlkXQogICAgICAgIGVsaWYgbm9kZS5pZCBpbiBzZWxmLmFsbG93ZWRfdmFsdWVzOgogICAgICAgICAgICB2YWxpZCA9IFRydWUKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5hbGxvd2VkX3ZhbHVlc1tub2RlLmlkXQogICAgICAgIGlmIG5vdCB2YWxpZDoKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ2ludmFsaWQgZXhwcmVzc2lvbjogJXMnICUgbm9kZS5pZCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGRvX3N0cihzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5zCgoKZGVmIGludGVycHJldChtYXJrZXIsIGV4ZWN1dGlvbl9jb250ZXh0PU5vbmUpOgogICAgIiIiCiAgICBJbnRlcnByZXQgYSBtYXJrZXIgYW5kIHJldHVybiBhIHJlc3VsdCBkZXBlbmRpbmcgb24gZW52aXJvbm1lbnQuCgogICAgOnBhcmFtIG1hcmtlcjogVGhlIG1hcmtlciB0byBpbnRlcnByZXQuCiAgICA6dHlwZSBtYXJrZXI6IHN0cgogICAgOnBhcmFtIGV4ZWN1dGlvbl9jb250ZXh0OiBUaGUgY29udGV4dCB1c2VkIGZvciBuYW1lIGxvb2t1cC4KICAgIDp0eXBlIGV4ZWN1dGlvbl9jb250ZXh0OiBtYXBwaW5nCiAgICAiIiIKICAgIHJldHVybiBFdmFsdWF0b3IoZXhlY3V0aW9uX2NvbnRleHQpLmV2YWx1YXRlKG1hcmtlci5zdHJpcCgpKQpQSwMEFAAAAAAAAAAhAA2mbPGxlwAAsZcAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tZXRhZGF0YS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0YWRhdGEgZm9yIFB5dGhvbiBwYWNrYWdlcyBQRVBzLgoKU3VwcG9ydHMgYWxsIG1ldGFkYXRhIGZvcm1hdHMgKDEuMCwgMS4xLCAxLjIsIGFuZCAyLjAgZXhwZXJpbWVudGFsKS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwpmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlX2Zyb21fZmlsZQppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24sIF9fdmVyc2lvbl9fCmZyb20gLmNvbXBhdCBpbXBvcnQgU3RyaW5nSU8sIHN0cmluZ190eXBlcywgdGV4dF90eXBlCmZyb20gLm1hcmtlcnMgaW1wb3J0IGludGVycHJldApmcm9tIC51dGlsIGltcG9ydCBleHRyYWN0X2J5X2tleSwgZ2V0X2V4dHJhcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBQRVA0NDBfVkVSU0lPTl9SRQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTWV0YWRhdGFNaXNzaW5nRXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJBIHJlcXVpcmVkIG1ldGFkYXRhIGlzIG1pc3NpbmciIiIKCgpjbGFzcyBNZXRhZGF0YUNvbmZsaWN0RXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJBdHRlbXB0IHRvIHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgZmllbGRzIHRoYXQgYXJlIGNvbmZsaWN0dWFsLiIiIgoKCmNsYXNzIE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiVW5rbm93biBtZXRhZGF0YSB2ZXJzaW9uIG51bWJlci4iIiIKCgpjbGFzcyBNZXRhZGF0YUludmFsaWRFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkEgbWV0YWRhdGEgdmFsdWUgaXMgaW52YWxpZCIiIgoKIyBwdWJsaWMgQVBJIG9mIHRoaXMgbW9kdWxlCl9fYWxsX18gPSBbJ01ldGFkYXRhJywgJ1BLR19JTkZPX0VOQ09ESU5HJywgJ1BLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OJ10KCiMgRW5jb2RpbmcgdXNlZCBmb3IgdGhlIFBLRy1JTkZPIGZpbGVzClBLR19JTkZPX0VOQ09ESU5HID0gJ3V0Zi04JwoKIyBwcmVmZXJyZWQgdmVyc2lvbi4gSG9wZWZ1bGx5IHdpbGwgYmUgY2hhbmdlZAojIHRvIDEuMiBvbmNlIFBFUCAzNDUgaXMgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUKUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04gPSAnMS4xJwoKX0xJTkVfUFJFRklYXzFfMiA9IHJlLmNvbXBpbGUoJ1xuICAgICAgIFx8JykKX0xJTkVfUFJFRklYX1BSRV8xXzIgPSByZS5jb21waWxlKCdcbiAgICAgICAgJykKXzI0MV9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTGljZW5zZScpCgpfMzE0X0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTGljZW5zZScsICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMnLCAnUmVxdWlyZXMnKQoKXzMxNF9NQVJLRVJTID0gKCdPYnNvbGV0ZXMnLCAnUHJvdmlkZXMnLCAnUmVxdWlyZXMnLCAnQ2xhc3NpZmllcicsCiAgICAgICAgICAgICAgICAnRG93bmxvYWQtVVJMJykKCl8zNDVfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdNYWludGFpbmVyJywgJ01haW50YWluZXItZW1haWwnLCAnTGljZW5zZScsCiAgICAgICAgICAgICAgICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm9qZWN0LVVSTCcsICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMtUHl0aG9uJywgJ1JlcXVpcmVzLUV4dGVybmFsJykKCl8zNDVfTUFSS0VSUyA9ICgnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywgJ1JlcXVpcmVzLVB5dGhvbicsCiAgICAgICAgICAgICAgICAnT2Jzb2xldGVzLURpc3QnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnLCAnTWFpbnRhaW5lcicsCiAgICAgICAgICAgICAgICAnTWFpbnRhaW5lci1lbWFpbCcsICdQcm9qZWN0LVVSTCcpCgpfNDI2X0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTWFpbnRhaW5lcicsICdNYWludGFpbmVyLWVtYWlsJywgJ0xpY2Vuc2UnLAogICAgICAgICAgICAgICAnQ2xhc3NpZmllcicsICdEb3dubG9hZC1VUkwnLCAnT2Jzb2xldGVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvamVjdC1VUkwnLCAnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1JlcXVpcmVzLVB5dGhvbicsICdSZXF1aXJlcy1FeHRlcm5hbCcsICdQcml2YXRlLVZlcnNpb24nLAogICAgICAgICAgICAgICAnT2Jzb2xldGVkLUJ5JywgJ1NldHVwLVJlcXVpcmVzLURpc3QnLCAnRXh0ZW5zaW9uJywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzLUV4dHJhJykKCl80MjZfTUFSS0VSUyA9ICgnUHJpdmF0ZS1WZXJzaW9uJywgJ1Byb3ZpZGVzLUV4dHJhJywgJ09ic29sZXRlZC1CeScsCiAgICAgICAgICAgICAgICAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsICdFeHRlbnNpb24nKQoKX0FMTF9GSUVMRFMgPSBzZXQoKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzI0MV9GSUVMRFMpCl9BTExfRklFTERTLnVwZGF0ZShfMzE0X0ZJRUxEUykKX0FMTF9GSUVMRFMudXBkYXRlKF8zNDVfRklFTERTKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzQyNl9GSUVMRFMpCgpFWFRSQV9SRSA9IHJlLmNvbXBpbGUocicnJ2V4dHJhXHMqPT1ccyooIihbXiJdKykifCcoW14nXSspJyknJycpCgoKZGVmIF92ZXJzaW9uMmZpZWxkbGlzdCh2ZXJzaW9uKToKICAgIGlmIHZlcnNpb24gPT0gJzEuMCc6CiAgICAgICAgcmV0dXJuIF8yNDFfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzEuMSc6CiAgICAgICAgcmV0dXJuIF8zMTRfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzEuMic6CiAgICAgICAgcmV0dXJuIF8zNDVfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzIuMCc6CiAgICAgICAgcmV0dXJuIF80MjZfRklFTERTCiAgICByYWlzZSBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcih2ZXJzaW9uKQoKCmRlZiBfYmVzdF92ZXJzaW9uKGZpZWxkcyk6CiAgICAiIiJEZXRlY3QgdGhlIGJlc3QgdmVyc2lvbiBkZXBlbmRpbmcgb24gdGhlIGZpZWxkcyB1c2VkLiIiIgogICAgZGVmIF9oYXNfbWFya2VyKGtleXMsIG1hcmtlcnMpOgogICAgICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICAgICAgaWYgbWFya2VyIGluIGtleXM6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGtleXMgPSBbXQogICAgZm9yIGtleSwgdmFsdWUgaW4gZmllbGRzLml0ZW1zKCk6CiAgICAgICAgaWYgdmFsdWUgaW4gKFtdLCAnVU5LTk9XTicsIE5vbmUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtleXMuYXBwZW5kKGtleSkKCiAgICBwb3NzaWJsZV92ZXJzaW9ucyA9IFsnMS4wJywgJzEuMScsICcxLjInLCAnMi4wJ10KCiAgICAjIGZpcnN0IGxldCdzIHRyeSB0byBzZWUgaWYgYSBmaWVsZCBpcyBub3QgcGFydCBvZiBvbmUgb2YgdGhlIHZlcnNpb24KICAgIGZvciBrZXkgaW4ga2V5czoKICAgICAgICBpZiBrZXkgbm90IGluIF8yNDFfRklFTERTIGFuZCAnMS4wJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcxLjAnKQogICAgICAgIGlmIGtleSBub3QgaW4gXzMxNF9GSUVMRFMgYW5kICcxLjEnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzEuMScpCiAgICAgICAgaWYga2V5IG5vdCBpbiBfMzQ1X0ZJRUxEUyBhbmQgJzEuMicgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMS4yJykKICAgICAgICBpZiBrZXkgbm90IGluIF80MjZfRklFTERTIGFuZCAnMi4wJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcyLjAnKQoKICAgICMgcG9zc2libGVfdmVyc2lvbiBjb250YWlucyBxdWFsaWZpZWQgdmVyc2lvbnMKICAgIGlmIGxlbihwb3NzaWJsZV92ZXJzaW9ucykgPT0gMToKICAgICAgICByZXR1cm4gcG9zc2libGVfdmVyc2lvbnNbMF0gICAjIGZvdW5kICEKICAgIGVsaWYgbGVuKHBvc3NpYmxlX3ZlcnNpb25zKSA9PSAwOgogICAgICAgIHJhaXNlIE1ldGFkYXRhQ29uZmxpY3RFcnJvcignVW5rbm93biBtZXRhZGF0YSBzZXQnKQoKICAgICMgbGV0J3Mgc2VlIGlmIG9uZSB1bmlxdWUgbWFya2VyIGlzIGZvdW5kCiAgICBpc18xXzEgPSAnMS4xJyBpbiBwb3NzaWJsZV92ZXJzaW9ucyBhbmQgX2hhc19tYXJrZXIoa2V5cywgXzMxNF9NQVJLRVJTKQogICAgaXNfMV8yID0gJzEuMicgaW4gcG9zc2libGVfdmVyc2lvbnMgYW5kIF9oYXNfbWFya2VyKGtleXMsIF8zNDVfTUFSS0VSUykKICAgIGlzXzJfMCA9ICcyLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zIGFuZCBfaGFzX21hcmtlcihrZXlzLCBfNDI2X01BUktFUlMpCiAgICBpZiBpbnQoaXNfMV8xKSArIGludChpc18xXzIpICsgaW50KGlzXzJfMCkgPiAxOgogICAgICAgIHJhaXNlIE1ldGFkYXRhQ29uZmxpY3RFcnJvcignWW91IHVzZWQgaW5jb21wYXRpYmxlIDEuMS8xLjIvMi4wIGZpZWxkcycpCgogICAgIyB3ZSBoYXZlIHRoZSBjaG9pY2UsIDEuMCwgb3IgMS4yLCBvciAyLjAKICAgICMgICAtIDEuMCBoYXMgYSBicm9rZW4gU3VtbWFyeSBmaWVsZCBidXQgd29ya3Mgd2l0aCBhbGwgdG9vbHMKICAgICMgICAtIDEuMSBpcyB0byBhdm9pZAogICAgIyAgIC0gMS4yIGZpeGVzIFN1bW1hcnkgYnV0IGhhcyBsaXR0bGUgYWRvcHRpb24KICAgICMgICAtIDIuMCBhZGRzIG1vcmUgZmVhdHVyZXMgYW5kIGlzIHZlcnkgbmV3CiAgICBpZiBub3QgaXNfMV8xIGFuZCBub3QgaXNfMV8yIGFuZCBub3QgaXNfMl8wOgogICAgICAgICMgd2UgY291bGRuJ3QgZmluZCBhbnkgc3BlY2lmaWMgbWFya2VyCiAgICAgICAgaWYgUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04gaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHJldHVybiBQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTgogICAgaWYgaXNfMV8xOgogICAgICAgIHJldHVybiAnMS4xJwogICAgaWYgaXNfMV8yOgogICAgICAgIHJldHVybiAnMS4yJwoKICAgIHJldHVybiAnMi4wJwoKX0FUVFIyRklFTEQgPSB7CiAgICAnbWV0YWRhdGFfdmVyc2lvbic6ICdNZXRhZGF0YS1WZXJzaW9uJywKICAgICduYW1lJzogJ05hbWUnLAogICAgJ3ZlcnNpb24nOiAnVmVyc2lvbicsCiAgICAncGxhdGZvcm0nOiAnUGxhdGZvcm0nLAogICAgJ3N1cHBvcnRlZF9wbGF0Zm9ybSc6ICdTdXBwb3J0ZWQtUGxhdGZvcm0nLAogICAgJ3N1bW1hcnknOiAnU3VtbWFyeScsCiAgICAnZGVzY3JpcHRpb24nOiAnRGVzY3JpcHRpb24nLAogICAgJ2tleXdvcmRzJzogJ0tleXdvcmRzJywKICAgICdob21lX3BhZ2UnOiAnSG9tZS1wYWdlJywKICAgICdhdXRob3InOiAnQXV0aG9yJywKICAgICdhdXRob3JfZW1haWwnOiAnQXV0aG9yLWVtYWlsJywKICAgICdtYWludGFpbmVyJzogJ01haW50YWluZXInLAogICAgJ21haW50YWluZXJfZW1haWwnOiAnTWFpbnRhaW5lci1lbWFpbCcsCiAgICAnbGljZW5zZSc6ICdMaWNlbnNlJywKICAgICdjbGFzc2lmaWVyJzogJ0NsYXNzaWZpZXInLAogICAgJ2Rvd25sb2FkX3VybCc6ICdEb3dubG9hZC1VUkwnLAogICAgJ29ic29sZXRlc19kaXN0JzogJ09ic29sZXRlcy1EaXN0JywKICAgICdwcm92aWRlc19kaXN0JzogJ1Byb3ZpZGVzLURpc3QnLAogICAgJ3JlcXVpcmVzX2Rpc3QnOiAnUmVxdWlyZXMtRGlzdCcsCiAgICAnc2V0dXBfcmVxdWlyZXNfZGlzdCc6ICdTZXR1cC1SZXF1aXJlcy1EaXN0JywKICAgICdyZXF1aXJlc19weXRob24nOiAnUmVxdWlyZXMtUHl0aG9uJywKICAgICdyZXF1aXJlc19leHRlcm5hbCc6ICdSZXF1aXJlcy1FeHRlcm5hbCcsCiAgICAncmVxdWlyZXMnOiAnUmVxdWlyZXMnLAogICAgJ3Byb3ZpZGVzJzogJ1Byb3ZpZGVzJywKICAgICdvYnNvbGV0ZXMnOiAnT2Jzb2xldGVzJywKICAgICdwcm9qZWN0X3VybCc6ICdQcm9qZWN0LVVSTCcsCiAgICAncHJpdmF0ZV92ZXJzaW9uJzogJ1ByaXZhdGUtVmVyc2lvbicsCiAgICAnb2Jzb2xldGVkX2J5JzogJ09ic29sZXRlZC1CeScsCiAgICAnZXh0ZW5zaW9uJzogJ0V4dGVuc2lvbicsCiAgICAncHJvdmlkZXNfZXh0cmEnOiAnUHJvdmlkZXMtRXh0cmEnLAp9CgpfUFJFRElDQVRFX0ZJRUxEUyA9ICgnUmVxdWlyZXMtRGlzdCcsICdPYnNvbGV0ZXMtRGlzdCcsICdQcm92aWRlcy1EaXN0JykKX1ZFUlNJT05TX0ZJRUxEUyA9ICgnUmVxdWlyZXMtUHl0aG9uJywpCl9WRVJTSU9OX0ZJRUxEUyA9ICgnVmVyc2lvbicsKQpfTElTVEZJRUxEUyA9ICgnUGxhdGZvcm0nLCAnQ2xhc3NpZmllcicsICdPYnNvbGV0ZXMnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMnLCAnUHJvdmlkZXMnLCAnT2Jzb2xldGVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywgJ1JlcXVpcmVzLUV4dGVybmFsJywKICAgICAgICAgICAgICAgJ1Byb2plY3QtVVJMJywgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTZXR1cC1SZXF1aXJlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzLUV4dHJhJywgJ0V4dGVuc2lvbicpCl9MSVNUVFVQTEVGSUVMRFMgPSAoJ1Byb2plY3QtVVJMJywpCgpfRUxFTUVOVFNGSUVMRCA9ICgnS2V5d29yZHMnLCkKCl9VTklDT0RFRklFTERTID0gKCdBdXRob3InLCAnTWFpbnRhaW5lcicsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJykKCl9NSVNTSU5HID0gb2JqZWN0KCkKCl9GSUxFU0FGRSA9IHJlLmNvbXBpbGUoJ1teQS1aYS16MC05Ll0rJykKCgpkZWYgX2dldF9uYW1lX2FuZF92ZXJzaW9uKG5hbWUsIHZlcnNpb24sIGZvcl9maWxlbmFtZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHdpdGggdmVyc2lvbi4KCiAgICBJZiBmb3JfZmlsZW5hbWUgaXMgdHJ1ZSwgcmV0dXJuIGEgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLiIiIgogICAgaWYgZm9yX2ZpbGVuYW1lOgogICAgICAgICMgRm9yIGJvdGggbmFtZSBhbmQgdmVyc2lvbiBhbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIG9yICcuJwogICAgICAgICMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuICBBZGRpdGlvbmFsbHkgYW55CiAgICAgICAgIyBzcGFjZXMgaW4gdGhlIHZlcnNpb24gc3RyaW5nIGJlY29tZSAnLicKICAgICAgICBuYW1lID0gX0ZJTEVTQUZFLnN1YignLScsIG5hbWUpCiAgICAgICAgdmVyc2lvbiA9IF9GSUxFU0FGRS5zdWIoJy0nLCB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpKQogICAgcmV0dXJuICclcy0lcycgJSAobmFtZSwgdmVyc2lvbikKCgpjbGFzcyBMZWdhY3lNZXRhZGF0YShvYmplY3QpOgogICAgIiIiVGhlIGxlZ2FjeSBtZXRhZGF0YSBvZiBhIHJlbGVhc2UuCgogICAgU3VwcG9ydHMgdmVyc2lvbnMgMS4wLCAxLjEgYW5kIDEuMiAoYXV0by1kZXRlY3RlZCkuIFlvdSBjYW4KICAgIGluc3RhbnRpYXRlIHRoZSBjbGFzcyB3aXRoIG9uZSBvZiB0aGVzZSBhcmd1bWVudHMgKG9yIG5vbmUpOgogICAgLSAqcGF0aCosIHRoZSBwYXRoIHRvIGEgbWV0YWRhdGEgZmlsZQogICAgLSAqZmlsZW9iaiogZ2l2ZSBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtZXRhZGF0YSBhcyBjb250ZW50CiAgICAtICptYXBwaW5nKiBpcyBhIGRpY3QtbGlrZSBvYmplY3QKICAgIC0gKnNjaGVtZSogaXMgYSB2ZXJzaW9uIHNjaGVtZSBuYW1lCiAgICAiIiIKICAgICMgVE9ETyBkb2N1bWVudCB0aGUgbWFwcGluZyBBUEkgYW5kIFVOS05PV04gZGVmYXVsdCBrZXkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBmaWxlb2JqPU5vbmUsIG1hcHBpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBzY2hlbWU9J2RlZmF1bHQnKToKICAgICAgICBpZiBbcGF0aCwgZmlsZW9iaiwgbWFwcGluZ10uY291bnQoTm9uZSkgPCAyOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3BhdGgsIGZpbGVvYmogYW5kIG1hcHBpbmcgYXJlIGV4Y2x1c2l2ZScpCiAgICAgICAgc2VsZi5fZmllbGRzID0ge30KICAgICAgICBzZWxmLnJlcXVpcmVzX2ZpbGVzID0gW10KICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXMgPSBOb25lCiAgICAgICAgc2VsZi5zY2hlbWUgPSBzY2hlbWUKICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnJlYWQocGF0aCkKICAgICAgICBlbGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucmVhZF9maWxlKGZpbGVvYmopCiAgICAgICAgZWxpZiBtYXBwaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnVwZGF0ZShtYXBwaW5nKQogICAgICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICBkZWYgc2V0X21ldGFkYXRhX3ZlcnNpb24oc2VsZik6CiAgICAgICAgc2VsZi5fZmllbGRzWydNZXRhZGF0YS1WZXJzaW9uJ10gPSBfYmVzdF92ZXJzaW9uKHNlbGYuX2ZpZWxkcykKCiAgICBkZWYgX3dyaXRlX2ZpZWxkKHNlbGYsIGZpbGVvYmosIG5hbWUsIHZhbHVlKToKICAgICAgICBmaWxlb2JqLndyaXRlKCclczogJXNcbicgJSAobmFtZSwgdmFsdWUpKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgIHJldHVybiBzZWxmLnNldChuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgZmllbGRfbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIHNlbGYuX2ZpZWxkc1tmaWVsZF9uYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IobmFtZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiAobmFtZSBpbiBzZWxmLl9maWVsZHMgb3IKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKSBpbiBzZWxmLl9maWVsZHMpCgogICAgZGVmIF9jb252ZXJ0X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBfQUxMX0ZJRUxEUzoKICAgICAgICAgICAgcmV0dXJuIG5hbWUKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCctJywgJ18nKS5sb3dlcigpCiAgICAgICAgcmV0dXJuIF9BVFRSMkZJRUxELmdldChuYW1lLCBuYW1lKQoKICAgIGRlZiBfZGVmYXVsdF92YWx1ZShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9MSVNURklFTERTIG9yIG5hbWUgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiAnVU5LTk9XTicKCiAgICBkZWYgX3JlbW92ZV9saW5lX3ByZWZpeChzZWxmLCB2YWx1ZSk6CiAgICAgICAgaWYgc2VsZi5tZXRhZGF0YV92ZXJzaW9uIGluICgnMS4wJywgJzEuMScpOgogICAgICAgICAgICByZXR1cm4gX0xJTkVfUFJFRklYX1BSRV8xXzIuc3ViKCdcbicsIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBfTElORV9QUkVGSVhfMV8yLnN1YignXG4nLCB2YWx1ZSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBfQVRUUjJGSUVMRDoKICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0KICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQoKICAgICMKICAgICMgUHVibGljIEFQSQogICAgIwoKIyAgICBkZXBlbmRlbmNpZXMgPSBwcm9wZXJ0eShfZ2V0X2RlcGVuZGVuY2llcywgX3NldF9kZXBlbmRlbmNpZXMpCgogICAgZGVmIGdldF9mdWxsbmFtZShzZWxmLCBmaWxlc2FmZT1GYWxzZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXN0cmlidXRpb24gbmFtZSB3aXRoIHZlcnNpb24uCgogICAgICAgIElmIGZpbGVzYWZlIGlzIHRydWUsIHJldHVybiBhIGZpbGVuYW1lLWVzY2FwZWQgZm9ybS4iIiIKICAgICAgICByZXR1cm4gX2dldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGZbJ05hbWUnXSwgc2VsZlsnVmVyc2lvbiddLCBmaWxlc2FmZSkKCiAgICBkZWYgaXNfZmllbGQoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIicmV0dXJuIFRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIG1ldGFkYXRhIGtleSIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICByZXR1cm4gbmFtZSBpbiBfQUxMX0ZJRUxEUwoKICAgIGRlZiBpc19tdWx0aV9maWVsZChzZWxmLCBuYW1lKToKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgcmV0dXJuIG5hbWUgaW4gX0xJU1RGSUVMRFMKCiAgICBkZWYgcmVhZChzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgIiIiUmVhZCB0aGUgbWV0YWRhdGEgdmFsdWVzIGZyb20gYSBmaWxlIHBhdGguIiIiCiAgICAgICAgZnAgPSBjb2RlY3Mub3BlbihmaWxlcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5yZWFkX2ZpbGUoZnApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiByZWFkX2ZpbGUoc2VsZiwgZmlsZW9iKToKICAgICAgICAiIiJSZWFkIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgb2JqZWN0LiIiIgogICAgICAgIG1zZyA9IG1lc3NhZ2VfZnJvbV9maWxlKGZpbGVvYikKICAgICAgICBzZWxmLl9maWVsZHNbJ01ldGFkYXRhLVZlcnNpb24nXSA9IG1zZ1snbWV0YWRhdGEtdmVyc2lvbiddCgogICAgICAgICMgV2hlbiByZWFkaW5nLCBnZXQgYWxsIHRoZSBmaWVsZHMgd2UgY2FuCiAgICAgICAgZm9yIGZpZWxkIGluIF9BTExfRklFTERTOgogICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gbXNnOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RGSUVMRFM6CiAgICAgICAgICAgICAgICAjIHdlIGNhbiBoYXZlIG11bHRpcGxlIGxpbmVzCiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBtc2cuZ2V0X2FsbChmaWVsZCkKICAgICAgICAgICAgICAgIGlmIGZpZWxkIGluIF9MSVNUVFVQTEVGSUVMRFMgYW5kIHZhbHVlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdHVwbGUodmFsdWUuc3BsaXQoJywnKSkgZm9yIHZhbHVlIGluIHZhbHVlc10KICAgICAgICAgICAgICAgIHNlbGYuc2V0KGZpZWxkLCB2YWx1ZXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1zZ1tmaWVsZF0KICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZSAhPSAnVU5LTk9XTic6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQoZmllbGQsIHZhbHVlKQogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlcGF0aCwgc2tpcF91bmtub3duPUZhbHNlKToKICAgICAgICAiIiJXcml0ZSB0aGUgbWV0YWRhdGEgZmllbGRzIHRvIGZpbGVwYXRoLiIiIgogICAgICAgIGZwID0gY29kZWNzLm9wZW4oZmlsZXBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShmcCwgc2tpcF91bmtub3duKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBmaWxlb2JqZWN0LCBza2lwX3Vua25vd249RmFsc2UpOgogICAgICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LiIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICBmb3IgZmllbGQgaW4gX3ZlcnNpb24yZmllbGRsaXN0KHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSk6CiAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYuZ2V0KGZpZWxkKQogICAgICAgICAgICBpZiBza2lwX3Vua25vd24gYW5kIHZhbHVlcyBpbiAoJ1VOS05PV04nLCBbXSwgWydVTktOT1dOJ10pOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlb2JqZWN0LCBmaWVsZCwgJywnLmpvaW4odmFsdWVzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGZpZWxkIG5vdCBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgICAgIGlmIGZpZWxkID09ICdEZXNjcmlwdGlvbic6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tZXRhZGF0YV92ZXJzaW9uIGluICgnMS4wJywgJzEuMScpOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMucmVwbGFjZSgnXG4nLCAnXG4gICAgICAgICcpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnJlcGxhY2UoJ1xuJywgJ1xuICAgICAgIHwnKQogICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KCiAgICAgICAgICAgIGlmIGZpZWxkIGluIF9MSVNUVFVQTEVGSUVMRFM6CiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbJywnLmpvaW4odmFsdWUpIGZvciB2YWx1ZSBpbiB2YWx1ZXNdCgogICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZW9iamVjdCwgZmllbGQsIHZhbHVlKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXI9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICIiIlNldCBtZXRhZGF0YSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gaXRlcmFibGUgYG90aGVyYCBhbmQga3dhcmdzLgoKICAgICAgICBCZWhhdmlvciBpcyBsaWtlIGBkaWN0LnVwZGF0ZWA6IElmIGBvdGhlcmAgaGFzIGEgYGBrZXlzYGAgbWV0aG9kLAogICAgICAgIHRoZXkgYXJlIGxvb3BlZCBvdmVyIGFuZCBgYHNlbGZba2V5XWBgIGlzIGFzc2lnbmVkIGBgb3RoZXJba2V5XWBgLgogICAgICAgIEVsc2UsIGBgb3RoZXJgYCBpcyBhbiBpdGVyYWJsZSBvZiBgYChrZXksIHZhbHVlKWBgIGl0ZXJhYmxlcy4KCiAgICAgICAgS2V5cyB0aGF0IGRvbid0IG1hdGNoIGEgbWV0YWRhdGEgZmllbGQgb3IgdGhhdCBoYXZlIGFuIGVtcHR5IHZhbHVlIGFyZQogICAgICAgIGRyb3BwZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGVmIF9zZXQoa2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIGtleSBpbiBfQVRUUjJGSUVMRCBhbmQgdmFsdWU6CiAgICAgICAgICAgICAgICBzZWxmLnNldChzZWxmLl9jb252ZXJ0X25hbWUoa2V5KSwgdmFsdWUpCgogICAgICAgIGlmIG5vdCBvdGhlcjoKICAgICAgICAgICAgIyBvdGhlciBpcyBOb25lIG9yIGVtcHR5IGNvbnRhaW5lcgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICBmb3IgayBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBfc2V0KGssIG90aGVyW2tdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrLCB2IGluIG90aGVyOgogICAgICAgICAgICAgICAgX3NldChrLCB2KQoKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICAgICAgX3NldChrLCB2KQoKICAgIGRlZiBzZXQoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkNvbnRyb2wgdGhlbiBzZXQgYSBtZXRhZGF0YSBmaWVsZC4iIiIKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCgogICAgICAgIGlmICgobmFtZSBpbiBfRUxFTUVOVFNGSUVMRCBvciBuYW1lID09ICdQbGF0Zm9ybScpIGFuZAogICAgICAgICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbdi5zdHJpcCgpIGZvciB2IGluIHZhbHVlLnNwbGl0KCcsJyldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCiAgICAgICAgZWxpZiAobmFtZSBpbiBfTElTVEZJRUxEUyBhbmQKICAgICAgICAgICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCgogICAgICAgIGlmIGxvZ2dlci5pc0VuYWJsZWRGb3IobG9nZ2luZy5XQVJOSU5HKToKICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gc2VsZlsnTmFtZSddCgogICAgICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQogICAgICAgICAgICBpZiBuYW1lIGluIF9QUkVESUNBVEVfRklFTERTIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgdmFsdWVzIGFyZSB2YWxpZAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfbWF0Y2hlcih2LnNwbGl0KCc7JylbMF0pOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnOiAnJXMnIGlzIG5vdCB2YWxpZCAoZmllbGQgJyVzJykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2LCBuYW1lKQogICAgICAgICAgICAjIEZJWE1FIHRoaXMgcmVqZWN0cyBVTktOT1dOLCBpcyB0aGF0IHJpZ2h0PwogICAgICAgICAgICBlbGlmIG5hbWUgaW4gX1ZFUlNJT05TX0ZJRUxEUyBhbmQgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX2NvbnN0cmFpbnRfbGlzdCh2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIiclcyc6ICclcycgaXMgbm90IGEgdmFsaWQgdmVyc2lvbiAoZmllbGQgJyVzJykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmFsdWUsIG5hbWUpCiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBfVkVSU0lPTl9GSUVMRFMgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF92ZXJzaW9uKHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiJyVzJzogJyVzJyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2YWx1ZSwgbmFtZSkKCiAgICAgICAgaWYgbmFtZSBpbiBfVU5JQ09ERUZJRUxEUzoKICAgICAgICAgICAgaWYgbmFtZSA9PSAnRGVzY3JpcHRpb24nOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9yZW1vdmVfbGluZV9wcmVmaXgodmFsdWUpCgogICAgICAgIHNlbGYuX2ZpZWxkc1tuYW1lXSA9IHZhbHVlCgogICAgZGVmIGdldChzZWxmLCBuYW1lLCBkZWZhdWx0PV9NSVNTSU5HKToKICAgICAgICAiIiJHZXQgYSBtZXRhZGF0YSBmaWVsZC4iIiIKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fZmllbGRzOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIF9NSVNTSU5HOgogICAgICAgICAgICAgICAgZGVmYXVsdCA9IHNlbGYuX2RlZmF1bHRfdmFsdWUobmFtZSkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBpZiBuYW1lIGluIF9VTklDT0RFRklFTERTOgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkc1tuYW1lXQogICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICBlbGlmIG5hbWUgaW4gX0xJU1RGSUVMRFM6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgcmVzID0gW10KICAgICAgICAgICAgZm9yIHZhbCBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIF9MSVNUVFVQTEVGSUVMRFM6CiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCh2YWwpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgVGhhdCdzIGZvciBQcm9qZWN0LVVSTAogICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoKHZhbFswXSwgdmFsWzFdKSkKICAgICAgICAgICAgcmV0dXJuIHJlcwoKICAgICAgICBlbGlmIG5hbWUgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKQogICAgICAgIHJldHVybiBzZWxmLl9maWVsZHNbbmFtZV0KCiAgICBkZWYgY2hlY2soc2VsZiwgc3RyaWN0PUZhbHNlKToKICAgICAgICAiIiJDaGVjayBpZiB0aGUgbWV0YWRhdGEgaXMgY29tcGxpYW50LiBJZiBzdHJpY3QgaXMgVHJ1ZSB0aGVuIHJhaXNlIGlmCiAgICAgICAgbm8gTmFtZSBvciBWZXJzaW9uIGFyZSBwcm92aWRlZCIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICAjIFhYWCBzaG91bGQgY2hlY2sgdGhlIHZlcnNpb25zIChpZiB0aGUgZmlsZSB3YXMgbG9hZGVkKQogICAgICAgIG1pc3NpbmcsIHdhcm5pbmdzID0gW10sIFtdCgogICAgICAgIGZvciBhdHRyIGluICgnTmFtZScsICdWZXJzaW9uJyk6ICAjIHJlcXVpcmVkIGJ5IFBFUCAzNDUKICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZjoKICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGF0dHIpCgogICAgICAgIGlmIHN0cmljdCBhbmQgbWlzc2luZyAhPSBbXToKICAgICAgICAgICAgbXNnID0gJ21pc3NpbmcgcmVxdWlyZWQgbWV0YWRhdGE6ICVzJyAlICcsICcuam9pbihtaXNzaW5nKQogICAgICAgICAgICByYWlzZSBNZXRhZGF0YU1pc3NpbmdFcnJvcihtc2cpCgogICAgICAgIGZvciBhdHRyIGluICgnSG9tZS1wYWdlJywgJ0F1dGhvcicpOgogICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoYXR0cikKCiAgICAgICAgIyBjaGVja2luZyBtZXRhZGF0YSAxLjIgKFhYWCBuZWVkcyB0byBjaGVjayAxLjEsIDEuMCkKICAgICAgICBpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gIT0gJzEuMic6CiAgICAgICAgICAgIHJldHVybiBtaXNzaW5nLCB3YXJuaW5ncwoKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQoKICAgICAgICBkZWYgYXJlX3ZhbGlkX2NvbnN0cmFpbnRzKHZhbHVlKToKICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX21hdGNoZXIodi5zcGxpdCgnOycpWzBdKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZm9yIGZpZWxkcywgY29udHJvbGxlciBpbiAoKF9QUkVESUNBVEVfRklFTERTLCBhcmVfdmFsaWRfY29uc3RyYWludHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfVkVSU0lPTlNfRklFTERTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuaXNfdmFsaWRfY29uc3RyYWludF9saXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1ZFUlNJT05fRklFTERTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuaXNfdmFsaWRfdmVyc2lvbikpOgogICAgICAgICAgICBmb3IgZmllbGQgaW4gZmllbGRzOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmdldChmaWVsZCwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCBub3QgY29udHJvbGxlcih2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYXBwZW5kKCJXcm9uZyB2YWx1ZSBmb3IgJyVzJzogJXMiICUgKGZpZWxkLCB2YWx1ZSkpCgogICAgICAgIHJldHVybiBtaXNzaW5nLCB3YXJuaW5ncwoKICAgIGRlZiB0b2RpY3Qoc2VsZiwgc2tpcF9taXNzaW5nPUZhbHNlKToKICAgICAgICAiIiJSZXR1cm4gZmllbGRzIGFzIGEgZGljdC4KCiAgICAgICAgRmllbGQgbmFtZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXNlIHRoZSB1bmRlcnNjb3JlLWxvd2VyY2FzZSBzdHlsZQogICAgICAgIGluc3RlYWQgb2YgaHlwaGVuLW1peGVkIGNhc2UgKGkuZS4gaG9tZV9wYWdlIGluc3RlYWQgb2YgSG9tZS1wYWdlKS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICAgICAgbWFwcGluZ18xXzAgPSAoCiAgICAgICAgICAgICgnbWV0YWRhdGFfdmVyc2lvbicsICdNZXRhZGF0YS1WZXJzaW9uJyksCiAgICAgICAgICAgICgnbmFtZScsICdOYW1lJyksCiAgICAgICAgICAgICgndmVyc2lvbicsICdWZXJzaW9uJyksCiAgICAgICAgICAgICgnc3VtbWFyeScsICdTdW1tYXJ5JyksCiAgICAgICAgICAgICgnaG9tZV9wYWdlJywgJ0hvbWUtcGFnZScpLAogICAgICAgICAgICAoJ2F1dGhvcicsICdBdXRob3InKSwKICAgICAgICAgICAgKCdhdXRob3JfZW1haWwnLCAnQXV0aG9yLWVtYWlsJyksCiAgICAgICAgICAgICgnbGljZW5zZScsICdMaWNlbnNlJyksCiAgICAgICAgICAgICgnZGVzY3JpcHRpb24nLCAnRGVzY3JpcHRpb24nKSwKICAgICAgICAgICAgKCdrZXl3b3JkcycsICdLZXl3b3JkcycpLAogICAgICAgICAgICAoJ3BsYXRmb3JtJywgJ1BsYXRmb3JtJyksCiAgICAgICAgICAgICgnY2xhc3NpZmllcnMnLCAnQ2xhc3NpZmllcicpLAogICAgICAgICAgICAoJ2Rvd25sb2FkX3VybCcsICdEb3dubG9hZC1VUkwnKSwKICAgICAgICApCgogICAgICAgIGRhdGEgPSB7fQogICAgICAgIGZvciBrZXksIGZpZWxkX25hbWUgaW4gbWFwcGluZ18xXzA6CiAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBzZWxmW2ZpZWxkX25hbWVdCgogICAgICAgIGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSA9PSAnMS4yJzoKICAgICAgICAgICAgbWFwcGluZ18xXzIgPSAoCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX2Rpc3QnLCAnUmVxdWlyZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdyZXF1aXJlc19weXRob24nLCAnUmVxdWlyZXMtUHl0aG9uJyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX2V4dGVybmFsJywgJ1JlcXVpcmVzLUV4dGVybmFsJyksCiAgICAgICAgICAgICAgICAoJ3Byb3ZpZGVzX2Rpc3QnLCAnUHJvdmlkZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdvYnNvbGV0ZXNfZGlzdCcsICdPYnNvbGV0ZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdwcm9qZWN0X3VybCcsICdQcm9qZWN0LVVSTCcpLAogICAgICAgICAgICAgICAgKCdtYWludGFpbmVyJywgJ01haW50YWluZXInKSwKICAgICAgICAgICAgICAgICgnbWFpbnRhaW5lcl9lbWFpbCcsICdNYWludGFpbmVyLWVtYWlsJyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMjoKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5ICE9ICdwcm9qZWN0X3VybCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHNlbGZbZmllbGRfbmFtZV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBbJywnLmpvaW4odSkgZm9yIHUgaW4gc2VsZltmaWVsZF9uYW1lXV0KCiAgICAgICAgZWxpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gPT0gJzEuMSc6CiAgICAgICAgICAgIG1hcHBpbmdfMV8xID0gKAogICAgICAgICAgICAgICAgKCdwcm92aWRlcycsICdQcm92aWRlcycpLAogICAgICAgICAgICAgICAgKCdyZXF1aXJlcycsICdSZXF1aXJlcycpLAogICAgICAgICAgICAgICAgKCdvYnNvbGV0ZXMnLCAnT2Jzb2xldGVzJyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMToKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gc2VsZltmaWVsZF9uYW1lXQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcXVpcmVtZW50cyk6CiAgICAgICAgaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddID09ICcxLjEnOgogICAgICAgICAgICAjIHdlIGNhbid0IGhhdmUgMS4xIG1ldGFkYXRhICphbmQqIFNldHVwdG9vbHMgcmVxdWlyZXMKICAgICAgICAgICAgZm9yIGZpZWxkIGluICgnT2Jzb2xldGVzJywgJ1JlcXVpcmVzJywgJ1Byb3ZpZGVzJyk6CiAgICAgICAgICAgICAgICBpZiBmaWVsZCBpbiBzZWxmOgogICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmW2ZpZWxkXQogICAgICAgIHNlbGZbJ1JlcXVpcmVzLURpc3QnXSArPSByZXF1aXJlbWVudHMKCiAgICAjIE1hcHBpbmcgQVBJCiAgICAjIFRPRE8gY291bGQgYWRkIGl0ZXIqIHZhcmlhbnRzCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3QoX3ZlcnNpb24yZmllbGRsaXN0KHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSkpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CiAgICAgICAgICAgIHlpZWxkIGtleQoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmLmtleXMoKV0KCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZi5rZXlzKCldCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPCVzICVzICVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbikKCgpNRVRBREFUQV9GSUxFTkFNRSA9ICdweWRpc3QuanNvbicKV0hFRUxfTUVUQURBVEFfRklMRU5BTUUgPSAnbWV0YWRhdGEuanNvbicKCgpjbGFzcyBNZXRhZGF0YShvYmplY3QpOgogICAgIiIiCiAgICBUaGUgbWV0YWRhdGEgb2YgYSByZWxlYXNlLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgMi4wIChKU09OKQogICAgbWV0YWRhdGEgd2hlcmUgcG9zc2libGUuIElmIG5vdCBwb3NzaWJsZSwgaXQgd3JhcHMgYSBMZWdhY3lNZXRhZGF0YQogICAgaW5zdGFuY2Ugd2hpY2ggaGFuZGxlcyB0aGUga2V5LXZhbHVlIG1ldGFkYXRhIGZvcm1hdC4KICAgICIiIgoKICAgIE1FVEFEQVRBX1ZFUlNJT05fTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJ15cZCsoXC5cZCspKiQnKQoKICAgIE5BTUVfTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJ15bMC05QS1aXShbMC05QS1aXy4tXSpbMC05QS1aXSk/JCcsIHJlLkkpCgogICAgVkVSU0lPTl9NQVRDSEVSID0gUEVQNDQwX1ZFUlNJT05fUkUKCiAgICBTVU1NQVJZX01BVENIRVIgPSByZS5jb21waWxlKCcuezEsMjA0N30nKQoKICAgIE1FVEFEQVRBX1ZFUlNJT04gPSAnMi4wJwoKICAgIEdFTkVSQVRPUiA9ICdkaXN0bGliICglcyknICUgX192ZXJzaW9uX18KCiAgICBNQU5EQVRPUllfS0VZUyA9IHsKICAgICAgICAnbmFtZSc6ICgpLAogICAgICAgICd2ZXJzaW9uJzogKCksCiAgICAgICAgJ3N1bW1hcnknOiAoJ2xlZ2FjeScsKSwKICAgIH0KCiAgICBJTkRFWF9LRVlTID0gKCduYW1lIHZlcnNpb24gbGljZW5zZSBzdW1tYXJ5IGRlc2NyaXB0aW9uIGF1dGhvciAnCiAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwga2V5d29yZHMgcGxhdGZvcm0gaG9tZV9wYWdlIGNsYXNzaWZpZXJzICcKICAgICAgICAgICAgICAgICAgJ2Rvd25sb2FkX3VybCcpCgogICAgREVQRU5ERU5DWV9LRVlTID0gKCdleHRyYXMgcnVuX3JlcXVpcmVzIHRlc3RfcmVxdWlyZXMgYnVpbGRfcmVxdWlyZXMgJwogICAgICAgICAgICAgICAgICAgICAgICdkZXZfcmVxdWlyZXMgcHJvdmlkZXMgbWV0YV9yZXF1aXJlcyBvYnNvbGV0ZWRfYnkgJwogICAgICAgICAgICAgICAgICAgICAgICdzdXBwb3J0c19lbnZpcm9ubWVudHMnKQoKICAgIFNZTlRBWF9WQUxJREFUT1JTID0gewogICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogKE1FVEFEQVRBX1ZFUlNJT05fTUFUQ0hFUiwgKCkpLAogICAgICAgICduYW1lJzogKE5BTUVfTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgICAgICd2ZXJzaW9uJzogKFZFUlNJT05fTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgICAgICdzdW1tYXJ5JzogKFNVTU1BUllfTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgfQoKICAgIF9fc2xvdHNfXyA9ICgnX2xlZ2FjeScsICdfZGF0YScsICdzY2hlbWUnKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbWFwcGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgIGlmIFtwYXRoLCBmaWxlb2JqLCBtYXBwaW5nXS5jb3VudChOb25lKSA8IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigncGF0aCwgZmlsZW9iaiBhbmQgbWFwcGluZyBhcmUgZXhjbHVzaXZlJykKICAgICAgICBzZWxmLl9sZWdhY3kgPSBOb25lCiAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQogICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICBpZiBtYXBwaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9tYXBwaW5nKG1hcHBpbmcsIHNjaGVtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBtYXBwaW5nCiAgICAgICAgICAgIGV4Y2VwdCBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeSA9IExlZ2FjeU1ldGFkYXRhKG1hcHBpbmc9bWFwcGluZywgc2NoZW1lPXNjaGVtZSkKICAgICAgICAgICAgICAgIHNlbGYudmFsaWRhdGUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGEgPSBOb25lCiAgICAgICAgICAgIGlmIHBhdGg6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgZWxpZiBmaWxlb2JqOgogICAgICAgICAgICAgICAgZGF0YSA9IGZpbGVvYmoucmVhZCgpCiAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSW5pdGlhbGlzZWQgd2l0aCBubyBhcmdzIC0gdG8gYmUgYWRkZWQKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiBzZWxmLk1FVEFEQVRBX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgJ2dlbmVyYXRvcic6IHNlbGYuR0VORVJBVE9SLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX21hcHBpbmcoc2VsZi5fZGF0YSwgc2NoZW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBOb3RlOiBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvciBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICMgaW5oZXJpdCBmcm9tIFZhbHVlRXJyb3IgKGl0J3MgYSBEaXN0bGliRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICMgd2hpY2ggc2hvdWxkIG5vdCBpbmhlcml0IGZyb20gVmFsdWVFcnJvcikuCiAgICAgICAgICAgICAgICAgICAgIyBUaGUgVmFsdWVFcnJvciBjb21lcyBmcm9tIHRoZSBqc29uLmxvYWQgLSBpZiB0aGF0CiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZWVkcyBhbmQgd2UgZ2V0IGEgdmFsaWRhdGlvbiBlcnJvciwgd2Ugd2FudAogICAgICAgICAgICAgICAgICAgICMgdGhhdCB0byBwcm9wYWdhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3kgPSBMZWdhY3lNZXRhZGF0YShmaWxlb2JqPVN0cmluZ0lPKGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZT1zY2hlbWUpCiAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZSgpCgogICAgY29tbW9uX2tleXMgPSBzZXQoKCduYW1lJywgJ3ZlcnNpb24nLCAnbGljZW5zZScsICdrZXl3b3JkcycsICdzdW1tYXJ5JykpCgogICAgbm9uZV9saXN0ID0gKE5vbmUsIGxpc3QpCiAgICBub25lX2RpY3QgPSAoTm9uZSwgZGljdCkKCiAgICBtYXBwZWRfa2V5cyA9IHsKICAgICAgICAncnVuX3JlcXVpcmVzJzogKCdSZXF1aXJlcy1EaXN0JywgbGlzdCksCiAgICAgICAgJ2J1aWxkX3JlcXVpcmVzJzogKCdTZXR1cC1SZXF1aXJlcy1EaXN0JywgbGlzdCksCiAgICAgICAgJ2Rldl9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAndGVzdF9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnbWV0YV9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnZXh0cmFzJzogKCdQcm92aWRlcy1FeHRyYScsIGxpc3QpLAogICAgICAgICdtb2R1bGVzJzogbm9uZV9saXN0LAogICAgICAgICduYW1lc3BhY2VzJzogbm9uZV9saXN0LAogICAgICAgICdleHBvcnRzJzogbm9uZV9kaWN0LAogICAgICAgICdjb21tYW5kcyc6IG5vbmVfZGljdCwKICAgICAgICAnY2xhc3NpZmllcnMnOiAoJ0NsYXNzaWZpZXInLCBsaXN0KSwKICAgICAgICAnc291cmNlX3VybCc6ICgnRG93bmxvYWQtVVJMJywgTm9uZSksCiAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiAoJ01ldGFkYXRhLVZlcnNpb24nLCBOb25lKSwKICAgIH0KCiAgICBkZWwgbm9uZV9saXN0LCBub25lX2RpY3QKCiAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBrZXkpOgogICAgICAgIGNvbW1vbiA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdjb21tb25fa2V5cycpCiAgICAgICAgbWFwcGVkID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ21hcHBlZF9rZXlzJykKICAgICAgICBpZiBrZXkgaW4gbWFwcGVkOgogICAgICAgICAgICBsaywgbWFrZXIgPSBtYXBwZWRba2V5XQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBpZiBsayBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUgaWYgbWFrZXIgaXMgTm9uZSBlbHNlIG1ha2VyKCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5LmdldChsaykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZSBpZiBtYWtlciBpcyBOb25lIGVsc2UgbWFrZXIoKQogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiAoJ2NvbW1hbmRzJywgJ2V4cG9ydHMnLCAnbW9kdWxlcycsICduYW1lc3BhY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzc2lmaWVycycpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2RhdGEuZ2V0KGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlcyBmb3IgUEVQIDQ1OQogICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gb2JqZWN0KCkKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZW50aW5lbAogICAgICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhLmdldCgnZXh0ZW5zaW9ucycpCiAgICAgICAgICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tYW5kcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkLmdldCgncHl0aG9uLmNvbW1hbmRzJywgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdjbGFzc2lmaWVycyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZC5nZXQoJ3B5dGhvbi5kZXRhaWxzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZC5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLmdldCgncHl0aG9uLmV4cG9ydHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEuZ2V0KCdweXRob24uZXhwb3J0cycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQuZ2V0KGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIHNlbnRpbmVsOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZQogICAgICAgIGVsaWYga2V5IG5vdCBpbiBjb21tb246CiAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGtleSkKICAgICAgICBlbGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5LmdldChrZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5nZXQoa2V5KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX3ZhbGlkYXRlX3ZhbHVlKHNlbGYsIGtleSwgdmFsdWUsIHNjaGVtZT1Ob25lKToKICAgICAgICBpZiBrZXkgaW4gc2VsZi5TWU5UQVhfVkFMSURBVE9SUzoKICAgICAgICAgICAgcGF0dGVybiwgZXhjbHVzaW9ucyA9IHNlbGYuU1lOVEFYX1ZBTElEQVRPUlNba2V5XQogICAgICAgICAgICBpZiAoc2NoZW1lIG9yIHNlbGYuc2NoZW1lKSBub3QgaW4gZXhjbHVzaW9uczoKICAgICAgICAgICAgICAgIG0gPSBwYXR0ZXJuLm1hdGNoKHZhbHVlKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFJbnZhbGlkRXJyb3IoIiclcycgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgJyVzJyBwcm9wZXJ0eSIgJSAodmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KSkKCiAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fdmFsaWRhdGVfdmFsdWUoa2V5LCB2YWx1ZSkKICAgICAgICBjb21tb24gPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnY29tbW9uX2tleXMnKQogICAgICAgIG1hcHBlZCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdtYXBwZWRfa2V5cycpCiAgICAgICAgaWYga2V5IGluIG1hcHBlZDoKICAgICAgICAgICAgbGssIF8gPSBtYXBwZWRba2V5XQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBpZiBsayBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVtsa10gPSB2YWx1ZQogICAgICAgICAgICBlbGlmIGtleSBub3QgaW4gKCdjb21tYW5kcycsICdleHBvcnRzJywgJ21vZHVsZXMnLCAnbmFtZXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJyk6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2VzIGZvciBQRVAgNDU5CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdleHRlbnNpb25zJywge30pCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1hbmRzJzoKICAgICAgICAgICAgICAgICAgICBkWydweXRob24uY29tbWFuZHMnXSA9IHZhbHVlCiAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnY2xhc3NpZmllcnMnOgogICAgICAgICAgICAgICAgICAgIGQgPSBkLnNldGRlZmF1bHQoJ3B5dGhvbi5kZXRhaWxzJywge30pCiAgICAgICAgICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZCA9IGQuc2V0ZGVmYXVsdCgncHl0aG9uLmV4cG9ydHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIGVsaWYga2V5IG5vdCBpbiBjb21tb246CiAgICAgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGtleSA9PSAna2V5d29yZHMnOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3lba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWVfYW5kX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIF9nZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgVHJ1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm92aWRlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xlZ2FjeVsnUHJvdmlkZXMtRGlzdCddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdwcm92aWRlcycsIFtdKQogICAgICAgIHMgPSAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaWYgcyBub3QgaW4gcmVzdWx0OgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBwcm92aWRlcy5zZXR0ZXIKICAgIGRlZiBwcm92aWRlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICBzZWxmLl9sZWdhY3lbJ1Byb3ZpZGVzLURpc3QnXSA9IHZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZGF0YVsncHJvdmlkZXMnXSA9IHZhbHVlCgogICAgZGVmIGdldF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxdHMsIGV4dHJhcz1Ob25lLCBlbnY9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQmFzZSBtZXRob2QgdG8gZ2V0IGRlcGVuZGVuY2llcywgZ2l2ZW4gYSBzZXQgb2YgZXh0cmFzCiAgICAgICAgdG8gc2F0aXNmeSBhbmQgYW4gb3B0aW9uYWwgZW52aXJvbm1lbnQgY29udGV4dC4KICAgICAgICA6cGFyYW0gcmVxdHM6IEEgbGlzdCBvZiBzb21ldGltZXMtd2FudGVkIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICAgIHBlcmhhcHMgZGVwZW5kZW50IG9uIGV4dHJhcyBhbmQgZW52aXJvbm1lbnQuCiAgICAgICAgOnBhcmFtIGV4dHJhczogQSBsaXN0IG9mIG9wdGlvbmFsIGNvbXBvbmVudHMgYmVpbmcgcmVxdWVzdGVkLgogICAgICAgIDpwYXJhbSBlbnY6IEFuIG9wdGlvbmFsIGVudmlyb25tZW50IGZvciBtYXJrZXIgZXZhbHVhdGlvbi4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJlc3VsdCA9IHJlcXRzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgZXh0cmFzID0gZ2V0X2V4dHJhcyhleHRyYXMgb3IgW10sIHNlbGYuZXh0cmFzKQogICAgICAgICAgICBmb3IgZCBpbiByZXF0czoKICAgICAgICAgICAgICAgIGlmICdleHRyYScgbm90IGluIGQgYW5kICdlbnZpcm9ubWVudCcgbm90IGluIGQ6CiAgICAgICAgICAgICAgICAgICAgIyB1bmNvbmRpdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgJ2V4dHJhJyBub3QgaW4gZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZXh0cmEtZGVwZW5kZW50IC0gb25seSBlbnZpcm9ubWVudC1kZXBlbmRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZC5nZXQoJ2V4dHJhJykgaW4gZXh0cmFzCiAgICAgICAgICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZXhjbHVkZWQgYmVjYXVzZSBvZiBleHRyYXMsIGNoZWNrIGVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1hcmtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbnRlcnByZXQobWFya2VyLCBlbnYpCiAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoZFsncmVxdWlyZXMnXSkKICAgICAgICAgICAgZm9yIGtleSBpbiAoJ2J1aWxkJywgJ2RldicsICd0ZXN0Jyk6CiAgICAgICAgICAgICAgICBlID0gJzolczonICUga2V5CiAgICAgICAgICAgICAgICBpZiBlIGluIGV4dHJhczoKICAgICAgICAgICAgICAgICAgICBleHRyYXMucmVtb3ZlKGUpCiAgICAgICAgICAgICAgICAgICAgIyBBIHJlY3Vyc2l2ZSBjYWxsLCBidXQgaXQgc2hvdWxkIHRlcm1pbmF0ZSBzaW5jZSAndGVzdCcKICAgICAgICAgICAgICAgICAgICAjIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZXh0cmFzCiAgICAgICAgICAgICAgICAgICAgcmVxdHMgPSBzZWxmLl9kYXRhLmdldCgnJXNfcmVxdWlyZXMnICUga2V5LCBbXSkKICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHNlbGYuZ2V0X3JlcXVpcmVtZW50cyhyZXF0cywgZXh0cmFzPWV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgZGljdGlvbmFyeShzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcm9tX2xlZ2FjeSgpCiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RfYnlfa2V5KHNlbGYuX2RhdGEsIHNlbGYuREVQRU5ERU5DWV9LRVlTKQoKICAgIEBkZXBlbmRlbmNpZXMuc2V0dGVyCiAgICBkZWYgZGVwZW5kZW5jaWVzKHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYXRhLnVwZGF0ZSh2YWx1ZSkKCiAgICBkZWYgX3ZhbGlkYXRlX21hcHBpbmcoc2VsZiwgbWFwcGluZywgc2NoZW1lKToKICAgICAgICBpZiBtYXBwaW5nLmdldCgnbWV0YWRhdGFfdmVyc2lvbicpICE9IHNlbGYuTUVUQURBVEFfVkVSU0lPTjoKICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IoKQogICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgIGZvciBrZXksIGV4Y2x1c2lvbnMgaW4gc2VsZi5NQU5EQVRPUllfS0VZUy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIG1hcHBpbmc6CiAgICAgICAgICAgICAgICBpZiBzY2hlbWUgbm90IGluIGV4Y2x1c2lvbnM6CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoa2V5KQogICAgICAgIGlmIG1pc3Npbmc6CiAgICAgICAgICAgIG1zZyA9ICdNaXNzaW5nIG1ldGFkYXRhIGl0ZW1zOiAlcycgJSAnLCAnLmpvaW4obWlzc2luZykKICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFNaXNzaW5nRXJyb3IobXNnKQogICAgICAgIGZvciBrLCB2IGluIG1hcHBpbmcuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfdmFsdWUoaywgdiwgc2NoZW1lKQoKICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIG1pc3NpbmcsIHdhcm5pbmdzID0gc2VsZi5fbGVnYWN5LmNoZWNrKFRydWUpCiAgICAgICAgICAgIGlmIG1pc3Npbmcgb3Igd2FybmluZ3M6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnTWV0YWRhdGE6IG1pc3Npbmc6ICVzLCB3YXJuaW5nczogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZywgd2FybmluZ3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfbWFwcGluZyhzZWxmLl9kYXRhLCBzZWxmLnNjaGVtZSkKCiAgICBkZWYgdG9kaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xlZ2FjeS50b2RpY3QoVHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBleHRyYWN0X2J5X2tleShzZWxmLl9kYXRhLCBzZWxmLklOREVYX0tFWVMpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2Zyb21fbGVnYWN5KHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLl9sZWdhY3kgYW5kIG5vdCBzZWxmLl9kYXRhCiAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6IHNlbGYuTUVUQURBVEFfVkVSU0lPTiwKICAgICAgICAgICAgJ2dlbmVyYXRvcic6IHNlbGYuR0VORVJBVE9SLAogICAgICAgIH0KICAgICAgICBsbWQgPSBzZWxmLl9sZWdhY3kudG9kaWN0KFRydWUpICAgICAjIHNraXAgbWlzc2luZyBvbmVzCiAgICAgICAgZm9yIGsgaW4gKCduYW1lJywgJ3ZlcnNpb24nLCAnbGljZW5zZScsICdzdW1tYXJ5JywgJ2Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXInKToKICAgICAgICAgICAgaWYgayBpbiBsbWQ6CiAgICAgICAgICAgICAgICBpZiBrID09ICdjbGFzc2lmaWVyJzoKICAgICAgICAgICAgICAgICAgICBuayA9ICdjbGFzc2lmaWVycycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmsgPSBrCiAgICAgICAgICAgICAgICByZXN1bHRbbmtdID0gbG1kW2tdCiAgICAgICAga3cgPSBsbWQuZ2V0KCdLZXl3b3JkcycsIFtdKQogICAgICAgIGlmIGt3ID09IFsnJ106CiAgICAgICAgICAgIGt3ID0gW10KICAgICAgICByZXN1bHRbJ2tleXdvcmRzJ10gPSBrdwogICAgICAgIGtleXMgPSAoKCdyZXF1aXJlc19kaXN0JywgJ3J1bl9yZXF1aXJlcycpLAogICAgICAgICAgICAgICAgKCdzZXR1cF9yZXF1aXJlc19kaXN0JywgJ2J1aWxkX3JlcXVpcmVzJykpCiAgICAgICAgZm9yIG9rLCBuayBpbiBrZXlzOgogICAgICAgICAgICBpZiBvayBpbiBsbWQgYW5kIGxtZFtva106CiAgICAgICAgICAgICAgICByZXN1bHRbbmtdID0gW3sncmVxdWlyZXMnOiBsbWRbb2tdfV0KICAgICAgICByZXN1bHRbJ3Byb3ZpZGVzJ10gPSBzZWxmLnByb3ZpZGVzCiAgICAgICAgYXV0aG9yID0ge30KICAgICAgICBtYWludGFpbmVyID0ge30KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgTEVHQUNZX01BUFBJTkcgPSB7CiAgICAgICAgJ25hbWUnOiAnTmFtZScsCiAgICAgICAgJ3ZlcnNpb24nOiAnVmVyc2lvbicsCiAgICAgICAgJ2xpY2Vuc2UnOiAnTGljZW5zZScsCiAgICAgICAgJ3N1bW1hcnknOiAnU3VtbWFyeScsCiAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0Rlc2NyaXB0aW9uJywKICAgICAgICAnY2xhc3NpZmllcnMnOiAnQ2xhc3NpZmllcicsCiAgICB9CgogICAgZGVmIF90b19sZWdhY3koc2VsZik6CiAgICAgICAgZGVmIHByb2Nlc3NfZW50cmllcyhlbnRyaWVzKToKICAgICAgICAgICAgcmVxdHMgPSBzZXQoKQogICAgICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgICAgZXh0cmEgPSBlLmdldCgnZXh0cmEnKQogICAgICAgICAgICAgICAgZW52ID0gZS5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgICAgICAgICAgIHJsaXN0ID0gZVsncmVxdWlyZXMnXQogICAgICAgICAgICAgICAgZm9yIHIgaW4gcmxpc3Q6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVudiBhbmQgbm90IGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICByZXF0cy5hZGQocikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSAnJwogICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICdleHRyYSA9PSAiJXMiJyAlIGV4dHJhCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1hcmtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSAnKCVzKSBhbmQgJXMnICUgKGVudiwgbWFya2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBlbnYKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdHMuYWRkKCc7Jy5qb2luKChyLCBtYXJrZXIpKSkKICAgICAgICAgICAgcmV0dXJuIHJlcXRzCgogICAgICAgIGFzc2VydCBzZWxmLl9kYXRhIGFuZCBub3Qgc2VsZi5fbGVnYWN5CiAgICAgICAgcmVzdWx0ID0gTGVnYWN5TWV0YWRhdGEoKQogICAgICAgIG5tZCA9IHNlbGYuX2RhdGEKICAgICAgICBmb3IgbmssIG9rIGluIHNlbGYuTEVHQUNZX01BUFBJTkcuaXRlbXMoKToKICAgICAgICAgICAgaWYgbmsgaW4gbm1kOgogICAgICAgICAgICAgICAgcmVzdWx0W29rXSA9IG5tZFtua10KICAgICAgICByMSA9IHByb2Nlc3NfZW50cmllcyhzZWxmLnJ1bl9yZXF1aXJlcyArIHNlbGYubWV0YV9yZXF1aXJlcykKICAgICAgICByMiA9IHByb2Nlc3NfZW50cmllcyhzZWxmLmJ1aWxkX3JlcXVpcmVzICsgc2VsZi5kZXZfcmVxdWlyZXMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHJlc3VsdFsnUHJvdmlkZXMtRXh0cmEnXSA9IHNvcnRlZChzZWxmLmV4dHJhcykKICAgICAgICByZXN1bHRbJ1JlcXVpcmVzLURpc3QnXSA9IHNvcnRlZChyMSkKICAgICAgICByZXN1bHRbJ1NldHVwLVJlcXVpcmVzLURpc3QnXSA9IHNvcnRlZChyMikKICAgICAgICAjIFRPRE86IG90aGVyIGZpZWxkcyBzdWNoIGFzIGNvbnRhY3RzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZShzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbGVnYWN5PUZhbHNlLCBza2lwX3Vua25vd249VHJ1ZSk6CiAgICAgICAgaWYgW3BhdGgsIGZpbGVvYmpdLmNvdW50KE5vbmUpICE9IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4YWN0bHkgb25lIG9mIHBhdGggYW5kIGZpbGVvYmogaXMgbmVlZGVkJykKICAgICAgICBzZWxmLnZhbGlkYXRlKCkKICAgICAgICBpZiBsZWdhY3k6CiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZCA9IHNlbGYuX2xlZ2FjeQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGVnYWN5X21kID0gc2VsZi5fdG9fbGVnYWN5KCkKICAgICAgICAgICAgaWYgcGF0aDoKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZC53cml0ZShwYXRoLCBza2lwX3Vua25vd249c2tpcF91bmtub3duKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGVnYWN5X21kLndyaXRlX2ZpbGUoZmlsZW9iaiwgc2tpcF91bmtub3duPXNraXBfdW5rbm93bikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZnJvbV9sZWdhY3koKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEKICAgICAgICAgICAgaWYgZmlsZW9iajoKICAgICAgICAgICAgICAgIGpzb24uZHVtcChkLCBmaWxlb2JqLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgaW5kZW50PTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydF9rZXlzPVRydWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgJ3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBqc29uLmR1bXAoZCwgZiwgZW5zdXJlX2FzY2lpPVRydWUsIGluZGVudD0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50cyhzZWxmLCByZXF1aXJlbWVudHMpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgc2VsZi5fbGVnYWN5LmFkZF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJ1bl9yZXF1aXJlcyA9IHNlbGYuX2RhdGEuc2V0ZGVmYXVsdCgncnVuX3JlcXVpcmVzJywgW10pCiAgICAgICAgICAgIGFsd2F5cyA9IE5vbmUKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJ1bl9yZXF1aXJlczoKICAgICAgICAgICAgICAgIGlmICdlbnZpcm9ubWVudCcgbm90IGluIGVudHJ5IGFuZCAnZXh0cmEnIG5vdCBpbiBlbnRyeToKICAgICAgICAgICAgICAgICAgICBhbHdheXMgPSBlbnRyeQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGFsd2F5cyBpcyBOb25lOgogICAgICAgICAgICAgICAgYWx3YXlzID0geyAncmVxdWlyZXMnOiByZXF1aXJlbWVudHMgfQogICAgICAgICAgICAgICAgcnVuX3JlcXVpcmVzLmluc2VydCgwLCBhbHdheXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByc2V0ID0gc2V0KGFsd2F5c1sncmVxdWlyZXMnXSkgfCBzZXQocmVxdWlyZW1lbnRzKQogICAgICAgICAgICAgICAgYWx3YXlzWydyZXF1aXJlcyddID0gc29ydGVkKHJzZXQpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIG5hbWUgPSBzZWxmLm5hbWUgb3IgJyhubyBuYW1lKScKICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uIG9yICdubyB2ZXJzaW9uJwogICAgICAgIHJldHVybiAnPCVzICVzICVzICglcyk+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YV92ZXJzaW9uLCBuYW1lLCB2ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAMi3RZgOKgAADioAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9yZXNvdXJjZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBiaXNlY3QKaW1wb3J0IGlvCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcGtndXRpbAppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBpbXBvcnQKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC51dGlsIGltcG9ydCBjYWNoZWRfcHJvcGVydHksIGdldF9jYWNoZV9iYXNlLCBwYXRoX3RvX2NhY2hlX2RpciwgQ2FjaGUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNhY2hlID0gTm9uZSAgICAjIGNyZWF0ZWQgd2hlbiBuZWVkZWQKCgpjbGFzcyBSZXNvdXJjZUNhY2hlKENhY2hlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlPU5vbmUpOgogICAgICAgIGlmIGJhc2UgaXMgTm9uZToKICAgICAgICAgICAgIyBVc2UgbmF0aXZlIHN0cmluZyB0byBhdm9pZCBpc3N1ZXMgb24gMi54OiBzZWUgUHl0aG9uICMyMDE0MC4KICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihnZXRfY2FjaGVfYmFzZSgpLCBzdHIoJ3Jlc291cmNlLWNhY2hlJykpCiAgICAgICAgc3VwZXIoUmVzb3VyY2VDYWNoZSwgc2VsZikuX19pbml0X18oYmFzZSkKCiAgICBkZWYgaXNfc3RhbGUoc2VsZiwgcmVzb3VyY2UsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElzIHRoZSBjYWNoZSBzdGFsZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlPwoKICAgICAgICA6cGFyYW0gcmVzb3VyY2U6IFRoZSA6Y2xhc3M6YFJlc291cmNlYCBiZWluZyBjYWNoZWQuCiAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgY2FjaGUuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB0aGUgY2FjaGUgaXMgc3RhbGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBDYWNoZSBpbnZhbGlkYXRpb24gaXMgYSBoYXJkIHByb2JsZW0gOi0pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZ2V0KHNlbGYsIHJlc291cmNlKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSByZXNvdXJjZSBpbnRvIHRoZSBjYWNoZSwKCiAgICAgICAgOnBhcmFtIHJlc291cmNlOiBBIDpjbGFzczpgUmVzb3VyY2VgIGluc3RhbmNlLgogICAgICAgIDpyZXR1cm46IFRoZSBwYXRobmFtZSBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHByZWZpeCwgcGF0aCA9IHJlc291cmNlLmZpbmRlci5nZXRfY2FjaGVfaW5mbyhyZXNvdXJjZSkKICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gcGF0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIHNlbGYucHJlZml4X3RvX2RpcihwcmVmaXgpLCBwYXRoKQogICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkaXJuYW1lKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVzdWx0KToKICAgICAgICAgICAgICAgIHN0YWxlID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhbGUgPSBzZWxmLmlzX3N0YWxlKHJlc291cmNlLCBwYXRoKQogICAgICAgICAgICBpZiBzdGFsZToKICAgICAgICAgICAgICAgICMgd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgY2FjaGUgbG9jYXRpb24KICAgICAgICAgICAgICAgIHdpdGggb3BlbihyZXN1bHQsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShyZXNvdXJjZS5ieXRlcykKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUmVzb3VyY2VCYXNlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmluZGVyLCBuYW1lKToKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlcgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCgpjbGFzcyBSZXNvdXJjZShSZXNvdXJjZUJhc2UpOgogICAgIiIiCiAgICBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBpbi1wYWNrYWdlIHJlc291cmNlLCBzdWNoIGFzIGEgZGF0YSBmaWxlLiBUaGlzIGlzCiAgICBub3Qgbm9ybWFsbHkgaW5zdGFudGlhdGVkIGJ5IHVzZXIgY29kZSwgYnV0IHJhdGhlciBieSBhCiAgICA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCB3aGljaCBtYW5hZ2VzIHRoZSByZXNvdXJjZS4KICAgICIiIgogICAgaXNfY29udGFpbmVyID0gRmFsc2UgICAgICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiAgICBkZWYgYXNfc3RyZWFtKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgcmVzb3VyY2UgYXMgYSBzdHJlYW0uCgogICAgICAgIFRoaXMgaXMgbm90IGEgcHJvcGVydHkgdG8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgaXQgcmV0dXJucyBhIG5ldyBzdHJlYW0KICAgICAgICBlYWNoIHRpbWUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9zdHJlYW0oc2VsZikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgZmlsZV9wYXRoKHNlbGYpOgogICAgICAgIGdsb2JhbCBjYWNoZQogICAgICAgIGlmIGNhY2hlIGlzIE5vbmU6CiAgICAgICAgICAgIGNhY2hlID0gUmVzb3VyY2VDYWNoZSgpCiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChzZWxmKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBieXRlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X2J5dGVzKHNlbGYpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHNpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9zaXplKHNlbGYpCgoKY2xhc3MgUmVzb3VyY2VDb250YWluZXIoUmVzb3VyY2VCYXNlKToKICAgIGlzX2NvbnRhaW5lciA9IFRydWUgICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfcmVzb3VyY2VzKHNlbGYpCgoKY2xhc3MgUmVzb3VyY2VGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgUmVzb3VyY2UgZmluZGVyIGZvciBmaWxlIHN5c3RlbSByZXNvdXJjZXMuCiAgICAiIiIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHNraXBwZWRfZXh0ZW5zaW9ucyA9ICgnLnB5YycsICcucHlvJywgJy5jbGFzcycpCiAgICBlbHNlOgogICAgICAgIHNraXBwZWRfZXh0ZW5zaW9ucyA9ICgnLnB5YycsICcucHlvJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLmJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgX2FkanVzdF9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCgogICAgZGVmIF9tYWtlX3BhdGgoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIyBJc3N1ZSAjNTA6IG5lZWQgdG8gcHJlc2VydmUgdHlwZSBvZiBwYXRoIG9uIFB5dGhvbiAyLngKICAgICAgICAjIGxpa2Ugb3MucGF0aC5fZ2V0X3NlcAogICAgICAgIGlmIGlzaW5zdGFuY2UocmVzb3VyY2VfbmFtZSwgYnl0ZXMpOiAgICAjIHNob3VsZCBvbmx5IGhhcHBlbiBvbiAyLngKICAgICAgICAgICAgc2VwID0gYicvJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlcCA9ICcvJwogICAgICAgIHBhcnRzID0gcmVzb3VyY2VfbmFtZS5zcGxpdChzZXApCiAgICAgICAgcGFydHMuaW5zZXJ0KDAsIHNlbGYuYmFzZSkKICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmpvaW4oKnBhcnRzKQogICAgICAgIHJldHVybiBzZWxmLl9hZGp1c3RfcGF0aChyZXN1bHQpCgogICAgZGVmIF9maW5kKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKICAgIGRlZiBnZXRfY2FjaGVfaW5mbyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIE5vbmUsIHJlc291cmNlLnBhdGgKCiAgICBkZWYgZmluZChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBwYXRoID0gc2VsZi5fbWFrZV9wYXRoKHJlc291cmNlX25hbWUpCiAgICAgICAgaWYgbm90IHNlbGYuX2ZpbmQocGF0aCk6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9pc19kaXJlY3RvcnkocGF0aCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZUNvbnRhaW5lcihzZWxmLCByZXNvdXJjZV9uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSkKICAgICAgICAgICAgcmVzdWx0LnBhdGggPSBwYXRoCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfc3RyZWFtKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gb3BlbihyZXNvdXJjZS5wYXRoLCAncmInKQoKICAgIGRlZiBnZXRfYnl0ZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHdpdGggb3BlbihyZXNvdXJjZS5wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKCiAgICBkZWYgZ2V0X3NpemUoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmdldHNpemUocmVzb3VyY2UucGF0aCkKCiAgICBkZWYgZ2V0X3Jlc291cmNlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgZGVmIGFsbG93ZWQoZik6CiAgICAgICAgICAgIHJldHVybiAoZiAhPSAnX19weWNhY2hlX18nIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBmLmVuZHN3aXRoKHNlbGYuc2tpcHBlZF9leHRlbnNpb25zKSkKICAgICAgICByZXR1cm4gc2V0KFtmIGZvciBmIGluIG9zLmxpc3RkaXIocmVzb3VyY2UucGF0aCkgaWYgYWxsb3dlZChmKV0pCgogICAgZGVmIGlzX2NvbnRhaW5lcihzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzX2RpcmVjdG9yeShyZXNvdXJjZS5wYXRoKQoKICAgIF9pc19kaXJlY3RvcnkgPSBzdGF0aWNtZXRob2Qob3MucGF0aC5pc2RpcikKCiAgICBkZWYgaXRlcmF0b3Ioc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmVzb3VyY2UgPSBzZWxmLmZpbmQocmVzb3VyY2VfbmFtZSkKICAgICAgICBpZiByZXNvdXJjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdG9kbyA9IFtyZXNvdXJjZV0KICAgICAgICAgICAgd2hpbGUgdG9kbzoKICAgICAgICAgICAgICAgIHJlc291cmNlID0gdG9kby5wb3AoMCkKICAgICAgICAgICAgICAgIHlpZWxkIHJlc291cmNlCiAgICAgICAgICAgICAgICBpZiByZXNvdXJjZS5pc19jb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgcm5hbWUgPSByZXNvdXJjZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gcmVzb3VyY2UucmVzb3VyY2VzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgcm5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lID0gJy8nLmpvaW4oW3JuYW1lLCBuYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLmZpbmQobmV3X25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxkLmlzX2NvbnRhaW5lcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKGNoaWxkKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgY2hpbGQKCgpjbGFzcyBaaXBSZXNvdXJjZUZpbmRlcihSZXNvdXJjZUZpbmRlcik6CiAgICAiIiIKICAgIFJlc291cmNlIGZpbmRlciBmb3IgcmVzb3VyY2VzIGluIC56aXAgZmlsZXMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHN1cGVyKFppcFJlc291cmNlRmluZGVyLCBzZWxmKS5fX2luaXRfXyhtb2R1bGUpCiAgICAgICAgYXJjaGl2ZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUKICAgICAgICBzZWxmLnByZWZpeF9sZW4gPSAxICsgbGVuKGFyY2hpdmUpCiAgICAgICAgIyBQeVB5IGRvZXNuJ3QgaGF2ZSBhIF9maWxlcyBhdHRyIG9uIHppcGltcG9ydGVyLCBhbmQgeW91IGNhbid0IHNldCBvbmUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnX2ZpbGVzJyk6CiAgICAgICAgICAgIHNlbGYuX2ZpbGVzID0gc2VsZi5sb2FkZXIuX2ZpbGVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZmlsZXMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbYXJjaGl2ZV0KICAgICAgICBzZWxmLmluZGV4ID0gc29ydGVkKHNlbGYuX2ZpbGVzKQoKICAgIGRlZiBfYWRqdXN0X3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX2ZpbmQoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IHBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICBpZiBwYXRoIGluIHNlbGYuX2ZpbGVzOgogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyBvcy5zZXAKICAgICAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3Qoc2VsZi5pbmRleCwgcGF0aCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ19maW5kIGZhaWxlZDogJXIgJXInLCBwYXRoLCBzZWxmLmxvYWRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdfZmluZCB3b3JrZWQ6ICVyICVyJywgcGF0aCwgc2VsZi5sb2FkZXIucHJlZml4KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X2NhY2hlX2luZm8oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHByZWZpeCA9IHNlbGYubG9hZGVyLmFyY2hpdmUKICAgICAgICBwYXRoID0gcmVzb3VyY2UucGF0aFsxICsgbGVuKHByZWZpeCk6XQogICAgICAgIHJldHVybiBwcmVmaXgsIHBhdGgKCiAgICBkZWYgZ2V0X2J5dGVzKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocmVzb3VyY2UucGF0aCkKCiAgICBkZWYgZ2V0X3N0cmVhbShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfYnl0ZXMocmVzb3VyY2UpKQoKICAgIGRlZiBnZXRfc2l6ZShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXNbcGF0aF1bM10KCiAgICBkZWYgZ2V0X3Jlc291cmNlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICBpZiBwYXRoIGFuZCBwYXRoWy0xXSAhPSBvcy5zZXA6CiAgICAgICAgICAgIHBhdGggKz0gb3Muc2VwCiAgICAgICAgcGxlbiA9IGxlbihwYXRoKQogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3Qoc2VsZi5pbmRleCwgcGF0aCkKICAgICAgICB3aGlsZSBpIDwgbGVuKHNlbGYuaW5kZXgpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcyA9IHNlbGYuaW5kZXhbaV1bcGxlbjpdCiAgICAgICAgICAgIHJlc3VsdC5hZGQocy5zcGxpdChvcy5zZXAsIDEpWzBdKSAgICMgb25seSBpbW1lZGlhdGUgY2hpbGRyZW4KICAgICAgICAgICAgaSArPSAxCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfaXNfZGlyZWN0b3J5KHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBwYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoICs9IG9zLnNlcAogICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmluZGV4W2ldLnN0YXJ0c3dpdGgocGF0aCkKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgpfZmluZGVyX3JlZ2lzdHJ5ID0gewogICAgdHlwZShOb25lKTogUmVzb3VyY2VGaW5kZXIsCiAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXI6IFppcFJlc291cmNlRmluZGVyCn0KCnRyeToKICAgICMgSW4gUHl0aG9uIDMuNiwgX2Zyb3plbl9pbXBvcnRsaWIgLT4gX2Zyb3plbl9pbXBvcnRsaWJfZXh0ZXJuYWwKICAgIHRyeToKICAgICAgICBpbXBvcnQgX2Zyb3plbl9pbXBvcnRsaWJfZXh0ZXJuYWwgYXMgX2ZpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgaW1wb3J0IF9mcm96ZW5faW1wb3J0bGliIGFzIF9maQogICAgX2ZpbmRlcl9yZWdpc3RyeVtfZmkuU291cmNlRmlsZUxvYWRlcl0gPSBSZXNvdXJjZUZpbmRlcgogICAgX2ZpbmRlcl9yZWdpc3RyeVtfZmkuRmlsZUZpbmRlcl0gPSBSZXNvdXJjZUZpbmRlcgogICAgZGVsIF9maQpleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICBwYXNzCgoKZGVmIHJlZ2lzdGVyX2ZpbmRlcihsb2FkZXIsIGZpbmRlcl9tYWtlcik6CiAgICBfZmluZGVyX3JlZ2lzdHJ5W3R5cGUobG9hZGVyKV0gPSBmaW5kZXJfbWFrZXIKCl9maW5kZXJfY2FjaGUgPSB7fQoKCmRlZiBmaW5kZXIocGFja2FnZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlc291cmNlIGZpbmRlciBmb3IgYSBwYWNrYWdlLgogICAgOnBhcmFtIHBhY2thZ2U6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLgogICAgOnJldHVybjogQSA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCBpbnN0YW5jZSBmb3IgdGhlIHBhY2thZ2UuCiAgICAiIiIKICAgIGlmIHBhY2thZ2UgaW4gX2ZpbmRlcl9jYWNoZToKICAgICAgICByZXN1bHQgPSBfZmluZGVyX2NhY2hlW3BhY2thZ2VdCiAgICBlbHNlOgogICAgICAgIGlmIHBhY2thZ2Ugbm90IGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICBfX2ltcG9ydF9fKHBhY2thZ2UpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZV0KICAgICAgICBwYXRoID0gZ2V0YXR0cihtb2R1bGUsICdfX3BhdGhfXycsIE5vbmUpCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdZb3UgY2Fubm90IGdldCBhIGZpbmRlciBmb3IgYSBtb2R1bGUsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBmb3IgYSBwYWNrYWdlJykKICAgICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIGZpbmRlcl9tYWtlciA9IF9maW5kZXJfcmVnaXN0cnkuZ2V0KHR5cGUobG9hZGVyKSkKICAgICAgICBpZiBmaW5kZXJfbWFrZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGxvY2F0ZSBmaW5kZXIgZm9yICVyJyAlIHBhY2thZ2UpCiAgICAgICAgcmVzdWx0ID0gZmluZGVyX21ha2VyKG1vZHVsZSkKICAgICAgICBfZmluZGVyX2NhY2hlW3BhY2thZ2VdID0gcmVzdWx0CiAgICByZXR1cm4gcmVzdWx0CgoKX2R1bW15X21vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUoc3RyKCdfX2R1bW15X18nKSkKCgpkZWYgZmluZGVyX2Zvcl9wYXRoKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZXNvdXJjZSBmaW5kZXIgZm9yIGEgcGF0aCwgd2hpY2ggc2hvdWxkIHJlcHJlc2VudCBhIGNvbnRhaW5lci4KCiAgICA6cGFyYW0gcGF0aDogVGhlIHBhdGguCiAgICA6cmV0dXJuOiBBIDpjbGFzczpgUmVzb3VyY2VGaW5kZXJgIGluc3RhbmNlIGZvciB0aGUgcGF0aC4KICAgICIiIgogICAgcmVzdWx0ID0gTm9uZQogICAgIyBjYWxscyBhbnkgcGF0aCBob29rcywgZ2V0cyBpbXBvcnRlciBpbnRvIGNhY2hlCiAgICBwa2d1dGlsLmdldF9pbXBvcnRlcihwYXRoKQogICAgbG9hZGVyID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuZ2V0KHBhdGgpCiAgICBmaW5kZXIgPSBfZmluZGVyX3JlZ2lzdHJ5LmdldCh0eXBlKGxvYWRlcikpCiAgICBpZiBmaW5kZXI6CiAgICAgICAgbW9kdWxlID0gX2R1bW15X21vZHVsZQogICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguam9pbihwYXRoLCAnJykKICAgICAgICBtb2R1bGUuX19sb2FkZXJfXyA9IGxvYWRlcgogICAgICAgIHJlc3VsdCA9IGZpbmRlcihtb2R1bGUpCiAgICByZXR1cm4gcmVzdWx0ClBLAwQUAAAAAAAAACEAuv/r23g7AAB4OwAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3NjcmlwdHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTUgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN0cnVjdAppbXBvcnQgc3lzCgpmcm9tIC5jb21wYXQgaW1wb3J0IHN5c2NvbmZpZywgZGV0ZWN0X2VuY29kaW5nLCBaaXBGaWxlCmZyb20gLnJlc291cmNlcyBpbXBvcnQgZmluZGVyCmZyb20gLnV0aWwgaW1wb3J0IChGaWxlT3BlcmF0b3IsIGdldF9leHBvcnRfZW50cnksIGNvbnZlcnRfcGF0aCwKICAgICAgICAgICAgICAgICAgIGdldF9leGVjdXRhYmxlLCBpbl92ZW52KQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpfREVGQVVMVF9NQU5JRkVTVCA9ICcnJwo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cjxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4KIDxhc3NlbWJseUlkZW50aXR5IHZlcnNpb249IjEuMC4wLjAiCiBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9Ilg4NiIKIG5hbWU9IiVzIgogdHlwZT0id2luMzIiLz4KCiA8IS0tIElkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiBzZWN1cml0eSByZXF1aXJlbWVudHMuIC0tPgogPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPgogPHNlY3VyaXR5PgogPHJlcXVlc3RlZFByaXZpbGVnZXM+CiA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIi8+CiA8L3JlcXVlc3RlZFByaXZpbGVnZXM+CiA8L3NlY3VyaXR5PgogPC90cnVzdEluZm8+CjwvYXNzZW1ibHk+JycnLnN0cmlwKCkKCiMgY2hlY2sgaWYgUHl0aG9uIGlzIGNhbGxlZCBvbiB0aGUgZmlyc3QgbGluZSB3aXRoIHRoaXMgZXhwcmVzc2lvbgpGSVJTVF9MSU5FX1JFID0gcmUuY29tcGlsZShiJ14jIS4qcHl0aG9udz9bMC05Ll0qKFsgXHRdLiopPyQnKQpTQ1JJUFRfVEVNUExBVEUgPSAnJycjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaW1wb3J0IHN5cywgcmUKCiAgICBkZWYgX3Jlc29sdmUobW9kdWxlLCBmdW5jKToKICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZSkKICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2R1bGVdCiAgICAgICAgcGFydHMgPSBmdW5jLnNwbGl0KCcuJykKICAgICAgICByZXN1bHQgPSBnZXRhdHRyKG1vZCwgcGFydHMucG9wKDApKQogICAgICAgIGZvciBwIGluIHBhcnRzOgogICAgICAgICAgICByZXN1bHQgPSBnZXRhdHRyKHJlc3VsdCwgcCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgdHJ5OgogICAgICAgIHN5cy5hcmd2WzBdID0gcmUuc3ViKHInKC1zY3JpcHRcLnB5dz98XC5leGUpPyQnLCAnJywgc3lzLmFyZ3ZbMF0pCgogICAgICAgIGZ1bmMgPSBfcmVzb2x2ZSgnJShtb2R1bGUpcycsICclKGZ1bmMpcycpCiAgICAgICAgcmMgPSBmdW5jKCkgIyBOb25lIGludGVycHJldGVkIGFzIDAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgb25seSBzdXBwb3J0aW5nIFB5dGhvbiA+PSAyLjYKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCclJXNcXG4nICUlIGUpCiAgICAgICAgcmMgPSAxCiAgICBzeXMuZXhpdChyYykKJycnCgoKZGVmIF9lbnF1b3RlX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSk6CiAgICBpZiAnICcgaW4gZXhlY3V0YWJsZToKICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBxdW90ZSBvbmx5IHRoZSBleGVjdXRhYmxlIGluIGNhc2Ugb2YgZW52CiAgICAgICAgIyBmb3IgZXhhbXBsZSAvdXNyL2Jpbi9lbnYgIi9kaXIgd2l0aCBzcGFjZXMvYmluL2p5dGhvbiIKICAgICAgICAjIGluc3RlYWQgb2YgIi91c3IvYmluL2VudiAvZGlyIHdpdGggc3BhY2VzL2Jpbi9qeXRob24iCiAgICAgICAgIyBvdGhlcndpc2Ugd2hvbGUKICAgICAgICBpZiBleGVjdXRhYmxlLnN0YXJ0c3dpdGgoJy91c3IvYmluL2VudiAnKToKICAgICAgICAgICAgZW52LCBfZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUuc3BsaXQoJyAnLCAxKQogICAgICAgICAgICBpZiAnICcgaW4gX2V4ZWN1dGFibGUgYW5kIG5vdCBfZXhlY3V0YWJsZS5zdGFydHN3aXRoKCciJyk6CiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gJyVzICIlcyInICUgKGVudiwgX2V4ZWN1dGFibGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IGV4ZWN1dGFibGUuc3RhcnRzd2l0aCgnIicpOgogICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICciJXMiJyAlIGV4ZWN1dGFibGUKICAgIHJldHVybiBleGVjdXRhYmxlCgoKY2xhc3MgU2NyaXB0TWFrZXIob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyB0byBjb3B5IG9yIGNyZWF0ZSBzY3JpcHRzIGZyb20gc291cmNlIHNjcmlwdHMgb3IgY2FsbGFibGUKICAgIHNwZWNpZmljYXRpb25zLgogICAgIiIiCiAgICBzY3JpcHRfdGVtcGxhdGUgPSBTQ1JJUFRfVEVNUExBVEUKCiAgICBleGVjdXRhYmxlID0gTm9uZSAgIyBmb3Igc2hlYmFuZ3MKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlX2RpciwgdGFyZ2V0X2RpciwgYWRkX2xhdW5jaGVycz1UcnVlLAogICAgICAgICAgICAgICAgIGRyeV9ydW49RmFsc2UsIGZpbGVvcD1Ob25lKToKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBzb3VyY2VfZGlyCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gdGFyZ2V0X2RpcgogICAgICAgIHNlbGYuYWRkX2xhdW5jaGVycyA9IGFkZF9sYXVuY2hlcnMKICAgICAgICBzZWxmLmZvcmNlID0gRmFsc2UKICAgICAgICBzZWxmLmNsb2JiZXIgPSBGYWxzZQogICAgICAgICMgSXQgb25seSBtYWtlcyBzZW5zZSB0byBzZXQgbW9kZSBiaXRzIG9uIFBPU0lYLgogICAgICAgIHNlbGYuc2V0X21vZGUgPSAob3MubmFtZSA9PSAncG9zaXgnKSBvciAob3MubmFtZSA9PSAnamF2YScgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5fbmFtZSA9PSAncG9zaXgnKQogICAgICAgIHNlbGYudmFyaWFudHMgPSBzZXQoKCcnLCAnWC5ZJykpCiAgICAgICAgc2VsZi5fZmlsZW9wID0gZmlsZW9wIG9yIEZpbGVPcGVyYXRvcihkcnlfcnVuKQoKICAgICAgICBzZWxmLl9pc19udCA9IG9zLm5hbWUgPT0gJ250JyBvciAoCiAgICAgICAgICAgIG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKQoKICAgIGRlZiBfZ2V0X2FsdGVybmF0ZV9leGVjdXRhYmxlKHNlbGYsIGV4ZWN1dGFibGUsIG9wdGlvbnMpOgogICAgICAgIGlmIG9wdGlvbnMuZ2V0KCdndWknLCBGYWxzZSkgYW5kIHNlbGYuX2lzX250OiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGRuLCBmbiA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKICAgICAgICAgICAgZm4gPSBmbi5yZXBsYWNlKCdweXRob24nLCAncHl0aG9udycpCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmpvaW4oZG4sIGZuKQogICAgICAgIHJldHVybiBleGVjdXRhYmxlCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgIGRlZiBfaXNfc2hlbGwoc2VsZiwgZXhlY3V0YWJsZSk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBleGVjdXRhYmxlIGlzIGEgc2NyaXB0CiAgICAgICAgICAgIChjb250YWlucyBhICMhIGxpbmUpCiAgICAgICAgICAgICIiIgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZXhlY3V0YWJsZSkgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZwLnJlYWQoMikgPT0gJyMhJwogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ZhaWxlZCB0byBvcGVuICVzJywgZXhlY3V0YWJsZSkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBkZWYgX2ZpeF9qeXRob25fZXhlY3V0YWJsZShzZWxmLCBleGVjdXRhYmxlKToKICAgICAgICAgICAgaWYgc2VsZi5faXNfc2hlbGwoZXhlY3V0YWJsZSk6CiAgICAgICAgICAgICAgICAjIFdvcmthcm91bmQgZm9yIEp5dGhvbiBpcyBub3QgbmVlZGVkIG9uIExpbnV4IHN5c3RlbXMuCiAgICAgICAgICAgICAgICBpbXBvcnQgamF2YQoKICAgICAgICAgICAgICAgIGlmIGphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHkoJ29zLm5hbWUnKSA9PSAnTGludXgnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlCiAgICAgICAgICAgIGVsaWYgZXhlY3V0YWJsZS5sb3dlcigpLmVuZHN3aXRoKCdqeXRob24uZXhlJyk6CiAgICAgICAgICAgICAgICAjIFVzZSB3cmFwcGVyIGV4ZSBmb3IgSnl0aG9uIG9uIFdpbmRvd3MKICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlCiAgICAgICAgICAgIHJldHVybiAnL3Vzci9iaW4vZW52ICVzJyAlIGV4ZWN1dGFibGUKCiAgICBkZWYgX2dldF9zaGViYW5nKHNlbGYsIGVuY29kaW5nLCBwb3N0X2ludGVycD1iJycsIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgZW5xdW90ZSA9IFRydWUKICAgICAgICBpZiBzZWxmLmV4ZWN1dGFibGU6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLmV4ZWN1dGFibGUKICAgICAgICAgICAgZW5xdW90ZSA9IEZhbHNlICAgICAjIGFzc3VtZSB0aGlzIHdpbGwgYmUgdGFrZW4gY2FyZSBvZgogICAgICAgIGVsaWYgbm90IHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGdldF9leGVjdXRhYmxlKCkKICAgICAgICBlbGlmIGluX3ZlbnYoKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfcGF0aCgnc2NyaXB0cycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbiVzJyAlIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignRVhFJykpCiAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdCSU5ESVInKSwKICAgICAgICAgICAgICAgJ3B5dGhvbiVzJXMnICUgKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignVkVSU0lPTicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdFWEUnKSkpCiAgICAgICAgaWYgb3B0aW9uczoKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuX2dldF9hbHRlcm5hdGVfZXhlY3V0YWJsZShleGVjdXRhYmxlLCBvcHRpb25zKQoKICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9maXhfanl0aG9uX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSkKICAgICAgICAjIE5vcm1hbGlzZSBjYXNlIGZvciBXaW5kb3dzCiAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGgubm9ybWNhc2UoZXhlY3V0YWJsZSkKICAgICAgICAjIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGFuIGV4ZWN1dGFibGUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8KICAgICAgICAjIGNhdGVyIGZvciBleGVjdXRhYmxlIHBhdGhzIHdpdGggc3BhY2VzIChub3QgdW5jb21tb24gb24gV2luZG93cykKICAgICAgICBpZiBlbnF1b3RlOgogICAgICAgICAgICBleGVjdXRhYmxlID0gX2VucXVvdGVfZXhlY3V0YWJsZShleGVjdXRhYmxlKQogICAgICAgICMgSXNzdWUgIzUxOiBkb24ndCB1c2UgZnNlbmNvZGUsIHNpbmNlIHdlIGxhdGVyIHRyeSB0bwogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgc2hlYmFuZyBpcyBkZWNvZGFibGUgdXNpbmcgdXRmLTguCiAgICAgICAgZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgIyBpbiBjYXNlIG9mIElyb25QeXRob24sIHBsYXkgc2FmZSBhbmQgZW5hYmxlIGZyYW1lcyBzdXBwb3J0CiAgICAgICAgaWYgKHN5cy5wbGF0Zm9ybSA9PSAnY2xpJyBhbmQgJy1YOkZyYW1lcycgbm90IGluIHBvc3RfaW50ZXJwCiAgICAgICAgICAgIGFuZCAnLVg6RnVsbEZyYW1lcycgbm90IGluIHBvc3RfaW50ZXJwKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBwb3N0X2ludGVycCArPSBiJyAtWDpGcmFtZXMnCiAgICAgICAgc2hlYmFuZyA9IGInIyEnICsgZXhlY3V0YWJsZSArIHBvc3RfaW50ZXJwICsgYidcbicKICAgICAgICAjIFB5dGhvbiBwYXJzZXIgc3RhcnRzIHRvIHJlYWQgYSBzY3JpcHQgdXNpbmcgVVRGLTggdW50aWwKICAgICAgICAjIGl0IGdldHMgYSAjY29kaW5nOnh4eCBjb29raWUuIFRoZSBzaGViYW5nIGhhcyB0byBiZSB0aGUKICAgICAgICAjIGZpcnN0IGxpbmUgb2YgYSBmaWxlLCB0aGUgI2NvZGluZzp4eHggY29va2llIGNhbm5vdCBiZQogICAgICAgICMgd3JpdHRlbiBiZWZvcmUuIFNvIHRoZSBzaGViYW5nIGhhcyB0byBiZSBkZWNvZGFibGUgZnJvbQogICAgICAgICMgVVRGLTguCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaGViYW5nLmRlY29kZSgndXRmLTgnKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICdUaGUgc2hlYmFuZyAoJXIpIGlzIG5vdCBkZWNvZGFibGUgZnJvbSB1dGYtOCcgJSBzaGViYW5nKQogICAgICAgICMgSWYgdGhlIHNjcmlwdCBpcyBlbmNvZGVkIHRvIGEgY3VzdG9tIGVuY29kaW5nICh1c2UgYQogICAgICAgICMgI2NvZGluZzp4eHggY29va2llKSwgdGhlIHNoZWJhbmcgaGFzIHRvIGJlIGRlY29kYWJsZSBmcm9tCiAgICAgICAgIyB0aGUgc2NyaXB0IGVuY29kaW5nIHRvby4KICAgICAgICBpZiBlbmNvZGluZyAhPSAndXRmLTgnOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzaGViYW5nLmRlY29kZShlbmNvZGluZykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAnVGhlIHNoZWJhbmcgKCVyKSBpcyBub3QgZGVjb2RhYmxlICcKICAgICAgICAgICAgICAgICAgICAnZnJvbSB0aGUgc2NyaXB0IGVuY29kaW5nICglciknICUgKHNoZWJhbmcsIGVuY29kaW5nKSkKICAgICAgICByZXR1cm4gc2hlYmFuZwoKICAgIGRlZiBfZ2V0X3NjcmlwdF90ZXh0KHNlbGYsIGVudHJ5KToKICAgICAgICByZXR1cm4gc2VsZi5zY3JpcHRfdGVtcGxhdGUgJSBkaWN0KG1vZHVsZT1lbnRyeS5wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jPWVudHJ5LnN1ZmZpeCkKCiAgICBtYW5pZmVzdCA9IF9ERUZBVUxUX01BTklGRVNUCgogICAgZGVmIGdldF9tYW5pZmVzdChzZWxmLCBleGVuYW1lKToKICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShleGVuYW1lKQogICAgICAgIHJldHVybiBzZWxmLm1hbmlmZXN0ICUgYmFzZQoKICAgIGRlZiBfd3JpdGVfc2NyaXB0KHNlbGYsIG5hbWVzLCBzaGViYW5nLCBzY3JpcHRfYnl0ZXMsIGZpbGVuYW1lcywgZXh0KToKICAgICAgICB1c2VfbGF1bmNoZXIgPSBzZWxmLmFkZF9sYXVuY2hlcnMgYW5kIHNlbGYuX2lzX250CiAgICAgICAgbGluZXNlcCA9IG9zLmxpbmVzZXAuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgbm90IHVzZV9sYXVuY2hlcjoKICAgICAgICAgICAgc2NyaXB0X2J5dGVzID0gc2hlYmFuZyArIGxpbmVzZXAgKyBzY3JpcHRfYnl0ZXMKICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGlmIGV4dCA9PSAncHknOgogICAgICAgICAgICAgICAgbGF1bmNoZXIgPSBzZWxmLl9nZXRfbGF1bmNoZXIoJ3QnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGF1bmNoZXIgPSBzZWxmLl9nZXRfbGF1bmNoZXIoJ3cnKQogICAgICAgICAgICBzdHJlYW0gPSBCeXRlc0lPKCkKICAgICAgICAgICAgd2l0aCBaaXBGaWxlKHN0cmVhbSwgJ3cnKSBhcyB6ZjoKICAgICAgICAgICAgICAgIHpmLndyaXRlc3RyKCdfX21haW5fXy5weScsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgemlwX2RhdGEgPSBzdHJlYW0uZ2V0dmFsdWUoKQogICAgICAgICAgICBzY3JpcHRfYnl0ZXMgPSBsYXVuY2hlciArIHNoZWJhbmcgKyBsaW5lc2VwICsgemlwX2RhdGEKICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgb3V0bmFtZSA9IG9zLnBhdGguam9pbihzZWxmLnRhcmdldF9kaXIsIG5hbWUpCiAgICAgICAgICAgIGlmIHVzZV9sYXVuY2hlcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgbiwgZSA9IG9zLnBhdGguc3BsaXRleHQob3V0bmFtZSkKICAgICAgICAgICAgICAgIGlmIGUuc3RhcnRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSA9IG4KICAgICAgICAgICAgICAgIG91dG5hbWUgPSAnJXMuZXhlJyAlIG91dG5hbWUKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Aud3JpdGVfYmluYXJ5X2ZpbGUob3V0bmFtZSwgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAjIEZhaWxlZCB3cml0aW5nIGFuIGV4ZWN1dGFibGUgLSBpdCBtaWdodCBiZSBpbiB1c2UuCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ZhaWxlZCB0byB3cml0ZSBleGVjdXRhYmxlIC0gdHJ5aW5nIHRvICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIC5kZWxldGVtZSBsb2dpYycpCiAgICAgICAgICAgICAgICAgICAgZGZuYW1lID0gJyVzLmRlbGV0ZW1lJyAlIG91dG5hbWUKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuYW1lKSAgICAgICAjIE5vdCBhbGxvd2VkIHRvIGZhaWwgaGVyZQogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShvdXRuYW1lLCBkZm5hbWUpICAjIG5vciBoZXJlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLndyaXRlX2JpbmFyeV9maWxlKG91dG5hbWUsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FibGUgdG8gcmVwbGFjZSBleGVjdXRhYmxlIHVzaW5nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5kZWxldGVtZSBsb2dpYycpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuYW1lKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICAgIyBzdGlsbCBpbiB1c2UgLSBpZ25vcmUgZXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX250IGFuZCBub3Qgb3V0bmFtZS5lbmRzd2l0aCgnLicgKyBleHQpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSA9ICclcy4lcycgJSAob3V0bmFtZSwgZXh0KQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3V0bmFtZSkgYW5kIG5vdCBzZWxmLmNsb2JiZXI6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1NraXBwaW5nIGV4aXN0aW5nIGZpbGUgJXMnLCBvdXRuYW1lKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Aud3JpdGVfYmluYXJ5X2ZpbGUob3V0bmFtZSwgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICAgICAgaWYgc2VsZi5zZXRfbW9kZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShbb3V0bmFtZV0pCiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQob3V0bmFtZSkKCiAgICBkZWYgX21ha2Vfc2NyaXB0KHNlbGYsIGVudHJ5LCBmaWxlbmFtZXMsIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgcG9zdF9pbnRlcnAgPSBiJycKICAgICAgICBpZiBvcHRpb25zOgogICAgICAgICAgICBhcmdzID0gb3B0aW9ucy5nZXQoJ2ludGVycHJldGVyX2FyZ3MnLCBbXSkKICAgICAgICAgICAgaWYgYXJnczoKICAgICAgICAgICAgICAgIGFyZ3MgPSAnICVzJyAlICcgJy5qb2luKGFyZ3MpCiAgICAgICAgICAgICAgICBwb3N0X2ludGVycCA9IGFyZ3MuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgc2hlYmFuZyA9IHNlbGYuX2dldF9zaGViYW5nKCd1dGYtOCcsIHBvc3RfaW50ZXJwLCBvcHRpb25zPW9wdGlvbnMpCiAgICAgICAgc2NyaXB0ID0gc2VsZi5fZ2V0X3NjcmlwdF90ZXh0KGVudHJ5KS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBuYW1lID0gZW50cnkubmFtZQogICAgICAgIHNjcmlwdG5hbWVzID0gc2V0KCkKICAgICAgICBpZiAnJyBpbiBzZWxmLnZhcmlhbnRzOgogICAgICAgICAgICBzY3JpcHRuYW1lcy5hZGQobmFtZSkKICAgICAgICBpZiAnWCcgaW4gc2VsZi52YXJpYW50czoKICAgICAgICAgICAgc2NyaXB0bmFtZXMuYWRkKCclcyVzJyAlIChuYW1lLCBzeXMudmVyc2lvblswXSkpCiAgICAgICAgaWYgJ1guWScgaW4gc2VsZi52YXJpYW50czoKICAgICAgICAgICAgc2NyaXB0bmFtZXMuYWRkKCclcy0lcycgJSAobmFtZSwgc3lzLnZlcnNpb25bOjNdKSkKICAgICAgICBpZiBvcHRpb25zIGFuZCBvcHRpb25zLmdldCgnZ3VpJywgRmFsc2UpOgogICAgICAgICAgICBleHQgPSAncHl3JwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV4dCA9ICdweScKICAgICAgICBzZWxmLl93cml0ZV9zY3JpcHQoc2NyaXB0bmFtZXMsIHNoZWJhbmcsIHNjcmlwdCwgZmlsZW5hbWVzLCBleHQpCgogICAgZGVmIF9jb3B5X3NjcmlwdChzZWxmLCBzY3JpcHQsIGZpbGVuYW1lcyk6CiAgICAgICAgYWRqdXN0ID0gRmFsc2UKICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2VfZGlyLCBjb252ZXJ0X3BhdGgoc2NyaXB0KSkKICAgICAgICBvdXRuYW1lID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0X2Rpciwgb3MucGF0aC5iYXNlbmFtZShzY3JpcHQpKQogICAgICAgIGlmIG5vdCBzZWxmLmZvcmNlIGFuZCBub3Qgc2VsZi5fZmlsZW9wLm5ld2VyKHNjcmlwdCwgb3V0bmFtZSk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm90IGNvcHlpbmcgJXMgKHVwLXRvLWRhdGUpJywgc2NyaXB0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBbHdheXMgb3BlbiB0aGUgZmlsZSwgYnV0IGlnbm9yZSBmYWlsdXJlcyBpbiBkcnktcnVuIG1vZGUgLS0KICAgICAgICAjIHRoYXQgd2F5LCB3ZSdsbCBnZXQgYWNjdXJhdGUgZmVlZGJhY2sgaWYgd2UgY2FuIHJlYWQgdGhlCiAgICAgICAgIyBzY3JpcHQuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmID0gb3BlbihzY3JpcHQsICdyYicpCiAgICAgICAgZXhjZXB0IElPRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGYgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlyc3RfbGluZSA9IGYucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgZmlyc3RfbGluZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJyVzOiAlcyBpcyBhbiBlbXB0eSBmaWxlIChza2lwcGluZyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfY29tbWFuZF9uYW1lKCksICBzY3JpcHQpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIG1hdGNoID0gRklSU1RfTElORV9SRS5tYXRjaChmaXJzdF9saW5lLnJlcGxhY2UoYidcclxuJywgYidcbicpKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIGFkanVzdCA9IFRydWUKICAgICAgICAgICAgICAgIHBvc3RfaW50ZXJwID0gbWF0Y2guZ3JvdXAoMSkgb3IgYicnCgogICAgICAgIGlmIG5vdCBhZGp1c3Q6CiAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5fZmlsZW9wLmNvcHlfZmlsZShzY3JpcHQsIG91dG5hbWUpCiAgICAgICAgICAgIGlmIHNlbGYuc2V0X21vZGU6CiAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShbb3V0bmFtZV0pCiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQob3V0bmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnY29weWluZyBhbmQgYWRqdXN0aW5nICVzIC0+ICVzJywgc2NyaXB0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9maWxlb3AuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuY29kaW5nLCBsaW5lcyA9IGRldGVjdF9lbmNvZGluZyhmLnJlYWRsaW5lKQogICAgICAgICAgICAgICAgZi5zZWVrKDApCiAgICAgICAgICAgICAgICBzaGViYW5nID0gc2VsZi5fZ2V0X3NoZWJhbmcoZW5jb2RpbmcsIHBvc3RfaW50ZXJwKQogICAgICAgICAgICAgICAgaWYgYidweXRob253JyBpbiBmaXJzdF9saW5lOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgZXh0ID0gJ3B5dycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZXh0ID0gJ3B5JwogICAgICAgICAgICAgICAgbiA9IG9zLnBhdGguYmFzZW5hbWUob3V0bmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX3NjcmlwdChbbl0sIHNoZWJhbmcsIGYucmVhZCgpLCBmaWxlbmFtZXMsIGV4dCkKICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRyeV9ydW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVvcC5kcnlfcnVuCgogICAgQGRyeV9ydW4uc2V0dGVyCiAgICBkZWYgZHJ5X3J1bihzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fZmlsZW9wLmRyeV9ydW4gPSB2YWx1ZQoKICAgIGlmIG9zLm5hbWUgPT0gJ250JyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgIyBFeGVjdXRhYmxlIGxhdW5jaGVyIHN1cHBvcnQuCiAgICAgICAgIyBMYXVuY2hlcnMgYXJlIGZyb20gaHR0cHM6Ly9iaXRidWNrZXQub3JnL3ZpbmF5LnNhamlwL3NpbXBsZV9sYXVuY2hlci8KCiAgICAgICAgZGVmIF9nZXRfbGF1bmNoZXIoc2VsZiwga2luZCk6CiAgICAgICAgICAgIGlmIHN0cnVjdC5jYWxjc2l6ZSgnUCcpID09IDg6ICAgIyA2NC1iaXQKICAgICAgICAgICAgICAgIGJpdHMgPSAnNjQnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiaXRzID0gJzMyJwogICAgICAgICAgICBuYW1lID0gJyVzJXMuZXhlJyAlIChraW5kLCBiaXRzKQogICAgICAgICAgICAjIElzc3VlIDMxOiBkb24ndCBoYXJkY29kZSBhbiBhYnNvbHV0ZSBwYWNrYWdlIG5hbWUsIGJ1dAogICAgICAgICAgICAjIGRldGVybWluZSBpdCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwYWNrYWdlCiAgICAgICAgICAgIGRpc3RsaWJfcGFja2FnZSA9IF9fbmFtZV9fLnJzcGxpdCgnLicsIDEpWzBdCiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRlcihkaXN0bGliX3BhY2thZ2UpLmZpbmQobmFtZSkuYnl0ZXMKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICMgUHVibGljIEFQSSBmb2xsb3dzCgogICAgZGVmIG1ha2Uoc2VsZiwgc3BlY2lmaWNhdGlvbiwgb3B0aW9ucz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgc2NyaXB0LgoKICAgICAgICA6cGFyYW0gc3BlY2lmaWNhdGlvbjogVGhlIHNwZWNpZmljYXRpb24sIHdoaWNoIGlzIGVpdGhlciBhIHZhbGlkIGV4cG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBzcGVjaWZpY2F0aW9uICh0byBtYWtlIGEgc2NyaXB0IGZyb20gYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZSkgb3IgYSBmaWxlbmFtZSAodG8gbWFrZSBhIHNjcmlwdCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5aW5nIGZyb20gYSBzb3VyY2UgbG9jYXRpb24pLgogICAgICAgIDpwYXJhbSBvcHRpb25zOiBBIGRpY3Rpb25hcnkgb2Ygb3B0aW9ucyBjb250cm9sbGluZyBzY3JpcHQgZ2VuZXJhdGlvbi4KICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWxsIGFic29sdXRlIHBhdGhuYW1lcyB3cml0dGVuIHRvLgogICAgICAgICIiIgogICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgZW50cnkgPSBnZXRfZXhwb3J0X2VudHJ5KHNwZWNpZmljYXRpb24pCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fY29weV9zY3JpcHQoc3BlY2lmaWNhdGlvbiwgZmlsZW5hbWVzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2Vfc2NyaXB0KGVudHJ5LCBmaWxlbmFtZXMsIG9wdGlvbnM9b3B0aW9ucykKICAgICAgICByZXR1cm4gZmlsZW5hbWVzCgogICAgZGVmIG1ha2VfbXVsdGlwbGUoc2VsZiwgc3BlY2lmaWNhdGlvbnMsIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZSBhIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMgYW5kIG1ha2Ugc2NyaXB0cyBmcm9tIHRoZW0sCiAgICAgICAgOnBhcmFtIHNwZWNpZmljYXRpb25zOiBBIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMuCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIGFsbCBhYnNvbHV0ZSBwYXRobmFtZXMgd3JpdHRlbiB0bywKICAgICAgICAiIiIKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGZvciBzcGVjaWZpY2F0aW9uIGluIHNwZWNpZmljYXRpb25zOgogICAgICAgICAgICBmaWxlbmFtZXMuZXh0ZW5kKHNlbGYubWFrZShzcGVjaWZpY2F0aW9uLCBvcHRpb25zKSkKICAgICAgICByZXR1cm4gZmlsZW5hbWVzClBLAwQUAAAAAAAAACEA9ZiQDABcAQAA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CQAAg43w/f//COm+CQAAg43w/f//BOmyCQAAg43w/f//AemmCQAAgY3w/f//gAAAAOmXCQAAg43w/f//AumLCQAAgPoqdSyDxwSJveT9//+Lf/yJvcj9//87/g+NbAkAAION8P3//wT3ncj9///pWgkAAIuFyP3//2vACg++yo1ECNCJhcj9///pPwkAAIm16P3//+k0CQAAgPoqdSaDxwSJveT9//+Lf/yJvej9//87/g+NFQkAAION6P3////pCQkAAIuF6P3//2vACg++yo1ECNCJhej9///p7ggAAID6SXRVgPpodESA+mx0GID6dw+F1ggAAIGN8P3//wAIAADpxwgAAIA7bHUWQ4GN8P3//wAQAACJncD9///prAgAAION8P3//xDpoAgAAION8P3//yDplAgAAIoDPDZ1HoB7ATR1GIPDAoGN8P3//wCAAACJncD9///pcAgAADwzdR6AewEydRiDwwKBpfD9////f///iZ3A/f//6U4IAAA8ZA+ERggAADxpD4Q+CAAAPG8PhDYIAAA8dQ+ELggAADx4D4QmCAAAPFgPhB4IAACJtYz9//8htcT9//+NhaT9//9QD7bCUOgmTwAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6Bj8//+KA0OJncD9//+EwA+EsPz//4uN0P3//4213P3//+j2+///6b4HAAAPvsKD+GQPj7YBAAAPhFgCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqwUAAIDCIMeFiP3//wEAAACIle/9///pVgIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhP4EAACF/3ULoWQGQQCJheD9//+LheD9///HhcT9//8BAAAA6cwEAACD6FgPhCIDAABISHR/K8EPhLYBAABISA+F6wQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOhNZAAAg8QQhcB0H8eFvP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///pfAQAAIsHg8cEib3k/f//hcB0O4tIBIXJdDT3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNwQAACG1xP3//+ksBAAAoWAGQQCJheD9//9Q6EskAABZ6RUEAACD+HAPjz0CAAAPhCUCAACD+GUPjAMEAACD+GcPjrcAAACD+Gl0fIP4bnQug/hvD4XnAwAA9oXw/f//gIu95P3//8eF2P3//wgAAAB0bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzobEsAAIXAD4Ri+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhbz9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E4AEAAIsHi1cEg8cI6QwCAACLveT9//+DjfD9//9AjZ30/f//uAACAACJneD9//+JhaD9//85tej9//99DMeF6P3//wYAAADranURgPpndWPHhej9//8BAAAA61c5hej9//9+BomF6P3//4G96P3//6MAAAB+PYu16P3//4HGXQEAAFboveT//4qV7/3//1mJhbj9//+FwHQQiYXg/f//ibWg/f//i9jrCseF6P3//6MAAACLB4s1fNBAAIPHCImFgP3//4tH/ImFhP3//42FpP3//1D/tYj9//8PvsL/tej9//+JveT9//9Q/7Wg/f//jYWA/f//U1D/NagGQQD/1v/Qi73w/f//g8QcgeeAAAAAdB2Dvej9//8AdRSNhaT9//9QU/81tAZBAP/W/9BZWYC97/3//2d1GIX/dRSNhaT9//9QU/81sAZBAP/W/9BZWYA7LXURgY3w/f//AAEAAEOJneD9//9T6cH9///Hhej9//8IAAAAiY20/f//6yqD6HMPhG78//9ISA+EWP7//4PoAw+FuwEAAIu95P3//8eFtP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+EMv7//4qFtP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpDv7///fBABAAAA+FFP7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQahdJ/FnwEhcBzEPfYE9b32oGN8P3//wABAAD3hfD9//8AkAAAi/qL2HUCM/85tej9//99DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8MLx3UGIbXM/f//jXXzi4Xo/f///43o/f//hcB/BovDC8d0LYuF2P3//5lSUFdT6PdJAACDwTCJnaD9//+L2Iv6g/k5fgYDjbT9//+IDk7rvY1F8yvGRveF8P3//wACAACJhdj9//+JteD9//90YoXAdAeLzoA5MHRX/43g/f//i43g/f//xgEwQOs/SWY5MHQHg8AChcl18yuF4P3//9H46yiF/3ULoWAGQQCJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g728/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhaD9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/okvX//4O93P3///90BIX/f9//tcz9//+LvZT9//+LndD9//+NhdT9//9QjYXc/f//6MQsAAD2hfD9//8IWVl0LvaF8P3//wR1JYu9oP3//+sZjbXc/f//i8uwME/oNfX//4O93P3///90BIX/f+ODvcT9//8Ai4XY/f//dHWFwH5xi7Xg/f//iYWY/f//D7cG/42Y/f//UGoGjUX0UI2FkP3//1CDxgLocF4AAIPEEIXAdTY5hZD9//90Lv+1kP3//4u9lP3//4ud0P3//41F9FCNhdz9///oHSwAAIO9mP3//wBZWXWm6yODjdz9////6xqLvZT9//9Q/7Xg/f//jYXc/f//6O8rAABZWYO93P3//wB8MvaF8P3//wR0KYu9oP3//+sdi43Q/f//jbXc/f//sCBP6Fz0//+Dvdz9////dASF/3/fg724/f//AHQT/7W4/f//6MTA//+Dpbj9//8AWYudwP3//4oDiIXv/f//hMB0E4uNjP3//4u95P3//4rQ6XL1//+AvbD9//8AdAqLhaz9//+DYHD9i4Xc/f//i038X14zzVvoNr///8nDkE9QQABOTkAAfk5AANxOQAAoT0AAM09AAHlPQACpUEAAi/9Vi+xWi3UIVujuVAAAWYP4/3UQ6NnT///HAAkAAACDyP/rTVf/dRBqAP91DFD/FazQQACL+IP//3UI/xU40EAA6wIzwIXAdAxQ6MnT//9Z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c0MPtxMD3gPOiZ0g5f//g/oKdRoBtTDl//9qDVtmiRiLnSDl//8DxgG1QOX//wG1QOX//2aJEAPGgb1A5f///hMAAHK4i/CNhUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FZDQQACFwA+EaQEAAIuFKOX//wGFOOX//zvGD4xhAQAAi8MrhTTl//87RRAPgkf////pSwEAAIuFNOX//4mFLOX//zlNEA+GdQEAAIuNLOX//4OlQOX//wArjTTl//9qAo2FSPn//147TRBzO4uVLOX//w+3EgG1LOX//wPOg/oKdQ5qDVtmiRgDxgG1QOX//wG1QOX//2aJEAPGgb1A5f//qAYAAHLAM/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xW40EAAi9g73g+ElwAAAGoAjYUo5f//UIvDK8ZQjYQ18Ov//1CLhSTl//+LAP80B/8VkNBAAIXAdAwDtSjl//873n/L6wz/FTjQQACJhUTl//873n9ci4Us5f//K4U05f//iYU45f//O0UQD4IL////6z9RjY0o5f//Uf91EP+1NOX///80OP8VkNBAAIXAdBWLhSjl//+DpUTl//8AiYU45f//6wz/FTjQQACJhUTl//+DvTjl//8AdWyDvUTl//8AdC1qBV45tUTl//91FOjmqv//xwAJAAAA6O6q//+JMOs//7VE5f//6PKq//9Z6zGLhSTl//+LAPZEBwRAdA+LhTTl//+AOBp1BDPA6yTopqr//8cAHAAAAOiuqv//gyAAg8j/6wyLhTjl//8rhTDl//9bi038XzPNXuialf//ycNqEGio8UAA6MSq//+LXQiD+/51G+hyqv//gyAA6Feq///HAAkAAACDyP/plAAAAIXbeAg7HXQdQQByGuhLqv//gyAA6DCq///HAAkAAADo06n//+vSi8PB+AWNPIWAHUEAi/OD5h/B5gaLBw++RDAEg+ABdMZT6HArAABZg2X8AIsH9kQwBAF0FP91EP91DFPobvj//4PEDIlF5OsX6Nap///HAAkAAADo3qn//4MgAINN5P/HRfz+////6AwAAACLReToTar//8OLXQhT6LgrAABZw2oQaMjxQADo8Kn//4tdCIP7/nUT6Iup///HAAkAAACDyP/poQAAAIXbeAg7HXQdQQByEuhsqf//xwAJAAAA6A+p///r2ovDwfgFjTyFgB1BAIvzg+YfweYGiwcPvkQGBIPgAXTOU+isKgAAWYNl/ACLB/ZEBgQBdDFT6C8qAABZUP8VBNFAAIXAdQv/FTjQQACJReTrBINl5ACDfeQAdBnoEqn//4tN5IkI6PWo///HAAkAAACDTeT/x0X8/v///+gMAAAAi0Xk6HSp///Di10IU+jfKgAAWcOL/1WL7FH2QwxAVovwiweJRfx0DYN7CAB1B4tFDAEG6z6DJwCDfQwAfjCLRQiKAP9NDIvL6GTI////RQiDPv91DoM/KnUPi8uwP+hOyP//g30MAH/Vgz8AdQWLRfyJB17Jw4v/VYvsgeyAAgAAoYQCQQAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2s/f//ibXQ/f//ib3k/f//iYWo/f//iYXw/f//iYXI/f//iYXo/f//iYXM/f//iYWk/f//iYXE/f//6Ka7///o/af//4mFnP3//4X2dSvo7qf//8cAFgAAAOiRp///gL24/f//AHQKi4W0/f//g2Bw/YPI/+lhCwAA9kYMQHVeVuicxf//WboABEEAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWAHUEA6wKLyvZBJH91m4P4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjYAdQQDrAovC9kAkgA+Fcf///zP2O94PhGf///+KE4m13P3//4m12P3//4m1vP3//4m1oP3//4iV7/3//4TSD4SyCgAAQ4mdwP3//zm13P3//w+MiQoAAI1C4DxYdw8PvsIPtoDA5UAAg+AP6wIzwIuNvP3//2vACQ+2hAjg5UAAagjB6AReiYW8/f//O8YPhO/+//9qB1k7wQ+HIAoAAP8khXOQQAAzwION6P3///+JhYz9//+JhaT9//+Jhcj9//+Jhcz9//+JhfD9//+JhcT9///p5wkAAA++woPoIHRIg+gDdDQrxnQkSEh0FIPoAw+FyQkAAAm18P3//+m+CQAAg43w/f//BOmyCQAAg43w/f//AemmCQAAgY3w/f//gAAAAOmXCQAAg43w/f//AumLCQAAgPoqdSyDxwSJveT9//+Lf/yJvcj9//+F/w+JbAkAAION8P3//wT3ncj9///pWgkAAIuFyP3//2vACg++yo1ECNCJhcj9///pPwkAAIOl6P3//wDpMwkAAID6KnUmg8cEib3k/f//i3/8ib3o/f//hf8PiRQJAACDjej9////6QgJAACLhej9//9rwAoPvsqNRAjQiYXo/f//6e0IAACA+kl0VYD6aHREgPpsdBiA+ncPhdUIAACBjfD9//8ACAAA6cYIAACAO2x1FkOBjfD9//8AEAAAiZ3A/f//6asIAACDjfD9//8Q6Z8IAACDjfD9//8g6ZMIAACKAzw2dR6AewE0dRiDwwKBjfD9//8AgAAAiZ3A/f//6W8IAAA8M3UegHsBMnUYg8MCgaXw/f///3///4mdwP3//+lNCAAAPGQPhEUIAAA8aQ+EPQgAADxvD4Q1CAAAPHUPhC0IAAA8eA+EJQgAADxYD4QdCAAAg6W8/f//AIOlxP3//wCNhaz9//9QD7bCUOh5FwAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6GvE//+KA0OJncD9//+EwA+Elfz//4uN0P3//4213P3//+hJxP//6bsHAAAPvsKD+GQPj7cBAAAPhFUCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqAUAAIDCIMeFjP3//wEAAACIle/9///pUwIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhPsEAACF/3ULoWQGQQCJheD9//+LheD9///HhcT9//8BAAAA6ckEAACD6FgPhBwDAABISHR/K8EPhLMBAABISA+F6AQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOigLAAAg8QQhcB0H8eFpP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///peQQAAIsHg8cEib3k/f//hcB0PItIBIXJdDX3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNAQAAIOlxP3//wDpKAQAAKFgBkEAiYXg/f//UOid7P//WekRBAAAg/hwD482AgAAD4QiAgAAg/hlD4z/AwAAg/hnD46zAAAAg/hpdHiD+G50KoP4bw+F4wMAAPaF8P3//4CLveT9//+Jtdj9//90bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzowhMAAIXAD4RK+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhaT9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E3QEAAAP+i0f4i1f86QkCAACLveT9//+DjfD9//9Ag73o/f//AI2d9P3//7gAAgAAiZ3g/f//iYWY/f//fQzHhej9//8GAAAA62p1EYD6Z3Vjx4Xo/f//AQAAAOtXOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj2Ltej9//+Bxl0BAABW6BKt//+Kle/9//9ZiYWg/f//hcB0EImF4P3//4m1mP3//4vY6wrHhej9//+jAAAAiweLNXzQQACDxwiJhYD9//+LR/yJhYT9//+Nhaz9//9Q/7WM/f//D77C/7Xo/f//ib3k/f//UP+1mP3//42FgP3//1NQ/zWoBkEA/9b/0Iu98P3//4PEHIHngAAAAHQdg73o/f//AHUUjYWs/f//UFP/NbQGQQD/1v/QWVmAve/9//9ndRiF/3UUjYWs/f//UFP/NbAGQQD/1v/QWVmAOy11EYGN8P3//wABAABDiZ3g/f//U+nE/f//ibXo/f//iY2o/f//6yqD6HMPhHT8//9ISA+EW/7//4PoAw+FvgEAAIu95P3//8eFqP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+ENf7//4qFqP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpEf7///fBABAAAA+FF/7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQbhdJ/F3wEhcBzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIv6i9h1AjP/g73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhhcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1PoThIAAIPBMImdmP3//4vYi/qD+Tl+BgONqP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RjhcB0B4vOgDkwdFj/jeD9//+LjeD9///GATBA60BJZoM4AHQHg8AChcl18iuF4P3//9H46yiF/3ULoWAGQQCJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g72k/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhZj9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/o6L3//4O93P3///90BIX/f9//tcz9//+LvZz9//+LndD9//+NhdT9//9QjYXc/f//6Br1///2hfD9//8IWVl0LvaF8P3//wR1JYu9mP3//+sZjbXc/f//i8uwME/oi73//4O93P3///90BIX/f+ODvcT9//8Ai4XY/f//dHWFwH5xi7Xg/f//iYWQ/f//D7cG/42Q/f//UGoGjUX0UI2FiP3//1CDxgLoxiYAAIPEEIXAdTY5hYj9//90Lv+1iP3//4u9nP3//4ud0P3//41F9FCNhdz9///oc/T//4O9kP3//wBZWXWm6yODjdz9////6xqLvZz9//9Q/7Xg/f//jYXc/f//6EX0//9ZWYO93P3//wB8MvaF8P3//wR0KYu9mP3//+sdi43Q/f//jbXc/f//sCBP6LK8//+Dvdz9////dASF/3/fg72g/f//AHQT/7Wg/f//6BqJ//+DpaD9//8AWYudwP3//4oDiIXv/f//hMB0D4u95P3//zP2itDpZPX//4O9vP3//wB0DYO9vP3//wcPhY30//+Avbj9//8AdAqLhbT9//+DYHD9i4Xc/f//i038X14zzVvoeof//8nDjUkA+4dAAPiFQAAqhkAAhoZAANKGQADehkAAJIdAAFaIQACL/1WL7FFRi0UMVot1CIlF+ItFEFdWiUX86CEdAACDz/9ZO8d1EegKnP//xwAJAAAAi8eL1+tK/3UUjU38Uf91+FD/FazQQACJRfg7x3UT/xU40EAAhcB0CVDo/Jv//1nrz4vGwfgFiwSFgB1BAIPmH8HmBo1EMASAIP2LRfiLVfxfXsnDahRo6PFAAOj8m///g8v/iV3ciV3gi0UIg/j+dRzooZv//4MgAOiGm///xwAJAAAAi8OL0+mhAAAAhcB4CDsFdB1BAHIa6Hmb//+DIADoXpv//8cACQAAAOgBm///69GLyMH5BY08jYAdQQCL8IPmH8HmBosPD75MMQSD4QF0xlDonhwAAFmDZfwAiwf2RDAEAXQc/3UU/3UQ/3UM/3UI6Nf+//+DxBCJRdyJVeDrGej8mv//xwAJAAAA6ASb//+DIACJXdyJXeDHRfz+////6AwAAACLRdyLVeDobpv//8P/dQjo2hwAAFnDi/9Vi+z/BeAOQQBoABAAAOhgpv//WYtNCIlBCIXAdA2DSQwIx0EYABAAAOsRg0kMBI1BFIlBCMdBGAIAAACLQQiDYQQAiQFdw4v/VYvsi0UIg/j+dQ/oa5r//8cACQAAADPAXcOFwHgIOwV0HUEAchLoUJr//8cACQAAAOjzmf//696LyIPgH8H5BYsMjYAdQQDB4AYPvkQBBIPgQF3DLaQDAAB0IoPoBHQXg+gNdAxIdAMzwMO4BAQAAMO4EgQAAMO4BAgAAMO4EQQAAMOL/1ZXi/BoAQEAADP/jUYcV1Doabj//zPAD7fIi8GJfgSJfgiJfgzB4RALwY1+EKurq7nABkEAg8QMjUYcK86/AQEAAIoUAYgQQE91942GHQEAAL4AAQAAihQIiBBATnX3X17Di/9Vi+yB7BwFAAChhAJBADPFiUX8U1eNhej6//9Q/3YE/xUI0UAAvwABAACFwA+E/AAAADPAiIQF/P7//0A7x3L0ioXu+v//xoX8/v//IITAdDCNne/6//8PtsgPtgM7yHcWK8FAUI2UDfz+//9qIFLoprf//4PEDIpDAYPDAoTAddZqAP92DI2F/Pr///92BFBXjYX8/v//UGoBagDoiCoAADPbU/92BI2F/P3//1dQV42F/P7//1BX/3YMU+g7KQAAg8REU/92BI2F/Pz//1dQV42F/P7//1BoAAIAAP92DFPoFikAAIPEJDPAD7eMRfz6///2wQF0DoBMBh0QiowF/P3//+sR9sECdBWATAYdIIqMBfz8//+IjAYdAQAA6weInAYdAQAAQDvHcr/rUo2GHQEAAMeF5Pr//5////8zySmF5Pr//4uV5Pr//42EDh0BAAAD0I1aIIP7GXcKgEwOHRCNUSDrDYP6GXcMgEwOHSCNUeCIEOsDxgAAQTvPcsaLTfxfM81b6CaD///Jw2oMaAjyQADoUJj//+g4zv//i/ih4AtBAIVHcHQdg39sAHQXi3dohfZ1CGog6Nqe//9Zi8boaJj//8NqDej6p///WYNl/ACLd2iJdeQ7NegKQQB0NoX2dBpW/xXc0EAAhcB1D4H+wAZBAHQHVujug///WaHoCkEAiUdoizXoCkEAiXXkVv8V0NBAAMdF/P7////oBQAAAOuOi3Xkag3owKb//1nDi/9Vi+yD7BBTM9tTjU3w6PCq//+JHTAbQQCD/v51HscFMBtBAAEAAAD/FRDRQAA4Xfx0RYtN+INhcP3rPIP+/XUSxwUwG0EAAQAAAP8VDNFAAOvbg/78dRKLRfCLQATHBTAbQQABAAAA68Q4Xfx0B4tF+INgcP2LxlvJw4v/VYvsg+wgoYQCQQAzxYlF/FOLXQxWi3UIV+hk////i/gz9ol9CDv+dQ6Lw+i6/P//M8DpoQEAAIl15DPAObjwCkEAD4SRAAAA/0Xkg8AwPfAAAABy54H/6P0AAA+EdAEAAIH/6f0AAA+EaAEAAA+3x1D/FRTRQACFwA+EVgEAAI1F6FBX/xUI0UAAhcAPhDcBAABoAQEAAI1DHFZQ6Mm0//8z0kKDxAyJewSJcww5VegPhvwAAACAfe4AD4TTAAAAjXXvig6EyQ+ExgAAAA+2Rv8PtsnpqQAAAGgBAQAAjUMcVlDogrT//4tN5IPEDGvJMIl14I2xAAtBAIl15OsrikYBhMB0KQ+2Pg+2wOsSi0XgioDsCkEACEQ7HQ+2RgFHO/h26ot9CIPGAoA+AHXQi3Xk/0Xgg8YIg33gBIl15HLpi8eJewTHQwgBAAAA6Gn7//9qBolDDI1DEI2J9ApBAFpmizFmiTCDwQKDwAJKdfGL8+jX+///6bT+//+ATAMdBEA7wXb2g8YCgH7/AA+FMP///41DHrn+AAAAgAgIQEl1+YtDBOgR+///iUMMiVMI6wOJcwgzwA+3yIvBweEQC8GNexCrq6vrpzk1MBtBAA+FVP7//4PI/4tN/F9eM81b6B2A///Jw2oUaCjyQADoR5X//4NN4P/oK8v//4v4iX3c6Nj8//+LX2iLdQjocf3//4lFCDtDBA+EVwEAAGggAgAA6Gqg//9Zi9iF2w+ERgEAALmIAAAAi3doi/vzpYMjAFP/dQjotP3//1lZiUXghcAPhfwAAACLddz/dmj/FdzQQACFwHURi0ZoPcAGQQB0B1DoxoD//1mJXmhTiz3Q0EAA/9f2RnACD4XqAAAA9gXgC0EAAQ+F3QAAAGoN6Hek//9Zg2X8AItDBKNAG0EAi0MIo0QbQQCLQwyjSBtBADPAiUXkg/gFfRBmi0xDEGaJDEU0G0EAQOvoM8CJReQ9AQEAAH0NikwYHIiI4AhBAEDr6TPAiUXkPQABAAB9EIqMGB0BAACIiOgJQQBA6+b/NegKQQD/FdzQQACFwHUToegKQQA9wAZBAHQHUOgNgP//WYkd6ApBAFP/18dF/P7////oAgAAAOswag3o8aL//1nD6yWD+P91IIH7wAZBAHQHU+jXf///Weh2k///xwAWAAAA6wSDZeAAi0Xg6P+T///Dgz2MHkEAAHUSav3oVv7//1nHBYweQQABAAAAM8DDi/9Vi+xTVos10NBAAFeLfQhX/9aLh7AAAACFwHQDUP/Wi4e4AAAAhcB0A1D/1ouHtAAAAIXAdANQ/9aLh8AAAACFwHQDUP/WjV9Qx0UIBgAAAIF7+OQLQQB0CYsDhcB0A1D/1oN7/AB0CotDBIXAdANQ/9aDwxD/TQh11ouH1AAAAAW0AAAAUP/WX15bXcOL/1WL7FeLfQiF/w+EgwAAAFNWizXc0EAAV//Wi4ewAAAAhcB0A1D/1ouHuAAAAIXAdANQ/9aLh7QAAACFwHQDUP/Wi4fAAAAAhcB0A1D/1o1fUMdFCAYAAACBe/jkC0EAdAmLA4XAdANQ/9aDe/wAdAqLQwSFwHQDUP/Wg8MQ/00IddaLh9QAAAAFtAAAAFD/1l5bi8dfXcOL/1WL7FNWi3UIi4a8AAAAM9tXO8N0bz1IDkEAdGiLhrAAAAA7w3ReORh1WouGuAAAADvDdBc5GHUTUOg2fv///7a8AAAA6IcnAABZWYuGtAAAADvDdBc5GHUTUOgVfv///7a8AAAA6P0mAABZWf+2sAAAAOj9ff///7a8AAAA6PJ9//9ZWYuGwAAAADvDdEQ5GHVAi4bEAAAALf4AAABQ6NF9//+LhswAAAC/gAAAACvHUOi+ff//i4bQAAAAK8dQ6LB9////tsAAAADopX3//4PEEIuG1AAAAD3oC0EAdBs5mLQAAAB1E1DoAyMAAP+21AAAAOh8ff//WVmNflDHRQgGAAAAgX/45AtBAHQRiwc7w3QLORh1B1DoV33//1k5X/x0EotHBDvDdAs5GHUHUOhAff//WYPHEP9NCHXHVugxff//WV9eW13Di/9Vi+xXi30Mhf90O4tFCIXAdDRWizA793QoV4k46Gr9//9ZhfZ0G1bo7v3//4M+AFl1D4H+UA1BAHQHVuhz/v//WYvHXusCM8BfXcNqDGhI8kAA6M+Q///ot8b//4vwoeALQQCFRnB0IoN+bAB0HOigxv//i3BshfZ1CGog6FSX//9Zi8bo4pD//8NqDOh0oP//WYNl/AD/NSgOQQCDxmxW6Fn///9ZWYlF5MdF/P7////oAgAAAOu+agzobZ///1mLdeTDi/9Vi+yD7BChhAJBADPFiUX8U1aLdQz2RgxAVw+FNgEAAFbowq3//1m7AARBAIP4/3QuVuixrf//WYP4/nQiVuilrf//wfgFVo08hYAdQQDola3//4PgH1nB4AYDB1nrAovDikAkJH88Ag+E6AAAAFbodK3//1mD+P90LlboaK3//1mD+P50IlboXK3//8H4BVaNPIWAHUEA6Eyt//+D4B9ZweAGAwdZ6wKLw4pAJCR/PAEPhJ8AAABW6Cut//9Zg/j/dC5W6B+t//9Zg/j+dCJW6BOt///B+AVWjTyFgB1BAOgDrf//g+AfWcHgBgMHWesCi8P2QASAdF3/dQiNRfRqBVCNRfBQ6FUYAACDxBCFwHQHuP//AADrXTP/OX3wfjD/TgR4EosGikw99IgIiw4PtgFBiQ7rDg++RD30VlDoBaH//1lZg/j/dMhHO33wfNBmi0UI6yCDRgT+eA2LDotFCGaJAYMGAusND7dFCFZQ6EklAABZWYtN/F9eM81b6KV5///Jw6GEAkEAg8gBM8k5BUwbQQAPlMGLwcOL/1WL7IPsEFNWi3UMM9s783QVOV0QdBA4HnUSi0UIO8N0BTPJZokIM8BeW8nD/3UUjU3w6Nih//+LRfA5WBR1HotFCDvDdAYPtg5miQg4Xfx0B4tF+INgcP0zwEDry41F8FAPtgZQ6MQAAABZWYXAdH2LRfCLiKwAAACD+QF+JTlNEHwgM9I5XQgPlcJS/3UIUVZqCf9wBP8VLNBAAIXAi0XwdRCLTRA7iKwAAAByIDheAXQbi4CsAAAAOF38D4Rm////i034g2Fw/ela////6JiN///HACoAAAA4Xfx0B4tF+INgcP2DyP/pO////zPAOV0ID5XAUP91CItF8GoBVmoJ/3AE/xUs0EAAhcAPhTr////ruov/VYvsagD/dRD/dQz/dQjo1f7//4PEEF3Di/9Vi+yD7BD/dQyNTfDozqD//w+2RQiLTfCLicgAAAAPtwRBJQCAAACAffwAdAeLTfiDYXD9ycOL/1WL7GoA/3UI6Ln///9ZWV3DzMzMzMzMzMzMzFaLRCQUC8B1KItMJBCLRCQMM9L38YvYi0QkCPfxi/CLw/dkJBCLyIvG92QkEAPR60eLyItcJBCLVCQMi0QkCNHp0dvR6tHYC8l19Pfzi/D3ZCQUi8iLRCQQ9+YD0XIOO1QkDHcIcg87RCQIdglOK0QkEBtUJBQz2ytEJAgbVCQM99r32IPaAIvKi9OL2YvIi8ZewhAAi/9Vi+z2QAxAdAaDeAgAdBpQ/3UI6C/8//9ZWbn//wAAZjvBdQWDDv9dw/8GXcOL/1WL7FH2QwxAVovwiweJRfx0DYN7CAB1B4tFDAEG60ODJwCDfQwAfjWLRQgPtwD/TQxQi8Polv///4NFCAKDPv9ZdQ+DPyp1EGo/i8Pofv///1mDfQwAf9CDPwB1BYtF/IkHXsnDi/9Vi+yB7HgEAAChhAJBADPFiUX8U4tdFFaLdQgzwFf/dRCLfQyNjbT7//+JtdT7//+JneT7//+Jhaz7//+Jhfj7//+Jhdj7//+JhfT7//+Jhdz7//+JhbD7//+JhdD7///o+p7//+hRi///iYWc+///hfZ1K+hCi///xwAWAAAA6OWK//+AvcD7//8AdAqLhbz7//+DYHD9g8j/6e0KAAAz9jv+dM8PtxeJtej7//+Jtez7//+JtcT7//+Jtaj7//+JleD7//9mO9YPhKQKAABqAlkD+Ym9oPv//zm16Pv//w+MeAoAAI1C4GaD+Fh3Dw+3wg+2gMDlQACD4A/rAjPAi7XE+///a8AJD7aEMODlQABqCMHoBF6JhcT7//87xg+ET////4P4Bw+HDQoAAP8khausQAAzwION9Pv///+JhZj7//+JhbD7//+Jhdj7//+Jhdz7//+Jhfj7//+JhdD7///p4AkAAA+3woPoIHRIg+gDdDQrxnQkK8F0FIPoAw+FtgkAAAm1+Pv//+m3CQAAg434+///BOmrCQAAg434+///AemfCQAAgY34+///gAAAAOmQCQAACY34+///6YUJAABmg/oqdSuLA4PDBImd5Pv//4mF2Pv//4XAD4lmCQAAg434+///BPed2Pv//+lUCQAAi4XY+///a8AKD7fKjUQI0ImF2Pv//+k5CQAAg6X0+///AOktCQAAZoP6KnUliwODwwSJneT7//+JhfT7//+FwA+JDgkAAION9Pv////pAgkAAIuF9Pv//2vACg+3yo1ECNCJhfT7///p5wgAAA+3woP4SXRRg/hodECD+Gx0GIP4dw+FzAgAAIGN+Pv//wAIAADpvQgAAGaDP2x1EQP5gY34+///ABAAAOmmCAAAg434+///EOmaCAAAg434+///IOmOCAAAD7cHg/g2dRlmg38CNHUSg8cEgY34+///AIAAAOltCAAAg/gzdRlmg38CMnUSg8cEgaX4+////3///+lPCAAAg/hkD4RGCAAAg/hpD4Q9CAAAg/hvD4Q0CAAAg/h1D4QrCAAAg/h4D4QiCAAAg/hYD4QZCAAAg6XE+///AIuF1Pv//1KNtej7///HhdD7//8BAAAA6Bf8//9Z6fAHAAAPt8KD+GQPjzECAAAPhL8CAACD+FMPjxwBAAB0f4PoQXQQK8F0WivBdAgrwQ+F4QUAAIPCIMeFmPv//wEAAACJleD7//+LjfT7//+Djfj7//9Ajb38+///uAACAACJvfD7//+Jhez7//+FyQ+JjgIAAMeF9Pv//wYAAADp3gIAAPeF+Pv//zAIAAAPhckAAACDjfj7//8g6b0AAAD3hfj7//8wCAAAdQeDjfj7//8gi730+///g///dQW/////f4PDBPaF+Pv//yCJneT7//+LW/yJnfD7//8PhPkEAACF23ULoWAGQQCJhfD7//+Dpez7//8Ai7Xw+///hf8PjhEFAACKBoTAD4QHBQAAjY20+///D7bAUVDoC/r//1lZhcB0AUZG/4Xs+///Ob3s+///fNDp3AQAAIPoWA+E3wIAACvBD4SVAAAAg+gHD4T0/v//K8EPhboEAAAPtwODwwQz9kb2hfj7//8gibXQ+///iZ3k+///iYWk+///dEKIhcj7//+NhbT7//9Qi4W0+///xoXJ+///AP+wrAAAAI2FyPv//1CNhfz7//9Q6Ef4//+DxBCFwHkPibWw+///6wdmiYX8+///jYX8+///iYXw+///ibXs+///6TYEAACLA4PDBImd5Pv//4XAdDqLSASFyXQz94X4+///AAgAAA+/AImN8Pv//3QSmSvCx4XQ+///AQAAAOnxAwAAg6XQ+///AOnnAwAAoWAGQQCJhfD7//9Q6BXQ//9Z6dADAACD+HAPj+UBAAAPhM0BAACD+GUPjL4DAACD+GcPjuf9//+D+Gl0boP4bnQkg/hvD4WiAwAA9oX4+///gIm14Pv//3RigY34+///AAIAAOtWg8MEiZ3k+///i1v86ET3//+FwA+EePr///aF+Pv//yB0DGaLhej7//9miQPrCIuF6Pv//4kDx4Ww+///AQAAAOn3BAAAg434+///QMeF4Pv//woAAAD3hfj7//8AgAAAD4SZAQAAA96LQ/iLU/zp1QEAAHUSZoP6Z3VXx4X0+///AQAAAOtLO8h+CImF9Pv//4vIgfmjAAAAfjeNsV0BAABW6OCQ//+LleD7//9ZiYWo+///hcB0EImF8Pv//4m17Pv//4v46wrHhfT7//+jAAAAiwOLNXzQQACDwwiJhZD7//+LQ/yJhZT7//+NhbT7//9Q/7WY+///D77C/7X0+///iZ3k+///UP+17Pv//42FkPv//1dQ/zWoBkEA/9b/0Iud+Pv//4PEHIHjgAAAAHQdg730+///AHUUjYW0+///UFf/NbQGQQD/1v/QWVlmg73g+///Z3UYhdt1FI2FtPv//1BX/zWwBkEA/9b/0FlZgD8tdRGBjfj7//8AAQAAR4m98Pv//1fpGf7//4m19Pv//8eFrPv//wcAAADrJIPocw+Ee/z//yvBD4Sc/v//g+gDD4XOAQAAx4Ws+///JwAAAPaF+Pv//4DHheD7//8QAAAAD4R8/v//ajBYZomFzPv//4uFrPv//4PAUWaJhc77//+Jjdz7///pV/7///eF+Pv//wAQAAAPhVf+//+DwwT2hfj7//8gdBz2hfj7//9AiZ3k+///dAYPv0P86wQPt0P8mesX9oX4+///QItD/HQDmesCM9KJneT7///2hfj7//9AdBuF0n8XfASFwHMR99iD0gD32oGN+Pv//wABAAD3hfj7//8AkAAAi/qL2HUCM/+DvfT7//8AfQzHhfT7//8BAAAA6xqDpfj7///3uAACAAA5hfT7//9+BomF9Pv//4vDC8d1BiGF3Pv//421+/3//4uF9Pv///+N9Pv//4XAfwaLwwvHdC2LheD7//+ZUlBXU+gF9v//g8EwiZ2M+///i9iL+oP5OX4GA42s+///iA5O672Nhfv9//8rxkb3hfj7//8AAgAAiYXs+///ibXw+///dF6FwHQHi8aAODB0U/+N8Pv//4uF8Pv///+F7Pv//8YAMOs8hdt1C6FkBkEAiYXw+///i4Xw+///x4XQ+///AQAAAOsJT2aDOAB0BgPBhf918yuF8Pv//9H4iYXs+///g72w+///AA+FqAEAAIuF+Pv//6hAdCupAAEAAHQEai3rDqgBdARqK+sGqAJ0FGogWWaJjcz7///Hhdz7//8BAAAAi73Y+///K73s+///K73c+///ib3g+///qAx1JOsei4XU+///aiCNtej7//9P6Ir1//+Dvej7////WXQEhf9/3v+13Pv//4u9nPv//4ud1Pv//42FzPv//1CNhej7///oh/X///aF+Pv//whZWXQv9oX4+///BHUmi73g+///6xpqMI216Pv//4vDT+gs9f//g73o+////1l0BIX/f+KDvdD7//8AdWuLnez7//+F235hi73w+///jYW0+///UIuFtPv///+wrAAAAI2FpPv//1dQS+jK8v//g8QQiYWM+///hcB+JP+1pPv//4uF1Pv//4216Pv//+jA9P//A72M+///WYXbf7DrLoON6Pv////rJf+17Pv//4u9nPv///+18Pv//4ud1Pv//42F6Pv//+i29P//WVmDvej7//8AfDP2hfj7//8EdCqLveD7///rHouF1Pv//2ogjbXo+///T+hX9P//g73o+////1l0BIX/f96Dvaj7//8AdBP/taj7///o42z//4OlqPv//wBZi72g+///i53k+///D7cHM/aJheD7//9mO8Z0B4vQ6XH1//85tcT7//90DYO9xPv//wcPhQH1//+AvcD7//8AdAqLhbz7//+DYHD9i4Xo+///i038X14zzVvoQmv//8nDjUkAQqRAAEKiQAB0okAAz6JAABujQAAno0AAbaNAAGSkQACL/1WL7ItFCFZXhcB4WTsFdB1BAHNRi8jB+QWL8IPmH408jYAdQQCLD8HmBoM8Dv91NYM9gAJBAAFTi10MdR6D6AB0EEh0CEh1E1Nq9OsIU2r16wNTavb/FRjRQACLB4kcBjPAW+sW6JF////HAAkAAADomX///4MgAIPI/19eXcOL/1WL7ItNCFMz21ZXO8t8WzsNdB1BAHNTi8HB+AWL8YPmH408hYAdQQCLB8HmBvZEMAQBdDaDPDD/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6ARa////djjo/Fn///92POj0Wf//g8RA/3ZA6OlZ////dkTo4Vn///92SOjZWf///3ZM6NFZ////dlDoyVn///92VOjBWf///3ZY6LlZ////dlzosVn///92YOipWf///3Zk6KFZ////dmjomVn///92bOiRWf///3Zw6IlZ////dnTogVn///92eOh5Wf///3Z86HFZ//+DxED/toAAAADoY1n///+2hAAAAOhYWf///7aIAAAA6E1Z////towAAADoQln///+2kAAAAOg3Wf///7aUAAAA6CxZ////tpgAAADoIVn///+2nAAAAOgWWf///7agAAAA6AtZ////tqQAAADoAFn///+2qAAAAOj1WP///7a8AAAA6OpY////tsAAAADo31j///+2xAAAAOjUWP///7bIAAAA6MlY////tswAAADovlj//4PEQP+20AAAAOiwWP///7a4AAAA6KVY////ttgAAADomlj///+23AAAAOiPWP///7bgAAAA6IRY////tuQAAADoeVj///+26AAAAOhuWP///7bsAAAA6GNY////ttQAAADoWFj///+28AAAAOhNWP///7b0AAAA6EJY////tvgAAADoN1j///+2/AAAAOgsWP///7YAAQAA6CFY////tgQBAADoFlj///+2CAEAAOgLWP//g8RA/7YMAQAA6P1X////thABAADo8lf///+2FAEAAOjnV////7YYAQAA6NxX////thwBAADo0Vf///+2IAEAAOjGV////7YkAQAA6LtX////tigBAADosFf///+2LAEAAOilV////7YwAQAA6JpX////tjQBAADoj1f///+2OAEAAOiEV////7Y8AQAA6HlX////tkABAADoblf///+2RAEAAOhjV////7ZIAQAA6FhX//+DxED/tkwBAADoSlf///+2UAEAAOg/V////7ZUAQAA6DRX////tlgBAADoKVf///+2XAEAAOgeV////7ZgAQAA6BNX//+DxBheXcOL/1WL7FaLdQiF9nRZiwY7BUgOQQB0B1Do8Fb//1mLRgQ7BUwOQQB0B1Do3lb//1mLRgg7BVAOQQB0B1DozFb//1mLRjA7BXgOQQB0B1Doulb//1mLdjQ7NXwOQQB0B1boqFb//1leXcOL/1WL7FaLdQiF9g+E6gAAAItGDDsFVA5BAHQHUOiC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YQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAUgA2ADAAMQAwAA0ACgAtACAAYQBiAG8AcgB0ACgAKQAgAGgAYQBzACAAYgBlAGUAbgAgAGMAYQBsAGwAZQBkAA0ACgAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAABSADYAMAAwADIADQAKAC0AIABmAGwAbwBhAHQAaQBuAGcAIABwAG8AaQBuAHQAIABzAHUAcABwAG8AcgB0ACAAbgBvAHQAIABsAG8AYQBkAGUAZAANAAoAAAAAAAAAAAACAAAAKNpAAAgAAADQ2UAACQAAAHjZQAAKAAAAMNlAABAAAADY2EAAEQAAAHjYQAASAAAAMNhAABMAAADY10AAGAAAAGjXQAAZAAAAGNdAABoAAACo1kAAGwAAADjWQAAcAAAA6NVAAB4AAACo1UAAHwAAAODUQAAgAAAAeNRAACEAAACI0kAAeAAAAGTSQAB5AAAASNJAAHoAAAAs0kAA/AAAACTSQAD/AAAABNJAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAC4ALgAuAAAAPABwAHIAbwBnAHIAYQBtACAAbgBhAG0AZQAgAHUAbgBrAG4AbwB3AG4APgAAAAAAUgB1AG4AdABpAG0AZQAgAEUAcgByAG8AcgAhAAoACgBQAHIAbwBnAHIAYQBtADoAIAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIB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ZQBkAAAAVAB1AGUAAABNAG8AbgAAAFMAdQBuAAAASEg6bW06c3MAAAAAZGRkZCwgTU1NTSBkZCwgeXl5eQBNTS9kZC95eQAAAABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVtYmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZlYgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8AQwBPAE4ATwBVAFQAJAAAAEZhdGFsIGVycm9yIGluIGxhdW5jaGVyOiAlcwoAAAAAcgBiAAAAAABGYWlsZWQgdG8gb3BlbiBleGVjdXRhYmxlAAAAVW5hYmxlIHRvIGZpbmQgYW4gYXBwZW5kZWQgYXJjaGl2ZS4AVW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxlAAAAACMhAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAc3RkZXJyIGR1cGxpY2F0aW9uIGZhaWxlZAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAC4AZQB4AGUAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBmaW5kIGFyZ3VtZW50cyAoZXZlbiBpZiBlbXB0eSkgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGNvbW1hbmQgbGluZSBtZW1vcnkAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAJBALDuQAADAAAAUlNEU8W2ANLXBtxNkkrmGq52uKYCAAAAQzpcVXNlcnNcVmluYXlcUHJvamVjdHNcc2ltcGxlX2xhdW5jaGVyXFJlbGVhc2VcQ0xJU2ltcGxlTGF1bmNoZXIucGRiAAAAAAAAAAAAAACALQAAoC8AAMBxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAKsYQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA/h5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAnIEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAHUiQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAeyNAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABbJEAAAAAAAP7///8AAAAAzP///wAAAAD+////siVAAMYlQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA4CpAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAABwM0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOk5QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAcztAAAAAAAAAAAAAPztAAP7///8AAAAA1P///wAAAAD+////AAAAAPY8QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAnUpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAATWkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAHNbQAAAAAAA/v///wAAAADY////AAAAAP7///8AAAAAfGJAAP7///8AAAAAi2JAAP7///8AAAAA2P///wAAAAD+////AAAAAD5kQAD+////AAAAAEpkQAD+////AAAAAMz///8AAAAA/v///wAAAAA6bkAAAAAAAP7///8AAAAA2P///wAAAAD+////a3FAAH5xQAAAAAAA/v///wAAAADY////AAAAAP7////3ckAA+3JAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAADkdEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAGF2QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAGYNAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADyg0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPiRQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXJVAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAumUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAALKcQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAzK5AAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRsEAAAAAAAAAAAADNr0AA7PIAAAAAAAAAAAAApPUAAADQAAAk9AAAAAAAAAAAAAC+9QAAONEAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPQAADr0AABM9AAAZvQAAHj0AACM9AAAovQAAL70AADa9AAA8PQAAAb1AAAi9QAAOPUAAEz1AABc9QAAbPUAAIT1AACW9QAAyvUAANb1AADi9QAA+vUAABL2AAAk9gAANvYAAEz2AABg9gAAfPYAAJr2AACu9gAA1vYAAOb2AAD29gAAAvcAABD3AAAi9wAANvcAAEL3AABU9wAAYvcAAHT3AACM9wAAlPcAAKD3AACy9wAAyPcAAOL3AAD49wAAEvgAAB74AAAs+AAAOvgAAET4AABc+AAAbPgAAIL4AACa+AAAtPgAAMT4AADa+AAA9PgAAAL5AAAS+QAAIPkAADD5AABC+QAAVvkAAGL5AABs+QAAePkAAIr5AACa+QAAtvkAAMb5AADY+QAA5PkAAPT5AAAAAAAAsvUAAAAAAAAZAUV4aXRQcm9jZXNzAIcBR2V0Q29tbWFuZExpbmVXAHEEU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAqABDcmVhdGVQcm9jZXNzVwAAwAFHZXRDdXJyZW50UHJvY2VzcwD5BFdhaXRGb3JTaW5nbGVPYmplY3QAZwFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADfAUdldEV4aXRDb2RlUHJvY2VzcwAAFAJHZXRNb2R1bGVGaWxlTmFtZVcAAKUDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABnA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABkAkdldFN0ZEhhbmRsZQAAAgJHZXRMYXN0RXJyb3IAAC0EU2V0Q29uc29sZUN0cmxIYW5kbGVyAOgARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbADPAkhlYXBGcmVlAADLAkhlYXBBbGxvYwDuAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA5A0xlYXZlQ3JpdGljYWxTZWN0aW9uAABpAkdldFN0cmluZ1R5cGVXAACGAUdldENvbW1hbmRMaW5lQQDTAkhlYXBTZXRJbmZvcm1hdGlvbgAAwARUZXJtaW5hdGVQcm9jZXNzAADTBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAApQRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAANJc0RlYnVnZ2VyUHJlc2VudADjAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA6gBFbmNvZGVQb2ludGVyAMoARGVjb2RlUG9pbnRlcgAYBFJ0bFVud2luZADNAkhlYXBDcmVhdGUAAEUCR2V0UHJvY0FkZHJlc3MAABgCR2V0TW9kdWxlSGFuZGxlVwAAJQVXcml0ZUZpbGUAbwRTZXRIYW5kbGVDb3VudAAA8wFHZXRGaWxlVHlwZQBjAkdldFN0YXJ0dXBJbmZvVwDRAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgCyBFNsZWVwAMADUmVhZEZpbGUAAGYEU2V0RmlsZVBvaW50ZXIAABMCR2V0TW9kdWxlRmlsZU5hbWVBAABhAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXABEFV2lkZUNoYXJUb011bHRpQnl0ZQDaAUdldEVudmlyb25tZW50U3RyaW5nc1cAAMUEVGxzQWxsb2MAAMcEVGxzR2V0VmFsdWUAyARUbHNTZXRWYWx1ZQDGBFRsc0ZyZWUA7wJJbnRlcmxvY2tlZEluY3JlbWVudAAAcwRTZXRMYXN0RXJyb3IAAMUBR2V0Q3VycmVudFRocmVhZElkAADrAkludGVybG9ja2VkRGVjcmVtZW50AACnA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAJMCR2V0VGlja0NvdW50AADBAUdldEN1cnJlbnRQcm9jZXNzSWQAeQJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCPAENyZWF0ZUZpbGVXAD8DTG9hZExpYnJhcnlXAADSAkhlYXBSZUFsbG9jAJoBR2V0Q29uc29sZUNQAACsAUdldENvbnNvbGVNb2RlAABXAUZsdXNoRmlsZUJ1ZmZlcnMAAHIBR2V0Q1BJbmZvAGgBR2V0QUNQAAA3AkdldE9FTUNQAAAKA0lzVmFsaWRDb2RlUGFnZQCHBFNldFN0ZEhhbmRsZQAABANJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50AFMEU2V0RW5kT2ZGaWxlAABKAkdldFByb2Nlc3NIZWFwAADUAkhlYXBTaXplAAAkBVdyaXRlQ29uc29sZVcALQNMQ01hcFN0cmluZ1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAHkEAAAAAAMAeQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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//9E1v//QNL//zvP//83zP//M8j//y/E//8qwf//Jr3//yK6//+O3P///Pz8nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn29vb/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+fn5//l5eX//v7+/1fe//9H2P//Q9X//z/S//87zv//Nsv//zLI//9u1///9vz//2bR//8wvv//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn39/f/x8fHjDMzMyLT09OE7u7u/8TExP/u7u7/7e3t/+3t7f/t7e3/5+fn/9XV1f/p6en/6+vr/+vr6//r6+v/6urq/+rq6v/Q0ND/2NjY/9ra2v/X19f/zs7O/9LS0v+zs7P//////0/e//9L2///R9j//0LU//8+0f//Os7//zXK//9w2P//9vz//2nT//8kvP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/ISEhNAAAABc4ODgm7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/09PT/8jIyP/o6Oj/7Ozs/9HR0f/Ly8v/6+vr/+vr6//Pz8//29vb/7+/v//Jycn/v7+//8nJyf/Kysr//////1Ph//9O3v//Str//0bX//9C1P//PdD//znN//81yv//MMX//yzC//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/wcHBkSUlJTXHx8eO8PDw/8fHx//v7+//7+/v/+7u7v/u7u7/7u7u/97e3v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/Q0ND/3t7e/+Dg4P/v7+//+vr6/////////////////1bk//9S4f//Tt3//0na//9F1///sO3/////////////////////////////////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs//v7+//RuZ3/pXxK/5pxP/+Wb0D//////1rm//9V4///UeD//03d//9J2f//RNb//0DT//88z///N8z//zPJ//8vxP//K8H//ya+//8iuv//Lbz//47c///+///MAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/ycnJjDQ0NCLW1taE8fHx/8jIyP/x8fH/8PDw//Dw8P/w8PD/6enp/9fX1//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/S0tL/6+vr/9/MtP+ndzz/o3U9/55zPv+acT///////13p//9Z5v//VeP//1Df//9M3P//SNn//0PV//8/0v//O8///zfL//8yyP//LsT//yrA//8lvf//Ibr//x+4//+q5f//////gQAAAAAAAAAAAAAAAAAAABn5+fn/IiIiNAAAABc4ODgm8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/5+fn/83Nzf/v7+//7+/v/9PT0//Nzc3/7u7u/+7u7v/S0tL//Pz8/8CXZP+reTz/pnc9/6J1Pf+dcz7//////2Hs//9c6f//WOX//1Ti//9Q3///S9v//0fY//9D1f//PtH//zrO//82y///Mcf//y3D//8pwP//Jbz//yC5//9PyP//////zgAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXKysqO8/Pz/8rKyv/y8vL/8vLy//Ly8v/x8fH/8PDw/9/f3//w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//S0tL//v7+/7WBQf+uezv/qnk8/6V3Pf+hdD7//////3Pv//9g6///XOj//1fl//9T4f//T97//0rb//9G1///QtT//z7R//85zf//Ncr//zHH//8swv//KL///yS8//8ou///////9wAAAAAAAAAAAAAAAAAAABn6+vr/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/v7+///////7d/Of+yfDr/rno7/6l4PP+ldj3/9fDq/9f6//9z7///X+v//1vn//9X5P//UuH//07d//9K2v//Rdf//0HT//890P//OM3//zTJ//8wxf//LML//ye///8ju////////wAAAAAAAAAAAAAAAAAAABn6+vr/zMzMjDU1NSLZ2dmE9PT0/8vLy//09PT/5+fn//Pz8//m5ub/8/Pz//Ly8v/n5+f/3Nzc/+Tk5P/k5OT/5ubm/+Pj4//U1NT//////7qAOf+2fjn/sXw6/616O/+oeDz/vJlv//Tv6f/////////////////////////////////////////////////p+v//bdv//zjM//8zyf//L8X//yvB//8nvv///////wAAAAAAAAAAAAAAAAAAABn7+/v/IiIiNAAAABc6Ojom9fX1//X19f/19fX/19fX//Pz8//U1NT/8vLy//Pz8//m5ub/0dHR/8/Pz//MzMz/0NDQ/87Ozv/V1dX//////76COP+5gDn/tX46/7B8O/+sejv/p3c8/6N1Pf+ecz7/mnE//5VvQP+RbUH/jGtC/4hpQ/+DZ0P/f2RE/4t1Wv/e19D/6fr//zvP//83zP//M8j//y7E//8qwf///////wAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXMzMyO9fX1/8zMzP/19fX/1dXV//Ly8v/Kysr/5ubm//T09P/n5+f/4ODg/+Xl5f/k5OT/5OTk/+rq6v/U1NT//v7+/8OIPv+9gjj/uIA5/7R9Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xqQv+HaEP/g2ZE/35kRf+LdVr//////z/S//86zv//Nsv//zLI//81xf//////9wAAAAAAAAAAAAAAAAAAABn8/Pz/+Pj4//f39//39/f/qKio/6urq//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL//f39/9CeYf/Bgzf/vIE4/7h/Of+zfTr/r3s7/6p5PP+mdz3/oXU+/51yPv+YcD//lG5A/49sQf+LakL/hmhD/4JmRP99ZEX//////0LU//8+0f//Os7//zXK//9e0///////zgAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLc3NyE+Pj4/4aGhv+srKz/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//T09P/z8/P/+Pj4/+jRs//ChDf/wIM3/7uBOP+3fzn/sn06/657O/+peDz/pXY9/6B0Pv+ccj//l3BA/5NuQP+ObEH/impC/4VnQ/+BZUT//////0bX//9B1P//PdD//znN//+z6///////gQAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+Pj4//X19f+IiIj/rKys//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//39/P/hwZr/xYxD/7+DOP+7gDn/tn45/7J8Ov+tejv/qHg8/6R2Pf+gdD7/m3I//5dwQP+SbUH/jmtB/4lpQv+FZ0P//////0na//9F1v//TNb//53n///+///LAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/ycnJkVFRUUpubm7K9/f3/87Ozv/MzMz/fn5+/6ysrP/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//X19f/7+/v//v7+////////////////////////////////////////////18Su/5pxP/+Wb0D/kW1B/41rQv+IaUP/////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/8/Pz/0hISP8iIiL/qamp//r6+v/s7Oz/iYmJ/3Z2dv+srKz/+Pj4//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//////7mAOf+0fjr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+Ma0L//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/kJCQwTo6Ov8nJyf/X19f/6Wlpf/5+fn/c3Nz/3R0dP+MjIz/qKio/93d3f/l5eX/6enp//j4+P/39/f/9/f3//f39//29vb/9fX1/9zc3P/m5ub/6+vr/97e3v/a2tr//////7yBOP/PpnX//Pr3/8ejdv+qeTz/pnc9/6J1Pf+dcz7/mXA//5RuQP+QbEH//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLwPODg4VAAAABn+/v7/LS0tNmZmZm5kZGTrJSUl/yIiIv+ioqL/T09P/1NTU/+NjY3/lpaW/5SUlP/a2tr/wsLC//b2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JkQAAAAxAAAAIv7+/u9n5P//TNz//0bX//9A0///O87//zXK///U8///z/H//z/E///////uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcDAwKPm5ub46Ojo/+fn5//l5eX/5ubm/+bm5v/k5OT/5OTk/97e3v/i4uL+4uLi89jY2NPQ0NC6/////1bk//9R4P//S9v//0XX//8/0v//Oc3//9X0///Q8v//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8/Pz/4KCgmGUlJRW6Ojo/8LCwv/Kysr/z8/P/83Nzf/c3Nz/0dHR/8nJyf/FxcX/ysrK/8nJyf//////W+j//1Xj//9Q3///Str//0TW//8+0f//OM3//zLI//8tw////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/09PT/dXV1bnt7e2rq6ur/zs7O/9LS0v/c3Nz/1dXV/+fn5//e3t7/4uLi//39/f////////////////9g6///Wuf//1Ti//9P3v//tPD////////////////////////////////////////////v////gQAAAAAAAAAAAAAAH/T09P/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo//Dw8P/t5dr/p4NW/5VvQP+ObEH//////2Lt//9f6v//Web//1Pi//9N3f//R9j//0LU//88z///Nsv//zDF//8rwf//Jbz//zzB///V8v//////gQAAAAAAAAAf9fX1/4SEhGGXl5dW7Ozs/+zs7P/r6+v/5ubm/8PDw//q6ur/+vr6/7uZbf+gdD7/mnE//5NuQP//////Yu3//2Lt//9e6v//WOX//1Lh//9M3P//Rtj//0HT//87z///Ncr//y/F//8pwP//JLz//1nL///////IAAAAAAAAAB/29vb/d3d3bn19fWrt7e3/7e3t/+zs7P/r6+v/1tbW/+vr6//+/v7/rn5D/6V2Pf+ecz7/mHA///////9i7f//Yu3//2Hs//9d6f//V+T//1Hg//9L2///Rdf//0DS//86zv//NMn//y7E//8ov///K73///////YAAAAAAAAAH/f39//w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs//////+wezv/qXg8/6N2Pf+dcz7/9O/q/4Hx//9i7f//Yu3//2Hs//9b6P//VuP//1Df//9K2v//RNb//z/R//85zf//M8j//y3D//8nvv///////wAAAAAAAAAf9/f3/4aGhmGZmZlW8PDw/+/v7//v7+//7e3t/8nJyf/t7e3//////7V+Ov+uezv/qHg8/6J1Pf+2l3D/9O/p///////////////////////////////////////q+v//ct///z3R//83zP//Msj//yzC////////AAAAAAAAAB/4+Pj/eXl5bn9/f2rx8fH/8fHx//Dw8P/v7+//3d3d/+7u7v//////uYA5/7N9Ov+tejv/p3c8/6F1Pv+bcj//lW9A/49sQf+JaUL/g2ZE/31kRf98Y0X/fGNF/5aCaf/q+v//QtT//zzQ//82y///Mcf///////8AAAAAAAAAH/j4+P/z8/P/8/Pz//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//7+/v/Bhz//uH85/7J9Ov+sejv/pnc9/6B0Pv+acT//lG5A/45rQf+IaUP/gmZE/31jRf98Y0X/fWRG//////9H2P//QdP//zvP//89zP//////9gAAAAAAAAAf+fn5/4mJiWGcnJxW9PT0/+Hh4f/j4+P/7u7u//Ly8v/d3d3/8vLy/9Kjaf+9gjj/t385/7F8Ov+reTz/pXY9/59zPv+ZcT//k25A/41rQv+HaEP/gGVE/3xjRf98Y0X//////0zc//9G1///QNP//23b///////IAAAAAAAAAB/6+vr/enp6boGBgWr19fX/3Nzc/+Dg4P/a2tr/8/Pz/97e3v/x8fH/9OjZ/8qTUP+8gTj/tn45/7B7O/+qeTz/pHY9/55zPv+YcD//km1B/4tqQv+FZ0P/f2VE/3xjRf//////UN///0rb//9c2///3Pf//////4EAAAAAAAAAH/v7+//39/f/9vb2/9fX1//29vb/9fX1//X19f/09PT/9PT0//Pz8//5+fn//v7+///////////////////////////////////////Twq//kG1B/4pqQv+EZ0P/fmRF/////////////////////+////+BAAAAAAAAAAAAAAAf+/v7/4uLi2Genp5Wqamp/7W1tf/X19f/8vLy/8jIyP/U1NT/29vb//T09P/e3t7/6urq//Ly8v//////tH06/656O/+oeDz/onU9/5tyP/+Vb0D/j2xB/4lpQv+DZkT//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8/Pz/fHx8boeHh2339/f/j4+P/8PDw//o6Oj/5OTk/+fn5//u7u7/9fX1//Dw8P/y8vL/9PT0//////+5gDn/7uLU/+3i1v+ndz3/oHQ+/5pxP/+UbkD/jmxB/4hpQ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/39/f+kpKT/SkpK//n5+f/Gxsb/f39//9bW1v/4+Pj/9/f3//f39//29vb/9vb2//X19f/19fX//v7+/8WRUP/w5NT/7+PW/6t5PP+ldj3/n3Q+/5lxP/+TbkD/m35Z/////+4AAAAAAAAAAAAAAAAAAAAAAAAAANbW1gIAAAAf/f39/1ZWVuE/Pz//d3d3/6urq/9paWn/ioqK/8DAwP/5+fn/7+/v/93d3f/39/f/8PDw/9fX1//k5OT/8+ja/86ha/+5g0H/sHw7/6p5PP+kdj3/onlG/7KVcP/r5Nz/////gQAAAAAAAAAAAAAAAAAAAAAAAAAAPj4+M0BAQHn+/v7/fn5+b2JiYscwMDD/a2tr/0BAQP+Ojo7/tra2//r6+v/4+Pj/9PT0//j4+P/y8vL/4uLi/97e3v/29vb//f39///////////////////////+/v7/8vLy0vv7+4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tVZycnP/Q0ND/1dXV/4CAgP88PDz/JiYm/1tbW//v7+//+/v7//r6+v/6+vr/+vr6//n5+f/4+Pj/+Pj4//f39//39/f/9vb2//T09P/s7Oz/4+Pj/9jY2P8AAAA2AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf0NDQ/3V1depzc3P/V1dX/0lJSf8kJCT/JiYm/3Fxcf/d3d3/4ODg/+vr6//j4+P/9vb2//X19f/s7Oz/8fHx//X19f/19fX/7e3t/GxsbGd8fHxzysrK/gAAADQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+/v7/YmJikGhoaMaRkZH/mJiY/1VVVf8wMDD/UVFR/319ff/x8fH/5ubm/+Li4v/29vb/9vb2/9HR0f/Pz8//0dHR/8/Pz//Jycn6LS0te2JiYp/MzMztAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/39/f/8/Pz/z8/P/8rKyv/7+/v/vLy8/2lpaf9MTEz/QkJC/6SkpP/+/v7//f39//39/f/5+fn/1NTU//z8/P/29vb/7Ozs/+Hh4f/a2tr/5ubm/7+/v48AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/4yMjGGhoaFW+/v7//z8/P/6+vr/vLy8/2dnZ/8rKyv/Tk5O/8rKyv/+/v7//v7+//z8/P/X19f/+vr6/9XV1f/Dw8P/6Ojo/8fHx/+ysrKhAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/7+/v/fHx8boODg2r6+vr/39/f/+3t7f/u7u7/urq6/11dXf90dHT/a2tr//v7+////////f39/9XV1f/x8fH/wsLC/7m5uf/l5eX/oaGhnAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/v7+//4+Pj/+Pj4//n5+f/5+fn/+vr6//r6+v/7+/v/3Nzc/3Jycv93d3f/s7Oz//z8/P/19fX/z8/P/+bm5v/o6Oj/6urq/9PT06YAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+vr6/4qKimGenp5W+Pj4//j4+P/5+fn/+fn5//r6+v/p6en/6Ojo/7Gxsf+dnZ3/y8vL/9bW1v+7u7v/4uLi/+rq6v/T09OmAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/5+fn/enp6boGBgWr29vb/3Nzc/+rq6v/q6ur/3d3d/+Pj4//09PT/6Ojo/+Hh4f+oqKj/zMzM/7e3t//v7+//09PTpgAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/r6+v/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//39/f/8vLy/+Xl5f+wsLD/19fX7cvLy4kAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/B+AP+ABAB+AAAAfgAAAH4AAAB+AAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAB+AAAAfgAAAHwAAAB8AAAA/gAAAP4AAAD+AAAB/gAAAf4AAAP+AAAH/gAAD/4AAB/+AAA//gAAf/4AAP/8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2dnUOfn5+0oqKi9qSkpO6lpaWSpqamDgAAAAAAAAAAAAAAAKysrO+rq6tvqqqqDgAAAAClpaUEo6OjSaCgoL6tra3/5eXl//39/f//////+/v7//Hx8dYAAAAAAAAAAAAAAACvr6//wcHB/66urvuqqqrgqKio9LOzs//Nzc3/9vb2/67x//9T2///PdD//z/L//+b4v//////twAAAAAAAAAAs7Oz/9zc3P/z8/P/5OTk/+fn5//p6en/6Ojo//7+/v9f6f//UeD//0bX///S9P//NMf///////YAAAAAAAAAALa2tv/Nzc3/4uLi/+3t7f/t7e3/+fn5//7+/v//////Ye3//1rn//+38v//////////////////////9f///7a5ubn/3d3d//b29v/w8PD/+vr6/9C8pP+Rb0X//////2Pt//9h7P//WOX//03d//9C1P//N8z//zDD//+Z4P//vb29/87Ozv/k5OT/8vLy//7+/v+pfkn/mXE///Pv6v+b9P//Y+3//2Dr//9W4///S9v//0DS//81yv//OMX//8DAwP/Gxsb/7e3t//X19f//////rXo7/6J1Pf+zlXH/8+/q/////////////////+v7//924v//PtH//zPI//+zs7P/ra2t/6SkpP/v7+///////7uGRf+reTz/oHQ+/5Ru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mD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AEEASQBOACAAZQByAHIAbwByAA0ACgAAAAAAUgA2ADAAMwAzAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAHUAcwBlACAATQBTAEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAAAAAAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAAAAAAAAAAAAAFIANgAwADEAMAANAAoALQAgAGEAYgBvAHIAdAAoACkAIABoAGEAcwAgAGIAZQBlAG4AIABjAGEAbABsAGUAZAANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAAAAAAAAAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAAAAAAAAAAAAUgA2ADAAMAAyAA0ACgAtACAAZgBsAG8AYQB0AGkAbgBnACAAcABvAGkAbgB0ACAAcwB1AHAAcABvAHIAdAAgAG4AbwB0ACAAbABvAGEAZABlAGQADQAKAAAAAAAAAAAAAgAAAAAAAAAA7ABAAQAAAAgAAAAAAAAAoOsAQAEAAAAJAAAAAAAAAEDrAEABAAAACgAAAAAAAADw6gBAAQAAABAAAAAAAAAAkOoAQAEAAAARAAAAAAAAADDqAEABAAAAEgAAAAAAAADg6QBAAQAAABMAAAAAAAAAgOkAQAEAAAAYAAAAAAAAABDpAEABAAAAGQAAAAAAAADA6ABAAQAAABoAAAAAAAAAUOgAQAEAAAAbAAAAAAAAAODnAEABAAAAHAAAAAAAAACQ5wBAAQAAAB4AAAAAAAAASOcAQAEAAAAfAAAAAAAAAIDmAEABAAAAIAAAAAAAAAAQ5gBAAQAAACEAAAAAAAAAIOQAQAEAAAB4AAAAAAAAAADkAEABAAAAeQAAAAAAAADg4wBAAQAAAHoAAAAAAAAAwOMAQAEAAAD8AAAAAAAAALjjAEABAAAA/wAAAAAAAACY4wBAAQAAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAAAAAAAuAC4ALgAAADwAcAByAG8AZwByAGEAbQAgAG4AYQBtAGUAIAB1AG4AawBuAG8AdwBuAD4AAAAAAFIAdQBuAHQAaQBtAGUAIABFAHIAcgBvAHIAIQAKAAoAUAByAG8AZwByAGEAbQA6ACAAAAAAAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABo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IiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwBDAE8ATgBPAFUAVAAkAAAARmF0YWwgZXJyb3IgaW4gbGF1bmNoZXI6ICVzCgAAAAByAGIAAAAAAEZhaWxlZCB0byBvcGVuIGV4ZWN1dGFibGUAAAAAAAAAVW5hYmxlIHRvIGZpbmQgYW4gYXBwZW5kZWQgYXJjaGl2ZS4AAAAAAFVuYWJsZSB0byByZWFkIGZyb20gZmlsZQAAAAAjIQAAAAAAAAAAAABKb2IgaW5mb3JtYXRpb24gcXVlcnlpbmcgZmFpbGVkAEpvYiBpbmZvcm1hdGlvbiBzZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycAAAAAAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAAAAAAAuAGUAeABlAAAAAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUAAAAAAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUgdXNpbmcgVVRGLTgAAAAAAEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0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AAAAbhMBAAAAAACEEwEAAAAAAJATAQAAAAAAqhMBAAAAAAC6EwEAAAAAANATAQAAAAAA6hMBAAAAAAD4EwEAAAAAAAgUAQAAAAAAFhQBAAAAAAAmFAEAAAAAADgUAQAAAAAATBQBAAAAAABYFAEAAAAAAGIUAQAAAAAAbhQBAAAAAACAFAEAAAAAAJAUAQAAAAAAoBQBAAAAAACyFAEAAAAAAL4UAQAAAAAAzhQBAAAAAAAAAAAAAAAAAIYQAQAAAAAAAAAAAAAAAAAfAUV4aXRQcm9jZXNzAI0BR2V0Q29tbWFuZExpbmVXAH4EU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAqABDcmVhdGVQcm9jZXNzVwAAxgFHZXRDdXJyZW50UHJvY2VzcwAIBVdhaXRGb3JTaW5nbGVPYmplY3QAbQFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADmAUdldEV4aXRDb2RlUHJvY2VzcwAAGgJHZXRNb2R1bGVGaWxlTmFtZVcAAKcDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABpA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABrAkdldFN0ZEhhbmRsZQAACAJHZXRMYXN0RXJyb3IAADsEU2V0Q29uc29sZUN0cmxIYW5kbGVyAOwARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbADXAkhlYXBGcmVlAADTAkhlYXBBbGxvYwDyAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA7A0xlYXZlQ3JpdGljYWxTZWN0aW9uAABwAkdldFN0cmluZ1R5cGVXAACMAUdldENvbW1hbmRMaW5lQQDOBFRlcm1pbmF0ZVByb2Nlc3MAAOIEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAACzBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgACA0lzRGVidWdnZXJQcmVzZW50ACYEUnRsVmlydHVhbFVud2luZAAAHwRSdGxMb29rdXBGdW5jdGlvbkVudHJ5AAAYBFJ0bENhcHR1cmVDb250ZXh0ACUEUnRsVW53aW5kRXgA6wJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AO4ARW5jb2RlUG9pbnRlcgDLAERlY29kZVBvaW50ZXIA2wJIZWFwU2V0SW5mb3JtYXRpb24AAKoCR2V0VmVyc2lvbgAA1QJIZWFwQ3JlYXRlAABMAkdldFByb2NBZGRyZXNzAAAeAkdldE1vZHVsZUhhbmRsZVcAADQFV3JpdGVGaWxlAHwEU2V0SGFuZGxlQ291bnQAAPoBR2V0RmlsZVR5cGUAagJHZXRTdGFydHVwSW5mb1cA0gBEZWxldGVDcml0aWNhbFNlY3Rpb24AwARTbGVlcADDA1JlYWRGaWxlAAB0BFNldEZpbGVQb2ludGVyAAAZAkdldE1vZHVsZUZpbGVOYW1lQQAAZwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwAgBVdpZGVDaGFyVG9NdWx0aUJ5dGUA4QFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAABaAUZsc0dldFZhbHVlAFsBRmxzU2V0VmFsdWUAWQFGbHNGcmVlAIAEU2V0TGFzdEVycm9yAADLAUdldEN1cnJlbnRUaHJlYWRJZAAAWAFGbHNBbGxvYwAAqQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCaAkdldFRpY2tDb3VudAAAxwFHZXRDdXJyZW50UHJvY2Vzc0lkAIACR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAjwBDcmVhdGVGaWxlVwBBA0xvYWRMaWJyYXJ5VwAA2gJIZWFwUmVBbGxvYwCgAUdldENvbnNvbGVDUAAAsgFHZXRDb25zb2xlTW9kZQAAXQFGbHVzaEZpbGVCdWZmZXJzAAB4AUdldENQSW5mbwBuAUdldEFDUAAAPgJHZXRPRU1DUAAADANJc1ZhbGlkQ29kZVBhZ2UAlARTZXRTdGRIYW5kbGUAAGEEU2V0RW5kT2ZGaWxlAABRAkdldFByb2Nlc3NIZWFwAADcAkhlYXBTaXplAAAzBVdyaXRlQ29uc29sZVcALwNMQ01hcFN0cmluZ1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEgBQAEAAAAAAAAAAAAAAIBIAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAyot8tmSsAAM1dINJm1P//AAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAP//////////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgMDAwMDAwMDAAAAAAAAAACY7gBAAQAAAIjuAEABAAAAAPAAQAEAAAAC8gBAAQAAAP////8AAAAAAAAAAAAAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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19cA/v7+AP///wAAAACAAIAAAAD////wAAAAAAwAj8yADAAPx3d3zwAAAAwAz//v/IAM/Hd3fHzwAAAA7//M/M//zPd3d8/H8AAACPzP/+/////3d3d3d/AAAAjoz8zMzP//93d3/////wAI////7//8Zvd3d3d3d3zwCOzP/8z/xmb3d3d3d3d3zwj4z//v/2Zm/Hd3d3d3d38I////zM9mZs/Hd3d3d3d/CPzP/+//ZmZs/////Hd3fwjoz8z8z2ZmZmZmZs/Hd38I////7/9mZmZmZmZs93d/CPzPzMzPxmZmZmZmZvd3zwj4z9/v//xmZmZmZmb3fPAI//+Lz8z//////GZm//8ACPzP+d/////2ZmZmZvAAAAjogvyKzPzM9s/GZmbwAAAI/lJcSd////xsZmZs8AAABbzJFCmczM//xmZmzwAAAAjYrYET7/////////gAAAAI/YUyEUzMz8zP/4zwAAAACPypmjE47///////8AAAAAj4zc+kIqzM+AAAAAgAAAAI////7EE8//j///gMAAAACPzPzM6jVMz4/M+AwAAAAAj4z////VW/+Pz4DAAAAAAI///MzMzpnPj/gMAAAAAACPzP/////+zo+AwAAAAAAAj4z8zMzMzM2IDAAAAAAAAI//////////gMAAAAAAAACIiIiIiIiIiIwAAAAAAAAPwfwH/gA4A/gAAAH4AAAB+AAAAfgAAAA4AAAAGAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAAOAAAAfgAAAH4AAAB+AAAA/gAAAP4AAAD+AAAA/gAAAP4AAAD+AAAB/gAAA/4AAAf+AAAP/gAAH/4AAD/+AAB//KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQATU1NAFNTUwB6enoAgAAAAACAgACAgIAAkJCQAKqqqgC0tLQAwMDAANbW1gDl5eUA/v7+AP///wBwAAALALAAAHCwtwf///AAe3B7/7ZmvwB/v++/ZmtvAH/v//9mv///f7/rX2ZmZmt/7vVftmZmZn+e5Vv///tmfcnlVVVVv2ZMNKtVVVVfa0pxT///tV//foknv1tVXwB//6O/tVW/AH+/uY7///AAf///7ff3sAB3d3d3d3sAAH4fH/8QBx//AAMf/wADH/8A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////VuT//1Lh//9O3f//Sdr//0XX//+w7f/////////////////////////////////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/+/v7/9G5nf+lfEr/mnE//5ZvQP//////Wub//1Xj//9R4P//Td3//0nZ//9E1v//QNP//zzP//83zP//M8n//y/E//8rwf//Jr7//yK6//8tvP//jtz///7//8wAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/JycmMNDQ0ItbW1oTx8fH/yMjI//Hx8f/w8PD/8PDw//Dw8P/p6en/19fX/+/v7//u7u7/7u7u/+7u7v/u7u7/7e3t/9LS0v/r6+v/38y0/6d3PP+jdT3/nnM+/5pxP///////Xen//1nm//9V4///UN///0zc//9I2f//Q9X//z/S//87z///N8v//zLI//8uxP//KsD//yW9//8huv//H7j//6rl//////+BAAAAAAAAAAAAAAAAAAAAGfn5+f8iIiI0AAAAFzg4OCby8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/n5+f/zc3N/+/v7//v7+//09PT/83Nzf/u7u7/7u7u/9LS0v/8/Pz/wJdk/6t5PP+mdz3/onU9/51zPv//////Yez//1zp//9Y5f//VOL//1Df//9L2///R9j//0PV//8+0f//Os7//zbL//8xx///LcP//ynA//8lvP//ILn//0/I///////OAAAAAAAAAAAAAAAAAAAAGfn5+f/Dw8ORJSUlNcrKyo7z8/P/ysrK//Ly8v/y8vL/8vLy//Hx8f/w8PD/39/f//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/9LS0v/+/v7/tYFB/657O/+qeTz/pXc9/6F0Pv//////c+///2Dr//9c6P//V+X//1Ph//9P3v//Stv//0bX//9C1P//PtH//znN//81yv//Mcf//yzC//8ov///JLz//yi7///////3AAAAAAAAAAAAAAAAAAAAGfr6+v/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v7///////t385/7J8Ov+uejv/qXg8/6V2Pf/18Or/1/r//3Pv//9f6///W+f//1fk//9S4f//Tt3//0ra//9F1///QdP//z3Q//84zf//NMn//zDF//8swv//J7///yO7////////AAAAAAAAAAAAAAAAAAAAGfr6+v/MzMyMNTU1ItnZ2YT09PT/y8vL//T09P/n5+f/8/Pz/+bm5v/z8/P/8vLy/+fn5//c3Nz/5OTk/+Tk5P/m5ub/4+Pj/9TU1P//////uoA5/7Z+Of+xfDr/rXo7/6h4PP+8mW//9O/p/////////////////////////////////////////////////+n6//9t2///OMz//zPJ//8vxf//K8H//ye+////////AAAAAAAAAAAAAAAAAAAAGfv7+/8iIiI0AAAAFzo6Oib19fX/9fX1//X19f/X19f/8/Pz/9TU1P/y8vL/8/Pz/+bm5v/R0dH/z8/P/8zMzP/Q0ND/zs7O/9XV1f//////voI4/7mAOf+1fjr/sHw7/6x6O/+ndzz/o3U9/55zPv+acT//lW9A/5FtQf+Ma0L/iGlD/4NnQ/9/ZET/i3Va/97X0P/p+v//O8///zfM//8zyP//LsT//yrB////////AAAAAAAAAAAAAAAAAAAAGfv7+//Hx8eRJSUlNczMzI719fX/zMzM//X19f/V1dX/8vLy/8rKyv/m5ub/9PT0/+fn5//g4OD/5eXl/+Tk5P/k5OT/6urq/9TU1P/+/v7/w4g+/72COP+4gDn/tH06/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGpC/4doQ/+DZkT/fmRF/4t1Wv//////P9L//zrO//82y///Msj//zXF///////3AAAAAAAAAAAAAAAAAAAAGfz8/P/4+Pj/9/f3//f39/+oqKj/q6ur//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/9/f3/0J5h/8GDN/+8gTj/uH85/7N9Ov+vezv/qnk8/6Z3Pf+hdT7/nXI+/5hwP/+UbkD/j2xB/4tqQv+GaEP/gmZE/31kRf//////QtT//z7R//86zv//Ncr//17T///////OAAAAAAAAAAAAAAAAAAAAGfz8/P/Pz8+MNTU1Itzc3IT4+Pj/hoaG/6ysrP/39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/9PT0//Pz8//4+Pj/6NGz/8KEN//Agzf/u4E4/7d/Of+yfTr/rns7/6l4PP+ldj3/oHQ+/5xyP/+XcED/k25A/45sQf+KakL/hWdD/4FlRP//////Rtf//0HU//890P//Oc3//7Pr//////+BAAAAAAAAAAAAAAAAAAAAGfz8/P8iIiI0AAAAFzs7Oyb4+Pj/9fX1/4iIiP+srKz/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//f38/+HBmv/FjEP/v4M4/7uAOf+2fjn/snw6/616O/+oeDz/pHY9/6B0Pv+bcj//l3BA/5JtQf+Oa0H/iWlC/4VnQ///////Sdr//0XW//9M1v//nef///7//8sAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/JycmRUVFRSm5ubsr39/f/zs7O/8zMzP9+fn7/rKys//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9fX1//v7+//+/v7////////////////////////////////////////////XxK7/mnE//5ZvQP+RbUH/jWtC/4hpQ//////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/z8/P/SEhI/yIiIv+pqan/+vr6/+zs7P+JiYn/dnZ2/6ysrP/4+Pj/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P//////uYA5/7R+Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xrQv//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v+QkJDBOjo6/ycnJ/9fX1//paWl//n5+f9zc3P/dHR0/4yMjP+oqKj/3d3d/+Xl5f/p6en/+Pj4//f39//39/f/9/f3//b29v/19fX/3Nzc/+bm5v/r6+v/3t7e/9ra2v//////vIE4/8+mdf/8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AAAkAAAAFQAAAAoAAAACAAAAAP///4Hd+P//duL//0jW//88z///Nsv//zDF//8yw///XM7//9by//////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwFBQU3gYGBcenp6fjm5ub/4eHh9dbW1unb29vs3Nzc2rS0tKJ2dnZqJiYmRAAAADEAAAAi/v7+72fk//9M3P//Rtf//0DT//87zv//Ncr//9Tz///P8f//P8T//////+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwMDAo+bm5vjo6Oj/5+fn/+Xl5f/m5ub/5ubm/+Tk5P/k5OT/3t7e/+Li4v7i4uLz2NjY09DQ0Lr/////VuT//1Hg//9L2///Rdf//z/S//85zf//1fT//9Dy//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/z8/P/goKCYZSUlFbo6Oj/wsLC/8rKyv/Pz8//zc3N/9zc3P/R0dH/ycnJ/8XFxf/Kysr/ycnJ//////9b6P//VeP//1Df//9K2v//RNb//z7R//84zf//Msj//y3D////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/T09P91dXVue3t7aurq6v/Ozs7/0tLS/9zc3P/V1dX/5+fn/97e3v/i4uL//f39/////////////////2Dr//9a5///VOL//0/e//+08P///////////////////////////////////////////+////+BAAAAAAAAAAAAAAAf9PT0/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/8PDw/+3l2v+ng1b/lW9A/45sQf//////Yu3//1/q//9Z5v//U+L//03d//9H2P//QtT//zzP//82y///MMX//yvB//8lvP//PMH//9Xy//////+BAAAAAAAAAB/19fX/hISEYZeXl1bs7Oz/7Ozs/+vr6//m5ub/w8PD/+rq6v/6+vr/u5lt/6B0Pv+acT//k25A//////9i7f//Yu3//17q//9Y5f//UuH//0zc//9G2P//QdP//zvP//81yv//L8X//ynA//8kvP//Wcv//////8gAAAAAAAAAH/b29v93d3dufX19au3t7f/t7e3/7Ozs/+vr6//W1tb/6+vr//7+/v+ufkP/pXY9/55zPv+YcD///////2Lt//9i7f//Yez//13p//9X5P//UeD//0vb//9F1///QNL//zrO//80yf//LsT//yi///8rvf//////9gAAAAAAAAAf9/f3//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz//////7B7O/+peDz/o3Y9/51zPv/07+r/gfH//2Lt//9i7f//Yez//1vo//9W4///UN///0ra//9E1v//P9H//znN//8zyP//LcP//ye+////////AAAAAAAAAB/39/f/hoaGYZmZmVbw8PD/7+/v/+/v7//t7e3/ycnJ/+3t7f//////tX46/657O/+oeDz/onU9/7aXcP/07+n//////////////////////////////////////+r6//9y3///PdH//zfM//8yyP//LML///////8AAAAAAAAAH/j4+P95eXluf39/avHx8f/x8fH/8PDw/+/v7//d3d3/7u7u//////+5gDn/s306/616O/+ndzz/oXU+/5tyP/+Vb0D/j2xB/4lpQv+DZkT/fWRF/3xjRf98Y0X/loJp/+r6//9C1P//PND//zbL//8xx////////wAAAAAAAAAf+Pj4//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD//v7+/8GHP/+4fzn/sn06/6x6O/+mdz3/oHQ+/5pxP/+UbkD/jmtB/4hpQ/+CZkT/fWNF/3xjRf99ZEb//////0fY//9B0///O8///z3M///////2AAAAAAAAAB/5+fn/iYmJYZycnFb09PT/4eHh/+Pj4//u7u7/8vLy/93d3f/y8vL/0qNp/72COP+3fzn/sXw6/6t5PP+ldj3/n3M+/5lxP/+TbkD/jWtC/4doQ/+AZUT/fGNF/3xjRf//////TNz//0bX//9A0///bdv//////8gAAAAAAAAAH/r6+v96enpugYGBavX19f/c3Nz/4ODg/9ra2v/z8/P/3t7e//Hx8f/06Nn/ypNQ/7yBOP+2fjn/sHs7/6p5PP+kdj3/nnM+/5hwP/+SbUH/i2pC/4VnQ/9/ZUT/fGNF//////9Q3///Stv//1zb///c9///////gQAAAAAAAAAf+/v7//f39//29vb/19fX//b29v/19fX/9fX1//T09P/09PT/8/Pz//n5+f/+/v7//////////////////////////////////////9PCr/+QbUH/impC/4RnQ/9+ZEX/////////////////////7////4EAAAAAAAAAAAAAAB/7+/v/i4uLYZ6enlapqan/tbW1/9fX1//y8vL/yMjI/9TU1P/b29v/9PT0/97e3v/q6ur/8vLy//////+0fTr/rno7/6h4PP+idT3/m3I//5VvQP+PbEH/iWlC/4NmRP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/z8/P98fHxuh4eHbff39/+Pj4//w8PD/+jo6P/k5OT/5+fn/+7u7v/19fX/8PDw//Ly8v/09PT//////7mAOf/u4tT/7eLW/6d3Pf+gdD7/mnE//5RuQP+ObEH/iGlD//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/f39/6SkpP9KSkr/+fn5/8bGxv9/f3//1tbW//j4+P/39/f/9/f3//b29v/29vb/9fX1//X19f/+/v7/xZFQ//Dk1P/v49b/q3k8/6V2Pf+fdD7/mXE//5NuQP+bfln/////7gAAAAAAAAAAAAAAAAAAAAAAAAAA1tbWAgAAAB/9/f3/VlZW4T8/P/93d3f/q6ur/2lpaf+Kior/wMDA//n5+f/v7+//3d3d//f39//w8PD/19fX/+Tk5P/z6Nr/zqFr/7mDQf+wfDv/qnk8/6R2Pf+ieUb/spVw/+vk3P////+BAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4zQEBAef7+/v9+fn5vYmJixzAwMP9ra2v/QEBA/46Ojv+2trb/+vr6//j4+P/09PT/+Pj4//Ly8v/i4uL/3t7e//b29v/9/f3///////////////////////7+/v/y8vLS+/v7gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS1VnJyc/9DQ0P/V1dX/gICA/zw8PP8mJib/W1tb/+/v7//7+/v/+vr6//r6+v/6+vr/+fn5//j4+P/4+Pj/9/f3//f39//29vb/9PT0/+zs7P/j4+P/2NjY/wAAADYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/Q0ND/dXV16nNzc/9XV1f/SUlJ/yQkJP8mJib/cXFx/93d3f/g4OD/6+vr/+Pj4//2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cT//8+/q/5v0//9j7f//YOv//1bj//9L2///QNL//zXK//84xf//wMDA/8bGxv/t7e3/9fX1//////+tejv/onU9/7OVcf/z7+r/////////////////6/v//3bi//8+0f//M8j//7Ozs/+tra3/pKSk/+/v7///////u4ZF/6t5PP+gdD7/lG5A/4lpQv9+ZEX/fWRG/6ycif/r+///R9j//0jS//+vr6//WVlZ/3V1df+xsbH/9vb2/+DEof+2gD3/qXg8/55zPv+SbUH/h2hD/31kRf99ZUf//////1Pf//+o7P//m5ub/39/f/80NDT/fHx8/9zc3P/9/f3//v7+/////////////////9DBsP+FZ0P/fWNF///////////1////tb29vf+hoaH/qKio/01NTf+Wlpb//v7+//39/f//////sX4+/+rg0/+ZcT//jmtB/4VpR//////0AAAAAAAAAADBwcH/z8/P/+Xl5f+5ubn/UlJS/8DAwP/4+Pj/+vr6/97Cov+ygkf/o3U9/514S//Kuqf/////tQAAAAAAAAAAvr6+/97e3v/39/f/+fn5/7u7u/+cnJz/7e3t/+Hh4f/+/v7//f39///////+/v7/7Ozs/wAAAAAAAAAAAAAAALu7u//Ozs7/5OTk//b29v/4+Pj/9/f3/9/f3//6+vr//Pz8/8jIyP/5+fn/zMzM/7+/v38AAAAAAAAAAAAAAAC3t7f/ubm5/7u7u/+9vb3/v7+//8HBwf/Dw8P/xcXF/8jIyP/Jycn/x8fH/8TExH8AAAAAAAAAAAAAAAAAAAAAfgesQRAHrEEAA6xBAAOsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAA6xBAAOsQQAHrEEAB6xBAA+sQQAAAQAHACAgEAABAAQA6AIAAAEAEBAQAAEABAAoAQAAAgAgIAAAAQAIAKgIAAADABAQAAABAAgAaAUAAAQAMDAAAAEAIACoJQAABQAgIAAAAQAgAKgQAAAGABAQAAABACAAaAQAAAcAPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPg0KICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+DQogICAgPHNlY3VyaXR5Pg0KICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPjwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+DQogICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgPC9zZWN1cml0eT4NCiAgPC90cnVzdEluZm8+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEAOAAAEQAAACgoqiisKK4otCi2KIgoyijaKx4rIismKyorLisyKzYrOis+KwIrRitKK04rUitWK1orXitiK2YraituK0AIAEAgAAAAACgEKDwqPioAKkIqSCpKKkwqTipQKlIqVCpWKlgqWipoK2wrriuwK7IrtCu2K7gruiu8K74rgCvCK8QrxivIK8orzCvOK9Ar0ivUK9Yr2CvaK9wr3ivgK+Ir5CvmK+gr6ivsK+4r8CvyK/Qr9iv4K/or/Cv+K8AAAAwAQCgAAAAAKAYoCCgKKAwoDigQKBIoFCgWKBgoGigcKB4oICgiKCQoJigoKCooLCguKDAoMig0KDYoOCg6KDwoPigAKEIoRChGKEgoSihMKE4oUChSKFQoVihYKFoodih+KEYojiiWKKYorCiuKLAosii0KLgoviiAKMIoxCjGKMgoyijMKM4o0CjSKNYo2CjaKNwo3ijgKOIo5CjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAN9gBJf/OAAD/zgAAKwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3V0aWwucHkjCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwppbXBvcnQgY29kZWNzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBjc3YKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYiBhcyBzdGRfaWdsb2IKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcHlfY29tcGlsZQppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc29ja2V0CnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBzc2wgPSBOb25lCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKaW1wb3J0IHRhcmZpbGUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAoKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCmltcG9ydCB0aW1lCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCAoc3RyaW5nX3R5cGVzLCB0ZXh0X3R5cGUsIHNodXRpbCwgcmF3X2lucHV0LCBTdHJpbmdJTywKICAgICAgICAgICAgICAgICAgICAgY2FjaGVfZnJvbV9zb3VyY2UsIHVybG9wZW4sIHVybGpvaW4sIGh0dHBsaWIsIHhtbHJwY2xpYiwKICAgICAgICAgICAgICAgICAgICAgc3BsaXR0eXBlLCBIVFRQSGFuZGxlciwgQmFzZUNvbmZpZ3VyYXRvciwgdmFsaWRfaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciwgY29uZmlncGFyc2VyLCBVUkxFcnJvciwgWmlwRmlsZSwgZnNkZWNvZGUsCiAgICAgICAgICAgICAgICAgICAgIHVucXVvdGUpCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMKIyBSZXF1aXJlbWVudCBwYXJzaW5nIGNvZGUgZm9yIG5hbWUgKyBvcHRpb25hbCBjb25zdHJhaW50cyArIG9wdGlvbmFsIGV4dHJhcwojCiMgZS5nLiAnZm9vID49IDEuMiwgPCAyLjAgW2JhciwgYmF6XScKIwojIFRoZSByZWdleCBjYW4gc2VlbSBhIGJpdCBoYWlyeSwgc28gd2UgYnVpbGQgaXQgdXAgb3V0IG9mIHNtYWxsZXIgcGllY2VzCiMgd2hpY2ggYXJlIG1hbmFnZWFibGUuCiMKCkNPTU1BID0gcidccyosXHMqJwpDT01NQV9SRSA9IHJlLmNvbXBpbGUoQ09NTUEpCgpJREVOVCA9IHInKFx3fFsuLV0pKycKRVhUUkFfSURFTlQgPSByJyhcKnw6KFwqfFx3Kyk6fCcgKyBJREVOVCArICcpJwpWRVJTUEVDID0gSURFTlQgKyByJ1wqPycKClJFTE9QID0gJyhbPD49IX5dPSl8Wzw+XScKCiMKIyBUaGUgZmlyc3QgcmVsb3AgaXMgb3B0aW9uYWwgLSBpZiBhYnNlbnQsIHdpbGwgYmUgdGFrZW4gYXMgJ349JwojCkJBUkVfQ09OU1RSQUlOVFMgPSAoJygnICsgUkVMT1AgKyByJyk/XHMqKCcgKyBWRVJTUEVDICsgJykoJyArIENPTU1BICsgJygnICsKICAgICAgICAgICAgICAgICAgICBSRUxPUCArIHInKVxzKignICsgVkVSU1BFQyArICcpKSonKQoKRElSRUNUX1JFRiA9ICcoZnJvbVxzKyg/UDxkaXJlZj4uKikpJwoKIwojIEVpdGhlciB0aGUgYmFyZSBjb25zdHJhaW50cyBvciB0aGUgYmFyZSBjb25zdHJhaW50cyBpbiBwYXJlbnRoZXNlcwojCkNPTlNUUkFJTlRTID0gKHInXChccyooP1A8YzE+JyArIEJBUkVfQ09OU1RSQUlOVFMgKyAnfCcgKyBESVJFQ1RfUkVGICsKICAgICAgICAgICAgICAgcicpXHMqXCl8KD9QPGMyPicgKyBCQVJFX0NPTlNUUkFJTlRTICsgJ1xzKiknKQoKRVhUUkFfTElTVCA9IEVYVFJBX0lERU5UICsgJygnICsgQ09NTUEgKyBFWFRSQV9JREVOVCArICcpKicKRVhUUkFTID0gcidcW1xzKig/UDxleD4nICsgRVhUUkFfTElTVCArIHInKT9ccypcXScKUkVRVUlSRU1FTlQgPSAoJyg/UDxkbj4nICArIElERU5UICsgcicpXHMqKCcgKyBFWFRSQVMgKyByJ1xzKik/KFxzKicgKwogICAgICAgICAgICAgICBDT05TVFJBSU5UUyArICcpPyQnKQpSRVFVSVJFTUVOVF9SRSA9IHJlLmNvbXBpbGUoUkVRVUlSRU1FTlQpCgojCiMgVXNlZCB0byBzY2FuIHRocm91Z2ggdGhlIGNvbnN0cmFpbnRzCiMKUkVMT1BfSURFTlQgPSAnKD9QPG9wPicgKyBSRUxPUCArIHInKVxzKig/UDx2bj4nICsgVkVSU1BFQyArICcpJwpSRUxPUF9JREVOVF9SRSA9IHJlLmNvbXBpbGUoUkVMT1BfSURFTlQpCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnQocyk6CgogICAgZGVmIGdldF9jb25zdHJhaW50KG0pOgogICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgcmV0dXJuIGRbJ29wJ10sIGRbJ3ZuJ10KCiAgICByZXN1bHQgPSBOb25lCiAgICBtID0gUkVRVUlSRU1FTlRfUkUubWF0Y2gocykKICAgIGlmIG06CiAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBuYW1lID0gZFsnZG4nXQogICAgICAgIGNvbnMgPSBkWydjMSddIG9yIGRbJ2MyJ10KICAgICAgICBpZiBub3QgZFsnZGlyZWYnXToKICAgICAgICAgICAgdXJsID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgZGlyZWN0IHJlZmVyZW5jZQogICAgICAgICAgICBjb25zID0gTm9uZQogICAgICAgICAgICB1cmwgPSBkWydkaXJlZiddLnN0cmlwKCkKICAgICAgICBpZiBub3QgY29uczoKICAgICAgICAgICAgY29ucyA9IE5vbmUKICAgICAgICAgICAgY29uc3RyID0gJycKICAgICAgICAgICAgcnMgPSBkWydkbiddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgY29uc1swXSBub3QgaW4gJzw+IT0nOgogICAgICAgICAgICAgICAgY29ucyA9ICd+PScgKyBjb25zCiAgICAgICAgICAgIGl0ZXJhdG9yID0gUkVMT1BfSURFTlRfUkUuZmluZGl0ZXIoY29ucykKICAgICAgICAgICAgY29ucyA9IFtnZXRfY29uc3RyYWludChtKSBmb3IgbSBpbiBpdGVyYXRvcl0KICAgICAgICAgICAgcnMgPSAnJXMgKCVzKScgJSAobmFtZSwgJywgJy5qb2luKFsnJXMgJXMnICUgY29uIGZvciBjb24gaW4gY29uc10pKQogICAgICAgIGlmIG5vdCBkWydleCddOgogICAgICAgICAgICBleHRyYXMgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXh0cmFzID0gQ09NTUFfUkUuc3BsaXQoZFsnZXgnXSkKICAgICAgICByZXN1bHQgPSBDb250YWluZXIobmFtZT1uYW1lLCBjb25zdHJhaW50cz1jb25zLCBleHRyYXM9ZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudD1ycywgc291cmNlPXMsIHVybD11cmwpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGdldF9yZXNvdXJjZXNfZGVzdHMocmVzb3VyY2VzX3Jvb3QsIHJ1bGVzKToKICAgICIiIkZpbmQgZGVzdGluYXRpb25zIGZvciByZXNvdXJjZXMgZmlsZXMiIiIKCiAgICBkZWYgZ2V0X3JlbF9wYXRoKGJhc2UsIHBhdGgpOgogICAgICAgICMgbm9ybWFsaXplcyBhbmQgcmV0dXJucyBhIGxzdHJpcHBlZC0vLXNlcGFyYXRlZCBwYXRoCiAgICAgICAgYmFzZSA9IGJhc2UucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKICAgICAgICBhc3NlcnQgcGF0aC5zdGFydHN3aXRoKGJhc2UpCiAgICAgICAgcmV0dXJuIHBhdGhbbGVuKGJhc2UpOl0ubHN0cmlwKCcvJykKCgogICAgZGVzdGluYXRpb25zID0ge30KICAgIGZvciBiYXNlLCBzdWZmaXgsIGRlc3QgaW4gcnVsZXM6CiAgICAgICAgcHJlZml4ID0gb3MucGF0aC5qb2luKHJlc291cmNlc19yb290LCBiYXNlKQogICAgICAgIGZvciBhYnNfYmFzZSBpbiBpZ2xvYihwcmVmaXgpOgogICAgICAgICAgICBhYnNfZ2xvYiA9IG9zLnBhdGguam9pbihhYnNfYmFzZSwgc3VmZml4KQogICAgICAgICAgICBmb3IgYWJzX3BhdGggaW4gaWdsb2IoYWJzX2dsb2IpOgogICAgICAgICAgICAgICAgcmVzb3VyY2VfZmlsZSA9IGdldF9yZWxfcGF0aChyZXNvdXJjZXNfcm9vdCwgYWJzX3BhdGgpCiAgICAgICAgICAgICAgICBpZiBkZXN0IGlzIE5vbmU6ICAjIHJlbW92ZSB0aGUgZW50cnkgaWYgaXQgd2FzIGhlcmUKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnMucG9wKHJlc291cmNlX2ZpbGUsIE5vbmUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gZ2V0X3JlbF9wYXRoKGFic19iYXNlLCBhYnNfcGF0aCkKICAgICAgICAgICAgICAgICAgICByZWxfZGVzdCA9IGRlc3QucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKS5yc3RyaXAoJy8nKQogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uc1tyZXNvdXJjZV9maWxlXSA9IHJlbF9kZXN0ICsgJy8nICsgcmVsX3BhdGgKICAgIHJldHVybiBkZXN0aW5hdGlvbnMKCgpkZWYgaW5fdmVudigpOgogICAgaWYgaGFzYXR0cihzeXMsICdyZWFsX3ByZWZpeCcpOgogICAgICAgICMgdmlydHVhbGVudiB2ZW52cwogICAgICAgIHJlc3VsdCA9IFRydWUKICAgIGVsc2U6CiAgICAgICAgIyBQRVAgNDA1IHZlbnZzCiAgICAgICAgcmVzdWx0ID0gc3lzLnByZWZpeCAhPSBnZXRhdHRyKHN5cywgJ2Jhc2VfcHJlZml4Jywgc3lzLnByZWZpeCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X2V4ZWN1dGFibGUoKToKIyBUaGUgX19QWVZFTlZfTEFVTkNIRVJfXyBkYW5jZSBpcyBhcHBhcmVudGx5IG5vIGxvbmdlciBuZWVkZWQsIGFzCiMgY2hhbmdlcyB0byB0aGUgc3R1YiBsYXVuY2hlciBtZWFuIHRoYXQgc3lzLmV4ZWN1dGFibGUgYWx3YXlzIHBvaW50cwojIHRvIHRoZSBzdHViIG9uIG1hY09TCiMgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAoJ19fUFlWRU5WX0xBVU5DSEVSX18nCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb3MuZW52aXJvbik6CiMgICAgICAgIHJlc3VsdCA9ICBvcy5lbnZpcm9uWydfX1BZVkVOVl9MQVVOQ0hFUl9fJ10KIyAgICBlbHNlOgojICAgICAgICByZXN1bHQgPSBzeXMuZXhlY3V0YWJsZQojICAgIHJldHVybiByZXN1bHQKICAgIHJlc3VsdCA9IG9zLnBhdGgubm9ybWNhc2Uoc3lzLmV4ZWN1dGFibGUpCiAgICBpZiBub3QgaXNpbnN0YW5jZShyZXN1bHQsIHRleHRfdHlwZSk6CiAgICAgICAgcmVzdWx0ID0gZnNkZWNvZGUocmVzdWx0KQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBwcm9jZWVkKHByb21wdCwgYWxsb3dlZF9jaGFycywgZXJyb3JfcHJvbXB0PU5vbmUsIGRlZmF1bHQ9Tm9uZSk6CiAgICBwID0gcHJvbXB0CiAgICB3aGlsZSBUcnVlOgogICAgICAgIHMgPSByYXdfaW5wdXQocCkKICAgICAgICBwID0gcHJvbXB0CiAgICAgICAgaWYgbm90IHMgYW5kIGRlZmF1bHQ6CiAgICAgICAgICAgIHMgPSBkZWZhdWx0CiAgICAgICAgaWYgczoKICAgICAgICAgICAgYyA9IHNbMF0ubG93ZXIoKQogICAgICAgICAgICBpZiBjIGluIGFsbG93ZWRfY2hhcnM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBlcnJvcl9wcm9tcHQ6CiAgICAgICAgICAgICAgICBwID0gJyVjOiAlc1xuJXMnICUgKGMsIGVycm9yX3Byb21wdCwgcHJvbXB0KQogICAgcmV0dXJuIGMKCgpkZWYgZXh0cmFjdF9ieV9rZXkoZCwga2V5cyk6CiAgICBpZiBpc2luc3RhbmNlKGtleXMsIHN0cmluZ190eXBlcyk6CiAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoKQogICAgcmVzdWx0ID0ge30KICAgIGZvciBrZXkgaW4ga2V5czoKICAgICAgICBpZiBrZXkgaW4gZDoKICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkW2tleV0KICAgIHJldHVybiByZXN1bHQKCmRlZiByZWFkX2V4cG9ydHMoc3RyZWFtKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKICAgICAgICAjIG5lZWRzIHRvIGJlIGEgdGV4dCBzdHJlYW0KICAgICAgICBzdHJlYW0gPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpKHN0cmVhbSkKICAgICMgVHJ5IHRvIGxvYWQgYXMgSlNPTiwgZmFsbGluZyBiYWNrIG9uIGxlZ2FjeSBmb3JtYXQKICAgIGRhdGEgPSBzdHJlYW0ucmVhZCgpCiAgICBzdHJlYW0gPSBTdHJpbmdJTyhkYXRhKQogICAgdHJ5OgogICAgICAgIGpkYXRhID0ganNvbi5sb2FkKHN0cmVhbSkKICAgICAgICByZXN1bHQgPSBqZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddWydleHBvcnRzJ10KICAgICAgICBmb3IgZ3JvdXAsIGVudHJpZXMgaW4gcmVzdWx0Lml0ZW1zKCk6CiAgICAgICAgICAgIGZvciBrLCB2IGluIGVudHJpZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHMgPSAnJXMgPSAlcycgJSAoaywgdikKICAgICAgICAgICAgICAgIGVudHJ5ID0gZ2V0X2V4cG9ydF9lbnRyeShzKQogICAgICAgICAgICAgICAgYXNzZXJ0IGVudHJ5IGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbnRyaWVzW2tdID0gZW50cnkKICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHN0cmVhbS5zZWVrKDAsIDApCgogICAgZGVmIHJlYWRfc3RyZWFtKGNwLCBzdHJlYW0pOgogICAgICAgIGlmIGhhc2F0dHIoY3AsICdyZWFkX2ZpbGUnKToKICAgICAgICAgICAgY3AucmVhZF9maWxlKHN0cmVhbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjcC5yZWFkZnAoc3RyZWFtKQoKICAgIGNwID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCiAgICB0cnk6CiAgICAgICAgcmVhZF9zdHJlYW0oY3AsIHN0cmVhbSkKICAgIGV4Y2VwdCBjb25maWdwYXJzZXIuTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcjoKICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgIGRhdGEgPSB0ZXh0d3JhcC5kZWRlbnQoZGF0YSkKICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTyhkYXRhKQogICAgICAgIHJlYWRfc3RyZWFtKGNwLCBzdHJlYW0pCgogICAgcmVzdWx0ID0ge30KICAgIGZvciBrZXkgaW4gY3Auc2VjdGlvbnMoKToKICAgICAgICByZXN1bHRba2V5XSA9IGVudHJpZXMgPSB7fQogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBjcC5pdGVtcyhrZXkpOgogICAgICAgICAgICBzID0gJyVzID0gJXMnICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICBlbnRyeSA9IGdldF9leHBvcnRfZW50cnkocykKICAgICAgICAgICAgYXNzZXJ0IGVudHJ5IGlzIG5vdCBOb25lCiAgICAgICAgICAgICNlbnRyeS5kaXN0ID0gc2VsZgogICAgICAgICAgICBlbnRyaWVzW25hbWVdID0gZW50cnkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgd3JpdGVfZXhwb3J0cyhleHBvcnRzLCBzdHJlYW0pOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgogICAgICAgICMgbmVlZHMgdG8gYmUgYSB0ZXh0IHN0cmVhbQogICAgICAgIHN0cmVhbSA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04Jykoc3RyZWFtKQogICAgY3AgPSBjb25maWdwYXJzZXIuQ29uZmlnUGFyc2VyKCkKICAgIGZvciBrLCB2IGluIGV4cG9ydHMuaXRlbXMoKToKICAgICAgICAjIFRPRE8gY2hlY2sgaywgdiBmb3IgdmFsaWQgdmFsdWVzCiAgICAgICAgY3AuYWRkX3NlY3Rpb24oaykKICAgICAgICBmb3IgZW50cnkgaW4gdi52YWx1ZXMoKToKICAgICAgICAgICAgaWYgZW50cnkuc3VmZml4IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzID0gZW50cnkucHJlZml4CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzID0gJyVzOiVzJyAlIChlbnRyeS5wcmVmaXgsIGVudHJ5LnN1ZmZpeCkKICAgICAgICAgICAgaWYgZW50cnkuZmxhZ3M6CiAgICAgICAgICAgICAgICBzID0gJyVzIFslc10nICUgKHMsICcsICcuam9pbihlbnRyeS5mbGFncykpCiAgICAgICAgICAgIGNwLnNldChrLCBlbnRyeS5uYW1lLCBzKQogICAgY3Aud3JpdGUoc3RyZWFtKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiB0ZW1wZGlyKCk6CiAgICB0ZCA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHRkCiAgICBmaW5hbGx5OgogICAgICAgIHNodXRpbC5ybXRyZWUodGQpCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgY2hkaXIoZCk6CiAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgdHJ5OgogICAgICAgIG9zLmNoZGlyKGQpCiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoY3dkKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzb2NrZXRfdGltZW91dChzZWNvbmRzPTE1KToKICAgIGN0byA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCiAgICB0cnk6CiAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHNlY29uZHMpCiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KGN0bykKCgpjbGFzcyBjYWNoZWRfcHJvcGVydHkob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCiAgICAgICAgI2ZvciBhdHRyIGluICgnX19uYW1lX18nLCAnX19tb2R1bGVfXycsICdfX2RvY19fJyk6CiAgICAgICAgIyAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGdldGF0dHIoZnVuYywgYXR0ciwgTm9uZSkpCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBjbHM9Tm9uZSk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgdmFsdWUgPSBzZWxmLmZ1bmMob2JqKQogICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhvYmosIHNlbGYuZnVuYy5fX25hbWVfXywgdmFsdWUpCiAgICAgICAgI29iai5fX2RpY3RfX1tzZWxmLmZ1bmMuX19uYW1lX19dID0gdmFsdWUgPSBzZWxmLmZ1bmMob2JqKQogICAgICAgIHJldHVybiB2YWx1ZQoKZGVmIGNvbnZlcnRfcGF0aChwYXRobmFtZSk6CiAgICAiIiJSZXR1cm4gJ3BhdGhuYW1lJyBhcyBhIG5hbWUgdGhhdCB3aWxsIHdvcmsgb24gdGhlIG5hdGl2ZSBmaWxlc3lzdGVtLgoKICAgIFRoZSBwYXRoIGlzIHNwbGl0IG9uICcvJyBhbmQgcHV0IGJhY2sgdG9nZXRoZXIgYWdhaW4gdXNpbmcgdGhlIGN1cnJlbnQKICAgIGRpcmVjdG9yeSBzZXBhcmF0b3IuICBOZWVkZWQgYmVjYXVzZSBmaWxlbmFtZXMgaW4gdGhlIHNldHVwIHNjcmlwdCBhcmUKICAgIGFsd2F5cyBzdXBwbGllZCBpbiBVbml4IHN0eWxlLCBhbmQgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGxvY2FsCiAgICBjb252ZW50aW9uIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgdXNlIHRoZW0gaW4gdGhlIGZpbGVzeXN0ZW0uICBSYWlzZXMKICAgIFZhbHVlRXJyb3Igb24gbm9uLVVuaXgtaXNoIHN5c3RlbXMgaWYgJ3BhdGhuYW1lJyBlaXRoZXIgc3RhcnRzIG9yCiAgICBlbmRzIHdpdGggYSBzbGFzaC4KICAgICIiIgogICAgaWYgb3Muc2VwID09ICcvJzoKICAgICAgICByZXR1cm4gcGF0aG5hbWUKICAgIGlmIG5vdCBwYXRobmFtZToKICAgICAgICByZXR1cm4gcGF0aG5hbWUKICAgIGlmIHBhdGhuYW1lWzBdID09ICcvJzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwYXRoICclcycgY2Fubm90IGJlIGFic29sdXRlIiAlIHBhdGhuYW1lKQogICAgaWYgcGF0aG5hbWVbLTFdID09ICcvJzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwYXRoICclcycgY2Fubm90IGVuZCB3aXRoICcvJyIgJSBwYXRobmFtZSkKCiAgICBwYXRocyA9IHBhdGhuYW1lLnNwbGl0KCcvJykKICAgIHdoaWxlIG9zLmN1cmRpciBpbiBwYXRoczoKICAgICAgICBwYXRocy5yZW1vdmUob3MuY3VyZGlyKQogICAgaWYgbm90IHBhdGhzOgogICAgICAgIHJldHVybiBvcy5jdXJkaXIKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKnBhdGhzKQoKCmNsYXNzIEZpbGVPcGVyYXRvcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRyeV9ydW49RmFsc2UpOgogICAgICAgIHNlbGYuZHJ5X3J1biA9IGRyeV9ydW4KICAgICAgICBzZWxmLmVuc3VyZWQgPSBzZXQoKQogICAgICAgIHNlbGYuX2luaXRfcmVjb3JkKCkKCiAgICBkZWYgX2luaXRfcmVjb3JkKHNlbGYpOgogICAgICAgIHNlbGYucmVjb3JkID0gRmFsc2UKICAgICAgICBzZWxmLmZpbGVzX3dyaXR0ZW4gPSBzZXQoKQogICAgICAgIHNlbGYuZGlyc19jcmVhdGVkID0gc2V0KCkKCiAgICBkZWYgcmVjb3JkX2FzX3dyaXR0ZW4oc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgIHNlbGYuZmlsZXNfd3JpdHRlbi5hZGQocGF0aCkKCiAgICBkZWYgbmV3ZXIoc2VsZiwgc291cmNlLCB0YXJnZXQpOgogICAgICAgICIiIlRlbGwgaWYgdGhlIHRhcmdldCBpcyBuZXdlciB0aGFuIHRoZSBzb3VyY2UuCgogICAgICAgIFJldHVybnMgdHJ1ZSBpZiAnc291cmNlJyBleGlzdHMgYW5kIGlzIG1vcmUgcmVjZW50bHkgbW9kaWZpZWQgdGhhbgogICAgICAgICd0YXJnZXQnLCBvciBpZiAnc291cmNlJyBleGlzdHMgYW5kICd0YXJnZXQnIGRvZXNuJ3QuCgogICAgICAgIFJldHVybnMgZmFsc2UgaWYgYm90aCBleGlzdCBhbmQgJ3RhcmdldCcgaXMgdGhlIHNhbWUgYWdlIG9yIHlvdW5nZXIKICAgICAgICB0aGFuICdzb3VyY2UnLiBSYWlzZSBQYWNrYWdpbmdGaWxlRXJyb3IgaWYgJ3NvdXJjZScgZG9lcyBub3QgZXhpc3QuCgogICAgICAgIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHZlcnkgYWNjdXJhdGU6IGZpbGVzIGNyZWF0ZWQgaW4gdGhlIHNhbWUKICAgICAgICBzZWNvbmQgd2lsbCBoYXZlIHRoZSBzYW1lICJhZ2UiLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCJmaWxlICclcicgZG9lcyBub3QgZXhpc3QiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoc291cmNlKSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0KToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIG9zLnN0YXQoc291cmNlKS5zdF9tdGltZSA+IG9zLnN0YXQodGFyZ2V0KS5zdF9tdGltZQoKICAgIGRlZiBjb3B5X2ZpbGUoc2VsZiwgaW5maWxlLCBvdXRmaWxlLCBjaGVjaz1UcnVlKToKICAgICAgICAiIiJDb3B5IGEgZmlsZSByZXNwZWN0aW5nIGRyeS1ydW4gYW5kIGZvcmNlIGZsYWdzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUob3V0ZmlsZSkpCiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvcHlpbmcgJXMgdG8gJXMnLCBpbmZpbGUsIG91dGZpbGUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgbXNnID0gTm9uZQogICAgICAgICAgICBpZiBjaGVjazoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKG91dGZpbGUpOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICclcyBpcyBhIHN5bWxpbmsnICUgb3V0ZmlsZQogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhvdXRmaWxlKSBhbmQgbm90IG9zLnBhdGguaXNmaWxlKG91dGZpbGUpOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICclcyBpcyBhIG5vbi1yZWd1bGFyIGZpbGUnICUgb3V0ZmlsZQogICAgICAgICAgICBpZiBtc2c6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyArICcgd2hpY2ggd291bGQgYmUgb3ZlcndyaXR0ZW4nKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoaW5maWxlLCBvdXRmaWxlKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ob3V0ZmlsZSkKCiAgICBkZWYgY29weV9zdHJlYW0oc2VsZiwgaW5zdHJlYW0sIG91dGZpbGUsIGVuY29kaW5nPU5vbmUpOgogICAgICAgIGFzc2VydCBub3Qgb3MucGF0aC5pc2RpcihvdXRmaWxlKQogICAgICAgIHNlbGYuZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUob3V0ZmlsZSkpCiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvcHlpbmcgc3RyZWFtICVzIHRvICVzJywgaW5zdHJlYW0sIG91dGZpbGUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG91dHN0cmVhbSA9IG9wZW4ob3V0ZmlsZSwgJ3diJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG91dHN0cmVhbSA9IGNvZGVjcy5vcGVuKG91dGZpbGUsICd3JywgZW5jb2Rpbmc9ZW5jb2RpbmcpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihpbnN0cmVhbSwgb3V0c3RyZWFtKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgb3V0c3RyZWFtLmNsb3NlKCkKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKG91dGZpbGUpCgogICAgZGVmIHdyaXRlX2JpbmFyeV9maWxlKHNlbGYsIHBhdGgsIGRhdGEpOgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUocGF0aCkpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihwYXRoKQoKICAgIGRlZiB3cml0ZV90ZXh0X2ZpbGUoc2VsZiwgcGF0aCwgZGF0YSwgZW5jb2RpbmcpOgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUocGF0aCkpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKHBhdGgpCgogICAgZGVmIHNldF9tb2RlKHNlbGYsIGJpdHMsIG1hc2ssIGZpbGVzKToKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCcgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAncG9zaXgnKToKICAgICAgICAgICAgIyBTZXQgdGhlIGV4ZWN1dGFibGUgYml0cyAob3duZXIsIGdyb3VwLCBhbmQgd29ybGQpIG9uCiAgICAgICAgICAgICMgYWxsIHRoZSBmaWxlcyBzcGVjaWZpZWQuCiAgICAgICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjaGFuZ2luZyBtb2RlIG9mICVzIiwgZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IChvcy5zdGF0KGYpLnN0X21vZGUgfCBiaXRzKSAmIG1hc2sKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiY2hhbmdpbmcgbW9kZSBvZiAlcyB0byAlbyIsIGYsIG1vZGUpCiAgICAgICAgICAgICAgICAgICAgb3MuY2htb2QoZiwgbW9kZSkKCiAgICBzZXRfZXhlY3V0YWJsZV9tb2RlID0gbGFtYmRhIHMsIGY6IHMuc2V0X21vZGUoMG81NTUsIDBvNzc3NywgZikKCiAgICBkZWYgZW5zdXJlX2RpcihzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZi5lbnN1cmVkIGFuZCBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgIHNlbGYuZW5zdXJlZC5hZGQocGF0aCkKICAgICAgICAgICAgZCwgZiA9IG9zLnBhdGguc3BsaXQocGF0aCkKICAgICAgICAgICAgc2VsZi5lbnN1cmVfZGlyKGQpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyAlcycgJSBwYXRoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MubWtkaXIocGF0aCkKICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICBzZWxmLmRpcnNfY3JlYXRlZC5hZGQocGF0aCkKCiAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIHBhdGgsIG9wdGltaXplPUZhbHNlLCBmb3JjZT1GYWxzZSwgcHJlZml4PU5vbmUpOgogICAgICAgIGRwYXRoID0gY2FjaGVfZnJvbV9zb3VyY2UocGF0aCwgbm90IG9wdGltaXplKQogICAgICAgIGxvZ2dlci5pbmZvKCdCeXRlLWNvbXBpbGluZyAlcyB0byAlcycsIHBhdGgsIGRwYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGlmIGZvcmNlIG9yIHNlbGYubmV3ZXIocGF0aCwgZHBhdGgpOgogICAgICAgICAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgICAgICAgICBkaWFncGF0aCA9IE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHBhdGguc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgICAgICAgICAgICAgZGlhZ3BhdGggPSBwYXRoW2xlbihwcmVmaXgpOl0KICAgICAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKHBhdGgsIGRwYXRoLCBkaWFncGF0aCwgVHJ1ZSkgICAgICMgcmFpc2UgZXJyb3IKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKGRwYXRoKQogICAgICAgIHJldHVybiBkcGF0aAoKICAgIGRlZiBlbnN1cmVfcmVtb3ZlZChzZWxmLCBwYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBkaXJlY3RvcnkgdHJlZSBhdCAlcycsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gc2VsZi5kaXJzX2NyZWF0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlyc19jcmVhdGVkLnJlbW92ZShwYXRoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgcyA9ICdsaW5rJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzID0gJ2ZpbGUnCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nICVzICVzJywgcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGluIHNlbGYuZmlsZXNfd3JpdHRlbjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlc193cml0dGVuLnJlbW92ZShwYXRoKQoKICAgIGRlZiBpc193cml0YWJsZShzZWxmLCBwYXRoKToKICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIHdoaWxlIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gb3MuYWNjZXNzKHBhdGgsIG9zLldfT0spCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBwYXJlbnQgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgICAgICAgICAgaWYgcGFyZW50ID09IHBhdGg6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBwYXRoID0gcGFyZW50CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBjb21taXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tbWl0IHJlY29yZGVkIGNoYW5nZXMsIHR1cm4gb2ZmIHJlY29yZGluZywgcmV0dXJuCiAgICAgICAgY2hhbmdlcy4KICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgc2VsZi5yZWNvcmQKICAgICAgICByZXN1bHQgPSBzZWxmLmZpbGVzX3dyaXR0ZW4sIHNlbGYuZGlyc19jcmVhdGVkCiAgICAgICAgc2VsZi5faW5pdF9yZWNvcmQoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcm9sbGJhY2soc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZm9yIGYgaW4gbGlzdChzZWxmLmZpbGVzX3dyaXR0ZW4pOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGYpCiAgICAgICAgICAgICMgZGlycyBzaG91bGQgYWxsIGJlIGVtcHR5IG5vdywgZXhjZXB0IHBlcmhhcHMgZm9yCiAgICAgICAgICAgICMgX19weWNhY2hlX18gc3ViZGlycwogICAgICAgICAgICAjIHJldmVyc2Ugc28gdGhhdCBzdWJkaXJzIGFwcGVhciBiZWZvcmUgdGhlaXIgcGFyZW50cwogICAgICAgICAgICBkaXJzID0gc29ydGVkKHNlbGYuZGlyc19jcmVhdGVkLCByZXZlcnNlPVRydWUpCiAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICBmbGlzdCA9IG9zLmxpc3RkaXIoZCkKICAgICAgICAgICAgICAgIGlmIGZsaXN0OgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBmbGlzdCA9PSBbJ19fcHljYWNoZV9fJ10KICAgICAgICAgICAgICAgICAgICBzZCA9IG9zLnBhdGguam9pbihkLCBmbGlzdFswXSkKICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihzZCkKICAgICAgICAgICAgICAgIG9zLnJtZGlyKGQpICAgICAjIHNob3VsZCBmYWlsIGlmIG5vbi1lbXB0eQogICAgICAgIHNlbGYuX2luaXRfcmVjb3JkKCkKCmRlZiByZXNvbHZlKG1vZHVsZV9uYW1lLCBkb3R0ZWRfcGF0aCk6CiAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KICAgIGVsc2U6CiAgICAgICAgbW9kID0gX19pbXBvcnRfXyhtb2R1bGVfbmFtZSkKICAgIGlmIGRvdHRlZF9wYXRoIGlzIE5vbmU6CiAgICAgICAgcmVzdWx0ID0gbW9kCiAgICBlbHNlOgogICAgICAgIHBhcnRzID0gZG90dGVkX3BhdGguc3BsaXQoJy4nKQogICAgICAgIHJlc3VsdCA9IGdldGF0dHIobW9kLCBwYXJ0cy5wb3AoMCkpCiAgICAgICAgZm9yIHAgaW4gcGFydHM6CiAgICAgICAgICAgIHJlc3VsdCA9IGdldGF0dHIocmVzdWx0LCBwKQogICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIEV4cG9ydEVudHJ5KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBzdWZmaXgsIGZsYWdzKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wcmVmaXggPSBwcmVmaXgKICAgICAgICBzZWxmLnN1ZmZpeCA9IHN1ZmZpeAogICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncwoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiB2YWx1ZShzZWxmKToKICAgICAgICByZXR1cm4gcmVzb2x2ZShzZWxmLnByZWZpeCwgc2VsZi5zdWZmaXgpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgcmV0dXJuICc8RXhwb3J0RW50cnkgJXMgPSAlczolcyAlcz4nICUgKHNlbGYubmFtZSwgc2VsZi5wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3VmZml4LCBzZWxmLmZsYWdzKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBFeHBvcnRFbnRyeSk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gKHNlbGYubmFtZSA9PSBvdGhlci5uYW1lIGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVmaXggPT0gb3RoZXIucHJlZml4IGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWZmaXggPT0gb3RoZXIuc3VmZml4IGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5mbGFncyA9PSBvdGhlci5mbGFncykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgX19oYXNoX18gPSBvYmplY3QuX19oYXNoX18KCgpFTlRSWV9SRSA9IHJlLmNvbXBpbGUocicnJyg/UDxuYW1lPihcd3xbLS4rXSkrKQogICAgICAgICAgICAgICAgICAgICAgXHMqPVxzKig/UDxjYWxsYWJsZT4oXHcrKShbOlwuXVx3KykqKQogICAgICAgICAgICAgICAgICAgICAgXHMqKFxbXHMqKD9QPGZsYWdzPlx3Kyg9XHcrKT8oLFxzKlx3Kyg9XHcrKT8pKilccypcXSk/CiAgICAgICAgICAgICAgICAgICAgICAnJycsIHJlLlZFUkJPU0UpCgpkZWYgZ2V0X2V4cG9ydF9lbnRyeShzcGVjaWZpY2F0aW9uKToKICAgIG0gPSBFTlRSWV9SRS5zZWFyY2goc3BlY2lmaWNhdGlvbikKICAgIGlmIG5vdCBtOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBpZiAnWycgaW4gc3BlY2lmaWNhdGlvbiBvciAnXScgaW4gc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigiSW52YWxpZCBzcGVjaWZpY2F0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyIgJSBzcGVjaWZpY2F0aW9uKQogICAgZWxzZToKICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgIG5hbWUgPSBkWyduYW1lJ10KICAgICAgICBwYXRoID0gZFsnY2FsbGFibGUnXQogICAgICAgIGNvbG9ucyA9IHBhdGguY291bnQoJzonKQogICAgICAgIGlmIGNvbG9ucyA9PSAwOgogICAgICAgICAgICBwcmVmaXgsIHN1ZmZpeCA9IHBhdGgsIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjb2xvbnMgIT0gMToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oIkludmFsaWQgc3BlY2lmaWNhdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiAlIHNwZWNpZmljYXRpb24pCiAgICAgICAgICAgIHByZWZpeCwgc3VmZml4ID0gcGF0aC5zcGxpdCgnOicpCiAgICAgICAgZmxhZ3MgPSBkWydmbGFncyddCiAgICAgICAgaWYgZmxhZ3MgaXMgTm9uZToKICAgICAgICAgICAgaWYgJ1snIGluIHNwZWNpZmljYXRpb24gb3IgJ10nIGluIHNwZWNpZmljYXRpb246CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCJJbnZhbGlkIHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyIgJSBzcGVjaWZpY2F0aW9uKQogICAgICAgICAgICBmbGFncyA9IFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmxhZ3MgPSBbZi5zdHJpcCgpIGZvciBmIGluIGZsYWdzLnNwbGl0KCcsJyldCiAgICAgICAgcmVzdWx0ID0gRXhwb3J0RW50cnkobmFtZSwgcHJlZml4LCBzdWZmaXgsIGZsYWdzKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfY2FjaGVfYmFzZShzdWZmaXg9Tm9uZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgZGVmYXVsdCBiYXNlIGxvY2F0aW9uIGZvciBkaXN0bGliIGNhY2hlcy4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzCiAgICBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIFVzZSB0aGUgc3VmZml4IHByb3ZpZGVkIGZvciB0aGUgYmFzZSBkaXJlY3RvcnksCiAgICBhbmQgZGVmYXVsdCB0byAnLmRpc3RsaWInIGlmIGl0IGlzbid0IHByb3ZpZGVkLgoKICAgIE9uIFdpbmRvd3MsIGlmIExPQ0FMQVBQREFUQSBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCwgdGhlbiBpdCBpcwogICAgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSwgYW5kIHdpbGwgYmUgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdC4KICAgIE9uIFBPU0lYLCBhbmQgb24gV2luZG93cyBpZiBMT0NBTEFQUERBVEEgaXMgbm90IGRlZmluZWQsIHRoZSB1c2VyJ3MgaG9tZQogICAgZGlyZWN0b3J5IC0gdXNpbmcgb3MuZXhwYW5kdXNlcignficpIC0gd2lsbCBiZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZgogICAgdGhlIHJlc3VsdC4KCiAgICBUaGUgcmVzdWx0IGlzIGp1c3QgdGhlIGRpcmVjdG9yeSAnLmRpc3RsaWInIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFzCiAgICBkZXRlcm1pbmVkIGFib3ZlLCBvciB3aXRoIHRoZSBuYW1lIHNwZWNpZmllZCB3aXRoIGBgc3VmZml4YGAuCiAgICAiIiIKICAgIGlmIHN1ZmZpeCBpcyBOb25lOgogICAgICAgIHN1ZmZpeCA9ICcuZGlzdGxpYicKICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgJ0xPQ0FMQVBQREFUQScgaW4gb3MuZW52aXJvbjoKICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmV4cGFuZHZhcnMoJyRsb2NhbGFwcGRhdGEnKQogICAgZWxzZToKICAgICAgICAjIEFzc3VtZSBwb3NpeCwgb3Igb2xkIFdpbmRvd3MKICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKQogICAgIyB3ZSB1c2UgJ2lzZGlyJyBpbnN0ZWFkIG9mICdleGlzdHMnLCBiZWNhdXNlIHdlIHdhbnQgdG8KICAgICMgZmFpbCBpZiB0aGVyZSdzIGEgZmlsZSB3aXRoIHRoYXQgbmFtZQogICAgaWYgb3MucGF0aC5pc2RpcihyZXN1bHQpOgogICAgICAgIHVzYWJsZSA9IG9zLmFjY2VzcyhyZXN1bHQsIG9zLldfT0spCiAgICAgICAgaWYgbm90IHVzYWJsZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RpcmVjdG9yeSBleGlzdHMgYnV0IGlzIG5vdCB3cml0YWJsZTogJXMnLCByZXN1bHQpCiAgICBlbHNlOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MubWFrZWRpcnMocmVzdWx0KQogICAgICAgICAgICB1c2FibGUgPSBUcnVlCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmFibGUgdG8gY3JlYXRlICVzJywgcmVzdWx0LCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICB1c2FibGUgPSBGYWxzZQogICAgaWYgbm90IHVzYWJsZToKICAgICAgICByZXN1bHQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICBsb2dnZXIud2FybmluZygnRGVmYXVsdCBsb2NhdGlvbiB1bnVzYWJsZSwgdXNpbmcgJXMnLCByZXN1bHQpCiAgICByZXR1cm4gb3MucGF0aC5qb2luKHJlc3VsdCwgc3VmZml4KQoKCmRlZiBwYXRoX3RvX2NhY2hlX2RpcihwYXRoKToKICAgICIiIgogICAgQ29udmVydCBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IG5hbWUgZm9yIHVzZSBpbiBhIGNhY2hlLgoKICAgIFRoZSBhbGdvcml0aG0gdXNlZCBpczoKCiAgICAjLiBPbiBXaW5kb3dzLCBhbnkgYGAnOidgYCBpbiB0aGUgZHJpdmUgaXMgcmVwbGFjZWQgd2l0aCBgYCctLS0nYGAuCiAgICAjLiBBbnkgb2NjdXJyZW5jZSBvZiBgYG9zLnNlcGBgIGlzIHJlcGxhY2VkIHdpdGggYGAnLS0nYGAuCiAgICAjLiBgYCcuY2FjaGUnYGAgaXMgYXBwZW5kZWQuCiAgICAiIiIKICAgIGQsIHAgPSBvcy5wYXRoLnNwbGl0ZHJpdmUob3MucGF0aC5hYnNwYXRoKHBhdGgpKQogICAgaWYgZDoKICAgICAgICBkID0gZC5yZXBsYWNlKCc6JywgJy0tLScpCiAgICBwID0gcC5yZXBsYWNlKG9zLnNlcCwgJy0tJykKICAgIHJldHVybiBkICsgcCArICcuY2FjaGUnCgoKZGVmIGVuc3VyZV9zbGFzaChzKToKICAgIGlmIG5vdCBzLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgcmV0dXJuIHMgKyAnLycKICAgIHJldHVybiBzCgoKZGVmIHBhcnNlX2NyZWRlbnRpYWxzKG5ldGxvYyk6CiAgICB1c2VybmFtZSA9IHBhc3N3b3JkID0gTm9uZQogICAgaWYgJ0AnIGluIG5ldGxvYzoKICAgICAgICBwcmVmaXgsIG5ldGxvYyA9IG5ldGxvYy5zcGxpdCgnQCcsIDEpCiAgICAgICAgaWYgJzonIG5vdCBpbiBwcmVmaXg6CiAgICAgICAgICAgIHVzZXJuYW1lID0gcHJlZml4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gcHJlZml4LnNwbGl0KCc6JywgMSkKICAgIHJldHVybiB1c2VybmFtZSwgcGFzc3dvcmQsIG5ldGxvYwoKCmRlZiBnZXRfcHJvY2Vzc191bWFzaygpOgogICAgcmVzdWx0ID0gb3MudW1hc2soMG8yMikKICAgIG9zLnVtYXNrKHJlc3VsdCkKICAgIHJldHVybiByZXN1bHQKCmRlZiBpc19zdHJpbmdfc2VxdWVuY2Uoc2VxKToKICAgIHJlc3VsdCA9IFRydWUKICAgIGkgPSBOb25lCiAgICBmb3IgaSwgcyBpbiBlbnVtZXJhdGUoc2VxKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgICAgICBicmVhawogICAgYXNzZXJ0IGkgaXMgbm90IE5vbmUKICAgIHJldHVybiByZXN1bHQKClBST0pFQ1RfTkFNRV9BTkRfVkVSU0lPTiA9IHJlLmNvbXBpbGUoJyhbYS16MC05X10rKFsuLV1bYS16X11bYS16MC05X10qKSopLScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKFthLXowLTlfListXSspJywgcmUuSSkKUFlUSE9OX1ZFUlNJT04gPSByZS5jb21waWxlKHInLXB5KFxkXC4/XGQ/KScpCgoKZGVmIHNwbGl0X2ZpbGVuYW1lKGZpbGVuYW1lLCBwcm9qZWN0X25hbWU9Tm9uZSk6CiAgICAiIiIKICAgIEV4dHJhY3QgbmFtZSwgdmVyc2lvbiwgcHl0aG9uIHZlcnNpb24gZnJvbSBhIGZpbGVuYW1lIChubyBleHRlbnNpb24pCgogICAgUmV0dXJuIG5hbWUsIHZlcnNpb24sIHB5dmVyIG9yIE5vbmUKICAgICIiIgogICAgcmVzdWx0ID0gTm9uZQogICAgcHl2ZXIgPSBOb25lCiAgICBmaWxlbmFtZSA9IHVucXVvdGUoZmlsZW5hbWUpLnJlcGxhY2UoJyAnLCAnLScpCiAgICBtID0gUFlUSE9OX1ZFUlNJT04uc2VhcmNoKGZpbGVuYW1lKQogICAgaWYgbToKICAgICAgICBweXZlciA9IG0uZ3JvdXAoMSkKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzptLnN0YXJ0KCldCiAgICBpZiBwcm9qZWN0X25hbWUgYW5kIGxlbihmaWxlbmFtZSkgPiBsZW4ocHJvamVjdF9uYW1lKSArIDE6CiAgICAgICAgbSA9IHJlLm1hdGNoKHJlLmVzY2FwZShwcm9qZWN0X25hbWUpICsgcidcYicsIGZpbGVuYW1lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG4gPSBtLmVuZCgpCiAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVuYW1lWzpuXSwgZmlsZW5hbWVbbiArIDE6XSwgcHl2ZXIKICAgIGlmIHJlc3VsdCBpcyBOb25lOgogICAgICAgIG0gPSBQUk9KRUNUX05BTUVfQU5EX1ZFUlNJT04ubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcmVzdWx0ID0gbS5ncm91cCgxKSwgbS5ncm91cCgzKSwgcHl2ZXIKICAgIHJldHVybiByZXN1bHQKCiMgQWxsb3cgc3BhY2VzIGluIG5hbWUgYmVjYXVzZSBvZiBsZWdhY3kgZGlzdHMgbGlrZSAiVHdpc3RlZCBDb3JlIgpOQU1FX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInKD9QPG5hbWU+W1x3IC4tXSspXHMqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXChccyooP1A8dmVyPlteXHMpXSspXCkkJykKCmRlZiBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApOgogICAgIiIiCiAgICBBIHV0aWxpdHkgbWV0aG9kIHVzZWQgdG8gZ2V0IG5hbWUgYW5kIHZlcnNpb24gZnJvbSBhIHN0cmluZy4KCiAgICBGcm9tIGUuZy4gYSBQcm92aWRlcy1EaXN0IHZhbHVlLgoKICAgIDpwYXJhbSBwOiBBIHZhbHVlIGluIGEgZm9ybSAnZm9vICgxLjApJwogICAgOnJldHVybjogVGhlIG5hbWUgYW5kIHZlcnNpb24gYXMgYSB0dXBsZS4KICAgICIiIgogICAgbSA9IE5BTUVfVkVSU0lPTl9SRS5tYXRjaChwKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignSWxsLWZvcm1lZCBuYW1lL3ZlcnNpb24gc3RyaW5nOiBcJyVzXCcnICUgcCkKICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICByZXR1cm4gZFsnbmFtZSddLnN0cmlwKCkubG93ZXIoKSwgZFsndmVyJ10KCmRlZiBnZXRfZXh0cmFzKHJlcXVlc3RlZCwgYXZhaWxhYmxlKToKICAgIHJlc3VsdCA9IHNldCgpCiAgICByZXF1ZXN0ZWQgPSBzZXQocmVxdWVzdGVkIG9yIFtdKQogICAgYXZhaWxhYmxlID0gc2V0KGF2YWlsYWJsZSBvciBbXSkKICAgIGlmICcqJyBpbiByZXF1ZXN0ZWQ6CiAgICAgICAgcmVxdWVzdGVkLnJlbW92ZSgnKicpCiAgICAgICAgcmVzdWx0IHw9IGF2YWlsYWJsZQogICAgZm9yIHIgaW4gcmVxdWVzdGVkOgogICAgICAgIGlmIHIgPT0gJy0nOgogICAgICAgICAgICByZXN1bHQuYWRkKHIpCiAgICAgICAgZWxpZiByLnN0YXJ0c3dpdGgoJy0nKToKICAgICAgICAgICAgdW53YW50ZWQgPSByWzE6XQogICAgICAgICAgICBpZiB1bndhbnRlZCBub3QgaW4gYXZhaWxhYmxlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ3VuZGVjbGFyZWQgZXh0cmE6ICVzJyAlIHVud2FudGVkKQogICAgICAgICAgICBpZiB1bndhbnRlZCBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlKHVud2FudGVkKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHIgbm90IGluIGF2YWlsYWJsZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCd1bmRlY2xhcmVkIGV4dHJhOiAlcycgJSByKQogICAgICAgICAgICByZXN1bHQuYWRkKHIpCiAgICByZXR1cm4gcmVzdWx0CiMKIyBFeHRlbmRlZCBtZXRhZGF0YSBmdW5jdGlvbmFsaXR5CiMKCmRlZiBfZ2V0X2V4dGVybmFsX2RhdGEodXJsKToKICAgIHJlc3VsdCA9IHt9CiAgICB0cnk6CiAgICAgICAgIyB1cmxvcGVuIG1pZ2h0IGZhaWwgaWYgaXQgcnVucyBpbnRvIHJlZGlyZWN0aW9ucywKICAgICAgICAjIGJlY2F1c2Ugb2YgUHl0aG9uIGlzc3VlICMxMzY5Ni4gRml4ZWQgaW4gbG9jYXRvcnMKICAgICAgICAjIHVzaW5nIGEgY3VzdG9tIHJlZGlyZWN0IGhhbmRsZXIuCiAgICAgICAgcmVzcCA9IHVybG9wZW4odXJsKQogICAgICAgIGhlYWRlcnMgPSByZXNwLmluZm8oKQogICAgICAgIGN0ID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpCiAgICAgICAgaWYgbm90IGN0LnN0YXJ0c3dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvciBKU09OIHJlcXVlc3Q6ICVzJywgY3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShyZXNwKQogICAgICAgICAgICAjZGF0YSA9IHJlYWRlci5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICNyZXN1bHQgPSBqc29uLmxvYWRzKGRhdGEpCiAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZChyZWFkZXIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRmFpbGVkIHRvIGdldCBleHRlcm5hbCBkYXRhIGZvciAlczogJXMnLCB1cmwsIGUpCiAgICByZXR1cm4gcmVzdWx0CgpfZXh0ZXJuYWxfZGF0YV9iYXNlX3VybCA9ICdodHRwczovL3d3dy5yZWQtZG92ZS5jb20vcHlwaS9wcm9qZWN0cy8nCgpkZWYgZ2V0X3Byb2plY3RfZGF0YShuYW1lKToKICAgIHVybCA9ICclcy8lcy9wcm9qZWN0Lmpzb24nICUgKG5hbWVbMF0udXBwZXIoKSwgbmFtZSkKICAgIHVybCA9IHVybGpvaW4oX2V4dGVybmFsX2RhdGFfYmFzZV91cmwsIHVybCkKICAgIHJlc3VsdCA9IF9nZXRfZXh0ZXJuYWxfZGF0YSh1cmwpCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgZ2V0X3BhY2thZ2VfZGF0YShuYW1lLCB2ZXJzaW9uKToKICAgIHVybCA9ICclcy8lcy9wYWNrYWdlLSVzLmpzb24nICUgKG5hbWVbMF0udXBwZXIoKSwgbmFtZSwgdmVyc2lvbikKICAgIHVybCA9IHVybGpvaW4oX2V4dGVybmFsX2RhdGFfYmFzZV91cmwsIHVybCkKICAgIHJldHVybiBfZ2V0X2V4dGVybmFsX2RhdGEodXJsKQoKCmNsYXNzIENhY2hlKG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3MgaW1wbGVtZW50aW5nIGEgY2FjaGUgZm9yIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gbGl2ZSBpbiB0aGUgZmlsZSBzeXN0ZW0KICAgIGUuZy4gc2hhcmVkIGxpYnJhcmllcy4gVGhpcyBjbGFzcyB3YXMgbW92ZWQgZnJvbSByZXNvdXJjZXMgdG8gaGVyZSBiZWNhdXNlIGl0CiAgICBjb3VsZCBiZSB1c2VkIGJ5IG90aGVyIG1vZHVsZXMsIGUuZy4gdGhlIHdoZWVsIG1vZHVsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gYmFzZTogVGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoZSBjYWNoZSBzaG91bGQgYmUgbG9jYXRlZC4KICAgICAgICAiIiIKICAgICAgICAjIHdlIHVzZSAnaXNkaXInIGluc3RlYWQgb2YgJ2V4aXN0cycsIGJlY2F1c2Ugd2Ugd2FudCB0bwogICAgICAgICMgZmFpbCBpZiB0aGVyZSdzIGEgZmlsZSB3aXRoIHRoYXQgbmFtZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGJhc2UpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGJhc2UpCiAgICAgICAgaWYgKG9zLnN0YXQoYmFzZSkuc3RfbW9kZSAmIDBvNzcpICE9IDA6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEaXJlY3RvcnkgXCclc1wnIGlzIG5vdCBwcml2YXRlJywgYmFzZSkKICAgICAgICBzZWxmLmJhc2UgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChiYXNlKSkKCiAgICBkZWYgcHJlZml4X3RvX2RpcihzZWxmLCBwcmVmaXgpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnRzIGEgcmVzb3VyY2UgcHJlZml4IHRvIGEgZGlyZWN0b3J5IG5hbWUgaW4gdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBwYXRoX3RvX2NhY2hlX2RpcihwcmVmaXgpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFyIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBub3RfcmVtb3ZlZCA9IFtdCiAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoc2VsZi5iYXNlKToKICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCBmbikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZm4pIG9yIG9zLnBhdGguaXNmaWxlKGZuKToKICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZm4pCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZm4pCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBub3RfcmVtb3ZlZC5hcHBlbmQoZm4pCiAgICAgICAgcmV0dXJuIG5vdF9yZW1vdmVkCgoKY2xhc3MgRXZlbnRNaXhpbihvYmplY3QpOgogICAgIiIiCiAgICBBIHZlcnkgc2ltcGxlIHB1Ymxpc2gvc3Vic2NyaWJlIHN5c3RlbS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX3N1YnNjcmliZXJzID0ge30KCiAgICBkZWYgYWRkKHNlbGYsIGV2ZW50LCBzdWJzY3JpYmVyLCBhcHBlbmQ9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgc3Vic2NyaWJlciBmb3IgYW4gZXZlbnQuCgogICAgICAgIDpwYXJhbSBldmVudDogVGhlIG5hbWUgb2YgYW4gZXZlbnQuCiAgICAgICAgOnBhcmFtIHN1YnNjcmliZXI6IFRoZSBzdWJzY3JpYmVyIHRvIGJlIGFkZGVkIChhbmQgY2FsbGVkIHdoZW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IGlzIHB1Ymxpc2hlZCkuCiAgICAgICAgOnBhcmFtIGFwcGVuZDogV2hldGhlciB0byBhcHBlbmQgb3IgcHJlcGVuZCB0aGUgc3Vic2NyaWJlciB0byBhbgogICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nIHN1YnNjcmliZXIgbGlzdCBmb3IgdGhlIGV2ZW50LgogICAgICAgICIiIgogICAgICAgIHN1YnMgPSBzZWxmLl9zdWJzY3JpYmVycwogICAgICAgIGlmIGV2ZW50IG5vdCBpbiBzdWJzOgogICAgICAgICAgICBzdWJzW2V2ZW50XSA9IGRlcXVlKFtzdWJzY3JpYmVyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcSA9IHN1YnNbZXZlbnRdCiAgICAgICAgICAgIGlmIGFwcGVuZDoKICAgICAgICAgICAgICAgIHNxLmFwcGVuZChzdWJzY3JpYmVyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3EuYXBwZW5kbGVmdChzdWJzY3JpYmVyKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZXZlbnQsIHN1YnNjcmliZXIpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhIHN1YnNjcmliZXIgZm9yIGFuIGV2ZW50LgoKICAgICAgICA6cGFyYW0gZXZlbnQ6IFRoZSBuYW1lIG9mIGFuIGV2ZW50LgogICAgICAgIDpwYXJhbSBzdWJzY3JpYmVyOiBUaGUgc3Vic2NyaWJlciB0byBiZSByZW1vdmVkLgogICAgICAgICIiIgogICAgICAgIHN1YnMgPSBzZWxmLl9zdWJzY3JpYmVycwogICAgICAgIGlmIGV2ZW50IG5vdCBpbiBzdWJzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdObyBzdWJzY3JpYmVyczogJXInICUgZXZlbnQpCiAgICAgICAgc3Vic1tldmVudF0ucmVtb3ZlKHN1YnNjcmliZXIpCgogICAgZGVmIGdldF9zdWJzY3JpYmVycyhzZWxmLCBldmVudCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGUgc3Vic2NyaWJlcnMgZm9yIGFuIGV2ZW50LgogICAgICAgIDpwYXJhbSBldmVudDogVGhlIGV2ZW50IHRvIHJldHVybiBzdWJzY3JpYmVycyBmb3IuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3Vic2NyaWJlcnMuZ2V0KGV2ZW50LCAoKSkpCgogICAgZGVmIHB1Ymxpc2goc2VsZiwgZXZlbnQsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUHVibGlzaCBhIGV2ZW50IGFuZCByZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyByZXR1cm5lZCBieSBpdHMKICAgICAgICBzdWJzY3JpYmVycy4KCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgZXZlbnQgdG8gcHVibGlzaC4KICAgICAgICA6cGFyYW0gYXJnczogVGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50J3MKICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcnMuCiAgICAgICAgOnBhcmFtIGt3YXJnczogVGhlIGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50J3MKICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVycy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGZvciBzdWJzY3JpYmVyIGluIHNlbGYuZ2V0X3N1YnNjcmliZXJzKGV2ZW50KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJzY3JpYmVyKGV2ZW50LCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdFeGNlcHRpb24gZHVyaW5nIGV2ZW50IHB1YmxpY2F0aW9uJykKICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlKQogICAgICAgIGxvZ2dlci5kZWJ1ZygncHVibGlzaCAlczogYXJncyA9ICVzLCBrd2FyZ3MgPSAlcywgcmVzdWx0ID0gJXMnLAogICAgICAgICAgICAgICAgICAgICBldmVudCwgYXJncywga3dhcmdzLCByZXN1bHQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKIwojIFNpbXBsZSBzZXF1ZW5jaW5nCiMKY2xhc3MgU2VxdWVuY2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fcHJlZHMgPSB7fQogICAgICAgIHNlbGYuX3N1Y2NzID0ge30KICAgICAgICBzZWxmLl9ub2RlcyA9IHNldCgpICAgICAjIG5vZGVzIHdpdGggbm8gcHJlZHMvc3VjY3MKCiAgICBkZWYgYWRkX25vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgc2VsZi5fbm9kZXMuYWRkKG5vZGUpCgogICAgZGVmIHJlbW92ZV9ub2RlKHNlbGYsIG5vZGUsIGVkZ2VzPUZhbHNlKToKICAgICAgICBpZiBub2RlIGluIHNlbGYuX25vZGVzOgogICAgICAgICAgICBzZWxmLl9ub2Rlcy5yZW1vdmUobm9kZSkKICAgICAgICBpZiBlZGdlczoKICAgICAgICAgICAgZm9yIHAgaW4gc2V0KHNlbGYuX3ByZWRzLmdldChub2RlLCAoKSkpOgogICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUocCwgbm9kZSkKICAgICAgICAgICAgZm9yIHMgaW4gc2V0KHNlbGYuX3N1Y2NzLmdldChub2RlLCAoKSkpOgogICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZSwgcykKICAgICAgICAgICAgIyBSZW1vdmUgZW1wdGllcwogICAgICAgICAgICBmb3IgaywgdiBpbiBsaXN0KHNlbGYuX3ByZWRzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgaWYgbm90IHY6CiAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3ByZWRzW2tdCiAgICAgICAgICAgIGZvciBrLCB2IGluIGxpc3Qoc2VsZi5fc3VjY3MuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBub3QgdjoKICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fc3VjY3Nba10KCiAgICBkZWYgYWRkKHNlbGYsIHByZWQsIHN1Y2MpOgogICAgICAgIGFzc2VydCBwcmVkICE9IHN1Y2MKICAgICAgICBzZWxmLl9wcmVkcy5zZXRkZWZhdWx0KHN1Y2MsIHNldCgpKS5hZGQocHJlZCkKICAgICAgICBzZWxmLl9zdWNjcy5zZXRkZWZhdWx0KHByZWQsIHNldCgpKS5hZGQoc3VjYykKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIHByZWQsIHN1Y2MpOgogICAgICAgIGFzc2VydCBwcmVkICE9IHN1Y2MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByZWRzID0gc2VsZi5fcHJlZHNbc3VjY10KICAgICAgICAgICAgc3VjY3MgPSBzZWxmLl9zdWNjc1twcmVkXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclciBub3QgYSBzdWNjZXNzb3Igb2YgYW55dGhpbmcnICUgc3VjYykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByZWRzLnJlbW92ZShwcmVkKQogICAgICAgICAgICBzdWNjcy5yZW1vdmUoc3VjYykKICAgICAgICBleGNlcHQgS2V5RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXIgbm90IGEgc3VjY2Vzc29yIG9mICVyJyAlIChzdWNjLCBwcmVkKSkKCiAgICBkZWYgaXNfc3RlcChzZWxmLCBzdGVwKToKICAgICAgICByZXR1cm4gKHN0ZXAgaW4gc2VsZi5fcHJlZHMgb3Igc3RlcCBpbiBzZWxmLl9zdWNjcyBvcgogICAgICAgICAgICAgICAgc3RlcCBpbiBzZWxmLl9ub2RlcykKCiAgICBkZWYgZ2V0X3N0ZXBzKHNlbGYsIGZpbmFsKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdGVwKGZpbmFsKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93bjogJXInICUgZmluYWwpCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB0b2RvID0gW10KICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICB0b2RvLmFwcGVuZChmaW5hbCkKICAgICAgICB3aGlsZSB0b2RvOgogICAgICAgICAgICBzdGVwID0gdG9kby5wb3AoMCkKICAgICAgICAgICAgaWYgc3RlcCBpbiBzZWVuOgogICAgICAgICAgICAgICAgIyBpZiBhIHN0ZXAgd2FzIGFscmVhZHkgc2VlbiwKICAgICAgICAgICAgICAgICMgbW92ZSBpdCB0byB0aGUgZW5kIChzbyBpdCB3aWxsIGFwcGVhciBlYXJsaWVyCiAgICAgICAgICAgICAgICAjIHdoZW4gcmV2ZXJzZWQgb24gcmV0dXJuKSAuLi4gYnV0IG5vdCBmb3IgdGhlCiAgICAgICAgICAgICAgICAjIGZpbmFsIHN0ZXAsIGFzIHRoYXQgd291bGQgYmUgY29uZnVzaW5nIGZvcgogICAgICAgICAgICAgICAgIyB1c2VycwogICAgICAgICAgICAgICAgaWYgc3RlcCAhPSBmaW5hbDoKICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlKHN0ZXApCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGVwKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQoc3RlcCkKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RlcCkKICAgICAgICAgICAgICAgIHByZWRzID0gc2VsZi5fcHJlZHMuZ2V0KHN0ZXAsICgpKQogICAgICAgICAgICAgICAgdG9kby5leHRlbmQocHJlZHMpCiAgICAgICAgcmV0dXJuIHJldmVyc2VkKHJlc3VsdCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdHJvbmdfY29ubmVjdGlvbnMoc2VsZik6CiAgICAgICAgI2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGFyamFuJTI3c19zdHJvbmdseV9jb25uZWN0ZWRfY29tcG9uZW50c19hbGdvcml0aG0KICAgICAgICBpbmRleF9jb3VudGVyID0gWzBdCiAgICAgICAgc3RhY2sgPSBbXQogICAgICAgIGxvd2xpbmtzID0ge30KICAgICAgICBpbmRleCA9IHt9CiAgICAgICAgcmVzdWx0ID0gW10KCiAgICAgICAgZ3JhcGggPSBzZWxmLl9zdWNjcwoKICAgICAgICBkZWYgc3Ryb25nY29ubmVjdChub2RlKToKICAgICAgICAgICAgIyBzZXQgdGhlIGRlcHRoIGluZGV4IGZvciB0aGlzIG5vZGUgdG8gdGhlIHNtYWxsZXN0IHVudXNlZCBpbmRleAogICAgICAgICAgICBpbmRleFtub2RlXSA9IGluZGV4X2NvdW50ZXJbMF0KICAgICAgICAgICAgbG93bGlua3Nbbm9kZV0gPSBpbmRleF9jb3VudGVyWzBdCiAgICAgICAgICAgIGluZGV4X2NvdW50ZXJbMF0gKz0gMQogICAgICAgICAgICBzdGFjay5hcHBlbmQobm9kZSkKCiAgICAgICAgICAgICMgQ29uc2lkZXIgc3VjY2Vzc29ycwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzdWNjZXNzb3JzID0gZ3JhcGhbbm9kZV0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NvcnMgPSBbXQogICAgICAgICAgICBmb3Igc3VjY2Vzc29yIGluIHN1Y2Nlc3NvcnM6CiAgICAgICAgICAgICAgICBpZiBzdWNjZXNzb3Igbm90IGluIGxvd2xpbmtzOgogICAgICAgICAgICAgICAgICAgICMgU3VjY2Vzc29yIGhhcyBub3QgeWV0IGJlZW4gdmlzaXRlZAogICAgICAgICAgICAgICAgICAgIHN0cm9uZ2Nvbm5lY3Qoc3VjY2Vzc29yKQogICAgICAgICAgICAgICAgICAgIGxvd2xpbmtzW25vZGVdID0gbWluKGxvd2xpbmtzW25vZGVdLGxvd2xpbmtzW3N1Y2Nlc3Nvcl0pCiAgICAgICAgICAgICAgICBlbGlmIHN1Y2Nlc3NvciBpbiBzdGFjazoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBzdWNjZXNzb3IgaXMgaW4gdGhlIHN0YWNrIGFuZCBoZW5jZSBpbiB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgICAgICMgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudCAoU0NDKQogICAgICAgICAgICAgICAgICAgIGxvd2xpbmtzW25vZGVdID0gbWluKGxvd2xpbmtzW25vZGVdLGluZGV4W3N1Y2Nlc3Nvcl0pCgogICAgICAgICAgICAjIElmIGBub2RlYCBpcyBhIHJvb3Qgbm9kZSwgcG9wIHRoZSBzdGFjayBhbmQgZ2VuZXJhdGUgYW4gU0NDCiAgICAgICAgICAgIGlmIGxvd2xpbmtzW25vZGVdID09IGluZGV4W25vZGVdOgogICAgICAgICAgICAgICAgY29ubmVjdGVkX2NvbXBvbmVudCA9IFtdCgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzdGFjay5wb3AoKQogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZF9jb21wb25lbnQuYXBwZW5kKHN1Y2Nlc3NvcikKICAgICAgICAgICAgICAgICAgICBpZiBzdWNjZXNzb3IgPT0gbm9kZTogYnJlYWsKICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHR1cGxlKGNvbm5lY3RlZF9jb21wb25lbnQpCiAgICAgICAgICAgICAgICAjIHN0b3JpbmcgdGhlIHJlc3VsdAogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjb21wb25lbnQpCgogICAgICAgIGZvciBub2RlIGluIGdyYXBoOgogICAgICAgICAgICBpZiBub2RlIG5vdCBpbiBsb3dsaW5rczoKICAgICAgICAgICAgICAgIHN0cm9uZ2Nvbm5lY3Qobm9kZSkKCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRvdChzZWxmKToKICAgICAgICByZXN1bHQgPSBbJ2RpZ3JhcGggRyB7J10KICAgICAgICBmb3Igc3VjYyBpbiBzZWxmLl9wcmVkczoKICAgICAgICAgICAgcHJlZHMgPSBzZWxmLl9wcmVkc1tzdWNjXQogICAgICAgICAgICBmb3IgcHJlZCBpbiBwcmVkczoKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAgJXMgLT4gJXM7JyAlIChwcmVkLCBzdWNjKSkKICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9ub2RlczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICAlczsnICUgbm9kZSkKICAgICAgICByZXN1bHQuYXBwZW5kKCd9JykKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKHJlc3VsdCkKCiMKIyBVbmFyY2hpdmluZyBmdW5jdGlvbmFsaXR5IGZvciB6aXAsIHRhciwgdGd6LCB0YnosIHdobAojCgpBUkNISVZFX0VYVEVOU0lPTlMgPSAoJy50YXIuZ3onLCAnLnRhci5iejInLCAnLnRhcicsICcuemlwJywKICAgICAgICAgICAgICAgICAgICAgICcudGd6JywgJy50YnonLCAnLndobCcpCgpkZWYgdW5hcmNoaXZlKGFyY2hpdmVfZmlsZW5hbWUsIGRlc3RfZGlyLCBmb3JtYXQ9Tm9uZSwgY2hlY2s9VHJ1ZSk6CgogICAgZGVmIGNoZWNrX3BhdGgocGF0aCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGF0aCwgdGV4dF90eXBlKToKICAgICAgICAgICAgcGF0aCA9IHBhdGguZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHBhdGgpKQogICAgICAgIGlmIG5vdCBwLnN0YXJ0c3dpdGgoZGVzdF9kaXIpIG9yIHBbcGxlbl0gIT0gb3Muc2VwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdwYXRoIG91dHNpZGUgZGVzdGluYXRpb246ICVyJyAlIHApCgogICAgZGVzdF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoZGVzdF9kaXIpCiAgICBwbGVuID0gbGVuKGRlc3RfZGlyKQogICAgYXJjaGl2ZSA9IE5vbmUKICAgIGlmIGZvcm1hdCBpcyBOb25lOgogICAgICAgIGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoKCcuemlwJywgJy53aGwnKSk6CiAgICAgICAgICAgIGZvcm1hdCA9ICd6aXAnCiAgICAgICAgZWxpZiBhcmNoaXZlX2ZpbGVuYW1lLmVuZHN3aXRoKCgnLnRhci5neicsICcudGd6JykpOgogICAgICAgICAgICBmb3JtYXQgPSAndGd6JwogICAgICAgICAgICBtb2RlID0gJ3I6Z3onCiAgICAgICAgZWxpZiBhcmNoaXZlX2ZpbGVuYW1lLmVuZHN3aXRoKCgnLnRhci5iejInLCAnLnRieicpKToKICAgICAgICAgICAgZm9ybWF0ID0gJ3RieicKICAgICAgICAgICAgbW9kZSA9ICdyOmJ6MicKICAgICAgICBlbGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoJy50YXInKToKICAgICAgICAgICAgZm9ybWF0ID0gJ3RhcicKICAgICAgICAgICAgbW9kZSA9ICdyJwogICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biBmb3JtYXQgZm9yICVyJyAlIGFyY2hpdmVfZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgaWYgZm9ybWF0ID09ICd6aXAnOgogICAgICAgICAgICBhcmNoaXZlID0gWmlwRmlsZShhcmNoaXZlX2ZpbGVuYW1lLCAncicpCiAgICAgICAgICAgIGlmIGNoZWNrOgogICAgICAgICAgICAgICAgbmFtZXMgPSBhcmNoaXZlLm5hbWVsaXN0KCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICAgICAgICAgIGNoZWNrX3BhdGgobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoaXZlID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfZmlsZW5hbWUsIG1vZGUpCiAgICAgICAgICAgIGlmIGNoZWNrOgogICAgICAgICAgICAgICAgbmFtZXMgPSBhcmNoaXZlLmdldG5hbWVzKCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICAgICAgICAgIGNoZWNrX3BhdGgobmFtZSkKICAgICAgICBpZiBmb3JtYXQgIT0gJ3ppcCcgYW5kIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICAjIFNlZSBQeXRob24gaXNzdWUgMTcxNTMuIElmIHRoZSBkZXN0IHBhdGggY29udGFpbnMgVW5pY29kZSwKICAgICAgICAgICAgIyB0YXJmaWxlIGV4dHJhY3Rpb24gZmFpbHMgb24gUHl0aG9uIDIueCBpZiBhIG1lbWJlciBwYXRoIG5hbWUKICAgICAgICAgICAgIyBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVycyAtIGl0IGxlYWRzIHRvIGFuIGltcGxpY2l0CiAgICAgICAgICAgICMgYnl0ZXMgLT4gdW5pY29kZSBjb252ZXJzaW9uIHVzaW5nIEFTQ0lJIHRvIGRlY29kZS4KICAgICAgICAgICAgZm9yIHRhcmluZm8gaW4gYXJjaGl2ZS5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0YXJpbmZvLm5hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5uYW1lID0gdGFyaW5mby5uYW1lLmRlY29kZSgndXRmLTgnKQogICAgICAgIGFyY2hpdmUuZXh0cmFjdGFsbChkZXN0X2RpcikKCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGFyY2hpdmU6CiAgICAgICAgICAgIGFyY2hpdmUuY2xvc2UoKQoKCmRlZiB6aXBfZGlyKGRpcmVjdG9yeSk6CiAgICAiIiJ6aXAgYSBkaXJlY3RvcnkgdHJlZSBpbnRvIGEgQnl0ZXNJTyBvYmplY3QiIiIKICAgIHJlc3VsdCA9IGlvLkJ5dGVzSU8oKQogICAgZGxlbiA9IGxlbihkaXJlY3RvcnkpCiAgICB3aXRoIFppcEZpbGUocmVzdWx0LCAidyIpIGFzIHpmOgogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgZnVsbCA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQogICAgICAgICAgICAgICAgcmVsID0gcm9vdFtkbGVuOl0KICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocmVsLCBuYW1lKQogICAgICAgICAgICAgICAgemYud3JpdGUoZnVsbCwgZGVzdCkKICAgIHJldHVybiByZXN1bHQKCiMKIyBTaW1wbGUgcHJvZ3Jlc3MgYmFyCiMKClVOSVRTID0gKCcnLCAnSycsICdNJywgJ0cnLCdUJywnUCcpCgoKY2xhc3MgUHJvZ3Jlc3Mob2JqZWN0KToKICAgIHVua25vd24gPSAnVU5LTk9XTicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWludmFsPTAsIG1heHZhbD0xMDApOgogICAgICAgIGFzc2VydCBtYXh2YWwgaXMgTm9uZSBvciBtYXh2YWwgPj0gbWludmFsCiAgICAgICAgc2VsZi5taW4gPSBzZWxmLmN1ciA9IG1pbnZhbAogICAgICAgIHNlbGYubWF4ID0gbWF4dmFsCiAgICAgICAgc2VsZi5zdGFydGVkID0gTm9uZQogICAgICAgIHNlbGYuZWxhcHNlZCA9IDAKICAgICAgICBzZWxmLmRvbmUgPSBGYWxzZQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgY3VydmFsKToKICAgICAgICBhc3NlcnQgc2VsZi5taW4gPD0gY3VydmFsCiAgICAgICAgYXNzZXJ0IHNlbGYubWF4IGlzIE5vbmUgb3IgY3VydmFsIDw9IHNlbGYubWF4CiAgICAgICAgc2VsZi5jdXIgPSBjdXJ2YWwKICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHNlbGYuc3RhcnRlZCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0YXJ0ZWQgPSBub3cKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVsYXBzZWQgPSBub3cgLSBzZWxmLnN0YXJ0ZWQKCiAgICBkZWYgaW5jcmVtZW50KHNlbGYsIGluY3IpOgogICAgICAgIGFzc2VydCBpbmNyID49IDAKICAgICAgICBzZWxmLnVwZGF0ZShzZWxmLmN1ciArIGluY3IpCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHNlbGYudXBkYXRlKHNlbGYubWluKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5tYXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYudXBkYXRlKHNlbGYubWF4KQogICAgICAgIHNlbGYuZG9uZSA9IFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtYXhpbXVtKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnVua25vd24gaWYgc2VsZi5tYXggaXMgTm9uZSBlbHNlIHNlbGYubWF4CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGVyY2VudGFnZShzZWxmKToKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHJlc3VsdCA9ICcxMDAgJScKICAgICAgICBlbGlmIHNlbGYubWF4IGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9ICcgPz8gJScKICAgICAgICBlbHNlOgogICAgICAgICAgICB2ID0gMTAwLjAgKiAoc2VsZi5jdXIgLSBzZWxmLm1pbikgLyAoc2VsZi5tYXggLSBzZWxmLm1pbikKICAgICAgICAgICAgcmVzdWx0ID0gJyUzZCAlJScgJSB2CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBmb3JtYXRfZHVyYXRpb24oc2VsZiwgZHVyYXRpb24pOgogICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKSBhbmQgc2VsZi5tYXggaXMgTm9uZSBvciBzZWxmLmN1ciA9PSBzZWxmLm1pbjoKICAgICAgICAgICAgcmVzdWx0ID0gJz8/Oj8/Oj8/JwogICAgICAgICNlbGlmIGR1cmF0aW9uIDwgMToKICAgICAgICAjICAgIHJlc3VsdCA9ICctLTotLTotLScKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSB0aW1lLnN0cmZ0aW1lKCclSDolTTolUycsIHRpbWUuZ210aW1lKGR1cmF0aW9uKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgRVRBKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcHJlZml4ID0gJ0RvbmUnCiAgICAgICAgICAgIHQgPSBzZWxmLmVsYXBzZWQKICAgICAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZWZpeCA9ICdFVEEgJwogICAgICAgICAgICBpZiBzZWxmLm1heCBpcyBOb25lOgogICAgICAgICAgICAgICAgdCA9IC0xCiAgICAgICAgICAgIGVsaWYgc2VsZi5lbGFwc2VkID09IDAgb3IgKHNlbGYuY3VyID09IHNlbGYubWluKToKICAgICAgICAgICAgICAgIHQgPSAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgICAgICB0ID0gZmxvYXQoc2VsZi5tYXggLSBzZWxmLm1pbikKICAgICAgICAgICAgICAgIHQgLz0gc2VsZi5jdXIgLSBzZWxmLm1pbgogICAgICAgICAgICAgICAgdCA9ICh0IC0gMSkgKiBzZWxmLmVsYXBzZWQKICAgICAgICByZXR1cm4gJyVzOiAlcycgJSAocHJlZml4LCBzZWxmLmZvcm1hdF9kdXJhdGlvbih0KSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzcGVlZChzZWxmKToKICAgICAgICBpZiBzZWxmLmVsYXBzZWQgPT0gMDoKICAgICAgICAgICAgcmVzdWx0ID0gMC4wCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gKHNlbGYuY3VyIC0gc2VsZi5taW4pIC8gc2VsZi5lbGFwc2VkCiAgICAgICAgZm9yIHVuaXQgaW4gVU5JVFM6CiAgICAgICAgICAgIGlmIHJlc3VsdCA8IDEwMDA6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICByZXN1bHQgLz0gMTAwMC4wCiAgICAgICAgcmV0dXJuICclZCAlc0IvcycgJSAocmVzdWx0LCB1bml0KQoKIwojIEdsb2IgZnVuY3Rpb25hbGl0eQojCgpSSUNIX0dMT0IgPSByZS5jb21waWxlKHInXHsoW159XSopXH0nKQpfQ0hFQ0tfUkVDVVJTSVZFX0dMT0IgPSByZS5jb21waWxlKHInW14vXFwse11cKlwqfFwqXCpbXi9cXCx9XScpCl9DSEVDS19NSVNNQVRDSF9TRVQgPSByZS5jb21waWxlKHInXltee10qXH18XHtbXn1dKiQnKQoKCmRlZiBpZ2xvYihwYXRoX2dsb2IpOgogICAgIiIiRXh0ZW5kZWQgZ2xvYmJpbmcgZnVuY3Rpb24gdGhhdCBzdXBwb3J0cyAqKiBhbmQge29wdDEsb3B0MixvcHQzfS4iIiIKICAgIGlmIF9DSEVDS19SRUNVUlNJVkVfR0xPQi5zZWFyY2gocGF0aF9nbG9iKToKICAgICAgICBtc2cgPSAiIiJpbnZhbGlkIGdsb2IgJXI6IHJlY3Vyc2l2ZSBnbG9iICIqKiIgbXVzdCBiZSB1c2VkIGFsb25lIiIiCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBwYXRoX2dsb2IpCiAgICBpZiBfQ0hFQ0tfTUlTTUFUQ0hfU0VULnNlYXJjaChwYXRoX2dsb2IpOgogICAgICAgIG1zZyA9ICIiImludmFsaWQgZ2xvYiAlcjogbWlzbWF0Y2hpbmcgc2V0IG1hcmtlciAneycgb3IgJ30nIiIiCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBwYXRoX2dsb2IpCiAgICByZXR1cm4gX2lnbG9iKHBhdGhfZ2xvYikKCgpkZWYgX2lnbG9iKHBhdGhfZ2xvYik6CiAgICByaWNoX3BhdGhfZ2xvYiA9IFJJQ0hfR0xPQi5zcGxpdChwYXRoX2dsb2IsIDEpCiAgICBpZiBsZW4ocmljaF9wYXRoX2dsb2IpID4gMToKICAgICAgICBhc3NlcnQgbGVuKHJpY2hfcGF0aF9nbG9iKSA9PSAzLCByaWNoX3BhdGhfZ2xvYgogICAgICAgIHByZWZpeCwgc2V0LCBzdWZmaXggPSByaWNoX3BhdGhfZ2xvYgogICAgICAgIGZvciBpdGVtIGluIHNldC5zcGxpdCgnLCcpOgogICAgICAgICAgICBmb3IgcGF0aCBpbiBfaWdsb2IoJycuam9pbigocHJlZml4LCBpdGVtLCBzdWZmaXgpKSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCiAgICBlbHNlOgogICAgICAgIGlmICcqKicgbm90IGluIHBhdGhfZ2xvYjoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc3RkX2lnbG9iKHBhdGhfZ2xvYik6CiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlZml4LCByYWRpY2FsID0gcGF0aF9nbG9iLnNwbGl0KCcqKicsIDEpCiAgICAgICAgICAgIGlmIHByZWZpeCA9PSAnJzoKICAgICAgICAgICAgICAgIHByZWZpeCA9ICcuJwogICAgICAgICAgICBpZiByYWRpY2FsID09ICcnOgogICAgICAgICAgICAgICAgcmFkaWNhbCA9ICcqJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyB3ZSBzdXBwb3J0IGJvdGgKICAgICAgICAgICAgICAgIHJhZGljYWwgPSByYWRpY2FsLmxzdHJpcCgnLycpCiAgICAgICAgICAgICAgICByYWRpY2FsID0gcmFkaWNhbC5sc3RyaXAoJ1xcJykKICAgICAgICAgICAgZm9yIHBhdGgsIGRpciwgZmlsZXMgaW4gb3Mud2FsayhwcmVmaXgpOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICAgICAgICAgIGZvciBmbiBpbiBfaWdsb2Iob3MucGF0aC5qb2luKHBhdGgsIHJhZGljYWwpKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBmbgoKaWYgc3NsOgogICAgZnJvbSAuY29tcGF0IGltcG9ydCAoSFRUUFNIYW5kbGVyIGFzIEJhc2VIVFRQU0hhbmRsZXIsIG1hdGNoX2hvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVFcnJvcikKCgojCiMgSFRUUFNDb25uZWN0aW9uIHdoaWNoIHZlcmlmaWVzIGNlcnRpZmljYXRlcy9tYXRjaGVzIGRvbWFpbnMKIwoKICAgIGNsYXNzIEhUVFBTQ29ubmVjdGlvbihodHRwbGliLkhUVFBTQ29ubmVjdGlvbik6CiAgICAgICAgY2FfY2VydHMgPSBOb25lICMgc2V0IHRoaXMgdG8gdGhlIHBhdGggdG8gdGhlIGNlcnRzIGZpbGUgKC5wZW0pCiAgICAgICAgY2hlY2tfZG9tYWluID0gVHJ1ZSAjIG9ubHkgdXNlZCBpZiBjYV9jZXJ0cyBpcyBub3QgTm9uZQoKICAgICAgICAjIG5vaW5zcGVjdGlvbiBQeVByb3BlcnR5QWNjZXNzCiAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgc2VsZi50aW1lb3V0KQogICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBGYWxzZSk6CiAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrCiAgICAgICAgICAgICAgICBzZWxmLl90dW5uZWwoKQoKICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnU1NMQ29udGV4dCcpOgogICAgICAgICAgICAgICAgIyBGb3IgMi54CiAgICAgICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgogICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVECiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcyA9IHNzbC5DRVJUX05PTkUKICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNzbC53cmFwX3NvY2tldChzb2NrLCBzZWxmLmtleV9maWxlLCBzZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9Y2VydF9yZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cykKICAgICAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgY29udGV4dCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCiAgICAgICAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMgfD0gc3NsLk9QX05PX1NTTHYyCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNlcnRfZmlsZToKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihzZWxmLmNlcnRfZmlsZSwgc2VsZi5rZXlfZmlsZSkKICAgICAgICAgICAgICAgIGt3YXJncyA9IHt9CiAgICAgICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZmlsZT1zZWxmLmNhX2NlcnRzKQogICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoc3NsLCAnSEFTX1NOSScsIEZhbHNlKToKICAgICAgICAgICAgICAgICAgICAgICAga3dhcmdzWydzZXJ2ZXJfaG9zdG5hbWUnXSA9IHNlbGYuaG9zdAogICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gY29udGV4dC53cmFwX3NvY2tldChzb2NrLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0cyBhbmQgc2VsZi5jaGVja19kb21haW46CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hfaG9zdG5hbWUoc2VsZi5zb2NrLmdldHBlZXJjZXJ0KCksIHNlbGYuaG9zdCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0hvc3QgdmVyaWZpZWQ6ICVzJywgc2VsZi5ob3N0KQogICAgICAgICAgICAgICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2suc2h1dGRvd24oc29ja2V0LlNIVVRfUkRXUikKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgY2xhc3MgSFRUUFNIYW5kbGVyKEJhc2VIVFRQU0hhbmRsZXIpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYV9jZXJ0cywgY2hlY2tfZG9tYWluPVRydWUpOgogICAgICAgICAgICBCYXNlSFRUUFNIYW5kbGVyLl9faW5pdF9fKHNlbGYpCiAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cwogICAgICAgICAgICBzZWxmLmNoZWNrX2RvbWFpbiA9IGNoZWNrX2RvbWFpbgoKICAgICAgICBkZWYgX2Nvbm5fbWFrZXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgaXMgY2FsbGVkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gaW5zdGFuY2UuIE5vcm1hbGx5IHlvdSdkCiAgICAgICAgICAgIHBhc3MgYSBjb25uZWN0aW9uIGNsYXNzIHRvIGRvX29wZW4sIGJ1dCBpdCBkb2Vzbid0IGFjdHVhbGx5IGNoZWNrIGZvcgogICAgICAgICAgICBhIGNsYXNzLCBhbmQganVzdCBleHBlY3RzIGEgY2FsbGFibGUuIEFzIGxvbmcgYXMgd2UgYmVoYXZlIGp1c3QgYXMgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciB3b3VsZCBoYXZlLCB3ZSBzaG91bGQgYmUgT0suIElmIGl0IGV2ZXIgY2hhbmdlcyBzbyB0aGF0CiAgICAgICAgICAgIHdlICptdXN0KiBwYXNzIGEgY2xhc3MsIHdlJ2xsIGNyZWF0ZSBhbiBVbnNhZmVIVFRQU0Nvbm5lY3Rpb24gY2xhc3MKICAgICAgICAgICAgd2hpY2gganVzdCBzZXRzIGNoZWNrX2RvbWFpbiB0byBGYWxzZSBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiwgYW5kCiAgICAgICAgICAgIGNob29zZSB3aGljaCBvbmUgdG8gcGFzcyB0byBkb19vcGVuLgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgcmVzdWx0ID0gSFRUUFNDb25uZWN0aW9uKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKICAgICAgICAgICAgICAgIHJlc3VsdC5jYV9jZXJ0cyA9IHNlbGYuY2FfY2VydHMKICAgICAgICAgICAgICAgIHJlc3VsdC5jaGVja19kb21haW4gPSBzZWxmLmNoZWNrX2RvbWFpbgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oc2VsZi5fY29ubl9tYWtlciwgcmVxKQogICAgICAgICAgICBleGNlcHQgVVJMRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmICdjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkJyBpbiBzdHIoZS5yZWFzb24pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoJ1VuYWJsZSB0byB2ZXJpZnkgc2VydmVyIGNlcnRpZmljYXRlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgJXMnICUgcmVxLmhvc3QpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgIwogICAgIyBUbyBwcmV2ZW50IGFnYWluc3QgbWl4aW5nIEhUVFAgdHJhZmZpYyB3aXRoIEhUVFBTIChleGFtcGxlczogQSBNYW4tSW4tVGhlLQogICAgIyBNaWRkbGUgcHJveHkgdXNpbmcgSFRUUCBsaXN0ZW5zIG9uIHBvcnQgNDQzLCBvciBhbiBpbmRleCBtaXN0YWtlbmx5IHNlcnZlcwogICAgIyBIVE1MIGNvbnRhaW5pbmcgYSBodHRwOi8veHl6IGxpbmsgd2hlbiBpdCBzaG91bGQgYmUgaHR0cHM6Ly94eXopLAogICAgIyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGhhbmRsZXIgY2xhc3MsIHdoaWNoIGRvZXMgbm90IGFsbG93IEhUVFAgdHJhZmZpYy4KICAgICMKICAgICMgSXQgd29ya3MgYnkgaW5oZXJpdGluZyBmcm9tIEhUVFBIYW5kbGVyIC0gc28gYnVpbGRfb3BlbmVyIHdvbid0IGFkZCBhCiAgICAjIGhhbmRsZXIgZm9yIEhUVFAgaXRzZWxmLgogICAgIwogICAgY2xhc3MgSFRUUFNPbmx5SGFuZGxlcihIVFRQU0hhbmRsZXIsIEhUVFBIYW5kbGVyKToKICAgICAgICBkZWYgaHR0cF9vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKCdVbmV4cGVjdGVkIEhUVFAgcmVxdWVzdCBvbiB3aGF0IHNob3VsZCBiZSBhIHNlY3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25uZWN0aW9uOiAlcycgJSByZXEpCgojCiMgWE1MLVJQQyB3aXRoIHRpbWVvdXRzCiMKCl92ZXJfaW5mbyA9IHN5cy52ZXJzaW9uX2luZm9bOjJdCgppZiBfdmVyX2luZm8gPT0gKDIsIDYpOgogICAgY2xhc3MgSFRUUChodHRwbGliLkhUVFApOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgICAgaWYgcG9ydCA9PSAwOiAgICMgMCBtZWFucyB1c2UgcG9ydCAwLCBub3QgdGhlIGRlZmF1bHQgcG9ydAogICAgICAgICAgICAgICAgcG9ydCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fc2V0dXAoc2VsZi5fY29ubmVjdGlvbl9jbGFzcyhob3N0LCBwb3J0LCAqKmt3YXJncykpCgoKICAgIGlmIHNzbDoKICAgICAgICBjbGFzcyBIVFRQUyhodHRwbGliLkhUVFBTKToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgaWYgcG9ydCA9PSAwOiAgICMgMCBtZWFucyB1c2UgcG9ydCAwLCBub3QgdGhlIGRlZmF1bHQgcG9ydAogICAgICAgICAgICAgICAgICAgIHBvcnQgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLl9zZXR1cChzZWxmLl9jb25uZWN0aW9uX2NsYXNzKGhvc3QsIHBvcnQsICoqa3dhcmdzKSkKCgpjbGFzcyBUcmFuc3BvcnQoeG1scnBjbGliLlRyYW5zcG9ydCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdGltZW91dCwgdXNlX2RhdGV0aW1lPTApOgogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICB4bWxycGNsaWIuVHJhbnNwb3J0Ll9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZSkKCiAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgogICAgICAgIGgsIGVoLCB4NTA5ID0gc2VsZi5nZXRfaG9zdF9pbmZvKGhvc3QpCiAgICAgICAgaWYgX3Zlcl9pbmZvID09ICgyLCA2KToKICAgICAgICAgICAgcmVzdWx0ID0gSFRUUChoLCB0aW1lb3V0PXNlbGYudGltZW91dCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGlvbiBvciBob3N0ICE9IHNlbGYuX2Nvbm5lY3Rpb25bMF06CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYV9oZWFkZXJzID0gZWgKICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBob3N0LCBodHRwbGliLkhUVFBDb25uZWN0aW9uKGgpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2Nvbm5lY3Rpb25bMV0KICAgICAgICByZXR1cm4gcmVzdWx0CgppZiBzc2w6CiAgICBjbGFzcyBTYWZlVHJhbnNwb3J0KHhtbHJwY2xpYi5TYWZlVHJhbnNwb3J0KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGltZW91dCwgdXNlX2RhdGV0aW1lPTApOgogICAgICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgICAgIHhtbHJwY2xpYi5TYWZlVHJhbnNwb3J0Ll9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZSkKCiAgICAgICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKICAgICAgICAgICAgaCwgZWgsIGt3YXJncyA9IHNlbGYuZ2V0X2hvc3RfaW5mbyhob3N0KQogICAgICAgICAgICBpZiBub3Qga3dhcmdzOgogICAgICAgICAgICAgICAga3dhcmdzID0ge30KICAgICAgICAgICAga3dhcmdzWyd0aW1lb3V0J10gPSBzZWxmLnRpbWVvdXQKICAgICAgICAgICAgaWYgX3Zlcl9pbmZvID09ICgyLCA2KToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEhUVFBTKGhvc3QsIE5vbmUsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3Rpb24gb3IgaG9zdCAhPSBzZWxmLl9jb25uZWN0aW9uWzBdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhX2hlYWRlcnMgPSBlaAogICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBob3N0LCBodHRwbGliLkhUVFBTQ29ubmVjdGlvbihoLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2Nvbm5lY3Rpb25bMV0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFNlcnZlclByb3h5KHhtbHJwY2xpYi5TZXJ2ZXJQcm94eSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJpLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dCA9IGt3YXJncy5wb3AoJ3RpbWVvdXQnLCBOb25lKQogICAgICAgICMgVGhlIGFib3ZlIGNsYXNzZXMgb25seSBjb21lIGludG8gcGxheSBpZiBhIHRpbWVvdXQKICAgICAgICAjIGlzIHNwZWNpZmllZAogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNjaGVtZSwgXyA9IHNwbGl0dHlwZSh1cmkpCiAgICAgICAgICAgIHVzZV9kYXRldGltZSA9IGt3YXJncy5nZXQoJ3VzZV9kYXRldGltZScsIDApCiAgICAgICAgICAgIGlmIHNjaGVtZSA9PSAnaHR0cHMnOgogICAgICAgICAgICAgICAgdGNscyA9IFNhZmVUcmFuc3BvcnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRjbHMgPSBUcmFuc3BvcnQKICAgICAgICAgICAga3dhcmdzWyd0cmFuc3BvcnQnXSA9IHQgPSB0Y2xzKHRpbWVvdXQsIHVzZV9kYXRldGltZT11c2VfZGF0ZXRpbWUpCiAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdAogICAgICAgIHhtbHJwY2xpYi5TZXJ2ZXJQcm94eS5fX2luaXRfXyhzZWxmLCB1cmksICoqa3dhcmdzKQoKIwojIENTViBmdW5jdGlvbmFsaXR5LiBUaGlzIGlzIHByb3ZpZGVkIGJlY2F1c2Ugb24gMi54LCB0aGUgY3N2IG1vZHVsZSBjYW4ndAojIGhhbmRsZSBVbmljb2RlLiBIb3dldmVyLCB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBVbmljb2RlIGluIGUuZy4gUkVDT1JEIGZpbGVzLgojCgpkZWYgX2Nzdl9vcGVuKGZuLCBtb2RlLCAqKmt3YXJncyk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICBtb2RlICs9ICdiJwogICAgZWxzZToKICAgICAgICBrd2FyZ3NbJ25ld2xpbmUnXSA9ICcnCiAgICByZXR1cm4gb3BlbihmbiwgbW9kZSwgKiprd2FyZ3MpCgoKY2xhc3MgQ1NWQmFzZShvYmplY3QpOgogICAgZGVmYXVsdHMgPSB7CiAgICAgICAgJ2RlbGltaXRlcic6IHN0cignLCcpLCAgICAgICMgVGhlIHN0cnMgYXJlIHVzZWQgYmVjYXVzZSB3ZSBuZWVkIG5hdGl2ZQogICAgICAgICdxdW90ZWNoYXInOiBzdHIoJyInKSwgICAgICAjIHN0ciBpbiB0aGUgY3N2IEFQSSAoMi54IHdvbid0IHRha2UKICAgICAgICAnbGluZXRlcm1pbmF0b3InOiBzdHIoJ1xuJykgIyBVbmljb2RlKQogICAgfQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCgoKY2xhc3MgQ1NWUmVhZGVyKENTVkJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBpZiAnc3RyZWFtJyBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHN0cmVhbSA9IGt3YXJnc1snc3RyZWFtJ10KICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgogICAgICAgICAgICAgICAgIyBuZWVkcyB0byBiZSBhIHRleHQgc3RyZWFtCiAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpKHN0cmVhbSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbSA9IF9jc3Zfb3Blbihrd2FyZ3NbJ3BhdGgnXSwgJ3InKQogICAgICAgIHNlbGYucmVhZGVyID0gY3N2LnJlYWRlcihzZWxmLnN0cmVhbSwgKipzZWxmLmRlZmF1bHRzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgIHJlc3VsdCA9IG5leHQoc2VsZi5yZWFkZXIpCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShyZXN1bHQpOgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtLmRlY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBfX25leHRfXyA9IG5leHQKCmNsYXNzIENTVldyaXRlcihDU1ZCYXNlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbiwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuc3RyZWFtID0gX2Nzdl9vcGVuKGZuLCAndycpCiAgICAgICAgc2VsZi53cml0ZXIgPSBjc3Yud3JpdGVyKHNlbGYuc3RyZWFtLCAqKnNlbGYuZGVmYXVsdHMpCgogICAgZGVmIHdyaXRlcm93KHNlbGYsIHJvdyk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIHIgPSBbXQogICAgICAgICAgICBmb3IgaXRlbSBpbiByb3c6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICByLmFwcGVuZChpdGVtKQogICAgICAgICAgICByb3cgPSByCiAgICAgICAgc2VsZi53cml0ZXIud3JpdGVyb3cocm93KQoKIwojICAgQ29uZmlndXJhdG9yIGZ1bmN0aW9uYWxpdHkKIwoKY2xhc3MgQ29uZmlndXJhdG9yKEJhc2VDb25maWd1cmF0b3IpOgoKICAgIHZhbHVlX2NvbnZlcnRlcnMgPSBkaWN0KEJhc2VDb25maWd1cmF0b3IudmFsdWVfY29udmVydGVycykKICAgIHZhbHVlX2NvbnZlcnRlcnNbJ2luYyddID0gJ2luY19jb252ZXJ0JwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcsIGJhc2U9Tm9uZSk6CiAgICAgICAgc3VwZXIoQ29uZmlndXJhdG9yLCBzZWxmKS5fX2luaXRfXyhjb25maWcpCiAgICAgICAgc2VsZi5iYXNlID0gYmFzZSBvciBvcy5nZXRjd2QoKQoKICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgZGVmIGNvbnZlcnQobyk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0eXBlKG8pKFtjb252ZXJ0KGkpIGZvciBpIGluIG9dKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobywgZGljdCk6CiAgICAgICAgICAgICAgICBpZiAnKCknIGluIG86CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKG8pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gbzoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tdID0gY29udmVydChvW2tdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb252ZXJ0KG8pCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICBpZiBub3QgY2FsbGFibGUoYyk6CiAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICBwcm9wcyA9IGNvbmZpZy5wb3AoJy4nLCBOb25lKQogICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCiAgICAgICAgYXJncyA9IGNvbmZpZy5wb3AoJ1tdJywgKCkpCiAgICAgICAgaWYgYXJnczoKICAgICAgICAgICAgYXJncyA9IHR1cGxlKFtjb252ZXJ0KG8pIGZvciBvIGluIGFyZ3NdKQogICAgICAgIGl0ZW1zID0gWyhrLCBjb252ZXJ0KGNvbmZpZ1trXSkpIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKV0KICAgICAgICBrd2FyZ3MgPSBkaWN0KGl0ZW1zKQogICAgICAgIHJlc3VsdCA9IGMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIHByb3BzOgogICAgICAgICAgICBmb3IgbiwgdiBpbiBwcm9wcy5pdGVtcygpOgogICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIG4sIGNvbnZlcnQodikpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlnW2tleV0KICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCkgYW5kICcoKScgaW4gcmVzdWx0OgogICAgICAgICAgICBzZWxmLmNvbmZpZ1trZXldID0gcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKHJlc3VsdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGluY19jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGluYzovLyBwcm90b2NvbC4iIiIKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Ficyh2YWx1ZSk6CiAgICAgICAgICAgIHZhbHVlID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZSwgdmFsdWUpCiAgICAgICAgd2l0aCBjb2RlY3Mub3Blbih2YWx1ZSwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICByZXN1bHQgPSBqc29uLmxvYWQoZikKICAgICAgICByZXR1cm4gcmVzdWx0CgojCiMgTWl4aW4gZm9yIHJ1bm5pbmcgc3VicHJvY2Vzc2VzIGFuZCBjYXB0dXJpbmcgdGhlaXIgb3V0cHV0CiMKCmNsYXNzIFN1YnByb2Nlc3NNaXhpbihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9RmFsc2UsIHByb2dyZXNzPU5vbmUpOgogICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKICAgICAgICBzZWxmLnByb2dyZXNzID0gcHJvZ3Jlc3MKCiAgICBkZWYgcmVhZGVyKHNlbGYsIHN0cmVhbSwgY29udGV4dCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVhZCBsaW5lcyBmcm9tIGEgc3VicHJvY2Vzcycgb3V0cHV0IHN0cmVhbSBhbmQgZWl0aGVyIHBhc3MgdG8gYSBwcm9ncmVzcwogICAgICAgIGNhbGxhYmxlIChpZiBzcGVjaWZpZWQpIG9yIHdyaXRlIHByb2dyZXNzIGluZm9ybWF0aW9uIHRvIHN5cy5zdGRlcnIuCiAgICAgICAgIiIiCiAgICAgICAgcHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzCiAgICAgICAgdmVyYm9zZSA9IHNlbGYudmVyYm9zZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHMgPSBzdHJlYW0ucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHByb2dyZXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcHJvZ3Jlc3MocywgY29udGV4dCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCB2ZXJib3NlOgogICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJy4nKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHMuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCiAgICAgICAgc3RyZWFtLmNsb3NlKCkKCiAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY21kLCAqKmt3YXJncyk6CiAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsICoqa3dhcmdzKQogICAgICAgIHQxID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5yZWFkZXIsIGFyZ3M9KHAuc3Rkb3V0LCAnc3Rkb3V0JykpCiAgICAgICAgdDEuc3RhcnQoKQogICAgICAgIHQyID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5yZWFkZXIsIGFyZ3M9KHAuc3RkZXJyLCAnc3RkZXJyJykpCiAgICAgICAgdDIuc3RhcnQoKQogICAgICAgIHAud2FpdCgpCiAgICAgICAgdDEuam9pbigpCiAgICAgICAgdDIuam9pbigpCiAgICAgICAgaWYgc2VsZi5wcm9ncmVzcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5wcm9ncmVzcygnZG9uZS4nLCAnbWFpbicpCiAgICAgICAgZWxpZiBzZWxmLnZlcmJvc2U6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ2RvbmUuXG4nKQogICAgICAgIHJldHVybiBwCgoKZGVmIG5vcm1hbGl6ZV9uYW1lKG5hbWUpOgogICAgIiIiTm9ybWFsaXplIGEgcHl0aG9uIHBhY2thZ2UgbmFtZSBhIGxhIFBFUCA1MDMiIiIKICAgICMgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDUwMy8jbm9ybWFsaXplZC1uYW1lcwogICAgcmV0dXJuIHJlLnN1YignWy1fLl0rJywgJy0nLCBuYW1lKS5sb3dlcigpClBLAwQUAAAAAAAAACEAoP0FVp9cAACfXAAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3ZlcnNpb24ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiIKSW1wbGVtZW50YXRpb24gb2YgYSBmbGV4aWJsZSB2ZXJzaW9uaW5nIHNjaGVtZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgUEVQLTQ0MCwKc2V0dXB0b29scy1jb21wYXRpYmxlIGFuZCBzZW1hbnRpYyB2ZXJzaW9uaW5nLgoiIiIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKCl9fYWxsX18gPSBbJ05vcm1hbGl6ZWRWZXJzaW9uJywgJ05vcm1hbGl6ZWRNYXRjaGVyJywKICAgICAgICAgICAnTGVnYWN5VmVyc2lvbicsICdMZWdhY3lNYXRjaGVyJywKICAgICAgICAgICAnU2VtYW50aWNWZXJzaW9uJywgJ1NlbWFudGljTWF0Y2hlcicsCiAgICAgICAgICAgJ1Vuc3VwcG9ydGVkVmVyc2lvbkVycm9yJywgJ2dldF9zY2hlbWUnXQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJUaGlzIGlzIGFuIHVuc3VwcG9ydGVkIHZlcnNpb24uIiIiCiAgICBwYXNzCgoKY2xhc3MgVmVyc2lvbihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHMpOgogICAgICAgIHNlbGYuX3N0cmluZyA9IHMgPSBzLnN0cmlwKCkKICAgICAgICBzZWxmLl9wYXJ0cyA9IHBhcnRzID0gc2VsZi5wYXJzZShzKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcnRzLCB0dXBsZSkKICAgICAgICBhc3NlcnQgbGVuKHBhcnRzKSA+IDAKCiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigncGxlYXNlIGltcGxlbWVudCBpbiBhIHN1YmNsYXNzJykKCiAgICBkZWYgX2NoZWNrX2NvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIHR5cGUoc2VsZikgIT0gdHlwZShvdGhlcik6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignY2Fubm90IGNvbXBhcmUgJXIgYW5kICVyJyAlIChzZWxmLCBvdGhlcikpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgc2VsZi5fY2hlY2tfY29tcGF0aWJsZShvdGhlcikKICAgICAgICByZXR1cm4gc2VsZi5fcGFydHMgPT0gb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBzZWxmLl9jaGVja19jb21wYXRpYmxlKG90aGVyKQogICAgICAgIHJldHVybiBzZWxmLl9wYXJ0cyA8IG90aGVyLl9wYXJ0cwoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgKHNlbGYuX19sdF9fKG90aGVyKSBvciBzZWxmLl9fZXFfXyhvdGhlcikpCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19sdF9fKG90aGVyKSBvciBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX2d0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9wYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcygnJXMnKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX3N0cmluZykKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RyaW5nCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHN1YmNsYXNzZXMuJykKCgpjbGFzcyBNYXRjaGVyKG9iamVjdCk6CiAgICB2ZXJzaW9uX2NsYXNzID0gTm9uZQoKICAgIGRpc3RfcmUgPSByZS5jb21waWxlKHIiXihcd1tcc1x3Jy4tXSopKFwoKC4qKVwpKT8iKQogICAgY29tcF9yZSA9IHJlLmNvbXBpbGUocideKDw9fD49fDx8PnwhPXw9ezIsM318fj0pP1xzKihbXlxzLF0rKSQnKQogICAgbnVtX3JlID0gcmUuY29tcGlsZShyJ15cZCsoXC5cZCspKiQnKQoKICAgICMgdmFsdWUgaXMgZWl0aGVyIGEgY2FsbGFibGUgb3IgdGhlIG5hbWUgb2YgYSBtZXRob2QKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgJzwnOiBsYW1iZGEgdiwgYywgcDogdiA8IGMsCiAgICAgICAgJz4nOiBsYW1iZGEgdiwgYywgcDogdiA+IGMsCiAgICAgICAgJzw9JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYyBvciB2IDwgYywKICAgICAgICAnPj0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjIG9yIHYgPiBjLAogICAgICAgICc9PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMsCiAgICAgICAgJz09PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMsCiAgICAgICAgIyBieSBkZWZhdWx0LCBjb21wYXRpYmxlID0+ID49LgogICAgICAgICd+PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMgb3IgdiA+IGMsCiAgICAgICAgJyE9JzogbGFtYmRhIHYsIGMsIHA6IHYgIT0gYywKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi52ZXJzaW9uX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsZWFzZSBzcGVjaWZ5IGEgdmVyc2lvbiBjbGFzcycpCiAgICAgICAgc2VsZi5fc3RyaW5nID0gcyA9IHMuc3RyaXAoKQogICAgICAgIG0gPSBzZWxmLmRpc3RfcmUubWF0Y2gocykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IHZhbGlkOiAlcicgJSBzKQogICAgICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCcnKQogICAgICAgIHNlbGYubmFtZSA9IGdyb3Vwc1swXS5zdHJpcCgpCiAgICAgICAgc2VsZi5rZXkgPSBzZWxmLm5hbWUubG93ZXIoKSAgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgY2xpc3QgPSBbXQogICAgICAgIGlmIGdyb3Vwc1syXToKICAgICAgICAgICAgY29uc3RyYWludHMgPSBbYy5zdHJpcCgpIGZvciBjIGluIGdyb3Vwc1syXS5zcGxpdCgnLCcpXQogICAgICAgICAgICBmb3IgYyBpbiBjb25zdHJhaW50czoKICAgICAgICAgICAgICAgIG0gPSBzZWxmLmNvbXBfcmUubWF0Y2goYykKICAgICAgICAgICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgJXIgaW4gJXInICUgKGMsIHMpKQogICAgICAgICAgICAgICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgICAgICAgICAgICAgb3AgPSBncm91cHNbMF0gb3IgJ349JwogICAgICAgICAgICAgICAgcyA9IGdyb3Vwc1sxXQogICAgICAgICAgICAgICAgaWYgcy5lbmRzd2l0aCgnLionKToKICAgICAgICAgICAgICAgICAgICBpZiBvcCBub3QgaW4gKCc9PScsICchPScpOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdcJy4qXCcgbm90IGFsbG93ZWQgZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgY29uc3RyYWludHMnICUgb3ApCiAgICAgICAgICAgICAgICAgICAgIyBDb3VsZCBiZSBhIHBhcnRpYWwgdmVyc2lvbiAoZS5nLiBmb3IgJzIuKicpIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgIyB3b24ndCBwYXJzZSBhcyBhIHZlcnNpb24sIHNvIGtlZXAgaXQgYXMgYSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICB2biwgcHJlZml4ID0gc1s6LTJdLCBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubnVtX3JlLm1hdGNoKHZuKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBKdXN0IHRvIGNoZWNrIHRoYXQgdm4gaXMgYSB2YWxpZCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbl9jbGFzcyh2bikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGQgcGFyc2UgYXMgYSB2ZXJzaW9uLCBzbyB3ZSBjYW4gY3JlYXRlIGFuCiAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSBmb3IgdGhlIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB2biwgcHJlZml4ID0gc2VsZi52ZXJzaW9uX2NsYXNzKHMpLCBGYWxzZQogICAgICAgICAgICAgICAgY2xpc3QuYXBwZW5kKChvcCwgdm4sIHByZWZpeCkpCiAgICAgICAgc2VsZi5fcGFydHMgPSB0dXBsZShjbGlzdCkKCiAgICBkZWYgbWF0Y2goc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIHZlcnNpb24gbWF0Y2hlcyB0aGUgY29uc3RyYWludHMuCgogICAgICAgIDpwYXJhbSB2ZXJzaW9uOiBUaGUgdmVyc2lvbiB0byBtYXRjaCBhZ2FpbnN0IHRoaXMgaW5zdGFuY2UuCiAgICAgICAgOnR5cGUgdmVyc2lvbjogU3RyaW5nIG9yIDpjbGFzczpgVmVyc2lvbmAgaW5zdGFuY2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uX2NsYXNzKHZlcnNpb24pCiAgICAgICAgZm9yIG9wZXJhdG9yLCBjb25zdHJhaW50LCBwcmVmaXggaW4gc2VsZi5fcGFydHM6CiAgICAgICAgICAgIGYgPSBzZWxmLl9vcGVyYXRvcnMuZ2V0KG9wZXJhdG9yKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBmID0gZ2V0YXR0cihzZWxmLCBmKQogICAgICAgICAgICBpZiBub3QgZjoKICAgICAgICAgICAgICAgIG1zZyA9ICgnJXIgbm90IGltcGxlbWVudGVkICcKICAgICAgICAgICAgICAgICAgICAgICAnZm9yICVzJyAlIChvcGVyYXRvciwgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pKQogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihtc2cpCiAgICAgICAgICAgIGlmIG5vdCBmKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4YWN0X3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmIGxlbihzZWxmLl9wYXJ0cykgPT0gMSBhbmQgc2VsZi5fcGFydHNbMF1bMF0gaW4gKCc9PScsICc9PT0nKToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcGFydHNbMF1bMV0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9jaGVja19jb21wYXRpYmxlKHNlbGYsIG90aGVyKToKICAgICAgICBpZiB0eXBlKHNlbGYpICE9IHR5cGUob3RoZXIpIG9yIHNlbGYubmFtZSAhPSBvdGhlci5uYW1lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Nhbm5vdCBjb21wYXJlICVzIGFuZCAlcycgJSAoc2VsZiwgb3RoZXIpKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHNlbGYuX2NoZWNrX2NvbXBhdGlibGUob3RoZXIpCiAgICAgICAgcmV0dXJuIHNlbGYua2V5ID09IG90aGVyLmtleSBhbmQgc2VsZi5fcGFydHMgPT0gb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5rZXkpICsgaGFzaChzZWxmLl9wYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9zdHJpbmcpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0cmluZwoKClBFUDQ0MF9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJ152PyhcZCshKT8oXGQrKFwuXGQrKSopKChhfGJ8Y3xyYykoXGQrKSk/JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoXC4ocG9zdCkoXGQrKSk/KFwuKGRldikoXGQrKSk/JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoXCsoW2EtekEtWlxkXSsoXC5bYS16QS1aXGRdKyk/KSk/JCcpCgoKZGVmIF9wZXBfNDQwX2tleShzKToKICAgIHMgPSBzLnN0cmlwKCkKICAgIG0gPSBQRVA0NDBfVkVSU0lPTl9SRS5tYXRjaChzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IoJ05vdCBhIHZhbGlkIHZlcnNpb246ICVzJyAlIHMpCiAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICBudW1zID0gdHVwbGUoaW50KHYpIGZvciB2IGluIGdyb3Vwc1sxXS5zcGxpdCgnLicpKQogICAgd2hpbGUgbGVuKG51bXMpID4gMSBhbmQgbnVtc1stMV0gPT0gMDoKICAgICAgICBudW1zID0gbnVtc1s6LTFdCgogICAgaWYgbm90IGdyb3Vwc1swXToKICAgICAgICBlcG9jaCA9IDAKICAgIGVsc2U6CiAgICAgICAgZXBvY2ggPSBpbnQoZ3JvdXBzWzBdKQogICAgcHJlID0gZ3JvdXBzWzQ6Nl0KICAgIHBvc3QgPSBncm91cHNbNzo5XQogICAgZGV2ID0gZ3JvdXBzWzEwOjEyXQogICAgbG9jYWwgPSBncm91cHNbMTNdCiAgICBpZiBwcmUgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIHByZSA9ICgpCiAgICBlbHNlOgogICAgICAgIHByZSA9IHByZVswXSwgaW50KHByZVsxXSkKICAgIGlmIHBvc3QgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIHBvc3QgPSAoKQogICAgZWxzZToKICAgICAgICBwb3N0ID0gcG9zdFswXSwgaW50KHBvc3RbMV0pCiAgICBpZiBkZXYgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIGRldiA9ICgpCiAgICBlbHNlOgogICAgICAgIGRldiA9IGRldlswXSwgaW50KGRldlsxXSkKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgbG9jYWwgPSAoKQogICAgZWxzZToKICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgZm9yIHBhcnQgaW4gbG9jYWwuc3BsaXQoJy4nKToKICAgICAgICAgICAgIyB0byBlbnN1cmUgdGhhdCBudW1lcmljIGNvbXBhcmVzIGFzID4gbGV4aWNvZ3JhcGhpYywgYXZvaWQKICAgICAgICAgICAgIyBjb21wYXJpbmcgdGhlbSBkaXJlY3RseSwgYnV0IGVuY29kZSBhIHR1cGxlIHdoaWNoIGVuc3VyZXMKICAgICAgICAgICAgIyBjb3JyZWN0IHNvcnRpbmcKICAgICAgICAgICAgaWYgcGFydC5pc2RpZ2l0KCk6CiAgICAgICAgICAgICAgICBwYXJ0ID0gKDEsIGludChwYXJ0KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcnQgPSAoMCwgcGFydCkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgbG9jYWwgPSB0dXBsZShwYXJ0cykKICAgIGlmIG5vdCBwcmU6CiAgICAgICAgIyBlaXRoZXIgYmVmb3JlIHByZS1yZWxlYXNlLCBvciBmaW5hbCByZWxlYXNlIGFuZCBhZnRlcgogICAgICAgIGlmIG5vdCBwb3N0IGFuZCBkZXY6CiAgICAgICAgICAgICMgYmVmb3JlIHByZS1yZWxlYXNlCiAgICAgICAgICAgIHByZSA9ICgnYScsIC0xKSAgICAgIyB0byBzb3J0IGJlZm9yZSBhMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZSA9ICgneicsKSAgICAgICAgIyB0byBzb3J0IGFmdGVyIGFsbCBwcmUtcmVsZWFzZXMKICAgICMgbm93IGxvb2sgYXQgdGhlIHN0YXRlIG9mIHBvc3QgYW5kIGRldi4KICAgIGlmIG5vdCBwb3N0OgogICAgICAgIHBvc3QgPSAoJ18nLCkgICAjIHNvcnQgYmVmb3JlICdhJwogICAgaWYgbm90IGRldjoKICAgICAgICBkZXYgPSAoJ2ZpbmFsJywpCgogICAgI3ByaW50KCclcyAtPiAlcycgJSAocywgbS5ncm91cHMoKSkpCiAgICByZXR1cm4gZXBvY2gsIG51bXMsIHByZSwgcG9zdCwgZGV2LCBsb2NhbAoKCl9ub3JtYWxpemVkX2tleSA9IF9wZXBfNDQwX2tleQoKCmNsYXNzIE5vcm1hbGl6ZWRWZXJzaW9uKFZlcnNpb24pOgogICAgIiIiQSByYXRpb25hbCB2ZXJzaW9uLgoKICAgIEdvb2Q6CiAgICAgICAgMS4yICAgICAgICAgIyBlcXVpdmFsZW50IHRvICIxLjIuMCIKICAgICAgICAxLjIuMAogICAgICAgIDEuMmExCiAgICAgICAgMS4yLjNhMgogICAgICAgIDEuMi4zYjEKICAgICAgICAxLjIuM2MxCiAgICAgICAgMS4yLjMuNAogICAgICAgIFRPRE86IGZpbGwgdGhpcyBvdXQKCiAgICBCYWQ6CiAgICAgICAgMSAgICAgICAgICAgIyBtaW5pbXVtIHR3byBudW1iZXJzCiAgICAgICAgMS4yYSAgICAgICAgIyByZWxlYXNlIGxldmVsIG11c3QgaGF2ZSBhIHJlbGVhc2Ugc2VyaWFsCiAgICAgICAgMS4yLjNiCiAgICAiIiIKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByZXN1bHQgPSBfbm9ybWFsaXplZF9rZXkocykKICAgICAgICAjIF9ub3JtYWxpemVkX2tleSBsb3NlcyB0cmFpbGluZyB6ZXJvZXMgaW4gdGhlIHJlbGVhc2UKICAgICAgICAjIGNsYXVzZSwgc2luY2UgdGhhdCdzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBYLlkgPT0gWC5ZLjAgPT0gWC5ZLjAuMAogICAgICAgICMgSG93ZXZlciwgUEVQIDQ0MCBwcmVmaXggbWF0Y2hpbmcgbmVlZHMgaXQ6IGZvciBleGFtcGxlLAogICAgICAgICMgKH49IDEuNC41LjApIG1hdGNoZXMgZGlmZmVyZW50bHkgdG8gKH49IDEuNC41LjAuMCkuCiAgICAgICAgbSA9IFBFUDQ0MF9WRVJTSU9OX1JFLm1hdGNoKHMpICAgICAgIyBtdXN0IHN1Y2NlZWQKICAgICAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICAgICAgc2VsZi5fcmVsZWFzZV9jbGF1c2UgPSB0dXBsZShpbnQodikgZm9yIHYgaW4gZ3JvdXBzWzFdLnNwbGl0KCcuJykpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIFBSRVJFTF9UQUdTID0gc2V0KFsnYScsICdiJywgJ2MnLCAncmMnLCAnZGV2J10pCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYW55KHRbMF0gaW4gc2VsZi5QUkVSRUxfVEFHUyBmb3IgdCBpbiBzZWxmLl9wYXJ0cyBpZiB0KQoKCmRlZiBfbWF0Y2hfcHJlZml4KHgsIHkpOgogICAgeCA9IHN0cih4KQogICAgeSA9IHN0cih5KQogICAgaWYgeCA9PSB5OgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBub3QgeC5zdGFydHN3aXRoKHkpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgbiA9IGxlbih5KQogICAgcmV0dXJuIHhbbl0gPT0gJy4nCgoKY2xhc3MgTm9ybWFsaXplZE1hdGNoZXIoTWF0Y2hlcik6CiAgICB2ZXJzaW9uX2NsYXNzID0gTm9ybWFsaXplZFZlcnNpb24KCiAgICAjIHZhbHVlIGlzIGVpdGhlciBhIGNhbGxhYmxlIG9yIHRoZSBuYW1lIG9mIGEgbWV0aG9kCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICd+PSc6ICdfbWF0Y2hfY29tcGF0aWJsZScsCiAgICAgICAgJzwnOiAnX21hdGNoX2x0JywKICAgICAgICAnPic6ICdfbWF0Y2hfZ3QnLAogICAgICAgICc8PSc6ICdfbWF0Y2hfbGUnLAogICAgICAgICc+PSc6ICdfbWF0Y2hfZ2UnLAogICAgICAgICc9PSc6ICdfbWF0Y2hfZXEnLAogICAgICAgICc9PT0nOiAnX21hdGNoX2FyYml0cmFyeScsCiAgICAgICAgJyE9JzogJ19tYXRjaF9uZScsCiAgICB9CgogICAgZGVmIF9hZGp1c3RfbG9jYWwoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIHN0cmlwX2xvY2FsID0gJysnIG5vdCBpbiBjb25zdHJhaW50IGFuZCB2ZXJzaW9uLl9wYXJ0c1stMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGJvdGggY29uc3RyYWludCBhbmQgdmVyc2lvbiBhcmUKICAgICAgICAgICAgIyBOb3JtYWxpemVkVmVyc2lvbiBpbnN0YW5jZXMuCiAgICAgICAgICAgICMgSWYgY29uc3RyYWludCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgY29tcG9uZW50LAogICAgICAgICAgICAjIGVuc3VyZSB0aGUgdmVyc2lvbiBkb2Vzbid0LCBlaXRoZXIuCiAgICAgICAgICAgIHN0cmlwX2xvY2FsID0gbm90IGNvbnN0cmFpbnQuX3BhcnRzWy0xXSBhbmQgdmVyc2lvbi5fcGFydHNbLTFdCiAgICAgICAgaWYgc3RyaXBfbG9jYWw6CiAgICAgICAgICAgIHMgPSB2ZXJzaW9uLl9zdHJpbmcuc3BsaXQoJysnLCAxKVswXQogICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uX2NsYXNzKHMpCiAgICAgICAgcmV0dXJuIHZlcnNpb24sIGNvbnN0cmFpbnQKCiAgICBkZWYgX21hdGNoX2x0KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA+PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgcGZ4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiByZWxlYXNlX2NsYXVzZV0pCiAgICAgICAgcmV0dXJuIG5vdCBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCiAgICBkZWYgX21hdGNoX2d0KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA8PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgcGZ4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiByZWxlYXNlX2NsYXVzZV0pCiAgICAgICAgcmV0dXJuIG5vdCBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCiAgICBkZWYgX21hdGNoX2xlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgcmV0dXJuIHZlcnNpb24gPD0gY29uc3RyYWludAoKICAgIGRlZiBfbWF0Y2hfZ2Uoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICByZXR1cm4gdmVyc2lvbiA+PSBjb25zdHJhaW50CgogICAgZGVmIF9tYXRjaF9lcShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJlc3VsdCA9ICh2ZXJzaW9uID09IGNvbnN0cmFpbnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX21hdGNoX2FyYml0cmFyeShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzdHIodmVyc2lvbikgPT0gc3RyKGNvbnN0cmFpbnQpCgogICAgZGVmIF9tYXRjaF9uZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJlc3VsdCA9ICh2ZXJzaW9uICE9IGNvbnN0cmFpbnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgY29uc3RyYWludCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9tYXRjaF9jb21wYXRpYmxlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA9PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIHZlcnNpb24gPCBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKIyAgICAgICAgaWYgbm90IHByZWZpeDoKIyAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmVsZWFzZV9jbGF1c2UgPSBjb25zdHJhaW50Ll9yZWxlYXNlX2NsYXVzZQogICAgICAgIGlmIGxlbihyZWxlYXNlX2NsYXVzZSkgPiAxOgogICAgICAgICAgICByZWxlYXNlX2NsYXVzZSA9IHJlbGVhc2VfY2xhdXNlWzotMV0KICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBwZngpCgpfUkVQTEFDRU1FTlRTID0gKAogICAgKHJlLmNvbXBpbGUoJ1suKy1dJCcpLCAnJyksICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgcHVuY3RzCiAgICAocmUuY29tcGlsZShyJ15bLl0oXGQpJyksIHInMC5cMScpLCAgICAgICAgICAgICAjIC5OIC0+IDAuTiBhdCBzdGFydAogICAgKHJlLmNvbXBpbGUoJ15bLi1dJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKHInXlwoKC4qKVwpJCcpLCByJ1wxJyksICAgICAgICAgICAgICMgcmVtb3ZlIHBhcmVudGhlc2VzCiAgICAocmUuY29tcGlsZShyJ152KGVyc2lvbik/XHMqKFxkKyknKSwgcidcMicpLCAgICAjIHJlbW92ZSBsZWFkaW5nIHYoZXJzaW9uKQogICAgKHJlLmNvbXBpbGUocidecihldik/XHMqKFxkKyknKSwgcidcMicpLCAgICAgICAgIyByZW1vdmUgbGVhZGluZyB2KGVyc2lvbikKICAgIChyZS5jb21waWxlKCdbLl17Mix9JyksICcuJyksICAgICAgICAgICAgICAgICAgICMgbXVsdGlwbGUgcnVucyBvZiAnLicKICAgIChyZS5jb21waWxlKHInXGIoYWxmYXxhcGhhKVxiJyksICdhbHBoYScpLCAgICAgICMgbWlzc3BlbHQgYWxwaGEKICAgIChyZS5jb21waWxlKHInXGIocHJlLWFscGhhfHByZWFscGhhKVxiJyksCiAgICAgICAgICAgICAgICAncHJlLmFscGhhJyksICAgICAgICAgICAgICAgICAgICAgICAjIHN0YW5kYXJkaXNlCiAgICAocmUuY29tcGlsZShyJ1woYmV0YVwpJCcpLCAnYmV0YScpLCAgICAgICAgICAgICAjIHJlbW92ZSBwYXJlbnRoZXNlcwopCgpfU1VGRklYX1JFUExBQ0VNRU5UUyA9ICgKICAgIChyZS5jb21waWxlKCdeWzp+Ll8rLV0rJyksICcnKSwgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKCdbLCoiKShbXF1dJyksICcnKSwgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdW53YW50ZWQgY2hhcnMKICAgIChyZS5jb21waWxlKCdbfjorXyAtXScpLCAnLicpLCAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIGlsbGVnYWwgY2hhcnMKICAgIChyZS5jb21waWxlKCdbLl17Mix9JyksICcuJyksICAgICAgICAgICAgICAgICAgICMgbXVsdGlwbGUgcnVucyBvZiAnLicKICAgIChyZS5jb21waWxlKHInXC4kJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAgICMgdHJhaWxpbmcgJy4nCikKCl9OVU1FUklDX1BSRUZJWCA9IHJlLmNvbXBpbGUocicoXGQrKFwuXGQrKSopJykKCgpkZWYgX3N1Z2dlc3Rfc2VtYW50aWNfdmVyc2lvbihzKToKICAgICIiIgogICAgVHJ5IHRvIHN1Z2dlc3QgYSBzZW1hbnRpYyBmb3JtIGZvciBhIHZlcnNpb24gZm9yIHdoaWNoCiAgICBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24gY291bGRuJ3QgY29tZSB1cCB3aXRoIGFueXRoaW5nLgogICAgIiIiCiAgICByZXN1bHQgPSBzLnN0cmlwKCkubG93ZXIoKQogICAgZm9yIHBhdCwgcmVwbCBpbiBfUkVQTEFDRU1FTlRTOgogICAgICAgIHJlc3VsdCA9IHBhdC5zdWIocmVwbCwgcmVzdWx0KQogICAgaWYgbm90IHJlc3VsdDoKICAgICAgICByZXN1bHQgPSAnMC4wLjAnCgogICAgIyBOb3cgbG9vayBmb3IgbnVtZXJpYyBwcmVmaXgsIGFuZCBzZXBhcmF0ZSBpdCBvdXQgZnJvbQogICAgIyB0aGUgcmVzdC4KICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgIG0gPSBfTlVNRVJJQ19QUkVGSVgubWF0Y2gocmVzdWx0KQogICAgaWYgbm90IG06CiAgICAgICAgcHJlZml4ID0gJzAuMC4wJwogICAgICAgIHN1ZmZpeCA9IHJlc3VsdAogICAgZWxzZToKICAgICAgICBwcmVmaXggPSBtLmdyb3VwcygpWzBdLnNwbGl0KCcuJykKICAgICAgICBwcmVmaXggPSBbaW50KGkpIGZvciBpIGluIHByZWZpeF0KICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IDM6CiAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoMCkKICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSAzOgogICAgICAgICAgICBzdWZmaXggPSByZXN1bHRbbS5lbmQoKTpdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBwcmVmaXhbMzpdXSkgKyByZXN1bHRbbS5lbmQoKTpdCiAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6M10KICAgICAgICBwcmVmaXggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHByZWZpeF0pCiAgICAgICAgc3VmZml4ID0gc3VmZml4LnN0cmlwKCkKICAgIGlmIHN1ZmZpeDoKICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgIyBtYXNzYWdlIHRoZSBzdWZmaXguCiAgICAgICAgZm9yIHBhdCwgcmVwbCBpbiBfU1VGRklYX1JFUExBQ0VNRU5UUzoKICAgICAgICAgICAgc3VmZml4ID0gcGF0LnN1YihyZXBsLCBzdWZmaXgpCgogICAgaWYgbm90IHN1ZmZpeDoKICAgICAgICByZXN1bHQgPSBwcmVmaXgKICAgIGVsc2U6CiAgICAgICAgc2VwID0gJy0nIGlmICdkZXYnIGluIHN1ZmZpeCBlbHNlICcrJwogICAgICAgIHJlc3VsdCA9IHByZWZpeCArIHNlcCArIHN1ZmZpeAogICAgaWYgbm90IGlzX3NlbXZlcihyZXN1bHQpOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3N1Z2dlc3Rfbm9ybWFsaXplZF92ZXJzaW9uKHMpOgogICAgIiIiU3VnZ2VzdCBhIG5vcm1hbGl6ZWQgdmVyc2lvbiBjbG9zZSB0byB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcuCgogICAgSWYgeW91IGhhdmUgYSB2ZXJzaW9uIHN0cmluZyB0aGF0IGlzbid0IHJhdGlvbmFsIChpLmUuIE5vcm1hbGl6ZWRWZXJzaW9uCiAgICBkb2Vzbid0IGxpa2UgaXQpIHRoZW4geW91IG1pZ2h0IGJlIGFibGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgKG9yIGNsb3NlKQogICAgcmF0aW9uYWwgdmVyc2lvbiBmcm9tIHRoaXMgZnVuY3Rpb24uCgogICAgVGhpcyBkb2VzIGEgbnVtYmVyIG9mIHNpbXBsZSBub3JtYWxpemF0aW9ucyB0byB0aGUgZ2l2ZW4gc3RyaW5nLCBiYXNlZAogICAgb24gb2JzZXJ2YXRpb24gb2YgdmVyc2lvbnMgY3VycmVudGx5IGluIHVzZSBvbiBQeVBJLiBHaXZlbiBhIGR1bXAgb2YKICAgIHRob3NlIHZlcnNpb24gZHVyaW5nIFB5Q29uIDIwMDksIDQyODcgb2YgdGhlbToKICAgIC0gMjMxMiAoNTMuOTMlKSBtYXRjaCBOb3JtYWxpemVkVmVyc2lvbiB3aXRob3V0IGNoYW5nZQogICAgICB3aXRoIHRoZSBhdXRvbWF0aWMgc3VnZ2VzdGlvbgogICAgLSAzNDc0ICg4MS4wNCUpIG1hdGNoIHdoZW4gdXNpbmcgdGhpcyBzdWdnZXN0aW9uIG1ldGhvZAoKICAgIEBwYXJhbSBzIHtzdHJ9IEFuIGlycmF0aW9uYWwgdmVyc2lvbiBzdHJpbmcuCiAgICBAcmV0dXJucyBBIHJhdGlvbmFsIHZlcnNpb24gc3RyaW5nLCBvciBOb25lLCBpZiBjb3VsZG4ndCBkZXRlcm1pbmUgb25lLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgX25vcm1hbGl6ZWRfa2V5KHMpCiAgICAgICAgcmV0dXJuIHMgICAjIGFscmVhZHkgcmF0aW9uYWwKICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICBwYXNzCgogICAgcnMgPSBzLmxvd2VyKCkKCiAgICAjIHBhcnQgb2YgdGhpcyBjb3VsZCB1c2UgbWFrZXRyYW5zCiAgICBmb3Igb3JpZywgcmVwbCBpbiAoKCctYWxwaGEnLCAnYScpLCAoJy1iZXRhJywgJ2InKSwgKCdhbHBoYScsICdhJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCdiZXRhJywgJ2InKSwgKCdyYycsICdjJyksICgnLWZpbmFsJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICgnLXByZScsICdjJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCctcmVsZWFzZScsICcnKSwgKCcucmVsZWFzZScsICcnKSwgKCctc3RhYmxlJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICgnKycsICcuJyksICgnXycsICcuJyksICgnICcsICcnKSwgKCcuZmluYWwnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCdmaW5hbCcsICcnKSk6CiAgICAgICAgcnMgPSBycy5yZXBsYWNlKG9yaWcsIHJlcGwpCgogICAgIyBpZiBzb21ldGhpbmcgZW5kcyB3aXRoIGRldiBvciBwcmUsIHdlIGFkZCBhIDAKICAgIHJzID0gcmUuc3ViKHIicHJlJCIsIHIicHJlMCIsIHJzKQogICAgcnMgPSByZS5zdWIociJkZXYkIiwgciJkZXYwIiwgcnMpCgogICAgIyBpZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlICJiLTIiIG9yICJhLjIiIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAjIHZlcnNpb24sIHRoYXQgaXMgcHJvYmFibHkgYmV0YSwgYWxwaGEsIGV0YwogICAgIyBsZXQncyByZW1vdmUgdGhlIGRhc2ggb3IgZG90CiAgICBycyA9IHJlLnN1YihyIihbYWJjXXxyYylbXC1cLl0oXGQrKSQiLCByIlwxXDIiLCBycykKCiAgICAjIDEuMC1kZXYtcjM3MSAtPiAxLjAuZGV2MzcxCiAgICAjIDAuMS1kZXYtcjc5IC0+IDAuMS5kZXY3OQogICAgcnMgPSByZS5zdWIociJbXC1cLl0oZGV2KVtcLVwuXT9yPyhcZCspJCIsIHIiLlwxXDIiLCBycykKCiAgICAjIENsZWFuOiAyLjAuYS4zLCAyLjAuYjEsIDAuOS4wfmMxCiAgICBycyA9IHJlLnN1YihyIlsufl0/KFthYmNdKVwuPyIsIHIiXDEiLCBycykKCiAgICAjIENsZWFuOiB2MC4zLCB2MS4wCiAgICBpZiBycy5zdGFydHN3aXRoKCd2Jyk6CiAgICAgICAgcnMgPSByc1sxOl0KCiAgICAjIENsZWFuIGxlYWRpbmcgJzAncyBvbiBudW1iZXJzLgogICAgI1RPRE86IHVuaW50ZW5kZWQgc2lkZS1lZmZlY3Qgb24sIGUuZy4sICIyMDAzLjA1LjA5IgogICAgIyBQeVBJIHN0YXRzOiA3NyAofjIlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXGIwKyhcZCspKD8hXGQpIiwgciJcMSIsIHJzKQoKICAgICMgQ2xlYW4gYS9iL2Mgd2l0aCBubyB2ZXJzaW9uLiBFLmcuICIxLjBhIiAtPiAiMS4wYTAiLiBTZXR1cHRvb2xzIGluZmVycwogICAgIyB6ZXJvLgogICAgIyBQeVBJIHN0YXRzOiAyNDUgKDcuNTYlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiKFxkK1thYmNdKSQiLCByIlxnPDE+MCIsIHJzKQoKICAgICMgdGhlICdkZXYtck5OTicgdGFnIGlzIGEgZGV2IHRhZwogICAgcnMgPSByZS5zdWIociJcLj8oZGV2LXJ8ZGV2XC5yKVwuPyhcZCspJCIsIHIiLmRldlwyIiwgcnMpCgogICAgIyBjbGVhbiB0aGUgLSB3aGVuIHVzZWQgYXMgYSBwcmUgZGVsaW1pdGVyCiAgICBycyA9IHJlLnN1YihyIi0oYXxifGMpKFxkKykkIiwgciJcMVwyIiwgcnMpCgogICAgIyBhIHRlcm1pbmFsICJkZXYiIG9yICJkZXZlbCIgY2FuIGJlIGNoYW5nZWQgaW50byAiLmRldjAiCiAgICBycyA9IHJlLnN1YihyIltcLlwtXShkZXZ8ZGV2ZWwpJCIsIHIiLmRldjAiLCBycykKCiAgICAjIGEgdGVybWluYWwgImRldiIgY2FuIGJlIGNoYW5nZWQgaW50byAiLmRldjAiCiAgICBycyA9IHJlLnN1YihyIig/IVtcLlwtXSlkZXYkIiwgciIuZGV2MCIsIHJzKQoKICAgICMgYSB0ZXJtaW5hbCAiZmluYWwiIG9yICJzdGFibGUiIGNhbiBiZSByZW1vdmVkCiAgICBycyA9IHJlLnN1YihyIihmaW5hbHxzdGFibGUpJCIsICIiLCBycykKCiAgICAjIFRoZSAncicgYW5kIHRoZSAnLScgdGFncyBhcmUgcG9zdCByZWxlYXNlIHRhZ3MKICAgICMgICAwLjRhMS5yMTAgICAgICAgLT4gIDAuNGExLnBvc3QxMAogICAgIyAgIDAuOS4zMy0xNzIyMiAgICAtPiAgMC45LjMzLnBvc3QxNzIyMgogICAgIyAgIDAuOS4zMy1yMTcyMjIgICAtPiAgMC45LjMzLnBvc3QxNzIyMgogICAgcnMgPSByZS5zdWIociJcLj8ocnwtfC1yKVwuPyhcZCspJCIsIHIiLnBvc3RcMiIsIHJzKQoKICAgICMgQ2xlYW4gJ3InIGluc3RlYWQgb2YgJ2RldicgdXNhZ2U6CiAgICAjICAgMC45LjMzK3IxNzIyMiAgIC0+ICAwLjkuMzMuZGV2MTcyMjIKICAgICMgICAxLjBkZXYxMjMgICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAxLjAuZ2l0MTIzICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAxLjAuYnpyMTIzICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAwLjFhMGRldi4xMjMgICAgLT4gIDAuMWEwLmRldjEyMwogICAgIyBQeVBJIHN0YXRzOiAgfjE1MCAofjQlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXC4/KGRldnxnaXR8YnpyKVwuPyhcZCspJCIsIHIiLmRldlwyIiwgcnMpCgogICAgIyBDbGVhbiAnLnByZScgKG5vcm1hbGl6ZWQgZnJvbSAnLXByZScgYWJvdmUpIGluc3RlYWQgb2YgJ2MnIHVzYWdlOgogICAgIyAgIDAuMi5wcmUxICAgICAgICAtPiAgMC4yYzEKICAgICMgICAwLjItYzEgICAgICAgICAtPiAgMC4yYzEKICAgICMgICAxLjBwcmV2aWV3MTIzICAgLT4gIDEuMGMxMjMKICAgICMgUHlQSSBzdGF0czogfjIxICgwLjYyJSkgYmV0dGVyCiAgICBycyA9IHJlLnN1YihyIlwuPyhwcmV8cHJldmlld3wtYykoXGQrKSQiLCByImNcZzwyPiIsIHJzKQoKICAgICMgVGNsL1RrIHVzZXMgInB4IiBmb3IgdGhlaXIgcG9zdCByZWxlYXNlIG1hcmtlcnMKICAgIHJzID0gcmUuc3ViKHIicChcZCspJCIsIHIiLnBvc3RcMSIsIHJzKQoKICAgIHRyeToKICAgICAgICBfbm9ybWFsaXplZF9rZXkocnMpCiAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgcnMgPSBOb25lCiAgICByZXR1cm4gcnMKCiMKIyAgIExlZ2FjeSB2ZXJzaW9uIHByb2Nlc3NpbmcgKGRpc3RyaWJ1dGUtY29tcGF0aWJsZSkKIwoKX1ZFUlNJT05fUEFSVCA9IHJlLmNvbXBpbGUocicoW2Etel0rfFxkK3xbXC4tXSknLCByZS5JKQpfVkVSU0lPTl9SRVBMQUNFID0gewogICAgJ3ByZSc6ICdjJywKICAgICdwcmV2aWV3JzogJ2MnLAogICAgJy0nOiAnZmluYWwtJywKICAgICdyYyc6ICdjJywKICAgICdkZXYnOiAnQCcsCiAgICAnJzogTm9uZSwKICAgICcuJzogTm9uZSwKfQoKCmRlZiBfbGVnYWN5X2tleShzKToKICAgIGRlZiBnZXRfcGFydHMocyk6CiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3IgcCBpbiBfVkVSU0lPTl9QQVJULnNwbGl0KHMubG93ZXIoKSk6CiAgICAgICAgICAgIHAgPSBfVkVSU0lPTl9SRVBMQUNFLmdldChwLCBwKQogICAgICAgICAgICBpZiBwOgogICAgICAgICAgICAgICAgaWYgJzAnIDw9IHBbOjFdIDw9ICc5JzoKICAgICAgICAgICAgICAgICAgICBwID0gcC56ZmlsbCg4KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwID0gJyonICsgcAogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgICAgIHJlc3VsdC5hcHBlbmQoJypmaW5hbCcpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgcCBpbiBnZXRfcGFydHMocyk6CiAgICAgICAgaWYgcC5zdGFydHN3aXRoKCcqJyk6CiAgICAgICAgICAgIGlmIHAgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgIHdoaWxlIHJlc3VsdCBhbmQgcmVzdWx0Wy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBvcCgpCiAgICAgICAgICAgIHdoaWxlIHJlc3VsdCBhbmQgcmVzdWx0Wy0xXSA9PSAnMDAwMDAwMDAnOgogICAgICAgICAgICAgICAgcmVzdWx0LnBvcCgpCiAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgcmV0dXJuIHR1cGxlKHJlc3VsdCkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKFZlcnNpb24pOgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJldHVybiBfbGVnYWN5X2tleShzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBmb3IgeCBpbiBzZWxmLl9wYXJ0czoKICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoeCwgc3RyaW5nX3R5cGVzKSBhbmQgeC5zdGFydHN3aXRoKCcqJykgYW5kCiAgICAgICAgICAgICAgICB4IDwgJypmaW5hbCcpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTGVnYWN5TWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBMZWdhY3lWZXJzaW9uCgogICAgX29wZXJhdG9ycyA9IGRpY3QoTWF0Y2hlci5fb3BlcmF0b3JzKQogICAgX29wZXJhdG9yc1snfj0nXSA9ICdfbWF0Y2hfY29tcGF0aWJsZScKCiAgICBudW1lcmljX3JlID0gcmUuY29tcGlsZSgnXihcZCsoXC5cZCspKiknKQoKICAgIGRlZiBfbWF0Y2hfY29tcGF0aWJsZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIGlmIHZlcnNpb24gPCBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBtID0gc2VsZi5udW1lcmljX3JlLm1hdGNoKHN0cihjb25zdHJhaW50KSkKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCBjb21wdXRlIGNvbXBhdGlibGUgbWF0Y2ggZm9yIHZlcnNpb24gJXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFuZCBjb25zdHJhaW50ICVzJywgdmVyc2lvbiwgY29uc3RyYWludCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBzID0gbS5ncm91cHMoKVswXQogICAgICAgIGlmICcuJyBpbiBzOgogICAgICAgICAgICBzID0gcy5yc3BsaXQoJy4nLCAxKVswXQogICAgICAgIHJldHVybiBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHMpCgojCiMgICBTZW1hbnRpYyB2ZXJzaW9uaW5nCiMKCl9TRU1WRVJfUkUgPSByZS5jb21waWxlKHInXihcZCspXC4oXGQrKVwuKFxkKyknCiAgICAgICAgICAgICAgICAgICAgICAgIHInKC1bYS16MC05XSsoXC5bYS16MC05LV0rKSopPycKICAgICAgICAgICAgICAgICAgICAgICAgcicoXCtbYS16MC05XSsoXC5bYS16MC05LV0rKSopPyQnLCByZS5JKQoKCmRlZiBpc19zZW12ZXIocyk6CiAgICByZXR1cm4gX1NFTVZFUl9SRS5tYXRjaChzKQoKCmRlZiBfc2VtYW50aWNfa2V5KHMpOgogICAgZGVmIG1ha2VfdHVwbGUocywgYWJzZW50KToKICAgICAgICBpZiBzIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IChhYnNlbnQsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcnRzID0gc1sxOl0uc3BsaXQoJy4nKQogICAgICAgICAgICAjIFdlIGNhbid0IGNvbXBhcmUgaW50cyBhbmQgc3RyaW5ncyBvbiBQeXRob24gMywgc28gZnVkZ2UgaXQKICAgICAgICAgICAgIyBieSB6ZXJvLWZpbGxpbmcgbnVtZXJpYyB2YWx1ZXMgc28gc2ltdWxhdGUgYSBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgcmVzdWx0ID0gdHVwbGUoW3AuemZpbGwoOCkgaWYgcC5pc2RpZ2l0KCkgZWxzZSBwIGZvciBwIGluIHBhcnRzXSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgbSA9IGlzX3NlbXZlcihzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IocykKICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBbaW50KGkpIGZvciBpIGluIGdyb3Vwc1s6M11dCiAgICAjIGNob29zZSB0aGUgJ3wnIGFuZCAnKicgc28gdGhhdCB2ZXJzaW9ucyBzb3J0IGNvcnJlY3RseQogICAgcHJlLCBidWlsZCA9IG1ha2VfdHVwbGUoZ3JvdXBzWzNdLCAnfCcpLCBtYWtlX3R1cGxlKGdyb3Vwc1s1XSwgJyonKQogICAgcmV0dXJuIChtYWpvciwgbWlub3IsIHBhdGNoKSwgcHJlLCBidWlsZAoKCmNsYXNzIFNlbWFudGljVmVyc2lvbihWZXJzaW9uKToKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByZXR1cm4gX3NlbWFudGljX2tleShzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnRzWzFdWzBdICE9ICd8JwoKCmNsYXNzIFNlbWFudGljTWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBTZW1hbnRpY1ZlcnNpb24KCgpjbGFzcyBWZXJzaW9uU2NoZW1lKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCBtYXRjaGVyLCBzdWdnZXN0ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5rZXkgPSBrZXkKICAgICAgICBzZWxmLm1hdGNoZXIgPSBtYXRjaGVyCiAgICAgICAgc2VsZi5zdWdnZXN0ZXIgPSBzdWdnZXN0ZXIKCiAgICBkZWYgaXNfdmFsaWRfdmVyc2lvbihzZWxmLCBzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWF0Y2hlci52ZXJzaW9uX2NsYXNzKHMpCiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc192YWxpZF9tYXRjaGVyKHNlbGYsIHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXRjaGVyKHMpCiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc192YWxpZF9jb25zdHJhaW50X2xpc3Qoc2VsZiwgcyk6CiAgICAgICAgIiIiCiAgICAgICAgVXNlZCBmb3IgcHJvY2Vzc2luZyBzb21lIG1ldGFkYXRhIGZpZWxkcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmlzX3ZhbGlkX21hdGNoZXIoJ2R1bW15X25hbWUgKCVzKScgJSBzKQoKICAgIGRlZiBzdWdnZXN0KHNlbGYsIHMpOgogICAgICAgIGlmIHNlbGYuc3VnZ2VzdGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnN1Z2dlc3RlcihzKQogICAgICAgIHJldHVybiByZXN1bHQKCl9TQ0hFTUVTID0gewogICAgJ25vcm1hbGl6ZWQnOiBWZXJzaW9uU2NoZW1lKF9ub3JtYWxpemVkX2tleSwgTm9ybWFsaXplZE1hdGNoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3Rfbm9ybWFsaXplZF92ZXJzaW9uKSwKICAgICdsZWdhY3knOiBWZXJzaW9uU2NoZW1lKF9sZWdhY3lfa2V5LCBMZWdhY3lNYXRjaGVyLCBsYW1iZGEgc2VsZiwgczogcyksCiAgICAnc2VtYW50aWMnOiBWZXJzaW9uU2NoZW1lKF9zZW1hbnRpY19rZXksIFNlbWFudGljTWF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3Rfc2VtYW50aWNfdmVyc2lvbiksCn0KCl9TQ0hFTUVTWydkZWZhdWx0J10gPSBfU0NIRU1F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6JT/////RQiDPv91DoM/KnUPi8uwP+h+////g30MAH/Vgz8AdQWLRfyJB17Jw4v/VYvsgeyAAgAAoQTwQAAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2s/f//ibXQ/f//ib3k/f//iYWo/f//iYXw/f//iYXI/f//iYXo/f//iYXM/f//iYWk/f//iYXE/f//6ALI///oybL//4mFnP3//4X2dSvourL//8cAFgAAAOhdsv//gL24/f//AHQKi4W0/f//g2Bw/YPI/+lhCwAA9kYMQHVeVuj40f//WbpY9kAAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWgDUEA6wKLyvZBJH91m4P4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjaANQQDrAovC9kAkgA+Fcf///zP2O94PhGf///+KE4m13P3//4m12P3//4m1vP3//4m1oP3//4iV7/3//4TSD4SyCgAAQ4mdwP3//zm13P3//w+MiQoAAI1C4DxYdw8PvsIPtoAg2UAAg+AP6wIzwIuNvP3//2vACQ+2hAhA2UAAagjB6AReiYW8/f//O8YPhO/+//9qB1k7wQ+HIAoAAP8khd+HQAAzwION6P3///+JhYz9//+JhaT9//+Jhcj9//+Jhcz9//+JhfD9//+JhcT9///p5wkAAA++woPoIHRIg+gDdDQrxnQkSEh0FIPoAw+FyQkAAAm18P3//+m+CQAAg43w/f//BOmyCQAAg43w/f//AemmCQAAgY3w/f//gAAAAOmXCQAAg43w/f//AumLCQAAgPoqdSyDxwSJveT9//+Lf/yJvcj9//+F/w+JbAkAAION8P3//wT3ncj9///pWgkAAIuFyP3//2vACg++yo1ECNCJhcj9///pPwkAAIOl6P3//wDpMwkAAID6KnUmg8cEib3k/f//i3/8ib3o/f//hf8PiRQJAACDjej9////6QgJAACLhej9//9rwAoPvsqNRAjQiYXo/f//6e0IAACA+kl0VYD6aHREgPpsdBiA+ncPhdUIAACBjfD9//8ACAAA6cYIAACAO2x1FkOBjfD9//8AEAAAiZ3A/f//6asIAACDjfD9//8Q6Z8IAACDjfD9//8g6ZMIAACKAzw2dR6AewE0dRiDwwKBjfD9//8AgAAAiZ3A/f//6W8IAAA8M3UegHsBMnUYg8MCgaXw/f///3///4mdwP3//+lNCAAAPGQPhEUIAAA8aQ+EPQgAADxvD4Q1CAAAPHUPhC0IAAA8eA+EJQgAADxYD4QdCAAAg6W8/f//AIOlxP3//wCNhaz9//9QD7bCUOgtFQAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6Jv7//+KA0OJncD9//+EwA+Elfz//4uN0P3//4213P3//+h5+///6bsHAAAPvsKD+GQPj7cBAAAPhFUCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqAUAAIDCIMeFjP3//wEAAACIle/9///pUwIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhPsEAACF/3ULoTT+QACJheD9//+LheD9///HhcT9//8BAAAA6ckEAACD6FgPhBwDAABISHR/K8EPhLMBAABISA+F6AQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOjnNQAAg8QQhcB0H8eFpP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///peQQAAIsHg8cEib3k/f//hcB0PItIBIXJdDX3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNAQAAIOlxP3//wDpKAQAAKEw/kAAiYXg/f//UOjB9f//WekRBAAAg/hwD482AgAAD4QiAgAAg/hlD4z/AwAAg/hnD46zAAAAg/hpdHiD+G50KoP4bw+F4wMAAPaF8P3//4CLveT9//+Jtdj9//90bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzodhEAAIXAD4RK+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhaT9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E3QEAAAP+i0f4i1f86QkCAACLveT9//+DjfD9//9Ag73o/f//AI2d9P3//7gAAgAAiZ3g/f//iYWY/f//fQzHhej9//8GAAAA62p1EYD6Z3Vjx4Xo/f//AQAAAOtXOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj2Ltej9//+Bxl0BAABW6M/Z//+Kle/9//9ZiYWg/f//hcB0EImF4P3//4m1mP3//4vY6wrHhej9//+jAAAAiweLNVjAQACDxwiJhYD9//+LR/yJhYT9//+Nhaz9//9Q/7WM/f//D77C/7Xo/f//ib3k/f//UP+1mP3//42FgP3//1NQ/zVA9UAA/9b/0Iu98P3//4PEHIHngAAAAHQdg73o/f//AHUUjYWs/f//UFP/NUz1QAD/1v/QWVmAve/9//9ndRiF/3UUjYWs/f//UFP/NUj1QAD/1v/QWVmAOy11EYGN8P3//wABAABDiZ3g/f//U+nE/f//ibXo/f//iY2o/f//6yqD6HMPhHT8//9ISA+EW/7//4PoAw+FvgEAAIu95P3//8eFqP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+ENf7//4qFqP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpEf7///fBABAAAA+FF/7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQbhdJ/F3wEhcBzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIv6i9h1AjP/g73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhhcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1PoAhAAAIPBMImdmP3//4vYi/qD+Tl+BgONqP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RjhcB0B4vOgDkwdFj/jeD9//+LjeD9///GATBA60BJZoM4AHQHg8AChcl18iuF4P3//9H46yiF/3ULoTD+QACJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g72k/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhZj9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/oGPX//4O93P3///90BIX/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JooTQ0GJnSDl//+A+gp1C/+FMOX//8YADUBGiBBARoH+/xMAAHLVi/CNhUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FcDAQACFwA+EQwIAAIuFKOX//wGFOOX//zvGD4w7AgAAi8MrhTTl//87RRAPgmz////pJQIAAIC9P+X//wIPhc0AAACLnTTl//85TRAPhkgCAACDpUDl//8Ai8srjTTl//9qAo2FSOX//147TRBzQw+3EwPeA86JnSDl//+D+gp1GgG1MOX//2oNW2aJGIudIOX//wPGAbVA5f//AbVA5f//ZokQA8aBvUDl///+EwAAcriL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VwMBAAIXAD4RpAQAAi4Uo5f//AYU45f//O8YPjGEBAACLwyuFNOX//ztFEA+CR////+lLAQAAi4U05f//iYUs5f//OU0QD4Z1AQAAi40s5f//g6VA5f//ACuNNOX//2oCjYVI+f//XjtNEHM7i5Us5f//D7cSAbUs5f//A86D+gp1DmoNW2aJGAPGAbVA5f//AbVA5f//ZokQA8aBvUDl//+oBgAAcsAz9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FeDAQACL2DveD4SXAAAAagCNhSjl//9Qi8MrxlCNhDXw6///UIuFJOX//4sA/zQH/xXAwEAAhcB0DAO1KOX//zvef8vrDP8VPMBAAImFROX//zvef1yLhSzl//8rhTTl//+JhTjl//87RRAPggv////rP1GNjSjl//9R/3UQ/7U05f///zQ4/xXAwEAAhcB0FYuFKOX//4OlROX//wCJhTjl///rDP8VPMBAAImFROX//4O9OOX//wB1bIO9ROX//wB0LWoFXjm1ROX//3UU6AOf///HAAkAAADoC5///4kw6z//tUTl///oD5///1nrMYuFJOX//4sA9kQHBEB0D4uFNOX//4A4GnUEM8DrJOjDnv//xwAcAAAA6Mue//+DIACDyP/rDIuFOOX//yuFMOX//1uLTfxfM81e6MiH///Jw2oQaCjiQADo2Z7//4tdCIP7/nUb6I+e//+DIADodJ7//8cACQAAAIPI/+mUAAAAhdt4CDsdgA1BAHIa6Gie//+DIADoTZ7//8cA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g434+///BOmrCQAAg434+///AemfCQAAgY34+///gAAAAOmQCQAACY34+///6YUJAABmg/oqdSuLA4PDBImd5Pv//4mF2Pv//4XAD4lmCQAAg434+///BPed2Pv//+lUCQAAi4XY+///a8AKD7fKjUQI0ImF2Pv//+k5CQAAg6X0+///AOktCQAAZoP6KnUliwODwwSJneT7//+JhfT7//+FwA+JDgkAAION9Pv////pAgkAAIuF9Pv//2vACg+3yo1ECNCJhfT7///p5wgAAA+3woP4SXRRg/hodECD+Gx0GIP4dw+FzAgAAIGN+Pv//wAIAADpvQgAAGaDP2x1EQP5gY34+///ABAAAOmmCAAAg434+///EOmaCAAAg434+///IOmOCAAAD7cHg/g2dRlmg38CNHUSg8cEgY34+///AIAAAOltCAAAg/gzdRlmg38CMnUSg8cEgaX4+////3///+lPCAAAg/hkD4RGCAAAg/hpD4Q9CAAAg/hvD4Q0CAAAg/h1D4QrCAAAg/h4D4QiCAAAg/hYD4QZCAAAg6XE+///AIuF1Pv//1KNtej7///HhdD7//8BAAAA6Bf8//9Z6fAHAAAPt8KD+GQPjzECAAAPhL8CAACD+FMPjxwBAAB0f4PoQXQQK8F0WivBdAgrwQ+F4QUAAIPCIMeFmPv//wEAAACJleD7//+LjfT7//+Djfj7//9Ajb38+///uAACAACJvfD7//+Jhez7//+FyQ+JjgIAAMeF9Pv//wYAAADp3gIAAPeF+Pv//zAIAAAPhckAAACDjfj7//8g6b0AAAD3hfj7//8wCAAAdQeDjfj7//8gi730+///g///dQW/////f4PDBPaF+Pv//yCJneT7//+LW/yJnfD7//8PhPkEAACF23ULoTD+QACJhfD7//+Dpez7//8Ai7Xw+///hf8PjhEFAACKBoTAD4QHBQAAjY20+///D7bAUVDoC/r//1lZhcB0AUZG/4Xs+///Ob3s+///fNDp3AQAAIPoWA+E3wIAACvBD4SVAAAAg+gHD4T0/v//K8EPhboEAAAPtwODwwQz9kb2hfj7//8gibXQ+///iZ3k+///iYWk+///dEKIhcj7//+NhbT7//9Qi4W0+///xoXJ+///AP+wrAAAAI2FyPv//1CNhfz7//9Q6Ef4//+DxBCFwHkPibWw+///6wdmiYX8+///jYX8+///iYXw+///ibXs+///6TYEAACLA4PDBImd5Pv//4XAdDqLSASFyXQz94X4+///AAgAAA+/AImN8Pv//3QSmSvCx4XQ+///AQAAAOnxAwAAg6XQ+///AOnnAwAAoTD+QACJhfD7//9Q6IXb//9Z6dADAACD+HAPj+UBAAAPhM0BAACD+GUPjL4DAACD+GcPjuf9//+D+Gl0boP4bnQkg/hvD4WiAwAA9oX4+///gIm14Pv//3RigY34+///AAIAAOtWg8MEiZ3k+///i1v86ET3//+FwA+EePr///aF+Pv//yB0DGaLhej7//9miQPrCIuF6Pv//4kDx4Ww+///AQAAAOn3BAAAg434+///QMeF4Pv//woAAAD3hfj7//8AgAAAD4SZAQAAA96LQ/iLU/zp1QEAAHUSZoP6Z3VXx4X0+///AQAAAOtLO8h+CImF9Pv//4vIgfmjAAAAfjeNsV0BAABW6Om///+LleD7//9ZiYWo+///hcB0EImF8Pv//4m17Pv//4v46wrHhfT7//+jAAAAiwOLNVjAQACDwwiJhZD7//+LQ/yJhZT7//+NhbT7//9Q/7WY+///D77C/7X0+///iZ3k+///UP+17Pv//42FkPv//1dQ/zVA9UAA/9b/0Iud+Pv//4PEHIHjgAAAAHQdg730+///AHUUjYW0+///UFf/NUz1QAD/1v/QWVlmg73g+///Z3UYhdt1FI2FtPv//1BX/zVI9UAA/9b/0FlZgD8tdRGBjfj7//8AAQAAR4m98Pv//1fpGf7//4m19Pv//8eFrPv//wcAAADrJIPocw+Ee/z//yvBD4Sc/v//g+gDD4XOAQAAx4Ws+///JwAAAPaF+Pv//4DHheD7//8QAAAAD4R8/v//ajBYZomFzPv//4uFrPv//4PAUWaJhc77//+Jjdz7///pV/7///eF+Pv//wAQAAAPhVf+//+DwwT2hfj7//8gdBz2hfj7//9AiZ3k+///dAYPv0P86wQPt0P8mesX9oX4+///QItD/HQDmesCM9KJneT7///2hfj7//9AdBuF0n8XfASFwHMR99iD0gD32oGN+Pv//wABAAD3hfj7//8AkAAAi/qL2HUCM/+DvfT7//8AfQzHhfT7//8BAAAA6xqDpfj7///3uAACAAA5hfT7//9+BomF9Pv//4vDC8d1BiGF3Pv//421+/3//4uF9Pv///+N9Pv//4XAfwaLwwvHdC2LheD7//+ZUlBXU+gF9v//g8EwiZ2M+///i9iL+oP5OX4GA42s+///iA5O672Nhfv9//8rxkb3hfj7//8AAgAAiYXs+///ibXw+///dF6FwHQHi8aAODB0U/+N8Pv//4uF8Pv///+F7Pv//8YAMOs8hdt1C6E0/kAAiYXw+///i4Xw+///x4XQ+///AQAAAOsJT2aDOAB0BgPBhf918yuF8Pv//9H4iYXs+///g72w+///AA+FqAEAAIuF+Pv//6hAdCupAAEAAHQEai3rDqgBdARqK+sGqAJ0FGogWWaJjcz7///Hhdz7//8BAAAAi73Y+///K73s+///K73c+///ib3g+///qAx1JOsei4XU+///aiCNtej7//9P6Ir1//+Dvej7////WXQEhf9/3v+13Pv//4u9nPv//4ud1Pv//42FzPv//1CNhej7///oh/X///aF+Pv//whZWXQv9oX4+///BHUmi73g+///6xpqMI216Pv//4vDT+gs9f//g73o+////1l0BIX/f+KDvdD7//8AdWuLnez7//+F235hi73w+///jYW0+///UIuFtPv///+wrAAAAI2FpPv//1dQS+jK8v//g8QQiYWM+///hcB+JP+1pPv//4uF1Pv//4216Pv//+jA9P//A72M+///WYXbf7DrLoON6Pv////rJf+17Pv//4u9nPv///+18Pv//4ud1Pv//42F6Pv//+i29P//WVmDvej7//8AfDP2hfj7//8EdCqLveD7///rHouF1Pv//2ogjbXo+///T+hX9P//g73o+////1l0BIX/f96Dvaj7//8AdBP/taj7///o93r//4OlqPv//wBZi72g+///i53k+///D7cHM/aJheD7//9mO8Z0B4vQ6XH1//85tcT7//90DYO9xPv//wcPhQH1//+AvcD7//8AdAqLhbz7//+DYHD9i4Xo+///i038X14zzVvoa3b//8nDjUkAYplAAGKXQACUl0AA75dAADuYQABHmEAAjZhAAISZQACL/1WL7ItFCFZXhcB4WTsFgA1BAHNRi8jB+QWL8IPmH408jaANQQCLD8HmBoM8Dv91NYM9APBAAAFTi10MdR6D6AB0EEh0CEh1E1Nq9OsIU2r16wNTavb/FRzBQACL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iAdGR0l191heX13DuhAAAAAr0CvKUYvCi8iD4QN0CYoWiBdGR0l198HoAnQNixaJF412BI1/BEh181npC////8zMzMzMzMzMzMzMUY1MJAgryIPhDwPBG8kLwVnpCgoAAFGNTCQIK8iD4QcDwRvJC8FZ6fQJAACL/1WL7FaLdQiF9g+EYwMAAP92BOjybv///3YI6Opu////dgzo4m7///92EOjabv///3YU6NJu////dhjoym7///826MNu////diDou27///92JOizbv///3Yo6Ktu////dizoo27///92MOibbv///3Y06JNu////dhzoi27///92OOiDbv///3Y86Htu//+DxED/dkDocG7///92ROhobv///3ZI6GBu////dkzoWG7///92UOhQbv///3ZU6Ehu////dljoQG7///92XOg4bv///3Zg6DBu////dmToKG7///92aOggbv///3Zs6Bhu////dnDoEG7///92dOgIbv///3Z46ABu////dnzo+G3//4PEQP+2gAAAAOjqbf///7aEAAAA6N9t////togAAADo1G3///+2jAAAAOjJbf///7aQAAAA6L5t////tpQAAADos23///+2mAAAAOiobf///7acAAAA6J1t////tqAAAADokm3///+2pAAAAOiHbf///7aoAAAA6Hxt////trwAAADocW3///+2wAAAAOhmbf///7bEAAAA6Ftt////tsgAAADoUG3///+2zAAAAOhFbf//g8RA/7bQAAAA6Ddt////trgAAADoLG3///+22AAAAOghbf///7bcAAAA6BZt////tuAAAADoC23///+25AAAAOgAbf///7boAAAA6PVs////tuwAAADo6mz///+21AAAAOjfbP///7bwAAAA6NRs////tvQAAADoyWz///+2+AAAAOi+bP///7b8AAAA6LNs////tgABAADoqGz///+2BAEAAOidbP///7YIAQAA6JJs//+DxED/tgwBAADohGz///+2EAEAAOh5bP///7YUAQAA6G5s////thgBAADoY2z///+2HAEAAOhYbP///7YgAQAA6E1s////tiQBAADoQmz///+2KAEAAOg3bP///7YsAQAA6Cxs////tjABAADoIWz///+2NAEAAOgWbP///7Y4AQAA6Ats////tjwBAADoAGz///+2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ACAAZQByAHIAbwByACAAAAAAAA0ACgAAAAAAVABMAE8AUwBTACAAZQByAHIAbwByAA0ACgAAAFMASQBOAEcAIABlAHIAcgBvAHIADQAKAAAAAABEAE8ATQBBAEkATgAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAzADMADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAdQBzAGUAIABNAFMASQBMACAAYwBvAGQAZQAgAGYAcgBvAG0AIAB0AGgAaQBzACAAYQBzAHMAZQBtAGIAbAB5ACAAZAB1AHIAaQBuAGcAIABuAGEAdABpAHYAZQAgAGMAbwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAABSADYAMAAwADkADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQADQAKAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAACAykAACAAAACjKQAAJAAAA0MlAAAoAAACIyUAAEAAAADDJQAARAAAA0MhAABIAAACIyEAAEwAAADDIQAAYAAAAwMdAABkAAABwx0AAGgAAAADHQAAbAAAAkMZAABwAAABAxkAAHgAAAADGQAAfAAAAOMVAACAAAADQxEAAIQAAAODCQAB4AAAAvMJAAHkAAACgwkAAegAAAITCQAD8AAAAfMJAAP8AAABcwkAATQBpAGMAcgBvAHMAbwBmAHQAIABWAGkAcwB1AGEAbAAgAEMAKwArACAAUgB1AG4AdABpAG0AZQAgAEwAaQBiAHIAYQByAHkAAAAAAAoACgAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg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ZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAHN0ZG91dCBkdXBsaWNhdGlvbiBmYWlsZWQAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycARmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAALgBlAHgAZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGZpbmQgYXJndW1lbnRzIChldmVuIGlmIGVtcHR5KSBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAiACUAcwAiACAAJQBzACAAIgAlAHMAIgAgACUAcwAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8EAA0N5AAAMAAABSU0RTpy23SkBF2kyTNKN6F6Xh4gIAAABDOlxVc2Vyc1xWaW5heVxQcm9qZWN0c1xzaW1wbGVfbGF1bmNoZXJcUmVsZWFzZVxHVUlTaW1wbGVMYXVuY2hlci5wZGIAAACwLwAA0DEAABBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPQYQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAA2htAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACBIEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOwiQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8iNAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADSJEAAAAAAAP7///8AAAAAiP///wAAAAD+////NSZAAEkmQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAGC1AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAADNEAAAAAAAP7///8AAAAA2P///wAAAAD+////XzRAAGM0QAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAATDZAAAAAAAD+////AAAAANj///8AAAAA/v///wAAAAACOEAA/v///wAAAAAROEAA/v///wAAAADY////AAAAAP7///8AAAAAxDlAAP7///8AAAAA0DlAAP7///8AAAAA1P///wAAAAD+////AAAAAHQ8QAAAAAAA/v///wAAAADY////AAAAAP7///8bPkAALj5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABlTkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAA1TQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAmVRAAAAAAAAAAAAAZVRAAP7///8AAAAA0P///wAAAAD+////AAAAAABWQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAEl5AAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAADhZUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAA5wQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1XJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACndkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGSJQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAANJFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADso0AAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALGlQAAAAAAAAAAAAO2kQAD+////AAAAAND///8AAAAA/v///wAAAABSp0AA6OIAAAAAAAAAAAAA2OUAAADAAAAo5AAAAAAAAAAAAADy5QAAQMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOQAAD7kAABQ5AAAauQAAHjkAACK5AAAnuQAALTkAADQ5AAA7OQAAALlAAAY5QAANOUAAErlAABe5QAAbuUAAH7lAACQ5QAAoOUAALjlAADK5QAA/uUAABLmAAAi5gAALuYAADrmAABM5gAAXuYAAHTmAACG5gAAmuYAALbmAADU5gAA6OYAAADnAAAY5wAAQOcAAFDnAABc5wAAdOcAAITnAACQ5wAAnucAAKznAAC25wAAzucAAN7nAAD05wAADOgAABjoAAAm6AAAMugAAEToAABS6AAAZOgAAHroAACU6AAAqugAAMToAADe6AAA7ugAAATpAAAe6QAAJukAADTpAABA6QAASukAAFbpAABo6QAAdOkAAITpAACW6QAApukAAMLpAADW6QAA5OkAAPTpAAAG6gAAFuoAAAAAAADm5QAAAAAAABkBRXhpdFByb2Nlc3MAhwFHZXRDb21tYW5kTGluZVcAcQRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdABiAUZyZWVMaWJyYXJ5AKgAQ3JlYXRlUHJvY2Vzc1cAAMABR2V0Q3VycmVudFByb2Nlc3MA+QRXYWl0Rm9yU2luZ2xlT2JqZWN0AGcBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA3wFHZXRFeGl0Q29kZVByb2Nlc3MAABQCR2V0TW9kdWxlRmlsZU5hbWVXAAClA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAZwNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAZAJHZXRTdGRIYW5kbGUAAAICR2V0TGFzdEVycm9yAABFAkdldFByb2NBZGRyZXNzAAA8A0xvYWRMaWJyYXJ5QQAALQRTZXRDb25zb2xlQ3RybEhhbmRsZXIA6ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsABgCR2V0TW9kdWxlSGFuZGxlVwAAygBEZWNvZGVQb2ludGVyAM8CSGVhcEZyZWUAAMsCSGVhcEFsbG9jAGkCR2V0U3RyaW5nVHlwZVcAAIYBR2V0Q29tbWFuZExpbmVBANMCSGVhcFNldEluZm9ybWF0aW9uAABjAkdldFN0YXJ0dXBJbmZvVwDABFRlcm1pbmF0ZVByb2Nlc3MAANMEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAClBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAA0lzRGVidWdnZXJQcmVzZW50AO4ARW50ZXJDcml0aWNhbFNlY3Rpb24AADkDTGVhdmVDcml0aWNhbFNlY3Rpb24AAOMCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADqAEVuY29kZVBvaW50ZXIAGARSdGxVbndpbmQA0QBEZWxldGVDcml0aWNhbFNlY3Rpb24APwNMb2FkTGlicmFyeVcAAMUEVGxzQWxsb2MAAMcEVGxzR2V0VmFsdWUAyARUbHNTZXRWYWx1ZQDGBFRsc0ZyZWUA7wJJbnRlcmxvY2tlZEluY3JlbWVudAAAcwRTZXRMYXN0RXJyb3IAAMUBR2V0Q3VycmVudFRocmVhZElkAADrAkludGVybG9ja2VkRGVjcmVtZW50AAAlBVdyaXRlRmlsZQDNAkhlYXBDcmVhdGUAAMADUmVhZEZpbGUAAG8EU2V0SGFuZGxlQ291bnQAAPMBR2V0RmlsZVR5cGUAZgRTZXRGaWxlUG9pbnRlcgAAEwJHZXRNb2R1bGVGaWxlTmFtZUEAAGEBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAEQVXaWRlQ2hhclRvTXVsdGlCeXRlANoBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCTAkdldFRpY2tDb3VudAAAwQFHZXRDdXJyZW50UHJvY2Vzc0lkAHkCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAsgRTbGVlcACPAENyZWF0ZUZpbGVXAHIBR2V0Q1BJbmZvAGgBR2V0QUNQAAA3AkdldE9FTUNQAAAKA0lzVmFsaWRDb2RlUGFnZQDUAkhlYXBTaXplAACaAUdldENvbnNvbGVDUAAArAFHZXRDb25zb2xlTW9kZQAAhwRTZXRTdGRIYW5kbGUAAAQDSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudABXAUZsdXNoRmlsZUJ1ZmZlcnMAANICSGVhcFJlQWxsb2MAUwRTZXRFbmRPZkZpbGUAAEoCR2V0UHJvY2Vzc0hlYXAAAC0DTENNYXBTdHJpbmdXAAAkBVdyaXRlQ29uc29sZVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAE7mQLuxGb9EAAAAAMAOQQAAAAAAwA5BAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB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/kAAAAAAAAEAAAAuAAAAAQAAAAAAAAD+////AAAAAAAAAAAAAAAAAEsFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAwADAAAAKAAAgA4AAABwAACAGAAAAIgAAIAAAAAAAAAAAAQAAAAAAAcAAQAAAKAAAIACAAAAuAAAgAMAAADQAACABAAAAOgAAIAFAAAAAAEAgAYAAAAYAQCABwAAADABAIAAAAAAAAAAAAQAAAAAAAEAZQAAAEgBAIAAAAAAAAAAAAQAAAAAAAEAAQAAAGABAIAAAAAAAAAAAAQAAAAAAAEAAAAAAHgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAIgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAJgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAKgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAALgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAMgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAANgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAOgBAAAAAAAAAAAAAAQAAAAAAAEACQQAAPgBAAAIIgEA6AIAAOQEAAAAAAAA8CQBACgBAADkBAAAAAAAABgmAQCoCAAA5AQAAAAAAADALgEAaAUAAOQEAAAAAAAAKDQBAKglAADkBAAAAAAAANBZAQCoEAAA5AQAAAAAAAB4agEAaAQAAOQEAAAAAAAA4G4BAGgAAADkBAAAAAAAAEhvAQBaAQAA5AQAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLgBHR0cAV1dXAGlpaQB1dXUAgAAAAACAgACAgIAAmJiYAKenpwC5ubkAwMDAANfX1wD+/v4A////AAAAAIAAgAAAAP////AAAAAADACPzIAMAA/Hd3fPAAAADADP/+/8gAz8d3d8fPAAAADv/8z8z//M93d3z8fwAAAI/M//7/////d3d3d38AAACOjPzMzM///3d3f/////AAj////v//xm93d3d3d3fPAI7M//zP/GZvd3d3d3d3fPCPjP/+//Zmb8d3d3d3d3fwj////Mz2Zmz8d3d3d3d38I/M//7/9mZmz////8d3d/COjPzPzPZmZmZmZmz8d3fwj////v/2ZmZmZmZmz3d38I/M/MzM/GZmZmZmZm93fPCPjP3+///GZmZmZmZvd88Aj//4vPzP/////8Zmb//wAI/M/53/////ZmZmZm8AAACOiC/IrM/Mz2z8ZmZvAAAAj+UlxJ3////GxmZmzwAAAFvMkUKZzMz//GZmbPAAAACNitgRPv////////+AAAAAj9hTIRTMzPzM//jPAAAAAI/KmaMTjv///////wAAAACPjNz6QirMz4AAAACAAAAAj////sQTz/+P//+AwAAAAI/M/MzqNUzPj8z4DAAAAACPjP///9Vb/4/PgMAAAAAAj//8zMzOmc+P+AwAAAAAAI/M//////7Oj4DAAAAAAACPjPzMzMzMzYgMAAAAAAAAj/////////+AwAAAAAAAAIiIiIiIiIiIjAAAAAAAAA/B/Af+ADgD+AAAAfgAAAH4AAAB+AAAADgAAAAYAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAABgAAAA4AAAB+AAAAfgAAAH4AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAP4AAAH+AAAD/gAAB/4AAA/+AAAf/gAAP/4AAH/8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NABNTU0AU1NTAHp6egCAAAAAAICAAICAgACQkJAAqqqqALS0tADAwMAA1tbWAOXl5QD+/v4A////AHAAAAsAsAAAcLC3B///8AB7cHv/tma/AH+/779ma28Af+///2a///9/v+tfZmZma3/u9V+2ZmZmf57lW///+2Z9yeVVVVW/Zkw0q1VVVV9rSnFP//+1X/9+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3t7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/0NDQ/97e3v/g4OD/7+/v//r6+v////////////////9W5P//UuH//07d//9J2v//Rdf//7Dt//////////////////////////////////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/7+/v/0bmd/6V8Sv+acT//lm9A//////9a5v//VeP//1Hg//9N3f//Sdn//0TW//9A0///PM///zfM//8zyf//L8T//yvB//8mvv//Irr//y28//+O3P///v//zAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5/8nJyYw0NDQi1tbWhPHx8f/IyMj/8fHx//Dw8P/w8PD/8PDw/+np6f/X19f/7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/0tLS/+vr6//fzLT/p3c8/6N1Pf+ecz7/mnE///////9d6f//Web//1Xj//9Q3///TNz//0jZ//9D1f//P9L//zvP//83y///Msj//y7E//8qwP//Jb3//yG6//8fuP//quX//////4EAAAAAAAAAAAAAAAAAAAAZ+fn5/yIiIjQAAAAXODg4JvLy8v/y8vL/8fHx//Hx8f/x8fH/8PDw/+fn5//Nzc3/7+/v/+/v7//T09P/zc3N/+7u7v/u7u7/0tLS//z8/P/Al2T/q3k8/6Z3Pf+idT3/nXM+//////9h7P//XOn//1jl//9U4v//UN///0vb//9H2P//Q9X//z7R//86zv//Nsv//zHH//8tw///KcD//yW8//8guf//T8j//////84AAAAAAAAAAAAAAAAAAAAZ+fn5/8PDw5ElJSU1ysrKjvPz8//Kysr/8vLy//Ly8v/y8vL/8fHx//Dw8P/f39//8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//0tLS//7+/v+1gUH/rns7/6p5PP+ldz3/oXQ+//////9z7///YOv//1zo//9X5f//U+H//0/e//9K2///Rtf//0LU//8+0f//Oc3//zXK//8xx///LML//yi///8kvP//KLv///////cAAAAAAAAAAAAAAAAAAAAZ+vr6//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/7+/v//////+3fzn/snw6/656O/+peDz/pXY9//Xw6v/X+v//c+///1/r//9b5///V+T//1Lh//9O3f//Str//0XX//9B0///PdD//zjN//80yf//MMX//yzC//8nv///I7v///////8AAAAAAAAAAAAAAAAAAAAZ+vr6/8zMzIw1NTUi2dnZhPT09P/Ly8v/9PT0/+fn5//z8/P/5ubm//Pz8//y8vL/5+fn/9zc3P/k5OT/5OTk/+bm5v/j4+P/1NTU//////+6gDn/tn45/7F8Ov+tejv/qHg8/7yZb//07+n/////////////////////////////////////////////////6fr//23b//84zP//M8n//y/F//8rwf//J77///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/yIiIjQAAAAXOjo6JvX19f/19fX/9fX1/9fX1//z8/P/1NTU//Ly8v/z8/P/5ubm/9HR0f/Pz8//zMzM/9DQ0P/Ozs7/1dXV//////++gjj/uYA5/7V+Ov+wfDv/rHo7/6d3PP+jdT3/nnM+/5pxP/+Vb0D/kW1B/4xrQv+IaUP/g2dD/39kRP+LdVr/3tfQ/+n6//87z///N8z//zPI//8uxP//KsH///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/8fHx5ElJSU1zMzMjvX19f/MzMz/9fX1/9XV1f/y8vL/ysrK/+bm5v/09PT/5+fn/+Dg4P/l5eX/5OTk/+Tk5P/q6ur/1NTU//7+/v/DiD7/vYI4/7iAOf+0fTr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+MakL/h2hD/4NmRP9+ZEX/i3Va//////8/0v//Os7//zbL//8yyP//NcX///////cAAAAAAAAAAAAAAAAAAAAZ/Pz8//j4+P/39/f/9/f3/6ioqP+rq6v/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//39/f/QnmH/wYM3/7yBOP+4fzn/s306/697O/+qeTz/pnc9/6F1Pv+dcj7/mHA//5RuQP+PbEH/i2pC/4ZoQ/+CZkT/fWRF//////9C1P//PtH//zrO//81yv//XtP//////84AAAAAAAAAAAAAAAAAAAAZ/Pz8/8/Pz4w1NTUi3NzchPj4+P+Ghob/rKys//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/8/Pz//j4+P/o0bP/woQ3/8CDN/+7gTj/t385/7J9Ov+uezv/qXg8/6V2Pf+gdD7/nHI//5dwQP+TbkD/jmxB/4pqQv+FZ0P/gWVE//////9G1///QdT//z3Q//85zf//s+v//////4EAAAAAAAAAAAAAAAAAAAAZ/Pz8/yIiIjQAAAAXOzs7Jvj4+P/19fX/iIiI/6ysrP/39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/9/fz/4cGa/8WMQ/+/gzj/u4A5/7Z+Of+yfDr/rXo7/6h4PP+kdj3/oHQ+/5tyP/+XcED/km1B/45rQf+JaUL/hWdD//////9J2v//Rdb//0zW//+d5////v//ywAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39/8nJyZFRUVFKbm5uyvf39//Ozs7/zMzM/35+fv+srKz/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/19fX/+/v7//7+/v///////////////////////////////////////////9fErv+acT//lm9A/5FtQf+Na0L/iGlD//////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39//Pz8/9ISEj/IiIi/6mpqf/6+vr/7Ozs/4mJif92dnb/rKys//j4+P/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//////+5gDn/tH46/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGtC//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+/5CQkME6Ojr/Jycn/19fX/+lpaX/+fn5/3Nzc/90dHT/jIyM/6ioqP/d3d3/5eXl/+np6f/4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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGCEhITBcXFxKZWVlUTY2NkQ1NTVBAAAAMAAAACQAAAAVAAAACgAAAAIAAAAA////gd34//924v//SNb//zzP//82y///MMX//zLD//9czv//1vL//////4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAUFBTeBgYFx6enp+Obm5v/h4eH11tbW6dvb2+zc3NzatLS0onZ2dmomJiZEAAAAMQAAACL+/v7vZ+T//0zc//9G1///QNP//zvO//81yv//1PP//8/x//8/xP//////7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AwMCj5ubm+Ojo6P/n5+f/5eXl/+bm5v/m5ub/5OTk/+Tk5P/e3t7/4uLi/uLi4vPY2NjT0NDQuv////9W5P//UeD//0vb//9F1///P9L//znN///V9P//0PL//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/Pz8/+CgoJhlJSUVujo6P/CwsL/ysrK/8/Pz//Nzc3/3Nzc/9HR0f/Jycn/xcXF/8rKyv/Jycn//////1vo//9V4///UN///0ra//9E1v//PtH//zjN//8yyP//LcP///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf9PT0/3V1dW57e3tq6urq/87Ozv/S0tL/3Nzc/9XV1f/n5+f/3t7e/+Li4v/9/f3/////////////////YOv//1rn//9U4v//T97//7Tw////////////////////////////////////////////7////4EAAAAAAAAAAAAAAB/09PT/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/w8PD/7eXa/6eDVv+Vb0D/jmxB//////9i7f//X+r//1nm//9T4v//Td3//0fY//9C1P//PM///zbL//8wxf//K8H//yW8//88wf//1fL//////4EAAAAAAAAAH/X19f+EhIRhl5eXVuzs7P/s7Oz/6+vr/+bm5v/Dw8P/6urq//r6+v+7mW3/oHQ+/5pxP/+TbkD//////2Lt//9i7f//Xur//1jl//9S4f//TNz//0bY//9B0///O8///zXK//8vxf//KcD//yS8//9Zy///////yAAAAAAAAAAf9vb2/3d3d259fX1q7e3t/+3t7f/s7Oz/6+vr/9bW1v/r6+v//v7+/65+Q/+ldj3/nnM+/5hwP///////Yu3//2Lt//9h7P//Xen//1fk//9R4P//S9v//0XX//9A0v//Os7//zTJ//8uxP//KL///yu9///////2AAAAAAAAAB/39/f/8PDw/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs7P//////sHs7/6l4PP+jdj3/nXM+//Tv6v+B8f//Yu3//2Lt//9h7P//W+j//1bj//9Q3///Str//0TW//8/0f//Oc3//zPI//8tw///J77///////8AAAAAAAAAH/f39/+GhoZhmZmZVvDw8P/v7+//7+/v/+3t7f/Jycn/7e3t//////+1fjr/rns7/6h4PP+idT3/tpdw//Tv6f//////////////////////////////////////6vr//3Lf//890f//N8z//zLI//8swv///////wAAAAAAAAAf+Pj4/3l5eW5/f39q8fHx//Hx8f/w8PD/7+/v/93d3f/u7u7//////7mAOf+zfTr/rXo7/6d3PP+hdT7/m3I//5VvQP+PbEH/iWlC/4NmRP99ZEX/fGNF/3xjRf+Wgmn/6vr//0LU//880P//Nsv//zHH////////AAAAAAAAAB/4+Pj/8/Pz//Pz8//y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/+/v7/wYc//7h/Of+yfTr/rHo7/6Z3Pf+gdD7/mnE//5RuQP+Oa0H/iGlD/4JmRP99Y0X/fGNF/31kRv//////R9j//0HT//87z///Pcz///////YAAAAAAAAAH/n5+f+JiYlhnJycVvT09P/h4eH/4+Pj/+7u7v/y8vL/3d3d//Ly8v/So2n/vYI4/7d/Of+xfDr/q3k8/6V2Pf+fcz7/mXE//5NuQP+Na0L/h2hD/4BlRP98Y0X/fGNF//////9M3P//Rtf//0DT//9t2///////yAAAAAAAAAAf+vr6/3p6em6BgYFq9fX1/9zc3P/g4OD/2tra//Pz8//e3t7/8fHx//To2f/Kk1D/vIE4/7Z+Of+wezv/qnk8/6R2Pf+ecz7/mHA//5JtQf+LakL/hWdD/39lRP98Y0X//////1Df//9K2///XNv//9z3//////+BAAAAAAAAAB/7+/v/9/f3//b29v/X19f/9vb2//X19f/19fX/9PT0//T09P/z8/P/+fn5//7+/v//////////////////////////////////////08Kv/5BtQf+KakL/hGdD/35kRf/////////////////////v////gQAAAAAAAAAAAAAAH/v7+/+Li4thnp6eVqmpqf+1tbX/19fX//Ly8v/IyMj/1NTU/9vb2//09PT/3t7e/+rq6v/y8vL//////7R9Ov+uejv/qHg8/6J1Pf+bcj//lW9A/49sQf+JaUL/g2ZE//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/3x8fG6Hh4dt9/f3/4+Pj//Dw8P/6Ojo/+Tk5P/n5+f/7u7u//X19f/w8PD/8vLy//T09P//////uYA5/+7i1P/t4tb/p3c9/6B0Pv+acT//lG5A/45sQf+IaUP//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9/f3/pKSk/0pKSv/5+fn/xsbG/39/f//W1tb/+Pj4//f39//39/f/9vb2//b29v/19fX/9fX1//7+/v/FkVD/8OTU/+/j1v+reTz/pXY9/590Pv+ZcT//k25A/5t+Wf/////uAAAAAAAAAAAAAAAAAAAAAAAAAADW1tYCAAAAH/39/f9WVlbhPz8//3d3d/+rq6v/aWlp/4qKiv/AwMD/+fn5/+/v7//d3d3/9/f3//Dw8P/X19f/5OTk//Po2v/OoWv/uYNB/7B8O/+qeTz/pHY9/6J5Rv+ylXD/6+Tc/////4EAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PjNAQEB5/v7+/35+fm9iYmLHMDAw/2tra/9AQED/jo6O/7a2tv/6+vr/+Pj4//T09P/4+Pj/8vLy/+Li4v/e3t7/9vb2//39/f///////////////////////v7+//Ly8tL7+/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tLVWcnJz/0NDQ/9XV1f+AgID/PDw8/yYmJv9bW1v/7+/v//v7+//6+vr/+vr6//r6+v/5+fn/+Pj4//j4+P/39/f/9/f3//b29v/09PT/7Ozs/+Pj4//Y2Nj/AAAANgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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7f//Yez//1jl//9N3f//QtT//zfM//8ww///meD//729vf/Ozs7/5OTk//Ly8v/+/v7/qX5J/5lxP//z7+r/m/T//2Pt//9g6///VuP//0vb//9A0v//Ncr//zjF///AwMD/xsbG/+3t7f/19fX//////616O/+idT3/s5Vx//Pv6v/////////////////r+///duL//z7R//8zyP//s7Oz/62trf+kpKT/7+/v//////+7hkX/q3k8/6B0Pv+UbkD/iWlC/35kRf99ZEb/rJyJ/+v7//9H2P//SNL//6+vr/9ZWVn/dXV1/7Gxsf/29vb/4MSh/7aAPf+peDz/nnM+/5JtQf+HaEP/fWRF/31lR///////U9///6js//+bm5v/f39//zQ0NP98fHz/3Nzc//39/f/+/v7/////////////////0MGw/4VnQ/99Y0X///////////X///+1vb29/6Ghof+oqKj/TU1N/5aWlv/+/v7//f39//////+xfj7/6uDT/5lxP/+Oa0H/hWlH//////QAAAAAAAAAAMHBwf/Pz8//5eXl/7m5uf9SUlL/wMDA//j4+P/6+vr/3sKi/7KCR/+jdT3/nXhL/8q6p/////+1AAAAAAAAAAC+vr7/3t7e//f39//5+fn/u7u7/5ycnP/t7e3/4eHh//7+/v/9/f3///////7+/v/s7Oz/AAAAAAAAAAAAAAAAu7u7/87Ozv/k5OT/9vb2//j4+P/39/f/39/f//r6+v/8/Pz/yMjI//n5+f/MzMz/v7+/fwAAAAAAAAAAAAAAALe3t/+5ubn/u7u7/729vf+/v7//wcHB/8PDw//FxcX/yMjI/8nJyf/Hx8f/xMTEfwAAAAAAAAAAAAAAAAAAAAB+B6xBEAesQQADrEEAA6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQADrEEAA6xBAAesQQAHrEEAD6xBAAABAAcAICAQAAEABADoAgAAAQAQEBAAAQAEACgBAAACACAgAAABAAgAqAgAAAMAEBAAAAEACABoBQAABAAwMAAAAQAgAKglAAAFACAgAAABACAAqBAAAAYAEBAAAAEAIABoBAAABwA8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+DQogIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4NCiAgICA8c2VjdXJpdHk+DQogICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+PC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4NCiAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICA8L3NlY3VyaXR5Pg0KICA8L3RydXN0SW5mbz4NCjwvYXNzZW1ibHk+UEFQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQUQAEAAA4AAAAAUwCzASMB8wJjArMEAwUDBjMKIwwjDVMPwwBjEeMfIxUjJrMpUyqjK2Ms8y3DLyMg8zJjM9M2AzZTOHM5wzuTPWM+Uz8zMPNBg0LjQ1ND80SzRaNF80cTR/NIQ0wzTlNAQ1XjVsNZM1xDXNNdQ16TUFNhs2UjZ2NoY2yzb+Nkk3XzfyNxU4MzhDOMA4cjl4OYE5iDmqOR86Jzo6OkU6SjpcOmY6azqHOpE6pzqyOsw61zrfOu869ToGOz87STtvO3Y7kDuXO8I7aTxvPIE84zwSPRg9Jz0AAAAgAADkAAAAADDOMOYwgDH0MZQygzNsNOQ0CTUYNSA1LTU5NUU1SzVd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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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bwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAAAAAAFIANgAwADMAMQANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAdABoAGUAIABDAFIAVAAgAG0AbwByAGUAIAB0AGgAYQBuACAAbwBuAGMAZQAuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuAA0ACgAAAAAAUgA2ADAAMwAwAA0ACgAtACAAQwBSAFQAIABuAG8AdAAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAZAANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA3AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAG0AdQBsAHQAaQB0AGgAcgBlAGEAZAAgAGwAbwBjAGsAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMQA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAdABoAHIAZQBhAGQAIABkAGEAdABhAA0ACgAAAAAAAAAAAAAAUgA2ADAAMQAwAA0ACgAtACAAYQBiAG8AcgB0ACgAKQAgAGgAYQBzACAAYgBlAGUAbgAgAGMAYQBsAGwAZQBkAA0ACgAAAAAAAAAAAAAAAABSADYAMAAwADkADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQADQAKAAAAAAAAAAAAAABSADYAMAAwADgADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABhAHIAZwB1AG0AZQBuAHQAcwANAAoAAAAAAAAAAAAAAAAAAABSADYAMAAwADIADQAKAC0AIABmAGwAbwBhAHQAaQBuAGcAIABwAG8AaQBuAHQAIABzAHUAcABwAG8AcgB0ACAAbgBvAHQAIABsAG8AYQBkAGUAZAANAAoAAAAAAAAAAAACAAAAAAAAABDsAEABAAAACAAAAAAAAACw6wBAAQAAAAkAAAAAAAAAUOsAQAEAAAAKAAAAAAAAAADrAEABAAAAEAAAAAAAAACg6gBAAQAAABEAAAAAAAAAQOoAQAEAAAASAAAAAAAAAPDpAEABAAAAEwAAAAAAAACQ6QBAAQAAABgAAAAAAAAAIOkAQAEAAAAZAAAAAAAAANDoAEABAAAAGgAAAAAAAABg6ABAAQAAABsAAAAAAAAA8OcAQAEAAAAcAAAAAAAAAKDnAEABAAAAHgAAAAAAAABY5wBAAQAAAB8AAAAAAAAAkOYAQAEAAAAgAAAAAAAAACDmAEABAAAAIQAAAAAAAAAw5ABAAQAAAHgAAAAAAAAAEOQAQAEAAAB5AAAAAAAAAPDjAEABAAAAegAAAAAAAADQ4wBAAQAAAPwAAAAAAAAAyOMAQAEAAAD/AAAAAAAAAKjjAEABAAAATQBpAGMAcgBvAHMAbwBmAHQAIABWAGkAcwB1AGEAbAAgAEMAKwArACAAUgB1AG4AdABpAG0AZQAgAEwAaQBiAHIAYQByAHkAAAAAAAoACgAAAAAAAAAAAC4ALgAuAAAAPABwAHIAbwBnAHIAYQBtACAAbgBhAG0AZQAgAHUAbgBrAG4AbwB3AG4APgAAAAAAUgB1AG4AdABpAG0AZQAgAEUAcgByAG8AcgAhAAoACgBQAHIAbwBnAHIAYQBtADoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA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AAAAAEZhdGFsIEVycm9yIGluIExhdW5jaGVyAHIAYgAAAAAARmFpbGVkIHRvIG9wZW4gZXhlY3V0YWJsZQAAAAAAAABVbmFibGUgdG8gZmluZCBhbiBhcHBlbmRlZCBhcmNoaXZlLgAAAAAAVW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxlAAAAACMhAAAAAAAAAAAAAEpvYiBpbmZvcm1hdGlvbiBxdWVyeWluZyBmYWlsZWQASm9iIGluZm9ybWF0aW9uIHNldHRpbmcgZmFpbGVkAABzdGRpbiBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAAHN0ZG91dCBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAc3RkZXJyIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABVbmFibGUgdG8gY3JlYXRlIHByb2Nlc3MgdXNpbmcgJyVzJwAAAAAARmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAAAAAAAC4AZQB4AGUAAAAAAAAAAABFeHBlY3RlZCB0byBmaW5kIGEgY29tbWFuZCBlbmRpbmcgaW4gJy5leGUnIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAAAAAFRlcm1pbmF0aW5nIHF1b3RlIHdpdGhvdXQgc3RhcnRpbmcgcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQAAAAAARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOAAAAAAARXhwZWN0ZWQgdG8gZmluZCAnIycgYXQgc3RhcnQgb2Ygc2hlYmFuZyBsaW5lAAAARXhwZWN0ZWQgdG8gZmluZCAnIScgZm9sbG93aW5nICcjJyBpbiBzaGViYW5nIGxpbmUAAAAAAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBs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2hQBAAAAAADqFAEAAAAAAPwUAQAAAAAADBUBAAAAAAAAAAAAAAAAANYQAQAAAAAAAAAAAAAAAAAfAUV4aXRQcm9jZXNzAI0BR2V0Q29tbWFuZExpbmVXAH4EU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAaAFGcmVlTGlicmFyeQCoAENyZWF0ZVByb2Nlc3NXAADGAUdldEN1cnJlbnRQcm9jZXNzAAgFV2FpdEZvclNpbmdsZU9iamVjdABtAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAOYBR2V0RXhpdENvZGVQcm9jZXNzAAAaAkdldE1vZHVsZUZpbGVOYW1lVwAApwNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGkDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGsCR2V0U3RkSGFuZGxlAAAIAkdldExhc3RFcnJvcgAATAJHZXRQcm9jQWRkcmVzcwAAPgNMb2FkTGlicmFyeUEAADsEU2V0Q29uc29sZUN0cmxIYW5kbGVyAOwARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbAAeAkdldE1vZHVsZUhhbmRsZVcAAMsARGVjb2RlUG9pbnRlcgDXAkhlYXBGcmVlAADTAkhlYXBBbGxvYwBwAkdldFN0cmluZ1R5cGVXAACMAUdldENvbW1hbmRMaW5lQQBqAkdldFN0YXJ0dXBJbmZvVwDOBFRlcm1pbmF0ZVByb2Nlc3MAAOIEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAACzBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgACA0lzRGVidWdnZXJQcmVzZW50ACYEUnRsVmlydHVhbFVud2luZAAAHwRSdGxMb29rdXBGdW5jdGlvbkVudHJ5AAAYBFJ0bENhcHR1cmVDb250ZXh0ACUEUnRsVW53aW5kRXgA8gBFbnRlckNyaXRpY2FsU2VjdGlvbgAAOwNMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA6wJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AO4ARW5jb2RlUG9pbnRlcgDSAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgBBA0xvYWRMaWJyYXJ5VwAAWgFGbHNHZXRWYWx1ZQBbAUZsc1NldFZhbHVlAFkBRmxzRnJlZQCABFNldExhc3RFcnJvcgAAywFHZXRDdXJyZW50VGhyZWFkSWQAAFgBRmxzQWxsb2MAADQFV3JpdGVGaWxlANsCSGVhcFNldEluZm9ybWF0aW9uAACqAkdldFZlcnNpb24AANUCSGVhcENyZWF0ZQAAwwNSZWFkRmlsZQAAfARTZXRIYW5kbGVDb3VudAAA+gFHZXRGaWxlVHlwZQB0BFNldEZpbGVQb2ludGVyAAAZAkdldE1vZHVsZUZpbGVOYW1lQQAAZwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwAgBVdpZGVDaGFyVG9NdWx0aUJ5dGUA4QFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACpA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAJoCR2V0VGlja0NvdW50AADHAUdldEN1cnJlbnRQcm9jZXNzSWQAgAJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQDABFNsZWVwAI8AQ3JlYXRlRmlsZVcAeAFHZXRDUEluZm8AbgFHZXRBQ1AAAD4CR2V0T0VNQ1AAAAwDSXNWYWxpZENvZGVQYWdlANwCSGVhcFNpemUAAKABR2V0Q29uc29sZUNQAACyAUdldENvbnNvbGVNb2RlAACUBFNldFN0ZEhhbmRsZQAAXQFGbHVzaEZpbGVCdWZmZXJzAADaAkhlYXBSZUFsbG9jAGEEU2V0RW5kT2ZGaWxlAABRAkdldFByb2Nlc3NIZWFwAAAvA0xDTWFwU3RyaW5nVwAAMwVXcml0ZUNvbnNvbGVXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAMqLfLZkrAADNXSDSZtT//wAAAAAAAAAAQEgBQAEAAAAAAAAAAAAAAEBIAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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4FwAAMxdAACkBgEA2F0AAJReAAAoAwEAlF4AAFdfAADkBgEAWF8AAI9fAADYBwEAkF8AANFfAABADAEA1F8AAOxfAABADAEA7F8AALxhAADkCQEAvGEAADViAAAoAwEAOGIAAGhjAAAIBAEAaGMAADdlAAAMBwEAOGUAAC5mAAAoBwEAMGYAACRnAADABwEAJGcAANdnAAA4BwEA4GcAAF5oAABEBwEAYGgAAONoAABEBwEA5GgAAGlpAABEBwEAbGkAABZqAABcBwEAGGoAAMBxAACEBwEAwHEAAJJyAACcBwEAlHIAAMZyAAC4BQEAyHIAAN5zAADABwEA4HMAAHh0AABADAEApHQAAAd1AADYBwEACHUAACV1AABADAEAKHUAAGh1AABADAEAgHUAALR4AADgBwEA5HkAAF17AACgCgEAYHsAALd7AADYBwEAuHsAAC18AADkBwEAMHwAALx8AADkCQEAvHwAAKx+AAAECAEArH4AAGZ/AAAkCAEAaH8AAPh/AACgCQEA+H8AAG2CAABICAEAcIIAAE6EAABkCAEAUIQAAHiEAABADAEAeIQAALGEAABADAEA0IQAAHiFAACYCAEAeIUAAICHAACcCAEAgIcAAAWIAADYBwEACIgAANeIAADYBwEA9IgAAF+JAADYBwEAYIkAAKCJAABADAEAoIkAAOaJAADYBwEA6IkAADmKAAC4CAEAPIoAANGKAACoCQEA1IoAAKOVAADMCAEApJUAADmWAAAoAwEAPJYAAB+XAADwCAEAIJcAAICeAAAcCQEAgJ4AAF+fAABACQEAYJ8AALOfAADYBwEAtJ8AABOgAABADAEAFKAAABOiAABsCQEALKIAAKGjAACICQEArKMAAPGjAACgCQEA9KMAADukAACgCQEAPKQAAHOkAADYBwEAdKQAAMWkAAC4CAEAyKQAAGKlAACoCQEAZKUAAL6wAADACQEAwLAAAG2xAADkCQEAcLEAABqyAAD4CQEAHLIAAJCyAABADAEAkLIAADWzAAAICgEAYLMAAGi1AAA4CgEAaLUAAD+2AAB4CgEAQLYAALu2AAC8CwEA0LYAADG3AADYBwEANLcAAAe4AACgCgEACLgAAKC5AACwCgEAoLkAAG66AADMCgEAcLoAAJ+6AABADAEAoLoAAHW7AADUCgEAkLsAAN67AADgCgEA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ycnJ/7+/v//Jycn/ysrK//////9T4f//Tt7//0ra//9G1///QtT//z3Q//85zf//Ncr//zDF//8swv//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+Pj4/8HBwZElJSU1x8fHjvDw8P/Hx8f/7+/v/+/v7//u7u7/7u7u/+7u7v/e3t7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/0NDQ/97e3v/g4OD/7+/v//r6+v////////////////9W5P//UuH//07d//9J2v//Rdf//7Dt//////////////////////////////////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/7+/v/0bmd/6V8Sv+acT//lm9A//////9a5v//VeP//1Hg//9N3f//Sdn//0TW//9A0///PM///zfM//8zyf//L8T//yvB//8mvv//Irr//y28//+O3P///v//zAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5/8nJyYw0NDQi1tbWhPHx8f/IyMj/8fHx//Dw8P/w8PD/8PDw/+np6f/X19f/7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/0tLS/+vr6//fzLT/p3c8/6N1Pf+ecz7/mnE///////9d6f//Web//1Xj//9Q3///TNz//0jZ//9D1f//P9L//zvP//83y///Msj//y7E//8qwP//Jb3//yG6//8fuP//quX//////4EAAAAAAAAAAAAAAAAAAAAZ+fn5/yIiIjQAAAAXODg4JvLy8v/y8vL/8fHx//Hx8f/x8fH/8PDw/+fn5//Nzc3/7+/v/+/v7//T09P/zc3N/+7u7v/u7u7/0tLS//z8/P/Al2T/q3k8/6Z3Pf+idT3/nXM+//////9h7P//XOn//1jl//9U4v//UN///0vb//9H2P//Q9X//z7R//86zv//Nsv//zHH//8tw///KcD//yW8//8guf//T8j//////84AAAAAAAAAAAAAAAAAAAAZ+fn5/8PDw5ElJSU1ysrKjvPz8//Kysr/8vLy//Ly8v/y8vL/8fHx//Dw8P/f39//8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//0tLS//7+/v+1gUH/rns7/6p5PP+ldz3/oXQ+//////9z7///YOv//1zo//9X5f//U+H//0/e//9K2///Rtf//0LU//8+0f//Oc3//zXK//8xx///LML//yi///8kvP//KLv///////cAAAAAAAAAAAAAAAAAAAAZ+vr6//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/7+/v//////+3fzn/snw6/656O/+peDz/pXY9//Xw6v/X+v//c+///1/r//9b5///V+T//1Lh//9O3f//Str//0XX//9B0///PdD//zjN//80yf//MMX//yzC//8nv///I7v///////8AAAAAAAAAAAAAAAAAAAAZ+vr6/8zMzIw1NTUi2dnZhPT09P/Ly8v/9PT0/+fn5//z8/P/5ubm//Pz8//y8vL/5+fn/9zc3P/k5OT/5OTk/+bm5v/j4+P/1NTU//////+6gDn/tn45/7F8Ov+tejv/qHg8/7yZb//07+n/////////////////////////////////////////////////6fr//23b//84zP//M8n//y/F//8rwf//J77///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/yIiIjQAAAAXOjo6JvX19f/19fX/9fX1/9fX1//z8/P/1NTU//Ly8v/z8/P/5ubm/9HR0f/Pz8//zMzM/9DQ0P/Ozs7/1dXV//////++gjj/uYA5/7V+Ov+wfDv/rHo7/6d3PP+jdT3/nnM+/5pxP/+Vb0D/kW1B/4xrQv+IaUP/g2dD/39kRP+LdVr/3tfQ/+n6//87z///N8z//zPI//8uxP//KsH///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/8fHx5ElJSU1zMzMjvX19f/MzMz/9fX1/9XV1f/y8vL/ysrK/+bm5v/09PT/5+fn/+Dg4P/l5eX/5OTk/+Tk5P/q6ur/1NTU//7+/v/DiD7/vYI4/7iAOf+0fTr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+MakL/h2hD/4NmRP9+ZEX/i3Va//////8/0v//Os7//zbL//8yyP//NcX///////cAAAAAAAAAAAAAAAAAAAAZ/Pz8//j4+P/39/f/9/f3/6ioqP+rq6v/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//39/f/QnmH/wYM3/7yBOP+4fzn/s306/697O/+qeTz/pnc9/6F1Pv+dcj7/mHA//5RuQP+PbEH/i2pC/4ZoQ/+CZkT/fWRF//////9C1P//PtH//zrO//81yv//XtP//////84AAAAAAAAAAAAAAAAAAAAZ/Pz8/8/Pz4w1NTUi3NzchPj4+P+Ghob/rKys//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/8/Pz//j4+P/o0bP/woQ3/8CDN/+7gTj/t385/7J9Ov+uezv/qXg8/6V2Pf+gdD7/nHI//5dwQP+TbkD/jmxB/4pqQv+FZ0P/gWVE//////9G1///QdT//z3Q//85zf//s+v//////4EAAAAAAAAAAAAAAAAAAAAZ/Pz8/yIiIjQAAAAXOzs7Jvj4+P/19fX/iIiI/6ysrP/39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/9/fz/4cGa/8WMQ/+/gzj/u4A5/7Z+Of+yfDr/rXo7/6h4PP+kdj3/oHQ+/5tyP/+XcED/km1B/45rQf+JaUL/hWdD//////9J2v//Rdb//0zW//+d5////v//ywAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39/8nJyZFRUVFKbm5uyvf39//Ozs7/zMzM/35+fv+srKz/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/19fX/+/v7//7+/v///////////////////////////////////////////9fErv+acT//lm9A/5FtQf+Na0L/iGlD//////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39//Pz8/9ISEj/IiIi/6mpqf/6+vr/7Ozs/4mJif92dnb/rKys//j4+P/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/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IAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAcAAAAHAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+B////yf////b////////////////////2////yP///4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGCEhITBcXFxKZWVlUTY2NkQ1NTVBAAAAMAAAACQAAAAVAAAACgAAAAIAAAAA////gd34//924v//SNb//zzP//82y///MMX//zLD//9czv//1vL//////4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAUFBTeBgYFx6enp+Obm5v/h4eH11tbW6dvb2+zc3NzatLS0onZ2dmomJiZEAAAAMQAAACL+/v7vZ+T//0zc//9G1///QNP//zvO//81yv//1PP//8/x//8/xP//////7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AwMCj5ubm+Ojo6P/n5+f/5eXl/+bm5v/m5ub/5OTk/+Tk5P/e3t7/4uLi/uLi4vPY2NjT0NDQuv////9W5P//UeD//0vb//9F1///P9L//znN///V9P//0PL//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/Pz8/+CgoJhlJSUVujo6P/CwsL/ysrK/8/Pz//Nzc3/3Nzc/9HR0f/Jycn/xcXF/8rKyv/Jycn//////1vo//9V4///UN///0ra//9E1v//PtH//zjN//8yyP//LcP///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf9PT0/3V1dW57e3tq6urq/87Ozv/S0tL/3Nzc/9XV1f/n5+f/3t7e/+Li4v/9/f3/////////////////YOv//1rn//9U4v//T97//7Tw////////////////////////////////////////////7////4EAAAAAAAAAAAAAAB/09PT/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/w8PD/7eXa/6eDVv+Vb0D/jmxB//////9i7f//X+r//1nm//9T4v//Td3//0fY//9C1P//PM///zbL//8wxf//K8H//yW8//88wf//1fL//////4EAAAAAAAAAH/X19f+EhIRhl5eXVuzs7P/s7Oz/6+vr/+bm5v/Dw8P/6urq//r6+v+7mW3/oHQ+/5pxP/+TbkD//////2Lt//9i7f//Xur//1jl//9S4f//TNz//0bY//9B0///O8///zXK//8vxf//KcD//yS8//9Zy///////yAAAAAAAAAAf9vb2/3d3d259fX1q7e3t/+3t7f/s7Oz/6+vr/9bW1v/r6+v//v7+/65+Q/+ldj3/nnM+/5hwP///////Yu3//2Lt//9h7P//Xen//1fk//9R4P//S9v//0XX//9A0v//Os7//zTJ//8uxP//KL///yu9///////2AAAAAAAAAB/39/f/8PDw/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs7P//////sHs7/6l4PP+jdj3/nXM+//Tv6v+B8f//Yu3//2Lt//9h7P//W+j//1bj//9Q3///Str//0TW//8/0f//Oc3//zPI//8tw///J77///////8AAAAAAAAAH/f39/+GhoZhmZmZVvDw8P/v7+//7+/v/+3t7f/Jycn/7e3t//////+1fjr/rns7/6h4PP+idT3/tpdw//Tv6f//////////////////////////////////////6vr//3Lf//890f//N8z//zLI//8swv///////wAAAAAAAAAf+Pj4/3l5eW5/f39q8fHx//Hx8f/w8PD/7+/v/93d3f/u7u7//////7mAOf+zfTr/rXo7/6d3PP+hdT7/m3I//5VvQP+PbEH/iWlC/4NmRP99ZEX/fGNF/3xjRf+Wgmn/6vr//0LU//880P//Nsv//zHH////////AAAAAAAAAB/4+Pj/8/Pz//Pz8//y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/+/v7/wYc//7h/Of+yfTr/rHo7/6Z3Pf+gdD7/mnE//5RuQP+Oa0H/iGlD/4JmRP99Y0X/fGNF/31kRv//////R9j//0HT//87z///Pcz///////YAAAAAAAAAH/n5+f+JiYlhnJycVvT09P/h4eH/4+Pj/+7u7v/y8vL/3d3d//Ly8v/So2n/vYI4/7d/Of+xfDr/q3k8/6V2Pf+fcz7/mXE//5NuQP+Na0L/h2hD/4BlRP98Y0X/fGNF//////9M3P//Rtf//0DT//9t2///////yAAAAAAAAAAf+vr6/3p6em6BgYFq9fX1/9zc3P/g4OD/2tra//Pz8//e3t7/8fHx//To2f/Kk1D/vIE4/7Z+Of+wezv/qnk8/6R2Pf+ecz7/mHA//5JtQf+LakL/hWdD/39lRP98Y0X//////1Df//9K2///XNv//9z3//////+BAAAAAAAAAB/7+/v/9/f3//b29v/X19f/9vb2//X19f/19fX/9PT0//T09P/z8/P/+fn5//7+/v//////////////////////////////////////08Kv/5BtQf+KakL/hGdD/35kRf/////////////////////v////gQAAAAAAAAAAAAAAH/v7+/+Li4thnp6eVqmpqf+1tbX/19fX//Ly8v/IyMj/1NTU/9vb2//09PT/3t7e/+rq6v/y8vL//////7R9Ov+uejv/qHg8/6J1Pf+bcj//lW9A/49sQf+JaUL/g2ZE//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/3x8fG6Hh4dt9/f3/4+Pj//Dw8P/6Ojo/+Tk5P/n5+f/7u7u//X19f/w8PD/8vLy//T09P//////uYA5/+7i1P/t4tb/p3c9/6B0Pv+acT//lG5A/45sQf+IaUP//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9/f3/pKSk/0pKSv/5+fn/xsbG/39/f//W1tb/+Pj4//f39//39/f/9vb2//b29v/19fX/9fX1//7+/v/FkVD/8OTU/+/j1v+reTz/pXY9/590Pv+ZcT//k25A/5t+Wf/////uAAAAAAAAAAAAAAAAAAAAAAAAAADW1tYCAAAAH/39/f9WVlbhPz8//3d3d/+rq6v/aWlp/4qKiv/AwMD/+fn5/+/v7//d3d3/9/f3//Dw8P/X19f/5OTk//Po2v/OoWv/uYNB/7B8O/+qeTz/pHY9/6J5Rv+ylXD/6+Tc/////4EAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PjNAQEB5/v7+/35+fm9iYmLHMDAw/2tra/9AQED/jo6O/7a2tv/6+vr/+Pj4//T09P/4+Pj/8vLy/+Li4v/e3t7/9vb2//39/f///////////////////////v7+//Ly8tL7+/uB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8/Pz/+Tk5P/n5+f/6enp/+jo6P/+/v7/X+n//1Hg//9G1///0vT//zTH///////2AAAAAAAAAAC2trb/zc3N/+Li4v/t7e3/7e3t//n5+f/+/v7//////2Ht//9a5///t/L///////////////////////X///+2ubm5/93d3f/29vb/8PDw//r6+v/QvKT/kW9F//////9j7f//Yez//1jl//9N3f//QtT//zfM//8ww///meD//729vf/Ozs7/5OTk//Ly8v/+/v7/qX5J/5lxP//z7+r/m/T//2Pt//9g6///VuP//0vb//9A0v//Ncr//zjF///AwMD/xsbG/+3t7f/19fX//////616O/+idT3/s5Vx//Pv6v/////////////////r+///duL//z7R//8zyP//s7Oz/62trf+kpKT/7+/v//////+7hkX/q3k8/6B0Pv+UbkD/iWlC/35kRf99ZEb/rJyJ/+v7//9H2P//SNL//6+vr/9ZWVn/dXV1/7Gxsf/29vb/4MSh/7aAPf+peDz/nnM+/5JtQf+HaEP/fWRF/31lR///////U9///6js//+bm5v/f39//zQ0NP98fHz/3Nzc//39/f/+/v7/////////////////0MGw/4VnQ/99Y0X///////////X///+1vb29/6Ghof+oqKj/TU1N/5aWlv/+/v7//f39//////+xfj7/6uDT/5lxP/+Oa0H/hWlH//////QAAAAAAAAAAMHBwf/Pz8//5eXl/7m5uf9SUlL/wMDA//j4+P/6+vr/3sKi/7KCR/+jdT3/nXhL/8q6p/////+1AAAAAAAAAAC+vr7/3t7e//f39//5+fn/u7u7/5ycnP/t7e3/4eHh//7+/v/9/f3///////7+/v/s7Oz/AAAAAAAAAAAAAAAAu7u7/87Ozv/k5OT/9vb2//j4+P/39/f/39/f//r6+v/8/Pz/yMjI//n5+f/MzMz/v7+/fwAAAAAAAAAAAAAAALe3t/+5ubn/u7u7/729vf+/v7//wcHB/8PDw//FxcX/yMjI/8nJyf/Hx8f/xMTEfwAAAAAAAAAAAAAAAAAAAAB+B6xBEAesQQADrEEAA6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQADrEEAA6xBAAesQQAHrEEAD6xBAAABAAcAICAQAAEABADoAgAAAQAQEBAAAQAEACgBAAACACAgAAABAAgAqAgAAAMAEBAAAAEACABoBQAABAAwMAAAAQAgAKglAAAFACAgAAABACAAqBAAAAYAEBAAAAEAIABoBAAABwA8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+DQogIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4NCiAgICA8c2VjdXJpdHk+DQogICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+PC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4NCiAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICA8L3NlY3VyaXR5Pg0KICA8L3RydXN0SW5mbz4NCjwvYXNzZW1ibHk+UEFQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQUQA4AAARAAAALCiuKLAosii4KLoolijYKN4rIismKyorLisyKzYrOis+KwIrRitKK04rUitWK1orXitiK2YraituK3IrQAgAQDoAAAAIKAwoKCnqKewp7inwKfIp9Cn2Kfgp+in8Kj4qHCpeKmAqYipkKmYqaCpqKmwqbipwKnIqdCp2Kngqeip8Kn4qQCqCKoQqhiqIKooqjCqOKpAqkiqUKpYqmCqaKpwqniqgKqIqpCqmKqgqqiqsKq4qsCq2Krgquiq8Kr4qgCrCKsQqxirIKsoqzCrOKtAq0irUKtYq2CraKtwq3irgKuIq5CrmKugq6irsKu4q8CryKvQq9ir4Kvoq/Cr+KsArAisEKwYrCCsKKyYrLis2Kz4rBitWK1wrXitgK2IrZCtAAAAMAEAOAAAANCh0KLYouii+KIAowijEKMYoyCjKKMwozijQKNIo1ijYKNoo3CjeKOAo4ijkKMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEsDBBQAAAAAAAAAIQBf1KCpy5gAAMuYAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBiYXNlNjQKaW1wb3J0IGNvZGVjcwppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGRpc3R1dGlscy51dGlsCmZyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCmltcG9ydCBoYXNobGliCmltcG9ydCBpbXAKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18sIERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCBzeXNjb25maWcsIFppcEZpbGUsIGZzZGVjb2RlLCB0ZXh0X3R5cGUsIGZpbHRlcgpmcm9tIC5kYXRhYmFzZSBpbXBvcnQgSW5zdGFsbGVkRGlzdHJpYnV0aW9uCmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YSwgTUVUQURBVEFfRklMRU5BTUUKZnJvbSAudXRpbCBpbXBvcnQgKEZpbGVPcGVyYXRvciwgY29udmVydF9wYXRoLCBDU1ZSZWFkZXIsIENTVldyaXRlciwgQ2FjaGUsCiAgICAgICAgICAgICAgICAgICBjYWNoZWRfcHJvcGVydHksIGdldF9jYWNoZV9iYXNlLCByZWFkX2V4cG9ydHMsIHRlbXBkaXIpCmZyb20gLnZlcnNpb24gaW1wb3J0IE5vcm1hbGl6ZWRWZXJzaW9uLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpjYWNoZSA9IE5vbmUgICAgIyBjcmVhdGVkIHdoZW4gbmVlZGVkCgppZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICBJTVBfUFJFRklYID0gJ3BwJwplbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBJTVBfUFJFRklYID0gJ2p5JwplbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgIElNUF9QUkVGSVggPSAnaXAnCmVsc2U6CiAgICBJTVBfUFJFRklYID0gJ2NwJwoKVkVSX1NVRkZJWCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHlfdmVyc2lvbl9ub2RvdCcpCmlmIG5vdCBWRVJfU1VGRklYOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgVkVSX1NVRkZJWCA9ICclcyVzJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdClBZVkVSID0gJ3B5JyArIFZFUl9TVUZGSVgKSU1QVkVSID0gSU1QX1BSRUZJWCArIFZFUl9TVUZGSVgKCkFSQ0ggPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCctJywgJ18nKS5yZXBsYWNlKCcuJywgJ18nKQoKQUJJID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTT0FCSScpCmlmIEFCSSBhbmQgQUJJLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICBBQkkgPSBBQkkucmVwbGFjZSgnY3B5dGhvbi0nLCAnY3AnKQplbHNlOgogICAgZGVmIF9kZXJpdmVfYWJpKCk6CiAgICAgICAgcGFydHMgPSBbJ2NwJywgVkVSX1NVRkZJWF0KICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0RFQlVHJyk6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnZCcpCiAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdXSVRIX1BZTUFMTE9DJyk6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnbScpCiAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9VTklDT0RFX1NJWkUnKSA9PSA0OgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJ3UnKQogICAgICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQogICAgQUJJID0gX2Rlcml2ZV9hYmkoKQogICAgZGVsIF9kZXJpdmVfYWJpCgpGSUxFTkFNRV9SRSA9IHJlLmNvbXBpbGUocicnJwooP1A8bm0+W14tXSspCi0oP1A8dm4+XGQrW14tXSopCigtKD9QPGJuPlxkK1teLV0qKSk/Ci0oP1A8cHk+XHcrXGQrKFwuXHcrXGQrKSopCi0oP1A8Ymk+XHcrKQotKD9QPGFyPlx3KyhcLlx3KykqKQpcLndobCQKJycnLCByZS5JR05PUkVDQVNFIHwgcmUuVkVSQk9TRSkKCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicnJwooP1A8bm0+W14tXSspCi0oP1A8dm4+XGQrW14tXSopCigtKD9QPGJuPlxkK1teLV0qKSk/JAonJycsIHJlLklHTk9SRUNBU0UgfCByZS5WRVJCT1NFKQoKU0hFQkFOR19SRSA9IHJlLmNvbXBpbGUoYnInXHMqIyFbXlxyXG5dKicpClNIRUJBTkdfREVUQUlMX1JFID0gcmUuY29tcGlsZShicideKFxzKiMhKCJbXiJdKyJ8XFMrKSlccysoLiopJCcpClNIRUJBTkdfUFlUSE9OID0gYicjIXB5dGhvbicKU0hFQkFOR19QWVRIT05XID0gYicjIXB5dGhvbncnCgppZiBvcy5zZXAgPT0gJy8nOgogICAgdG9fcG9zaXggPSBsYW1iZGEgbzogbwplbHNlOgogICAgdG9fcG9zaXggPSBsYW1iZGEgbzogby5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKCmNsYXNzIE1vdW50ZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmltcHVyZV93aGVlbHMgPSB7fQogICAgICAgIHNlbGYubGlicyA9IHt9CgogICAgZGVmIGFkZChzZWxmLCBwYXRobmFtZSwgZXh0ZW5zaW9ucyk6CiAgICAgICAgc2VsZi5pbXB1cmVfd2hlZWxzW3BhdGhuYW1lXSA9IGV4dGVuc2lvbnMKICAgICAgICBzZWxmLmxpYnMudXBkYXRlKGV4dGVuc2lvbnMpCgogICAgZGVmIHJlbW92ZShzZWxmLCBwYXRobmFtZSk6CiAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuaW1wdXJlX3doZWVscy5wb3AocGF0aG5hbWUpCiAgICAgICAgZm9yIGssIHYgaW4gZXh0ZW5zaW9uczoKICAgICAgICAgICAgaWYgayBpbiBzZWxmLmxpYnM6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5saWJzW2tdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYubGliczoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgcmVzdWx0ID0gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgZnVsbG5hbWUgbm90IGluIHNlbGYubGliczoKICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCd1bmFibGUgdG8gZmluZCBleHRlbnNpb24gZm9yICVzJyAlIGZ1bGxuYW1lKQogICAgICAgICAgICByZXN1bHQgPSBpbXAubG9hZF9keW5hbWljKGZ1bGxuYW1lLCBzZWxmLmxpYnNbZnVsbG5hbWVdKQogICAgICAgICAgICByZXN1bHQuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICAgICAgcGFydHMgPSBmdWxsbmFtZS5yc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBpZiBsZW4ocGFydHMpID4gMToKICAgICAgICAgICAgICAgIHJlc3VsdC5fX3BhY2thZ2VfXyA9IHBhcnRzWzBdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX2hvb2sgPSBNb3VudGVyKCkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgogICAgIiIiCiAgICBDbGFzcyB0byBidWlsZCBhbmQgaW5zdGFsbCBmcm9tIFdoZWVsIGZpbGVzIChQRVAgNDI3KS4KICAgICIiIgoKICAgIHdoZWVsX3ZlcnNpb24gPSAoMSwgMSkKICAgIGhhc2hfa2luZCA9ICdzaGEyNTYnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUsIHNpZ249RmFsc2UsIHZlcmlmeT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZSB1c2luZyBhICh2YWxpZCkgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5zaWduID0gc2lnbgogICAgICAgIHNlbGYuc2hvdWxkX3ZlcmlmeSA9IHZlcmlmeQogICAgICAgIHNlbGYuYnVpbGR2ZXIgPSAnJwogICAgICAgIHNlbGYucHl2ZXIgPSBbUFlWRVJdCiAgICAgICAgc2VsZi5hYmkgPSBbJ25vbmUnXQogICAgICAgIHNlbGYuYXJjaCA9IFsnYW55J10KICAgICAgICBzZWxmLmRpcm5hbWUgPSBvcy5nZXRjd2QoKQogICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubmFtZSA9ICdkdW1teScKICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gJzAuMScKICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbSA9IE5BTUVfVkVSU0lPTl9SRS5tYXRjaChmaWxlbmFtZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGluZm8gPSBtLmdyb3VwZGljdCgnJykKICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IGluZm9bJ25tJ10KICAgICAgICAgICAgICAgICMgUmVpbnN0YXRlIHRoZSBsb2NhbCB2ZXJzaW9uIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gaW5mb1sndm4nXS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZHZlciA9IGluZm9bJ2JuJ10KICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgbSA9IEZJTEVOQU1FX1JFLm1hdGNoKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignSW52YWxpZCBuYW1lIG9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBkaXJuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlybmFtZSA9IG9zLnBhdGguYWJzcGF0aChkaXJuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaW5mbyA9IG0uZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gaW5mb1snbm0nXQogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gaW5mb1sndm4nXQogICAgICAgICAgICAgICAgc2VsZi5idWlsZHZlciA9IGluZm9bJ2JuJ10KICAgICAgICAgICAgICAgIHNlbGYucHl2ZXIgPSBpbmZvWydweSddLnNwbGl0KCcuJykKICAgICAgICAgICAgICAgIHNlbGYuYWJpID0gaW5mb1snYmknXS5zcGxpdCgnLicpCiAgICAgICAgICAgICAgICBzZWxmLmFyY2ggPSBpbmZvWydhciddLnNwbGl0KCcuJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBmaWxlbmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZW5hbWUgZnJvbSB0aGUgdmFyaW91cyBjb21wb25lbnRzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuYnVpbGR2ZXI6CiAgICAgICAgICAgIGJ1aWxkdmVyID0gJy0nICsgc2VsZi5idWlsZHZlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1aWxkdmVyID0gJycKICAgICAgICBweXZlciA9ICcuJy5qb2luKHNlbGYucHl2ZXIpCiAgICAgICAgYWJpID0gJy4nLmpvaW4oc2VsZi5hYmkpCiAgICAgICAgYXJjaCA9ICcuJy5qb2luKHNlbGYuYXJjaCkKICAgICAgICAjIHJlcGxhY2UgLSB3aXRoIF8gYXMgYSBsb2NhbCB2ZXJzaW9uIHNlcGFyYXRvcgogICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24ucmVwbGFjZSgnLScsICdfJykKICAgICAgICByZXR1cm4gJyVzLSVzJXMtJXMtJXMtJXMud2hsJyAlIChzZWxmLm5hbWUsIHZlcnNpb24sIGJ1aWxkdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dmVyLCBhYmksIGFyY2gpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhpc3RzKHNlbGYpOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZmlsZShwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgZm9yIHB5dmVyIGluIHNlbGYucHl2ZXI6CiAgICAgICAgICAgIGZvciBhYmkgaW4gc2VsZi5hYmk6CiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBzZWxmLmFyY2g6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcHl2ZXIsIGFiaSwgYXJjaAoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IHNlbGYuZ2V0X3doZWVsX21ldGFkYXRhKHpmKQogICAgICAgICAgICB3diA9IHdoZWVsX21ldGFkYXRhWydXaGVlbC1WZXJzaW9uJ10uc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSB0dXBsZShbaW50KGkpIGZvciBpIGluIHd2XSkKICAgICAgICAgICAgaWYgZmlsZV92ZXJzaW9uIDwgKDEsIDEpOgogICAgICAgICAgICAgICAgZm4gPSAnTUVUQURBVEEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmbiA9IE1FVEFEQVRBX0ZJTEVOQU1FCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2ZpbGVuYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsIGZuKQogICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKG1ldGFkYXRhX2ZpbGVuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYmYpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWV0YWRhdGEoZmlsZW9iaj13ZikKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCB3aGVlbCwgYmVjYXVzZSAlcyBpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaXNzaW5nJyAlIGZuKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X3doZWVsX21ldGFkYXRhKHNlbGYsIHpmKToKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgbWV0YWRhdGFfZmlsZW5hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykKICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfZmlsZW5hbWUpIGFzIGJmOgogICAgICAgICAgICB3ZiA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykoYmYpCiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZmlsZSh3ZikKICAgICAgICByZXR1cm4gZGljdChtZXNzYWdlKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0X3doZWVsX21ldGFkYXRhKHpmKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcHJvY2Vzc19zaGViYW5nKHNlbGYsIGRhdGEpOgogICAgICAgIG0gPSBTSEVCQU5HX1JFLm1hdGNoKGRhdGEpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgZW5kID0gbS5lbmQoKQogICAgICAgICAgICBzaGViYW5nLCBkYXRhX2FmdGVyX3NoZWJhbmcgPSBkYXRhWzplbmRdLCBkYXRhW2VuZDpdCiAgICAgICAgICAgICMgUHJlc2VydmUgYW55IGFyZ3VtZW50cyBhZnRlciB0aGUgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgaWYgYidweXRob253JyBpbiBzaGViYW5nLmxvd2VyKCk6CiAgICAgICAgICAgICAgICBzaGViYW5nX3B5dGhvbiA9IFNIRUJBTkdfUFlUSE9OVwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2hlYmFuZ19weXRob24gPSBTSEVCQU5HX1BZVEhPTgogICAgICAgICAgICBtID0gU0hFQkFOR19ERVRBSUxfUkUubWF0Y2goc2hlYmFuZykKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGFyZ3MgPSBiJyAnICsgbS5ncm91cHMoKVstMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZ3MgPSBiJycKICAgICAgICAgICAgc2hlYmFuZyA9IHNoZWJhbmdfcHl0aG9uICsgYXJncwogICAgICAgICAgICBkYXRhID0gc2hlYmFuZyArIGRhdGFfYWZ0ZXJfc2hlYmFuZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNyID0gZGF0YS5maW5kKGInXHInKQogICAgICAgICAgICBsZiA9IGRhdGEuZmluZChiJ1xuJykKICAgICAgICAgICAgaWYgY3IgPCAwIG9yIGNyID4gbGY6CiAgICAgICAgICAgICAgICB0ZXJtID0gYidcbicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGRhdGFbY3I6Y3IgKyAyXSA9PSBiJ1xyXG4nOgogICAgICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xyXG4nCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xyJwogICAgICAgICAgICBkYXRhID0gU0hFQkFOR19QWVRIT04gKyB0ZXJtICsgZGF0YQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGdldF9oYXNoKHNlbGYsIGRhdGEsIGhhc2hfa2luZD1Ob25lKToKICAgICAgICBpZiBoYXNoX2tpbmQgaXMgTm9uZToKICAgICAgICAgICAgaGFzaF9raW5kID0gc2VsZi5oYXNoX2tpbmQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhhc2hlciA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaF9raW5kKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG06ICVyJyAlIGhhc2hfa2luZCkKICAgICAgICByZXN1bHQgPSBoYXNoZXIoZGF0YSkuZGlnZXN0KCkKICAgICAgICByZXN1bHQgPSBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUocmVzdWx0KS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIGhhc2hfa2luZCwgcmVzdWx0CgogICAgZGVmIHdyaXRlX3JlY29yZChzZWxmLCByZWNvcmRzLCByZWNvcmRfcGF0aCwgYmFzZSk6CiAgICAgICAgcmVjb3JkcyA9IGxpc3QocmVjb3JkcykgIyBtYWtlIGEgY29weSBmb3Igc29ydGluZwogICAgICAgIHAgPSB0b19wb3NpeChvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJhc2UpKQogICAgICAgIHJlY29yZHMuYXBwZW5kKChwLCAnJywgJycpKQogICAgICAgIHJlY29yZHMuc29ydCgpCiAgICAgICAgd2l0aCBDU1ZXcml0ZXIocmVjb3JkX3BhdGgpIGFzIHdyaXRlcjoKICAgICAgICAgICAgZm9yIHJvdyBpbiByZWNvcmRzOgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKCiAgICBkZWYgd3JpdGVfcmVjb3JkcyhzZWxmLCBpbmZvLCBsaWJkaXIsIGFyY2hpdmVfcGF0aHMpOgogICAgICAgIHJlY29yZHMgPSBbXQogICAgICAgIGRpc3RpbmZvLCBpbmZvX2RpciA9IGluZm8KICAgICAgICBoYXNoZXIgPSBnZXRhdHRyKGhhc2hsaWIsIHNlbGYuaGFzaF9raW5kKQogICAgICAgIGZvciBhcCwgcCBpbiBhcmNoaXZlX3BhdGhzOgogICAgICAgICAgICB3aXRoIG9wZW4ocCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBkaWdlc3QgPSAnJXM9JXMnICUgc2VsZi5nZXRfaGFzaChkYXRhKQogICAgICAgICAgICBzaXplID0gb3MucGF0aC5nZXRzaXplKHApCiAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKChhcCwgZGlnZXN0LCBzaXplKSkKCiAgICAgICAgcCA9IG9zLnBhdGguam9pbihkaXN0aW5mbywgJ1JFQ09SRCcpCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmQocmVjb3JkcywgcCwgbGliZGlyKQogICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykpCiAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKCiAgICBkZWYgYnVpbGRfemlwKHNlbGYsIHBhdGhuYW1lLCBhcmNoaXZlX3BhdGhzKToKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICd3JywgemlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHpmOgogICAgICAgICAgICBmb3IgYXAsIHAgaW4gYXJjaGl2ZV9wYXRoczoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV3JvdGUgJXMgdG8gJXMgaW4gd2hlZWwnLCBwLCBhcCkKICAgICAgICAgICAgICAgIHpmLndyaXRlKHAsIGFwKQoKICAgIGRlZiBidWlsZChzZWxmLCBwYXRocywgdGFncz1Ob25lLCB3aGVlbF92ZXJzaW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgd2hlZWwgZnJvbSBmaWxlcyBpbiBzcGVjaWZpZWQgcGF0aHMsIGFuZCB1c2UgYW55IHNwZWNpZmllZCB0YWdzCiAgICAgICAgd2hlbiBkZXRlcm1pbmluZyB0aGUgbmFtZSBvZiB0aGUgd2hlZWwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdGFncyBpcyBOb25lOgogICAgICAgICAgICB0YWdzID0ge30KCiAgICAgICAgbGlia2V5ID0gbGlzdChmaWx0ZXIobGFtYmRhIG86IG8gaW4gcGF0aHMsICgncHVyZWxpYicsICdwbGF0bGliJykpKVswXQogICAgICAgIGlmIGxpYmtleSA9PSAncGxhdGxpYic6CiAgICAgICAgICAgIGlzX3B1cmUgPSAnZmFsc2UnCiAgICAgICAgICAgIGRlZmF1bHRfcHl2ZXIgPSBbSU1QVkVSXQogICAgICAgICAgICBkZWZhdWx0X2FiaSA9IFtBQkldCiAgICAgICAgICAgIGRlZmF1bHRfYXJjaCA9IFtBUkNIXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlzX3B1cmUgPSAndHJ1ZScKICAgICAgICAgICAgZGVmYXVsdF9weXZlciA9IFtQWVZFUl0KICAgICAgICAgICAgZGVmYXVsdF9hYmkgPSBbJ25vbmUnXQogICAgICAgICAgICBkZWZhdWx0X2FyY2ggPSBbJ2FueSddCgogICAgICAgIHNlbGYucHl2ZXIgPSB0YWdzLmdldCgncHl2ZXInLCBkZWZhdWx0X3B5dmVyKQogICAgICAgIHNlbGYuYWJpID0gdGFncy5nZXQoJ2FiaScsIGRlZmF1bHRfYWJpKQogICAgICAgIHNlbGYuYXJjaCA9IHRhZ3MuZ2V0KCdhcmNoJywgZGVmYXVsdF9hcmNoKQoKICAgICAgICBsaWJkaXIgPSBwYXRoc1tsaWJrZXldCgogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIGFyY2hpdmVfcGF0aHMgPSBbXQoKICAgICAgICAjIEZpcnN0LCBzdHVmZiB3aGljaCBpcyBub3QgaW4gc2l0ZS1wYWNrYWdlcwogICAgICAgIGZvciBrZXkgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIHBhdGhzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcGF0aCA9IHBhdGhzW2tleV0KICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGZzZGVjb2RlKG9zLnBhdGguam9pbihyb290LCBmbikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gb3MucGF0aC5yZWxwYXRoKHAsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGRhdGFfZGlyLCBrZXksIHJwKSkKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdzY3JpcHRzJyBhbmQgbm90IHAuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucHJvY2Vzc19zaGViYW5nKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCgogICAgICAgICMgTm93LCBzdHVmZiB3aGljaCBpcyBpbiBzaXRlLXBhY2thZ2VzLCBvdGhlciB0aGFuIHRoZQogICAgICAgICMgZGlzdGluZm8gc3R1ZmYuCiAgICAgICAgcGF0aCA9IGxpYmRpcgogICAgICAgIGRpc3RpbmZvID0gTm9uZQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICBpZiByb290ID09IHBhdGg6CiAgICAgICAgICAgICAgICAjIEF0IHRoZSB0b3AgbGV2ZWwgb25seSwgc2F2ZSBkaXN0aW5mbyBmb3IgbGF0ZXIKICAgICAgICAgICAgICAgICMgYW5kIHNraXAgaXQgZm9yIG5vdwogICAgICAgICAgICAgICAgZm9yIGksIGRuIGluIGVudW1lcmF0ZShkaXJzKToKICAgICAgICAgICAgICAgICAgICBkbiA9IGZzZGVjb2RlKGRuKQogICAgICAgICAgICAgICAgICAgIGlmIGRuLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmZvID0gb3MucGF0aC5qb2luKHJvb3QsIGRuKQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgZGlyc1tpXQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgYXNzZXJ0IGRpc3RpbmZvLCAnLmRpc3QtaW5mbyBkaXJlY3RvcnkgZXhwZWN0ZWQsIG5vdCBmb3VuZCcKCiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICMgY29tbWVudCBvdXQgbmV4dCBzdWl0ZSB0byBsZWF2ZSAucHljIGZpbGVzIGluCiAgICAgICAgICAgICAgICBpZiBmc2RlY29kZShmbikuZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICBycCA9IHRvX3Bvc2l4KG9zLnBhdGgucmVscGF0aChwLCBwYXRoKSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChycCwgcCkpCgogICAgICAgICMgTm93IGRpc3RpbmZvLiBBc3N1bWVkIHRvIGJlIGZsYXQsIGkuZS4gb3MubGlzdGRpciBpcyBlbm91Z2guCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpc3RpbmZvKQogICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgaWYgZm4gbm90IGluICgnUkVDT1JEJywgJ0lOU1RBTExFUicsICdTSEFSRUQnLCAnV0hFRUwnKToKICAgICAgICAgICAgICAgIHAgPSBmc2RlY29kZShvcy5wYXRoLmpvaW4oZGlzdGluZm8sIGZuKSkKICAgICAgICAgICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCBmbikpCiAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IFsKICAgICAgICAgICAgJ1doZWVsLVZlcnNpb246ICVkLiVkJyAlICh3aGVlbF92ZXJzaW9uIG9yIHNlbGYud2hlZWxfdmVyc2lvbiksCiAgICAgICAgICAgICdHZW5lcmF0b3I6IGRpc3RsaWIgJXMnICUgX192ZXJzaW9uX18sCiAgICAgICAgICAgICdSb290LUlzLVB1cmVsaWI6ICVzJyAlIGlzX3B1cmUsCiAgICAgICAgXQogICAgICAgIGZvciBweXZlciwgYWJpLCBhcmNoIGluIHNlbGYudGFnczoKICAgICAgICAgICAgd2hlZWxfbWV0YWRhdGEuYXBwZW5kKCdUYWc6ICVzLSVzLSVzJyAlIChweXZlciwgYWJpLCBhcmNoKSkKICAgICAgICBwID0gb3MucGF0aC5qb2luKGRpc3RpbmZvLCAnV0hFRUwnKQogICAgICAgIHdpdGggb3BlbihwLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKHdoZWVsX21ldGFkYXRhKSkKICAgICAgICBhcCA9IHRvX3Bvc2l4KG9zLnBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykpCiAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKCiAgICAgICAgIyBOb3csIGF0IGxhc3QsIFJFQ09SRC4KICAgICAgICAjIFBhdGhzIGluIGhlcmUgYXJlIGFyY2hpdmUgcGF0aHMgLSBub3RoaW5nIGVsc2UgbWFrZXMgc2Vuc2UuCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmRzKChkaXN0aW5mbywgaW5mb19kaXIpLCBsaWJkaXIsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgIyBOb3csIHJlYWR5IHRvIGJ1aWxkIHRoZSB6aXAgZmlsZQogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBzZWxmLmJ1aWxkX3ppcChwYXRobmFtZSwgYXJjaGl2ZV9wYXRocykKICAgICAgICByZXR1cm4gcGF0aG5hbWUKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBwYXRocywgbWFrZXIsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIGEgd2hlZWwgdG8gdGhlIHNwZWNpZmllZCBwYXRocy4gSWYga3dhcmcgYGB3YXJuZXJgYCBpcwogICAgICAgIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgY2FsbGFibGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdHdvCiAgICAgICAgdHVwbGVzIGluZGljYXRpbmcgdGhlIHdoZWVsIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgdGhlIHdoZWVsCiAgICAgICAgdmVyc2lvbiBpbiB0aGUgZmlsZSwgaWYgdGhlcmUgaXMgYSBkaXNjcmVwYW5jeSBpbiB0aGUgdmVyc2lvbnMuCiAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBpc3N1ZSBhbnkgd2FybmluZ3MgdG8gcmFpc2UgYW55IGV4Y2VwdGlvbnMuCiAgICAgICAgSWYga3dhcmcgYGBsaWJfb25seWBgIGlzIFRydWUsIG9ubHkgdGhlIHB1cmVsaWIvcGxhdGxpYiBmaWxlcyBhcmUKICAgICAgICBpbnN0YWxsZWQsIGFuZCB0aGUgaGVhZGVycywgc2NyaXB0cywgZGF0YSBhbmQgZGlzdC1pbmZvIG1ldGFkYXRhIGFyZQogICAgICAgIG5vdCB3cml0dGVuLgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIGluc3RhbmNlIHVubGVzcwogICAgICAgIGBgb3B0aW9ucy5saWJfb25seWBgIGlzIFRydWUsIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybiB2YWx1ZSBpcyBgYE5vbmVgYC4KICAgICAgICAiIiIKCiAgICAgICAgZHJ5X3J1biA9IG1ha2VyLmRyeV9ydW4KICAgICAgICB3YXJuZXIgPSBrd2FyZ3MuZ2V0KCd3YXJuZXInKQogICAgICAgIGxpYl9vbmx5ID0ga3dhcmdzLmdldCgnbGliX29ubHknLCBGYWxzZSkKCiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIG1ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgd2hlZWxfbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQoKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQoKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdpdGggemYub3Blbih3aGVlbF9tZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYndmKQogICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgICAgICB3diA9IG1lc3NhZ2VbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICBpZiAoZmlsZV92ZXJzaW9uICE9IHNlbGYud2hlZWxfdmVyc2lvbikgYW5kIHdhcm5lcjoKICAgICAgICAgICAgICAgIHdhcm5lcihzZWxmLndoZWVsX3ZlcnNpb24sIGZpbGVfdmVyc2lvbikKCiAgICAgICAgICAgIGlmIG1lc3NhZ2VbJ1Jvb3QtSXMtUHVyZWxpYiddID09ICd0cnVlJzoKICAgICAgICAgICAgICAgIGxpYmRpciA9IHBhdGhzWydwdXJlbGliJ10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpYmRpciA9IHBhdGhzWydwbGF0bGliJ10KCiAgICAgICAgICAgIHJlY29yZHMgPSB7fQogICAgICAgICAgICB3aXRoIHpmLm9wZW4ocmVjb3JkX25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPWJmKSBhcyByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSByb3dbMF0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1twXSA9IHJvdwoKICAgICAgICAgICAgZGF0YV9wZnggPSBwb3NpeHBhdGguam9pbihkYXRhX2RpciwgJycpCiAgICAgICAgICAgIGluZm9fcGZ4ID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICcnKQogICAgICAgICAgICBzY3JpcHRfcGZ4ID0gcG9zaXhwYXRoLmpvaW4oZGF0YV9kaXIsICdzY3JpcHRzJywgJycpCgogICAgICAgICAgICAjIG1ha2UgYSBuZXcgaW5zdGFuY2UgcmF0aGVyIHRoYW4gYSBjb3B5IG9mIG1ha2VyJ3MsCiAgICAgICAgICAgICMgYXMgd2UgbXV0YXRlIGl0CiAgICAgICAgICAgIGZpbGVvcCA9IEZpbGVPcGVyYXRvcihkcnlfcnVuPWRyeV9ydW4pCiAgICAgICAgICAgIGZpbGVvcC5yZWNvcmQgPSBUcnVlICAgICMgc28gd2UgY2FuIHJvbGxiYWNrIGlmIG5lZWRlZAoKICAgICAgICAgICAgYmMgPSBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgICAgIyBEb3VibGUgbmVnYXRpdmVzLiBMb3ZlbHkhCgogICAgICAgICAgICBvdXRmaWxlcyA9IFtdICAgIyBmb3IgUkVDT1JEIHdyaXRpbmcKCiAgICAgICAgICAgICMgZm9yIHNjcmlwdCBjb3B5aW5nL3NoZWJhbmcgcHJvY2Vzc2luZwogICAgICAgICAgICB3b3JrZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgICAgICMgc2V0IHRhcmdldCBkaXIgbGF0ZXIKICAgICAgICAgICAgIyB3ZSBkZWZhdWx0IGFkZF9sYXVuY2hlcnMgdG8gRmFsc2UsIGFzIHRoZQogICAgICAgICAgICAjIFB5dGhvbiBMYXVuY2hlciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCiAgICAgICAgICAgIG1ha2VyLnNvdXJjZV9kaXIgPSB3b3JrZGlyCiAgICAgICAgICAgIG1ha2VyLnRhcmdldF9kaXIgPSBOb25lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGFyY25hbWUgPSB6aW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICAgICAgIyBUaGUgc2lnbmF0dXJlIGZpbGUgd29uJ3QgYmUgaW4gUkVDT1JELAogICAgICAgICAgICAgICAgICAgICMgYW5kIHdlICBkb24ndCBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICByb3cgPSByZWNvcmRzW3VfYXJjbmFtZV0KICAgICAgICAgICAgICAgICAgICBpZiByb3dbMl0gYW5kIHN0cih6aW5mby5maWxlX3NpemUpICE9IHJvd1syXToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignc2l6ZSBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcm93WzFdOgogICAgICAgICAgICAgICAgICAgICAgICBraW5kLCB2YWx1ZSA9IHJvd1sxXS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgXywgZGlnZXN0ID0gc2VsZi5nZXRfaGFzaChkYXRhLCBraW5kKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3QgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIGFyY25hbWUpCgogICAgICAgICAgICAgICAgICAgIGlmIGxpYl9vbmx5IGFuZCB1X2FyY25hbWUuc3RhcnRzd2l0aCgoaW5mb19wZngsIGRhdGFfcGZ4KSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbGliX29ubHk6IHNraXBwaW5nICVzJywgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlzX3NjcmlwdCA9ICh1X2FyY25hbWUuc3RhcnRzd2l0aChzY3JpcHRfcGZ4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHVfYXJjbmFtZS5lbmRzd2l0aCgnLmV4ZScpKQoKICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUuc3RhcnRzd2l0aChkYXRhX3BmeCk6CiAgICAgICAgICAgICAgICAgICAgICAgIF8sIHdoZXJlLCBycCA9IHVfYXJjbmFtZS5zcGxpdCgnLycsIDIpCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4ocGF0aHNbd2hlcmVdLCBjb252ZXJ0X3BhdGgocnApKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbWVhbnQgZm9yIHNpdGUtcGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZSBpbiAod2hlZWxfbWV0YWRhdGFfbmFtZSwgcmVjb3JkX25hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihsaWJkaXIsIGNvbnZlcnRfcGF0aCh1X2FyY25hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc19zY3JpcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5jb3B5X3N0cmVhbShiZiwgb3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICMgRG91YmxlIGNoZWNrIHRoZSBkaWdlc3Qgb2YgdGhlIHdyaXR0ZW4gZmlsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1biBhbmQgcm93WzFdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG91dGZpbGUsICdyYicpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLCBuZXdkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV3ZGlnZXN0ICE9IGRpZ2VzdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZGlnZXN0IG1pc21hdGNoICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb24gd3JpdGUgZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgb3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYmMgYW5kIG91dGZpbGUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5YyA9IGZpbGVvcC5ieXRlX2NvbXBpbGUob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQocHljKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERvbid0IGdpdmUgdXAgaWYgYnl0ZS1jb21waWxhdGlvbiBmYWlscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJ1dCBsb2cgaXQgYW5kIHBlcmhhcHMgd2FybiB0aGUgdXNlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdCeXRlLWNvbXBpbGF0aW9uIGZhaWxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguYmFzZW5hbWUoY29udmVydF9wYXRoKGFyY25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICB3b3JrbmFtZSA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBmbikKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLmNvcHlfc3RyZWFtKGJmLCB3b3JrbmFtZSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRuLCBmbiA9IG9zLnBhdGguc3BsaXQob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXIudGFyZ2V0X2RpciA9IGRuCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IG1ha2VyLm1ha2UoZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKGZpbGVuYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuZXh0ZW5kKGZpbGVuYW1lcykKCiAgICAgICAgICAgICAgICBpZiBsaWJfb25seToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2xpYl9vbmx5OiByZXR1cm5pbmcgTm9uZScpCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSBzY3JpcHRzCgogICAgICAgICAgICAgICAgICAgICMgVHJ5IHRvIGdldCBweWRpc3QuanNvbiBzbyB3ZSBjYW4gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgICAgICAgICAgICAgICMgYW55IGNvbW1hbmRzIHRvIGdlbmVyYXRlLiBJZiB0aGlzIGZhaWxzIChlLmcuIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgICAjIG9mIGEgbGVnYWN5IHdoZWVsKSwgbG9nIGEgd2FybmluZyBidXQgZG9uJ3QgZ2l2ZSB1cC4KICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSBzZWxmLmluZm9bJ1doZWVsLVZlcnNpb24nXQogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVfdmVyc2lvbiA9PSAnMS4wJzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgbGVnYWN5IGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgZXAgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ2VudHJ5X3BvaW50cy50eHQnKQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oZXApIGFzIGJ3ZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGRhdGEgPSByZWFkX2V4cG9ydHMoYndmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ2NvbnNvbGUnLCAnZ3VpJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9ICclc19zY3JpcHRzJyAlIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gZXBkYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1snd3JhcF8lcycgJSBrZXldID0gZCA9IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIGVwZGF0YVtrXS52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnJXM6JXMnICUgKHYucHJlZml4LCB2LnN1ZmZpeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHYuZmxhZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSAnICVzJyAlIHYuZmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbdi5uYW1lXSA9IHMKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmFibGUgdG8gcmVhZCBsZWdhY3kgc2NyaXB0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRhZGF0YSwgc28gY2Fubm90IGdlbmVyYXRlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzJykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfbmFtZSkgYXMgYndmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihid2YpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBqc29uLmxvYWQod2YpLmdldCgnZXh0ZW5zaW9ucycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29tbWFuZHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuZ2V0KCdweXRob24uY29tbWFuZHMnKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byByZWFkIEpTT04gbWV0YWRhdGEsIHNvICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5ub3QgZ2VuZXJhdGUgc2NyaXB0cycpCiAgICAgICAgICAgICAgICAgICAgaWYgY29tbWFuZHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfc2NyaXB0cyA9IGNvbW1hbmRzLmdldCgnd3JhcF9jb25zb2xlJywge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGd1aV9zY3JpcHRzID0gY29tbWFuZHMuZ2V0KCd3cmFwX2d1aScsIHt9KQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25zb2xlX3NjcmlwdHMgb3IgZ3VpX3NjcmlwdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfZGlyID0gcGF0aHMuZ2V0KCdzY3JpcHRzJywgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihzY3JpcHRfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdWYWxpZCBzY3JpcHQgcGF0aCBub3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlci50YXJnZXRfZGlyID0gc2NyaXB0X2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gY29uc29sZV9zY3JpcHRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gJyVzID0gJXMnICUgKGssIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gbWFrZXIubWFrZShzY3JpcHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGd1aV9zY3JpcHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7J2d1aSc6IFRydWUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGd1aV9zY3JpcHRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCA9ICclcyA9ICVzJyAlIChrLCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBtYWtlci5tYWtlKHNjcmlwdCwgb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKGxpYmRpciwgaW5mb19kaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IEluc3RhbGxlZERpc3RyaWJ1dGlvbihwKQoKICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIFNIQVJFRAogICAgICAgICAgICAgICAgICAgIHBhdGhzID0gZGljdChwYXRocykgICAgICMgZG9uJ3QgY2hhbmdlIHBhc3NlZCBpbiBkaWN0CiAgICAgICAgICAgICAgICAgICAgZGVsIHBhdGhzWydwdXJlbGliJ10KICAgICAgICAgICAgICAgICAgICBkZWwgcGF0aHNbJ3BsYXRsaWInXQogICAgICAgICAgICAgICAgICAgIHBhdGhzWydsaWInXSA9IGxpYmRpcgogICAgICAgICAgICAgICAgICAgIHAgPSBkaXN0LndyaXRlX3NoYXJlZF9sb2NhdGlvbnMocGF0aHMsIGRyeV9ydW4pCiAgICAgICAgICAgICAgICAgICAgaWYgcDoKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKHApCgogICAgICAgICAgICAgICAgICAgICMgV3JpdGUgUkVDT1JECiAgICAgICAgICAgICAgICAgICAgZGlzdC53cml0ZV9pbnN0YWxsZWRfZmlsZXMob3V0ZmlsZXMsIHBhdGhzWydwcmVmaXgnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuKQogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignaW5zdGFsbGF0aW9uIGZhaWxlZC4nKQogICAgICAgICAgICAgICAgZmlsZW9wLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHdvcmtkaXIpCgogICAgZGVmIF9nZXRfZHlsaWJfY2FjaGUoc2VsZik6CiAgICAgICAgZ2xvYmFsIGNhY2hlCiAgICAgICAgaWYgY2FjaGUgaXMgTm9uZToKICAgICAgICAgICAgIyBVc2UgbmF0aXZlIHN0cmluZyB0byBhdm9pZCBpc3N1ZXMgb24gMi54OiBzZWUgUHl0aG9uICMyMDE0MC4KICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihnZXRfY2FjaGVfYmFzZSgpLCBzdHIoJ2R5bGliLWNhY2hlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdKQogICAgICAgICAgICBjYWNoZSA9IENhY2hlKGJhc2UpCiAgICAgICAgcmV0dXJuIGNhY2hlCgogICAgZGVmIF9nZXRfZXh0ZW5zaW9ucyhzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIGFyY25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ0VYVEVOU0lPTlMnKQogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYmYpCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGpzb24ubG9hZCh3ZikKICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHNlbGYuX2dldF9keWxpYl9jYWNoZSgpCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY2FjaGUucHJlZml4X3RvX2RpcihwYXRobmFtZSkKICAgICAgICAgICAgICAgICAgICBjYWNoZV9iYXNlID0gb3MucGF0aC5qb2luKGNhY2hlLmJhc2UsIHByZWZpeCkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihjYWNoZV9iYXNlKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoY2FjaGVfYmFzZSkKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgcmVscGF0aCBpbiBleHRlbnNpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oY2FjaGVfYmFzZSwgY29udmVydF9wYXRoKHJlbHBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90aW1lID0gb3Muc3RhdChkZXN0KS5zdF9tdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChmaWxlX3RpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gemYuZ2V0aW5mbyhyZWxwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lKCppbmZvLmRhdGVfdGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgPSB3aGVlbF90aW1lID4gZmlsZV90aW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Zi5leHRyYWN0KHJlbHBhdGgsIGNhY2hlX2Jhc2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKG5hbWUsIGRlc3QpKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc19jb21wYXRpYmxlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSBpZiBhIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVubmluZyBzeXN0ZW0uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzX2NvbXBhdGlibGUoc2VsZikKCiAgICBkZWYgaXNfbW91bnRhYmxlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSBpZiBhIHdoZWVsIGlzIGFzc2VydGVkIGFzIG1vdW50YWJsZSBieSBpdHMgbWV0YWRhdGEuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUgIyBmb3Igbm93IC0gbWV0YWRhdGEgZGV0YWlscyBUQkQKCiAgICBkZWYgbW91bnQoc2VsZiwgYXBwZW5kPUZhbHNlKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKSkKICAgICAgICBpZiBub3Qgc2VsZi5pc19jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIG1zZyA9ICdXaGVlbCAlcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uLicgJSBwYXRobmFtZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKG1zZykKICAgICAgICBpZiBub3Qgc2VsZi5pc19tb3VudGFibGUoKToKICAgICAgICAgICAgbXNnID0gJ1doZWVsICVzIGlzIG1hcmtlZCBhcyBub3QgbW91bnRhYmxlLicgJSBwYXRobmFtZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKG1zZykKICAgICAgICBpZiBwYXRobmFtZSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBhbHJlYWR5IGluIHBhdGgnLCBwYXRobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBhcHBlbmQ6CiAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQocGF0aG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGF0aG5hbWUpCiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLl9nZXRfZXh0ZW5zaW9ucygpCiAgICAgICAgICAgIGlmIGV4dGVuc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBfaG9vayBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChfaG9vaykKICAgICAgICAgICAgICAgIF9ob29rLmFkZChwYXRobmFtZSwgZXh0ZW5zaW9ucykKCiAgICBkZWYgdW5tb3VudChzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKSkKICAgICAgICBpZiBwYXRobmFtZSBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgbm90IGluIHBhdGgnLCBwYXRobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUocGF0aG5hbWUpCiAgICAgICAgICAgIGlmIHBhdGhuYW1lIGluIF9ob29rLmltcHVyZV93aGVlbHM6CiAgICAgICAgICAgICAgICBfaG9vay5yZW1vdmUocGF0aG5hbWUpCiAgICAgICAgICAgIGlmIG5vdCBfaG9vay5pbXB1cmVfd2hlZWxzOgogICAgICAgICAgICAgICAgaWYgX2hvb2sgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzeXMubWV0YV9wYXRoLnJlbW92ZShfaG9vaykKCiAgICBkZWYgdmVyaWZ5KHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgZGF0YV9kaXIgPSAnJXMuZGF0YScgJSBuYW1lX3ZlcgogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgoKICAgICAgICBtZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsIE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgIHdoZWVsX21ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykKICAgICAgICByZWNvcmRfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykKCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB3aXRoIHpmLm9wZW4od2hlZWxfbWV0YWRhdGFfbmFtZSkgYXMgYndmOgogICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJ3ZikKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZmlsZSh3ZikKICAgICAgICAgICAgd3YgPSBtZXNzYWdlWydXaGVlbC1WZXJzaW9uJ10uc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSB0dXBsZShbaW50KGkpIGZvciBpIGluIHd2XSkKICAgICAgICAgICAgIyBUT0RPIHZlcnNpb24gdmVyaWZpY2F0aW9uCgogICAgICAgICAgICByZWNvcmRzID0ge30KICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHJlY29yZF9uYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1iZikgYXMgcmVhZGVyOgogICAgICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgICAgICAgICBwID0gcm93WzBdCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNbcF0gPSByb3cKCiAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyY25hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgaWYgJy4uJyBpbiB1X2FyY25hbWU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBlbnRyeSBpbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWw6ICVyJyAlIHVfYXJjbmFtZSkKCiAgICAgICAgICAgICAgICAjIFRoZSBzaWduYXR1cmUgZmlsZSB3b24ndCBiZSBpbiBSRUNPUkQsCiAgICAgICAgICAgICAgICAjIGFuZCB3ZSAgZG9uJ3QgY3VycmVudGx5IGRvbid0IGRvIGFueXRoaW5nIHdpdGggaXQKICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcm93ID0gcmVjb3Jkc1t1X2FyY25hbWVdCiAgICAgICAgICAgICAgICBpZiByb3dbMl0gYW5kIHN0cih6aW5mby5maWxlX3NpemUpICE9IHJvd1syXToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaXplIG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgaWYgcm93WzFdOgogICAgICAgICAgICAgICAgICAgIGtpbmQsIHZhbHVlID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICBfLCBkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0ICE9IHZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgYXJjbmFtZSkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIG1vZGlmaWVyLCBkZXN0X2Rpcj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoZSBjb250ZW50cyBvZiBhIHdoZWVsIGluIGEgZ2VuZXJpYyB3YXkuIFRoZSBtb2RpZmllciBzaG91bGQKICAgICAgICBiZSBhIGNhbGxhYmxlIHdoaWNoIGV4cGVjdHMgYSBkaWN0aW9uYXJ5IGFyZ3VtZW50OiBpdHMga2V5cyBhcmUKICAgICAgICBhcmNoaXZlLWVudHJ5IHBhdGhzLCBhbmQgaXRzIHZhbHVlcyBhcmUgYWJzb2x1dGUgZmlsZXN5c3RlbSBwYXRocwogICAgICAgIHdoZXJlIHRoZSBjb250ZW50cyB0aGUgY29ycmVzcG9uZGluZyBhcmNoaXZlIGVudHJpZXMgY2FuIGJlIGZvdW5kLiBUaGUKICAgICAgICBtb2RpZmllciBpcyBmcmVlIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIHBvaW50ZWQgdG8sIGFkZAogICAgICAgIG5ldyBlbnRyaWVzIGFuZCByZW1vdmUgZW50cmllcywgYmVmb3JlIHJldHVybmluZy4gVGhpcyBtZXRob2Qgd2lsbAogICAgICAgIGV4dHJhY3QgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgd2hlZWwgdG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24sIGNhbGwKICAgICAgICB0aGUgbW9kaWZpZXIsIGFuZCB0aGVuIHVzZSB0aGUgcGFzc2VkIChhbmQgcG9zc2libHkgdXBkYXRlZCkKICAgICAgICBkaWN0aW9uYXJ5IHRvIHdyaXRlIGEgbmV3IHdoZWVsLiBJZiBgYGRlc3RfZGlyYGAgaXMgc3BlY2lmaWVkLCB0aGUgbmV3CiAgICAgICAgd2hlZWwgaXMgd3JpdHRlbiB0aGVyZSAtLSBvdGhlcndpc2UsIHRoZSBvcmlnaW5hbCB3aGVlbCBpcyBvdmVyd3JpdHRlbi4KCiAgICAgICAgVGhlIG1vZGlmaWVyIHNob3VsZCByZXR1cm4gVHJ1ZSBpZiBpdCB1cGRhdGVkIHRoZSB3aGVlbCwgZWxzZSBGYWxzZS4KICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIHRoZSBtb2RpZmllciByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBkZWYgZ2V0X3ZlcnNpb24ocGF0aF9tYXAsIGluZm9fZGlyKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhdGggPSBOb25lCiAgICAgICAgICAgIGtleSA9ICclcy8lcycgJSAoaW5mb19kaXIsIE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgICAgICBpZiBrZXkgbm90IGluIHBhdGhfbWFwOgogICAgICAgICAgICAgICAga2V5ID0gJyVzL1BLRy1JTkZPJyAlIGluZm9fZGlyCiAgICAgICAgICAgIGlmIGtleSBpbiBwYXRoX21hcDoKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoX21hcFtrZXldCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gTWV0YWRhdGEocGF0aD1wYXRoKS52ZXJzaW9uCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLCBwYXRoCgogICAgICAgIGRlZiB1cGRhdGVfdmVyc2lvbih2ZXJzaW9uLCBwYXRoKToKICAgICAgICAgICAgdXBkYXRlZCA9IE5vbmUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdiA9IE5vcm1hbGl6ZWRWZXJzaW9uKHZlcnNpb24pCiAgICAgICAgICAgICAgICBpID0gdmVyc2lvbi5maW5kKCctJykKICAgICAgICAgICAgICAgIGlmIGkgPCAwOgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSAnJXMrMScgJSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gW2ludChzKSBmb3IgcyBpbiB2ZXJzaW9uW2kgKyAxOl0uc3BsaXQoJy4nKV0KICAgICAgICAgICAgICAgICAgICBwYXJ0c1stMV0gKz0gMQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSAnJXMrJXMnICUgKHZlcnNpb25bOmldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJy5qb2luKHN0cihpKSBmb3IgaSBpbiBwYXJ0cykpCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2Fubm90IHVwZGF0ZSBub24tY29tcGxpYW50IChQRVAtNDQwKSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gJXInLCB2ZXJzaW9uKQogICAgICAgICAgICBpZiB1cGRhdGVkOgogICAgICAgICAgICAgICAgbWQgPSBNZXRhZGF0YShwYXRoPXBhdGgpCiAgICAgICAgICAgICAgICBtZC52ZXJzaW9uID0gdXBkYXRlZAogICAgICAgICAgICAgICAgbGVnYWN5ID0gbm90IHBhdGguZW5kc3dpdGgoTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICAgICBtZC53cml0ZShwYXRoPXBhdGgsIGxlZ2FjeT1sZWdhY3kpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1ZlcnNpb24gdXBkYXRlZCBmcm9tICVyIHRvICVyJywgdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkKQoKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQogICAgICAgIHdpdGggdGVtcGRpcigpIGFzIHdvcmtkaXI6CiAgICAgICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgICAgIHBhdGhfbWFwID0ge30KICAgICAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGFyY25hbWUgPSB6aW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lID09IHJlY29yZF9uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmICcuLicgaW4gdV9hcmNuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIGVudHJ5IGluICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWw6ICVyJyAlIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgICAgICB6Zi5leHRyYWN0KHppbmZvLCB3b3JrZGlyKQogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4od29ya2RpciwgY29udmVydF9wYXRoKHVfYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgcGF0aF9tYXBbdV9hcmNuYW1lXSA9IHBhdGgKCiAgICAgICAgICAgICMgUmVtZW1iZXIgdGhlIHZlcnNpb24uCiAgICAgICAgICAgIG9yaWdpbmFsX3ZlcnNpb24sIF8gPSBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpCiAgICAgICAgICAgICMgRmlsZXMgZXh0cmFjdGVkLiBDYWxsIHRoZSBtb2RpZmllci4KICAgICAgICAgICAgbW9kaWZpZWQgPSBtb2RpZmllcihwYXRoX21hcCwgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIG1vZGlmaWVkOgogICAgICAgICAgICAgICAgIyBTb21ldGhpbmcgY2hhbmdlZCAtIG5lZWQgdG8gYnVpbGQgYSBuZXcgd2hlZWwuCiAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24sIHBhdGggPSBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpCiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3ZlcnNpb24gYW5kIChjdXJyZW50X3ZlcnNpb24gPT0gb3JpZ2luYWxfdmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgIyBBZGQgb3IgdXBkYXRlIGxvY2FsIHZlcnNpb24gdG8gc2lnbmlmeSBjaGFuZ2VzLgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV92ZXJzaW9uKGN1cnJlbnRfdmVyc2lvbiwgcGF0aCkKICAgICAgICAgICAgICAgICMgRGVjaWRlIHdoZXJlIHRoZSBuZXcgd2hlZWwgZ29lcy4KICAgICAgICAgICAgICAgIGlmIGRlc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZmQsIG5ld3BhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKHN1ZmZpeD0nLndobCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0nd2hlZWwtdXBkYXRlLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj13b3JrZGlyKQogICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkZXN0X2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIGRpcmVjdG9yeTogJXInICUgZGVzdF9kaXIpCiAgICAgICAgICAgICAgICAgICAgbmV3cGF0aCA9IG9zLnBhdGguam9pbihkZXN0X2Rpciwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMgPSBsaXN0KHBhdGhfbWFwLml0ZW1zKCkpCiAgICAgICAgICAgICAgICBkaXN0aW5mbyA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgIGluZm8gPSBkaXN0aW5mbywgaW5mb19kaXIKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfcmVjb3JkcyhpbmZvLCB3b3JrZGlyLCBhcmNoaXZlX3BhdGhzKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZF96aXAobmV3cGF0aCwgYXJjaGl2ZV9wYXRocykKICAgICAgICAgICAgICAgIGlmIGRlc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKG5ld3BhdGgsIHBhdGhuYW1lKQogICAgICAgIHJldHVybiBtb2RpZmllZAoKZGVmIGNvbXBhdGlibGVfdGFncygpOgogICAgIiIiCiAgICBSZXR1cm4gKHB5dmVyLCBhYmksIGFyY2gpIHR1cGxlcyBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uCiAgICAiIiIKICAgIHZlcnNpb25zID0gW1ZFUl9TVUZGSVhdCiAgICBtYWpvciA9IFZFUl9TVUZGSVhbMF0KICAgIGZvciBtaW5vciBpbiByYW5nZShzeXMudmVyc2lvbl9pbmZvWzFdIC0gMSwgLSAxLCAtMSk6CiAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4oW21ham9yLCBzdHIobWlub3IpXSkpCgogICAgYWJpcyA9IFtdCiAgICBmb3Igc3VmZml4LCBfLCBfIGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXguc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmlzLmFwcGVuZChzdWZmaXguc3BsaXQoJy4nLCAyKVsxXSkKICAgIGFiaXMuc29ydCgpCiAgICBpZiBBQkkgIT0gJ25vbmUnOgogICAgICAgIGFiaXMuaW5zZXJ0KDAsIEFCSSkKICAgIGFiaXMuYXBwZW5kKCdub25lJykKICAgIHJlc3VsdCA9IFtdCgogICAgYXJjaGVzID0gW0FSQ0hdCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgbSA9IHJlLm1hdGNoKCcoXHcrKV8oXGQrKV8oXGQrKV8oXHcrKSQnLCBBUkNIKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYXJjaCA9IG0uZ3JvdXBzKCkKICAgICAgICAgICAgbWlub3IgPSBpbnQobWlub3IpCiAgICAgICAgICAgIG1hdGNoZXMgPSBbYXJjaF0KICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAncHBjJyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0JykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ZhdDMnKQogICAgICAgICAgICBpZiBhcmNoIGluICgncHBjNjQnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0NjQnKQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdpbnRlbCcpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3g4Nl82NCcsICdpbnRlbCcsICdwcGMnLCAncHBjNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQogICAgICAgICAgICB3aGlsZSBtaW5vciA+PSAwOgogICAgICAgICAgICAgICAgZm9yIG1hdGNoIGluIG1hdGNoZXM6CiAgICAgICAgICAgICAgICAgICAgcyA9ICclc18lc18lc18lcycgJSAobmFtZSwgbWFqb3IsIG1pbm9yLCBtYXRjaCkKICAgICAgICAgICAgICAgICAgICBpZiBzICE9IEFSQ0g6ICAgIyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQocykKICAgICAgICAgICAgICAgIG1pbm9yIC09IDEKCiAgICAjIE1vc3Qgc3BlY2lmaWMgLSBvdXIgUHl0aG9uIHZlcnNpb24sIEFCSSBhbmQgYXJjaAogICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoSU1QX1BSRUZJWCwgdmVyc2lvbnNbMF0pKSwgYWJpLCBhcmNoKSkKCiAgICAjIHdoZXJlIG5vIEFCSSAvIGFyY2ggZGVwZW5kZW5jeSwgYnV0IElNUF9QUkVGSVggZGVwZW5kZW5jeQogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uKSksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoSU1QX1BSRUZJWCwgdmVyc2lvblswXSkpLCAnbm9uZScsICdhbnknKSkKCiAgICAjIG5vIElNUF9QUkVGSVgsIEFCSSBvciBhcmNoIGRlcGVuZGVuY3kKICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoJ3B5JywgdmVyc2lvbikpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKCdweScsIHZlcnNpb25bMF0pKSwgJ25vbmUnLCAnYW55JykpCiAgICByZXR1cm4gc2V0KHJlc3VsdCkKCgpDT01QQVRJQkxFX1RBR1MgPSBjb21wYXRpYmxlX3RhZ3MoKQoKZGVsIGNvbXBhdGlibGVfdGFncwoKCmRlZiBpc19jb21wYXRpYmxlKHdoZWVsLCB0YWdzPU5vbmUpOgogICAgaWYgbm90IGlzaW5zdGFuY2Uod2hlZWwsIFdoZWVsKToKICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsKSAgICAjIGFzc3VtZSBpdCdzIGEgZmlsZW5hbWUKICAgIHJlc3VsdCA9IEZhbHNlCiAgICBpZiB0YWdzIGlzIE5vbmU6CiAgICAgICAgdGFncyA9IENPTVBBVElCTEVfVEFHUwogICAgZm9yIHZlciwgYWJpLCBhcmNoIGluIHRhZ3M6CiAgICAgICAgaWYgdmVyIGluIHdoZWVsLnB5dmVyIGFuZCBhYmkgaW4gd2hlZWwuYWJpIGFuZCBhcmNoIGluIHdoZWVsLmFyY2g6CiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIHJldHVybiByZXN1bHQKUEsDBBQAAAAAAAAAIQCRwcCuzZUAAM2VAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3Ryby5weSMgQ29weXJpZ2h0IDIwMTUsMjAxNiBOaXIgQ29oZW4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIiIiClRoZSBgYGRpc3Ryb2BgIHBhY2thZ2UgKGBgZGlzdHJvYGAgc3RhbmRzIGZvciBMaW51eCBEaXN0cmlidXRpb24pIHByb3ZpZGVzCmluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXQgcnVucyBvbiwgc3VjaCBhcyBhIHJlbGlhYmxlCm1hY2hpbmUtcmVhZGFibGUgZGlzdHJvIElELCBvciB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKSXQgaXMgYSByZW5ld2VkIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24ncyBvcmlnaW5hbAo6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgYnV0IGl0IHByb3ZpZGVzIG11Y2ggbW9yZQpmdW5jdGlvbmFsaXR5LiBBbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgUHl0aG9uCjMuNSBkZXByZWNhdGVkIHRoaXMgZnVuY3Rpb24sIGFuZCBQeXRob24gMy43IGlzIGV4cGVjdGVkIHRvIHJlbW92ZSBpdAphbHRvZ2V0aGVyLiBJdHMgcHJlZGVjZXNzb3IgZnVuY3Rpb24gOnB5OmZ1bmM6YHBsYXRmb3JtLmRpc3RgIHdhcyBhbHJlYWR5CmRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNiBhbmQgaXMgYWxzbyBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjcuClN0aWxsLCB0aGVyZSBhcmUgbWFueSBjYXNlcyBpbiB3aGljaCBhY2Nlc3MgdG8gTGludXggZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uCmlzIG5lZWRlZC4gU2VlIGBQeXRob24gaXNzdWUgMTMyMiA8aHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMzIyPmBfIGZvcgptb3JlIGluZm9ybWF0aW9uLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQganNvbgppbXBvcnQgc2hsZXgKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN1YnByb2Nlc3MKCgppZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4Jyk6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVW5zdXBwb3J0ZWQgcGxhdGZvcm06IHswfScuZm9ybWF0KHN5cy5wbGF0Zm9ybSkpCgpfVU5JWENPTkZESVIgPSAnL2V0YycKX09TX1JFTEVBU0VfQkFTRU5BTUUgPSAnb3MtcmVsZWFzZScKCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgIklEIiBhdHRyaWJ1dGUgZGVmaW5lZCBpbiBvcy1yZWxlYXNlCiM6IGZpbGVzLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyBkZWZpbmVkIGluIHRoZSBvcy1yZWxlYXNlIGZpbGUsIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwKIzogICB3aXRoIGJsYW5rcyB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLgojOgojOiAqIFZhbHVlOiBOb3JtYWxpemVkIHZhbHVlLgpOT1JNQUxJWkVEX09TX0lEID0ge30KCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkKIzogdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIGZvciB1c2UgYnkgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIG1ldGhvZC4KIzoKIzogKiBLZXk6IFZhbHVlIGFzIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCB0cmFuc2xhdGVkIHRvIGxvd2VyCiM6ICAgY2FzZSwgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9MU0JfSUQgPSB7CiAgICAnZW50ZXJwcmlzZWVudGVycHJpc2UnOiAnb3JhY2xlJywgICMgT3JhY2xlIEVudGVycHJpc2UgTGludXgKICAgICdyZWRoYXRlbnRlcnByaXNld29ya3N0YXRpb24nOiAncmhlbCcsICAjIFJIRUwgNi43Cn0KCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgZGlzdHJvIElEIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBuYW1lCiM6IG9mIGRpc3RybyByZWxlYXNlIGZpbGVzLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbmFtZSBvZiBhIGRpc3RybyByZWxlYXNlIGZpbGUsCiM6ICAgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLCB3aXRoIGJsYW5rcyB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLgojOgojOiAqIFZhbHVlOiBOb3JtYWxpemVkIHZhbHVlLgpOT1JNQUxJWkVEX0RJU1RST19JRCA9IHsKICAgICdyZWRoYXQnOiAncmhlbCcsICAjIFJIRUwgNi54LCA3LngKfQoKIyBQYXR0ZXJuIGZvciBjb250ZW50IG9mIGRpc3RybyByZWxlYXNlIGZpbGUgKHJldmVyc2VkKQpfRElTVFJPX1JFTEVBU0VfQ09OVEVOVF9SRVZFUlNFRF9QQVRURVJOID0gcmUuY29tcGlsZSgKICAgIHInKD86W14pXSpcKSguKilcKCk/ICooPzpTVEwgKT8oW1xkLitcLWEtel0qXGQpICooPzplc2FlbGVyICopPyguKyknKQoKIyBQYXR0ZXJuIGZvciBiYXNlIGZpbGUgbmFtZSBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlCl9ESVNUUk9fUkVMRUFTRV9CQVNFTkFNRV9QQVRURVJOID0gcmUuY29tcGlsZSgKICAgIHInKFx3KylbLV9dKHJlbGVhc2V8dmVyc2lvbikkJykKCiMgQmFzZSBmaWxlIG5hbWVzIHRvIGJlIGlnbm9yZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGRpc3RybyByZWxlYXNlIGZpbGUKX0RJU1RST19SRUxFQVNFX0lHTk9SRV9CQVNFTkFNRVMgPSAoCiAgICAnZGViaWFuX3ZlcnNpb24nLAogICAgJ2xzYi1yZWxlYXNlJywKICAgICdvZW0tcmVsZWFzZScsCiAgICBfT1NfUkVMRUFTRV9CQVNFTkFNRSwKICAgICdzeXN0ZW0tcmVsZWFzZScKKQoKCmRlZiBsaW51eF9kaXN0cmlidXRpb24oZnVsbF9kaXN0cmlidXRpb25fbmFtZT1UcnVlKToKICAgICIiIgogICAgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiBhcyBhIHR1cGxlCiAgICBgYChpZF9uYW1lLCB2ZXJzaW9uLCBjb2RlbmFtZSlgYCB3aXRoIGl0ZW1zIGFzIGZvbGxvd3M6CgogICAgKiBgYGlkX25hbWVgYDogIElmICpmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lKiBpcyBmYWxzZSwgdGhlIHJlc3VsdCBvZgogICAgICA6ZnVuYzpgZGlzdHJvLmlkYC4gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubmFtZWAuCgogICAgKiBgYHZlcnNpb25gYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KCiAgICAqIGBgY29kZW5hbWVgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCgogICAgVGhlIGludGVyZmFjZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwKICAgIDpweTpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gIGZ1bmN0aW9uLCBzdXBwb3J0aW5nIGEgc3Vic2V0IG9mCiAgICBpdHMgcGFyYW1ldGVycy4KCiAgICBUaGUgZGF0YSBpdCByZXR1cm5zIG1heSBub3QgZXhhY3RseSBiZSB0aGUgc2FtZSwgYmVjYXVzZSBpdCB1c2VzIG1vcmUgZGF0YQogICAgc291cmNlcyB0aGFuIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwgYW5kIHRoYXQgbWF5IGxlYWQgdG8gZGlmZmVyZW50IGRhdGEgaWYKICAgIHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXMgbm90IGNvbnNpc3RlbnQgYWNyb3NzIG11bHRpcGxlIGRhdGEgc291cmNlcyBpdAogICAgcHJvdmlkZXMgKHRoZXJlIGFyZSBpbmRlZWQgc3VjaCBkaXN0cmlidXRpb25zIC4uLikuCgogICAgQW5vdGhlciByZWFzb24gZm9yIGRpZmZlcmVuY2VzIGlzIHRoZSBmYWN0IHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgCiAgICBtZXRob2Qgbm9ybWFsaXplcyB0aGUgZGlzdHJvIElEIHN0cmluZyB0byBhIHJlbGlhYmxlIG1hY2hpbmUtcmVhZGFibGUgdmFsdWUKICAgIGZvciBhIG51bWJlciBvZiBwb3B1bGFyIExpbnV4IGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbihmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lKQoKCmRlZiBpZCgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGRpc3RybyBJRCBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEKICAgIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5nLgoKICAgIEZvciBhIG51bWJlciBvZiBMaW51eCBkaXN0cmlidXRpb25zLCB0aGUgcmV0dXJuZWQgZGlzdHJvIElEIHZhbHVlIGlzCiAgICAqcmVsaWFibGUqLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBkb2N1bWVudGVkIGFuZCB0aGF0IGl0IGRvZXMgbm90IGNoYW5nZQogICAgYWNyb3NzIHJlbGVhc2VzIG9mIHRoZSBkaXN0cmlidXRpb24uCgogICAgVGhpcyBwYWNrYWdlIG1haW50YWlucyB0aGUgZm9sbG93aW5nIHJlbGlhYmxlIGRpc3RybyBJRCB2YWx1ZXM6CgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBEaXN0cm8gSUQgICAgICAgRGlzdHJpYnV0aW9uCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICJ1YnVudHUiICAgICAgICBVYnVudHUKICAgICJkZWJpYW4iICAgICAgICBEZWJpYW4KICAgICJyaGVsIiAgICAgICAgICBSZWRIYXQgRW50ZXJwcmlzZSBMaW51eAogICAgImNlbnRvcyIgICAgICAgIENlbnRPUwogICAgImZlZG9yYSIgICAgICAgIEZlZG9yYQogICAgInNsZXMiICAgICAgICAgIFNVU0UgTGludXggRW50ZXJwcmlzZSBTZXJ2ZXIKICAgICJvcGVuc3VzZSIgICAgICBvcGVuU1VTRQogICAgImFtYXpvbiIgICAgICAgIEFtYXpvbiBMaW51eAogICAgImFyY2giICAgICAgICAgIEFyY2ggTGludXgKICAgICJjbG91ZGxpbnV4IiAgICBDbG91ZExpbnV4IE9TCiAgICAiZXhoZXJibyIgICAgICAgRXhoZXJibyBMaW51eAogICAgImdlbnRvbyIgICAgICAgIEdlblRvbyBMaW51eAogICAgImlibV9wb3dlcmt2bSIgIElCTSBQb3dlcktWTQogICAgImt2bWlibSIgICAgICAgIEtWTSBmb3IgSUJNIHogU3lzdGVtcwogICAgImxpbnV4bWludCIgICAgIExpbnV4IE1pbnQKICAgICJtYWdlaWEiICAgICAgICBNYWdlaWEKICAgICJtYW5kcml2YSIgICAgICBNYW5kcml2YSBMaW51eAogICAgInBhcmFsbGVscyIgICAgIFBhcmFsbGVscwogICAgInBpZG9yYSIgICAgICAgIFBpZG9yYQogICAgInJhc3BiaWFuIiAgICAgIFJhc3BiaWFuCiAgICAib3JhY2xlIiAgICAgICAgT3JhY2xlIExpbnV4IChhbmQgT3JhY2xlIEVudGVycHJpc2UgTGludXgpCiAgICAic2NpZW50aWZpYyIgICAgU2NpZW50aWZpYyBMaW51eAogICAgInNsYWNrd2FyZSIgICAgIFNsYWNrd2FyZQogICAgInhlbnNlcnZlciIgICAgIFhlblNlcnZlcgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgSWYgeW91IGhhdmUgYSBuZWVkIHRvIGdldCBkaXN0cm9zIGZvciByZWxpYWJsZSBJRHMgYWRkZWQgaW50byB0aGlzIHNldCwKICAgIG9yIGlmIHlvdSBmaW5kIHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIGZ1bmN0aW9uIHJldHVybnMgYSBkaWZmZXJlbnQKICAgIGRpc3RybyBJRCBmb3Igb25lIG9mIHRoZSBsaXN0ZWQgZGlzdHJvcywgcGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBpbiB0aGUKICAgIGBkaXN0cm8gaXNzdWUgdHJhY2tlcmBfLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeSBhbmQgdHJhbnNmb3JtYXRpb25zOioqCgogICAgRmlyc3QsIHRoZSBJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZAogICAgb3JkZXIuIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCgogICAgVGhlIHNvIGRldGVybWluZWQgSUQgdmFsdWUgdGhlbiBwYXNzZXMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMsCiAgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q6CgogICAgKiBpdCBpcyB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCgogICAgKiBibGFua3MgKHdoaWNoIHNob3VsZCBub3QgYmUgdGhlcmUgYW55d2F5KSBhcmUgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3JlcywKCiAgICAqIGEgbm9ybWFsaXphdGlvbiBvZiB0aGUgSUQgaXMgcGVyZm9ybWVkLCBiYXNlZCB1cG9uCiAgICAgIGBub3JtYWxpemF0aW9uIHRhYmxlc2BfLiBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gZW5zdXJlCiAgICAgIHRoYXQgdGhlIElEIGlzIGFzIHJlbGlhYmxlIGFzIHBvc3NpYmxlLCBldmVuIGFjcm9zcyBpbmNvbXBhdGlibGUgY2hhbmdlcwogICAgICBpbiB0aGUgTGludXggZGlzdHJpYnV0aW9ucy4gQSBjb21tb24gcmVhc29uIGZvciBhbiBpbmNvbXBhdGlibGUgY2hhbmdlIGlzCiAgICAgIHRoZSBhZGRpdGlvbiBvZiBhbiBvcy1yZWxlYXNlIGZpbGUsIG9yIHRoZSBhZGRpdGlvbiBvZiB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwgd2l0aCBJRCB2YWx1ZXMgdGhhdCBkaWZmZXIgZnJvbSB3aGF0IHdhcyBwcmV2aW91c2x5IGRldGVybWluZWQKICAgICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBuYW1lLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5pZCgpCgoKZGVmIG5hbWUocHJldHR5PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBodW1hbi1yZWFkYWJsZQogICAgc3RyaW5nLgoKICAgIElmICpwcmV0dHkqIGlzIGZhbHNlLCB0aGUgbmFtZSBpcyByZXR1cm5lZCB3aXRob3V0IHZlcnNpb24gb3IgY29kZW5hbWUuCiAgICAoZS5nLiAiQ2VudE9TIExpbnV4IikKCiAgICBJZiAqcHJldHR5KiBpcyB0cnVlLCB0aGUgdmVyc2lvbiBhbmQgY29kZW5hbWUgYXJlIGFwcGVuZGVkLgogICAgKGUuZy4gIkNlbnRPUyBMaW51eCA3LjEuMTUwMyAoQ29yZSkiKQoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIFRoZSBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgogICAgVGhlIGZpcnN0IGF2YWlsYWJsZSBhbmQgbm9uLWVtcHR5IHZhbHVlIGlzIHVzZWQ6CgogICAgKiBJZiAqcHJldHR5KiBpcyBmYWxzZToKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiTkFNRSIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgICAgY29tbWFuZCwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiPG5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAqIElmICpwcmV0dHkqIGlzIHRydWU6CgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIlBSRVRUWV9OQU1FIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiRGVzY3JpcHRpb24iIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgICBjb21tYW5kLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICI8bmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLCBhcHBlbmRlZAogICAgICAgIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwcmV0dHkgdmVyc2lvbiAoIjx2ZXJzaW9uX2lkPiIgYW5kICI8Y29kZW5hbWU+IgogICAgICAgIGZpZWxkcykgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsIGlmIGF2YWlsYWJsZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubmFtZShwcmV0dHkpCgoKZGVmIHZlcnNpb24ocHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBodW1hbi1yZWFkYWJsZQogICAgc3RyaW5nLgoKICAgIElmICpwcmV0dHkqIGlzIGZhbHNlLCB0aGUgdmVyc2lvbiBpcyByZXR1cm5lZCB3aXRob3V0IGNvZGVuYW1lIChlLmcuCiAgICAiNy4wIikuCgogICAgSWYgKnByZXR0eSogaXMgdHJ1ZSwgdGhlIGNvZGVuYW1lIGluIHBhcmVudGhlc2lzIGlzIGFwcGVuZGVkLCBpZiB0aGUKICAgIGNvZGVuYW1lIGlzIG5vbi1lbXB0eSAoZS5nLiAiNy4wIChNYWlwbykiKS4KCiAgICBTb21lIGRpc3RyaWJ1dGlvbnMgcHJvdmlkZSB2ZXJzaW9uIG51bWJlcnMgd2l0aCBkaWZmZXJlbnQgcHJlY2lzaW9ucyBpbgogICAgdGhlIGRpZmZlcmVudCBzb3VyY2VzIG9mIGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbi4gRXhhbWluaW5nIHRoZSBkaWZmZXJlbnQKICAgIHNvdXJjZXMgaW4gYSBmaXhlZCBwcmlvcml0eSBvcmRlciBkb2VzIG5vdCBhbHdheXMgeWllbGQgdGhlIG1vc3QgcHJlY2lzZQogICAgdmVyc2lvbiAoZS5nLiBmb3IgRGViaWFuIDguMiwgb3IgQ2VudE9TIDcuMSkuCgogICAgVGhlICpiZXN0KiBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgYXBwcm9hY2ggZm9yIHRoZSByZXR1cm5lZAogICAgdmVyc2lvbjoKCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoZSBmaXJzdCBub24tZW1wdHkgdmVyc2lvbiBudW1iZXIgaW4gcHJpb3JpdHkgb3JkZXIgb2YKICAgIHRoZSBleGFtaW5lZCBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgIElmICpiZXN0KiBpcyB0cnVlLCB0aGUgbW9zdCBwcmVjaXNlIHZlcnNpb24gbnVtYmVyIG91dCBvZiBhbGwgZXhhbWluZWQKICAgIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgSW4gYWxsIGNhc2VzLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMuCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoaXMgb3JkZXIgcmVwcmVzZW50cyB0aGUgcHJpb3JpdHkgb3JkZXI6CgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJWRVJTSU9OX0lEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiUmVsZWFzZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICI8dmVyc2lvbl9pZD4iIGZpZWxkIG9mIHRoZSBmaXJzdCBsaW5lCiAgICAgIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJQUkVUVFlfTkFNRSIgYXR0cmlidXRlIG9mIHRoZQogICAgICBvcy1yZWxlYXNlIGZpbGUsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZXMuCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIkRlc2NyaXB0aW9uIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkKICAgICAgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UKICAgICAgZmlsZXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLnZlcnNpb24ocHJldHR5LCBiZXN0KQoKCmRlZiB2ZXJzaW9uX3BhcnRzKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLnZlcnNpb25fcGFydHMoYmVzdCkKCgpkZWYgbWFqb3JfdmVyc2lvbihiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIG1ham9yIHZlcnNpb24gaXMgdGhlIGZpcnN0CiAgICBwYXJ0IG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubWFqb3JfdmVyc2lvbihiZXN0KQoKCmRlZiBtaW5vcl92ZXJzaW9uKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgbWlub3IgdmVyc2lvbiBpcyB0aGUgc2Vjb25kCiAgICBwYXJ0IG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubWlub3JfdmVyc2lvbihiZXN0KQoKCmRlZiBidWlsZF9udW1iZXIoYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYnVpbGQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIGJ1aWxkIG51bWJlciBpcyB0aGUgdGhpcmQgcGFydAogICAgb2YgdGhlIGRvdC1zZXBhcmF0ZWQgdmVyc2lvbiBzdHJpbmcuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5idWlsZF9udW1iZXIoYmVzdCkKCgpkZWYgbGlrZSgpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXN0cm8gSURzIG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUKICAgIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gaW4gcmVnYXJkcyB0byBwYWNrYWdpbmcKICAgIGFuZCBwcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBmb3IgZXhhbXBsZSBkaXN0cmlidXRpb25zIHRoZSBjdXJyZW50CiAgICBkaXN0cmlidXRpb24gaXMgYSBkZXJpdmF0aXZlIGZyb20uCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgVGhpcyBpbmZvcm1hdGlvbiBpdGVtIGlzIG9ubHkgcHJvdmlkZWQgYnkgdGhlIG9zLXJlbGVhc2UgZmlsZS4KICAgIEZvciBkZXRhaWxzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAiSURfTElLRSIgYXR0cmlidXRlIGluIHRoZQogICAgYG9zLXJlbGVhc2UgbWFuIHBhZ2UKICAgIDxodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi9vcy1yZWxlYXNlLmh0bWw+YF8uCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxpa2UoKQoKCmRlZiBjb2RlbmFtZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGNvZGVuYW1lIGZvciB0aGUgcmVsZWFzZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sCiAgICBhcyBhIHN0cmluZy4KCiAgICBJZiB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGhhdmUgYSBjb2RlbmFtZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgY29kZW5hbWUgaXMgbm90IGFsd2F5cyByZWFsbHkgYSBjb2RlbmFtZS4gRm9yCiAgICBleGFtcGxlLCBvcGVuU1VTRSByZXR1cm5zICJ4ODZfNjQiLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBzdWNoCiAgICBjYXNlcyBpbiBhbnkgc3BlY2lhbCB3YXkgYW5kIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIGl0IGZpbmRzLCBpZiBhbnkuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgKiB0aGUgY29kZW5hbWUgd2l0aGluIHRoZSAiVkVSU0lPTiIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsIGlmCiAgICAgIHByb3ZpZGVkLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiQ29kZW5hbWUiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIjxjb2RlbmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5jb2RlbmFtZSgpCgoKZGVmIGluZm8ocHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGNlcnRhaW4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBpdGVtcyBhYm91dCB0aGUgY3VycmVudCBMaW51eAogICAgZGlzdHJpYnV0aW9uIGluIGEgZGljdGlvbmFyeSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgoKICAgIC4uIHNvdXJjZWNvZGU6OiBweXRob24KCiAgICAgICAgewogICAgICAgICAgICAnaWQnOiAncmhlbCcsCiAgICAgICAgICAgICd2ZXJzaW9uJzogJzcuMCcsCiAgICAgICAgICAgICd2ZXJzaW9uX3BhcnRzJzogewogICAgICAgICAgICAgICAgJ21ham9yJzogJzcnLAogICAgICAgICAgICAgICAgJ21pbm9yJzogJzAnLAogICAgICAgICAgICAgICAgJ2J1aWxkX251bWJlcic6ICcnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdsaWtlJzogJ2ZlZG9yYScsCiAgICAgICAgICAgICdjb2RlbmFtZSc6ICdNYWlwbycKICAgICAgICB9CgogICAgVGhlIGRpY3Rpb25hcnkgc3RydWN0dXJlIGFuZCBrZXlzIGFyZSBhbHdheXMgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gKICAgIGluZm9ybWF0aW9uIGl0ZW1zIGFyZSBhdmFpbGFibGUgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2VzLiBUaGUgdmFsdWVzCiAgICBmb3IgdGhlIHZhcmlvdXMga2V5cyBhcmUgYXMgZm9sbG93czoKCiAgICAqIGBgaWRgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5pZGAuCgogICAgKiBgYHZlcnNpb25gYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBtYWpvcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1pbm9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KCiAgICAqIGBgbGlrZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmxpa2VgLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKnByZXR0eSogYW5kICpiZXN0KiBwYXJhbWV0ZXJzLCBzZWUgdGhlCiAgICA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uaW5mbyhwcmV0dHksIGJlc3QpCgoKZGVmIG9zX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgU2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ub3NfcmVsZWFzZV9pbmZvKCkKCgpkZWYgbHNiX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxzYl9yZWxlYXNlX2luZm8oKQoKCmRlZiBkaXN0cm9fcmVsZWFzZV9pbmZvKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgU2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm8oKQoKCmRlZiBvc19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlCiAgICBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm9zX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKZGVmIGxzYl9yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXQKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uCiAgICBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubHNiX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKZGVmIGRpc3Ryb19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZQogICAgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uZGlzdHJvX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKY2xhc3MgTGludXhEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIgogICAgUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgVGhpcyBwYWNrYWdlIGNyZWF0ZXMgYSBwcml2YXRlIG1vZHVsZS1nbG9iYWwgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoCiAgICBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cywgdGhhdCBpcyB1c2VkIGJ5IHRoZQogICAgYGNvbnNvbGlkYXRlZCBhY2Nlc3NvciBmdW5jdGlvbnNgXyBhbmQgYHNpbmdsZSBzb3VyY2UgYWNjZXNzb3IgZnVuY3Rpb25zYF8uCiAgICBCeSB1c2luZyBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cywgdGhhdCBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlCiAgICByZXR1cm5zIGRhdGEgYWJvdXQgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIChpLmUuIHRoZSBkaXN0cm8gdGhpcwogICAgcGFja2FnZSBydW5zIG9uKS4KCiAgICBOb3JtYWxseSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KICAgIEhvd2V2ZXIsIGluIHNpdHVhdGlvbnMgd2hlcmUgY29udHJvbCBpcyBuZWVkZWQgb3ZlciB0aGUgZXhhY3QgZGF0YSBzb3VyY2VzCiAgICB0aGF0IGFyZSB1c2VkLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc3BlY2lmaWMKICAgIGRpc3RybyByZWxlYXNlIGZpbGUsIG9yIGEgc3BlY2lmaWMgb3MtcmVsZWFzZSBmaWxlLCBvciB3aXRob3V0IGludm9raW5nIHRoZQogICAgbHNiX3JlbGVhc2UgY29tbWFuZC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGluY2x1ZGVfbHNiPVRydWUsCiAgICAgICAgICAgICAgICAgb3NfcmVsZWFzZV9maWxlPScnLAogICAgICAgICAgICAgICAgIGRpc3Ryb19yZWxlYXNlX2ZpbGU9JycpOgogICAgICAgICIiIgogICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBtZXRob2Qgb2YgdGhpcyBjbGFzcyBnYXRoZXJzIGluZm9ybWF0aW9uIGZyb20gdGhlCiAgICAgICAgYXZhaWxhYmxlIGRhdGEgc291cmNlcywgYW5kIHN0b3JlcyB0aGF0IGluIHByaXZhdGUgaW5zdGFuY2UgYXR0cmlidXRlcy4KICAgICAgICBTdWJzZXF1ZW50IGFjY2VzcyB0byB0aGUgaW5mb3JtYXRpb24gaXRlbXMgdXNlcyB0aGVzZSBwcml2YXRlIGluc3RhbmNlCiAgICAgICAgYXR0cmlidXRlcywgc28gdGhhdCB0aGUgZGF0YSBzb3VyY2VzIGFyZSByZWFkIG9ubHkgb25jZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBgYGluY2x1ZGVfbHNiYGAgKGJvb2wpOiBDb250cm9scyB3aGV0aGVyIHRoZQogICAgICAgICAgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gaXMgaW5jbHVkZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBJZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXRoIG5hbWUgdG8KICAgICAgICAgIGJlIHVzZWQgKHNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIG9zLXJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlCiAgICAgICAgICBkYXRhIHNvdXJjZSBmb3IgdGhlIG9zLXJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIGEgZGVmYXVsdCBzZWFyY2ggYWxnb3JpdGhtCiAgICAgICAgICB0byBiZSB1c2VkIChzZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBpZiBubyBkZWZhdWx0CiAgICAgICAgICBkaXN0cm8gcmVsZWFzZSBmaWxlIGNhbiBiZSBmb3VuZCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgUHVibGljIGluc3RhbmNlIGF0dHJpYnV0ZXM6CgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgUmFpc2VzOgoKICAgICAgICAqIDpweTpleGM6YElPRXJyb3JgOiBTb21lIEkvTyBpc3N1ZSB3aXRoIGFuIG9zLXJlbGVhc2UgZmlsZSBvciBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgKiA6cHk6ZXhjOmBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcmA6IFRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGhhZAogICAgICAgICAgc29tZSBpc3N1ZSAob3RoZXIgdGhhbiBub3QgYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCkuCgogICAgICAgICogOnB5OmV4YzpgVW5pY29kZUVycm9yYDogQSBkYXRhIHNvdXJjZSBoYXMgdW5leHBlY3RlZCBjaGFyYWN0ZXJzIG9yCiAgICAgICAgICB1c2VzIGFuIHVuZXhwZWN0ZWQgZW5jb2RpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5vc19yZWxlYXNlX2ZpbGUgPSBvc19yZWxlYXNlX2ZpbGUgb3IgXAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oX1VOSVhDT05GRElSLCBfT1NfUkVMRUFTRV9CQVNFTkFNRSkKICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUgPSBkaXN0cm9fcmVsZWFzZV9maWxlIG9yICcnICAjIHVwZGF0ZWQgbGF0ZXIKICAgICAgICBzZWxmLl9vc19yZWxlYXNlX2luZm8gPSBzZWxmLl9nZXRfb3NfcmVsZWFzZV9pbmZvKCkKICAgICAgICBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X2xzYl9yZWxlYXNlX2luZm8oKSBcCiAgICAgICAgICAgIGlmIGluY2x1ZGVfbHNiIGVsc2Uge30KICAgICAgICBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X2Rpc3Ryb19yZWxlYXNlX2luZm8oKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gcmVwciBvZiBhbGwgaW5mbwogICAgICAgICIiIgogICAgICAgIHJldHVybiBcCiAgICAgICAgICAgICJMaW51eERpc3RyaWJ1dGlvbigiIFwKICAgICAgICAgICAgIm9zX3JlbGVhc2VfZmlsZT17MCFyfSwgIiBcCiAgICAgICAgICAgICJkaXN0cm9fcmVsZWFzZV9maWxlPXsxIXJ9LCAiIFwKICAgICAgICAgICAgIl9vc19yZWxlYXNlX2luZm89ezIhcn0sICIgXAogICAgICAgICAgICAiX2xzYl9yZWxlYXNlX2luZm89ezMhcn0sICIgXAogICAgICAgICAgICAiX2Rpc3Ryb19yZWxlYXNlX2luZm89ezQhcn0pIi5mb3JtYXQoCiAgICAgICAgICAgICAgICBzZWxmLm9zX3JlbGVhc2VfZmlsZSwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSwKICAgICAgICAgICAgICAgIHNlbGYuX29zX3JlbGVhc2VfaW5mbywKICAgICAgICAgICAgICAgIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8sCiAgICAgICAgICAgICAgICBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvKQoKICAgIGRlZiBsaW51eF9kaXN0cmlidXRpb24oc2VsZiwgZnVsbF9kaXN0cmlidXRpb25fbmFtZT1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiB0aGF0IGlzIGNvbXBhdGlibGUKICAgICAgICB3aXRoIFB5dGhvbidzIDpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gLCBzdXBwb3J0aW5nIGEgc3Vic2V0CiAgICAgICAgb2YgaXRzIHBhcmFtZXRlcnMuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5saW51eF9kaXN0cmlidXRpb25gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYubmFtZSgpIGlmIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWUgZWxzZSBzZWxmLmlkKCksCiAgICAgICAgICAgIHNlbGYudmVyc2lvbigpLAogICAgICAgICAgICBzZWxmLmNvZGVuYW1lKCkKICAgICAgICApCgogICAgZGVmIGlkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgZGlzdHJvIElEIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uaWRgLgogICAgICAgICIiIgogICAgICAgIGRlZiBub3JtYWxpemUoZGlzdHJvX2lkLCB0YWJsZSk6CiAgICAgICAgICAgIGRpc3Ryb19pZCA9IGRpc3Ryb19pZC5sb3dlcigpLnJlcGxhY2UoJyAnLCAnXycpCiAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoZGlzdHJvX2lkLCBkaXN0cm9faWQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYub3NfcmVsZWFzZV9hdHRyKCdpZCcpCiAgICAgICAgaWYgZGlzdHJvX2lkOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGRpc3Ryb19pZCwgTk9STUFMSVpFRF9PU19JRCkKCiAgICAgICAgZGlzdHJvX2lkID0gc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkaXN0cmlidXRvcl9pZCcpCiAgICAgICAgaWYgZGlzdHJvX2lkOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGRpc3Ryb19pZCwgTk9STUFMSVpFRF9MU0JfSUQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfRElTVFJPX0lEKQoKICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgbmFtZShzZWxmLCBwcmV0dHk9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm5hbWVgLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cignbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkaXN0cmlidXRvcl9pZCcpIFwKICAgICAgICAgICAgb3Igc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCduYW1lJykKICAgICAgICBpZiBwcmV0dHk6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cigncHJldHR5X25hbWUnKSBcCiAgICAgICAgICAgICAgICBvciBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rlc2NyaXB0aW9uJykKICAgICAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCduYW1lJykKICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24ocHJldHR5PVRydWUpCiAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgJyAnICsgdmVyc2lvbgogICAgICAgIHJldHVybiBuYW1lIG9yICcnCgogICAgZGVmIHZlcnNpb24oc2VsZiwgcHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9ucyA9IFsKICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ZlcnNpb25faWQnKSwKICAgICAgICAgICAgc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdyZWxlYXNlJyksCiAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cigndmVyc2lvbl9pZCcpLAogICAgICAgICAgICBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KAogICAgICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ByZXR0eV9uYW1lJykpLmdldCgndmVyc2lvbl9pZCcsICcnKSwKICAgICAgICAgICAgc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudCgKICAgICAgICAgICAgICAgIHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGVzY3JpcHRpb24nKSkuZ2V0KCd2ZXJzaW9uX2lkJywgJycpCiAgICAgICAgXQogICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgIGlmIGJlc3Q6CiAgICAgICAgICAgICMgVGhpcyBhbGdvcml0aG0gdXNlcyB0aGUgbGFzdCB2ZXJzaW9uIGluIHByaW9yaXR5IG9yZGVyIHRoYXQgaGFzCiAgICAgICAgICAgICMgdGhlIGJlc3QgcHJlY2lzaW9uLiBJZiB0aGUgdmVyc2lvbnMgYXJlIG5vdCBpbiBjb25mbGljdCwgdGhhdAogICAgICAgICAgICAjIGRvZXMgbm90IG1hdHRlcjsgb3RoZXJ3aXNlLCB1c2luZyB0aGUgbGFzdCBvbmUgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIyBmaXJzdCBvbmUgbWlnaHQgYmUgY29uc2lkZXJlZCBhIHN1cnByaXNlLgogICAgICAgICAgICBmb3IgdiBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgICAgIGlmIHYuY291bnQoIi4iKSA+IHZlcnNpb24uY291bnQoIi4iKSBvciB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHYgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgICAgICBpZiB2ICE9ICcnOgogICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBwcmV0dHkgYW5kIHZlcnNpb24gYW5kIHNlbGYuY29kZW5hbWUoKToKICAgICAgICAgICAgdmVyc2lvbiA9IHUnezB9ICh7MX0pJy5mb3JtYXQodmVyc2lvbiwgc2VsZi5jb2RlbmFtZSgpKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIHZlcnNpb25fcGFydHMoc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgdHVwbGUgb2YgdmVyc2lvbgogICAgICAgIG51bWJlcnMuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uX3BhcnRzYC4KICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9uX3N0ciA9IHNlbGYudmVyc2lvbihiZXN0PWJlc3QpCiAgICAgICAgaWYgdmVyc2lvbl9zdHI6CiAgICAgICAgICAgIHZlcnNpb25fcmVnZXggPSByZS5jb21waWxlKHInKFxkKylcLj8oXGQrKT9cLj8oXGQrKT8nKQogICAgICAgICAgICBtYXRjaGVzID0gdmVyc2lvbl9yZWdleC5tYXRjaCh2ZXJzaW9uX3N0cikKICAgICAgICAgICAgaWYgbWF0Y2hlczoKICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyID0gbWF0Y2hlcy5ncm91cHMoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1ham9yLCBtaW5vciBvciAnJywgYnVpbGRfbnVtYmVyIG9yICcnCiAgICAgICAgcmV0dXJuICcnLCAnJywgJycKCiAgICBkZWYgbWFqb3JfdmVyc2lvbihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fcGFydHMoYmVzdClbMF0KCiAgICBkZWYgbWlub3JfdmVyc2lvbihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzFdCgogICAgZGVmIGJ1aWxkX251bWJlcihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGJ1aWxkIG51bWJlciBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzJdCgogICAgZGVmIGxpa2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBJRHMgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBsaWtlIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5saWtlYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ2lkX2xpa2UnKSBvciAnJwoKICAgIGRlZiBjb2RlbmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGNvZGVuYW1lIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3IgJycKCiAgICBkZWYgaW5mbyhzZWxmLCBwcmV0dHk9RmFsc2UsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBjZXJ0YWluIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4CiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGRpY3QoCiAgICAgICAgICAgIGlkPXNlbGYuaWQoKSwKICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24ocHJldHR5LCBiZXN0KSwKICAgICAgICAgICAgdmVyc2lvbl9wYXJ0cz1kaWN0KAogICAgICAgICAgICAgICAgbWFqb3I9c2VsZi5tYWpvcl92ZXJzaW9uKGJlc3QpLAogICAgICAgICAgICAgICAgbWlub3I9c2VsZi5taW5vcl92ZXJzaW9uKGJlc3QpLAogICAgICAgICAgICAgICAgYnVpbGRfbnVtYmVyPXNlbGYuYnVpbGRfbnVtYmVyKGJlc3QpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxpa2U9c2VsZi5saWtlKCksCiAgICAgICAgICAgIGNvZGVuYW1lPXNlbGYuY29kZW5hbWUoKSwKICAgICAgICApCgogICAgZGVmIG9zX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm9zX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX29zX3JlbGVhc2VfaW5mbwoKICAgIGRlZiBsc2JfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4CiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8KCiAgICBkZWYgZGlzdHJvX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvCgogICAgZGVmIG9zX3JlbGVhc2VfYXR0cihzZWxmLCBhdHRyaWJ1dGUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhCiAgICAgICAgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5vc19yZWxlYXNlX2F0dHJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9vc19yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIGxzYl9yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kCiAgICAgICAgb3V0cHV0IGRhdGEgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5sc2JfcmVsZWFzZV9hdHRyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fbHNiX3JlbGVhc2VfaW5mby5nZXQoYXR0cmlidXRlLCAnJykKCiAgICBkZWYgZGlzdHJvX3JlbGVhc2VfYXR0cihzZWxmLCBhdHRyaWJ1dGUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUKICAgICAgICBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uZGlzdHJvX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIF9nZXRfb3NfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIG9zLXJlbGVhc2UgZmlsZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYub3NfcmVsZWFzZV9maWxlKToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYub3NfcmVsZWFzZV9maWxlKSBhcyByZWxlYXNlX2ZpbGU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2Vfb3NfcmVsZWFzZV9jb250ZW50KHJlbGVhc2VfZmlsZSkKICAgICAgICByZXR1cm4ge30KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX29zX3JlbGVhc2VfY29udGVudChsaW5lcyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgdGhlIGxpbmVzIG9mIGFuIG9zLXJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBsaW5lczogSXRlcmFibGUgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIG9zLXJlbGVhc2UgZmlsZS4KICAgICAgICAgICAgICAgICBFYWNoIGxpbmUgbXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlCiAgICAgICAgICAgICAgICAgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgcHJvcHMgPSB7fQogICAgICAgIGxleGVyID0gc2hsZXguc2hsZXgobGluZXMsIHBvc2l4PVRydWUpCiAgICAgICAgbGV4ZXIud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKCiAgICAgICAgIyBUaGUgc2hsZXggbW9kdWxlIGRlZmluZXMgaXRzIGB3b3JkY2hhcnNgIHZhcmlhYmxlIHVzaW5nIGxpdGVyYWxzLAogICAgICAgICMgbWFraW5nIGl0IGRlcGVuZGVudCBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIFB5dGhvbiBzb3VyY2UgZmlsZS4KICAgICAgICAjIEluIFB5dGhvbiAyLjYgYW5kIDIuNywgdGhlIHNobGV4IHNvdXJjZSBmaWxlIGlzIGVuY29kZWQgaW4KICAgICAgICAjICdpc28tODg1OS0xJywgYW5kIHRoZSBgd29yZGNoYXJzYCB2YXJpYWJsZSBpcyBkZWZpbmVkIGFzIGEgYnl0ZQogICAgICAgICMgc3RyaW5nLiBUaGlzIGNhdXNlcyBhIFVuaWNvZGVEZWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiB0aGUKICAgICAgICAjIHBhcnNlZCBjb250ZW50IGlzIGEgdW5pY29kZSBvYmplY3QuIFRoZSBmb2xsb3dpbmcgZml4IHJlc29sdmVzIHRoYXQKICAgICAgICAjICguLi4gYnV0IGl0IHNob3VsZCBiZSBmaXhlZCBpbiBzaGxleC4uLik6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBpc2luc3RhbmNlKGxleGVyLndvcmRjaGFycywgYnl0ZXMpOgogICAgICAgICAgICBsZXhlci53b3JkY2hhcnMgPSBsZXhlci53b3JkY2hhcnMuZGVjb2RlKCdpc28tODg1OS0xJykKCiAgICAgICAgdG9rZW5zID0gbGlzdChsZXhlcikKICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIGFsbCBzaGVsbC1saWtlIHBhcnNpbmcgaGFzIGJlZW4gZG9uZSAoaS5lLgogICAgICAgICAgICAjIGNvbW1lbnRzIHByb2Nlc3NlZCwgcXVvdGVzIGFuZCBiYWNrc2xhc2ggZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICAjIHByb2Nlc3NlZCwgbXVsdGktbGluZSB2YWx1ZXMgYXNzZW1ibGVkLCB0cmFpbGluZyBuZXdsaW5lcwogICAgICAgICAgICAjIHN0cmlwcGVkLCBldGMuKSwgc28gdGhlIHRva2VucyBhcmUgbm93IGVpdGhlcjoKICAgICAgICAgICAgIyAqIHZhcmlhYmxlIGFzc2lnbm1lbnRzOiB2YXI9dmFsdWUKICAgICAgICAgICAgIyAqIGNvbW1hbmRzIG9yIHRoZWlyIGFyZ3VtZW50cyAobm90IGFsbG93ZWQgaW4gb3MtcmVsZWFzZSkKICAgICAgICAgICAgaWYgJz0nIGluIHRva2VuOgogICAgICAgICAgICAgICAgaywgdiA9IHRva2VuLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgYnl0ZXMpOgogICAgICAgICAgICAgICAgICAgIHYgPSB2LmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgcHJvcHNbay5sb3dlcigpXSA9IHYKICAgICAgICAgICAgICAgIGlmIGsgPT0gJ1ZFUlNJT04nOgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBoYW5kbGVzIGNhc2VzIGluIHdoaWNoIHRoZSBjb2RlbmFtZSBpcyBpbgogICAgICAgICAgICAgICAgICAgICMgdGhlIGAoQ09ERU5BTUUpYCAocmhlbCwgY2VudG9zLCBmZWRvcmEpIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICMgb3IgaW4gdGhlIGAsIENPREVOQU1FYCBmb3JtYXQgKFVidW50dSkuCiAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSByZS5zZWFyY2gocicoXChcRCtcKSl8LChccyspP1xEKycsIHYpCiAgICAgICAgICAgICAgICAgICAgaWYgY29kZW5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuZ3JvdXAoKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCcoKScpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuc3RyaXAoJywnKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2RlbmFtZSBhcHBlYXJzIHdpdGhpbiBwYXJhbnRoZXNlLgogICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1snY29kZW5hbWUnXSA9IGNvZGVuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbJ2NvZGVuYW1lJ10gPSAnJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgYW55IHRva2VucyB0aGF0IGFyZSBub3QgdmFyaWFibGUgYXNzaWdubWVudHMKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcHJvcHMKCiAgICBkZWYgX2dldF9sc2JfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSAnbHNiX3JlbGVhc2UgLWEnCiAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCiAgICAgICAgICAgIGNtZCwKICAgICAgICAgICAgc2hlbGw9VHJ1ZSwKICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQogICAgICAgIHN0ZG91dCwgc3RkZXJyID0gc3Rkb3V0LmRlY29kZSgndXRmLTgnKSwgc3RkZXJyLmRlY29kZSgndXRmLTgnKQogICAgICAgIGNvZGUgPSBwcm9jZXNzLnJldHVybmNvZGUKICAgICAgICBpZiBjb2RlID09IDA6CiAgICAgICAgICAgIGNvbnRlbnQgPSBzdGRvdXQuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9sc2JfcmVsZWFzZV9jb250ZW50KGNvbnRlbnQpCiAgICAgICAgZWxpZiBjb2RlID09IDEyNzogICMgQ29tbWFuZCBub3QgZm91bmQKICAgICAgICAgICAgcmV0dXJuIHt9CiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDMsIDUpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kLCBzdGRvdXQsIHN0ZGVycikKICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMiwgNyk6CiAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihjb2RlLCBjbWQsIHN0ZG91dCkKICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNik6CiAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihjb2RlLCBjbWQpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9sc2JfcmVsZWFzZV9jb250ZW50KGxpbmVzKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGxpbmVzOiBJdGVyYWJsZSB0aHJvdWdoIHRoZSBsaW5lcyBvZiB0aGUgbHNiX3JlbGVhc2Ugb3V0cHV0LgogICAgICAgICAgICAgICAgIEVhY2ggbGluZSBtdXN0IGJlIGEgdW5pY29kZSBzdHJpbmcgb3IgYSBVVEYtOCBlbmNvZGVkIGJ5dGUKICAgICAgICAgICAgICAgICBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBwcm9wcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKGxpbmUsIGJ5dGVzKSBlbHNlIGxpbmUKICAgICAgICAgICAga3YgPSBsaW5lLnN0cmlwKCdcbicpLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgaWYgbGVuKGt2KSAhPSAyOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgbGluZXMgd2l0aG91dCBjb2xvbi4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGssIHYgPSBrdgogICAgICAgICAgICBwcm9wcy51cGRhdGUoe2sucmVwbGFjZSgnICcsICdfJykubG93ZXIoKTogdi5zdHJpcCgpfSkKICAgICAgICByZXR1cm4gcHJvcHMKCiAgICBkZWYgX2dldF9kaXN0cm9fcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGU6CiAgICAgICAgICAgICMgSWYgaXQgd2FzIHNwZWNpZmllZCwgd2UgdXNlIGl0IGFuZCBwYXJzZSB3aGF0IHdlIGNhbiwgZXZlbiBpZgogICAgICAgICAgICAjIGl0cyBmaWxlIG5hbWUgb3IgY29udGVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgcGF0dGVybi4KICAgICAgICAgICAgZGlzdHJvX2luZm8gPSBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlKAogICAgICAgICAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlKQogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlKQogICAgICAgICAgICAjIFRoZSBmaWxlIG5hbWUgcGF0dGVybiBmb3IgdXNlci1zcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZXMKICAgICAgICAgICAgIyBpcyBzb21ld2hhdCBtb3JlIHRvbGVyYW50IChjb21wYXJlZCB0byB3aGVuIHNlYXJjaGluZyBmb3IgdGhlCiAgICAgICAgICAgICMgZmlsZSksIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2Ugd2hhdCB3YXMgc3BlY2lmaWVkIGFzIGJlc3QgYXMKICAgICAgICAgICAgIyBwb3NzaWJsZS4KICAgICAgICAgICAgbWF0Y2ggPSBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTi5tYXRjaChiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1snaWQnXSA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgIHJldHVybiBkaXN0cm9faW5mbwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VuYW1lcyA9IG9zLmxpc3RkaXIoX1VOSVhDT05GRElSKQogICAgICAgICAgICAjIFdlIHNvcnQgZm9yIHJlcGVhdGFiaWxpdHkgaW4gY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlCiAgICAgICAgICAgICMgZGlzdHJvIHNwZWNpZmljIGZpbGVzOyBlLmcuIENlbnRPUywgT3JhY2xlLCBFbnRlcnByaXNlIGFsbAogICAgICAgICAgICAjIGNvbnRhaW5pbmcgYHJlZGhhdC1yZWxlYXNlYCBvbiB0b3Agb2YgdGhlaXIgb3duLgogICAgICAgICAgICBiYXNlbmFtZXMuc29ydCgpCiAgICAgICAgICAgIGZvciBiYXNlbmFtZSBpbiBiYXNlbmFtZXM6CiAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZSBpbiBfRElTVFJPX1JFTEVBU0VfSUdOT1JFX0JBU0VOQU1FUzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgbWF0Y2ggPSBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTi5tYXRjaChiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKF9VTklYQ09ORkRJUiwgYmFzZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJvX2luZm8gPSBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlKGZpbGVwYXRoKQogICAgICAgICAgICAgICAgICAgIGlmICduYW1lJyBpbiBkaXN0cm9faW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBpcyBhbHdheXMgcHJlc2VudCBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSA9IGZpbGVwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWydpZCddID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3Ryb19pbmZvCiAgICAgICAgICAgIHJldHVybiB7fQoKICAgIGRlZiBfcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZShzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgYSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGZpbGVwYXRoOiBQYXRoIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlcGF0aCk6CiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCkgYXMgZnA6CiAgICAgICAgICAgICAgICAjIE9ubHkgcGFyc2UgdGhlIGZpcnN0IGxpbmUuIEZvciBpbnN0YW5jZSwgb24gU0xFUyB0aGVyZQogICAgICAgICAgICAgICAgIyBhcmUgbXVsdGlwbGUgbGluZXMuIFdlIGRvbid0IHdhbnQgdGhlbS4uLgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQoZnAucmVhZGxpbmUoKSkKICAgICAgICByZXR1cm4ge30KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQobGluZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgYSBsaW5lIGZyb20gYSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICogbGluZTogTGluZSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLiBNdXN0IGJlIGEgdW5pY29kZSBzdHJpbmcKICAgICAgICAgICAgICAgIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UobGluZSwgYnl0ZXMpOgogICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBtYXRjaGVzID0gX0RJU1RST19SRUxFQVNFX0NPTlRFTlRfUkVWRVJTRURfUEFUVEVSTi5tYXRjaCgKICAgICAgICAgICAgbGluZS5zdHJpcCgpWzo6LTFdKQogICAgICAgIGRpc3Ryb19pbmZvID0ge30KICAgICAgICBpZiBtYXRjaGVzOgogICAgICAgICAgICAjIHJlZ2V4cCBlbnN1cmVzIG5vbi1Ob25lCiAgICAgICAgICAgIGRpc3Ryb19pbmZvWyduYW1lJ10gPSBtYXRjaGVzLmdyb3VwKDMpWzo6LTFdCiAgICAgICAgICAgIGlmIG1hdGNoZXMuZ3JvdXAoMik6CiAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1sndmVyc2lvbl9pZCddID0gbWF0Y2hlcy5ncm91cCgyKVs6Oi0xXQogICAgICAgICAgICBpZiBtYXRjaGVzLmdyb3VwKDEpOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ2NvZGVuYW1lJ10gPSBtYXRjaGVzLmdyb3VwKDEpWzo6LTFdCiAgICAgICAgZWxpZiBsaW5lOgogICAgICAgICAgICBkaXN0cm9faW5mb1snbmFtZSddID0gbGluZS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIGRpc3Ryb19pbmZvCgoKX2Rpc3RybyA9IExpbnV4RGlzdHJpYnV0aW9uKCkKCgpkZWYgbWFpbigpOgogICAgaW1wb3J0IGFyZ3BhcnNlCgogICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKICAgIGxvZ2dlci5hZGRIYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KSkKCiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iTGludXggZGlzdHJvIGluZm8gdG9vbCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICctLWpzb24nLAogICAgICAgICctaicsCiAgICAgICAgaGVscD0iT3V0cHV0IGluIG1hY2hpbmUgcmVhZGFibGUgZm9ybWF0IiwKICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBpZiBhcmdzLmpzb246CiAgICAgICAgbG9nZ2VyLmluZm8oanNvbi5kdW1wcyhpbmZvKCksIGluZGVudD00LCBzb3J0X2tleXM9VHJ1ZSkpCiAgICBlbHNlOgogICAgICAgIGxvZ2dlci5pbmZvKCdOYW1lOiAlcycsIG5hbWUocHJldHR5PVRydWUpKQogICAgICAgIGRpc3RyaWJ1dGlvbl92ZXJzaW9uID0gdmVyc2lvbihwcmV0dHk9VHJ1ZSkKICAgICAgICBpZiBkaXN0cmlidXRpb25fdmVyc2lvbjoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1ZlcnNpb246ICVzJywgZGlzdHJpYnV0aW9uX3ZlcnNpb24pCiAgICAgICAgZGlzdHJpYnV0aW9uX2NvZGVuYW1lID0gY29kZW5hbWUoKQogICAgICAgIGlmIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvZGVuYW1lOiAlcycsIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAopuZnAwDAAAMAwAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weSIiIgpIVE1MIHBhcnNpbmcgbGlicmFyeSBiYXNlZCBvbiB0aGUgV0hBVFdHICJIVE1MNSIKc3BlY2lmaWNhdGlvbi4gVGhlIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcKSFRNTCBmb3VuZCBpbiB0aGUgd2lsZCBhbmQgaW1wbGVtZW50cyB3ZWxsLWRlZmluZWQgZXJyb3IgcmVjb3ZlcnkgdGhhdAppcyBsYXJnZWx5IGNvbXBhdGlibGUgd2l0aCBtb2Rlcm4gZGVza3RvcCB3ZWIgYnJvd3NlcnMuCgpFeGFtcGxlIHVzYWdlOgoKaW1wb3J0IGh0bWw1bGliCmYgPSBvcGVuKCJteV9kb2N1bWVudC5odG1sIikKdHJlZSA9IGh0bWw1bGliLnBhcnNlKGYpCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC5odG1sNXBhcnNlciBpbXBvcnQgSFRNTFBhcnNlciwgcGFyc2UsIHBhcnNlRnJhZ21lbnQKZnJvbSAudHJlZWJ1aWxkZXJzIGltcG9ydCBnZXRUcmVlQnVpbGRlcgpmcm9tIC50cmVld2Fsa2VycyBpbXBvcnQgZ2V0VHJlZVdhbGtlcgpmcm9tIC5zZXJpYWxpemVyIGltcG9ydCBzZXJpYWxpemUKCl9fYWxsX18gPSBbIkhUTUxQYXJzZXIiLCAicGFyc2UiLCAicGFyc2VGcmFnbWVudCIsICJnZXRUcmVlQnVpbGRlciIsCiAgICAgICAgICAgImdldFRyZWVXYWxrZXIiLCAic2VyaWFsaXplIl0KCiMgdGhpcyBoYXMgdG8gYmUgYXQgdGhlIHRvcCBsZXZlbCwgc2VlIGhvdyBzZXR1cC5weSBwYXJzZXMgdGhpcwpfX3ZlcnNpb25fXyA9ICIxLjBiMTAiClBLAwQUAAAAAAAAACEA1XgO4kFBAABBQQAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9faWhhdGV4bWwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCByZQppbXBvcnQgd2FybmluZ3MKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgRGF0YUxvc3NXYXJuaW5nCgpiYXNlQ2hhciA9ICIiIgpbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0gfCBbI3gwMEQ4LSN4MDBGNl0gfApbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0gfCBbI3gwMTM0LSN4MDEzRV0gfCBbI3gwMTQxLSN4MDE0OF0gfApbI3gwMTRBLSN4MDE3RV0gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0gfApbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYgfApbI3gwMzg4LSN4MDM4QV0gfCAjeDAzOEMgfCBbI3gwMzhFLSN4MDNBMV0gfCBbI3gwM0EzLSN4MDNDRV0gfApbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTAgfCBbI3gwM0UyLSN4MDNGM10gfApbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0gfCBbI3gwNDUxLSN4MDQ1Q10gfCBbI3gwNDVFLSN4MDQ4MV0gfApbI3gwNDkwLSN4MDRDNF0gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0gfApbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkgfApbI3gwNTYxLSN4MDU4Nl0gfCBbI3gwNUQwLSN4MDVFQV0gfCBbI3gwNUYwLSN4MDVGMl0gfCBbI3gwNjIxLSN4MDYzQV0gfApbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfApbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUgfCBbI3gwNkU1LSN4MDZFNl0gfCBbI3gwOTA1LSN4MDkzOV0gfCAjeDA5M0QgfApbI3gwOTU4LSN4MDk2MV0gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0gfApbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0gfApbI3gwOURGLSN4MDlFMV0gfCBbI3gwOUYwLSN4MDlGMV0gfCBbI3gwQTA1LSN4MEEwQV0gfCBbI3gwQTBGLSN4MEExMF0gfApbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfApbI3gwQTM4LSN4MEEzOV0gfCBbI3gwQTU5LSN4MEE1Q10gfCAjeDBBNUUgfCBbI3gwQTcyLSN4MEE3NF0gfApbI3gwQTg1LSN4MEE4Ql0gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfApbI3gwQUFBLSN4MEFCMF0gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTAgfApbI3gwQjA1LSN4MEIwQ10gfCBbI3gwQjBGLSN4MEIxMF0gfCBbI3gwQjEzLSN4MEIyOF0gfCBbI3gwQjJBLSN4MEIzMF0gfApbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QgfCBbI3gwQjVDLSN4MEI1RF0gfApbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0gfCBbI3gwQjhFLSN4MEI5MF0gfCBbI3gwQjkyLSN4MEI5NV0gfApbI3gwQjk5LSN4MEI5QV0gfCAjeDBCOUMgfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfApbI3gwQkE4LSN4MEJBQV0gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10gfApbI3gwQzBFLSN4MEMxMF0gfCBbI3gwQzEyLSN4MEMyOF0gfCBbI3gwQzJBLSN4MEMzM10gfCBbI3gwQzM1LSN4MEMzOV0gfApbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfApbI3gwQ0FBLSN4MENCM10gfCBbI3gwQ0I1LSN4MENCOV0gfCAjeDBDREUgfCBbI3gwQ0UwLSN4MENFMV0gfApbI3gwRDA1LSN4MEQwQ10gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0gfApbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10gfApbI3gwRTQwLSN4MEU0NV0gfCBbI3gwRTgxLSN4MEU4Ml0gfCAjeDBFODQgfCBbI3gwRTg3LSN4MEU4OF0gfCAjeDBFOEEgfAojeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfAojeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0gfCBbI3gwRUFELSN4MEVBRV0gfCAjeDBFQjAgfCBbI3gwRUIyLSN4MEVCM10gfAojeDBFQkQgfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0gfApbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10gfApbI3gxMTA1LSN4MTEwN10gfCAjeDExMDkgfCBbI3gxMTBCLSN4MTEwQ10gfCBbI3gxMTBFLSN4MTExMl0gfCAjeDExM0MgfAojeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTAgfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfApbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUgfCAjeDExNjcgfCAjeDExNjkgfCBbI3gxMTZELSN4MTE2RV0gfApbI3gxMTcyLSN4MTE3M10gfCAjeDExNzUgfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfApbI3gxMUI3LSN4MTFCOF0gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkgfApbI3gxRTAwLSN4MUU5Ql0gfCBbI3gxRUEwLSN4MUVGOV0gfCBbI3gxRjAwLSN4MUYxNV0gfCBbI3gxRjE4LSN4MUYxRF0gfApbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfAojeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0gfCBbI3gxRjgwLSN4MUZCNF0gfCBbI3gxRkI2LSN4MUZCQ10gfCAjeDFGQkUgfApbI3gxRkMyLSN4MUZDNF0gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0gfApbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYgfApbI3gyMTJBLSN4MjEyQl0gfCAjeDIxMkUgfCBbI3gyMTgwLSN4MjE4Ml0gfCBbI3gzMDQxLSN4MzA5NF0gfApbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10iIiIKCmlkZW9ncmFwaGljID0gIiIiWyN4NEUwMC0jeDlGQTVdIHwgI3gzMDA3IHwgWyN4MzAyMS0jeDMwMjldIiIiCgpjb21iaW5pbmdDaGFyYWN0ZXIgPSAiIiIKWyN4MDMwMC0jeDAzNDVdIHwgWyN4MDM2MC0jeDAzNjFdIHwgWyN4MDQ4My0jeDA0ODZdIHwgWyN4MDU5MS0jeDA1QTFdIHwKWyN4MDVBMy0jeDA1QjldIHwgWyN4MDVCQi0jeDA1QkRdIHwgI3gwNUJGIHwgWyN4MDVDMS0jeDA1QzJdIHwgI3gwNUM0IHwKWyN4MDY0Qi0jeDA2NTJdIHwgI3gwNjcwIHwgWyN4MDZENi0jeDA2RENdIHwgWyN4MDZERC0jeDA2REZdIHwKWyN4MDZFMC0jeDA2RTRdIHwgWyN4MDZFNy0jeDA2RThdIHwgWyN4MDZFQS0jeDA2RURdIHwgWyN4MDkwMS0jeDA5MDNdIHwKI3gwOTNDIHwgWyN4MDkzRS0jeDA5NENdIHwgI3gwOTREIHwgWyN4MDk1MS0jeDA5NTRdIHwgWyN4MDk2Mi0jeDA5NjNdIHwKWyN4MDk4MS0jeDA5ODNdIHwgI3gwOUJDIHwgI3gwOUJFIHwgI3gwOUJGIHwgWyN4MDlDMC0jeDA5QzRdIHwKWyN4MDlDNy0jeDA5QzhdIHwgWyN4MDlDQi0jeDA5Q0RdIHwgI3gwOUQ3IHwgWyN4MDlFMi0jeDA5RTNdIHwgI3gwQTAyIHwKI3gwQTNDIHwgI3gwQTNFIHwgI3gwQTNGIHwgWyN4MEE0MC0jeDBBNDJdIHwgWyN4MEE0Ny0jeDBBNDhdIHwKWyN4MEE0Qi0jeDBBNERdIHwgWyN4MEE3MC0jeDBBNzFdIHwgWyN4MEE4MS0jeDBBODNdIHwgI3gwQUJDIHwKWyN4MEFCRS0jeDBBQzVdIHwgWyN4MEFDNy0jeDBBQzldIHwgWyN4MEFDQi0jeDBBQ0RdIHwgWyN4MEIwMS0jeDBCMDNdIHwKI3gwQjNDIHwgWyN4MEIzRS0jeDBCNDNdIHwgWyN4MEI0Ny0jeDBCNDhdIHwgWyN4MEI0Qi0jeDBCNERdIHwKWyN4MEI1Ni0jeDBCNTddIHwgWyN4MEI4Mi0jeDBCODNdIHwgWyN4MEJCRS0jeDBCQzJdIHwgWyN4MEJDNi0jeDBCQzhdIHwKWyN4MEJDQS0jeDBCQ0RdIHwgI3gwQkQ3IHwgWyN4MEMwMS0jeDBDMDNdIHwgWyN4MEMzRS0jeDBDNDRdIHwKWyN4MEM0Ni0jeDBDNDhdIHwgWyN4MEM0QS0jeDBDNERdIHwgWyN4MEM1NS0jeDBDNTZdIHwgWyN4MEM4Mi0jeDBDODNdIHwKWyN4MENCRS0jeDBDQzRdIHwgWyN4MENDNi0jeDBDQzhdIHwgWyN4MENDQS0jeDBDQ0RdIHwgWyN4MENENS0jeDBDRDZdIHwKWyN4MEQwMi0jeDBEMDNdIHwgWyN4MEQzRS0jeDBENDNdIHwgWyN4MEQ0Ni0jeDBENDhdIHwgWyN4MEQ0QS0jeDBENERdIHwKI3gwRDU3IHwgI3gwRTMxIHwgWyN4MEUzNC0jeDBFM0FdIHwgWyN4MEU0Ny0jeDBFNEVdIHwgI3gwRUIxIHwKWyN4MEVCNC0jeDBFQjldIHwgWyN4MEVCQi0jeDBFQkNdIHwgWyN4MEVDOC0jeDBFQ0RdIHwgWyN4MEYxOC0jeDBGMTldIHwKI3gwRjM1IHwgI3gwRjM3IHwgI3gwRjM5IHwgI3gwRjNFIHwgI3gwRjNGIHwgWyN4MEY3MS0jeDBGODRdIHwKWyN4MEY4Ni0jeDBGOEJdIHwgWyN4MEY5MC0jeDBGOTVdIHwgI3gwRjk3IHwgWyN4MEY5OS0jeDBGQURdIHwKWyN4MEZCMS0jeDBGQjddIHwgI3gwRkI5IHwgWyN4MjBEMC0jeDIwRENdIHwgI3gyMEUxIHwgWyN4MzAyQS0jeDMwMkZdIHwKI3gzMDk5IHwgI3gzMDlBIiIiCgpkaWdpdCA9ICIiIgpbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0gfCBbI3gwOTY2LSN4MDk2Rl0gfApbI3gwOUU2LSN4MDlFRl0gfCBbI3gwQTY2LSN4MEE2Rl0gfCBbI3gwQUU2LSN4MEFFRl0gfCBbI3gwQjY2LSN4MEI2Rl0gfApbI3gwQkU3LSN4MEJFRl0gfCBbI3gwQzY2LSN4MEM2Rl0gfCBbI3gwQ0U2LSN4MENFRl0gfCBbI3gwRDY2LSN4MEQ2Rl0gfApbI3gwRTUwLSN4MEU1OV0gfCBbI3gwRUQwLSN4MEVEOV0gfCBbI3gwRjIwLSN4MEYyOV0iIiIKCmV4dGVuZGVyID0gIiIiCiN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0NiB8ICN4MEVDNiB8ICN4MzAwNSB8CiNbI3gzMDMxLSN4MzAzNV0gfCBbI3gzMDlELSN4MzA5RV0gfCBbI3gzMEZDLSN4MzBGRV0iIiIKCmxldHRlciA9ICIgfCAiLmpvaW4oW2Jhc2VDaGFyLCBpZGVvZ3JhcGhpY10pCgojIFdpdGhvdXQgdGhlCm5hbWUgPSAiIHwgIi5qb2luKFtsZXR0ZXIsIGRpZ2l0LCAiLiIsICItIiwgIl8iLCBjb21iaW5pbmdDaGFyYWN0ZXIsCiAgICAgICAgICAgICAgICAgICBleHRlbmRlcl0pCm5hbWVGaXJzdCA9ICIgfCAiLmpvaW4oW2xldHRlciwgIl8iXSkKCnJlQ2hhciA9IHJlLmNvbXBpbGUociIjeChbXGR8QS1GXXs0LDR9KSIpCnJlQ2hhclJhbmdlID0gcmUuY29tcGlsZShyIlxbI3goW1xkfEEtRl17NCw0fSktI3goW1xkfEEtRl17NCw0fSlcXSIpCgoKZGVmIGNoYXJTdHJpbmdUb0xpc3QoY2hhcnMpOgogICAgY2hhclJhbmdlcyA9IFtpdGVtLnN0cmlwKCkgZm9yIGl0ZW0gaW4gY2hhcnMuc3BsaXQoIiB8ICIpXQogICAgcnYgPSBbXQogICAgZm9yIGl0ZW0gaW4gY2hhclJhbmdlczoKICAgICAgICBmb3VuZE1hdGNoID0gRmFsc2UKICAgICAgICBmb3IgcmVnZXhwIGluIChyZUNoYXIsIHJlQ2hhclJhbmdlKToKICAgICAgICAgICAgbWF0Y2ggPSByZWdleHAubWF0Y2goaXRlbSkKICAgICAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoW2hleFRvSW50KGl0ZW0pIGZvciBpdGVtIGluIG1hdGNoLmdyb3VwcygpXSkKICAgICAgICAgICAgICAgIGlmIGxlbihydlstMV0pID09IDE6CiAgICAgICAgICAgICAgICAgICAgcnZbLTFdID0gcnZbLTFdICogMgogICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbm90IGZvdW5kTWF0Y2g6CiAgICAgICAgICAgIGFzc2VydCBsZW4oaXRlbSkgPT0gMQoKICAgICAgICAgICAgcnYuYXBwZW5kKFtvcmQoaXRlbSldICogMikKICAgIHJ2ID0gbm9ybWFsaXNlQ2hhckxpc3QocnYpCiAgICByZXR1cm4gcnYKCgpkZWYgbm9ybWFsaXNlQ2hhckxpc3QoY2hhckxpc3QpOgogICAgY2hhckxpc3QgPSBzb3J0ZWQoY2hhckxpc3QpCiAgICBmb3IgaXRlbSBpbiBjaGFyTGlzdDoKICAgICAgICBhc3NlcnQgaXRlbVsxXSA+PSBpdGVtWzBdCiAgICBydiA9IFtdCiAgICBpID0gMAogICAgd2hpbGUgaSA8IGxlbihjaGFyTGlzdCk6CiAgICAgICAgaiA9IDEKICAgICAgICBydi5hcHBlbmQoY2hhckxpc3RbaV0pCiAgICAgICAgd2hpbGUgaSArIGogPCBsZW4oY2hhckxpc3QpIGFuZCBjaGFyTGlzdFtpICsgal1bMF0gPD0gcnZbLTFdWzFdICsgMToKICAgICAgICAgICAgcnZbLTFdWzFdID0gY2hhckxpc3RbaSArIGpdWzFdCiAgICAgICAgICAgIGogKz0gMQogICAgICAgIGkgKz0gagogICAgcmV0dXJuIHJ2CgojIFdlIGRvbid0IHJlYWxseSBzdXBwb3J0IGNoYXJhY3RlcnMgYWJvdmUgdGhlIEJNUCA6KAptYXhfdW5pY29kZSA9IGludCgiRkZGRiIsIDE2KQoKCmRlZiBtaXNzaW5nUmFuZ2VzKGNoYXJMaXN0KToKICAgIHJ2ID0gW10KICAgIGlmIGNoYXJMaXN0WzBdICE9IDA6CiAgICAgICAgcnYuYXBwZW5kKFswLCBjaGFyTGlzdFswXVswXSAtIDFdKQogICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKGNoYXJMaXN0WzotMV0pOgogICAgICAgIHJ2LmFwcGVuZChbaXRlbVsxXSArIDEsIGNoYXJMaXN0W2kgKyAxXVswXSAtIDFdKQogICAgaWYgY2hhckxpc3RbLTFdWzFdICE9IG1heF91bmljb2RlOgogICAgICAgIHJ2LmFwcGVuZChbY2hhckxpc3RbLTFdWzFdICsgMSwgbWF4X3VuaWNvZGVdKQogICAgcmV0dXJuIHJ2CgoKZGVmIGxpc3RUb1JlZ2V4cFN0cihjaGFyTGlzdCk6CiAgICBydiA9IFtdCiAgICBmb3IgaXRlbSBpbiBjaGFyTGlzdDoKICAgICAgICBpZiBpdGVtWzBdID09IGl0ZW1bMV06CiAgICAgICAgICAgIHJ2LmFwcGVuZChlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMF0pKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBydi5hcHBlbmQoZXNjYXBlUmVnZXhwKGNocihpdGVtWzBdKSkgKyAiLSIgKwogICAgICAgICAgICAgICAgICAgICAgZXNjYXBlUmVnZXhwKGNocihpdGVtWzFdKSkpCiAgICByZXR1cm4gIlslc10iICUgIiIuam9pbihydikKCgpkZWYgaGV4VG9JbnQoaGV4X3N0cik6CiAgICByZXR1cm4gaW50KGhleF9zdHIsIDE2KQoKCmRlZiBlc2NhcGVSZWdleHAoc3RyaW5nKToKICAgIHNwZWNpYWxDaGFyYWN0ZXJzID0gKCIuIiwgIl4iLCAiJCIsICIqIiwgIisiLCAiPyIsICJ7IiwgIn0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIlsiLCAiXSIsICJ8IiwgIigiLCAiKSIsICItIikKICAgIGZvciBjaGFyIGluIHNwZWNpYWxDaGFyYWN0ZXJzOgogICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGNoYXIsICJcXCIgKyBjaGFyKQoKICAgIHJldHVybiBzdHJpbmcKCiMgb3V0cHV0IGZyb20gdGhlIGFib3ZlCm5vblhtbE5hbWVCTVBSZWdleHAgPSByZS5jb21waWxlKCdbXHgwMC0sLzotQFxcWy1cXF5gXFx7LVx4YjZceGI4LVx4YmZceGQ3XHhmN1x1MDEzMi1cdTAxMzNcdTAxM2YtXHUwMTQwXHUwMTQ5XHUwMTdmXHUwMWM0LVx1MDFjY1x1MDFmMS1cdTAxZjNcdTAxZjYtXHUwMWY5XHUwMjE4LVx1MDI0Zlx1MDJhOS1cdTAyYmFcdTAyYzItXHUwMmNmXHUwMmQyLVx1MDJmZlx1MDM0Ni1cdTAzNWZcdTAzNjItXHUwMzg1XHUwMzhiXHUwMzhkXHUwM2EyXHUwM2NmXHUwM2Q3LVx1MDNkOVx1MDNkYlx1MDNkZFx1MDNkZlx1MDNlMVx1MDNmNC1cdTA0MDBcdTA0MGRcdTA0NTBcdTA0NWRcdTA0ODJcdTA0ODctXHUwNDhmXHUwNGM1LVx1MDRjNlx1MDRjOS1cdTA0Y2FcdTA0Y2QtXHUwNGNmXHUwNGVjLVx1MDRlZFx1MDRmNi1cdTA0ZjdcdTA0ZmEtXHUwNTMwXHUwNTU3LVx1MDU1OFx1MDU1YS1cdTA1NjBcdTA1ODctXHUwNTkwXHUwNWEyXHUwNWJhXHUwNWJlXHUwNWMwXHUwNWMzXHUwNWM1LVx1MDVjZlx1MDVlYi1cdTA1ZWZcdTA1ZjMtXHUwNjIwXHUwNjNiLVx1MDYzZlx1MDY1My1cdTA2NWZcdTA2NmEtXHUwNjZmXHUwNmI4LVx1MDZiOVx1MDZiZlx1MDZjZlx1MDZkNFx1MDZlOVx1MDZlZS1cdTA2ZWZcdTA2ZmEtXHUwOTAwXHUwOTA0XHUwOTNhLVx1MDkzYlx1MDk0ZS1cdTA5NTBcdTA5NTUtXHUwOTU3XHUwOTY0LVx1MDk2NVx1MDk3MC1cdTA5ODBcdTA5ODRcdTA5OGQtXHUwOThlXHUwOTkxLVx1MDk5Mlx1MDlhOVx1MDliMVx1MDliMy1cdTA5YjVcdTA5YmEtXHUwOWJiXHUwOWJkXHUwOWM1LVx1MDljNlx1MDljOS1cdTA5Y2FcdTA5Y2UtXHUwOWQ2XHUwOWQ4LVx1MDlkYlx1MDlkZVx1MDllNC1cdTA5ZTVcdTA5ZjItXHUwYTAxXHUwYTAzLVx1MGEwNFx1MGEwYi1cdTBhMGVcdTBhMTEtXHUwYTEyXHUwYTI5XHUwYTMxXHUwYTM0XHUwYTM3XHUwYTNhLVx1MGEzYlx1MGEzZFx1MGE0My1cdTBhNDZcdTBhNDktXHUwYTRhXHUwYTRlLVx1MGE1OFx1MGE1ZFx1MGE1Zi1cdTBhNjVcdTBhNzUtXHUwYTgwXHUwYTg0XHUwYThjXHUwYThlXHUwYTkyXHUwYWE5XHUwYWIxXHUwYWI0XHUwYWJhLVx1MGFiYlx1MGFjNlx1MGFjYVx1MGFjZS1cdTBhZGZcdTBhZTEtXHUwYWU1XHUwYWYwLVx1MGIwMFx1MGIwNFx1MGIwZC1cdTBiMGVcdTBiMTEtXHUwYjEyXHUwYjI5XHUwYjMxXHUwYjM0LVx1MGIzNVx1MGIzYS1cdTBiM2JcdTBiNDQtXHUwYjQ2XHUwYjQ5LVx1MGI0YVx1MGI0ZS1cdTBiNTVcdTBiNTgtXHUwYjViXHUwYjVlXHUwYjYyLVx1MGI2NVx1MGI3MC1cdTBiODFcdTBiODRcdTBiOGItXHUwYjhkXHUwYjkxXHUwYjk2LVx1MGI5OFx1MGI5Ylx1MGI5ZFx1MGJhMC1cdTBiYTJcdTBiYTUtXHUwYmE3XHUwYmFiLVx1MGJhZFx1MGJiNlx1MGJiYS1cdTBiYmRcdTBiYzMtXHUwYmM1XHUwYmM5XHUwYmNlLVx1MGJkNlx1MGJkOC1cdTBiZTZcdTBiZjAtXHUwYzAwXHUwYzA0XHUwYzBkXHUwYzExXHUwYzI5XHUwYzM0XHUwYzNhLVx1MGMzZFx1MGM0NVx1MGM0OVx1MGM0ZS1cdTBjNTRcdTBjNTctXHUwYzVmXHUwYzYyLVx1MGM2NVx1MGM3MC1cdTBjODFcdTBjODRcdTBjOGRcdTBjOTFcdTBjYTlcdTBjYjRcdTBjYmEtXHUwY2JkXHUwY2M1XHUwY2M5XHUwY2NlLVx1MGNkNFx1MGNkNy1cdTBjZGRcdTBjZGZcdTBjZTItXHUwY2U1XHUwY2YwLVx1MGQwMVx1MGQwNFx1MGQwZFx1MGQxMVx1MGQyOVx1MGQzYS1cdTBkM2RcdTBkNDQtXHUwZDQ1XHUwZDQ5XHUwZDRlLVx1MGQ1Nlx1MGQ1OC1cdTBkNWZcdTBkNjItXHUwZDY1XHUwZDcwLVx1MGUwMFx1MGUyZlx1MGUzYi1cdTBlM2ZcdTBlNGZcdTBlNWEtXHUwZTgwXHUwZTgzXHUwZTg1LVx1MGU4Nlx1MGU4OVx1MGU4Yi1cdTBlOGNcdTBlOGUtXHUwZTkzXHUwZTk4XHUwZWEwXHUwZWE0XHUwZWE2XHUwZWE4LVx1MGVhOVx1MGVhY1x1MGVhZlx1MGViYVx1MGViZS1cdTBlYmZcdTBlYzVcdTBlYzdcdTBlY2UtXHUwZWNmXHUwZWRhLVx1MGYxN1x1MGYxYS1cdTBmMWZcdTBmMmEtXHUwZjM0XHUwZjM2XHUwZjM4XHUwZjNhLVx1MGYzZFx1MGY0OFx1MGY2YS1cdTBmNzBcdTBmODVcdTBmOGMtXHUwZjhmXHUwZjk2XHUwZjk4XHUwZmFlLVx1MGZiMFx1MGZiOFx1MGZiYS1cdTEwOWZcdTEwYzYtXHUxMGNmXHUxMGY3LVx1MTBmZlx1MTEwMVx1MTEwNFx1MTEwOFx1MTEwYVx1MTEwZFx1MTExMy1cdTExM2JcdTExM2RcdTExM2ZcdTExNDEtXHUxMTRiXHUxMTRkXHUxMTRmXHUxMTUxLVx1MTE1M1x1MTE1Ni1cdTExNThcdTExNWEtXHUxMTVlXHUxMTYyXHUxMTY0XHUxMTY2XHUxMTY4XHUxMTZhLVx1MTE2Y1x1MTE2Zi1cdTExNzFcdTExNzRcdTExNzYtXHUxMTlkXHUxMTlmLVx1MTFhN1x1MTFhOS1cdTExYWFcdTExYWMtXHUxMWFkXHUxMWIwLVx1MTFiNlx1MTFiOVx1MTFiYlx1MTFjMy1cdTExZWFcdTExZWMtXHUxMWVmXHUxMWYxLVx1MTFmOFx1MTFmYS1cdTFkZmZcdTFlOWMtXHUxZTlmXHUxZWZhLVx1MWVmZlx1MWYxNi1cdTFmMTdcdTFmMWUtXHUxZjFmXHUxZjQ2LVx1MWY0N1x1MWY0ZS1cdTFmNGZcdTFmNThcdTFmNWFcdTFmNWNcdTFmNWVcdTFmN2UtXHUxZjdmXHUxZmI1XHUxZmJkXHUxZmJmLVx1MWZjMVx1MWZjNVx1MWZjZC1cdTFmY2ZcdTFmZDQtXHUxZmQ1XHUxZmRjLVx1MWZkZlx1MWZlZC1cdTFmZjFcdTFmZjVcdTFmZmQtXHUyMGNmXHUyMGRkLVx1MjBlMFx1MjBlMi1cdTIxMjVcdTIxMjctXHUyMTI5XHUyMTJjLVx1MjEyZFx1MjEyZi1cdTIxN2ZcdTIxODMtXHUzMDA0XHUzMDA2XHUzMDA4LVx1MzAyMFx1MzAzMFx1MzAzNi1cdTMwNDBcdTMwOTUtXHUzMDk4XHUzMDliLVx1MzA5Y1x1MzA5Zi1cdTMwYTBcdTMwZmJcdTMwZmYtXHUzMTA0XHUzMTJkLVx1NGRmZlx1OWZhNi1cdWFiZmZcdWQ3YTQtXHVmZmZmXScpICAjIG5vcWEKCm5vblhtbE5hbWVGaXJzdEJNUFJlZ2V4cCA9IHJlLmNvbXBpbGUoJ1tceDAwLUBcXFstXFxeYFxcey1ceGJmXHhkN1x4ZjdcdTAxMzItXHUwMTMzXHUwMTNmLVx1MDE0MFx1MDE0OVx1MDE3Zlx1MDFjNC1cdTAxY2NcdTAxZjEtXHUwMWYzXHUwMWY2LVx1MDFmOVx1MDIxOC1cdTAyNGZcdTAyYTktXHUwMmJhXHUwMmMyLVx1MDM4NVx1MDM4N1x1MDM4Ylx1MDM4ZFx1MDNhMlx1MDNjZlx1MDNkNy1cdTAzZDlcdTAzZGJcdTAzZGRcdTAzZGZcdTAzZTFcdTAzZjQtXHUwNDAwXHUwNDBkXHUwNDUwXHUwNDVkXHUwNDgyLVx1MDQ4Zlx1MDRjNS1cdTA0YzZcdTA0YzktXHUwNGNhXHUwNGNkLVx1MDRjZlx1MDRlYy1cdTA0ZWRcdTA0ZjYtXHUwNGY3XHUwNGZhLVx1MDUzMFx1MDU1Ny1cdTA1NThcdTA1NWEtXHUwNTYwXHUwNTg3LVx1MDVjZlx1MDVlYi1cdTA1ZWZcdTA1ZjMtXHUwNjIwXHUwNjNiLVx1MDY0MFx1MDY0Yi1cdTA2NzBcdTA2YjgtXHUwNmI5XHUwNmJmXHUwNmNmXHUwNmQ0XHUwNmQ2LVx1MDZlNFx1MDZlNy1cdTA5MDRcdTA5M2EtXHUwOTNjXHUwOTNlLVx1MDk1N1x1MDk2Mi1cdTA5ODRcdTA5OGQtXHUwOThlXHUwOTkxLVx1MDk5Mlx1MDlhOVx1MDliMVx1MDliMy1cdTA5YjVcdTA5YmEtXHUwOWRiXHUwOWRlXHUwOWUyLVx1MDllZlx1MDlmMi1cdTBhMDRcdTBhMGItXHUwYTBlXHUwYTExLVx1MGExMlx1MGEyOVx1MGEzMVx1MGEzNFx1MGEzN1x1MGEzYS1cdTBhNThcdTBhNWRcdTBhNWYtXHUwYTcxXHUwYTc1LVx1MGE4NFx1MGE4Y1x1MGE4ZVx1MGE5Mlx1MGFhOVx1MGFiMVx1MGFiNFx1MGFiYS1cdTBhYmNcdTBhYmUtXHUwYWRmXHUwYWUxLVx1MGIwNFx1MGIwZC1cdTBiMGVcdTBiMTEtXHUwYjEyXHUwYjI5XHUwYjMxXHUwYjM0LVx1MGIzNVx1MGIzYS1cdTBiM2NcdTBiM2UtXHUwYjViXHUwYjVlXHUwYjYyLVx1MGI4NFx1MGI4Yi1cdTBiOGRcdTBiOTFcdTBiOTYtXHUwYjk4XHUwYjliXHUwYjlkXHUwYmEwLVx1MGJhMlx1MGJhNS1cdTBiYTdcdTBiYWItXHUwYmFkXHUwYmI2XHUwYmJhLVx1MGMwNFx1MGMwZFx1MGMxMVx1MGMyOVx1MGMzNFx1MGMzYS1cdTBjNWZcdTBjNjItXHUwYzg0XHUwYzhkXHUwYzkxXHUwY2E5XHUwY2I0XHUwY2JhLVx1MGNkZFx1MGNkZlx1MGNlMi1cdTBkMDRcdTBkMGRcdTBkMTFcdTBkMjlcdTBkM2EtXHUwZDVmXHUwZDYyLVx1MGUwMFx1MGUyZlx1MGUzMVx1MGUzNC1cdTBlM2ZcdTBlNDYtXHUwZTgwXHUwZTgzXHUwZTg1LVx1MGU4Nlx1MGU4OVx1MGU4Yi1cdTBlOGNcdTBlOGUtXHUwZTkzXHUwZTk4XHUwZWEwXHUwZWE0XHUwZWE2XHUwZWE4LVx1MGVhOVx1MGVhY1x1MGVhZlx1MGViMVx1MGViNC1cdTBlYmNcdTBlYmUtXHUwZWJmXHUwZWM1LVx1MGYzZlx1MGY0OFx1MGY2YS1cdTEwOWZcdTEwYzYtXHUxMGNmXHUxMGY3LVx1MTBmZlx1MTEwMVx1MTEwNFx1MTEwOFx1MTEwYVx1MTEwZFx1MTExMy1cdTExM2JcdTExM2RcdTExM2ZcdTExNDEtXHUxMTRiXHUxMTRkXHUxMTRmXHUxMTUxLVx1MTE1M1x1MTE1Ni1cdTExNThcdTExNWEtXHUxMTVlXHUxMTYyXHUxMTY0XHUxMTY2XHUxMTY4XHUxMTZhLVx1MTE2Y1x1MTE2Zi1cdTExNzFcdTExNzRcdTExNzYtXHUxMTlkXHUxMTlmLVx1MTFhN1x1MTFhOS1cdTExYWFcdTExYWMtXHUxMWFkXHUxMWIwLVx1MTFiNlx1MTFiOVx1MTFiYlx1MTFjMy1cdTExZWFcdTExZWMtXHUxMWVmXHUxMWYxLVx1MTFmOFx1MTFmYS1cdTFkZmZcdTFlOWMtXHUxZTlmXHUxZWZhLVx1MWVmZlx1MWYxNi1cdTFmMTdcdTFmMWUtXHUxZjFmXHUxZjQ2LVx1MWY0N1x1MWY0ZS1cdTFmNGZcdTFmNThcdTFmNWFcdTFmNWNcdTFmNWVcdTFmN2UtXHUxZjdmXHUxZmI1XHUxZmJkXHUxZmJmLVx1MWZjMVx1MWZjNVx1MWZjZC1cdTFmY2ZcdTFmZDQtXHUxZmQ1XHUxZmRjLVx1MWZkZlx1MWZlZC1cdTFmZjFcdTFmZjVcdTFmZmQtXHUyMTI1XHUyMTI3LVx1MjEyOVx1MjEyYy1cdTIxMmRcdTIxMmYtXHUyMTdmXHUyMTgzLVx1MzAwNlx1MzAwOC1cdTMwMjBcdTMwMmEtXHUzMDQwXHUzMDk1LVx1MzBhMFx1MzBmYi1cdTMxMDRcdTMxMmQtXHU0ZGZmXHU5ZmE2LVx1YWJmZlx1ZDdhNC1cdWZmZmZdJykgICMgbm9xYQoKIyBTaW1wbGVyIHRoaW5ncwpub25QdWJpZENoYXJSZWdleHAgPSByZS5jb21waWxlKCJbXlx4MjBceDBEXHgwQWEtekEtWjAtOVwtXCcoKSssLi86PT87ISojQCRfJV0iKQoKCmNsYXNzIEluZm9zZXRGaWx0ZXIob2JqZWN0KToKICAgIHJlcGxhY2VtZW50UmVnZXhwID0gcmUuY29tcGlsZShyIlVbXGRBLUZdezUsNX0iKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGRyb3BYbWxuc0xvY2FsTmFtZT1GYWxzZSwKICAgICAgICAgICAgICAgICBkcm9wWG1sbnNBdHRyTnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgcHJldmVudERvdWJsZURhc2hDb21tZW50cz1GYWxzZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50RGFzaEF0Q29tbWVudEVuZD1GYWxzZSwKICAgICAgICAgICAgICAgICByZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzPVRydWUsCiAgICAgICAgICAgICAgICAgcHJldmVudFNpbmdsZVF1b3RlUHViaWQ9RmFsc2UpOgoKICAgICAgICBzZWxmLmRyb3BYbWxuc0xvY2FsTmFtZSA9IGRyb3BYbWxuc0xvY2FsTmFtZQogICAgICAgIHNlbGYuZHJvcFhtbG5zQXR0ck5zID0gZHJvcFhtbG5zQXR0ck5zCgogICAgICAgIHNlbGYucHJldmVudERvdWJsZURhc2hDb21tZW50cyA9IHByZXZlbnREb3VibGVEYXNoQ29tbWVudHMKICAgICAgICBzZWxmLnByZXZlbnREYXNoQXRDb21tZW50RW5kID0gcHJldmVudERhc2hBdENvbW1lbnRFbmQKCiAgICAgICAgc2VsZi5yZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzID0gcmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVycwoKICAgICAgICBzZWxmLnByZXZlbnRTaW5nbGVRdW90ZVB1YmlkID0gcHJldmVudFNpbmdsZVF1b3RlUHViaWQKCiAgICAgICAgc2VsZi5yZXBsYWNlQ2FjaGUgPSB7fQoKICAgIGRlZiBjb2VyY2VBdHRyaWJ1dGUoc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZHJvcFhtbG5zTG9jYWxOYW1lIGFuZCBuYW1lLnN0YXJ0c3dpdGgoInhtbG5zOiIpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZWdpbiB3aXRoIHhtbG5zIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsaWYgKHNlbGYuZHJvcFhtbG5zQXR0ck5zIGFuZAogICAgICAgICAgICAgIG5hbWVzcGFjZSA9PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQXR0cmlidXRlcyBjYW5ub3QgYmUgaW4gdGhlIHhtbCBuYW1lc3BhY2UiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9YbWxOYW1lKG5hbWUpCgogICAgZGVmIGNvZXJjZUVsZW1lbnQoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYudG9YbWxOYW1lKG5hbWUpCgogICAgZGVmIGNvZXJjZUNvbW1lbnQoc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgc2VsZi5wcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzOgogICAgICAgICAgICB3aGlsZSAiLS0iIGluIGRhdGE6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb21tZW50cyBjYW5ub3QgY29udGFpbiBhZGphY2VudCBkYXNoZXMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCItLSIsICItIC0iKQogICAgICAgICAgICBpZiBkYXRhLmVuZHN3aXRoKCItIik6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb21tZW50cyBjYW5ub3QgZW5kIGluIGEgZGFzaCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgIGRhdGEgKz0gIiAiCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgY29lcmNlQ2hhcmFjdGVycyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBzZWxmLnJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnM6CiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGRhdGEuY291bnQoIlx4MEMiKSk6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJUZXh0IGNhbm5vdCBjb250YWluIFUrMDAwQyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHgwQyIsICIgIikKICAgICAgICAjIE90aGVyIG5vbi14bWwgY2hhcmFjdGVycwogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGNvZXJjZVB1YmlkKHNlbGYsIGRhdGEpOgogICAgICAgIGRhdGFPdXRwdXQgPSBkYXRhCiAgICAgICAgZm9yIGNoYXIgaW4gbm9uUHViaWRDaGFyUmVnZXhwLmZpbmRhbGwoZGF0YSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgcHViaWQiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihjaGFyKQogICAgICAgICAgICBkYXRhT3V0cHV0ID0gZGF0YU91dHB1dC5yZXBsYWNlKGNoYXIsIHJlcGxhY2VtZW50KQogICAgICAgIGlmIHNlbGYucHJldmVudFNpbmdsZVF1b3RlUHViaWQgYW5kIGRhdGFPdXRwdXQuZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlB1YmlkIGNhbm5vdCBjb250YWluIHNpbmdsZSBxdW90ZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgZGF0YU91dHB1dCA9IGRhdGFPdXRwdXQucmVwbGFjZSgiJyIsIHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoIiciKSkKICAgICAgICByZXR1cm4gZGF0YU91dHB1dAoKICAgIGRlZiB0b1htbE5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgbmFtZUZpcnN0ID0gbmFtZVswXQogICAgICAgIG5hbWVSZXN0ID0gbmFtZVsxOl0KICAgICAgICBtID0gbm9uWG1sTmFtZUZpcnN0Qk1QUmVnZXhwLm1hdGNoKG5hbWVGaXJzdCkKICAgICAgICBpZiBtOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb2VyY2luZyBub24tWE1MIG5hbWUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIG5hbWVGaXJzdE91dHB1dCA9IHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIobmFtZUZpcnN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWVGaXJzdE91dHB1dCA9IG5hbWVGaXJzdAoKICAgICAgICBuYW1lUmVzdE91dHB1dCA9IG5hbWVSZXN0CiAgICAgICAgcmVwbGFjZUNoYXJzID0gc2V0KG5vblhtbE5hbWVCTVBSZWdleHAuZmluZGFsbChuYW1lUmVzdCkpCiAgICAgICAgZm9yIGNoYXIgaW4gcmVwbGFjZUNoYXJzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb2VyY2luZyBub24tWE1MIG5hbWUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihjaGFyKQogICAgICAgICAgICBuYW1lUmVzdE91dHB1dCA9IG5hbWVSZXN0T3V0cHV0LnJlcGxhY2UoY2hhciwgcmVwbGFjZW1lbnQpCiAgICAgICAgcmV0dXJuIG5hbWVGaXJzdE91dHB1dCArIG5hbWVSZXN0T3V0cHV0CgogICAgZGVmIGdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKHNlbGYsIGNoYXIpOgogICAgICAgIGlmIGNoYXIgaW4gc2VsZi5yZXBsYWNlQ2FjaGU6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5yZXBsYWNlQ2FjaGVbY2hhcl0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuZXNjYXBlQ2hhcihjaGFyKQogICAgICAgIHJldHVybiByZXBsYWNlbWVudAoKICAgIGRlZiBmcm9tWG1sTmFtZShzZWxmLCBuYW1lKToKICAgICAgICBmb3IgaXRlbSBpbiBzZXQoc2VsZi5yZXBsYWNlbWVudFJlZ2V4cC5maW5kYWxsKG5hbWUpKToKICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShpdGVtLCBzZWxmLnVuZXNjYXBlQ2hhcihpdGVtKSkKICAgICAgICByZXR1cm4gbmFtZQoKICAgIGRlZiBlc2NhcGVDaGFyKHNlbGYsIGNoYXIpOgogICAgICAgIHJlcGxhY2VtZW50ID0gIlUlMDVYIiAlIG9yZChjaGFyKQogICAgICAgIHNlbGYucmVwbGFjZUNhY2hlW2NoYXJdID0gcmVwbGFjZW1lbnQKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQKCiAgICBkZWYgdW5lc2NhcGVDaGFyKHNlbGYsIGNoYXJjb2RlKToKICAgICAgICByZXR1cm4gY2hyKGludChjaGFyY29kZVsxOl0sIDE2KSkKUEsDBBQAAAAAAAAAIQAeDG01FH8AABR/AAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19pbnB1dHN0cmVhbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZSwgYmluYXJ5X3R5cGUKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50LCB1cmxsaWIKCmltcG9ydCBjb2RlY3MKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB3ZWJlbmNvZGluZ3MKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgRU9GLCBzcGFjZUNoYXJhY3RlcnMsIGFzY2lpTGV0dGVycywgYXNjaWlVcHBlcmNhc2UKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBSZXBhcnNlRXhjZXB0aW9uCmZyb20gLiBpbXBvcnQgX3V0aWxzCgpmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKdHJ5OgogICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBCeXRlc0lPID0gU3RyaW5nSU8KCiMgTm9uLXVuaWNvZGUgdmVyc2lvbnMgb2YgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIHByZS1wYXJzZXIKc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgPSBmcm96ZW5zZXQoW2l0ZW0uZW5jb2RlKCJhc2NpaSIpIGZvciBpdGVtIGluIHNwYWNlQ2hhcmFjdGVyc10pCmFzY2lpTGV0dGVyc0J5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBhc2NpaUxldHRlcnNdKQphc2NpaVVwcGVyY2FzZUJ5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBhc2NpaVVwcGVyY2FzZV0pCnNwYWNlc0FuZ2xlQnJhY2tldHMgPSBzcGFjZUNoYXJhY3RlcnNCeXRlcyB8IGZyb3plbnNldChbYiI+IiwgYiI8Il0pCgoKaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZSA9ICJbXHUwMDAxLVx1MDAwOFx1MDAwQlx1MDAwRS1cdTAwMUZcdTAwN0YtXHUwMDlGXHVGREQwLVx1RkRFRlx1RkZGRVx1RkZGRlxVMDAwMUZGRkVcVTAwMDFGRkZGXFUwMDAyRkZGRVxVMDAwMkZGRkZcVTAwMDNGRkZFXFUwMDAzRkZGRlxVMDAwNEZGRkVcVTAwMDRGRkZGXFUwMDA1RkZGRVxVMDAwNUZGRkZcVTAwMDZGRkZFXFUwMDA2RkZGRlxVMDAwN0ZGRkVcVTAwMDdGRkZGXFUwMDA4RkZGRVxVMDAwOEZGRkZcVTAwMDlGRkZFXFUwMDA5RkZGRlxVMDAwQUZGRkVcVTAwMEFGRkZGXFUwMDBCRkZGRVxVMDAwQkZGRkZcVTAwMENGRkZFXFUwMDBDRkZGRlxVMDAwREZGRkVcVTAwMERGRkZGXFUwMDBFRkZGRVxVMDAwRUZGRkZcVTAwMEZGRkZFXFUwMDBGRkZGRlxVMDAxMEZGRkVcVTAwMTBGRkZGXSIgICMgbm9xYQoKaWYgX3V0aWxzLnN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlczoKICAgICMgVXNlIG9uZSBleHRyYSBzdGVwIG9mIGluZGlyZWN0aW9uIGFuZCBjcmVhdGUgc3Vycm9nYXRlcyB3aXRoCiAgICAjIGV2YWwuIE5vdCB1c2luZyB0aGlzIGluZGlyZWN0aW9uIHdvdWxkIGludHJvZHVjZSBhbiBpbGxlZ2FsCiAgICAjIHVuaWNvZGUgbGl0ZXJhbCBvbiBwbGF0Zm9ybXMgbm90IHN1cHBvcnRpbmcgc3VjaCBsb25lCiAgICAjIHN1cnJvZ2F0ZXMuCiAgICBhc3NlcnQgaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZVstMV0gPT0gIl0iIGFuZCBpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlLmNvdW50KCJdIikgPT0gMQogICAgaW52YWxpZF91bmljb2RlX3JlID0gcmUuY29tcGlsZShpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlWzotMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKCciXFx1RDgwMC1cXHVERkZGIicpICsgICMgcHlsaW50OmRpc2FibGU9ZXZhbC11c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIikKZWxzZToKICAgIGludmFsaWRfdW5pY29kZV9yZSA9IHJlLmNvbXBpbGUoaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZSkKCm5vbl9ibXBfaW52YWxpZF9jb2RlcG9pbnRzID0gc2V0KFsweDFGRkZFLCAweDFGRkZGLCAweDJGRkZFLCAweDJGRkZGLCAweDNGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGRiwgMHg0RkZGRSwgMHg0RkZGRiwgMHg1RkZGRSwgMHg1RkZGRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NkZGRkUsIDB4NkZGRkYsIDB4N0ZGRkUsIDB4N0ZGRkYsIDB4OEZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGRkZGLCAweDlGRkZFLCAweDlGRkZGLCAweEFGRkZFLCAweEFGRkZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCRkZGRSwgMHhCRkZGRiwgMHhDRkZGRSwgMHhDRkZGRiwgMHhERkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkYsIDB4RUZGRkUsIDB4RUZGRkYsIDB4RkZGRkUsIDB4RkZGRkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwRkZGRSwgMHgxMEZGRkZdKQoKYXNjaWlfcHVuY3R1YXRpb25fcmUgPSByZS5jb21waWxlKCJbXHUwMDA5LVx1MDAwRFx1MDAyMC1cdTAwMkZcdTAwM0EtXHUwMDQwXHUwMDVCLVx1MDA2MFx1MDA3Qi1cdTAwN0VdIikKCiMgQ2FjaGUgZm9yIGNoYXJzVW50aWwoKQpjaGFyc1VudGlsUmVnRXggPSB7fQoKCmNsYXNzIEJ1ZmZlcmVkU3RyZWFtKG9iamVjdCk6CiAgICAiIiJCdWZmZXJpbmcgZm9yIHN0cmVhbXMgdGhhdCBkbyBub3QgaGF2ZSBidWZmZXJpbmcgb2YgdGhlaXIgb3duCgogICAgVGhlIGJ1ZmZlciBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpc3Qgb2YgY2h1bmtzIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKICAgIGpvaW5pbmcgbWFueSBzdHJpbmdzIHdpbGwgYmUgc2xvdyBzaW5jZSBpdCBpcyBPKG4qKjIpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtKToKICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIHNlbGYuYnVmZmVyID0gW10KICAgICAgICBzZWxmLnBvc2l0aW9uID0gWy0xLCAwXSAgIyBjaHVuayBudW1iZXIsIG9mZnNldAoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgIHBvcyA9IDAKICAgICAgICBmb3IgY2h1bmsgaW4gc2VsZi5idWZmZXJbOnNlbGYucG9zaXRpb25bMF1dOgogICAgICAgICAgICBwb3MgKz0gbGVuKGNodW5rKQogICAgICAgIHBvcyArPSBzZWxmLnBvc2l0aW9uWzFdCiAgICAgICAgcmV0dXJuIHBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcyk6CiAgICAgICAgYXNzZXJ0IHBvcyA8PSBzZWxmLl9idWZmZXJlZEJ5dGVzKCkKICAgICAgICBvZmZzZXQgPSBwb3MKICAgICAgICBpID0gMAogICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZmZlcltpXSkgPCBvZmZzZXQ6CiAgICAgICAgICAgIG9mZnNldCAtPSBsZW4oc2VsZi5idWZmZXJbaV0pCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHNlbGYucG9zaXRpb24gPSBbaSwgb2Zmc2V0XQoKICAgIGRlZiByZWFkKHNlbGYsIGJ5dGVzKToKICAgICAgICBpZiBub3Qgc2VsZi5idWZmZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkU3RyZWFtKGJ5dGVzKQogICAgICAgIGVsaWYgKHNlbGYucG9zaXRpb25bMF0gPT0gbGVuKHNlbGYuYnVmZmVyKSBhbmQKICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uWzFdID09IGxlbihzZWxmLmJ1ZmZlclstMV0pKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRTdHJlYW0oYnl0ZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRGcm9tQnVmZmVyKGJ5dGVzKQoKICAgIGRlZiBfYnVmZmVyZWRCeXRlcyhzZWxmKToKICAgICAgICByZXR1cm4gc3VtKFtsZW4oaXRlbSkgZm9yIGl0ZW0gaW4gc2VsZi5idWZmZXJdKQoKICAgIGRlZiBfcmVhZFN0cmVhbShzZWxmLCBieXRlcyk6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLnJlYWQoYnl0ZXMpCiAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKGRhdGEpCiAgICAgICAgc2VsZi5wb3NpdGlvblswXSArPSAxCiAgICAgICAgc2VsZi5wb3NpdGlvblsxXSA9IGxlbihkYXRhKQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIF9yZWFkRnJvbUJ1ZmZlcihzZWxmLCBieXRlcyk6CiAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSBieXRlcwogICAgICAgIHJ2ID0gW10KICAgICAgICBidWZmZXJJbmRleCA9IHNlbGYucG9zaXRpb25bMF0KICAgICAgICBidWZmZXJPZmZzZXQgPSBzZWxmLnBvc2l0aW9uWzFdCiAgICAgICAgd2hpbGUgYnVmZmVySW5kZXggPCBsZW4oc2VsZi5idWZmZXIpIGFuZCByZW1haW5pbmdCeXRlcyAhPSAwOgogICAgICAgICAgICBhc3NlcnQgcmVtYWluaW5nQnl0ZXMgPiAwCiAgICAgICAgICAgIGJ1ZmZlcmVkRGF0YSA9IHNlbGYuYnVmZmVyW2J1ZmZlckluZGV4XQoKICAgICAgICAgICAgaWYgcmVtYWluaW5nQnl0ZXMgPD0gbGVuKGJ1ZmZlcmVkRGF0YSkgLSBidWZmZXJPZmZzZXQ6CiAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IHJlbWFpbmluZ0J5dGVzCiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2J1ZmZlckluZGV4LCBidWZmZXJPZmZzZXQgKyBieXRlc1RvUmVhZF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gbGVuKGJ1ZmZlcmVkRGF0YSkgLSBidWZmZXJPZmZzZXQKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBbYnVmZmVySW5kZXgsIGxlbihidWZmZXJlZERhdGEpXQogICAgICAgICAgICAgICAgYnVmZmVySW5kZXggKz0gMQogICAgICAgICAgICBydi5hcHBlbmQoYnVmZmVyZWREYXRhW2J1ZmZlck9mZnNldDpidWZmZXJPZmZzZXQgKyBieXRlc1RvUmVhZF0pCiAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzIC09IGJ5dGVzVG9SZWFkCgogICAgICAgICAgICBidWZmZXJPZmZzZXQgPSAwCgogICAgICAgIGlmIHJlbWFpbmluZ0J5dGVzOgogICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5fcmVhZFN0cmVhbShyZW1haW5pbmdCeXRlcykpCgogICAgICAgIHJldHVybiBiIiIuam9pbihydikKCgpkZWYgSFRNTElucHV0U3RyZWFtKHNvdXJjZSwgKiprd2FyZ3MpOgogICAgIyBXb3JrIGFyb3VuZCBQeXRob24gYnVnICMyMDAwNzogcmVhZCgwKSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCiAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDAwNwogICAgaWYgKGlzaW5zdGFuY2Uoc291cmNlLCBodHRwX2NsaWVudC5IVFRQUmVzcG9uc2UpIG9yCiAgICAgICAgIyBBbHNvIGNoZWNrIGZvciBhZGRpbmZvdXJsIHdyYXBwaW5nIEhUVFBSZXNwb25zZQogICAgICAgIChpc2luc3RhbmNlKHNvdXJjZSwgdXJsbGliLnJlc3BvbnNlLmFkZGJhc2UpIGFuZAogICAgICAgICBpc2luc3RhbmNlKHNvdXJjZS5mcCwgaHR0cF9jbGllbnQuSFRUUFJlc3BvbnNlKSkpOgogICAgICAgIGlzVW5pY29kZSA9IEZhbHNlCiAgICBlbGlmIGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgogICAgICAgIGlzVW5pY29kZSA9IGlzaW5zdGFuY2Uoc291cmNlLnJlYWQoMCksIHRleHRfdHlwZSkKICAgIGVsc2U6CiAgICAgICAgaXNVbmljb2RlID0gaXNpbnN0YW5jZShzb3VyY2UsIHRleHRfdHlwZSkKCiAgICBpZiBpc1VuaWNvZGU6CiAgICAgICAgZW5jb2RpbmdzID0gW3ggZm9yIHggaW4ga3dhcmdzIGlmIHguZW5kc3dpdGgoIl9lbmNvZGluZyIpXQogICAgICAgIGlmIGVuY29kaW5nczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3Qgc2V0IGFuIGVuY29kaW5nIHdpdGggYSB1bmljb2RlIGlucHV0LCBzZXQgJXIiICUgZW5jb2RpbmdzKQoKICAgICAgICByZXR1cm4gSFRNTFVuaWNvZGVJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKQogICAgZWxzZToKICAgICAgICByZXR1cm4gSFRNTEJpbmFyeUlucHV0U3RyZWFtKHNvdXJjZSwgKiprd2FyZ3MpCgoKY2xhc3MgSFRNTFVuaWNvZGVJbnB1dFN0cmVhbShvYmplY3QpOgogICAgIiIiUHJvdmlkZXMgYSB1bmljb2RlIHN0cmVhbSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBIVE1MVG9rZW5pemVyLgoKICAgIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYW5kIHJlbW92aW5nIG9yIHJlcGxhY2luZwogICAgaW5jb3JyZWN0IGJ5dGUtc2VxdWVuY2VzIGFuZCBhbHNvIHByb3ZpZGVzIGNvbHVtbiBhbmQgbGluZSB0cmFja2luZy4KCiAgICAiIiIKCiAgICBfZGVmYXVsdENodW5rU2l6ZSA9IDEwMjQwCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiSW5pdGlhbGlzZXMgdGhlIEhUTUxJbnB1dFN0cmVhbS4KCiAgICAgICAgSFRNTElucHV0U3RyZWFtKHNvdXJjZSwgW2VuY29kaW5nXSkgLT4gTm9ybWFsaXplZCBzdHJlYW0gZnJvbSBzb3VyY2UKICAgICAgICBmb3IgdXNlIGJ5IGh0bWw1bGliLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUtb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBfdXRpbHMuc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzOgogICAgICAgICAgICAjIFN1Y2ggcGxhdGZvcm1zIHdpbGwgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHN1Y2gKICAgICAgICAgICAgIyBzdXJyb2dhdGUgZXJyb3JzLCBzbyBubyBuZWVkIHRvIGRvIHRoaXMgY2hlY2tpbmcuCiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzID0gTm9uZQogICAgICAgIGVsaWYgbGVuKCJcVTAwMTBGRkZGIikgPT0gMToKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMgPSBzZWxmLmNoYXJhY3RlckVycm9yc1VDUzQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyA9IHNlbGYuY2hhcmFjdGVyRXJyb3JzVUNTMgoKICAgICAgICAjIExpc3Qgb2Ygd2hlcmUgbmV3IGxpbmVzIG9jY3VyCiAgICAgICAgc2VsZi5uZXdMaW5lcyA9IFswXQoKICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChsb29rdXBFbmNvZGluZygidXRmLTgiKSwgImNlcnRhaW4iKQogICAgICAgIHNlbGYuZGF0YVN0cmVhbSA9IHNlbGYub3BlblN0cmVhbShzb3VyY2UpCgogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmNodW5rID0gIiIKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IDAKICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gMAogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICAgICAgIyBudW1iZXIgb2YgKGNvbXBsZXRlKSBsaW5lcyBpbiBwcmV2aW91cyBjaHVua3MKICAgICAgICBzZWxmLnByZXZOdW1MaW5lcyA9IDAKICAgICAgICAjIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBsYXN0IGxpbmUgb2YgdGhlIHByZXZpb3VzIGNodW5rCiAgICAgICAgc2VsZi5wcmV2TnVtQ29scyA9IDAKCiAgICAgICAgIyBEZWFsIHdpdGggQ1IgTEYgYW5kIHN1cnJvZ2F0ZXMgc3BsaXQgb3ZlciBjaHVuayBib3VuZGFyaWVzCiAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBOb25lCgogICAgZGVmIG9wZW5TdHJlYW0oc2VsZiwgc291cmNlKToKICAgICAgICAiIiJQcm9kdWNlcyBhIGZpbGUgb2JqZWN0IGZyb20gc291cmNlLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUgb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgIiIiCiAgICAgICAgIyBBbHJlYWR5IGEgZmlsZSBvYmplY3QKICAgICAgICBpZiBoYXNhdHRyKHNvdXJjZSwgJ3JlYWQnKToKICAgICAgICAgICAgc3RyZWFtID0gc291cmNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oc291cmNlKQoKICAgICAgICByZXR1cm4gc3RyZWFtCgogICAgZGVmIF9wb3NpdGlvbihzZWxmLCBvZmZzZXQpOgogICAgICAgIGNodW5rID0gc2VsZi5jaHVuawogICAgICAgIG5MaW5lcyA9IGNodW5rLmNvdW50KCdcbicsIDAsIG9mZnNldCkKICAgICAgICBwb3NpdGlvbkxpbmUgPSBzZWxmLnByZXZOdW1MaW5lcyArIG5MaW5lcwogICAgICAgIGxhc3RMaW5lUG9zID0gY2h1bmsucmZpbmQoJ1xuJywgMCwgb2Zmc2V0KQogICAgICAgIGlmIGxhc3RMaW5lUG9zID09IC0xOgogICAgICAgICAgICBwb3NpdGlvbkNvbHVtbiA9IHNlbGYucHJldk51bUNvbHMgKyBvZmZzZXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBwb3NpdGlvbkNvbHVtbiA9IG9mZnNldCAtIChsYXN0TGluZVBvcyArIDEpCiAgICAgICAgcmV0dXJuIChwb3NpdGlvbkxpbmUsIHBvc2l0aW9uQ29sdW1uKQoKICAgIGRlZiBwb3NpdGlvbihzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIChsaW5lLCBjb2wpIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIiIiCiAgICAgICAgbGluZSwgY29sID0gc2VsZi5fcG9zaXRpb24oc2VsZi5jaHVua09mZnNldCkKICAgICAgICByZXR1cm4gKGxpbmUgKyAxLCBjb2wpCgogICAgZGVmIGNoYXIoc2VsZik6CiAgICAgICAgIiIiIFJlYWQgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0gb3IgcXVldWUgaWYgYXZhaWxhYmxlLiBSZXR1cm4KICAgICAgICAgICAgRU9GIHdoZW4gRU9GIGlzIHJlYWNoZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBSZWFkIGEgbmV3IGNodW5rIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpZiBuZWNlc3NhcnkKICAgICAgICBpZiBzZWxmLmNodW5rT2Zmc2V0ID49IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWFkQ2h1bmsoKToKICAgICAgICAgICAgICAgIHJldHVybiBFT0YKCiAgICAgICAgY2h1bmtPZmZzZXQgPSBzZWxmLmNodW5rT2Zmc2V0CiAgICAgICAgY2hhciA9IHNlbGYuY2h1bmtbY2h1bmtPZmZzZXRdCiAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IGNodW5rT2Zmc2V0ICsgMQoKICAgICAgICByZXR1cm4gY2hhcgoKICAgIGRlZiByZWFkQ2h1bmsoc2VsZiwgY2h1bmtTaXplPU5vbmUpOgogICAgICAgIGlmIGNodW5rU2l6ZSBpcyBOb25lOgogICAgICAgICAgICBjaHVua1NpemUgPSBzZWxmLl9kZWZhdWx0Q2h1bmtTaXplCgogICAgICAgIHNlbGYucHJldk51bUxpbmVzLCBzZWxmLnByZXZOdW1Db2xzID0gc2VsZi5fcG9zaXRpb24oc2VsZi5jaHVua1NpemUpCgogICAgICAgIHNlbGYuY2h1bmsgPSAiIgogICAgICAgIHNlbGYuY2h1bmtTaXplID0gMAogICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSAwCgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGFTdHJlYW0ucmVhZChjaHVua1NpemUpCgogICAgICAgICMgRGVhbCB3aXRoIENSIExGIGFuZCBzdXJyb2dhdGVzIGJyb2tlbiBhY3Jvc3MgY2h1bmtzCiAgICAgICAgaWYgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXI6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9idWZmZXJlZENoYXJhY3RlciArIGRhdGEKICAgICAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBOb25lCiAgICAgICAgZWxpZiBub3QgZGF0YToKICAgICAgICAgICAgIyBXZSBoYXZlIG5vIG1vcmUgZGF0YSwgYnllLWJ5ZSBzdHJlYW0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIGxlbihkYXRhKSA+IDE6CiAgICAgICAgICAgIGxhc3R2ID0gb3JkKGRhdGFbLTFdKQogICAgICAgICAgICBpZiBsYXN0diA9PSAweDBEIG9yIDB4RDgwMCA8PSBsYXN0diA8PSAweERCRkY6CiAgICAgICAgICAgICAgICBzZWxmLl9idWZmZXJlZENoYXJhY3RlciA9IGRhdGFbLTFdCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVs6LTFdCgogICAgICAgIGlmIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzOgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyhkYXRhKQoKICAgICAgICAjIFJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHJcbiIsICJcbiIpCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHIiLCAiXG4iKQoKICAgICAgICBzZWxmLmNodW5rID0gZGF0YQogICAgICAgIHNlbGYuY2h1bmtTaXplID0gbGVuKGRhdGEpCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNoYXJhY3RlckVycm9yc1VDUzQoc2VsZiwgZGF0YSk6CiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKGludmFsaWRfdW5pY29kZV9yZS5maW5kYWxsKGRhdGEpKSk6CiAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQoKICAgIGRlZiBjaGFyYWN0ZXJFcnJvcnNVQ1MyKHNlbGYsIGRhdGEpOgogICAgICAgICMgU29tZW9uZSBwaWNrZWQgdGhlIHdyb25nIGNvbXBpbGUgb3B0aW9uCiAgICAgICAgIyBZb3UgbG9zZQogICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgIGZvciBtYXRjaCBpbiBpbnZhbGlkX3VuaWNvZGVfcmUuZmluZGl0ZXIoZGF0YSk6CiAgICAgICAgICAgIGlmIHNraXA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb2RlcG9pbnQgPSBvcmQobWF0Y2guZ3JvdXAoKSkKICAgICAgICAgICAgcG9zID0gbWF0Y2guc3RhcnQoKQogICAgICAgICAgICAjIFByZXR0eSBzdXJlIHRoZXJlIHNob3VsZCBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlCiAgICAgICAgICAgIGlmIF91dGlscy5pc1N1cnJvZ2F0ZVBhaXIoZGF0YVtwb3M6cG9zICsgMl0pOgogICAgICAgICAgICAgICAgIyBXZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIhCiAgICAgICAgICAgICAgICBjaGFyX3ZhbCA9IF91dGlscy5zdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZGF0YVtwb3M6cG9zICsgMl0pCiAgICAgICAgICAgICAgICBpZiBjaGFyX3ZhbCBpbiBub25fYm1wX2ludmFsaWRfY29kZXBvaW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKICAgICAgICAgICAgICAgIHNraXAgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgKGNvZGVwb2ludCA+PSAweEQ4MDAgYW5kIGNvZGVwb2ludCA8PSAweERGRkYgYW5kCiAgICAgICAgICAgICAgICAgIHBvcyA9PSBsZW4oZGF0YSkgLSAxKToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKCiAgICBkZWYgY2hhcnNVbnRpbChzZWxmLCBjaGFyYWN0ZXJzLCBvcHBvc2l0ZT1GYWxzZSk6CiAgICAgICAgIiIiIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJlYW0gdXAgdG8gYnV0IG5vdAogICAgICAgIGluY2x1ZGluZyBhbnkgY2hhcmFjdGVyIGluICdjaGFyYWN0ZXJzJyBvciBFT0YuICdjaGFyYWN0ZXJzJyBtdXN0IGJlCiAgICAgICAgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyB0aGUgJ2luJyBtZXRob2QgYW5kIGl0ZXJhdGlvbiBvdmVyIGl0cwogICAgICAgIGNoYXJhY3RlcnMuCiAgICAgICAgIiIiCgogICAgICAgICMgVXNlIGEgY2FjaGUgb2YgcmVnZXhwcyB0byBmaW5kIHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGFycyA9IGNoYXJzVW50aWxSZWdFeFsoY2hhcmFjdGVycywgb3Bwb3NpdGUpXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgogICAgICAgICAgICAgICAgZm9yIGMgaW4gY2hhcmFjdGVyczoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQob3JkKGMpIDwgMTI4KQogICAgICAgICAgICByZWdleCA9ICIiLmpvaW4oWyJcXHglMDJ4IiAlIG9yZChjKSBmb3IgYyBpbiBjaGFyYWN0ZXJzXSkKICAgICAgICAgICAgaWYgbm90IG9wcG9zaXRlOgogICAgICAgICAgICAgICAgcmVnZXggPSAiXiVzIiAlIHJlZ2V4CiAgICAgICAgICAgIGNoYXJzID0gY2hhcnNVbnRpbFJlZ0V4WyhjaGFyYWN0ZXJzLCBvcHBvc2l0ZSldID0gcmUuY29tcGlsZSgiWyVzXSsiICUgcmVnZXgpCgogICAgICAgIHJ2ID0gW10KCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBGaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHByZWZpeAogICAgICAgICAgICBtID0gY2hhcnMubWF0Y2goc2VsZi5jaHVuaywgc2VsZi5jaHVua09mZnNldCkKICAgICAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBJZiBub3RoaW5nIG1hdGNoZWQsIGFuZCBpdCB3YXNuJ3QgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGNodW5rLAogICAgICAgICAgICAgICAgIyB0aGVuIHN0b3AKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtPZmZzZXQgIT0gc2VsZi5jaHVua1NpemU6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuZCA9IG0uZW5kKCkKICAgICAgICAgICAgICAgICMgSWYgbm90IHRoZSB3aG9sZSBjaHVuayBtYXRjaGVkLCByZXR1cm4gZXZlcnl0aGluZwogICAgICAgICAgICAgICAgIyB1cCB0byB0aGUgcGFydCB0aGF0IGRpZG4ndCBtYXRjaAogICAgICAgICAgICAgICAgaWYgZW5kICE9IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXQ6ZW5kXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gZW5kCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBJZiB0aGUgd2hvbGUgcmVtYWluZGVyIG9mIHRoZSBjaHVuayBtYXRjaGVkLAogICAgICAgICAgICAjIHVzZSBpdCBhbGwgYW5kIHJlYWQgdGhlIG5leHQgY2h1bmsKICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuY2h1bmtbc2VsZi5jaHVua09mZnNldDpdKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWFkQ2h1bmsoKToKICAgICAgICAgICAgICAgICMgUmVhY2hlZCBFT0YKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHIgPSAiIi5qb2luKHJ2KQogICAgICAgIHJldHVybiByCgogICAgZGVmIHVuZ2V0KHNlbGYsIGNoYXIpOgogICAgICAgICMgT25seSBvbmUgY2hhcmFjdGVyIGlzIGFsbG93ZWQgdG8gYmUgdW5nb3R0ZW4gYXQgb25jZSAtIGl0IG11c3QKICAgICAgICAjIGJlIGNvbnN1bWVkIGFnYWluIGJlZm9yZSBhbnkgZnVydGhlciBjYWxsIHRvIHVuZ2V0CiAgICAgICAgaWYgY2hhciBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5jaHVua09mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgIyB1bmdldCBpcyBjYWxsZWQgcXVpdGUgcmFyZWx5LCBzbyBpdCdzIGEgZ29vZCBpZGVhIHRvIGRvCiAgICAgICAgICAgICAgICAjIG1vcmUgd29yayBoZXJlIGlmIGl0IHNhdmVzIGEgYml0IG9mIHdvcmsgaW4gdGhlIGZyZXF1ZW50bHkKICAgICAgICAgICAgICAgICMgY2FsbGVkIGNoYXIgYW5kIGNoYXJzVW50aWwuCiAgICAgICAgICAgICAgICAjIFNvLCBqdXN0IHByZXBlbmQgdGhlIHVuZ290dGVuIGNoYXJhY3RlciBvbnRvIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAjIGNodW5rOgogICAgICAgICAgICAgICAgc2VsZi5jaHVuayA9IGNoYXIgKyBzZWxmLmNodW5rCiAgICAgICAgICAgICAgICBzZWxmLmNodW5rU2l6ZSArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmNodW5rT2Zmc2V0IC09IDEKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXRdID09IGNoYXIKCgpjbGFzcyBIVE1MQmluYXJ5SW5wdXRTdHJlYW0oSFRNTFVuaWNvZGVJbnB1dFN0cmVhbSk6CiAgICAiIiJQcm92aWRlcyBhIHVuaWNvZGUgc3RyZWFtIG9mIGNoYXJhY3RlcnMgdG8gdGhlIEhUTUxUb2tlbml6ZXIuCgogICAgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbmQgcmVtb3Zpbmcgb3IgcmVwbGFjaW5nCiAgICBpbmNvcnJlY3QgYnl0ZS1zZXF1ZW5jZXMgYW5kIGFsc28gcHJvdmlkZXMgY29sdW1uIGFuZCBsaW5lIHRyYWNraW5nLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIG92ZXJyaWRlX2VuY29kaW5nPU5vbmUsIHRyYW5zcG9ydF9lbmNvZGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZz1Ob25lLCBsaWtlbHlfZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBkZWZhdWx0X2VuY29kaW5nPSJ3aW5kb3dzLTEyNTIiLCB1c2VDaGFyZGV0PVRydWUpOgogICAgICAgICIiIkluaXRpYWxpc2VzIHRoZSBIVE1MSW5wdXRTdHJlYW0uCgogICAgICAgIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsIFtlbmNvZGluZ10pIC0+IE5vcm1hbGl6ZWQgc3RyZWFtIGZyb20gc291cmNlCiAgICAgICAgZm9yIHVzZSBieSBodG1sNWxpYi4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlLW9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgICIiIgogICAgICAgICMgUmF3IFN0cmVhbSAtIGZvciB1bmljb2RlIG9iamVjdHMgdGhpcyB3aWxsIGVuY29kZSB0byB1dGYtOCBhbmQgc2V0CiAgICAgICAgIyAgICAgICAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgYXMgYXBwcm9wcmlhdGUKICAgICAgICBzZWxmLnJhd1N0cmVhbSA9IHNlbGYub3BlblN0cmVhbShzb3VyY2UpCgogICAgICAgIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0uX19pbml0X18oc2VsZiwgc2VsZi5yYXdTdHJlYW0pCgogICAgICAgICMgRW5jb2RpbmcgSW5mb3JtYXRpb24KICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byB1c2Ugd2hlbiBsb29raW5nIGZvciBhIG1ldGEgZWxlbWVudCB3aXRoCiAgICAgICAgIyBlbmNvZGluZyBpbmZvcm1hdGlvbgogICAgICAgIHNlbGYubnVtQnl0ZXNNZXRhID0gMTAyNAogICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSB3aGVuIHVzaW5nIGRldGVjdGluZyBlbmNvZGluZyB1c2luZyBjaGFyZGV0CiAgICAgICAgc2VsZi5udW1CeXRlc0NoYXJkZXQgPSAxMDAKICAgICAgICAjIFRoaW5ncyBmcm9tIGFyZ3MKICAgICAgICBzZWxmLm92ZXJyaWRlX2VuY29kaW5nID0gb3ZlcnJpZGVfZW5jb2RpbmcKICAgICAgICBzZWxmLnRyYW5zcG9ydF9lbmNvZGluZyA9IHRyYW5zcG9ydF9lbmNvZGluZwogICAgICAgIHNlbGYuc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nID0gc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nCiAgICAgICAgc2VsZi5saWtlbHlfZW5jb2RpbmcgPSBsaWtlbHlfZW5jb2RpbmcKICAgICAgICBzZWxmLmRlZmF1bHRfZW5jb2RpbmcgPSBkZWZhdWx0X2VuY29kaW5nCgogICAgICAgICMgRGV0ZXJtaW5lIGVuY29kaW5nCiAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSBzZWxmLmRldGVybWluZUVuY29kaW5nKHVzZUNoYXJkZXQpCiAgICAgICAgYXNzZXJ0IHNlbGYuY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lCgogICAgICAgICMgQ2FsbCBzdXBlcmNsYXNzCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuZGF0YVN0cmVhbSA9IHNlbGYuY2hhckVuY29kaW5nWzBdLmNvZGVjX2luZm8uc3RyZWFtcmVhZGVyKHNlbGYucmF3U3RyZWFtLCAncmVwbGFjZScpCiAgICAgICAgSFRNTFVuaWNvZGVJbnB1dFN0cmVhbS5yZXNldChzZWxmKQoKICAgIGRlZiBvcGVuU3RyZWFtKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiUHJvZHVjZXMgYSBmaWxlIG9iamVjdCBmcm9tIHNvdXJjZS4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgICMgQWxyZWFkeSBhIGZpbGUgb2JqZWN0CiAgICAgICAgaWYgaGFzYXR0cihzb3VyY2UsICdyZWFkJyk6CiAgICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0cmVhbSA9IEJ5dGVzSU8oc291cmNlKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0cmVhbS5zZWVrKHN0cmVhbS50ZWxsKCkpCiAgICAgICAgZXhjZXB0OiAgIyBweWxpbnQ6ZGlzYWJsZT1iYXJlLWV4Y2VwdAogICAgICAgICAgICBzdHJlYW0gPSBCdWZmZXJlZFN0cmVhbShzdHJlYW0pCgogICAgICAgIHJldHVybiBzdHJlYW0KCiAgICBkZWYgZGV0ZXJtaW5lRW5jb2Rpbmcoc2VsZiwgY2hhcmRldD1UcnVlKToKICAgICAgICAjIEJPTXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZXZlcnl0aGluZwogICAgICAgICMgVGhpcyB3aWxsIGFsc28gcmVhZCBwYXN0IHRoZSBCT00gaWYgcHJlc2VudAogICAgICAgIGNoYXJFbmNvZGluZyA9IHNlbGYuZGV0ZWN0Qk9NKCksICJjZXJ0YWluIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIElmIHdlJ3ZlIGJlZW4gb3ZlcnJpZGVuLCB3ZSd2ZSBiZWVuIG92ZXJyaWRlbgogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYub3ZlcnJpZGVfZW5jb2RpbmcpLCAiY2VydGFpbiIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBOb3cgY2hlY2sgdGhlIHRyYW5zcG9ydCBsYXllcgogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYudHJhbnNwb3J0X2VuY29kaW5nKSwgImNlcnRhaW4iCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgTG9vayBmb3IgbWV0YSBlbGVtZW50cyB3aXRoIGVuY29kaW5nIGluZm9ybWF0aW9uCiAgICAgICAgY2hhckVuY29kaW5nID0gc2VsZi5kZXRlY3RFbmNvZGluZ01ldGEoKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBQYXJlbnQgZG9jdW1lbnQgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLnNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lIGFuZCBub3QgY2hhckVuY29kaW5nWzBdLm5hbWUuc3RhcnRzd2l0aCgidXRmLTE2Iik6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyAibGlrZWx5IiBlbmNvZGluZwogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYubGlrZWx5X2VuY29kaW5nKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBHdWVzcyB3aXRoIGNoYXJkZXQsIGlmIGF2YWlsYWJsZQogICAgICAgIGlmIGNoYXJkZXQ6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyb20gY2hhcmRldC51bml2ZXJzYWxkZXRlY3RvciBpbXBvcnQgVW5pdmVyc2FsRGV0ZWN0b3IKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmZmVycyA9IFtdCiAgICAgICAgICAgICAgICBkZXRlY3RvciA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBkZXRlY3Rvci5kb25lOgogICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNlbGYucmF3U3RyZWFtLnJlYWQoc2VsZi5udW1CeXRlc0NoYXJkZXQpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVmZmVyLCBieXRlcykKICAgICAgICAgICAgICAgICAgICBpZiBub3QgYnVmZmVyOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICBkZXRlY3Rvci5mZWVkKGJ1ZmZlcikKICAgICAgICAgICAgICAgIGRldGVjdG9yLmNsb3NlKCkKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbG9va3VwRW5jb2RpbmcoZGV0ZWN0b3IucmVzdWx0WydlbmNvZGluZyddKQogICAgICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCAidGVudGF0aXZlIgoKICAgICAgICAjIFRyeSB0aGUgZGVmYXVsdCBlbmNvZGluZwogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYuZGVmYXVsdF9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgRmFsbGJhY2sgdG8gaHRtbDVsaWIncyBkZWZhdWx0IGlmIGV2ZW4gdGhhdCBoYXNuJ3Qgd29ya2VkCiAgICAgICAgcmV0dXJuIGxvb2t1cEVuY29kaW5nKCJ3aW5kb3dzLTEyNTIiKSwgInRlbnRhdGl2ZSIKCiAgICBkZWYgY2hhbmdlRW5jb2Rpbmcoc2VsZiwgbmV3RW5jb2RpbmcpOgogICAgICAgIGFzc2VydCBzZWxmLmNoYXJFbmNvZGluZ1sxXSAhPSAiY2VydGFpbiIKICAgICAgICBuZXdFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKG5ld0VuY29kaW5nKQogICAgICAgIGlmIG5ld0VuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5ld0VuY29kaW5nLm5hbWUgaW4gKCJ1dGYtMTZiZSIsICJ1dGYtMTZsZSIpOgogICAgICAgICAgICBuZXdFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKCJ1dGYtOCIpCiAgICAgICAgICAgIGFzc2VydCBuZXdFbmNvZGluZyBpcyBub3QgTm9uZQogICAgICAgIGVsaWYgbmV3RW5jb2RpbmcgPT0gc2VsZi5jaGFyRW5jb2RpbmdbMF06CiAgICAgICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gKHNlbGYuY2hhckVuY29kaW5nWzBdLCAiY2VydGFpbiIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChuZXdFbmNvZGluZywgImNlcnRhaW4iKQogICAgICAgICAgICBzZWxmLnJlc2V0KCkKICAgICAgICAgICAgcmFpc2UgUmVwYXJzZUV4Y2VwdGlvbigiRW5jb2RpbmcgY2hhbmdlZCBmcm9tICVzIHRvICVzIiAlIChzZWxmLmNoYXJFbmNvZGluZ1swXSwgbmV3RW5jb2RpbmcpKQoKICAgIGRlZiBkZXRlY3RCT00oc2VsZik6CiAgICAgICAgIiIiQXR0ZW1wdHMgdG8gZGV0ZWN0IGF0IEJPTSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4gSWYKICAgICAgICBhbiBlbmNvZGluZyBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBCT00gcmV0dXJuIHRoZSBuYW1lIG9mIHRoZQogICAgICAgIGVuY29kaW5nIG90aGVyd2lzZSByZXR1cm4gTm9uZSIiIgogICAgICAgIGJvbURpY3QgPSB7CiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGODogJ3V0Zi04JywKICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYxNl9MRTogJ3V0Zi0xNmxlJywgY29kZWNzLkJPTV9VVEYxNl9CRTogJ3V0Zi0xNmJlJywKICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYzMl9MRTogJ3V0Zi0zMmxlJywgY29kZWNzLkJPTV9VVEYzMl9CRTogJ3V0Zi0zMmJlJwogICAgICAgIH0KCiAgICAgICAgIyBHbyB0byBiZWdpbm5pbmcgb2YgZmlsZSBhbmQgcmVhZCBpbiA0IGJ5dGVzCiAgICAgICAgc3RyaW5nID0gc2VsZi5yYXdTdHJlYW0ucmVhZCg0KQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0cmluZywgYnl0ZXMpCgogICAgICAgICMgVHJ5IGRldGVjdGluZyB0aGUgQk9NIHVzaW5nIGJ5dGVzIGZyb20gdGhlIHN0cmluZwogICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nWzozXSkgICAgICAgICAjIFVURi04CiAgICAgICAgc2VlayA9IDMKICAgICAgICBpZiBub3QgZW5jb2Rpbmc6CiAgICAgICAgICAgICMgTmVlZCB0byBkZXRlY3QgVVRGLTMyIGJlZm9yZSBVVEYtMTYKICAgICAgICAgICAgZW5jb2RpbmcgPSBib21EaWN0LmdldChzdHJpbmcpICAgICAgICAgIyBVVEYtMzIKICAgICAgICAgICAgc2VlayA9IDQKICAgICAgICAgICAgaWYgbm90IGVuY29kaW5nOgogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBib21EaWN0LmdldChzdHJpbmdbOjJdKSAgIyBVVEYtMTYKICAgICAgICAgICAgICAgIHNlZWsgPSAyCgogICAgICAgICMgU2V0IHRoZSByZWFkIHBvc2l0aW9uIHBhc3QgdGhlIEJPTSBpZiBvbmUgd2FzIGZvdW5kLCBvdGhlcndpc2UKICAgICAgICAjIHNldCBpdCB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbQogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKHNlZWspCiAgICAgICAgICAgIHJldHVybiBsb29rdXBFbmNvZGluZyhlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGRldGVjdEVuY29kaW5nTWV0YShzZWxmKToKICAgICAgICAiIiJSZXBvcnQgdGhlIGVuY29kaW5nIGRlY2xhcmVkIGJ5IHRoZSBtZXRhIGVsZW1lbnQKICAgICAgICAiIiIKICAgICAgICBidWZmZXIgPSBzZWxmLnJhd1N0cmVhbS5yZWFkKHNlbGYubnVtQnl0ZXNNZXRhKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1ZmZlciwgYnl0ZXMpCiAgICAgICAgcGFyc2VyID0gRW5jb2RpbmdQYXJzZXIoYnVmZmVyKQogICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICBlbmNvZGluZyA9IHBhcnNlci5nZXRFbmNvZGluZygpCgogICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lIGFuZCBlbmNvZGluZy5uYW1lIGluICgidXRmLTE2YmUiLCAidXRmLTE2bGUiKToKICAgICAgICAgICAgZW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZygidXRmLTgiKQoKICAgICAgICByZXR1cm4gZW5jb2RpbmcKCgpjbGFzcyBFbmNvZGluZ0J5dGVzKGJ5dGVzKToKICAgICIiIlN0cmluZy1saWtlIG9iamVjdCB3aXRoIGFuIGFzc29jaWF0ZWQgcG9zaXRpb24gYW5kIHZhcmlvdXMgZXh0cmEgbWV0aG9kcwogICAgSWYgdGhlIHBvc2l0aW9uIGlzIGV2ZXIgZ3JlYXRlciB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoIHRoZW4gYW4gZXhjZXB0aW9uIGlzCiAgICByYWlzZWQiIiIKICAgIGRlZiBfX25ld19fKHNlbGYsIHZhbHVlKToKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpCiAgICAgICAgcmV0dXJuIGJ5dGVzLl9fbmV3X18oc2VsZiwgdmFsdWUubG93ZXIoKSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSAtMQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICBwID0gc2VsZi5fcG9zaXRpb24gPSBzZWxmLl9wb3NpdGlvbiArIDEKICAgICAgICBpZiBwID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsaWYgcCA8IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgogICAgICAgIHJldHVybiBzZWxmW3A6cCArIDFdCgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIyBQeTIgY29tcGF0CiAgICAgICAgcmV0dXJuIHNlbGYuX19uZXh0X18oKQoKICAgIGRlZiBwcmV2aW91cyhzZWxmKToKICAgICAgICBwID0gc2VsZi5fcG9zaXRpb24KICAgICAgICBpZiBwID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsaWYgcCA8IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcCA9IHAgLSAxCiAgICAgICAgcmV0dXJuIHNlbGZbcDpwICsgMV0KCiAgICBkZWYgc2V0UG9zaXRpb24oc2VsZiwgcG9zaXRpb24pOgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcG9zaXRpb24KCiAgICBkZWYgZ2V0UG9zaXRpb24oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPj0gbGVuKHNlbGYpOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPj0gMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBwb3NpdGlvbiA9IHByb3BlcnR5KGdldFBvc2l0aW9uLCBzZXRQb3NpdGlvbikKCiAgICBkZWYgZ2V0Q3VycmVudEJ5dGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGZbc2VsZi5wb3NpdGlvbjpzZWxmLnBvc2l0aW9uICsgMV0KCiAgICBjdXJyZW50Qnl0ZSA9IHByb3BlcnR5KGdldEN1cnJlbnRCeXRlKQoKICAgIGRlZiBza2lwKHNlbGYsIGNoYXJzPXNwYWNlQ2hhcmFjdGVyc0J5dGVzKToKICAgICAgICAiIiJTa2lwIHBhc3QgYSBsaXN0IG9mIGNoYXJhY3RlcnMiIiIKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbiAgICAgICAgICAgICAgICMgdXNlIHByb3BlcnR5IGZvciB0aGUgZXJyb3ItY2hlY2tpbmcKICAgICAgICB3aGlsZSBwIDwgbGVuKHNlbGYpOgogICAgICAgICAgICBjID0gc2VsZltwOnAgKyAxXQogICAgICAgICAgICBpZiBjIG5vdCBpbiBjaGFyczoKICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgICAgcCArPSAxCiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgc2tpcFVudGlsKHNlbGYsIGNoYXJzKToKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbgogICAgICAgIHdoaWxlIHAgPCBsZW4oc2VsZik6CiAgICAgICAgICAgIGMgPSBzZWxmW3A6cCArIDFdCiAgICAgICAgICAgIGlmIGMgaW4gY2hhcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICAgICAgICAgIHJldHVybiBjCiAgICAgICAgICAgIHAgKz0gMQogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIG1hdGNoQnl0ZXMoc2VsZiwgYnl0ZXMpOgogICAgICAgICIiIkxvb2sgZm9yIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaW5nLiBJZiB0aGUgYnl0ZXMKICAgICAgICBhcmUgZm91bmQgcmV0dXJuIFRydWUgYW5kIGFkdmFuY2UgdGhlIHBvc2l0aW9uIHRvIHRoZSBieXRlIGFmdGVyIHRoZQogICAgICAgIG1hdGNoLiBPdGhlcndpc2UgcmV0dXJuIEZhbHNlIGFuZCBsZWF2ZSB0aGUgcG9zaXRpb24gYWxvbmUiIiIKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbgogICAgICAgIGRhdGEgPSBzZWxmW3A6cCArIGxlbihieXRlcyldCiAgICAgICAgcnYgPSBkYXRhLnN0YXJ0c3dpdGgoYnl0ZXMpCiAgICAgICAgaWYgcnY6CiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ5dGVzKQogICAgICAgIHJldHVybiBydgoKICAgIGRlZiBqdW1wVG8oc2VsZiwgYnl0ZXMpOgogICAgICAgICIiIkxvb2sgZm9yIHRoZSBuZXh0IHNlcXVlbmNlIG9mIGJ5dGVzIG1hdGNoaW5nIGEgZ2l2ZW4gc2VxdWVuY2UuIElmCiAgICAgICAgYSBtYXRjaCBpcyBmb3VuZCBhZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgbGFzdCBieXRlIG9mIHRoZSBtYXRjaCIiIgogICAgICAgIG5ld1Bvc2l0aW9uID0gc2VsZltzZWxmLnBvc2l0aW9uOl0uZmluZChieXRlcykKICAgICAgICBpZiBuZXdQb3NpdGlvbiA+IC0xOgogICAgICAgICAgICAjIFhYWDogVGhpcyBpcyB1Z2x5LCBidXQgSSBjYW4ndCBzZWUgYSBuaWNlciB3YXkgdG8gZml4IHRoaXMuCiAgICAgICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID09IC0xOgogICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSAwCiAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uICs9IChuZXdQb3NpdGlvbiArIGxlbihieXRlcykgLSAxKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCgpjbGFzcyBFbmNvZGluZ1BhcnNlcihvYmplY3QpOgogICAgIiIiTWluaSBwYXJzZXIgZm9yIGRldGVjdGluZyBjaGFyYWN0ZXIgZW5jb2RpbmcgZnJvbSBtZXRhIGVsZW1lbnRzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICIiInN0cmluZyAtIHRoZSBkYXRhIHRvIHdvcmsgb24gZm9yIGVuY29kaW5nIGRldGVjdGlvbiIiIgogICAgICAgIHNlbGYuZGF0YSA9IEVuY29kaW5nQnl0ZXMoZGF0YSkKICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQoKICAgIGRlZiBnZXRFbmNvZGluZyhzZWxmKToKICAgICAgICBtZXRob2REaXNwYXRjaCA9ICgKICAgICAgICAgICAgKGIiPCEtLSIsIHNlbGYuaGFuZGxlQ29tbWVudCksCiAgICAgICAgICAgIChiIjxtZXRhIiwgc2VsZi5oYW5kbGVNZXRhKSwKICAgICAgICAgICAgKGIiPC8iLCBzZWxmLmhhbmRsZVBvc3NpYmxlRW5kVGFnKSwKICAgICAgICAgICAgKGIiPCEiLCBzZWxmLmhhbmRsZU90aGVyKSwKICAgICAgICAgICAgKGIiPD8iLCBzZWxmLmhhbmRsZU90aGVyKSwKICAgICAgICAgICAgKGIiPCIsIHNlbGYuaGFuZGxlUG9zc2libGVTdGFydFRhZykpCiAgICAgICAgZm9yIF8gaW4gc2VsZi5kYXRhOgogICAgICAgICAgICBrZWVwUGFyc2luZyA9IFRydWUKICAgICAgICAgICAgZm9yIGtleSwgbWV0aG9kIGluIG1ldGhvZERpc3BhdGNoOgogICAgICAgICAgICAgICAgaWYgc2VsZi5kYXRhLm1hdGNoQnl0ZXMoa2V5KToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBQYXJzaW5nID0gbWV0aG9kKCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAga2VlcFBhcnNpbmcgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBub3Qga2VlcFBhcnNpbmc6CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGluZwoKICAgIGRlZiBoYW5kbGVDb21tZW50KHNlbGYpOgogICAgICAgICIiIlNraXAgb3ZlciBjb21tZW50cyIiIgogICAgICAgIHJldHVybiBzZWxmLmRhdGEuanVtcFRvKGIiLS0+IikKCiAgICBkZWYgaGFuZGxlTWV0YShzZWxmKToKICAgICAgICBpZiBzZWxmLmRhdGEuY3VycmVudEJ5dGUgbm90IGluIHNwYWNlQ2hhcmFjdGVyc0J5dGVzOgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgPG1ldGEgbm90IGZvbGxvd2VkIGJ5IGEgc3BhY2Ugc28ganVzdCBrZWVwIGdvaW5nCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIyBXZSBoYXZlIGEgdmFsaWQgbWV0YSBlbGVtZW50IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBhdHRyaWJ1dGVzCiAgICAgICAgaGFzUHJhZ21hID0gRmFsc2UKICAgICAgICBwZW5kaW5nRW5jb2RpbmcgPSBOb25lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgdG8gZmluZCB0aGUgbmV4dCBhdHRyaWJ1dGUgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24KICAgICAgICAgICAgYXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlKCkKICAgICAgICAgICAgaWYgYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGF0dHJbMF0gPT0gYiJodHRwLWVxdWl2IjoKICAgICAgICAgICAgICAgICAgICBoYXNQcmFnbWEgPSBhdHRyWzFdID09IGIiY29udGVudC10eXBlIgogICAgICAgICAgICAgICAgICAgIGlmIGhhc1ByYWdtYSBhbmQgcGVuZGluZ0VuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gcGVuZGluZ0VuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBhdHRyWzBdID09IGIiY2hhcnNldCI6CiAgICAgICAgICAgICAgICAgICAgdGVudGF0aXZlRW5jb2RpbmcgPSBhdHRyWzFdCiAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXBFbmNvZGluZyh0ZW50YXRpdmVFbmNvZGluZykKICAgICAgICAgICAgICAgICAgICBpZiBjb2RlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGNvZGVjCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBhdHRyWzBdID09IGIiY29udGVudCI6CiAgICAgICAgICAgICAgICAgICAgY29udGVudFBhcnNlciA9IENvbnRlbnRBdHRyUGFyc2VyKEVuY29kaW5nQnl0ZXMoYXR0clsxXSkpCiAgICAgICAgICAgICAgICAgICAgdGVudGF0aXZlRW5jb2RpbmcgPSBjb250ZW50UGFyc2VyLnBhcnNlKCkKICAgICAgICAgICAgICAgICAgICBpZiB0ZW50YXRpdmVFbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXBFbmNvZGluZyh0ZW50YXRpdmVFbmNvZGluZykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNQcmFnbWE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGNvZGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdFbmNvZGluZyA9IGNvZGVjCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlU3RhcnRUYWcoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlUG9zc2libGVUYWcoRmFsc2UpCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlRW5kVGFnKHNlbGYpOgogICAgICAgIG5leHQoc2VsZi5kYXRhKQogICAgICAgIHJldHVybiBzZWxmLmhhbmRsZVBvc3NpYmxlVGFnKFRydWUpCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlVGFnKHNlbGYsIGVuZFRhZyk6CiAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQogICAgICAgIGlmIGRhdGEuY3VycmVudEJ5dGUgbm90IGluIGFzY2lpTGV0dGVyc0J5dGVzOgogICAgICAgICAgICAjIElmIHRoZSBuZXh0IGJ5dGUgaXMgbm90IGFuIGFzY2lpIGxldHRlciBlaXRoZXIgaWdub3JlIHRoaXMKICAgICAgICAgICAgIyBmcmFnbWVudCAocG9zc2libGUgc3RhcnQgdGFnIGNhc2UpIG9yIHRyZWF0IGl0IGFjY29yZGluZyB0bwogICAgICAgICAgICAjIGhhbmRsZU90aGVyCiAgICAgICAgICAgIGlmIGVuZFRhZzoKICAgICAgICAgICAgICAgIGRhdGEucHJldmlvdXMoKQogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVPdGhlcigpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGMgPSBkYXRhLnNraXBVbnRpbChzcGFjZXNBbmdsZUJyYWNrZXRzKQogICAgICAgIGlmIGMgPT0gYiI8IjoKICAgICAgICAgICAgIyByZXR1cm4gdG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIG92ZXJhbGwgInR3byBzdGVwIiBhbGdvcml0aG0KICAgICAgICAgICAgIyByZXByb2Nlc3NpbmcgdGhlIDwgYnl0ZQogICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFJlYWQgYWxsIGF0dHJpYnV0ZXMKICAgICAgICAgICAgYXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlKCkKICAgICAgICAgICAgd2hpbGUgYXR0ciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaGFuZGxlT3RoZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5qdW1wVG8oYiI+IikKCiAgICBkZWYgZ2V0QXR0cmlidXRlKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIG5hbWUsdmFsdWUgcGFpciBmb3IgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0sCiAgICAgICAgaWYgb25lIGlzIGZvdW5kLCBvciBOb25lIiIiCiAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQogICAgICAgICMgU3RlcCAxIChza2lwIGNoYXJzKQogICAgICAgIGMgPSBkYXRhLnNraXAoc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgfCBmcm96ZW5zZXQoW2IiLyJdKSkKICAgICAgICBhc3NlcnQgYyBpcyBOb25lIG9yIGxlbihjKSA9PSAxCiAgICAgICAgIyBTdGVwIDIKICAgICAgICBpZiBjIGluIChiIj4iLCBOb25lKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIFN0ZXAgMwogICAgICAgIGF0dHJOYW1lID0gW10KICAgICAgICBhdHRyVmFsdWUgPSBbXQogICAgICAgICMgU3RlcCA0IGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgaWYgYyA9PSBiIj0iIGFuZCBhdHRyTmFtZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgYyBpbiBzcGFjZUNoYXJhY3RlcnNCeXRlczoKICAgICAgICAgICAgICAgICMgU3RlcCA2IQogICAgICAgICAgICAgICAgYyA9IGRhdGEuc2tpcCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGMgaW4gKGIiLyIsIGIiPiIpOgogICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiCiAgICAgICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKGMpCiAgICAgICAgICAgICMgU3RlcCA1CiAgICAgICAgICAgIGMgPSBuZXh0KGRhdGEpCiAgICAgICAgIyBTdGVwIDcKICAgICAgICBpZiBjICE9IGIiPSI6CiAgICAgICAgICAgIGRhdGEucHJldmlvdXMoKQogICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIKICAgICAgICAjIFN0ZXAgOAogICAgICAgIG5leHQoZGF0YSkKICAgICAgICAjIFN0ZXAgOQogICAgICAgIGMgPSBkYXRhLnNraXAoKQogICAgICAgICMgU3RlcCAxMAogICAgICAgIGlmIGMgaW4gKGIiJyIsIGInIicpOgogICAgICAgICAgICAjIDEwLjEKICAgICAgICAgICAgcXVvdGVDaGFyID0gYwogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIyAxMC4yCiAgICAgICAgICAgICAgICBjID0gbmV4dChkYXRhKQogICAgICAgICAgICAgICAgIyAxMC4zCiAgICAgICAgICAgICAgICBpZiBjID09IHF1b3RlQ2hhcjoKICAgICAgICAgICAgICAgICAgICBuZXh0KGRhdGEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiLmpvaW4oYXR0clZhbHVlKQogICAgICAgICAgICAgICAgIyAxMC40CiAgICAgICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgICAgICMgMTAuNQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCiAgICAgICAgZWxpZiBjID09IGIiPiI6CiAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIgogICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICBlbGlmIGMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCiAgICAgICAgIyBTdGVwIDExCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgYyA9IG5leHQoZGF0YSkKICAgICAgICAgICAgaWYgYyBpbiBzcGFjZXNBbmdsZUJyYWNrZXRzOgogICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiLmpvaW4oYXR0clZhbHVlKQogICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYy5sb3dlcigpKQogICAgICAgICAgICBlbGlmIGMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCgoKY2xhc3MgQ29udGVudEF0dHJQYXJzZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCBieXRlcykKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCgogICAgZGVmIHBhcnNlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgYXR0ciBuYW1lIGlzIGNoYXJzZXQKICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuZGF0YS5qdW1wVG8oYiJjaGFyc2V0IikKICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgc2VsZi5kYXRhLnNraXAoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kYXRhLmN1cnJlbnRCeXRlID09IGIiPSI6CiAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vID0gc2lnbiBrZWVwIGxvb2tpbmcgZm9yIGF0dHJzCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLmRhdGEucG9zaXRpb24gKz0gMQogICAgICAgICAgICBzZWxmLmRhdGEuc2tpcCgpCiAgICAgICAgICAgICMgTG9vayBmb3IgYW4gZW5jb2RpbmcgYmV0d2VlbiBtYXRjaGluZyBxdW90ZSBtYXJrcwogICAgICAgICAgICBpZiBzZWxmLmRhdGEuY3VycmVudEJ5dGUgaW4gKGInIicsIGIiJyIpOgogICAgICAgICAgICAgICAgcXVvdGVNYXJrID0gc2VsZi5kYXRhLmN1cnJlbnRCeXRlCiAgICAgICAgICAgICAgICBzZWxmLmRhdGEucG9zaXRpb24gKz0gMQogICAgICAgICAgICAgICAgb2xkUG9zaXRpb24gPSBzZWxmLmRhdGEucG9zaXRpb24KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGF0YS5qdW1wVG8ocXVvdGVNYXJrKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOnNlbGYuZGF0YS5wb3NpdGlvbl0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVW5xdW90ZWQgdmFsdWUKICAgICAgICAgICAgICAgIG9sZFBvc2l0aW9uID0gc2VsZi5kYXRhLnBvc2l0aW9uCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnNraXBVbnRpbChzcGFjZUNoYXJhY3RlcnNCeXRlcykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOnNlbGYuZGF0YS5wb3NpdGlvbl0KICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgICAgICMgUmV0dXJuIHRoZSB3aG9sZSByZW1haW5pbmcgdmFsdWUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOl0KICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgbG9va3VwRW5jb2RpbmcoZW5jb2RpbmcpOgogICAgIiIiUmV0dXJuIHRoZSBweXRob24gY29kZWMgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuIGVuY29kaW5nIG9yIE5vbmUgaWYgdGhlCiAgICBzdHJpbmcgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgZW5jb2RpbmcuIiIiCiAgICBpZiBpc2luc3RhbmNlKGVuY29kaW5nLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmRlY29kZSgiYXNjaWkiKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gd2ViZW5jb2RpbmdzLmxvb2t1cChlbmNvZGluZykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEAxEZqFiQrAQAkKwEAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdG9rZW5pemVyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdW5pY2hyIGFzIGNocgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgc3BhY2VDaGFyYWN0ZXJzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgZW50aXRpZXMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBhc2NpaUxldHRlcnMsIGFzY2lpVXBwZXIyTG93ZXIKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBkaWdpdHMsIGhleERpZ2l0cywgRU9GCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgdG9rZW5UeXBlcywgdGFnVG9rZW5UeXBlcwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHJlcGxhY2VtZW50Q2hhcmFjdGVycwoKZnJvbSAuX2lucHV0c3RyZWFtIGltcG9ydCBIVE1MSW5wdXRTdHJlYW0KCmZyb20gLl90cmllIGltcG9ydCBUcmllCgplbnRpdGllc1RyaWUgPSBUcmllKGVudGl0aWVzKQoKCmNsYXNzIEhUTUxUb2tlbml6ZXIob2JqZWN0KToKICAgICIiIiBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgdG9rZW5pemluZyBIVE1MLgoKICAgICogc2VsZi5jdXJyZW50VG9rZW4KICAgICAgSG9sZHMgdGhlIHRva2VuIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KCiAgICAqIHNlbGYuc3RhdGUKICAgICAgSG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIG1ldGhvZCB0byBiZSBpbnZva2VkLi4uIFhYWAoKICAgICogc2VsZi5zdHJlYW0KICAgICAgUG9pbnRzIHRvIEhUTUxJbnB1dFN0cmVhbSBvYmplY3QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBwYXJzZXI9Tm9uZSwgKiprd2FyZ3MpOgoKICAgICAgICBzZWxmLnN0cmVhbSA9IEhUTUxJbnB1dFN0cmVhbShzdHJlYW0sICoqa3dhcmdzKQogICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCgogICAgICAgICMgU2V0dXAgdGhlIGluaXRpYWwgdG9rZW5pemVyIHN0YXRlCiAgICAgICAgc2VsZi5lc2NhcGVGbGFnID0gRmFsc2UKICAgICAgICBzZWxmLmxhc3RGb3VyQ2hhcnMgPSBbXQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHNlbGYuZXNjYXBlID0gRmFsc2UKCiAgICAgICAgIyBUaGUgY3VycmVudCB0b2tlbiBiZWluZyBjcmVhdGVkCiAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSBOb25lCiAgICAgICAgc3VwZXIoSFRNTFRva2VuaXplciwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiIgVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgaGFwcGVucy4KCiAgICAgICAgV2UgZG8gb3VyIHVzdWFsbHkgcHJvY2Vzc2luZyB0aHJvdWdoIHRoZSBzdGF0ZXMgYW5kIHdoZW4gd2UgaGF2ZSBhIHRva2VuCiAgICAgICAgdG8gcmV0dXJuIHdlIHlpZWxkIHRoZSB0b2tlbiB3aGljaCBwYXVzZXMgcHJvY2Vzc2luZyB1bnRpbCB0aGUgbmV4dCB0b2tlbgogICAgICAgIGlzIHJlcXVlc3RlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnRva2VuUXVldWUgPSBkZXF1ZShbXSkKICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcuIFdoZW4gRU9GIGlzIHJlYWNoZWQgc2VsZi5zdGF0ZSB3aWxsIHJldHVybiBGYWxzZQogICAgICAgICMgaW5zdGVhZCBvZiBUcnVlIGFuZCB0aGUgbG9vcCB3aWxsIHRlcm1pbmF0ZS4KICAgICAgICB3aGlsZSBzZWxmLnN0YXRlKCk6CiAgICAgICAgICAgIHdoaWxlIHNlbGYuc3RyZWFtLmVycm9yczoKICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOiBzZWxmLnN0cmVhbS5lcnJvcnMucG9wKDApfQogICAgICAgICAgICB3aGlsZSBzZWxmLnRva2VuUXVldWU6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLnRva2VuUXVldWUucG9wbGVmdCgpCgogICAgZGVmIGNvbnN1bWVOdW1iZXJFbnRpdHkoc2VsZiwgaXNIZXgpOgogICAgICAgICIiIlRoaXMgZnVuY3Rpb24gcmV0dXJucyBlaXRoZXIgVStGRkZEIG9yIHRoZSBjaGFyYWN0ZXIgYmFzZWQgb24gdGhlCiAgICAgICAgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4gSXQgYWxzbyBkaXNjYXJkcyAiOyIgaWYgcHJlc2VudC4KICAgICAgICBJZiBub3QgcHJlc2VudCBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXX0pIGlzIGludm9rZWQuCiAgICAgICAgIiIiCgogICAgICAgIGFsbG93ZWQgPSBkaWdpdHMKICAgICAgICByYWRpeCA9IDEwCiAgICAgICAgaWYgaXNIZXg6CiAgICAgICAgICAgIGFsbG93ZWQgPSBoZXhEaWdpdHMKICAgICAgICAgICAgcmFkaXggPSAxNgoKICAgICAgICBjaGFyU3RhY2sgPSBbXQoKICAgICAgICAjIENvbnN1bWUgYWxsIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGluIHJhbmdlIHdoaWxlIG1ha2luZyBzdXJlIHdlCiAgICAgICAgIyBkb24ndCBoaXQgYW4gRU9GLgogICAgICAgIGMgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICB3aGlsZSBjIGluIGFsbG93ZWQgYW5kIGMgaXMgbm90IEVPRjoKICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChjKQogICAgICAgICAgICBjID0gc2VsZi5zdHJlYW0uY2hhcigpCgogICAgICAgICMgQ29udmVydCB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgY29uc3VtZWQgdG8gYW4gaW50LgogICAgICAgIGNoYXJBc0ludCA9IGludCgiIi5qb2luKGNoYXJTdGFjayksIHJhZGl4KQoKICAgICAgICAjIENlcnRhaW4gY2hhcmFjdGVycyBnZXQgcmVwbGFjZWQgd2l0aCBvdGhlcnMKICAgICAgICBpZiBjaGFyQXNJbnQgaW4gcmVwbGFjZW1lbnRDaGFyYWN0ZXJzOgogICAgICAgICAgICBjaGFyID0gcmVwbGFjZW1lbnRDaGFyYWN0ZXJzW2NoYXJBc0ludF0KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiY2hhckFzSW50IjogY2hhckFzSW50fX0pCiAgICAgICAgZWxpZiAoKDB4RDgwMCA8PSBjaGFyQXNJbnQgPD0gMHhERkZGKSBvcgogICAgICAgICAgICAgIChjaGFyQXNJbnQgPiAweDEwRkZGRikpOgogICAgICAgICAgICBjaGFyID0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiY2hhckFzSW50IjogY2hhckFzSW50fX0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBTaG91bGQgc3BlZWQgdXAgdGhpcyBjaGVjayBzb21laG93IChlLmcuIG1vdmUgdGhlIHNldCB0byBhIGNvbnN0YW50KQogICAgICAgICAgICBpZiAoKDB4MDAwMSA8PSBjaGFyQXNJbnQgPD0gMHgwMDA4KSBvcgogICAgICAgICAgICAgICAgKDB4MDAwRSA8PSBjaGFyQXNJbnQgPD0gMHgwMDFGKSBvcgogICAgICAgICAgICAgICAgKDB4MDA3RiA8PSBjaGFyQXNJbnQgPD0gMHgwMDlGKSBvcgogICAgICAgICAgICAgICAgKDB4RkREMCA8PSBjaGFyQXNJbnQgPD0gMHhGREVGKSBvcgogICAgICAgICAgICAgICAgY2hhckFzSW50IGluIGZyb3plbnNldChbMHgwMDBCLCAweEZGRkUsIDB4RkZGRiwgMHgxRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRkYsIDB4MkZGRkUsIDB4MkZGRkYsIDB4M0ZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRkZGLCAweDRGRkZFLCAweDRGRkZGLCAweDVGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1RkZGRiwgMHg2RkZGRSwgMHg2RkZGRiwgMHg3RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkYsIDB4OEZGRkUsIDB4OEZGRkYsIDB4OUZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDlGRkZGLCAweEFGRkZFLCAweEFGRkZGLCAweEJGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCRkZGRiwgMHhDRkZGRSwgMHhDRkZGRiwgMHhERkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkYsIDB4RUZGRkUsIDB4RUZGRkYsIDB4RkZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGLCAweDEwRkZGRSwgMHgxMEZGRkZdKSk6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJjaGFyQXNJbnQiOiBjaGFyQXNJbnR9fSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBUcnkvZXhjZXB0IG5lZWRlZCBhcyBVQ1MtMiBQeXRob24gYnVpbGRzJyB1bmljaGFyIG9ubHkgd29ya3MKICAgICAgICAgICAgICAgICMgd2l0aGluIHRoZSBCTVAuCiAgICAgICAgICAgICAgICBjaGFyID0gY2hyKGNoYXJBc0ludCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICB2ID0gY2hhckFzSW50IC0gMHgxMDAwMAogICAgICAgICAgICAgICAgY2hhciA9IGNocigweEQ4MDAgfCAodiA+PiAxMCkpICsgY2hyKDB4REMwMCB8ICh2ICYgMHgzRkYpKQoKICAgICAgICAjIERpc2NhcmQgdGhlIDsgaWYgcHJlc2VudC4gT3RoZXJ3aXNlLCBwdXQgaXQgYmFjayBvbiB0aGUgcXVldWUgYW5kCiAgICAgICAgIyBpbnZva2UgcGFyc2VFcnJvciBvbiBwYXJzZXIuCiAgICAgICAgaWYgYyAhPSAiOyI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1lcmljLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjKQoKICAgICAgICByZXR1cm4gY2hhcgoKICAgIGRlZiBjb25zdW1lRW50aXR5KHNlbGYsIGFsbG93ZWRDaGFyPU5vbmUsIGZyb21BdHRyaWJ1dGU9RmFsc2UpOgogICAgICAgICMgSW5pdGlhbGlzZSB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZm9yIHdoZW4gbm8gZW50aXR5IGlzIG1hdGNoZWQKICAgICAgICBvdXRwdXQgPSAiJiIKCiAgICAgICAgY2hhclN0YWNrID0gW3NlbGYuc3RyZWFtLmNoYXIoKV0KICAgICAgICBpZiAoY2hhclN0YWNrWzBdIGluIHNwYWNlQ2hhcmFjdGVycyBvciBjaGFyU3RhY2tbMF0gaW4gKEVPRiwgIjwiLCAiJiIpIG9yCiAgICAgICAgICAgICAgICAoYWxsb3dlZENoYXIgaXMgbm90IE5vbmUgYW5kIGFsbG93ZWRDaGFyID09IGNoYXJTdGFja1swXSkpOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2tbMF0pCgogICAgICAgIGVsaWYgY2hhclN0YWNrWzBdID09ICIjIjoKICAgICAgICAgICAgIyBSZWFkIHRoZSBuZXh0IGNoYXJhY3RlciB0byBzZWUgaWYgaXQncyBoZXggb3IgZGVjaW1hbAogICAgICAgICAgICBoZXggPSBGYWxzZQogICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSBpbiAoIngiLCAiWCIpOgogICAgICAgICAgICAgICAgaGV4ID0gVHJ1ZQogICAgICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCgogICAgICAgICAgICAjIGNoYXJTdGFja1stMV0gc2hvdWxkIGJlIHRoZSBmaXJzdCBkaWdpdAogICAgICAgICAgICBpZiAoaGV4IGFuZCBjaGFyU3RhY2tbLTFdIGluIGhleERpZ2l0cykgXAogICAgICAgICAgICAgICAgICAgIG9yIChub3QgaGV4IGFuZCBjaGFyU3RhY2tbLTFdIGluIGRpZ2l0cyk6CiAgICAgICAgICAgICAgICAjIEF0IGxlYXN0IG9uZSBkaWdpdCBmb3VuZCwgc28gY29uc3VtZSB0aGUgd2hvbGUgbnVtYmVyCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2tbLTFdKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5jb25zdW1lTnVtYmVyRW50aXR5KGhleCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTm8gZGlnaXRzIGZvdW5kCiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImV4cGVjdGVkLW51bWVyaWMtZW50aXR5In0pCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSAiJiIgKyAiIi5qb2luKGNoYXJTdGFjaykKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50IGluIHRoZSBwcm9jZXNzIG1pZ2h0IGhhdmUgbmFtZWQgZW50aXR5LiBFbnRpdGllcwogICAgICAgICAgICAjIGFyZSBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSAiZW50aXRpZXMiLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgQ29uc3VtZSBjaGFyYWN0ZXJzIGFuZCBjb21wYXJlIHRvIHRoZXNlIHRvIGEgc3Vic3RyaW5nIG9mIHRoZQogICAgICAgICAgICAjIGVudGl0eSBuYW1lcyBpbiB0aGUgbGlzdCB1bnRpbCB0aGUgc3Vic3RyaW5nIG5vIGxvbmdlciBtYXRjaGVzLgogICAgICAgICAgICB3aGlsZSAoY2hhclN0YWNrWy0xXSBpcyBub3QgRU9GKToKICAgICAgICAgICAgICAgIGlmIG5vdCBlbnRpdGllc1RyaWUuaGFzX2tleXNfd2l0aF9wcmVmaXgoIiIuam9pbihjaGFyU3RhY2spKToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCgogICAgICAgICAgICAjIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIHNvbWUgY2hhcmFjdGVycwogICAgICAgICAgICAjIHRoYXQgbWF5IG1hdGNoIGFuIGVudGl0eQogICAgICAgICAgICAjIFRyeSB0byBmaW5kIHRoZSBsb25nZXN0IGVudGl0eSB0aGUgc3RyaW5nIHdpbGwgbWF0Y2ggdG8gdGFrZSBjYXJlCiAgICAgICAgICAgICMgb2YgJm5vdGkgZm9yIGluc3RhbmNlLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBlbnRpdHlOYW1lID0gZW50aXRpZXNUcmllLmxvbmdlc3RfcHJlZml4KCIiLmpvaW4oY2hhclN0YWNrWzotMV0pKQogICAgICAgICAgICAgICAgZW50aXR5TGVuZ3RoID0gbGVuKGVudGl0eU5hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIGVudGl0eU5hbWUgPSBOb25lCgogICAgICAgICAgICBpZiBlbnRpdHlOYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgZW50aXR5TmFtZVstMV0gIT0gIjsiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVkLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiJ9KQogICAgICAgICAgICAgICAgaWYgKGVudGl0eU5hbWVbLTFdICE9ICI7IiBhbmQgZnJvbUF0dHJpYnV0ZSBhbmQKICAgICAgICAgICAgICAgICAgICAoY2hhclN0YWNrW2VudGl0eUxlbmd0aF0gaW4gYXNjaWlMZXR0ZXJzIG9yCiAgICAgICAgICAgICAgICAgICAgIGNoYXJTdGFja1tlbnRpdHlMZW5ndGhdIGluIGRpZ2l0cyBvcgogICAgICAgICAgICAgICAgICAgICBjaGFyU3RhY2tbZW50aXR5TGVuZ3RoXSA9PSAiPSIpKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gIiYiICsgIiIuam9pbihjaGFyU3RhY2spCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGVudGl0aWVzW2VudGl0eU5hbWVdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSAiIi5qb2luKGNoYXJTdGFja1tlbnRpdHlMZW5ndGg6XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtbmFtZWQtZW50aXR5In0pCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSAiJiIgKyAiIi5qb2luKGNoYXJTdGFjaykKCiAgICAgICAgaWYgZnJvbUF0dHJpYnV0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gb3V0cHV0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgb3V0cHV0IGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9ICJTcGFjZUNoYXJhY3RlcnMiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSAiQ2hhcmFjdGVycyIKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzW3Rva2VuVHlwZV0sICJkYXRhIjogb3V0cHV0fSkKCiAgICBkZWYgcHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKHNlbGYsIGFsbG93ZWRDaGFyKToKICAgICAgICAiIiJUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgbmVlZCBmb3IgImVudGl0eUluQXR0cmlidXRlVmFsdWVTdGF0ZSIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jb25zdW1lRW50aXR5KGFsbG93ZWRDaGFyPWFsbG93ZWRDaGFyLCBmcm9tQXR0cmlidXRlPVRydWUpCgogICAgZGVmIGVtaXRDdXJyZW50VG9rZW4oc2VsZik6CiAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgYSBnZW5lcmljIGhhbmRsZXIgZm9yIGVtaXR0aW5nIHRoZSB0YWdzLiBJdCBhbHNvIHNldHMKICAgICAgICB0aGUgc3RhdGUgdG8gImRhdGEiIGJlY2F1c2UgdGhhdCdzIHdoYXQncyBuZWVkZWQgYWZ0ZXIgYSB0b2tlbiBoYXMgYmVlbgogICAgICAgIGVtaXR0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgdG9rZW4gPSBzZWxmLmN1cnJlbnRUb2tlbgogICAgICAgICMgQWRkIHRva2VuIHRvIHRoZSBxdWV1ZSB0byBiZSB5aWVsZGVkCiAgICAgICAgaWYgKHRva2VuWyJ0eXBlIl0gaW4gdGFnVG9rZW5UeXBlcyk6CiAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gPSB0b2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBpZiB0b2tlblsidHlwZSJdID09IHRva2VuVHlwZXNbIkVuZFRhZyJdOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJhdHRyaWJ1dGVzLWluLWVuZC10YWcifSkKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzZWxmQ2xvc2luZyJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogInNlbGYtY2xvc2luZy1mbGFnLW9uLWVuZC10YWcifSkKICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHRva2VuKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQoKICAgICMgQmVsb3cgYXJlIHRoZSB2YXJpb3VzIHRva2VuaXplciBzdGF0ZXMgd29ya2VkIG91dC4KICAgIGRlZiBkYXRhU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5lbnRpdHlEYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi50YWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHUwMDAwIn0pCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgIyBEaXJlY3RseSBhZnRlciBlbWl0dGluZyBhIHRva2VuIHlvdSBzd2l0Y2ggYmFjayB0byB0aGUgImRhdGEKICAgICAgICAgICAgIyBzdGF0ZSIuIEF0IHRoYXQgcG9pbnQgc3BhY2VDaGFyYWN0ZXJzIGFyZSBpbXBvcnRhbnQgc28gdGhleSBhcmUKICAgICAgICAgICAgIyBlbWl0dGVkIHNlcGFyYXRlbHkuCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siU3BhY2VDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKX0pCiAgICAgICAgICAgICMgTm8gbmVlZCB0byB1cGRhdGUgbGFzdEZvdXJDaGFycyBoZXJlLCBzaW5jZSB0aGUgZmlyc3Qgc3BhY2Ugd2lsbAogICAgICAgICAgICAjIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGVuZGVkIHRvIGxhc3RGb3VyQ2hhcnMgYW5kIHdpbGwgaGF2ZSBicm9rZW4KICAgICAgICAgICAgIyBhbnkgPCEtLSBvciAtLT4gc2VxdWVuY2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiJiIsICI8IiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGVudGl0eURhdGFTdGF0ZShzZWxmKToKICAgICAgICBzZWxmLmNvbnN1bWVFbnRpdHkoKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY2hhcmFjdGVyUmVmZXJlbmNlSW5SY2RhdGEKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICAjIERpcmVjdGx5IGFmdGVyIGVtaXR0aW5nIGEgdG9rZW4geW91IHN3aXRjaCBiYWNrIHRvIHRoZSAiZGF0YQogICAgICAgICAgICAjIHN0YXRlIi4gQXQgdGhhdCBwb2ludCBzcGFjZUNoYXJhY3RlcnMgYXJlIGltcG9ydGFudCBzbyB0aGV5IGFyZQogICAgICAgICAgICAjIGVtaXR0ZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJTcGFjZUNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpfSkKICAgICAgICAgICAgIyBObyBuZWVkIHRvIHVwZGF0ZSBsYXN0Rm91ckNoYXJzIGhlcmUsIHNpbmNlIHRoZSBmaXJzdCBzcGFjZSB3aWxsCiAgICAgICAgICAgICMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwZW5kZWQgdG8gbGFzdEZvdXJDaGFycyBhbmQgd2lsbCBoYXZlIGJyb2tlbgogICAgICAgICAgICAjIGFueSA8IS0tIG9yIC0tPiBzZXF1ZW5jZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCImIiwgIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2hhcmFjdGVyUmVmZXJlbmNlSW5SY2RhdGEoc2VsZik6CiAgICAgICAgc2VsZi5jb25zdW1lRW50aXR5KCkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCI8IiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCI8IiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHBsYWludGV4dFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCJcdTAwMDAiKX0pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgdGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIhIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYubWFya3VwRGVjbGFyYXRpb25PcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jbG9zZVRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siU3RhcnRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBkYXRhLCAiZGF0YSI6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZkNsb3NpbmciOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnRhZ05hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgICMgWFhYIEluIHRoZW9yeSBpdCBjb3VsZCBiZSBzb21ldGhpbmcgYmVzaWRlcyBhIHRhZyBuYW1lLiBCdXQKICAgICAgICAgICAgIyBkbyB3ZSByZWFsbHkgY2FyZT8KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPD4ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI/IjoKICAgICAgICAgICAgIyBYWFggSW4gdGhlb3J5IGl0IGNvdWxkIGJlIHNvbWV0aGluZyBiZXNpZGVzIGEgdGFnIG5hbWUuIEJ1dAogICAgICAgICAgICAjIGRvIHdlIHJlYWxseSBjYXJlPwogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1xdWVzdGlvbi1tYXJrIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzQ29tbWVudFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLXRhZy1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNsb3NlVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwgIm5hbWUiOiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYudGFnTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYIGRhdGEgY2FuIGJlIF8nXy4uLgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1jaGFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJkYXRhIjogZGF0YX19KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0NvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi10YWctbmFtZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSBkYXRhCiAgICAgICAgICAgICMgKERvbid0IHVzZSBjaGFyc1VudGlsIGhlcmUsIGJlY2F1c2UgdGFnIG5hbWVzIGFyZQogICAgICAgICAgICAjIHZlcnkgc2hvcnQgYW5kIGl0J3MgZmFzdGVyIHRvIG5vdCBkbyBhbnl0aGluZyBmYW5jeSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhRW5kVGFnT3BlblN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YUVuZFRhZ05hbWVTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YUVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dExlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0RW5kVGFnT3BlblN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dEVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dEVuZFRhZ05hbWVTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0RW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUxlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRW5kVGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIhIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwhIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVTdGFydFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVuZFRhZ05hbWVTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZVN0YXJ0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlU3RhcnREYXNoU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlU3RhcnREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIjwiLCAiLSIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRGFzaERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRGFzaERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI+In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCIgKyBkYXRhfSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVTdGFydFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlU3RhcnRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiAoc3BhY2VDaGFyYWN0ZXJzIHwgZnJvemVuc2V0KCgiLyIsICI+IikpKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIGlmIHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkgPT0gInNjcmlwdCI6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hEYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1zY3JpcHQtaW4tc2NyaXB0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIj4ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1zY3JpcHQtaW4tc2NyaXB0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICIvIn0pCiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZUVuZFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVFbmRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiAoc3BhY2VDaGFyYWN0ZXJzIHwgZnJvemVuc2V0KCgiLyIsICI+IikpKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIGlmIHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkgPT0gInNjcmlwdCI6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInLCAiPSIsICI8Iik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLWNoYXJhY3Rlci1pbi1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbIlx1RkZGRCIsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWF0dHJpYnV0ZS1uYW1lLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGF0dHJpYnV0ZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IFRydWUKICAgICAgICBlbWl0VG9rZW4gPSBGYWxzZQogICAgICAgIGlmIGRhdGEgPT0gIj0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVWYWx1ZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gZGF0YSArXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChhc2NpaUxldHRlcnMsIFRydWUpCiAgICAgICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBGYWxzZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgICMgWFhYIElmIHdlIGVtaXQgaGVyZSB0aGUgYXR0cmlidXRlcyBhcmUgY29udmVydGVkIHRvIGEgZGljdAogICAgICAgICAgICAjIHdpdGhvdXQgYmVpbmcgY2hlY2tlZCBhbmQgd2hlbiB0aGUgY29kZSBiZWxvdyBydW5zIHdlIGVycm9yCiAgICAgICAgICAgICMgYmVjYXVzZSBkYXRhIGlzIGEgZGljdCBub3QgYSBsaXN0CiAgICAgICAgICAgIGVtaXRUb2tlbiA9IFRydWUKICAgICAgICBlbGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9ICJcdUZGRkQiCiAgICAgICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBGYWxzZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicsICI8Iik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLWNoYXJhY3Rlci1pbi1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSBkYXRhCiAgICAgICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBGYWxzZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJlb2YtaW4tYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gZGF0YQogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKCiAgICAgICAgaWYgbGVhdmluZ1RoaXNTdGF0ZToKICAgICAgICAgICAgIyBBdHRyaWJ1dGVzIGFyZSBub3QgZHJvcHBlZCBhdCB0aGlzIHN0YWdlLiBUaGF0IGhhcHBlbnMgd2hlbiB0aGUKICAgICAgICAgICAgIyBzdGFydCB0YWcgdG9rZW4gaXMgZW1pdHRlZCBzbyB2YWx1ZXMgY2FuIHN0aWxsIGJlIHNhZmVseSBhcHBlbmRlZAogICAgICAgICAgICAjIHRvIGF0dHJpYnV0ZXMsIGJ1dCB3ZSBkbyB3YW50IHRvIHJlcG9ydCB0aGUgcGFyc2UgZXJyb3IgaW4gdGltZS4KICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gPSAoCiAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikpCiAgICAgICAgICAgIGZvciBuYW1lLCBfIGluIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bOi0xXToKICAgICAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdID09IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlLWF0dHJpYnV0ZSJ9KQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgWFhYIEZpeCBmb3IgYWJvdmUgWFhYCiAgICAgICAgICAgIGlmIGVtaXRUb2tlbjoKICAgICAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJBdHRyaWJ1dGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSkKICAgICAgICBlbGlmIGRhdGEgPT0gIj0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVWYWx1ZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbIlx1RkZGRCIsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJywgIjwiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVyLWFmdGVyLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1lbmQtb2YtdGFnLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZUF0dHJpYnV0ZVZhbHVlU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSkKICAgICAgICBlbGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLXZhbHVlLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCJ9KQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIj0iLCAiPCIsICJgIik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcXVhbHMtaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJBdHRyaWJ1dGVWYWx1ZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoJyInKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtZG91YmxlLXF1b3RlIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEgK1wKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCJcIiIsICImIiwgIlx1MDAwMCIpKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGF0dHJpYnV0ZVZhbHVlU2luZ2xlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZSgiJyIpCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1zaW5nbGUtcXVvdGUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YSArXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIiciLCAiJiIsICJcdTAwMDAiKSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZSgiPiIpCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgaW4gKCciJywgIiciLCAiPSIsICI8IiwgImAiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1uby1xdW90ZXMifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoCiAgICAgICAgICAgICAgICBmcm96ZW5zZXQoKCImIiwgIj4iLCAnIicsICInIiwgIj0iLCAiPCIsICJgIiwgIlx1MDAwMCIpKSB8IHNwYWNlQ2hhcmFjdGVycykKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckF0dHJpYnV0ZVZhbHVlU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLUVPRi1hZnRlci1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWFmdGVyLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic2VsZkNsb3NpbmciXSA9IFRydWUKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1FT0YtYWZ0ZXItc29saWR1cy1pbi10YWcifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWFmdGVyLXNvbGlkdXMtaW4tdGFnIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJvZ3VzQ29tbWVudFN0YXRlKHNlbGYpOgogICAgICAgICMgTWFrZSBhIG5ldyBjb21tZW50IHRva2VuIGFuZCBnaXZlIGl0IGFzIHZhbHVlIGFsbCB0aGUgY2hhcmFjdGVycwogICAgICAgICMgdW50aWwgdGhlIGZpcnN0ID4gb3IgRU9GIChjaGFyc1VudGlsIGNoZWNrcyBmb3IgRU9GIGF1dG9tYXRpY2FsbHkpCiAgICAgICAgIyBhbmQgZW1pdCBpdC4KICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiPiIpCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHUwMDAwIiwgIlx1RkZGRCIpCiAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCgKICAgICAgICAgICAgeyJ0eXBlIjogdG9rZW5UeXBlc1siQ29tbWVudCJdLCAiZGF0YSI6IGRhdGF9KQoKICAgICAgICAjIEVhdCB0aGUgY2hhcmFjdGVyIGRpcmVjdGx5IGFmdGVyIHRoZSBib2d1cyBjb21tZW50IHdoaWNoIGlzIGVpdGhlciBhCiAgICAgICAgIyAiPiIgb3IgYW4gRU9GLgogICAgICAgIHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIG1hcmt1cERlY2xhcmF0aW9uT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGNoYXJTdGFjayA9IFtzZWxmLnN0cmVhbS5jaGFyKCldCiAgICAgICAgaWYgY2hhclN0YWNrWy0xXSA9PSAiLSI6CiAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdID09ICItIjoKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siQ29tbWVudCJdLCAiZGF0YSI6ICIifQogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXJ0U3RhdGUKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxpZiBjaGFyU3RhY2tbLTFdIGluICgnZCcsICdEJyk6CiAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoKCdvJywgJ08nKSwgKCdjJywgJ0MnKSwgKCd0JywgJ1QnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3knLCAnWScpLCAoJ3AnLCAnUCcpLCAoJ2UnLCAnRScpKToKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSBub3QgaW4gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRG9jdHlwZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWNJZCI6IE5vbmUsICJzeXN0ZW1JZCI6IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdCI6IFRydWV9CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3RhdGUKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxpZiAoY2hhclN0YWNrWy0xXSA9PSAiWyIgYW5kCiAgICAgICAgICAgICAgc2VsZi5wYXJzZXIgaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHMgYW5kCiAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWVzcGFjZSAhPSBzZWxmLnBhcnNlci50cmVlLmRlZmF1bHROYW1lc3BhY2UpOgogICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gWyJDIiwgIkQiLCAiQSIsICJUIiwgIkEiLCAiWyJdOgogICAgICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdICE9IGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jZGF0YVNlY3Rpb25TdGF0ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZGFzaGVzLW9yLWRvY3R5cGUifSkKCiAgICAgICAgd2hpbGUgY2hhclN0YWNrOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNDb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50U3RhcnRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGFydERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0LWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50U3RhcnREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QtY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLSIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImVvZi1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gZGF0YSArIFwKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCItIiwgIlx1MDAwMCIpKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRFbmREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWRhc2gifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLSIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRFbmRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0tXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiEiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1iYW5nLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZEJhbmdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWRhc2gtYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9IGRhdGEKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQtZG91YmxlLWRhc2gifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0tIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudEVuZEJhbmdTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0tISIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0tIVx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50LWVuZC1iYW5nLXN0YXRlIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0tISIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZC1zcGFjZS1hZnRlci1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVEb2N0eXBlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGRhdGEgaW4gKCJwIiwgIlAiKToKICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKCgidSIsICJVIiksICgiYiIsICJCIiksICgibCIsICJMIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsICJJIiksICgiYyIsICJDIikpOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVB1YmxpY0tleXdvcmRTdGF0ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgZGF0YSBpbiAoInMiLCAiUyIpOgogICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoKCJ5IiwgIlkiKSwgKCJzIiwgIlMiKSwgKCJ0IiwgIlQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgIkUiKSwgKCJtIiwgIk0iKSk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlU3lzdGVtS2V5d29yZFN0YXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgICAgICMgQWxsIHRoZSBjaGFyYWN0ZXJzIHJlYWQgYmVmb3JlIHRoZSBjdXJyZW50ICdkYXRhJyB3aWxsIGJlCiAgICAgICAgICAgICMgW2EtekEtWl0sIHNvIHRoZXkncmUgZ2FyYmFnZSBpbiB0aGUgYm9ndXMgZG9jdHlwZSBhbmQgY2FuIGJlCiAgICAgICAgICAgICMgZGlzY2FyZGVkOyBvbmx5IHRoZSBsYXRlc3QgY2hhcmFjdGVyIG1pZ2h0IGJlICc+JyBvciBFT0YKICAgICAgICAgICAgIyBhbmQgbmVlZHMgdG8gYmUgdW5nZXR0ZWQKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLXNwYWNlLW9yLXJpZ2h0LWJyYWNrZXQtaW4tZG9jdHlwZSIsICJkYXRhdmFycyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGF0YSI6IGRhdGF9fSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVB1YmxpY0tleXdvcmRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVQdWJsaWNJZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlUHVibGljSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmV0d2VlbkRvY3R5cGVQdWJsaWNBbmRTeXN0ZW1JZGVudGlmaWVyc1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICciJzoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICciJzoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlU3lzdGVtS2V5d29yZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYm9ndXNEb2N0eXBlU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICAjIFhYWCBFTUlUCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjZGF0YVNlY3Rpb25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gW10KICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBkYXRhLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCJdIikpCiAgICAgICAgICAgIGRhdGEuYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIj4iKSkKICAgICAgICAgICAgY2hhciA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgICAgICBpZiBjaGFyID09IEVPRjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgY2hhciA9PSAiPiIKICAgICAgICAgICAgICAgIGlmIGRhdGFbLTFdWy0yOl0gPT0gIl1dIjoKICAgICAgICAgICAgICAgICAgICBkYXRhWy0xXSA9IGRhdGFbLTFdWzotMl0KICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZChjaGFyKQoKICAgICAgICBkYXRhID0gIiIuam9pbihkYXRhKSAgIyBweWxpbnQ6ZGlzYWJsZT1yZWRlZmluZWQtdmFyaWFibGUtdHlwZQogICAgICAgICMgRGVhbCB3aXRoIG51bGwgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgcGFyc2VyCiAgICAgICAgbnVsbENvdW50ID0gZGF0YS5jb3VudCgiXHUwMDAwIikKICAgICAgICBpZiBudWxsQ291bnQgPiAwOgogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShudWxsQ291bnQpOgogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcdTAwMDAiLCAiXHVGRkZEIikKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhfSkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQpQSwMEFAAAAAAAAAAhAO/Trw8hAQAAIQEAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLnB5IGltcG9ydCBUcmllIGFzIFB5VHJpZQoKVHJpZSA9IFB5VHJpZQoKIyBweWxpbnQ6ZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KdHJ5OgogICAgZnJvbSAuZGF0cmllIGltcG9ydCBUcmllIGFzIERBVHJpZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICBUcmllID0gREFUcmllCiMgcHlsaW50OmVuYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KUEsDBBQAAAAAAAAAIQDMlT6W0wMAANMDAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCgoKY2xhc3MgVHJpZShNYXBwaW5nKToKICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRyaWVzIiIiCgogICAgZGVmIGtleXMoc2VsZiwgcHJlZml4PU5vbmUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9YXJndW1lbnRzLWRpZmZlcgogICAgICAgIGtleXMgPSBzdXBlcihUcmllLCBzZWxmKS5rZXlzKCkKCiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZXQoa2V5cykKCiAgICAgICAgIyBQeXRob24gMi42OiBubyBzZXQgY29tcHJlaGVuc2lvbnMKICAgICAgICByZXR1cm4gc2V0KFt4IGZvciB4IGluIGtleXMgaWYgeC5zdGFydHN3aXRoKHByZWZpeCldKQoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CiAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXggaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHByZWZpeAoKICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4ocHJlZml4KSArIDEpOgogICAgICAgICAgICBpZiBwcmVmaXhbOi1pXSBpbiBzZWxmOgogICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeFs6LWldCgogICAgICAgIHJhaXNlIEtleUVycm9yKHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXhfaXRlbShzZWxmLCBwcmVmaXgpOgogICAgICAgIGxwcmVmaXggPSBzZWxmLmxvbmdlc3RfcHJlZml4KHByZWZpeCkKICAgICAgICByZXR1cm4gKGxwcmVmaXgsIHNlbGZbbHByZWZpeF0pClBLAwQUAAAAAAAAACEAJFWdqZoEAACaBAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9kYXRyaWUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gZGF0cmllIGltcG9ydCBUcmllIGFzIERBVHJpZQpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIC5fYmFzZSBpbXBvcnQgVHJpZSBhcyBBQkNUcmllCgoKY2xhc3MgVHJpZShBQkNUcmllKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBjaGFycyA9IHNldCgpCiAgICAgICAgZm9yIGtleSBpbiBkYXRhLmtleXMoKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJBbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MiKQogICAgICAgICAgICBmb3IgY2hhciBpbiBrZXk6CiAgICAgICAgICAgICAgICBjaGFycy5hZGQoY2hhcikKCiAgICAgICAgc2VsZi5fZGF0YSA9IERBVHJpZSgiIi5qb2luKGNoYXJzKSkKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuX2RhdGFba2V5XSA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fZGF0YQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fZGF0YSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFba2V5XQoKICAgIGRlZiBrZXlzKHNlbGYsIHByZWZpeD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5rZXlzKHByZWZpeCkKCiAgICBkZWYgaGFzX2tleXNfd2l0aF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5oYXNfa2V5c193aXRoX3ByZWZpeChwcmVmaXgpCgogICAgZGVmIGxvbmdlc3RfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEubG9uZ2VzdF9wcmVmaXgocHJlZml4KQoKICAgIGRlZiBsb25nZXN0X3ByZWZpeF9pdGVtKHNlbGYsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEubG9uZ2VzdF9wcmVmaXhfaXRlbShwcmVmaXgpClBLAwQUAAAAAAAAACEAS09uzu8GAADvBgAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9weS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQKCmZyb20gLl9iYXNlIGltcG9ydCBUcmllIGFzIEFCQ1RyaWUKCgpjbGFzcyBUcmllKEFCQ1RyaWUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBhbGwoaXNpbnN0YW5jZSh4LCB0ZXh0X3R5cGUpIGZvciB4IGluIGRhdGEua2V5cygpKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJBbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MiKQoKICAgICAgICBzZWxmLl9kYXRhID0gZGF0YQogICAgICAgIHNlbGYuX2tleXMgPSBzb3J0ZWQoZGF0YS5rZXlzKCkpCiAgICAgICAgc2VsZi5fY2FjaGVzdHIgPSAiIgogICAgICAgIHNlbGYuX2NhY2hlcG9pbnRzID0gKDAsIGxlbihkYXRhKSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9kYXRhCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhW2tleV0KCiAgICBkZWYga2V5cyhzZWxmLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmUgb3IgcHJlZml4ID09ICIiIG9yIG5vdCBzZWxmLl9rZXlzOgogICAgICAgICAgICByZXR1cm4gc2V0KHNlbGYuX2tleXMpCgogICAgICAgIGlmIHByZWZpeC5zdGFydHN3aXRoKHNlbGYuX2NhY2hlc3RyKToKICAgICAgICAgICAgbG8sIGhpID0gc2VsZi5fY2FjaGVwb2ludHMKICAgICAgICAgICAgc3RhcnQgPSBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4LCBsbywgaGkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhcnQgPSBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4KQoKICAgICAgICBrZXlzID0gc2V0KCkKICAgICAgICBpZiBzdGFydCA9PSBsZW4oc2VsZi5fa2V5cyk6CiAgICAgICAgICAgIHJldHVybiBrZXlzCgogICAgICAgIHdoaWxlIHNlbGYuX2tleXNbaV0uc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICBrZXlzLmFkZChzZWxmLl9rZXlzW2ldKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgc2VsZi5fY2FjaGVzdHIgPSBwcmVmaXgKICAgICAgICBzZWxmLl9jYWNoZXBvaW50cyA9IChzdGFydCwgaSkKCiAgICAgICAgcmV0dXJuIGtleXMKCiAgICBkZWYgaGFzX2tleXNfd2l0aF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXggaW4gc2VsZi5fZGF0YToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgaWYgcHJlZml4LnN0YXJ0c3dpdGgoc2VsZi5fY2FjaGVzdHIpOgogICAgICAgICAgICBsbywgaGkgPSBzZWxmLl9jYWNoZXBvaW50cwogICAgICAgICAgICBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4LCBsbywgaGkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaSA9IGJpc2VjdF9sZWZ0KHNlbGYuX2tleXMsIHByZWZpeCkKCiAgICAgICAgaWYgaSA9PSBsZW4oc2VsZi5fa2V5cyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gc2VsZi5fa2V5c1tpXS5zdGFydHN3aXRoKHByZWZpeCkKUEsDBBQAAAAAAAAAIQAm465YABAAAAAQAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHN5cwpmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgp0cnk6CiAgICBpbXBvcnQgeG1sLmV0cmVlLmNFbGVtZW50VHJlZSBhcyBkZWZhdWx0X2V0cmVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgZGVmYXVsdF9ldHJlZQoKCl9fYWxsX18gPSBbImRlZmF1bHRfZXRyZWUiLCAiTWV0aG9kRGlzcGF0Y2hlciIsICJpc1N1cnJvZ2F0ZVBhaXIiLAogICAgICAgICAgICJzdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQiLCAibW9kdWxlRmFjdG9yeUZhY3RvcnkiLAogICAgICAgICAgICJzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMiLCAiUFkyNyJdCgoKUFkyNyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA+PSA3CgojIFBsYXRmb3JtcyBub3Qgc3VwcG9ydGluZyBsb25lIHN1cnJvZ2F0ZXMgKFx1RDgwMC1cdURGRkYpIHNob3VsZCBiZQojIGNhdWdodCBieSB0aGUgYmVsb3cgdGVzdC4gSW4gZ2VuZXJhbCB0aGlzIHdvdWxkIGJlIGFueSBwbGF0Zm9ybQojIHVzaW5nIFVURi0xNiBhcyBpdHMgZW5jb2Rpbmcgb2YgdW5pY29kZSBzdHJpbmdzLCBzdWNoIGFzCiMgSnl0aG9uLiBUaGlzIGlzIGJlY2F1c2UgVVRGLTE2IGl0c2VsZiBpcyBiYXNlZCBvbiB0aGUgdXNlIG9mIHN1Y2gKIyBzdXJyb2dhdGVzLCBhbmQgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGZ1cnRoZXIgZXNjYXBlIHN1Y2gKIyBlc2NhcGVzLgp0cnk6CiAgICBfeCA9IGV2YWwoJyJcXHVEODAwIicpICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgaWYgbm90IGlzaW5zdGFuY2UoX3gsIHRleHRfdHlwZSk6CiAgICAgICAgIyBXZSBuZWVkIHRoaXMgd2l0aCB1IiIgYmVjYXVzZSBvZiBodHRwOi8vYnVncy5qeXRob24ub3JnL2lzc3VlMjAzOQogICAgICAgIF94ID0gZXZhbCgndSJcXHVEODAwIicpICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKF94LCB0ZXh0X3R5cGUpCmV4Y2VwdDogICMgcHlsaW50OmRpc2FibGU9YmFyZS1leGNlcHQKICAgIHN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlcyA9IEZhbHNlCmVsc2U6CiAgICBzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMgPSBUcnVlCgoKY2xhc3MgTWV0aG9kRGlzcGF0Y2hlcihkaWN0KToKICAgICIiIkRpY3Qgd2l0aCAyIHNwZWNpYWwgcHJvcGVydGllczoKCiAgICBPbiBpbml0aWF0aW9uLCBrZXlzIHRoYXQgYXJlIGxpc3RzLCBzZXRzIG9yIHR1cGxlcyBhcmUgY29udmVydGVkIHRvCiAgICBtdWx0aXBsZSBrZXlzIHNvIGFjY2Vzc2luZyBhbnkgb25lIG9mIHRoZSBpdGVtcyBpbiB0aGUgb3JpZ2luYWwKICAgIGxpc3QtbGlrZSBvYmplY3QgcmV0dXJucyB0aGUgbWF0Y2hpbmcgdmFsdWUKCiAgICBtZCA9IE1ldGhvZERpc3BhdGNoZXIoeygiZm9vIiwgImJhciIpOiJiYXoifSkKICAgIG1kWyJmb28iXSA9PSAiYmF6IgoKICAgIEEgZGVmYXVsdCB2YWx1ZSB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIGRlZmF1bHQgYXR0cmlidXRlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW1zPSgpKToKICAgICAgICAjIFVzaW5nIF9kaWN0RW50cmllcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFzc2lnbmluZyB0byBzZWxmIGlzIGFib3V0CiAgICAgICAgIyB0d2ljZSBhcyBmYXN0LiBQbGVhc2UgZG8gY2FyZWZ1bCBwZXJmb3JtYW5jZSB0ZXN0aW5nIGJlZm9yZSBjaGFuZ2luZwogICAgICAgICMgYW55dGhpbmcgaGVyZS4KICAgICAgICBfZGljdEVudHJpZXMgPSBbXQogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBpdGVtczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCAobGlzdCwgdHVwbGUsIGZyb3plbnNldCwgc2V0KSk6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBuYW1lOgogICAgICAgICAgICAgICAgICAgIF9kaWN0RW50cmllcy5hcHBlbmQoKGl0ZW0sIHZhbHVlKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIF9kaWN0RW50cmllcy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYsIF9kaWN0RW50cmllcykKICAgICAgICBhc3NlcnQgbGVuKHNlbGYpID09IGxlbihfZGljdEVudHJpZXMpCiAgICAgICAgc2VsZi5kZWZhdWx0ID0gTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBkaWN0LmdldChzZWxmLCBrZXksIHNlbGYuZGVmYXVsdCkKCgojIFNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHdlaXJkbmVzcyBhcm91bmQgVUNTMiB2cyBVQ1M0CiMgcHl0aG9uIGJ1aWxkcwoKZGVmIGlzU3Vycm9nYXRlUGFpcihkYXRhKToKICAgIHJldHVybiAobGVuKGRhdGEpID09IDIgYW5kCiAgICAgICAgICAgIG9yZChkYXRhWzBdKSA+PSAweEQ4MDAgYW5kIG9yZChkYXRhWzBdKSA8PSAweERCRkYgYW5kCiAgICAgICAgICAgIG9yZChkYXRhWzFdKSA+PSAweERDMDAgYW5kIG9yZChkYXRhWzFdKSA8PSAweERGRkYpCgoKZGVmIHN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludChkYXRhKToKICAgIGNoYXJfdmFsID0gKDB4MTAwMDAgKyAob3JkKGRhdGFbMF0pIC0gMHhEODAwKSAqIDB4NDAwICsKICAgICAgICAgICAgICAgIChvcmQoZGF0YVsxXSkgLSAweERDMDApKQogICAgcmV0dXJuIGNoYXJfdmFsCgojIE1vZHVsZSBGYWN0b3J5IEZhY3RvcnkgKG5vLCB0aGlzIGlzbid0IEphdmEsIEkga25vdykKIyBIZXJlIHRvIHN0b3AgdGhpcyBiZWluZyBkdXBsaWNhdGVkIGFsbCBvdmVyIHRoZSBwbGFjZS4KCgpkZWYgbW9kdWxlRmFjdG9yeUZhY3RvcnkoZmFjdG9yeSk6CiAgICBtb2R1bGVDYWNoZSA9IHt9CgogICAgZGVmIG1vZHVsZUZhY3RvcnkoYmFzZU1vZHVsZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBpc2luc3RhbmNlKE1vZHVsZVR5cGUuX19uYW1lX18sIHR5cGUoIiIpKToKICAgICAgICAgICAgbmFtZSA9ICJfJXNfZmFjdG9yeSIgJSBiYXNlTW9kdWxlLl9fbmFtZV9fCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IGIiXyVzX2ZhY3RvcnkiICUgYmFzZU1vZHVsZS5fX25hbWVfXwoKICAgICAgICBrd2FyZ3NfdHVwbGUgPSB0dXBsZShrd2FyZ3MuaXRlbXMoKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc11ba3dhcmdzX3R1cGxlXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgbW9kID0gTW9kdWxlVHlwZShuYW1lKQogICAgICAgICAgICBvYmpzID0gZmFjdG9yeShiYXNlTW9kdWxlLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIG1vZC5fX2RpY3RfXy51cGRhdGUob2JqcykKICAgICAgICAgICAgaWYgIm5hbWUiIG5vdCBpbiBtb2R1bGVDYWNoZToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdID0ge30KICAgICAgICAgICAgaWYgImFyZ3MiIG5vdCBpbiBtb2R1bGVDYWNoZVtuYW1lXToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdID0ge30KICAgICAgICAgICAgaWYgImt3YXJncyIgbm90IGluIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdOgogICAgICAgICAgICAgICAgbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc11ba3dhcmdzX3R1cGxlXSA9IHt9CiAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0gPSBtb2QKICAgICAgICAgICAgcmV0dXJuIG1vZAoKICAgIHJldHVybiBtb2R1bGVGYWN0b3J5CgoKZGVmIG1lbW9pemUoZnVuYyk6CiAgICBjYWNoZSA9IHt9CgogICAgZGVmIHdyYXBwZWQoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBrZXkgPSAodHVwbGUoYXJncyksIHR1cGxlKGt3YXJncy5pdGVtcygpKSkKICAgICAgICBpZiBrZXkgbm90IGluIGNhY2hlOgogICAgICAgICAgICBjYWNoZVtrZXldID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGNhY2hlW2tleV0KCiAgICByZXR1cm4gd3JhcHBlZApQSwMEFAAAAAAAAAAhAMikff67RQEAu0UBADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvY29uc3RhbnRzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgc3RyaW5nCgpFT0YgPSBOb25lCgpFID0gewogICAgIm51bGwtY2hhcmFjdGVyIjoKICAgICAgICAiTnVsbCBjaGFyYWN0ZXIgaW4gaW5wdXQgc3RyZWFtLCByZXBsYWNlZCB3aXRoIFUrRkZGRC4iLAogICAgImludmFsaWQtY29kZXBvaW50IjoKICAgICAgICAiSW52YWxpZCBjb2RlcG9pbnQgaW4gc3RyZWFtLiIsCiAgICAiaW5jb3JyZWN0bHktcGxhY2VkLXNvbGlkdXMiOgogICAgICAgICJTb2xpZHVzICgvKSBpbmNvcnJlY3RseSBwbGFjZWQgaW4gdGFnLiIsCiAgICAiaW5jb3JyZWN0LWNyLW5ld2xpbmUtZW50aXR5IjoKICAgICAgICAiSW5jb3JyZWN0IENSIG5ld2xpbmUgZW50aXR5LCByZXBsYWNlZCB3aXRoIExGLiIsCiAgICAiaWxsZWdhbC13aW5kb3dzLTEyNTItZW50aXR5IjoKICAgICAgICAiRW50aXR5IHVzZWQgd2l0aCBpbGxlZ2FsIG51bWJlciAod2luZG93cy0xMjUyIHJlZmVyZW5jZSkuIiwKICAgICJjYW50LWNvbnZlcnQtbnVtZXJpYy1lbnRpdHkiOgogICAgICAgICJOdW1lcmljIGVudGl0eSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQgdG8gY2hhcmFjdGVyICIKICAgICAgICAiKGNvZGVwb2ludCBVKyUoY2hhckFzSW50KTA4eCkuIiwKICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiOgogICAgICAgICJOdW1lcmljIGVudGl0eSByZXByZXNlbnRzIGFuIGlsbGVnYWwgY29kZXBvaW50OiAiCiAgICAgICAgIlUrJShjaGFyQXNJbnQpMDh4LiIsCiAgICAibnVtZXJpYy1lbnRpdHktd2l0aG91dC1zZW1pY29sb24iOgogICAgICAgICJOdW1lcmljIGVudGl0eSBkaWRuJ3QgZW5kIHdpdGggJzsnLiIsCiAgICAiZXhwZWN0ZWQtbnVtZXJpYy1lbnRpdHktYnV0LWdvdC1lb2YiOgogICAgICAgICJOdW1lcmljIGVudGl0eSBleHBlY3RlZC4gR290IGVuZCBvZiBmaWxlIGluc3RlYWQuIiwKICAgICJleHBlY3RlZC1udW1lcmljLWVudGl0eSI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGV4cGVjdGVkIGJ1dCBub25lIGZvdW5kLiIsCiAgICAibmFtZWQtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIjoKICAgICAgICAiTmFtZWQgZW50aXR5IGRpZG4ndCBlbmQgd2l0aCAnOycuIiwKICAgICJleHBlY3RlZC1uYW1lZC1lbnRpdHkiOgogICAgICAgICJOYW1lZCBlbnRpdHkgZXhwZWN0ZWQuIEdvdCBub25lLiIsCiAgICAiYXR0cmlidXRlcy1pbi1lbmQtdGFnIjoKICAgICAgICAiRW5kIHRhZyBjb250YWlucyB1bmV4cGVjdGVkIGF0dHJpYnV0ZXMuIiwKICAgICdzZWxmLWNsb3NpbmctZmxhZy1vbi1lbmQtdGFnJzoKICAgICAgICAiRW5kIHRhZyBjb250YWlucyB1bmV4cGVjdGVkIHNlbGYtY2xvc2luZyBmbGFnLiIsCiAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiRXhwZWN0ZWQgdGFnIG5hbWUuIEdvdCAnPicgaW5zdGVhZC4iLAogICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcXVlc3Rpb24tbWFyayI6CiAgICAgICAgIkV4cGVjdGVkIHRhZyBuYW1lLiBHb3QgJz8nIGluc3RlYWQuIChIVE1MIGRvZXNuJ3QgIgogICAgICAgICJzdXBwb3J0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLikiLAogICAgImV4cGVjdGVkLXRhZy1uYW1lIjoKICAgICAgICAiRXhwZWN0ZWQgdGFnIG5hbWUuIEdvdCBzb21ldGhpbmcgZWxzZSBpbnN0ZWFkIiwKICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJFeHBlY3RlZCBjbG9zaW5nIHRhZy4gR290ICc+JyBpbnN0ZWFkLiBJZ25vcmluZyAnPC8+Jy4iLAogICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiRXhwZWN0ZWQgY2xvc2luZyB0YWcuIFVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIiwKICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWNoYXIiOgogICAgICAgICJFeHBlY3RlZCBjbG9zaW5nIHRhZy4gVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyUoZGF0YSlzJyBmb3VuZC4iLAogICAgImVvZi1pbi10YWctbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gdGhlIHRhZyBuYW1lLiIsCiAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLW5hbWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBhdHRyaWJ1dGUgbmFtZSBpbnN0ZWFkLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBhdHRyaWJ1dGUgbmFtZS4iLAogICAgImludmFsaWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lIjoKICAgICAgICAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gYXR0cmlidXRlIG5hbWUiLAogICAgImR1cGxpY2F0ZS1hdHRyaWJ1dGUiOgogICAgICAgICJEcm9wcGVkIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gdGFnLiIsCiAgICAiZXhwZWN0ZWQtZW5kLW9mLXRhZy1uYW1lLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgPSBvciBlbmQgb2YgdGFnLiIsCiAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLXZhbHVlLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlLiIsCiAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLXZhbHVlLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIkV4cGVjdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gR290ICc+JyBpbnN0ZWFkLiIsCiAgICAnZXF1YWxzLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZSc6CiAgICAgICAgIlVuZXhwZWN0ZWQgPSBpbiB1bnF1b3RlZCBhdHRyaWJ1dGUiLAogICAgJ3VuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZSc6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIHVucXVvdGVkIGF0dHJpYnV0ZSIsCiAgICAiaW52YWxpZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBhdHRyaWJ1dGUgbmFtZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWFmdGVyLWF0dHJpYnV0ZS12YWx1ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGF0dHJpYnV0ZSB2YWx1ZS4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtZG91YmxlLXF1b3RlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBhdHRyaWJ1dGUgdmFsdWUgKFwiKS4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtc2luZ2xlLXF1b3RlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBhdHRyaWJ1dGUgdmFsdWUgKCcpLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1uby1xdW90ZXMiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSB2YWx1ZS4iLAogICAgInVuZXhwZWN0ZWQtRU9GLWFmdGVyLXNvbGlkdXMtaW4tdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiB0YWcuIEV4cGVjdGVkID4iLAogICAgInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWFmdGVyLXNvbGlkdXMtaW4tdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgLyBpbiB0YWcuIEV4cGVjdGVkID4iLAogICAgImV4cGVjdGVkLWRhc2hlcy1vci1kb2N0eXBlIjoKICAgICAgICAiRXhwZWN0ZWQgJy0tJyBvciAnRE9DVFlQRScuIE5vdCBmb3VuZC4iLAogICAgInVuZXhwZWN0ZWQtYmFuZy1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCAhIGFmdGVyIC0tIGluIGNvbW1lbnQiLAogICAgInVuZXhwZWN0ZWQtc3BhY2UtYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgLS0gaW4gY29tbWVudCIsCiAgICAiaW5jb3JyZWN0LWNvbW1lbnQiOgogICAgICAgICJJbmNvcnJlY3QgY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWRhc2giOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQgKC0pIiwKICAgICJ1bmV4cGVjdGVkLWRhc2gtYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgJy0nIGFmdGVyICctLScgZm91bmQgaW4gY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50LWRvdWJsZS1kYXNoIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50ICgtLSkuIiwKICAgICJlb2YtaW4tY29tbWVudC1lbmQtc3BhY2Utc3RhdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudC1lbmQtYmFuZy1zdGF0ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudC4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gY29tbWVudCBmb3VuZC4iLAogICAgIm5lZWQtc3BhY2UtYWZ0ZXItZG9jdHlwZSI6CiAgICAgICAgIk5vIHNwYWNlIGFmdGVyIGxpdGVyYWwgc3RyaW5nICdET0NUWVBFJy4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJVbmV4cGVjdGVkID4gY2hhcmFjdGVyLiBFeHBlY3RlZCBET0NUWVBFIG5hbWUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBET0NUWVBFIG5hbWUuIiwKICAgICJlb2YtaW4tZG9jdHlwZS1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBET0NUWVBFIG5hbWUuIiwKICAgICJlb2YtaW4tZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gRE9DVFlQRS4iLAogICAgImV4cGVjdGVkLXNwYWNlLW9yLXJpZ2h0LWJyYWNrZXQtaW4tZG9jdHlwZSI6CiAgICAgICAgIkV4cGVjdGVkIHNwYWNlIG9yICc+Jy4gR290ICclKGRhdGEpcyciLAogICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBET0NUWVBFLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBET0NUWVBFLiIsCiAgICAiZW9mLWluLWlubmVyaHRtbCI6CiAgICAgICAgIlhYWCBpbm5lckhUTUwgRU9GIiwKICAgICJ1bmV4cGVjdGVkLWRvY3R5cGUiOgogICAgICAgICJVbmV4cGVjdGVkIERPQ1RZUEUuIElnbm9yZWQuIiwKICAgICJub24taHRtbC1yb290IjoKICAgICAgICAiaHRtbCBuZWVkcyB0byBiZSB0aGUgZmlyc3Qgc3RhcnQgdGFnLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgRW5kIG9mIGZpbGUuIEV4cGVjdGVkIERPQ1RZUEUuIiwKICAgICJ1bmtub3duLWRvY3R5cGUiOgogICAgICAgICJFcnJvbmVvdXMgRE9DVFlQRS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1jaGFycyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMuIEV4cGVjdGVkIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3Qtc3RhcnQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKS4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykuIEV4cGVjdGVkIERPQ1RZUEUuIiwKICAgICJlbmQtdGFnLWFmdGVyLWltcGxpZWQtcm9vdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGFmdGVyIHRoZSAoaW1wbGllZCkgcm9vdCBlbGVtZW50LiIsCiAgICAiZXhwZWN0ZWQtbmFtZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykuIiwKICAgICJ0d28taGVhZHMtYXJlLW5vdC1iZXR0ZXItdGhhbi1vbmUiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyBoZWFkIGluIGV4aXN0aW5nIGhlYWQuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLW91dC1vZi1teS1oZWFkIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSB0aGF0IGNhbiBiZSBpbiBoZWFkLiBNb3ZlZC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKS4iLAogICAgIm1pc3NpbmctZW5kLXRhZyI6CiAgICAgICAgIk1pc3NpbmcgZW5kIHRhZyAoJShuYW1lKXMpLiIsCiAgICAibWlzc2luZy1lbmQtdGFncyI6CiAgICAgICAgIk1pc3NpbmcgZW5kIHRhZ3MgKCUobmFtZSlzKS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKHN0YXJ0TmFtZSlzKSAiCiAgICAgICAgImltcGxpZXMgZW5kIHRhZyAoJShlbmROYW1lKXMpLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctdHJlYXRlZC1hcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG9yaWdpbmFsTmFtZSlzKS4gVHJlYXRlZCBhcyAlKG5ld05hbWUpcy4iLAogICAgImRlcHJlY2F0ZWQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgJShuYW1lKXMuIERvbid0IHVzZSBpdCEiLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWlnbm9yZWQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAlKG5hbWUpcy4gSWdub3JlZC4iLAogICAgImV4cGVjdGVkLW9uZS1lbmQtdGFnLWJ1dC1nb3QtYW5vdGhlciI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShnb3ROYW1lKXMpLiAiCiAgICAgICAgIk1pc3NpbmcgZW5kIHRhZyAoJShleHBlY3RlZE5hbWUpcykuIiwKICAgICJlbmQtdGFnLXRvby1lYXJseSI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSBzZWVuIHRvbyBlYXJseS4gRXhwZWN0ZWQgb3RoZXIgZW5kIHRhZy4iLAogICAgImVuZC10YWctdG9vLWVhcmx5LW5hbWVkIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKGdvdE5hbWUpcykuIEV4cGVjdGVkIGVuZCB0YWcgKCUoZXhwZWN0ZWROYW1lKXMpLiIsCiAgICAiZW5kLXRhZy10b28tZWFybHktaWdub3JlZCI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSBzZWVuIHRvbyBlYXJseS4gSWdub3JlZC4iLAogICAgImFkb3B0aW9uLWFnZW5jeS0xLjEiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCAxLCAiCiAgICAgICAgInBhcmFncmFwaCAxIG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTEuMiI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDEsICIKICAgICAgICAicGFyYWdyYXBoIDIgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktMS4zIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgMSwgIgogICAgICAgICJwYXJhZ3JhcGggMyBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgImFkb3B0aW9uLWFnZW5jeS00LjQiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCA0LCAiCiAgICAgICAgInBhcmFncmFwaCA0IG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLXRyZWF0ZWQtYXMiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUob3JpZ2luYWxOYW1lKXMpLiBUcmVhdGVkIGFzICUobmV3TmFtZSlzLiIsCiAgICAibm8tZW5kLXRhZyI6CiAgICAgICAgIlRoaXMgZWxlbWVudCAoJShuYW1lKXMpIGhhcyBubyBlbmQgdGFnLiIsCiAgICAidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIGltcGxpZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIGltcGxpZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWltcGxpZXMtdGFibGUtdm9vZG9vIjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycyBpbiAiCiAgICAgICAgInRhYmxlIGNvbnRleHQgY2F1c2VkIHZvb2RvbyBtb2RlLiIsCiAgICAidW5leHBlY3RlZC1oaWRkZW4taW5wdXQtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIGlucHV0IHdpdGggdHlwZSBoaWRkZW4gaW4gdGFibGUgY29udGV4dC4iLAogICAgInVuZXhwZWN0ZWQtZm9ybS1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZm9ybSBpbiB0YWJsZSBjb250ZXh0LiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy10YWJsZS12b29kb28iOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIGluICIKICAgICAgICAidGFibGUgY29udGV4dCBjYXVzZWQgdm9vZG9vIG1vZGUuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW1wbGllcy10YWJsZS12b29kb28iOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiAiCiAgICAgICAgInRhYmxlIGNvbnRleHQgY2F1c2VkIHZvb2RvbyBtb2RlLiIsCiAgICAidW5leHBlY3RlZC1jZWxsLWluLXRhYmxlLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIHRhYmxlIGNlbGwgc3RhcnQgdGFnICglKG5hbWUpcykgIgogICAgICAgICJpbiB0aGUgdGFibGUgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2VsbC1lbmQtdGFnIjoKICAgICAgICAiR290IHRhYmxlIGNlbGwgZW5kIHRhZyAoJShuYW1lKXMpICIKICAgICAgICAid2hpbGUgcmVxdWlyZWQgZW5kIHRhZ3MgYXJlIG1pc3NpbmcuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSBib2R5IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUtcm93IjoKICAgICAgICAiVW5leHBlY3RlZCBpbXBsaWVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgcm93IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLXJvdyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSByb3cgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXNlbGVjdC1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIHNlbGVjdCBzdGFydCB0YWcgaW4gdGhlIHNlbGVjdCBwaGFzZSAiCiAgICAgICAgInRyZWF0ZWQgYXMgc2VsZWN0IGVuZCB0YWcuIiwKICAgICJ1bmV4cGVjdGVkLWlucHV0LWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW5wdXQgc3RhcnQgdGFnIGluIHRoZSBzZWxlY3QgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyB0b2tlbiAoJShuYW1lKXMgaW4gdGhlIHNlbGVjdCBwaGFzZS4gIgogICAgICAgICJJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSBzZWxlY3QgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtc3RhcnQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgdGFibGUgZWxlbWVudCBzdGFydCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgc2VsZWN0IGluIHRhYmxlIHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC10YWJsZS1lbGVtZW50LWVuZC10YWctaW4tc2VsZWN0LWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCB0YWJsZSBlbGVtZW50IGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgc2VsZWN0IGluIHRhYmxlIHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWFmdGVyLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBhZnRlciBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgYWZ0ZXIgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgYWZ0ZXIgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVycyBpbiB0aGUgZnJhbWVzZXQgcGhhc2UuIENoYXJhY3RlcnMgaWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZnJhbWVzZXQtaW4tZnJhbWVzZXQtaW5uZXJodG1sIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIHRva2VuIChmcmFtZXNldCkgIgogICAgICAgICJpbiB0aGUgZnJhbWVzZXQgcGhhc2UgKGlubmVySFRNTCkuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1hZnRlci1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlICIKICAgICAgICAiYWZ0ZXIgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgYWZ0ZXIgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1ib2R5LWlubmVyaHRtbCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyBhZnRlciBib2R5KGlubmVySHRtbCkiLAogICAgImV4cGVjdGVkLWVvZi1idXQtZ290LWNoYXIiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzLiBFeHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImV4cGVjdGVkLWVvZi1idXQtZ290LXN0YXJ0LXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykiCiAgICAgICAgIi4gRXhwZWN0ZWQgZW5kIG9mIGZpbGUuIiwKICAgICJleHBlY3RlZC1lb2YtYnV0LWdvdC1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykiCiAgICAgICAgIi4gRXhwZWN0ZWQgZW5kIG9mIGZpbGUuIiwKICAgICJlb2YtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCB0YWJsZSBjb250ZW50LiIsCiAgICAiZW9mLWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIHNlbGVjdCBjb250ZW50LiIsCiAgICAiZW9mLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgZnJhbWVzZXQgY29udGVudC4iLAogICAgImVvZi1pbi1zY3JpcHQtaW4tc2NyaXB0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgc2NyaXB0IGNvbnRlbnQuIiwKICAgICJlb2YtaW4tZm9yZWlnbi1sYW5kcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGZvcmVpZ24gY29udGVudCIsCiAgICAibm9uLXZvaWQtZWxlbWVudC13aXRoLXRyYWlsaW5nLXNvbGlkdXMiOgogICAgICAgICJUcmFpbGluZyBzb2xpZHVzIG5vdCBhbGxvd2VkIG9uIGVsZW1lbnQgJShuYW1lKXMiLAogICAgInVuZXhwZWN0ZWQtaHRtbC1lbGVtZW50LWluLWZvcmVpZ24tY29udGVudCI6CiAgICAgICAgIkVsZW1lbnQgJShuYW1lKXMgbm90IGFsbG93ZWQgaW4gYSBub24taHRtbCBjb250ZXh0IiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYmVmb3JlLWh0bWwiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBiZWZvcmUgaHRtbC4iLAogICAgInVuZXhwZWN0ZWQtaW5oZWFkLW5vc2NyaXB0LXRhZyI6CiAgICAgICAgIkVsZW1lbnQgJShuYW1lKXMgbm90IGFsbG93ZWQgaW4gYSBpbmhlYWQtbm9zY3JpcHQgY29udGV4dCIsCiAgICAiZW9mLWluLWhlYWQtbm9zY3JpcHQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBpbmhlYWQtbm9zY3JpcHQgY29udGVudCIsCiAgICAiY2hhci1pbi1oZWFkLW5vc2NyaXB0IjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVyLiBFeHBlY3RlZCBpbmhlYWQtbm9zY3JpcHQgY29udGVudCIsCiAgICAiWFhYLXVuZGVmaW5lZC1lcnJvciI6CiAgICAgICAgIlVuZGVmaW5lZCBlcnJvciAodGhpcyBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkKSIsCn0KCm5hbWVzcGFjZXMgPSB7CiAgICAiaHRtbCI6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKICAgICJtYXRobWwiOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsCiAgICAic3ZnIjogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKICAgICJ4bGluayI6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgICJ4bWwiOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKICAgICJ4bWxucyI6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKfQoKc2NvcGluZ0VsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcHBsZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjYXB0aW9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaHRtbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1hcnF1ZWUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0YWJsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGgiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1pIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW4iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1zIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtdGV4dCIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAiYW5ub3RhdGlvbi14bWwiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImZvcmVpZ25PYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImRlc2MiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgInRpdGxlIiksCl0pCgpmb3JtYXR0aW5nRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImEiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmlnIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29kZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImVtIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZm9udCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJub2JyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNtYWxsIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic3RyaWtlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic3Ryb25nIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ1IikKXSkKCnNwZWNpYWxFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYWRkcmVzcyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFwcGxldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFyZWEiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcnRpY2xlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXNpZGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiYXNlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmFzZWZvbnQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiZ3NvdW5kIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmxvY2txdW90ZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJvZHkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJ1dHRvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNhcHRpb24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjZW50ZXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb2wiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb2xncm91cCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvbW1hbmQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRldGFpbHMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkaXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkaXYiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImR0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZW1iZWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmaWVsZHNldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZpZ3VyZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZvb3RlciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZvcm0iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmcmFtZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZyYW1lc2V0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDEiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoMiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImgzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoNSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImg2IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaGVhZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImhlYWRlciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImhyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaHRtbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImlmcmFtZSIpLAogICAgIyBOb3RlIHRoYXQgaW1hZ2UgaXMgY29tbWVudGVkIG91dCBpbiB0aGUgc3BlYyBhcyAidGhpcyBpc24ndCBhbgogICAgIyBlbGVtZW50IHRoYXQgY2FuIGVuZCB1cCBvbiB0aGUgc3RhY2ssIHNvIGl0IGRvZXNuJ3QgbWF0dGVyLCIKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpbWFnZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImltZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImlucHV0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaXNpbmRleCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImxpIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibGluayIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImxpc3RpbmciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtYXJxdWVlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWVudSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1ldGEiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJuYXYiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJub2VtYmVkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9mcmFtZXMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJub3NjcmlwdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInBhcmFtIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicGxhaW50ZXh0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicHJlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic2NyaXB0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic2VjdGlvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNlbGVjdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInN0eWxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGFibGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0Ym9keSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGV4dGFyZWEiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0Zm9vdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRoIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGhlYWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aXRsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidWwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ3YnIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ4bXAiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImZvcmVpZ25PYmplY3QiKQpdKQoKaHRtbEludGVncmF0aW9uUG9pbnRFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJhbm5vdGFpb24teG1sIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJmb3JlaWduT2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJkZXNjIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJ0aXRsZSIpCl0pCgptYXRobWxUZXh0SW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1pIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW4iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1zIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtdGV4dCIpCl0pCgphZGp1c3RTVkdBdHRyaWJ1dGVzID0gewogICAgImF0dHJpYnV0ZW5hbWUiOiAiYXR0cmlidXRlTmFtZSIsCiAgICAiYXR0cmlidXRldHlwZSI6ICJhdHRyaWJ1dGVUeXBlIiwKICAgICJiYXNlZnJlcXVlbmN5IjogImJhc2VGcmVxdWVuY3kiLAogICAgImJhc2Vwcm9maWxlIjogImJhc2VQcm9maWxlIiwKICAgICJjYWxjbW9kZSI6ICJjYWxjTW9kZSIsCiAgICAiY2xpcHBhdGh1bml0cyI6ICJjbGlwUGF0aFVuaXRzIiwKICAgICJjb250ZW50c2NyaXB0dHlwZSI6ICJjb250ZW50U2NyaXB0VHlwZSIsCiAgICAiY29udGVudHN0eWxldHlwZSI6ICJjb250ZW50U3R5bGVUeXBlIiwKICAgICJkaWZmdXNlY29uc3RhbnQiOiAiZGlmZnVzZUNvbnN0YW50IiwKICAgICJlZGdlbW9kZSI6ICJlZGdlTW9kZSIsCiAgICAiZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZCI6ICJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIiwKICAgICJmaWx0ZXJyZXMiOiAiZmlsdGVyUmVzIiwKICAgICJmaWx0ZXJ1bml0cyI6ICJmaWx0ZXJVbml0cyIsCiAgICAiZ2x5cGhyZWYiOiAiZ2x5cGhSZWYiLAogICAgImdyYWRpZW50dHJhbnNmb3JtIjogImdyYWRpZW50VHJhbnNmb3JtIiwKICAgICJncmFkaWVudHVuaXRzIjogImdyYWRpZW50VW5pdHMiLAogICAgImtlcm5lbG1hdHJpeCI6ICJrZXJuZWxNYXRyaXgiLAogICAgImtlcm5lbHVuaXRsZW5ndGgiOiAia2VybmVsVW5pdExlbmd0aCIsCiAgICAia2V5cG9pbnRzIjogImtleVBvaW50cyIsCiAgICAia2V5c3BsaW5lcyI6ICJrZXlTcGxpbmVzIiwKICAgICJrZXl0aW1lcyI6ICJrZXlUaW1lcyIsCiAgICAibGVuZ3RoYWRqdXN0IjogImxlbmd0aEFkanVzdCIsCiAgICAibGltaXRpbmdjb25lYW5nbGUiOiAibGltaXRpbmdDb25lQW5nbGUiLAogICAgIm1hcmtlcmhlaWdodCI6ICJtYXJrZXJIZWlnaHQiLAogICAgIm1hcmtlcnVuaXRzIjogIm1hcmtlclVuaXRzIiwKICAgICJtYXJrZXJ3aWR0aCI6ICJtYXJrZXJXaWR0aCIsCiAgICAibWFza2NvbnRlbnR1bml0cyI6ICJtYXNrQ29udGVudFVuaXRzIiwKICAgICJtYXNrdW5pdHMiOiAibWFza1VuaXRzIiwKICAgICJudW1vY3RhdmVzIjogIm51bU9jdGF2ZXMiLAogICAgInBhdGhsZW5ndGgiOiAicGF0aExlbmd0aCIsCiAgICAicGF0dGVybmNvbnRlbnR1bml0cyI6ICJwYXR0ZXJuQ29udGVudFVuaXRzIiwKICAgICJwYXR0ZXJudHJhbnNmb3JtIjogInBhdHRlcm5UcmFuc2Zvcm0iLAogICAgInBhdHRlcm51bml0cyI6ICJwYXR0ZXJuVW5pdHMiLAogICAgInBvaW50c2F0eCI6ICJwb2ludHNBdFgiLAogICAgInBvaW50c2F0eSI6ICJwb2ludHNBdFkiLAogICAgInBvaW50c2F0eiI6ICJwb2ludHNBdFoiLAogICAgInByZXNlcnZlYWxwaGEiOiAicHJlc2VydmVBbHBoYSIsCiAgICAicHJlc2VydmVhc3BlY3RyYXRpbyI6ICJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwKICAgICJwcmltaXRpdmV1bml0cyI6ICJwcmltaXRpdmVVbml0cyIsCiAgICAicmVmeCI6ICJyZWZYIiwKICAgICJyZWZ5IjogInJlZlkiLAogICAgInJlcGVhdGNvdW50IjogInJlcGVhdENvdW50IiwKICAgICJyZXBlYXRkdXIiOiAicmVwZWF0RHVyIiwKICAgICJyZXF1aXJlZGV4dGVuc2lvbnMiOiAicmVxdWlyZWRFeHRlbnNpb25zIiwKICAgICJyZXF1aXJlZGZlYXR1cmVzIjogInJlcXVpcmVkRmVhdHVyZXMiLAogICAgInNwZWN1bGFyY29uc3RhbnQiOiAic3BlY3VsYXJDb25zdGFudCIsCiAgICAic3BlY3VsYXJleHBvbmVudCI6ICJzcGVjdWxhckV4cG9uZW50IiwKICAgICJzcHJlYWRtZXRob2QiOiAic3ByZWFkTWV0aG9kIiwKICAgICJzdGFydG9mZnNldCI6ICJzdGFydE9mZnNldCIsCiAgICAic3RkZGV2aWF0aW9uIjogInN0ZERldmlhdGlvbiIsCiAgICAic3RpdGNodGlsZXMiOiAic3RpdGNoVGlsZXMiLAogICAgInN1cmZhY2VzY2FsZSI6ICJzdXJmYWNlU2NhbGUiLAogICAgInN5c3RlbWxhbmd1YWdlIjogInN5c3RlbUxhbmd1YWdlIiwKICAgICJ0YWJsZXZhbHVlcyI6ICJ0YWJsZVZhbHVlcyIsCiAgICAidGFyZ2V0eCI6ICJ0YXJnZXRYIiwKICAgICJ0YXJnZXR5IjogInRhcmdldFkiLAogICAgInRleHRsZW5ndGgiOiAidGV4dExlbmd0aCIsCiAgICAidmlld2JveCI6ICJ2aWV3Qm94IiwKICAgICJ2aWV3dGFyZ2V0IjogInZpZXdUYXJnZXQiLAogICAgInhjaGFubmVsc2VsZWN0b3IiOiAieENoYW5uZWxTZWxlY3RvciIsCiAgICAieWNoYW5uZWxzZWxlY3RvciI6ICJ5Q2hhbm5lbFNlbGVjdG9yIiwKICAgICJ6b29tYW5kcGFuIjogInpvb21BbmRQYW4iCn0KCmFkanVzdE1hdGhNTEF0dHJpYnV0ZXMgPSB7ImRlZmluaXRpb251cmwiOiAiZGVmaW5pdGlvblVSTCJ9CgphZGp1c3RGb3JlaWduQXR0cmlidXRlcyA9IHsKICAgICJ4bGluazphY3R1YXRlIjogKCJ4bGluayIsICJhY3R1YXRlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6YXJjcm9sZSI6ICgieGxpbmsiLCAiYXJjcm9sZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOmhyZWYiOiAoInhsaW5rIiwgImhyZWYiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazpyb2xlIjogKCJ4bGluayIsICJyb2xlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6c2hvdyI6ICgieGxpbmsiLCAic2hvdyIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnRpdGxlIjogKCJ4bGluayIsICJ0aXRsZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnR5cGUiOiAoInhsaW5rIiwgInR5cGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bWw6YmFzZSI6ICgieG1sIiwgImJhc2UiLCBuYW1lc3BhY2VzWyJ4bWwiXSksCiAgICAieG1sOmxhbmciOiAoInhtbCIsICJsYW5nIiwgbmFtZXNwYWNlc1sieG1sIl0pLAogICAgInhtbDpzcGFjZSI6ICgieG1sIiwgInNwYWNlIiwgbmFtZXNwYWNlc1sieG1sIl0pLAogICAgInhtbG5zIjogKE5vbmUsICJ4bWxucyIsIG5hbWVzcGFjZXNbInhtbG5zIl0pLAogICAgInhtbG5zOnhsaW5rIjogKCJ4bWxucyIsICJ4bGluayIsIG5hbWVzcGFjZXNbInhtbG5zIl0pCn0KCnVuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMgPSBkaWN0KFsoKG5zLCBsb2NhbCksIHFuYW1lKSBmb3IgcW5hbWUsIChwcmVmaXgsIGxvY2FsLCBucykgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzLml0ZW1zKCldKQoKc3BhY2VDaGFyYWN0ZXJzID0gZnJvemVuc2V0KFsKICAgICJcdCIsCiAgICAiXG4iLAogICAgIlx1MDAwQyIsCiAgICAiICIsCiAgICAiXHIiCl0pCgp0YWJsZUluc2VydE1vZGVFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAidGFibGUiLAogICAgInRib2R5IiwKICAgICJ0Zm9vdCIsCiAgICAidGhlYWQiLAogICAgInRyIgpdKQoKYXNjaWlMb3dlcmNhc2UgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX2xvd2VyY2FzZSkKYXNjaWlVcHBlcmNhc2UgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSkKYXNjaWlMZXR0ZXJzID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV9sZXR0ZXJzKQpkaWdpdHMgPSBmcm96ZW5zZXQoc3RyaW5nLmRpZ2l0cykKaGV4RGlnaXRzID0gZnJvemVuc2V0KHN0cmluZy5oZXhkaWdpdHMpCgphc2NpaVVwcGVyMkxvd2VyID0gZGljdChbKG9yZChjKSwgb3JkKGMubG93ZXIoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlXSkKCiMgSGVhZGluZyBlbGVtZW50cyBuZWVkIHRvIGJlIG9yZGVyZWQKaGVhZGluZ0VsZW1lbnRzID0gKAogICAgImgxIiwKICAgICJoMiIsCiAgICAiaDMiLAogICAgImg0IiwKICAgICJoNSIsCiAgICAiaDYiCikKCnZvaWRFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAiYmFzZSIsCiAgICAiY29tbWFuZCIsCiAgICAiZXZlbnQtc291cmNlIiwKICAgICJsaW5rIiwKICAgICJtZXRhIiwKICAgICJociIsCiAgICAiYnIiLAogICAgImltZyIsCiAgICAiZW1iZWQiLAogICAgInBhcmFtIiwKICAgICJhcmVhIiwKICAgICJjb2wiLAogICAgImlucHV0IiwKICAgICJzb3VyY2UiLAogICAgInRyYWNrIgpdKQoKY2RhdGFFbGVtZW50cyA9IGZyb3plbnNldChbJ3RpdGxlJywgJ3RleHRhcmVhJ10pCgpyY2RhdGFFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAnc3R5bGUnLAogICAgJ3NjcmlwdCcsCiAgICAneG1wJywKICAgICdpZnJhbWUnLAogICAgJ25vZW1iZWQnLAogICAgJ25vZnJhbWVzJywKICAgICdub3NjcmlwdCcKXSkKCmJvb2xlYW5BdHRyaWJ1dGVzID0gewogICAgIiI6IGZyb3plbnNldChbImlycmVsZXZhbnQiXSksCiAgICAic3R5bGUiOiBmcm96ZW5zZXQoWyJzY29wZWQiXSksCiAgICAiaW1nIjogZnJvemVuc2V0KFsiaXNtYXAiXSksCiAgICAiYXVkaW8iOiBmcm96ZW5zZXQoWyJhdXRvcGxheSIsICJjb250cm9scyJdKSwKICAgICJ2aWRlbyI6IGZyb3plbnNldChbImF1dG9wbGF5IiwgImNvbnRyb2xzIl0pLAogICAgInNjcmlwdCI6IGZyb3plbnNldChbImRlZmVyIiwgImFzeW5jIl0pLAogICAgImRldGFpbHMiOiBmcm96ZW5zZXQoWyJvcGVuIl0pLAogICAgImRhdGFncmlkIjogZnJvemVuc2V0KFsibXVsdGlwbGUiLCAiZGlzYWJsZWQiXSksCiAgICAiY29tbWFuZCI6IGZyb3plbnNldChbImhpZGRlbiIsICJkaXNhYmxlZCIsICJjaGVja2VkIiwgImRlZmF1bHQiXSksCiAgICAiaHIiOiBmcm96ZW5zZXQoWyJub3NoYWRlIl0pLAogICAgIm1lbnUiOiBmcm96ZW5zZXQoWyJhdXRvc3VibWl0Il0pLAogICAgImZpZWxkc2V0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiXSksCiAgICAib3B0aW9uIjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAic2VsZWN0ZWQiXSksCiAgICAib3B0Z3JvdXAiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSJdKSwKICAgICJidXR0b24iOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJhdXRvZm9jdXMiXSksCiAgICAiaW5wdXQiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSIsICJyZXF1aXJlZCIsICJhdXRvZm9jdXMiLCAiY2hlY2tlZCIsICJpc21hcCJdKSwKICAgICJzZWxlY3QiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSIsICJhdXRvZm9jdXMiLCAibXVsdGlwbGUiXSksCiAgICAib3V0cHV0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiXSksCn0KCiMgZW50aXRpZXNXaW5kb3dzMTI1MiBoYXMgdG8gYmUgX29yZGVyZWRfIGFuZCBuZWVkcyB0byBoYXZlIGFuIGluZGV4LiBJdAojIHRoZXJlZm9yZSBjYW4ndCBiZSBhIGZyb3plbnNldC4KZW50aXRpZXNXaW5kb3dzMTI1MiA9ICgKICAgIDgzNjQsICAgIyAweDgwICAweDIwQUMgIEVVUk8gU0lHTgogICAgNjU1MzMsICAjIDB4ODEgICAgICAgICAgVU5ERUZJTkVECiAgICA4MjE4LCAgICMgMHg4MiAgMHgyMDFBICBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKICAgIDQwMiwgICAgIyAweDgzICAweDAxOTIgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSwogICAgODIyMiwgICAjIDB4ODQgIDB4MjAxRSAgRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCiAgICA4MjMwLCAgICMgMHg4NSAgMHgyMDI2ICBIT1JJWk9OVEFMIEVMTElQU0lTCiAgICA4MjI0LCAgICMgMHg4NiAgMHgyMDIwICBEQUdHRVIKICAgIDgyMjUsICAgIyAweDg3ICAweDIwMjEgIERPVUJMRSBEQUdHRVIKICAgIDcxMCwgICAgIyAweDg4ICAweDAyQzYgIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAogICAgODI0MCwgICAjIDB4ODkgIDB4MjAzMCAgUEVSIE1JTExFIFNJR04KICAgIDM1MiwgICAgIyAweDhBICAweDAxNjAgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgogICAgODI0OSwgICAjIDB4OEIgIDB4MjAzOSAgU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKICAgIDMzOCwgICAgIyAweDhDICAweDAxNTIgIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKICAgIDY1NTMzLCAgIyAweDhEICAgICAgICAgIFVOREVGSU5FRAogICAgMzgxLCAgICAjIDB4OEUgIDB4MDE3RCAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCiAgICA2NTUzMywgICMgMHg4RiAgICAgICAgICBVTkRFRklORUQKICAgIDY1NTMzLCAgIyAweDkwICAgICAgICAgIFVOREVGSU5FRAogICAgODIxNiwgICAjIDB4OTEgIDB4MjAxOCAgTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMTcsICAgIyAweDkyICAweDIwMTkgIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSwogICAgODIyMCwgICAjIDB4OTMgIDB4MjAxQyAgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMjEsICAgIyAweDk0ICAweDIwMUQgIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSwogICAgODIyNiwgICAjIDB4OTUgIDB4MjAyMiAgQlVMTEVUCiAgICA4MjExLCAgICMgMHg5NiAgMHgyMDEzICBFTiBEQVNICiAgICA4MjEyLCAgICMgMHg5NyAgMHgyMDE0ICBFTSBEQVNICiAgICA3MzIsICAgICMgMHg5OCAgMHgwMkRDICBTTUFMTCBUSUxERQogICAgODQ4MiwgICAjIDB4OTkgIDB4MjEyMiAgVFJBREUgTUFSSyBTSUdOCiAgICAzNTMsICAgICMgMHg5QSAgMHgwMTYxICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCiAgICA4MjUwLCAgICMgMHg5QiAgMHgyMDNBICBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKICAgIDMzOSwgICAgIyAweDlDICAweDAxNTMgIExBVElOIFNNQUxMIExJR0FUVVJFIE9FCiAgICA2NTUzMywgICMgMHg5RCAgICAgICAgICBVTkRFRklORUQKICAgIDM4MiwgICAgIyAweDlFICAweDAxN0UgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KICAgIDM3NiAgICAgIyAweDlGICAweDAxNzggIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKQoKeG1sRW50aXRpZXMgPSBmcm96ZW5zZXQoWydsdDsnLCAnZ3Q7JywgJ2FtcDsnLCAnYXBvczsnLCAncXVvdDsnXSkKCmVudGl0aWVzID0gewogICAgIkFFbGlnIjogIlx4YzYiLAogICAgIkFFbGlnOyI6ICJceGM2IiwKICAgICJBTVAiOiAiJiIsCiAgICAiQU1QOyI6ICImIiwKICAgICJBYWN1dGUiOiAiXHhjMSIsCiAgICAiQWFjdXRlOyI6ICJceGMxIiwKICAgICJBYnJldmU7IjogIlx1MDEwMiIsCiAgICAiQWNpcmMiOiAiXHhjMiIsCiAgICAiQWNpcmM7IjogIlx4YzIiLAogICAgIkFjeTsiOiAiXHUwNDEwIiwKICAgICJBZnI7IjogIlxVMDAwMWQ1MDQiLAogICAgIkFncmF2ZSI6ICJceGMwIiwKICAgICJBZ3JhdmU7IjogIlx4YzAiLAogICAgIkFscGhhOyI6ICJcdTAzOTEiLAogICAgIkFtYWNyOyI6ICJcdTAxMDAiLAogICAgIkFuZDsiOiAiXHUyYTUzIiwKICAgICJBb2dvbjsiOiAiXHUwMTA0IiwKICAgICJBb3BmOyI6ICJcVTAwMDFkNTM4IiwKICAgICJBcHBseUZ1bmN0aW9uOyI6ICJcdTIwNjEiLAogICAgIkFyaW5nIjogIlx4YzUiLAogICAgIkFyaW5nOyI6ICJceGM1IiwKICAgICJBc2NyOyI6ICJcVTAwMDFkNDljIiwKICAgICJBc3NpZ247IjogIlx1MjI1NCIsCiAgICAiQXRpbGRlIjogIlx4YzMiLAogICAgIkF0aWxkZTsiOiAiXHhjMyIsCiAgICAiQXVtbCI6ICJceGM0IiwKICAgICJBdW1sOyI6ICJceGM0IiwKICAgICJCYWNrc2xhc2g7IjogIlx1MjIxNiIsCiAgICAiQmFydjsiOiAiXHUyYWU3IiwKICAgICJCYXJ3ZWQ7IjogIlx1MjMwNiIsCiAgICAiQmN5OyI6ICJcdTA0MTEiLAogICAgIkJlY2F1c2U7IjogIlx1MjIzNSIsCiAgICAiQmVybm91bGxpczsiOiAiXHUyMTJjIiwKICAgICJCZXRhOyI6ICJcdTAzOTIiLAogICAgIkJmcjsiOiAiXFUwMDAxZDUwNSIsCiAgICAiQm9wZjsiOiAiXFUwMDAxZDUzOSIsCiAgICAiQnJldmU7IjogIlx1MDJkOCIsCiAgICAiQnNjcjsiOiAiXHUyMTJjIiwKICAgICJCdW1wZXE7IjogIlx1MjI0ZSIsCiAgICAiQ0hjeTsiOiAiXHUwNDI3IiwKICAgICJDT1BZIjogIlx4YTkiLAogICAgIkNPUFk7IjogIlx4YTkiLAogICAgIkNhY3V0ZTsiOiAiXHUwMTA2IiwKICAgICJDYXA7IjogIlx1MjJkMiIsCiAgICAiQ2FwaXRhbERpZmZlcmVudGlhbEQ7IjogIlx1MjE0NSIsCiAgICAiQ2F5bGV5czsiOiAiXHUyMTJkIiwKICAgICJDY2Fyb247IjogIlx1MDEwYyIsCiAgICAiQ2NlZGlsIjogIlx4YzciLAogICAgIkNjZWRpbDsiOiAiXHhjNyIsCiAgICAiQ2NpcmM7IjogIlx1MDEwOCIsCiAgICAiQ2NvbmludDsiOiAiXHUyMjMwIiwKICAgICJDZG90OyI6ICJcdTAxMGEiLAogICAgIkNlZGlsbGE7IjogIlx4YjgiLAogICAgIkNlbnRlckRvdDsiOiAiXHhiNyIsCiAgICAiQ2ZyOyI6ICJcdTIxMmQiLAogICAgIkNoaTsiOiAiXHUwM2E3IiwKICAgICJDaXJjbGVEb3Q7IjogIlx1MjI5OSIsCiAgICAiQ2lyY2xlTWludXM7IjogIlx1MjI5NiIsCiAgICAiQ2lyY2xlUGx1czsiOiAiXHUyMjk1IiwKICAgICJDaXJjbGVUaW1lczsiOiAiXHUyMjk3IiwKICAgICJDbG9ja3dpc2VDb250b3VySW50ZWdyYWw7IjogIlx1MjIzMiIsCiAgICAiQ2xvc2VDdXJseURvdWJsZVF1b3RlOyI6ICJcdTIwMWQiLAogICAgIkNsb3NlQ3VybHlRdW90ZTsiOiAiXHUyMDE5IiwKICAgICJDb2xvbjsiOiAiXHUyMjM3IiwKICAgICJDb2xvbmU7IjogIlx1MmE3NCIsCiAgICAiQ29uZ3J1ZW50OyI6ICJcdTIyNjEiLAogICAgIkNvbmludDsiOiAiXHUyMjJmIiwKICAgICJDb250b3VySW50ZWdyYWw7IjogIlx1MjIyZSIsCiAgICAiQ29wZjsiOiAiXHUyMTAyIiwKICAgICJDb3Byb2R1Y3Q7IjogIlx1MjIxMCIsCiAgICAiQ291bnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjMzIiwKICAgICJDcm9zczsiOiAiXHUyYTJmIiwKICAgICJDc2NyOyI6ICJcVTAwMDFkNDllIiwKICAgICJDdXA7IjogIlx1MjJkMyIsCiAgICAiQ3VwQ2FwOyI6ICJcdTIyNGQiLAogICAgIkREOyI6ICJcdTIxNDUiLAogICAgIkREb3RyYWhkOyI6ICJcdTI5MTEiLAogICAgIkRKY3k7IjogIlx1MDQwMiIsCiAgICAiRFNjeTsiOiAiXHUwNDA1IiwKICAgICJEWmN5OyI6ICJcdTA0MGYiLAogICAgIkRhZ2dlcjsiOiAiXHUyMDIxIiwKICAgICJEYXJyOyI6ICJcdTIxYTEiLAogICAgIkRhc2h2OyI6ICJcdTJhZTQiLAogICAgIkRjYXJvbjsiOiAiXHUwMTBlIiwKICAgICJEY3k7IjogIlx1MDQxNCIsCiAgICAiRGVsOyI6ICJcdTIyMDciLAogICAgIkRlbHRhOyI6ICJcdTAzOTQiLAogICAgIkRmcjsiOiAiXFUwMDAxZDUwNyIsCiAgICAiRGlhY3JpdGljYWxBY3V0ZTsiOiAiXHhiNCIsCiAgICAiRGlhY3JpdGljYWxEb3Q7IjogIlx1MDJkOSIsCiAgICAiRGlhY3JpdGljYWxEb3VibGVBY3V0ZTsiOiAiXHUwMmRkIiwKICAgICJEaWFjcml0aWNhbEdyYXZlOyI6ICJgIiwKICAgICJEaWFjcml0aWNhbFRpbGRlOyI6ICJcdTAyZGMiLAogICAgIkRpYW1vbmQ7IjogIlx1MjJjNCIsCiAgICAiRGlmZmVyZW50aWFsRDsiOiAiXHUyMTQ2IiwKICAgICJEb3BmOyI6ICJcVTAwMDFkNTNiIiwKICAgICJEb3Q7IjogIlx4YTgiLAogICAgIkRvdERvdDsiOiAiXHUyMGRjIiwKICAgICJEb3RFcXVhbDsiOiAiXHUyMjUwIiwKICAgICJEb3VibGVDb250b3VySW50ZWdyYWw7IjogIlx1MjIyZiIsCiAgICAiRG91YmxlRG90OyI6ICJceGE4IiwKICAgICJEb3VibGVEb3duQXJyb3c7IjogIlx1MjFkMyIsCiAgICAiRG91YmxlTGVmdEFycm93OyI6ICJcdTIxZDAiLAogICAgIkRvdWJsZUxlZnRSaWdodEFycm93OyI6ICJcdTIxZDQiLAogICAgIkRvdWJsZUxlZnRUZWU7IjogIlx1MmFlNCIsCiAgICAiRG91YmxlTG9uZ0xlZnRBcnJvdzsiOiAiXHUyN2Y4IiwKICAgICJEb3VibGVMb25nTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjdmYSIsCiAgICAiRG91YmxlTG9uZ1JpZ2h0QXJyb3c7IjogIlx1MjdmOSIsCiAgICAiRG91YmxlUmlnaHRBcnJvdzsiOiAiXHUyMWQyIiwKICAgICJEb3VibGVSaWdodFRlZTsiOiAiXHUyMmE4IiwKICAgICJEb3VibGVVcEFycm93OyI6ICJcdTIxZDEiLAogICAgIkRvdWJsZVVwRG93bkFycm93OyI6ICJcdTIxZDUiLAogICAgIkRvdWJsZVZlcnRpY2FsQmFyOyI6ICJcdTIyMjUiLAogICAgIkRvd25BcnJvdzsiOiAiXHUyMTkzIiwKICAgICJEb3duQXJyb3dCYXI7IjogIlx1MjkxMyIsCiAgICAiRG93bkFycm93VXBBcnJvdzsiOiAiXHUyMWY1IiwKICAgICJEb3duQnJldmU7IjogIlx1MDMxMSIsCiAgICAiRG93bkxlZnRSaWdodFZlY3RvcjsiOiAiXHUyOTUwIiwKICAgICJEb3duTGVmdFRlZVZlY3RvcjsiOiAiXHUyOTVlIiwKICAgICJEb3duTGVmdFZlY3RvcjsiOiAiXHUyMWJkIiwKICAgICJEb3duTGVmdFZlY3RvckJhcjsiOiAiXHUyOTU2IiwKICAgICJEb3duUmlnaHRUZWVWZWN0b3I7IjogIlx1Mjk1ZiIsCiAgICAiRG93blJpZ2h0VmVjdG9yOyI6ICJcdTIxYzEiLAogICAgIkRvd25SaWdodFZlY3RvckJhcjsiOiAiXHUyOTU3IiwKICAgICJEb3duVGVlOyI6ICJcdTIyYTQiLAogICAgIkRvd25UZWVBcnJvdzsiOiAiXHUyMWE3IiwKICAgICJEb3duYXJyb3c7IjogIlx1MjFkMyIsCiAgICAiRHNjcjsiOiAiXFUwMDAxZDQ5ZiIsCiAgICAiRHN0cm9rOyI6ICJcdTAxMTAiLAogICAgIkVORzsiOiAiXHUwMTRhIiwKICAgICJFVEgiOiAiXHhkMCIsCiAgICAiRVRIOyI6ICJceGQwIiwKICAgICJFYWN1dGUiOiAiXHhjOSIsCiAgICAiRWFjdXRlOyI6ICJceGM5IiwKICAgICJFY2Fyb247IjogIlx1MDExYSIsCiAgICAiRWNpcmMiOiAiXHhjYSIsCiAgICAiRWNpcmM7IjogIlx4Y2EiLAogICAgIkVjeTsiOiAiXHUwNDJkIiwKICAgICJFZG90OyI6ICJcdTAxMTYiLAogICAgIkVmcjsiOiAiXFUwMDAxZDUwOCIsCiAgICAiRWdyYXZlIjogIlx4YzgiLAogICAgIkVncmF2ZTsiOiAiXHhjOCIsCiAgICAiRWxlbWVudDsiOiAiXHUyMjA4IiwKICAgICJFbWFjcjsiOiAiXHUwMTEyIiwKICAgICJFbXB0eVNtYWxsU3F1YXJlOyI6ICJcdTI1ZmIiLAogICAgIkVtcHR5VmVyeVNtYWxsU3F1YXJlOyI6ICJcdTI1YWIiLAogICAgIkVvZ29uOyI6ICJcdTAxMTgiLAogICAgIkVvcGY7IjogIlxVMDAwMWQ1M2MiLAogICAgIkVwc2lsb247IjogIlx1MDM5NSIsCiAgICAiRXF1YWw7IjogIlx1MmE3NSIsCiAgICAiRXF1YWxUaWxkZTsiOiAiXHUyMjQyIiwKICAgICJFcXVpbGlicml1bTsiOiAiXHUyMWNjIiwKICAgICJFc2NyOyI6ICJcdTIxMzAiLAogICAgIkVzaW07IjogIlx1MmE3MyIsCiAgICAiRXRhOyI6ICJcdTAzOTciLAogICAgIkV1bWwiOiAiXHhjYiIsCiAgICAiRXVtbDsiOiAiXHhjYiIsCiAgICAiRXhpc3RzOyI6ICJcdTIyMDMiLAogICAgIkV4cG9uZW50aWFsRTsiOiAiXHUyMTQ3IiwKICAgICJGY3k7IjogIlx1MDQyNCIsCiAgICAiRmZyOyI6ICJcVTAwMDFkNTA5IiwKICAgICJGaWxsZWRTbWFsbFNxdWFyZTsiOiAiXHUyNWZjIiwKICAgICJGaWxsZWRWZXJ5U21hbGxTcXVhcmU7IjogIlx1MjVhYSIsCiAgICAiRm9wZjsiOiAiXFUwMDAxZDUzZCIsCiAgICAiRm9yQWxsOyI6ICJcdTIyMDAiLAogICAgIkZvdXJpZXJ0cmY7IjogIlx1MjEzMSIsCiAgICAiRnNjcjsiOiAiXHUyMTMxIiwKICAgICJHSmN5OyI6ICJcdTA0MDMiLAogICAgIkdUIjogIj4iLAogICAgIkdUOyI6ICI+IiwKICAgICJHYW1tYTsiOiAiXHUwMzkzIiwKICAgICJHYW1tYWQ7IjogIlx1MDNkYyIsCiAgICAiR2JyZXZlOyI6ICJcdTAxMWUiLAogICAgIkdjZWRpbDsiOiAiXHUwMTIyIiwKICAgICJHY2lyYzsiOiAiXHUwMTFjIiwKICAgICJHY3k7IjogIlx1MDQxMyIsCiAgICAiR2RvdDsiOiAiXHUwMTIwIiwKICAgICJHZnI7IjogIlxVMDAwMWQ1MGEiLAogICAgIkdnOyI6ICJcdTIyZDkiLAogICAgIkdvcGY7IjogIlxVMDAwMWQ1M2UiLAogICAgIkdyZWF0ZXJFcXVhbDsiOiAiXHUyMjY1IiwKICAgICJHcmVhdGVyRXF1YWxMZXNzOyI6ICJcdTIyZGIiLAogICAgIkdyZWF0ZXJGdWxsRXF1YWw7IjogIlx1MjI2NyIsCiAgICAiR3JlYXRlckdyZWF0ZXI7IjogIlx1MmFhMiIsCiAgICAiR3JlYXRlckxlc3M7IjogIlx1MjI3NyIsCiAgICAiR3JlYXRlclNsYW50RXF1YWw7IjogIlx1MmE3ZSIsCiAgICAiR3JlYXRlclRpbGRlOyI6ICJcdTIyNzMiLAogICAgIkdzY3I7IjogIlxVMDAwMWQ0YTIiLAogICAgIkd0OyI6ICJcdTIyNmIiLAogICAgIkhBUkRjeTsiOiAiXHUwNDJhIiwKICAgICJIYWNlazsiOiAiXHUwMmM3IiwKICAgICJIYXQ7IjogIl4iLAogICAgIkhjaXJjOyI6ICJcdTAxMjQiLAogICAgIkhmcjsiOiAiXHUyMTBjIiwKICAgICJIaWxiZXJ0U3BhY2U7IjogIlx1MjEwYiIsCiAgICAiSG9wZjsiOiAiXHUyMTBkIiwKICAgICJIb3Jpem9udGFsTGluZTsiOiAiXHUyNTAwIiwKICAgICJIc2NyOyI6ICJcdTIxMGIiLAogICAgIkhzdHJvazsiOiAiXHUwMTI2IiwKICAgICJIdW1wRG93bkh1bXA7IjogIlx1MjI0ZSIsCiAgICAiSHVtcEVxdWFsOyI6ICJcdTIyNGYiLAogICAgIklFY3k7IjogIlx1MDQxNSIsCiAgICAiSUpsaWc7IjogIlx1MDEzMiIsCiAgICAiSU9jeTsiOiAiXHUwNDAxIiwKICAgICJJYWN1dGUiOiAiXHhjZCIsCiAgICAiSWFjdXRlOyI6ICJceGNkIiwKICAgICJJY2lyYyI6ICJceGNlIiwKICAgICJJY2lyYzsiOiAiXHhjZSIsCiAgICAiSWN5OyI6ICJcdTA0MTgiLAogICAgIklkb3Q7IjogIlx1MDEzMCIsCiAgICAiSWZyOyI6ICJcdTIxMTEiLAogICAgIklncmF2ZSI6ICJceGNjIiwKICAgICJJZ3JhdmU7IjogIlx4Y2MiLAogICAgIkltOyI6ICJcdTIxMTEiLAogICAgIkltYWNyOyI6ICJcdTAxMmEiLAogICAgIkltYWdpbmFyeUk7IjogIlx1MjE0OCIsCiAgICAiSW1wbGllczsiOiAiXHUyMWQyIiwKICAgICJJbnQ7IjogIlx1MjIyYyIsCiAgICAiSW50ZWdyYWw7IjogIlx1MjIyYiIsCiAgICAiSW50ZXJzZWN0aW9uOyI6ICJcdTIyYzIiLAogICAgIkludmlzaWJsZUNvbW1hOyI6ICJcdTIwNjMiLAogICAgIkludmlzaWJsZVRpbWVzOyI6ICJcdTIwNjIiLAogICAgIklvZ29uOyI6ICJcdTAxMmUiLAogICAgIklvcGY7IjogIlxVMDAwMWQ1NDAiLAogICAgIklvdGE7IjogIlx1MDM5OSIsCiAgICAiSXNjcjsiOiAiXHUyMTEwIiwKICAgICJJdGlsZGU7IjogIlx1MDEyOCIsCiAgICAiSXVrY3k7IjogIlx1MDQwNiIsCiAgICAiSXVtbCI6ICJceGNmIiwKICAgICJJdW1sOyI6ICJceGNmIiwKICAgICJKY2lyYzsiOiAiXHUwMTM0IiwKICAgICJKY3k7IjogIlx1MDQxOSIsCiAgICAiSmZyOyI6ICJcVTAwMDFkNTBkIiwKICAgICJKb3BmOyI6ICJcVTAwMDFkNTQxIiwKICAgICJKc2NyOyI6ICJcVTAwMDFkNGE1IiwKICAgICJKc2VyY3k7IjogIlx1MDQwOCIsCiAgICAiSnVrY3k7IjogIlx1MDQwNCIsCiAgICAiS0hjeTsiOiAiXHUwNDI1IiwKICAgICJLSmN5OyI6ICJcdTA0MGMiLAogICAgIkthcHBhOyI6ICJcdTAzOWEiLAogICAgIktjZWRpbDsiOiAiXHUwMTM2IiwKICAgICJLY3k7IjogIlx1MDQxYSIsCiAgICAiS2ZyOyI6ICJcVTAwMDFkNTBlIiwKICAgICJLb3BmOyI6ICJcVTAwMDFkNTQyIiwKICAgICJLc2NyOyI6ICJcVTAwMDFkNGE2IiwKICAgICJMSmN5OyI6ICJcdTA0MDkiLAogICAgIkxUIjogIjwiLAogICAgIkxUOyI6ICI8IiwKICAgICJMYWN1dGU7IjogIlx1MDEzOSIsCiAgICAiTGFtYmRhOyI6ICJcdTAzOWIiLAogICAgIkxhbmc7IjogIlx1MjdlYSIsCiAgICAiTGFwbGFjZXRyZjsiOiAiXHUyMTEyIiwKICAgICJMYXJyOyI6ICJcdTIxOWUiLAogICAgIkxjYXJvbjsiOiAiXHUwMTNkIiwKICAgICJMY2VkaWw7IjogIlx1MDEzYiIsCiAgICAiTGN5OyI6ICJcdTA0MWIiLAogICAgIkxlZnRBbmdsZUJyYWNrZXQ7IjogIlx1MjdlOCIsCiAgICAiTGVmdEFycm93OyI6ICJcdTIxOTAiLAogICAgIkxlZnRBcnJvd0JhcjsiOiAiXHUyMWU0IiwKICAgICJMZWZ0QXJyb3dSaWdodEFycm93OyI6ICJcdTIxYzYiLAogICAgIkxlZnRDZWlsaW5nOyI6ICJcdTIzMDgiLAogICAgIkxlZnREb3VibGVCcmFja2V0OyI6ICJcdTI3ZTYiLAogICAgIkxlZnREb3duVGVlVmVjdG9yOyI6ICJcdTI5NjEiLAogICAgIkxlZnREb3duVmVjdG9yOyI6ICJcdTIxYzMiLAogICAgIkxlZnREb3duVmVjdG9yQmFyOyI6ICJcdTI5NTkiLAogICAgIkxlZnRGbG9vcjsiOiAiXHUyMzBhIiwKICAgICJMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyMTk0IiwKICAgICJMZWZ0UmlnaHRWZWN0b3I7IjogIlx1Mjk0ZSIsCiAgICAiTGVmdFRlZTsiOiAiXHUyMmEzIiwKICAgICJMZWZ0VGVlQXJyb3c7IjogIlx1MjFhNCIsCiAgICAiTGVmdFRlZVZlY3RvcjsiOiAiXHUyOTVhIiwKICAgICJMZWZ0VHJpYW5nbGU7IjogIlx1MjJiMiIsCiAgICAiTGVmdFRyaWFuZ2xlQmFyOyI6ICJcdTI5Y2YiLAogICAgIkxlZnRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyYjQiLAogICAgIkxlZnRVcERvd25WZWN0b3I7IjogIlx1Mjk1MSIsCiAgICAiTGVmdFVwVGVlVmVjdG9yOyI6ICJcdTI5NjAiLAogICAgIkxlZnRVcFZlY3RvcjsiOiAiXHUyMWJmIiwKICAgICJMZWZ0VXBWZWN0b3JCYXI7IjogIlx1Mjk1OCIsCiAgICAiTGVmdFZlY3RvcjsiOiAiXHUyMWJjIiwKICAgICJMZWZ0VmVjdG9yQmFyOyI6ICJcdTI5NTIiLAogICAgIkxlZnRhcnJvdzsiOiAiXHUyMWQwIiwKICAgICJMZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMWQ0IiwKICAgICJMZXNzRXF1YWxHcmVhdGVyOyI6ICJcdTIyZGEiLAogICAgIkxlc3NGdWxsRXF1YWw7IjogIlx1MjI2NiIsCiAgICAiTGVzc0dyZWF0ZXI7IjogIlx1MjI3NiIsCiAgICAiTGVzc0xlc3M7IjogIlx1MmFhMSIsCiAgICAiTGVzc1NsYW50RXF1YWw7IjogIlx1MmE3ZCIsCiAgICAiTGVzc1RpbGRlOyI6ICJcdTIyNzIiLAogICAgIkxmcjsiOiAiXFUwMDAxZDUwZiIsCiAgICAiTGw7IjogIlx1MjJkOCIsCiAgICAiTGxlZnRhcnJvdzsiOiAiXHUyMWRhIiwKICAgICJMbWlkb3Q7IjogIlx1MDEzZiIsCiAgICAiTG9uZ0xlZnRBcnJvdzsiOiAiXHUyN2Y1IiwKICAgICJMb25nTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjdmNyIsCiAgICAiTG9uZ1JpZ2h0QXJyb3c7IjogIlx1MjdmNiIsCiAgICAiTG9uZ2xlZnRhcnJvdzsiOiAiXHUyN2Y4IiwKICAgICJMb25nbGVmdHJpZ2h0YXJyb3c7IjogIlx1MjdmYSIsCiAgICAiTG9uZ3JpZ2h0YXJyb3c7IjogIlx1MjdmOSIsCiAgICAiTG9wZjsiOiAiXFUwMDAxZDU0MyIsCiAgICAiTG93ZXJMZWZ0QXJyb3c7IjogIlx1MjE5OSIsCiAgICAiTG93ZXJSaWdodEFycm93OyI6ICJcdTIxOTgiLAogICAgIkxzY3I7IjogIlx1MjExMiIsCiAgICAiTHNoOyI6ICJcdTIxYjAiLAogICAgIkxzdHJvazsiOiAiXHUwMTQxIiwKICAgICJMdDsiOiAiXHUyMjZhIiwKICAgICJNYXA7IjogIlx1MjkwNSIsCiAgICAiTWN5OyI6ICJcdTA0MWMiLAogICAgIk1lZGl1bVNwYWNlOyI6ICJcdTIwNWYiLAogICAgIk1lbGxpbnRyZjsiOiAiXHUyMTMzIiwKICAgICJNZnI7IjogIlxVMDAwMWQ1MTAiLAogICAgIk1pbnVzUGx1czsiOiAiXHUyMjEzIiwKICAgICJNb3BmOyI6ICJcVTAwMDFkNTQ0IiwKICAgICJNc2NyOyI6ICJcdTIxMzMiLAogICAgIk11OyI6ICJcdTAzOWMiLAogICAgIk5KY3k7IjogIlx1MDQwYSIsCiAgICAiTmFjdXRlOyI6ICJcdTAxNDMiLAogICAgIk5jYXJvbjsiOiAiXHUwMTQ3IiwKICAgICJOY2VkaWw7IjogIlx1MDE0NSIsCiAgICAiTmN5OyI6ICJcdTA0MWQiLAogICAgIk5lZ2F0aXZlTWVkaXVtU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVnYXRpdmVUaGlja1NwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lZ2F0aXZlVGhpblNwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lZ2F0aXZlVmVyeVRoaW5TcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZXN0ZWRHcmVhdGVyR3JlYXRlcjsiOiAiXHUyMjZiIiwKICAgICJOZXN0ZWRMZXNzTGVzczsiOiAiXHUyMjZhIiwKICAgICJOZXdMaW5lOyI6ICJcbiIsCiAgICAiTmZyOyI6ICJcVTAwMDFkNTExIiwKICAgICJOb0JyZWFrOyI6ICJcdTIwNjAiLAogICAgIk5vbkJyZWFraW5nU3BhY2U7IjogIlx4YTAiLAogICAgIk5vcGY7IjogIlx1MjExNSIsCiAgICAiTm90OyI6ICJcdTJhZWMiLAogICAgIk5vdENvbmdydWVudDsiOiAiXHUyMjYyIiwKICAgICJOb3RDdXBDYXA7IjogIlx1MjI2ZCIsCiAgICAiTm90RG91YmxlVmVydGljYWxCYXI7IjogIlx1MjIyNiIsCiAgICAiTm90RWxlbWVudDsiOiAiXHUyMjA5IiwKICAgICJOb3RFcXVhbDsiOiAiXHUyMjYwIiwKICAgICJOb3RFcXVhbFRpbGRlOyI6ICJcdTIyNDJcdTAzMzgiLAogICAgIk5vdEV4aXN0czsiOiAiXHUyMjA0IiwKICAgICJOb3RHcmVhdGVyOyI6ICJcdTIyNmYiLAogICAgIk5vdEdyZWF0ZXJFcXVhbDsiOiAiXHUyMjcxIiwKICAgICJOb3RHcmVhdGVyRnVsbEVxdWFsOyI6ICJcdTIyNjdcdTAzMzgiLAogICAgIk5vdEdyZWF0ZXJHcmVhdGVyOyI6ICJcdTIyNmJcdTAzMzgiLAogICAgIk5vdEdyZWF0ZXJMZXNzOyI6ICJcdTIyNzkiLAogICAgIk5vdEdyZWF0ZXJTbGFudEVxdWFsOyI6ICJcdTJhN2VcdTAzMzgiLAogICAgIk5vdEdyZWF0ZXJUaWxkZTsiOiAiXHUyMjc1IiwKICAgICJOb3RIdW1wRG93bkh1bXA7IjogIlx1MjI0ZVx1MDMzOCIsCiAgICAiTm90SHVtcEVxdWFsOyI6ICJcdTIyNGZcdTAzMzgiLAogICAgIk5vdExlZnRUcmlhbmdsZTsiOiAiXHUyMmVhIiwKICAgICJOb3RMZWZ0VHJpYW5nbGVCYXI7IjogIlx1MjljZlx1MDMzOCIsCiAgICAiTm90TGVmdFRyaWFuZ2xlRXF1YWw7IjogIlx1MjJlYyIsCiAgICAiTm90TGVzczsiOiAiXHUyMjZlIiwKICAgICJOb3RMZXNzRXF1YWw7IjogIlx1MjI3MCIsCiAgICAiTm90TGVzc0dyZWF0ZXI7IjogIlx1MjI3OCIsCiAgICAiTm90TGVzc0xlc3M7IjogIlx1MjI2YVx1MDMzOCIsCiAgICAiTm90TGVzc1NsYW50RXF1YWw7IjogIlx1MmE3ZFx1MDMzOCIsCiAgICAiTm90TGVzc1RpbGRlOyI6ICJcdTIyNzQiLAogICAgIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyOyI6ICJcdTJhYTJcdTAzMzgiLAogICAgIk5vdE5lc3RlZExlc3NMZXNzOyI6ICJcdTJhYTFcdTAzMzgiLAogICAgIk5vdFByZWNlZGVzOyI6ICJcdTIyODAiLAogICAgIk5vdFByZWNlZGVzRXF1YWw7IjogIlx1MmFhZlx1MDMzOCIsCiAgICAiTm90UHJlY2VkZXNTbGFudEVxdWFsOyI6ICJcdTIyZTAiLAogICAgIk5vdFJldmVyc2VFbGVtZW50OyI6ICJcdTIyMGMiLAogICAgIk5vdFJpZ2h0VHJpYW5nbGU7IjogIlx1MjJlYiIsCiAgICAiTm90UmlnaHRUcmlhbmdsZUJhcjsiOiAiXHUyOWQwXHUwMzM4IiwKICAgICJOb3RSaWdodFRyaWFuZ2xlRXF1YWw7IjogIlx1MjJlZCIsCiAgICAiTm90U3F1YXJlU3Vic2V0OyI6ICJcdTIyOGZcdTAzMzgiLAogICAgIk5vdFNxdWFyZVN1YnNldEVxdWFsOyI6ICJcdTIyZTIiLAogICAgIk5vdFNxdWFyZVN1cGVyc2V0OyI6ICJcdTIyOTBcdTAzMzgiLAogICAgIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWw7IjogIlx1MjJlMyIsCiAgICAiTm90U3Vic2V0OyI6ICJcdTIyODJcdTIwZDIiLAogICAgIk5vdFN1YnNldEVxdWFsOyI6ICJcdTIyODgiLAogICAgIk5vdFN1Y2NlZWRzOyI6ICJcdTIyODEiLAogICAgIk5vdFN1Y2NlZWRzRXF1YWw7IjogIlx1MmFiMFx1MDMzOCIsCiAgICAiTm90U3VjY2VlZHNTbGFudEVxdWFsOyI6ICJcdTIyZTEiLAogICAgIk5vdFN1Y2NlZWRzVGlsZGU7IjogIlx1MjI3Zlx1MDMzOCIsCiAgICAiTm90U3VwZXJzZXQ7IjogIlx1MjI4M1x1MjBkMiIsCiAgICAiTm90U3VwZXJzZXRFcXVhbDsiOiAiXHUyMjg5IiwKICAgICJOb3RUaWxkZTsiOiAiXHUyMjQxIiwKICAgICJOb3RUaWxkZUVxdWFsOyI6ICJcdTIyNDQiLAogICAgIk5vdFRpbGRlRnVsbEVxdWFsOyI6ICJcdTIyNDciLAogICAgIk5vdFRpbGRlVGlsZGU7IjogIlx1MjI0OSIsCiAgICAiTm90VmVydGljYWxCYXI7IjogIlx1MjIyNCIsCiAgICAiTnNjcjsiOiAiXFUwMDAxZDRhOSIsCiAgICAiTnRpbGRlIjogIlx4ZDEiLAogICAgIk50aWxkZTsiOiAiXHhkMSIsCiAgICAiTnU7IjogIlx1MDM5ZCIsCiAgICAiT0VsaWc7IjogIlx1MDE1MiIsCiAgICAiT2FjdXRlIjogIlx4ZDMiLAogICAgIk9hY3V0ZTsiOiAiXHhkMyIsCiAgICAiT2NpcmMiOiAiXHhkNCIsCiAgICAiT2NpcmM7IjogIlx4ZDQiLAogICAgIk9jeTsiOiAiXHUwNDFlIiwKICAgICJPZGJsYWM7IjogIlx1MDE1MCIsCiAgICAiT2ZyOyI6ICJcVTAwMDFkNTEyIiwKICAgICJPZ3JhdmUiOiAiXHhkMiIsCiAgICAiT2dyYXZlOyI6ICJceGQyIiwKICAgICJPbWFjcjsiOiAiXHUwMTRjIiwKICAgICJPbWVnYTsiOiAiXHUwM2E5IiwKICAgICJPbWljcm9uOyI6ICJcdTAzOWYiLAogICAgIk9vcGY7IjogIlxVMDAwMWQ1NDYiLAogICAgIk9wZW5DdXJseURvdWJsZVF1b3RlOyI6ICJcdTIwMWMiLAogICAgIk9wZW5DdXJseVF1b3RlOyI6ICJcdTIwMTgiLAogICAgIk9yOyI6ICJcdTJhNTQiLAogICAgIk9zY3I7IjogIlxVMDAwMWQ0YWEiLAogICAgIk9zbGFzaCI6ICJceGQ4IiwKICAgICJPc2xhc2g7IjogIlx4ZDgiLAogICAgIk90aWxkZSI6ICJceGQ1IiwKICAgICJPdGlsZGU7IjogIlx4ZDUiLAogICAgIk90aW1lczsiOiAiXHUyYTM3IiwKICAgICJPdW1sIjogIlx4ZDYiLAogICAgIk91bWw7IjogIlx4ZDYiLAogICAgIk92ZXJCYXI7IjogIlx1MjAzZSIsCiAgICAiT3ZlckJyYWNlOyI6ICJcdTIzZGUiLAogICAgIk92ZXJCcmFja2V0OyI6ICJcdTIzYjQiLAogICAgIk92ZXJQYXJlbnRoZXNpczsiOiAiXHUyM2RjIiwKICAgICJQYXJ0aWFsRDsiOiAiXHUyMjAyIiwKICAgICJQY3k7IjogIlx1MDQxZiIsCiAgICAiUGZyOyI6ICJcVTAwMDFkNTEzIiwKICAgICJQaGk7IjogIlx1MDNhNiIsCiAgICAiUGk7IjogIlx1MDNhMCIsCiAgICAiUGx1c01pbnVzOyI6ICJceGIxIiwKICAgICJQb2luY2FyZXBsYW5lOyI6ICJcdTIxMGMiLAogICAgIlBvcGY7IjogIlx1MjExOSIsCiAgICAiUHI7IjogIlx1MmFiYiIsCiAgICAiUHJlY2VkZXM7IjogIlx1MjI3YSIsCiAgICAiUHJlY2VkZXNFcXVhbDsiOiAiXHUyYWFmIiwKICAgICJQcmVjZWRlc1NsYW50RXF1YWw7IjogIlx1MjI3YyIsCiAgICAiUHJlY2VkZXNUaWxkZTsiOiAiXHUyMjdlIiwKICAgICJQcmltZTsiOiAiXHUyMDMzIiwKICAgICJQcm9kdWN0OyI6ICJcdTIyMGYiLAogICAgIlByb3BvcnRpb247IjogIlx1MjIzNyIsCiAgICAiUHJvcG9ydGlvbmFsOyI6ICJcdTIyMWQiLAogICAgIlBzY3I7IjogIlxVMDAwMWQ0YWIiLAogICAgIlBzaTsiOiAiXHUwM2E4IiwKICAgICJRVU9UIjogIlwiIiwKICAgICJRVU9UOyI6ICJcIiIsCiAgICAiUWZyOyI6ICJcVTAwMDFkNTE0IiwKICAgICJRb3BmOyI6ICJcdTIxMWEiLAogICAgIlFzY3I7IjogIlxVMDAwMWQ0YWMiLAogICAgIlJCYXJyOyI6ICJcdTI5MTAiLAogICAgIlJFRyI6ICJceGFlIiwKICAgICJSRUc7IjogIlx4YWUiLAogICAgIlJhY3V0ZTsiOiAiXHUwMTU0IiwKICAgICJSYW5nOyI6ICJcdTI3ZWIiLAogICAgIlJhcnI7IjogIlx1MjFhMCIsCiAgICAiUmFycnRsOyI6ICJcdTI5MTYiLAogICAgIlJjYXJvbjsiOiAiXHUwMTU4IiwKICAgICJSY2VkaWw7IjogIlx1MDE1NiIsCiAgICAiUmN5OyI6ICJcdTA0MjAiLAogICAgIlJlOyI6ICJcdTIxMWMiLAogICAgIlJldmVyc2VFbGVtZW50OyI6ICJcdTIyMGIiLAogICAgIlJldmVyc2VFcXVpbGlicml1bTsiOiAiXHUyMWNiIiwKICAgICJSZXZlcnNlVXBFcXVpbGlicml1bTsiOiAiXHUyOTZmIiwKICAgICJSZnI7IjogIlx1MjExYyIsCiAgICAiUmhvOyI6ICJcdTAzYTEiLAogICAgIlJpZ2h0QW5nbGVCcmFja2V0OyI6ICJcdTI3ZTkiLAogICAgIlJpZ2h0QXJyb3c7IjogIlx1MjE5MiIsCiAgICAiUmlnaHRBcnJvd0JhcjsiOiAiXHUyMWU1IiwKICAgICJSaWdodEFycm93TGVmdEFycm93OyI6ICJcdTIxYzQiLAogICAgIlJpZ2h0Q2VpbGluZzsiOiAiXHUyMzA5IiwKICAgICJSaWdodERvdWJsZUJyYWNrZXQ7IjogIlx1MjdlNyIsCiAgICAiUmlnaHREb3duVGVlVmVjdG9yOyI6ICJcdTI5NWQiLAogICAgIlJpZ2h0RG93blZlY3RvcjsiOiAiXHUyMWMyIiwKICAgICJSaWdodERvd25WZWN0b3JCYXI7IjogIlx1Mjk1NSIsCiAgICAiUmlnaHRGbG9vcjsiOiAiXHUyMzBiIiwKICAgICJSaWdodFRlZTsiOiAiXHUyMmEyIiwKICAgICJSaWdodFRlZUFycm93OyI6ICJcdTIxYTYiLAogICAgIlJpZ2h0VGVlVmVjdG9yOyI6ICJcdTI5NWIiLAogICAgIlJpZ2h0VHJpYW5nbGU7IjogIlx1MjJiMyIsCiAgICAiUmlnaHRUcmlhbmdsZUJhcjsiOiAiXHUyOWQwIiwKICAgICJSaWdodFRyaWFuZ2xlRXF1YWw7IjogIlx1MjJiNSIsCiAgICAiUmlnaHRVcERvd25WZWN0b3I7IjogIlx1Mjk0ZiIsCiAgICAiUmlnaHRVcFRlZVZlY3RvcjsiOiAiXHUyOTVjIiwKICAgICJSaWdodFVwVmVjdG9yOyI6ICJcdTIxYmUiLAogICAgIlJpZ2h0VXBWZWN0b3JCYXI7IjogIlx1Mjk1NCIsCiAgICAiUmlnaHRWZWN0b3I7IjogIlx1MjFjMCIsCiAgICAiUmlnaHRWZWN0b3JCYXI7IjogIlx1Mjk1MyIsCiAgICAiUmlnaHRhcnJvdzsiOiAiXHUyMWQyIiwKICAgICJSb3BmOyI6ICJcdTIxMWQiLAogICAgIlJvdW5kSW1wbGllczsiOiAiXHUyOTcwIiwKICAgICJScmlnaHRhcnJvdzsiOiAiXHUyMWRiIiwKICAgICJSc2NyOyI6ICJcdTIxMWIiLAogICAgIlJzaDsiOiAiXHUyMWIxIiwKICAgICJSdWxlRGVsYXllZDsiOiAiXHUyOWY0IiwKICAgICJTSENIY3k7IjogIlx1MDQyOSIsCiAgICAiU0hjeTsiOiAiXHUwNDI4IiwKICAgICJTT0ZUY3k7IjogIlx1MDQyYyIsCiAgICAiU2FjdXRlOyI6ICJcdTAxNWEiLAogICAgIlNjOyI6ICJcdTJhYmMiLAogICAgIlNjYXJvbjsiOiAiXHUwMTYwIiwKICAgICJTY2VkaWw7IjogIlx1MDE1ZSIsCiAgICAiU2NpcmM7IjogIlx1MDE1YyIsCiAgICAiU2N5OyI6ICJcdTA0MjEiLAogICAgIlNmcjsiOiAiXFUwMDAxZDUxNiIsCiAgICAiU2hvcnREb3duQXJyb3c7IjogIlx1MjE5MyIsCiAgICAiU2hvcnRMZWZ0QXJyb3c7IjogIlx1MjE5MCIsCiAgICAiU2hvcnRSaWdodEFycm93OyI6ICJcdTIxOTIiLAogICAgIlNob3J0VXBBcnJvdzsiOiAiXHUyMTkxIiwKICAgICJTaWdtYTsiOiAiXHUwM2EzIiwKICAgICJTbWFsbENpcmNsZTsiOiAiXHUyMjE4IiwKICAgICJTb3BmOyI6ICJcVTAwMDFkNTRhIiwKICAgICJTcXJ0OyI6ICJcdTIyMWEiLAogICAgIlNxdWFyZTsiOiAiXHUyNWExIiwKICAgICJTcXVhcmVJbnRlcnNlY3Rpb247IjogIlx1MjI5MyIsCiAgICAiU3F1YXJlU3Vic2V0OyI6ICJcdTIyOGYiLAogICAgIlNxdWFyZVN1YnNldEVxdWFsOyI6ICJcdTIyOTEiLAogICAgIlNxdWFyZVN1cGVyc2V0OyI6ICJcdTIyOTAiLAogICAgIlNxdWFyZVN1cGVyc2V0RXF1YWw7IjogIlx1MjI5MiIsCiAgICAiU3F1YXJlVW5pb247IjogIlx1MjI5NCIsCiAgICAiU3NjcjsiOiAiXFUwMDAxZDRhZSIsCiAgICAiU3RhcjsiOiAiXHUyMmM2IiwKICAgICJTdWI7IjogIlx1MjJkMCIsCiAgICAiU3Vic2V0OyI6ICJcdTIyZDAiLAogICAgIlN1YnNldEVxdWFsOyI6ICJcdTIyODYiLAogICAgIlN1Y2NlZWRzOyI6ICJcdTIyN2IiLAogICAgIlN1Y2NlZWRzRXF1YWw7IjogIlx1MmFiMCIsCiAgICAiU3VjY2VlZHNTbGFudEVxdWFsOyI6ICJcdTIyN2QiLAogICAgIlN1Y2NlZWRzVGlsZGU7IjogIlx1MjI3ZiIsCiAgICAiU3VjaFRoYXQ7IjogIlx1MjIwYiIsCiAgICAiU3VtOyI6ICJcdTIyMTEiLAogICAgIlN1cDsiOiAiXHUyMmQxIiwKICAgICJTdXBlcnNldDsiOiAiXHUyMjgzIiwKICAgICJTdXBlcnNldEVxdWFsOyI6ICJcdTIyODciLAogICAgIlN1cHNldDsiOiAiXHUyMmQxIiwKICAgICJUSE9STiI6ICJceGRlIiwKICAgICJUSE9STjsiOiAiXHhkZSIsCiAgICAiVFJBREU7IjogIlx1MjEyMiIsCiAgICAiVFNIY3k7IjogIlx1MDQwYiIsCiAgICAiVFNjeTsiOiAiXHUwNDI2IiwKICAgICJUYWI7IjogIlx0IiwKICAgICJUYXU7IjogIlx1MDNhNCIsCiAgICAiVGNhcm9uOyI6ICJcdTAxNjQiLAogICAgIlRjZWRpbDsiOiAiXHUwMTYyIiwKICAgICJUY3k7IjogIlx1MDQyMiIsCiAgICAiVGZyOyI6ICJcVTAwMDFkNTE3IiwKICAgICJUaGVyZWZvcmU7IjogIlx1MjIzNCIsCiAgICAiVGhldGE7IjogIlx1MDM5OCIsCiAgICAiVGhpY2tTcGFjZTsiOiAiXHUyMDVmXHUyMDBhIiwKICAgICJUaGluU3BhY2U7IjogIlx1MjAwOSIsCiAgICAiVGlsZGU7IjogIlx1MjIzYyIsCiAgICAiVGlsZGVFcXVhbDsiOiAiXHUyMjQzIiwKICAgICJUaWxkZUZ1bGxFcXVhbDsiOiAiXHUyMjQ1IiwKICAgICJUaWxkZVRpbGRlOyI6ICJcdTIyNDgiLAogICAgIlRvcGY7IjogIlxVMDAwMWQ1NGIiLAogICAgIlRyaXBsZURvdDsiOiAiXHUyMGRiIiwKICAgICJUc2NyOyI6ICJcVTAwMDFkNGFmIiwKICAgICJUc3Ryb2s7IjogIlx1MDE2NiIsCiAgICAiVWFjdXRlIjogIlx4ZGEiLAogICAgIlVhY3V0ZTsiOiAiXHhkYSIsCiAgICAiVWFycjsiOiAiXHUyMTlmIiwKICAgICJVYXJyb2NpcjsiOiAiXHUyOTQ5IiwKICAgICJVYnJjeTsiOiAiXHUwNDBlIiwKICAgICJVYnJldmU7IjogIlx1MDE2YyIsCiAgICAiVWNpcmMiOiAiXHhkYiIsCiAgICAiVWNpcmM7IjogIlx4ZGIiLAogICAgIlVjeTsiOiAiXHUwNDIzIiwKICAgICJVZGJsYWM7IjogIlx1MDE3MCIsCiAgICAiVWZyOyI6ICJcVTAwMDFkNTE4IiwKICAgICJVZ3JhdmUiOiAiXHhkOSIsCiAgICAiVWdyYXZlOyI6ICJceGQ5IiwKICAgICJVbWFjcjsiOiAiXHUwMTZhIiwKICAgICJVbmRlckJhcjsiOiAiXyIsCiAgICAiVW5kZXJCcmFjZTsiOiAiXHUyM2RmIiwKICAgICJVbmRlckJyYWNrZXQ7IjogIlx1MjNiNSIsCiAgICAiVW5kZXJQYXJlbnRoZXNpczsiOiAiXHUyM2RkIiwKICAgICJVbmlvbjsiOiAiXHUyMmMzIiwKICAgICJVbmlvblBsdXM7IjogIlx1MjI4ZSIsCiAgICAiVW9nb247IjogIlx1MDE3MiIsCiAgICAiVW9wZjsiOiAiXFUwMDAxZDU0YyIsCiAgICAiVXBBcnJvdzsiOiAiXHUyMTkxIiwKICAgICJVcEFycm93QmFyOyI6ICJcdTI5MTIiLAogICAgIlVwQXJyb3dEb3duQXJyb3c7IjogIlx1MjFjNSIsCiAgICAiVXBEb3duQXJyb3c7IjogIlx1MjE5NSIsCiAgICAiVXBFcXVpbGlicml1bTsiOiAiXHUyOTZlIiwKICAgICJVcFRlZTsiOiAiXHUyMmE1IiwKICAgICJVcFRlZUFycm93OyI6ICJcdTIxYTUiLAogICAgIlVwYXJyb3c7IjogIlx1MjFkMSIsCiAgICAiVXBkb3duYXJyb3c7IjogIlx1MjFkNSIsCiAgICAiVXBwZXJMZWZ0QXJyb3c7IjogIlx1MjE5NiIsCiAgICAiVXBwZXJSaWdodEFycm93OyI6ICJcdTIxOTciLAogICAgIlVwc2k7IjogIlx1MDNkMiIsCiAgICAiVXBzaWxvbjsiOiAiXHUwM2E1IiwKICAgICJVcmluZzsiOiAiXHUwMTZlIiwKICAgICJVc2NyOyI6ICJcVTAwMDFkNGIwIiwKICAgICJVdGlsZGU7IjogIlx1MDE2OCIsCiAgICAiVXVtbCI6ICJceGRjIiwKICAgICJVdW1sOyI6ICJceGRjIiwKICAgICJWRGFzaDsiOiAiXHUyMmFiIiwKICAgICJWYmFyOyI6ICJcdTJhZWIiLAogICAgIlZjeTsiOiAiXHUwNDEyIiwKICAgICJWZGFzaDsiOiAiXHUyMmE5IiwKICAgICJWZGFzaGw7IjogIlx1MmFlNiIsCiAgICAiVmVlOyI6ICJcdTIyYzEiLAogICAgIlZlcmJhcjsiOiAiXHUyMDE2IiwKICAgICJWZXJ0OyI6ICJcdTIwMTYiLAogICAgIlZlcnRpY2FsQmFyOyI6ICJcdTIyMjMiLAogICAgIlZlcnRpY2FsTGluZTsiOiAifCIsCiAgICAiVmVydGljYWxTZXBhcmF0b3I7IjogIlx1Mjc1OCIsCiAgICAiVmVydGljYWxUaWxkZTsiOiAiXHUyMjQwIiwKICAgICJWZXJ5VGhpblNwYWNlOyI6ICJcdTIwMGEiLAogICAgIlZmcjsiOiAiXFUwMDAxZDUxOSIsCiAgICAiVm9wZjsiOiAiXFUwMDAxZDU0ZCIsCiAgICAiVnNjcjsiOiAiXFUwMDAxZDRiMSIsCiAgICAiVnZkYXNoOyI6ICJcdTIyYWEiLAogICAgIldjaXJjOyI6ICJcdTAxNzQiLAogICAgIldlZGdlOyI6ICJcdTIyYzAiLAogICAgIldmcjsiOiAiXFUwMDAxZDUxYSIsCiAgICAiV29wZjsiOiAiXFUwMDAxZDU0ZSIsCiAgICAiV3NjcjsiOiAiXFUwMDAxZDRiMiIsCiAgICAiWGZyOyI6ICJcVTAwMDFkNTFiIiwKICAgICJYaTsiOiAiXHUwMzllIiwKICAgICJYb3BmOyI6ICJcVTAwMDFkNTRmIiwKICAgICJYc2NyOyI6ICJcVTAwMDFkNGIzIiwKICAgICJZQWN5OyI6ICJcdTA0MmYiLAogICAgIllJY3k7IjogIlx1MDQwNyIsCiAgICAiWVVjeTsiOiAiXHUwNDJlIiwKICAgICJZYWN1dGUiOiAiXHhkZCIsCiAgICAiWWFjdXRlOyI6ICJceGRkIiwKICAgICJZY2lyYzsiOiAiXHUwMTc2IiwKICAgICJZY3k7IjogIlx1MDQyYiIsCiAgICAiWWZyOyI6ICJcVTAwMDFkNTFjIiwKICAgICJZb3BmOyI6ICJcVTAwMDFkNTUwIiwKICAgICJZc2NyOyI6ICJcVTAwMDFkNGI0IiwKICAgICJZdW1sOyI6ICJcdTAxNzgiLAogICAgIlpIY3k7IjogIlx1MDQxNiIsCiAgICAiWmFjdXRlOyI6ICJcdTAxNzkiLAogICAgIlpjYXJvbjsiOiAiXHUwMTdkIiwKICAgICJaY3k7IjogIlx1MDQxNyIsCiAgICAiWmRvdDsiOiAiXHUwMTdiIiwKICAgICJaZXJvV2lkdGhTcGFjZTsiOiAiXHUyMDBiIiwKICAgICJaZXRhOyI6ICJcdTAzOTYiLAogICAgIlpmcjsiOiAiXHUyMTI4IiwKICAgICJab3BmOyI6ICJcdTIxMjQiLAogICAgIlpzY3I7IjogIlxVMDAwMWQ0YjUiLAogICAgImFhY3V0ZSI6ICJceGUxIiwKICAgICJhYWN1dGU7IjogIlx4ZTEiLAogICAgImFicmV2ZTsiOiAiXHUwMTAzIiwKICAgICJhYzsiOiAiXHUyMjNlIiwKICAgICJhY0U7IjogIlx1MjIzZVx1MDMzMyIsCiAgICAiYWNkOyI6ICJcdTIyM2YiLAogICAgImFjaXJjIjogIlx4ZTIiLAogICAgImFjaXJjOyI6ICJceGUyIiwKICAgICJhY3V0ZSI6ICJceGI0IiwKICAgICJhY3V0ZTsiOiAiXHhiNCIsCiAgICAiYWN5OyI6ICJcdTA0MzAiLAogICAgImFlbGlnIjogIlx4ZTYiLAogICAgImFlbGlnOyI6ICJceGU2IiwKICAgICJhZjsiOiAiXHUyMDYxIiwKICAgICJhZnI7IjogIlxVMDAwMWQ1MWUiLAogICAgImFncmF2ZSI6ICJceGUwIiwKICAgICJhZ3JhdmU7IjogIlx4ZTAiLAogICAgImFsZWZzeW07IjogIlx1MjEzNSIsCiAgICAiYWxlcGg7IjogIlx1MjEzNSIsCiAgICAiYWxwaGE7IjogIlx1MDNiMSIsCiAgICAiYW1hY3I7IjogIlx1MDEwMSIsCiAgICAiYW1hbGc7IjogIlx1MmEzZiIsCiAgICAiYW1wIjogIiYiLAogICAgImFtcDsiOiAiJiIsCiAgICAiYW5kOyI6ICJcdTIyMjciLAogICAgImFuZGFuZDsiOiAiXHUyYTU1IiwKICAgICJhbmRkOyI6ICJcdTJhNWMiLAogICAgImFuZHNsb3BlOyI6ICJcdTJhNTgiLAogICAgImFuZHY7IjogIlx1MmE1YSIsCiAgICAiYW5nOyI6ICJcdTIyMjAiLAogICAgImFuZ2U7IjogIlx1MjlhNCIsCiAgICAiYW5nbGU7IjogIlx1MjIyMCIsCiAgICAiYW5nbXNkOyI6ICJcdTIyMjEiLAogICAgImFuZ21zZGFhOyI6ICJcdTI5YTgiLAogICAgImFuZ21zZGFiOyI6ICJcdTI5YTkiLAogICAgImFuZ21zZGFjOyI6ICJcdTI5YWEiLAogICAgImFuZ21zZGFkOyI6ICJcdTI5YWIiLAogICAgImFuZ21zZGFlOyI6ICJcdTI5YWMiLAogICAgImFuZ21zZGFmOyI6ICJcdTI5YWQiLAogICAgImFuZ21zZGFnOyI6ICJcdTI5YWUiLAogICAgImFuZ21zZGFoOyI6ICJcdTI5YWYiLAogICAgImFuZ3J0OyI6ICJcdTIyMWYiLAogICAgImFuZ3J0dmI7IjogIlx1MjJiZSIsCiAgICAiYW5ncnR2YmQ7IjogIlx1Mjk5ZCIsCiAgICAiYW5nc3BoOyI6ICJcdTIyMjIiLAogICAgImFuZ3N0OyI6ICJceGM1IiwKICAgICJhbmd6YXJyOyI6ICJcdTIzN2MiLAogICAgImFvZ29uOyI6ICJcdTAxMDUiLAogICAgImFvcGY7IjogIlxVMDAwMWQ1NTIiLAogICAgImFwOyI6ICJcdTIyNDgiLAogICAgImFwRTsiOiAiXHUyYTcwIiwKICAgICJhcGFjaXI7IjogIlx1MmE2ZiIsCiAgICAiYXBlOyI6ICJcdTIyNGEiLAogICAgImFwaWQ7IjogIlx1MjI0YiIsCiAgICAiYXBvczsiOiAiJyIsCiAgICAiYXBwcm94OyI6ICJcdTIyNDgiLAogICAgImFwcHJveGVxOyI6ICJcdTIyNGEiLAogICAgImFyaW5nIjogIlx4ZTUiLAogICAgImFyaW5nOyI6ICJceGU1IiwKICAgICJhc2NyOyI6ICJcVTAwMDFkNGI2IiwKICAgICJhc3Q7IjogIioiLAogICAgImFzeW1wOyI6ICJcdTIyNDgiLAogICAgImFzeW1wZXE7IjogIlx1MjI0ZCIsCiAgICAiYXRpbGRlIjogIlx4ZTMiLAogICAgImF0aWxkZTsiOiAiXHhlMyIsCiAgICAiYXVtbCI6ICJceGU0IiwKICAgICJhdW1sOyI6ICJceGU0IiwKICAgICJhd2NvbmludDsiOiAiXHUyMjMzIiwKICAgICJhd2ludDsiOiAiXHUyYTExIiwKICAgICJiTm90OyI6ICJcdTJhZWQiLAogICAgImJhY2tjb25nOyI6ICJcdTIyNGMiLAogICAgImJhY2tlcHNpbG9uOyI6ICJcdTAzZjYiLAogICAgImJhY2twcmltZTsiOiAiXHUyMDM1IiwKICAgICJiYWNrc2ltOyI6ICJcdTIyM2QiLAogICAgImJhY2tzaW1lcTsiOiAiXHUyMmNkIiwKICAgICJiYXJ2ZWU7IjogIlx1MjJiZCIsCiAgICAiYmFyd2VkOyI6ICJcdTIzMDUiLAogICAgImJhcndlZGdlOyI6ICJcdTIzMDUiLAogICAgImJicms7IjogIlx1MjNiNSIsCiAgICAiYmJya3Ricms7IjogIlx1MjNiNiIsCiAgICAiYmNvbmc7IjogIlx1MjI0YyIsCiAgICAiYmN5OyI6ICJcdTA0MzEiLAogICAgImJkcXVvOyI6ICJcdTIwMWUiLAogICAgImJlY2F1czsiOiAiXHUyMjM1IiwKICAgICJiZWNhdXNlOyI6ICJcdTIyMzUiLAogICAgImJlbXB0eXY7IjogIlx1MjliMCIsCiAgICAiYmVwc2k7IjogIlx1MDNmNiIsCiAgICAiYmVybm91OyI6ICJcdTIxMmMiLAogICAgImJldGE7IjogIlx1MDNiMiIsCiAgICAiYmV0aDsiOiAiXHUyMTM2IiwKICAgICJiZXR3ZWVuOyI6ICJcdTIyNmMiLAogICAgImJmcjsiOiAiXFUwMDAxZDUxZiIsCiAgICAiYmlnY2FwOyI6ICJcdTIyYzIiLAogICAgImJpZ2NpcmM7IjogIlx1MjVlZiIsCiAgICAiYmlnY3VwOyI6ICJcdTIyYzMiLAogICAgImJpZ29kb3Q7IjogIlx1MmEwMCIsCiAgICAiYmlnb3BsdXM7IjogIlx1MmEwMSIsCiAgICAiYmlnb3RpbWVzOyI6ICJcdTJhMDIiLAogICAgImJpZ3NxY3VwOyI6ICJcdTJhMDYiLAogICAgImJpZ3N0YXI7IjogIlx1MjYwNSIsCiAgICAiYmlndHJpYW5nbGVkb3duOyI6ICJcdTI1YmQiLAogICAgImJpZ3RyaWFuZ2xldXA7IjogIlx1MjViMyIsCiAgICAiYmlndXBsdXM7IjogIlx1MmEwNCIsCiAgICAiYmlndmVlOyI6ICJcdTIyYzEiLAogICAgImJpZ3dlZGdlOyI6ICJcdTIyYzAiLAogICAgImJrYXJvdzsiOiAiXHUyOTBkIiwKICAgICJibGFja2xvemVuZ2U7IjogIlx1MjllYiIsCiAgICAiYmxhY2tzcXVhcmU7IjogIlx1MjVhYSIsCiAgICAiYmxhY2t0cmlhbmdsZTsiOiAiXHUyNWI0IiwKICAgICJibGFja3RyaWFuZ2xlZG93bjsiOiAiXHUyNWJlIiwKICAgICJibGFja3RyaWFuZ2xlbGVmdDsiOiAiXHUyNWMyIiwKICAgICJibGFja3RyaWFuZ2xlcmlnaHQ7IjogIlx1MjViOCIsCiAgICAiYmxhbms7IjogIlx1MjQyMyIsCiAgICAiYmxrMTI7IjogIlx1MjU5MiIsCiAgICAiYmxrMTQ7IjogIlx1MjU5MSIsCiAgICAiYmxrMzQ7IjogIlx1MjU5MyIsCiAgICAiYmxvY2s7IjogIlx1MjU4OCIsCiAgICAiYm5lOyI6ICI9XHUyMGU1IiwKICAgICJibmVxdWl2OyI6ICJcdTIyNjFcdTIwZTUiLAogICAgImJub3Q7IjogIlx1MjMxMCIsCiAgICAiYm9wZjsiOiAiXFUwMDAxZDU1MyIsCiAgICAiYm90OyI6ICJcdTIyYTUiLAogICAgImJvdHRvbTsiOiAiXHUyMmE1IiwKICAgICJib3d0aWU7IjogIlx1MjJjOCIsCiAgICAiYm94REw7IjogIlx1MjU1NyIsCiAgICAiYm94RFI7IjogIlx1MjU1NCIsCiAgICAiYm94RGw7IjogIlx1MjU1NiIsCiAgICAiYm94RHI7IjogIlx1MjU1MyIsCiAgICAiYm94SDsiOiAiXHUyNTUwIiwKICAgICJib3hIRDsiOiAiXHUyNTY2IiwKICAgICJib3hIVTsiOiAiXHUyNTY5IiwKICAgICJib3hIZDsiOiAiXHUyNTY0IiwKICAgICJib3hIdTsiOiAiXHUyNTY3IiwKICAgICJib3hVTDsiOiAiXHUyNTVkIiwKICAgICJib3hVUjsiOiAiXHUyNTVhIiwKICAgICJib3hVbDsiOiAiXHUyNTVjIiwKICAgICJib3hVcjsiOiAiXHUyNTU5IiwKICAgICJib3hWOyI6ICJcdTI1NTEiLAogICAgImJveFZIOyI6ICJcdTI1NmMiLAogICAgImJveFZMOyI6ICJcdTI1NjMiLAogICAgImJveFZSOyI6ICJcdTI1NjAiLAogICAgImJveFZoOyI6ICJcdTI1NmIiLAogICAgImJveFZsOyI6ICJcdTI1NjIiLAogICAgImJveFZyOyI6ICJcdTI1NWYiLAogICAgImJveGJveDsiOiAiXHUyOWM5IiwKICAgICJib3hkTDsiOiAiXHUyNTU1IiwKICAgICJib3hkUjsiOiAiXHUyNTUyIiwKICAgICJib3hkbDsiOiAiXHUyNTEwIiwKICAgICJib3hkcjsiOiAiXHUyNTBjIiwKICAgICJib3hoOyI6ICJcdTI1MDAiLAogICAgImJveGhEOyI6ICJcdTI1NjUiLAogICAgImJveGhVOyI6ICJcdTI1NjgiLAogICAgImJveGhkOyI6ICJcdTI1MmMiLAogICAgImJveGh1OyI6ICJcdTI1MzQiLAogICAgImJveG1pbnVzOyI6ICJcdTIyOWYiLAogICAgImJveHBsdXM7IjogIlx1MjI5ZSIsCiAgICAiYm94dGltZXM7IjogIlx1MjJhMCIsCiAgICAiYm94dUw7IjogIlx1MjU1YiIsCiAgICAiYm94dVI7IjogIlx1MjU1OCIsCiAgICAiYm94dWw7IjogIlx1MjUxOCIsCiAgICAiYm94dXI7IjogIlx1MjUxNCIsCiAgICAiYm94djsiOiAiXHUyNTAyIiwKICAgICJib3h2SDsiOiAiXHUyNTZhIiwKICAgICJib3h2TDsiOiAiXHUyNTYxIiwKICAgICJib3h2UjsiOiAiXHUyNTVlIiwKICAgICJib3h2aDsiOiAiXHUyNTNjIiwKICAgICJib3h2bDsiOiAiXHUyNTI0IiwKICAgICJib3h2cjsiOiAiXHUyNTFjIiwKICAgICJicHJpbWU7IjogIlx1MjAzNSIsCiAgICAiYnJldmU7IjogIlx1MDJkOCIsCiAgICAiYnJ2YmFyIjogIlx4YTYiLAogICAgImJydmJhcjsiOiAiXHhhNiIsCiAgICAiYnNjcjsiOiAiXFUwMDAxZDRiNyIsCiAgICAiYnNlbWk7IjogIlx1MjA0ZiIsCiAgICAiYnNpbTsiOiAiXHUyMjNkIiwKICAgICJic2ltZTsiOiAiXHUyMmNkIiwKICAgICJic29sOyI6ICJcXCIsCiAgICAiYnNvbGI7IjogIlx1MjljNSIsCiAgICAiYnNvbGhzdWI7IjogIlx1MjdjOCIsCiAgICAiYnVsbDsiOiAiXHUyMDIyIiwKICAgICJidWxsZXQ7IjogIlx1MjAyMiIsCiAgICAiYnVtcDsiOiAiXHUyMjRlIiwKICAgICJidW1wRTsiOiAiXHUyYWFlIiwKICAgICJidW1wZTsiOiAiXHUyMjRmIiwKICAgICJidW1wZXE7IjogIlx1MjI0ZiIsCiAgICAiY2FjdXRlOyI6ICJcdTAxMDciLAogICAgImNhcDsiOiAiXHUyMjI5IiwKICAgICJjYXBhbmQ7IjogIlx1MmE0NCIsCiAgICAiY2FwYnJjdXA7IjogIlx1MmE0OSIsCiAgICAiY2FwY2FwOyI6ICJcdTJhNGIiLAogICAgImNhcGN1cDsiOiAiXHUyYTQ3IiwKICAgICJjYXBkb3Q7IjogIlx1MmE0MCIsCiAgICAiY2FwczsiOiAiXHUyMjI5XHVmZTAwIiwKICAgICJjYXJldDsiOiAiXHUyMDQxIiwKICAgICJjYXJvbjsiOiAiXHUwMmM3IiwKICAgICJjY2FwczsiOiAiXHUyYTRkIiwKICAgICJjY2Fyb247IjogIlx1MDEwZCIsCiAgICAiY2NlZGlsIjogIlx4ZTciLAogICAgImNjZWRpbDsiOiAiXHhlNyIsCiAgICAiY2NpcmM7IjogIlx1MDEwOSIsCiAgICAiY2N1cHM7IjogIlx1MmE0YyIsCiAgICAiY2N1cHNzbTsiOiAiXHUyYTUwIiwKICAgICJjZG90OyI6ICJcdTAxMGIiLAogICAgImNlZGlsIjogIlx4YjgiLAogICAgImNlZGlsOyI6ICJceGI4IiwKICAgICJjZW1wdHl2OyI6ICJcdTI5YjIiLAogICAgImNlbnQiOiAiXHhhMiIsCiAgICAiY2VudDsiOiAiXHhhMiIsCiAgICAiY2VudGVyZG90OyI6ICJceGI3IiwKICAgICJjZnI7IjogIlxVMDAwMWQ1MjAiLAogICAgImNoY3k7IjogIlx1MDQ0NyIsCiAgICAiY2hlY2s7IjogIlx1MjcxMyIsCiAgICAiY2hlY2ttYXJrOyI6ICJcdTI3MTMiLAogICAgImNoaTsiOiAiXHUwM2M3IiwKICAgICJjaXI7IjogIlx1MjVjYiIsCiAgICAiY2lyRTsiOiAiXHUyOWMzIiwKICAgICJjaXJjOyI6ICJcdTAyYzYiLAogICAgImNpcmNlcTsiOiAiXHUyMjU3IiwKICAgICJjaXJjbGVhcnJvd2xlZnQ7IjogIlx1MjFiYSIsCiAgICAiY2lyY2xlYXJyb3dyaWdodDsiOiAiXHUyMWJiIiwKICAgICJjaXJjbGVkUjsiOiAiXHhhZSIsCiAgICAiY2lyY2xlZFM7IjogIlx1MjRjOCIsCiAgICAiY2lyY2xlZGFzdDsiOiAiXHUyMjliIiwKICAgICJjaXJjbGVkY2lyYzsiOiAiXHUyMjlhIiwKICAgICJjaXJjbGVkZGFzaDsiOiAiXHUyMjlkIiwKICAgICJjaXJlOyI6ICJcdTIyNTciLAogICAgImNpcmZuaW50OyI6ICJcdTJhMTAiLAogICAgImNpcm1pZDsiOiAiXHUyYWVmIiwKICAgICJjaXJzY2lyOyI6ICJcdTI5YzIiLAogICAgImNsdWJzOyI6ICJcdTI2NjMiLAogICAgImNsdWJzdWl0OyI6ICJcdTI2NjMiLAogICAgImNvbG9uOyI6ICI6IiwKICAgICJjb2xvbmU7IjogIlx1MjI1NCIsCiAgICAiY29sb25lcTsiOiAiXHUyMjU0IiwKICAgICJjb21tYTsiOiAiLCIsCiAgICAiY29tbWF0OyI6ICJAIiwKICAgICJjb21wOyI6ICJcdTIyMDEiLAogICAgImNvbXBmbjsiOiAiXHUyMjE4IiwKICAgICJjb21wbGVtZW50OyI6ICJcdTIyMDEiLAogICAgImNvbXBsZXhlczsiOiAiXHUyMTAyIiwKICAgICJjb25nOyI6ICJcdTIyNDUiLAogICAgImNvbmdkb3Q7IjogIlx1MmE2ZCIsCiAgICAiY29uaW50OyI6ICJcdTIyMmUiLAogICAgImNvcGY7IjogIlxVMDAwMWQ1NTQiLAogICAgImNvcHJvZDsiOiAiXHUyMjEwIiwKICAgICJjb3B5IjogIlx4YTkiLAogICAgImNvcHk7IjogIlx4YTkiLAogICAgImNvcHlzcjsiOiAiXHUyMTE3IiwKICAgICJjcmFycjsiOiAiXHUyMWI1IiwKICAgICJjcm9zczsiOiAiXHUyNzE3IiwKICAgICJjc2NyOyI6ICJcVTAwMDFkNGI4IiwKICAgICJjc3ViOyI6ICJcdTJhY2YiLAogICAgImNzdWJlOyI6ICJcdTJhZDEiLAogICAgImNzdXA7IjogIlx1MmFkMCIsCiAgICAiY3N1cGU7IjogIlx1MmFkMiIsCiAgICAiY3Rkb3Q7IjogIlx1MjJlZiIsCiAgICAiY3VkYXJybDsiOiAiXHUyOTM4IiwKICAgICJjdWRhcnJyOyI6ICJcdTI5MzUiLAogICAgImN1ZXByOyI6ICJcdTIyZGUiLAogICAgImN1ZXNjOyI6ICJcdTIyZGYiLAogICAgImN1bGFycjsiOiAiXHUyMWI2IiwKICAgICJjdWxhcnJwOyI6ICJcdTI5M2QiLAogICAgImN1cDsiOiAiXHUyMjJhIiwKICAgICJjdXBicmNhcDsiOiAiXHUyYTQ4IiwKICAgICJjdXBjYXA7IjogIlx1MmE0NiIsCiAgICAiY3VwY3VwOyI6ICJcdTJhNGEiLAogICAgImN1cGRvdDsiOiAiXHUyMjhkIiwKICAgICJjdXBvcjsiOiAiXHUyYTQ1IiwKICAgICJjdXBzOyI6ICJcdTIyMmFcdWZlMDAiLAogICAgImN1cmFycjsiOiAiXHUyMWI3IiwKICAgICJjdXJhcnJtOyI6ICJcdTI5M2MiLAogICAgImN1cmx5ZXFwcmVjOyI6ICJcdTIyZGUiLAogICAgImN1cmx5ZXFzdWNjOyI6ICJcdTIyZGYiLAogICAgImN1cmx5dmVlOyI6ICJcdTIyY2UiLAogICAgImN1cmx5d2VkZ2U7IjogIlx1MjJjZiIsCiAgICAiY3VycmVuIjogIlx4YTQiLAogICAgImN1cnJlbjsiOiAiXHhhNCIsCiAgICAiY3VydmVhcnJvd2xlZnQ7IjogIlx1MjFiNiIsCiAgICAiY3VydmVhcnJvd3JpZ2h0OyI6ICJcdTIxYjciLAogICAgImN1dmVlOyI6ICJcdTIyY2UiLAogICAgImN1d2VkOyI6ICJcdTIyY2YiLAogICAgImN3Y29uaW50OyI6ICJcdTIyMzIiLAogICAgImN3aW50OyI6ICJcdTIyMzEiLAogICAgImN5bGN0eTsiOiAiXHUyMzJkIiwKICAgICJkQXJyOyI6ICJcdTIxZDMiLAogICAgImRIYXI7IjogIlx1Mjk2NSIsCiAgICAiZGFnZ2VyOyI6ICJcdTIwMjAiLAogICAgImRhbGV0aDsiOiAiXHUyMTM4IiwKICAgICJkYXJyOyI6ICJcdTIxOTMiLAogICAgImRhc2g7IjogIlx1MjAxMCIsCiAgICAiZGFzaHY7IjogIlx1MjJhMyIsCiAgICAiZGJrYXJvdzsiOiAiXHUyOTBmIiwKICAgICJkYmxhYzsiOiAiXHUwMmRkIiwKICAgICJkY2Fyb247IjogIlx1MDEwZiIsCiAgICAiZGN5OyI6ICJcdTA0MzQiLAogICAgImRkOyI6ICJcdTIxNDYiLAogICAgImRkYWdnZXI7IjogIlx1MjAyMSIsCiAgICAiZGRhcnI7IjogIlx1MjFjYSIsCiAgICAiZGRvdHNlcTsiOiAiXHUyYTc3IiwKICAgICJkZWciOiAiXHhiMCIsCiAgICAiZGVnOyI6ICJceGIwIiwKICAgICJkZWx0YTsiOiAiXHUwM2I0IiwKICAgICJkZW1wdHl2OyI6ICJcdTI5YjEiLAogICAgImRmaXNodDsiOiAiXHUyOTdmIiwKICAgICJkZnI7IjogIlxVMDAwMWQ1MjEiLAogICAgImRoYXJsOyI6ICJcdTIxYzMiLAogICAgImRoYXJyOyI6ICJcdTIxYzIiLAogICAgImRpYW07IjogIlx1MjJjNCIsCiAgICAiZGlhbW9uZDsiOiAiXHUyMmM0IiwKICAgICJkaWFtb25kc3VpdDsiOiAiXHUyNjY2IiwKICAgICJkaWFtczsiOiAiXHUyNjY2IiwKICAgICJkaWU7IjogIlx4YTgiLAogICAgImRpZ2FtbWE7IjogIlx1MDNkZCIsCiAgICAiZGlzaW47IjogIlx1MjJmMiIsCiAgICAiZGl2OyI6ICJceGY3IiwKICAgICJkaXZpZGUiOiAiXHhmNyIsCiAgICAiZGl2aWRlOyI6ICJceGY3IiwKICAgICJkaXZpZGVvbnRpbWVzOyI6ICJcdTIyYzciLAogICAgImRpdm9ueDsiOiAiXHUyMmM3IiwKICAgICJkamN5OyI6ICJcdTA0NTIiLAogICAgImRsY29ybjsiOiAiXHUyMzFlIiwKICAgICJkbGNyb3A7IjogIlx1MjMwZCIsCiAgICAiZG9sbGFyOyI6ICIkIiwKICAgICJkb3BmOyI6ICJcVTAwMDFkNTU1IiwKICAgICJkb3Q7IjogIlx1MDJkOSIsCiAgICAiZG90ZXE7IjogIlx1MjI1MCIsCiAgICAiZG90ZXFkb3Q7IjogIlx1MjI1MSIsCiAgICAiZG90bWludXM7IjogIlx1MjIzOCIsCiAgICAiZG90cGx1czsiOiAiXHUyMjE0IiwKICAgICJkb3RzcXVhcmU7IjogIlx1MjJhMSIsCiAgICAiZG91YmxlYmFyd2VkZ2U7IjogIlx1MjMwNiIsCiAgICAiZG93bmFycm93OyI6ICJcdTIxOTMiLAogICAgImRvd25kb3duYXJyb3dzOyI6ICJcdTIxY2EiLAogICAgImRvd25oYXJwb29ubGVmdDsiOiAiXHUyMWMzIiwKICAgICJkb3duaGFycG9vbnJpZ2h0OyI6ICJcdTIxYzIiLAogICAgImRyYmthcm93OyI6ICJcdTI5MTAiLAogICAgImRyY29ybjsiOiAiXHUyMzFmIiwKICAgICJkcmNyb3A7IjogIlx1MjMwYyIsCiAgICAiZHNjcjsiOiAiXFUwMDAxZDRiOSIsCiAgICAiZHNjeTsiOiAiXHUwNDU1IiwKICAgICJkc29sOyI6ICJcdTI5ZjYiLAogICAgImRzdHJvazsiOiAiXHUwMTExIiwKICAgICJkdGRvdDsiOiAiXHUyMmYxIiwKICAgICJkdHJpOyI6ICJcdTI1YmYiLAogICAgImR0cmlmOyI6ICJcdTI1YmUiLAogICAgImR1YXJyOyI6ICJcdTIxZjUiLAogICAgImR1aGFyOyI6ICJcdTI5NmYiLAogICAgImR3YW5nbGU7IjogIlx1MjlhNiIsCiAgICAiZHpjeTsiOiAiXHUwNDVmIiwKICAgICJkemlncmFycjsiOiAiXHUyN2ZmIiwKICAgICJlRERvdDsiOiAiXHUyYTc3IiwKICAgICJlRG90OyI6ICJcdTIyNTEiLAogICAgImVhY3V0ZSI6ICJceGU5IiwKICAgICJlYWN1dGU7IjogIlx4ZTkiLAogICAgImVhc3RlcjsiOiAiXHUyYTZlIiwKICAgICJlY2Fyb247IjogIlx1MDExYiIsCiAgICAiZWNpcjsiOiAiXHUyMjU2IiwKICAgICJlY2lyYyI6ICJceGVhIiwKICAgICJlY2lyYzsiOiAiXHhlYSIsCiAgICAiZWNvbG9uOyI6ICJcdTIyNTUiLAogICAgImVjeTsiOiAiXHUwNDRkIiwKICAgICJlZG90OyI6ICJcdTAxMTciLAogICAgImVlOyI6ICJcdTIxNDciLAogICAgImVmRG90OyI6ICJcdTIyNTIiLAogICAgImVmcjsiOiAiXFUwMDAxZDUyMiIsCiAgICAiZWc7IjogIlx1MmE5YSIsCiAgICAiZWdyYXZlIjogIlx4ZTgiLAogICAgImVncmF2ZTsiOiAiXHhlOCIsCiAgICAiZWdzOyI6ICJcdTJhOTYiLAogICAgImVnc2RvdDsiOiAiXHUyYTk4IiwKICAgICJlbDsiOiAiXHUyYTk5IiwKICAgICJlbGludGVyczsiOiAiXHUyM2U3IiwKICAgICJlbGw7IjogIlx1MjExMyIsCiAgICAiZWxzOyI6ICJcdTJhOTUiLAogICAgImVsc2RvdDsiOiAiXHUyYTk3IiwKICAgICJlbWFjcjsiOiAiXHUwMTEzIiwKICAgICJlbXB0eTsiOiAiXHUyMjA1IiwKICAgICJlbXB0eXNldDsiOiAiXHUyMjA1IiwKICAgICJlbXB0eXY7IjogIlx1MjIwNSIsCiAgICAiZW1zcDEzOyI6ICJcdTIwMDQiLAogICAgImVtc3AxNDsiOiAiXHUyMDA1IiwKICAgICJlbXNwOyI6ICJcdTIwMDMiLAogICAgImVuZzsiOiAiXHUwMTRiIiwKICAgICJlbnNwOyI6ICJcdTIwMDIiLAogICAgImVvZ29uOyI6ICJcdTAxMTkiLAogICAgImVvcGY7IjogIlxVMDAwMWQ1NTYiLAogICAgImVwYXI7IjogIlx1MjJkNSIsCiAgICAiZXBhcnNsOyI6ICJcdTI5ZTMiLAogICAgImVwbHVzOyI6ICJcdTJhNzEiLAogICAgImVwc2k7IjogIlx1MDNiNSIsCiAgICAiZXBzaWxvbjsiOiAiXHUwM2I1IiwKICAgICJlcHNpdjsiOiAiXHUwM2Y1IiwKICAgICJlcWNpcmM7IjogIlx1MjI1NiIsCiAgICAiZXFjb2xvbjsiOiAiXHUyMjU1IiwKICAgICJlcXNpbTsiOiAiXHUyMjQyIiwKICAgICJlcXNsYW50Z3RyOyI6ICJcdTJhOTYiLAogICAgImVxc2xhbnRsZXNzOyI6ICJcdTJhOTUiLAogICAgImVxdWFsczsiOiAiPSIsCiAgICAiZXF1ZXN0OyI6ICJcdTIyNWYiLAogICAgImVxdWl2OyI6ICJcdTIyNjEiLAogICAgImVxdWl2REQ7IjogIlx1MmE3OCIsCiAgICAiZXF2cGFyc2w7IjogIlx1MjllNSIsCiAgICAiZXJEb3Q7IjogIlx1MjI1MyIsCiAgICAiZXJhcnI7IjogIlx1Mjk3MSIsCiAgICAiZXNjcjsiOiAiXHUyMTJmIiwKICAgICJlc2RvdDsiOiAiXHUyMjUwIiwKICAgICJlc2ltOyI6ICJcdTIyNDIiLAogICAgImV0YTsiOiAiXHUwM2I3IiwKICAgICJldGgiOiAiXHhmMCIsCiAgICAiZXRoOyI6ICJceGYwIiwKICAgICJldW1sIjogIlx4ZWIiLAogICAgImV1bWw7IjogIlx4ZWIiLAogICAgImV1cm87IjogIlx1MjBhYyIsCiAgICAiZXhjbDsiOiAiISIsCiAgICAiZXhpc3Q7IjogIlx1MjIwMyIsCiAgICAiZXhwZWN0YXRpb247IjogIlx1MjEzMCIsCiAgICAiZXhwb25lbnRpYWxlOyI6ICJcdTIxNDciLAogICAgImZhbGxpbmdkb3RzZXE7IjogIlx1MjI1MiIsCiAgICAiZmN5OyI6ICJcdTA0NDQiLAogICAgImZlbWFsZTsiOiAiXHUyNjQwIiwKICAgICJmZmlsaWc7IjogIlx1ZmIwMyIsCiAgICAiZmZsaWc7IjogIlx1ZmIwMCIsCiAgICAiZmZsbGlnOyI6ICJcdWZiMDQiLAogICAgImZmcjsiOiAiXFUwMDAxZDUyMyIsCiAgICAiZmlsaWc7IjogIlx1ZmIwMSIsCiAgICAiZmpsaWc7IjogImZqIiwKICAgICJmbGF0OyI6ICJcdTI2NmQiLAogICAgImZsbGlnOyI6ICJcdWZiMDIiLAogICAgImZsdG5zOyI6ICJcdTI1YjEiLAogICAgImZub2Y7IjogIlx1MDE5MiIsCiAgICAiZm9wZjsiOiAiXFUwMDAxZDU1NyIsCiAgICAiZm9yYWxsOyI6ICJcdTIyMDAiLAogICAgImZvcms7IjogIlx1MjJkNCIsCiAgICAiZm9ya3Y7IjogIlx1MmFkOSIsCiAgICAiZnBhcnRpbnQ7IjogIlx1MmEwZCIsCiAgICAiZnJhYzEyIjogIlx4YmQiLAogICAgImZyYWMxMjsiOiAiXHhiZCIsCiAgICAiZnJhYzEzOyI6ICJcdTIxNTMiLAogICAgImZyYWMxNCI6ICJceGJjIiwKICAgICJmcmFjMTQ7IjogIlx4YmMiLAogICAgImZyYWMxNTsiOiAiXHUyMTU1IiwKICAgICJmcmFjMTY7IjogIlx1MjE1OSIsCiAgICAiZnJhYzE4OyI6ICJcdTIxNWIiLAogICAgImZyYWMyMzsiOiAiXHUyMTU0IiwKICAgICJmcmFjMjU7IjogIlx1MjE1NiIsCiAgICAiZnJhYzM0IjogIlx4YmUiLAogICAgImZyYWMzNDsiOiAiXHhiZSIsCiAgICAiZnJhYzM1OyI6ICJcdTIxNTciLAogICAgImZyYWMzODsiOiAiXHUyMTVjIiwKICAgICJmcmFjNDU7IjogIlx1MjE1OCIsCiAgICAiZnJhYzU2OyI6ICJcdTIxNWEiLAogICAgImZyYWM1ODsiOiAiXHUyMTVkIiwKICAgICJmcmFjNzg7IjogIlx1MjE1ZSIsCiAgICAiZnJhc2w7IjogIlx1MjA0NCIsCiAgICAiZnJvd247IjogIlx1MjMyMiIsCiAgICAiZnNjcjsiOiAiXFUwMDAxZDRiYiIsCiAgICAiZ0U7IjogIlx1MjI2NyIsCiAgICAiZ0VsOyI6ICJcdTJhOGMiLAogICAgImdhY3V0ZTsiOiAiXHUwMWY1IiwKICAgICJnYW1tYTsiOiAiXHUwM2IzIiwKICAgICJnYW1tYWQ7IjogIlx1MDNkZCIsCiAgICAiZ2FwOyI6ICJcdTJhODYiLAogICAgImdicmV2ZTsiOiAiXHUwMTFmIiwKICAgICJnY2lyYzsiOiAiXHUwMTFkIiwKICAgICJnY3k7IjogIlx1MDQzMyIsCiAgICAiZ2RvdDsiOiAiXHUwMTIxIiwKICAgICJnZTsiOiAiXHUyMjY1IiwKICAgICJnZWw7IjogIlx1MjJkYiIsCiAgICAiZ2VxOyI6ICJcdTIyNjUiLAogICAgImdlcXE7IjogIlx1MjI2NyIsCiAgICAiZ2Vxc2xhbnQ7IjogIlx1MmE3ZSIsCiAgICAiZ2VzOyI6ICJcdTJhN2UiLAogICAgImdlc2NjOyI6ICJcdTJhYTkiLAogICAgImdlc2RvdDsiOiAiXHUyYTgwIiwKICAgICJnZXNkb3RvOyI6ICJcdTJhODIiLAogICAgImdlc2RvdG9sOyI6ICJcdTJhODQiLAogICAgImdlc2w7IjogIlx1MjJkYlx1ZmUwMCIsCiAgICAiZ2VzbGVzOyI6ICJcdTJhOTQiLAogICAgImdmcjsiOiAiXFUwMDAxZDUyNCIsCiAgICAiZ2c7IjogIlx1MjI2YiIsCiAgICAiZ2dnOyI6ICJcdTIyZDkiLAogICAgImdpbWVsOyI6ICJcdTIxMzciLAogICAgImdqY3k7IjogIlx1MDQ1MyIsCiAgICAiZ2w7IjogIlx1MjI3NyIsCiAgICAiZ2xFOyI6ICJcdTJhOTIiLAogICAgImdsYTsiOiAiXHUyYWE1IiwKICAgICJnbGo7IjogIlx1MmFhNCIsCiAgICAiZ25FOyI6ICJcdTIyNjkiLAogICAgImduYXA7IjogIlx1MmE4YSIsCiAgICAiZ25hcHByb3g7IjogIlx1MmE4YSIsCiAgICAiZ25lOyI6ICJcdTJhODgiLAogICAgImduZXE7IjogIlx1MmE4OCIsCiAgICAiZ25lcXE7IjogIlx1MjI2OSIsCiAgICAiZ25zaW07IjogIlx1MjJlNyIsCiAgICAiZ29wZjsiOiAiXFUwMDAxZDU1OCIsCiAgICAiZ3JhdmU7IjogImAiLAogICAgImdzY3I7IjogIlx1MjEwYSIsCiAgICAiZ3NpbTsiOiAiXHUyMjczIiwKICAgICJnc2ltZTsiOiAiXHUyYThlIiwKICAgICJnc2ltbDsiOiAiXHUyYTkwIiwKICAgICJndCI6ICI+IiwKICAgICJndDsiOiAiPiIsCiAgICAiZ3RjYzsiOiAiXHUyYWE3IiwKICAgICJndGNpcjsiOiAiXHUyYTdhIiwKICAgICJndGRvdDsiOiAiXHUyMmQ3IiwKICAgICJndGxQYXI7IjogIlx1Mjk5NSIsCiAgICAiZ3RxdWVzdDsiOiAiXHUyYTdjIiwKICAgICJndHJhcHByb3g7IjogIlx1MmE4NiIsCiAgICAiZ3RyYXJyOyI6ICJcdTI5NzgiLAogICAgImd0cmRvdDsiOiAiXHUyMmQ3IiwKICAgICJndHJlcWxlc3M7IjogIlx1MjJkYiIsCiAgICAiZ3RyZXFxbGVzczsiOiAiXHUyYThjIiwKICAgICJndHJsZXNzOyI6ICJcdTIyNzciLAogICAgImd0cnNpbTsiOiAiXHUyMjczIiwKICAgICJndmVydG5lcXE7IjogIlx1MjI2OVx1ZmUwMCIsCiAgICAiZ3ZuRTsiOiAiXHUyMjY5XHVmZTAwIiwKICAgICJoQXJyOyI6ICJcdTIxZDQiLAogICAgImhhaXJzcDsiOiAiXHUyMDBhIiwKICAgICJoYWxmOyI6ICJceGJkIiwKICAgICJoYW1pbHQ7IjogIlx1MjEwYiIsCiAgICAiaGFyZGN5OyI6ICJcdTA0NGEiLAogICAgImhhcnI7IjogIlx1MjE5NCIsCiAgICAiaGFycmNpcjsiOiAiXHUyOTQ4IiwKICAgICJoYXJydzsiOiAiXHUyMWFkIiwKICAgICJoYmFyOyI6ICJcdTIxMGYiLAogICAgImhjaXJjOyI6ICJcdTAxMjUiLAogICAgImhlYXJ0czsiOiAiXHUyNjY1IiwKICAgICJoZWFydHN1aXQ7IjogIlx1MjY2NSIsCiAgICAiaGVsbGlwOyI6ICJcdTIwMjYiLAogICAgImhlcmNvbjsiOiAiXHUyMmI5IiwKICAgICJoZnI7IjogIlxVMDAwMWQ1MjUiLAogICAgImhrc2Vhcm93OyI6ICJcdTI5MjUiLAogICAgImhrc3dhcm93OyI6ICJcdTI5MjYiLAogICAgImhvYXJyOyI6ICJcdTIxZmYiLAogICAgImhvbXRodDsiOiAiXHUyMjNiIiwKICAgICJob29rbGVmdGFycm93OyI6ICJcdTIxYTkiLAogICAgImhvb2tyaWdodGFycm93OyI6ICJcdTIxYWEiLAogICAgImhvcGY7IjogIlxVMDAwMWQ1NTkiLAogICAgImhvcmJhcjsiOiAiXHUyMDE1IiwKICAgICJoc2NyOyI6ICJcVTAwMDFkNGJkIiwKICAgICJoc2xhc2g7IjogIlx1MjEwZiIsCiAgICAiaHN0cm9rOyI6ICJcdTAxMjciLAogICAgImh5YnVsbDsiOiAiXHUyMDQzIiwKICAgICJoeXBoZW47IjogIlx1MjAxMCIsCiAgICAiaWFjdXRlIjogIlx4ZWQiLAogICAgImlhY3V0ZTsiOiAiXHhlZCIsCiAgICAiaWM7IjogIlx1MjA2MyIsCiAgICAiaWNpcmMiOiAiXHhlZSIsCiAgICAiaWNpcmM7IjogIlx4ZWUiLAogICAgImljeTsiOiAiXHUwNDM4IiwKICAgICJpZWN5OyI6ICJcdTA0MzUiLAogICAgImlleGNsIjogIlx4YTEiLAogICAgImlleGNsOyI6ICJceGExIiwKICAgICJpZmY7IjogIlx1MjFkNCIsCiAgICAiaWZyOyI6ICJcVTAwMDFkNTI2IiwKICAgICJpZ3JhdmUiOiAiXHhlYyIsCiAgICAiaWdyYXZlOyI6ICJceGVjIiwKICAgICJpaTsiOiAiXHUyMTQ4IiwKICAgICJpaWlpbnQ7IjogIlx1MmEwYyIsCiAgICAiaWlpbnQ7IjogIlx1MjIyZCIsCiAgICAiaWluZmluOyI6ICJcdTI5ZGMiLAogICAgImlpb3RhOyI6ICJcdTIxMjkiLAogICAgImlqbGlnOyI6ICJcdTAxMzMiLAogICAgImltYWNyOyI6ICJcdTAxMmIiLAogICAgImltYWdlOyI6ICJcdTIxMTEiLAogICAgImltYWdsaW5lOyI6ICJcdTIxMTAiLAogICAgImltYWdwYXJ0OyI6ICJcdTIxMTEiLAogICAgImltYXRoOyI6ICJcdTAxMzEiLAogICAgImltb2Y7IjogIlx1MjJiNyIsCiAgICAiaW1wZWQ7IjogIlx1MDFiNSIsCiAgICAiaW47IjogIlx1MjIwOCIsCiAgICAiaW5jYXJlOyI6ICJcdTIxMDUiLAogICAgImluZmluOyI6ICJcdTIyMWUiLAogICAgImluZmludGllOyI6ICJcdTI5ZGQiLAogICAgImlub2RvdDsiOiAiXHUwMTMxIiwKICAgICJpbnQ7IjogIlx1MjIyYiIsCiAgICAiaW50Y2FsOyI6ICJcdTIyYmEiLAogICAgImludGVnZXJzOyI6ICJcdTIxMjQiLAogICAgImludGVyY2FsOyI6ICJcdTIyYmEiLAogICAgImludGxhcmhrOyI6ICJcdTJhMTciLAogICAgImludHByb2Q7IjogIlx1MmEzYyIsCiAgICAiaW9jeTsiOiAiXHUwNDUxIiwKICAgICJpb2dvbjsiOiAiXHUwMTJmIiwKICAgICJpb3BmOyI6ICJcVTAwMDFkNTVhIiwKICAgICJpb3RhOyI6ICJcdTAzYjkiLAogICAgImlwcm9kOyI6ICJcdTJhM2MiLAogICAgImlxdWVzdCI6ICJceGJmIiwKICAgICJpcXVlc3Q7IjogIlx4YmYiLAogICAgImlzY3I7IjogIlxVMDAwMWQ0YmUiLAogICAgImlzaW47IjogIlx1MjIwOCIsCiAgICAiaXNpbkU7IjogIlx1MjJmOSIsCiAgICAiaXNpbmRvdDsiOiAiXHUyMmY1IiwKICAgICJpc2luczsiOiAiXHUyMmY0IiwKICAgICJpc2luc3Y7IjogIlx1MjJmMyIsCiAgICAiaXNpbnY7IjogIlx1MjIwOCIsCiAgICAiaXQ7IjogIlx1MjA2MiIsCiAgICAiaXRpbGRlOyI6ICJcdTAxMjkiLAogICAgIml1a2N5OyI6ICJcdTA0NTYiLAogICAgIml1bWwiOiAiXHhlZiIsCiAgICAiaXVtbDsiOiAiXHhlZiIsCiAgICAiamNpcmM7IjogIlx1MDEzNSIsCiAgICAiamN5OyI6ICJcdTA0MzkiLAogICAgImpmcjsiOiAiXFUwMDAxZDUyNyIsCiAgICAiam1hdGg7IjogIlx1MDIzNyIsCiAgICAiam9wZjsiOiAiXFUwMDAxZDU1YiIsCiAgICAianNjcjsiOiAiXFUwMDAxZDRiZiIsCiAgICAianNlcmN5OyI6ICJcdTA0NTgiLAogICAgImp1a2N5OyI6ICJcdTA0NTQiLAogICAgImthcHBhOyI6ICJcdTAzYmEiLAogICAgImthcHBhdjsiOiAiXHUwM2YwIiwKICAgICJrY2VkaWw7IjogIlx1MDEzNyIsCiAgICAia2N5OyI6ICJcdTA0M2EiLAogICAgImtmcjsiOiAiXFUwMDAxZDUyOCIsCiAgICAia2dyZWVuOyI6ICJcdTAxMzgiLAogICAgImtoY3k7IjogIlx1MDQ0NSIsCiAgICAia2pjeTsiOiAiXHUwNDVjIiwKICAgICJrb3BmOyI6ICJcVTAwMDFkNTVjIiwKICAgICJrc2NyOyI6ICJcVTAwMDFkNGMwIiwKICAgICJsQWFycjsiOiAiXHUyMWRhIiwKICAgICJsQXJyOyI6ICJcdTIxZDAiLAogICAgImxBdGFpbDsiOiAiXHUyOTFiIiwKICAgICJsQmFycjsiOiAiXHUyOTBlIiwKICAgICJsRTsiOiAiXHUyMjY2IiwKICAgICJsRWc7IjogIlx1MmE4YiIsCiAgICAibEhhcjsiOiAiXHUyOTYyIiwKICAgICJsYWN1dGU7IjogIlx1MDEzYSIsCiAgICAibGFlbXB0eXY7IjogIlx1MjliNCIsCiAgICAibGFncmFuOyI6ICJcdTIxMTIiLAogICAgImxhbWJkYTsiOiAiXHUwM2JiIiwKICAgICJsYW5nOyI6ICJcdTI3ZTgiLAogICAgImxhbmdkOyI6ICJcdTI5OTEiLAogICAgImxhbmdsZTsiOiAiXHUyN2U4IiwKICAgICJsYXA7IjogIlx1MmE4NSIsCiAgICAibGFxdW8iOiAiXHhhYiIsCiAgICAibGFxdW87IjogIlx4YWIiLAogICAgImxhcnI7IjogIlx1MjE5MCIsCiAgICAibGFycmI7IjogIlx1MjFlNCIsCiAgICAibGFycmJmczsiOiAiXHUyOTFmIiwKICAgICJsYXJyZnM7IjogIlx1MjkxZCIsCiAgICAibGFycmhrOyI6ICJcdTIxYTkiLAogICAgImxhcnJscDsiOiAiXHUyMWFiIiwKICAgICJsYXJycGw7IjogIlx1MjkzOSIsCiAgICAibGFycnNpbTsiOiAiXHUyOTczIiwKICAgICJsYXJydGw7IjogIlx1MjFhMiIsCiAgICAibGF0OyI6ICJcdTJhYWIiLAogICAgImxhdGFpbDsiOiAiXHUyOTE5IiwKICAgICJsYXRlOyI6ICJcdTJhYWQiLAogICAgImxhdGVzOyI6ICJcdTJhYWRcdWZlMDAiLAogICAgImxiYXJyOyI6ICJcdTI5MGMiLAogICAgImxiYnJrOyI6ICJcdTI3NzIiLAogICAgImxicmFjZTsiOiAieyIsCiAgICAibGJyYWNrOyI6ICJbIiwKICAgICJsYnJrZTsiOiAiXHUyOThiIiwKICAgICJsYnJrc2xkOyI6ICJcdTI5OGYiLAogICAgImxicmtzbHU7IjogIlx1Mjk4ZCIsCiAgICAibGNhcm9uOyI6ICJcdTAxM2UiLAogICAgImxjZWRpbDsiOiAiXHUwMTNjIiwKICAgICJsY2VpbDsiOiAiXHUyMzA4IiwKICAgICJsY3ViOyI6ICJ7IiwKICAgICJsY3k7IjogIlx1MDQzYiIsCiAgICAibGRjYTsiOiAiXHUyOTM2IiwKICAgICJsZHF1bzsiOiAiXHUyMDFjIiwKICAgICJsZHF1b3I7IjogIlx1MjAxZSIsCiAgICAibGRyZGhhcjsiOiAiXHUyOTY3IiwKICAgICJsZHJ1c2hhcjsiOiAiXHUyOTRiIiwKICAgICJsZHNoOyI6ICJcdTIxYjIiLAogICAgImxlOyI6ICJcdTIyNjQiLAogICAgImxlZnRhcnJvdzsiOiAiXHUyMTkwIiwKICAgICJsZWZ0YXJyb3d0YWlsOyI6ICJcdTIxYTIiLAogICAgImxlZnRoYXJwb29uZG93bjsiOiAiXHUyMWJkIiwKICAgICJsZWZ0aGFycG9vbnVwOyI6ICJcdTIxYmMiLAogICAgImxlZnRsZWZ0YXJyb3dzOyI6ICJcdTIxYzciLAogICAgImxlZnRyaWdodGFycm93OyI6ICJcdTIxOTQiLAogICAgImxlZnRyaWdodGFycm93czsiOiAiXHUyMWM2IiwKICAgICJsZWZ0cmlnaHRoYXJwb29uczsiOiAiXHUyMWNiIiwKICAgICJsZWZ0cmlnaHRzcXVpZ2Fycm93OyI6ICJcdTIxYWQiLAogICAgImxlZnR0aHJlZXRpbWVzOyI6ICJcdTIyY2IiLAogICAgImxlZzsiOiAiXHUyMmRhIiwKICAgICJsZXE7IjogIlx1MjI2NCIsCiAgICAibGVxcTsiOiAiXHUyMjY2IiwKICAgICJsZXFzbGFudDsiOiAiXHUyYTdkIiwKICAgICJsZXM7IjogIlx1MmE3ZCIsCiAgICAibGVzY2M7IjogIlx1MmFhOCIsCiAgICAibGVzZG90OyI6ICJcdTJhN2YiLAogICAgImxlc2RvdG87IjogIlx1MmE4MSIsCiAgICAibGVzZG90b3I7IjogIlx1MmE4MyIsCiAgICAibGVzZzsiOiAiXHUyMmRhXHVmZTAwIiwKICAgICJsZXNnZXM7IjogIlx1MmE5MyIsCiAgICAibGVzc2FwcHJveDsiOiAiXHUyYTg1IiwKICAgICJsZXNzZG90OyI6ICJcdTIyZDYiLAogICAgImxlc3NlcWd0cjsiOiAiXHUyMmRhIiwKICAgICJsZXNzZXFxZ3RyOyI6ICJcdTJhOGIiLAogICAgImxlc3NndHI7IjogIlx1MjI3NiIsCiAgICAibGVzc3NpbTsiOiAiXHUyMjcyIiwKICAgICJsZmlzaHQ7IjogIlx1Mjk3YyIsCiAgICAibGZsb29yOyI6ICJcdTIzMGEiLAogICAgImxmcjsiOiAiXFUwMDAxZDUyOSIsCiAgICAibGc7IjogIlx1MjI3NiIsCiAgICAibGdFOyI6ICJcdTJhOTEiLAogICAgImxoYXJkOyI6ICJcdTIxYmQiLAogICAgImxoYXJ1OyI6ICJcdTIxYmMiLAogICAgImxoYXJ1bDsiOiAiXHUyOTZhIiwKICAgICJsaGJsazsiOiAiXHUyNTg0IiwKICAgICJsamN5OyI6ICJcdTA0NTkiLAogICAgImxsOyI6ICJcdTIyNmEiLAogICAgImxsYXJyOyI6ICJcdTIxYzciLAogICAgImxsY29ybmVyOyI6ICJcdTIzMWUiLAogICAgImxsaGFyZDsiOiAiXHUyOTZiIiwKICAgICJsbHRyaTsiOiAiXHUyNWZhIiwKICAgICJsbWlkb3Q7IjogIlx1MDE0MCIsCiAgICAibG1vdXN0OyI6ICJcdTIzYjAiLAogICAgImxtb3VzdGFjaGU7IjogIlx1MjNiMCIsCiAgICAibG5FOyI6ICJcdTIyNjgiLAogICAgImxuYXA7IjogIlx1MmE4OSIsCiAgICAibG5hcHByb3g7IjogIlx1MmE4OSIsCiAgICAibG5lOyI6ICJcdTJhODciLAogICAgImxuZXE7IjogIlx1MmE4NyIsCiAgICAibG5lcXE7IjogIlx1MjI2OCIsCiAgICAibG5zaW07IjogIlx1MjJlNiIsCiAgICAibG9hbmc7IjogIlx1MjdlYyIsCiAgICAibG9hcnI7IjogIlx1MjFmZCIsCiAgICAibG9icms7IjogIlx1MjdlNiIsCiAgICAibG9uZ2xlZnRhcnJvdzsiOiAiXHUyN2Y1IiwKICAgICJsb25nbGVmdHJpZ2h0YXJyb3c7IjogIlx1MjdmNyIsCiAgICAibG9uZ21hcHN0bzsiOiAiXHUyN2ZjIiwKICAgICJsb25ncmlnaHRhcnJvdzsiOiAiXHUyN2Y2IiwKICAgICJsb29wYXJyb3dsZWZ0OyI6ICJcdTIxYWIiLAogICAgImxvb3BhcnJvd3JpZ2h0OyI6ICJcdTIxYWMiLAogICAgImxvcGFyOyI6ICJcdTI5ODUiLAogICAgImxvcGY7IjogIlxVMDAwMWQ1NWQiLAogICAgImxvcGx1czsiOiAiXHUyYTJkIiwKICAgICJsb3RpbWVzOyI6ICJcdTJhMzQiLAogICAgImxvd2FzdDsiOiAiXHUyMjE3IiwKICAgICJsb3diYXI7IjogIl8iLAogICAgImxvejsiOiAiXHUyNWNhIiwKICAgICJsb3plbmdlOyI6ICJcdTI1Y2EiLAogICAgImxvemY7IjogIlx1MjllYiIsCiAgICAibHBhcjsiOiAiKCIsCiAgICAibHBhcmx0OyI6ICJcdTI5OTMiLAogICAgImxyYXJyOyI6ICJcdTIxYzYiLAogICAgImxyY29ybmVyOyI6ICJcdTIzMWYiLAogICAgImxyaGFyOyI6ICJcdTIxY2IiLAogICAgImxyaGFyZDsiOiAiXHUyOTZkIiwKICAgICJscm07IjogIlx1MjAwZSIsCiAgICAibHJ0cmk7IjogIlx1MjJiZiIsCiAgICAibHNhcXVvOyI6ICJcdTIwMzkiLAogICAgImxzY3I7IjogIlxVMDAwMWQ0YzEiLAogICAgImxzaDsiOiAiXHUyMWIwIiwKICAgICJsc2ltOyI6ICJcdTIyNzIiLAogICAgImxzaW1lOyI6ICJcdTJhOGQiLAogICAgImxzaW1nOyI6ICJcdTJhOGYiLAogICAgImxzcWI7IjogIlsiLAogICAgImxzcXVvOyI6ICJcdTIwMTgiLAogICAgImxzcXVvcjsiOiAiXHUyMDFhIiwKICAgICJsc3Ryb2s7IjogIlx1MDE0MiIsCiAgICAibHQiOiAiPCIsCiAgICAibHQ7IjogIjwiLAogICAgImx0Y2M7IjogIlx1MmFhNiIsCiAgICAibHRjaXI7IjogIlx1MmE3OSIsCiAgICAibHRkb3Q7IjogIlx1MjJkNiIsCiAgICAibHRocmVlOyI6ICJcdTIyY2IiLAogICAgImx0aW1lczsiOiAiXHUyMmM5IiwKICAgICJsdGxhcnI7IjogIlx1Mjk3NiIsCiAgICAibHRxdWVzdDsiOiAiXHUyYTdiIiwKICAgICJsdHJQYXI7IjogIlx1Mjk5NiIsCiAgICAibHRyaTsiOiAiXHUyNWMzIiwKICAgICJsdHJpZTsiOiAiXHUyMmI0IiwKICAgICJsdHJpZjsiOiAiXHUyNWMyIiwKICAgICJsdXJkc2hhcjsiOiAiXHUyOTRhIiwKICAgICJsdXJ1aGFyOyI6ICJcdTI5NjYiLAogICAgImx2ZXJ0bmVxcTsiOiAiXHUyMjY4XHVmZTAwIiwKICAgICJsdm5FOyI6ICJcdTIyNjhcdWZlMDAiLAogICAgIm1ERG90OyI6ICJcdTIyM2EiLAogICAgIm1hY3IiOiAiXHhhZiIsCiAgICAibWFjcjsiOiAiXHhhZiIsCiAgICAibWFsZTsiOiAiXHUyNjQyIiwKICAgICJtYWx0OyI6ICJcdTI3MjAiLAogICAgIm1hbHRlc2U7IjogIlx1MjcyMCIsCiAgICAibWFwOyI6ICJcdTIxYTYiLAogICAgIm1hcHN0bzsiOiAiXHUyMWE2IiwKICAgICJtYXBzdG9kb3duOyI6ICJcdTIxYTciLAogICAgIm1hcHN0b2xlZnQ7IjogIlx1MjFhNCIsCiAgICAibWFwc3RvdXA7IjogIlx1MjFhNSIsCiAgICAibWFya2VyOyI6ICJcdTI1YWUiLAogICAgIm1jb21tYTsiOiAiXHUyYTI5IiwKICAgICJtY3k7IjogIlx1MDQzYyIsCiAgICAibWRhc2g7IjogIlx1MjAxNCIsCiAgICAibWVhc3VyZWRhbmdsZTsiOiAiXHUyMjIxIiwKICAgICJtZnI7IjogIlxVMDAwMWQ1MmEiLAogICAgIm1obzsiOiAiXHUyMTI3IiwKICAgICJtaWNybyI6ICJceGI1IiwKICAgICJtaWNybzsiOiAiXHhiNSIsCiAgICAibWlkOyI6ICJcdTIyMjMiLAogICAgIm1pZGFzdDsiOiAiKiIsCiAgICAibWlkY2lyOyI6ICJcdTJhZjAiLAogICAgIm1pZGRvdCI6ICJceGI3IiwKICAgICJtaWRkb3Q7IjogIlx4YjciLAogICAgIm1pbnVzOyI6ICJcdTIyMTIiLAogICAgIm1pbnVzYjsiOiAiXHUyMjlmIiwKICAgICJtaW51c2Q7IjogIlx1MjIzOCIsCiAgICAibWludXNkdTsiOiAiXHUyYTJhIiwKICAgICJtbGNwOyI6ICJcdTJhZGIiLAogICAgIm1sZHI7IjogIlx1MjAyNiIsCiAgICAibW5wbHVzOyI6ICJcdTIyMTMiLAogICAgIm1vZGVsczsiOiAiXHUyMmE3IiwKICAgICJtb3BmOyI6ICJcVTAwMDFkNTVlIiwKICAgICJtcDsiOiAiXHUyMjEzIiwKICAgICJtc2NyOyI6ICJcVTAwMDFkNGMyIiwKICAgICJtc3Rwb3M7IjogIlx1MjIzZSIsCiAgICAibXU7IjogIlx1MDNiYyIsCiAgICAibXVsdGltYXA7IjogIlx1MjJiOCIsCiAgICAibXVtYXA7IjogIlx1MjJiOCIsCiAgICAibkdnOyI6ICJcdTIyZDlcdTAzMzgiLAogICAgIm5HdDsiOiAiXHUyMjZiXHUyMGQyIiwKICAgICJuR3R2OyI6ICJcdTIyNmJcdTAzMzgiLAogICAgIm5MZWZ0YXJyb3c7IjogIlx1MjFjZCIsCiAgICAibkxlZnRyaWdodGFycm93OyI6ICJcdTIxY2UiLAogICAgIm5MbDsiOiAiXHUyMmQ4XHUwMzM4IiwKICAgICJuTHQ7IjogIlx1MjI2YVx1MjBkMiIsCiAgICAibkx0djsiOiAiXHUyMjZhXHUwMzM4IiwKICAgICJuUmlnaHRhcnJvdzsiOiAiXHUyMWNmIiwKICAgICJuVkRhc2g7IjogIlx1MjJhZiIsCiAgICAiblZkYXNoOyI6ICJcdTIyYWUiLAogICAgIm5hYmxhOyI6ICJcdTIyMDciLAogICAgIm5hY3V0ZTsiOiAiXHUwMTQ0IiwKICAgICJuYW5nOyI6ICJcdTIyMjBcdTIwZDIiLAogICAgIm5hcDsiOiAiXHUyMjQ5IiwKICAgICJuYXBFOyI6ICJcdTJhNzBcdTAzMzgiLAogICAgIm5hcGlkOyI6ICJcdTIyNGJcdTAzMzgiLAogICAgIm5hcG9zOyI6ICJcdTAxNDkiLAogICAgIm5hcHByb3g7IjogIlx1MjI0OSIsCiAgICAibmF0dXI7IjogIlx1MjY2ZSIsCiAgICAibmF0dXJhbDsiOiAiXHUyNjZlIiwKICAgICJuYXR1cmFsczsiOiAiXHUyMTE1IiwKICAgICJuYnNwIjogIlx4YTAiLAogICAgIm5ic3A7IjogIlx4YTAiLAogICAgIm5idW1wOyI6ICJcdTIyNGVcdTAzMzgiLAogICAgIm5idW1wZTsiOiAiXHUyMjRmXHUwMzM4IiwKICAgICJuY2FwOyI6ICJcdTJhNDMiLAogICAgIm5jYXJvbjsiOiAiXHUwMTQ4IiwKICAgICJuY2VkaWw7IjogIlx1MDE0NiIsCiAgICAibmNvbmc7IjogIlx1MjI0NyIsCiAgICAibmNvbmdkb3Q7IjogIlx1MmE2ZFx1MDMzOCIsCiAgICAibmN1cDsiOiAiXHUyYTQyIiwKICAgICJuY3k7IjogIlx1MDQzZCIsCiAgICAibmRhc2g7IjogIlx1MjAxMyIsCiAgICAibmU7IjogIlx1MjI2MCIsCiAgICAibmVBcnI7IjogIlx1MjFkNyIsCiAgICAibmVhcmhrOyI6ICJcdTI5MjQiLAogICAgIm5lYXJyOyI6ICJcdTIxOTciLAogICAgIm5lYXJyb3c7IjogIlx1MjE5NyIsCiAgICAibmVkb3Q7IjogIlx1MjI1MFx1MDMzOCIsCiAgICAibmVxdWl2OyI6ICJcdTIyNjIiLAogICAgIm5lc2VhcjsiOiAiXHUyOTI4IiwKICAgICJuZXNpbTsiOiAiXHUyMjQyXHUwMzM4IiwKICAgICJuZXhpc3Q7IjogIlx1MjIwNCIsCiAgICAibmV4aXN0czsiOiAiXHUyMjA0IiwKICAgICJuZnI7IjogIlxVMDAwMWQ1MmIiLAogICAgIm5nRTsiOiAiXHUyMjY3XHUwMzM4IiwKICAgICJuZ2U7IjogIlx1MjI3MSIsCiAgICAibmdlcTsiOiAiXHUyMjcxIiwKICAgICJuZ2VxcTsiOiAiXHUyMjY3XHUwMzM4IiwKICAgICJuZ2Vxc2xhbnQ7IjogIlx1MmE3ZVx1MDMzOCIsCiAgICAibmdlczsiOiAiXHUyYTdlXHUwMzM4IiwKICAgICJuZ3NpbTsiOiAiXHUyMjc1IiwKICAgICJuZ3Q7IjogIlx1MjI2ZiIsCiAgICAibmd0cjsiOiAiXHUyMjZmIiwKICAgICJuaEFycjsiOiAiXHUyMWNlIiwKICAgICJuaGFycjsiOiAiXHUyMWFlIiwKICAgICJuaHBhcjsiOiAiXHUyYWYyIiwKICAgICJuaTsiOiAiXHUyMjBiIiwKICAgICJuaXM7IjogIlx1MjJmYyIsCiAgICAibmlzZDsiOiAiXHUyMmZhIiwKICAgICJuaXY7IjogIlx1MjIwYiIsCiAgICAibmpjeTsiOiAiXHUwNDVhIiwKICAgICJubEFycjsiOiAiXHUyMWNkIiwKICAgICJubEU7IjogIlx1MjI2Nlx1MDMzOCIsCiAgICAibmxhcnI7IjogIlx1MjE5YSIsCiAgICAibmxkcjsiOiAiXHUyMDI1IiwKICAgICJubGU7IjogIlx1MjI3MCIsCiAgICAibmxlZnRhcnJvdzsiOiAiXHUyMTlhIiwKICAgICJubGVmdHJpZ2h0YXJyb3c7IjogIlx1MjFhZSIsCiAgICAibmxlcTsiOiAiXHUyMjcwIiwKICAgICJubGVxcTsiOiAiXHUyMjY2XHUwMzM4IiwKICAgICJubGVxc2xhbnQ7IjogIlx1MmE3ZFx1MDMzOCIsCiAgICAibmxlczsiOiAiXHUyYTdkXHUwMzM4IiwKICAgICJubGVzczsiOiAiXHUyMjZlIiwKICAgICJubHNpbTsiOiAiXHUyMjc0IiwKICAgICJubHQ7IjogIlx1MjI2ZSIsCiAgICAibmx0cmk7IjogIlx1MjJlYSIsCiAgICAibmx0cmllOyI6ICJcdTIyZWMiLAogICAgIm5taWQ7IjogIlx1MjIyNCIsCiAgICAibm9wZjsiOiAiXFUwMDAxZDU1ZiIsCiAgICAibm90IjogIlx4YWMiLAogICAgIm5vdDsiOiAiXHhhYyIsCiAgICAibm90aW47IjogIlx1MjIwOSIsCiAgICAibm90aW5FOyI6ICJcdTIyZjlcdTAzMzgiLAogICAgIm5vdGluZG90OyI6ICJcdTIyZjVcdTAzMzgiLAogICAgIm5vdGludmE7IjogIlx1MjIwOSIsCiAgICAibm90aW52YjsiOiAiXHUyMmY3IiwKICAgICJub3RpbnZjOyI6ICJcdTIyZjYiLAogICAgIm5vdG5pOyI6ICJcdTIyMGMiLAogICAgIm5vdG5pdmE7IjogIlx1MjIwYyIsCiAgICAibm90bml2YjsiOiAiXHUyMmZlIiwKICAgICJub3RuaXZjOyI6ICJcdTIyZmQiLAogICAgIm5wYXI7IjogIlx1MjIyNiIsCiAgICAibnBhcmFsbGVsOyI6ICJcdTIyMjYiLAogICAgIm5wYXJzbDsiOiAiXHUyYWZkXHUyMGU1IiwKICAgICJucGFydDsiOiAiXHUyMjAyXHUwMzM4IiwKICAgICJucG9saW50OyI6ICJcdTJhMTQiLAogICAgIm5wcjsiOiAiXHUyMjgwIiwKICAgICJucHJjdWU7IjogIlx1MjJlMCIsCiAgICAibnByZTsiOiAiXHUyYWFmXHUwMzM4IiwKICAgICJucHJlYzsiOiAiXHUyMjgwIiwKICAgICJucHJlY2VxOyI6ICJcdTJhYWZcdTAzMzgiLAogICAgIm5yQXJyOyI6ICJcdTIxY2YiLAogICAgIm5yYXJyOyI6ICJcdTIxOWIiLAogICAgIm5yYXJyYzsiOiAiXHUyOTMzXHUwMzM4IiwKICAgICJucmFycnc7IjogIlx1MjE5ZFx1MDMzOCIsCiAgICAibnJpZ2h0YXJyb3c7IjogIlx1MjE5YiIsCiAgICAibnJ0cmk7IjogIlx1MjJlYiIsCiAgICAibnJ0cmllOyI6ICJcdTIyZWQiLAogICAgIm5zYzsiOiAiXHUyMjgxIiwKICAgICJuc2NjdWU7IjogIlx1MjJlMSIsCiAgICAibnNjZTsiOiAiXHUyYWIwXHUwMzM4IiwKICAgICJuc2NyOyI6ICJcVTAwMDFkNGMzIiwKICAgICJuc2hvcnRtaWQ7IjogIlx1MjIyNCIsCiAgICAibnNob3J0cGFyYWxsZWw7IjogIlx1MjIyNiIsCiAgICAibnNpbTsiOiAiXHUyMjQxIiwKICAgICJuc2ltZTsiOiAiXHUyMjQ0IiwKICAgICJuc2ltZXE7IjogIlx1MjI0NCIsCiAgICAibnNtaWQ7IjogIlx1MjIyNCIsCiAgICAibnNwYXI7IjogIlx1MjIyNiIsCiAgICAibnNxc3ViZTsiOiAiXHUyMmUyIiwKICAgICJuc3FzdXBlOyI6ICJcdTIyZTMiLAogICAgIm5zdWI7IjogIlx1MjI4NCIsCiAgICAibnN1YkU7IjogIlx1MmFjNVx1MDMzOCIsCiAgICAibnN1YmU7IjogIlx1MjI4OCIsCiAgICAibnN1YnNldDsiOiAiXHUyMjgyXHUyMGQyIiwKICAgICJuc3Vic2V0ZXE7IjogIlx1MjI4OCIsCiAgICAibnN1YnNldGVxcTsiOiAiXHUyYWM1XHUwMzM4IiwKICAgICJuc3VjYzsiOiAiXHUyMjgxIiwKICAgICJuc3VjY2VxOyI6ICJcdTJhYjBcdTAzMzgiLAogICAgIm5zdXA7IjogIlx1MjI4NSIsCiAgICAibnN1cEU7IjogIlx1MmFjNlx1MDMzOCIsCiAgICAibnN1cGU7IjogIlx1MjI4OSIsCiAgICAibnN1cHNldDsiOiAiXHUyMjgzXHUyMGQyIiwKICAgICJuc3Vwc2V0ZXE7IjogIlx1MjI4OSIsCiAgICAibnN1cHNldGVxcTsiOiAiXHUyYWM2XHUwMzM4IiwKICAgICJudGdsOyI6ICJcdTIyNzkiLAogICAgIm50aWxkZSI6ICJceGYxIiwKICAgICJudGlsZGU7IjogIlx4ZjEiLAogICAgIm50bGc7IjogIlx1MjI3OCIsCiAgICAibnRyaWFuZ2xlbGVmdDsiOiAiXHUyMmVhIiwKICAgICJudHJpYW5nbGVsZWZ0ZXE7IjogIlx1MjJlYyIsCiAgICAibnRyaWFuZ2xlcmlnaHQ7IjogIlx1MjJlYiIsCiAgICAibnRyaWFuZ2xlcmlnaHRlcTsiOiAiXHUyMmVkIiwKICAgICJudTsiOiAiXHUwM2JkIiwKICAgICJudW07IjogIiMiLAogICAgIm51bWVybzsiOiAiXHUyMTE2IiwKICAgICJudW1zcDsiOiAiXHUyMDA3IiwKICAgICJudkRhc2g7IjogIlx1MjJhZCIsCiAgICAibnZIYXJyOyI6ICJcdTI5MDQiLAogICAgIm52YXA7IjogIlx1MjI0ZFx1MjBkMiIsCiAgICAibnZkYXNoOyI6ICJcdTIyYWMiLAogICAgIm52Z2U7IjogIlx1MjI2NVx1MjBkMiIsCiAgICAibnZndDsiOiAiPlx1MjBkMiIsCiAgICAibnZpbmZpbjsiOiAiXHUyOWRlIiwKICAgICJudmxBcnI7IjogIlx1MjkwMiIsCiAgICAibnZsZTsiOiAiXHUyMjY0XHUyMGQyIiwKICAgICJudmx0OyI6ICI8XHUyMGQyIiwKICAgICJudmx0cmllOyI6ICJcdTIyYjRcdTIwZDIiLAogICAgIm52ckFycjsiOiAiXHUyOTAzIiwKICAgICJudnJ0cmllOyI6ICJcdTIyYjVcdTIwZDIiLAogICAgIm52c2ltOyI6ICJcdTIyM2NcdTIwZDIiLAogICAgIm53QXJyOyI6ICJcdTIxZDYiLAogICAgIm53YXJoazsiOiAiXHUyOTIzIiwKICAgICJud2FycjsiOiAiXHUyMTk2IiwKICAgICJud2Fycm93OyI6ICJcdTIxOTYiLAogICAgIm53bmVhcjsiOiAiXHUyOTI3IiwKICAgICJvUzsiOiAiXHUyNGM4IiwKICAgICJvYWN1dGUiOiAiXHhmMyIsCiAgICAib2FjdXRlOyI6ICJceGYzIiwKICAgICJvYXN0OyI6ICJcdTIyOWIiLAogICAgIm9jaXI7IjogIlx1MjI5YSIsCiAgICAib2NpcmMiOiAiXHhmNCIsCiAgICAib2NpcmM7IjogIlx4ZjQiLAogICAgIm9jeTsiOiAiXHUwNDNlIiwKICAgICJvZGFzaDsiOiAiXHUyMjlkIiwKICAgICJvZGJsYWM7IjogIlx1MDE1MSIsCiAgICAib2RpdjsiOiAiXHUyYTM4IiwKICAgICJvZG90OyI6ICJcdTIyOTkiLAogICAgIm9kc29sZDsiOiAiXHUyOWJjIiwKICAgICJvZWxpZzsiOiAiXHUwMTUzIiwKICAgICJvZmNpcjsiOiAiXHUyOWJmIiwKICAgICJvZnI7IjogIlxVMDAwMWQ1MmMiLAogICAgIm9nb247IjogIlx1MDJkYiIsCiAgICAib2dyYXZlIjogIlx4ZjIiLAogICAgIm9ncmF2ZTsiOiAiXHhmMiIsCiAgICAib2d0OyI6ICJcdTI5YzEiLAogICAgIm9oYmFyOyI6ICJcdTI5YjUiLAogICAgIm9obTsiOiAiXHUwM2E5IiwKICAgICJvaW50OyI6ICJcdTIyMmUiLAogICAgIm9sYXJyOyI6ICJcdTIxYmEiLAogICAgIm9sY2lyOyI6ICJcdTI5YmUiLAogICAgIm9sY3Jvc3M7IjogIlx1MjliYiIsCiAgICAib2xpbmU7IjogIlx1MjAzZSIsCiAgICAib2x0OyI6ICJcdTI5YzAiLAogICAgIm9tYWNyOyI6ICJcdTAxNGQiLAogICAgIm9tZWdhOyI6ICJcdTAzYzkiLAogICAgIm9taWNyb247IjogIlx1MDNiZiIsCiAgICAib21pZDsiOiAiXHUyOWI2IiwKICAgICJvbWludXM7IjogIlx1MjI5NiIsCiAgICAib29wZjsiOiAiXFUwMDAxZDU2MCIsCiAgICAib3BhcjsiOiAiXHUyOWI3IiwKICAgICJvcGVycDsiOiAiXHUyOWI5IiwKICAgICJvcGx1czsiOiAiXHUyMjk1IiwKICAgICJvcjsiOiAiXHUyMjI4IiwKICAgICJvcmFycjsiOiAiXHUyMWJiIiwKICAgICJvcmQ7IjogIlx1MmE1ZCIsCiAgICAib3JkZXI7IjogIlx1MjEzNCIsCiAgICAib3JkZXJvZjsiOiAiXHUyMTM0IiwKICAgICJvcmRmIjogIlx4YWEiLAogICAgIm9yZGY7IjogIlx4YWEiLAogICAgIm9yZG0iOiAiXHhiYSIsCiAgICAib3JkbTsiOiAiXHhiYSIsCiAgICAib3JpZ29mOyI6ICJcdTIyYjYiLAogICAgIm9yb3I7IjogIlx1MmE1NiIsCiAgICAib3JzbG9wZTsiOiAiXHUyYTU3IiwKICAgICJvcnY7IjogIlx1MmE1YiIsCiAgICAib3NjcjsiOiAiXHUyMTM0IiwKICAgICJvc2xhc2giOiAiXHhmOCIsCiAgICAib3NsYXNoOyI6ICJceGY4IiwKICAgICJvc29sOyI6ICJcdTIyOTgiLAogICAgIm90aWxkZSI6ICJceGY1IiwKICAgICJvdGlsZGU7IjogIlx4ZjUiLAogICAgIm90aW1lczsiOiAiXHUyMjk3IiwKICAgICJvdGltZXNhczsiOiAiXHUyYTM2IiwKICAgICJvdW1sIjogIlx4ZjYiLAogICAgIm91bWw7IjogIlx4ZjYiLAogICAgIm92YmFyOyI6ICJcdTIzM2QiLAogICAgInBhcjsiOiAiXHUyMjI1IiwKICAgICJwYXJhIjogIlx4YjYiLAogICAgInBhcmE7IjogIlx4YjYiLAogICAgInBhcmFsbGVsOyI6ICJcdTIyMjUiLAogICAgInBhcnNpbTsiOiAiXHUyYWYzIiwKICAgICJwYXJzbDsiOiAiXHUyYWZkIiwKICAgICJwYXJ0OyI6ICJcdTIyMDIiLAogICAgInBjeTsiOiAiXHUwNDNmIiwKICAgICJwZXJjbnQ7IjogIiUiLAogICAgInBlcmlvZDsiOiAiLiIsCiAgICAicGVybWlsOyI6ICJcdTIwMzAiLAogICAgInBlcnA7IjogIlx1MjJhNSIsCiAgICAicGVydGVuazsiOiAiXHUyMDMxIiwKICAgICJwZnI7IjogIlxVMDAwMWQ1MmQiLAogICAgInBoaTsiOiAiXHUwM2M2IiwKICAgICJwaGl2OyI6ICJcdTAzZDUiLAogICAgInBobW1hdDsiOiAiXHUyMTMzIiwKICAgICJwaG9uZTsiOiAiXHUyNjBlIiwKICAgICJwaTsiOiAiXHUwM2MwIiwKICAgICJwaXRjaGZvcms7IjogIlx1MjJkNCIsCiAgICAicGl2OyI6ICJcdTAzZDYiLAogICAgInBsYW5jazsiOiAiXHUyMTBmIiwKICAgICJwbGFuY2toOyI6ICJcdTIxMGUiLAogICAgInBsYW5rdjsiOiAiXHUyMTBmIiwKICAgICJwbHVzOyI6ICIrIiwKICAgICJwbHVzYWNpcjsiOiAiXHUyYTIzIiwKICAgICJwbHVzYjsiOiAiXHUyMjllIiwKICAgICJwbHVzY2lyOyI6ICJcdTJhMjIiLAogICAgInBsdXNkbzsiOiAiXHUyMjE0IiwKICAgICJwbHVzZHU7IjogIlx1MmEyNSIsCiAgICAicGx1c2U7IjogIlx1MmE3MiIsCiAgICAicGx1c21uIjogIlx4YjEiLAogICAgInBsdXNtbjsiOiAiXHhiMSIsCiAgICAicGx1c3NpbTsiOiAiXHUyYTI2IiwKICAgICJwbHVzdHdvOyI6ICJcdTJhMjciLAogICAgInBtOyI6ICJceGIxIiwKICAgICJwb2ludGludDsiOiAiXHUyYTE1IiwKICAgICJwb3BmOyI6ICJcVTAwMDFkNTYxIiwKICAgICJwb3VuZCI6ICJceGEzIiwKICAgICJwb3VuZDsiOiAiXHhhMyIsCiAgICAicHI7IjogIlx1MjI3YSIsCiAgICAicHJFOyI6ICJcdTJhYjMiLAogICAgInByYXA7IjogIlx1MmFiNyIsCiAgICAicHJjdWU7IjogIlx1MjI3YyIsCiAgICAicHJlOyI6ICJcdTJhYWYiLAogICAgInByZWM7IjogIlx1MjI3YSIsCiAgICAicHJlY2FwcHJveDsiOiAiXHUyYWI3IiwKICAgICJwcmVjY3VybHllcTsiOiAiXHUyMjdjIiwKICAgICJwcmVjZXE7IjogIlx1MmFhZiIsCiAgICAicHJlY25hcHByb3g7IjogIlx1MmFiOSIsCiAgICAicHJlY25lcXE7IjogIlx1MmFiNSIsCiAgICAicHJlY25zaW07IjogIlx1MjJlOCIsCiAgICAicHJlY3NpbTsiOiAiXHUyMjdlIiwKICAgICJwcmltZTsiOiAiXHUyMDMyIiwKICAgICJwcmltZXM7IjogIlx1MjExOSIsCiAgICAicHJuRTsiOiAiXHUyYWI1IiwKICAgICJwcm5hcDsiOiAiXHUyYWI5IiwKICAgICJwcm5zaW07IjogIlx1MjJlOCIsCiAgICAicHJvZDsiOiAiXHUyMjBmIiwKICAgICJwcm9mYWxhcjsiOiAiXHUyMzJlIiwKICAgICJwcm9mbGluZTsiOiAiXHUyMzEyIiwKICAgICJwcm9mc3VyZjsiOiAiXHUyMzEzIiwKICAgICJwcm9wOyI6ICJcdTIyMWQiLAogICAgInByb3B0bzsiOiAiXHUyMjFkIiwKICAgICJwcnNpbTsiOiAiXHUyMjdlIiwKICAgICJwcnVyZWw7IjogIlx1MjJiMCIsCiAgICAicHNjcjsiOiAiXFUwMDAxZDRjNSIsCiAgICAicHNpOyI6ICJcdTAzYzgiLAogICAgInB1bmNzcDsiOiAiXHUyMDA4IiwKICAgICJxZnI7IjogIlxVMDAwMWQ1MmUiLAogICAgInFpbnQ7IjogIlx1MmEwYyIsCiAgICAicW9wZjsiOiAiXFUwMDAxZDU2MiIsCiAgICAicXByaW1lOyI6ICJcdTIwNTciLAogICAgInFzY3I7IjogIlxVMDAwMWQ0YzYiLAogICAgInF1YXRlcm5pb25zOyI6ICJcdTIxMGQiLAogICAgInF1YXRpbnQ7IjogIlx1MmExNiIsCiAgICAicXVlc3Q7IjogIj8iLAogICAgInF1ZXN0ZXE7IjogIlx1MjI1ZiIsCiAgICAicXVvdCI6ICJcIiIsCiAgICAicXVvdDsiOiAiXCIiLAogICAgInJBYXJyOyI6ICJcdTIxZGIiLAogICAgInJBcnI7IjogIlx1MjFkMiIsCiAgICAickF0YWlsOyI6ICJcdTI5MWMiLAogICAgInJCYXJyOyI6ICJcdTI5MGYiLAogICAgInJIYXI7IjogIlx1Mjk2NCIsCiAgICAicmFjZTsiOiAiXHUyMjNkXHUwMzMxIiwKICAgICJyYWN1dGU7IjogIlx1MDE1NSIsCiAgICAicmFkaWM7IjogIlx1MjIxYSIsCiAgICAicmFlbXB0eXY7IjogIlx1MjliMyIsCiAgICAicmFuZzsiOiAiXHUyN2U5IiwKICAgICJyYW5nZDsiOiAiXHUyOTkyIiwKICAgICJyYW5nZTsiOiAiXHUyOWE1IiwKICAgICJyYW5nbGU7IjogIlx1MjdlOSIsCiAgICAicmFxdW8iOiAiXHhiYiIsCiAgICAicmFxdW87IjogIlx4YmIiLAogICAgInJhcnI7IjogIlx1MjE5MiIsCiAgICAicmFycmFwOyI6ICJcdTI5NzUiLAogICAgInJhcnJiOyI6ICJcdTIxZTUiLAogICAgInJhcnJiZnM7IjogIlx1MjkyMCIsCiAgICAicmFycmM7IjogIlx1MjkzMyIsCiAgICAicmFycmZzOyI6ICJcdTI5MWUiLAogICAgInJhcnJoazsiOiAiXHUyMWFhIiwKICAgICJyYXJybHA7IjogIlx1MjFhYyIsCiAgICAicmFycnBsOyI6ICJcdTI5NDUiLAogICAgInJhcnJzaW07IjogIlx1Mjk3NCIsCiAgICAicmFycnRsOyI6ICJcdTIxYTMiLAogICAgInJhcnJ3OyI6ICJcdTIxOWQiLAogICAgInJhdGFpbDsiOiAiXHUyOTFhIiwKICAgICJyYXRpbzsiOiAiXHUyMjM2IiwKICAgICJyYXRpb25hbHM7IjogIlx1MjExYSIsCiAgICAicmJhcnI7IjogIlx1MjkwZCIsCiAgICAicmJicms7IjogIlx1Mjc3MyIsCiAgICAicmJyYWNlOyI6ICJ9IiwKICAgICJyYnJhY2s7IjogIl0iLAogICAgInJicmtlOyI6ICJcdTI5OGMiLAogICAgInJicmtzbGQ7IjogIlx1Mjk4ZSIsCiAgICAicmJya3NsdTsiOiAiXHUyOTkwIiwKICAgICJyY2Fyb247IjogIlx1MDE1OSIsCiAgICAicmNlZGlsOyI6ICJcdTAxNTciLAogICAgInJjZWlsOyI6ICJcdTIzMDkiLAogICAgInJjdWI7IjogIn0iLAogICAgInJjeTsiOiAiXHUwNDQwIiwKICAgICJyZGNhOyI6ICJcdTI5MzciLAogICAgInJkbGRoYXI7IjogIlx1Mjk2OSIsCiAgICAicmRxdW87IjogIlx1MjAxZCIsCiAgICAicmRxdW9yOyI6ICJcdTIwMWQiLAogICAgInJkc2g7IjogIlx1MjFiMyIsCiAgICAicmVhbDsiOiAiXHUyMTFjIiwKICAgICJyZWFsaW5lOyI6ICJcdTIxMWIiLAogICAgInJlYWxwYXJ0OyI6ICJcdTIxMWMiLAogICAgInJlYWxzOyI6ICJcdTIxMWQiLAogICAgInJlY3Q7IjogIlx1MjVhZCIsCiAgICAicmVnIjogIlx4YWUiLAogICAgInJlZzsiOiAiXHhhZSIsCiAgICAicmZpc2h0OyI6ICJcdTI5N2QiLAogICAgInJmbG9vcjsiOiAiXHUyMzBiIiwKICAgICJyZnI7IjogIlxVMDAwMWQ1MmYiLAogICAgInJoYXJkOyI6ICJcdTIxYzEiLAogICAgInJoYXJ1OyI6ICJcdTIxYzAiLAogICAgInJoYXJ1bDsiOiAiXHUyOTZjIiwKICAgICJyaG87IjogIlx1MDNjMSIsCiAgICAicmhvdjsiOiAiXHUwM2YxIiwKICAgICJyaWdodGFycm93OyI6ICJcdTIxOTIiLAogICAgInJpZ2h0YXJyb3d0YWlsOyI6ICJcdTIxYTMiLAogICAgInJpZ2h0aGFycG9vbmRvd247IjogIlx1MjFjMSIsCiAgICAicmlnaHRoYXJwb29udXA7IjogIlx1MjFjMCIsCiAgICAicmlnaHRsZWZ0YXJyb3dzOyI6ICJcdTIxYzQiLAogICAgInJpZ2h0bGVmdGhhcnBvb25zOyI6ICJcdTIxY2MiLAogICAgInJpZ2h0cmlnaHRhcnJvd3M7IjogIlx1MjFjOSIsCiAgICAicmlnaHRzcXVpZ2Fycm93OyI6ICJcdTIxOWQiLAogICAgInJpZ2h0dGhyZWV0aW1lczsiOiAiXHUyMmNjIiwKICAgICJyaW5nOyI6ICJcdTAyZGEiLAogICAgInJpc2luZ2RvdHNlcTsiOiAiXHUyMjUzIiwKICAgICJybGFycjsiOiAiXHUyMWM0IiwKICAgICJybGhhcjsiOiAiXHUyMWNjIiwKICAgICJybG07IjogIlx1MjAwZiIsCiAgICAicm1vdXN0OyI6ICJcdTIzYjEiLAogICAgInJtb3VzdGFjaGU7IjogIlx1MjNiMSIsCiAgICAicm5taWQ7IjogIlx1MmFlZSIsCiAgICAicm9hbmc7IjogIlx1MjdlZCIsCiAgICAicm9hcnI7IjogIlx1MjFmZSIsCiAgICAicm9icms7IjogIlx1MjdlNyIsCiAgICAicm9wYXI7IjogIlx1Mjk4NiIsCiAgICAicm9wZjsiOiAiXFUwMDAxZDU2MyIsCiAgICAicm9wbHVzOyI6ICJcdTJhMmUiLAogICAgInJvdGltZXM7IjogIlx1MmEzNSIsCiAgICAicnBhcjsiOiAiKSIsCiAgICAicnBhcmd0OyI6ICJcdTI5OTQiLAogICAgInJwcG9saW50OyI6ICJcdTJhMTIiLAogICAgInJyYXJyOyI6ICJcdTIxYzkiLAogICAgInJzYXF1bzsiOiAiXHUyMDNhIiwKICAgICJyc2NyOyI6ICJcVTAwMDFkNGM3IiwKICAgICJyc2g7IjogIlx1MjFiMSIsCiAgICAicnNxYjsiOiAiXSIsCiAgICAicnNxdW87IjogIlx1MjAxOSIsCiAgICAicnNxdW9yOyI6ICJcdTIwMTkiLAogICAgInJ0aHJlZTsiOiAiXHUyMmNjIiwKICAgICJydGltZXM7IjogIlx1MjJjYSIsCiAgICAicnRyaTsiOiAiXHUyNWI5IiwKICAgICJydHJpZTsiOiAiXHUyMmI1IiwKICAgICJydHJpZjsiOiAiXHUyNWI4IiwKICAgICJydHJpbHRyaTsiOiAiXHUyOWNlIiwKICAgICJydWx1aGFyOyI6ICJcdTI5NjgiLAogICAgInJ4OyI6ICJcdTIxMWUiLAogICAgInNhY3V0ZTsiOiAiXHUwMTViIiwKICAgICJzYnF1bzsiOiAiXHUyMDFhIiwKICAgICJzYzsiOiAiXHUyMjdiIiwKICAgICJzY0U7IjogIlx1MmFiNCIsCiAgICAic2NhcDsiOiAiXHUyYWI4IiwKICAgICJzY2Fyb247IjogIlx1MDE2MSIsCiAgICAic2NjdWU7IjogIlx1MjI3ZCIsCiAgICAic2NlOyI6ICJcdTJhYjAiLAogICAgInNjZWRpbDsiOiAiXHUwMTVmIiwKICAgICJzY2lyYzsiOiAiXHUwMTVkIiwKICAgICJzY25FOyI6ICJcdTJhYjYiLAogICAgInNjbmFwOyI6ICJcdTJhYmEiLAogICAgInNjbnNpbTsiOiAiXHUyMmU5IiwKICAgICJzY3BvbGludDsiOiAiXHUyYTEzIiwKICAgICJzY3NpbTsiOiAiXHUyMjdmIiwKICAgICJzY3k7IjogIlx1MDQ0MSIsCiAgICAic2RvdDsiOiAiXHUyMmM1IiwKICAgICJzZG90YjsiOiAiXHUyMmExIiwKICAgICJzZG90ZTsiOiAiXHUyYTY2IiwKICAgICJzZUFycjsiOiAiXHUyMWQ4IiwKICAgICJzZWFyaGs7IjogIlx1MjkyNSIsCiAgICAic2VhcnI7IjogIlx1MjE5OCIsCiAgICAic2VhcnJvdzsiOiAiXHUyMTk4IiwKICAgICJzZWN0IjogIlx4YTciLAogICAgInNlY3Q7IjogIlx4YTciLAogICAgInNlbWk7IjogIjsiLAogICAgInNlc3dhcjsiOiAiXHUyOTI5IiwKICAgICJzZXRtaW51czsiOiAiXHUyMjE2IiwKICAgICJzZXRtbjsiOiAiXHUyMjE2IiwKICAgICJzZXh0OyI6ICJcdTI3MzYiLAogICAgInNmcjsiOiAiXFUwMDAxZDUzMCIsCiAgICAic2Zyb3duOyI6ICJcdTIzMjIiLAogICAgInNoYXJwOyI6ICJcdTI2NmYiLAogICAgInNoY2hjeTsiOiAiXHUwNDQ5IiwKICAgICJzaGN5OyI6ICJcdTA0NDgiLAogICAgInNob3J0bWlkOyI6ICJcdTIyMjMiLAogICAgInNob3J0cGFyYWxsZWw7IjogIlx1MjIyNSIsCiAgICAic2h5IjogIlx4YWQiLAogICAgInNoeTsiOiAiXHhhZCIsCiAgICAic2lnbWE7IjogIlx1MDNjMyIsCiAgICAic2lnbWFmOyI6ICJcdTAzYzIiLAogICAgInNpZ21hdjsiOiAiXHUwM2MyIiwKICAgICJzaW07IjogIlx1MjIzYyIsCiAgICAic2ltZG90OyI6ICJcdTJhNmEiLAogICAgInNpbWU7IjogIlx1MjI0MyIsCiAgICAic2ltZXE7IjogIlx1MjI0MyIsCiAgICAic2ltZzsiOiAiXHUyYTllIiwKICAgICJzaW1nRTsiOiAiXHUyYWEwIiwKICAgICJzaW1sOyI6ICJcdTJhOWQiLAogICAgInNpbWxFOyI6ICJcdTJhOWYiLAogICAgInNpbW5lOyI6ICJcdTIyNDYiLAogICAgInNpbXBsdXM7IjogIlx1MmEyNCIsCiAgICAic2ltcmFycjsiOiAiXHUyOTcyIiwKICAgICJzbGFycjsiOiAiXHUyMTkwIiwKICAgICJzbWFsbHNldG1pbnVzOyI6ICJcdTIyMTYiLAogICAgInNtYXNocDsiOiAiXHUyYTMzIiwKICAgICJzbWVwYXJzbDsiOiAiXHUyOWU0IiwKICAgICJzbWlkOyI6ICJcdTIyMjMiLAogICAgInNtaWxlOyI6ICJcdTIzMjMiLAogICAgInNtdDsiOiAiXHUyYWFhIiwKICAgICJzbXRlOyI6ICJcdTJhYWMiLAogICAgInNtdGVzOyI6ICJcdTJhYWNcdWZlMDAiLAogICAgInNvZnRjeTsiOiAiXHUwNDRjIiwKICAgICJzb2w7IjogIi8iLAogICAgInNvbGI7IjogIlx1MjljNCIsCiAgICAic29sYmFyOyI6ICJcdTIzM2YiLAogICAgInNvcGY7IjogIlxVMDAwMWQ1NjQiLAogICAgInNwYWRlczsiOiAiXHUyNjYwIiwKICAgICJzcGFkZXN1aXQ7IjogIlx1MjY2MCIsCiAgICAic3BhcjsiOiAiXHUyMjI1IiwKICAgICJzcWNhcDsiOiAiXHUyMjkzIiwKICAgICJzcWNhcHM7IjogIlx1MjI5M1x1ZmUwMCIsCiAgICAic3FjdXA7IjogIlx1MjI5NCIsCiAgICAic3FjdXBzOyI6ICJcdTIyOTRcdWZlMDAiLAogICAgInNxc3ViOyI6ICJcdTIyOGYiLAogICAgInNxc3ViZTsiOiAiXHUyMjkxIiwKICAgICJzcXN1YnNldDsiOiAiXHUyMjhmIiwKICAgICJzcXN1YnNldGVxOyI6ICJcdTIyOTEiLAogICAgInNxc3VwOyI6ICJcdTIyOTAiLAogICAgInNxc3VwZTsiOiAiXHUyMjkyIiwKICAgICJzcXN1cHNldDsiOiAiXHUyMjkwIiwKICAgICJzcXN1cHNldGVxOyI6ICJcdTIyOTIiLAogICAgInNxdTsiOiAiXHUyNWExIiwKICAgICJzcXVhcmU7IjogIlx1MjVhMSIsCiAgICAic3F1YXJmOyI6ICJcdTI1YWEiLAogICAgInNxdWY7IjogIlx1MjVhYSIsCiAgICAic3JhcnI7IjogIlx1MjE5MiIsCiAgICAic3NjcjsiOiAiXFUwMDAxZDRjOCIsCiAgICAic3NldG1uOyI6ICJcdTIyMTYiLAogICAgInNzbWlsZTsiOiAiXHUyMzIzIiwKICAgICJzc3RhcmY7IjogIlx1MjJjNiIsCiAgICAic3RhcjsiOiAiXHUyNjA2IiwKICAgICJzdGFyZjsiOiAiXHUyNjA1IiwKICAgICJzdHJhaWdodGVwc2lsb247IjogIlx1MDNmNSIsCiAgICAic3RyYWlnaHRwaGk7IjogIlx1MDNkNSIsCiAgICAic3RybnM7IjogIlx4YWYiLAogICAgInN1YjsiOiAiXHUyMjgyIiwKICAgICJzdWJFOyI6ICJcdTJhYzUiLAogICAgInN1YmRvdDsiOiAiXHUyYWJkIiwKICAgICJzdWJlOyI6ICJcdTIyODYiLAogICAgInN1YmVkb3Q7IjogIlx1MmFjMyIsCiAgICAic3VibXVsdDsiOiAiXHUyYWMxIiwKICAgICJzdWJuRTsiOiAiXHUyYWNiIiwKICAgICJzdWJuZTsiOiAiXHUyMjhhIiwKICAgICJzdWJwbHVzOyI6ICJcdTJhYmYiLAogICAgInN1YnJhcnI7IjogIlx1Mjk3OSIsCiAgICAic3Vic2V0OyI6ICJcdTIyODIiLAogICAgInN1YnNldGVxOyI6ICJcdTIyODYiLAogICAgInN1YnNldGVxcTsiOiAiXHUyYWM1IiwKICAgICJzdWJzZXRuZXE7IjogIlx1MjI4YSIsCiAgICAic3Vic2V0bmVxcTsiOiAiXHUyYWNiIiwKICAgICJzdWJzaW07IjogIlx1MmFjNyIsCiAgICAic3Vic3ViOyI6ICJcdTJhZDUiLAogICAgInN1YnN1cDsiOiAiXHUyYWQzIiwKICAgICJzdWNjOyI6ICJcdTIyN2IiLAogICAgInN1Y2NhcHByb3g7IjogIlx1MmFiOCIsCiAgICAic3VjY2N1cmx5ZXE7IjogIlx1MjI3ZCIsCiAgICAic3VjY2VxOyI6ICJcdTJhYjAiLAogICAgInN1Y2NuYXBwcm94OyI6ICJcdTJhYmEiLAogICAgInN1Y2NuZXFxOyI6ICJcdTJhYjYiLAogICAgInN1Y2Nuc2ltOyI6ICJcdTIyZTkiLAogICAgInN1Y2NzaW07IjogIlx1MjI3ZiIsCiAgICAic3VtOyI6ICJcdTIyMTEiLAogICAgInN1bmc7IjogIlx1MjY2YSIsCiAgICAic3VwMSI6ICJceGI5IiwKICAgICJzdXAxOyI6ICJceGI5IiwKICAgICJzdXAyIjogIlx4YjIiLAogICAgInN1cDI7IjogIlx4YjIiLAogICAgInN1cDMiOiAiXHhiMyIsCiAgICAic3VwMzsiOiAiXHhiMyIsCiAgICAic3VwOyI6ICJcdTIyODMiLAogICAgInN1cEU7IjogIlx1MmFjNiIsCiAgICAic3VwZG90OyI6ICJcdTJhYmUiLAogICAgInN1cGRzdWI7IjogIlx1MmFkOCIsCiAgICAic3VwZTsiOiAiXHUyMjg3IiwKICAgICJzdXBlZG90OyI6ICJcdTJhYzQiLAogICAgInN1cGhzb2w7IjogIlx1MjdjOSIsCiAgICAic3VwaHN1YjsiOiAiXHUyYWQ3IiwKICAgICJzdXBsYXJyOyI6ICJcdTI5N2IiLAogICAgInN1cG11bHQ7IjogIlx1MmFjMiIsCiAgICAic3VwbkU7IjogIlx1MmFjYyIsCiAgICAic3VwbmU7IjogIlx1MjI4YiIsCiAgICAic3VwcGx1czsiOiAiXHUyYWMwIiwKICAgICJzdXBzZXQ7IjogIlx1MjI4MyIsCiAgICAic3Vwc2V0ZXE7IjogIlx1MjI4NyIsCiAgICAic3Vwc2V0ZXFxOyI6ICJcdTJhYzYiLAogICAgInN1cHNldG5lcTsiOiAiXHUyMjhiIiwKICAgICJzdXBzZXRuZXFxOyI6ICJcdTJhY2MiLAogICAgInN1cHNpbTsiOiAiXHUyYWM4IiwKICAgICJzdXBzdWI7IjogIlx1MmFkNCIsCiAgICAic3Vwc3VwOyI6ICJcdTJhZDYiLAogICAgInN3QXJyOyI6ICJcdTIxZDkiLAogICAgInN3YXJoazsiOiAiXHUyOTI2IiwKICAgICJzd2FycjsiOiAiXHUyMTk5IiwKICAgICJzd2Fycm93OyI6ICJcdTIxOTkiLAogICAgInN3bndhcjsiOiAiXHUyOTJhIiwKICAgICJzemxpZyI6ICJceGRmIiwKICAgICJzemxpZzsiOiAiXHhkZiIsCiAgICAidGFyZ2V0OyI6ICJcdTIzMTYiLAogICAgInRhdTsiOiAiXHUwM2M0IiwKICAgICJ0YnJrOyI6ICJcdTIzYjQiLAogICAgInRjYXJvbjsiOiAiXHUwMTY1IiwKICAgICJ0Y2VkaWw7IjogIlx1MDE2MyIsCiAgICAidGN5OyI6ICJcdTA0NDIiLAogICAgInRkb3Q7IjogIlx1MjBkYiIsCiAgICAidGVscmVjOyI6ICJcdTIzMTUiLAogICAgInRmcjsiOiAiXFUwMDAxZDUzMSIsCiAgICAidGhlcmU0OyI6ICJcdTIyMzQiLAogICAgInRoZXJlZm9yZTsiOiAiXHUyMjM0IiwKICAgICJ0aGV0YTsiOiAiXHUwM2I4IiwKICAgICJ0aGV0YXN5bTsiOiAiXHUwM2QxIiwKICAgICJ0aGV0YXY7IjogIlx1MDNkMSIsCiAgICAidGhpY2thcHByb3g7IjogIlx1MjI0OCIsCiAgICAidGhpY2tzaW07IjogIlx1MjIzYyIsCiAgICAidGhpbnNwOyI6ICJcdTIwMDkiLAogICAgInRoa2FwOyI6ICJcdTIyNDgiLAogICAgInRoa3NpbTsiOiAiXHUyMjNjIiwKICAgICJ0aG9ybiI6ICJceGZlIiwKICAgICJ0aG9ybjsiOiAiXHhmZSIsCiAgICAidGlsZGU7IjogIlx1MDJkYyIsCiAgICAidGltZXMiOiAiXHhkNyIsCiAgICAidGltZXM7IjogIlx4ZDciLAogICAgInRpbWVzYjsiOiAiXHUyMmEwIiwKICAgICJ0aW1lc2JhcjsiOiAiXHUyYTMxIiwKICAgICJ0aW1lc2Q7IjogIlx1MmEzMCIsCiAgICAidGludDsiOiAiXHUyMjJkIiwKICAgICJ0b2VhOyI6ICJcdTI5MjgiLAogICAgInRvcDsiOiAiXHUyMmE0IiwKICAgICJ0b3Bib3Q7IjogIlx1MjMzNiIsCiAgICAidG9wY2lyOyI6ICJcdTJhZjEiLAogICAgInRvcGY7IjogIlxVMDAwMWQ1NjUiLAogICAgInRvcGZvcms7IjogIlx1MmFkYSIsCiAgICAidG9zYTsiOiAiXHUyOTI5IiwKICAgICJ0cHJpbWU7IjogIlx1MjAzNCIsCiAgICAidHJhZGU7IjogIlx1MjEyMiIsCiAgICAidHJpYW5nbGU7IjogIlx1MjViNSIsCiAgICAidHJpYW5nbGVkb3duOyI6ICJcdTI1YmYiLAogICAgInRyaWFuZ2xlbGVmdDsiOiAiXHUyNWMzIiwKICAgICJ0cmlhbmdsZWxlZnRlcTsiOiAiXHUyMmI0IiwKICAgICJ0cmlhbmdsZXE7IjogIlx1MjI1YyIsCiAgICAidHJpYW5nbGVyaWdodDsiOiAiXHUyNWI5IiwKICAgICJ0cmlhbmdsZXJpZ2h0ZXE7IjogIlx1MjJiNSIsCiAgICAidHJpZG90OyI6ICJcdTI1ZWMiLAogICAgInRyaWU7IjogIlx1MjI1YyIsCiAgICAidHJpbWludXM7IjogIlx1MmEzYSIsCiAgICAidHJpcGx1czsiOiAiXHUyYTM5IiwKICAgICJ0cmlzYjsiOiAiXHUyOWNkIiwKICAgICJ0cml0aW1lOyI6ICJcdTJhM2IiLAogICAgInRycGV6aXVtOyI6ICJcdTIzZTIiLAogICAgInRzY3I7IjogIlxVMDAwMWQ0YzkiLAogICAgInRzY3k7IjogIlx1MDQ0NiIsCiAgICAidHNoY3k7IjogIlx1MDQ1YiIsCiAgICAidHN0cm9rOyI6ICJcdTAxNjciLAogICAgInR3aXh0OyI6ICJcdTIyNmMiLAogICAgInR3b2hlYWRsZWZ0YXJyb3c7IjogIlx1MjE5ZSIsCiAgICAidHdvaGVhZHJpZ2h0YXJyb3c7IjogIlx1MjFhMCIsCiAgICAidUFycjsiOiAiXHUyMWQxIiwKICAgICJ1SGFyOyI6ICJcdTI5NjMiLAogICAgInVhY3V0ZSI6ICJceGZhIiwKICAgICJ1YWN1dGU7IjogIlx4ZmEiLAogICAgInVhcnI7IjogIlx1MjE5MSIsCiAgICAidWJyY3k7IjogIlx1MDQ1ZSIsCiAgICAidWJyZXZlOyI6ICJcdTAxNmQiLAogICAgInVjaXJjIjogIlx4ZmIiLAogICAgInVjaXJjOyI6ICJceGZiIiwKICAgICJ1Y3k7IjogIlx1MDQ0MyIsCiAgICAidWRhcnI7IjogIlx1MjFjNSIsCiAgICAidWRibGFjOyI6ICJcdTAxNzEiLAogICAgInVkaGFyOyI6ICJcdTI5NmUiLAogICAgInVmaXNodDsiOiAiXHUyOTdlIiwKICAgICJ1ZnI7IjogIlxVMDAwMWQ1MzIiLAogICAgInVncmF2ZSI6ICJceGY5IiwKICAgICJ1Z3JhdmU7IjogIlx4ZjkiLAogICAgInVoYXJsOyI6ICJcdTIxYmYiLAogICAgInVoYXJyOyI6ICJcdTIxYmUiLAogICAgInVoYmxrOyI6ICJcdTI1ODAiLAogICAgInVsY29ybjsiOiAiXHUyMzFjIiwKICAgICJ1bGNvcm5lcjsiOiAiXHUyMzFjIiwKICAgICJ1bGNyb3A7IjogIlx1MjMwZiIsCiAgICAidWx0cmk7IjogIlx1MjVmOCIsCiAgICAidW1hY3I7IjogIlx1MDE2YiIsCiAgICAidW1sIjogIlx4YTgiLAogICAgInVtbDsiOiAiXHhhOCIsCiAgICAidW9nb247IjogIlx1MDE3MyIsCiAgICAidW9wZjsiOiAiXFUwMDAxZDU2NiIsCiAgICAidXBhcnJvdzsiOiAiXHUyMTkxIiwKICAgICJ1cGRvd25hcnJvdzsiOiAiXHUyMTk1IiwKICAgICJ1cGhhcnBvb25sZWZ0OyI6ICJcdTIxYmYiLAogICAgInVwaGFycG9vbnJpZ2h0OyI6ICJcdTIxYmUiLAogICAgInVwbHVzOyI6ICJcdTIyOGUiLAogICAgInVwc2k7IjogIlx1MDNjNSIsCiAgICAidXBzaWg7IjogIlx1MDNkMiIsCiAgICAidXBzaWxvbjsiOiAiXHUwM2M1IiwKICAgICJ1cHVwYXJyb3dzOyI6ICJcdTIxYzgiLAogICAgInVyY29ybjsiOiAiXHUyMzFkIiwKICAgICJ1cmNvcm5lcjsiOiAiXHUyMzFkIiwKICAgICJ1cmNyb3A7IjogIlx1MjMwZSIsCiAgICAidXJpbmc7IjogIlx1MDE2ZiIsCiAgICAidXJ0cmk7IjogIlx1MjVmOSIsCiAgICAidXNjcjsiOiAiXFUwMDAxZDRjYSIsCiAgICAidXRkb3Q7IjogIlx1MjJmMCIsCiAgICAidXRpbGRlOyI6ICJcdTAxNjkiLAogICAgInV0cmk7IjogIlx1MjViNSIsCiAgICAidXRyaWY7IjogIlx1MjViNCIsCiAgICAidXVhcnI7IjogIlx1MjFjOCIsCiAgICAidXVtbCI6ICJceGZjIiwKICAgICJ1dW1sOyI6ICJceGZjIiwKICAgICJ1d2FuZ2xlOyI6ICJcdTI5YTciLAogICAgInZBcnI7IjogIlx1MjFkNSIsCiAgICAidkJhcjsiOiAiXHUyYWU4IiwKICAgICJ2QmFydjsiOiAiXHUyYWU5IiwKICAgICJ2RGFzaDsiOiAiXHUyMmE4IiwKICAgICJ2YW5ncnQ7IjogIlx1Mjk5YyIsCiAgICAidmFyZXBzaWxvbjsiOiAiXHUwM2Y1IiwKICAgICJ2YXJrYXBwYTsiOiAiXHUwM2YwIiwKICAgICJ2YXJub3RoaW5nOyI6ICJcdTIyMDUiLAogICAgInZhcnBoaTsiOiAiXHUwM2Q1IiwKICAgICJ2YXJwaTsiOiAiXHUwM2Q2IiwKICAgICJ2YXJwcm9wdG87IjogIlx1MjIxZCIsCiAgICAidmFycjsiOiAiXHUyMTk1IiwKICAgICJ2YXJyaG87IjogIlx1MDNmMSIsCiAgICAidmFyc2lnbWE7IjogIlx1MDNjMiIsCiAgICAidmFyc3Vic2V0bmVxOyI6ICJcdTIyOGFcdWZlMDAiLAogICAgInZhcnN1YnNldG5lcXE7IjogIlx1MmFjYlx1ZmUwMCIsCiAgICAidmFyc3Vwc2V0bmVxOyI6ICJcdTIyOGJcdWZlMDAiLAogICAgInZhcnN1cHNldG5lcXE7IjogIlx1MmFjY1x1ZmUwMCIsCiAgICAidmFydGhldGE7IjogIlx1MDNkMSIsCiAgICAidmFydHJpYW5nbGVsZWZ0OyI6ICJcdTIyYjIiLAogICAgInZhcnRyaWFuZ2xlcmlnaHQ7IjogIlx1MjJiMyIsCiAgICAidmN5OyI6ICJcdTA0MzIiLAogICAgInZkYXNoOyI6ICJcdTIyYTIiLAogICAgInZlZTsiOiAiXHUyMjI4IiwKICAgICJ2ZWViYXI7IjogIlx1MjJiYiIsCiAgICAidmVlZXE7IjogIlx1MjI1YSIsCiAgICAidmVsbGlwOyI6ICJcdTIyZWUiLAogICAgInZlcmJhcjsiOiAifCIsCiAgICAidmVydDsiOiAifCIsCiAgICAidmZyOyI6ICJcVTAwMDFkNTMzIiwKICAgICJ2bHRyaTsiOiAiXHUyMmIyIiwKICAgICJ2bnN1YjsiOiAiXHUyMjgyXHUyMGQyIiwKICAgICJ2bnN1cDsiOiAiXHUyMjgzXHUyMGQyIiwKICAgICJ2b3BmOyI6ICJcVTAwMDFkNTY3IiwKICAgICJ2cHJvcDsiOiAiXHUyMjFkIiwKICAgICJ2cnRyaTsiOiAiXHUyMmIzIiwKICAgICJ2c2NyOyI6ICJcVTAwMDFkNGNiIiwKICAgICJ2c3VibkU7IjogIlx1MmFjYlx1ZmUwMCIsCiAgICAidnN1Ym5lOyI6ICJcdTIyOGFcdWZlMDAiLAogICAgInZzdXBuRTsiOiAiXHUyYWNjXHVmZTAwIiwKICAgICJ2c3VwbmU7IjogIlx1MjI4Ylx1ZmUwMCIsCiAgICAidnppZ3phZzsiOiAiXHUyOTlhIiwKICAgICJ3Y2lyYzsiOiAiXHUwMTc1IiwKICAgICJ3ZWRiYXI7IjogIlx1MmE1ZiIsCiAgICAid2VkZ2U7IjogIlx1MjIyNyIsCiAgICAid2VkZ2VxOyI6ICJcdTIyNTkiLAogICAgIndlaWVycDsiOiAiXHUyMTE4IiwKICAgICJ3ZnI7IjogIlxVMDAwMWQ1MzQiLAogICAgIndvcGY7IjogIlxVMDAwMWQ1NjgiLAogICAgIndwOyI6ICJcdTIxMTgiLAogICAgIndyOyI6ICJcdTIyNDAiLAogICAgIndyZWF0aDsiOiAiXHUyMjQwIiwKICAgICJ3c2NyOyI6ICJcVTAwMDFkNGNjIiwKICAgICJ4Y2FwOyI6ICJcdTIyYzIiLAogICAgInhjaXJjOyI6ICJcdTI1ZWYiLAogICAgInhjdXA7IjogIlx1MjJjMyIsCiAgICAieGR0cmk7IjogIlx1MjViZCIsCiAgICAieGZyOyI6ICJcVTAwMDFkNTM1IiwKICAgICJ4aEFycjsiOiAiXHUyN2ZhIiwKICAgICJ4aGFycjsiOiAiXHUyN2Y3IiwKICAgICJ4aTsiOiAiXHUwM2JlIiwKICAgICJ4bEFycjsiOiAiXHUyN2Y4IiwKICAgICJ4bGFycjsiOiAiXHUyN2Y1IiwKICAgICJ4bWFwOyI6ICJcdTI3ZmMiLAogICAgInhuaXM7IjogIlx1MjJmYiIsCiAgICAieG9kb3Q7IjogIlx1MmEwMCIsCiAgICAieG9wZjsiOiAiXFUwMDAxZDU2OSIsCiAgICAieG9wbHVzOyI6ICJcdTJhMDEiLAogICAgInhvdGltZTsiOiAiXHUyYTAyIiwKICAgICJ4ckFycjsiOiAiXHUyN2Y5IiwKICAgICJ4cmFycjsiOiAiXHUyN2Y2IiwKICAgICJ4c2NyOyI6ICJcVTAwMDFkNGNkIiwKICAgICJ4c3FjdXA7IjogIlx1MmEwNiIsCiAgICAieHVwbHVzOyI6ICJcdTJhMDQiLAogICAgInh1dHJpOyI6ICJcdTI1YjMiLAogICAgInh2ZWU7IjogIlx1MjJjMSIsCiAgICAieHdlZGdlOyI6ICJcdTIyYzAiLAogICAgInlhY3V0ZSI6ICJceGZkIiwKICAgICJ5YWN1dGU7IjogIlx4ZmQiLAogICAgInlhY3k7IjogIlx1MDQ0ZiIsCiAgICAieWNpcmM7IjogIlx1MDE3NyIsCiAgICAieWN5OyI6ICJcdTA0NGIiLAogICAgInllbiI6ICJceGE1IiwKICAgICJ5ZW47IjogIlx4YTUiLAogICAgInlmcjsiOiAiXFUwMDAxZDUzNiIsCiAgICAieWljeTsiOiAiXHUwNDU3IiwKICAgICJ5b3BmOyI6ICJcVTAwMDFkNTZhIiwKICAgICJ5c2NyOyI6ICJcVTAwMDFkNGNlIiwKICAgICJ5dWN5OyI6ICJcdTA0NGUiLAogICAgInl1bWwiOiAiXHhmZiIsCiAgICAieXVtbDsiOiAiXHhmZiIsCiAgICAiemFjdXRlOyI6ICJcdTAxN2EiLAogICAgInpjYXJvbjsiOiAiXHUwMTdlIiwKICAgICJ6Y3k7IjogIlx1MDQzNyIsCiAgICAiemRvdDsiOiAiXHUwMTdjIiwKICAgICJ6ZWV0cmY7IjogIlx1MjEyOCIsCiAgICAiemV0YTsiOiAiXHUwM2I2IiwKICAgICJ6ZnI7IjogIlxVMDAwMWQ1MzciLAogICAgInpoY3k7IjogIlx1MDQzNiIsCiAgICAiemlncmFycjsiOiAiXHUyMWRkIiwKICAgICJ6b3BmOyI6ICJcVTAwMDFkNTZiIiwKICAgICJ6c2NyOyI6ICJcVTAwMDFkNGNmIiwKICAgICJ6d2o7IjogIlx1MjAwZCIsCiAgICAienduajsiOiAiXHUyMDBjIiwKfQoKcmVwbGFjZW1lbnRDaGFyYWN0ZXJzID0gewogICAgMHgwOiAiXHVGRkZEIiwKICAgIDB4MGQ6ICJcdTAwMEQiLAogICAgMHg4MDogIlx1MjBBQyIsCiAgICAweDgxOiAiXHUwMDgxIiwKICAgIDB4ODI6ICJcdTIwMUEiLAogICAgMHg4MzogIlx1MDE5MiIsCiAgICAweDg0OiAiXHUyMDFFIiwKICAgIDB4ODU6ICJcdTIwMjYiLAogICAgMHg4NjogIlx1MjAyMCIsCiAgICAweDg3OiAiXHUyMDIxIiwKICAgIDB4ODg6ICJcdTAyQzYiLAogICAgMHg4OTogIlx1MjAzMCIsCiAgICAweDhBOiAiXHUwMTYwIiwKICAgIDB4OEI6ICJcdTIwMzkiLAogICAgMHg4QzogIlx1MDE1MiIsCiAgICAweDhEOiAiXHUwMDhEIiwKICAgIDB4OEU6ICJcdTAxN0QiLAogICAgMHg4RjogIlx1MDA4RiIsCiAgICAweDkwOiAiXHUwMDkwIiwKICAgIDB4OTE6ICJcdTIwMTgiLAogICAgMHg5MjogIlx1MjAxOSIsCiAgICAweDkzOiAiXHUyMDFDIiwKICAgIDB4OTQ6ICJcdTIwMUQiLAogICAgMHg5NTogIlx1MjAyMiIsCiAgICAweDk2OiAiXHUyMDEzIiwKICAgIDB4OTc6ICJcdTIwMTQiLAogICAgMHg5ODogIlx1MDJEQyIsCiAgICAweDk5OiAiXHUyMTIyIiwKICAgIDB4OUE6ICJcdTAxNjEiLAogICAgMHg5QjogIlx1MjAzQSIsCiAgICAweDlDOiAiXHUwMTUzIiwKICAgIDB4OUQ6ICJcdTAwOUQiLAogICAgMHg5RTogIlx1MDE3RSIsCiAgICAweDlGOiAiXHUwMTc4IiwKfQoKdG9rZW5UeXBlcyA9IHsKICAgICJEb2N0eXBlIjogMCwKICAgICJDaGFyYWN0ZXJzIjogMSwKICAgICJTcGFjZUNoYXJhY3RlcnMiOiAyLAogICAgIlN0YXJ0VGFnIjogMywKICAgICJFbmRUYWciOiA0LAogICAgIkVtcHR5VGFnIjogNSwKICAgICJDb21tZW50IjogNiwKICAgICJQYXJzZUVycm9yIjogNwp9Cgp0YWdUb2tlblR5cGVzID0gZnJvemVuc2V0KFt0b2tlblR5cGVzWyJTdGFydFRhZyJdLCB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlc1siRW1wdHlUYWciXV0pCgoKcHJlZml4ZXMgPSBkaWN0KFsodiwgaykgZm9yIGssIHYgaW4gbmFtZXNwYWNlcy5pdGVtcygpXSkKcHJlZml4ZXNbImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiXSA9ICJtYXRoIgoKCmNsYXNzIERhdGFMb3NzV2FybmluZyhVc2VyV2FybmluZyk6CiAgICBwYXNzCgoKY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAbtB8gG0CAABtAgAARgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgYmFzZQoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgaWYgdG9rZW5bInR5cGUiXSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICBhdHRycyA9IE9yZGVyZWREaWN0KCkKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQodG9rZW5bImRhdGEiXS5pdGVtcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHhbMF0pOgogICAgICAgICAgICAgICAgICAgIGF0dHJzW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBhdHRycwogICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhACKA+8QeAQAAHgEAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgoKY2xhc3MgRmlsdGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlKToKICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLnNvdXJjZSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zb3VyY2UsIG5hbWUpClBLAwQUAAAAAAAAACEAIcA8jLYKAAC2CgAAQwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2luamVjdF9tZXRhX2NoYXJzZXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgYmFzZQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBlbmNvZGluZyk6CiAgICAgICAgYmFzZS5GaWx0ZXIuX19pbml0X18oc2VsZiwgc291cmNlKQogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBzdGF0ZSA9ICJwcmVfaGVhZCIKICAgICAgICBtZXRhX2ZvdW5kID0gKHNlbGYuZW5jb2RpbmcgaXMgTm9uZSkKICAgICAgICBwZW5kaW5nID0gW10KCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gImhlYWQiOgogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gImluX2hlYWQiCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAibWV0YSI6CiAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIGNoYXJzZXQgd2l0aCBhY3R1YWwgZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICBoYXNfaHR0cF9lcXVpdl9jb250ZW50X3R5cGUgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGZvciAobmFtZXNwYWNlLCBuYW1lKSwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUubG93ZXIoKSA9PSAnY2hhcnNldCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdWyhuYW1lc3BhY2UsIG5hbWUpXSA9IHNlbGYuZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2h0dHAtZXF1aXYnIGFuZCB2YWx1ZS5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2h0dHBfZXF1aXZfY29udGVudF90eXBlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc19odHRwX2VxdWl2X2NvbnRlbnRfdHlwZSBhbmQgKE5vbmUsICJjb250ZW50IikgaW4gdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bKE5vbmUsICJjb250ZW50IildID0gJ3RleHQvaHRtbDsgY2hhcnNldD0lcycgJSBzZWxmLmVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZvdW5kID0gVHJ1ZQoKICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJoZWFkIiBhbmQgbm90IG1ldGFfZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbWV0YSBpbnRvIGVtcHR5IGhlYWQKICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiU3RhcnRUYWciLCAibmFtZSI6ICJoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB0b2tlblsiZGF0YSJdfQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogIm1ldGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsoTm9uZSwgImNoYXJzZXQiKTogc2VsZi5lbmNvZGluZ319CiAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVuZFRhZyIsICJuYW1lIjogImhlYWQifQogICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAiaGVhZCIgYW5kIHBlbmRpbmc6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbWV0YSBpbnRvIGhlYWQgKGlmIG5lY2Vzc2FyeSkgYW5kIGZsdXNoIHBlbmRpbmcgcXVldWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCBwZW5kaW5nLnBvcCgwKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtZXRhX2ZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW1wdHlUYWciLCAibmFtZSI6ICJtZXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogeyhOb25lLCAiY2hhcnNldCIpOiBzZWxmLmVuY29kaW5nfX0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBwZW5kaW5nOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwZW5kaW5nLnBvcCgwKQogICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAicG9zdF9oZWFkIgoKICAgICAgICAgICAgaWYgc3RhdGUgPT0gImluX2hlYWQiOgogICAgICAgICAgICAgICAgcGVuZGluZy5hcHBlbmQodG9rZW4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhAH3r0rUlDQAAJQ0AADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcywgdm9pZEVsZW1lbnRzCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBzcGFjZUNoYXJhY3RlcnMKc3BhY2VDaGFyYWN0ZXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIHJlcXVpcmVfbWF0Y2hpbmdfdGFncz1UcnVlKToKICAgICAgICBzdXBlcihGaWx0ZXIsIHNlbGYpLl9faW5pdF9fKHNvdXJjZSkKICAgICAgICBzZWxmLnJlcXVpcmVfbWF0Y2hpbmdfdGFncyA9IHJlcXVpcmVfbWF0Y2hpbmdfdGFncwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBvcGVuX2VsZW1lbnRzID0gW10KICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZXNwYWNlLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlICE9ICIiCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rZW5bImRhdGEiXSwgZGljdCkKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSA9PSAiRW1wdHlUYWciCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlID09ICJTdGFydFRhZyIKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIiBhbmQgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3M6CiAgICAgICAgICAgICAgICAgICAgb3Blbl9lbGVtZW50cy5hcHBlbmQoKG5hbWVzcGFjZSwgbmFtZSkpCiAgICAgICAgICAgICAgICBmb3IgKG5hbWVzcGFjZSwgbmFtZSksIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lc3BhY2UsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlICE9ICIiCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lICE9ICIiCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWVzcGFjZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gIiIKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJWb2lkIGVsZW1lbnQgcmVwb3J0ZWQgYXMgRW5kVGFnIHRva2VuOiAlKHRhZylzIiAlIHsidGFnIjogbmFtZX0KICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3M6CiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBvcGVuX2VsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IChuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGEsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGEgIT0gIiIKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyI6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGEuc3RyaXAoc3BhY2VDaGFyYWN0ZXJzKSA9PSAiIgoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuWyJwdWJsaWNJZCJdIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW5bInN5c3RlbUlkIl0gaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW50aXR5IjoKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJuYW1lIl0sIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU2VyaWFsaXplckVycm9yIjoKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJkYXRhIl0sIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIHRva2VuIHR5cGU6ICUodHlwZSlzIiAlIHsidHlwZSI6IHR5cGV9CgogICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhACHtnSQmKQAAJikAADwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgYmFzZQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgc2xpZGVyKHNlbGYpOgogICAgICAgIHByZXZpb3VzMSA9IHByZXZpb3VzMiA9IE5vbmUKICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5zb3VyY2U6CiAgICAgICAgICAgIGlmIHByZXZpb3VzMSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHlpZWxkIHByZXZpb3VzMiwgcHJldmlvdXMxLCB0b2tlbgogICAgICAgICAgICBwcmV2aW91czIgPSBwcmV2aW91czEKICAgICAgICAgICAgcHJldmlvdXMxID0gdG9rZW4KICAgICAgICBpZiBwcmV2aW91czEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHlpZWxkIHByZXZpb3VzMiwgcHJldmlvdXMxLCBOb25lCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciBwcmV2aW91cywgdG9rZW4sIG5leHQgaW4gc2VsZi5zbGlkZXIoKToKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgaWYgKHRva2VuWyJkYXRhIl0gb3IKICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYuaXNfb3B0aW9uYWxfc3RhcnQodG9rZW5bIm5hbWUiXSwgcHJldmlvdXMsIG5leHQpKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19vcHRpb25hbF9lbmQodG9rZW5bIm5hbWUiXSwgbmV4dCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgZGVmIGlzX29wdGlvbmFsX3N0YXJ0KHNlbGYsIHRhZ25hbWUsIHByZXZpb3VzLCBuZXh0KToKICAgICAgICB0eXBlID0gbmV4dCBhbmQgbmV4dFsidHlwZSJdIG9yIE5vbmUKICAgICAgICBpZiB0YWduYW1lIGluICdodG1sJzoKICAgICAgICAgICAgIyBBbiBodG1sIGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSBodG1sIGVsZW1lbnQgaXMgbm90IGEgc3BhY2UgY2hhcmFjdGVyIG9yIGEgY29tbWVudC4KICAgICAgICAgICAgcmV0dXJuIHR5cGUgbm90IGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnaGVhZCc6CiAgICAgICAgICAgICMgQSBoZWFkIGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSBoZWFkIGVsZW1lbnQgaXMgYW4gZWxlbWVudC4KICAgICAgICAgICAgIyBYWFg6IHdlIGFsc28gb21pdCB0aGUgc3RhcnQgdGFnIGlmIHRoZSBoZWFkIGVsZW1lbnQgaXMgZW1wdHkKICAgICAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICJoZWFkIgogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnYm9keSc6CiAgICAgICAgICAgICMgQSBib2R5IGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSBib2R5IGVsZW1lbnQgaXMgbm90IGEgc3BhY2UgY2hhcmFjdGVyIG9yIGEgY29tbWVudCwKICAgICAgICAgICAgIyBleGNlcHQgaWYgdGhlIGZpcnN0IHRoaW5nIGluc2lkZSB0aGUgYm9keSBlbGVtZW50IGlzIGEgc2NyaXB0CiAgICAgICAgICAgICMgb3Igc3R5bGUgZWxlbWVudCBhbmQgdGhlIG5vZGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBib2R5CiAgICAgICAgICAgICMgZWxlbWVudCBpcyBhIGhlYWQgZWxlbWVudCB3aG9zZSBlbmQgdGFnIGhhcyBiZWVuIG9taXR0ZWQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGRvIG5vdCBsb29rIGF0IHRoZSBwcmVjZWRpbmcgZXZlbnQsIHNvIHdlIG5ldmVyIG9taXQKICAgICAgICAgICAgICAgICMgdGhlIGJvZHkgZWxlbWVudCdzIHN0YXJ0IHRhZyBpZiBpdCdzIGZvbGxvd2VkIGJ5IGEgc2NyaXB0IG9yCiAgICAgICAgICAgICAgICAjIGEgc3R5bGUgZWxlbWVudC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gbm90IGluICgnc2NyaXB0JywgJ3N0eWxlJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdjb2xncm91cCc6CiAgICAgICAgICAgICMgQSBjb2xncm91cCBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgY29sZ3JvdXAgZWxlbWVudCBpcyBhIGNvbCBlbGVtZW50LCBhbmQgaWYgdGhlIGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBub3QgaW1tZWRpYXRlbHkgcHJlY2VkZWQgYnkgYW5vdGhlciBjb2xncm91cCBlbGVtZW50IHdob3NlCiAgICAgICAgICAgICMgZW5kIHRhZyBoYXMgYmVlbiBvbWl0dGVkLgogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBkbyBub3QgbG9vayBhdCB0aGUgcHJlY2VkaW5nIGV2ZW50LCBzbyBpbnN0ZWFkIHdlIG5ldmVyCiAgICAgICAgICAgICAgICAjIG9taXQgdGhlIGNvbGdyb3VwIGVsZW1lbnQncyBlbmQgdGFnIHdoZW4gaXQgaXMgaW1tZWRpYXRlbHkKICAgICAgICAgICAgICAgICMgZm9sbG93ZWQgYnkgYW5vdGhlciBjb2xncm91cCBlbGVtZW50LiBTZWUgaXNfb3B0aW9uYWxfZW5kLgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAiY29sIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiB0YWduYW1lID09ICd0Ym9keSc6CiAgICAgICAgICAgICMgQSB0Ym9keSBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgdGJvZHkgZWxlbWVudCBpcyBhIHRyIGVsZW1lbnQsIGFuZCBpZiB0aGUgZWxlbWVudCBpcwogICAgICAgICAgICAjIG5vdCBpbW1lZGlhdGVseSBwcmVjZWRlZCBieSBhIHRib2R5LCB0aGVhZCwgb3IgdGZvb3QgZWxlbWVudAogICAgICAgICAgICAjIHdob3NlIGVuZCB0YWcgaGFzIGJlZW4gb21pdHRlZC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgIyBvbWl0IHRoZSB0aGVhZCBhbmQgdGZvb3QgZWxlbWVudHMnIGVuZCB0YWcgd2hlbiB0aGV5IGFyZQogICAgICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IGVsZW1lbnQuIFNlZSBpc19vcHRpb25hbF9lbmQuCiAgICAgICAgICAgICAgICBpZiBwcmV2aW91cyBhbmQgcHJldmlvdXNbJ3R5cGUnXSA9PSAnRW5kVGFnJyBhbmQgXAogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1snbmFtZSddIGluICgndGJvZHknLCAndGhlYWQnLCAndGZvb3QnKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gJ3RyJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGlzX29wdGlvbmFsX2VuZChzZWxmLCB0YWduYW1lLCBuZXh0KToKICAgICAgICB0eXBlID0gbmV4dCBhbmQgbmV4dFsidHlwZSJdIG9yIE5vbmUKICAgICAgICBpZiB0YWduYW1lIGluICgnaHRtbCcsICdoZWFkJywgJ2JvZHknKToKICAgICAgICAgICAgIyBBbiBodG1sIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBodG1sIGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIgb3IgYSBjb21tZW50LgogICAgICAgICAgICByZXR1cm4gdHlwZSBub3QgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgnbGknLCAnb3B0Z3JvdXAnLCAndHInKToKICAgICAgICAgICAgIyBBIGxpIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBsaSBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBsaSBlbGVtZW50IG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBbiBvcHRncm91cCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgb3B0Z3JvdXAKICAgICAgICAgICAgIyBlbGVtZW50IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgb3B0Z3JvdXAgZWxlbWVudCwKICAgICAgICAgICAgIyBvciBpZiB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdHIgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRyIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIHRyIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSB0YWduYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCdkdCcsICdkZCcpOgogICAgICAgICAgICAjIEEgZHQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGR0IGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGR0IGVsZW1lbnQgb3IgYSBkZCBlbGVtZW50LgogICAgICAgICAgICAjIEEgZGQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGRkIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGRkIGVsZW1lbnQgb3IgYSBkdCBlbGVtZW50LAogICAgICAgICAgICAjIG9yIGlmIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdkdCcsICdkZCcpCiAgICAgICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnZGQnOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3AnOgogICAgICAgICAgICAjIEEgcCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gYWRkcmVzcywgYXJ0aWNsZSwgYXNpZGUsCiAgICAgICAgICAgICMgYmxvY2txdW90ZSwgZGF0YWdyaWQsIGRpYWxvZywgZGlyLCBkaXYsIGRsLCBmaWVsZHNldCwKICAgICAgICAgICAgIyBmb290ZXIsIGZvcm0sIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGhlYWRlciwgaHIsIG1lbnUsCiAgICAgICAgICAgICMgbmF2LCBvbCwgcCwgcHJlLCBzZWN0aW9uLCB0YWJsZSwgb3IgdWwsIGVsZW1lbnQsIG9yIGlmCiAgICAgICAgICAgICMgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgnYWRkcmVzcycsICdhcnRpY2xlJywgJ2FzaWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibG9ja3F1b3RlJywgJ2RhdGFncmlkJywgJ2RpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyJywgJ2RpdicsICdkbCcsICdmaWVsZHNldCcsICdmb290ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm0nLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWRlcicsICdocicsICdtZW51JywgJ25hdicsICdvbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcsICdwcmUnLCAnc2VjdGlvbicsICd0YWJsZScsICd1bCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ29wdGlvbic6CiAgICAgICAgICAgICMgQW4gb3B0aW9uIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBvcHRpb24KICAgICAgICAgICAgIyBlbGVtZW50IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgb3B0aW9uIGVsZW1lbnQsCiAgICAgICAgICAgICMgb3IgaWYgaXQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gPGNvZGU+b3B0Z3JvdXA8L2NvZGU+CiAgICAgICAgICAgICMgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQKICAgICAgICAgICAgIyBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgnb3B0aW9uJywgJ29wdGdyb3VwJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ3J0JywgJ3JwJyk6CiAgICAgICAgICAgICMgQW4gcnQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHJ0IGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBydCBvciBycCBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQW4gcnAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHJwIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBydCBvciBycCBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdydCcsICdycCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2NvbGdyb3VwJzoKICAgICAgICAgICAgIyBBIGNvbGdyb3VwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb2xncm91cAogICAgICAgICAgICAjIGVsZW1lbnQgaXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyIG9yCiAgICAgICAgICAgICMgYSBjb21tZW50LgogICAgICAgICAgICBpZiB0eXBlIGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBhbHNvIGxvb2sgZm9yIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjb2xncm91cAogICAgICAgICAgICAgICAgIyBlbGVtZW50LiBTZWUgaXNfb3B0aW9uYWxfc3RhcnQuCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdICE9ICdjb2xncm91cCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgndGhlYWQnLCAndGJvZHknKToKICAgICAgICAgICAgIyBBIHRoZWFkIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0aGVhZCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBvciB0Zm9vdCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdGJvZHkgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRib2R5IGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IG9yIHRmb290IGVsZW1lbnQsIG9yIGlmCiAgICAgICAgICAgICMgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRmb290IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0Zm9vdCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBlbGVtZW50LCBvciBpZiB0aGVyZSBpcyBubwogICAgICAgICAgICAjIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgWFhYOiB3ZSBuZXZlciBvbWl0IHRoZSBlbmQgdGFnIHdoZW4gdGhlIGZvbGxvd2luZyBlbGVtZW50IGlzCiAgICAgICAgICAgICMgYSB0Ym9keS4gU2VlIGlzX29wdGlvbmFsX3N0YXJ0LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluIFsndGJvZHknLCAndGZvb3QnXQogICAgICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3Rib2R5JzoKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiB0YWduYW1lID09ICd0Zm9vdCc6CiAgICAgICAgICAgICMgQSB0Zm9vdCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGZvb3QgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMgbm8KICAgICAgICAgICAgIyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIFhYWDogd2UgbmV2ZXIgb21pdCB0aGUgZW5kIHRhZyB3aGVuIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBpcwogICAgICAgICAgICAjIGEgdGJvZHkuIFNlZSBpc19vcHRpb25hbF9zdGFydC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAndGJvZHknCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCd0ZCcsICd0aCcpOgogICAgICAgICAgICAjIEEgdGQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRkIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRkIG9yIHRoIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRoIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0aCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0ZCBvciB0aCBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCd0ZCcsICd0aCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICByZXR1cm4gRmFsc2UKUEsDBBQAAAAAAAAAIQCaHlSYGGIAABhiAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvc2FuaXRpemVyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgcmUKZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBlc2NhcGUsIHVuZXNjYXBlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliX3BhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcywgcHJlZml4ZXMKCl9fYWxsX18gPSBbIkZpbHRlciJdCgoKYWxsb3dlZF9lbGVtZW50cyA9IGZyb3plbnNldCgoCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FiYnInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhY3JvbnltJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYWRkcmVzcycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FyZWEnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhcnRpY2xlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXNpZGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhdWRpbycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2InKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdiaWcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdibG9ja3F1b3RlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYnInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdidXR0b24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjYW52YXMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjYXB0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2VudGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2l0ZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvZGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb2wnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb2xncm91cCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbW1hbmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkYXRhZ3JpZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RhdGFsaXN0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZWwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZXRhaWxzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGZuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGlhbG9nJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGlyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGl2JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2VtJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZXZlbnQtc291cmNlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZmllbGRzZXQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWdjYXB0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZmlndXJlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9vdGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9udCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Zvcm0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoZWFkZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoMScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2gyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoNCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2g1JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdocicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2knKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpbWcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpbnB1dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2lucycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2tleWdlbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2tiZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2xhYmVsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGVnZW5kJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGknKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWFwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWVudScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ21ldGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbXVsdGljb2wnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICduYXYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICduZXh0aWQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ291dHB1dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ29wdGdyb3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3B0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ByZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3Byb2dyZXNzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3MnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzYW1wJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc2VjdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NlbGVjdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NtYWxsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc291bmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzb3VyY2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzcGFjZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzcGFuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3RyaWtlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3Ryb25nJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3ViJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGFibGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0Ym9keScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGV4dGFyZWEnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0aW1lJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGZvb3QnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0aCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RoZWFkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndHInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd1bCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ZhcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ZpZGVvJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtYWN0aW9uJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtYXRoJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtZXJyb3InKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21mcmFjJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtaScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW11bHRpc2NyaXB0cycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW4nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21vJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtb3ZlcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXBhZGRlZCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXBoYW50b20nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21wcmVzY3JpcHRzJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcm9vdCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXJvdycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXNwYWNlJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3FydCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXN0eWxlJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3ViJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3Vic3VwJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3VwJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdGFibGUnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210ZCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRleHQnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210cicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXVuZGVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdW5kZXJvdmVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdub25lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlQ29sb3InKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVNb3Rpb24nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVUcmFuc2Zvcm0nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2NsaXBQYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdjaXJjbGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2RlZnMnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2Rlc2MnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2VsbGlwc2UnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2ZvbnQtZmFjZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlLW5hbWUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2ZvbnQtZmFjZS1zcmMnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2cnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2dseXBoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdoa2VybicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbGluZWFyR3JhZGllbnQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2xpbmUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21hcmtlcicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWV0YWRhdGEnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21pc3NpbmctZ2x5cGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21wYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwb2x5Z29uJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwb2x5bGluZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncmFkaWFsR3JhZGllbnQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3JlY3QnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3NldCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc3RvcCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc3ZnJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzd2l0Y2gnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RleHQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RpdGxlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd0c3BhbicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndXNlJyksCikpCgphbGxvd2VkX2F0dHJpYnV0ZXMgPSBmcm96ZW5zZXQoKAogICAgIyBIVE1MIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWJicicpLAogICAgKE5vbmUsICdhY2NlcHQnKSwKICAgIChOb25lLCAnYWNjZXB0LWNoYXJzZXQnKSwKICAgIChOb25lLCAnYWNjZXNza2V5JyksCiAgICAoTm9uZSwgJ2FjdGlvbicpLAogICAgKE5vbmUsICdhbGlnbicpLAogICAgKE5vbmUsICdhbHQnKSwKICAgIChOb25lLCAnYXV0b2NvbXBsZXRlJyksCiAgICAoTm9uZSwgJ2F1dG9mb2N1cycpLAogICAgKE5vbmUsICdheGlzJyksCiAgICAoTm9uZSwgJ2JhY2tncm91bmQnKSwKICAgIChOb25lLCAnYmFsYW5jZScpLAogICAgKE5vbmUsICdiZ2NvbG9yJyksCiAgICAoTm9uZSwgJ2JncHJvcGVydGllcycpLAogICAgKE5vbmUsICdib3JkZXInKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3InKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3JkYXJrJyksCiAgICAoTm9uZSwgJ2JvcmRlcmNvbG9ybGlnaHQnKSwKICAgIChOb25lLCAnYm90dG9tcGFkZGluZycpLAogICAgKE5vbmUsICdjZWxscGFkZGluZycpLAogICAgKE5vbmUsICdjZWxsc3BhY2luZycpLAogICAgKE5vbmUsICdjaCcpLAogICAgKE5vbmUsICdjaGFsbGVuZ2UnKSwKICAgIChOb25lLCAnY2hhcicpLAogICAgKE5vbmUsICdjaGFyb2ZmJyksCiAgICAoTm9uZSwgJ2Nob2ZmJyksCiAgICAoTm9uZSwgJ2NoYXJzZXQnKSwKICAgIChOb25lLCAnY2hlY2tlZCcpLAogICAgKE5vbmUsICdjaXRlJyksCiAgICAoTm9uZSwgJ2NsYXNzJyksCiAgICAoTm9uZSwgJ2NsZWFyJyksCiAgICAoTm9uZSwgJ2NvbG9yJyksCiAgICAoTm9uZSwgJ2NvbHMnKSwKICAgIChOb25lLCAnY29sc3BhbicpLAogICAgKE5vbmUsICdjb21wYWN0JyksCiAgICAoTm9uZSwgJ2NvbnRlbnRlZGl0YWJsZScpLAogICAgKE5vbmUsICdjb250cm9scycpLAogICAgKE5vbmUsICdjb29yZHMnKSwKICAgIChOb25lLCAnZGF0YScpLAogICAgKE5vbmUsICdkYXRhZmxkJyksCiAgICAoTm9uZSwgJ2RhdGFwYWdlc2l6ZScpLAogICAgKE5vbmUsICdkYXRhc3JjJyksCiAgICAoTm9uZSwgJ2RhdGV0aW1lJyksCiAgICAoTm9uZSwgJ2RlZmF1bHQnKSwKICAgIChOb25lLCAnZGVsYXknKSwKICAgIChOb25lLCAnZGlyJyksCiAgICAoTm9uZSwgJ2Rpc2FibGVkJyksCiAgICAoTm9uZSwgJ2RyYWdnYWJsZScpLAogICAgKE5vbmUsICdkeW5zcmMnKSwKICAgIChOb25lLCAnZW5jdHlwZScpLAogICAgKE5vbmUsICdlbmQnKSwKICAgIChOb25lLCAnZmFjZScpLAogICAgKE5vbmUsICdmb3InKSwKICAgIChOb25lLCAnZm9ybScpLAogICAgKE5vbmUsICdmcmFtZScpLAogICAgKE5vbmUsICdnYWxsZXJ5aW1nJyksCiAgICAoTm9uZSwgJ2d1dHRlcicpLAogICAgKE5vbmUsICdoZWFkZXJzJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdoaWRlZm9jdXMnKSwKICAgIChOb25lLCAnaGlkZGVuJyksCiAgICAoTm9uZSwgJ2hpZ2gnKSwKICAgIChOb25lLCAnaHJlZicpLAogICAgKE5vbmUsICdocmVmbGFuZycpLAogICAgKE5vbmUsICdoc3BhY2UnKSwKICAgIChOb25lLCAnaWNvbicpLAogICAgKE5vbmUsICdpZCcpLAogICAgKE5vbmUsICdpbnB1dG1vZGUnKSwKICAgIChOb25lLCAnaXNtYXAnKSwKICAgIChOb25lLCAna2V5dHlwZScpLAogICAgKE5vbmUsICdsYWJlbCcpLAogICAgKE5vbmUsICdsZWZ0c3BhY2luZycpLAogICAgKE5vbmUsICdsYW5nJyksCiAgICAoTm9uZSwgJ2xpc3QnKSwKICAgIChOb25lLCAnbG9uZ2Rlc2MnKSwKICAgIChOb25lLCAnbG9vcCcpLAogICAgKE5vbmUsICdsb29wY291bnQnKSwKICAgIChOb25lLCAnbG9vcGVuZCcpLAogICAgKE5vbmUsICdsb29wc3RhcnQnKSwKICAgIChOb25lLCAnbG93JyksCiAgICAoTm9uZSwgJ2xvd3NyYycpLAogICAgKE5vbmUsICdtYXgnKSwKICAgIChOb25lLCAnbWF4bGVuZ3RoJyksCiAgICAoTm9uZSwgJ21lZGlhJyksCiAgICAoTm9uZSwgJ21ldGhvZCcpLAogICAgKE5vbmUsICdtaW4nKSwKICAgIChOb25lLCAnbXVsdGlwbGUnKSwKICAgIChOb25lLCAnbmFtZScpLAogICAgKE5vbmUsICdub2hyZWYnKSwKICAgIChOb25lLCAnbm9zaGFkZScpLAogICAgKE5vbmUsICdub3dyYXAnKSwKICAgIChOb25lLCAnb3BlbicpLAogICAgKE5vbmUsICdvcHRpbXVtJyksCiAgICAoTm9uZSwgJ3BhdHRlcm4nKSwKICAgIChOb25lLCAncGluZycpLAogICAgKE5vbmUsICdwb2ludC1zaXplJyksCiAgICAoTm9uZSwgJ3Bvc3RlcicpLAogICAgKE5vbmUsICdwcWcnKSwKICAgIChOb25lLCAncHJlbG9hZCcpLAogICAgKE5vbmUsICdwcm9tcHQnKSwKICAgIChOb25lLCAncmFkaW9ncm91cCcpLAogICAgKE5vbmUsICdyZWFkb25seScpLAogICAgKE5vbmUsICdyZWwnKSwKICAgIChOb25lLCAncmVwZWF0LW1heCcpLAogICAgKE5vbmUsICdyZXBlYXQtbWluJyksCiAgICAoTm9uZSwgJ3JlcGxhY2UnKSwKICAgIChOb25lLCAncmVxdWlyZWQnKSwKICAgIChOb25lLCAncmV2JyksCiAgICAoTm9uZSwgJ3JpZ2h0c3BhY2luZycpLAogICAgKE5vbmUsICdyb3dzJyksCiAgICAoTm9uZSwgJ3Jvd3NwYW4nKSwKICAgIChOb25lLCAncnVsZXMnKSwKICAgIChOb25lLCAnc2NvcGUnKSwKICAgIChOb25lLCAnc2VsZWN0ZWQnKSwKICAgIChOb25lLCAnc2hhcGUnKSwKICAgIChOb25lLCAnc2l6ZScpLAogICAgKE5vbmUsICdzcGFuJyksCiAgICAoTm9uZSwgJ3NyYycpLAogICAgKE5vbmUsICdzdGFydCcpLAogICAgKE5vbmUsICdzdGVwJyksCiAgICAoTm9uZSwgJ3N0eWxlJyksCiAgICAoTm9uZSwgJ3N1bW1hcnknKSwKICAgIChOb25lLCAnc3VwcHJlc3MnKSwKICAgIChOb25lLCAndGFiaW5kZXgnKSwKICAgIChOb25lLCAndGFyZ2V0JyksCiAgICAoTm9uZSwgJ3RlbXBsYXRlJyksCiAgICAoTm9uZSwgJ3RpdGxlJyksCiAgICAoTm9uZSwgJ3RvcHBhZGRpbmcnKSwKICAgIChOb25lLCAndHlwZScpLAogICAgKE5vbmUsICd1bnNlbGVjdGFibGUnKSwKICAgIChOb25lLCAndXNlbWFwJyksCiAgICAoTm9uZSwgJ3VybicpLAogICAgKE5vbmUsICd2YWxpZ24nKSwKICAgIChOb25lLCAndmFsdWUnKSwKICAgIChOb25lLCAndmFyaWFibGUnKSwKICAgIChOb25lLCAndm9sdW1lJyksCiAgICAoTm9uZSwgJ3ZzcGFjZScpLAogICAgKE5vbmUsICd2cm1sJyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAoTm9uZSwgJ3dyYXAnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2xhbmcnKSwKICAgICMgTWF0aE1MIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWN0aW9udHlwZScpLAogICAgKE5vbmUsICdhbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5saW5lcycpLAogICAgKE5vbmUsICdjb2x1bW5zcGFjaW5nJyksCiAgICAoTm9uZSwgJ2NvbHVtbnNwYW4nKSwKICAgIChOb25lLCAnZGVwdGgnKSwKICAgIChOb25lLCAnZGlzcGxheScpLAogICAgKE5vbmUsICdkaXNwbGF5c3R5bGUnKSwKICAgIChOb25lLCAnZXF1YWxjb2x1bW5zJyksCiAgICAoTm9uZSwgJ2VxdWFscm93cycpLAogICAgKE5vbmUsICdmZW5jZScpLAogICAgKE5vbmUsICdmb250c3R5bGUnKSwKICAgIChOb25lLCAnZm9udHdlaWdodCcpLAogICAgKE5vbmUsICdmcmFtZScpLAogICAgKE5vbmUsICdoZWlnaHQnKSwKICAgIChOb25lLCAnbGluZXRoaWNrbmVzcycpLAogICAgKE5vbmUsICdsc3BhY2UnKSwKICAgIChOb25lLCAnbWF0aGJhY2tncm91bmQnKSwKICAgIChOb25lLCAnbWF0aGNvbG9yJyksCiAgICAoTm9uZSwgJ21hdGh2YXJpYW50JyksCiAgICAoTm9uZSwgJ21hdGh2YXJpYW50JyksCiAgICAoTm9uZSwgJ21heHNpemUnKSwKICAgIChOb25lLCAnbWluc2l6ZScpLAogICAgKE5vbmUsICdvdGhlcicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dsaW5lcycpLAogICAgKE5vbmUsICdyb3dzcGFjaW5nJyksCiAgICAoTm9uZSwgJ3Jvd3NwYW4nKSwKICAgIChOb25lLCAncnNwYWNlJyksCiAgICAoTm9uZSwgJ3NjcmlwdGxldmVsJyksCiAgICAoTm9uZSwgJ3NlbGVjdGlvbicpLAogICAgKE5vbmUsICdzZXBhcmF0b3InKSwKICAgIChOb25lLCAnc3RyZXRjaHknKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdzaG93JyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3R5cGUnKSwKICAgICMgU1ZHIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWNjZW50LWhlaWdodCcpLAogICAgKE5vbmUsICdhY2N1bXVsYXRlJyksCiAgICAoTm9uZSwgJ2FkZGl0aXZlJyksCiAgICAoTm9uZSwgJ2FscGhhYmV0aWMnKSwKICAgIChOb25lLCAnYXJhYmljLWZvcm0nKSwKICAgIChOb25lLCAnYXNjZW50JyksCiAgICAoTm9uZSwgJ2F0dHJpYnV0ZU5hbWUnKSwKICAgIChOb25lLCAnYXR0cmlidXRlVHlwZScpLAogICAgKE5vbmUsICdiYXNlUHJvZmlsZScpLAogICAgKE5vbmUsICdiYm94JyksCiAgICAoTm9uZSwgJ2JlZ2luJyksCiAgICAoTm9uZSwgJ2J5JyksCiAgICAoTm9uZSwgJ2NhbGNNb2RlJyksCiAgICAoTm9uZSwgJ2NhcC1oZWlnaHQnKSwKICAgIChOb25lLCAnY2xhc3MnKSwKICAgIChOb25lLCAnY2xpcC1wYXRoJyksCiAgICAoTm9uZSwgJ2NvbG9yJyksCiAgICAoTm9uZSwgJ2NvbG9yLXJlbmRlcmluZycpLAogICAgKE5vbmUsICdjb250ZW50JyksCiAgICAoTm9uZSwgJ2N4JyksCiAgICAoTm9uZSwgJ2N5JyksCiAgICAoTm9uZSwgJ2QnKSwKICAgIChOb25lLCAnZHgnKSwKICAgIChOb25lLCAnZHknKSwKICAgIChOb25lLCAnZGVzY2VudCcpLAogICAgKE5vbmUsICdkaXNwbGF5JyksCiAgICAoTm9uZSwgJ2R1cicpLAogICAgKE5vbmUsICdlbmQnKSwKICAgIChOb25lLCAnZmlsbCcpLAogICAgKE5vbmUsICdmaWxsLW9wYWNpdHknKSwKICAgIChOb25lLCAnZmlsbC1ydWxlJyksCiAgICAoTm9uZSwgJ2ZvbnQtZmFtaWx5JyksCiAgICAoTm9uZSwgJ2ZvbnQtc2l6ZScpLAogICAgKE5vbmUsICdmb250LXN0cmV0Y2gnKSwKICAgIChOb25lLCAnZm9udC1zdHlsZScpLAogICAgKE5vbmUsICdmb250LXZhcmlhbnQnKSwKICAgIChOb25lLCAnZm9udC13ZWlnaHQnKSwKICAgIChOb25lLCAnZnJvbScpLAogICAgKE5vbmUsICdmeCcpLAogICAgKE5vbmUsICdmeScpLAogICAgKE5vbmUsICdnMScpLAogICAgKE5vbmUsICdnMicpLAogICAgKE5vbmUsICdnbHlwaC1uYW1lJyksCiAgICAoTm9uZSwgJ2dyYWRpZW50VW5pdHMnKSwKICAgIChOb25lLCAnaGFuZ2luZycpLAogICAgKE5vbmUsICdoZWlnaHQnKSwKICAgIChOb25lLCAnaG9yaXotYWR2LXgnKSwKICAgIChOb25lLCAnaG9yaXotb3JpZ2luLXgnKSwKICAgIChOb25lLCAnaWQnKSwKICAgIChOb25lLCAnaWRlb2dyYXBoaWMnKSwKICAgIChOb25lLCAnaycpLAogICAgKE5vbmUsICdrZXlQb2ludHMnKSwKICAgIChOb25lLCAna2V5U3BsaW5lcycpLAogICAgKE5vbmUsICdrZXlUaW1lcycpLAogICAgKE5vbmUsICdsYW5nJyksCiAgICAoTm9uZSwgJ21hcmtlci1lbmQnKSwKICAgIChOb25lLCAnbWFya2VyLW1pZCcpLAogICAgKE5vbmUsICdtYXJrZXItc3RhcnQnKSwKICAgIChOb25lLCAnbWFya2VySGVpZ2h0JyksCiAgICAoTm9uZSwgJ21hcmtlclVuaXRzJyksCiAgICAoTm9uZSwgJ21hcmtlcldpZHRoJyksCiAgICAoTm9uZSwgJ21hdGhlbWF0aWNhbCcpLAogICAgKE5vbmUsICdtYXgnKSwKICAgIChOb25lLCAnbWluJyksCiAgICAoTm9uZSwgJ25hbWUnKSwKICAgIChOb25lLCAnb2Zmc2V0JyksCiAgICAoTm9uZSwgJ29wYWNpdHknKSwKICAgIChOb25lLCAnb3JpZW50JyksCiAgICAoTm9uZSwgJ29yaWdpbicpLAogICAgKE5vbmUsICdvdmVybGluZS1wb3NpdGlvbicpLAogICAgKE5vbmUsICdvdmVybGluZS10aGlja25lc3MnKSwKICAgIChOb25lLCAncGFub3NlLTEnKSwKICAgIChOb25lLCAncGF0aCcpLAogICAgKE5vbmUsICdwYXRoTGVuZ3RoJyksCiAgICAoTm9uZSwgJ3BvaW50cycpLAogICAgKE5vbmUsICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyksCiAgICAoTm9uZSwgJ3InKSwKICAgIChOb25lLCAncmVmWCcpLAogICAgKE5vbmUsICdyZWZZJyksCiAgICAoTm9uZSwgJ3JlcGVhdENvdW50JyksCiAgICAoTm9uZSwgJ3JlcGVhdER1cicpLAogICAgKE5vbmUsICdyZXF1aXJlZEV4dGVuc2lvbnMnKSwKICAgIChOb25lLCAncmVxdWlyZWRGZWF0dXJlcycpLAogICAgKE5vbmUsICdyZXN0YXJ0JyksCiAgICAoTm9uZSwgJ3JvdGF0ZScpLAogICAgKE5vbmUsICdyeCcpLAogICAgKE5vbmUsICdyeScpLAogICAgKE5vbmUsICdzbG9wZScpLAogICAgKE5vbmUsICdzdGVtaCcpLAogICAgKE5vbmUsICdzdGVtdicpLAogICAgKE5vbmUsICdzdG9wLWNvbG9yJyksCiAgICAoTm9uZSwgJ3N0b3Atb3BhY2l0eScpLAogICAgKE5vbmUsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ3N0cm9rZScpLAogICAgKE5vbmUsICdzdHJva2UtZGFzaGFycmF5JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1kYXNob2Zmc2V0JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1saW5lY2FwJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1saW5lam9pbicpLAogICAgKE5vbmUsICdzdHJva2UtbWl0ZXJsaW1pdCcpLAogICAgKE5vbmUsICdzdHJva2Utb3BhY2l0eScpLAogICAgKE5vbmUsICdzdHJva2Utd2lkdGgnKSwKICAgIChOb25lLCAnc3lzdGVtTGFuZ3VhZ2UnKSwKICAgIChOb25lLCAndGFyZ2V0JyksCiAgICAoTm9uZSwgJ3RleHQtYW5jaG9yJyksCiAgICAoTm9uZSwgJ3RvJyksCiAgICAoTm9uZSwgJ3RyYW5zZm9ybScpLAogICAgKE5vbmUsICd0eXBlJyksCiAgICAoTm9uZSwgJ3UxJyksCiAgICAoTm9uZSwgJ3UyJyksCiAgICAoTm9uZSwgJ3VuZGVybGluZS1wb3NpdGlvbicpLAogICAgKE5vbmUsICd1bmRlcmxpbmUtdGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ3VuaWNvZGUnKSwKICAgIChOb25lLCAndW5pY29kZS1yYW5nZScpLAogICAgKE5vbmUsICd1bml0cy1wZXItZW0nKSwKICAgIChOb25lLCAndmFsdWVzJyksCiAgICAoTm9uZSwgJ3ZlcnNpb24nKSwKICAgIChOb25lLCAndmlld0JveCcpLAogICAgKE5vbmUsICd2aXNpYmlsaXR5JyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAoTm9uZSwgJ3dpZHRocycpLAogICAgKE5vbmUsICd4JyksCiAgICAoTm9uZSwgJ3gtaGVpZ2h0JyksCiAgICAoTm9uZSwgJ3gxJyksCiAgICAoTm9uZSwgJ3gyJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2FjdHVhdGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnYXJjcm9sZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3JvbGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnc2hvdycpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICd0aXRsZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICd0eXBlJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdiYXNlJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdsYW5nJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdzcGFjZScpLAogICAgKE5vbmUsICd5JyksCiAgICAoTm9uZSwgJ3kxJyksCiAgICAoTm9uZSwgJ3kyJyksCiAgICAoTm9uZSwgJ3pvb21BbmRQYW4nKSwKKSkKCmF0dHJfdmFsX2lzX3VyaSA9IGZyb3plbnNldCgoCiAgICAoTm9uZSwgJ2hyZWYnKSwKICAgIChOb25lLCAnc3JjJyksCiAgICAoTm9uZSwgJ2NpdGUnKSwKICAgIChOb25lLCAnYWN0aW9uJyksCiAgICAoTm9uZSwgJ2xvbmdkZXNjJyksCiAgICAoTm9uZSwgJ3Bvc3RlcicpLAogICAgKE5vbmUsICdiYWNrZ3JvdW5kJyksCiAgICAoTm9uZSwgJ2RhdGFzcmMnKSwKICAgIChOb25lLCAnZHluc3JjJyksCiAgICAoTm9uZSwgJ2xvd3NyYycpLAogICAgKE5vbmUsICdwaW5nJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2Jhc2UnKSwKKSkKCnN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnY2xpcC1wYXRoJyksCiAgICAoTm9uZSwgJ2NvbG9yLXByb2ZpbGUnKSwKICAgIChOb25lLCAnY3Vyc29yJyksCiAgICAoTm9uZSwgJ2ZpbGwnKSwKICAgIChOb25lLCAnZmlsdGVyJyksCiAgICAoTm9uZSwgJ21hcmtlcicpLAogICAgKE5vbmUsICdtYXJrZXItc3RhcnQnKSwKICAgIChOb25lLCAnbWFya2VyLW1pZCcpLAogICAgKE5vbmUsICdtYXJrZXItZW5kJyksCiAgICAoTm9uZSwgJ21hc2snKSwKICAgIChOb25lLCAnc3Ryb2tlJyksCikpCgpzdmdfYWxsb3dfbG9jYWxfaHJlZiA9IGZyb3plbnNldCgoCiAgICAoTm9uZSwgJ2FsdEdseXBoJyksCiAgICAoTm9uZSwgJ2FuaW1hdGUnKSwKICAgIChOb25lLCAnYW5pbWF0ZUNvbG9yJyksCiAgICAoTm9uZSwgJ2FuaW1hdGVNb3Rpb24nKSwKICAgIChOb25lLCAnYW5pbWF0ZVRyYW5zZm9ybScpLAogICAgKE5vbmUsICdjdXJzb3InKSwKICAgIChOb25lLCAnZmVJbWFnZScpLAogICAgKE5vbmUsICdmaWx0ZXInKSwKICAgIChOb25lLCAnbGluZWFyR3JhZGllbnQnKSwKICAgIChOb25lLCAncGF0dGVybicpLAogICAgKE5vbmUsICdyYWRpYWxHcmFkaWVudCcpLAogICAgKE5vbmUsICd0ZXh0cGF0aCcpLAogICAgKE5vbmUsICd0cmVmJyksCiAgICAoTm9uZSwgJ3NldCcpLAogICAgKE5vbmUsICd1c2UnKQopKQoKYWxsb3dlZF9jc3NfcHJvcGVydGllcyA9IGZyb3plbnNldCgoCiAgICAnYXppbXV0aCcsCiAgICAnYmFja2dyb3VuZC1jb2xvcicsCiAgICAnYm9yZGVyLWJvdHRvbS1jb2xvcicsCiAgICAnYm9yZGVyLWNvbGxhcHNlJywKICAgICdib3JkZXItY29sb3InLAogICAgJ2JvcmRlci1sZWZ0LWNvbG9yJywKICAgICdib3JkZXItcmlnaHQtY29sb3InLAogICAgJ2JvcmRlci10b3AtY29sb3InLAogICAgJ2NsZWFyJywKICAgICdjb2xvcicsCiAgICAnY3Vyc29yJywKICAgICdkaXJlY3Rpb24nLAogICAgJ2Rpc3BsYXknLAogICAgJ2VsZXZhdGlvbicsCiAgICAnZmxvYXQnLAogICAgJ2ZvbnQnLAogICAgJ2ZvbnQtZmFtaWx5JywKICAgICdmb250LXNpemUnLAogICAgJ2ZvbnQtc3R5bGUnLAogICAgJ2ZvbnQtdmFyaWFudCcsCiAgICAnZm9udC13ZWlnaHQnLAogICAgJ2hlaWdodCcsCiAgICAnbGV0dGVyLXNwYWNpbmcnLAogICAgJ2xpbmUtaGVpZ2h0JywKICAgICdvdmVyZmxvdycsCiAgICAncGF1c2UnLAogICAgJ3BhdXNlLWFmdGVyJywKICAgICdwYXVzZS1iZWZvcmUnLAogICAgJ3BpdGNoJywKICAgICdwaXRjaC1yYW5nZScsCiAgICAncmljaG5lc3MnLAogICAgJ3NwZWFrJywKICAgICdzcGVhay1oZWFkZXInLAogICAgJ3NwZWFrLW51bWVyYWwnLAogICAgJ3NwZWFrLXB1bmN0dWF0aW9uJywKICAgICdzcGVlY2gtcmF0ZScsCiAgICAnc3RyZXNzJywKICAgICd0ZXh0LWFsaWduJywKICAgICd0ZXh0LWRlY29yYXRpb24nLAogICAgJ3RleHQtaW5kZW50JywKICAgICd1bmljb2RlLWJpZGknLAogICAgJ3ZlcnRpY2FsLWFsaWduJywKICAgICd2b2ljZS1mYW1pbHknLAogICAgJ3ZvbHVtZScsCiAgICAnd2hpdGUtc3BhY2UnLAogICAgJ3dpZHRoJywKKSkKCmFsbG93ZWRfY3NzX2tleXdvcmRzID0gZnJvemVuc2V0KCgKICAgICdhdXRvJywKICAgICdhcXVhJywKICAgICdibGFjaycsCiAgICAnYmxvY2snLAogICAgJ2JsdWUnLAogICAgJ2JvbGQnLAogICAgJ2JvdGgnLAogICAgJ2JvdHRvbScsCiAgICAnYnJvd24nLAogICAgJ2NlbnRlcicsCiAgICAnY29sbGFwc2UnLAogICAgJ2Rhc2hlZCcsCiAgICAnZG90dGVkJywKICAgICdmdWNoc2lhJywKICAgICdncmF5JywKICAgICdncmVlbicsCiAgICAnIWltcG9ydGFudCcsCiAgICAnaXRhbGljJywKICAgICdsZWZ0JywKICAgICdsaW1lJywKICAgICdtYXJvb24nLAogICAgJ21lZGl1bScsCiAgICAnbm9uZScsCiAgICAnbmF2eScsCiAgICAnbm9ybWFsJywKICAgICdub3dyYXAnLAogICAgJ29saXZlJywKICAgICdwb2ludGVyJywKICAgICdwdXJwbGUnLAogICAgJ3JlZCcsCiAgICAncmlnaHQnLAogICAgJ3NvbGlkJywKICAgICdzaWx2ZXInLAogICAgJ3RlYWwnLAogICAgJ3RvcCcsCiAgICAndHJhbnNwYXJlbnQnLAogICAgJ3VuZGVybGluZScsCiAgICAnd2hpdGUnLAogICAgJ3llbGxvdycsCikpCgphbGxvd2VkX3N2Z19wcm9wZXJ0aWVzID0gZnJvemVuc2V0KCgKICAgICdmaWxsJywKICAgICdmaWxsLW9wYWNpdHknLAogICAgJ2ZpbGwtcnVsZScsCiAgICAnc3Ryb2tlJywKICAgICdzdHJva2Utd2lkdGgnLAogICAgJ3N0cm9rZS1saW5lY2FwJywKICAgICdzdHJva2UtbGluZWpvaW4nLAogICAgJ3N0cm9rZS1vcGFjaXR5JywKKSkKCmFsbG93ZWRfcHJvdG9jb2xzID0gZnJvemVuc2V0KCgKICAgICdlZDJrJywKICAgICdmdHAnLAogICAgJ2h0dHAnLAogICAgJ2h0dHBzJywKICAgICdpcmMnLAogICAgJ21haWx0bycsCiAgICAnbmV3cycsCiAgICAnZ29waGVyJywKICAgICdubnRwJywKICAgICd0ZWxuZXQnLAogICAgJ3dlYmNhbCcsCiAgICAneG1wcCcsCiAgICAnY2FsbHRvJywKICAgICdmZWVkJywKICAgICd1cm4nLAogICAgJ2FpbScsCiAgICAncnN5bmMnLAogICAgJ3RhZycsCiAgICAnc3NoJywKICAgICdzZnRwJywKICAgICdydHNwJywKICAgICdhZnMnLAogICAgJ2RhdGEnLAopKQoKYWxsb3dlZF9jb250ZW50X3R5cGVzID0gZnJvemVuc2V0KCgKICAgICdpbWFnZS9wbmcnLAogICAgJ2ltYWdlL2pwZWcnLAogICAgJ2ltYWdlL2dpZicsCiAgICAnaW1hZ2Uvd2VicCcsCiAgICAnaW1hZ2UvYm1wJywKICAgICd0ZXh0L3BsYWluJywKKSkKCgpkYXRhX2NvbnRlbnRfdHlwZSA9IHJlLmNvbXBpbGUocicnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hdGNoIGEgY29udGVudCB0eXBlIDxhcHBsaWNhdGlvbj4vPHR5cGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD9QPGNvbnRlbnRfdHlwZT5bLWEtekEtWjAtOS5dKy9bLWEtekEtWjAtOS5dKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBjaGFyYWN0ZXIgc2V0IGFuZCBlbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/Oig/OjtjaGFyc2V0PSg/OlstYS16QS1aMC05XSspKD86Oyg/OmJhc2U2NCkpPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoPzo7KD86YmFzZTY0KSk/KD86O2NoYXJzZXQ9KD86Wy1hLXpBLVowLTldKykpPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGUgcmVzdCBpcyBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLC4qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLlZFUkJPU0UpCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgICIiIiBzYW5pdGl6YXRpb24gb2YgWEhUTUwrTWF0aE1MK1NWRyBhbmQgb2YgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZXMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9lbGVtZW50cz1hbGxvd2VkX2VsZW1lbnRzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfYXR0cmlidXRlcz1hbGxvd2VkX2F0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9jc3NfcHJvcGVydGllcz1hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfY3NzX2tleXdvcmRzPWFsbG93ZWRfY3NzX2tleXdvcmRzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfc3ZnX3Byb3BlcnRpZXM9YWxsb3dlZF9zdmdfcHJvcGVydGllcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX3Byb3RvY29scz1hbGxvd2VkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2NvbnRlbnRfdHlwZXM9YWxsb3dlZF9jb250ZW50X3R5cGVzLAogICAgICAgICAgICAgICAgIGF0dHJfdmFsX2lzX3VyaT1hdHRyX3ZhbF9pc191cmksCiAgICAgICAgICAgICAgICAgc3ZnX2F0dHJfdmFsX2FsbG93c19yZWY9c3ZnX2F0dHJfdmFsX2FsbG93c19yZWYsCiAgICAgICAgICAgICAgICAgc3ZnX2FsbG93X2xvY2FsX2hyZWY9c3ZnX2FsbG93X2xvY2FsX2hyZWYpOgogICAgICAgIHN1cGVyKEZpbHRlciwgc2VsZikuX19pbml0X18oc291cmNlKQogICAgICAgIHNlbGYuYWxsb3dlZF9lbGVtZW50cyA9IGFsbG93ZWRfZWxlbWVudHMKICAgICAgICBzZWxmLmFsbG93ZWRfYXR0cmlidXRlcyA9IGFsbG93ZWRfYXR0cmlidXRlcwogICAgICAgIHNlbGYuYWxsb3dlZF9jc3NfcHJvcGVydGllcyA9IGFsbG93ZWRfY3NzX3Byb3BlcnRpZXMKICAgICAgICBzZWxmLmFsbG93ZWRfY3NzX2tleXdvcmRzID0gYWxsb3dlZF9jc3Nfa2V5d29yZHMKICAgICAgICBzZWxmLmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMgPSBhbGxvd2VkX3N2Z19wcm9wZXJ0aWVzCiAgICAgICAgc2VsZi5hbGxvd2VkX3Byb3RvY29scyA9IGFsbG93ZWRfcHJvdG9jb2xzCiAgICAgICAgc2VsZi5hbGxvd2VkX2NvbnRlbnRfdHlwZXMgPSBhbGxvd2VkX2NvbnRlbnRfdHlwZXMKICAgICAgICBzZWxmLmF0dHJfdmFsX2lzX3VyaSA9IGF0dHJfdmFsX2lzX3VyaQogICAgICAgIHNlbGYuc3ZnX2F0dHJfdmFsX2FsbG93c19yZWYgPSBzdmdfYXR0cl92YWxfYWxsb3dzX3JlZgogICAgICAgIHNlbGYuc3ZnX2FsbG93X2xvY2FsX2hyZWYgPSBzdmdfYWxsb3dfbG9jYWxfaHJlZgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHRva2VuID0gc2VsZi5zYW5pdGl6ZV90b2tlbih0b2tlbikKICAgICAgICAgICAgaWYgdG9rZW46CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgICMgU2FuaXRpemUgdGhlICtodG1sKywgZXNjYXBpbmcgYWxsIGVsZW1lbnRzIG5vdCBpbiBBTExPV0VEX0VMRU1FTlRTLCBhbmQKICAgICMgc3RyaXBwaW5nIG91dCBhbGwgIyBhdHRyaWJ1dGVzIG5vdCBpbiBBTExPV0VEX0FUVFJJQlVURVMuIFN0eWxlCiAgICAjIGF0dHJpYnV0ZXMgYXJlIHBhcnNlZCwgYW5kIGEgcmVzdHJpY3RlZCBzZXQsICMgc3BlY2lmaWVkIGJ5CiAgICAjIEFMTE9XRURfQ1NTX1BST1BFUlRJRVMgYW5kIEFMTE9XRURfQ1NTX0tFWVdPUkRTLCBhcmUgYWxsb3dlZCB0aHJvdWdoLgogICAgIyBhdHRyaWJ1dGVzIGluIEFUVFJfVkFMX0lTX1VSSSBhcmUgc2Nhbm5lZCwgYW5kIG9ubHkgVVJJIHNjaGVtZXMgc3BlY2lmaWVkCiAgICAjIGluIEFMTE9XRURfUFJPVE9DT0xTIGFyZSBhbGxvd2VkLgogICAgIwogICAgIyAgIHNhbml0aXplX2h0bWwoJzxzY3JpcHQ+IGRvX25hc3R5X3N0dWZmKCkgPC9zY3JpcHQ+JykKICAgICMgICAgPT4gJmx0O3NjcmlwdD4gZG9fbmFzdHlfc3R1ZmYoKSAmbHQ7L3NjcmlwdD4KICAgICMgICBzYW5pdGl6ZV9odG1sKCc8YSBocmVmPSJqYXZhc2NyaXB0OiBzdWNrZXIoKTsiPkNsaWNrIGhlcmUgZm9yICQxMDA8L2E+JykKICAgICMgICAgPT4gPGE+Q2xpY2sgaGVyZSBmb3IgJDEwMDwvYT4KICAgIGRlZiBzYW5pdGl6ZV90b2tlbihzZWxmLCB0b2tlbik6CgogICAgICAgICMgYWNjb21tb2RhdGUgZmlsdGVycyB3aGljaCB1c2UgdG9rZW5fdHlwZSBkaWZmZXJlbnRseQogICAgICAgIHRva2VuX3R5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdG9rZW5fdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVuZFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBuYW1lc3BhY2UgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UsIG5hbWUpIGluIHNlbGYuYWxsb3dlZF9lbGVtZW50cyBvcgogICAgICAgICAgICAgICAgKG5hbWVzcGFjZSBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sIG5hbWUpIGluIHNlbGYuYWxsb3dlZF9lbGVtZW50cykpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWxsb3dlZF90b2tlbih0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc2FsbG93ZWRfdG9rZW4odG9rZW4pCiAgICAgICAgZWxpZiB0b2tlbl90eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBhbGxvd2VkX3Rva2VuKHNlbGYsIHRva2VuKToKICAgICAgICBpZiAiZGF0YSIgaW4gdG9rZW46CiAgICAgICAgICAgIGF0dHJzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBhdHRyX25hbWVzID0gc2V0KGF0dHJzLmtleXMoKSkKCiAgICAgICAgICAgICMgUmVtb3ZlIGZvcmJpZGRlbiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZvciB0b19yZW1vdmUgaW4gKGF0dHJfbmFtZXMgLSBzZWxmLmFsbG93ZWRfYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICBkZWwgdG9rZW5bImRhdGEiXVt0b19yZW1vdmVdCiAgICAgICAgICAgICAgICBhdHRyX25hbWVzLnJlbW92ZSh0b19yZW1vdmUpCgogICAgICAgICAgICAjIFJlbW92ZSBhdHRyaWJ1dGVzIHdpdGggZGlzYWxsb3dlZCBVUkwgdmFsdWVzCiAgICAgICAgICAgIGZvciBhdHRyIGluIChhdHRyX25hbWVzICYgc2VsZi5hdHRyX3ZhbF9pc191cmkpOgogICAgICAgICAgICAgICAgYXNzZXJ0IGF0dHIgaW4gYXR0cnMKICAgICAgICAgICAgICAgICMgSSBkb24ndCBoYXZlIGEgY2x1ZSB3aGVyZSB0aGlzIHJlZ2V4cCBjb21lcyBmcm9tIG9yIHdoeSBpdCBtYXRjaGVzIHRob3NlCiAgICAgICAgICAgICAgICAjIGNoYXJhY3RlcnMsIG5vciB3aHkgd2UgY2FsbCB1bmVzY2FwZS4gSSBqdXN0IGtub3cgaXQncyBhbHdheXMgYmVlbiBoZXJlLgogICAgICAgICAgICAgICAgIyBTaG91bGQgeW91IGJlIHdvcnJpZWQgYnkgdGhpcyBjb21tZW50IGluIGEgc2FuaXRpemVyPyBZZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBhbGwKICAgICAgICAgICAgICAgICMgdGhpcyB3aWxsIGRvIGlzIHJlbW92ZSAqbW9yZSogdGhhbiBpdCBvdGhlcndpc2Ugd291bGQuCiAgICAgICAgICAgICAgICB2YWxfdW5lc2NhcGVkID0gcmUuc3ViKCJbYFx4MDAtXHgyMFx4N2YtXHhhMFxzXSsiLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGUoYXR0cnNbYXR0cl0pKS5sb3dlcigpCiAgICAgICAgICAgICAgICAjIHJlbW92ZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGZyb20gdW5lc2NhcGVkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgIHZhbF91bmVzY2FwZWQgPSB2YWxfdW5lc2NhcGVkLnJlcGxhY2UoIlx1ZmZmZCIsICIiKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHVyaSA9IHVybHBhcnNlLnVybHBhcnNlKHZhbF91bmVzY2FwZWQpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICB1cmkgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCiAgICAgICAgICAgICAgICBpZiB1cmkgYW5kIHVyaS5zY2hlbWU6CiAgICAgICAgICAgICAgICAgICAgaWYgdXJpLnNjaGVtZSBub3QgaW4gc2VsZi5hbGxvd2VkX3Byb3RvY29sczoKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCiAgICAgICAgICAgICAgICAgICAgaWYgdXJpLnNjaGVtZSA9PSAnZGF0YSc6CiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBkYXRhX2NvbnRlbnRfdHlwZS5tYXRjaCh1cmkucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBtLmdyb3VwKCdjb250ZW50X3R5cGUnKSBub3QgaW4gc2VsZi5hbGxvd2VkX2NvbnRlbnRfdHlwZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KCiAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuc3ZnX2F0dHJfdmFsX2FsbG93c19yZWY6CiAgICAgICAgICAgICAgICBpZiBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gcmUuc3ViKHIndXJsXHMqXChccypbXiNcc11bXildKz9cKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlKGF0dHJzW2F0dHJdKSkKICAgICAgICAgICAgaWYgKHRva2VuWyJuYW1lIl0gaW4gc2VsZi5zdmdfYWxsb3dfbG9jYWxfaHJlZiBhbmQKICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpIGluIGF0dHJzIGFuZCByZS5zZWFyY2goJ15ccypbXiNcc10uKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzWyhuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpXSkpOgogICAgICAgICAgICAgICAgZGVsIGF0dHJzWyhuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpXQogICAgICAgICAgICBpZiAoTm9uZSwgJ3N0eWxlJykgaW4gYXR0cnM6CiAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgJ3N0eWxlJyldID0gc2VsZi5zYW5pdGl6ZV9jc3MoYXR0cnNbKE5vbmUsICdzdHlsZScpXSkKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IGF0dHJzCiAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIGRpc2FsbG93ZWRfdG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgIHRva2VuX3R5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdG9rZW5fdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICI8LyVzPiIgJSB0b2tlblsibmFtZSJdCiAgICAgICAgZWxpZiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICBhc3NlcnQgdG9rZW5fdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIikKICAgICAgICAgICAgYXR0cnMgPSBbXQogICAgICAgICAgICBmb3IgKG5zLCBuYW1lKSwgdiBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoJyAlcz0iJXMiJyAlIChuYW1lIGlmIG5zIGlzIE5vbmUgZWxzZSAiJXM6JXMiICUgKHByZWZpeGVzW25zXSwgbmFtZSksIGVzY2FwZSh2KSkpCiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiPCVzJXM+IiAlICh0b2tlblsibmFtZSJdLCAnJy5qb2luKGF0dHJzKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIjwlcz4iICUgdG9rZW5bIm5hbWUiXQogICAgICAgIGlmIHRva2VuLmdldCgic2VsZkNsb3NpbmciKToKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IHRva2VuWyJkYXRhIl1bOi0xXSArICIvPiIKCiAgICAgICAgdG9rZW5bInR5cGUiXSA9ICJDaGFyYWN0ZXJzIgoKICAgICAgICBkZWwgdG9rZW5bIm5hbWUiXQogICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBzYW5pdGl6ZV9jc3Moc2VsZiwgc3R5bGUpOgogICAgICAgICMgZGlzYWxsb3cgdXJscwogICAgICAgIHN0eWxlID0gcmUuY29tcGlsZSgndXJsXHMqXChccypbXlxzKV0rP1xzKlwpXHMqJykuc3ViKCcgJywgc3R5bGUpCgogICAgICAgICMgZ2F1bnRsZXQKICAgICAgICBpZiBub3QgcmUubWF0Y2goIiIiXihbOiw7IyUuXHNhLXpBLVowLTkhXXxcdy1cd3wnW1xzXHddKyd8Iltcc1x3XSsifFwoW1xkLFxzXStcKSkqJCIiIiwgc3R5bGUpOgogICAgICAgICAgICByZXR1cm4gJycKICAgICAgICBpZiBub3QgcmUubWF0Y2goIl5ccyooWy1cd10rXHMqOlteOjtdKig7XHMqfCQpKSokIiwgc3R5bGUpOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICAgICAgY2xlYW4gPSBbXQogICAgICAgIGZvciBwcm9wLCB2YWx1ZSBpbiByZS5maW5kYWxsKCIoWy1cd10rKVxzKjpccyooW146O10qKSIsIHN0eWxlKToKICAgICAgICAgICAgaWYgbm90IHZhbHVlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcHJvcC5sb3dlcigpIGluIHNlbGYuYWxsb3dlZF9jc3NfcHJvcGVydGllczoKICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQogICAgICAgICAgICBlbGlmIHByb3Auc3BsaXQoJy0nKVswXS5sb3dlcigpIGluIFsnYmFja2dyb3VuZCcsICdib3JkZXInLCAnbWFyZ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmcnXToKICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHZhbHVlLnNwbGl0KCk6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5d29yZCBub3QgaW4gc2VsZi5hbGxvd2VkX2Nzc19rZXl3b3JkcyBhbmQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlLm1hdGNoKCJeKCNbMC05YS1mXSt8cmdiXChcZCslPyxcZColPyw/XGQqJT9cKT98XGR7MCwyfVwuP1xkezAsMn0oY218ZW18ZXh8aW58bW18cGN8cHR8cHh8JXwsfFwpKT8pJCIsIGtleXdvcmQpOiAgIyBub3FhCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQogICAgICAgICAgICBlbGlmIHByb3AubG93ZXIoKSBpbiBzZWxmLmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXM6CiAgICAgICAgICAgICAgICBjbGVhbi5hcHBlbmQocHJvcCArICc6ICcgKyB2YWx1ZSArICc7JykKCiAgICAgICAgcmV0dXJuICcgJy5qb2luKGNsZWFuKQpQSwMEFAAAAAAAAAAhAJ+Oaq1zBAAAcwQAADoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgcmUKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCByY2RhdGFFbGVtZW50cywgc3BhY2VDaGFyYWN0ZXJzCnNwYWNlQ2hhcmFjdGVycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKQoKU1BBQ0VTX1JFR0VYID0gcmUuY29tcGlsZSgiWyVzXSsiICUgc3BhY2VDaGFyYWN0ZXJzKQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CgogICAgc3BhY2VQcmVzZXJ2ZUVsZW1lbnRzID0gZnJvemVuc2V0KFsicHJlIiwgInRleHRhcmVhIl0gKyBsaXN0KHJjZGF0YUVsZW1lbnRzKSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcHJlc2VydmUgPSAwCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyIgXAogICAgICAgICAgICAgICAgICAgIGFuZCAocHJlc2VydmUgb3IgdG9rZW5bIm5hbWUiXSBpbiBzZWxmLnNwYWNlUHJlc2VydmVFbGVtZW50cyk6CiAgICAgICAgICAgICAgICBwcmVzZXJ2ZSArPSAxCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyIgYW5kIHByZXNlcnZlOgogICAgICAgICAgICAgICAgcHJlc2VydmUgLT0gMQoKICAgICAgICAgICAgZWxpZiBub3QgcHJlc2VydmUgYW5kIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyIgYW5kIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICAjIFRlc3Qgb24gdG9rZW5bImRhdGEiXSBhYm92ZSB0byBub3QgaW50cm9kdWNlIHNwYWNlcyB3aGVyZSB0aGVyZSB3ZXJlIG5vdAogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICIgIgoKICAgICAgICAgICAgZWxpZiBub3QgcHJlc2VydmUgYW5kIHR5cGUgPT0gIkNoYXJhY3RlcnMiOgogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IGNvbGxhcHNlX3NwYWNlcyh0b2tlblsiZGF0YSJdKQoKICAgICAgICAgICAgeWllbGQgdG9rZW4KCgpkZWYgY29sbGFwc2Vfc3BhY2VzKHRleHQpOgogICAgcmV0dXJuIFNQQUNFU19SRUdFWC5zdWIoJyAnLCB0ZXh0KQpQSwMEFAAAAAAAAAAhAGPYd9yyyQEAsskBADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvaHRtbDVwYXJzZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHdpdGhfbWV0YWNsYXNzLCB2aWV3a2V5cywgUFkzCgppbXBvcnQgdHlwZXMKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlwLl92ZW5kb3Iub3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0Cgpmcm9tIC4gaW1wb3J0IF9pbnB1dHN0cmVhbQpmcm9tIC4gaW1wb3J0IF90b2tlbml6ZXIKCmZyb20gLiBpbXBvcnQgdHJlZWJ1aWxkZXJzCmZyb20gLnRyZWVidWlsZGVycy5iYXNlIGltcG9ydCBNYXJrZXIKCmZyb20gLiBpbXBvcnQgX3V0aWxzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgKAogICAgc3BhY2VDaGFyYWN0ZXJzLCBhc2NpaVVwcGVyMkxvd2VyLAogICAgc3BlY2lhbEVsZW1lbnRzLCBoZWFkaW5nRWxlbWVudHMsIGNkYXRhRWxlbWVudHMsIHJjZGF0YUVsZW1lbnRzLAogICAgdG9rZW5UeXBlcywgdGFnVG9rZW5UeXBlcywKICAgIG5hbWVzcGFjZXMsCiAgICBodG1sSW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzLCBtYXRobWxUZXh0SW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzLAogICAgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMgYXMgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXNNYXAsCiAgICBhZGp1c3RNYXRoTUxBdHRyaWJ1dGVzLCBhZGp1c3RTVkdBdHRyaWJ1dGVzLAogICAgRSwKICAgIFJlcGFyc2VFeGNlcHRpb24KKQoKCmRlZiBwYXJzZShkb2MsIHRyZWVidWlsZGVyPSJldHJlZSIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1UcnVlLCAqKmt3YXJncyk6CiAgICAiIiJQYXJzZSBhIHN0cmluZyBvciBmaWxlLWxpa2Ugb2JqZWN0IGludG8gYSB0cmVlIiIiCiAgICB0YiA9IHRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcih0cmVlYnVpbGRlcikKICAgIHAgPSBIVE1MUGFyc2VyKHRiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9bmFtZXNwYWNlSFRNTEVsZW1lbnRzKQogICAgcmV0dXJuIHAucGFyc2UoZG9jLCAqKmt3YXJncykKCgpkZWYgcGFyc2VGcmFnbWVudChkb2MsIGNvbnRhaW5lcj0iZGl2IiwgdHJlZWJ1aWxkZXI9ImV0cmVlIiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPVRydWUsICoqa3dhcmdzKToKICAgIHRiID0gdHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKHRyZWVidWlsZGVyKQogICAgcCA9IEhUTUxQYXJzZXIodGIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1uYW1lc3BhY2VIVE1MRWxlbWVudHMpCiAgICByZXR1cm4gcC5wYXJzZUZyYWdtZW50KGRvYywgY29udGFpbmVyPWNvbnRhaW5lciwgKiprd2FyZ3MpCgoKZGVmIG1ldGhvZF9kZWNvcmF0b3JfbWV0YWNsYXNzKGZ1bmN0aW9uKToKICAgIGNsYXNzIERlY29yYXRlZCh0eXBlKToKICAgICAgICBkZWYgX19uZXdfXyhtZXRhLCBjbGFzc25hbWUsIGJhc2VzLCBjbGFzc0RpY3QpOgogICAgICAgICAgICBmb3IgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlIGluIGNsYXNzRGljdC5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhdHRyaWJ1dGUsIHR5cGVzLkZ1bmN0aW9uVHlwZSk6CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gZnVuY3Rpb24oYXR0cmlidXRlKQoKICAgICAgICAgICAgICAgIGNsYXNzRGljdFthdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZQogICAgICAgICAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGEsIGNsYXNzbmFtZSwgYmFzZXMsIGNsYXNzRGljdCkKICAgIHJldHVybiBEZWNvcmF0ZWQKCgpjbGFzcyBIVE1MUGFyc2VyKG9iamVjdCk6CiAgICAiIiJIVE1MIHBhcnNlci4gR2VuZXJhdGVzIGEgdHJlZSBzdHJ1Y3R1cmUgZnJvbSBhIHN0cmVhbSBvZiAocG9zc2libHkKICAgICAgICBtYWxmb3JtZWQpIEhUTUwiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZT1Ob25lLCBzdHJpY3Q9RmFsc2UsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1UcnVlLCBkZWJ1Zz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgc3RyaWN0IC0gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gYSBwYXJzZSBlcnJvciBpcyBlbmNvdW50ZXJlZAoKICAgICAgICB0cmVlIC0gYSB0cmVlYnVpbGRlciBjbGFzcyBjb250cm9sbGluZyB0aGUgdHlwZSBvZiB0cmVlIHRoYXQgd2lsbCBiZQogICAgICAgIHJldHVybmVkLiBCdWlsdCBpbiB0cmVlYnVpbGRlcnMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2gKICAgICAgICBodG1sNWxpYi50cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIodHJlZVR5cGUpCiAgICAgICAgIiIiCgogICAgICAgICMgUmFpc2UgYW4gZXhjZXB0aW9uIG9uIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZAogICAgICAgIHNlbGYuc3RyaWN0ID0gc3RyaWN0CgogICAgICAgIGlmIHRyZWUgaXMgTm9uZToKICAgICAgICAgICAgdHJlZSA9IHRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcigiZXRyZWUiKQogICAgICAgIHNlbGYudHJlZSA9IHRyZWUobmFtZXNwYWNlSFRNTEVsZW1lbnRzKQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICAgICAgc2VsZi5waGFzZXMgPSBkaWN0KFsobmFtZSwgY2xzKHNlbGYsIHNlbGYudHJlZSkpIGZvciBuYW1lLCBjbHMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBoYXNlcyhkZWJ1ZykuaXRlbXMoKV0pCgogICAgZGVmIF9wYXJzZShzZWxmLCBzdHJlYW0sIGlubmVySFRNTD1GYWxzZSwgY29udGFpbmVyPSJkaXYiLCBzY3JpcHRpbmc9RmFsc2UsICoqa3dhcmdzKToKCiAgICAgICAgc2VsZi5pbm5lckhUTUxNb2RlID0gaW5uZXJIVE1MCiAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXIKICAgICAgICBzZWxmLnNjcmlwdGluZyA9IHNjcmlwdGluZwogICAgICAgIHNlbGYudG9rZW5pemVyID0gX3Rva2VuaXplci5IVE1MVG9rZW5pemVyKHN0cmVhbSwgcGFyc2VyPXNlbGYsICoqa3dhcmdzKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWFpbkxvb3AoKQogICAgICAgIGV4Y2VwdCBSZXBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICBzZWxmLnJlc2V0KCkKICAgICAgICAgICAgc2VsZi5tYWluTG9vcCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYudHJlZS5yZXNldCgpCiAgICAgICAgc2VsZi5maXJzdFN0YXJ0VGFnID0gRmFsc2UKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCiAgICAgICAgc2VsZi5sb2cgPSBbXSAgIyBvbmx5IHVzZWQgd2l0aCBkZWJ1ZyBtb2RlCiAgICAgICAgIyAicXVpcmtzIiAvICJsaW1pdGVkIHF1aXJrcyIgLyAibm8gcXVpcmtzIgogICAgICAgIHNlbGYuY29tcGF0TW9kZSA9ICJubyBxdWlya3MiCgogICAgICAgIGlmIHNlbGYuaW5uZXJIVE1MTW9kZToKICAgICAgICAgICAgc2VsZi5pbm5lckhUTUwgPSBzZWxmLmNvbnRhaW5lci5sb3dlcigpCgogICAgICAgICAgICBpZiBzZWxmLmlubmVySFRNTCBpbiBjZGF0YUVsZW1lbnRzOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yY2RhdGFTdGF0ZQogICAgICAgICAgICBlbGlmIHNlbGYuaW5uZXJIVE1MIGluIHJjZGF0YUVsZW1lbnRzOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yYXd0ZXh0U3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLmlubmVySFRNTCA9PSAncGxhaW50ZXh0JzoKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucGxhaW50ZXh0U3RhdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc3RhdGUgYWxyZWFkeSBpcyBkYXRhIHN0YXRlCiAgICAgICAgICAgICAgICAjIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIuZGF0YVN0YXRlCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYucGhhc2UgPSBzZWxmLnBoYXNlc1siYmVmb3JlSHRtbCJdCiAgICAgICAgICAgIHNlbGYucGhhc2UuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICBzZWxmLnJlc2V0SW5zZXJ0aW9uTW9kZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbm5lckhUTUwgPSBGYWxzZSAgIyBweWxpbnQ6ZGlzYWJsZT1yZWRlZmluZWQtdmFyaWFibGUtdHlwZQogICAgICAgICAgICBzZWxmLnBoYXNlID0gc2VsZi5waGFzZXNbImluaXRpYWwiXQoKICAgICAgICBzZWxmLmxhc3RQaGFzZSA9IE5vbmUKCiAgICAgICAgc2VsZi5iZWZvcmVSQ0RhdGFQaGFzZSA9IE5vbmUKCiAgICAgICAgc2VsZi5mcmFtZXNldE9LID0gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRvY3VtZW50RW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZwogICAgICAgIHRoYXQgd2FzIHVzZWQgdG8gZGVjb2RlIHRoZSBpbnB1dCBzdHJlYW0sCiAgICAgICAgb3IgOm9iajpgTm9uZWAgaWYgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB5ZXQuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICd0b2tlbml6ZXInKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gc2VsZi50b2tlbml6ZXIuc3RyZWFtLmNoYXJFbmNvZGluZ1swXS5uYW1lCgogICAgZGVmIGlzSFRNTEludGVncmF0aW9uUG9pbnQoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgaWYgKGVsZW1lbnQubmFtZSA9PSAiYW5ub3RhdGlvbi14bWwiIGFuZAogICAgICAgICAgICAgICAgZWxlbWVudC5uYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sibWF0aG1sIl0pOgogICAgICAgICAgICByZXR1cm4gKCJlbmNvZGluZyIgaW4gZWxlbWVudC5hdHRyaWJ1dGVzIGFuZAogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cmlidXRlc1siZW5jb2RpbmciXS50cmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIGFzY2lpVXBwZXIyTG93ZXIpIGluCiAgICAgICAgICAgICAgICAgICAgKCJ0ZXh0L2h0bWwiLCAiYXBwbGljYXRpb24veGh0bWwreG1sIikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50Lm5hbWVzcGFjZSwgZWxlbWVudC5uYW1lKSBpbiBodG1sSW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzCgogICAgZGVmIGlzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgcmV0dXJuIChlbGVtZW50Lm5hbWVzcGFjZSwgZWxlbWVudC5uYW1lKSBpbiBtYXRobWxUZXh0SW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzCgogICAgZGVmIG1haW5Mb29wKHNlbGYpOgogICAgICAgIENoYXJhY3RlcnNUb2tlbiA9IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXQogICAgICAgIFNwYWNlQ2hhcmFjdGVyc1Rva2VuID0gdG9rZW5UeXBlc1siU3BhY2VDaGFyYWN0ZXJzIl0KICAgICAgICBTdGFydFRhZ1Rva2VuID0gdG9rZW5UeXBlc1siU3RhcnRUYWciXQogICAgICAgIEVuZFRhZ1Rva2VuID0gdG9rZW5UeXBlc1siRW5kVGFnIl0KICAgICAgICBDb21tZW50VG9rZW4gPSB0b2tlblR5cGVzWyJDb21tZW50Il0KICAgICAgICBEb2N0eXBlVG9rZW4gPSB0b2tlblR5cGVzWyJEb2N0eXBlIl0KICAgICAgICBQYXJzZUVycm9yVG9rZW4gPSB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0KCiAgICAgICAgZm9yIHRva2VuIGluIHNlbGYubm9ybWFsaXplZFRva2VucygpOgogICAgICAgICAgICBwcmV2X3Rva2VuID0gTm9uZQogICAgICAgICAgICBuZXdfdG9rZW4gPSB0b2tlbgogICAgICAgICAgICB3aGlsZSBuZXdfdG9rZW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwcmV2X3Rva2VuID0gbmV3X3Rva2VuCiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHMgZWxzZSBOb25lCiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWVzcGFjZSA9IGN1cnJlbnROb2RlLm5hbWVzcGFjZSBpZiBjdXJyZW50Tm9kZSBlbHNlIE5vbmUKICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZSA9IGN1cnJlbnROb2RlLm5hbWUgaWYgY3VycmVudE5vZGUgZWxzZSBOb25lCgogICAgICAgICAgICAgICAgdHlwZSA9IG5ld190b2tlblsidHlwZSJdCgogICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBQYXJzZUVycm9yVG9rZW46CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZUVycm9yKG5ld190b2tlblsiZGF0YSJdLCBuZXdfdG9rZW4uZ2V0KCJkYXRhdmFycyIsIHt9KSkKICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIChsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgPT0gMCBvcgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWVzcGFjZSA9PSBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZSBvcgogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnROb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICgodHlwZSA9PSBTdGFydFRhZ1Rva2VuIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdIG5vdCBpbiBmcm96ZW5zZXQoWyJtZ2x5cGgiLCAibWFsaWdubWFyayJdKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGluIChDaGFyYWN0ZXJzVG9rZW4sIFNwYWNlQ2hhcmFjdGVyc1Rva2VuKSkpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50Tm9kZU5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJtYXRobWwiXSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZSA9PSAiYW5ub3RhdGlvbi14bWwiIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBTdGFydFRhZ1Rva2VuIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSA9PSAic3ZnIikgb3IKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaXNIVE1MSW50ZWdyYXRpb25Qb2ludChjdXJyZW50Tm9kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGluIChTdGFydFRhZ1Rva2VuLCBDaGFyYWN0ZXJzVG9rZW4sIFNwYWNlQ2hhcmFjdGVyc1Rva2VuKSkpOgogICAgICAgICAgICAgICAgICAgICAgICBwaGFzZSA9IHNlbGYucGhhc2UKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBwaGFzZSA9IHNlbGYucGhhc2VzWyJpbkZvcmVpZ25Db250ZW50Il0KCiAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBDaGFyYWN0ZXJzVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NDaGFyYWN0ZXJzKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gU3BhY2VDaGFyYWN0ZXJzVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBTdGFydFRhZ1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzU3RhcnRUYWcobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBFbmRUYWdUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0VuZFRhZyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IENvbW1lbnRUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0NvbW1lbnQobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBEb2N0eXBlVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NEb2N0eXBlKG5ld190b2tlbikKCiAgICAgICAgICAgIGlmICh0eXBlID09IFN0YXJ0VGFnVG9rZW4gYW5kIHByZXZfdG9rZW5bInNlbGZDbG9zaW5nIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgbm90IHByZXZfdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0pOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZUVycm9yKCJub24tdm9pZC1lbGVtZW50LXdpdGgtdHJhaWxpbmctc29saWR1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogcHJldl90b2tlblsibmFtZSJdfSkKCiAgICAgICAgIyBXaGVuIHRoZSBsb29wIGZpbmlzaGVzIGl0J3MgRU9GCiAgICAgICAgcmVwcm9jZXNzID0gVHJ1ZQogICAgICAgIHBoYXNlcyA9IFtdCiAgICAgICAgd2hpbGUgcmVwcm9jZXNzOgogICAgICAgICAgICBwaGFzZXMuYXBwZW5kKHNlbGYucGhhc2UpCiAgICAgICAgICAgIHJlcHJvY2VzcyA9IHNlbGYucGhhc2UucHJvY2Vzc0VPRigpCiAgICAgICAgICAgIGlmIHJlcHJvY2VzczoKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBoYXNlIG5vdCBpbiBwaGFzZXMKCiAgICBkZWYgbm9ybWFsaXplZFRva2VucyhzZWxmKToKICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50b2tlbml6ZXI6CiAgICAgICAgICAgIHlpZWxkIHNlbGYubm9ybWFsaXplVG9rZW4odG9rZW4pCgogICAgZGVmIHBhcnNlKHNlbGYsIHN0cmVhbSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJQYXJzZSBhIEhUTUwgZG9jdW1lbnQgaW50byBhIHdlbGwtZm9ybWVkIHRyZWUKCiAgICAgICAgc3RyZWFtIC0gYSBmaWxlbGlrZSBvYmplY3Qgb3Igc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEhUTUwgdG8gYmUgcGFyc2VkCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgIHNjcmlwdGluZyAtIHRyZWF0IG5vc2NyaXB0IGVsZW1lbnRzIGFzIGlmIGphdmFzY3JpcHQgd2FzIHR1cm5lZCBvbgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3BhcnNlKHN0cmVhbSwgRmFsc2UsIE5vbmUsICphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi50cmVlLmdldERvY3VtZW50KCkKCiAgICBkZWYgcGFyc2VGcmFnbWVudChzZWxmLCBzdHJlYW0sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUGFyc2UgYSBIVE1MIGZyYWdtZW50IGludG8gYSB3ZWxsLWZvcm1lZCB0cmVlIGZyYWdtZW50CgogICAgICAgIGNvbnRhaW5lciAtIG5hbWUgb2YgdGhlIGVsZW1lbnQgd2UncmUgc2V0dGluZyB0aGUgaW5uZXJIVE1MIHByb3BlcnR5CiAgICAgICAgaWYgc2V0IHRvIE5vbmUsIGRlZmF1bHQgdG8gJ2RpdicKCiAgICAgICAgc3RyZWFtIC0gYSBmaWxlbGlrZSBvYmplY3Qgb3Igc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEhUTUwgdG8gYmUgcGFyc2VkCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgIHNjcmlwdGluZyAtIHRyZWF0IG5vc2NyaXB0IGVsZW1lbnRzIGFzIGlmIGphdmFzY3JpcHQgd2FzIHR1cm5lZCBvbgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3BhcnNlKHN0cmVhbSwgVHJ1ZSwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnRyZWUuZ2V0RnJhZ21lbnQoKQoKICAgIGRlZiBwYXJzZUVycm9yKHNlbGYsIGVycm9yY29kZT0iWFhYLXVuZGVmaW5lZC1lcnJvciIsIGRhdGF2YXJzPU5vbmUpOgogICAgICAgICMgWFhYIFRoZSBpZGVhIGlzIHRvIG1ha2UgZXJyb3Jjb2RlIG1hbmRhdG9yeS4KICAgICAgICBpZiBkYXRhdmFycyBpcyBOb25lOgogICAgICAgICAgICBkYXRhdmFycyA9IHt9CiAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKChzZWxmLnRva2VuaXplci5zdHJlYW0ucG9zaXRpb24oKSwgZXJyb3Jjb2RlLCBkYXRhdmFycykpCiAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoRVtlcnJvcmNvZGVdICUgZGF0YXZhcnMpCgogICAgZGVmIG5vcm1hbGl6ZVRva2VuKHNlbGYsIHRva2VuKToKICAgICAgICAiIiIgSFRNTDUgc3BlY2lmaWMgbm9ybWFsaXphdGlvbnMgdG8gdGhlIHRva2VuIHN0cmVhbSAiIiIKCiAgICAgICAgaWYgdG9rZW5bInR5cGUiXSA9PSB0b2tlblR5cGVzWyJTdGFydFRhZyJdOgogICAgICAgICAgICByYXcgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBPcmRlcmVkRGljdChyYXcpCiAgICAgICAgICAgIGlmIGxlbihyYXcpID4gbGVuKHRva2VuWyJkYXRhIl0pOgogICAgICAgICAgICAgICAgIyB3ZSBoYWQgc29tZSBkdXBsaWNhdGVkIGF0dHJpYnV0ZSwgZml4IHNvIGZpcnN0IHdpbnMKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0udXBkYXRlKHJhd1s6Oi0xXSkKCiAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIGFkanVzdE1hdGhNTEF0dHJpYnV0ZXMoc2VsZiwgdG9rZW4pOgogICAgICAgIGFkanVzdF9hdHRyaWJ1dGVzKHRva2VuLCBhZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKQoKICAgIGRlZiBhZGp1c3RTVkdBdHRyaWJ1dGVzKHNlbGYsIHRva2VuKToKICAgICAgICBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgYWRqdXN0U1ZHQXR0cmlidXRlcykKCiAgICBkZWYgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMoc2VsZiwgdG9rZW4pOgogICAgICAgIGFkanVzdF9hdHRyaWJ1dGVzKHRva2VuLCBhZGp1c3RGb3JlaWduQXR0cmlidXRlc01hcCkKCiAgICBkZWYgcmVwYXJzZVRva2VuTm9ybWFsKHNlbGYsIHRva2VuKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC1hcmd1bWVudAogICAgICAgIHNlbGYucGFyc2VyLnBoYXNlKCkKCiAgICBkZWYgcmVzZXRJbnNlcnRpb25Nb2RlKHNlbGYpOgogICAgICAgICMgVGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaXMgbW9zdGx5IGhpc3RvcmljYWwuIChJdCdzIGFsc28gdXNlZCBpbiB0aGUKICAgICAgICAjIHNwZWNpZmljYXRpb24uKQogICAgICAgIGxhc3QgPSBGYWxzZQogICAgICAgIG5ld01vZGVzID0gewogICAgICAgICAgICAic2VsZWN0IjogImluU2VsZWN0IiwKICAgICAgICAgICAgInRkIjogImluQ2VsbCIsCiAgICAgICAgICAgICJ0aCI6ICJpbkNlbGwiLAogICAgICAgICAgICAidHIiOiAiaW5Sb3ciLAogICAgICAgICAgICAidGJvZHkiOiAiaW5UYWJsZUJvZHkiLAogICAgICAgICAgICAidGhlYWQiOiAiaW5UYWJsZUJvZHkiLAogICAgICAgICAgICAidGZvb3QiOiAiaW5UYWJsZUJvZHkiLAogICAgICAgICAgICAiY2FwdGlvbiI6ICJpbkNhcHRpb24iLAogICAgICAgICAgICAiY29sZ3JvdXAiOiAiaW5Db2x1bW5Hcm91cCIsCiAgICAgICAgICAgICJ0YWJsZSI6ICJpblRhYmxlIiwKICAgICAgICAgICAgImhlYWQiOiAiaW5Cb2R5IiwKICAgICAgICAgICAgImJvZHkiOiAiaW5Cb2R5IiwKICAgICAgICAgICAgImZyYW1lc2V0IjogImluRnJhbWVzZXQiLAogICAgICAgICAgICAiaHRtbCI6ICJiZWZvcmVIZWFkIgogICAgICAgIH0KICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUubmFtZQogICAgICAgICAgICBuZXdfcGhhc2UgPSBOb25lCiAgICAgICAgICAgIGlmIG5vZGUgPT0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmlubmVySFRNTAogICAgICAgICAgICAgICAgbGFzdCA9IFRydWUKICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gc2VsZi5pbm5lckhUTUwKICAgICAgICAgICAgIyBDaGVjayBmb3IgY29uZGl0aW9ucyB0aGF0IHNob3VsZCBvbmx5IGhhcHBlbiBpbiB0aGUgaW5uZXJIVE1MCiAgICAgICAgICAgICMgY2FzZQogICAgICAgICAgICBpZiBub2RlTmFtZSBpbiAoInNlbGVjdCIsICJjb2xncm91cCIsICJoZWFkIiwgImh0bWwiKToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmlubmVySFRNTAoKICAgICAgICAgICAgaWYgbm90IGxhc3QgYW5kIG5vZGUubmFtZXNwYWNlICE9IHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG5vZGVOYW1lIGluIG5ld01vZGVzOgogICAgICAgICAgICAgICAgbmV3X3BoYXNlID0gc2VsZi5waGFzZXNbbmV3TW9kZXNbbm9kZU5hbWVdXQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBsYXN0OgogICAgICAgICAgICAgICAgbmV3X3BoYXNlID0gc2VsZi5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBzZWxmLnBoYXNlID0gbmV3X3BoYXNlCgogICAgZGVmIHBhcnNlUkNEYXRhUmF3dGV4dChzZWxmLCB0b2tlbiwgY29udGVudFR5cGUpOgogICAgICAgICIiIkdlbmVyaWMgUkNEQVRBL1JBV1RFWFQgUGFyc2luZyBhbGdvcml0aG0KICAgICAgICBjb250ZW50VHlwZSAtIFJDREFUQSBvciBSQVdURVhUCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IGNvbnRlbnRUeXBlIGluICgiUkFXVEVYVCIsICJSQ0RBVEEiKQoKICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgaWYgY29udGVudFR5cGUgPT0gIlJBV1RFWFQiOgogICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJhd3RleHRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmNkYXRhU3RhdGUKCiAgICAgICAgc2VsZi5vcmlnaW5hbFBoYXNlID0gc2VsZi5waGFzZQoKICAgICAgICBzZWxmLnBoYXNlID0gc2VsZi5waGFzZXNbInRleHQiXQoKCkBfdXRpbHMubWVtb2l6ZQpkZWYgZ2V0UGhhc2VzKGRlYnVnKToKICAgIGRlZiBsb2coZnVuY3Rpb24pOgogICAgICAgICIiIkxvZ2dlciB0aGF0IHJlY29yZHMgd2hpY2ggcGhhc2UgcHJvY2Vzc2VzIGVhY2ggdG9rZW4iIiIKICAgICAgICB0eXBlX25hbWVzID0gZGljdCgodmFsdWUsIGtleSkgZm9yIGtleSwgdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblR5cGVzLml0ZW1zKCkpCgogICAgICAgIGRlZiB3cmFwcGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGlmIGZ1bmN0aW9uLl9fbmFtZV9fLnN0YXJ0c3dpdGgoInByb2Nlc3MiKSBhbmQgbGVuKGFyZ3MpID4gMDoKICAgICAgICAgICAgICAgIHRva2VuID0gYXJnc1swXQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGluZm8gPSB7InR5cGUiOiB0eXBlX25hbWVzW3Rva2VuWyd0eXBlJ11dfQogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBpZiB0b2tlblsndHlwZSddIGluIHRhZ1Rva2VuVHlwZXM6CiAgICAgICAgICAgICAgICAgICAgaW5mb1sibmFtZSJdID0gdG9rZW5bJ25hbWUnXQoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmxvZy5hcHBlbmQoKHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZS5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiB3cmFwcGVkCgogICAgZGVmIGdldE1ldGFjbGFzcyh1c2VfbWV0YWNsYXNzLCBtZXRhY2xhc3NfZnVuYyk6CiAgICAgICAgaWYgdXNlX21ldGFjbGFzczoKICAgICAgICAgICAgcmV0dXJuIG1ldGhvZF9kZWNvcmF0b3JfbWV0YWNsYXNzKG1ldGFjbGFzc19mdW5jKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0eXBlCgogICAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgIGNsYXNzIFBoYXNlKHdpdGhfbWV0YWNsYXNzKGdldE1ldGFjbGFzcyhkZWJ1ZywgbG9nKSkpOgogICAgICAgICIiIkJhc2UgY2xhc3MgZm9yIGhlbHBlciBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGVhY2ggcGhhc2Ugb2YgcHJvY2Vzc2luZwogICAgICAgICIiIgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIgPSBwYXJzZXIKICAgICAgICAgICAgc2VsZi50cmVlID0gdHJlZQoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIEZvciBtb3N0IHBoYXNlcyB0aGUgZm9sbG93aW5nIGlzIGNvcnJlY3QuIFdoZXJlIGl0J3Mgbm90IGl0IHdpbGwgYmUKICAgICAgICAgICAgIyBvdmVycmlkZGVuLgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0pCgogICAgICAgIGRlZiBwcm9jZXNzRG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZG9jdHlwZSIpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXJ0VGFnSGFuZGxlclt0b2tlblsibmFtZSJdXSh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlci5maXJzdFN0YXJ0VGFnIGFuZCB0b2tlblsibmFtZSJdID09ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoIm5vbi1odG1sLXJvb3QiKQogICAgICAgICAgICAjIFhYWCBOZWVkIGEgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlIGZpcnN0IHN0YXJ0IHRhZyB0b2tlbiBlbWl0dGVkIGlzCiAgICAgICAgICAgICMgdGhpcyB0b2tlbi4uLiBJZiBpdCdzIG5vdCwgaW52b2tlIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKS4KICAgICAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF0uYXR0cmlidXRlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdLmF0dHJpYnV0ZXNbYXR0cl0gPSB2YWx1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5maXJzdFN0YXJ0VGFnID0gRmFsc2UKCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5lbmRUYWdIYW5kbGVyW3Rva2VuWyJuYW1lIl1dKHRva2VuKQoKICAgIGNsYXNzIEluaXRpYWxQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUuZG9jdW1lbnQpCgogICAgICAgIGRlZiBwcm9jZXNzRG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICAgICAgc3lzdGVtSWQgPSB0b2tlblsic3lzdGVtSWQiXQogICAgICAgICAgICBjb3JyZWN0ID0gdG9rZW5bImNvcnJlY3QiXQoKICAgICAgICAgICAgaWYgKG5hbWUgIT0gImh0bWwiIG9yIHB1YmxpY0lkIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgaXMgbm90IE5vbmUgYW5kIHN5c3RlbUlkICE9ICJhYm91dDpsZWdhY3ktY29tcGF0Iik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmtub3duLWRvY3R5cGUiKQoKICAgICAgICAgICAgaWYgcHVibGljSWQgaXMgTm9uZToKICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gIiIKCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnREb2N0eXBlKHRva2VuKQoKICAgICAgICAgICAgaWYgcHVibGljSWQgIT0gIiI6CiAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IHB1YmxpY0lkLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQoKICAgICAgICAgICAgaWYgKG5vdCBjb3JyZWN0IG9yIHRva2VuWyJuYW1lIl0gIT0gImh0bWwiIG9yCiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgKCIrLy9zaWxtYXJpbC8vZHRkIGh0bWwgcHJvIHYwcjExIDE5OTcwMTAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2FkdmFzb2Z0IGx0ZC8vZHRkIGh0bWwgMy4wIGFzd2VkaXQgKyBleHRlbnNpb25zLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2FzLy9kdGQgaHRtbCAzLjAgYXN3ZWRpdCArIGV4dGVuc2lvbnMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjFlLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLjIgZmluYWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy4yLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWV0cml1cy8vZHRkIG1ldHJpdXMgcHJlc2VudGF0aW9uYWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIGh0bWwgc3RyaWN0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCB0YWJsZXMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIGh0bWwgc3RyaWN0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCB0YWJsZXMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbmV0c2NhcGUgY29tbS4gY29ycC4vL2R0ZCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgc3RyaWN0IGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIDIuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgZXh0ZW5kZWQgMS4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCBleHRlbmRlZCByZWxheGVkIDEuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zb2Z0cXVhZCBzb2Z0d2FyZS8vZHRkIGhvdG1ldGFsIHBybyA2LjA6OjE5OTkwNjAxOjpleHRlbnNpb25zIHRvIGh0bWwgNC4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NvZnRxdWFkLy9kdGQgaG90bWV0YWwgcHJvIDQuMDo6MTk5NzEwMTA6OmV4dGVuc2lvbnMgdG8gaHRtbCA0LjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3B5Z2xhc3MvL2R0ZCBodG1sIDIuMCBleHRlbmRlZC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zcS8vZHRkIGh0bWwgMi4wIGhvdG1ldGFsICsgZXh0ZW5zaW9ucy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zdW4gbWljcm9zeXN0ZW1zIGNvcnAuLy9kdGQgaG90amF2YSBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3N1biBtaWNyb3N5c3RlbXMgY29ycC4vL2R0ZCBob3RqYXZhIHN0cmljdCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgMyAxOTk1LTAzLTI0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgMy4yIGRyYWZ0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgMy4yIGZpbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgMy4yLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgMy4ycyBkcmFmdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMCBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCBleHBlcmltZW50YWwgMTk5NjA3MTIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCBleHBlcmltZW50YWwgOTcwNDIxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIHczIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNvLy9kdGQgdzMgaHRtbCAzLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vd2VidGVjaHMvL2R0ZCBtb3ppbGxhIGh0bWwgMi4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3dlYnRlY2hzLy9kdGQgbW96aWxsYSBodG1sLy8iKSkgb3IKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCBpbiAoIi0vL3czby8vZHRkIHczIGh0bWwgc3RyaWN0IDMuMC8vZW4vLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItL3czYy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsL2VuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWwiKSBvcgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICgiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLyIpKSBhbmQKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBpcyBOb25lIG9yCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgYW5kIHN5c3RlbUlkLmxvd2VyKCkgPT0gImh0dHA6Ly93d3cuaWJtLmNvbS9kYXRhL2R0ZC92MTEvaWJteGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgPSAicXVpcmtzIgogICAgICAgICAgICBlbGlmIChwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICgiLS8vdzNjLy9kdGQgeGh0bWwgMS4wIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgeGh0bWwgMS4wIHRyYW5zaXRpb25hbC8vIikpIG9yCiAgICAgICAgICAgICAgICAgIHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAoIi0vL3czYy8vZHRkIGh0bWwgNC4wMSBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIHRyYW5zaXRpb25hbC8vIikpIGFuZAogICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5jb21wYXRNb2RlID0gImxpbWl0ZWQgcXVpcmtzIgoKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImJlZm9yZUh0bWwiXQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5jb21wYXRNb2RlID0gInF1aXJrcyIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImJlZm9yZUh0bWwiXQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtY2hhcnMiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LXN0YXJ0LXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWVvZiIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBjbGFzcyBCZWZvcmVIdG1sUGhhc2UoUGhhc2UpOgogICAgICAgICMgaGVscGVyIG1ldGhvZHMKICAgICAgICBkZWYgaW5zZXJ0SHRtbEVsZW1lbnQoc2VsZik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRSb290KGltcGxpZWRUYWdUb2tlbigiaHRtbCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYmVmb3JlSGVhZCJdCgogICAgICAgICMgb3RoZXIKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUuZG9jdW1lbnQpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdID09ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZpcnN0U3RhcnRUYWcgPSBUcnVlCiAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdIG5vdCBpbiAoImhlYWQiLCAiYm9keSIsICJodG1sIiwgImJyIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYmVmb3JlLWh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgQmVmb3JlSGVhZFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLnN0YXJ0VGFnSGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgiaGVhZCIsICJib2R5IiwgImh0bWwiLCAiYnIiKSwgc2VsZi5lbmRUYWdJbXBseUhlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0hlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmhlYWRQb2ludGVyID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSW1wbHlIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLWFmdGVyLWltcGxpZWQtcm9vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgSW5IZWFkUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgidGl0bGUiLCBzZWxmLnN0YXJ0VGFnVGl0bGUpLAogICAgICAgICAgICAgICAgKCgibm9mcmFtZXMiLCAic3R5bGUiKSwgc2VsZi5zdGFydFRhZ05vRnJhbWVzU3R5bGUpLAogICAgICAgICAgICAgICAgKCJub3NjcmlwdCIsIHNlbGYuc3RhcnRUYWdOb3NjcmlwdCksCiAgICAgICAgICAgICAgICAoInNjcmlwdCIsIHNlbGYuc3RhcnRUYWdTY3JpcHQpLAogICAgICAgICAgICAgICAgKCgiYmFzZSIsICJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImNvbW1hbmQiLCAibGluayIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdCYXNlTGlua0NvbW1hbmQpLAogICAgICAgICAgICAgICAgKCJtZXRhIiwgc2VsZi5zdGFydFRhZ01ldGEpLAogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5zdGFydFRhZ0hlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuZW5kVGFnSGVhZCksCiAgICAgICAgICAgICAgICAoKCJiciIsICJodG1sIiwgImJvZHkiKSwgc2VsZi5lbmRUYWdIdG1sQm9keUJyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyB0aGUgcmVhbCB0aGluZwogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0hlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ0d28taGVhZHMtYXJlLW5vdC1iZXR0ZXItdGhhbi1vbmUiKQoKICAgICAgICBkZWYgc3RhcnRUYWdCYXNlTGlua0NvbW1hbmQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnTWV0YShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICAgICAgYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0cmVhbS5jaGFyRW5jb2RpbmdbMV0gPT0gInRlbnRhdGl2ZSI6CiAgICAgICAgICAgICAgICBpZiAiY2hhcnNldCIgaW4gYXR0cmlidXRlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RyZWFtLmNoYW5nZUVuY29kaW5nKGF0dHJpYnV0ZXNbImNoYXJzZXQiXSkKICAgICAgICAgICAgICAgIGVsaWYgKCJjb250ZW50IiBpbiBhdHRyaWJ1dGVzIGFuZAogICAgICAgICAgICAgICAgICAgICAgImh0dHAtZXF1aXYiIGluIGF0dHJpYnV0ZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWyJodHRwLWVxdWl2Il0ubG93ZXIoKSA9PSAiY29udGVudC10eXBlIik6CiAgICAgICAgICAgICAgICAgICAgIyBFbmNvZGluZyBpdCBhcyBVVEYtOCBoZXJlIGlzIGEgaGFjaywgYXMgcmVhbGx5IHdlIHNob3VsZCBwYXNzCiAgICAgICAgICAgICAgICAgICAgIyB0aGUgYWJzdHJhY3QgVW5pY29kZSBzdHJpbmcsIGFuZCBqdXN0IHVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAjIENvbnRlbnRBdHRyUGFyc2VyIG9uIHRoYXQsIGJ1dCB1c2luZyBVVEYtOCBhbGxvd3MgYWxsIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgIyB0byBiZSBlbmNvZGVkIGFuZCBhcyBhIEFTQ0lJLXN1cGVyc2V0IHdvcmtzLgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBfaW5wdXRzdHJlYW0uRW5jb2RpbmdCeXRlcyhhdHRyaWJ1dGVzWyJjb250ZW50Il0uZW5jb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IF9pbnB1dHN0cmVhbS5Db250ZW50QXR0clBhcnNlcihkYXRhKQogICAgICAgICAgICAgICAgICAgIGNvZGVjID0gcGFyc2VyLnBhcnNlKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RyZWFtLmNoYW5nZUVuY29kaW5nKGNvZGVjKQoKICAgICAgICBkZWYgc3RhcnRUYWdUaXRsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJDREFUQSIpCgogICAgICAgIGRlZiBzdGFydFRhZ05vRnJhbWVzU3R5bGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIE5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW1wbGVtZW50IHRoZSBzY3JpcHRpbmctZGlzYWJsZWQgY2FzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQVdURVhUIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5zY3JpcHRpbmc6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQVdURVhUIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZE5vc2NyaXB0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZSA9IHNlbGYucGFyc2VyLnRva2VuaXplci5zY3JpcHREYXRhU3RhdGUKICAgICAgICAgICAgc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJ0ZXh0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBhc3NlcnQgbm9kZS5uYW1lID09ICJoZWFkIiwgIkV4cGVjdGVkIGhlYWQgZ290ICVzIiAlIG5vZGUubmFtZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJIZWFkIl0KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWxCb2R5QnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgc2VsZi5lbmRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIpKQoKICAgIGNsYXNzIEluSGVhZE5vc2NyaXB0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImJhc2Vmb250IiwgImJnc291bmQiLCAibGluayIsICJtZXRhIiwgIm5vZnJhbWVzIiwgInN0eWxlIiksIHNlbGYuc3RhcnRUYWdCYXNlTGlua0NvbW1hbmQpLAogICAgICAgICAgICAgICAgKCgiaGVhZCIsICJub3NjcmlwdCIpLCBzZWxmLnN0YXJ0VGFnSGVhZE5vc2NyaXB0KSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJub3NjcmlwdCIsIHNlbGYuZW5kVGFnTm9zY3JpcHQpLAogICAgICAgICAgICAgICAgKCJiciIsIHNlbGYuZW5kVGFnQnIpLAogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi1oZWFkLW5vc2NyaXB0IikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzQ29tbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiY2hhci1pbi1oZWFkLW5vc2NyaXB0IikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCYXNlTGlua0NvbW1hbmQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0hlYWROb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbmhlYWQtbm9zY3JpcHQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdOb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBhc3NlcnQgbm9kZS5uYW1lID09ICJub3NjcmlwdCIsICJFeHBlY3RlZCBub3NjcmlwdCBnb3QgJXMiICUgbm9kZS5uYW1lCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXQoKICAgICAgICBkZWYgZW5kVGFnQnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWluaGVhZC1ub3NjcmlwdC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgICMgQ2FsbGVyIG11c3QgcmFpc2UgcGFyc2UgZXJyb3IgZmlyc3QhCiAgICAgICAgICAgIHNlbGYuZW5kVGFnTm9zY3JpcHQoaW1wbGllZFRhZ1Rva2VuKCJub3NjcmlwdCIpKQoKICAgIGNsYXNzIEFmdGVySGVhZFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImJvZHkiLCBzZWxmLnN0YXJ0VGFnQm9keSksCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5zdGFydFRhZ0ZyYW1lc2V0KSwKICAgICAgICAgICAgICAgICgoImJhc2UiLCAiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJsaW5rIiwgIm1ldGEiLCAibm9mcmFtZXMiLCAic2NyaXB0IiwKICAgICAgICAgICAgICAgICAgInN0eWxlIiwgInRpdGxlIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0Zyb21IZWFkKSwKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuc3RhcnRUYWdIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsoKCJib2R5IiwgImh0bWwiLCAiYnIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0h0bWxCb2R5QnIpXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0JvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQoKICAgICAgICBkZWYgc3RhcnRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5GcmFtZXNldCJdCgogICAgICAgIGRlZiBzdGFydFRhZ0Zyb21IZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctb3V0LW9mLW15LWhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmFwcGVuZChzZWxmLnRyZWUuaGVhZFBvaW50ZXIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lID09ICJoZWFkIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShub2RlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRlZiBzdGFydFRhZ0hlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdIdG1sQm9keUJyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KGltcGxpZWRUYWdUb2tlbigiYm9keSIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IFRydWUKCiAgICBjbGFzcyBJbkJvZHlQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNwYXJzaW5nLW1haW4taW5ib2R5CiAgICAgICAgIyB0aGUgcmVhbGx5LXJlYWxseS1yZWFsbHktdmVyeSBjcmF6eSBtb2RlCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgICMgU2V0IHRoaXMgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcgogICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNOb25QcmUKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiYmFzZSIsICJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImNvbW1hbmQiLCAibGluayIsICJtZXRhIiwKICAgICAgICAgICAgICAgICAgInNjcmlwdCIsICJzdHlsZSIsICJ0aXRsZSIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdQcm9jZXNzSW5IZWFkKSwKICAgICAgICAgICAgICAgICgiYm9keSIsIHNlbGYuc3RhcnRUYWdCb2R5KSwKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLnN0YXJ0VGFnRnJhbWVzZXQpLAogICAgICAgICAgICAgICAgKCgiYWRkcmVzcyIsICJhcnRpY2xlIiwgImFzaWRlIiwgImJsb2NrcXVvdGUiLCAiY2VudGVyIiwgImRldGFpbHMiLAogICAgICAgICAgICAgICAgICAiZGlyIiwgImRpdiIsICJkbCIsICJmaWVsZHNldCIsICJmaWdjYXB0aW9uIiwgImZpZ3VyZSIsCiAgICAgICAgICAgICAgICAgICJmb290ZXIiLCAiaGVhZGVyIiwgImhncm91cCIsICJtYWluIiwgIm1lbnUiLCAibmF2IiwgIm9sIiwgInAiLAogICAgICAgICAgICAgICAgICAic2VjdGlvbiIsICJzdW1tYXJ5IiwgInVsIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0Nsb3NlUCksCiAgICAgICAgICAgICAgICAoaGVhZGluZ0VsZW1lbnRzLCBzZWxmLnN0YXJ0VGFnSGVhZGluZyksCiAgICAgICAgICAgICAgICAoKCJwcmUiLCAibGlzdGluZyIpLCBzZWxmLnN0YXJ0VGFnUHJlTGlzdGluZyksCiAgICAgICAgICAgICAgICAoImZvcm0iLCBzZWxmLnN0YXJ0VGFnRm9ybSksCiAgICAgICAgICAgICAgICAoKCJsaSIsICJkZCIsICJkdCIpLCBzZWxmLnN0YXJ0VGFnTGlzdEl0ZW0pLAogICAgICAgICAgICAgICAgKCJwbGFpbnRleHQiLCBzZWxmLnN0YXJ0VGFnUGxhaW50ZXh0KSwKICAgICAgICAgICAgICAgICgiYSIsIHNlbGYuc3RhcnRUYWdBKSwKICAgICAgICAgICAgICAgICgoImIiLCAiYmlnIiwgImNvZGUiLCAiZW0iLCAiZm9udCIsICJpIiwgInMiLCAic21hbGwiLCAic3RyaWtlIiwKICAgICAgICAgICAgICAgICAgInN0cm9uZyIsICJ0dCIsICJ1IiksIHNlbGYuc3RhcnRUYWdGb3JtYXR0aW5nKSwKICAgICAgICAgICAgICAgICgibm9iciIsIHNlbGYuc3RhcnRUYWdOb2JyKSwKICAgICAgICAgICAgICAgICgiYnV0dG9uIiwgc2VsZi5zdGFydFRhZ0J1dHRvbiksCiAgICAgICAgICAgICAgICAoKCJhcHBsZXQiLCAibWFycXVlZSIsICJvYmplY3QiKSwgc2VsZi5zdGFydFRhZ0FwcGxldE1hcnF1ZWVPYmplY3QpLAogICAgICAgICAgICAgICAgKCJ4bXAiLCBzZWxmLnN0YXJ0VGFnWG1wKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLnN0YXJ0VGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYXJlYSIsICJiciIsICJlbWJlZCIsICJpbWciLCAia2V5Z2VuIiwgIndiciIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdWb2lkRm9ybWF0dGluZyksCiAgICAgICAgICAgICAgICAoKCJwYXJhbSIsICJzb3VyY2UiLCAidHJhY2siKSwgc2VsZi5zdGFydFRhZ1BhcmFtU291cmNlKSwKICAgICAgICAgICAgICAgICgiaW5wdXQiLCBzZWxmLnN0YXJ0VGFnSW5wdXQpLAogICAgICAgICAgICAgICAgKCJociIsIHNlbGYuc3RhcnRUYWdIciksCiAgICAgICAgICAgICAgICAoImltYWdlIiwgc2VsZi5zdGFydFRhZ0ltYWdlKSwKICAgICAgICAgICAgICAgICgiaXNpbmRleCIsIHNlbGYuc3RhcnRUYWdJc0luZGV4KSwKICAgICAgICAgICAgICAgICgidGV4dGFyZWEiLCBzZWxmLnN0YXJ0VGFnVGV4dGFyZWEpLAogICAgICAgICAgICAgICAgKCJpZnJhbWUiLCBzZWxmLnN0YXJ0VGFnSUZyYW1lKSwKICAgICAgICAgICAgICAgICgibm9zY3JpcHQiLCBzZWxmLnN0YXJ0VGFnTm9zY3JpcHQpLAogICAgICAgICAgICAgICAgKCgibm9lbWJlZCIsICJub2ZyYW1lcyIpLCBzZWxmLnN0YXJ0VGFnUmF3dGV4dCksCiAgICAgICAgICAgICAgICAoInNlbGVjdCIsIHNlbGYuc3RhcnRUYWdTZWxlY3QpLAogICAgICAgICAgICAgICAgKCgicnAiLCAicnQiKSwgc2VsZi5zdGFydFRhZ1JwUnQpLAogICAgICAgICAgICAgICAgKCgib3B0aW9uIiwgIm9wdGdyb3VwIiksIHNlbGYuc3RhcnRUYWdPcHQpLAogICAgICAgICAgICAgICAgKCgibWF0aCIpLCBzZWxmLnN0YXJ0VGFnTWF0aCksCiAgICAgICAgICAgICAgICAoKCJzdmciKSwgc2VsZi5zdGFydFRhZ1N2ZyksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJmcmFtZSIsICJoZWFkIiwKICAgICAgICAgICAgICAgICAgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwgInRoZWFkIiwKICAgICAgICAgICAgICAgICAgInRyIiksIHNlbGYuc3RhcnRUYWdNaXNwbGFjZWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiYm9keSIsIHNlbGYuZW5kVGFnQm9keSksCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLmVuZFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiYWRkcmVzcyIsICJhcnRpY2xlIiwgImFzaWRlIiwgImJsb2NrcXVvdGUiLCAiYnV0dG9uIiwgImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICJkZXRhaWxzIiwgImRpYWxvZyIsICJkaXIiLCAiZGl2IiwgImRsIiwgImZpZWxkc2V0IiwgImZpZ2NhcHRpb24iLCAiZmlndXJlIiwKICAgICAgICAgICAgICAgICAgImZvb3RlciIsICJoZWFkZXIiLCAiaGdyb3VwIiwgImxpc3RpbmciLCAibWFpbiIsICJtZW51IiwgIm5hdiIsICJvbCIsICJwcmUiLAogICAgICAgICAgICAgICAgICAic2VjdGlvbiIsICJzdW1tYXJ5IiwgInVsIiksIHNlbGYuZW5kVGFnQmxvY2spLAogICAgICAgICAgICAgICAgKCJmb3JtIiwgc2VsZi5lbmRUYWdGb3JtKSwKICAgICAgICAgICAgICAgICgicCIsIHNlbGYuZW5kVGFnUCksCiAgICAgICAgICAgICAgICAoKCJkZCIsICJkdCIsICJsaSIpLCBzZWxmLmVuZFRhZ0xpc3RJdGVtKSwKICAgICAgICAgICAgICAgIChoZWFkaW5nRWxlbWVudHMsIHNlbGYuZW5kVGFnSGVhZGluZyksCiAgICAgICAgICAgICAgICAoKCJhIiwgImIiLCAiYmlnIiwgImNvZGUiLCAiZW0iLCAiZm9udCIsICJpIiwgIm5vYnIiLCAicyIsICJzbWFsbCIsCiAgICAgICAgICAgICAgICAgICJzdHJpa2UiLCAic3Ryb25nIiwgInR0IiwgInUiKSwgc2VsZi5lbmRUYWdGb3JtYXR0aW5nKSwKICAgICAgICAgICAgICAgICgoImFwcGxldCIsICJtYXJxdWVlIiwgIm9iamVjdCIpLCBzZWxmLmVuZFRhZ0FwcGxldE1hcnF1ZWVPYmplY3QpLAogICAgICAgICAgICAgICAgKCJiciIsIHNlbGYuZW5kVGFnQnIpLAogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIGlzTWF0Y2hpbmdGb3JtYXR0aW5nRWxlbWVudChzZWxmLCBub2RlMSwgbm9kZTIpOgogICAgICAgICAgICByZXR1cm4gKG5vZGUxLm5hbWUgPT0gbm9kZTIubmFtZSBhbmQKICAgICAgICAgICAgICAgICAgICBub2RlMS5uYW1lc3BhY2UgPT0gbm9kZTIubmFtZXNwYWNlIGFuZAogICAgICAgICAgICAgICAgICAgIG5vZGUxLmF0dHJpYnV0ZXMgPT0gbm9kZTIuYXR0cmlidXRlcykKCiAgICAgICAgIyBoZWxwZXIKICAgICAgICBkZWYgYWRkRm9ybWF0dGluZ0VsZW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCgogICAgICAgICAgICBtYXRjaGluZ0VsZW1lbnRzID0gW10KICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUgaXMgTWFya2VyOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuaXNNYXRjaGluZ0Zvcm1hdHRpbmdFbGVtZW50KG5vZGUsIGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nRWxlbWVudHMuYXBwZW5kKG5vZGUpCgogICAgICAgICAgICBhc3NlcnQgbGVuKG1hdGNoaW5nRWxlbWVudHMpIDw9IDMKICAgICAgICAgICAgaWYgbGVuKG1hdGNoaW5nRWxlbWVudHMpID09IDM6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShtYXRjaGluZ0VsZW1lbnRzWy0xXSkKICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKCiAgICAgICAgIyB0aGUgcmVhbCBkZWFsCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGFsbG93ZWRfZWxlbWVudHMgPSBmcm96ZW5zZXQoKCJkZCIsICJkdCIsICJsaSIsICJwIiwgInRib2R5IiwgInRkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRmb290IiwgInRoIiwgInRoZWFkIiwgInRyIiwgImJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbCIpKQogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIG5vdCBpbiBhbGxvd2VkX2VsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIikKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc0Ryb3BOZXdsaW5lKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBTb21ldGltZXMgKHN0YXJ0IG9mIDxwcmU+LCA8bGlzdGluZz4sIGFuZCA8dGV4dGFyZWE+IGJsb2Nrcykgd2UKICAgICAgICAgICAgIyB3YW50IHRvIGRyb3AgbGVhZGluZyBuZXdsaW5lcwogICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNOb25QcmUKICAgICAgICAgICAgaWYgKGRhdGEuc3RhcnRzd2l0aCgiXG4iKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgaW4gKCJwcmUiLCAibGlzdGluZyIsICJ0ZXh0YXJlYSIpIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5oYXNDb250ZW50KCkpOgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbMTpdCiAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQoZGF0YSkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgICMgVGhlIHRva2VuaXplciBzaG91bGQgYWx3YXlzIGVtaXQgbnVsbCBvbiBpdHMgb3duCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKICAgICAgICAgICAgIyBUaGlzIG11c3QgYmUgYmFkIGZvciBwZXJmb3JtYW5jZQogICAgICAgICAgICBpZiAoc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyBhbmQKICAgICAgICAgICAgICAgIGFueShbY2hhciBub3QgaW4gc3BhY2VDaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAgICAgIGZvciBjaGFyIGluIHRva2VuWyJkYXRhIl1dKSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnNOb25QcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgc3RhcnRUYWdQcm9jZXNzSW5IZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCb2R5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiAiYm9keSJ9KQogICAgICAgICAgICBpZiAobGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpID09IDEgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLm5hbWUgIT0gImJvZHkiKToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLmF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0uYXR0cmlidXRlc1thdHRyXSA9IHZhbHVlCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiAiZnJhbWVzZXQifSkKICAgICAgICAgICAgaWYgKGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSA9PSAxIG9yIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ubmFtZSAhPSAiYm9keSIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICBlbGlmIG5vdCBzZWxmLnBhcnNlci5mcmFtZXNldE9LOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5wYXJlbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5wYXJlbnQucmVtb3ZlQ2hpbGQoc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXSkKICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluRnJhbWVzZXQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdDbG9zZVAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1ByZUxpc3Rpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNEcm9wTmV3bGluZQoKICAgICAgICBkZWYgc3RhcnRUYWdGb3JtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmZvcm1Qb2ludGVyOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiAiZm9ybSJ9KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQoKICAgICAgICBkZWYgc3RhcnRUYWdMaXN0SXRlbShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICAgICAgc3RvcE5hbWVzTWFwID0geyJsaSI6IFsibGkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdCI6IFsiZHQiLCAiZGQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZCI6IFsiZHQiLCAiZGQiXX0KICAgICAgICAgICAgc3RvcE5hbWVzID0gc3RvcE5hbWVzTWFwW3Rva2VuWyJuYW1lIl1dCiAgICAgICAgICAgIGZvciBub2RlIGluIHJldmVyc2VkKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGluIHN0b3BOYW1lczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKAogICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4obm9kZS5uYW1lLCAiRW5kVGFnIikpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIChub2RlLm5hbWVUdXBsZSBpbiBzcGVjaWFsRWxlbWVudHMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSBub3QgaW4gKCJhZGRyZXNzIiwgImRpdiIsICJwIikpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoCiAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKCJwIiwgIkVuZFRhZyIpKQoKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1BsYWludGV4dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlID0gc2VsZi5wYXJzZXIudG9rZW5pemVyLnBsYWludGV4dFN0YXRlCgogICAgICAgIGRlZiBzdGFydFRhZ0hlYWRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGFmZUFFbGVtZW50ID0gc2VsZi50cmVlLmVsZW1lbnRJbkFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygiYSIpCiAgICAgICAgICAgIGlmIGFmZUFFbGVtZW50OgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAiYSIsICJlbmROYW1lIjogImEifSkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnRm9ybWF0dGluZyhpbXBsaWVkVGFnVG9rZW4oImEiKSkKICAgICAgICAgICAgICAgIGlmIGFmZUFFbGVtZW50IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUoYWZlQUVsZW1lbnQpCiAgICAgICAgICAgICAgICBpZiBhZmVBRWxlbWVudCBpbiBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGFmZUFFbGVtZW50KQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLmFkZEZvcm1hdHRpbmdFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdGb3JtYXR0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5hZGRGb3JtYXR0aW5nRWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9icihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgibm9iciIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAibm9iciIsICJlbmROYW1lIjogIm5vYnIifSkKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oIm5vYnIiKSkKICAgICAgICAgICAgICAgICMgWFhYIE5lZWQgdGVzdHMgdGhhdCB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYuYWRkRm9ybWF0dGluZ0VsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0J1dHRvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJidXR0b24iLCAiZW5kTmFtZSI6ICJidXR0b24ifSkKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImJ1dHRvbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnQXBwbGV0TWFycXVlZU9iamVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChNYXJrZXIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdYbXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgIT0gInF1aXJrcyI6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQoKICAgICAgICBkZWYgc3RhcnRUYWdWb2lkRm9ybWF0dGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW5wdXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBmcmFtZXNldE9LID0gc2VsZi5wYXJzZXIuZnJhbWVzZXRPSwogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVm9pZEZvcm1hdHRpbmcodG9rZW4pCiAgICAgICAgICAgIGlmICgidHlwZSIgaW4gdG9rZW5bImRhdGEiXSBhbmQKICAgICAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdWyJ0eXBlIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpID09ICJoaWRkZW4iKToKICAgICAgICAgICAgICAgICMgaW5wdXQgdHlwZT1oaWRkZW4gZG9lc24ndCBjaGFuZ2UgZnJhbWVzZXRPSwogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IGZyYW1lc2V0T0sKCiAgICAgICAgZGVmIHN0YXJ0VGFnUGFyYW1Tb3VyY2Uoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdJbWFnZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgTm8gcmVhbGx5Li4uCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLXRyZWF0ZWQtYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsib3JpZ2luYWxOYW1lIjogImltYWdlIiwgIm5ld05hbWUiOiAiaW1nIn0pCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaW1nIiwgIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9dG9rZW5bImRhdGEiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZDbG9zaW5nPXRva2VuWyJzZWxmQ2xvc2luZyJdKSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnSXNJbmRleChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImRlcHJlY2F0ZWQtdGFnIiwgeyJuYW1lIjogImlzaW5kZXgifSkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmZvcm1Qb2ludGVyOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGZvcm1fYXR0cnMgPSB7fQogICAgICAgICAgICBpZiAiYWN0aW9uIiBpbiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgZm9ybV9hdHRyc1siYWN0aW9uIl0gPSB0b2tlblsiZGF0YSJdWyJhY3Rpb24iXQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImZvcm0iLCAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcz1mb3JtX2F0dHJzKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJociIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImxhYmVsIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgICMgWFhYIExvY2FsaXphdGlvbiAuLi4KICAgICAgICAgICAgaWYgInByb21wdCIgaW4gdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgIHByb21wdCA9IHRva2VuWyJkYXRhIl1bInByb21wdCJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcm9tcHQgPSAiVGhpcyBpcyBhIHNlYXJjaGFibGUgaW5kZXguIEVudGVyIHNlYXJjaCBrZXl3b3JkczogIgogICAgICAgICAgICBzZWxmLnByb2Nlc3NDaGFyYWN0ZXJzKAogICAgICAgICAgICAgICAgeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IHByb21wdH0pCiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdLmNvcHkoKQogICAgICAgICAgICBpZiAiYWN0aW9uIiBpbiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgZGVsIGF0dHJpYnV0ZXNbImFjdGlvbiJdCiAgICAgICAgICAgIGlmICJwcm9tcHQiIGluIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBkZWwgYXR0cmlidXRlc1sicHJvbXB0Il0KICAgICAgICAgICAgYXR0cmlidXRlc1sibmFtZSJdID0gImlzaW5kZXgiCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaW5wdXQiLCAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcz1hdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkNsb3Npbmc9dG9rZW5bInNlbGZDbG9zaW5nIl0pKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJsYWJlbCIpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImhyIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImZvcm0iKSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGV4dGFyZWEoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlID0gc2VsZi5wYXJzZXIudG9rZW5pemVyLnJjZGF0YVN0YXRlCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc0Ryb3BOZXdsaW5lCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdJRnJhbWUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1Jhd3RleHQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ05vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuc2NyaXB0aW5nOgogICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1Jhd3RleHQodG9rZW4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnT3RoZXIodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1Jhd3RleHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAiIiJpZnJhbWUsIG5vZW1iZWQgbm9mcmFtZXMsIG5vc2NyaXB0KGlmIHNjcmlwdGluZyBlbmFibGVkKSIiIgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQVdURVhUIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3B0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJvcHRpb24iKSkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdTZWxlY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnBoYXNlIGluIChzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5DYXB0aW9uIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQ29sdW1uR3JvdXAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZUJvZHkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Sb3ciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5DZWxsIl0pOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0SW5UYWJsZSJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXQoKICAgICAgICBkZWYgc3RhcnRUYWdScFJ0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJydWJ5Iik6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJydWJ5IjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ01hdGgoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgdG9rZW5bIm5hbWVzcGFjZSJdID0gbmFtZXNwYWNlc1sibWF0aG1sIl0KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICMgTmVlZCB0byBnZXQgdGhlIHBhcnNlIGVycm9yIHJpZ2h0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdG9rZW4KICAgICAgICAgICAgIyBoYXMgYSBuYW1lc3BhY2Ugbm90IGVxdWFsIHRvIHRoZSB4bWxucyBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnU3ZnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0U1ZHQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHRva2VuWyJuYW1lc3BhY2UiXSA9IG5hbWVzcGFjZXNbInN2ZyJdCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAjIE5lZWQgdG8gZ2V0IHRoZSBwYXJzZSBlcnJvciByaWdodCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHRva2VuCiAgICAgICAgICAgICMgaGFzIGEgbmFtZXNwYWNlIG5vdCBlcXVhbCB0byB0aGUgeG1sbnMgYXR0cmlidXRlCiAgICAgICAgICAgIGlmIHRva2VuWyJzZWxmQ2xvc2luZyJdOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ01pc3BsYWNlZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICIiIiBFbGVtZW50cyB0aGF0IHNob3VsZCBiZSBjaGlsZHJlbiBvZiBvdGhlciBlbGVtZW50cyB0aGF0IGhhdmUgYQogICAgICAgICAgICBkaWZmZXJlbnQgaW5zZXJ0aW9uIG1vZGU7IGhlcmUgdGhleSBhcmUgaWdub3JlZAogICAgICAgICAgICAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiZnJhbWUiLCAiZnJhbWVzZXQiLCAiaGVhZCIsCiAgICAgICAgICAgICJvcHRpb24iLCAib3B0Z3JvdXAiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLCAidGhlYWQiLAogICAgICAgICAgICAidHIiLCAibm9zY3JpcHQiCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pZ25vcmVkIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdQKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0Nsb3NlUChpbXBsaWVkVGFnVG9rZW4oInAiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6ICJwIn0pCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIiwgIkVuZFRhZyIpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoInAiKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAicCI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogInAifSkKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gInAiOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdCb2R5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiYm9keSIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJib2R5IjoKICAgICAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMjpdOgogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSBub3QgaW4gZnJvemVuc2V0KCgiZGQiLCAiZHQiLCAibGkiLCAib3B0Z3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIiwgInAiLCAicnAiLCAicnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGJvZHkiLCAidGQiLCAidGZvb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGgiLCAidGhlYWQiLCAidHIiLCAiYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sIikpOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBzdXJlIHRoaXMgaXMgdGhlIGNvcnJlY3QgbmFtZSBmb3IgdGhlIHBhcnNlIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtb25lLWVuZC10YWctYnV0LWdvdC1hbm90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ290TmFtZSI6ICJib2R5IiwgImV4cGVjdGVkTmFtZSI6IG5vZGUubmFtZX0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckJvZHkiXQoKICAgICAgICBkZWYgZW5kVGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgV2UgcmVwZWF0IHRoZSB0ZXN0IGZvciB0aGUgYm9keSBlbmQgdGFnIHRva2VuIGJlaW5nIGlnbm9yZWQgaGVyZQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImJvZHkiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnQm9keShpbXBsaWVkVGFnVG9rZW4oImJvZHkiKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnQmxvY2soc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFB1dCB1cyBiYWNrIGluIHRoZSByaWdodCB3aGl0ZXNwYWNlIGhhbmRsaW5nIG1vZGUKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSA9PSAicHJlIjoKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZQogICAgICAgICAgICBpblNjb3BlID0gc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGlmIGluU2NvcGU6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGlmIGluU2NvcGU6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ0Zvcm0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLmZvcm1Qb2ludGVyCiAgICAgICAgICAgIHNlbGYudHJlZS5mb3JtUG9pbnRlciA9IE5vbmUKICAgICAgICAgICAgaWYgbm9kZSBpcyBOb25lIG9yIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUobm9kZSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAiZm9ybSJ9KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0gIT0gbm9kZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseS1pZ25vcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJmb3JtIn0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShub2RlKQoKICAgICAgICBkZWYgZW5kVGFnTGlzdEl0ZW0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdID09ICJsaSI6CiAgICAgICAgICAgICAgICB2YXJpYW50ID0gImxpc3QiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YXJpYW50ID0gTm9uZQogICAgICAgICAgICBpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9dmFyaWFudCk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKGV4Y2x1ZGU9dG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAiZW5kLXRhZy10b28tZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnSGVhZGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGZvciBpdGVtIGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShpdGVtKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHkiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgICAgIGZvciBpdGVtIGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShpdGVtKToKICAgICAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGl0ZW0ubmFtZSBub3QgaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRlZiBlbmRUYWdGb3JtYXR0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIiIiVGhlIG11Y2gtZmVhcmVkIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0iIiIKICAgICAgICAgICAgIyBodHRwOi8vc3ZuLndoYXR3Zy5vcmcvd2ViYXBwcy9jb21wbGV0ZS5odG1sI2Fkb3B0aW9uQWdlbmN5IHJldmlzaW9uIDc4NjcKICAgICAgICAgICAgIyBYWFggQmV0dGVyIHBhcnNlRXJyb3IgbWVzc2FnZXMgYXBwcmVjaWF0ZWQuCgogICAgICAgICAgICAjIFN0ZXAgMQogICAgICAgICAgICBvdXRlckxvb3BDb3VudGVyID0gMAoKICAgICAgICAgICAgIyBTdGVwIDIKICAgICAgICAgICAgd2hpbGUgb3V0ZXJMb29wQ291bnRlciA8IDg6CgogICAgICAgICAgICAgICAgIyBTdGVwIDMKICAgICAgICAgICAgICAgIG91dGVyTG9vcENvdW50ZXIgKz0gMQoKICAgICAgICAgICAgICAgICMgU3RlcCA0OgoKICAgICAgICAgICAgICAgICMgTGV0IHRoZSBmb3JtYXR0aW5nIGVsZW1lbnQgYmUgdGhlIGxhc3QgZWxlbWVudCBpbgogICAgICAgICAgICAgICAgIyB0aGUgbGlzdCBvZiBhY3RpdmUgZm9ybWF0dGluZyBlbGVtZW50cyB0aGF0OgogICAgICAgICAgICAgICAgIyAtIGlzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgdGhlIGxhc3Qgc2NvcGUKICAgICAgICAgICAgICAgICMgbWFya2VyIGluIHRoZSBsaXN0LCBpZiBhbnksIG9yIHRoZSBzdGFydCBvZiB0aGUgbGlzdAogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGFuZAogICAgICAgICAgICAgICAgIyAtIGhhcyB0aGUgc2FtZSB0YWcgbmFtZSBhcyB0aGUgdG9rZW4uCiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nRWxlbWVudCA9IHNlbGYudHJlZS5lbGVtZW50SW5BY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgICAgIGlmIChub3QgZm9ybWF0dGluZ0VsZW1lbnQgb3IKICAgICAgICAgICAgICAgICAgICAoZm9ybWF0dGluZ0VsZW1lbnQgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50cyBhbmQKICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShmb3JtYXR0aW5nRWxlbWVudC5uYW1lKSkpOgogICAgICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgaW5zdGVhZCBhY3QgYXMgZGVzY3JpYmVkIGluIHRoZSAiYW55IG90aGVyCiAgICAgICAgICAgICAgICAgICAgIyBlbmQgdGFnIiBlbnRyeSBiZWxvdy4KICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ090aGVyKHRva2VuKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBzdWNoIGEgbm9kZSwgYnV0IHRoYXQgbm9kZSBpcwogICAgICAgICAgICAgICAgIyBub3QgaW4gdGhlIHN0YWNrIG9mIG9wZW4gZWxlbWVudHMsIHRoZW4gdGhpcyBpcyBhCiAgICAgICAgICAgICAgICAjIHBhcnNlIGVycm9yOyByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCwgYW5kCiAgICAgICAgICAgICAgICAjIGFib3J0IHRoZXNlIHN0ZXBzLgogICAgICAgICAgICAgICAgZWxpZiBmb3JtYXR0aW5nRWxlbWVudCBub3QgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJhZG9wdGlvbi1hZ2VuY3ktMS4yIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIHN1Y2ggYSBub2RlLCBhbmQgdGhhdCBub2RlIGlzCiAgICAgICAgICAgICAgICAjIGFsc28gaW4gdGhlIHN0YWNrIG9mIG9wZW4gZWxlbWVudHMsIGJ1dCB0aGUgZWxlbWVudAogICAgICAgICAgICAgICAgIyBpcyBub3QgaW4gc2NvcGUsIHRoZW4gdGhpcyBpcyBhIHBhcnNlIGVycm9yOyBpZ25vcmUKICAgICAgICAgICAgICAgICMgdGhlIHRva2VuLCBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCiAgICAgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoZm9ybWF0dGluZ0VsZW1lbnQubmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiYWRvcHRpb24tYWdlbmN5LTQuNCIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCB0aGVyZSBpcyBhIGZvcm1hdHRpbmcgZWxlbWVudCBhbmQgdGhhdAogICAgICAgICAgICAgICAgIyBlbGVtZW50IGlzIGluIHRoZSBzdGFjayBhbmQgaXMgaW4gc2NvcGUuIElmIHRoZQogICAgICAgICAgICAgICAgIyBlbGVtZW50IGlzIG5vdCB0aGUgY3VycmVudCBub2RlLCB0aGlzIGlzIGEgcGFyc2UKICAgICAgICAgICAgICAgICMgZXJyb3IuIEluIGFueSBjYXNlLCBwcm9jZWVkIHdpdGggdGhlIGFsZ29yaXRobSBhcwogICAgICAgICAgICAgICAgIyB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgc3RlcHMuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIGZvcm1hdHRpbmdFbGVtZW50ICE9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJhZG9wdGlvbi1hZ2VuY3ktMS4zIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICAgICAgIyBTdGVwIDU6CgogICAgICAgICAgICAgICAgIyBMZXQgdGhlIGZ1cnRoZXN0IGJsb2NrIGJlIHRoZSB0b3Btb3N0IG5vZGUgaW4gdGhlCiAgICAgICAgICAgICAgICAjIHN0YWNrIG9mIG9wZW4gZWxlbWVudHMgdGhhdCBpcyBsb3dlciBpbiB0aGUgc3RhY2sKICAgICAgICAgICAgICAgICMgdGhhbiB0aGUgZm9ybWF0dGluZyBlbGVtZW50LCBhbmQgaXMgYW4gZWxlbWVudCBpbgogICAgICAgICAgICAgICAgIyB0aGUgc3BlY2lhbCBjYXRlZ29yeS4gVGhlcmUgbWlnaHQgbm90IGJlIG9uZS4KICAgICAgICAgICAgICAgIGFmZUluZGV4ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sgPSBOb25lCiAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW2FmZUluZGV4Ol06CiAgICAgICAgICAgICAgICAgICAgaWYgZWxlbWVudC5uYW1lVHVwbGUgaW4gc3BlY2lhbEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrID0gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgICMgU3RlcCA2OgoKICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZnVydGhlc3QgYmxvY2ssIHRoZW4gdGhlIFVBIG11c3QKICAgICAgICAgICAgICAgICMgZmlyc3QgcG9wIGFsbCB0aGUgbm9kZXMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjawogICAgICAgICAgICAgICAgIyBvZiBvcGVuIGVsZW1lbnRzLCBmcm9tIHRoZSBjdXJyZW50IG5vZGUgdXAgdG8gYW5kCiAgICAgICAgICAgICAgICAjIGluY2x1ZGluZyB0aGUgZm9ybWF0dGluZyBlbGVtZW50LCB0aGVuIHJlbW92ZSB0aGUKICAgICAgICAgICAgICAgICMgZm9ybWF0dGluZyBlbGVtZW50IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRpbmcgZWxlbWVudHMsIGFuZCBmaW5hbGx5IGFib3J0IHRoZXNlIHN0ZXBzLgogICAgICAgICAgICAgICAgaWYgZnVydGhlc3RCbG9jayBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgZWxlbWVudCAhPSBmb3JtYXR0aW5nRWxlbWVudDoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShlbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgICMgU3RlcCA3CiAgICAgICAgICAgICAgICBjb21tb25BbmNlc3RvciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbYWZlSW5kZXggLSAxXQoKICAgICAgICAgICAgICAgICMgU3RlcCA4OgogICAgICAgICAgICAgICAgIyBUaGUgYm9va21hcmsgaXMgc3VwcG9zZWQgdG8gaGVscCB1cyBpZGVudGlmeSB3aGVyZSB0byByZWluc2VydAogICAgICAgICAgICAgICAgIyBub2RlcyBpbiBzdGVwIDE1LiBXZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHdlIHJlaW5zZXJ0IG5vZGVzIGFmdGVyCiAgICAgICAgICAgICAgICAjIHRoZSBub2RlIGJlZm9yZSB0aGUgYWN0aXZlIGZvcm1hdHRpbmcgZWxlbWVudC4gTm90ZSB0aGUgYm9va21hcmsKICAgICAgICAgICAgICAgICMgY2FuIG1vdmUgaW4gc3RlcCA5LjcKICAgICAgICAgICAgICAgIGJvb2ttYXJrID0gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbmRleChmb3JtYXR0aW5nRWxlbWVudCkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgOQogICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlID0gZnVydGhlc3RCbG9jawogICAgICAgICAgICAgICAgaW5uZXJMb29wQ291bnRlciA9IDAKCiAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgobm9kZSkKICAgICAgICAgICAgICAgIHdoaWxlIGlubmVyTG9vcENvdW50ZXIgPCAzOgogICAgICAgICAgICAgICAgICAgIGlubmVyTG9vcENvdW50ZXIgKz0gMQogICAgICAgICAgICAgICAgICAgICMgTm9kZSBpcyBlbGVtZW50IGJlZm9yZSBub2RlIGluIG9wZW4gZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSAxCiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbaW5kZXhdCiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZSBub3QgaW4gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUobm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS42CiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZSA9PSBmb3JtYXR0aW5nRWxlbWVudDoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS43CiAgICAgICAgICAgICAgICAgICAgaWYgbGFzdE5vZGUgPT0gZnVydGhlc3RCbG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmsgPSBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluZGV4KG5vZGUpICsgMQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjgKICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IG5vZGUuY2xvbmVOb2RlKCkKICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2Ugbm9kZSB3aXRoIGNsb25lCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1sKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbmRleChub2RlKV0gPSBjbG9uZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgobm9kZSldID0gY2xvbmUKICAgICAgICAgICAgICAgICAgICBub2RlID0gY2xvbmUKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS45CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgbGFzdE5vZGUgZnJvbSBpdHMgcGFyZW50cywgaWYgYW55CiAgICAgICAgICAgICAgICAgICAgaWYgbGFzdE5vZGUucGFyZW50OgogICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZS5wYXJlbnQucmVtb3ZlQ2hpbGQobGFzdE5vZGUpCiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChsYXN0Tm9kZSkKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS4xMAogICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMAogICAgICAgICAgICAgICAgIyBGb3N0ZXIgcGFyZW50IGxhc3ROb2RlIGlmIGNvbW1vbkFuY2VzdG9yIGlzIGEKICAgICAgICAgICAgICAgICMgdGFibGUsIHRib2R5LCB0Zm9vdCwgdGhlYWQsIG9yIHRyIHdlIG5lZWQgdG8gZm9zdGVyCiAgICAgICAgICAgICAgICAjIHBhcmVudCB0aGUgbGFzdE5vZGUKICAgICAgICAgICAgICAgIGlmIGxhc3ROb2RlLnBhcmVudDoKICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZS5wYXJlbnQucmVtb3ZlQ2hpbGQobGFzdE5vZGUpCgogICAgICAgICAgICAgICAgaWYgY29tbW9uQW5jZXN0b3IubmFtZSBpbiBmcm96ZW5zZXQoKCJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIpKToKICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGluc2VydEJlZm9yZSA9IHNlbGYudHJlZS5nZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShsYXN0Tm9kZSwgaW5zZXJ0QmVmb3JlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb21tb25BbmNlc3Rvci5hcHBlbmRDaGlsZChsYXN0Tm9kZSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTEKICAgICAgICAgICAgICAgIGNsb25lID0gZm9ybWF0dGluZ0VsZW1lbnQuY2xvbmVOb2RlKCkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTIKICAgICAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sucmVwYXJlbnRDaGlsZHJlbihjbG9uZSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTMKICAgICAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2suYXBwZW5kQ2hpbGQoY2xvbmUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDE0CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0KGJvb2ttYXJrLCBjbG9uZSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTUKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbnNlcnQoCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChmdXJ0aGVzdEJsb2NrKSArIDEsIGNsb25lKQoKICAgICAgICBkZWYgZW5kVGFnQXBwbGV0TWFycXVlZU9iamVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHkiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdKToKICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBlbGVtZW50Lm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKCiAgICAgICAgZGVmIGVuZFRhZ0JyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLXRyZWF0ZWQtYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsib3JpZ2luYWxOYW1lIjogImJyIiwgIm5ld05hbWUiOiAiYnIgZWxlbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudChpbXBsaWVkVGFnVG9rZW4oImJyIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSA9PSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKGV4Y2x1ZGU9dG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkgIT0gbm9kZToKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZVR1cGxlIGluIHNwZWNpYWxFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgY2xhc3MgVGV4dFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFtdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgic2NyaXB0Iiwgc2VsZi5lbmRUYWdTY3JpcHQpXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1uYW1lZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVHJpZWQgdG8gcHJvY2VzcyBzdGFydCB0YWcgJXMgaW4gUkNEQVRBL1JBV1RFWFQgbW9kZSIgJSB0b2tlblsnbmFtZSddCgogICAgICAgIGRlZiBlbmRUYWdTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBhc3NlcnQgbm9kZS5uYW1lID09ICJzY3JpcHQiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZQogICAgICAgICAgICAjIFRoZSByZXN0IG9mIHRoaXMgbWV0aG9kIGlzIGFsbCBzdHVmZiB0aGF0IG9ubHkgaGFwcGVucyBpZgogICAgICAgICAgICAjIGRvY3VtZW50LndyaXRlIHdvcmtzCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlCgogICAgY2xhc3MgSW5UYWJsZVBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXRhYmxlCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImNhcHRpb24iLCBzZWxmLnN0YXJ0VGFnQ2FwdGlvbiksCiAgICAgICAgICAgICAgICAoImNvbGdyb3VwIiwgc2VsZi5zdGFydFRhZ0NvbGdyb3VwKSwKICAgICAgICAgICAgICAgICgiY29sIiwgc2VsZi5zdGFydFRhZ0NvbCksCiAgICAgICAgICAgICAgICAoKCJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIpLCBzZWxmLnN0YXJ0VGFnUm93R3JvdXApLAogICAgICAgICAgICAgICAgKCgidGQiLCAidGgiLCAidHIiKSwgc2VsZi5zdGFydFRhZ0ltcGx5VGJvZHkpLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuc3RhcnRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJzdHlsZSIsICJzY3JpcHQiKSwgc2VsZi5zdGFydFRhZ1N0eWxlU2NyaXB0KSwKICAgICAgICAgICAgICAgICgiaW5wdXQiLCBzZWxmLnN0YXJ0VGFnSW5wdXQpLAogICAgICAgICAgICAgICAgKCJmb3JtIiwgc2VsZi5zdGFydFRhZ0Zvcm0pCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0Ym9keSIsICJ0ZCIsCiAgICAgICAgICAgICAgICAgICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsICJ0ciIpLCBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyIG1ldGhvZHMKICAgICAgICBkZWYgY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KHNlbGYpOgogICAgICAgICAgICAjICJjbGVhciB0aGUgc3RhY2sgYmFjayB0byBhIHRhYmxlIGNvbnRleHQiCiAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluICgidGFibGUiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgIyBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZSIsCiAgICAgICAgICAgICAgICAjICB7Im5hbWUiOiAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgV2hlbiB0aGUgY3VycmVudCBub2RlIGlzIDxodG1sPiBpdCdzIGFuIGlubmVySFRNTCBjYXNlCgogICAgICAgICMgcHJvY2Vzc2luZyBtZXRob2RzCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLXRhYmxlIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBvcmlnaW5hbFBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVUZXh0Il0KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2Uub3JpZ2luYWxQaGFzZSA9IG9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgb3JpZ2luYWxQaGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlVGV4dCJdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLm9yaWdpbmFsUGhhc2UgPSBvcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgSWYgd2UgZ2V0IGhlcmUgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyCiAgICAgICAgICAgICMgRG8gdGhlIHRhYmxlIG1hZ2ljIQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnQ2FwdGlvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5hcHBlbmQoTWFya2VyKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQ2FwdGlvbiJdCgogICAgICAgIGRlZiBzdGFydFRhZ0NvbGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQ29sdW1uR3JvdXAiXQoKICAgICAgICBkZWYgc3RhcnRUYWdDb2woc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnUm93R3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZUJvZHkiXQoKICAgICAgICBkZWYgc3RhcnRUYWdJbXBseVRib2R5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1Jvd0dyb3VwKGltcGxpZWRUYWdUb2tlbigidGJvZHkiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJ0YWJsZSIsICJlbmROYW1lIjogInRhYmxlIn0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJ0YWJsZSIpKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZXIuaW5uZXJIVE1MOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1N0eWxlU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdJbnB1dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmICgidHlwZSIgaW4gdG9rZW5bImRhdGEiXSBhbmQKICAgICAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdWyJ0eXBlIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpID09ICJoaWRkZW4iKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaGlkZGVuLWlucHV0LWluLXRhYmxlIikKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgIyBYWFggYXNzb2NpYXRlIHdpdGggZm9ybQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ090aGVyKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdGb3JtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1mb3JtLWluLXRhYmxlIikKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmZvcm1Qb2ludGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5mb3JtUG9pbnRlciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy10YWJsZS12b29kb28iLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgIyBEbyB0aGUgdGFibGUgbWFnaWMhCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gRmFsc2UKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0YWJsZSIsIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJ0YWJsZSI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHktbmFtZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJnb3ROYW1lIjogInRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWROYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJ0YWJsZSI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVzZXRJbnNlcnRpb25Nb2RlKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAjIERvIHRoZSB0YWJsZSBtYWdpYyEKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gRmFsc2UKCiAgICBjbGFzcyBJblRhYmxlVGV4dFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLm9yaWdpbmFsUGhhc2UgPSBOb25lCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zID0gW10KCiAgICAgICAgZGVmIGZsdXNoQ2hhcmFjdGVycyhzZWxmKToKICAgICAgICAgICAgZGF0YSA9ICIiLmpvaW4oW2l0ZW1bImRhdGEiXSBmb3IgaXRlbSBpbiBzZWxmLmNoYXJhY3RlclRva2Vuc10pCiAgICAgICAgICAgIGlmIGFueShbaXRlbSBub3QgaW4gc3BhY2VDaGFyYWN0ZXJzIGZvciBpdGVtIGluIGRhdGFdKToKICAgICAgICAgICAgICAgIHRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5pbnNlcnRUZXh0KHRva2VuKQogICAgICAgICAgICBlbGlmIGRhdGE6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dChkYXRhKQogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2VucyA9IFtdCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMuYXBwZW5kKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgcHJldHR5IHN1cmUgd2Ugc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUKICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMuYXBwZW5kKHRva2VuKQogICAgIyAgICAgICAgYXNzZXJ0IEZhbHNlCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgSW5DYXB0aW9uUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tY2FwdGlvbgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwKICAgICAgICAgICAgICAgICAgInRoZWFkIiwgInRyIiksIHNlbGYuc3RhcnRUYWdUYWJsZUVsZW1lbnQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiY2FwdGlvbiIsIHNlbGYuZW5kVGFnQ2FwdGlvbiksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwKICAgICAgICAgICAgICAgICAgInRoZWFkIiwgInRyIiksIHNlbGYuZW5kVGFnSWdub3JlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIGlnbm9yZUVuZFRhZ0NhcHRpb24oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJjYXB0aW9uIiwgdmFyaWFudD0idGFibGUiKQoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlRWxlbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICAjIFhYWCBIYXZlIHRvIGR1cGxpY2F0ZSBsb2dpYyBoZXJlIHRvIGZpbmQgb3V0IGlmIHRoZSB0YWcgaXMgaWdub3JlZAogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NhcHRpb24oKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiY2FwdGlvbiIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnQ2FwdGlvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZUVuZFRhZ0NhcHRpb24oKToKICAgICAgICAgICAgICAgICMgQVQgdGhpcyBjb2RlIGlzIHF1aXRlIHNpbWlsYXIgdG8gZW5kVGFnVGFibGUgaW4gIkluVGFibGUiCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJjYXB0aW9uIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1vbmUtZW5kLXRhZy1idXQtZ290LWFub3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJnb3ROYW1lIjogImNhcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZE5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImNhcHRpb24iOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5jbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ2FwdGlvbigpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJjYXB0aW9uIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluQ29sdW1uR3JvdXBQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1jb2x1bW4KCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJjb2wiLCBzZWxmLnN0YXJ0VGFnQ29sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImNvbGdyb3VwIiwgc2VsZi5lbmRUYWdDb2xncm91cCksCiAgICAgICAgICAgICAgICAoImNvbCIsIHNlbGYuZW5kVGFnQ29sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIGlnbm9yZUVuZFRhZ0NvbGdyb3VwKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIpKQogICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ29sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdDb2xncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQoKICAgICAgICBkZWYgZW5kVGFnQ29sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigibm8tZW5kLXRhZyIsIHsibmFtZSI6ICJjb2wifSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgSW5UYWJsZUJvZHlQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi10YWJsZTAKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgidHIiLCBzZWxmLnN0YXJ0VGFnVHIpLAogICAgICAgICAgICAgICAgKCgidGQiLCAidGgiKSwgc2VsZi5zdGFydFRhZ1RhYmxlQ2VsbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdUYWJsZU90aGVyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIpLCBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXApLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRkIiwgInRoIiwKICAgICAgICAgICAgICAgICAgInRyIiksIHNlbGYuZW5kVGFnSWdub3JlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcwogICAgICAgIGRlZiBjbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KHNlbGYpOgogICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiAoInRib2R5IiwgInRmb290IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJodG1sIik6CiAgICAgICAgICAgICAgICAjIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlIiwKICAgICAgICAgICAgICAgICMgIHsibmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIjoKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgIyB0aGUgcmVzdAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Sb3ciXQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZUNlbGwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNlbGwtaW4tdGFibGUtYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZU90aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBYWFggQVQgQW55IGlkZWFzIG9uIGhvdyB0byBzaGFyZSB0aGlzIHdpdGggZW5kVGFnVGFibGU/CiAgICAgICAgICAgIGlmIChzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRib2R5IiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aGVhZCIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRmb290IiwgdmFyaWFudD0idGFibGUiKSk6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKAogICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlUm93R3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiAoc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Ym9keSIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGhlYWQiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Zm9vdCIsIHZhcmlhbnQ9InRhYmxlIikpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCgKICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJblJvd1BoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXJvdwogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgidGQiLCAidGgiKSwgc2VsZi5zdGFydFRhZ1RhYmxlQ2VsbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsCiAgICAgICAgICAgICAgICAgICJ0ciIpLCBzZWxmLnN0YXJ0VGFnVGFibGVPdGhlcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJ0ciIsIHNlbGYuZW5kVGFnVHIpLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0ZCIsICJ0aCIpLAogICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnSWdub3JlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcyAoWFhYIHVuaWZ5IHRoaXMgd2l0aCBvdGhlciB0YWJsZSBoZWxwZXIgbWV0aG9kcykKICAgICAgICBkZWYgY2xlYXJTdGFja1RvVGFibGVSb3dDb250ZXh0KHNlbGYpOgogICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiAoInRyIiwgImh0bWwiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlLXJvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgaWdub3JlRW5kVGFnVHIoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0ciIsIHZhcmlhbnQ9InRhYmxlIikKCiAgICAgICAgIyB0aGUgcmVzdAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZUNlbGwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlUm93Q29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5DZWxsIl0KICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5hcHBlbmQoTWFya2VyKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZU90aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdUcigpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIpKQogICAgICAgICAgICAjIFhYWCBob3cgYXJlIHdlIHN1cmUgaXQncyBhbHdheXMgaWdub3JlZCBpbiB0aGUgaW5uZXJIVE1MIGNhc2U/CiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVHIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVFbmRUYWdUcigpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZVJvd0NvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVCb2R5Il0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ1RyKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIikpCiAgICAgICAgICAgICMgUmVwcm9jZXNzIHRoZSBjdXJyZW50IHRhZyBpZiB0aGUgdHIgZW5kIHRhZyB3YXMgbm90IGlnbm9yZWQKICAgICAgICAgICAgIyBYWFggaG93IGFyZSB3ZSBzdXJlIGl0J3MgYWx3YXlzIGlnbm9yZWQgaW4gdGhlIGlubmVySFRNTCBjYXNlPwogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZVJvd0dyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtcm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5DZWxsUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tY2VsbAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLAogICAgICAgICAgICAgICAgICAidGhlYWQiLCAidHIiKSwgc2VsZi5zdGFydFRhZ1RhYmxlT3RoZXIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiksIHNlbGYuZW5kVGFnVGFibGVDZWxsKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIpLCBzZWxmLmVuZFRhZ0lnbm9yZSksCiAgICAgICAgICAgICAgICAoKCJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIpLCBzZWxmLmVuZFRhZ0ltcGx5KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBoZWxwZXIKICAgICAgICBkZWYgY2xvc2VDZWxsKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRkIiwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGVDZWxsKGltcGxpZWRUYWdUb2tlbigidGQiKSkKICAgICAgICAgICAgZWxpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoIiwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGVDZWxsKGltcGxpZWRUYWdUb2tlbigidGgiKSkKCiAgICAgICAgIyB0aGUgcmVzdAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIChzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRkIiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGgiLCB2YXJpYW50PSJ0YWJsZSIpKToKICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VDZWxsKCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGVDZWxsKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyh0b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2VsbC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSA9PSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblJvdyJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnSW1wbHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VDZWxsKCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzb21ldGltZXMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluU2VsZWN0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgib3B0aW9uIiwgc2VsZi5zdGFydFRhZ09wdGlvbiksCiAgICAgICAgICAgICAgICAoIm9wdGdyb3VwIiwgc2VsZi5zdGFydFRhZ09wdGdyb3VwKSwKICAgICAgICAgICAgICAgICgic2VsZWN0Iiwgc2VsZi5zdGFydFRhZ1NlbGVjdCksCiAgICAgICAgICAgICAgICAoKCJpbnB1dCIsICJrZXlnZW4iLCAidGV4dGFyZWEiKSwgc2VsZi5zdGFydFRhZ0lucHV0KSwKICAgICAgICAgICAgICAgICgic2NyaXB0Iiwgc2VsZi5zdGFydFRhZ1NjcmlwdCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJvcHRpb24iLCBzZWxmLmVuZFRhZ09wdGlvbiksCiAgICAgICAgICAgICAgICAoIm9wdGdyb3VwIiwgc2VsZi5lbmRUYWdPcHRncm91cCksCiAgICAgICAgICAgICAgICAoInNlbGVjdCIsIHNlbGYuZW5kVGFnU2VsZWN0KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1zZWxlY3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4tc2VsZWN0IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgc3RhcnRUYWdPcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFdlIG5lZWQgdG8gaW1wbHkgPC9vcHRpb24+IGlmIDxvcHRpb24+IGlzIHRoZSBjdXJyZW50IG5vZGUuCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPcHRncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGdyb3VwIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1NlbGVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc2VsZWN0LWluLXNlbGVjdCIpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnU2VsZWN0KGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCgogICAgICAgIGRlZiBzdGFydFRhZ0lucHV0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbnB1dC1pbi1zZWxlY3QiKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInNlbGVjdCIsIHZhcmlhbnQ9InNlbGVjdCIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdTZWxlY3QoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICBkZWYgc3RhcnRUYWdTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ09wdGlvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogIm9wdGlvbiJ9KQoKICAgICAgICBkZWYgZW5kVGFnT3B0Z3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIDwvb3B0Z3JvdXA+IGltcGxpY2l0bHkgY2xvc2VzIDxvcHRpb24+CiAgICAgICAgICAgIGlmIChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iIGFuZAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTJdLm5hbWUgPT0gIm9wdGdyb3VwIik6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgSXQgYWxzbyBjbG9zZXMgPC9vcHRncm91cD4KICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0Z3JvdXAiOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIEJ1dCBub3RoaW5nIGVsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAib3B0Z3JvdXAifSkKCiAgICAgICAgZGVmIGVuZFRhZ1NlbGVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgic2VsZWN0IiwgdmFyaWFudD0ic2VsZWN0Iik6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9ICJzZWxlY3QiOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5yZXNldEluc2VydGlvbk1vZGUoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEluU2VsZWN0SW5UYWJsZVBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIiwgInRkIiwgInRoIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1RhYmxlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIiwgInRkIiwgInRoIiksCiAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC10YWJsZS1lbGVtZW50LXN0YXJ0LXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdPdGhlcihpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC10YWJsZS1lbGVtZW50LWVuZC10YWctaW4tc2VsZWN0LWluLXRhYmxlIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdPdGhlcihpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJbkZvcmVpZ25Db250ZW50UGhhc2UoUGhhc2UpOgogICAgICAgIGJyZWFrb3V0RWxlbWVudHMgPSBmcm96ZW5zZXQoWyJiIiwgImJpZyIsICJibG9ja3F1b3RlIiwgImJvZHkiLCAiYnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiLCAiY29kZSIsICJkZCIsICJkaXYiLCAiZGwiLCAiZHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbSIsICJlbWJlZCIsICJoMSIsICJoMiIsICJoMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImg0IiwgImg1IiwgImg2IiwgImhlYWQiLCAiaHIiLCAiaSIsICJpbWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaSIsICJsaXN0aW5nIiwgIm1lbnUiLCAibWV0YSIsICJub2JyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2wiLCAicCIsICJwcmUiLCAicnVieSIsICJzIiwgInNtYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhbiIsICJzdHJvbmciLCAic3RyaWtlIiwgInN1YiIsICJzdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZSIsICJ0dCIsICJ1IiwgInVsIiwgInZhciJdKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICBkZWYgYWRqdXN0U1ZHVGFnTmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXBsYWNlbWVudHMgPSB7ImFsdGdseXBoIjogImFsdEdseXBoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHRnbHlwaGRlZiI6ICJhbHRHbHlwaERlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0Z2x5cGhpdGVtIjogImFsdEdseXBoSXRlbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZWNvbG9yIjogImFuaW1hdGVDb2xvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZW1vdGlvbiI6ICJhbmltYXRlTW90aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRldHJhbnNmb3JtIjogImFuaW1hdGVUcmFuc2Zvcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaXBwYXRoIjogImNsaXBQYXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWJsZW5kIjogImZlQmxlbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29sb3JtYXRyaXgiOiAiZmVDb2xvck1hdHJpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb21wb25lbnR0cmFuc2ZlciI6ICJmZUNvbXBvbmVudFRyYW5zZmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbXBvc2l0ZSI6ICJmZUNvbXBvc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb252b2x2ZW1hdHJpeCI6ICJmZUNvbnZvbHZlTWF0cml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWRpZmZ1c2VsaWdodGluZyI6ICJmZURpZmZ1c2VMaWdodGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVkaXNwbGFjZW1lbnRtYXAiOiAiZmVEaXNwbGFjZW1lbnRNYXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZGlzdGFudGxpZ2h0IjogImZlRGlzdGFudExpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZsb29kIjogImZlRmxvb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY2EiOiAiZmVGdW5jQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jYiI6ICJmZUZ1bmNCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNnIjogImZlRnVuY0ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY3IiOiAiZmVGdW5jUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVnYXVzc2lhbmJsdXIiOiAiZmVHYXVzc2lhbkJsdXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlaW1hZ2UiOiAiZmVJbWFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVtZXJnZSI6ICJmZU1lcmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1lcmdlbm9kZSI6ICJmZU1lcmdlTm9kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVtb3JwaG9sb2d5IjogImZlTW9ycGhvbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVvZmZzZXQiOiAiZmVPZmZzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlcG9pbnRsaWdodCI6ICJmZVBvaW50TGlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlc3BlY3VsYXJsaWdodGluZyI6ICJmZVNwZWN1bGFyTGlnaHRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlc3BvdGxpZ2h0IjogImZlU3BvdExpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXRpbGUiOiAiZmVUaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXR1cmJ1bGVuY2UiOiAiZmVUdXJidWxlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JlaWdub2JqZWN0IjogImZvcmVpZ25PYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdseXBocmVmIjogImdseXBoUmVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXJncmFkaWVudCI6ICJsaW5lYXJHcmFkaWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFkaWFsZ3JhZGllbnQiOiAicmFkaWFsR3JhZGllbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHRwYXRoIjogInRleHRQYXRoIn0KCiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gaW4gcmVwbGFjZW1lbnRzOgogICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSA9IHJlcGxhY2VtZW50c1t0b2tlblsibmFtZSJdXQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICJcdUZGRkQiCiAgICAgICAgICAgIGVsaWYgKHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgYW5kCiAgICAgICAgICAgICAgICAgIGFueShjaGFyIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnMgZm9yIGNoYXIgaW4gdG9rZW5bImRhdGEiXSkpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIFBoYXNlLnByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICBpZiAodG9rZW5bIm5hbWUiXSBpbiBzZWxmLmJyZWFrb3V0RWxlbWVudHMgb3IKICAgICAgICAgICAgICAgICh0b2tlblsibmFtZSJdID09ICJmb250IiBhbmQKICAgICAgICAgICAgICAgICBzZXQodG9rZW5bImRhdGEiXS5rZXlzKCkpICYgc2V0KFsiY29sb3IiLCAiZmFjZSIsICJzaXplIl0pKSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWh0bWwtZWxlbWVudC1pbi1mb3JlaWduLWNvbnRlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgIHdoaWxlIChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lc3BhY2UgIT0KICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5wYXJzZXIuaXNIVE1MSW50ZWdyYXRpb25Qb2ludChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYucGFyc2VyLmlzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0pKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5uYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sibWF0aG1sIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0TWF0aE1MQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudE5vZGUubmFtZXNwYWNlID09IG5hbWVzcGFjZXNbInN2ZyJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U1ZHVGFnTmFtZXModG9rZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0U1ZHQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICAgICAgdG9rZW5bIm5hbWVzcGFjZSJdID0gY3VycmVudE5vZGUubmFtZXNwYWNlCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzZWxmQ2xvc2luZyJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlSW5kZXggPSBsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgLSAxCiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICBpZiBub2RlLm5hbWUudHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUudHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpID09IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgIyBYWFggdGhpcyBpc24ndCBpbiB0aGUgc3BlYyBidXQgaXQgc2VlbXMgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIucGhhc2UgPT0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlVGV4dCJdOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpICE9IG5vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBub2RlSW5kZXggLT0gMQoKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW25vZGVJbmRleF0KICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZXNwYWNlICE9IHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcodG9rZW4pCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcmV0dXJuIG5ld190b2tlbgoKICAgIGNsYXNzIEFmdGVyQm9keVBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWygiaHRtbCIsIHNlbGYuZW5kVGFnSHRtbCldKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGRhdGEgaXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxodG1sPiBlbGVtZW50CiAgICAgICAgICAgICMgaGVyZSBhbmQgbm90IHRvIHdoYXRldmVyIGlzIGN1cnJlbnRseSBvcGVuLgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXSkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jaGFyLWFmdGVyLWJvZHkiKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWwoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLmlubmVySFRNTDoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1ib2R5LWlubmVyaHRtbCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJBZnRlckJvZHkiXQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBJbkZyYW1lc2V0UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tZnJhbWVzZXQKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5zdGFydFRhZ0ZyYW1lc2V0KSwKICAgICAgICAgICAgICAgICgiZnJhbWUiLCBzZWxmLnN0YXJ0VGFnRnJhbWUpLAogICAgICAgICAgICAgICAgKCJub2ZyYW1lcyIsIHNlbGYuc3RhcnRUYWdOb2ZyYW1lcykKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuZW5kVGFnRnJhbWVzZXQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4tZnJhbWVzZXQiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNoYXItaW4tZnJhbWVzZXQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdGcmFtZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBzdGFydFRhZ05vZnJhbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWZyYW1lc2V0LWluLWZyYW1lc2V0LWlubmVyaHRtbCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGlmIChub3Qgc2VsZi5wYXJzZXIuaW5uZXJIVE1MIGFuZAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImZyYW1lc2V0Iik6CiAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIG5vdCBpbiBpbm5lckhUTUwgbW9kZSBhbmQgdGhlIGN1cnJlbnQgbm9kZSBpcyBub3QgYQogICAgICAgICAgICAgICAgIyAiZnJhbWVzZXQiIGVsZW1lbnQgKGFueW1vcmUpIHRoZW4gc3dpdGNoLgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyRnJhbWVzZXQiXQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEFmdGVyRnJhbWVzZXRQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNhZnRlcjMKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoIm5vZnJhbWVzIiwgc2VsZi5zdGFydFRhZ05vZnJhbWVzKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLmVuZFRhZ0h0bWwpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItZnJhbWVzZXQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb2ZyYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyQWZ0ZXJGcmFtZXNldCJdCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgQWZ0ZXJBZnRlckJvZHlQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1jaGFyIikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LXN0YXJ0LXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEFmdGVyQWZ0ZXJGcmFtZXNldFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoIm5vZnJhbWVzIiwgc2VsZi5zdGFydFRhZ05vRnJhbWVzKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUuZG9jdW1lbnQpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtY2hhciIpCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ05vRnJhbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LXN0YXJ0LXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAjIHB5bGludDplbmFibGU9dW51c2VkLWFyZ3VtZW50CgogICAgcmV0dXJuIHsKICAgICAgICAiaW5pdGlhbCI6IEluaXRpYWxQaGFzZSwKICAgICAgICAiYmVmb3JlSHRtbCI6IEJlZm9yZUh0bWxQaGFzZSwKICAgICAgICAiYmVmb3JlSGVhZCI6IEJlZm9yZUhlYWRQaGFzZSwKICAgICAgICAiaW5IZWFkIjogSW5IZWFkUGhhc2UsCiAgICAgICAgImluSGVhZE5vc2NyaXB0IjogSW5IZWFkTm9zY3JpcHRQaGFzZSwKICAgICAgICAiYWZ0ZXJIZWFkIjogQWZ0ZXJIZWFkUGhhc2UsCiAgICAgICAgImluQm9keSI6IEluQm9keVBoYXNlLAogICAgICAgICJ0ZXh0IjogVGV4dFBoYXNlLAogICAgICAgICJpblRhYmxlIjogSW5UYWJsZVBoYXNlLAogICAgICAgICJpblRhYmxlVGV4dCI6IEluVGFibGVUZXh0UGhhc2UsCiAgICAgICAgImluQ2FwdGlvbiI6IEluQ2FwdGlvblBoYXNlLAogICAgICAgICJpbkNvbHVtbkdyb3VwIjogSW5Db2x1bW5Hcm91cFBoYXNlLAogICAgICAgICJpblRhYmxlQm9keSI6IEluVGFibGVCb2R5UGhhc2UsCiAgICAgICAgImluUm93IjogSW5Sb3dQaGFzZSwKICAgICAgICAiaW5DZWxsIjogSW5DZWxsUGhhc2UsCiAgICAgICAgImluU2VsZWN0IjogSW5TZWxlY3RQaGFzZSwKICAgICAgICAiaW5TZWxlY3RJblRhYmxlIjogSW5TZWxlY3RJblRhYmxlUGhhc2UsCiAgICAgICAgImluRm9yZWlnbkNvbnRlbnQiOiBJbkZvcmVpZ25Db250ZW50UGhhc2UsCiAgICAgICAgImFmdGVyQm9keSI6IEFmdGVyQm9keVBoYXNlLAogICAgICAgICJpbkZyYW1lc2V0IjogSW5GcmFtZXNldFBoYXNlLAogICAgICAgICJhZnRlckZyYW1lc2V0IjogQWZ0ZXJGcmFtZXNldFBoYXNlLAogICAgICAgICJhZnRlckFmdGVyQm9keSI6IEFmdGVyQWZ0ZXJCb2R5UGhhc2UsCiAgICAgICAgImFmdGVyQWZ0ZXJGcmFtZXNldCI6IEFmdGVyQWZ0ZXJGcmFtZXNldFBoYXNlLAogICAgICAgICMgWFhYIGFmdGVyIGFmdGVyIGZyYW1lc2V0CiAgICB9CgoKZGVmIGFkanVzdF9hdHRyaWJ1dGVzKHRva2VuLCByZXBsYWNlbWVudHMpOgogICAgaWYgUFkzIG9yIF91dGlscy5QWTI3OgogICAgICAgIG5lZWRzX2FkanVzdG1lbnQgPSB2aWV3a2V5cyh0b2tlblsnZGF0YSddKSAmIHZpZXdrZXlzKHJlcGxhY2VtZW50cykKICAgIGVsc2U6CiAgICAgICAgbmVlZHNfYWRqdXN0bWVudCA9IGZyb3plbnNldCh0b2tlblsnZGF0YSddKSAmIGZyb3plbnNldChyZXBsYWNlbWVudHMpCiAgICBpZiBuZWVkc19hZGp1c3RtZW50OgogICAgICAgIHRva2VuWydkYXRhJ10gPSBPcmRlcmVkRGljdCgocmVwbGFjZW1lbnRzLmdldChrLCBrKSwgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gdG9rZW5bJ2RhdGEnXS5pdGVtcygpKQoKCmRlZiBpbXBsaWVkVGFnVG9rZW4obmFtZSwgdHlwZT0iRW5kVGFnIiwgYXR0cmlidXRlcz1Ob25lLAogICAgICAgICAgICAgICAgICAgIHNlbGZDbG9zaW5nPUZhbHNlKToKICAgIGlmIGF0dHJpYnV0ZXMgaXMgTm9uZToKICAgICAgICBhdHRyaWJ1dGVzID0ge30KICAgIHJldHVybiB7InR5cGUiOiB0b2tlblR5cGVzW3R5cGVdLCAibmFtZSI6IG5hbWUsICJkYXRhIjogYXR0cmlidXRlcywKICAgICAgICAgICAgInNlbGZDbG9zaW5nIjogc2VsZkNsb3Npbmd9CgoKY2xhc3MgUGFyc2VFcnJvcihFeGNlcHRpb24pOgogICAgIiIiRXJyb3IgaW4gcGFyc2VkIGRvY3VtZW50IiIiCiAgICBwYXNzClBLAwQUAAAAAAAAACEA3Me7NGE3AABhNwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9zZXJpYWxpemVyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmltcG9ydCByZQoKZnJvbSBjb2RlY3MgaW1wb3J0IHJlZ2lzdGVyX2Vycm9yLCB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgdm9pZEVsZW1lbnRzLCBib29sZWFuQXR0cmlidXRlcywgc3BhY2VDaGFyYWN0ZXJzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgcmNkYXRhRWxlbWVudHMsIGVudGl0aWVzLCB4bWxFbnRpdGllcwpmcm9tIC4gaW1wb3J0IHRyZWV3YWxrZXJzLCBfdXRpbHMKZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBlc2NhcGUKCl9xdW90ZUF0dHJpYnV0ZVNwZWNDaGFycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKSArICJcIic9PD5gIgpfcXVvdGVBdHRyaWJ1dGVTcGVjID0gcmUuY29tcGlsZSgiWyIgKyBfcXVvdGVBdHRyaWJ1dGVTcGVjQ2hhcnMgKyAiXSIpCl9xdW90ZUF0dHJpYnV0ZUxlZ2FjeSA9IHJlLmNvbXBpbGUoIlsiICsgX3F1b3RlQXR0cmlidXRlU3BlY0NoYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwYlx4MGNcclx4MGVceDBmXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDE2XHgxN1x4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHgyZlx4NjBceGEwXHUxNjgwXHUxODBlXHUxODBmXHUyMDAwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MjAwOFx1MjAwOVx1MjAwYVx1MjAyOFx1MjAyOVx1MjAyZlx1MjA1ZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDAwXSIpCgoKX2VuY29kZV9lbnRpdHlfbWFwID0ge30KX2lzX3VjczQgPSBsZW4oIlxVMDAxMEZGRkYiKSA9PSAxCmZvciBrLCB2IGluIGxpc3QoZW50aXRpZXMuaXRlbXMoKSk6CiAgICAjIHNraXAgbXVsdGktY2hhcmFjdGVyIGVudGl0aWVzCiAgICBpZiAoKF9pc191Y3M0IGFuZCBsZW4odikgPiAxKSBvcgogICAgICAgICAgICAobm90IF9pc191Y3M0IGFuZCBsZW4odikgPiAyKSk6CiAgICAgICAgY29udGludWUKICAgIGlmIHYgIT0gIiYiOgogICAgICAgIGlmIGxlbih2KSA9PSAyOgogICAgICAgICAgICB2ID0gX3V0aWxzLnN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludCh2KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHYgPSBvcmQodikKICAgICAgICBpZiB2IG5vdCBpbiBfZW5jb2RlX2VudGl0eV9tYXAgb3Igay5pc2xvd2VyKCk6CiAgICAgICAgICAgICMgcHJlZmVyICZsdDsgb3ZlciAmTFQ7IGFuZCBzaW1pbGFybHkgZm9yICZhbXA7LCAmZ3Q7LCBldGMuCiAgICAgICAgICAgIF9lbmNvZGVfZW50aXR5X21hcFt2XSA9IGsKCgpkZWYgaHRtbGVudGl0eXJlcGxhY2VfZXJyb3JzKGV4Yyk6CiAgICBpZiBpc2luc3RhbmNlKGV4YywgKFVuaWNvZGVFbmNvZGVFcnJvciwgVW5pY29kZVRyYW5zbGF0ZUVycm9yKSk6CiAgICAgICAgcmVzID0gW10KICAgICAgICBjb2RlcG9pbnRzID0gW10KICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF0pOgogICAgICAgICAgICBpZiBza2lwOgogICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpbmRleCA9IGkgKyBleGMuc3RhcnQKICAgICAgICAgICAgaWYgX3V0aWxzLmlzU3Vycm9nYXRlUGFpcihleGMub2JqZWN0W2luZGV4Om1pbihbZXhjLmVuZCwgaW5kZXggKyAyXSldKToKICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IF91dGlscy5zdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZXhjLm9iamVjdFtpbmRleDppbmRleCArIDJdKQogICAgICAgICAgICAgICAgc2tpcCA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IG9yZChjKQogICAgICAgICAgICBjb2RlcG9pbnRzLmFwcGVuZChjb2RlcG9pbnQpCiAgICAgICAgZm9yIGNwIGluIGNvZGVwb2ludHM6CiAgICAgICAgICAgIGUgPSBfZW5jb2RlX2VudGl0eV9tYXAuZ2V0KGNwKQogICAgICAgICAgICBpZiBlOgogICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiJiIpCiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGUpCiAgICAgICAgICAgICAgICBpZiBub3QgZS5lbmRzd2l0aCgiOyIpOgogICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoIjsiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiJiN4JXM7IiAlIChoZXgoY3ApWzI6XSkpCiAgICAgICAgcmV0dXJuICgiIi5qb2luKHJlcyksIGV4Yy5lbmQpCiAgICBlbHNlOgogICAgICAgIHJldHVybiB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMoZXhjKQoKcmVnaXN0ZXJfZXJyb3IoImh0bWxlbnRpdHlyZXBsYWNlIiwgaHRtbGVudGl0eXJlcGxhY2VfZXJyb3JzKQoKCmRlZiBzZXJpYWxpemUoaW5wdXQsIHRyZWU9ImV0cmVlIiwgZW5jb2Rpbmc9Tm9uZSwgKipzZXJpYWxpemVyX29wdHMpOgogICAgIyBYWFg6IFNob3VsZCB3ZSBjYWNoZSB0aGlzPwogICAgd2Fsa2VyID0gdHJlZXdhbGtlcnMuZ2V0VHJlZVdhbGtlcih0cmVlKQogICAgcyA9IEhUTUxTZXJpYWxpemVyKCoqc2VyaWFsaXplcl9vcHRzKQogICAgcmV0dXJuIHMucmVuZGVyKHdhbGtlcihpbnB1dCksIGVuY29kaW5nKQoKCmNsYXNzIEhUTUxTZXJpYWxpemVyKG9iamVjdCk6CgogICAgIyBhdHRyaWJ1dGUgcXVvdGluZyBvcHRpb25zCiAgICBxdW90ZV9hdHRyX3ZhbHVlcyA9ICJsZWdhY3kiICAjIGJlIHNlY3VyZSBieSBkZWZhdWx0CiAgICBxdW90ZV9jaGFyID0gJyInCiAgICB1c2VfYmVzdF9xdW90ZV9jaGFyID0gVHJ1ZQoKICAgICMgdGFnIHN5bnRheCBvcHRpb25zCiAgICBvbWl0X29wdGlvbmFsX3RhZ3MgPSBUcnVlCiAgICBtaW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXMgPSBUcnVlCiAgICB1c2VfdHJhaWxpbmdfc29saWR1cyA9IEZhbHNlCiAgICBzcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1cyA9IFRydWUKCiAgICAjIGVzY2FwaW5nIG9wdGlvbnMKICAgIGVzY2FwZV9sdF9pbl9hdHRycyA9IEZhbHNlCiAgICBlc2NhcGVfcmNkYXRhID0gRmFsc2UKICAgIHJlc29sdmVfZW50aXRpZXMgPSBUcnVlCgogICAgIyBtaXNjZWxsYW5lb3VzIG9wdGlvbnMKICAgIGFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzID0gRmFsc2UKICAgIGluamVjdF9tZXRhX2NoYXJzZXQgPSBUcnVlCiAgICBzdHJpcF93aGl0ZXNwYWNlID0gRmFsc2UKICAgIHNhbml0aXplID0gRmFsc2UKCiAgICBvcHRpb25zID0gKCJxdW90ZV9hdHRyX3ZhbHVlcyIsICJxdW90ZV9jaGFyIiwgInVzZV9iZXN0X3F1b3RlX2NoYXIiLAogICAgICAgICAgICAgICAib21pdF9vcHRpb25hbF90YWdzIiwgIm1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICJ1c2VfdHJhaWxpbmdfc29saWR1cyIsICJzcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1cyIsCiAgICAgICAgICAgICAgICJlc2NhcGVfbHRfaW5fYXR0cnMiLCAiZXNjYXBlX3JjZGF0YSIsICJyZXNvbHZlX2VudGl0aWVzIiwKICAgICAgICAgICAgICAgImFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzIiwgImluamVjdF9tZXRhX2NoYXJzZXQiLAogICAgICAgICAgICAgICAic3RyaXBfd2hpdGVzcGFjZSIsICJzYW5pdGl6ZSIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICAiIiJJbml0aWFsaXplIEhUTUxTZXJpYWxpemVyLgoKICAgICAgICBLZXl3b3JkIG9wdGlvbnMgKGRlZmF1bHQgZ2l2ZW4gZmlyc3QgdW5sZXNzIHNwZWNpZmllZCkgaW5jbHVkZToKCiAgICAgICAgaW5qZWN0X21ldGFfY2hhcnNldD1UcnVlfEZhbHNlCiAgICAgICAgICBXaGV0aGVyIGl0IGluc2VydCBhIG1ldGEgZWxlbWVudCB0byBkZWZpbmUgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlCiAgICAgICAgICBkb2N1bWVudC4KICAgICAgICBxdW90ZV9hdHRyX3ZhbHVlcz0ibGVnYWN5Inwic3BlYyJ8ImFsd2F5cyIKICAgICAgICAgIFdoZXRoZXIgdG8gcXVvdGUgYXR0cmlidXRlIHZhbHVlcyB0aGF0IGRvbid0IHJlcXVpcmUgcXVvdGluZwogICAgICAgICAgcGVyIGxlZ2FjeSBicm93c2VyIGJlaGF2aW91ciwgd2hlbiByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQsIG9yIGFsd2F5cy4KICAgICAgICBxdW90ZV9jaGFyPXUnIid8dSInIgogICAgICAgICAgVXNlIGdpdmVuIHF1b3RlIGNoYXJhY3RlciBmb3IgYXR0cmlidXRlIHF1b3RpbmcuIERlZmF1bHQgaXMgdG8KICAgICAgICAgIHVzZSBkb3VibGUgcXVvdGUgdW5sZXNzIGF0dHJpYnV0ZSB2YWx1ZSBjb250YWlucyBhIGRvdWJsZSBxdW90ZSwKICAgICAgICAgIGluIHdoaWNoIGNhc2Ugc2luZ2xlIHF1b3RlcyBhcmUgdXNlZCBpbnN0ZWFkLgogICAgICAgIGVzY2FwZV9sdF9pbl9hdHRycz1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIGVzY2FwZSA8IGluIGF0dHJpYnV0ZSB2YWx1ZXMuCiAgICAgICAgZXNjYXBlX3JjZGF0YT1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlc2NhcGVkIHdpdGhpbiBub3JtYWwKICAgICAgICAgIGVsZW1lbnRzIHdpdGhpbiByY2RhdGEgZWxlbWVudHMgc3VjaCBhcyBzdHlsZS4KICAgICAgICByZXNvbHZlX2VudGl0aWVzPVRydWV8RmFsc2UKICAgICAgICAgIFdoZXRoZXIgdG8gcmVzb2x2ZSBuYW1lZCBjaGFyYWN0ZXIgZW50aXRpZXMgdGhhdCBhcHBlYXIgaW4gdGhlCiAgICAgICAgICBzb3VyY2UgdHJlZS4gVGhlIFhNTCBwcmVkZWZpbmVkIGVudGl0aWVzICZsdDsgJmd0OyAmYW1wOyAmcXVvdDsgJmFwb3M7CiAgICAgICAgICBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIHNldHRpbmcuCiAgICAgICAgc3RyaXBfd2hpdGVzcGFjZT1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIHJlbW92ZSBzZW1hbnRpY2FsbHkgbWVhbmluZ2xlc3Mgd2hpdGVzcGFjZS4gKFRoaXMKICAgICAgICAgIGNvbXByZXNzZXMgYWxsIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UgZXhjZXB0IHdpdGhpbiBwcmUuKQogICAgICAgIG1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcz1UcnVlfEZhbHNlCiAgICAgICAgICBTaG9ydGVucyBib29sZWFuIGF0dHJpYnV0ZXMgdG8gZ2l2ZSBqdXN0IHRoZSBhdHRyaWJ1dGUgdmFsdWUsCiAgICAgICAgICBmb3IgZXhhbXBsZSA8aW5wdXQgZGlzYWJsZWQ9ImRpc2FibGVkIj4gYmVjb21lcyA8aW5wdXQgZGlzYWJsZWQ+LgogICAgICAgIHVzZV90cmFpbGluZ19zb2xpZHVzPUZhbHNlfFRydWUKICAgICAgICAgIEluY2x1ZGVzIGEgY2xvc2UtdGFnIHNsYXNoIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0IHRhZyBvZiB2b2lkCiAgICAgICAgICBlbGVtZW50cyAoZW1wdHkgZWxlbWVudHMgd2hvc2UgZW5kIHRhZyBpcyBmb3JiaWRkZW4pLiBFLmcuIDxoci8+LgogICAgICAgIHNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzPVRydWV8RmFsc2UKICAgICAgICAgIFBsYWNlcyBhIHNwYWNlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY2xvc2luZyBzbGFzaCBpbiBhIHRhZwogICAgICAgICAgdXNpbmcgYSB0cmFpbGluZyBzb2xpZHVzLiBFLmcuIDxociAvPi4gUmVxdWlyZXMgdXNlX3RyYWlsaW5nX3NvbGlkdXMuCiAgICAgICAgc2FuaXRpemU9RmFsc2V8VHJ1ZQogICAgICAgICAgU3RyaXAgYWxsIHVuc2FmZSBvciB1bmtub3duIGNvbnN0cnVjdHMgZnJvbSBvdXRwdXQuCiAgICAgICAgICBTZWUgYGh0bWw1bGliIHVzZXIgZG9jdW1lbnRhdGlvbmBfCiAgICAgICAgb21pdF9vcHRpb25hbF90YWdzPVRydWV8RmFsc2UKICAgICAgICAgIE9taXQgc3RhcnQvZW5kIHRhZ3MgdGhhdCBhcmUgb3B0aW9uYWwuCiAgICAgICAgYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXM9RmFsc2V8VHJ1ZQogICAgICAgICAgUmVvcmRlciBhdHRyaWJ1dGVzIHRvIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KCiAgICAgICAgLi4gX2h0bWw1bGliIHVzZXIgZG9jdW1lbnRhdGlvbjogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2h0bWw1bGliL3dpa2kvVXNlckRvY3VtZW50YXRpb24KICAgICAgICAiIiIKICAgICAgICB1bmV4cGVjdGVkX2FyZ3MgPSBmcm96ZW5zZXQoa3dhcmdzKSAtIGZyb3plbnNldChzZWxmLm9wdGlvbnMpCiAgICAgICAgaWYgbGVuKHVuZXhwZWN0ZWRfYXJncykgPiAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIl9faW5pdF9fKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIG5leHQoaXRlcih1bmV4cGVjdGVkX2FyZ3MpKSkKICAgICAgICBpZiAncXVvdGVfY2hhcicgaW4ga3dhcmdzOgogICAgICAgICAgICBzZWxmLnVzZV9iZXN0X3F1b3RlX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBhdHRyIGluIHNlbGYub3B0aW9uczoKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBrd2FyZ3MuZ2V0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0cikpKQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KICAgICAgICBzZWxmLnN0cmljdCA9IEZhbHNlCgogICAgZGVmIGVuY29kZShzZWxmLCBzdHJpbmcpOgogICAgICAgIGFzc2VydChpc2luc3RhbmNlKHN0cmluZywgdGV4dF90eXBlKSkKICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShzZWxmLmVuY29kaW5nLCAiaHRtbGVudGl0eXJlcGxhY2UiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcKCiAgICBkZWYgZW5jb2RlU3RyaWN0KHNlbGYsIHN0cmluZyk6CiAgICAgICAgYXNzZXJ0KGlzaW5zdGFuY2Uoc3RyaW5nLCB0ZXh0X3R5cGUpKQogICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdHJpY3QiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYsIHRyZWV3YWxrZXIsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dG9vLW1hbnktbmVzdGVkLWJsb2NrcwogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIGluX2NkYXRhID0gRmFsc2UKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgIGlmIGVuY29kaW5nIGFuZCBzZWxmLmluamVjdF9tZXRhX2NoYXJzZXQ6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMuaW5qZWN0X21ldGFfY2hhcnNldCBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlciwgZW5jb2RpbmcpCiAgICAgICAgIyBBbHBoYWJldGljYWwgYXR0cmlidXRlcyBpcyBoZXJlIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm9uZSBvZgogICAgICAgICMgdGhlIGxhdGVyIGZpbHRlcnMgYWRkIG9yIGNoYW5nZSBvcmRlciBvZiBhdHRyaWJ1dGVzOyBpdCBuZWVkcyB0byBiZQogICAgICAgICMgYmVmb3JlIHRoZSBzYW5pdGl6ZXIgc28gZXNjYXBlZCBlbGVtZW50cyBjb21lIG91dCBjb3JyZWN0bHkKICAgICAgICBpZiBzZWxmLmFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLmFscGhhYmV0aWNhbGF0dHJpYnV0ZXMgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgIyBXaGl0ZXNwYWNlRmlsdGVyIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBPcHRpb25hbFRhZ0ZpbHRlcgogICAgICAgICMgZm9yIG1heGltdW0gZWZmaWNpZW50bHkgb2YgdGhpcyBsYXR0ZXIgZmlsdGVyCiAgICAgICAgaWYgc2VsZi5zdHJpcF93aGl0ZXNwYWNlOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLndoaXRlc3BhY2UgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgaWYgc2VsZi5zYW5pdGl6ZToKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5zYW5pdGl6ZXIgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgaWYgc2VsZi5vbWl0X29wdGlvbmFsX3RhZ3M6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMub3B0aW9uYWx0YWdzIGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyKQoKICAgICAgICBmb3IgdG9rZW4gaW4gdHJlZXdhbGtlcjoKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgICAgICBkb2N0eXBlID0gIjwhRE9DVFlQRSAlcyIgJSB0b2tlblsibmFtZSJdCgogICAgICAgICAgICAgICAgaWYgdG9rZW5bInB1YmxpY0lkIl06CiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAnIFBVQkxJQyAiJXMiJyAlIHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgICAgICBlbGlmIHRva2VuWyJzeXN0ZW1JZCJdOgogICAgICAgICAgICAgICAgICAgIGRvY3R5cGUgKz0gIiBTWVNURU0iCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXToKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXS5maW5kKCciJykgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bInN5c3RlbUlkIl0uZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJTeXN0ZW0gaWRlbnRpZmVyIGNvbnRhaW5zIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgcXVvdGUgY2hhcmFjdGVycyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAiJyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJyInCiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiICVzJXMlcyIgJSAocXVvdGVfY2hhciwgdG9rZW5bInN5c3RlbUlkIl0sIHF1b3RlX2NoYXIpCgogICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiPiIKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGRvY3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIiBvciBpbl9jZGF0YToKICAgICAgICAgICAgICAgICAgICBpZiBpbl9jZGF0YSBhbmQgdG9rZW5bImRhdGEiXS5maW5kKCI8LyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlVuZXhwZWN0ZWQgPC8gaW4gQ0RBVEEiKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKHRva2VuWyJkYXRhIl0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKGVzY2FwZSh0b2tlblsiZGF0YSJdKSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwlcyIgJSBuYW1lKQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiByY2RhdGFFbGVtZW50cyBhbmQgbm90IHNlbGYuZXNjYXBlX3JjZGF0YToKICAgICAgICAgICAgICAgICAgICBpbl9jZGF0YSA9IFRydWUKICAgICAgICAgICAgICAgIGVsaWYgaW5fY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCBjaGlsZCBlbGVtZW50IG9mIGEgQ0RBVEEgZWxlbWVudCIpCiAgICAgICAgICAgICAgICBmb3IgKF8sIGF0dHJfbmFtZSksIGF0dHJfdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICMgVE9ETzogQWRkIG5hbWVzcGFjZSBzdXBwb3J0IGhlcmUKICAgICAgICAgICAgICAgICAgICBrID0gYXR0cl9uYW1lCiAgICAgICAgICAgICAgICAgICAgdiA9IGF0dHJfdmFsdWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgnICcpCgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGspCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgKGsgbm90IGluIGJvb2xlYW5BdHRyaWJ1dGVzLmdldChuYW1lLCB0dXBsZSgpKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIGsgbm90IGluIGJvb2xlYW5BdHRyaWJ1dGVzLmdldCgiIiwgdHVwbGUoKSkpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucXVvdGVfYXR0cl92YWx1ZXMgPT0gImFsd2F5cyIgb3IgbGVuKHYpID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9hdHRyID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYucXVvdGVfYXR0cl92YWx1ZXMgPT0gInNwZWMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfYXR0ciA9IF9xdW90ZUF0dHJpYnV0ZVNwZWMuc2VhcmNoKHYpIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAibGVnYWN5IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2F0dHIgPSBfcXVvdGVBdHRyaWJ1dGVMZWdhY3kuc2VhcmNoKHYpIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJxdW90ZV9hdHRyX3ZhbHVlcyBtdXN0IGJlIG9uZSBvZjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ2Fsd2F5cycsICdzcGVjJywgb3IgJ2xlZ2FjeSciKQogICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCImIiwgIiZhbXA7IikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NhcGVfbHRfaW5fYXR0cnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCI8IiwgIiZsdDsiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBxdW90ZV9hdHRyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9IHNlbGYucXVvdGVfY2hhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51c2VfYmVzdF9xdW90ZV9jaGFyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICInIiBpbiB2IGFuZCAnIicgbm90IGluIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAnIicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICciJyBpbiB2IGFuZCAiJyIgbm90IGluIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAiJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1b3RlX2NoYXIgPT0gIiciOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIiciLCAiJiMzOTsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCciJywgIiZxdW90OyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChxdW90ZV9jaGFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUodikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KHF1b3RlX2NoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSh2KQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiB2b2lkRWxlbWVudHMgYW5kIHNlbGYudXNlX3RyYWlsaW5nX3NvbGlkdXM6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1czoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIiAvIikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiLyIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSgiPiIpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiByY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBpbl9jZGF0YSA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIGluX2NkYXRhOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlVuZXhwZWN0ZWQgY2hpbGQgZWxlbWVudCBvZiBhIENEQVRBIGVsZW1lbnQiKQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwvJXM+IiAlIG5hbWUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGlmIGRhdGEuZmluZCgiLS0iKSA+PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIkNvbW1lbnQgY29udGFpbnMgLS0iKQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwhLS0lcy0tPiIgJSB0b2tlblsiZGF0YSJdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbnRpdHkiOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGtleSA9IG5hbWUgKyAiOyIKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gZW50aXRpZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiRW50aXR5ICVzIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJlc29sdmVfZW50aXRpZXMgYW5kIGtleSBub3QgaW4geG1sRW50aXRpZXM6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVudGl0aWVzW2tleV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICImJXM7IiAlIG5hbWUKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGRhdGEpCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcih0b2tlblsiZGF0YSJdKQoKICAgIGRlZiByZW5kZXIoc2VsZiwgdHJlZXdhbGtlciwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihsaXN0KHNlbGYuc2VyaWFsaXplKHRyZWV3YWxrZXIsIGVuY29kaW5nKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obGlzdChzZWxmLnNlcmlhbGl6ZSh0cmVld2Fsa2VyKSkpCgogICAgZGVmIHNlcmlhbGl6ZUVycm9yKHNlbGYsIGRhdGE9IlhYWCBFUlJPUiBNRVNTQUdFIE5FRURFRCIpOgogICAgICAgICMgWFhYIFRoZSBpZGVhIGlzIHRvIG1ha2UgZGF0YSBtYW5kYXRvcnkuCiAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKGRhdGEpCiAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CiAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZUVycm9yCgoKY2xhc3MgU2VyaWFsaXplRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkVycm9yIGluIHNlcmlhbGl6ZWQgdHJlZSIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAIIyYyTQAAAA0AAAAD0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IHNheAoKX19hbGxfXyA9IFsic2F4Il0KCnRyeToKICAgIGZyb20gLiBpbXBvcnQgZ2Vuc2hpICAjIG5vcWEKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwplbHNlOgogICAgX19hbGxfXy5hcHBlbmQoImdlbnNoaSIpClBLAwQUAAAAAAAAACEAMSfHvhMGAAATBgAAOwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvZ2Vuc2hpLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBRTmFtZSwgQXR0cnMKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgU1RBUlQsIEVORCwgVEVYVCwgQ09NTUVOVCwgRE9DVFlQRQoKCmRlZiB0b19nZW5zaGkod2Fsa2VyKToKICAgIHRleHQgPSBbXQogICAgZm9yIHRva2VuIGluIHdhbGtlcjoKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICB0ZXh0LmFwcGVuZCh0b2tlblsiZGF0YSJdKQogICAgICAgIGVsaWYgdGV4dDoKICAgICAgICAgICAgeWllbGQgVEVYVCwgIiIuam9pbih0ZXh0KSwgKE5vbmUsIC0xLCAtMSkKICAgICAgICAgICAgdGV4dCA9IFtdCgogICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl06CiAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAodG9rZW5bIm5hbWVzcGFjZSJdLCB0b2tlblsibmFtZSJdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgYXR0cnMgPSBBdHRycyhbKFFOYW1lKCJ7JXN9JXMiICUgYXR0ciBpZiBhdHRyWzBdIGlzIG5vdCBOb25lIGVsc2UgYXR0clsxXSksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpXSkKICAgICAgICAgICAgeWllbGQgKFNUQVJULCAoUU5hbWUobmFtZSksIGF0dHJzKSwgKE5vbmUsIC0xLCAtMSkpCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIHR5cGUgPSAiRW5kVGFnIgoKICAgICAgICBpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl06CiAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAodG9rZW5bIm5hbWVzcGFjZSJdLCB0b2tlblsibmFtZSJdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KCiAgICAgICAgICAgIHlpZWxkIEVORCwgUU5hbWUobmFtZSksIChOb25lLCAtMSwgLTEpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIHlpZWxkIENPTU1FTlQsIHRva2VuWyJkYXRhIl0sIChOb25lLCAtMSwgLTEpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgIHlpZWxkIERPQ1RZUEUsICh0b2tlblsibmFtZSJdLCB0b2tlblsicHVibGljSWQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJzeXN0ZW1JZCJdKSwgKE5vbmUsIC0xLCAtMSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFzcyAgIyBGSVhNRTogV2hhdCB0byBkbz8KCiAgICBpZiB0ZXh0OgogICAgICAgIHlpZWxkIFRFWFQsICIiLmpvaW4odGV4dCksIChOb25lLCAtMSwgLTEpClBLAwQUAAAAAAAAACEA5FxfEH0GAAB9BgAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBBdHRyaWJ1dGVzTlNJbXBsCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBhZGp1c3RGb3JlaWduQXR0cmlidXRlcywgdW5hZGp1c3RGb3JlaWduQXR0cmlidXRlcwoKcHJlZml4X21hcHBpbmcgPSB7fQpmb3IgcHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZSBpbiBhZGp1c3RGb3JlaWduQXR0cmlidXRlcy52YWx1ZXMoKToKICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICBwcmVmaXhfbWFwcGluZ1twcmVmaXhdID0gbmFtZXNwYWNlCgoKZGVmIHRvX3NheCh3YWxrZXIsIGhhbmRsZXIpOgogICAgIiIiQ2FsbCBTQVgtbGlrZSBjb250ZW50IGhhbmRsZXIgYmFzZWQgb24gdHJlZXdhbGtlciB3YWxrZXIiIiIKICAgIGhhbmRsZXIuc3RhcnREb2N1bWVudCgpCiAgICBmb3IgcHJlZml4LCBuYW1lc3BhY2UgaW4gcHJlZml4X21hcHBpbmcuaXRlbXMoKToKICAgICAgICBoYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5hbWVzcGFjZSkKCiAgICBmb3IgdG9rZW4gaW4gd2Fsa2VyOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgYXR0cnMgPSBBdHRyaWJ1dGVzTlNJbXBsKHRva2VuWyJkYXRhIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKQogICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMpCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkKICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIGhhbmRsZXIuY2hhcmFjdGVycyh0b2tlblsiZGF0YSJdKQogICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIHRva2VuIHR5cGUiCgogICAgZm9yIHByZWZpeCwgbmFtZXNwYWNlIGluIHByZWZpeF9tYXBwaW5nLml0ZW1zKCk6CiAgICAgICAgaGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCkKICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKQpQSwMEFAAAAAAAAAAhAEfZN25ODQAATg0AAD0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL19faW5pdF9fLnB5IiIiQSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgZm9yIGJ1aWxkaW5nIGRpZmZlcmVudCBraW5kcyBvZiB0cmVlIGZyb20KSFRNTCBkb2N1bWVudHMuCgpUbyBjcmVhdGUgYSB0cmVlYnVpbGRlciBmb3IgYSBuZXcgdHlwZSBvZiB0cmVlLCB5b3UgbmVlZCB0byBkbwppbXBsZW1lbnQgc2V2ZXJhbCB0aGluZ3M6CgoxKSBBIHNldCBvZiBjbGFzc2VzIGZvciB2YXJpb3VzIHR5cGVzIG9mIGVsZW1lbnRzOiBEb2N1bWVudCwgRG9jdHlwZSwKQ29tbWVudCwgRWxlbWVudC4gVGhlc2UgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBvZgpfYmFzZS50cmVlYnVpbGRlcnMuTm9kZSAoYWx0aG91Z2ggY29tbWVudCBub2RlcyBoYXZlIGEgZGlmZmVyZW50CnNpZ25hdHVyZSBmb3IgdGhlaXIgY29uc3RydWN0b3IsIHNlZSB0cmVlYnVpbGRlcnMuZXRyZWUuQ29tbWVudCkKVGV4dHVhbCBjb250ZW50IG1heSBhbHNvIGJlIGltcGxlbWVudGVkIGFzIGFub3RoZXIgbm9kZSB0eXBlLCBvciBub3QsIGFzCnlvdXIgdHJlZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcy4KCjIpIEEgdHJlZWJ1aWxkZXIgb2JqZWN0IChjYWxsZWQgVHJlZUJ1aWxkZXIgYnkgY29udmVudGlvbikgdGhhdAppbmhlcml0cyBmcm9tIHRyZWVidWlsZGVycy5fYmFzZS5UcmVlQnVpbGRlci4gVGhpcyBoYXMgNCByZXF1aXJlZCBhdHRyaWJ1dGVzOgpkb2N1bWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGJvdHRvbW1vc3Qgbm9kZSBvZiBhIGRvY3VtZW50CmVsZW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIEhUTUwgRWxlbWVudHMKY29tbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgY29tbWVudHMKZG9jdHlwZUNsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgZG9jdHlwZXMKSXQgYWxzbyBoYXMgb25lIHJlcXVpcmVkIG1ldGhvZDoKZ2V0RG9jdW1lbnQgLSBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIGNvbXBsZXRlIGRvY3VtZW50IHRyZWUKCjMpIElmIHlvdSB3aXNoIHRvIHJ1biB0aGUgdW5pdCB0ZXN0cywgeW91IG11c3QgYWxzbyBjcmVhdGUgYQp0ZXN0U2VyaWFsaXplciBtZXRob2Qgb24geW91ciB0cmVlYnVpbGRlciB3aGljaCBhY2NlcHRzIGEgbm9kZSBhbmQKcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIE5vZGUgYW5kIGl0cyBjaGlsZHJlbiBzZXJpYWxpemVkIGFjY29yZGluZwp0byB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlIHVuaXR0ZXN0cwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuLl91dGlscyBpbXBvcnQgZGVmYXVsdF9ldHJlZQoKdHJlZUJ1aWxkZXJDYWNoZSA9IHt9CgoKZGVmIGdldFRyZWVCdWlsZGVyKHRyZWVUeXBlLCBpbXBsZW1lbnRhdGlvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAiIiJHZXQgYSBUcmVlQnVpbGRlciBjbGFzcyBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmVlIHdpdGggYnVpbHQtaW4gc3VwcG9ydAoKICAgIHRyZWVUeXBlIC0gdGhlIG5hbWUgb2YgdGhlIHRyZWUgdHlwZSByZXF1aXJlZCAoY2FzZS1pbnNlbnNpdGl2ZSkuIFN1cHBvcnRlZAogICAgICAgICAgICAgICB2YWx1ZXMgYXJlOgoKICAgICAgICAgICAgICAgImRvbSIgLSBBIGdlbmVyaWMgYnVpbGRlciBmb3IgRE9NIGltcGxlbWVudGF0aW9ucywgZGVmYXVsdGluZyB0bwogICAgICAgICAgICAgICAgICAgICAgIGEgeG1sLmRvbS5taW5pZG9tIGJhc2VkIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICAgICAiZXRyZWUiIC0gQSBnZW5lcmljIGJ1aWxkZXIgZm9yIHRyZWUgaW1wbGVtZW50YXRpb25zIGV4cG9zaW5nIGFuCiAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHJlZS1saWtlIGludGVyZmFjZSwgZGVmYXVsdGluZyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLmNFbGVtZW50VHJlZSBpZiBhdmFpbGFibGUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZXRyZWUuRWxlbWVudFRyZWUgaWYgbm90LgogICAgICAgICAgICAgICAibHhtbCIgLSBBIGV0cmVlLWJhc2VkIGJ1aWxkZXIgZm9yIGx4bWwuZXRyZWUsIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0YXRpb25zIG9mIGx4bWwncyBpbXBsZW1lbnRhdGlvbi4KCiAgICBpbXBsZW1lbnRhdGlvbiAtIChDdXJyZW50bHkgYXBwbGllcyB0byB0aGUgImV0cmVlIiBhbmQgImRvbSIgdHJlZSB0eXBlcykuIEEKICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyZWUgdHlwZSBlLmcuCiAgICAgICAgICAgICAgICAgICAgICB4bWwuZXRyZWUuRWxlbWVudFRyZWUgb3IgeG1sLmV0cmVlLmNFbGVtZW50VHJlZS4iIiIKCiAgICB0cmVlVHlwZSA9IHRyZWVUeXBlLmxvd2VyKCkKICAgIGlmIHRyZWVUeXBlIG5vdCBpbiB0cmVlQnVpbGRlckNhY2hlOgogICAgICAgIGlmIHRyZWVUeXBlID09ICJkb20iOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGRvbQogICAgICAgICAgICAjIENvbWUgdXAgd2l0aCBhIHNhbmUgZGVmYXVsdCAocHJlZi4gZnJvbSB0aGUgc3RkbGliKQogICAgICAgICAgICBpZiBpbXBsZW1lbnRhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IG1pbmlkb20KICAgICAgICAgICAgIyBORVZFUiBjYWNoZSBoZXJlLCBjYWNoaW5nIGlzIGRvbmUgaW4gdGhlIGRvbSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGRvbS5nZXREb21Nb2R1bGUoaW1wbGVtZW50YXRpb24sICoqa3dhcmdzKS5UcmVlQnVpbGRlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImx4bWwiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlX2x4bWwKICAgICAgICAgICAgdHJlZUJ1aWxkZXJDYWNoZVt0cmVlVHlwZV0gPSBldHJlZV9seG1sLlRyZWVCdWlsZGVyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZXRyZWUiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlCiAgICAgICAgICAgIGlmIGltcGxlbWVudGF0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IGRlZmF1bHRfZXRyZWUKICAgICAgICAgICAgIyBORVZFUiBjYWNoZSBoZXJlLCBjYWNoaW5nIGlzIGRvbmUgaW4gdGhlIGV0cmVlIHN1Ym1vZHVsZQogICAgICAgICAgICByZXR1cm4gZXRyZWUuZ2V0RVRyZWVNb2R1bGUoaW1wbGVtZW50YXRpb24sICoqa3dhcmdzKS5UcmVlQnVpbGRlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiIiVW5yZWNvZ25pc2VkIHRyZWVidWlsZGVyICIlcyIgIiIiICUgdHJlZVR5cGUpCiAgICByZXR1cm4gdHJlZUJ1aWxkZXJDYWNoZS5nZXQodHJlZVR5cGUpClBLAwQUAAAAAAAAACEARMpWqnY2AAB2NgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBzY29waW5nRWxlbWVudHMsIHRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzLCBuYW1lc3BhY2VzCgojIFRoZSBzY29wZSBtYXJrZXJzIGFyZSBpbnNlcnRlZCB3aGVuIGVudGVyaW5nIG9iamVjdCBlbGVtZW50cywKIyBtYXJxdWVlcywgdGFibGUgY2VsbHMsIGFuZCB0YWJsZSBjYXB0aW9ucywgYW5kIGFyZSB1c2VkIHRvIHByZXZlbnQgZm9ybWF0dGluZwojIGZyb20gImxlYWtpbmciIGludG8gdGFibGVzLCBvYmplY3QgZWxlbWVudHMsIGFuZCBtYXJxdWVlcy4KTWFya2VyID0gTm9uZQoKbGlzdEVsZW1lbnRzTWFwID0gewogICAgTm9uZTogKGZyb3plbnNldChzY29waW5nRWxlbWVudHMpLCBGYWxzZSksCiAgICAiYnV0dG9uIjogKGZyb3plbnNldChzY29waW5nRWxlbWVudHMgfCBzZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJidXR0b24iKV0pKSwgRmFsc2UpLAogICAgImxpc3QiOiAoZnJvemVuc2V0KHNjb3BpbmdFbGVtZW50cyB8IHNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9sIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidWwiKV0pKSwgRmFsc2UpLAogICAgInRhYmxlIjogKGZyb3plbnNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgImh0bWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0YWJsZSIpXSksIEZhbHNlKSwKICAgICJzZWxlY3QiOiAoZnJvemVuc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAib3B0Z3JvdXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib3B0aW9uIildKSwgVHJ1ZSkKfQoKCmNsYXNzIE5vZGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJOb2RlIHJlcHJlc2VudGluZyBhbiBpdGVtIGluIHRoZSB0cmVlLgogICAgICAgIG5hbWUgLSBUaGUgdGFnIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlCiAgICAgICAgcGFyZW50IC0gVGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIChvciBOb25lIGZvciB0aGUgZG9jdW1lbnQgbm9kZSkKICAgICAgICB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBub2RlIChhcHBsaWVzIHRvIHRleHQgbm9kZXMgYW5kCiAgICAgICAgY29tbWVudHMKICAgICAgICBhdHRyaWJ1dGVzIC0gYSBkaWN0IGhvbGRpbmcgbmFtZSwgdmFsdWUgcGFpcnMgZm9yIGF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUKICAgICAgICBjaGlsZE5vZGVzIC0gYSBsaXN0IG9mIGNoaWxkIG5vZGVzIG9mIHRoZSBjdXJyZW50IG5vZGUuIFRoaXMgbXVzdAogICAgICAgIGluY2x1ZGUgYWxsIGVsZW1lbnRzIGJ1dCBub3QgbmVjZXNzYXJpbHkgb3RoZXIgbm9kZSB0eXBlcwogICAgICAgIF9mbGFncyAtIEEgbGlzdCBvZiBtaXNjZWxsYW5lb3VzIGZsYWdzIHRoYXQgY2FuIGJlIHNldCBvbiB0aGUgbm9kZQogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKICAgICAgICBzZWxmLnZhbHVlID0gTm9uZQogICAgICAgIHNlbGYuYXR0cmlidXRlcyA9IHt9CiAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gW10KICAgICAgICBzZWxmLl9mbGFncyA9IFtdCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgYXR0cmlidXRlc1N0ciA9ICIgIi5qb2luKFsiJXM9XCIlc1wiIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRyaWJ1dGVzLml0ZW1zKCldKQogICAgICAgIGlmIGF0dHJpYnV0ZXNTdHI6CiAgICAgICAgICAgIHJldHVybiAiPCVzICVzPiIgJSAoc2VsZi5uYW1lLCBhdHRyaWJ1dGVzU3RyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiPCVzPiIgJSAoc2VsZi5uYW1lKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlcz4iICUgKHNlbGYubmFtZSkKCiAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgIiIiSW5zZXJ0IG5vZGUgYXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAiIiJJbnNlcnQgZGF0YSBhcyB0ZXh0IGluIHRoZSBjdXJyZW50IG5vZGUsIHBvc2l0aW9uZWQgYmVmb3JlIHRoZQogICAgICAgIHN0YXJ0IG9mIG5vZGUgaW5zZXJ0QmVmb3JlIG9yIHRvIHRoZSBlbmQgb2YgdGhlIG5vZGUncyB0ZXh0LgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5vZGUsIHJlZk5vZGUpOgogICAgICAgICIiIkluc2VydCBub2RlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZSwgYmVmb3JlIHJlZk5vZGUgaW4gdGhlCiAgICAgICAgbGlzdCBvZiBjaGlsZCBub2Rlcy4gUmFpc2VzIFZhbHVlRXJyb3IgaWYgcmVmTm9kZSBpcyBub3QgYSBjaGlsZCBvZgogICAgICAgIHRoZSBjdXJyZW50IG5vZGUiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICIiIlJlbW92ZSBub2RlIGZyb20gdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KToKICAgICAgICAiIiJNb3ZlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSB0byBuZXdQYXJlbnQuCiAgICAgICAgVGhpcyBpcyBuZWVkZWQgc28gdGhhdCB0cmVlcyB0aGF0IGRvbid0IHN0b3JlIHRleHQgYXMgbm9kZXMgbW92ZSB0aGUKICAgICAgICB0ZXh0IGluIHRoZSBjb3JyZWN0IHdheQogICAgICAgICIiIgogICAgICAgICMgWFhYIC0gc2hvdWxkIHRoaXMgbWV0aG9kIGJlIG1hZGUgbW9yZSBnZW5lcmFsPwogICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkTm9kZXM6CiAgICAgICAgICAgIG5ld1BhcmVudC5hcHBlbmRDaGlsZChjaGlsZCkKICAgICAgICBzZWxmLmNoaWxkTm9kZXMgPSBbXQoKICAgIGRlZiBjbG9uZU5vZGUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBjdXJyZW50IG5vZGUgaS5lLiBhIG5vZGUgd2l0aCB0aGUgc2FtZQogICAgICAgIG5hbWUgYW5kIGF0dHJpYnV0ZXMgYnV0IHdpdGggbm8gcGFyZW50IG9yIGNoaWxkIG5vZGVzCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBoYXNDb250ZW50KHNlbGYpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBub2RlIGhhcyBjaGlsZHJlbiBvciB0ZXh0LCBmYWxzZSBvdGhlcndpc2UKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKGxpc3QpOgogICAgZGVmIGFwcGVuZChzZWxmLCBub2RlKToKICAgICAgICBlcXVhbENvdW50ID0gMAogICAgICAgIGlmIG5vZGUgIT0gTWFya2VyOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudCA9PSBNYXJrZXI6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIHNlbGYubm9kZXNFcXVhbChlbGVtZW50LCBub2RlKToKICAgICAgICAgICAgICAgICAgICBlcXVhbENvdW50ICs9IDEKICAgICAgICAgICAgICAgIGlmIGVxdWFsQ291bnQgPT0gMzoKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShlbGVtZW50KQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgbGlzdC5hcHBlbmQoc2VsZiwgbm9kZSkKCiAgICBkZWYgbm9kZXNFcXVhbChzZWxmLCBub2RlMSwgbm9kZTIpOgogICAgICAgIGlmIG5vdCBub2RlMS5uYW1lVHVwbGUgPT0gbm9kZTIubmFtZVR1cGxlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgbm90IG5vZGUxLmF0dHJpYnV0ZXMgPT0gbm9kZTIuYXR0cmlidXRlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgoKY2xhc3MgVHJlZUJ1aWxkZXIob2JqZWN0KToKICAgICIiIkJhc2UgdHJlZWJ1aWxkZXIgaW1wbGVtZW50YXRpb24KICAgIGRvY3VtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGUgYm90dG9tbW9zdCBub2RlIG9mIGEgZG9jdW1lbnQKICAgIGVsZW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIEhUTUwgRWxlbWVudHMKICAgIGNvbW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGNvbW1lbnRzCiAgICBkb2N0eXBlQ2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBkb2N0eXBlcwogICAgIiIiCiAgICAjIHB5bGludDpkaXNhYmxlPW5vdC1jYWxsYWJsZQoKICAgICMgRG9jdW1lbnQgY2xhc3MKICAgIGRvY3VtZW50Q2xhc3MgPSBOb25lCgogICAgIyBUaGUgY2xhc3MgdG8gdXNlIGZvciBjcmVhdGluZyBhIG5vZGUKICAgIGVsZW1lbnRDbGFzcyA9IE5vbmUKCiAgICAjIFRoZSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGNvbW1lbnRzCiAgICBjb21tZW50Q2xhc3MgPSBOb25lCgogICAgIyBUaGUgY2xhc3MgdG8gdXNlIGZvciBjcmVhdGluZyBkb2N0eXBlcwogICAgZG9jdHlwZUNsYXNzID0gTm9uZQoKICAgICMgRnJhZ21lbnQgY2xhc3MKICAgIGZyYWdtZW50Q2xhc3MgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cyk6CiAgICAgICAgaWYgbmFtZXNwYWNlSFRNTEVsZW1lbnRzOgogICAgICAgICAgICBzZWxmLmRlZmF1bHROYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRlZmF1bHROYW1lc3BhY2UgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzID0gW10KICAgICAgICBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyA9IEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCgogICAgICAgICMgWFhYIC0gcmVuYW1lIHRoZXNlIHRvIGhlYWRFbGVtZW50LCBmb3JtRWxlbWVudAogICAgICAgIHNlbGYuaGVhZFBvaW50ZXIgPSBOb25lCiAgICAgICAgc2VsZi5mb3JtUG9pbnRlciA9IE5vbmUKCiAgICAgICAgc2VsZi5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgICAgICBzZWxmLmRvY3VtZW50ID0gc2VsZi5kb2N1bWVudENsYXNzKCkKCiAgICBkZWYgZWxlbWVudEluU2NvcGUoc2VsZiwgdGFyZ2V0LCB2YXJpYW50PU5vbmUpOgoKICAgICAgICAjIElmIHdlIHBhc3MgYSBub2RlIGluIHdlIG1hdGNoIHRoYXQuIGlmIHdlIHBhc3MgYSBzdHJpbmcKICAgICAgICAjIG1hdGNoIGFueSBub2RlIHdpdGggdGhhdCBuYW1lCiAgICAgICAgZXhhY3ROb2RlID0gaGFzYXR0cih0YXJnZXQsICJuYW1lVHVwbGUiKQogICAgICAgIGlmIG5vdCBleGFjdE5vZGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgdGFyZ2V0ID0gKG5hbWVzcGFjZXNbImh0bWwiXSwgdGFyZ2V0KQogICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0YXJnZXQsIHR1cGxlKQoKICAgICAgICBsaXN0RWxlbWVudHMsIGludmVydCA9IGxpc3RFbGVtZW50c01hcFt2YXJpYW50XQoKICAgICAgICBmb3Igbm9kZSBpbiByZXZlcnNlZChzZWxmLm9wZW5FbGVtZW50cyk6CiAgICAgICAgICAgIGlmIGV4YWN0Tm9kZSBhbmQgbm9kZSA9PSB0YXJnZXQ6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBleGFjdE5vZGUgYW5kIG5vZGUubmFtZVR1cGxlID09IHRhcmdldDoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgKGludmVydCBeIChub2RlLm5hbWVUdXBsZSBpbiBsaXN0RWxlbWVudHMpKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBhc3NlcnQgRmFsc2UgICMgV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcG9pbnQKCiAgICBkZWYgcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoc2VsZik6CiAgICAgICAgIyBXaXRoaW4gdGhpcyBhbGdvcml0aG0gdGhlIG9yZGVyIG9mIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUKICAgICAgICAjIHNwZWNpZmljYXRpb24gaXMgbm90IHF1aXRlIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBvZiBzdGVwcyBpbiB0aGUKICAgICAgICAjIGNvZGUuIEl0IHNob3VsZCBzdGlsbCBkbyB0aGUgc2FtZSB0aG91Z2guCgogICAgICAgICMgU3RlcCAxOiBzdG9wIHRoZSBhbGdvcml0aG0gd2hlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgaWYgbm90IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTdGVwIDIgYW5kIHN0ZXAgMzogd2Ugc3RhcnQgd2l0aCB0aGUgbGFzdCBlbGVtZW50LiBTbyBpIGlzIC0xLgogICAgICAgIGkgPSBsZW4oc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMpIC0gMQogICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0KICAgICAgICBpZiBlbnRyeSA9PSBNYXJrZXIgb3IgZW50cnkgaW4gc2VsZi5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFN0ZXAgNgogICAgICAgIHdoaWxlIGVudHJ5ICE9IE1hcmtlciBhbmQgZW50cnkgbm90IGluIHNlbGYub3BlbkVsZW1lbnRzOgogICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBiZSByZXNldCB0byAwIGJlbG93CiAgICAgICAgICAgICAgICBpID0gLTEKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGkgLT0gMQogICAgICAgICAgICAjIFN0ZXAgNTogbGV0IGVudHJ5IGJlIG9uZSBlYXJsaWVyIGluIHRoZSBsaXN0LgogICAgICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgU3RlcCA3CiAgICAgICAgICAgIGkgKz0gMQoKICAgICAgICAgICAgIyBTdGVwIDgKICAgICAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXQogICAgICAgICAgICBjbG9uZSA9IGVudHJ5LmNsb25lTm9kZSgpICAjIE1haW5seSB0byBnZXQgYSBuZXcgY29weSBvZiB0aGUgYXR0cmlidXRlcwoKICAgICAgICAgICAgIyBTdGVwIDkKICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuaW5zZXJ0RWxlbWVudCh7InR5cGUiOiAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGNsb25lLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiBjbG9uZS5uYW1lc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogY2xvbmUuYXR0cmlidXRlc30pCgogICAgICAgICAgICAjIFN0ZXAgMTAKICAgICAgICAgICAgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0gPSBlbGVtZW50CgogICAgICAgICAgICAjIFN0ZXAgMTEKICAgICAgICAgICAgaWYgZWxlbWVudCA9PSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1stMV06CiAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBjbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhzZWxmKToKICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnBvcCgpCiAgICAgICAgd2hpbGUgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMgYW5kIGVudHJ5ICE9IE1hcmtlcjoKICAgICAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5wb3AoKQoKICAgIGRlZiBlbGVtZW50SW5BY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBhY3RpdmUKICAgICAgICBmb3JtYXR0aW5nIGVsZW1lbnRzIGFuZCB0aGUgbGFzdCBtYXJrZXIuIElmIGl0IGRvZXMsIHJldHVybiBpdCwgZWxzZQogICAgICAgIHJldHVybiBmYWxzZSIiIgoKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgIyBDaGVjayBmb3IgTWFya2VyIGZpcnN0IGJlY2F1c2UgaWYgaXQncyBhIE1hcmtlciBpdCBkb2Vzbid0IGhhdmUgYQogICAgICAgICAgICAjIG5hbWUgYXR0cmlidXRlLgogICAgICAgICAgICBpZiBpdGVtID09IE1hcmtlcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgaXRlbS5uYW1lID09IG5hbWU6CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBpbnNlcnRSb290KHNlbGYsIHRva2VuKToKICAgICAgICBlbGVtZW50ID0gc2VsZi5jcmVhdGVFbGVtZW50KHRva2VuKQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgIHNlbGYuZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCkKCiAgICBkZWYgaW5zZXJ0RG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgc3lzdGVtSWQgPSB0b2tlblsic3lzdGVtSWQiXQoKICAgICAgICBkb2N0eXBlID0gc2VsZi5kb2N0eXBlQ2xhc3MobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQogICAgICAgIHNlbGYuZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdHlwZSkKCiAgICBkZWYgaW5zZXJ0Q29tbWVudChzZWxmLCB0b2tlbiwgcGFyZW50PU5vbmUpOgogICAgICAgIGlmIHBhcmVudCBpcyBOb25lOgogICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm9wZW5FbGVtZW50c1stMV0KICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoc2VsZi5jb21tZW50Q2xhc3ModG9rZW5bImRhdGEiXSkpCgogICAgZGVmIGNyZWF0ZUVsZW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICIiIkNyZWF0ZSBhbiBlbGVtZW50IGJ1dCBkb24ndCBpbnNlcnQgaXQgYW55d2hlcmUiIiIKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIG5hbWVzcGFjZSA9IHRva2VuLmdldCgibmFtZXNwYWNlIiwgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQgPSBzZWxmLmVsZW1lbnRDbGFzcyhuYW1lLCBuYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXQogICAgICAgIHJldHVybiBlbGVtZW50CgogICAgZGVmIF9nZXRJbnNlcnRGcm9tVGFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2luc2VydEZyb21UYWJsZQoKICAgIGRlZiBfc2V0SW5zZXJ0RnJvbVRhYmxlKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJTd2l0Y2ggdGhlIGZ1bmN0aW9uIHVzZWQgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgZnJvbSB0aGUKICAgICAgICBub3JtYWwgb25lIHRvIHRoZSBtaXNuZXN0ZWQgdGFibGUgb25lIGFuZCBiYWNrIGFnYWluIiIiCiAgICAgICAgc2VsZi5faW5zZXJ0RnJvbVRhYmxlID0gdmFsdWUKICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgc2VsZi5pbnNlcnRFbGVtZW50ID0gc2VsZi5pbnNlcnRFbGVtZW50VGFibGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc2VydEVsZW1lbnQgPSBzZWxmLmluc2VydEVsZW1lbnROb3JtYWwKCiAgICBpbnNlcnRGcm9tVGFibGUgPSBwcm9wZXJ0eShfZ2V0SW5zZXJ0RnJvbVRhYmxlLCBfc2V0SW5zZXJ0RnJvbVRhYmxlKQoKICAgIGRlZiBpbnNlcnRFbGVtZW50Tm9ybWFsKHNlbGYsIHRva2VuKToKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSksICJFbGVtZW50ICVzIG5vdCB1bmljb2RlIiAlIG5hbWUKICAgICAgICBuYW1lc3BhY2UgPSB0b2tlbi5nZXQoIm5hbWVzcGFjZSIsIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50ID0gc2VsZi5lbGVtZW50Q2xhc3MobmFtZSwgbmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0KICAgICAgICBzZWxmLm9wZW5FbGVtZW50c1stMV0uYXBwZW5kQ2hpbGQoZWxlbWVudCkKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgIGRlZiBpbnNlcnRFbGVtZW50VGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICIiIkNyZWF0ZSBhbiBlbGVtZW50IGFuZCBpbnNlcnQgaXQgaW50byB0aGUgdHJlZSIiIgogICAgICAgIGVsZW1lbnQgPSBzZWxmLmNyZWF0ZUVsZW1lbnQodG9rZW4pCiAgICAgICAgaWYgc2VsZi5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluIHRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5pbnNlcnRFbGVtZW50Tm9ybWFsKHRva2VuKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2Ugc2hvdWxkIGJlIGluIHRoZSBJblRhYmxlIG1vZGUuIFRoaXMgbWVhbnMgd2Ugd2FudCB0byBkbwogICAgICAgICAgICAjIHNwZWNpYWwgbWFnaWMgZWxlbWVudCByZWFycmFuZ2luZwogICAgICAgICAgICBwYXJlbnQsIGluc2VydEJlZm9yZSA9IHNlbGYuZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oKQogICAgICAgICAgICBpZiBpbnNlcnRCZWZvcmUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LCBpbnNlcnRCZWZvcmUpCiAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgIHJldHVybiBlbGVtZW50CgogICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgICIiIkluc2VydCB0ZXh0IGRhdGEuIiIiCiAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWy0xXQoKICAgICAgICBpZiAobm90IHNlbGYuaW5zZXJ0RnJvbVRhYmxlIG9yIChzZWxmLmluc2VydEZyb21UYWJsZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50c1stMV0ubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbiB0YWJsZUluc2VydE1vZGVFbGVtZW50cykpOgogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0VGV4dChkYXRhKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2Ugc2hvdWxkIGJlIGluIHRoZSBJblRhYmxlIG1vZGUuIFRoaXMgbWVhbnMgd2Ugd2FudCB0byBkbwogICAgICAgICAgICAjIHNwZWNpYWwgbWFnaWMgZWxlbWVudCByZWFycmFuZ2luZwogICAgICAgICAgICBwYXJlbnQsIGluc2VydEJlZm9yZSA9IHNlbGYuZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oKQogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0VGV4dChkYXRhLCBpbnNlcnRCZWZvcmUpCgogICAgZGVmIGdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKHNlbGYpOgogICAgICAgICIiIkdldCB0aGUgZm9zdGVyIHBhcmVudCBlbGVtZW50LCBhbmQgc2libGluZyB0byBpbnNlcnQgYmVmb3JlCiAgICAgICAgKG9yIE5vbmUpIHdoZW4gaW5zZXJ0aW5nIGEgbWlzbmVzdGVkIHRhYmxlIG5vZGUiIiIKICAgICAgICAjIFRoZSBmb3N0ZXIgcGFyZW50IGVsZW1lbnQgaXMgdGhlIG9uZSB3aGljaCBjb21lcyBiZWZvcmUgdGhlIG1vc3QKICAgICAgICAjIHJlY2VudGx5IG9wZW5lZCB0YWJsZSBlbGVtZW50CiAgICAgICAgIyBYWFggLSB0aGlzIGlzIHJlYWxseSBpbmVsZWdhbnQKICAgICAgICBsYXN0VGFibGUgPSBOb25lCiAgICAgICAgZm9zdGVyUGFyZW50ID0gTm9uZQogICAgICAgIGluc2VydEJlZm9yZSA9IE5vbmUKICAgICAgICBmb3IgZWxtIGluIHNlbGYub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICBpZiBlbG0ubmFtZSA9PSAidGFibGUiOgogICAgICAgICAgICAgICAgbGFzdFRhYmxlID0gZWxtCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGxhc3RUYWJsZToKICAgICAgICAgICAgIyBYWFggLSB3ZSBzaG91bGQgcmVhbGx5IGNoZWNrIHRoYXQgdGhpcyBwYXJlbnQgaXMgYWN0dWFsbHkgYQogICAgICAgICAgICAjIG5vZGUgaGVyZQogICAgICAgICAgICBpZiBsYXN0VGFibGUucGFyZW50OgogICAgICAgICAgICAgICAgZm9zdGVyUGFyZW50ID0gbGFzdFRhYmxlLnBhcmVudAogICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID0gbGFzdFRhYmxlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3N0ZXJQYXJlbnQgPSBzZWxmLm9wZW5FbGVtZW50c1sKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5pbmRleChsYXN0VGFibGUpIC0gMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3N0ZXJQYXJlbnQgPSBzZWxmLm9wZW5FbGVtZW50c1swXQogICAgICAgIHJldHVybiBmb3N0ZXJQYXJlbnQsIGluc2VydEJlZm9yZQoKICAgIGRlZiBnZW5lcmF0ZUltcGxpZWRFbmRUYWdzKHNlbGYsIGV4Y2x1ZGU9Tm9uZSk6CiAgICAgICAgbmFtZSA9IHNlbGYub3BlbkVsZW1lbnRzWy0xXS5uYW1lCiAgICAgICAgIyBYWFggdGQsIHRoIGFuZCB0ciBhcmUgbm90IGFjdHVhbGx5IG5lZWRlZAogICAgICAgIGlmIChuYW1lIGluIGZyb3plbnNldCgoImRkIiwgImR0IiwgImxpIiwgIm9wdGlvbiIsICJvcHRncm91cCIsICJwIiwgInJwIiwgInJ0IikpIGFuZAogICAgICAgICAgICAgICAgbmFtZSAhPSBleGNsdWRlKToKICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBYWFggVGhpcyBpcyBub3QgZW50aXJlbHkgd2hhdCB0aGUgc3BlY2lmaWNhdGlvbiBzYXlzLiBXZSBzaG91bGQKICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSBpdCBtb3JlIGNsb3NlbHkuCiAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhleGNsdWRlKQoKICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKICAgICAgICAiUmV0dXJuIHRoZSBmaW5hbCB0cmVlIgogICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50CgogICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgICJSZXR1cm4gdGhlIGZpbmFsIGZyYWdtZW50IgogICAgICAgICMgYXNzZXJ0IHNlbGYuaW5uZXJIVE1MCiAgICAgICAgZnJhZ21lbnQgPSBzZWxmLmZyYWdtZW50Q2xhc3MoKQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzWzBdLnJlcGFyZW50Q2hpbGRyZW4oZnJhZ21lbnQpCiAgICAgICAgcmV0dXJuIGZyYWdtZW50CgogICAgZGVmIHRlc3RTZXJpYWxpemVyKHNlbGYsIG5vZGUpOgogICAgICAgICIiIlNlcmlhbGl6ZSB0aGUgc3VidHJlZSBvZiBub2RlIGluIHRoZSBmb3JtYXQgcmVxdWlyZWQgYnkgdW5pdCB0ZXN0cwogICAgICAgIG5vZGUgLSB0aGUgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlcmlhbGl6aW5nIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpQSwMEFAAAAAAAAAAhAAjqLviDIgAAgyIAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2RvbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nCmZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQppbXBvcnQgd2Vha3JlZgoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5CgoKZGVmIGdldERvbUJ1aWxkZXIoRG9tSW1wbGVtZW50YXRpb24pOgogICAgRG9tID0gRG9tSW1wbGVtZW50YXRpb24KCiAgICBjbGFzcyBBdHRyTGlzdChNdXRhYmxlTWFwcGluZyk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICBzZWxmLmVsZW1lbnQgPSBlbGVtZW50CgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMua2V5cygpKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSkKICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSB2YWx1ZQogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyCgogICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzKQoKICAgICAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzLml0ZW1zKCkpCgogICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzLnZhbHVlcygpKQoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdLnZhbHVlCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0KCiAgICBjbGFzcyBOb2RlQnVpbGRlcihiYXNlLk5vZGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgYmFzZS5Ob2RlLl9faW5pdF9fKHNlbGYsIGVsZW1lbnQubm9kZU5hbWUpCiAgICAgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKCiAgICAgICAgbmFtZXNwYWNlID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IGhhc2F0dHIoc2VsZi5lbGVtZW50LCAibmFtZXNwYWNlVVJJIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50Lm5hbWVzcGFjZVVSSSBvciBOb25lKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgogICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZS5lbGVtZW50KQoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgIHRleHQgPSBzZWxmLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKQogICAgICAgICAgICBpZiBpbnNlcnRCZWZvcmU6CiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRleHQsIGluc2VydEJlZm9yZS5lbGVtZW50KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LmFwcGVuZENoaWxkKHRleHQpCgogICAgICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CiAgICAgICAgICAgIHNlbGYuZWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZS5lbGVtZW50LCByZWZOb2RlLmVsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIG5vZGUuZWxlbWVudC5wYXJlbnROb2RlID09IHNlbGYuZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5yZW1vdmVDaGlsZChub2RlLmVsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gTm9uZQoKICAgICAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICAgICB3aGlsZSBzZWxmLmVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOgogICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLmVsZW1lbnQuZmlyc3RDaGlsZAogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKQogICAgICAgICAgICAgICAgbmV3UGFyZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpCiAgICAgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCgogICAgICAgIGRlZiBnZXRBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gQXR0ckxpc3Qoc2VsZi5lbGVtZW50KQoKICAgICAgICBkZWYgc2V0QXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKToKICAgICAgICAgICAgaWYgYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KGF0dHJpYnV0ZXMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gKG5hbWVbMF0gKyAiOiIgKyBuYW1lWzFdKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IG5hbWVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVbMl0sIHF1YWxpZmllZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuc2V0QXR0cmlidXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUpCiAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KGdldEF0dHJpYnV0ZXMsIHNldEF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBjbG9uZU5vZGUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihzZWxmLmVsZW1lbnQuY2xvbmVOb2RlKEZhbHNlKSkKCiAgICAgICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVsZW1lbnQuaGFzQ2hpbGROb2RlcygpCgogICAgICAgIGRlZiBnZXROYW1lVHVwbGUoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlc1siaHRtbCJdLCBzZWxmLm5hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWVzcGFjZSwgc2VsZi5uYW1lCgogICAgICAgIG5hbWVUdXBsZSA9IHByb3BlcnR5KGdldE5hbWVUdXBsZSkKCiAgICBjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgZGVmIGRvY3VtZW50Q2xhc3Moc2VsZik6CiAgICAgICAgICAgIHNlbGYuZG9tID0gRG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICAgICAgcmV0dXJuIHdlYWtyZWYucHJveHkoc2VsZikKCiAgICAgICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgICAgIGRvbWltcGwgPSBEb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQogICAgICAgICAgICBkb2N0eXBlID0gZG9taW1wbC5jcmVhdGVEb2N1bWVudFR5cGUobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQogICAgICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKE5vZGVCdWlsZGVyKGRvY3R5cGUpKQogICAgICAgICAgICBpZiBEb20gPT0gbWluaWRvbToKICAgICAgICAgICAgICAgIGRvY3R5cGUub3duZXJEb2N1bWVudCA9IHNlbGYuZG9tCgogICAgICAgIGRlZiBlbGVtZW50Q2xhc3Moc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZSBhbmQgc2VsZi5kZWZhdWx0TmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb20uY3JlYXRlRWxlbWVudChuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9tLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIobm9kZSkKCiAgICAgICAgZGVmIGNvbW1lbnRDbGFzcyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKHNlbGYuZG9tLmNyZWF0ZUNvbW1lbnQoZGF0YSkpCgogICAgICAgIGRlZiBmcmFnbWVudENsYXNzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIoc2VsZi5kb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuZG9tLmFwcGVuZENoaWxkKG5vZGUuZWxlbWVudCkKCiAgICAgICAgZGVmIHRlc3RTZXJpYWxpemVyKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICByZXR1cm4gdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCkKCiAgICAgICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb20KCiAgICAgICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5UcmVlQnVpbGRlci5nZXRGcmFnbWVudChzZWxmKS5lbGVtZW50CgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICAgICAgZGF0YSA9IGRhdGEKICAgICAgICAgICAgaWYgcGFyZW50ICE9IHNlbGY6CiAgICAgICAgICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLmluc2VydFRleHQoc2VsZiwgZGF0YSwgcGFyZW50KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBIQUNLOiBhbGxvdyB0ZXh0IG5vZGVzIGFzIGNoaWxkcmVuIG9mIHRoZSBkb2N1bWVudCBub2RlCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZG9tLCAnX2NoaWxkX25vZGVfdHlwZXMnKToKICAgICAgICAgICAgICAgICAgICAjIHB5bGludDpkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKICAgICAgICAgICAgICAgICAgICBpZiBOb2RlLlRFWFRfTk9ERSBub3QgaW4gc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzID0gbGlzdChzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXMuYXBwZW5kKE5vZGUuVEVYVF9OT0RFKQogICAgICAgICAgICAgICAgc2VsZi5kb20uYXBwZW5kQ2hpbGQoc2VsZi5kb20uY3JlYXRlVGV4dE5vZGUoZGF0YSkpCgogICAgICAgIGltcGxlbWVudGF0aW9uID0gRG9tSW1wbGVtZW50YXRpb24KICAgICAgICBuYW1lID0gTm9uZQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KToKICAgICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpCiAgICAgICAgcnYgPSBbXQoKICAgICAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCBpbmRlbnQ9MCk6CiAgICAgICAgICAgIGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lm5hbWU6CiAgICAgICAgICAgICAgICAgICAgaWYgZWxlbWVudC5wdWJsaWNJZCBvciBlbGVtZW50LnN5c3RlbUlkOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQucHVibGljSWQgb3IgIiIKICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LnN5c3RlbUlkIG9yICIiCiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiJ8JXM8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IURPQ1RZUEUgJXM+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubmFtZSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCFET0NUWVBFID4iICUgKCcgJyAqIGluZGVudCwpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQtZnJhZ21lbnQiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubm9kZVZhbHVlKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5ub2RlVmFsdWUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKGhhc2F0dHIoZWxlbWVudCwgIm5hbWVzcGFjZVVSSSIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm5hbWVzcGFjZVVSSSBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAoY29uc3RhbnRzLnByZWZpeGVzW2VsZW1lbnQubmFtZXNwYWNlVVJJXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm5vZGVOYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5ub2RlTmFtZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXM+IiAlICgnICcgKiBpbmRlbnQsIG5hbWUpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCk6CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGVsZW1lbnQuYXR0cmlidXRlcykpOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gZWxlbWVudC5hdHRyaWJ1dGVzLml0ZW0oaSkKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHIubm9kZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gYXR0ci5uYW1lc3BhY2VVUkkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChjb25zdGFudHMucHJlZml4ZXNbbnNdLCBhdHRyLmxvY2FsTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyLm5vZGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICAgIGluZGVudCArPSAyCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgICAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKICAgIHJldHVybiBsb2NhbHMoKQoKCiMgVGhlIGFjdHVhbCBtZWFucyB0byBnZXQgYSBtb2R1bGUhCmdldERvbU1vZHVsZSA9IG1vZHVsZUZhY3RvcnlGYWN0b3J5KGdldERvbUJ1aWxkZXIpClBLAwQUAAAAAAAAACEAoX2X8NwxAADcMQAAOgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKIyBweWxpbnQ6ZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgppbXBvcnQgcmUKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uIGltcG9ydCBfaWhhdGV4bWwKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCnRhZ19yZWdleHAgPSByZS5jb21waWxlKCJ7KFtefV0qKX0oLiopIikKCgpkZWYgZ2V0RVRyZWVCdWlsZGVyKEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24sIGZ1bGxUcmVlPUZhbHNlKToKICAgIEVsZW1lbnRUcmVlID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgogICAgRWxlbWVudFRyZWVDb21tZW50VHlwZSA9IEVsZW1lbnRUcmVlLkNvbW1lbnQoImFzZCIpLnRhZwoKICAgIGNsYXNzIEVsZW1lbnQoYmFzZS5Ob2RlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2UKICAgICAgICAgICAgc2VsZi5fZWxlbWVudCA9IEVsZW1lbnRUcmVlLkVsZW1lbnQoc2VsZi5fZ2V0RVRyZWVUYWcobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKSkKICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLm5hbWVUdXBsZSA9IG5hbWVzcGFjZXNbImh0bWwiXSwgc2VsZi5fbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5uYW1lVHVwbGUgPSBzZWxmLl9uYW1lc3BhY2UsIHNlbGYuX25hbWUKICAgICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQogICAgICAgICAgICBzZWxmLl9mbGFncyA9IFtdCgogICAgICAgIGRlZiBfZ2V0RVRyZWVUYWcoc2VsZiwgbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBldHJlZV90YWcgPSBuYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBldHJlZV90YWcgPSAieyVzfSVzIiAlIChuYW1lc3BhY2UsIG5hbWUpCiAgICAgICAgICAgIHJldHVybiBldHJlZV90YWcKCiAgICAgICAgZGVmIF9zZXROYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRhZyA9IHNlbGYuX2dldEVUcmVlVGFnKHNlbGYuX25hbWUsIHNlbGYuX25hbWVzcGFjZSkKCiAgICAgICAgZGVmIF9nZXROYW1lKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQoKICAgICAgICBuYW1lID0gcHJvcGVydHkoX2dldE5hbWUsIF9zZXROYW1lKQoKICAgICAgICBkZWYgX3NldE5hbWVzcGFjZShzZWxmLCBuYW1lc3BhY2UpOgogICAgICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2UKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZyhzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0TmFtZXNwYWNlKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXNwYWNlCgogICAgICAgIG5hbWVzcGFjZSA9IHByb3BlcnR5KF9nZXROYW1lc3BhY2UsIF9zZXROYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuYXR0cmliCgogICAgICAgIGRlZiBfc2V0QXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKToKICAgICAgICAgICAgIyBEZWxldGUgZXhpc3RpbmcgYXR0cmlidXRlcyBmaXJzdAogICAgICAgICAgICAjIFhYWCAtIHRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4uLgogICAgICAgICAgICBmb3Iga2V5IGluIGxpc3Qoc2VsZi5fZWxlbWVudC5hdHRyaWIua2V5cygpKToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9lbGVtZW50LmF0dHJpYltrZXldCiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJpYnV0ZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwga2V5WzFdKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0ga2V5CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldChuYW1lLCB2YWx1ZSkKCiAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KF9nZXRBdHRyaWJ1dGVzLCBfc2V0QXR0cmlidXRlcykKCiAgICAgICAgZGVmIF9nZXRDaGlsZE5vZGVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGROb2RlcwoKICAgICAgICBkZWYgX3NldENoaWxkTm9kZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBkZWwgc2VsZi5fZWxlbWVudFs6XQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBzZWxmLmluc2VydENoaWxkKGVsZW1lbnQpCgogICAgICAgIGNoaWxkTm9kZXMgPSBwcm9wZXJ0eShfZ2V0Q2hpbGROb2RlcywgX3NldENoaWxkTm9kZXMpCgogICAgICAgIGRlZiBoYXNDb250ZW50KHNlbGYpOgogICAgICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gb3IgdGV4dCIiIgogICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9lbGVtZW50LnRleHQgb3IgbGVuKHNlbGYuX2VsZW1lbnQpKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMuYXBwZW5kKG5vZGUpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuYXBwZW5kKG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5vZGUsIHJlZk5vZGUpOgogICAgICAgICAgICBpbmRleCA9IGxpc3Qoc2VsZi5fZWxlbWVudCkuaW5kZXgocmVmTm9kZS5fZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5pbnNlcnQoaW5kZXgsIG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQucmVtb3ZlKG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gTm9uZQoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgIGlmIG5vdChsZW4oc2VsZi5fZWxlbWVudCkpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSAiIgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ICs9IGRhdGEKICAgICAgICAgICAgZWxpZiBpbnNlcnRCZWZvcmUgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSB0ZXh0IGFzIHRoZSB0YWlsIG9mIHRoZSBsYXN0IGNoaWxkIGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50Wy0xXS50YWlsOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbLTFdLnRhaWwgPSAiIgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFstMV0udGFpbCArPSBkYXRhCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEluc2VydCB0aGUgdGV4dCBiZWZvcmUgdGhlIHNwZWNpZmllZCBub2RlCiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGxpc3Qoc2VsZi5fZWxlbWVudCkKICAgICAgICAgICAgICAgIGluZGV4ID0gY2hpbGRyZW4uaW5kZXgoaW5zZXJ0QmVmb3JlLl9lbGVtZW50KQogICAgICAgICAgICAgICAgaWYgaW5kZXggPiAwOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50W2luZGV4IC0gMV0udGFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFtpbmRleCAtIDFdLnRhaWwgPSAiIgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbaW5kZXggLSAxXS50YWlsICs9IGRhdGEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgKz0gZGF0YQoKICAgICAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgogICAgICAgICAgICBlbGVtZW50ID0gdHlwZShzZWxmKShzZWxmLm5hbWUsIHNlbGYubmFtZXNwYWNlKQogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2VsZi5hdHRyaWJ1dGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgICAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICAgICBpZiBuZXdQYXJlbnQuY2hpbGROb2RlczoKICAgICAgICAgICAgICAgIG5ld1BhcmVudC5jaGlsZE5vZGVzWy0xXS5fZWxlbWVudC50YWlsICs9IHNlbGYuX2VsZW1lbnQudGV4dAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IG5ld1BhcmVudC5fZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudC5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2VsZW1lbnQudGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dCArPSBzZWxmLl9lbGVtZW50LnRleHQKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgYmFzZS5Ob2RlLnJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KQoKICAgIGNsYXNzIENvbW1lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAjIFVzZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciB0byBzZXQgYWxsIHByb3BlcnRpZXMgb24gdGhlCiAgICAgICAgICAgICMgd3JhcHBlciBlbGVtZW50CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBFbGVtZW50VHJlZS5Db21tZW50KGRhdGEpCiAgICAgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgICAgICBkZWYgX2dldERhdGEoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LnRleHQKCiAgICAgICAgZGVmIF9zZXREYXRhKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gdmFsdWUKCiAgICAgICAgZGF0YSA9IHByb3BlcnR5KF9nZXREYXRhLCBfc2V0RGF0YSkKCiAgICBjbGFzcyBEb2N1bWVudFR5cGUoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CiAgICAgICAgICAgIEVsZW1lbnQuX19pbml0X18oc2VsZiwgIjwhRE9DVFlQRT4iKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSBuYW1lCiAgICAgICAgICAgIHNlbGYucHVibGljSWQgPSBwdWJsaWNJZAogICAgICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKCiAgICAgICAgZGVmIF9nZXRQdWJsaWNJZChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuZ2V0KCJwdWJsaWNJZCIsICIiKQoKICAgICAgICBkZWYgX3NldFB1YmxpY0lkKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldCgicHVibGljSWQiLCB2YWx1ZSkKCiAgICAgICAgcHVibGljSWQgPSBwcm9wZXJ0eShfZ2V0UHVibGljSWQsIF9zZXRQdWJsaWNJZCkKCiAgICAgICAgZGVmIF9nZXRTeXN0ZW1JZChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIsICIiKQoKICAgICAgICBkZWYgX3NldFN5c3RlbUlkKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldCgic3lzdGVtSWQiLCB2YWx1ZSkKCiAgICAgICAgc3lzdGVtSWQgPSBwcm9wZXJ0eShfZ2V0U3lzdGVtSWQsIF9zZXRTeXN0ZW1JZCkKCiAgICBjbGFzcyBEb2N1bWVudChFbGVtZW50KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIEVsZW1lbnQuX19pbml0X18oc2VsZiwgIkRPQ1VNRU5UX1JPT1QiKQoKICAgIGNsYXNzIERvY3VtZW50RnJhZ21lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICJET0NVTUVOVF9GUkFHTUVOVCIpCgogICAgZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgICAgIHJ2ID0gW10KCiAgICAgICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgaW5kZW50PTApOgogICAgICAgICAgICBpZiBub3QoaGFzYXR0cihlbGVtZW50LCAidGFnIikpOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0cm9vdCgpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFnID09ICI8IURPQ1RZUEU+IjoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yIGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpOgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIiIjwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQudGV4dCwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IURPQ1RZUEUgJXM+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSAiRE9DVU1FTlRfUk9PVCI6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgdGFpbCIpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKSBhbmQgbGVuKGVsZW1lbnQuYXR0cmliKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgYXR0cmlidXRlcyIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCEtLSAlcyAtLT4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVsZW1lbnQudGFnLCB0ZXh0X3R5cGUpLCBcCiAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHVuaWNvZGUsIGdvdCAlcywgJXMiICUgKHR5cGUoZWxlbWVudC50YWcpLCBlbGVtZW50LnRhZykKICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKGVsZW1lbnQudGFnKQoKICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC50YWcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbnMsIG5hbWUgPSBuc21hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzPiIgJSAoJyAnICogaW5kZW50LCBuYW1lKSkKCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgbnNtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGVuZCgoYXR0cl9zdHJpbmcsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCd8JXMlcz0iJXMiJyAlICgnICcgKiAoaW5kZW50ICsgMiksIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCArIDIpLCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgLSAyKSwgZWxlbWVudC50YWlsKSkKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIDApCgogICAgICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgogICAgZGVmIHRvc3RyaW5nKGVsZW1lbnQpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICAiIiJTZXJpYWxpemUgYW4gZWxlbWVudCBhbmQgaXRzIGNoaWxkIG5vZGVzIHRvIGEgc3RyaW5nIiIiCiAgICAgICAgcnYgPSBbXQogICAgICAgIGZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKCkKCiAgICAgICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgRWxlbWVudFRyZWUuRWxlbWVudFRyZWUpOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0cm9vdCgpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRhZyA9PSAiPCFET0NUWVBFPiI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciBlbGVtZW50LmdldCgic3lzdGVtSWQiKToKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LmdldCgic3lzdGVtSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiI8IURPQ1RZUEUgJXMgUFVCTElDICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudC50ZXh0LCBwdWJsaWNJZCwgc3lzdGVtSWQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwhRE9DVFlQRSAlcz4iICUgKGVsZW1lbnQudGV4dCwpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09ICJET0NVTUVOVF9ST09UIjoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50ZXh0KQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSB0YWlsIikKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpIGFuZCBsZW4oZWxlbWVudC5hdHRyaWIpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSBhdHRyaWJ1dGVzIikKCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkKQoKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBFbGVtZW50VHJlZUNvbW1lbnRUeXBlOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IS0tJXMtLT4iICUgKGVsZW1lbnQudGV4dCwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICAgICAgaWYgbm90IGVsZW1lbnQuYXR0cmliOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzPiIgJSAoZmlsdGVyLmZyb21YbWxOYW1lKGVsZW1lbnQudGFnKSwpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZnJvbVhtbE5hbWUobmFtZSksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKV0pCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXMgJXM+IiAlIChlbGVtZW50LnRhZywgYXR0cikpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkKQoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPC8lcz4iICUgKGVsZW1lbnQudGFnLCkpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50YWlsKQoKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpCgogICAgICAgIHJldHVybiAiIi5qb2luKHJ2KQoKICAgIGNsYXNzIFRyZWVCdWlsZGVyKGJhc2UuVHJlZUJ1aWxkZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICBkb2N1bWVudENsYXNzID0gRG9jdW1lbnQKICAgICAgICBkb2N0eXBlQ2xhc3MgPSBEb2N1bWVudFR5cGUKICAgICAgICBlbGVtZW50Q2xhc3MgPSBFbGVtZW50CiAgICAgICAgY29tbWVudENsYXNzID0gQ29tbWVudAogICAgICAgIGZyYWdtZW50Q2xhc3MgPSBEb2N1bWVudEZyYWdtZW50CiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uCgogICAgICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpCgogICAgICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKICAgICAgICAgICAgaWYgZnVsbFRyZWU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0TmFtZXNwYWNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50LmZpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICJ7JXN9aHRtbCIgJSBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50LmZpbmQoImh0bWwiKQoKICAgICAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRyZWVCdWlsZGVyLmdldEZyYWdtZW50KHNlbGYpLl9lbGVtZW50CgogICAgcmV0dXJuIGxvY2FscygpCgoKZ2V0RVRyZWVNb2R1bGUgPSBtb2R1bGVGYWN0b3J5RmFjdG9yeShnZXRFVHJlZUJ1aWxkZXIpClBLAwQUAAAAAAAAACEA2v5K0FE3AABRNwAAPwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWVfbHhtbC5weSIiIk1vZHVsZSBmb3Igc3VwcG9ydGluZyB0aGUgbHhtbC5ldHJlZSBsaWJyYXJ5LiBUaGUgaWRlYSBoZXJlIGlzIHRvIHVzZSBhcyBtdWNoCm9mIHRoZSBuYXRpdmUgbGlicmFyeSBhcyBwb3NzaWJsZSwgd2l0aG91dCB1c2luZyBmcmFnaWxlIGhhY2tzIGxpa2UgY3VzdG9tIGVsZW1lbnQKbmFtZXMgdGhhdCBicmVhayBiZXR3ZWVuIHJlbGVhc2VzLiBUaGUgZG93bnNpZGUgb2YgdGhpcyBpcyB0aGF0IHdlIGNhbm5vdCByZXByZXNlbnQKYWxsIHBvc3NpYmxlIHRyZWVzOyBzcGVjaWZpY2FsbHkgdGhlIGZvbGxvd2luZyBhcmUga25vd24gdG8gY2F1c2UgcHJvYmxlbXM6CgpUZXh0IG9yIGNvbW1lbnRzIGFzIHNpYmxpbmdzIG9mIHRoZSByb290IGVsZW1lbnQKRG9jeXBlcyB3aXRoIG5vIG5hbWUKCldoZW4gYW55IG9mIHRoZXNlIHRoaW5ncyBvY2N1ciwgd2UgZW1pdCBhIERhdGFMb3NzV2FybmluZwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwojIHB5bGludDpkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcmUKaW1wb3J0IHN5cwoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IERhdGFMb3NzV2FybmluZwpmcm9tIC4uIGltcG9ydCBjb25zdGFudHMKZnJvbSAuIGltcG9ydCBldHJlZSBhcyBldHJlZV9idWlsZGVycwpmcm9tIC4uIGltcG9ydCBfaWhhdGV4bWwKCmltcG9ydCBseG1sLmV0cmVlIGFzIGV0cmVlCgoKZnVsbFRyZWUgPSBUcnVlCnRhZ19yZWdleHAgPSByZS5jb21waWxlKCJ7KFtefV0qKX0oLiopIikKCmNvbW1lbnRfdHlwZSA9IGV0cmVlLkNvbW1lbnQoImFzZCIpLnRhZwoKCmNsYXNzIERvY3VtZW50VHlwZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucHVibGljSWQgPSBwdWJsaWNJZAogICAgICAgIHNlbGYuc3lzdGVtSWQgPSBzeXN0ZW1JZAoKCmNsYXNzIERvY3VtZW50KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fZWxlbWVudFRyZWUgPSBOb25lCiAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCgogICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIGVsZW1lbnQpOgogICAgICAgIHNlbGYuX2VsZW1lbnRUcmVlLmdldHJvb3QoKS5hZGRuZXh0KGVsZW1lbnQuX2VsZW1lbnQpCgogICAgZGVmIF9nZXRDaGlsZE5vZGVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jaGlsZE5vZGVzCgogICAgY2hpbGROb2RlcyA9IHByb3BlcnR5KF9nZXRDaGlsZE5vZGVzKQoKCmRlZiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KToKICAgIHJ2ID0gW10KICAgIGluZm9zZXRGaWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcihwcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzPVRydWUpCgogICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgaW5kZW50PTApOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGVsZW1lbnQsICJ0YWciKToKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiZ2V0cm9vdCIpOgogICAgICAgICAgICAgICAgIyBGdWxsIHRyZWUgY2FzZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQiKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5kb2NpbmZvLmludGVybmFsRFREOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoZWxlbWVudC5kb2NpbmZvLnB1YmxpY19pZCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnN5c3RlbV91cmwpOgogICAgICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gIjwhRE9DVFlQRSAlcz4iICUgZWxlbWVudC5kb2NpbmZvLnJvb3RfbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSAiIiI8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5yb290X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8ucHVibGljX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnN5c3RlbV91cmwpCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXMlcyIgJSAoJyAnICogKGluZGVudCArIDIpLCBkdGRfc3RyKSkKICAgICAgICAgICAgICAgIG5leHRfZWxlbWVudCA9IGVsZW1lbnQuZ2V0cm9vdCgpCiAgICAgICAgICAgICAgICB3aGlsZSBuZXh0X2VsZW1lbnQuZ2V0cHJldmlvdXMoKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXh0X2VsZW1lbnQgPSBuZXh0X2VsZW1lbnQuZ2V0cHJldmlvdXMoKQogICAgICAgICAgICAgICAgd2hpbGUgbmV4dF9lbGVtZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQobmV4dF9lbGVtZW50LCBpbmRlbnQgKyAyKQogICAgICAgICAgICAgICAgICAgIG5leHRfZWxlbWVudCA9IG5leHRfZWxlbWVudC5nZXRuZXh0KCkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGVsZW1lbnQsIHN0cikgb3IgaXNpbnN0YW5jZShlbGVtZW50LCBieXRlcyk6CiAgICAgICAgICAgICAgICAjIFRleHQgaW4gYSBmcmFnbWVudAogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWxlbWVudCwgc3RyKSBvciBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGcmFnbWVudCBjYXNlCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudC1mcmFnbWVudCIpCiAgICAgICAgICAgICAgICBmb3IgbmV4dF9lbGVtZW50IGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChuZXh0X2VsZW1lbnQsIGluZGVudCArIDIpCiAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBjb21tZW50X3R5cGU6CiAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCEtLSAlcyAtLT4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAidGFpbCIpIGFuZCBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50LnRhaWwpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVsZW1lbnQsIGV0cmVlLl9FbGVtZW50KQogICAgICAgICAgICBuc21hdGNoID0gZXRyZWVfYnVpbGRlcnMudGFnX3JlZ2V4cC5tYXRjaChlbGVtZW50LnRhZykKICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIG5zID0gbnNtYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgdGFnID0gbnNtYXRjaC5ncm91cCgyKQogICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXMgJXM+IiAlICgnICcgKiBpbmRlbnQsIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZSh0YWcpKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzPiIgJSAoJyAnICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKGVsZW1lbnQudGFnKSkpCgogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKToKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgbnNtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBuc21hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBucywgbmFtZSA9IG5zbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9ICIlcyAlcyIgJSAocHJlZml4LCBuYW1lKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShuYW1lKQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYXBwZW5kKChhdHRyX3N0cmluZywgdmFsdWUpKQoKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCd8JXMlcz0iJXMiJyAlICgnICcgKiAoaW5kZW50ICsgMiksIG5hbWUsIHZhbHVlKSkKCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGluZGVudCArPSAyCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCwgaW5kZW50KQogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIikgYW5kIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50IC0gMiksIGVsZW1lbnQudGFpbCkpCiAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIDApCgogICAgcmV0dXJuICJcbiIuam9pbihydikKCgpkZWYgdG9zdHJpbmcoZWxlbWVudCk6CiAgICAiIiJTZXJpYWxpemUgYW4gZWxlbWVudCBhbmQgaXRzIGNoaWxkIG5vZGVzIHRvIGEgc3RyaW5nIiIiCiAgICBydiA9IFtdCgogICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgInRhZyIpOgogICAgICAgICAgICBpZiBlbGVtZW50LmRvY2luZm8uaW50ZXJuYWxEVEQ6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmRvY2luZm8uZG9jdHlwZToKICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gZWxlbWVudC5kb2NpbmZvLmRvY3R5cGUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9ICI8IURPQ1RZUEUgJXM+IiAlIGVsZW1lbnQuZG9jaW5mby5yb290X25hbWUKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChkdGRfc3RyKQogICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQuZ2V0cm9vdCgpKQoKICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IGNvbW1lbnRfdHlwZToKICAgICAgICAgICAgcnYuYXBwZW5kKCI8IS0tJXMtLT4iICUgKGVsZW1lbnQudGV4dCwpKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgIGlmIG5vdCBlbGVtZW50LmF0dHJpYjoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzPiIgJSAoZWxlbWVudC50YWcsKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHIgPSAiICIuam9pbihbIiVzPVwiJXNcIiIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBlbGVtZW50LmF0dHJpYi5pdGVtcygpXSkKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzICVzPiIgJSAoZWxlbWVudC50YWcsIGF0dHIpKQogICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50ZXh0KQoKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkKQoKICAgICAgICAgICAgcnYuYXBwZW5kKCI8LyVzPiIgJSAoZWxlbWVudC50YWcsKSkKCiAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAidGFpbCIpIGFuZCBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRhaWwpCgogICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KQoKICAgIHJldHVybiAiIi5qb2luKHJ2KQoKCmNsYXNzIFRyZWVCdWlsZGVyKGJhc2UuVHJlZUJ1aWxkZXIpOgogICAgZG9jdW1lbnRDbGFzcyA9IERvY3VtZW50CiAgICBkb2N0eXBlQ2xhc3MgPSBEb2N1bWVudFR5cGUKICAgIGVsZW1lbnRDbGFzcyA9IE5vbmUKICAgIGNvbW1lbnRDbGFzcyA9IE5vbmUKICAgIGZyYWdtZW50Q2xhc3MgPSBEb2N1bWVudAogICAgaW1wbGVtZW50YXRpb24gPSBldHJlZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMsIGZ1bGxUcmVlPUZhbHNlKToKICAgICAgICBidWlsZGVyID0gZXRyZWVfYnVpbGRlcnMuZ2V0RVRyZWVNb2R1bGUoZXRyZWUsIGZ1bGxUcmVlPWZ1bGxUcmVlKQogICAgICAgIGluZm9zZXRGaWx0ZXIgPSBzZWxmLmluZm9zZXRGaWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcihwcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzPVRydWUpCiAgICAgICAgc2VsZi5uYW1lc3BhY2VIVE1MRWxlbWVudHMgPSBuYW1lc3BhY2VIVE1MRWxlbWVudHMKCiAgICAgICAgY2xhc3MgQXR0cmlidXRlcyhkaWN0KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQsIHZhbHVlPU5vbmUpOgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50ID0gZWxlbWVudAogICAgICAgICAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmLCB2YWx1ZSkgICMgcHlsaW50OmRpc2FibGU9bm9uLXBhcmVudC1pbml0LWNhbGxlZAogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlIChrZXlbMl0sIGluZm9zZXRGaWx0ZXIuY29lcmNlQXR0cmlidXRlKGtleVsxXSkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQXR0cmlidXRlKGtleSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50Ll9lbGVtZW50LmF0dHJpYltuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlIChrZXlbMl0sIGluZm9zZXRGaWx0ZXIuY29lcmNlQXR0cmlidXRlKGtleVsxXSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXkpCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50Ll9lbGVtZW50LmF0dHJpYltuYW1lXSA9IHZhbHVlCgogICAgICAgIGNsYXNzIEVsZW1lbnQoYnVpbGRlci5FbGVtZW50KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VFbGVtZW50KG5hbWUpCiAgICAgICAgICAgICAgICBidWlsZGVyLkVsZW1lbnQuX19pbml0X18oc2VsZiwgbmFtZSwgbmFtZXNwYWNlPW5hbWVzcGFjZSkKICAgICAgICAgICAgICAgIHNlbGYuX2F0dHJpYnV0ZXMgPSBBdHRyaWJ1dGVzKHNlbGYpCgogICAgICAgICAgICBkZWYgX3NldE5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICBzZWxmLl9uYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VFbGVtZW50KG5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRhZyA9IHNlbGYuX2dldEVUcmVlVGFnKAogICAgICAgICAgICAgICAgICAgIHNlbGYuX25hbWUsIHNlbGYuX25hbWVzcGFjZSkKCiAgICAgICAgICAgIGRlZiBfZ2V0TmFtZShzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKHNlbGYuX25hbWUpCgogICAgICAgICAgICBuYW1lID0gcHJvcGVydHkoX2dldE5hbWUsIF9zZXROYW1lKQoKICAgICAgICAgICAgZGVmIF9nZXRBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJpYnV0ZXMKCiAgICAgICAgICAgIGRlZiBfc2V0QXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgIHNlbGYuX2F0dHJpYnV0ZXMgPSBBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpCgogICAgICAgICAgICBhdHRyaWJ1dGVzID0gcHJvcGVydHkoX2dldEF0dHJpYnV0ZXMsIF9zZXRBdHRyaWJ1dGVzKQoKICAgICAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICAgICAgICAgZGF0YSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQ2hhcmFjdGVycyhkYXRhKQogICAgICAgICAgICAgICAgYnVpbGRlci5FbGVtZW50Lmluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlKQoKICAgICAgICAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIGNoaWxkKToKICAgICAgICAgICAgICAgIGJ1aWxkZXIuRWxlbWVudC5hcHBlbmRDaGlsZChzZWxmLCBjaGlsZCkKCiAgICAgICAgY2xhc3MgQ29tbWVudChidWlsZGVyLkNvbW1lbnQpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgICAgICAgICBkYXRhID0gaW5mb3NldEZpbHRlci5jb2VyY2VDb21tZW50KGRhdGEpCiAgICAgICAgICAgICAgICBidWlsZGVyLkNvbW1lbnQuX19pbml0X18oc2VsZiwgZGF0YSkKCiAgICAgICAgICAgIGRlZiBfc2V0RGF0YShzZWxmLCBkYXRhKToKICAgICAgICAgICAgICAgIGRhdGEgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUNvbW1lbnQoZGF0YSkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9IGRhdGEKCiAgICAgICAgICAgIGRlZiBfZ2V0RGF0YShzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LnRleHQKCiAgICAgICAgICAgIGRhdGEgPSBwcm9wZXJ0eShfZ2V0RGF0YSwgX3NldERhdGEpCgogICAgICAgIHNlbGYuZWxlbWVudENsYXNzID0gRWxlbWVudAogICAgICAgIHNlbGYuY29tbWVudENsYXNzID0gQ29tbWVudAogICAgICAgICMgc2VsZi5mcmFnbWVudENsYXNzID0gYnVpbGRlci5Eb2N1bWVudEZyYWdtZW50CiAgICAgICAgYmFzZS5UcmVlQnVpbGRlci5fX2luaXRfXyhzZWxmLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIGJhc2UuVHJlZUJ1aWxkZXIucmVzZXQoc2VsZikKICAgICAgICBzZWxmLmluc2VydENvbW1lbnQgPSBzZWxmLmluc2VydENvbW1lbnRJbml0aWFsCiAgICAgICAgc2VsZi5pbml0aWFsX2NvbW1lbnRzID0gW10KICAgICAgICBzZWxmLmRvY3R5cGUgPSBOb25lCgogICAgZGVmIHRlc3RTZXJpYWxpemVyKHNlbGYsIGVsZW1lbnQpOgogICAgICAgIHJldHVybiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KQoKICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKICAgICAgICBpZiBmdWxsVHJlZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlLmdldHJvb3QoKQoKICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKICAgICAgICBmcmFnbWVudCA9IFtdCiAgICAgICAgZWxlbWVudCA9IHNlbGYub3BlbkVsZW1lbnRzWzBdLl9lbGVtZW50CiAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoZWxlbWVudC50ZXh0KQogICAgICAgIGZyYWdtZW50LmV4dGVuZChsaXN0KGVsZW1lbnQpKQogICAgICAgIGlmIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsZW1lbnQudGFpbCkKICAgICAgICByZXR1cm4gZnJhZ21lbnQKCiAgICBkZWYgaW5zZXJ0RG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgc3lzdGVtSWQgPSB0b2tlblsic3lzdGVtSWQiXQoKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigibHhtbCBjYW5ub3QgcmVwcmVzZW50IGVtcHR5IGRvY3R5cGUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHNlbGYuZG9jdHlwZSA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb2VyY2VkTmFtZSA9IHNlbGYuaW5mb3NldEZpbHRlci5jb2VyY2VFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIGlmIGNvZXJjZWROYW1lICE9IG5hbWU6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgbm9uLXhtbCBkb2N0eXBlIiwgRGF0YUxvc3NXYXJuaW5nKQoKICAgICAgICAgICAgZG9jdHlwZSA9IHNlbGYuZG9jdHlwZUNsYXNzKGNvZXJjZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCiAgICAgICAgICAgIHNlbGYuZG9jdHlwZSA9IGRvY3R5cGUKCiAgICBkZWYgaW5zZXJ0Q29tbWVudEluaXRpYWwoc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgIGFzc2VydCBwYXJlbnQgaXMgTm9uZSBvciBwYXJlbnQgaXMgc2VsZi5kb2N1bWVudAogICAgICAgIGFzc2VydCBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZSBpcyBOb25lCiAgICAgICAgc2VsZi5pbml0aWFsX2NvbW1lbnRzLmFwcGVuZChkYXRhKQoKICAgIGRlZiBpbnNlcnRDb21tZW50TWFpbihzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgaWYgKHBhcmVudCA9PSBzZWxmLmRvY3VtZW50IGFuZAogICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUuZ2V0cm9vdCgpWy0xXS50YWcgPT0gY29tbWVudF90eXBlKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigibHhtbCBjYW5ub3QgcmVwcmVzZW50IGFkamFjZW50IGNvbW1lbnRzIGJleW9uZCB0aGUgcm9vdCBlbGVtZW50cyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICBzdXBlcihUcmVlQnVpbGRlciwgc2VsZikuaW5zZXJ0Q29tbWVudChkYXRhLCBwYXJlbnQpCgogICAgZGVmIGluc2VydFJvb3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICIiIkNyZWF0ZSB0aGUgZG9jdW1lbnQgcm9vdCIiIgogICAgICAgICMgQmVjYXVzZSBvZiB0aGUgd2F5IGxpYnhtbDIgd29ya3MsIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBwb3NzaWJsZSB0bwogICAgICAgICMgYWx0ZXIgaW5mb3JtYXRpb24gbGlrZSB0aGUgZG9jdHlwZSBhZnRlciB0aGUgdHJlZSBoYXMgYmVlbiBwYXJzZWQuCiAgICAgICAgIyBUaGVyZWZvcmUgd2UgbmVlZCB0byB1c2UgdGhlIGJ1aWx0LWluIHBhcnNlciB0byBjcmVhdGUgb3VyIGluaXRpYWwKICAgICAgICAjIHRyZWUsIGFmdGVyIHdoaWNoIHdlIGNhbiBhZGQgZWxlbWVudHMgbGlrZSBub3JtYWwKICAgICAgICBkb2NTdHIgPSAiIgogICAgICAgIGlmIHNlbGYuZG9jdHlwZToKICAgICAgICAgICAgYXNzZXJ0IHNlbGYuZG9jdHlwZS5uYW1lCiAgICAgICAgICAgIGRvY1N0ciArPSAiPCFET0NUWVBFICVzIiAlIHNlbGYuZG9jdHlwZS5uYW1lCiAgICAgICAgICAgIGlmIChzZWxmLmRvY3R5cGUucHVibGljSWQgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLmRvY3R5cGUuc3lzdGVtSWQgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZG9jU3RyICs9ICgnIFBVQkxJQyAiJXMiICcgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pbmZvc2V0RmlsdGVyLmNvZXJjZVB1YmlkKHNlbGYuZG9jdHlwZS5wdWJsaWNJZCBvciAiIikpKQogICAgICAgICAgICAgICAgaWYgc2VsZi5kb2N0eXBlLnN5c3RlbUlkOgogICAgICAgICAgICAgICAgICAgIHN5c2lkID0gc2VsZi5kb2N0eXBlLnN5c3RlbUlkCiAgICAgICAgICAgICAgICAgICAgaWYgc3lzaWQuZmluZCgiJyIpID49IDAgYW5kIHN5c2lkLmZpbmQoJyInKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJET0NUWVBFIHN5c3RlbSBjYW5ub3QgY29udGFpbiBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIHN5c2lkID0gc3lzaWQucmVwbGFjZSgiJyIsICdVMDAwMjcnKQogICAgICAgICAgICAgICAgICAgIGlmIHN5c2lkLmZpbmQoIiciKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkb2NTdHIgKz0gJyIlcyInICUgc3lzaWQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkb2NTdHIgKz0gIiclcyciICUgc3lzaWQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZG9jU3RyICs9ICInJyIKICAgICAgICAgICAgZG9jU3RyICs9ICI+IgogICAgICAgICAgICBpZiBzZWxmLmRvY3R5cGUubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibHhtbCBjYW5ub3QgcmVwcmVzZW50IGRvY3R5cGUgd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRvIHRoZSByb290IGVsZW1lbnQiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgZG9jU3RyICs9ICI8VEhJU19TSE9VTERfTkVWRVJfQVBQRUFSX1BVQkxJQ0xZLz4iCiAgICAgICAgcm9vdCA9IGV0cmVlLmZyb21zdHJpbmcoZG9jU3RyKQoKICAgICAgICAjIEFwcGVuZCB0aGUgaW5pdGlhbCBjb21tZW50czoKICAgICAgICBmb3IgY29tbWVudF90b2tlbiBpbiBzZWxmLmluaXRpYWxfY29tbWVudHM6CiAgICAgICAgICAgIGNvbW1lbnQgPSBzZWxmLmNvbW1lbnRDbGFzcyhjb21tZW50X3Rva2VuWyJkYXRhIl0pCiAgICAgICAgICAgIHJvb3QuYWRkcHJldmlvdXMoY29tbWVudC5fZWxlbWVudCkKCiAgICAgICAgIyBDcmVhdGUgdGhlIHJvb3QgZG9jdW1lbnQgYW5kIGFkZCB0aGUgRWxlbWVudFRyZWUgdG8gaXQKICAgICAgICBzZWxmLmRvY3VtZW50ID0gc2VsZi5kb2N1bWVudENsYXNzKCkKICAgICAgICBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZSA9IHJvb3QuZ2V0cm9vdHRyZWUoKQoKICAgICAgICAjIEdpdmUgdGhlIHJvb3QgZWxlbWVudCB0aGUgcmlnaHQgbmFtZQogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgbmFtZXNwYWNlID0gdG9rZW4uZ2V0KCJuYW1lc3BhY2UiLCBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgIGV0cmVlX3RhZyA9IG5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBldHJlZV90YWcgPSAieyVzfSVzIiAlIChuYW1lc3BhY2UsIG5hbWUpCiAgICAgICAgcm9vdC50YWcgPSBldHJlZV90YWcKCiAgICAgICAgIyBBZGQgdGhlIHJvb3QgZWxlbWVudCB0byB0aGUgaW50ZXJuYWwgY2hpbGQvb3BlbiBkYXRhIHN0cnVjdHVyZXMKICAgICAgICByb290X2VsZW1lbnQgPSBzZWxmLmVsZW1lbnRDbGFzcyhuYW1lLCBuYW1lc3BhY2UpCiAgICAgICAgcm9vdF9lbGVtZW50Ll9lbGVtZW50ID0gcm9vdAogICAgICAgIHNlbGYuZG9jdW1lbnQuX2NoaWxkTm9kZXMuYXBwZW5kKHJvb3RfZWxlbWVudCkKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQocm9vdF9lbGVtZW50KQoKICAgICAgICAjIFJlc2V0IHRvIHRoZSBkZWZhdWx0IGluc2VydCBjb21tZW50IGZ1bmN0aW9uCiAgICAgICAgc2VsZi5pbnNlcnRDb21tZW50ID0gc2VsZi5pbnNlcnRDb21tZW50TWFpbgpQSwMEFAAAAAAAAAAhAHNEIZaoFQAAqBUAADwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvX19pbml0X18ucHkiIiJBIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IgaXRlcmF0aW5nIHRocm91Z2ggZGlmZmVyZW50IGtpbmRzIG9mCnRyZWUsIGdlbmVyYXRpbmcgdG9rZW5zIGlkZW50aWNhbCB0byB0aG9zZSBwcm9kdWNlZCBieSB0aGUgdG9rZW5pemVyCm1vZHVsZS4KClRvIGNyZWF0ZSBhIHRyZWUgd2Fsa2VyIGZvciBhIG5ldyB0eXBlIG9mIHRyZWUsIHlvdSBuZWVkIHRvIGRvCmltcGxlbWVudCBhIHRyZWUgd2Fsa2VyIG9iamVjdCAoY2FsbGVkIFRyZWVXYWxrZXIgYnkgY29udmVudGlvbikgdGhhdAppbXBsZW1lbnRzIGEgJ3NlcmlhbGl6ZScgbWV0aG9kIHRha2luZyBhIHRyZWUgYXMgc29sZSBhcmd1bWVudCBhbmQKcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIGdlbmVyYXRpbmcgdG9rZW5zLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5fdXRpbHMgaW1wb3J0IGRlZmF1bHRfZXRyZWUKCl9fYWxsX18gPSBbImdldFRyZWVXYWxrZXIiLCAicHByaW50IiwgImRvbSIsICJldHJlZSIsICJnZW5zaGkiLCAiZXRyZWVfbHhtbCJdCgp0cmVlV2Fsa2VyQ2FjaGUgPSB7fQoKCmRlZiBnZXRUcmVlV2Fsa2VyKHRyZWVUeXBlLCBpbXBsZW1lbnRhdGlvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAiIiJHZXQgYSBUcmVlV2Fsa2VyIGNsYXNzIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRyZWUgd2l0aCBidWlsdC1pbiBzdXBwb3J0CgogICAgQXJnczoKICAgICAgICB0cmVlVHlwZSAoc3RyKTogdGhlIG5hbWUgb2YgdGhlIHRyZWUgdHlwZSByZXF1aXJlZCAoY2FzZS1pbnNlbnNpdGl2ZSkuCiAgICAgICAgICAgIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgoKICAgICAgICAgICAgLSAiZG9tIjogVGhlIHhtbC5kb20ubWluaWRvbSBET00gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgLSAiZXRyZWUiOiBBIGdlbmVyaWMgd2Fsa2VyIGZvciB0cmVlIGltcGxlbWVudGF0aW9ucyBleHBvc2luZyBhbgogICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnR0cmVlLWxpa2UgaW50ZXJmYWNlIChrbm93biB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHJlZSwgY0VsZW1lbnRUcmVlIGFuZCBseG1sLmV0cmVlKS4KICAgICAgICAgICAgLSAibHhtbCI6IE9wdGltaXplZCB3YWxrZXIgZm9yIGx4bWwuZXRyZWUKICAgICAgICAgICAgLSAiZ2Vuc2hpIjogYSBHZW5zaGkgc3RyZWFtCgogICAgICAgIEltcGxlbWVudGF0aW9uOiBBIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyZWUgdHlwZSBlLmcuCiAgICAgICAgICAgIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBvciBjRWxlbWVudFRyZWUgKEN1cnJlbnRseSBhcHBsaWVzIHRvIHRoZQogICAgICAgICAgICAiZXRyZWUiIHRyZWUgdHlwZSBvbmx5KS4KICAgICIiIgoKICAgIHRyZWVUeXBlID0gdHJlZVR5cGUubG93ZXIoKQogICAgaWYgdHJlZVR5cGUgbm90IGluIHRyZWVXYWxrZXJDYWNoZToKICAgICAgICBpZiB0cmVlVHlwZSA9PSAiZG9tIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBkb20KICAgICAgICAgICAgdHJlZVdhbGtlckNhY2hlW3RyZWVUeXBlXSA9IGRvbS5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZ2Vuc2hpIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBnZW5zaGkKICAgICAgICAgICAgdHJlZVdhbGtlckNhY2hlW3RyZWVUeXBlXSA9IGdlbnNoaS5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAibHhtbCI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWVfbHhtbAogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZXRyZWVfbHhtbC5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZXRyZWUiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlCiAgICAgICAgICAgIGlmIGltcGxlbWVudGF0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IGRlZmF1bHRfZXRyZWUKICAgICAgICAgICAgIyBYWFg6IE5FVkVSIGNhY2hlIGhlcmUsIGNhY2hpbmcgaXMgZG9uZSBpbiB0aGUgZXRyZWUgc3VibW9kdWxlCiAgICAgICAgICAgIHJldHVybiBldHJlZS5nZXRFVHJlZU1vZHVsZShpbXBsZW1lbnRhdGlvbiwgKiprd2FyZ3MpLlRyZWVXYWxrZXIKICAgIHJldHVybiB0cmVlV2Fsa2VyQ2FjaGUuZ2V0KHRyZWVUeXBlKQoKCmRlZiBjb25jYXRlbmF0ZUNoYXJhY3RlclRva2Vucyh0b2tlbnMpOgogICAgcGVuZGluZ0NoYXJhY3RlcnMgPSBbXQogICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICBwZW5kaW5nQ2hhcmFjdGVycy5hcHBlbmQodG9rZW5bImRhdGEiXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwZW5kaW5nQ2hhcmFjdGVyczoKICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJDaGFyYWN0ZXJzIiwgImRhdGEiOiAiIi5qb2luKHBlbmRpbmdDaGFyYWN0ZXJzKX0KICAgICAgICAgICAgICAgIHBlbmRpbmdDaGFyYWN0ZXJzID0gW10KICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgIGlmIHBlbmRpbmdDaGFyYWN0ZXJzOgogICAgICAgIHlpZWxkIHsidHlwZSI6ICJDaGFyYWN0ZXJzIiwgImRhdGEiOiAiIi5qb2luKHBlbmRpbmdDaGFyYWN0ZXJzKX0KCgpkZWYgcHByaW50KHdhbGtlcik6CiAgICAiIiJQcmV0dHkgcHJpbnRlciBmb3IgdHJlZSB3YWxrZXJzIiIiCiAgICBvdXRwdXQgPSBbXQogICAgaW5kZW50ID0gMAogICAgZm9yIHRva2VuIGluIGNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zKHdhbGtlcik6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgIyB0YWcgbmFtZQogICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl0gYW5kIHRva2VuWyJuYW1lc3BhY2UiXSAhPSBjb25zdGFudHMubmFtZXNwYWNlc1siaHRtbCJdOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdIGluIGNvbnN0YW50cy5wcmVmaXhlczoKICAgICAgICAgICAgICAgICAgICBucyA9IGNvbnN0YW50cy5wcmVmaXhlc1t0b2tlblsibmFtZXNwYWNlIl1dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5zID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChucywgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCVzPiIgJSAoIiAiICogaW5kZW50LCBuYW1lKSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIChzb3J0ZWQgZm9yIGNvbnNpc3RlbnQgb3JkZXJpbmcpCiAgICAgICAgICAgIGF0dHJzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBmb3IgKG5hbWVzcGFjZSwgbG9jYWxuYW1lKSwgdmFsdWUgaW4gc29ydGVkKGF0dHJzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpbiBjb25zdGFudHMucHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gY29uc3RhbnRzLnByZWZpeGVzW25hbWVzcGFjZV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBucyA9IG5hbWVzcGFjZQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKG5zLCBsb2NhbG5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBsb2NhbG5hbWUKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzJXM9XCIlc1wiIiAlICgiICIgKiBpbmRlbnQsIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgIyBzZWxmLWNsb3NpbmcKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaW5kZW50IC09IDIKCiAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICBpbmRlbnQgLT0gMgoKICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhLS0gJXMgLS0+IiAlICgiICIgKiBpbmRlbnQsIHRva2VuWyJkYXRhIl0pKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bInB1YmxpY0lkIl06CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIiIlczwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiICIgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsicHVibGljSWQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSBpZiB0b2tlblsic3lzdGVtSWQiXSBlbHNlICIiKSkKICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bInN5c3RlbUlkIl06CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIiIlczwhRE9DVFlQRSAlcyAiIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiAiICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInN5c3RlbUlkIl0pKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhRE9DVFlQRSAlcz4iICUgKCIgIiAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8IURPQ1RZUEUgPiIgJSAoIiAiICogaW5kZW50LCkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiQ2hhcmFjdGVycyI6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzXCIlc1wiIiAlICgiICIgKiBpbmRlbnQsIHRva2VuWyJkYXRhIl0pKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyI6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgImNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zIHNob3VsZCBoYXZlIGdvdCByaWQgb2YgYWxsIFNwYWNlIHRva2VucyIKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biB0b2tlbiB0eXBlLCAlcyIgJSB0eXBlKQoKICAgIHJldHVybiAiXG4iLmpvaW4ob3V0cHV0KQpQSwMEFAAAAAAAAAAhAE0jmMBLEwAASxMAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSB4bWwuZG9tIGltcG9ydCBOb2RlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMsIHZvaWRFbGVtZW50cywgc3BhY2VDaGFyYWN0ZXJzCgpfX2FsbF9fID0gWyJET0NVTUVOVCIsICJET0NUWVBFIiwgIlRFWFQiLCAiRUxFTUVOVCIsICJDT01NRU5UIiwgIkVOVElUWSIsICJVTktOT1dOIiwKICAgICAgICAgICAiVHJlZVdhbGtlciIsICJOb25SZWN1cnNpdmVUcmVlV2Fsa2VyIl0KCkRPQ1VNRU5UID0gTm9kZS5ET0NVTUVOVF9OT0RFCkRPQ1RZUEUgPSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERQpURVhUID0gTm9kZS5URVhUX05PREUKRUxFTUVOVCA9IE5vZGUuRUxFTUVOVF9OT0RFCkNPTU1FTlQgPSBOb2RlLkNPTU1FTlRfTk9ERQpFTlRJVFkgPSBOb2RlLkVOVElUWV9OT0RFClVOS05PV04gPSAiPCNVTktOT1dOIz4iCgpzcGFjZUNoYXJhY3RlcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykKCgpjbGFzcyBUcmVlV2Fsa2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CiAgICAgICAgc2VsZi50cmVlID0gdHJlZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGVycm9yKHNlbGYsIG1zZyk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJTZXJpYWxpemVFcnJvciIsICJkYXRhIjogbXNnfQoKICAgIGRlZiBlbXB0eVRhZyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUsIGF0dHJzLCBoYXNDaGlsZHJlbj1GYWxzZSk6CiAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVtcHR5VGFnIiwgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAibmFtZXNwYWNlIjogbmFtZXNwYWNlLAogICAgICAgICAgICAgICAiZGF0YSI6IGF0dHJzfQogICAgICAgIGlmIGhhc0NoaWxkcmVuOgogICAgICAgICAgICB5aWVsZCBzZWxmLmVycm9yKCJWb2lkIGVsZW1lbnQgaGFzIGNoaWxkcmVuIikKCiAgICBkZWYgc3RhcnRUYWcoc2VsZiwgbmFtZXNwYWNlLCBuYW1lLCBhdHRycyk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgImRhdGEiOiBhdHRyc30KCiAgICBkZWYgZW5kVGFnKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJFbmRUYWciLAogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZX0KCiAgICBkZWYgdGV4dChzZWxmLCBkYXRhKToKICAgICAgICBkYXRhID0gZGF0YQogICAgICAgIG1pZGRsZSA9IGRhdGEubHN0cmlwKHNwYWNlQ2hhcmFjdGVycykKICAgICAgICBsZWZ0ID0gZGF0YVs6bGVuKGRhdGEpIC0gbGVuKG1pZGRsZSldCiAgICAgICAgaWYgbGVmdDoKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIlNwYWNlQ2hhcmFjdGVycyIsICJkYXRhIjogbGVmdH0KICAgICAgICBkYXRhID0gbWlkZGxlCiAgICAgICAgbWlkZGxlID0gZGF0YS5yc3RyaXAoc3BhY2VDaGFyYWN0ZXJzKQogICAgICAgIHJpZ2h0ID0gZGF0YVtsZW4obWlkZGxlKTpdCiAgICAgICAgaWYgbWlkZGxlOgogICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiQ2hhcmFjdGVycyIsICJkYXRhIjogbWlkZGxlfQogICAgICAgIGlmIHJpZ2h0OgogICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiU3BhY2VDaGFyYWN0ZXJzIiwgImRhdGEiOiByaWdodH0KCiAgICBkZWYgY29tbWVudChzZWxmLCBkYXRhKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkNvbW1lbnQiLCAiZGF0YSI6IGRhdGF9CgogICAgZGVmIGRvY3R5cGUoc2VsZiwgbmFtZSwgcHVibGljSWQ9Tm9uZSwgc3lzdGVtSWQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJEb2N0eXBlIiwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJwdWJsaWNJZCI6IHB1YmxpY0lkLAogICAgICAgICAgICAgICAgInN5c3RlbUlkIjogc3lzdGVtSWR9CgogICAgZGVmIGVudGl0eShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkVudGl0eSIsICJuYW1lIjogbmFtZX0KCiAgICBkZWYgdW5rbm93bihzZWxmLCBub2RlVHlwZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3IoIlVua25vd24gbm9kZSB0eXBlOiAiICsgbm9kZVR5cGUpCgoKY2xhc3MgTm9uUmVjdXJzaXZlVHJlZVdhbGtlcihUcmVlV2Fsa2VyKToKICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldEZpcnN0Q2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYudHJlZQogICAgICAgIHdoaWxlIGN1cnJlbnROb2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBkZXRhaWxzID0gc2VsZi5nZXROb2RlRGV0YWlscyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgdHlwZSwgZGV0YWlscyA9IGRldGFpbHNbMF0sIGRldGFpbHNbMTpdCiAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gRmFsc2UKCiAgICAgICAgICAgIGlmIHR5cGUgPT0gRE9DVFlQRToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZG9jdHlwZSgqZGV0YWlscykKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBURVhUOgogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudGV4dCgqZGV0YWlscyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBFTEVNRU5UOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzLCBoYXNDaGlsZHJlbiA9IGRldGFpbHMKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5lbXB0eVRhZyhuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4pOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5zdGFydFRhZyhuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gQ09NTUVOVDoKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuY29tbWVudChkZXRhaWxzWzBdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IEVOVElUWToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW50aXR5KGRldGFpbHNbMF0pCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gRE9DVU1FTlQ6CiAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbiA9IFRydWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLnVua25vd24oZGV0YWlsc1swXSkKCiAgICAgICAgICAgIGlmIGhhc0NoaWxkcmVuOgogICAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IHNlbGYuZ2V0Rmlyc3RDaGlsZChjdXJyZW50Tm9kZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBOb25lCgogICAgICAgICAgICBpZiBmaXJzdENoaWxkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBmaXJzdENoaWxkCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB3aGlsZSBjdXJyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBkZXRhaWxzID0gc2VsZi5nZXROb2RlRGV0YWlscyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgICAgICAgICB0eXBlLCBkZXRhaWxzID0gZGV0YWlsc1swXSwgZGV0YWlsc1sxOl0KICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IEVMRU1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgaGFzQ2hpbGRyZW4gPSBkZXRhaWxzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgYW5kIG5hbWVzcGFjZSAhPSBuYW1lc3BhY2VzWyJodG1sIl0pIG9yIG5hbWUgbm90IGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5kVGFnKG5hbWVzcGFjZSwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUgaXMgY3VycmVudE5vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nID0gc2VsZi5nZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgICAgICAgICBpZiBuZXh0U2libGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0U2libGluZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi5nZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKQpQSwMEFAAAAAAAAAAhAGWKb6mFBQAAhQUAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZG9tLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHhtbC5kb20gaW1wb3J0IE5vZGUKCmZyb20gLiBpbXBvcnQgYmFzZQoKCmNsYXNzIFRyZWVXYWxrZXIoYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyKToKICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICAgICByZXR1cm4gYmFzZS5ET0NUWVBFLCBub2RlLm5hbWUsIG5vZGUucHVibGljSWQsIG5vZGUuc3lzdGVtSWQKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlIGluIChOb2RlLlRFWFRfTk9ERSwgTm9kZS5DREFUQV9TRUNUSU9OX05PREUpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBub2RlLm5vZGVWYWx1ZQoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgIGF0dHJzID0ge30KICAgICAgICAgICAgZm9yIGF0dHIgaW4gbGlzdChub2RlLmF0dHJpYnV0ZXMua2V5cygpKToKICAgICAgICAgICAgICAgIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZU5vZGUoYXR0cikKICAgICAgICAgICAgICAgIGlmIGF0dHIubmFtZXNwYWNlVVJJOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhhdHRyLm5hbWVzcGFjZVVSSSwgYXR0ci5sb2NhbE5hbWUpXSA9IGF0dHIudmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsIGF0dHIubmFtZSldID0gYXR0ci52YWx1ZQogICAgICAgICAgICByZXR1cm4gKGJhc2UuRUxFTUVOVCwgbm9kZS5uYW1lc3BhY2VVUkksIG5vZGUubm9kZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgYXR0cnMsIG5vZGUuaGFzQ2hpbGROb2RlcygpKQoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREU6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkNPTU1FTlQsIG5vZGUubm9kZVZhbHVlCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSBpbiAoTm9kZS5ET0NVTUVOVF9OT0RFLCBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpOgogICAgICAgICAgICByZXR1cm4gKGJhc2UuRE9DVU1FTlQsKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gYmFzZS5VTktOT1dOLCBub2RlLm5vZGVUeXBlCgogICAgZGVmIGdldEZpcnN0Q2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUuZmlyc3RDaGlsZAoKICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZwoKICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLnBhcmVudE5vZGUKUEsDBBQAAAAAAAAAIQAiwRAxTBIAAEwSAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBPcmRlcmVkRGljdCA9IGRpY3QKCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHN0cmluZ190eXBlcwoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5Cgp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgoKZGVmIGdldEVUcmVlQnVpbGRlcihFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uKToKICAgIEVsZW1lbnRUcmVlID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgogICAgRWxlbWVudFRyZWVDb21tZW50VHlwZSA9IEVsZW1lbnRUcmVlLkNvbW1lbnQoImFzZCIpLnRhZwoKICAgIGNsYXNzIFRyZWVXYWxrZXIoYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgIiIiR2l2ZW4gdGhlIHBhcnRpY3VsYXIgRWxlbWVudFRyZWUgcmVwcmVzZW50YXRpb24sIHRoaXMgaW1wbGVtZW50YXRpb24sCiAgICAgICAgdG8gYXZvaWQgdXNpbmcgcmVjdXJzaW9uLCByZXR1cm5zICJub2RlcyIgYXMgdHVwbGVzIHdpdGggdGhlIGZvbGxvd2luZwogICAgICAgIGNvbnRlbnQ6CgogICAgICAgIDEuIFRoZSBjdXJyZW50IGVsZW1lbnQKCiAgICAgICAgMi4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQKCiAgICAgICAgMy4gQSBzdGFjayBvZiBhbmNlc3RvciBlbGVtZW50cwoKICAgICAgICA0LiBBIGZsYWcgInRleHQiLCAidGFpbCIgb3IgTm9uZSB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBub2RlIGlzIGEKICAgICAgICAgICB0ZXh0IG5vZGU7IGVpdGhlciB0aGUgdGV4dCBvciB0YWlsIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgKDEpCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgSXQgbWlnaHQgYmUgdGhlIHJvb3QgRWxlbWVudAogICAgICAgICAgICAgICAgZWx0LCBfLCBfLCBmbGFnID0gbm9kZQogICAgICAgICAgICAgICAgaWYgZmxhZyBpbiAoInRleHQiLCAidGFpbCIpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIGdldGF0dHIoZWx0LCBmbGFnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBub2RlID0gZWx0CgogICAgICAgICAgICBpZiBub3QoaGFzYXR0cihub2RlLCAidGFnIikpOgogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0cm9vdCgpCgogICAgICAgICAgICBpZiBub2RlLnRhZyBpbiAoIkRPQ1VNRU5UX1JPT1QiLCAiRE9DVU1FTlRfRlJBR01FTlQiKToKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NVTUVOVCwpCgogICAgICAgICAgICBlbGlmIG5vZGUudGFnID09ICI8IURPQ1RZUEU+IjoKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NUWVBFLCBub2RlLnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0KCJwdWJsaWNJZCIpLCBub2RlLmdldCgic3lzdGVtSWQiKSkKCiAgICAgICAgICAgIGVsaWYgbm9kZS50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkNPTU1FTlQsIG5vZGUudGV4dAoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5vZGUudGFnLCBzdHJpbmdfdHlwZXMpLCB0eXBlKG5vZGUudGFnKQogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5vZGUudGFnKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLCB0YWcgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgdGFnID0gbm9kZS50YWcKICAgICAgICAgICAgICAgIGF0dHJzID0gT3JkZXJlZERpY3QoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGxpc3Qobm9kZS5hdHRyaWIuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzWyhtYXRjaC5ncm91cCgxKSwgbWF0Y2guZ3JvdXAoMikpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsIG5hbWUpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICByZXR1cm4gKGJhc2UuRUxFTUVOVCwgbmFtZXNwYWNlLCB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLCBsZW4obm9kZSkgb3Igbm9kZS50ZXh0KQoKICAgICAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlLCBOb25lLCBbXSwgTm9uZQoKICAgICAgICAgICAgaWYgZmxhZyBpbiAoInRleHQiLCAidGFpbCIpOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCwga2V5LCBwYXJlbnRzLCAidGV4dCIKICAgICAgICAgICAgICAgIGVsaWYgbGVuKGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbMF0sIDAsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBpZiBmbGFnID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgIGlmIGxlbihlbGVtZW50KToKICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzBdLCAwLCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRhaWwgYW5kIGZsYWcgIT0gInRhaWwiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LCBrZXksIHBhcmVudHMsICJ0YWlsIgogICAgICAgICAgICAgICAgZWxpZiBrZXkgPCBsZW4ocGFyZW50c1stMV0pIC0gMToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50c1stMV1ba2V5ICsgMV0sIGtleSArIDEsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIGZsYWcgPT0gInRleHQiOgogICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQsIGtleSwgcGFyZW50cywgTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50cy5wb3AoKQogICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbGlzdChwYXJlbnRzWy0xXSkuY291bnQocGFyZW50KSA9PSAxCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudCwgbGlzdChwYXJlbnRzWy0xXSkuaW5kZXgocGFyZW50KSwgcGFyZW50cywgTm9uZQoKICAgIHJldHVybiBsb2NhbHMoKQoKZ2V0RVRyZWVNb2R1bGUgPSBtb2R1bGVGYWN0b3J5RmFjdG9yeShnZXRFVHJlZUJ1aWxkZXIpClBLAwQUAAAAAAAAACEAlg2cR6UYAAClGAAAPgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZV9seG1sLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gbHhtbCBpbXBvcnQgZXRyZWUKZnJvbSAuLnRyZWVidWlsZGVycy5ldHJlZSBpbXBvcnQgdGFnX3JlZ2V4cAoKZnJvbSAuIGltcG9ydCBiYXNlCgpmcm9tIC4uIGltcG9ydCBfaWhhdGV4bWwKCgpkZWYgZW5zdXJlX3N0cihzKToKICAgIGlmIHMgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgZWxpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHMKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCJhc2NpaSIsICJzdHJpY3QiKQoKCmNsYXNzIFJvb3Qob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBldCk6CiAgICAgICAgc2VsZi5lbGVtZW50dHJlZSA9IGV0CiAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgZXQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKERvY3R5cGUoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3N0cihldC5kb2NpbmZvLnJvb3RfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9zdHIoZXQuZG9jaW5mby5wdWJsaWNfaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfc3RyKGV0LmRvY2luZm8uc3lzdGVtX3VybCkpKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5vZGUgPSBldC5nZXRyb290KCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG5vZGUgPSBldAoKICAgICAgICB3aGlsZSBub2RlLmdldHByZXZpb3VzKCkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldHByZXZpb3VzKCkKICAgICAgICB3aGlsZSBub2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChub2RlKQogICAgICAgICAgICBub2RlID0gbm9kZS5nZXRuZXh0KCkKCiAgICAgICAgc2VsZi50ZXh0ID0gTm9uZQogICAgICAgIHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlbltrZXldCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gMQoKCmNsYXNzIERvY3R5cGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25vZGUsIG5hbWUsIHB1YmxpY19pZCwgc3lzdGVtX2lkKToKICAgICAgICBzZWxmLnJvb3Rfbm9kZSA9IHJvb3Rfbm9kZQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnB1YmxpY19pZCA9IHB1YmxpY19pZAogICAgICAgIHNlbGYuc3lzdGVtX2lkID0gc3lzdGVtX2lkCgogICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucm9vdF9ub2RlLmNoaWxkcmVuWzFdCgoKY2xhc3MgRnJhZ21lbnRSb290KFJvb3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNoaWxkcmVuKToKICAgICAgICBzZWxmLmNoaWxkcmVuID0gW0ZyYWdtZW50V3JhcHBlcihzZWxmLCBjaGlsZCkgZm9yIGNoaWxkIGluIGNoaWxkcmVuXQogICAgICAgIHNlbGYudGV4dCA9IHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKCmNsYXNzIEZyYWdtZW50V3JhcHBlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZyYWdtZW50X3Jvb3QsIG9iaik6CiAgICAgICAgc2VsZi5yb290X25vZGUgPSBmcmFnbWVudF9yb290CiAgICAgICAgc2VsZi5vYmogPSBvYmoKICAgICAgICBpZiBoYXNhdHRyKHNlbGYub2JqLCAndGV4dCcpOgogICAgICAgICAgICBzZWxmLnRleHQgPSBlbnN1cmVfc3RyKHNlbGYub2JqLnRleHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50ZXh0ID0gTm9uZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vYmosICd0YWlsJyk6CiAgICAgICAgICAgIHNlbGYudGFpbCA9IGVuc3VyZV9zdHIoc2VsZi5vYmoudGFpbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYub2JqLCBuYW1lKQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHNpYmxpbmdzID0gc2VsZi5yb290X25vZGUuY2hpbGRyZW4KICAgICAgICBpZHggPSBzaWJsaW5ncy5pbmRleChzZWxmKQogICAgICAgIGlmIGlkeCA8IGxlbihzaWJsaW5ncykgLSAxOgogICAgICAgICAgICByZXR1cm4gc2libGluZ3NbaWR4ICsgMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLm9ialtrZXldCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYub2JqKQoKICAgIGRlZiBnZXRwYXJlbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqKQoKICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5vYmopCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICBpZiBpc2luc3RhbmNlKHRyZWUsIGxpc3QpOgogICAgICAgICAgICBzZWxmLmZyYWdtZW50Q2hpbGRyZW4gPSBzZXQodHJlZSkKICAgICAgICAgICAgdHJlZSA9IEZyYWdtZW50Um9vdCh0cmVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZnJhZ21lbnRDaGlsZHJlbiA9IHNldCgpCiAgICAgICAgICAgIHRyZWUgPSBSb290KHRyZWUpCiAgICAgICAgYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyLl9faW5pdF9fKHNlbGYsIHRyZWUpCiAgICAgICAgc2VsZi5maWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcigpCgogICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBUZXh0IG5vZGUKICAgICAgICAgICAgbm9kZSwga2V5ID0gbm9kZQogICAgICAgICAgICBhc3NlcnQga2V5IGluICgidGV4dCIsICJ0YWlsIiksICJUZXh0IG5vZGVzIGFyZSB0ZXh0IG9yIHRhaWwsIGZvdW5kICVzIiAlIGtleQogICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBlbnN1cmVfc3RyKGdldGF0dHIobm9kZSwga2V5KSkKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFJvb3QpOgogICAgICAgICAgICByZXR1cm4gKGJhc2UuRE9DVU1FTlQsKQoKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRG9jdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkRPQ1RZUEUsIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNfaWQsIG5vZGUuc3lzdGVtX2lkCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBGcmFnbWVudFdyYXBwZXIpIGFuZCBub3QgaGFzYXR0cihub2RlLCAidGFnIik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIGVuc3VyZV9zdHIobm9kZS5vYmopCgogICAgICAgIGVsaWYgbm9kZS50YWcgPT0gZXRyZWUuQ29tbWVudDoKICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgZW5zdXJlX3N0cihub2RlLnRleHQpCgogICAgICAgIGVsaWYgbm9kZS50YWcgPT0gZXRyZWUuRW50aXR5OgogICAgICAgICAgICByZXR1cm4gYmFzZS5FTlRJVFksIGVuc3VyZV9zdHIobm9kZS50ZXh0KVsxOi0xXSAgIyBzdHJpcCAmOwoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChlbnN1cmVfc3RyKG5vZGUudGFnKSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIHRhZyA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBOb25lCiAgICAgICAgICAgICAgICB0YWcgPSBlbnN1cmVfc3RyKG5vZGUudGFnKQogICAgICAgICAgICBhdHRycyA9IHt9CiAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KG5vZGUuYXR0cmliLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgbmFtZSA9IGVuc3VyZV9zdHIobmFtZSkKICAgICAgICAgICAgICAgIHZhbHVlID0gZW5zdXJlX3N0cih2YWx1ZSkKICAgICAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG1hdGNoLmdyb3VwKDEpLCBtYXRjaC5ncm91cCgyKSldID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsIG5hbWUpXSA9IHZhbHVlCiAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBuYW1lc3BhY2UsIHNlbGYuZmlsdGVyLmZyb21YbWxOYW1lKHRhZyksCiAgICAgICAgICAgICAgICAgICAgYXR0cnMsIGxlbihub2RlKSA+IDAgb3Igbm9kZS50ZXh0KQoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIGFzc2VydCBub3QgaXNpbnN0YW5jZShub2RlLCB0dXBsZSksICJUZXh0IG5vZGVzIGhhdmUgbm8gY2hpbGRyZW4iCgogICAgICAgIGFzc2VydCBsZW4obm9kZSkgb3Igbm9kZS50ZXh0LCAiTm9kZSBoYXMgbm8gY2hpbGRyZW4iCiAgICAgICAgaWYgbm9kZS50ZXh0OgogICAgICAgICAgICByZXR1cm4gKG5vZGUsICJ0ZXh0IikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gbm9kZVswXQoKICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgaWYga2V5ID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBjYW5ub3QgdXNlIGEgImJvb2wobm9kZSkgYW5kIG5vZGVbMF0gb3IgTm9uZSIgY29uc3RydWN0IGhlcmUKICAgICAgICAgICAgICAgICMgYmVjYXVzZSBub2RlWzBdIG1pZ2h0IGV2YWx1YXRlIHRvIEZhbHNlIGlmIGl0IGhhcyBubyBjaGlsZCBlbGVtZW50CiAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVbMF0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZTogICMgdGFpbAogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0bmV4dCgpCgogICAgICAgIHJldHVybiAobm9kZSwgInRhaWwiKSBpZiBub2RlLnRhaWwgZWxzZSBub2RlLmdldG5leHQoKQoKICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBUZXh0IG5vZGUKICAgICAgICAgICAgbm9kZSwga2V5ID0gbm9kZQogICAgICAgICAgICBhc3NlcnQga2V5IGluICgidGV4dCIsICJ0YWlsIiksICJUZXh0IG5vZGVzIGFyZSB0ZXh0IG9yIHRhaWwsIGZvdW5kICVzIiAlIGtleQogICAgICAgICAgICBpZiBrZXkgPT0gInRleHQiOgogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKICAgICAgICAgICAgIyBlbHNlOiBmYWxsYmFjayB0byAibm9ybWFsIiBwcm9jZXNzaW5nCiAgICAgICAgZWxpZiBub2RlIGluIHNlbGYuZnJhZ21lbnRDaGlsZHJlbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIG5vZGUuZ2V0cGFyZW50KCkKUEsDBBQAAAAAAAAAIQATX20QBQkAAAUJAAA6AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2dlbnNoaS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgUU5hbWUKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgU1RBUlQsIEVORCwgWE1MX05BTUVTUEFDRSwgRE9DVFlQRSwgVEVYVApmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBTVEFSVF9OUywgRU5EX05TLCBTVEFSVF9DREFUQSwgRU5EX0NEQVRBLCBQSSwgQ09NTUVOVAoKZnJvbSAuIGltcG9ydCBiYXNlCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCB2b2lkRWxlbWVudHMsIG5hbWVzcGFjZXMKCgpjbGFzcyBUcmVlV2Fsa2VyKGJhc2UuVHJlZVdhbGtlcik6CiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIyBCdWZmZXIgdGhlIGV2ZW50cyBzbyB3ZSBjYW4gcGFzcyBpbiB0aGUgZm9sbG93aW5nIG9uZQogICAgICAgIHByZXZpb3VzID0gTm9uZQogICAgICAgIGZvciBldmVudCBpbiBzZWxmLnRyZWU6CiAgICAgICAgICAgIGlmIHByZXZpb3VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudG9rZW5zKHByZXZpb3VzLCBldmVudCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgcHJldmlvdXMgPSBldmVudAoKICAgICAgICAjIERvbid0IGZvcmdldCB0aGUgZmluYWwgZXZlbnQhCiAgICAgICAgaWYgcHJldmlvdXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRva2VucyhwcmV2aW91cywgTm9uZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgIGRlZiB0b2tlbnMoc2VsZiwgZXZlbnQsIG5leHQpOgogICAgICAgIGtpbmQsIGRhdGEsIF8gPSBldmVudAogICAgICAgIGlmIGtpbmQgPT0gU1RBUlQ6CiAgICAgICAgICAgIHRhZywgYXR0cmlicyA9IGRhdGEKICAgICAgICAgICAgbmFtZSA9IHRhZy5sb2NhbG5hbWUKICAgICAgICAgICAgbmFtZXNwYWNlID0gdGFnLm5hbWVzcGFjZQogICAgICAgICAgICBjb252ZXJ0ZWRfYXR0cmlicyA9IHt9CiAgICAgICAgICAgIGZvciBrLCB2IGluIGF0dHJpYnM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIFFOYW1lKToKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRfYXR0cmlic1soay5uYW1lc3BhY2UsIGsubG9jYWxuYW1lKV0gPSB2CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJzWyhOb25lLCBrKV0gPSB2CgogICAgICAgICAgICBpZiBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLmVtcHR5VGFnKG5hbWVzcGFjZSwgbmFtZSwgY29udmVydGVkX2F0dHJpYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbmV4dCBvciBuZXh0WzBdICE9IEVORCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFsxXSAhPSB0YWcpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLnN0YXJ0VGFnKG5hbWVzcGFjZSwgbmFtZSwgY29udmVydGVkX2F0dHJpYnMpCgogICAgICAgIGVsaWYga2luZCA9PSBFTkQ6CiAgICAgICAgICAgIG5hbWUgPSBkYXRhLmxvY2FsbmFtZQogICAgICAgICAgICBuYW1lc3BhY2UgPSBkYXRhLm5hbWVzcGFjZQogICAgICAgICAgICBpZiBuYW1lc3BhY2UgIT0gbmFtZXNwYWNlc1siaHRtbCJdIG9yIG5hbWUgbm90IGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5kVGFnKG5hbWVzcGFjZSwgbmFtZSkKCiAgICAgICAgZWxpZiBraW5kID09IENPTU1FTlQ6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuY29tbWVudChkYXRhKQoKICAgICAgICBlbGlmIGtpbmQgPT0gVEVYVDoKICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudGV4dChkYXRhKToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgICAgIGVsaWYga2luZCA9PSBET0NUWVBFOgogICAgICAgICAgICB5aWVsZCBzZWxmLmRvY3R5cGUoKmRhdGEpCgogICAgICAgIGVsaWYga2luZCBpbiAoWE1MX05BTUVTUEFDRSwgRE9DVFlQRSwgU1RBUlRfTlMsIEVORF9OUywKICAgICAgICAgICAgICAgICAgICAgIFNUQVJUX0NEQVRBLCBFTkRfQ0RBVEEsIFBJKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCBzZWxmLnVua25vd24oa2luZCkKUEsDBBQAAAAAAAAAIQAAR1ybOgAAADoAAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvX19pbml0X18ucHlmcm9tIC5wYWNrYWdlX2RhdGEgaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gLmNvcmUgaW1wb3J0ICoKUEsDBBQAAAAAAAAAIQDzSNTp4wwAAOMMAAApAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29kZWMucHlmcm9tIC5jb3JlIGltcG9ydCBlbmNvZGUsIGRlY29kZSwgYWxhYmVsLCB1bGFiZWwsIElETkFFcnJvcgppbXBvcnQgY29kZWNzCmltcG9ydCByZQoKX3VuaWNvZGVfZG90c19yZSA9IHJlLmNvbXBpbGUodSdbXHUwMDJlXHUzMDAyXHVmZjBlXHVmZjYxXScpCgpjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgoKICAgIGRlZiBlbmNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzPSdzdHJpY3QnKToKCiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICIiLCAwCgogICAgICAgIHJldHVybiBlbmNvZGUoZGF0YSksIGxlbihkYXRhKQoKICAgIGRlZiBkZWNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzPSdzdHJpY3QnKToKCiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuIHUiIiwgMAoKICAgICAgICByZXR1cm4gZGVjb2RlKGRhdGEpLCBsZW4oZGF0YSkKCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbEVuY29kZXIpOgogICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGRhdGEsIGVycm9ycywgZmluYWwpOgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiAoIiIsIDApCgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQoZGF0YSkKICAgICAgICB0cmFpbGluZ19kb3QgPSB1JycKICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgIGlmIG5vdCBsYWJlbHNbLTFdOgogICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgc2l6ZSA9IDAKICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGFsYWJlbChsYWJlbCkpCiAgICAgICAgICAgIGlmIHNpemU6CiAgICAgICAgICAgICAgICBzaXplICs9IDEKICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCgogICAgICAgICMgSm9pbiB3aXRoIFUrMDAyRQogICAgICAgIHJlc3VsdCA9ICIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCiAgICAgICAgcmV0dXJuIChyZXN1bHQsIHNpemUpCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKICAgIGRlZiBfYnVmZmVyX2RlY29kZShzZWxmLCBkYXRhLCBlcnJvcnMsIGZpbmFsKToKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gKHUiIiwgMCkKCiAgICAgICAgIyBJRE5BIGFsbG93cyBkZWNvZGluZyB0byBvcGVyYXRlIG9uIFVuaWNvZGUgc3RyaW5ncywgdG9vLgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CiAgICAgICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE11c3QgYmUgQVNDSUkgc3RyaW5nCiAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgdW5pY29kZShkYXRhLCAiYXNjaWkiKQogICAgICAgICAgICBsYWJlbHMgPSBkYXRhLnNwbGl0KCIuIikKCiAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCiAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnLicKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgogICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgc2l6ZSA9IDAKICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVsYWJlbChsYWJlbCkpCiAgICAgICAgICAgIGlmIHNpemU6CiAgICAgICAgICAgICAgICBzaXplICs9IDEKICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCgogICAgICAgIHJlc3VsdCA9IHUiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CiAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQogICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQoKCmNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICBwYXNzCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgogICAgcGFzcwoKZGVmIGdldHJlZ2VudHJ5KCk6CiAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKICAgICAgICBuYW1lPSdpZG5hJywKICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCiAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAogICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCiAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAogICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCiAgICApClBLAwQUAAAAAAAAACEAfIGWcOgAAADoAAAAKgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvbXBhdC5weWZyb20gLmNvcmUgaW1wb3J0ICoKZnJvbSAuY29kZWMgaW1wb3J0ICoKCmRlZiBUb0FTQ0lJKGxhYmVsKToKICAgIHJldHVybiBlbmNvZGUobGFiZWwpCgpkZWYgVG9Vbmljb2RlKGxhYmVsKToKICAgIHJldHVybiBkZWNvZGUobGFiZWwpCgpkZWYgbmFtZXByZXAocyk6CiAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJJRE5BIDIwMDggZG9lcyBub3QgdXRpbGlzZSBuYW1lcHJlcCBwcm90b2NvbCIpCgpQSwMEFAAAAAAAAAAhAAku+nF+LAAAfiwAACgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5ZnJvbSAuIGltcG9ydCBpZG5hZGF0YQppbXBvcnQgYmlzZWN0CmltcG9ydCB1bmljb2RlZGF0YQppbXBvcnQgcmUKaW1wb3J0IHN5cwpmcm9tIC5pbnRyYW5nZXMgaW1wb3J0IGludHJhbmdlc19jb250YWluCgpfdmlyYW1hX2NvbWJpbmluZ19jbGFzcyA9IDkKX2FsYWJlbF9wcmVmaXggPSBiJ3huLS0nCl91bmljb2RlX2RvdHNfcmUgPSByZS5jb21waWxlKHUnW1x1MDAyZVx1MzAwMlx1ZmYwZVx1ZmY2MV0nKQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAzOgogICAgdW5pY29kZSA9IHN0cgogICAgdW5pY2hyID0gY2hyCgpjbGFzcyBJRE5BRXJyb3IoVW5pY29kZUVycm9yKToKICAgICIiIiBCYXNlIGV4Y2VwdGlvbiBmb3IgYWxsIElETkEtZW5jb2RpbmcgcmVsYXRlZCBwcm9ibGVtcyAiIiIKICAgIHBhc3MKCgpjbGFzcyBJRE5BQmlkaUVycm9yKElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gYmlkaXJlY3Rpb25hbCByZXF1aXJlbWVudHMgYXJlIG5vdCBzYXRpc2ZpZWQgIiIiCiAgICBwYXNzCgoKY2xhc3MgSW52YWxpZENvZGVwb2ludChJRE5BRXJyb3IpOgogICAgIiIiIEV4Y2VwdGlvbiB3aGVuIGEgZGlzYWxsb3dlZCBvciB1bmFsbG9jYXRlZCBjb2RlcG9pbnQgaXMgdXNlZCAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbnZhbGlkQ29kZXBvaW50Q29udGV4dChJRE5BRXJyb3IpOgogICAgIiIiIEV4Y2VwdGlvbiB3aGVuIHRoZSBjb2RlcG9pbnQgaXMgbm90IHZhbGlkIGluIHRoZSBjb250ZXh0IGl0IGlzIHVzZWQgIiIiCiAgICBwYXNzCgoKZGVmIF9jb21iaW5pbmdfY2xhc3MoY3ApOgogICAgcmV0dXJuIHVuaWNvZGVkYXRhLmNvbWJpbmluZyh1bmljaHIoY3ApKQoKZGVmIF9pc19zY3JpcHQoY3AsIHNjcmlwdCk6CiAgICByZXR1cm4gaW50cmFuZ2VzX2NvbnRhaW4ob3JkKGNwKSwgaWRuYWRhdGEuc2NyaXB0c1tzY3JpcHRdKQoKZGVmIF9wdW55Y29kZShzKToKICAgIHJldHVybiBzLmVuY29kZSgncHVueWNvZGUnKQoKZGVmIF91bm90KHMpOgogICAgcmV0dXJuICdVK3swOjA0WH0nLmZvcm1hdChzKQoKCmRlZiB2YWxpZF9sYWJlbF9sZW5ndGgobGFiZWwpOgoKICAgIGlmIGxlbihsYWJlbCkgPiA2MzoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIHZhbGlkX3N0cmluZ19sZW5ndGgobGFiZWwsIHRyYWlsaW5nX2RvdCk6CgogICAgaWYgbGVuKGxhYmVsKSA+ICgyNTQgaWYgdHJhaWxpbmdfZG90IGVsc2UgMjUzKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2JpZGkobGFiZWwsIGNoZWNrX2x0cj1GYWxzZSk6CgogICAgIyBCaWRpIHJ1bGVzIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgaWYgc3RyaW5nIGNvbnRhaW5zIFJUTCBjaGFyYWN0ZXJzCiAgICBiaWRpX2xhYmVsID0gRmFsc2UKICAgIGZvciAoaWR4LCBjcCkgaW4gZW51bWVyYXRlKGxhYmVsLCAxKToKICAgICAgICBkaXJlY3Rpb24gPSB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNwKQogICAgICAgIGlmIGRpcmVjdGlvbiA9PSAnJzoKICAgICAgICAgICAgIyBTdHJpbmcgbGlrZWx5IGNvbWVzIGZyb20gYSBuZXdlciB2ZXJzaW9uIG9mIFVuaWNvZGUKICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignVW5rbm93biBkaXJlY3Rpb25hbGl0eSBpbiBsYWJlbCB7MH0gYXQgcG9zaXRpb24gezF9Jy5mb3JtYXQocmVwcihsYWJlbCksIGlkeCkpCiAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdBTiddOgogICAgICAgICAgICBiaWRpX2xhYmVsID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgbm90IGJpZGlfbGFiZWwgYW5kIG5vdCBjaGVja19sdHI6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIEJpZGkgcnVsZSAxCiAgICBkaXJlY3Rpb24gPSB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGxhYmVsWzBdKQogICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCddOgogICAgICAgIHJ0bCA9IFRydWUKICAgIGVsaWYgZGlyZWN0aW9uID09ICdMJzoKICAgICAgICBydGwgPSBGYWxzZQogICAgZWxzZToKICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdGaXJzdCBjb2RlcG9pbnQgaW4gbGFiZWwgezB9IG11c3QgYmUgZGlyZWN0aW9uYWxpdHkgTCwgUiBvciBBTCcuZm9ybWF0KHJlcHIobGFiZWwpKSkKCiAgICB2YWxpZF9lbmRpbmcgPSBGYWxzZQogICAgbnVtYmVyX3R5cGUgPSBGYWxzZQogICAgZm9yIChpZHgsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwsIDEpOgogICAgICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwoY3ApCgogICAgICAgIGlmIHJ0bDoKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgMgogICAgICAgICAgICBpZiBub3QgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdBTicsICdFTicsICdFUycsICdDUycsICdFVCcsICdPTicsICdCTicsICdOU00nXToKICAgICAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0ludmFsaWQgZGlyZWN0aW9uIGZvciBjb2RlcG9pbnQgYXQgcG9zaXRpb24gezB9IGluIGEgcmlnaHQtdG8tbGVmdCBsYWJlbCcuZm9ybWF0KGlkeCkpCiAgICAgICAgICAgICMgQmlkaSBydWxlIDMKICAgICAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdFTicsICdBTiddOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gVHJ1ZQogICAgICAgICAgICBlbGlmIGRpcmVjdGlvbiAhPSAnTlNNJzoKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IEZhbHNlCiAgICAgICAgICAgICMgQmlkaSBydWxlIDQKICAgICAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnQU4nLCAnRU4nXToKICAgICAgICAgICAgICAgIGlmIG5vdCBudW1iZXJfdHlwZToKICAgICAgICAgICAgICAgICAgICBudW1iZXJfdHlwZSA9IGRpcmVjdGlvbgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBudW1iZXJfdHlwZSAhPSBkaXJlY3Rpb246CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0NhbiBub3QgbWl4IG51bWVyYWwgdHlwZXMgaW4gYSByaWdodC10by1sZWZ0IGxhYmVsJykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEJpZGkgcnVsZSA1CiAgICAgICAgICAgIGlmIG5vdCBkaXJlY3Rpb24gaW4gWydMJywgJ0VOJywgJ0VTJywgJ0NTJywgJ0VUJywgJ09OJywgJ0JOJywgJ05TTSddOgogICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignSW52YWxpZCBkaXJlY3Rpb24gZm9yIGNvZGVwb2ludCBhdCBwb3NpdGlvbiB7MH0gaW4gYSBsZWZ0LXRvLXJpZ2h0IGxhYmVsJy5mb3JtYXQoaWR4KSkKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgNgogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydMJywgJ0VOJ106CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgZGlyZWN0aW9uICE9ICdOU00nOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gRmFsc2UKCiAgICBpZiBub3QgdmFsaWRfZW5kaW5nOgogICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0xhYmVsIGVuZHMgd2l0aCBpbGxlZ2FsIGNvZGVwb2ludCBkaXJlY3Rpb25hbGl0eScpCgogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfaW5pdGlhbF9jb21iaW5lcihsYWJlbCk6CgogICAgaWYgdW5pY29kZWRhdGEuY2F0ZWdvcnkobGFiZWxbMF0pWzBdID09ICdNJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIGJlZ2lucyB3aXRoIGFuIGlsbGVnYWwgY29tYmluaW5nIGNoYXJhY3RlcicpCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19oeXBoZW5fb2sobGFiZWwpOgoKICAgIGlmIGxhYmVsWzI6NF0gPT0gJy0tJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIGhhcyBkaXNhbGxvd2VkIGh5cGhlbnMgaW4gM3JkIGFuZCA0dGggcG9zaXRpb24nKQogICAgaWYgbGFiZWxbMF0gPT0gJy0nIG9yIGxhYmVsWy0xXSA9PSAnLSc6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCBhIGh5cGhlbicpCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19uZmMobGFiZWwpOgoKICAgIGlmIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZDJywgbGFiZWwpICE9IGxhYmVsOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgbXVzdCBiZSBpbiBOb3JtYWxpemF0aW9uIEZvcm0gQycpCgoKZGVmIHZhbGlkX2NvbnRleHRqKGxhYmVsLCBwb3MpOgoKICAgIGNwX3ZhbHVlID0gb3JkKGxhYmVsW3Bvc10pCgogICAgaWYgY3BfdmFsdWUgPT0gMHgyMDBjOgoKICAgICAgICBpZiBwb3MgPiAwOgogICAgICAgICAgICBpZiBfY29tYmluaW5nX2NsYXNzKG9yZChsYWJlbFtwb3MgLSAxXSkpID09IF92aXJhbWFfY29tYmluaW5nX2NsYXNzOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgb2sgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKHBvcy0xLCAtMSwgLTEpOgogICAgICAgICAgICBqb2luaW5nX3R5cGUgPSBpZG5hZGF0YS5qb2luaW5nX3R5cGVzLmdldChvcmQobGFiZWxbaV0pKQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgPT0gb3JkKCdUJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgaW4gW29yZCgnTCcpLCBvcmQoJ0QnKV06CiAgICAgICAgICAgICAgICBvayA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIG5vdCBvazoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIG9rID0gRmFsc2UKICAgICAgICBmb3IgaSBpbiByYW5nZShwb3MrMSwgbGVuKGxhYmVsKSk6CiAgICAgICAgICAgIGpvaW5pbmdfdHlwZSA9IGlkbmFkYXRhLmpvaW5pbmdfdHlwZXMuZ2V0KG9yZChsYWJlbFtpXSkpCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSA9PSBvcmQoJ1QnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSBpbiBbb3JkKCdSJyksIG9yZCgnRCcpXToKICAgICAgICAgICAgICAgIG9rID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gb2sKCiAgICBpZiBjcF92YWx1ZSA9PSAweDIwMGQ6CgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIGlmIF9jb21iaW5pbmdfY2xhc3Mob3JkKGxhYmVsW3BvcyAtIDFdKSkgPT0gX3ZpcmFtYV9jb21iaW5pbmdfY2xhc3M6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsc2U6CgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiB2YWxpZF9jb250ZXh0byhsYWJlbCwgcG9zLCBleGNlcHRpb249RmFsc2UpOgoKICAgIGNwX3ZhbHVlID0gb3JkKGxhYmVsW3Bvc10pCgogICAgaWYgY3BfdmFsdWUgPT0gMHgwMGI3OgogICAgICAgIGlmIDAgPCBwb3MgPCBsZW4obGFiZWwpLTE6CiAgICAgICAgICAgIGlmIG9yZChsYWJlbFtwb3MgLSAxXSkgPT0gMHgwMDZjIGFuZCBvcmQobGFiZWxbcG9zICsgMV0pID09IDB4MDA2YzoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiBjcF92YWx1ZSA9PSAweDAzNzU6CiAgICAgICAgaWYgcG9zIDwgbGVuKGxhYmVsKS0xIGFuZCBsZW4obGFiZWwpID4gMToKICAgICAgICAgICAgcmV0dXJuIF9pc19zY3JpcHQobGFiZWxbcG9zICsgMV0sICdHcmVlaycpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiBjcF92YWx1ZSA9PSAweDA1ZjMgb3IgY3BfdmFsdWUgPT0gMHgwNWY0OgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIHJldHVybiBfaXNfc2NyaXB0KGxhYmVsW3BvcyAtIDFdLCAnSGVicmV3JykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MzBmYjoKICAgICAgICBmb3IgY3AgaW4gbGFiZWw6CiAgICAgICAgICAgIGlmIGNwID09IHUnXHUzMGZiJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIF9pc19zY3JpcHQoY3AsICdIaXJhZ2FuYScpIG9yIF9pc19zY3JpcHQoY3AsICdLYXRha2FuYScpIG9yIF9pc19zY3JpcHQoY3AsICdIYW4nKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiAweDY2MCA8PSBjcF92YWx1ZSA8PSAweDY2OToKICAgICAgICBmb3IgY3AgaW4gbGFiZWw6CiAgICAgICAgICAgIGlmIDB4NmYwIDw9IG9yZChjcCkgPD0gMHgwNmY5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBlbGlmIDB4NmYwIDw9IGNwX3ZhbHVlIDw9IDB4NmY5OgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgMHg2NjAgPD0gb3JkKGNwKSA8PSAweDA2Njk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19sYWJlbChsYWJlbCk6CgogICAgaWYgaXNpbnN0YW5jZShsYWJlbCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICBsYWJlbCA9IGxhYmVsLmRlY29kZSgndXRmLTgnKQogICAgaWYgbGVuKGxhYmVsKSA9PSAwOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRW1wdHkgTGFiZWwnKQoKICAgIGNoZWNrX25mYyhsYWJlbCkKICAgIGNoZWNrX2h5cGhlbl9vayhsYWJlbCkKICAgIGNoZWNrX2luaXRpYWxfY29tYmluZXIobGFiZWwpCgogICAgZm9yIChwb3MsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwpOgogICAgICAgIGNwX3ZhbHVlID0gb3JkKGNwKQogICAgICAgIGlmIGludHJhbmdlc19jb250YWluKGNwX3ZhbHVlLCBpZG5hZGF0YS5jb2RlcG9pbnRfY2xhc3Nlc1snUFZBTElEJ10pOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydDT05URVhUSiddKToKICAgICAgICAgICAgaWYgbm90IHZhbGlkX2NvbnRleHRqKGxhYmVsLCBwb3MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludENvbnRleHQoJ0pvaW5lciB7MH0gbm90IGFsbG93ZWQgYXQgcG9zaXRpb24gezF9IGluIHsyfScuZm9ybWF0KF91bm90KGNwX3ZhbHVlKSwgcG9zKzEsIHJlcHIobGFiZWwpKSkKICAgICAgICBlbGlmIGludHJhbmdlc19jb250YWluKGNwX3ZhbHVlLCBpZG5hZGF0YS5jb2RlcG9pbnRfY2xhc3Nlc1snQ09OVEVYVE8nXSk6CiAgICAgICAgICAgIGlmIG5vdCB2YWxpZF9jb250ZXh0byhsYWJlbCwgcG9zKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnRDb250ZXh0KCdDb2RlcG9pbnQgezB9IG5vdCBhbGxvd2VkIGF0IHBvc2l0aW9uIHsxfSBpbiB7Mn0nLmZvcm1hdChfdW5vdChjcF92YWx1ZSksIHBvcysxLCByZXByKGxhYmVsKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludCgnQ29kZXBvaW50IHswfSBhdCBwb3NpdGlvbiB7MX0gb2YgezJ9IG5vdCBhbGxvd2VkJy5mb3JtYXQoX3Vub3QoY3BfdmFsdWUpLCBwb3MrMSwgcmVwcihsYWJlbCkpKQoKICAgIGNoZWNrX2JpZGkobGFiZWwpCgoKZGVmIGFsYWJlbChsYWJlbCk6CgogICAgdHJ5OgogICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1bGFiZWwobGFiZWwpCiAgICAgICAgZXhjZXB0IElETkFFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCdUaGUgbGFiZWwgezB9IGlzIG5vdCBhIHZhbGlkIEEtbGFiZWwnLmZvcm1hdChsYWJlbCkpCiAgICAgICAgaWYgbm90IHZhbGlkX2xhYmVsX2xlbmd0aChsYWJlbCk6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgdG9vIGxvbmcnKQogICAgICAgIHJldHVybiBsYWJlbAogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgaWYgbm90IGxhYmVsOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTm8gSW5wdXQnKQoKICAgIGxhYmVsID0gdW5pY29kZShsYWJlbCkKICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgbGFiZWwgPSBfcHVueWNvZGUobGFiZWwpCiAgICBsYWJlbCA9IF9hbGFiZWxfcHJlZml4ICsgbGFiZWwKCiAgICBpZiBub3QgdmFsaWRfbGFiZWxfbGVuZ3RoKGxhYmVsKToKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIHRvbyBsb25nJykKCiAgICByZXR1cm4gbGFiZWwKCgpkZWYgdWxhYmVsKGxhYmVsKToKCiAgICBpZiBub3QgaXNpbnN0YW5jZShsYWJlbCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICAgICAgICAgIHJldHVybiBsYWJlbAoKICAgIGxhYmVsID0gbGFiZWwubG93ZXIoKQogICAgaWYgbGFiZWwuc3RhcnRzd2l0aChfYWxhYmVsX3ByZWZpeCk6CiAgICAgICAgbGFiZWwgPSBsYWJlbFtsZW4oX2FsYWJlbF9wcmVmaXgpOl0KICAgIGVsc2U6CiAgICAgICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICAgICAgcmV0dXJuIGxhYmVsLmRlY29kZSgnYXNjaWknKQoKICAgIGxhYmVsID0gbGFiZWwuZGVjb2RlKCdwdW55Y29kZScpCiAgICBjaGVja19sYWJlbChsYWJlbCkKICAgIHJldHVybiBsYWJlbAoKCmRlZiB1dHM0Nl9yZW1hcChkb21haW4sIHN0ZDNfcnVsZXM9VHJ1ZSwgdHJhbnNpdGlvbmFsPUZhbHNlKToKICAgICIiIlJlLW1hcCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFjY29yZGluZyB0byBVVFM0NiBwcm9jZXNzaW5nLiIiIgogICAgZnJvbSAudXRzNDZkYXRhIGltcG9ydCB1dHM0NmRhdGEKICAgIG91dHB1dCA9IHUiIgogICAgdHJ5OgogICAgICAgIGZvciBwb3MsIGNoYXIgaW4gZW51bWVyYXRlKGRvbWFpbik6CiAgICAgICAgICAgIGNvZGVfcG9pbnQgPSBvcmQoY2hhcikKICAgICAgICAgICAgdXRzNDZyb3cgPSB1dHM0NmRhdGFbY29kZV9wb2ludCBpZiBjb2RlX3BvaW50IDwgMjU2IGVsc2UKICAgICAgICAgICAgICAgIGJpc2VjdC5iaXNlY3RfbGVmdCh1dHM0NmRhdGEsIChjb2RlX3BvaW50LCAiWiIpKSAtIDFdCiAgICAgICAgICAgIHN0YXR1cyA9IHV0czQ2cm93WzFdCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gdXRzNDZyb3dbMl0gaWYgbGVuKHV0czQ2cm93KSA9PSAzIGVsc2UgTm9uZQogICAgICAgICAgICBpZiAoc3RhdHVzID09ICJWIiBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIkQiIGFuZCBub3QgdHJhbnNpdGlvbmFsKSBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIjMiIGFuZCBzdGQzX3J1bGVzIGFuZCByZXBsYWNlbWVudCBpcyBOb25lKSk6CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gY2hhcgogICAgICAgICAgICBlbGlmIHJlcGxhY2VtZW50IGlzIG5vdCBOb25lIGFuZCAoc3RhdHVzID09ICJNIiBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIjMiIGFuZCBzdGQzX3J1bGVzKSBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIkQiIGFuZCB0cmFuc2l0aW9uYWwpKToKICAgICAgICAgICAgICAgIG91dHB1dCArPSByZXBsYWNlbWVudAogICAgICAgICAgICBlbGlmIHN0YXR1cyAhPSAiSSI6CiAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCkKICAgICAgICByZXR1cm4gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkMiLCBvdXRwdXQpCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50KAogICAgICAgICAgICAiQ29kZXBvaW50IHswfSBub3QgYWxsb3dlZCBhdCBwb3NpdGlvbiB7MX0gaW4gezJ9Ii5mb3JtYXQoCiAgICAgICAgICAgIF91bm90KGNvZGVfcG9pbnQpLCBwb3MgKyAxLCByZXByKGRvbWFpbikpKQoKCmRlZiBlbmNvZGUocywgc3RyaWN0PUZhbHNlLCB1dHM0Nj1GYWxzZSwgc3RkM19ydWxlcz1GYWxzZSwgdHJhbnNpdGlvbmFsPUZhbHNlKToKCiAgICBpZiBpc2luc3RhbmNlKHMsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgcyA9IHMuZGVjb2RlKCJhc2NpaSIpCiAgICBpZiB1dHM0NjoKICAgICAgICBzID0gdXRzNDZfcmVtYXAocywgc3RkM19ydWxlcywgdHJhbnNpdGlvbmFsKQogICAgdHJhaWxpbmdfZG90ID0gRmFsc2UKICAgIHJlc3VsdCA9IFtdCiAgICBpZiBzdHJpY3Q6CiAgICAgICAgbGFiZWxzID0gcy5zcGxpdCgnLicpCiAgICBlbHNlOgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQocykKICAgIHdoaWxlIGxhYmVscyBhbmQgbm90IGxhYmVsc1swXToKICAgICAgICBkZWwgbGFiZWxzWzBdCiAgICBpZiBub3QgbGFiZWxzOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRW1wdHkgZG9tYWluJykKICAgIGlmIGxhYmVsc1stMV0gPT0gJyc6CiAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICB0cmFpbGluZ19kb3QgPSBUcnVlCiAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgIHJlc3VsdC5hcHBlbmQoYWxhYmVsKGxhYmVsKSkKICAgIGlmIHRyYWlsaW5nX2RvdDoKICAgICAgICByZXN1bHQuYXBwZW5kKGInJykKICAgIHMgPSBiJy4nLmpvaW4ocmVzdWx0KQogICAgaWYgbm90IHZhbGlkX3N0cmluZ19sZW5ndGgocywgdHJhaWxpbmdfZG90KToKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0RvbWFpbiB0b28gbG9uZycpCiAgICByZXR1cm4gcwoKCmRlZiBkZWNvZGUocywgc3RyaWN0PUZhbHNlLCB1dHM0Nj1GYWxzZSwgc3RkM19ydWxlcz1GYWxzZSk6CgogICAgaWYgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIHMgPSBzLmRlY29kZSgiYXNjaWkiKQogICAgaWYgdXRzNDY6CiAgICAgICAgcyA9IHV0czQ2X3JlbWFwKHMsIHN0ZDNfcnVsZXMsIEZhbHNlKQogICAgdHJhaWxpbmdfZG90ID0gRmFsc2UKICAgIHJlc3VsdCA9IFtdCiAgICBpZiBub3Qgc3RyaWN0OgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQocykKICAgIGVsc2U6CiAgICAgICAgbGFiZWxzID0gcy5zcGxpdCh1Jy4nKQogICAgd2hpbGUgbGFiZWxzIGFuZCBub3QgbGFiZWxzWzBdOgogICAgICAgIGRlbCBsYWJlbHNbMF0KICAgIGlmIG5vdCBsYWJlbHM6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBkb21haW4nKQogICAgaWYgbm90IGxhYmVsc1stMV06CiAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICB0cmFpbGluZ19kb3QgPSBUcnVlCiAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgIHJlc3VsdC5hcHBlbmQodWxhYmVsKGxhYmVsKSkKICAgIGlmIHRyYWlsaW5nX2RvdDoKICAgICAgICByZXN1bHQuYXBwZW5kKHUnJykKICAgIHJldHVybiB1Jy4nLmpvaW4ocmVzdWx0KQpQSwMEFAAAAAAAAAAhAGO8+hHngAAA54AAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weSMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRvb2xzL2lkbmEtZGF0YQoKX192ZXJzaW9uX18gPSAiNi4zLjAiCnNjcmlwdHMgPSB7CiAgICAnR3JlZWsnOiAoCiAgICAgICAgMHgzNzAwMDAwMDM3NCwKICAgICAgICAweDM3NTAwMDAwMzc4LAogICAgICAgIDB4MzdhMDAwMDAzN2UsCiAgICAgICAgMHgzODQwMDAwMDM4NSwKICAgICAgICAweDM4NjAwMDAwMzg3LAogICAgICAgIDB4Mzg4MDAwMDAzOGIsCiAgICAgICAgMHgzOGMwMDAwMDM4ZCwKICAgICAgICAweDM4ZTAwMDAwM2EyLAogICAgICAgIDB4M2EzMDAwMDAzZTIsCiAgICAgICAgMHgzZjAwMDAwMDQwMCwKICAgICAgICAweDFkMjYwMDAwMWQyYiwKICAgICAgICAweDFkNWQwMDAwMWQ2MiwKICAgICAgICAweDFkNjYwMDAwMWQ2YiwKICAgICAgICAweDFkYmYwMDAwMWRjMCwKICAgICAgICAweDFmMDAwMDAwMWYxNiwKICAgICAgICAweDFmMTgwMDAwMWYxZSwKICAgICAgICAweDFmMjAwMDAwMWY0NiwKICAgICAgICAweDFmNDgwMDAwMWY0ZSwKICAgICAgICAweDFmNTAwMDAwMWY1OCwKICAgICAgICAweDFmNTkwMDAwMWY1YSwKICAgICAgICAweDFmNWIwMDAwMWY1YywKICAgICAgICAweDFmNWQwMDAwMWY1ZSwKICAgICAgICAweDFmNWYwMDAwMWY3ZSwKICAgICAgICAweDFmODAwMDAwMWZiNSwKICAgICAgICAweDFmYjYwMDAwMWZjNSwKICAgICAgICAweDFmYzYwMDAwMWZkNCwKICAgICAgICAweDFmZDYwMDAwMWZkYywKICAgICAgICAweDFmZGQwMDAwMWZmMCwKICAgICAgICAweDFmZjIwMDAwMWZmNSwKICAgICAgICAweDFmZjYwMDAwMWZmZiwKICAgICAgICAweDIxMjYwMDAwMjEyNywKICAgICAgICAweDEwMTQwMDAwMTAxOGIsCiAgICAgICAgMHgxZDIwMDAwMDFkMjQ2LAogICAgKSwKICAgICdIYW4nOiAoCiAgICAgICAgMHgyZTgwMDAwMDJlOWEsCiAgICAgICAgMHgyZTliMDAwMDJlZjQsCiAgICAgICAgMHgyZjAwMDAwMDJmZDYsCiAgICAgICAgMHgzMDA1MDAwMDMwMDYsCiAgICAgICAgMHgzMDA3MDAwMDMwMDgsCiAgICAgICAgMHgzMDIxMDAwMDMwMmEsCiAgICAgICAgMHgzMDM4MDAwMDMwM2MsCiAgICAgICAgMHgzNDAwMDAwMDRkYjYsCiAgICAgICAgMHg0ZTAwMDAwMDlmY2QsCiAgICAgICAgMHhmOTAwMDAwMGZhNmUsCiAgICAgICAgMHhmYTcwMDAwMGZhZGEsCiAgICAgICAgMHgyMDAwMDAwMDJhNmQ3LAogICAgICAgIDB4MmE3MDAwMDAyYjczNSwKICAgICAgICAweDJiNzQwMDAwMmI4MWUsCiAgICAgICAgMHgyZjgwMDAwMDJmYTFlLAogICAgKSwKICAgICdIZWJyZXcnOiAoCiAgICAgICAgMHg1OTEwMDAwMDVjOCwKICAgICAgICAweDVkMDAwMDAwNWViLAogICAgICAgIDB4NWYwMDAwMDA1ZjUsCiAgICAgICAgMHhmYjFkMDAwMGZiMzcsCiAgICAgICAgMHhmYjM4MDAwMGZiM2QsCiAgICAgICAgMHhmYjNlMDAwMGZiM2YsCiAgICAgICAgMHhmYjQwMDAwMGZiNDIsCiAgICAgICAgMHhmYjQzMDAwMGZiNDUsCiAgICAgICAgMHhmYjQ2MDAwMGZiNTAsCiAgICApLAogICAgJ0hpcmFnYW5hJzogKAogICAgICAgIDB4MzA0MTAwMDAzMDk3LAogICAgICAgIDB4MzA5ZDAwMDAzMGEwLAogICAgICAgIDB4MWIwMDEwMDAxYjAwMiwKICAgICAgICAweDFmMjAwMDAwMWYyMDEsCiAgICApLAogICAgJ0thdGFrYW5hJzogKAogICAgICAgIDB4MzBhMTAwMDAzMGZiLAogICAgICAgIDB4MzBmZDAwMDAzMTAwLAogICAgICAgIDB4MzFmMDAwMDAzMjAwLAogICAgICAgIDB4MzJkMDAwMDAzMmZmLAogICAgICAgIDB4MzMwMDAwMDAzMzU4LAogICAgICAgIDB4ZmY2NjAwMDBmZjcwLAogICAgICAgIDB4ZmY3MTAwMDBmZjllLAogICAgICAgIDB4MWIwMDAwMDAxYjAwMSwKICAgICksCn0Kam9pbmluZ190eXBlcyA9IHsKICAgIDB4NjAwOiA4NSwKICAgIDB4NjAxOiA4NSwKICAgIDB4NjAyOiA4NSwKICAgIDB4NjAzOiA4NSwKICAgIDB4NjA0OiA4NSwKICAgIDB4NjA4OiA4NSwKICAgIDB4NjBiOiA4NSwKICAgIDB4NjIwOiA2OCwKICAgIDB4NjIxOiA4NSwKICAgIDB4NjIyOiA4MiwKICAgIDB4NjIzOiA4MiwKICAgIDB4NjI0OiA4MiwKICAgIDB4NjI1OiA4MiwKICAgIDB4NjI2OiA2OCwKICAgIDB4NjI3OiA4MiwKICAgIDB4NjI4OiA2OCwKICAgIDB4NjI5OiA4MiwKICAgIDB4NjJhOiA2OCwKICAgIDB4NjJiOiA2OCwKICAgIDB4NjJjOiA2OCwKICAgIDB4NjJkOiA2OCwKICAgIDB4NjJlOiA2OCwKICAgIDB4NjJmOiA4MiwKICAgIDB4NjMwOiA4MiwKICAgIDB4NjMxOiA4MiwKICAgIDB4NjMyOiA4MiwKICAgIDB4NjMzOiA2OCwKICAgIDB4NjM0OiA2OCwKICAgIDB4NjM1OiA2OCwKICAgIDB4NjM2OiA2OCwKICAgIDB4NjM3OiA2OCwKICAgIDB4NjM4OiA2OCwKICAgIDB4NjM5OiA2OCwKICAgIDB4NjNhOiA2OCwKICAgIDB4NjNiOiA2OCwKICAgIDB4NjNjOiA2OCwKICAgIDB4NjNkOiA2OCwKICAgIDB4NjNlOiA2OCwKICAgIDB4NjNmOiA2OCwKICAgIDB4NjQwOiA2NywKICAgIDB4NjQxOiA2OCwKICAgIDB4NjQyOiA2OCwKICAgIDB4NjQzOiA2OCwKICAgIDB4NjQ0OiA2OCwKICAgIDB4NjQ1OiA2OCwKICAgIDB4NjQ2OiA2OCwKICAgIDB4NjQ3OiA2OCwKICAgIDB4NjQ4OiA4MiwKICAgIDB4NjQ5OiA2OCwKICAgIDB4NjRhOiA2OCwKICAgIDB4NjZlOiA2OCwKICAgIDB4NjZmOiA2OCwKICAgIDB4NjcxOiA4MiwKICAgIDB4NjcyOiA4MiwKICAgIDB4NjczOiA4MiwKICAgIDB4Njc0OiA4NSwKICAgIDB4Njc1OiA4MiwKICAgIDB4Njc2OiA4MiwKICAgIDB4Njc3OiA4MiwKICAgIDB4Njc4OiA2OCwKICAgIDB4Njc5OiA2OCwKICAgIDB4NjdhOiA2OCwKICAgIDB4NjdiOiA2OCwKICAgIDB4NjdjOiA2OCwKICAgIDB4NjdkOiA2OCwKICAgIDB4NjdlOiA2OCwKICAgIDB4NjdmOiA2OCwKICAgIDB4NjgwOiA2OCwKICAgIDB4NjgxOiA2OCwKICAgIDB4NjgyOiA2OCwKICAgIDB4NjgzOiA2OCwKICAgIDB4Njg0OiA2OCwKICAgIDB4Njg1OiA2OCwKICAgIDB4Njg2OiA2OCwKICAgIDB4Njg3OiA2OCwKICAgIDB4Njg4OiA4MiwKICAgIDB4Njg5OiA4MiwKICAgIDB4NjhhOiA4MiwKICAgIDB4NjhiOiA4MiwKICAgIDB4NjhjOiA4MiwKICAgIDB4NjhkOiA4MiwKICAgIDB4NjhlOiA4MiwKICAgIDB4NjhmOiA4MiwKICAgIDB4NjkwOiA4MiwKICAgIDB4NjkxOiA4MiwKICAgIDB4NjkyOiA4MiwKICAgIDB4NjkzOiA4MiwKICAgIDB4Njk0OiA4MiwKICAgIDB4Njk1OiA4MiwKICAgIDB4Njk2OiA4MiwKICAgIDB4Njk3OiA4MiwKICAgIDB4Njk4OiA4MiwKICAgIDB4Njk5OiA4MiwKICAgIDB4NjlhOiA2OCwKICAgIDB4NjliOiA2OCwKICAgIDB4NjljOiA2OCwKICAgIDB4NjlkOiA2OCwKICAgIDB4NjllOiA2OCwKICAgIDB4NjlmOiA2OCwKICAgIDB4NmEwOiA2OCwKICAgIDB4NmExOiA2OCwKICAgIDB4NmEyOiA2OCwKICAgIDB4NmEzOiA2OCwKICAgIDB4NmE0OiA2OCwKICAgIDB4NmE1OiA2OCwKICAgIDB4NmE2OiA2OCwKICAgIDB4NmE3OiA2OCwKICAgIDB4NmE4OiA2OCwKICAgIDB4NmE5OiA2OCwKICAgIDB4NmFhOiA2OCwKICAgIDB4NmFiOiA2OCwKICAgIDB4NmFjOiA2OCwKICAgIDB4NmFkOiA2OCwKICAgIDB4NmFlOiA2OCwKICAgIDB4NmFmOiA2OCwKICAgIDB4NmIwOiA2OCwKICAgIDB4NmIxOiA2OCwKICAgIDB4NmIyOiA2OCwKICAgIDB4NmIzOiA2OCwKICAgIDB4NmI0OiA2OCwKICAgIDB4NmI1OiA2OCwKICAgIDB4NmI2OiA2OCwKICAgIDB4NmI3OiA2OCwKICAgIDB4NmI4OiA2OCwKICAgIDB4NmI5OiA2OCwKICAgIDB4NmJhOiA2OCwKICAgIDB4NmJiOiA2OCwKICAgIDB4NmJjOiA2OCwKICAgIDB4NmJkOiA2OCwKICAgIDB4NmJlOiA2OCwKICAgIDB4NmJmOiA2OCwKICAgIDB4NmMwOiA4MiwKICAgIDB4NmMxOiA2OCwKICAgIDB4NmMyOiA2OCwKICAgIDB4NmMzOiA4MiwKICAgIDB4NmM0OiA4MiwKICAgIDB4NmM1OiA4MiwKICAgIDB4NmM2OiA4MiwKICAgIDB4NmM3OiA4MiwKICAgIDB4NmM4OiA4MiwKICAgIDB4NmM5OiA4MiwKICAgIDB4NmNhOiA4MiwKICAgIDB4NmNiOiA4MiwKICAgIDB4NmNjOiA2OCwKICAgIDB4NmNkOiA4MiwKICAgIDB4NmNlOiA2OCwKICAgIDB4NmNmOiA4MiwKICAgIDB4NmQwOiA2OCwKICAgIDB4NmQxOiA2OCwKICAgIDB4NmQyOiA4MiwKICAgIDB4NmQzOiA4MiwKICAgIDB4NmQ1OiA4MiwKICAgIDB4NmRkOiA4NSwKICAgIDB4NmVlOiA4MiwKICAgIDB4NmVmOiA4MiwKICAgIDB4NmZhOiA2OCwKICAgIDB4NmZiOiA2OCwKICAgIDB4NmZjOiA2OCwKICAgIDB4NmZmOiA2OCwKICAgIDB4NzEwOiA4MiwKICAgIDB4NzEyOiA2OCwKICAgIDB4NzEzOiA2OCwKICAgIDB4NzE0OiA2OCwKICAgIDB4NzE1OiA4MiwKICAgIDB4NzE2OiA4MiwKICAgIDB4NzE3OiA4MiwKICAgIDB4NzE4OiA4MiwKICAgIDB4NzE5OiA4MiwKICAgIDB4NzFhOiA2OCwKICAgIDB4NzFiOiA2OCwKICAgIDB4NzFjOiA2OCwKICAgIDB4NzFkOiA2OCwKICAgIDB4NzFlOiA4MiwKICAgIDB4NzFmOiA2OCwKICAgIDB4NzIwOiA2OCwKICAgIDB4NzIxOiA2OCwKICAgIDB4NzIyOiA2OCwKICAgIDB4NzIzOiA2OCwKICAgIDB4NzI0OiA2OCwKICAgIDB4NzI1OiA2OCwKICAgIDB4NzI2OiA2OCwKICAgIDB4NzI3OiA2OCwKICAgIDB4NzI4OiA4MiwKICAgIDB4NzI5OiA2OCwKICAgIDB4NzJhOiA4MiwKICAgIDB4NzJiOiA2OCwKICAgIDB4NzJjOiA4MiwKICAgIDB4NzJkOiA2OCwKICAgIDB4NzJlOiA2OCwKICAgIDB4NzJmOiA4MiwKICAgIDB4NzRkOiA4MiwKICAgIDB4NzRlOiA2OCwKICAgIDB4NzRmOiA2OCwKICAgIDB4NzUwOiA2OCwKICAgIDB4NzUxOiA2OCwKICAgIDB4NzUyOiA2OCwKICAgIDB4NzUzOiA2OCwKICAgIDB4NzU0OiA2OCwKICAgIDB4NzU1OiA2OCwKICAgIDB4NzU2OiA2OCwKICAgIDB4NzU3OiA2OCwKICAgIDB4NzU4OiA2OCwKICAgIDB4NzU5OiA4MiwKICAgIDB4NzVhOiA4MiwKICAgIDB4NzViOiA4MiwKICAgIDB4NzVjOiA2OCwKICAgIDB4NzVkOiA2OCwKICAgIDB4NzVlOiA2OCwKICAgIDB4NzVmOiA2OCwKICAgIDB4NzYwOiA2OCwKICAgIDB4NzYxOiA2OCwKICAgIDB4NzYyOiA2OCwKICAgIDB4NzYzOiA2OCwKICAgIDB4NzY0OiA2OCwKICAgIDB4NzY1OiA2OCwKICAgIDB4NzY2OiA2OCwKICAgIDB4NzY3OiA2OCwKICAgIDB4NzY4OiA2OCwKICAgIDB4NzY5OiA2OCwKICAgIDB4NzZhOiA2OCwKICAgIDB4NzZiOiA4MiwKICAgIDB4NzZjOiA4MiwKICAgIDB4NzZkOiA2OCwKICAgIDB4NzZlOiA2OCwKICAgIDB4NzZmOiA2OCwKICAgIDB4NzcwOiA2OCwKICAgIDB4NzcxOiA4MiwKICAgIDB4NzcyOiA2OCwKICAgIDB4NzczOiA4MiwKICAgIDB4Nzc0OiA4MiwKICAgIDB4Nzc1OiA2OCwKICAgIDB4Nzc2OiA2OCwKICAgIDB4Nzc3OiA2OCwKICAgIDB4Nzc4OiA4MiwKICAgIDB4Nzc5OiA4MiwKICAgIDB4NzdhOiA2OCwKICAgIDB4NzdiOiA2OCwKICAgIDB4NzdjOiA2OCwKICAgIDB4NzdkOiA2OCwKICAgIDB4NzdlOiA2OCwKICAgIDB4NzdmOiA2OCwKICAgIDB4N2NhOiA2OCwKICAgIDB4N2NiOiA2OCwKICAgIDB4N2NjOiA2OCwKICAgIDB4N2NkOiA2OCwKICAgIDB4N2NlOiA2OCwKICAgIDB4N2NmOiA2OCwKICAgIDB4N2QwOiA2OCwKICAgIDB4N2QxOiA2OCwKICAgIDB4N2QyOiA2OCwKICAgIDB4N2QzOiA2OCwKICAgIDB4N2Q0OiA2OCwKICAgIDB4N2Q1OiA2OCwKICAgIDB4N2Q2OiA2OCwKICAgIDB4N2Q3OiA2OCwKICAgIDB4N2Q4OiA2OCwKICAgIDB4N2Q5OiA2OCwKICAgIDB4N2RhOiA2OCwKICAgIDB4N2RiOiA2OCwKICAgIDB4N2RjOiA2OCwKICAgIDB4N2RkOiA2OCwKICAgIDB4N2RlOiA2OCwKICAgIDB4N2RmOiA2OCwKICAgIDB4N2UwOiA2OCwKICAgIDB4N2UxOiA2OCwKICAgIDB4N2UyOiA2OCwKICAgIDB4N2UzOiA2OCwKICAgIDB4N2U0OiA2OCwKICAgIDB4N2U1OiA2OCwKICAgIDB4N2U2OiA2OCwKICAgIDB4N2U3OiA2OCwKICAgIDB4N2U4OiA2OCwKICAgIDB4N2U5OiA2OCwKICAgIDB4N2VhOiA2OCwKICAgIDB4N2ZhOiA2NywKICAgIDB4ODQwOiA4MiwKICAgIDB4ODQxOiA2OCwKICAgIDB4ODQyOiA2OCwKICAgIDB4ODQzOiA2OCwKICAgIDB4ODQ0OiA2OCwKICAgIDB4ODQ1OiA2OCwKICAgIDB4ODQ2OiA4MiwKICAgIDB4ODQ3OiA2OCwKICAgIDB4ODQ4OiA2OCwKICAgIDB4ODQ5OiA4MiwKICAgIDB4ODRhOiA2OCwKICAgIDB4ODRiOiA2OCwKICAgIDB4ODRjOiA2OCwKICAgIDB4ODRkOiA2OCwKICAgIDB4ODRlOiA2OCwKICAgIDB4ODRmOiA4MiwKICAgIDB4ODUwOiA2OCwKICAgIDB4ODUxOiA2OCwKICAgIDB4ODUyOiA2OCwKICAgIDB4ODUzOiA2OCwKICAgIDB4ODU0OiA4MiwKICAgIDB4ODU1OiA2OCwKICAgIDB4ODU2OiA4NSwKICAgIDB4ODU3OiA4NSwKICAgIDB4ODU4OiA4NSwKICAgIDB4OGEwOiA2OCwKICAgIDB4OGEyOiA2OCwKICAgIDB4OGEzOiA2OCwKICAgIDB4OGE0OiA2OCwKICAgIDB4OGE1OiA2OCwKICAgIDB4OGE2OiA2OCwKICAgIDB4OGE3OiA2OCwKICAgIDB4OGE4OiA2OCwKICAgIDB4OGE5OiA2OCwKICAgIDB4OGFhOiA4MiwKICAgIDB4OGFiOiA4MiwKICAgIDB4OGFjOiA4MiwKICAgIDB4MTgwNjogODUsCiAgICAweDE4MDc6IDY4LAogICAgMHgxODBhOiA2NywKICAgIDB4MTgwZTogODUsCiAgICAweDE4MjA6IDY4LAogICAgMHgxODIxOiA2OCwKICAgIDB4MTgyMjogNjgsCiAgICAweDE4MjM6IDY4LAogICAgMHgxODI0OiA2OCwKICAgIDB4MTgyNTogNjgsCiAgICAweDE4MjY6IDY4LAogICAgMHgxODI3OiA2OCwKICAgIDB4MTgyODogNjgsCiAgICAweDE4Mjk6IDY4LAogICAgMHgxODJhOiA2OCwKICAgIDB4MTgyYjogNjgsCiAgICAweDE4MmM6IDY4LAogICAgMHgxODJkOiA2OCwKICAgIDB4MTgyZTogNjgsCiAgICAweDE4MmY6IDY4LAogICAgMHgxODMwOiA2OCwKICAgIDB4MTgzMTogNjgsCiAgICAweDE4MzI6IDY4LAogICAgMHgxODMzOiA2OCwKICAgIDB4MTgzNDogNjgsCiAgICAweDE4MzU6IDY4LAogICAgMHgxODM2OiA2OCwKICAgIDB4MTgzNzogNjgsCiAgICAweDE4Mzg6IDY4LAogICAgMHgxODM5OiA2OCwKICAgIDB4MTgzYTogNjgsCiAgICAweDE4M2I6IDY4LAogICAgMHgxODNjOiA2OCwKICAgIDB4MTgzZDogNjgsCiAgICAweDE4M2U6IDY4LAogICAgMHgxODNmOiA2OCwKICAgIDB4MTg0MDogNjgsCiAgICAweDE4NDE6IDY4LAogICAgMHgxODQyOiA2OCwKICAgIDB4MTg0MzogNjgsCiAgICAweDE4NDQ6IDY4LAogICAgMHgxODQ1OiA2OCwKICAgIDB4MTg0NjogNjgsCiAgICAweDE4NDc6IDY4LAogICAgMHgxODQ4OiA2OCwKICAgIDB4MTg0OTogNjgsCiAgICAweDE4NGE6IDY4LAogICAgMHgxODRiOiA2OCwKICAgIDB4MTg0YzogNjgsCiAgICAweDE4NGQ6IDY4LAogICAgMHgxODRlOiA2OCwKICAgIDB4MTg0ZjogNjgsCiAgICAweDE4NTA6IDY4LAogICAgMHgxODUxOiA2OCwKICAgIDB4MTg1MjogNjgsCiAgICAweDE4NTM6IDY4LAogICAgMHgxODU0OiA2OCwKICAgIDB4MTg1NTogNjgsCiAgICAweDE4NTY6IDY4LAogICAgMHgxODU3OiA2OCwKICAgIDB4MTg1ODogNjgsCiAgICAweDE4NTk6IDY4LAogICAgMHgxODVhOiA2OCwKICAgIDB4MTg1YjogNjgsCiAgICAweDE4NWM6IDY4LAogICAgMHgxODVkOiA2OCwKICAgIDB4MTg1ZTogNjgsCiAgICAweDE4NWY6IDY4LAogICAgMHgxODYwOiA2OCwKICAgIDB4MTg2MTogNjgsCiAgICAweDE4NjI6IDY4LAogICAgMHgxODYzOiA2OCwKICAgIDB4MTg2NDogNjgsCiAgICAweDE4NjU6IDY4LAogICAgMHgxODY2OiA2OCwKICAgIDB4MTg2NzogNjgsCiAgICAweDE4Njg6IDY4LAogICAgMHgxODY5OiA2OCwKICAgIDB4MTg2YTogNjgsCiAgICAweDE4NmI6IDY4LAogICAgMHgxODZjOiA2OCwKICAgIDB4MTg2ZDogNjgsCiAgICAweDE4NmU6IDY4LAogICAgMHgxODZmOiA2OCwKICAgIDB4MTg3MDogNjgsCiAgICAweDE4NzE6IDY4LAogICAgMHgxODcyOiA2OCwKICAgIDB4MTg3MzogNjgsCiAgICAweDE4NzQ6IDY4LAogICAgMHgxODc1OiA2OCwKICAgIDB4MTg3NjogNjgsCiAgICAweDE4Nzc6IDY4LAogICAgMHgxODgwOiA4NSwKICAgIDB4MTg4MTogODUsCiAgICAweDE4ODI6IDg1LAogICAgMHgxODgzOiA4NSwKICAgIDB4MTg4NDogODUsCiAgICAweDE4ODU6IDg1LAogICAgMHgxODg2OiA4NSwKICAgIDB4MTg4NzogNjgsCiAgICAweDE4ODg6IDY4LAogICAgMHgxODg5OiA2OCwKICAgIDB4MTg4YTogNjgsCiAgICAweDE4OGI6IDY4LAogICAgMHgxODhjOiA2OCwKICAgIDB4MTg4ZDogNjgsCiAgICAweDE4OGU6IDY4LAogICAgMHgxODhmOiA2OCwKICAgIDB4MTg5MDogNjgsCiAgICAweDE4OTE6IDY4LAogICAgMHgxODkyOiA2OCwKICAgIDB4MTg5MzogNjgsCiAgICAweDE4OTQ6IDY4LAogICAgMHgxODk1OiA2OCwKICAgIDB4MTg5NjogNjgsCiAgICAweDE4OTc6IDY4LAogICAgMHgxODk4OiA2OCwKICAgIDB4MTg5OTogNjgsCiAgICAweDE4OWE6IDY4LAogICAgMHgxODliOiA2OCwKICAgIDB4MTg5YzogNjgsCiAgICAweDE4OWQ6IDY4LAogICAgMHgxODllOiA2OCwKICAgIDB4MTg5ZjogNjgsCiAgICAweDE4YTA6IDY4LAogICAgMHgxOGExOiA2OCwKICAgIDB4MThhMjogNjgsCiAgICAweDE4YTM6IDY4LAogICAgMHgxOGE0OiA2OCwKICAgIDB4MThhNTogNjgsCiAgICAweDE4YTY6IDY4LAogICAgMHgxOGE3OiA2OCwKICAgIDB4MThhODogNjgsCiAgICAweDE4YWE6IDY4LAogICAgMHgyMDBjOiA4NSwKICAgIDB4MjAwZDogNjcsCiAgICAweDIwNjY6IDg1LAogICAgMHgyMDY3OiA4NSwKICAgIDB4MjA2ODogODUsCiAgICAweDIwNjk6IDg1LAogICAgMHhhODQwOiA2OCwKICAgIDB4YTg0MTogNjgsCiAgICAweGE4NDI6IDY4LAogICAgMHhhODQzOiA2OCwKICAgIDB4YTg0NDogNjgsCiAgICAweGE4NDU6IDY4LAogICAgMHhhODQ2OiA2OCwKICAgIDB4YTg0NzogNjgsCiAgICAweGE4NDg6IDY4LAogICAgMHhhODQ5OiA2OCwKICAgIDB4YTg0YTogNjgsCiAgICAweGE4NGI6IDY4LAogICAgMHhhODRjOiA2OCwKICAgIDB4YTg0ZDogNjgsCiAgICAweGE4NGU6IDY4LAogICAgMHhhODRmOiA2OCwKICAgIDB4YTg1MDogNjgsCiAgICAweGE4NTE6IDY4LAogICAgMHhhODUyOiA2OCwKICAgIDB4YTg1MzogNjgsCiAgICAweGE4NTQ6IDY4LAogICAgMHhhODU1OiA2OCwKICAgIDB4YTg1NjogNjgsCiAgICAweGE4NTc6IDY4LAogICAgMHhhODU4OiA2OCwKICAgIDB4YTg1OTogNjgsCiAgICAweGE4NWE6IDY4LAogICAgMHhhODViOiA2OCwKICAgIDB4YTg1YzogNjgsCiAgICAweGE4NWQ6IDY4LAogICAgMHhhODVlOiA2OCwKICAgIDB4YTg1ZjogNjgsCiAgICAweGE4NjA6IDY4LAogICAgMHhhODYxOiA2OCwKICAgIDB4YTg2MjogNjgsCiAgICAweGE4NjM6IDY4LAogICAgMHhhODY0OiA2OCwKICAgIDB4YTg2NTogNjgsCiAgICAweGE4NjY6IDY4LAogICAgMHhhODY3OiA2OCwKICAgIDB4YTg2ODogNjgsCiAgICAweGE4Njk6IDY4LAogICAgMHhhODZhOiA2OCwKICAgIDB4YTg2YjogNjgsCiAgICAweGE4NmM6IDY4LAogICAgMHhhODZkOiA2OCwKICAgIDB4YTg2ZTogNjgsCiAgICAweGE4NmY6IDY4LAogICAgMHhhODcwOiA2OCwKICAgIDB4YTg3MTogNjgsCiAgICAweGE4NzI6IDc2LAogICAgMHhhODczOiA4NSwKfQpjb2RlcG9pbnRfY2xhc3NlcyA9IHsKICAgICdQVkFMSUQnOiAoCiAgICAgICAgMHgyZDAwMDAwMDJlLAogICAgICAgIDB4MzAwMDAwMDAzYSwKICAgICAgICAweDYxMDAwMDAwN2IsCiAgICAgICAgMHhkZjAwMDAwMGY3LAogICAgICAgIDB4ZjgwMDAwMDEwMCwKICAgICAgICAweDEwMTAwMDAwMTAyLAogICAgICAgIDB4MTAzMDAwMDAxMDQsCiAgICAgICAgMHgxMDUwMDAwMDEwNiwKICAgICAgICAweDEwNzAwMDAwMTA4LAogICAgICAgIDB4MTA5MDAwMDAxMGEsCiAgICAgICAgMHgxMGIwMDAwMDEwYywKICAgICAgICAweDEwZDAwMDAwMTBlLAogICAgICAgIDB4MTBmMDAwMDAxMTAsCiAgICAgICAgMHgxMTEwMDAwMDExMiwKICAgICAgICAweDExMzAwMDAwMTE0LAogICAgICAgIDB4MTE1MDAwMDAxMTYsCiAgICAgICAgMHgxMTcwMDAwMDExOCwKICAgICAgICAweDExOTAwMDAwMTFhLAogICAgICAgIDB4MTFiMDAwMDAxMWMsCiAgICAgICAgMHgxMWQwMDAwMDExZSwKICAgICAgICAweDExZjAwMDAwMTIwLAogICAgICAgIDB4MTIxMDAwMDAxMjIsCiAgICAgICAgMHgxMjMwMDAwMDEyNCwKICAgICAgICAweDEyNTAwMDAwMTI2LAogICAgICAgIDB4MTI3MDAwMDAxMjgsCiAgICAgICAgMHgxMjkwMDAwMDEyYSwKICAgICAgICAweDEyYjAwMDAwMTJjLAogICAgICAgIDB4MTJkMDAwMDAxMmUsCiAgICAgICAgMHgxMmYwMDAwMDEzMCwKICAgICAgICAweDEzMTAwMDAwMTMyLAogICAgICAgIDB4MTM1MDAwMDAxMzYsCiAgICAgICAgMHgxMzcwMDAwMDEzOSwKICAgICAgICAweDEzYTAwMDAwMTNiLAogICAgICAgIDB4MTNjMDAwMDAxM2QsCiAgICAgICAgMHgxM2UwMDAwMDEzZiwKICAgICAgICAweDE0MjAwMDAwMTQzLAogICAgICAgIDB4MTQ0MDAwMDAxNDUsCiAgICAgICAgMHgxNDYwMDAwMDE0NywKICAgICAgICAweDE0ODAwMDAwMTQ5LAogICAgICAgIDB4MTRiMDAwMDAxNGMsCiAgICAgICAgMHgxNGQwMDAwMDE0ZSwKICAgICAgICAweDE0ZjAwMDAwMTUwLAogICAgICAgIDB4MTUxMDAwMDAxNTIsCiAgICAgICAgMHgxNTMwMDAwMDE1NCwKICAgICAgICAweDE1NTAwMDAwMTU2LAogICAgICAgIDB4MTU3MDAwMDAxNTgsCiAgICAgICAgMHgxNTkwMDAwMDE1YSwKICAgICAgICAweDE1YjAwMDAwMTVjLAogICAgICAgIDB4MTVkMDAwMDAxNWUsCiAgICAgICAgMHgxNWYwMDAwMDE2MCwKICAgICAgICAweDE2MTAwMDAwMTYyLAogICAgICAgIDB4MTYzMDAwMDAxNjQsCiAgICAgICAgMHgxNjUwMDAwMDE2NiwKICAgICAgICAweDE2NzAwMDAwMTY4LAogICAgICAgIDB4MTY5MDAwMDAxNmEsCiAgICAgICAgMHgxNmIwMDAwMDE2YywKICAgICAgICAweDE2ZDAwMDAwMTZlLAogICAgICAgIDB4MTZmMDAwMDAxNzAsCiAgICAgICAgMHgxNzEwMDAwMDE3MiwKICAgICAgICAweDE3MzAwMDAwMTc0LAogICAgICAgIDB4MTc1MDAwMDAxNzYsCiAgICAgICAgMHgxNzcwMDAwMDE3OCwKICAgICAgICAweDE3YTAwMDAwMTdiLAogICAgICAgIDB4MTdjMDAwMDAxN2QsCiAgICAgICAgMHgxN2UwMDAwMDE3ZiwKICAgICAgICAweDE4MDAwMDAwMTgxLAogICAgICAgIDB4MTgzMDAwMDAxODQsCiAgICAgICAgMHgxODUwMDAwMDE4NiwKICAgICAgICAweDE4ODAwMDAwMTg5LAogICAgICAgIDB4MThjMDAwMDAxOGUsCiAgICAgICAgMHgxOTIwMDAwMDE5MywKICAgICAgICAweDE5NTAwMDAwMTk2LAogICAgICAgIDB4MTk5MDAwMDAxOWMsCiAgICAgICAgMHgxOWUwMDAwMDE5ZiwKICAgICAgICAweDFhMTAwMDAwMWEyLAogICAgICAgIDB4MWEzMDAwMDAxYTQsCiAgICAgICAgMHgxYTUwMDAwMDFhNiwKICAgICAgICAweDFhODAwMDAwMWE5LAogICAgICAgIDB4MWFhMDAwMDAxYWMsCiAgICAgICAgMHgxYWQwMDAwMDFhZSwKICAgICAgICAweDFiMDAwMDAwMWIxLAogICAgICAgIDB4MWI0MDAwMDAxYjUsCiAgICAgICAgMHgxYjYwMDAwMDFiNywKICAgICAgICAweDFiOTAwMDAwMWJjLAogICAgICAgIDB4MWJkMDAwMDAxYzQsCiAgICAgICAgMHgxY2UwMDAwMDFjZiwKICAgICAgICAweDFkMDAwMDAwMWQxLAogICAgICAgIDB4MWQyMDAwMDAxZDMsCiAgICAgICAgMHgxZDQwMDAwMDFkNSwKICAgICAgICAweDFkNjAwMDAwMWQ3LAogICAgICAgIDB4MWQ4MDAwMDAxZDksCiAgICAgICAgMHgxZGEwMDAwMDFkYiwKICAgICAgICAweDFkYzAwMDAwMWRlLAogICAgICAgIDB4MWRmMDAwMDAxZTAsCiAgICAgICAgMHgxZTEwMDAwMDFlMiwKICAgICAgICAweDFlMzAwMDAwMWU0LAogICAgICAgIDB4MWU1MDAwMDAxZTYsCiAgICAgICAgMHgxZTcwMDAwMDFlOCwKICAgICAgICAweDFlOTAwMDAwMWVhLAogICAgICAgIDB4MWViMDAwMDAxZWMsCiAgICAgICAgMHgxZWQwMDAwMDFlZSwKICAgICAgICAweDFlZjAwMDAwMWYxLAogICAgICAgIDB4MWY1MDAwMDAxZjYsCiAgICAgICAgMHgxZjkwMDAwMDFmYSwKICAgICAgICAweDFmYjAwMDAwMWZjLAogICAgICAgIDB4MWZkMDAwMDAxZmUsCiAgICAgICAgMHgxZmYwMDAwMDIwMCwKICAgICAgICAweDIwMTAwMDAwMjAyLAogICAgICAgIDB4MjAzMDAwMDAyMDQsCiAgICAgICAgMHgyMDUwMDAwMDIwNiwKICAgICAgICAweDIwNzAwMDAwMjA4LAogICAgICAgIDB4MjA5MDAwMDAyMGEsCiAgICAgICAgMHgyMGIwMDAwMDIwYywKICAgICAgICAweDIwZDAwMDAwMjBlLAogICAgICAgIDB4MjBmMDAwMDAyMTAsCiAgICAgICAgMHgyMTEwMDAwMDIxMiwKICAgICAgICAweDIxMzAwMDAwMjE0LAogICAgICAgIDB4MjE1MDAwMDAyMTYsCiAgICAgICAgMHgyMTcwMDAwMDIxOCwKICAgICAgICAweDIxOTAwMDAwMjFhLAogICAgICAgIDB4MjFiMDAwMDAyMWMsCiAgICAgICAgMHgyMWQwMDAwMDIxZSwKICAgICAgICAweDIxZjAwMDAwMjIwLAogICAgICAgIDB4MjIxMDAwMDAyMjIsCiAgICAgICAgMHgyMjMwMDAwMDIyNCwKICAgICAgICAweDIyNTAwMDAwMjI2LAogICAgICAgIDB4MjI3MDAwMDAyMjgsCiAgICAgICAgMHgyMjkwMDAwMDIyYSwKICAgICAgICAweDIyYjAwMDAwMjJjLAogICAgICAgIDB4MjJkMDAwMDAyMmUsCiAgICAgICAgMHgyMmYwMDAwMDIzMCwKICAgICAgICAweDIzMTAwMDAwMjMyLAogICAgICAgIDB4MjMzMDAwMDAyM2EsCiAgICAgICAgMHgyM2MwMDAwMDIzZCwKICAgICAgICAweDIzZjAwMDAwMjQxLAogICAgICAgIDB4MjQyMDAwMDAyNDMsCiAgICAgICAgMHgyNDcwMDAwMDI0OCwKICAgICAgICAweDI0OTAwMDAwMjRhLAogICAgICAgIDB4MjRiMDAwMDAyNGMsCiAgICAgICAgMHgyNGQwMDAwMDI0ZSwKICAgICAgICAweDI0ZjAwMDAwMmIwLAogICAgICAgIDB4MmI5MDAwMDAyYzIsCiAgICAgICAgMHgyYzYwMDAwMDJkMiwKICAgICAgICAweDJlYzAwMDAwMmVkLAogICAgICAgIDB4MmVlMDAwMDAyZWYsCiAgICAgICAgMHgzMDAwMDAwMDM0MCwKICAgICAgICAweDM0MjAwMDAwMzQzLAogICAgICAgIDB4MzQ2MDAwMDAzNGYsCiAgICAgICAgMHgzNTAwMDAwMDM3MCwKICAgICAgICAweDM3MTAwMDAwMzcyLAogICAgICAgIDB4MzczMDAwMDAzNzQsCiAgICAgICAgMHgzNzcwMDAwMDM3OCwKICAgICAgICAweDM3YjAwMDAwMzdlLAogICAgICAgIDB4MzkwMDAwMDAzOTEsCiAgICAgICAgMHgzYWMwMDAwMDNjZiwKICAgICAgICAweDNkNzAwMDAwM2Q4LAogICAgICAgIDB4M2Q5MDAwMDAzZGEsCiAgICAgICAgMHgzZGIwMDAwMDNkYywKICAgICAgICAweDNkZDAwMDAwM2RlLAogICAgICAgIDB4M2RmMDAwMDAzZTAsCiAgICAgICAgMHgzZTEwMDAwMDNlMiwKICAgICAgICAweDNlMzAwMDAwM2U0LAogICAgICAgIDB4M2U1MDAwMDAzZTYsCiAgICAgICAgMHgzZTcwMDAwMDNlOCwKICAgICAgICAweDNlOTAwMDAwM2VhLAogICAgICAgIDB4M2ViMDAwMDAzZWMsCiAgICAgICAgMHgzZWQwMDAwMDNlZSwKICAgICAgICAweDNlZjAwMDAwM2YwLAogICAgICAgIDB4M2YzMDAwMDAzZjQsCiAgICAgICAgMHgzZjgwMDAwMDNmOSwKICAgICAgICAweDNmYjAwMDAwM2ZkLAogICAgICAgIDB4NDMwMDAwMDA0NjAsCiAgICAgICAgMHg0NjEwMDAwMDQ2MiwKICAgICAgICAweDQ2MzAwMDAwNDY0LAogICAgICAgIDB4NDY1MDAwMDA0NjYsCiAgICAgICAgMHg0NjcwMDAwMDQ2OCwKICAgICAgICAweDQ2OTAwMDAwNDZhLAogICAgICAgIDB4NDZiMDAwMDA0NmMsCiAgICAgICAgMHg0NmQwMDAwMDQ2ZSwKICAgICAgICAweDQ2ZjAwMDAwNDcwLAogICAgICAgIDB4NDcxMDAwMDA0NzIsCiAgICAgICAgMHg0NzMwMDAwMDQ3NCwKICAgICAgICAweDQ3NTAwMDAwNDc2LAogICAgICAgIDB4NDc3MDAwMDA0NzgsCiAgICAgICAgMHg0NzkwMDAwMDQ3YSwKICAgICAgICAweDQ3YjAwMDAwNDdjLAogICAgICAgIDB4NDdkMDAwMDA0N2UsCiAgICAgICAgMHg0N2YwMDAwMDQ4MCwKICAgICAgICAweDQ4MTAwMDAwNDgyLAogICAgICAgIDB4NDgzMDAwMDA0ODgsCiAgICAgICAgMHg0OGIwMDAwMDQ4YywKICAgICAgICAweDQ4ZDAwMDAwNDhlLAogICAgICAgIDB4NDhmMDAwMDA0OTAsCiAgICAgICAgMHg0OTEwMDAwMDQ5MiwKICAgICAgICAweDQ5MzAwMDAwNDk0LAogICAgICAgIDB4NDk1MDAwMDA0OTYsCiAgICAgICAgMHg0OTcwMDAwMDQ5OCwKICAgICAgICAweDQ5OTAwMDAwNDlhLAogICAgICAgIDB4NDliMDAwMDA0OWMsCiAgICAgICAgMHg0OWQwMDAwMDQ5ZSwKICAgICAgICAweDQ5ZjAwMDAwNGEwLAogICAgICAgIDB4NGExMDAwMDA0YTIsCiAgICAgICAgMHg0YTMwMDAwMDRhNCwKICAgICAgICAweDRhNTAwMDAwNGE2LAogICAgICAgIDB4NGE3MDAwMDA0YTgsCiAgICAgICAgMHg0YTkwMDAwMDRhYSwKICAgICAgICAweDRhYjAwMDAwNGFjLAogICAgICAgIDB4NGFkMDAwMDA0YWUsCiAgICAgICAgMHg0YWYwMDAwMDRiMCwKICAgICAgICAweDRiMTAwMDAwNGIyLAogICAgICAgIDB4NGIzMDAwMDA0YjQsCiAgICAgICAgMHg0YjUwMDAwMDRiNiwKICAgICAgICAweDRiNzAwMDAwNGI4LAogICAgICAgIDB4NGI5MDAwMDA0YmEsCiAgICAgICAgMHg0YmIwMDAwMDRiYywKICAgICAgICAweDRiZDAwMDAwNGJlLAogICAgICAgIDB4NGJmMDAwMDA0YzAsCiAgICAgICAgMHg0YzIwMDAwMDRjMywKICAgICAgICAweDRjNDAwMDAwNGM1LAogICAgICAgIDB4NGM2MDAwMDA0YzcsCiAgICAgICAgMHg0YzgwMDAwMDRjOSwKICAgICAgICAweDRjYTAwMDAwNGNiLAogICAgICAgIDB4NGNjMDAwMDA0Y2QsCiAgICAgICAgMHg0Y2UwMDAwMDRkMCwKICAgICAgICAweDRkMTAwMDAwNGQyLAogICAgICAgIDB4NGQzMDAwMDA0ZDQsCiAgICAgICAgMHg0ZDUwMDAwMDRkNiwKICAgICAgICAweDRkNzAwMDAwNGQ4LAogICAgICAgIDB4NGQ5MDAwMDA0ZGEsCiAgICAgICAgMHg0ZGIwMDAwMDRkYywKICAgICAgICAweDRkZDAwMDAwNGRlLAogICAgICAgIDB4NGRmMDAwMDA0ZTAsCiAgICAgICAgMHg0ZTEwMDAwMDRlMiwKICAgICAgICAweDRlMzAwMDAwNGU0LAogICAgICAgIDB4NGU1MDAwMDA0ZTYsCiAgICAgICAgMHg0ZTcwMDAwMDRlOCwKICAgICAgICAweDRlOTAwMDAwNGVhLAogICAgICAgIDB4NGViMDAwMDA0ZWMsCiAgICAgICAgMHg0ZWQwMDAwMDRlZSwKICAgICAgICAweDRlZjAwMDAwNGYwLAogICAgICAgIDB4NGYxMDAwMDA0ZjIsCiAgICAgICAgMHg0ZjMwMDAwMDRmNCwKICAgICAgICAweDRmNTAwMDAwNGY2LAogICAgICAgIDB4NGY3MDAwMDA0ZjgsCiAgICAgICAgMHg0ZjkwMDAwMDRmYSwKICAgICAgICAweDRmYjAwMDAwNGZjLAogICAgICAgIDB4NGZkMDAwMDA0ZmUsCiAgICAgICAgMHg0ZmYwMDAwMDUwMCwKICAgICAgICAweDUwMTAwMDAwNTAyLAogICAgICAgIDB4NTAzMDAwMDA1MDQsCiAgICAgICAgMHg1MDUwMDAwMDUwNiwKICAgICAgICAweDUwNzAwMDAwNTA4LAogICAgICAgIDB4NTA5MDAwMDA1MGEsCiAgICAgICAgMHg1MGIwMDAwMDUwYywKICAgICAgICAweDUwZDAwMDAwNTBlLAogICAgICAgIDB4NTBmMDAwMDA1MTAsCiAgICAgICAgMHg1MTEwMDAwMDUxMiwKICAgICAgICAweDUxMzAwMDAwNTE0LAogICAgICAgIDB4NTE1MDAwMDA1MTYsCiAgICAgICAgMHg1MTcwMDAwMDUxOCwKICAgICAgICAweDUxOTAwMDAwNTFhLAogICAgICAgIDB4NTFiMDAwMDA1MWMsCiAgICAgICAgMHg1MWQwMDAwMDUxZSwKICAgICAgICAweDUxZjAwMDAwNTIwLAogICAgICAgIDB4NTIxMDAwMDA1MjIsCiAgICAgICAgMHg1MjMwMDAwMDUyNCwKICAgICAgICAweDUyNTAwMDAwNTI2LAogICAgICAgIDB4NTI3MDAwMDA1MjgsCiAgICAgICAgMHg1NTkwMDAwMDU1YSwKICAgICAgICAweDU2MTAwMDAwNTg3LAogICAgICAgIDB4NTkxMDAwMDA1YmUsCiAgICAgICAgMHg1YmYwMDAwMDVjMCwKICAgICAgICAweDVjMTAwMDAwNWMzLAogICAgICAgIDB4NWM0MDAwMDA1YzYsCiAgICAgICAgMHg1YzcwMDAwMDVjOCwKICAgICAgICAweDVkMDAwMDAwNWViLAogICAgICAgIDB4NWYwMDAwMDA1ZjMsCiAgICAgICAgMHg2MTAwMDAwMDYxYiwKICAgICAgICAweDYyMDAwMDAwNjQwLAogICAgICAgIDB4NjQxMDAwMDA2NjAsCiAgICAgICAgMHg2NmUwMDAwMDY3NSwKICAgICAgICAweDY3OTAwMDAwNmQ0LAogICAgICAgIDB4NmQ1MDAwMDA2ZGQsCiAgICAgICAgMHg2ZGYwMDAwMDZlOSwKICAgICAgICAweDZlYTAwMDAwNmYwLAogICAgICAgIDB4NmZhMDAwMDA3MDAsCiAgICAgICAgMHg3MTAwMDAwMDc0YiwKICAgICAgICAweDc0ZDAwMDAwN2IyLAogICAgICAgIDB4N2MwMDAwMDA3ZjYsCiAgICAgICAgMHg4MDAwMDAwMDgyZSwKICAgICAgICAweDg0MDAwMDAwODVjLAogICAgICAgIDB4OGEwMDAwMDA4YTEsCiAgICAgICAgMHg4YTIwMDAwMDhhZCwKICAgICAgICAweDhlNDAwMDAwOGZmLAogICAgICAgIDB4OTAwMDAwMDA5NTgsCiAgICAgICAgMHg5NjAwMDAwMDk2NCwKICAgICAgICAweDk2NjAwMDAwOTcwLAogICAgICAgIDB4OTcxMDAwMDA5NzgsCiAgICAgICAgMHg5NzkwMDAwMDk4MCwKICAgICAgICAweDk4MTAwMDAwOTg0LAogICAgICAgIDB4OTg1MDAwMDA5OGQsCiAgICAgICAgMHg5OGYwMDAwMDk5MSwKICAgICAgICAweDk5MzAwMDAwOWE5LAogICAgICAgIDB4OWFhMDAwMDA5YjEsCiAgICAgICAgMHg5YjIwMDAwMDliMywKICAgICAgICAweDliNjAwMDAwOWJhLAogICAgICAgIDB4OWJjMDAwMDA5YzUsCiAgICAgICAgMHg5YzcwMDAwMDljOSwKICAgICAgICAweDljYjAwMDAwOWNmLAogICAgICAgIDB4OWQ3MDAwMDA5ZDgsCiAgICAgICAgMHg5ZTAwMDAwMDllNCwKICAgICAgICAweDllNjAwMDAwOWYyLAogICAgICAgIDB4YTAxMDAwMDBhMDQsCiAgICAgICAgMHhhMDUwMDAwMGEwYiwKICAgICAgICAweGEwZjAwMDAwYTExLAogICAgICAgIDB4YTEzMDAwMDBhMjksCiAgICAgICAgMHhhMmEwMDAwMGEzMSwKICAgICAgICAweGEzMjAwMDAwYTMzLAogICAgICAgIDB4YTM1MDAwMDBhMzYsCiAgICAgICAgMHhhMzgwMDAwMGEzYSwKICAgICAgICAweGEzYzAwMDAwYTNkLAogICAgICAgIDB4YTNlMDAwMDBhNDMsCiAgICAgICAgMHhhNDcwMDAwMGE0OSwKICAgICAgICAweGE0YjAwMDAwYTRlLAogICAgICAgIDB4YTUxMDAwMDBhNTIsCiAgICAgICAgMHhhNWMwMDAwMGE1ZCwKICAgICAgICAweGE2NjAwMDAwYTc2LAogICAgICAgIDB4YTgxMDAwMDBhODQsCiAgICAgICAgMHhhODUwMDAwMGE4ZSwKICAgICAgICAweGE4ZjAwMDAwYTkyLAogICAgICAgIDB4YTkzMDAwMDBhYTksCiAgICAgICAgMHhhYWEwMDAwMGFiMSwKICAgICAgICAweGFiMjAwMDAwYWI0LAogICAgICAgIDB4YWI1MDAwMDBhYmEsCiAgICAgICAgMHhhYmMwMDAwMGFjNiwKICAgICAgICAweGFjNzAwMDAwYWNhLAogICAgICAgIDB4YWNiMDAwMDBhY2UsCiAgICAgICAgMHhhZDAwMDAwMGFkMSwKICAgICAgICAweGFlMDAwMDAwYWU0LAogICAgICAgIDB4YWU2MDAwMDBhZjAsCiAgICAgICAgMHhiMDEwMDAwMGIwNCwKICAgICAgICAweGIwNTAwMDAwYjBkLAogICAgICAgIDB4YjBmMDAwMDBiMTEsCiAgICAgICAgMHhiMTMwMDAwMGIyOSwKICAgICAgICAweGIyYTAwMDAwYjMxLAogICAgICAgIDB4YjMyMDAwMDBiMzQsCiAgICAgICAgMHhiMzUwMDAwMGIzYSwKICAgICAgICAweGIzYzAwMDAwYjQ1LAogICAgICAgIDB4YjQ3MDAwMDBiNDksCiAgICAgICAgMHhiNGIwMDAwMGI0ZSwKICAgICAgICAweGI1NjAwMDAwYjU4LAogICAgICAgIDB4YjVmMDAwMDBiNjQsCiAgICAgICAgMHhiNjYwMDAwMGI3MCwKICAgICAgICAweGI3MTAwMDAwYjcyLAogICAgICAgIDB4YjgyMDAwMDBiODQsCiAgICAgICAgMHhiODUwMDAwMGI4YiwKICAgICAgICAweGI4ZTAwMDAwYjkxLAogICAgICAgIDB4YjkyMDAwMDBiOTYsCiAgICAgICAgMHhiOTkwMDAwMGI5YiwKICAgICAgICAweGI5YzAwMDAwYjlkLAogICAgICAgIDB4YjllMDAwMDBiYTAsCiAgICAgICAgMHhiYTMwMDAwMGJhNSwKICAgICAgICAweGJhODAwMDAwYmFiLAogICAgICAgIDB4YmFlMDAwMDBiYmEsCiAgICAgICAgMHhiYmUwMDAwMGJjMywKICAgICAgICAweGJjNjAwMDAwYmM5LAogICAgICAgIDB4YmNhMDAwMDBiY2UsCiAgICAgICAgMHhiZDAwMDAwMGJkMSwKICAgICAgICAweGJkNzAwMDAwYmQ4LAogICAgICAgIDB4YmU2MDAwMDBiZjAsCiAgICAgICAgMHhjMDEwMDAwMGMwNCwKICAgICAgICAweGMwNTAwMDAwYzBkLAogICAgICAgIDB4YzBlMDAwMDBjMTEsCiAgICAgICAgMHhjMTIwMDAwMGMyOSwKICAgICAgICAweGMyYTAwMDAwYzM0LAogICAgICAgIDB4YzM1MDAwMDBjM2EsCiAgICAgICAgMHhjM2QwMDAwMGM0NSwKICAgICAgICAweGM0NjAwMDAwYzQ5LAogICAgICAgIDB4YzRhMDAwMDBjNGUsCiAgICAgICAgMHhjNTUwMDAwMGM1NywKICAgICAgICAweGM1ODAwMDAwYzVhLAogICAgICAgIDB4YzYwMDAwMDBjNjQsCiAgICAgICAgMHhjNjYwMDAwMGM3MCwKICAgICAgICAweGM4MjAwMDAwYzg0LAogICAgICAgIDB4Yzg1MDAwMDBjOGQsCiAgICAgICAgMHhjOGUwMDAwMGM5MSwKICAgICAgICAweGM5MjAwMDAwY2E5LAogICAgICAgIDB4Y2FhMDAwMDBjYjQsCiAgICAgICAgMHhjYjUwMDAwMGNiYSwKICAgICAgICAweGNiYzAwMDAwY2M1LAogICAgICAgIDB4Y2M2MDAwMDBjYzksCiAgICAgICAgMHhjY2EwMDAwMGNjZSwKICAgICAgICAweGNkNTAwMDAwY2Q3LAogICAgICAgIDB4Y2RlMDAwMDBjZGYsCiAgICAgICAgMHhjZTAwMDAwMGNlNCwKICAgICAgICAweGNlNjAwMDAwY2YwLAogICAgICAgIDB4Y2YxMDAwMDBjZjMsCiAgICAgICAgMHhkMDIwMDAwMGQwNCwKICAgICAgICAweGQwNTAwMDAwZDBkLAogICAgICAgIDB4ZDBlMDAwMDBkMTEsCiAgICAgICAgMHhkMTIwMDAwMGQzYiwKICAgICAgICAweGQzZDAwMDAwZDQ1LAogICAgICAgIDB4ZDQ2MDAwMDBkNDksCiAgICAgICAgMHhkNGEwMDAwMGQ0ZiwKICAgICAgICAweGQ1NzAwMDAwZDU4LAogICAgICAgIDB4ZDYwMDAwMDBkNjQsCiAgICAgICAgMHhkNjYwMDAwMGQ3MCwKICAgICAgICAweGQ3YTAwMDAwZDgwLAogICAgICAgIDB4ZDgyMDAwMDBkODQsCiAgICAgICAgMHhkODUwMDAwMGQ5NywKICAgICAgICAweGQ5YTAwMDAwZGIyLAogICAgICAgIDB4ZGIzMDAwMDBkYmMsCiAgICAgICAgMHhkYmQwMDAwMGRiZSwKICAgICAgICAweGRjMDAwMDAwZGM3LAogICAgICAgIDB4ZGNhMDAwMDBkY2IsCiAgICAgICAgMHhkY2YwMDAwMGRkNSwKICAgICAgICAweGRkNjAwMDAwZGQ3LAogICAgICAgIDB4ZGQ4MDAwMDBkZTAsCiAgICAgICAgMHhkZjIwMDAwMGRmNCwKICAgICAgICAweGUwMTAwMDAwZTMzLAogICAgICAgIDB4ZTM0MDAwMDBlM2IsCiAgICAgICAgMHhlNDAwMDAwMGU0ZiwKICAgICAgICAweGU1MDAwMDAwZTVhLAogICAgICAgIDB4ZTgxMDAwMDBlODMsCiAgICAgICAgMHhlODQwMDAwMGU4NSwKICAgICAgICAweGU4NzAwMDAwZTg5LAogICAgICAgIDB4ZThhMDAwMDBlOGIsCiAgICAgICAgMHhlOGQwMDAwMGU4ZSwKICAgICAgICAweGU5NDAwMDAwZTk4LAogICAgICAgIDB4ZTk5MDAwMDBlYTAsCiAgICAgICAgMHhlYTEwMDAwMGVhNCwKICAgICAgICAweGVhNTAwMDAwZWE2LAogICAgICAgIDB4ZWE3MDAwMDBlYTgsCiAgICAgICAgMHhlYWEwMDAwMGVhYywKICAgICAgICAweGVhZDAwMDAwZWIzLAogICAgICAgIDB4ZWI0MDAwMDBlYmEsCiAgICAgICAgMHhlYmIwMDAwMGViZSwKICAgICAgICAweGVjMDAwMDAwZWM1LAogICAgICAgIDB4ZWM2MDAwMDBlYzcsCiAgICAgICAgMHhlYzgwMDAwMGVjZSwKICAgICAgICAweGVkMDAwMDAwZWRhLAogICAgICAgIDB4ZWRlMDAwMDBlZTAsCiAgICAgICAgMHhmMDAwMDAwMGYwMSwKICAgICAgICAweGYwYjAwMDAwZjBjLAogICAgICAgIDB4ZjE4MDAwMDBmMWEsCiAgICAgICAgMHhmMjAwMDAwMGYyYSwKICAgICAgICAweGYzNTAwMDAwZjM2LAogICAgICAgIDB4ZjM3MDAwMDBmMzgsCiAgICAgICAgMHhmMzkwMDAwMGYzYSwKICAgICAgICAweGYzZTAwMDAwZjQzLAogICAgICAgIDB4ZjQ0MDAwMDBmNDgsCiAgICAgICAgMHhmNDkwMDAwMGY0ZCwKICAgICAgICAweGY0ZTAwMDAwZjUyLAogICAgICAgIDB4ZjUzMDAwMDBmNTcsCiAgICAgICAgMHhmNTgwMDAwMGY1YywKICAgICAgICAweGY1ZDAwMDAwZjY5LAogICAgICAgIDB4ZjZhMDAwMDBmNmQsCiAgICAgICAgMHhmNzEwMDAwMGY3MywKICAgICAgICAweGY3NDAwMDAwZjc1LAogICAgICAgIDB4ZjdhMDAwMDBmODEsCiAgICAgICAgMHhmODIwMDAwMGY4NSwKICAgICAgICAweGY4NjAwMDAwZjkzLAogICAgICAgIDB4Zjk0MDAwMDBmOTgsCiAgICAgICAgMHhmOTkwMDAwMGY5ZCwKICAgICAgICAweGY5ZTAwMDAwZmEyLAogICAgICAgIDB4ZmEzMDAwMDBmYTcsCiAgICAgICAgMHhmYTgwMDAwMGZhYywKICAgICAgICAweGZhZDAwMDAwZmI5LAogICAgICAgIDB4ZmJhMDAwMDBmYmQsCiAgICAgICAgMHhmYzYwMDAwMGZjNywKICAgICAgICAweDEwMDAwMDAwMTA0YSwKICAgICAgICAweDEwNTAwMDAwMTA5ZSwKICAgICAgICAweDEwZDAwMDAwMTBmYiwKICAgICAgICAweDEwZmQwMDAwMTEwMCwKICAgICAgICAweDEyMDAwMDAwMTI0OSwKICAgICAgICAweDEyNGEwMDAwMTI0ZSwKICAgICAgICAweDEyNTAwMDAwMTI1NywKICAgICAgICAweDEyNTgwMDAwMTI1OSwKICAgICAgICAweDEyNWEwMDAwMTI1ZSwKICAgICAgICAweDEyNjAwMDAwMTI4OSwKICAgICAgICAweDEyOGEwMDAwMTI4ZSwKICAgICAgICAweDEyOTAwMDAwMTJiMSwKICAgICAgICAweDEyYjIwMDAwMTJiNiwKICAgICAgICAweDEyYjgwMDAwMTJiZiwKICAgICAgICAweDEyYzAwMDAwMTJjMSwKICAgICAgICAweDEyYzIwMDAwMTJjNiwKICAgICAgICAweDEyYzgwMDAwMTJkNywKICAgICAgICAweDEyZDgwMDAwMTMxMSwKICAgICAgICAweDEzMTIwMDAwMTMxNiwKICAgICAgICAweDEzMTgwMDAwMTM1YiwKICAgICAgICAweDEzNWQwMDAwMTM2MCwKICAgICAgICAweDEzODAwMDAwMTM5MCwKICAgICAgICAweDEzYTAwMDAwMTNmNSwKICAgICAgICAweDE0MDEwMDAwMTY2ZCwKICAgICAgICAweDE2NmYwMDAwMTY4MCwKICAgICAgICAweDE2ODEwMDAwMTY5YiwKICAgICAgICAweDE2YTAwMDAwMTZlYiwKICAgICAgICAweDE3MDAwMDAwMTcwZCwKICAgICAgICAweDE3MGUwMDAwMTcxNSwKICAgICAgICAweDE3MjAwMDAwMTczNSwKICAgICAgICAweDE3NDAwMDAwMTc1NCwKICAgICAgICAweDE3NjAwMDAwMTc2ZCwKICAgICAgICAweDE3NmUwMDAwMTc3MSwKICAgICAgICAweDE3NzIwMDAwMTc3NCwKICAgICAgICAweDE3ODAwMDAwMTdiNCwKICAgICAgICAweDE3YjYwMDAwMTdkNCwKICAgICAgICAweDE3ZDcwMDAwMTdkOCwKICAgICAgICAweDE3ZGMwMDAwMTdkZSwKICAgICAgICAweDE3ZTAwMDAwMTdlYSwKICAgICAgICAweDE4MTAwMDAwMTgxYSwKICAgICAgICAweDE4MjAwMDAwMTg3OCwKICAgICAgICAweDE4ODAwMDAwMThhYiwKICAgICAgICAweDE4YjAwMDAwMThmNiwKICAgICAgICAweDE5MDAwMDAwMTkxZCwKICAgICAgICAweDE5MjAwMDAwMTkyYywKICAgICAgICAweDE5MzAwMDAwMTkzYywKICAgICAgICAweDE5NDYwMDAwMTk2ZSwKICAgICAgICAweDE5NzAwMDAwMTk3NSwKICAgICAgICAweDE5ODAwMDAwMTlhYywKICAgICAgICAweDE5YjAwMDAwMTljYSwKICAgICAgICAweDE5ZDAwMDAwMTlkYSwKICAgICAgICAweDFhMDAwMDAwMWExYywKICAgICAgICAweDFhMjAwMDAwMWE1ZiwKICAgICAgICAweDFhNjAwMDAwMWE3ZCwKICAgICAgICAweDFhN2YwMDAwMWE4YSwKICAgICAgICAweDFhOTAwMDAwMWE5YSwKICAgICAgICAweDFhYTcwMDAwMWFhOCwKICAgICAgICAweDFiMDAwMDAwMWI0YywKICAgICAgICAweDFiNTAwMDAwMWI1YSwKICAgICAgICAweDFiNmIwMDAwMWI3NCwKICAgICAgICAweDFiODAwMDAwMWJmNCwKICAgICAgICAweDFjMDAwMDAwMWMzOCwKICAgICAgICAweDFjNDAwMDAwMWM0YSwKICAgICAgICAweDFjNGQwMDAwMWM3ZSwKICAgICAgICAweDFjZDAwMDAwMWNkMywKICAgICAgICAweDFjZDQwMDAwMWNmNywKICAgICAgICAweDFkMDAwMDAwMWQyYywKICAgICAgICAweDFkMmYwMDAwMWQzMCwKICAgICAgICAweDFkM2IwMDAwMWQzYywKICAgICAgICAweDFkNGUwMDAwMWQ0ZiwKICAgICAgICAweDFkNmIwMDAwMWQ3OCwKICAgICAgICAweDFkNzkwMDAwMWQ5YiwKICAgICAgICAweDFkYzAwMDAwMWRlNywKICAgICAgICAweDFkZmMwMDAwMWUwMCwKICAgICAgICAweDFlMDEwMDAwMWUwMiwKICAgICAgICAweDFlMDMwMDAwMWUwNCwKICAgICAgICAweDFlMDUwMDAwMWUwNiwKICAgICAgICAweDFlMDcwMDAwMWUwOCwKICAgICAgICAweDFlMDkwMDAwMWUwYSwKICAgICAgICAweDFlMGIwMDAwMWUwYywKICAgICAgICAweDFlMGQwMDAwMWUwZSwKICAgICAgICAweDFlMGYwMDAwMWUxMCwKICAgICAgICAweDFlMTEwMDAwMWUxMiwKICAgICAgICAweDFlMTMwMDAwMWUxNCwKICAgICAgICAweDFlMTUwMDAwMWUxNiwKICAgICAgICAweDFlMTcwMDAwMWUxOCwKICAgICAgICAweDFlMTkwMDAwMWUxYSwKICAgICAgICAweDFlMWIwMDAwMWUxYywKICAgICAgICAweDFlMWQwMDAwMWUxZSwKICAgICAgICAweDFlMWYwMDAwMWUyMCwKICAgICAgICAweDFlMjEwMDAwMWUyMiwKICAgICAgICAweDFlMjMwMDAwMWUyNCwKICAgICAgICAweDFlMjUwMDAwMWUyNiwKICAgICAgICAweDFlMjcwMDAwMWUyOCwKICAgICAgICAweDFlMjkwMDAwMWUyYSwKICAgICAgICAweDFlMmIwMDAwMWUyYywKICAgICAgICAweDFlMmQwMDAwMWUyZSwKICAgICAgICAweDFlMmYwMDAwMWUzMCwKICAgICAgICAweDFlMzEwMDAwMWUzMiwKICAgICAgICAweDFlMzMwMDAwMWUzNCwKICAgICAgICAweDFlMzUwMDAwMWUzNiwKICAgICAgICAweDFlMzcwMDAwMWUzOCwKICAgICAgICAweDFlMzkwMDAwMWUzYSwKICAgICAgICAweDFlM2IwMDAwMWUzYywKICAgICAgICAweDFlM2QwMDAwMWUzZSwKICAgICAgICAweDFlM2YwMDAwMWU0MCwKICAgICAgICAweDFlNDEwMDAwMWU0MiwKICAgICAgICAweDFlNDMwMDAwMWU0NCwKICAgICAgICAweDFlNDUwMDAwMWU0NiwKICAgICAgICAweDFlNDcwMDAwMWU0OCwKICAgICAgICAweDFlNDkwMDAwMWU0YSwKICAgICAgICAweDFlNGIwMDAwMWU0YywKICAgICAgICAweDFlNGQwMDAwMWU0ZSwKICAgICAgICAweDFlNGYwMDAwMWU1MCwKICAgICAgICAweDFlNTEwMDAwMWU1MiwKICAgICAgICAweDFlNTMwMDAwMWU1NCwKICAgICAgICAweDFlNTUwMDAwMWU1NiwKICAgICAgICAweDFlNTcwMDAwMWU1OCwKICAgICAgICAweDFlNTkwMDAwMWU1YSwKICAgICAgICAweDFlNWIwMDAwMWU1YywKICAgICAgICAweDFlNWQwMDAwMWU1ZSwKICAgICAgICAweDFlNWYwMDAwMWU2MCwKICAgICAgICAweDFlNjEwMDAwMWU2MiwKICAgICAgICAweDFlNjMwMDAwMWU2NCwKICAgICAgICAweDFlNjUwMDAwMWU2NiwKICAgICAgICAweDFlNjcwMDAwMWU2OCwKICAgICAgICAweDFlNjkwMDAwMWU2YSwKICAgICAgICAweDFlNmIwMDAwMWU2YywKICAgICAgICAweDFlNmQwMDAwMWU2ZSwKICAgICAgICAweDFlNmYwMDAwMWU3MCwKICAgICAgICAweDFlNzEwMDAwMWU3MiwKICAgICAgICAweDFlNzMwMDAwMWU3NCwKICAgICAgICAweDFlNzUwMDAwMWU3NiwKICAgICAgICAweDFlNzcwMDAwMWU3OCwKICAgICAgICAweDFlNzkwMDAwMWU3YSwKICAgICAgICAweDFlN2IwMDAwMWU3YywKICAgICAgICAweDFlN2QwMDAwMWU3ZSwKICAgICAgICAweDFlN2YwMDAwMWU4MCwKICAgICAgICAweDFlODEwMDAwMWU4MiwKICAgICAgICAweDFlODMwMDAwMWU4NCwKICAgICAgICAweDFlODUwMDAwMWU4NiwKICAgICAgICAweDFlODcwMDAwMWU4OCwKICAgICAgICAweDFlODkwMDAwMWU4YSwKICAgICAgICAweDFlOGIwMDAwMWU4YywKICAgICAgICAweDFlOGQwMDAwMWU4ZSwKICAgICAgICAweDFlOGYwMDAwMWU5MCwKICAgICAgICAweDFlOTEwMDAwMWU5MiwKICAgICAgICAweDFlOTMwMDAwMWU5NCwKICAgICAgICAweDFlOTUwMDAwMWU5YSwKICAgICAgICAweDFlOWMwMDAwMWU5ZSwKICAgICAgICAweDFlOWYwMDAwMWVhMCwKICAgICAgICAweDFlYTEwMDAwMWVhMiwKICAgICAgICAweDFlYTMwMDAwMWVhNCwKICAgICAgICAweDFlYTUwMDAwMWVhNiwKICAgICAgICAweDFlYTcwMDAwMWVhOCwKICAgICAgICAweDFlYTkwMDAwMWVhYSwKICAgICAgICAweDFlYWIwMDAwMWVhYywKICAgICAgICAweDFlYWQwMDAwMWVhZSwKICAgICAgICAweDFlYWYwMDAwMWViMCwKICAgICAgICAweDFlYjEwMDAwMWViMiwKICAgICAgICAweDFlYjMwMDAwMWViNCwKICAgICAgICAweDFlYjUwMDAwMWViNiwKICAgICAgICAweDFlYjcwMDAwMWViOCwKICAgICAgICAweDFlYjkwMDAwMWViYSwKICAgICAgICAweDFlYmIwMDAwMWViYywKICAgICAgICAweDFlYmQwMDAwMWViZSwKICAgICAgICAweDFlYmYwMDAwMWVjMCwKICAgICAgICAweDFlYzEwMDAwMWVjMiwKICAgICAgICAweDFlYzMwMDAwMWVjNCwKICAgICAgICAweDFlYzUwMDAwMWVjNiwKICAgICAgICAweDFlYzcwMDAwMWVjOCwKICAgICAgICAweDFlYzkwMDAwMWVjYSwKICAgICAgICAweDFlY2IwMDAwMWVjYywKICAgICAgICAweDFlY2QwMDAwMWVjZSwKICAgICAgICAweDFlY2YwMDAwMWVkMCwKICAgICAgICAweDFlZDEwMDAwMWVkMiwKICAgICAgICAweDFlZDMwMDAwMWVkNCwKICAgICAgICAweDFlZDUwMDAwMWVkNiwKICAgICAgICAweDFlZDcwMDAwMWVkOCwKICAgICAgICAweDFlZDkwMDAwMWVkYSwKICAgICAgICAweDFlZGIwMDAwMWVkYywKICAgICAgICAweDFlZGQwMDAwMWVkZSwKICAgICAgICAweDFlZGYwMDAwMWVlMCwKICAgICAgICAweDFlZTEwMDAwMWVlMiwKICAgICAgICAweDFlZTMwMDAwMWVlNCwKICAgICAgICAweDFlZTUwMDAwMWVlNiwKICAgICAgICAweDFlZTcwMDAwMWVlOCwKICAgICAgICAweDFlZTkwMDAwMWVlYSwKICAgICAgICAweDFlZWIwMDAwMWVlYywKICAgICAgICAweDFlZWQwMDAwMWVlZSwKICAgICAgICAweDFlZWYwMDAwMWVmMCwKICAgICAgICAweDFlZjEwMDAwMWVmMiwKICAgICAgICAweDFlZjMwMDAwMWVmNCwKICAgICAgICAweDFlZjUwMDAwMWVmNiwKICAgICAgICAweDFlZjcwMDAwMWVmOCwKICAgICAgICAweDFlZjkwMDAwMWVmYSwKICAgICAgICAweDFlZmIwMDAwMWVmYywKICAgICAgICAweDFlZmQwMDAwMWVmZSwKICAgICAgICAweDFlZmYwMDAwMWYwOCwKICAgICAgICAweDFmMTAwMDAwMWYxNiwKICAgICAgICAweDFmMjAwMDAwMWYyOCwKICAgICAgICAweDFmMzAwMDAwMWYzOCwKICAgICAgICAweDFmNDAwMDAwMWY0NiwKICAgICAgICAweDFmNTAwMDAwMWY1OCwKICAgICAgICAweDFmNjAwMDAwMWY2OCwKICAgICAgICAweDFmNzAwMDAwMWY3MSwKICAgICAgICAweDFmNzIwMDAwMWY3MywKICAgICAgICAweDFmNzQwMDAwMWY3NSwKICAgICAgICAweDFmNzYwMDAwMWY3NywKICAgICAgICAweDFmNzgwMDAwMWY3OSwKICAgICAgICAweDFmN2EwMDAwMWY3YiwKICAgICAgICAweDFmN2MwMDAwMWY3ZCwKICAgICAgICAweDFmYjAwMDAwMWZiMiwKICAgICAgICAweDFmYjYwMDAwMWZiNywKICAgICAgICAweDFmYzYwMDAwMWZjNywKICAgICAgICAweDFmZDAwMDAwMWZkMywKICAgICAgICAweDFmZDYwMDAwMWZkOCwKICAgICAgICAweDFmZTAwMDAwMWZlMywKICAgICAgICAweDFmZTQwMDAwMWZlOCwKICAgICAgICAweDFmZjYwMDAwMWZmNywKICAgICAgICAweDIxNGUwMDAwMjE0ZiwKICAgICAgICAweDIxODQwMDAwMjE4NSwKICAgICAgICAweDJjMzAwMDAwMmM1ZiwKICAgICAgICAweDJjNjEwMDAwMmM2MiwKICAgICAgICAweDJjNjUwMDAwMmM2NywKICAgICAgICAweDJjNjgwMDAwMmM2OSwKICAgICAgICAweDJjNmEwMDAwMmM2YiwKICAgICAgICAweDJjNmMwMDAwMmM2ZCwKICAgICAgICAweDJjNzEwMDAwMmM3MiwKICAgICAgICAweDJjNzMwMDAwMmM3NSwKICAgICAgICAweDJjNzYwMDAwMmM3YywKICAgICAgICAweDJjODEwMDAwMmM4MiwKICAgICAgICAweDJjODMwMDAwMmM4NCwKICAgICAgICAweDJjODUwMDAwMmM4NiwKICAgICAgICAweDJjODcwMDAwMmM4OCwKICAgICAgICAweDJjODkwMDAwMmM4YSwKICAgICAgICAweDJjOGIwMDAwMmM4YywKICAgICAgICAweDJjOGQwMDAwMmM4ZSwKICAgICAgICAweDJjOGYwMDAwMmM5MCwKICAgICAgICAweDJjOTEwMDAwMmM5MiwKICAgICAgICAweDJjOTMwMDAwMmM5NCwKICAgICAgICAweDJjOTUwMDAwMmM5NiwKICAgICAgICAweDJjOTcwMDAwMmM5OCwKICAgICAgICAweDJjOTkwMDAwMmM5YSwKICAgICAgICAweDJjOWIwMDAwMmM5YywKICAgICAgICAweDJjOWQwMDAwMmM5ZSwKICAgICAgICAweDJjOWYwMDAwMmNhMCwKICAgICAgICAweDJjYTEwMDAwMmNhMiwKICAgICAgICAweDJjYTMwMDAwMmNhNCwKICAgICAgICAweDJjYTUwMDAwMmNhNiwKICAgICAgICAweDJjYTcwMDAwMmNhOCwKICAgICAgICAweDJjYTkwMDAwMmNhYSwKICAgICAgICAweDJjYWIwMDAwMmNhYywKICAgICAgICAweDJjYWQwMDAwMmNhZSwKICAgICAgICAweDJjYWYwMDAwMmNiMCwKICAgICAgICAweDJjYjEwMDAwMmNiMiwKICAgICAgICAweDJjYjMwMDAwMmNiNCwKICAgICAgICAweDJjYjUwMDAwMmNiNiwKICAgICAgICAweDJjYjcwMDAwMmNiOCwKICAgICAgICAweDJjYjkwMDAwMmNiYSwKICAgICAgICAweDJjYmIwMDAwMmNiYywKICAgICAgICAweDJjYmQwMDAwMmNiZSwKICAgICAgICAweDJjYmYwMDAwMmNjMCwKICAgICAgICAweDJjYzEwMDAwMmNjMiwKICAgICAgICAweDJjYzMwMDAwMmNjNCwKICAgICAgICAweDJjYzUwMDAwMmNjNiwKICAgICAgICAweDJjYzcwMDAwMmNjOCwKICAgICAgICAweDJjYzkwMDAwMmNjYSwKICAgICAgICAweDJjY2IwMDAwMmNjYywKICAgICAgICAweDJjY2QwMDAwMmNjZSwKICAgICAgICAweDJjY2YwMDAwMmNkMCwKICAgICAgICAweDJjZDEwMDAwMmNkMiwKICAgICAgICAweDJjZDMwMDAwMmNkNCwKICAgICAgICAweDJjZDUwMDAwMmNkNiwKICAgICAgICAweDJjZDcwMDAwMmNkOCwKICAgICAgICAweDJjZDkwMDAwMmNkYSwKICAgICAgICAweDJjZGIwMDAwMmNkYywKICAgICAgICAweDJjZGQwMDAwMmNkZSwKICAgICAgICAweDJjZGYwMDAwMmNlMCwKICAgICAgICAweDJjZTEwMDAwMmNlMiwKICAgICAgICAweDJjZTMwMDAwMmNlNSwKICAgICAgICAweDJjZWMwMDAwMmNlZCwKICAgICAgICAweDJjZWUwMDAwMmNmMiwKICAgICAgICAweDJjZjMwMDAwMmNmNCwKICAgICAgICAweDJkMDAwMDAwMmQyNiwKICAgICAgICAweDJkMjcwMDAwMmQyOCwKICAgICAgICAweDJkMmQwMDAwMmQyZSwKICAgICAgICAweDJkMzAwMDAwMmQ2OCwKICAgICAgICAweDJkN2YwMDAwMmQ5NywKICAgICAgICAweDJkYTAwMDAwMmRhNywKICAgICAgICAweDJkYTgwMDAwMmRhZiwKICAgICAgICAweDJkYjAwMDAwMmRiNywKICAgICAgICAweDJkYjgwMDAwMmRiZiwKICAgICAgICAweDJkYzAwMDAwMmRjNywKICAgICAgICAweDJkYzgwMDAwMmRjZiwKICAgICAgICAweDJkZDAwMDAwMmRkNywKICAgICAgICAweDJkZDgwMDAwMmRkZiwKICAgICAgICAweDJkZTAwMDAwMmUwMCwKICAgICAgICAweDJlMmYwMDAwMmUzMCwKICAgICAgICAweDMwMDUwMDAwMzAwOCwKICAgICAgICAweDMwMmEwMDAwMzAyZSwKICAgICAgICAweDMwM2MwMDAwMzAzZCwKICAgICAgICAweDMwNDEwMDAwMzA5NywKICAgICAgICAweDMwOTkwMDAwMzA5YiwKICAgICAgICAweDMwOWQwMDAwMzA5ZiwKICAgICAgICAweDMwYTEwMDAwMzBmYiwKICAgICAgICAweDMwZmMwMDAwMzBmZiwKICAgICAgICAweDMxMDUwMDAwMzEyZSwKICAgICAgICAweDMxYTAwMDAwMzFiYiwKICAgICAgICAweDMxZjAwMDAwMzIwMCwKICAgICAgICAweDM0MDAwMDAwNGRiNiwKICAgICAgICAweDRlMDAwMDAwOWZjZCwKICAgICAgICAweGEwMDAwMDAwYTQ4ZCwKICAgICAgICAweGE0ZDAwMDAwYTRmZSwKICAgICAgICAweGE1MDAwMDAwYTYwZCwKICAgICAgICAweGE2MTAwMDAwYTYyYywKICAgICAgICAweGE2NDEwMDAwYTY0MiwKICAgICAgICAweGE2NDMwMDAwYTY0NCwKICAgICAgICAweGE2NDUwMDAwYTY0NiwKICAgICAgICAweGE2NDcwMDAwYTY0OCwKICAgICAgICAweGE2NDkwMDAwYTY0YSwKICAgICAgICAweGE2NGIwMDAwYTY0YywKICAgICAgICAweGE2NGQwMDAwYTY0ZSwKICAgICAgICAweGE2NGYwMDAwYTY1MCwKICAgICAgICAweGE2NTEwMDAwYTY1MiwKICAgICAgICAweGE2NTMwMDAwYTY1NCwKICAgICAgICAweGE2NTUwMDAwYTY1NiwKICAgICAgICAweGE2NTcwMDAwYTY1OCwKICAgICAgICAweGE2NTkwMDAwYTY1YSwKICAgICAgICAweGE2NWIwMDAwYTY1YywKICAgICAgICAweGE2NWQwMDAwYTY1ZSwKICAgICAgICAweGE2NWYwMDAwYTY2MCwKICAgICAgICAweGE2NjEwMDAwYTY2MiwKICAgICAgICAweGE2NjMwMDAwYTY2NCwKICAgICAgICAweGE2NjUwMDAwYTY2NiwKICAgICAgICAweGE2NjcwMDAwYTY2OCwKICAgICAgICAweGE2NjkwMDAwYTY2YSwKICAgICAgICAweGE2NmIwMDAwYTY2YywKICAgICAgICAweGE2NmQwMDAwYTY3MCwKICAgICAgICAweGE2NzQwMDAwYTY3ZSwKICAgICAgICAweGE2N2YwMDAwYTY4MCwKICAgICAgICAweGE2ODEwMDAwYTY4MiwKICAgICAgICAweGE2ODMwMDAwYTY4NCwKICAgICAgICAweGE2ODUwMDAwYTY4NiwKICAgICAgICAweGE2ODcwMDAwYTY4OCwKICAgICAgICAweGE2ODkwMDAwYTY4YSwKICAgICAgICAweGE2OGIwMDAwYTY4YywKICAgICAgICAweGE2OGQwMDAwYTY4ZSwKICAgICAgICAweGE2OGYwMDAwYTY5MCwKICAgICAgICAweGE2OTEwMDAwYTY5MiwKICAgICAgICAweGE2OTMwMDAwYTY5NCwKICAgICAgICAweGE2OTUwMDAwYTY5NiwKICAgICAgICAweGE2OTcwMDAwYTY5OCwKICAgICAgICAweGE2OWYwMDAwYTZlNiwKICAgICAgICAweGE2ZjAwMDAwYTZmMiwKICAgICAgICAweGE3MTcwMDAwYTcyMCwKICAgICAgICAweGE3MjMwMDAwYTcyNCwKICAgICAgICAweGE3MjUwMDAwYTcyNiwKICAgICAgICAweGE3MjcwMDAwYTcyOCwKICAgICAgICAweGE3MjkwMDAwYTcyYSwKICAgICAgICAweGE3MmIwMDAwYTcyYywKICAgICAgICAweGE3MmQwMDAwYTcyZSwKICAgICAgICAweGE3MmYwMDAwYTczMiwKICAgICAgICAweGE3MzMwMDAwYTczNCwKICAgICAgICAweGE3MzUwMDAwYTczNiwKICAgICAgICAweGE3MzcwMDAwYTczOCwKICAgICAgICAweGE3MzkwMDAwYTczYSwKICAgICAgICAweGE3M2IwMDAwYTczYywKICAgICAgICAweGE3M2QwMDAwYTczZSwKICAgICAgICAweGE3M2YwMDAwYTc0MCwKICAgICAgICAweGE3NDEwMDAwYTc0MiwKICAgICAgICAweGE3NDMwMDAwYTc0NCwKICAgICAgICAweGE3NDUwMDAwYTc0NiwKICAgICAgICAweGE3NDcwMDAwYTc0OCwKICAgICAgICAweGE3NDkwMDAwYTc0YSwKICAgICAgICAweGE3NGIwMDAwYTc0YywKICAgICAgICAweGE3NGQwMDAwYTc0ZSwKICAgICAgICAweGE3NGYwMDAwYTc1MCwKICAgICAgICAweGE3NTEwMDAwYTc1MiwKICAgICAgICAweGE3NTMwMDAwYTc1NCwKICAgICAgICAweGE3NTUwMDAwYTc1NiwKICAgICAgICAweGE3NTcwMDAwYTc1OCwKICAgICAgICAweGE3NTkwMDAwYTc1YSwKICAgICAgICAweGE3NWIwMDAwYTc1YywKICAgICAgICAweGE3NWQwMDAwYTc1ZSwKICAgICAgICAweGE3NWYwMDAwYTc2MCwKICAgICAgICAweGE3NjEwMDAwYTc2MiwKICAgICAgICAweGE3NjMwMDAwYTc2NCwKICAgICAgICAweGE3NjUwMDAwYTc2NiwKICAgICAgICAweGE3NjcwMDAwYTc2OCwKICAgICAgICAweGE3NjkwMDAwYTc2YSwKICAgICAgICAweGE3NmIwMDAwYTc2YywKICAgICAgICAweGE3NmQwMDAwYTc2ZSwKICAgICAgICAweGE3NmYwMDAwYTc3MCwKICAgICAgICAweGE3NzEwMDAwYTc3OSwKICAgICAgICAweGE3N2EwMDAwYTc3YiwKICAgICAgICAweGE3N2MwMDAwYTc3ZCwKICAgICAgICAweGE3N2YwMDAwYTc4MCwKICAgICAgICAweGE3ODEwMDAwYTc4MiwKICAgICAgICAweGE3ODMwMDAwYTc4NCwKICAgICAgICAweGE3ODUwMDAwYTc4NiwKICAgICAgICAweGE3ODcwMDAwYTc4OSwKICAgICAgICAweGE3OGMwMDAwYTc4ZCwKICAgICAgICAweGE3OGUwMDAwYTc4ZiwKICAgICAgICAweGE3OTEwMDAwYTc5MiwKICAgICAgICAweGE3OTMwMDAwYTc5NCwKICAgICAgICAweGE3YTEwMDAwYTdhMiwKICAgICAgICAweGE3YTMwMDAwYTdhNCwKICAgICAgICAweGE3YTUwMDAwYTdhNiwKICAgICAgICAweGE3YTcwMDAwYTdhOCwKICAgICAgICAweGE3YTkwMDAwYTdhYSwKICAgICAgICAweGE3ZmEwMDAwYTgyOCwKICAgICAgICAweGE4NDAwMDAwYTg3NCwKICAgICAgICAweGE4ODAwMDAwYThjNSwKICAgICAgICAweGE4ZDAwMDAwYThkYSwKICAgICAgICAweGE4ZTAwMDAwYThmOCwKICAgICAgICAweGE4ZmIwMDAwYThmYywKICAgICAgICAweGE5MDAwMDAwYTkyZSwKICAgICAgICAweGE5MzAwMDAwYTk1NCwKICAgICAgICAweGE5ODAwMDAwYTljMSwKICAgICAgICAweGE5Y2YwMDAwYTlkYSwKICAgICAgICAweGFhMDAwMDAwYWEzNywKICAgICAgICAweGFhNDAwMDAwYWE0ZSwKICAgICAgICAweGFhNTAwMDAwYWE1YSwKICAgICAgICAweGFhNjAwMDAwYWE3NywKICAgICAgICAweGFhN2EwMDAwYWE3YywKICAgICAgICAweGFhODAwMDAwYWFjMywKICAgICAgICAweGFhZGIwMDAwYWFkZSwKICAgICAgICAweGFhZTAwMDAwYWFmMCwKICAgICAgICAweGFhZjIwMDAwYWFmNywKICAgICAgICAweGFiMDEwMDAwYWIwNywKICAgICAgICAweGFiMDkwMDAwYWIwZiwKICAgICAgICAweGFiMTEwMDAwYWIxNywKICAgICAgICAweGFiMjAwMDAwYWIyNywKICAgICAgICAweGFiMjgwMDAwYWIyZiwKICAgICAgICAweGFiYzAwMDAwYWJlYiwKICAgICAgICAweGFiZWMwMDAwYWJlZSwKICAgICAgICAweGFiZjAwMDAwYWJmYSwKICAgICAgICAweGFjMDAwMDAwZDdhNCwKICAgICAgICAweGZhMGUwMDAwZmExMCwKICAgICAgICAweGZhMTEwMDAwZmExMiwKICAgICAgICAweGZhMTMwMDAwZmExNSwKICAgICAgICAweGZhMWYwMDAwZmEyMCwKICAgICAgICAweGZhMjEwMDAwZmEyMiwKICAgICAgICAweGZhMjMwMDAwZmEyNSwKICAgICAgICAweGZhMjcwMDAwZmEyYSwKICAgICAgICAweGZiMWUwMDAwZmIxZiwKICAgICAgICAweGZlMjAwMDAwZmUyNywKICAgICAgICAweGZlNzMwMDAwZmU3NCwKICAgICAgICAweDEwMDAwMDAwMTAwMGMsCiAgICAgICAgMHgxMDAwZDAwMDEwMDI3LAogICAgICAgIDB4MTAwMjgwMDAxMDAzYiwKICAgICAgICAweDEwMDNjMDAwMTAwM2UsCiAgICAgICAgMHgxMDAzZjAwMDEwMDRlLAogICAgICAgIDB4MTAwNTAwMDAxMDA1ZSwKICAgICAgICAweDEwMDgwMDAwMTAwZmIsCiAgICAgICAgMHgxMDFmZDAwMDEwMWZlLAogICAgICAgIDB4MTAyODAwMDAxMDI5ZCwKICAgICAgICAweDEwMmEwMDAwMTAyZDEsCiAgICAgICAgMHgxMDMwMDAwMDEwMzFmLAogICAgICAgIDB4MTAzMzAwMDAxMDM0MSwKICAgICAgICAweDEwMzQyMDAwMTAzNGEsCiAgICAgICAgMHgxMDM4MDAwMDEwMzllLAogICAgICAgIDB4MTAzYTAwMDAxMDNjNCwKICAgICAgICAweDEwM2M4MDAwMTAzZDAsCiAgICAgICAgMHgxMDQyODAwMDEwNDllLAogICAgICAgIDB4MTA0YTAwMDAxMDRhYSwKICAgICAgICAweDEwODAwMDAwMTA4MDYsCiAgICAgICAgMHgxMDgwODAwMDEwODA5LAogICAgICAgIDB4MTA4MGEwMDAxMDgzNiwKICAgICAgICAweDEwODM3MDAwMTA4MzksCiAgICAgICAgMHgxMDgzYzAwMDEwODNkLAogICAgICAgIDB4MTA4M2YwMDAxMDg1NiwKICAgICAgICAweDEwOTAwMDAwMTA5MTYsCiAgICAgICAgMHgxMDkyMDAwMDEwOTNhLAogICAgICAgIDB4MTA5ODAwMDAxMDliOCwKICAgICAgICAweDEwOWJlMDAwMTA5YzAsCiAgICAgICAgMHgxMGEwMDAwMDEwYTA0LAogICAgICAgIDB4MTBhMDUwMDAxMGEwNywKICAgICAgICAweDEwYTBjMDAwMTBhMTQsCiAgICAgICAgMHgxMGExNTAwMDEwYTE4LAogICAgICAgIDB4MTBhMTkwMDAxMGEzNCwKICAgICAgICAweDEwYTM4MDAwMTBhM2IsCiAgICAgICAgMHgxMGEzZjAwMDEwYTQwLAogICAgICAgIDB4MTBhNjAwMDAxMGE3ZCwKICAgICAgICAweDEwYjAwMDAwMTBiMzYsCiAgICAgICAgMHgxMGI0MDAwMDEwYjU2LAogICAgICAgIDB4MTBiNjAwMDAxMGI3MywKICAgICAgICAweDEwYzAwMDAwMTBjNDksCiAgICAgICAgMHgxMTAwMDAwMDExMDQ3LAogICAgICAgIDB4MTEwNjYwMDAxMTA3MCwKICAgICAgICAweDExMDgwMDAwMTEwYmIsCiAgICAgICAgMHgxMTBkMDAwMDExMGU5LAogICAgICAgIDB4MTEwZjAwMDAxMTBmYSwKICAgICAgICAweDExMTAwMDAwMTExMzUsCiAgICAgICAgMHgxMTEzNjAwMDExMTQwLAogICAgICAgIDB4MTExODAwMDAxMTFjNSwKICAgICAgICAweDExMWQwMDAwMTExZGEsCiAgICAgICAgMHgxMTY4MDAwMDExNmI4LAogICAgICAgIDB4MTE2YzAwMDAxMTZjYSwKICAgICAgICAweDEyMDAwMDAwMTIzNmYsCiAgICAgICAgMHgxMzAwMDAwMDEzNDJmLAogICAgICAgIDB4MTY4MDAwMDAxNmEzOSwKICAgICAgICAweDE2ZjAwMDAwMTZmNDUsCiAgICAgICAgMHgxNmY1MDAwMDE2ZjdmLAogICAgICAgIDB4MTZmOGYwMDAxNmZhMCwKICAgICAgICAweDFiMDAwMDAwMWIwMDIsCiAgICAgICAgMHgyMDAwMDAwMDJhNmQ3LAogICAgICAgIDB4MmE3MDAwMDAyYjczNSwKICAgICAgICAweDJiNzQwMDAwMmI4MWUsCiAgICApLAogICAgJ0NPTlRFWFRKJzogKAogICAgICAgIDB4MjAwYzAwMDAyMDBlLAogICAgKSwKICAgICdDT05URVhUTyc6ICgKICAgICAgICAweGI3MDAwMDAwYjgsCiAgICAgICAgMHgzNzUwMDAwMDM3NiwKICAgICAgICAweDVmMzAwMDAwNWY1LAogICAgICAgIDB4NjYwMDAwMDA2NmEsCiAgICAgICAgMHg2ZjAwMDAwMDZmYSwKICAgICAgICAweDMwZmIwMDAwMzBmYywKICAgICksCn0KUEsDBBQAAAAAAAAAIQC3Y/Sy1QYAANUGAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaW50cmFuZ2VzLnB5IiIiCkdpdmVuIGEgbGlzdCBvZiBpbnRlZ2VycywgbWFkZSB1cCBvZiAoaG9wZWZ1bGx5KSBhIHNtYWxsIG51bWJlciBvZiBsb25nIHJ1bnMKb2YgY29uc2VjdXRpdmUgaW50ZWdlcnMsIGNvbXB1dGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybQooKHN0YXJ0MSwgZW5kMSksIChzdGFydDIsIGVuZDIpIC4uLikuIFRoZW4gYW5zd2VyIHRoZSBxdWVzdGlvbiAid2FzIHggcHJlc2VudAppbiB0aGUgb3JpZ2luYWwgbGlzdD8iIGluIHRpbWUgTyhsb2coIyBydW5zKSkuCiIiIgoKaW1wb3J0IGJpc2VjdAoKZGVmIGludHJhbmdlc19mcm9tX2xpc3QobGlzdF8pOgogICAgIiIiUmVwcmVzZW50IGEgbGlzdCBvZiBpbnRlZ2VycyBhcyBhIHNlcXVlbmNlIG9mIHJhbmdlczoKICAgICgoc3RhcnRfMCwgZW5kXzApLCAoc3RhcnRfMSwgZW5kXzEpLCAuLi4pLCBzdWNoIHRoYXQgdGhlIG9yaWdpbmFsCiAgICBpbnRlZ2VycyBhcmUgZXhhY3RseSB0aG9zZSB4IHN1Y2ggdGhhdCBzdGFydF9pIDw9IHggPCBlbmRfaSBmb3Igc29tZSBpLgoKICAgIFJhbmdlcyBhcmUgZW5jb2RlZCBhcyBzaW5nbGUgaW50ZWdlcnMgKHN0YXJ0IDw8IDMyIHwgZW5kKSwgbm90IGFzIHR1cGxlcy4KICAgICIiIgoKICAgIHNvcnRlZF9saXN0ID0gc29ydGVkKGxpc3RfKQogICAgcmFuZ2VzID0gW10KICAgIGxhc3Rfd3JpdGUgPSAtMQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNvcnRlZF9saXN0KSk6CiAgICAgICAgaWYgaSsxIDwgbGVuKHNvcnRlZF9saXN0KToKICAgICAgICAgICAgaWYgc29ydGVkX2xpc3RbaV0gPT0gc29ydGVkX2xpc3RbaSsxXS0xOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICBjdXJyZW50X3JhbmdlID0gc29ydGVkX2xpc3RbbGFzdF93cml0ZSsxOmkrMV0KICAgICAgICByYW5nZXMuYXBwZW5kKF9lbmNvZGVfcmFuZ2UoY3VycmVudF9yYW5nZVswXSwgY3VycmVudF9yYW5nZVstMV0gKyAxKSkKICAgICAgICBsYXN0X3dyaXRlID0gaQoKICAgIHJldHVybiB0dXBsZShyYW5nZXMpCgpkZWYgX2VuY29kZV9yYW5nZShzdGFydCwgZW5kKToKICAgIHJldHVybiAoc3RhcnQgPDwgMzIpIHwgZW5kCgpkZWYgX2RlY29kZV9yYW5nZShyKToKICAgIHJldHVybiAociA+PiAzMiksIChyICYgKCgxIDw8IDMyKSAtIDEpKQoKCmRlZiBpbnRyYW5nZXNfY29udGFpbihpbnRfLCByYW5nZXMpOgogICAgIiIiRGV0ZXJtaW5lIGlmIGBpbnRfYCBmYWxscyBpbnRvIG9uZSBvZiB0aGUgcmFuZ2VzIGluIGByYW5nZXNgLiIiIgogICAgdHVwbGVfID0gX2VuY29kZV9yYW5nZShpbnRfLCAwKQogICAgcG9zID0gYmlzZWN0LmJpc2VjdF9sZWZ0KHJhbmdlcywgdHVwbGVfKQogICAgIyB3ZSBjb3VsZCBiZSBpbW1lZGlhdGVseSBhaGVhZCBvZiBhIHR1cGxlIChzdGFydCwgZW5kKQogICAgIyB3aXRoIHN0YXJ0IDwgaW50XyA8PSBlbmQKICAgIGlmIHBvcyA+IDA6CiAgICAgICAgbGVmdCwgcmlnaHQgPSBfZGVjb2RlX3JhbmdlKHJhbmdlc1twb3MtMV0pCiAgICAgICAgaWYgbGVmdCA8PSBpbnRfIDwgcmlnaHQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAjIG9yIHdlIGNvdWxkIGJlIGltbWVkaWF0ZWx5IGJlaGluZCBhIHR1cGxlIChpbnRfLCBlbmQpCiAgICBpZiBwb3MgPCBsZW4ocmFuZ2VzKToKICAgICAgICBsZWZ0LCBfID0gX2RlY29kZV9yYW5nZShyYW5nZXNbcG9zXSkKICAgICAgICBpZiBsZWZ0ID09IGludF86CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKUEsDBBQAAAAAAAAAIQAb532iFQAAABUAAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvcGFja2FnZV9kYXRhLnB5X192ZXJzaW9uX18gPSAnMi42JwoKUEsDBBQAAAAAAAAAIQDJhYWFcNICAHDSAgAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5IyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdG9vbHMvaWRuYS1kYXRhCiMgdmltOiBzZXQgZmlsZWVuY29kaW5nPXV0Zi04IDoKCiIiIklETkEgTWFwcGluZyBUYWJsZSBmcm9tIFVUUzQ2LiIiIgoKCl9fdmVyc2lvbl9fID0gIjYuMy4wIgpkZWYgX3NlZ18wKCk6CiAgICByZXR1cm4gWwogICAgKDB4MCwgJzMnKSwKICAgICgweDEsICczJyksCiAgICAoMHgyLCAnMycpLAogICAgKDB4MywgJzMnKSwKICAgICgweDQsICczJyksCiAgICAoMHg1LCAnMycpLAogICAgKDB4NiwgJzMnKSwKICAgICgweDcsICczJyksCiAgICAoMHg4LCAnMycpLAogICAgKDB4OSwgJzMnKSwKICAgICgweEEsICczJyksCiAgICAoMHhCLCAnMycpLAogICAgKDB4QywgJzMnKSwKICAgICgweEQsICczJyksCiAgICAoMHhFLCAnMycpLAogICAgKDB4RiwgJzMnKSwKICAgICgweDEwLCAnMycpLAogICAgKDB4MTEsICczJyksCiAgICAoMHgxMiwgJzMnKSwKICAgICgweDEzLCAnMycpLAogICAgKDB4MTQsICczJyksCiAgICAoMHgxNSwgJzMnKSwKICAgICgweDE2LCAnMycpLAogICAgKDB4MTcsICczJyksCiAgICAoMHgxOCwgJzMnKSwKICAgICgweDE5LCAnMycpLAogICAgKDB4MUEsICczJyksCiAgICAoMHgxQiwgJzMnKSwKICAgICgweDFDLCAnMycpLAogICAgKDB4MUQsICczJyksCiAgICAoMHgxRSwgJzMnKSwKICAgICgweDFGLCAnMycpLAogICAgKDB4MjAsICczJyksCiAgICAoMHgyMSwgJzMnKSwKICAgICgweDIyLCAnMycpLAogICAgKDB4MjMsICczJyksCiAgICAoMHgyNCwgJzMnKSwKICAgICgweDI1LCAnMycpLAogICAgKDB4MjYsICczJyksCiAgICAoMHgyNywgJzMnKSwKICAgICgweDI4LCAnMycpLAogICAgKDB4MjksICczJyksCiAgICAoMHgyQSwgJzMnKSwKICAgICgweDJCLCAnMycpLAogICAgKDB4MkMsICczJyksCiAgICAoMHgyRCwgJ1YnKSwKICAgICgweDJFLCAnVicpLAogICAgKDB4MkYsICczJyksCiAgICAoMHgzMCwgJ1YnKSwKICAgICgweDMxLCAnVicpLAogICAgKDB4MzIsICdWJyksCiAgICAoMHgzMywgJ1YnKSwKICAgICgweDM0LCAnVicpLAogICAgKDB4MzUsICdWJyksCiAgICAoMHgzNiwgJ1YnKSwKICAgICgweDM3LCAnVicpLAogICAgKDB4MzgsICdWJyksCiAgICAoMHgzOSwgJ1YnKSwKICAgICgweDNBLCAnMycpLAogICAgKDB4M0IsICczJyksCiAgICAoMHgzQywgJzMnKSwKICAgICgweDNELCAnMycpLAogICAgKDB4M0UsICczJyksCiAgICAoMHgzRiwgJzMnKSwKICAgICgweDQwLCAnMycpLAogICAgKDB4NDEsICdNJywgdSdhJyksCiAgICAoMHg0MiwgJ00nLCB1J2InKSwKICAgICgweDQzLCAnTScsIHUnYycpLAogICAgKDB4NDQsICdNJywgdSdkJyksCiAgICAoMHg0NSwgJ00nLCB1J2UnKSwKICAgICgweDQ2LCAnTScsIHUnZicpLAogICAgKDB4NDcsICdNJywgdSdnJyksCiAgICAoMHg0OCwgJ00nLCB1J2gnKSwKICAgICgweDQ5LCAnTScsIHUnaScpLAogICAgKDB4NEEsICdNJywgdSdqJyksCiAgICAoMHg0QiwgJ00nLCB1J2snKSwKICAgICgweDRDLCAnTScsIHUnbCcpLAogICAgKDB4NEQsICdNJywgdSdtJyksCiAgICAoMHg0RSwgJ00nLCB1J24nKSwKICAgICgweDRGLCAnTScsIHUnbycpLAogICAgKDB4NTAsICdNJywgdSdwJyksCiAgICAoMHg1MSwgJ00nLCB1J3EnKSwKICAgICgweDUyLCAnTScsIHUncicpLAogICAgKDB4NTMsICdNJywgdSdzJyksCiAgICAoMHg1NCwgJ00nLCB1J3QnKSwKICAgICgweDU1LCAnTScsIHUndScpLAogICAgKDB4NTYsICdNJywgdSd2JyksCiAgICAoMHg1NywgJ00nLCB1J3cnKSwKICAgICgweDU4LCAnTScsIHUneCcpLAogICAgKDB4NTksICdNJywgdSd5JyksCiAgICAoMHg1QSwgJ00nLCB1J3onKSwKICAgICgweDVCLCAnMycpLAogICAgKDB4NUMsICczJyksCiAgICAoMHg1RCwgJzMnKSwKICAgICgweDVFLCAnMycpLAogICAgKDB4NUYsICczJyksCiAgICAoMHg2MCwgJzMnKSwKICAgICgweDYxLCAnVicpLAogICAgKDB4NjIsICdWJyksCiAgICAoMHg2MywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEoKToKICAgIHJldHVybiBbCiAgICAoMHg2NCwgJ1YnKSwKICAgICgweDY1LCAnVicpLAogICAgKDB4NjYsICdWJyksCiAgICAoMHg2NywgJ1YnKSwKICAgICgweDY4LCAnVicpLAogICAgKDB4NjksICdWJyksCiAgICAoMHg2QSwgJ1YnKSwKICAgICgweDZCLCAnVicpLAogICAgKDB4NkMsICdWJyksCiAgICAoMHg2RCwgJ1YnKSwKICAgICgweDZFLCAnVicpLAogICAgKDB4NkYsICdWJyksCiAgICAoMHg3MCwgJ1YnKSwKICAgICgweDcxLCAnVicpLAogICAgKDB4NzIsICdWJyksCiAgICAoMHg3MywgJ1YnKSwKICAgICgweDc0LCAnVicpLAogICAgKDB4NzUsICdWJyksCiAgICAoMHg3NiwgJ1YnKSwKICAgICgweDc3LCAnVicpLAogICAgKDB4NzgsICdWJyksCiAgICAoMHg3OSwgJ1YnKSwKICAgICgweDdBLCAnVicpLAogICAgKDB4N0IsICczJyksCiAgICAoMHg3QywgJzMnKSwKICAgICgweDdELCAnMycpLAogICAgKDB4N0UsICczJyksCiAgICAoMHg3RiwgJzMnKSwKICAgICgweDgwLCAnWCcpLAogICAgKDB4ODEsICdYJyksCiAgICAoMHg4MiwgJ1gnKSwKICAgICgweDgzLCAnWCcpLAogICAgKDB4ODQsICdYJyksCiAgICAoMHg4NSwgJ1gnKSwKICAgICgweDg2LCAnWCcpLAogICAgKDB4ODcsICdYJyksCiAgICAoMHg4OCwgJ1gnKSwKICAgICgweDg5LCAnWCcpLAogICAgKDB4OEEsICdYJyksCiAgICAoMHg4QiwgJ1gnKSwKICAgICgweDhDLCAnWCcpLAogICAgKDB4OEQsICdYJyksCiAgICAoMHg4RSwgJ1gnKSwKICAgICgweDhGLCAnWCcpLAogICAgKDB4OTAsICdYJyksCiAgICAoMHg5MSwgJ1gnKSwKICAgICgweDkyLCAnWCcpLAogICAgKDB4OTMsICdYJyksCiAgICAoMHg5NCwgJ1gnKSwKICAgICgweDk1LCAnWCcpLAogICAgKDB4OTYsICdYJyksCiAgICAoMHg5NywgJ1gnKSwKICAgICgweDk4LCAnWCcpLAogICAgKDB4OTksICdYJyksCiAgICAoMHg5QSwgJ1gnKSwKICAgICgweDlCLCAnWCcpLAogICAgKDB4OUMsICdYJyksCiAgICAoMHg5RCwgJ1gnKSwKICAgICgweDlFLCAnWCcpLAogICAgKDB4OUYsICdYJyksCiAgICAoMHhBMCwgJzMnLCB1JyAnKSwKICAgICgweEExLCAnVicpLAogICAgKDB4QTIsICdWJyksCiAgICAoMHhBMywgJ1YnKSwKICAgICgweEE0LCAnVicpLAogICAgKDB4QTUsICdWJyksCiAgICAoMHhBNiwgJ1YnKSwKICAgICgweEE3LCAnVicpLAogICAgKDB4QTgsICczJywgdScgzIgnKSwKICAgICgweEE5LCAnVicpLAogICAgKDB4QUEsICdNJywgdSdhJyksCiAgICAoMHhBQiwgJ1YnKSwKICAgICgweEFDLCAnVicpLAogICAgKDB4QUQsICdJJyksCiAgICAoMHhBRSwgJ1YnKSwKICAgICgweEFGLCAnMycsIHUnIMyEJyksCiAgICAoMHhCMCwgJ1YnKSwKICAgICgweEIxLCAnVicpLAogICAgKDB4QjIsICdNJywgdScyJyksCiAgICAoMHhCMywgJ00nLCB1JzMnKSwKICAgICgweEI0LCAnMycsIHUnIMyBJyksCiAgICAoMHhCNSwgJ00nLCB1J868JyksCiAgICAoMHhCNiwgJ1YnKSwKICAgICgweEI3LCAnVicpLAogICAgKDB4QjgsICczJywgdScgzKcnKSwKICAgICgweEI5LCAnTScsIHUnMScpLAogICAgKDB4QkEsICdNJywgdSdvJyksCiAgICAoMHhCQiwgJ1YnKSwKICAgICgweEJDLCAnTScsIHUnMeKBhDQnKSwKICAgICgweEJELCAnTScsIHUnMeKBhDInKSwKICAgICgweEJFLCAnTScsIHUnM+KBhDQnKSwKICAgICgweEJGLCAnVicpLAogICAgKDB4QzAsICdNJywgdSfDoCcpLAogICAgKDB4QzEsICdNJywgdSfDoScpLAogICAgKDB4QzIsICdNJywgdSfDoicpLAogICAgKDB4QzMsICdNJywgdSfDoycpLAogICAgKDB4QzQsICdNJywgdSfDpCcpLAogICAgKDB4QzUsICdNJywgdSfDpScpLAogICAgKDB4QzYsICdNJywgdSfDpicpLAogICAgKDB4QzcsICdNJywgdSfDpycpLAogICAgXQoKZGVmIF9zZWdfMigpOgogICAgcmV0dXJuIFsKICAgICgweEM4LCAnTScsIHUnw6gnKSwKICAgICgweEM5LCAnTScsIHUnw6knKSwKICAgICgweENBLCAnTScsIHUnw6onKSwKICAgICgweENCLCAnTScsIHUnw6snKSwKICAgICgweENDLCAnTScsIHUnw6wnKSwKICAgICgweENELCAnTScsIHUnw60nKSwKICAgICgweENFLCAnTScsIHUnw64nKSwKICAgICgweENGLCAnTScsIHUnw68nKSwKICAgICgweEQwLCAnTScsIHUnw7AnKSwKICAgICgweEQxLCAnTScsIHUnw7EnKSwKICAgICgweEQyLCAnTScsIHUnw7InKSwKICAgICgweEQzLCAnTScsIHUnw7MnKSwKICAgICgweEQ0LCAnTScsIHUnw7QnKSwKICAgICgweEQ1LCAnTScsIHUnw7UnKSwKICAgICgweEQ2LCAnTScsIHUnw7YnKSwKICAgICgweEQ3LCAnVicpLAogICAgKDB4RDgsICdNJywgdSfDuCcpLAogICAgKDB4RDksICdNJywgdSfDuScpLAogICAgKDB4REEsICdNJywgdSfDuicpLAogICAgKDB4REIsICdNJywgdSfDuycpLAogICAgKDB4REMsICdNJywgdSfDvCcpLAogICAgKDB4REQsICdNJywgdSfDvScpLAogICAgKDB4REUsICdNJywgdSfDvicpLAogICAgKDB4REYsICdEJywgdSdzcycpLAogICAgKDB4RTAsICdWJyksCiAgICAoMHhFMSwgJ1YnKSwKICAgICgweEUyLCAnVicpLAogICAgKDB4RTMsICdWJyksCiAgICAoMHhFNCwgJ1YnKSwKICAgICgweEU1LCAnVicpLAogICAgKDB4RTYsICdWJyksCiAgICAoMHhFNywgJ1YnKSwKICAgICgweEU4LCAnVicpLAogICAgKDB4RTksICdWJyksCiAgICAoMHhFQSwgJ1YnKSwKICAgICgweEVCLCAnVicpLAogICAgKDB4RUMsICdWJyksCiAgICAoMHhFRCwgJ1YnKSwKICAgICgweEVFLCAnVicpLAogICAgKDB4RUYsICdWJyksCiAgICAoMHhGMCwgJ1YnKSwKICAgICgweEYxLCAnVicpLAogICAgKDB4RjIsICdWJyksCiAgICAoMHhGMywgJ1YnKSwKICAgICgweEY0LCAnVicpLAogICAgKDB4RjUsICdWJyksCiAgICAoMHhGNiwgJ1YnKSwKICAgICgweEY3LCAnVicpLAogICAgKDB4RjgsICdWJyksCiAgICAoMHhGOSwgJ1YnKSwKICAgICgweEZBLCAnVicpLAogICAgKDB4RkIsICdWJyksCiAgICAoMHhGQywgJ1YnKSwKICAgICgweEZELCAnVicpLAogICAgKDB4RkUsICdWJyksCiAgICAoMHhGRiwgJ1YnKSwKICAgICgweDEwMCwgJ00nLCB1J8SBJyksCiAgICAoMHgxMDEsICdWJyksCiAgICAoMHgxMDIsICdNJywgdSfEgycpLAogICAgKDB4MTAzLCAnVicpLAogICAgKDB4MTA0LCAnTScsIHUnxIUnKSwKICAgICgweDEwNSwgJ1YnKSwKICAgICgweDEwNiwgJ00nLCB1J8SHJyksCiAgICAoMHgxMDcsICdWJyksCiAgICAoMHgxMDgsICdNJywgdSfEiScpLAogICAgKDB4MTA5LCAnVicpLAogICAgKDB4MTBBLCAnTScsIHUnxIsnKSwKICAgICgweDEwQiwgJ1YnKSwKICAgICgweDEwQywgJ00nLCB1J8SNJyksCiAgICAoMHgxMEQsICdWJyksCiAgICAoMHgxMEUsICdNJywgdSfEjycpLAogICAgKDB4MTBGLCAnVicpLAogICAgKDB4MTEwLCAnTScsIHUnxJEnKSwKICAgICgweDExMSwgJ1YnKSwKICAgICgweDExMiwgJ00nLCB1J8STJyksCiAgICAoMHgxMTMsICdWJyksCiAgICAoMHgxMTQsICdNJywgdSfElScpLAogICAgKDB4MTE1LCAnVicpLAogICAgKDB4MTE2LCAnTScsIHUnxJcnKSwKICAgICgweDExNywgJ1YnKSwKICAgICgweDExOCwgJ00nLCB1J8SZJyksCiAgICAoMHgxMTksICdWJyksCiAgICAoMHgxMUEsICdNJywgdSfEmycpLAogICAgKDB4MTFCLCAnVicpLAogICAgKDB4MTFDLCAnTScsIHUnxJ0nKSwKICAgICgweDExRCwgJ1YnKSwKICAgICgweDExRSwgJ00nLCB1J8SfJyksCiAgICAoMHgxMUYsICdWJyksCiAgICAoMHgxMjAsICdNJywgdSfEoScpLAogICAgKDB4MTIxLCAnVicpLAogICAgKDB4MTIyLCAnTScsIHUnxKMnKSwKICAgICgweDEyMywgJ1YnKSwKICAgICgweDEyNCwgJ00nLCB1J8SlJyksCiAgICAoMHgxMjUsICdWJyksCiAgICAoMHgxMjYsICdNJywgdSfEpycpLAogICAgKDB4MTI3LCAnVicpLAogICAgKDB4MTI4LCAnTScsIHUnxKknKSwKICAgICgweDEyOSwgJ1YnKSwKICAgICgweDEyQSwgJ00nLCB1J8SrJyksCiAgICAoMHgxMkIsICdWJyksCiAgICBdCgpkZWYgX3NlZ18zKCk6CiAgICByZXR1cm4gWwogICAgKDB4MTJDLCAnTScsIHUnxK0nKSwKICAgICgweDEyRCwgJ1YnKSwKICAgICgweDEyRSwgJ00nLCB1J8SvJyksCiAgICAoMHgxMkYsICdWJyksCiAgICAoMHgxMzAsICdNJywgdSdpzIcnKSwKICAgICgweDEzMSwgJ1YnKSwKICAgICgweDEzMiwgJ00nLCB1J2lqJyksCiAgICAoMHgxMzQsICdNJywgdSfEtScpLAogICAgKDB4MTM1LCAnVicpLAogICAgKDB4MTM2LCAnTScsIHUnxLcnKSwKICAgICgweDEzNywgJ1YnKSwKICAgICgweDEzOSwgJ00nLCB1J8S6JyksCiAgICAoMHgxM0EsICdWJyksCiAgICAoMHgxM0IsICdNJywgdSfEvCcpLAogICAgKDB4MTNDLCAnVicpLAogICAgKDB4MTNELCAnTScsIHUnxL4nKSwKICAgICgweDEzRSwgJ1YnKSwKICAgICgweDEzRiwgJ00nLCB1J2zCtycpLAogICAgKDB4MTQxLCAnTScsIHUnxYInKSwKICAgICgweDE0MiwgJ1YnKSwKICAgICgweDE0MywgJ00nLCB1J8WEJyksCiAgICAoMHgxNDQsICdWJyksCiAgICAoMHgxNDUsICdNJywgdSfFhicpLAogICAgKDB4MTQ2LCAnVicpLAogICAgKDB4MTQ3LCAnTScsIHUnxYgnKSwKICAgICgweDE0OCwgJ1YnKSwKICAgICgweDE0OSwgJ00nLCB1J8q8bicpLAogICAgKDB4MTRBLCAnTScsIHUnxYsnKSwKICAgICgweDE0QiwgJ1YnKSwKICAgICgweDE0QywgJ00nLCB1J8WNJyksCiAgICAoMHgxNEQsICdWJyksCiAgICAoMHgxNEUsICdNJywgdSfFjycpLAogICAgKDB4MTRGLCAnVicpLAogICAgKDB4MTUwLCAnTScsIHUnxZEnKSwKICAgICgweDE1MSwgJ1YnKSwKICAgICgweDE1MiwgJ00nLCB1J8WTJyksCiAgICAoMHgxNTMsICdWJyksCiAgICAoMHgxNTQsICdNJywgdSfFlScpLAogICAgKDB4MTU1LCAnVicpLAogICAgKDB4MTU2LCAnTScsIHUnxZcnKSwKICAgICgweDE1NywgJ1YnKSwKICAgICgweDE1OCwgJ00nLCB1J8WZJyksCiAgICAoMHgxNTksICdWJyksCiAgICAoMHgxNUEsICdNJywgdSfFmycpLAogICAgKDB4MTVCLCAnVicpLAogICAgKDB4MTVDLCAnTScsIHUnxZ0nKSwKICAgICgweDE1RCwgJ1YnKSwKICAgICgweDE1RSwgJ00nLCB1J8WfJyksCiAgICAoMHgxNUYsICdWJyksCiAgICAoMHgxNjAsICdNJywgdSfFoScpLAogICAgKDB4MTYxLCAnVicpLAogICAgKDB4MTYyLCAnTScsIHUnxaMnKSwKICAgICgweDE2MywgJ1YnKSwKICAgICgweDE2NCwgJ00nLCB1J8WlJyksCiAgICAoMHgxNjUsICdWJyksCiAgICAoMHgxNjYsICdNJywgdSfFpycpLAogICAgKDB4MTY3LCAnVicpLAogICAgKDB4MTY4LCAnTScsIHUnxaknKSwKICAgICgweDE2OSwgJ1YnKSwKICAgICgweDE2QSwgJ00nLCB1J8WrJyksCiAgICAoMHgxNkIsICdWJyksCiAgICAoMHgxNkMsICdNJywgdSfFrScpLAogICAgKDB4MTZELCAnVicpLAogICAgKDB4MTZFLCAnTScsIHUnxa8nKSwKICAgICgweDE2RiwgJ1YnKSwKICAgICgweDE3MCwgJ00nLCB1J8WxJyksCiAgICAoMHgxNzEsICdWJyksCiAgICAoMHgxNzIsICdNJywgdSfFsycpLAogICAgKDB4MTczLCAnVicpLAogICAgKDB4MTc0LCAnTScsIHUnxbUnKSwKICAgICgweDE3NSwgJ1YnKSwKICAgICgweDE3NiwgJ00nLCB1J8W3JyksCiAgICAoMHgxNzcsICdWJyksCiAgICAoMHgxNzgsICdNJywgdSfDvycpLAogICAgKDB4MTc5LCAnTScsIHUnxbonKSwKICAgICgweDE3QSwgJ1YnKSwKICAgICgweDE3QiwgJ00nLCB1J8W8JyksCiAgICAoMHgxN0MsICdWJyksCiAgICAoMHgxN0QsICdNJywgdSfFvicpLAogICAgKDB4MTdFLCAnVicpLAogICAgKDB4MTdGLCAnTScsIHUncycpLAogICAgKDB4MTgwLCAnVicpLAogICAgKDB4MTgxLCAnTScsIHUnyZMnKSwKICAgICgweDE4MiwgJ00nLCB1J8aDJyksCiAgICAoMHgxODMsICdWJyksCiAgICAoMHgxODQsICdNJywgdSfGhScpLAogICAgKDB4MTg1LCAnVicpLAogICAgKDB4MTg2LCAnTScsIHUnyZQnKSwKICAgICgweDE4NywgJ00nLCB1J8aIJyksCiAgICAoMHgxODgsICdWJyksCiAgICAoMHgxODksICdNJywgdSfJlicpLAogICAgKDB4MThBLCAnTScsIHUnyZcnKSwKICAgICgweDE4QiwgJ00nLCB1J8aMJyksCiAgICAoMHgxOEMsICdWJyksCiAgICAoMHgxOEUsICdNJywgdSfHnScpLAogICAgKDB4MThGLCAnTScsIHUnyZknKSwKICAgICgweDE5MCwgJ00nLCB1J8mbJyksCiAgICAoMHgxOTEsICdNJywgdSfGkicpLAogICAgKDB4MTkyLCAnVicpLAogICAgKDB4MTkzLCAnTScsIHUnyaAnKSwKICAgIF0KCmRlZiBfc2VnXzQoKToKICAgIHJldHVybiBbCiAgICAoMHgxOTQsICdNJywgdSfJoycpLAogICAgKDB4MTk1LCAnVicpLAogICAgKDB4MTk2LCAnTScsIHUnyaknKSwKICAgICgweDE5NywgJ00nLCB1J8moJyksCiAgICAoMHgxOTgsICdNJywgdSfGmScpLAogICAgKDB4MTk5LCAnVicpLAogICAgKDB4MTlDLCAnTScsIHUnya8nKSwKICAgICgweDE5RCwgJ00nLCB1J8myJyksCiAgICAoMHgxOUUsICdWJyksCiAgICAoMHgxOUYsICdNJywgdSfJtScpLAogICAgKDB4MUEwLCAnTScsIHUnxqEnKSwKICAgICgweDFBMSwgJ1YnKSwKICAgICgweDFBMiwgJ00nLCB1J8ajJyksCiAgICAoMHgxQTMsICdWJyksCiAgICAoMHgxQTQsICdNJywgdSfGpScpLAogICAgKDB4MUE1LCAnVicpLAogICAgKDB4MUE2LCAnTScsIHUnyoAnKSwKICAgICgweDFBNywgJ00nLCB1J8aoJyksCiAgICAoMHgxQTgsICdWJyksCiAgICAoMHgxQTksICdNJywgdSfKgycpLAogICAgKDB4MUFBLCAnVicpLAogICAgKDB4MUFDLCAnTScsIHUnxq0nKSwKICAgICgweDFBRCwgJ1YnKSwKICAgICgweDFBRSwgJ00nLCB1J8qIJyksCiAgICAoMHgxQUYsICdNJywgdSfGsCcpLAogICAgKDB4MUIwLCAnVicpLAogICAgKDB4MUIxLCAnTScsIHUnyoonKSwKICAgICgweDFCMiwgJ00nLCB1J8qLJyksCiAgICAoMHgxQjMsICdNJywgdSfGtCcpLAogICAgKDB4MUI0LCAnVicpLAogICAgKDB4MUI1LCAnTScsIHUnxrYnKSwKICAgICgweDFCNiwgJ1YnKSwKICAgICgweDFCNywgJ00nLCB1J8qSJyksCiAgICAoMHgxQjgsICdNJywgdSfGuScpLAogICAgKDB4MUI5LCAnVicpLAogICAgKDB4MUJDLCAnTScsIHUnxr0nKSwKICAgICgweDFCRCwgJ1YnKSwKICAgICgweDFDNCwgJ00nLCB1J2TFvicpLAogICAgKDB4MUM3LCAnTScsIHUnbGonKSwKICAgICgweDFDQSwgJ00nLCB1J25qJyksCiAgICAoMHgxQ0QsICdNJywgdSfHjicpLAogICAgKDB4MUNFLCAnVicpLAogICAgKDB4MUNGLCAnTScsIHUnx5AnKSwKICAgICgweDFEMCwgJ1YnKSwKICAgICgweDFEMSwgJ00nLCB1J8eSJyksCiAgICAoMHgxRDIsICdWJyksCiAgICAoMHgxRDMsICdNJywgdSfHlCcpLAogICAgKDB4MUQ0LCAnVicpLAogICAgKDB4MUQ1LCAnTScsIHUnx5YnKSwKICAgICgweDFENiwgJ1YnKSwKICAgICgweDFENywgJ00nLCB1J8eYJyksCiAgICAoMHgxRDgsICdWJyksCiAgICAoMHgxRDksICdNJywgdSfHmicpLAogICAgKDB4MURBLCAnVicpLAogICAgKDB4MURCLCAnTScsIHUnx5wnKSwKICAgICgweDFEQywgJ1YnKSwKICAgICgweDFERSwgJ00nLCB1J8efJyksCiAgICAoMHgxREYsICdWJyksCiAgICAoMHgxRTAsICdNJywgdSfHoScpLAogICAgKDB4MUUxLCAnVicpLAogICAgKDB4MUUyLCAnTScsIHUnx6MnKSwKICAgICgweDFFMywgJ1YnKSwKICAgICgweDFFNCwgJ00nLCB1J8elJyksCiAgICAoMHgxRTUsICdWJyksCiAgICAoMHgxRTYsICdNJywgdSfHpycpLAogICAgKDB4MUU3LCAnVicpLAogICAgKDB4MUU4LCAnTScsIHUnx6knKSwKICAgICgweDFFOSwgJ1YnKSwKICAgICgweDFFQSwgJ00nLCB1J8erJyksCiAgICAoMHgxRUIsICdWJyksCiAgICAoMHgxRUMsICdNJywgdSfHrScpLAogICAgKDB4MUVELCAnVicpLAogICAgKDB4MUVFLCAnTScsIHUnx68nKSwKICAgICgweDFFRiwgJ1YnKSwKICAgICgweDFGMSwgJ00nLCB1J2R6JyksCiAgICAoMHgxRjQsICdNJywgdSfHtScpLAogICAgKDB4MUY1LCAnVicpLAogICAgKDB4MUY2LCAnTScsIHUnxpUnKSwKICAgICgweDFGNywgJ00nLCB1J8a/JyksCiAgICAoMHgxRjgsICdNJywgdSfHuScpLAogICAgKDB4MUY5LCAnVicpLAogICAgKDB4MUZBLCAnTScsIHUnx7snKSwKICAgICgweDFGQiwgJ1YnKSwKICAgICgweDFGQywgJ00nLCB1J8e9JyksCiAgICAoMHgxRkQsICdWJyksCiAgICAoMHgxRkUsICdNJywgdSfHvycpLAogICAgKDB4MUZGLCAnVicpLAogICAgKDB4MjAwLCAnTScsIHUnyIEnKSwKICAgICgweDIwMSwgJ1YnKSwKICAgICgweDIwMiwgJ00nLCB1J8iDJyksCiAgICAoMHgyMDMsICdWJyksCiAgICAoMHgyMDQsICdNJywgdSfIhScpLAogICAgKDB4MjA1LCAnVicpLAogICAgKDB4MjA2LCAnTScsIHUnyIcnKSwKICAgICgweDIwNywgJ1YnKSwKICAgICgweDIwOCwgJ00nLCB1J8iJJyksCiAgICAoMHgyMDksICdWJyksCiAgICAoMHgyMEEsICdNJywgdSfIiycpLAogICAgKDB4MjBCLCAnVicpLAogICAgKDB4MjBDLCAnTScsIHUnyI0nKSwKICAgIF0KCmRlZiBfc2VnXzUoKToKICAgIHJldHVybiBbCiAgICAoMHgyMEQsICdWJyksCiAgICAoMHgyMEUsICdNJywgdSfIjycpLAogICAgKDB4MjBGLCAnVicpLAogICAgKDB4MjEwLCAnTScsIHUnyJEnKSwKICAgICgweDIxMSwgJ1YnKSwKICAgICgweDIxMiwgJ00nLCB1J8iTJyksCiAgICAoMHgyMTMsICdWJyksCiAgICAoMHgyMTQsICdNJywgdSfIlScpLAogICAgKDB4MjE1LCAnVicpLAogICAgKDB4MjE2LCAnTScsIHUnyJcnKSwKICAgICgweDIxNywgJ1YnKSwKICAgICgweDIxOCwgJ00nLCB1J8iZJyksCiAgICAoMHgyMTksICdWJyksCiAgICAoMHgyMUEsICdNJywgdSfImycpLAogICAgKDB4MjFCLCAnVicpLAogICAgKDB4MjFDLCAnTScsIHUnyJ0nKSwKICAgICgweDIxRCwgJ1YnKSwKICAgICgweDIxRSwgJ00nLCB1J8ifJyksCiAgICAoMHgyMUYsICdWJyksCiAgICAoMHgyMjAsICdNJywgdSfGnicpLAogICAgKDB4MjIxLCAnVicpLAogICAgKDB4MjIyLCAnTScsIHUnyKMnKSwKICAgICgweDIyMywgJ1YnKSwKICAgICgweDIyNCwgJ00nLCB1J8ilJyksCiAgICAoMHgyMjUsICdWJyksCiAgICAoMHgyMjYsICdNJywgdSfIpycpLAogICAgKDB4MjI3LCAnVicpLAogICAgKDB4MjI4LCAnTScsIHUnyKknKSwKICAgICgweDIyOSwgJ1YnKSwKICAgICgweDIyQSwgJ00nLCB1J8irJyksCiAgICAoMHgyMkIsICdWJyksCiAgICAoMHgyMkMsICdNJywgdSfIrScpLAogICAgKDB4MjJELCAnVicpLAogICAgKDB4MjJFLCAnTScsIHUnyK8nKSwKICAgICgweDIyRiwgJ1YnKSwKICAgICgweDIzMCwgJ00nLCB1J8ixJyksCiAgICAoMHgyMzEsICdWJyksCiAgICAoMHgyMzIsICdNJywgdSfIsycpLAogICAgKDB4MjMzLCAnVicpLAogICAgKDB4MjNBLCAnTScsIHUn4rGlJyksCiAgICAoMHgyM0IsICdNJywgdSfIvCcpLAogICAgKDB4MjNDLCAnVicpLAogICAgKDB4MjNELCAnTScsIHUnxponKSwKICAgICgweDIzRSwgJ00nLCB1J+KxpicpLAogICAgKDB4MjNGLCAnVicpLAogICAgKDB4MjQxLCAnTScsIHUnyYInKSwKICAgICgweDI0MiwgJ1YnKSwKICAgICgweDI0MywgJ00nLCB1J8aAJyksCiAgICAoMHgyNDQsICdNJywgdSfKiScpLAogICAgKDB4MjQ1LCAnTScsIHUnyownKSwKICAgICgweDI0NiwgJ00nLCB1J8mHJyksCiAgICAoMHgyNDcsICdWJyksCiAgICAoMHgyNDgsICdNJywgdSfJiScpLAogICAgKDB4MjQ5LCAnVicpLAogICAgKDB4MjRBLCAnTScsIHUnyYsnKSwKICAgICgweDI0QiwgJ1YnKSwKICAgICgweDI0QywgJ00nLCB1J8mNJyksCiAgICAoMHgyNEQsICdWJyksCiAgICAoMHgyNEUsICdNJywgdSfJjycpLAogICAgKDB4MjRGLCAnVicpLAogICAgKDB4MkIwLCAnTScsIHUnaCcpLAogICAgKDB4MkIxLCAnTScsIHUnyaYnKSwKICAgICgweDJCMiwgJ00nLCB1J2onKSwKICAgICgweDJCMywgJ00nLCB1J3InKSwKICAgICgweDJCNCwgJ00nLCB1J8m5JyksCiAgICAoMHgyQjUsICdNJywgdSfJuycpLAogICAgKDB4MkI2LCAnTScsIHUnyoEnKSwKICAgICgweDJCNywgJ00nLCB1J3cnKSwKICAgICgweDJCOCwgJ00nLCB1J3knKSwKICAgICgweDJCOSwgJ1YnKSwKICAgICgweDJEOCwgJzMnLCB1JyDMhicpLAogICAgKDB4MkQ5LCAnMycsIHUnIMyHJyksCiAgICAoMHgyREEsICczJywgdScgzIonKSwKICAgICgweDJEQiwgJzMnLCB1JyDMqCcpLAogICAgKDB4MkRDLCAnMycsIHUnIMyDJyksCiAgICAoMHgyREQsICczJywgdScgzIsnKSwKICAgICgweDJERSwgJ1YnKSwKICAgICgweDJFMCwgJ00nLCB1J8mjJyksCiAgICAoMHgyRTEsICdNJywgdSdsJyksCiAgICAoMHgyRTIsICdNJywgdSdzJyksCiAgICAoMHgyRTMsICdNJywgdSd4JyksCiAgICAoMHgyRTQsICdNJywgdSfKlScpLAogICAgKDB4MkU1LCAnVicpLAogICAgKDB4MzQwLCAnTScsIHUnzIAnKSwKICAgICgweDM0MSwgJ00nLCB1J8yBJyksCiAgICAoMHgzNDIsICdWJyksCiAgICAoMHgzNDMsICdNJywgdSfMkycpLAogICAgKDB4MzQ0LCAnTScsIHUnzIjMgScpLAogICAgKDB4MzQ1LCAnTScsIHUnzrknKSwKICAgICgweDM0NiwgJ1YnKSwKICAgICgweDM0RiwgJ0knKSwKICAgICgweDM1MCwgJ1YnKSwKICAgICgweDM3MCwgJ00nLCB1J82xJyksCiAgICAoMHgzNzEsICdWJyksCiAgICAoMHgzNzIsICdNJywgdSfNsycpLAogICAgKDB4MzczLCAnVicpLAogICAgKDB4Mzc0LCAnTScsIHUnyrknKSwKICAgICgweDM3NSwgJ1YnKSwKICAgICgweDM3NiwgJ00nLCB1J823JyksCiAgICAoMHgzNzcsICdWJyksCiAgICBdCgpkZWYgX3NlZ182KCk6CiAgICByZXR1cm4gWwogICAgKDB4Mzc4LCAnWCcpLAogICAgKDB4MzdBLCAnMycsIHUnIM65JyksCiAgICAoMHgzN0IsICdWJyksCiAgICAoMHgzN0UsICczJywgdSc7JyksCiAgICAoMHgzN0YsICdYJyksCiAgICAoMHgzODQsICczJywgdScgzIEnKSwKICAgICgweDM4NSwgJzMnLCB1JyDMiMyBJyksCiAgICAoMHgzODYsICdNJywgdSfOrCcpLAogICAgKDB4Mzg3LCAnTScsIHUnwrcnKSwKICAgICgweDM4OCwgJ00nLCB1J86tJyksCiAgICAoMHgzODksICdNJywgdSfOricpLAogICAgKDB4MzhBLCAnTScsIHUnzq8nKSwKICAgICgweDM4QiwgJ1gnKSwKICAgICgweDM4QywgJ00nLCB1J8+MJyksCiAgICAoMHgzOEQsICdYJyksCiAgICAoMHgzOEUsICdNJywgdSfPjScpLAogICAgKDB4MzhGLCAnTScsIHUnz44nKSwKICAgICgweDM5MCwgJ1YnKSwKICAgICgweDM5MSwgJ00nLCB1J86xJyksCiAgICAoMHgzOTIsICdNJywgdSfOsicpLAogICAgKDB4MzkzLCAnTScsIHUnzrMnKSwKICAgICgweDM5NCwgJ00nLCB1J860JyksCiAgICAoMHgzOTUsICdNJywgdSfOtScpLAogICAgKDB4Mzk2LCAnTScsIHUnzrYnKSwKICAgICgweDM5NywgJ00nLCB1J863JyksCiAgICAoMHgzOTgsICdNJywgdSfOuCcpLAogICAgKDB4Mzk5LCAnTScsIHUnzrknKSwKICAgICgweDM5QSwgJ00nLCB1J866JyksCiAgICAoMHgzOUIsICdNJywgdSfOuycpLAogICAgKDB4MzlDLCAnTScsIHUnzrwnKSwKICAgICgweDM5RCwgJ00nLCB1J869JyksCiAgICAoMHgzOUUsICdNJywgdSfOvicpLAogICAgKDB4MzlGLCAnTScsIHUnzr8nKSwKICAgICgweDNBMCwgJ00nLCB1J8+AJyksCiAgICAoMHgzQTEsICdNJywgdSfPgScpLAogICAgKDB4M0EyLCAnWCcpLAogICAgKDB4M0EzLCAnTScsIHUnz4MnKSwKICAgICgweDNBNCwgJ00nLCB1J8+EJyksCiAgICAoMHgzQTUsICdNJywgdSfPhScpLAogICAgKDB4M0E2LCAnTScsIHUnz4YnKSwKICAgICgweDNBNywgJ00nLCB1J8+HJyksCiAgICAoMHgzQTgsICdNJywgdSfPiCcpLAogICAgKDB4M0E5LCAnTScsIHUnz4knKSwKICAgICgweDNBQSwgJ00nLCB1J8+KJyksCiAgICAoMHgzQUIsICdNJywgdSfPiycpLAogICAgKDB4M0FDLCAnVicpLAogICAgKDB4M0MyLCAnRCcsIHUnz4MnKSwKICAgICgweDNDMywgJ1YnKSwKICAgICgweDNDRiwgJ00nLCB1J8+XJyksCiAgICAoMHgzRDAsICdNJywgdSfOsicpLAogICAgKDB4M0QxLCAnTScsIHUnzrgnKSwKICAgICgweDNEMiwgJ00nLCB1J8+FJyksCiAgICAoMHgzRDMsICdNJywgdSfPjScpLAogICAgKDB4M0Q0LCAnTScsIHUnz4snKSwKICAgICgweDNENSwgJ00nLCB1J8+GJyksCiAgICAoMHgzRDYsICdNJywgdSfPgCcpLAogICAgKDB4M0Q3LCAnVicpLAogICAgKDB4M0Q4LCAnTScsIHUnz5knKSwKICAgICgweDNEOSwgJ1YnKSwKICAgICgweDNEQSwgJ00nLCB1J8+bJyksCiAgICAoMHgzREIsICdWJyksCiAgICAoMHgzREMsICdNJywgdSfPnScpLAogICAgKDB4M0RELCAnVicpLAogICAgKDB4M0RFLCAnTScsIHUnz58nKSwKICAgICgweDNERiwgJ1YnKSwKICAgICgweDNFMCwgJ00nLCB1J8+hJyksCiAgICAoMHgzRTEsICdWJyksCiAgICAoMHgzRTIsICdNJywgdSfPoycpLAogICAgKDB4M0UzLCAnVicpLAogICAgKDB4M0U0LCAnTScsIHUnz6UnKSwKICAgICgweDNFNSwgJ1YnKSwKICAgICgweDNFNiwgJ00nLCB1J8+nJyksCiAgICAoMHgzRTcsICdWJyksCiAgICAoMHgzRTgsICdNJywgdSfPqScpLAogICAgKDB4M0U5LCAnVicpLAogICAgKDB4M0VBLCAnTScsIHUnz6snKSwKICAgICgweDNFQiwgJ1YnKSwKICAgICgweDNFQywgJ00nLCB1J8+tJyksCiAgICAoMHgzRUQsICdWJyksCiAgICAoMHgzRUUsICdNJywgdSfPrycpLAogICAgKDB4M0VGLCAnVicpLAogICAgKDB4M0YwLCAnTScsIHUnzronKSwKICAgICgweDNGMSwgJ00nLCB1J8+BJyksCiAgICAoMHgzRjIsICdNJywgdSfPgycpLAogICAgKDB4M0YzLCAnVicpLAogICAgKDB4M0Y0LCAnTScsIHUnzrgnKSwKICAgICgweDNGNSwgJ00nLCB1J861JyksCiAgICAoMHgzRjYsICdWJyksCiAgICAoMHgzRjcsICdNJywgdSfPuCcpLAogICAgKDB4M0Y4LCAnVicpLAogICAgKDB4M0Y5LCAnTScsIHUnz4MnKSwKICAgICgweDNGQSwgJ00nLCB1J8+7JyksCiAgICAoMHgzRkIsICdWJyksCiAgICAoMHgzRkQsICdNJywgdSfNuycpLAogICAgKDB4M0ZFLCAnTScsIHUnzbwnKSwKICAgICgweDNGRiwgJ00nLCB1J829JyksCiAgICAoMHg0MDAsICdNJywgdSfRkCcpLAogICAgKDB4NDAxLCAnTScsIHUn0ZEnKSwKICAgICgweDQwMiwgJ00nLCB1J9GSJyksCiAgICAoMHg0MDMsICdNJywgdSfRkycpLAogICAgXQoKZGVmIF9zZWdfNygpOgogICAgcmV0dXJuIFsKICAgICgweDQwNCwgJ00nLCB1J9GUJyksCiAgICAoMHg0MDUsICdNJywgdSfRlScpLAogICAgKDB4NDA2LCAnTScsIHUn0ZYnKSwKICAgICgweDQwNywgJ00nLCB1J9GXJyksCiAgICAoMHg0MDgsICdNJywgdSfRmCcpLAogICAgKDB4NDA5LCAnTScsIHUn0ZknKSwKICAgICgweDQwQSwgJ00nLCB1J9GaJyksCiAgICAoMHg0MEIsICdNJywgdSfRmycpLAogICAgKDB4NDBDLCAnTScsIHUn0ZwnKSwKICAgICgweDQwRCwgJ00nLCB1J9GdJyksCiAgICAoMHg0MEUsICdNJywgdSfRnicpLAogICAgKDB4NDBGLCAnTScsIHUn0Z8nKSwKICAgICgweDQxMCwgJ00nLCB1J9CwJyksCiAgICAoMHg0MTEsICdNJywgdSfQsScpLAogICAgKDB4NDEyLCAnTScsIHUn0LInKSwKICAgICgweDQxMywgJ00nLCB1J9CzJyksCiAgICAoMHg0MTQsICdNJywgdSfQtCcpLAogICAgKDB4NDE1LCAnTScsIHUn0LUnKSwKICAgICgweDQxNiwgJ00nLCB1J9C2JyksCiAgICAoMHg0MTcsICdNJywgdSfQtycpLAogICAgKDB4NDE4LCAnTScsIHUn0LgnKSwKICAgICgweDQxOSwgJ00nLCB1J9C5JyksCiAgICAoMHg0MUEsICdNJywgdSfQuicpLAogICAgKDB4NDFCLCAnTScsIHUn0LsnKSwKICAgICgweDQxQywgJ00nLCB1J9C8JyksCiAgICAoMHg0MUQsICdNJywgdSfQvScpLAogICAgKDB4NDFFLCAnTScsIHUn0L4nKSwKICAgICgweDQxRiwgJ00nLCB1J9C/JyksCiAgICAoMHg0MjAsICdNJywgdSfRgCcpLAogICAgKDB4NDIxLCAnTScsIHUn0YEnKSwKICAgICgweDQyMiwgJ00nLCB1J9GCJyksCiAgICAoMHg0MjMsICdNJywgdSfRgycpLAogICAgKDB4NDI0LCAnTScsIHUn0YQnKSwKICAgICgweDQyNSwgJ00nLCB1J9GFJyksCiAgICAoMHg0MjYsICdNJywgdSfRhicpLAogICAgKDB4NDI3LCAnTScsIHUn0YcnKSwKICAgICgweDQyOCwgJ00nLCB1J9GIJyksCiAgICAoMHg0MjksICdNJywgdSfRiScpLAogICAgKDB4NDJBLCAnTScsIHUn0YonKSwKICAgICgweDQyQiwgJ00nLCB1J9GLJyksCiAgICAoMHg0MkMsICdNJywgdSfRjCcpLAogICAgKDB4NDJELCAnTScsIHUn0Y0nKSwKICAgICgweDQyRSwgJ00nLCB1J9GOJyksCiAgICAoMHg0MkYsICdNJywgdSfRjycpLAogICAgKDB4NDMwLCAnVicpLAogICAgKDB4NDYwLCAnTScsIHUn0aEnKSwKICAgICgweDQ2MSwgJ1YnKSwKICAgICgweDQ2MiwgJ00nLCB1J9GjJyksCiAgICAoMHg0NjMsICdWJyksCiAgICAoMHg0NjQsICdNJywgdSfRpScpLAogICAgKDB4NDY1LCAnVicpLAogICAgKDB4NDY2LCAnTScsIHUn0acnKSwKICAgICgweDQ2NywgJ1YnKSwKICAgICgweDQ2OCwgJ00nLCB1J9GpJyksCiAgICAoMHg0NjksICdWJyksCiAgICAoMHg0NkEsICdNJywgdSfRqycpLAogICAgKDB4NDZCLCAnVicpLAogICAgKDB4NDZDLCAnTScsIHUn0a0nKSwKICAgICgweDQ2RCwgJ1YnKSwKICAgICgweDQ2RSwgJ00nLCB1J9GvJyksCiAgICAoMHg0NkYsICdWJyksCiAgICAoMHg0NzAsICdNJywgdSfRsScpLAogICAgKDB4NDcxLCAnVicpLAogICAgKDB4NDcyLCAnTScsIHUn0bMnKSwKICAgICgweDQ3MywgJ1YnKSwKICAgICgweDQ3NCwgJ00nLCB1J9G1JyksCiAgICAoMHg0NzUsICdWJyksCiAgICAoMHg0NzYsICdNJywgdSfRtycpLAogICAgKDB4NDc3LCAnVicpLAogICAgKDB4NDc4LCAnTScsIHUn0bknKSwKICAgICgweDQ3OSwgJ1YnKSwKICAgICgweDQ3QSwgJ00nLCB1J9G7JyksCiAgICAoMHg0N0IsICdWJyksCiAgICAoMHg0N0MsICdNJywgdSfRvScpLAogICAgKDB4NDdELCAnVicpLAogICAgKDB4NDdFLCAnTScsIHUn0b8nKSwKICAgICgweDQ3RiwgJ1YnKSwKICAgICgweDQ4MCwgJ00nLCB1J9KBJyksCiAgICAoMHg0ODEsICdWJyksCiAgICAoMHg0OEEsICdNJywgdSfSiycpLAogICAgKDB4NDhCLCAnVicpLAogICAgKDB4NDhDLCAnTScsIHUn0o0nKSwKICAgICgweDQ4RCwgJ1YnKSwKICAgICgweDQ4RSwgJ00nLCB1J9KPJyksCiAgICAoMHg0OEYsICdWJyksCiAgICAoMHg0OTAsICdNJywgdSfSkScpLAogICAgKDB4NDkxLCAnVicpLAogICAgKDB4NDkyLCAnTScsIHUn0pMnKSwKICAgICgweDQ5MywgJ1YnKSwKICAgICgweDQ5NCwgJ00nLCB1J9KVJyksCiAgICAoMHg0OTUsICdWJyksCiAgICAoMHg0OTYsICdNJywgdSfSlycpLAogICAgKDB4NDk3LCAnVicpLAogICAgKDB4NDk4LCAnTScsIHUn0pknKSwKICAgICgweDQ5OSwgJ1YnKSwKICAgICgweDQ5QSwgJ00nLCB1J9KbJyksCiAgICAoMHg0OUIsICdWJyksCiAgICAoMHg0OUMsICdNJywgdSfSnScpLAogICAgKDB4NDlELCAnVicpLAogICAgKDB4NDlFLCAnTScsIHUn0p8nKSwKICAgIF0KCmRlZiBfc2VnXzgoKToKICAgIHJldHVybiBbCiAgICAoMHg0OUYsICdWJyksCiAgICAoMHg0QTAsICdNJywgdSfSoScpLAogICAgKDB4NEExLCAnVicpLAogICAgKDB4NEEyLCAnTScsIHUn0qMnKSwKICAgICgweDRBMywgJ1YnKSwKICAgICgweDRBNCwgJ00nLCB1J9KlJyksCiAgICAoMHg0QTUsICdWJyksCiAgICAoMHg0QTYsICdNJywgdSfSpycpLAogICAgKDB4NEE3LCAnVicpLAogICAgKDB4NEE4LCAnTScsIHUn0qknKSwKICAgICgweDRBOSwgJ1YnKSwKICAgICgweDRBQSwgJ00nLCB1J9KrJyksCiAgICAoMHg0QUIsICdWJyksCiAgICAoMHg0QUMsICdNJywgdSfSrScpLAogICAgKDB4NEFELCAnVicpLAogICAgKDB4NEFFLCAnTScsIHUn0q8nKSwKICAgICgweDRBRiwgJ1YnKSwKICAgICgweDRCMCwgJ00nLCB1J9KxJyksCiAgICAoMHg0QjEsICdWJyksCiAgICAoMHg0QjIsICdNJywgdSfSsycpLAogICAgKDB4NEIzLCAnVicpLAogICAgKDB4NEI0LCAnTScsIHUn0rUnKSwKICAgICgweDRCNSwgJ1YnKSwKICAgICgweDRCNiwgJ00nLCB1J9K3JyksCiAgICAoMHg0QjcsICdWJyksCiAgICAoMHg0QjgsICdNJywgdSfSuScpLAogICAgKDB4NEI5LCAnVicpLAogICAgKDB4NEJBLCAnTScsIHUn0rsnKSwKICAgICgweDRCQiwgJ1YnKSwKICAgICgweDRCQywgJ00nLCB1J9K9JyksCiAgICAoMHg0QkQsICdWJyksCiAgICAoMHg0QkUsICdNJywgdSfSvycpLAogICAgKDB4NEJGLCAnVicpLAogICAgKDB4NEMwLCAnWCcpLAogICAgKDB4NEMxLCAnTScsIHUn04InKSwKICAgICgweDRDMiwgJ1YnKSwKICAgICgweDRDMywgJ00nLCB1J9OEJyksCiAgICAoMHg0QzQsICdWJyksCiAgICAoMHg0QzUsICdNJywgdSfThicpLAogICAgKDB4NEM2LCAnVicpLAogICAgKDB4NEM3LCAnTScsIHUn04gnKSwKICAgICgweDRDOCwgJ1YnKSwKICAgICgweDRDOSwgJ00nLCB1J9OKJyksCiAgICAoMHg0Q0EsICdWJyksCiAgICAoMHg0Q0IsICdNJywgdSfTjCcpLAogICAgKDB4NENDLCAnVicpLAogICAgKDB4NENELCAnTScsIHUn044nKSwKICAgICgweDRDRSwgJ1YnKSwKICAgICgweDREMCwgJ00nLCB1J9ORJyksCiAgICAoMHg0RDEsICdWJyksCiAgICAoMHg0RDIsICdNJywgdSfTkycpLAogICAgKDB4NEQzLCAnVicpLAogICAgKDB4NEQ0LCAnTScsIHUn05UnKSwKICAgICgweDRENSwgJ1YnKSwKICAgICgweDRENiwgJ00nLCB1J9OXJyksCiAgICAoMHg0RDcsICdWJyksCiAgICAoMHg0RDgsICdNJywgdSfTmScpLAogICAgKDB4NEQ5LCAnVicpLAogICAgKDB4NERBLCAnTScsIHUn05snKSwKICAgICgweDREQiwgJ1YnKSwKICAgICgweDREQywgJ00nLCB1J9OdJyksCiAgICAoMHg0REQsICdWJyksCiAgICAoMHg0REUsICdNJywgdSfTnycpLAogICAgKDB4NERGLCAnVicpLAogICAgKDB4NEUwLCAnTScsIHUn06EnKSwKICAgICgweDRFMSwgJ1YnKSwKICAgICgweDRFMiwgJ00nLCB1J9OjJyksCiAgICAoMHg0RTMsICdWJyksCiAgICAoMHg0RTQsICdNJywgdSfTpScpLAogICAgKDB4NEU1LCAnVicpLAogICAgKDB4NEU2LCAnTScsIHUn06cnKSwKICAgICgweDRFNywgJ1YnKSwKICAgICgweDRFOCwgJ00nLCB1J9OpJyksCiAgICAoMHg0RTksICdWJyksCiAgICAoMHg0RUEsICdNJywgdSfTqycpLAogICAgKDB4NEVCLCAnVicpLAogICAgKDB4NEVDLCAnTScsIHUn060nKSwKICAgICgweDRFRCwgJ1YnKSwKICAgICgweDRFRSwgJ00nLCB1J9OvJyksCiAgICAoMHg0RUYsICdWJyksCiAgICAoMHg0RjAsICdNJywgdSfTsScpLAogICAgKDB4NEYxLCAnVicpLAogICAgKDB4NEYyLCAnTScsIHUn07MnKSwKICAgICgweDRGMywgJ1YnKSwKICAgICgweDRGNCwgJ00nLCB1J9O1JyksCiAgICAoMHg0RjUsICdWJyksCiAgICAoMHg0RjYsICdNJywgdSfTtycpLAogICAgKDB4NEY3LCAnVicpLAogICAgKDB4NEY4LCAnTScsIHUn07knKSwKICAgICgweDRGOSwgJ1YnKSwKICAgICgweDRGQSwgJ00nLCB1J9O7JyksCiAgICAoMHg0RkIsICdWJyksCiAgICAoMHg0RkMsICdNJywgdSfTvScpLAogICAgKDB4NEZELCAnVicpLAogICAgKDB4NEZFLCAnTScsIHUn078nKSwKICAgICgweDRGRiwgJ1YnKSwKICAgICgweDUwMCwgJ00nLCB1J9SBJyksCiAgICAoMHg1MDEsICdWJyksCiAgICAoMHg1MDIsICdNJywgdSfUgycpLAogICAgKDB4NTAzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfOSgpOgogICAgcmV0dXJuIFsKICAgICgweDUwNCwgJ00nLCB1J9SFJyksCiAgICAoMHg1MDUsICdWJyksCiAgICAoMHg1MDYsICdNJywgdSfUhycpLAogICAgKDB4NTA3LCAnVicpLAogICAgKDB4NTA4LCAnTScsIHUn1IknKSwKICAgICgweDUwOSwgJ1YnKSwKICAgICgweDUwQSwgJ00nLCB1J9SLJyksCiAgICAoMHg1MEIsICdWJyksCiAgICAoMHg1MEMsICdNJywgdSfUjScpLAogICAgKDB4NTBELCAnVicpLAogICAgKDB4NTBFLCAnTScsIHUn1I8nKSwKICAgICgweDUwRiwgJ1YnKSwKICAgICgweDUxMCwgJ00nLCB1J9SRJyksCiAgICAoMHg1MTEsICdWJyksCiAgICAoMHg1MTIsICdNJywgdSfUkycpLAogICAgKDB4NTEzLCAnVicpLAogICAgKDB4NTE0LCAnTScsIHUn1JUnKSwKICAgICgweDUxNSwgJ1YnKSwKICAgICgweDUxNiwgJ00nLCB1J9SXJyksCiAgICAoMHg1MTcsICdWJyksCiAgICAoMHg1MTgsICdNJywgdSfUmScpLAogICAgKDB4NTE5LCAnVicpLAogICAgKDB4NTFBLCAnTScsIHUn1JsnKSwKICAgICgweDUxQiwgJ1YnKSwKICAgICgweDUxQywgJ00nLCB1J9SdJyksCiAgICAoMHg1MUQsICdWJyksCiAgICAoMHg1MUUsICdNJywgdSfUnycpLAogICAgKDB4NTFGLCAnVicpLAogICAgKDB4NTIwLCAnTScsIHUn1KEnKSwKICAgICgweDUyMSwgJ1YnKSwKICAgICgweDUyMiwgJ00nLCB1J9SjJyksCiAgICAoMHg1MjMsICdWJyksCiAgICAoMHg1MjQsICdNJywgdSfUpScpLAogICAgKDB4NTI1LCAnVicpLAogICAgKDB4NTI2LCAnTScsIHUn1KcnKSwKICAgICgweDUyNywgJ1YnKSwKICAgICgweDUyOCwgJ1gnKSwKICAgICgweDUzMSwgJ00nLCB1J9WhJyksCiAgICAoMHg1MzIsICdNJywgdSfVoicpLAogICAgKDB4NTMzLCAnTScsIHUn1aMnKSwKICAgICgweDUzNCwgJ00nLCB1J9WkJyksCiAgICAoMHg1MzUsICdNJywgdSfVpScpLAogICAgKDB4NTM2LCAnTScsIHUn1aYnKSwKICAgICgweDUzNywgJ00nLCB1J9WnJyksCiAgICAoMHg1MzgsICdNJywgdSfVqCcpLAogICAgKDB4NTM5LCAnTScsIHUn1aknKSwKICAgICgweDUzQSwgJ00nLCB1J9WqJyksCiAgICAoMHg1M0IsICdNJywgdSfVqycpLAogICAgKDB4NTNDLCAnTScsIHUn1awnKSwKICAgICgweDUzRCwgJ00nLCB1J9WtJyksCiAgICAoMHg1M0UsICdNJywgdSfVricpLAogICAgKDB4NTNGLCAnTScsIHUn1a8nKSwKICAgICgweDU0MCwgJ00nLCB1J9WwJyksCiAgICAoMHg1NDEsICdNJywgdSfVsScpLAogICAgKDB4NTQyLCAnTScsIHUn1bInKSwKICAgICgweDU0MywgJ00nLCB1J9WzJyksCiAgICAoMHg1NDQsICdNJywgdSfVtCcpLAogICAgKDB4NTQ1LCAnTScsIHUn1bUnKSwKICAgICgweDU0NiwgJ00nLCB1J9W2JyksCiAgICAoMHg1NDcsICdNJywgdSfVtycpLAogICAgKDB4NTQ4LCAnTScsIHUn1bgnKSwKICAgICgweDU0OSwgJ00nLCB1J9W5JyksCiAgICAoMHg1NEEsICdNJywgdSfVuicpLAogICAgKDB4NTRCLCAnTScsIHUn1bsnKSwKICAgICgweDU0QywgJ00nLCB1J9W8JyksCiAgICAoMHg1NEQsICdNJywgdSfVvScpLAogICAgKDB4NTRFLCAnTScsIHUn1b4nKSwKICAgICgweDU0RiwgJ00nLCB1J9W/JyksCiAgICAoMHg1NTAsICdNJywgdSfWgCcpLAogICAgKDB4NTUxLCAnTScsIHUn1oEnKSwKICAgICgweDU1MiwgJ00nLCB1J9aCJyksCiAgICAoMHg1NTMsICdNJywgdSfWgycpLAogICAgKDB4NTU0LCAnTScsIHUn1oQnKSwKICAgICgweDU1NSwgJ00nLCB1J9aFJyksCiAgICAoMHg1NTYsICdNJywgdSfWhicpLAogICAgKDB4NTU3LCAnWCcpLAogICAgKDB4NTU5LCAnVicpLAogICAgKDB4NTYwLCAnWCcpLAogICAgKDB4NTYxLCAnVicpLAogICAgKDB4NTg3LCAnTScsIHUn1aXWgicpLAogICAgKDB4NTg4LCAnWCcpLAogICAgKDB4NTg5LCAnVicpLAogICAgKDB4NThCLCAnWCcpLAogICAgKDB4NThGLCAnVicpLAogICAgKDB4NTkwLCAnWCcpLAogICAgKDB4NTkxLCAnVicpLAogICAgKDB4NUM4LCAnWCcpLAogICAgKDB4NUQwLCAnVicpLAogICAgKDB4NUVCLCAnWCcpLAogICAgKDB4NUYwLCAnVicpLAogICAgKDB4NUY1LCAnWCcpLAogICAgKDB4NjA2LCAnVicpLAogICAgKDB4NjFDLCAnWCcpLAogICAgKDB4NjFFLCAnVicpLAogICAgKDB4Njc1LCAnTScsIHUn2KfZtCcpLAogICAgKDB4Njc2LCAnTScsIHUn2YjZtCcpLAogICAgKDB4Njc3LCAnTScsIHUn24fZtCcpLAogICAgKDB4Njc4LCAnTScsIHUn2YrZtCcpLAogICAgKDB4Njc5LCAnVicpLAogICAgKDB4NkRELCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTAoKToKICAgIHJldHVybiBbCiAgICAoMHg2REUsICdWJyksCiAgICAoMHg3MEUsICdYJyksCiAgICAoMHg3MTAsICdWJyksCiAgICAoMHg3NEIsICdYJyksCiAgICAoMHg3NEQsICdWJyksCiAgICAoMHg3QjIsICdYJyksCiAgICAoMHg3QzAsICdWJyksCiAgICAoMHg3RkIsICdYJyksCiAgICAoMHg4MDAsICdWJyksCiAgICAoMHg4MkUsICdYJyksCiAgICAoMHg4MzAsICdWJyksCiAgICAoMHg4M0YsICdYJyksCiAgICAoMHg4NDAsICdWJyksCiAgICAoMHg4NUMsICdYJyksCiAgICAoMHg4NUUsICdWJyksCiAgICAoMHg4NUYsICdYJyksCiAgICAoMHg4QTAsICdWJyksCiAgICAoMHg4QTEsICdYJyksCiAgICAoMHg4QTIsICdWJyksCiAgICAoMHg4QUQsICdYJyksCiAgICAoMHg4RTQsICdWJyksCiAgICAoMHg4RkYsICdYJyksCiAgICAoMHg5MDAsICdWJyksCiAgICAoMHg5NTgsICdNJywgdSfgpJXgpLwnKSwKICAgICgweDk1OSwgJ00nLCB1J+CkluCkvCcpLAogICAgKDB4OTVBLCAnTScsIHUn4KSX4KS8JyksCiAgICAoMHg5NUIsICdNJywgdSfgpJzgpLwnKSwKICAgICgweDk1QywgJ00nLCB1J+CkoeCkvCcpLAogICAgKDB4OTVELCAnTScsIHUn4KSi4KS8JyksCiAgICAoMHg5NUUsICdNJywgdSfgpKvgpLwnKSwKICAgICgweDk1RiwgJ00nLCB1J+Ckr+CkvCcpLAogICAgKDB4OTYwLCAnVicpLAogICAgKDB4OTc4LCAnWCcpLAogICAgKDB4OTc5LCAnVicpLAogICAgKDB4OTgwLCAnWCcpLAogICAgKDB4OTgxLCAnVicpLAogICAgKDB4OTg0LCAnWCcpLAogICAgKDB4OTg1LCAnVicpLAogICAgKDB4OThELCAnWCcpLAogICAgKDB4OThGLCAnVicpLAogICAgKDB4OTkxLCAnWCcpLAogICAgKDB4OTkzLCAnVicpLAogICAgKDB4OUE5LCAnWCcpLAogICAgKDB4OUFBLCAnVicpLAogICAgKDB4OUIxLCAnWCcpLAogICAgKDB4OUIyLCAnVicpLAogICAgKDB4OUIzLCAnWCcpLAogICAgKDB4OUI2LCAnVicpLAogICAgKDB4OUJBLCAnWCcpLAogICAgKDB4OUJDLCAnVicpLAogICAgKDB4OUM1LCAnWCcpLAogICAgKDB4OUM3LCAnVicpLAogICAgKDB4OUM5LCAnWCcpLAogICAgKDB4OUNCLCAnVicpLAogICAgKDB4OUNGLCAnWCcpLAogICAgKDB4OUQ3LCAnVicpLAogICAgKDB4OUQ4LCAnWCcpLAogICAgKDB4OURDLCAnTScsIHUn4Kah4Ka8JyksCiAgICAoMHg5REQsICdNJywgdSfgpqLgprwnKSwKICAgICgweDlERSwgJ1gnKSwKICAgICgweDlERiwgJ00nLCB1J+Cmr+CmvCcpLAogICAgKDB4OUUwLCAnVicpLAogICAgKDB4OUU0LCAnWCcpLAogICAgKDB4OUU2LCAnVicpLAogICAgKDB4OUZDLCAnWCcpLAogICAgKDB4QTAxLCAnVicpLAogICAgKDB4QTA0LCAnWCcpLAogICAgKDB4QTA1LCAnVicpLAogICAgKDB4QTBCLCAnWCcpLAogICAgKDB4QTBGLCAnVicpLAogICAgKDB4QTExLCAnWCcpLAogICAgKDB4QTEzLCAnVicpLAogICAgKDB4QTI5LCAnWCcpLAogICAgKDB4QTJBLCAnVicpLAogICAgKDB4QTMxLCAnWCcpLAogICAgKDB4QTMyLCAnVicpLAogICAgKDB4QTMzLCAnTScsIHUn4Kiy4Ki8JyksCiAgICAoMHhBMzQsICdYJyksCiAgICAoMHhBMzUsICdWJyksCiAgICAoMHhBMzYsICdNJywgdSfgqLjgqLwnKSwKICAgICgweEEzNywgJ1gnKSwKICAgICgweEEzOCwgJ1YnKSwKICAgICgweEEzQSwgJ1gnKSwKICAgICgweEEzQywgJ1YnKSwKICAgICgweEEzRCwgJ1gnKSwKICAgICgweEEzRSwgJ1YnKSwKICAgICgweEE0MywgJ1gnKSwKICAgICgweEE0NywgJ1YnKSwKICAgICgweEE0OSwgJ1gnKSwKICAgICgweEE0QiwgJ1YnKSwKICAgICgweEE0RSwgJ1gnKSwKICAgICgweEE1MSwgJ1YnKSwKICAgICgweEE1MiwgJ1gnKSwKICAgICgweEE1OSwgJ00nLCB1J+ColuCovCcpLAogICAgKDB4QTVBLCAnTScsIHUn4KiX4Ki8JyksCiAgICAoMHhBNUIsICdNJywgdSfgqJzgqLwnKSwKICAgICgweEE1QywgJ1YnKSwKICAgICgweEE1RCwgJ1gnKSwKICAgICgweEE1RSwgJ00nLCB1J+Coq+CovCcpLAogICAgKDB4QTVGLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTEoKToKICAgIHJldHVybiBbCiAgICAoMHhBNjYsICdWJyksCiAgICAoMHhBNzYsICdYJyksCiAgICAoMHhBODEsICdWJyksCiAgICAoMHhBODQsICdYJyksCiAgICAoMHhBODUsICdWJyksCiAgICAoMHhBOEUsICdYJyksCiAgICAoMHhBOEYsICdWJyksCiAgICAoMHhBOTIsICdYJyksCiAgICAoMHhBOTMsICdWJyksCiAgICAoMHhBQTksICdYJyksCiAgICAoMHhBQUEsICdWJyksCiAgICAoMHhBQjEsICdYJyksCiAgICAoMHhBQjIsICdWJyksCiAgICAoMHhBQjQsICdYJyksCiAgICAoMHhBQjUsICdWJyksCiAgICAoMHhBQkEsICdYJyksCiAgICAoMHhBQkMsICdWJyksCiAgICAoMHhBQzYsICdYJyksCiAgICAoMHhBQzcsICdWJyksCiAgICAoMHhBQ0EsICdYJyksCiAgICAoMHhBQ0IsICdWJyksCiAgICAoMHhBQ0UsICdYJyksCiAgICAoMHhBRDAsICdWJyksCiAgICAoMHhBRDEsICdYJyksCiAgICAoMHhBRTAsICdWJyksCiAgICAoMHhBRTQsICdYJyksCiAgICAoMHhBRTYsICdWJyksCiAgICAoMHhBRjIsICdYJyksCiAgICAoMHhCMDEsICdWJyksCiAgICAoMHhCMDQsICdYJyksCiAgICAoMHhCMDUsICdWJyksCiAgICAoMHhCMEQsICdYJyksCiAgICAoMHhCMEYsICdWJyksCiAgICAoMHhCMTEsICdYJyksCiAgICAoMHhCMTMsICdWJyksCiAgICAoMHhCMjksICdYJyksCiAgICAoMHhCMkEsICdWJyksCiAgICAoMHhCMzEsICdYJyksCiAgICAoMHhCMzIsICdWJyksCiAgICAoMHhCMzQsICdYJyksCiAgICAoMHhCMzUsICdWJyksCiAgICAoMHhCM0EsICdYJyksCiAgICAoMHhCM0MsICdWJyksCiAgICAoMHhCNDUsICdYJyksCiAgICAoMHhCNDcsICdWJyksCiAgICAoMHhCNDksICdYJyksCiAgICAoMHhCNEIsICdWJyksCiAgICAoMHhCNEUsICdYJyksCiAgICAoMHhCNTYsICdWJyksCiAgICAoMHhCNTgsICdYJyksCiAgICAoMHhCNUMsICdNJywgdSfgrKHgrLwnKSwKICAgICgweEI1RCwgJ00nLCB1J+CsouCsvCcpLAogICAgKDB4QjVFLCAnWCcpLAogICAgKDB4QjVGLCAnVicpLAogICAgKDB4QjY0LCAnWCcpLAogICAgKDB4QjY2LCAnVicpLAogICAgKDB4Qjc4LCAnWCcpLAogICAgKDB4QjgyLCAnVicpLAogICAgKDB4Qjg0LCAnWCcpLAogICAgKDB4Qjg1LCAnVicpLAogICAgKDB4QjhCLCAnWCcpLAogICAgKDB4QjhFLCAnVicpLAogICAgKDB4QjkxLCAnWCcpLAogICAgKDB4QjkyLCAnVicpLAogICAgKDB4Qjk2LCAnWCcpLAogICAgKDB4Qjk5LCAnVicpLAogICAgKDB4QjlCLCAnWCcpLAogICAgKDB4QjlDLCAnVicpLAogICAgKDB4QjlELCAnWCcpLAogICAgKDB4QjlFLCAnVicpLAogICAgKDB4QkEwLCAnWCcpLAogICAgKDB4QkEzLCAnVicpLAogICAgKDB4QkE1LCAnWCcpLAogICAgKDB4QkE4LCAnVicpLAogICAgKDB4QkFCLCAnWCcpLAogICAgKDB4QkFFLCAnVicpLAogICAgKDB4QkJBLCAnWCcpLAogICAgKDB4QkJFLCAnVicpLAogICAgKDB4QkMzLCAnWCcpLAogICAgKDB4QkM2LCAnVicpLAogICAgKDB4QkM5LCAnWCcpLAogICAgKDB4QkNBLCAnVicpLAogICAgKDB4QkNFLCAnWCcpLAogICAgKDB4QkQwLCAnVicpLAogICAgKDB4QkQxLCAnWCcpLAogICAgKDB4QkQ3LCAnVicpLAogICAgKDB4QkQ4LCAnWCcpLAogICAgKDB4QkU2LCAnVicpLAogICAgKDB4QkZCLCAnWCcpLAogICAgKDB4QzAxLCAnVicpLAogICAgKDB4QzA0LCAnWCcpLAogICAgKDB4QzA1LCAnVicpLAogICAgKDB4QzBELCAnWCcpLAogICAgKDB4QzBFLCAnVicpLAogICAgKDB4QzExLCAnWCcpLAogICAgKDB4QzEyLCAnVicpLAogICAgKDB4QzI5LCAnWCcpLAogICAgKDB4QzJBLCAnVicpLAogICAgKDB4QzM0LCAnWCcpLAogICAgKDB4QzM1LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTIoKToKICAgIHJldHVybiBbCiAgICAoMHhDM0EsICdYJyksCiAgICAoMHhDM0QsICdWJyksCiAgICAoMHhDNDUsICdYJyksCiAgICAoMHhDNDYsICdWJyksCiAgICAoMHhDNDksICdYJyksCiAgICAoMHhDNEEsICdWJyksCiAgICAoMHhDNEUsICdYJyksCiAgICAoMHhDNTUsICdWJyksCiAgICAoMHhDNTcsICdYJyksCiAgICAoMHhDNTgsICdWJyksCiAgICAoMHhDNUEsICdYJyksCiAgICAoMHhDNjAsICdWJyksCiAgICAoMHhDNjQsICdYJyksCiAgICAoMHhDNjYsICdWJyksCiAgICAoMHhDNzAsICdYJyksCiAgICAoMHhDNzgsICdWJyksCiAgICAoMHhDODAsICdYJyksCiAgICAoMHhDODIsICdWJyksCiAgICAoMHhDODQsICdYJyksCiAgICAoMHhDODUsICdWJyksCiAgICAoMHhDOEQsICdYJyksCiAgICAoMHhDOEUsICdWJyksCiAgICAoMHhDOTEsICdYJyksCiAgICAoMHhDOTIsICdWJyksCiAgICAoMHhDQTksICdYJyksCiAgICAoMHhDQUEsICdWJyksCiAgICAoMHhDQjQsICdYJyksCiAgICAoMHhDQjUsICdWJyksCiAgICAoMHhDQkEsICdYJyksCiAgICAoMHhDQkMsICdWJyksCiAgICAoMHhDQzUsICdYJyksCiAgICAoMHhDQzYsICdWJyksCiAgICAoMHhDQzksICdYJyksCiAgICAoMHhDQ0EsICdWJyksCiAgICAoMHhDQ0UsICdYJyksCiAgICAoMHhDRDUsICdWJyksCiAgICAoMHhDRDcsICdYJyksCiAgICAoMHhDREUsICdWJyksCiAgICAoMHhDREYsICdYJyksCiAgICAoMHhDRTAsICdWJyksCiAgICAoMHhDRTQsICdYJyksCiAgICAoMHhDRTYsICdWJyksCiAgICAoMHhDRjAsICdYJyksCiAgICAoMHhDRjEsICdWJyksCiAgICAoMHhDRjMsICdYJyksCiAgICAoMHhEMDIsICdWJyksCiAgICAoMHhEMDQsICdYJyksCiAgICAoMHhEMDUsICdWJyksCiAgICAoMHhEMEQsICdYJyksCiAgICAoMHhEMEUsICdWJyksCiAgICAoMHhEMTEsICdYJyksCiAgICAoMHhEMTIsICdWJyksCiAgICAoMHhEM0IsICdYJyksCiAgICAoMHhEM0QsICdWJyksCiAgICAoMHhENDUsICdYJyksCiAgICAoMHhENDYsICdWJyksCiAgICAoMHhENDksICdYJyksCiAgICAoMHhENEEsICdWJyksCiAgICAoMHhENEYsICdYJyksCiAgICAoMHhENTcsICdWJyksCiAgICAoMHhENTgsICdYJyksCiAgICAoMHhENjAsICdWJyksCiAgICAoMHhENjQsICdYJyksCiAgICAoMHhENjYsICdWJyksCiAgICAoMHhENzYsICdYJyksCiAgICAoMHhENzksICdWJyksCiAgICAoMHhEODAsICdYJyksCiAgICAoMHhEODIsICdWJyksCiAgICAoMHhEODQsICdYJyksCiAgICAoMHhEODUsICdWJyksCiAgICAoMHhEOTcsICdYJyksCiAgICAoMHhEOUEsICdWJyksCiAgICAoMHhEQjIsICdYJyksCiAgICAoMHhEQjMsICdWJyksCiAgICAoMHhEQkMsICdYJyksCiAgICAoMHhEQkQsICdWJyksCiAgICAoMHhEQkUsICdYJyksCiAgICAoMHhEQzAsICdWJyksCiAgICAoMHhEQzcsICdYJyksCiAgICAoMHhEQ0EsICdWJyksCiAgICAoMHhEQ0IsICdYJyksCiAgICAoMHhEQ0YsICdWJyksCiAgICAoMHhERDUsICdYJyksCiAgICAoMHhERDYsICdWJyksCiAgICAoMHhERDcsICdYJyksCiAgICAoMHhERDgsICdWJyksCiAgICAoMHhERTAsICdYJyksCiAgICAoMHhERjIsICdWJyksCiAgICAoMHhERjUsICdYJyksCiAgICAoMHhFMDEsICdWJyksCiAgICAoMHhFMzMsICdNJywgdSfguY3guLInKSwKICAgICgweEUzNCwgJ1YnKSwKICAgICgweEUzQiwgJ1gnKSwKICAgICgweEUzRiwgJ1YnKSwKICAgICgweEU1QywgJ1gnKSwKICAgICgweEU4MSwgJ1YnKSwKICAgICgweEU4MywgJ1gnKSwKICAgICgweEU4NCwgJ1YnKSwKICAgICgweEU4NSwgJ1gnKSwKICAgICgweEU4NywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEzKCk6CiAgICByZXR1cm4gWwogICAgKDB4RTg5LCAnWCcpLAogICAgKDB4RThBLCAnVicpLAogICAgKDB4RThCLCAnWCcpLAogICAgKDB4RThELCAnVicpLAogICAgKDB4RThFLCAnWCcpLAogICAgKDB4RTk0LCAnVicpLAogICAgKDB4RTk4LCAnWCcpLAogICAgKDB4RTk5LCAnVicpLAogICAgKDB4RUEwLCAnWCcpLAogICAgKDB4RUExLCAnVicpLAogICAgKDB4RUE0LCAnWCcpLAogICAgKDB4RUE1LCAnVicpLAogICAgKDB4RUE2LCAnWCcpLAogICAgKDB4RUE3LCAnVicpLAogICAgKDB4RUE4LCAnWCcpLAogICAgKDB4RUFBLCAnVicpLAogICAgKDB4RUFDLCAnWCcpLAogICAgKDB4RUFELCAnVicpLAogICAgKDB4RUIzLCAnTScsIHUn4LuN4LqyJyksCiAgICAoMHhFQjQsICdWJyksCiAgICAoMHhFQkEsICdYJyksCiAgICAoMHhFQkIsICdWJyksCiAgICAoMHhFQkUsICdYJyksCiAgICAoMHhFQzAsICdWJyksCiAgICAoMHhFQzUsICdYJyksCiAgICAoMHhFQzYsICdWJyksCiAgICAoMHhFQzcsICdYJyksCiAgICAoMHhFQzgsICdWJyksCiAgICAoMHhFQ0UsICdYJyksCiAgICAoMHhFRDAsICdWJyksCiAgICAoMHhFREEsICdYJyksCiAgICAoMHhFREMsICdNJywgdSfguqvgupknKSwKICAgICgweEVERCwgJ00nLCB1J+C6q+C6oScpLAogICAgKDB4RURFLCAnVicpLAogICAgKDB4RUUwLCAnWCcpLAogICAgKDB4RjAwLCAnVicpLAogICAgKDB4RjBDLCAnTScsIHUn4LyLJyksCiAgICAoMHhGMEQsICdWJyksCiAgICAoMHhGNDMsICdNJywgdSfgvYLgvrcnKSwKICAgICgweEY0NCwgJ1YnKSwKICAgICgweEY0OCwgJ1gnKSwKICAgICgweEY0OSwgJ1YnKSwKICAgICgweEY0RCwgJ00nLCB1J+C9jOC+tycpLAogICAgKDB4RjRFLCAnVicpLAogICAgKDB4RjUyLCAnTScsIHUn4L2R4L63JyksCiAgICAoMHhGNTMsICdWJyksCiAgICAoMHhGNTcsICdNJywgdSfgvZbgvrcnKSwKICAgICgweEY1OCwgJ1YnKSwKICAgICgweEY1QywgJ00nLCB1J+C9m+C+tycpLAogICAgKDB4RjVELCAnVicpLAogICAgKDB4RjY5LCAnTScsIHUn4L2A4L61JyksCiAgICAoMHhGNkEsICdWJyksCiAgICAoMHhGNkQsICdYJyksCiAgICAoMHhGNzEsICdWJyksCiAgICAoMHhGNzMsICdNJywgdSfgvbHgvbInKSwKICAgICgweEY3NCwgJ1YnKSwKICAgICgweEY3NSwgJ00nLCB1J+C9seC9tCcpLAogICAgKDB4Rjc2LCAnTScsIHUn4L6y4L6AJyksCiAgICAoMHhGNzcsICdNJywgdSfgvrLgvbHgvoAnKSwKICAgICgweEY3OCwgJ00nLCB1J+C+s+C+gCcpLAogICAgKDB4Rjc5LCAnTScsIHUn4L6z4L2x4L6AJyksCiAgICAoMHhGN0EsICdWJyksCiAgICAoMHhGODEsICdNJywgdSfgvbHgvoAnKSwKICAgICgweEY4MiwgJ1YnKSwKICAgICgweEY5MywgJ00nLCB1J+C+kuC+tycpLAogICAgKDB4Rjk0LCAnVicpLAogICAgKDB4Rjk4LCAnWCcpLAogICAgKDB4Rjk5LCAnVicpLAogICAgKDB4RjlELCAnTScsIHUn4L6c4L63JyksCiAgICAoMHhGOUUsICdWJyksCiAgICAoMHhGQTIsICdNJywgdSfgvqHgvrcnKSwKICAgICgweEZBMywgJ1YnKSwKICAgICgweEZBNywgJ00nLCB1J+C+puC+tycpLAogICAgKDB4RkE4LCAnVicpLAogICAgKDB4RkFDLCAnTScsIHUn4L6r4L63JyksCiAgICAoMHhGQUQsICdWJyksCiAgICAoMHhGQjksICdNJywgdSfgvpDgvrUnKSwKICAgICgweEZCQSwgJ1YnKSwKICAgICgweEZCRCwgJ1gnKSwKICAgICgweEZCRSwgJ1YnKSwKICAgICgweEZDRCwgJ1gnKSwKICAgICgweEZDRSwgJ1YnKSwKICAgICgweEZEQiwgJ1gnKSwKICAgICgweDEwMDAsICdWJyksCiAgICAoMHgxMEEwLCAnWCcpLAogICAgKDB4MTBDNywgJ00nLCB1J+K0pycpLAogICAgKDB4MTBDOCwgJ1gnKSwKICAgICgweDEwQ0QsICdNJywgdSfitK0nKSwKICAgICgweDEwQ0UsICdYJyksCiAgICAoMHgxMEQwLCAnVicpLAogICAgKDB4MTBGQywgJ00nLCB1J+GDnCcpLAogICAgKDB4MTBGRCwgJ1YnKSwKICAgICgweDExNUYsICdYJyksCiAgICAoMHgxMTYxLCAnVicpLAogICAgKDB4MTI0OSwgJ1gnKSwKICAgICgweDEyNEEsICdWJyksCiAgICAoMHgxMjRFLCAnWCcpLAogICAgKDB4MTI1MCwgJ1YnKSwKICAgICgweDEyNTcsICdYJyksCiAgICAoMHgxMjU4LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTQoKToKICAgIHJldHVybiBbCiAgICAoMHgxMjU5LCAnWCcpLAogICAgKDB4MTI1QSwgJ1YnKSwKICAgICgweDEyNUUsICdYJyksCiAgICAoMHgxMjYwLCAnVicpLAogICAgKDB4MTI4OSwgJ1gnKSwKICAgICgweDEyOEEsICdWJyksCiAgICAoMHgxMjhFLCAnWCcpLAogICAgKDB4MTI5MCwgJ1YnKSwKICAgICgweDEyQjEsICdYJyksCiAgICAoMHgxMkIyLCAnVicpLAogICAgKDB4MTJCNiwgJ1gnKSwKICAgICgweDEyQjgsICdWJyksCiAgICAoMHgxMkJGLCAnWCcpLAogICAgKDB4MTJDMCwgJ1YnKSwKICAgICgweDEyQzEsICdYJyksCiAgICAoMHgxMkMyLCAnVicpLAogICAgKDB4MTJDNiwgJ1gnKSwKICAgICgweDEyQzgsICdWJyksCiAgICAoMHgxMkQ3LCAnWCcpLAogICAgKDB4MTJEOCwgJ1YnKSwKICAgICgweDEzMTEsICdYJyksCiAgICAoMHgxMzEyLCAnVicpLAogICAgKDB4MTMxNiwgJ1gnKSwKICAgICgweDEzMTgsICdWJyksCiAgICAoMHgxMzVCLCAnWCcpLAogICAgKDB4MTM1RCwgJ1YnKSwKICAgICgweDEzN0QsICdYJyksCiAgICAoMHgxMzgwLCAnVicpLAogICAgKDB4MTM5QSwgJ1gnKSwKICAgICgweDEzQTAsICdWJyksCiAgICAoMHgxM0Y1LCAnWCcpLAogICAgKDB4MTQwMCwgJ1YnKSwKICAgICgweDE2ODAsICdYJyksCiAgICAoMHgxNjgxLCAnVicpLAogICAgKDB4MTY5RCwgJ1gnKSwKICAgICgweDE2QTAsICdWJyksCiAgICAoMHgxNkYxLCAnWCcpLAogICAgKDB4MTcwMCwgJ1YnKSwKICAgICgweDE3MEQsICdYJyksCiAgICAoMHgxNzBFLCAnVicpLAogICAgKDB4MTcxNSwgJ1gnKSwKICAgICgweDE3MjAsICdWJyksCiAgICAoMHgxNzM3LCAnWCcpLAogICAgKDB4MTc0MCwgJ1YnKSwKICAgICgweDE3NTQsICdYJyksCiAgICAoMHgxNzYwLCAnVicpLAogICAgKDB4MTc2RCwgJ1gnKSwKICAgICgweDE3NkUsICdWJyksCiAgICAoMHgxNzcxLCAnWCcpLAogICAgKDB4MTc3MiwgJ1YnKSwKICAgICgweDE3NzQsICdYJyksCiAgICAoMHgxNzgwLCAnVicpLAogICAgKDB4MTdCNCwgJ1gnKSwKICAgICgweDE3QjYsICdWJyksCiAgICAoMHgxN0RFLCAnWCcpLAogICAgKDB4MTdFMCwgJ1YnKSwKICAgICgweDE3RUEsICdYJyksCiAgICAoMHgxN0YwLCAnVicpLAogICAgKDB4MTdGQSwgJ1gnKSwKICAgICgweDE4MDAsICdWJyksCiAgICAoMHgxODA2LCAnWCcpLAogICAgKDB4MTgwNywgJ1YnKSwKICAgICgweDE4MEIsICdJJyksCiAgICAoMHgxODBFLCAnWCcpLAogICAgKDB4MTgxMCwgJ1YnKSwKICAgICgweDE4MUEsICdYJyksCiAgICAoMHgxODIwLCAnVicpLAogICAgKDB4MTg3OCwgJ1gnKSwKICAgICgweDE4ODAsICdWJyksCiAgICAoMHgxOEFCLCAnWCcpLAogICAgKDB4MThCMCwgJ1YnKSwKICAgICgweDE4RjYsICdYJyksCiAgICAoMHgxOTAwLCAnVicpLAogICAgKDB4MTkxRCwgJ1gnKSwKICAgICgweDE5MjAsICdWJyksCiAgICAoMHgxOTJDLCAnWCcpLAogICAgKDB4MTkzMCwgJ1YnKSwKICAgICgweDE5M0MsICdYJyksCiAgICAoMHgxOTQwLCAnVicpLAogICAgKDB4MTk0MSwgJ1gnKSwKICAgICgweDE5NDQsICdWJyksCiAgICAoMHgxOTZFLCAnWCcpLAogICAgKDB4MTk3MCwgJ1YnKSwKICAgICgweDE5NzUsICdYJyksCiAgICAoMHgxOTgwLCAnVicpLAogICAgKDB4MTlBQywgJ1gnKSwKICAgICgweDE5QjAsICdWJyksCiAgICAoMHgxOUNBLCAnWCcpLAogICAgKDB4MTlEMCwgJ1YnKSwKICAgICgweDE5REIsICdYJyksCiAgICAoMHgxOURFLCAnVicpLAogICAgKDB4MUExQywgJ1gnKSwKICAgICgweDFBMUUsICdWJyksCiAgICAoMHgxQTVGLCAnWCcpLAogICAgKDB4MUE2MCwgJ1YnKSwKICAgICgweDFBN0QsICdYJyksCiAgICAoMHgxQTdGLCAnVicpLAogICAgKDB4MUE4QSwgJ1gnKSwKICAgICgweDFBOTAsICdWJyksCiAgICAoMHgxQTlBLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTUoKToKICAgIHJldHVybiBbCiAgICAoMHgxQUEwLCAnVicpLAogICAgKDB4MUFBRSwgJ1gnKSwKICAgICgweDFCMDAsICdWJyksCiAgICAoMHgxQjRDLCAnWCcpLAogICAgKDB4MUI1MCwgJ1YnKSwKICAgICgweDFCN0QsICdYJyksCiAgICAoMHgxQjgwLCAnVicpLAogICAgKDB4MUJGNCwgJ1gnKSwKICAgICgweDFCRkMsICdWJyksCiAgICAoMHgxQzM4LCAnWCcpLAogICAgKDB4MUMzQiwgJ1YnKSwKICAgICgweDFDNEEsICdYJyksCiAgICAoMHgxQzRELCAnVicpLAogICAgKDB4MUM4MCwgJ1gnKSwKICAgICgweDFDQzAsICdWJyksCiAgICAoMHgxQ0M4LCAnWCcpLAogICAgKDB4MUNEMCwgJ1YnKSwKICAgICgweDFDRjcsICdYJyksCiAgICAoMHgxRDAwLCAnVicpLAogICAgKDB4MUQyQywgJ00nLCB1J2EnKSwKICAgICgweDFEMkQsICdNJywgdSfDpicpLAogICAgKDB4MUQyRSwgJ00nLCB1J2InKSwKICAgICgweDFEMkYsICdWJyksCiAgICAoMHgxRDMwLCAnTScsIHUnZCcpLAogICAgKDB4MUQzMSwgJ00nLCB1J2UnKSwKICAgICgweDFEMzIsICdNJywgdSfHnScpLAogICAgKDB4MUQzMywgJ00nLCB1J2cnKSwKICAgICgweDFEMzQsICdNJywgdSdoJyksCiAgICAoMHgxRDM1LCAnTScsIHUnaScpLAogICAgKDB4MUQzNiwgJ00nLCB1J2onKSwKICAgICgweDFEMzcsICdNJywgdSdrJyksCiAgICAoMHgxRDM4LCAnTScsIHUnbCcpLAogICAgKDB4MUQzOSwgJ00nLCB1J20nKSwKICAgICgweDFEM0EsICdNJywgdSduJyksCiAgICAoMHgxRDNCLCAnVicpLAogICAgKDB4MUQzQywgJ00nLCB1J28nKSwKICAgICgweDFEM0QsICdNJywgdSfIoycpLAogICAgKDB4MUQzRSwgJ00nLCB1J3AnKSwKICAgICgweDFEM0YsICdNJywgdSdyJyksCiAgICAoMHgxRDQwLCAnTScsIHUndCcpLAogICAgKDB4MUQ0MSwgJ00nLCB1J3UnKSwKICAgICgweDFENDIsICdNJywgdSd3JyksCiAgICAoMHgxRDQzLCAnTScsIHUnYScpLAogICAgKDB4MUQ0NCwgJ00nLCB1J8mQJyksCiAgICAoMHgxRDQ1LCAnTScsIHUnyZEnKSwKICAgICgweDFENDYsICdNJywgdSfhtIInKSwKICAgICgweDFENDcsICdNJywgdSdiJyksCiAgICAoMHgxRDQ4LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0OSwgJ00nLCB1J2UnKSwKICAgICgweDFENEEsICdNJywgdSfJmScpLAogICAgKDB4MUQ0QiwgJ00nLCB1J8mbJyksCiAgICAoMHgxRDRDLCAnTScsIHUnyZwnKSwKICAgICgweDFENEQsICdNJywgdSdnJyksCiAgICAoMHgxRDRFLCAnVicpLAogICAgKDB4MUQ0RiwgJ00nLCB1J2snKSwKICAgICgweDFENTAsICdNJywgdSdtJyksCiAgICAoMHgxRDUxLCAnTScsIHUnxYsnKSwKICAgICgweDFENTIsICdNJywgdSdvJyksCiAgICAoMHgxRDUzLCAnTScsIHUnyZQnKSwKICAgICgweDFENTQsICdNJywgdSfhtJYnKSwKICAgICgweDFENTUsICdNJywgdSfhtJcnKSwKICAgICgweDFENTYsICdNJywgdSdwJyksCiAgICAoMHgxRDU3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1OCwgJ00nLCB1J3UnKSwKICAgICgweDFENTksICdNJywgdSfhtJ0nKSwKICAgICgweDFENUEsICdNJywgdSfJrycpLAogICAgKDB4MUQ1QiwgJ00nLCB1J3YnKSwKICAgICgweDFENUMsICdNJywgdSfhtKUnKSwKICAgICgweDFENUQsICdNJywgdSfOsicpLAogICAgKDB4MUQ1RSwgJ00nLCB1J86zJyksCiAgICAoMHgxRDVGLCAnTScsIHUnzrQnKSwKICAgICgweDFENjAsICdNJywgdSfPhicpLAogICAgKDB4MUQ2MSwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDYyLCAnTScsIHUnaScpLAogICAgKDB4MUQ2MywgJ00nLCB1J3InKSwKICAgICgweDFENjQsICdNJywgdSd1JyksCiAgICAoMHgxRDY1LCAnTScsIHUndicpLAogICAgKDB4MUQ2NiwgJ00nLCB1J86yJyksCiAgICAoMHgxRDY3LCAnTScsIHUnzrMnKSwKICAgICgweDFENjgsICdNJywgdSfPgScpLAogICAgKDB4MUQ2OSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZBLCAnTScsIHUnz4cnKSwKICAgICgweDFENkIsICdWJyksCiAgICAoMHgxRDc4LCAnTScsIHUn0L0nKSwKICAgICgweDFENzksICdWJyksCiAgICAoMHgxRDlCLCAnTScsIHUnyZInKSwKICAgICgweDFEOUMsICdNJywgdSdjJyksCiAgICAoMHgxRDlELCAnTScsIHUnyZUnKSwKICAgICgweDFEOUUsICdNJywgdSfDsCcpLAogICAgKDB4MUQ5RiwgJ00nLCB1J8mcJyksCiAgICAoMHgxREEwLCAnTScsIHUnZicpLAogICAgKDB4MURBMSwgJ00nLCB1J8mfJyksCiAgICAoMHgxREEyLCAnTScsIHUnyaEnKSwKICAgICgweDFEQTMsICdNJywgdSfJpScpLAogICAgKDB4MURBNCwgJ00nLCB1J8moJyksCiAgICAoMHgxREE1LCAnTScsIHUnyaknKSwKICAgICgweDFEQTYsICdNJywgdSfJqicpLAogICAgKDB4MURBNywgJ00nLCB1J+G1uycpLAogICAgKDB4MURBOCwgJ00nLCB1J8qdJyksCiAgICAoMHgxREE5LCAnTScsIHUnya0nKSwKICAgIF0KCmRlZiBfc2VnXzE2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MURBQSwgJ00nLCB1J+G2hScpLAogICAgKDB4MURBQiwgJ00nLCB1J8qfJyksCiAgICAoMHgxREFDLCAnTScsIHUnybEnKSwKICAgICgweDFEQUQsICdNJywgdSfJsCcpLAogICAgKDB4MURBRSwgJ00nLCB1J8myJyksCiAgICAoMHgxREFGLCAnTScsIHUnybMnKSwKICAgICgweDFEQjAsICdNJywgdSfJtCcpLAogICAgKDB4MURCMSwgJ00nLCB1J8m1JyksCiAgICAoMHgxREIyLCAnTScsIHUnybgnKSwKICAgICgweDFEQjMsICdNJywgdSfKgicpLAogICAgKDB4MURCNCwgJ00nLCB1J8qDJyksCiAgICAoMHgxREI1LCAnTScsIHUnxqsnKSwKICAgICgweDFEQjYsICdNJywgdSfKiScpLAogICAgKDB4MURCNywgJ00nLCB1J8qKJyksCiAgICAoMHgxREI4LCAnTScsIHUn4bScJyksCiAgICAoMHgxREI5LCAnTScsIHUnyosnKSwKICAgICgweDFEQkEsICdNJywgdSfKjCcpLAogICAgKDB4MURCQiwgJ00nLCB1J3onKSwKICAgICgweDFEQkMsICdNJywgdSfKkCcpLAogICAgKDB4MURCRCwgJ00nLCB1J8qRJyksCiAgICAoMHgxREJFLCAnTScsIHUnypInKSwKICAgICgweDFEQkYsICdNJywgdSfOuCcpLAogICAgKDB4MURDMCwgJ1YnKSwKICAgICgweDFERTcsICdYJyksCiAgICAoMHgxREZDLCAnVicpLAogICAgKDB4MUUwMCwgJ00nLCB1J+G4gScpLAogICAgKDB4MUUwMSwgJ1YnKSwKICAgICgweDFFMDIsICdNJywgdSfhuIMnKSwKICAgICgweDFFMDMsICdWJyksCiAgICAoMHgxRTA0LCAnTScsIHUn4biFJyksCiAgICAoMHgxRTA1LCAnVicpLAogICAgKDB4MUUwNiwgJ00nLCB1J+G4hycpLAogICAgKDB4MUUwNywgJ1YnKSwKICAgICgweDFFMDgsICdNJywgdSfhuIknKSwKICAgICgweDFFMDksICdWJyksCiAgICAoMHgxRTBBLCAnTScsIHUn4biLJyksCiAgICAoMHgxRTBCLCAnVicpLAogICAgKDB4MUUwQywgJ00nLCB1J+G4jScpLAogICAgKDB4MUUwRCwgJ1YnKSwKICAgICgweDFFMEUsICdNJywgdSfhuI8nKSwKICAgICgweDFFMEYsICdWJyksCiAgICAoMHgxRTEwLCAnTScsIHUn4biRJyksCiAgICAoMHgxRTExLCAnVicpLAogICAgKDB4MUUxMiwgJ00nLCB1J+G4kycpLAogICAgKDB4MUUxMywgJ1YnKSwKICAgICgweDFFMTQsICdNJywgdSfhuJUnKSwKICAgICgweDFFMTUsICdWJyksCiAgICAoMHgxRTE2LCAnTScsIHUn4biXJyksCiAgICAoMHgxRTE3LCAnVicpLAogICAgKDB4MUUxOCwgJ00nLCB1J+G4mScpLAogICAgKDB4MUUxOSwgJ1YnKSwKICAgICgweDFFMUEsICdNJywgdSfhuJsnKSwKICAgICgweDFFMUIsICdWJyksCiAgICAoMHgxRTFDLCAnTScsIHUn4bidJyksCiAgICAoMHgxRTFELCAnVicpLAogICAgKDB4MUUxRSwgJ00nLCB1J+G4nycpLAogICAgKDB4MUUxRiwgJ1YnKSwKICAgICgweDFFMjAsICdNJywgdSfhuKEnKSwKICAgICgweDFFMjEsICdWJyksCiAgICAoMHgxRTIyLCAnTScsIHUn4bijJyksCiAgICAoMHgxRTIzLCAnVicpLAogICAgKDB4MUUyNCwgJ00nLCB1J+G4pScpLAogICAgKDB4MUUyNSwgJ1YnKSwKICAgICgweDFFMjYsICdNJywgdSfhuKcnKSwKICAgICgweDFFMjcsICdWJyksCiAgICAoMHgxRTI4LCAnTScsIHUn4bipJyksCiAgICAoMHgxRTI5LCAnVicpLAogICAgKDB4MUUyQSwgJ00nLCB1J+G4qycpLAogICAgKDB4MUUyQiwgJ1YnKSwKICAgICgweDFFMkMsICdNJywgdSfhuK0nKSwKICAgICgweDFFMkQsICdWJyksCiAgICAoMHgxRTJFLCAnTScsIHUn4bivJyksCiAgICAoMHgxRTJGLCAnVicpLAogICAgKDB4MUUzMCwgJ00nLCB1J+G4sScpLAogICAgKDB4MUUzMSwgJ1YnKSwKICAgICgweDFFMzIsICdNJywgdSfhuLMnKSwKICAgICgweDFFMzMsICdWJyksCiAgICAoMHgxRTM0LCAnTScsIHUn4bi1JyksCiAgICAoMHgxRTM1LCAnVicpLAogICAgKDB4MUUzNiwgJ00nLCB1J+G4tycpLAogICAgKDB4MUUzNywgJ1YnKSwKICAgICgweDFFMzgsICdNJywgdSfhuLknKSwKICAgICgweDFFMzksICdWJyksCiAgICAoMHgxRTNBLCAnTScsIHUn4bi7JyksCiAgICAoMHgxRTNCLCAnVicpLAogICAgKDB4MUUzQywgJ00nLCB1J+G4vScpLAogICAgKDB4MUUzRCwgJ1YnKSwKICAgICgweDFFM0UsICdNJywgdSfhuL8nKSwKICAgICgweDFFM0YsICdWJyksCiAgICAoMHgxRTQwLCAnTScsIHUn4bmBJyksCiAgICAoMHgxRTQxLCAnVicpLAogICAgKDB4MUU0MiwgJ00nLCB1J+G5gycpLAogICAgKDB4MUU0MywgJ1YnKSwKICAgICgweDFFNDQsICdNJywgdSfhuYUnKSwKICAgICgweDFFNDUsICdWJyksCiAgICAoMHgxRTQ2LCAnTScsIHUn4bmHJyksCiAgICAoMHgxRTQ3LCAnVicpLAogICAgKDB4MUU0OCwgJ00nLCB1J+G5iScpLAogICAgKDB4MUU0OSwgJ1YnKSwKICAgICgweDFFNEEsICdNJywgdSfhuYsnKSwKICAgIF0KCmRlZiBfc2VnXzE3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUU0QiwgJ1YnKSwKICAgICgweDFFNEMsICdNJywgdSfhuY0nKSwKICAgICgweDFFNEQsICdWJyksCiAgICAoMHgxRTRFLCAnTScsIHUn4bmPJyksCiAgICAoMHgxRTRGLCAnVicpLAogICAgKDB4MUU1MCwgJ00nLCB1J+G5kScpLAogICAgKDB4MUU1MSwgJ1YnKSwKICAgICgweDFFNTIsICdNJywgdSfhuZMnKSwKICAgICgweDFFNTMsICdWJyksCiAgICAoMHgxRTU0LCAnTScsIHUn4bmVJyksCiAgICAoMHgxRTU1LCAnVicpLAogICAgKDB4MUU1NiwgJ00nLCB1J+G5lycpLAogICAgKDB4MUU1NywgJ1YnKSwKICAgICgweDFFNTgsICdNJywgdSfhuZknKSwKICAgICgweDFFNTksICdWJyksCiAgICAoMHgxRTVBLCAnTScsIHUn4bmbJyksCiAgICAoMHgxRTVCLCAnVicpLAogICAgKDB4MUU1QywgJ00nLCB1J+G5nScpLAogICAgKDB4MUU1RCwgJ1YnKSwKICAgICgweDFFNUUsICdNJywgdSfhuZ8nKSwKICAgICgweDFFNUYsICdWJyksCiAgICAoMHgxRTYwLCAnTScsIHUn4bmhJyksCiAgICAoMHgxRTYxLCAnVicpLAogICAgKDB4MUU2MiwgJ00nLCB1J+G5oycpLAogICAgKDB4MUU2MywgJ1YnKSwKICAgICgweDFFNjQsICdNJywgdSfhuaUnKSwKICAgICgweDFFNjUsICdWJyksCiAgICAoMHgxRTY2LCAnTScsIHUn4bmnJyksCiAgICAoMHgxRTY3LCAnVicpLAogICAgKDB4MUU2OCwgJ00nLCB1J+G5qScpLAogICAgKDB4MUU2OSwgJ1YnKSwKICAgICgweDFFNkEsICdNJywgdSfhuasnKSwKICAgICgweDFFNkIsICdWJyksCiAgICAoMHgxRTZDLCAnTScsIHUn4bmtJyksCiAgICAoMHgxRTZELCAnVicpLAogICAgKDB4MUU2RSwgJ00nLCB1J+G5rycpLAogICAgKDB4MUU2RiwgJ1YnKSwKICAgICgweDFFNzAsICdNJywgdSfhubEnKSwKICAgICgweDFFNzEsICdWJyksCiAgICAoMHgxRTcyLCAnTScsIHUn4bmzJyksCiAgICAoMHgxRTczLCAnVicpLAogICAgKDB4MUU3NCwgJ00nLCB1J+G5tScpLAogICAgKDB4MUU3NSwgJ1YnKSwKICAgICgweDFFNzYsICdNJywgdSfhubcnKSwKICAgICgweDFFNzcsICdWJyksCiAgICAoMHgxRTc4LCAnTScsIHUn4bm5JyksCiAgICAoMHgxRTc5LCAnVicpLAogICAgKDB4MUU3QSwgJ00nLCB1J+G5uycpLAogICAgKDB4MUU3QiwgJ1YnKSwKICAgICgweDFFN0MsICdNJywgdSfhub0nKSwKICAgICgweDFFN0QsICdWJyksCiAgICAoMHgxRTdFLCAnTScsIHUn4bm/JyksCiAgICAoMHgxRTdGLCAnVicpLAogICAgKDB4MUU4MCwgJ00nLCB1J+G6gScpLAogICAgKDB4MUU4MSwgJ1YnKSwKICAgICgweDFFODIsICdNJywgdSfhuoMnKSwKICAgICgweDFFODMsICdWJyksCiAgICAoMHgxRTg0LCAnTScsIHUn4bqFJyksCiAgICAoMHgxRTg1LCAnVicpLAogICAgKDB4MUU4NiwgJ00nLCB1J+G6hycpLAogICAgKDB4MUU4NywgJ1YnKSwKICAgICgweDFFODgsICdNJywgdSfhuoknKSwKICAgICgweDFFODksICdWJyksCiAgICAoMHgxRThBLCAnTScsIHUn4bqLJyksCiAgICAoMHgxRThCLCAnVicpLAogICAgKDB4MUU4QywgJ00nLCB1J+G6jScpLAogICAgKDB4MUU4RCwgJ1YnKSwKICAgICgweDFFOEUsICdNJywgdSfhuo8nKSwKICAgICgweDFFOEYsICdWJyksCiAgICAoMHgxRTkwLCAnTScsIHUn4bqRJyksCiAgICAoMHgxRTkxLCAnVicpLAogICAgKDB4MUU5MiwgJ00nLCB1J+G6kycpLAogICAgKDB4MUU5MywgJ1YnKSwKICAgICgweDFFOTQsICdNJywgdSfhupUnKSwKICAgICgweDFFOTUsICdWJyksCiAgICAoMHgxRTlBLCAnTScsIHUnYcq+JyksCiAgICAoMHgxRTlCLCAnTScsIHUn4bmhJyksCiAgICAoMHgxRTlDLCAnVicpLAogICAgKDB4MUU5RSwgJ00nLCB1J3NzJyksCiAgICAoMHgxRTlGLCAnVicpLAogICAgKDB4MUVBMCwgJ00nLCB1J+G6oScpLAogICAgKDB4MUVBMSwgJ1YnKSwKICAgICgweDFFQTIsICdNJywgdSfhuqMnKSwKICAgICgweDFFQTMsICdWJyksCiAgICAoMHgxRUE0LCAnTScsIHUn4bqlJyksCiAgICAoMHgxRUE1LCAnVicpLAogICAgKDB4MUVBNiwgJ00nLCB1J+G6pycpLAogICAgKDB4MUVBNywgJ1YnKSwKICAgICgweDFFQTgsICdNJywgdSfhuqknKSwKICAgICgweDFFQTksICdWJyksCiAgICAoMHgxRUFBLCAnTScsIHUn4bqrJyksCiAgICAoMHgxRUFCLCAnVicpLAogICAgKDB4MUVBQywgJ00nLCB1J+G6rScpLAogICAgKDB4MUVBRCwgJ1YnKSwKICAgICgweDFFQUUsICdNJywgdSfhuq8nKSwKICAgICgweDFFQUYsICdWJyksCiAgICAoMHgxRUIwLCAnTScsIHUn4bqxJyksCiAgICAoMHgxRUIxLCAnVicpLAogICAgKDB4MUVCMiwgJ00nLCB1J+G6sycpLAogICAgKDB4MUVCMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzE4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVCNCwgJ00nLCB1J+G6tScpLAogICAgKDB4MUVCNSwgJ1YnKSwKICAgICgweDFFQjYsICdNJywgdSfhurcnKSwKICAgICgweDFFQjcsICdWJyksCiAgICAoMHgxRUI4LCAnTScsIHUn4bq5JyksCiAgICAoMHgxRUI5LCAnVicpLAogICAgKDB4MUVCQSwgJ00nLCB1J+G6uycpLAogICAgKDB4MUVCQiwgJ1YnKSwKICAgICgweDFFQkMsICdNJywgdSfhur0nKSwKICAgICgweDFFQkQsICdWJyksCiAgICAoMHgxRUJFLCAnTScsIHUn4bq/JyksCiAgICAoMHgxRUJGLCAnVicpLAogICAgKDB4MUVDMCwgJ00nLCB1J+G7gScpLAogICAgKDB4MUVDMSwgJ1YnKSwKICAgICgweDFFQzIsICdNJywgdSfhu4MnKSwKICAgICgweDFFQzMsICdWJyksCiAgICAoMHgxRUM0LCAnTScsIHUn4buFJyksCiAgICAoMHgxRUM1LCAnVicpLAogICAgKDB4MUVDNiwgJ00nLCB1J+G7hycpLAogICAgKDB4MUVDNywgJ1YnKSwKICAgICgweDFFQzgsICdNJywgdSfhu4knKSwKICAgICgweDFFQzksICdWJyksCiAgICAoMHgxRUNBLCAnTScsIHUn4buLJyksCiAgICAoMHgxRUNCLCAnVicpLAogICAgKDB4MUVDQywgJ00nLCB1J+G7jScpLAogICAgKDB4MUVDRCwgJ1YnKSwKICAgICgweDFFQ0UsICdNJywgdSfhu48nKSwKICAgICgweDFFQ0YsICdWJyksCiAgICAoMHgxRUQwLCAnTScsIHUn4buRJyksCiAgICAoMHgxRUQxLCAnVicpLAogICAgKDB4MUVEMiwgJ00nLCB1J+G7kycpLAogICAgKDB4MUVEMywgJ1YnKSwKICAgICgweDFFRDQsICdNJywgdSfhu5UnKSwKICAgICgweDFFRDUsICdWJyksCiAgICAoMHgxRUQ2LCAnTScsIHUn4buXJyksCiAgICAoMHgxRUQ3LCAnVicpLAogICAgKDB4MUVEOCwgJ00nLCB1J+G7mScpLAogICAgKDB4MUVEOSwgJ1YnKSwKICAgICgweDFFREEsICdNJywgdSfhu5snKSwKICAgICgweDFFREIsICdWJyksCiAgICAoMHgxRURDLCAnTScsIHUn4budJyksCiAgICAoMHgxRURELCAnVicpLAogICAgKDB4MUVERSwgJ00nLCB1J+G7nycpLAogICAgKDB4MUVERiwgJ1YnKSwKICAgICgweDFFRTAsICdNJywgdSfhu6EnKSwKICAgICgweDFFRTEsICdWJyksCiAgICAoMHgxRUUyLCAnTScsIHUn4bujJyksCiAgICAoMHgxRUUzLCAnVicpLAogICAgKDB4MUVFNCwgJ00nLCB1J+G7pScpLAogICAgKDB4MUVFNSwgJ1YnKSwKICAgICgweDFFRTYsICdNJywgdSfhu6cnKSwKICAgICgweDFFRTcsICdWJyksCiAgICAoMHgxRUU4LCAnTScsIHUn4bupJyksCiAgICAoMHgxRUU5LCAnVicpLAogICAgKDB4MUVFQSwgJ00nLCB1J+G7qycpLAogICAgKDB4MUVFQiwgJ1YnKSwKICAgICgweDFFRUMsICdNJywgdSfhu60nKSwKICAgICgweDFFRUQsICdWJyksCiAgICAoMHgxRUVFLCAnTScsIHUn4buvJyksCiAgICAoMHgxRUVGLCAnVicpLAogICAgKDB4MUVGMCwgJ00nLCB1J+G7sScpLAogICAgKDB4MUVGMSwgJ1YnKSwKICAgICgweDFFRjIsICdNJywgdSfhu7MnKSwKICAgICgweDFFRjMsICdWJyksCiAgICAoMHgxRUY0LCAnTScsIHUn4bu1JyksCiAgICAoMHgxRUY1LCAnVicpLAogICAgKDB4MUVGNiwgJ00nLCB1J+G7tycpLAogICAgKDB4MUVGNywgJ1YnKSwKICAgICgweDFFRjgsICdNJywgdSfhu7knKSwKICAgICgweDFFRjksICdWJyksCiAgICAoMHgxRUZBLCAnTScsIHUn4bu7JyksCiAgICAoMHgxRUZCLCAnVicpLAogICAgKDB4MUVGQywgJ00nLCB1J+G7vScpLAogICAgKDB4MUVGRCwgJ1YnKSwKICAgICgweDFFRkUsICdNJywgdSfhu78nKSwKICAgICgweDFFRkYsICdWJyksCiAgICAoMHgxRjA4LCAnTScsIHUn4byAJyksCiAgICAoMHgxRjA5LCAnTScsIHUn4byBJyksCiAgICAoMHgxRjBBLCAnTScsIHUn4byCJyksCiAgICAoMHgxRjBCLCAnTScsIHUn4byDJyksCiAgICAoMHgxRjBDLCAnTScsIHUn4byEJyksCiAgICAoMHgxRjBELCAnTScsIHUn4byFJyksCiAgICAoMHgxRjBFLCAnTScsIHUn4byGJyksCiAgICAoMHgxRjBGLCAnTScsIHUn4byHJyksCiAgICAoMHgxRjEwLCAnVicpLAogICAgKDB4MUYxNiwgJ1gnKSwKICAgICgweDFGMTgsICdNJywgdSfhvJAnKSwKICAgICgweDFGMTksICdNJywgdSfhvJEnKSwKICAgICgweDFGMUEsICdNJywgdSfhvJInKSwKICAgICgweDFGMUIsICdNJywgdSfhvJMnKSwKICAgICgweDFGMUMsICdNJywgdSfhvJQnKSwKICAgICgweDFGMUQsICdNJywgdSfhvJUnKSwKICAgICgweDFGMUUsICdYJyksCiAgICAoMHgxRjIwLCAnVicpLAogICAgKDB4MUYyOCwgJ00nLCB1J+G8oCcpLAogICAgKDB4MUYyOSwgJ00nLCB1J+G8oScpLAogICAgKDB4MUYyQSwgJ00nLCB1J+G8oicpLAogICAgKDB4MUYyQiwgJ00nLCB1J+G8oycpLAogICAgKDB4MUYyQywgJ00nLCB1J+G8pCcpLAogICAgKDB4MUYyRCwgJ00nLCB1J+G8pScpLAogICAgXQoKZGVmIF9zZWdfMTkoKToKICAgIHJldHVybiBbCiAgICAoMHgxRjJFLCAnTScsIHUn4bymJyksCiAgICAoMHgxRjJGLCAnTScsIHUn4bynJyksCiAgICAoMHgxRjMwLCAnVicpLAogICAgKDB4MUYzOCwgJ00nLCB1J+G8sCcpLAogICAgKDB4MUYzOSwgJ00nLCB1J+G8sScpLAogICAgKDB4MUYzQSwgJ00nLCB1J+G8sicpLAogICAgKDB4MUYzQiwgJ00nLCB1J+G8sycpLAogICAgKDB4MUYzQywgJ00nLCB1J+G8tCcpLAogICAgKDB4MUYzRCwgJ00nLCB1J+G8tScpLAogICAgKDB4MUYzRSwgJ00nLCB1J+G8ticpLAogICAgKDB4MUYzRiwgJ00nLCB1J+G8tycpLAogICAgKDB4MUY0MCwgJ1YnKSwKICAgICgweDFGNDYsICdYJyksCiAgICAoMHgxRjQ4LCAnTScsIHUn4b2AJyksCiAgICAoMHgxRjQ5LCAnTScsIHUn4b2BJyksCiAgICAoMHgxRjRBLCAnTScsIHUn4b2CJyksCiAgICAoMHgxRjRCLCAnTScsIHUn4b2DJyksCiAgICAoMHgxRjRDLCAnTScsIHUn4b2EJyksCiAgICAoMHgxRjRELCAnTScsIHUn4b2FJyksCiAgICAoMHgxRjRFLCAnWCcpLAogICAgKDB4MUY1MCwgJ1YnKSwKICAgICgweDFGNTgsICdYJyksCiAgICAoMHgxRjU5LCAnTScsIHUn4b2RJyksCiAgICAoMHgxRjVBLCAnWCcpLAogICAgKDB4MUY1QiwgJ00nLCB1J+G9kycpLAogICAgKDB4MUY1QywgJ1gnKSwKICAgICgweDFGNUQsICdNJywgdSfhvZUnKSwKICAgICgweDFGNUUsICdYJyksCiAgICAoMHgxRjVGLCAnTScsIHUn4b2XJyksCiAgICAoMHgxRjYwLCAnVicpLAogICAgKDB4MUY2OCwgJ00nLCB1J+G9oCcpLAogICAgKDB4MUY2OSwgJ00nLCB1J+G9oScpLAogICAgKDB4MUY2QSwgJ00nLCB1J+G9oicpLAogICAgKDB4MUY2QiwgJ00nLCB1J+G9oycpLAogICAgKDB4MUY2QywgJ00nLCB1J+G9pCcpLAogICAgKDB4MUY2RCwgJ00nLCB1J+G9pScpLAogICAgKDB4MUY2RSwgJ00nLCB1J+G9picpLAogICAgKDB4MUY2RiwgJ00nLCB1J+G9pycpLAogICAgKDB4MUY3MCwgJ1YnKSwKICAgICgweDFGNzEsICdNJywgdSfOrCcpLAogICAgKDB4MUY3MiwgJ1YnKSwKICAgICgweDFGNzMsICdNJywgdSfOrScpLAogICAgKDB4MUY3NCwgJ1YnKSwKICAgICgweDFGNzUsICdNJywgdSfOricpLAogICAgKDB4MUY3NiwgJ1YnKSwKICAgICgweDFGNzcsICdNJywgdSfOrycpLAogICAgKDB4MUY3OCwgJ1YnKSwKICAgICgweDFGNzksICdNJywgdSfPjCcpLAogICAgKDB4MUY3QSwgJ1YnKSwKICAgICgweDFGN0IsICdNJywgdSfPjScpLAogICAgKDB4MUY3QywgJ1YnKSwKICAgICgweDFGN0QsICdNJywgdSfPjicpLAogICAgKDB4MUY3RSwgJ1gnKSwKICAgICgweDFGODAsICdNJywgdSfhvIDOuScpLAogICAgKDB4MUY4MSwgJ00nLCB1J+G8gc65JyksCiAgICAoMHgxRjgyLCAnTScsIHUn4byCzrknKSwKICAgICgweDFGODMsICdNJywgdSfhvIPOuScpLAogICAgKDB4MUY4NCwgJ00nLCB1J+G8hM65JyksCiAgICAoMHgxRjg1LCAnTScsIHUn4byFzrknKSwKICAgICgweDFGODYsICdNJywgdSfhvIbOuScpLAogICAgKDB4MUY4NywgJ00nLCB1J+G8h865JyksCiAgICAoMHgxRjg4LCAnTScsIHUn4byAzrknKSwKICAgICgweDFGODksICdNJywgdSfhvIHOuScpLAogICAgKDB4MUY4QSwgJ00nLCB1J+G8gs65JyksCiAgICAoMHgxRjhCLCAnTScsIHUn4byDzrknKSwKICAgICgweDFGOEMsICdNJywgdSfhvITOuScpLAogICAgKDB4MUY4RCwgJ00nLCB1J+G8hc65JyksCiAgICAoMHgxRjhFLCAnTScsIHUn4byGzrknKSwKICAgICgweDFGOEYsICdNJywgdSfhvIfOuScpLAogICAgKDB4MUY5MCwgJ00nLCB1J+G8oM65JyksCiAgICAoMHgxRjkxLCAnTScsIHUn4byhzrknKSwKICAgICgweDFGOTIsICdNJywgdSfhvKLOuScpLAogICAgKDB4MUY5MywgJ00nLCB1J+G8o865JyksCiAgICAoMHgxRjk0LCAnTScsIHUn4bykzrknKSwKICAgICgweDFGOTUsICdNJywgdSfhvKXOuScpLAogICAgKDB4MUY5NiwgJ00nLCB1J+G8ps65JyksCiAgICAoMHgxRjk3LCAnTScsIHUn4bynzrknKSwKICAgICgweDFGOTgsICdNJywgdSfhvKDOuScpLAogICAgKDB4MUY5OSwgJ00nLCB1J+G8oc65JyksCiAgICAoMHgxRjlBLCAnTScsIHUn4byizrknKSwKICAgICgweDFGOUIsICdNJywgdSfhvKPOuScpLAogICAgKDB4MUY5QywgJ00nLCB1J+G8pM65JyksCiAgICAoMHgxRjlELCAnTScsIHUn4bylzrknKSwKICAgICgweDFGOUUsICdNJywgdSfhvKbOuScpLAogICAgKDB4MUY5RiwgJ00nLCB1J+G8p865JyksCiAgICAoMHgxRkEwLCAnTScsIHUn4b2gzrknKSwKICAgICgweDFGQTEsICdNJywgdSfhvaHOuScpLAogICAgKDB4MUZBMiwgJ00nLCB1J+G9os65JyksCiAgICAoMHgxRkEzLCAnTScsIHUn4b2jzrknKSwKICAgICgweDFGQTQsICdNJywgdSfhvaTOuScpLAogICAgKDB4MUZBNSwgJ00nLCB1J+G9pc65JyksCiAgICAoMHgxRkE2LCAnTScsIHUn4b2mzrknKSwKICAgICgweDFGQTcsICdNJywgdSfhvafOuScpLAogICAgKDB4MUZBOCwgJ00nLCB1J+G9oM65JyksCiAgICAoMHgxRkE5LCAnTScsIHUn4b2hzrknKSwKICAgICgweDFGQUEsICdNJywgdSfhvaLOuScpLAogICAgKDB4MUZBQiwgJ00nLCB1J+G9o865JyksCiAgICAoMHgxRkFDLCAnTScsIHUn4b2kzrknKSwKICAgICgweDFGQUQsICdNJywgdSfhvaXOuScpLAogICAgKDB4MUZBRSwgJ00nLCB1J+G9ps65JyksCiAgICBdCgpkZWYgX3NlZ18yMCgpOgogICAgcmV0dXJuIFsKICAgICgweDFGQUYsICdNJywgdSfhvafOuScpLAogICAgKDB4MUZCMCwgJ1YnKSwKICAgICgweDFGQjIsICdNJywgdSfhvbDOuScpLAogICAgKDB4MUZCMywgJ00nLCB1J86xzrknKSwKICAgICgweDFGQjQsICdNJywgdSfOrM65JyksCiAgICAoMHgxRkI1LCAnWCcpLAogICAgKDB4MUZCNiwgJ1YnKSwKICAgICgweDFGQjcsICdNJywgdSfhvrbOuScpLAogICAgKDB4MUZCOCwgJ00nLCB1J+G+sCcpLAogICAgKDB4MUZCOSwgJ00nLCB1J+G+sScpLAogICAgKDB4MUZCQSwgJ00nLCB1J+G9sCcpLAogICAgKDB4MUZCQiwgJ00nLCB1J86sJyksCiAgICAoMHgxRkJDLCAnTScsIHUnzrHOuScpLAogICAgKDB4MUZCRCwgJzMnLCB1JyDMkycpLAogICAgKDB4MUZCRSwgJ00nLCB1J865JyksCiAgICAoMHgxRkJGLCAnMycsIHUnIMyTJyksCiAgICAoMHgxRkMwLCAnMycsIHUnIM2CJyksCiAgICAoMHgxRkMxLCAnMycsIHUnIMyIzYInKSwKICAgICgweDFGQzIsICdNJywgdSfhvbTOuScpLAogICAgKDB4MUZDMywgJ00nLCB1J863zrknKSwKICAgICgweDFGQzQsICdNJywgdSfOrs65JyksCiAgICAoMHgxRkM1LCAnWCcpLAogICAgKDB4MUZDNiwgJ1YnKSwKICAgICgweDFGQzcsICdNJywgdSfhv4bOuScpLAogICAgKDB4MUZDOCwgJ00nLCB1J+G9sicpLAogICAgKDB4MUZDOSwgJ00nLCB1J86tJyksCiAgICAoMHgxRkNBLCAnTScsIHUn4b20JyksCiAgICAoMHgxRkNCLCAnTScsIHUnzq4nKSwKICAgICgweDFGQ0MsICdNJywgdSfOt865JyksCiAgICAoMHgxRkNELCAnMycsIHUnIMyTzIAnKSwKICAgICgweDFGQ0UsICczJywgdScgzJPMgScpLAogICAgKDB4MUZDRiwgJzMnLCB1JyDMk82CJyksCiAgICAoMHgxRkQwLCAnVicpLAogICAgKDB4MUZEMywgJ00nLCB1J86QJyksCiAgICAoMHgxRkQ0LCAnWCcpLAogICAgKDB4MUZENiwgJ1YnKSwKICAgICgweDFGRDgsICdNJywgdSfhv5AnKSwKICAgICgweDFGRDksICdNJywgdSfhv5EnKSwKICAgICgweDFGREEsICdNJywgdSfhvbYnKSwKICAgICgweDFGREIsICdNJywgdSfOrycpLAogICAgKDB4MUZEQywgJ1gnKSwKICAgICgweDFGREQsICczJywgdScgzJTMgCcpLAogICAgKDB4MUZERSwgJzMnLCB1JyDMlMyBJyksCiAgICAoMHgxRkRGLCAnMycsIHUnIMyUzYInKSwKICAgICgweDFGRTAsICdWJyksCiAgICAoMHgxRkUzLCAnTScsIHUnzrAnKSwKICAgICgweDFGRTQsICdWJyksCiAgICAoMHgxRkU4LCAnTScsIHUn4b+gJyksCiAgICAoMHgxRkU5LCAnTScsIHUn4b+hJyksCiAgICAoMHgxRkVBLCAnTScsIHUn4b26JyksCiAgICAoMHgxRkVCLCAnTScsIHUnz40nKSwKICAgICgweDFGRUMsICdNJywgdSfhv6UnKSwKICAgICgweDFGRUQsICczJywgdScgzIjMgCcpLAogICAgKDB4MUZFRSwgJzMnLCB1JyDMiMyBJyksCiAgICAoMHgxRkVGLCAnMycsIHUnYCcpLAogICAgKDB4MUZGMCwgJ1gnKSwKICAgICgweDFGRjIsICdNJywgdSfhvbzOuScpLAogICAgKDB4MUZGMywgJ00nLCB1J8+JzrknKSwKICAgICgweDFGRjQsICdNJywgdSfPjs65JyksCiAgICAoMHgxRkY1LCAnWCcpLAogICAgKDB4MUZGNiwgJ1YnKSwKICAgICgweDFGRjcsICdNJywgdSfhv7bOuScpLAogICAgKDB4MUZGOCwgJ00nLCB1J+G9uCcpLAogICAgKDB4MUZGOSwgJ00nLCB1J8+MJyksCiAgICAoMHgxRkZBLCAnTScsIHUn4b28JyksCiAgICAoMHgxRkZCLCAnTScsIHUnz44nKSwKICAgICgweDFGRkMsICdNJywgdSfPic65JyksCiAgICAoMHgxRkZELCAnMycsIHUnIMyBJyksCiAgICAoMHgxRkZFLCAnMycsIHUnIMyUJyksCiAgICAoMHgxRkZGLCAnWCcpLAogICAgKDB4MjAwMCwgJzMnLCB1JyAnKSwKICAgICgweDIwMEIsICdJJyksCiAgICAoMHgyMDBDLCAnRCcsIHUnJyksCiAgICAoMHgyMDBFLCAnWCcpLAogICAgKDB4MjAxMCwgJ1YnKSwKICAgICgweDIwMTEsICdNJywgdSfigJAnKSwKICAgICgweDIwMTIsICdWJyksCiAgICAoMHgyMDE3LCAnMycsIHUnIMyzJyksCiAgICAoMHgyMDE4LCAnVicpLAogICAgKDB4MjAyNCwgJ1gnKSwKICAgICgweDIwMjcsICdWJyksCiAgICAoMHgyMDI4LCAnWCcpLAogICAgKDB4MjAyRiwgJzMnLCB1JyAnKSwKICAgICgweDIwMzAsICdWJyksCiAgICAoMHgyMDMzLCAnTScsIHUn4oCy4oCyJyksCiAgICAoMHgyMDM0LCAnTScsIHUn4oCy4oCy4oCyJyksCiAgICAoMHgyMDM1LCAnVicpLAogICAgKDB4MjAzNiwgJ00nLCB1J+KAteKAtScpLAogICAgKDB4MjAzNywgJ00nLCB1J+KAteKAteKAtScpLAogICAgKDB4MjAzOCwgJ1YnKSwKICAgICgweDIwM0MsICczJywgdSchIScpLAogICAgKDB4MjAzRCwgJ1YnKSwKICAgICgweDIwM0UsICczJywgdScgzIUnKSwKICAgICgweDIwM0YsICdWJyksCiAgICAoMHgyMDQ3LCAnMycsIHUnPz8nKSwKICAgICgweDIwNDgsICczJywgdSc/IScpLAogICAgKDB4MjA0OSwgJzMnLCB1JyE/JyksCiAgICAoMHgyMDRBLCAnVicpLAogICAgKDB4MjA1NywgJ00nLCB1J+KAsuKAsuKAsuKAsicpLAogICAgKDB4MjA1OCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzIxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MjA1RiwgJzMnLCB1JyAnKSwKICAgICgweDIwNjAsICdJJyksCiAgICAoMHgyMDYxLCAnWCcpLAogICAgKDB4MjA2NCwgJ0knKSwKICAgICgweDIwNjUsICdYJyksCiAgICAoMHgyMDcwLCAnTScsIHUnMCcpLAogICAgKDB4MjA3MSwgJ00nLCB1J2knKSwKICAgICgweDIwNzIsICdYJyksCiAgICAoMHgyMDc0LCAnTScsIHUnNCcpLAogICAgKDB4MjA3NSwgJ00nLCB1JzUnKSwKICAgICgweDIwNzYsICdNJywgdSc2JyksCiAgICAoMHgyMDc3LCAnTScsIHUnNycpLAogICAgKDB4MjA3OCwgJ00nLCB1JzgnKSwKICAgICgweDIwNzksICdNJywgdSc5JyksCiAgICAoMHgyMDdBLCAnMycsIHUnKycpLAogICAgKDB4MjA3QiwgJ00nLCB1J+KIkicpLAogICAgKDB4MjA3QywgJzMnLCB1Jz0nKSwKICAgICgweDIwN0QsICczJywgdScoJyksCiAgICAoMHgyMDdFLCAnMycsIHUnKScpLAogICAgKDB4MjA3RiwgJ00nLCB1J24nKSwKICAgICgweDIwODAsICdNJywgdScwJyksCiAgICAoMHgyMDgxLCAnTScsIHUnMScpLAogICAgKDB4MjA4MiwgJ00nLCB1JzInKSwKICAgICgweDIwODMsICdNJywgdSczJyksCiAgICAoMHgyMDg0LCAnTScsIHUnNCcpLAogICAgKDB4MjA4NSwgJ00nLCB1JzUnKSwKICAgICgweDIwODYsICdNJywgdSc2JyksCiAgICAoMHgyMDg3LCAnTScsIHUnNycpLAogICAgKDB4MjA4OCwgJ00nLCB1JzgnKSwKICAgICgweDIwODksICdNJywgdSc5JyksCiAgICAoMHgyMDhBLCAnMycsIHUnKycpLAogICAgKDB4MjA4QiwgJ00nLCB1J+KIkicpLAogICAgKDB4MjA4QywgJzMnLCB1Jz0nKSwKICAgICgweDIwOEQsICczJywgdScoJyksCiAgICAoMHgyMDhFLCAnMycsIHUnKScpLAogICAgKDB4MjA4RiwgJ1gnKSwKICAgICgweDIwOTAsICdNJywgdSdhJyksCiAgICAoMHgyMDkxLCAnTScsIHUnZScpLAogICAgKDB4MjA5MiwgJ00nLCB1J28nKSwKICAgICgweDIwOTMsICdNJywgdSd4JyksCiAgICAoMHgyMDk0LCAnTScsIHUnyZknKSwKICAgICgweDIwOTUsICdNJywgdSdoJyksCiAgICAoMHgyMDk2LCAnTScsIHUnaycpLAogICAgKDB4MjA5NywgJ00nLCB1J2wnKSwKICAgICgweDIwOTgsICdNJywgdSdtJyksCiAgICAoMHgyMDk5LCAnTScsIHUnbicpLAogICAgKDB4MjA5QSwgJ00nLCB1J3AnKSwKICAgICgweDIwOUIsICdNJywgdSdzJyksCiAgICAoMHgyMDlDLCAnTScsIHUndCcpLAogICAgKDB4MjA5RCwgJ1gnKSwKICAgICgweDIwQTAsICdWJyksCiAgICAoMHgyMEE4LCAnTScsIHUncnMnKSwKICAgICgweDIwQTksICdWJyksCiAgICAoMHgyMEJCLCAnWCcpLAogICAgKDB4MjBEMCwgJ1YnKSwKICAgICgweDIwRjEsICdYJyksCiAgICAoMHgyMTAwLCAnMycsIHUnYS9jJyksCiAgICAoMHgyMTAxLCAnMycsIHUnYS9zJyksCiAgICAoMHgyMTAyLCAnTScsIHUnYycpLAogICAgKDB4MjEwMywgJ00nLCB1J8KwYycpLAogICAgKDB4MjEwNCwgJ1YnKSwKICAgICgweDIxMDUsICczJywgdSdjL28nKSwKICAgICgweDIxMDYsICczJywgdSdjL3UnKSwKICAgICgweDIxMDcsICdNJywgdSfJmycpLAogICAgKDB4MjEwOCwgJ1YnKSwKICAgICgweDIxMDksICdNJywgdSfCsGYnKSwKICAgICgweDIxMEEsICdNJywgdSdnJyksCiAgICAoMHgyMTBCLCAnTScsIHUnaCcpLAogICAgKDB4MjEwRiwgJ00nLCB1J8SnJyksCiAgICAoMHgyMTEwLCAnTScsIHUnaScpLAogICAgKDB4MjExMiwgJ00nLCB1J2wnKSwKICAgICgweDIxMTQsICdWJyksCiAgICAoMHgyMTE1LCAnTScsIHUnbicpLAogICAgKDB4MjExNiwgJ00nLCB1J25vJyksCiAgICAoMHgyMTE3LCAnVicpLAogICAgKDB4MjExOSwgJ00nLCB1J3AnKSwKICAgICgweDIxMUEsICdNJywgdSdxJyksCiAgICAoMHgyMTFCLCAnTScsIHUncicpLAogICAgKDB4MjExRSwgJ1YnKSwKICAgICgweDIxMjAsICdNJywgdSdzbScpLAogICAgKDB4MjEyMSwgJ00nLCB1J3RlbCcpLAogICAgKDB4MjEyMiwgJ00nLCB1J3RtJyksCiAgICAoMHgyMTIzLCAnVicpLAogICAgKDB4MjEyNCwgJ00nLCB1J3onKSwKICAgICgweDIxMjUsICdWJyksCiAgICAoMHgyMTI2LCAnTScsIHUnz4knKSwKICAgICgweDIxMjcsICdWJyksCiAgICAoMHgyMTI4LCAnTScsIHUneicpLAogICAgKDB4MjEyOSwgJ1YnKSwKICAgICgweDIxMkEsICdNJywgdSdrJyksCiAgICAoMHgyMTJCLCAnTScsIHUnw6UnKSwKICAgICgweDIxMkMsICdNJywgdSdiJyksCiAgICAoMHgyMTJELCAnTScsIHUnYycpLAogICAgKDB4MjEyRSwgJ1YnKSwKICAgICgweDIxMkYsICdNJywgdSdlJyksCiAgICAoMHgyMTMxLCAnTScsIHUnZicpLAogICAgKDB4MjEzMiwgJ1gnKSwKICAgICgweDIxMzMsICdNJywgdSdtJyksCiAgICAoMHgyMTM0LCAnTScsIHUnbycpLAogICAgKDB4MjEzNSwgJ00nLCB1J9eQJyksCiAgICBdCgpkZWYgX3NlZ18yMigpOgogICAgcmV0dXJuIFsKICAgICgweDIxMzYsICdNJywgdSfXkScpLAogICAgKDB4MjEzNywgJ00nLCB1J9eSJyksCiAgICAoMHgyMTM4LCAnTScsIHUn15MnKSwKICAgICgweDIxMzksICdNJywgdSdpJyksCiAgICAoMHgyMTNBLCAnVicpLAogICAgKDB4MjEzQiwgJ00nLCB1J2ZheCcpLAogICAgKDB4MjEzQywgJ00nLCB1J8+AJyksCiAgICAoMHgyMTNELCAnTScsIHUnzrMnKSwKICAgICgweDIxM0YsICdNJywgdSfPgCcpLAogICAgKDB4MjE0MCwgJ00nLCB1J+KIkScpLAogICAgKDB4MjE0MSwgJ1YnKSwKICAgICgweDIxNDUsICdNJywgdSdkJyksCiAgICAoMHgyMTQ3LCAnTScsIHUnZScpLAogICAgKDB4MjE0OCwgJ00nLCB1J2knKSwKICAgICgweDIxNDksICdNJywgdSdqJyksCiAgICAoMHgyMTRBLCAnVicpLAogICAgKDB4MjE1MCwgJ00nLCB1JzHigYQ3JyksCiAgICAoMHgyMTUxLCAnTScsIHUnMeKBhDknKSwKICAgICgweDIxNTIsICdNJywgdScx4oGEMTAnKSwKICAgICgweDIxNTMsICdNJywgdScx4oGEMycpLAogICAgKDB4MjE1NCwgJ00nLCB1JzLigYQzJyksCiAgICAoMHgyMTU1LCAnTScsIHUnMeKBhDUnKSwKICAgICgweDIxNTYsICdNJywgdScy4oGENScpLAogICAgKDB4MjE1NywgJ00nLCB1JzPigYQ1JyksCiAgICAoMHgyMTU4LCAnTScsIHUnNOKBhDUnKSwKICAgICgweDIxNTksICdNJywgdScx4oGENicpLAogICAgKDB4MjE1QSwgJ00nLCB1JzXigYQ2JyksCiAgICAoMHgyMTVCLCAnTScsIHUnMeKBhDgnKSwKICAgICgweDIxNUMsICdNJywgdScz4oGEOCcpLAogICAgKDB4MjE1RCwgJ00nLCB1JzXigYQ4JyksCiAgICAoMHgyMTVFLCAnTScsIHUnN+KBhDgnKSwKICAgICgweDIxNUYsICdNJywgdScx4oGEJyksCiAgICAoMHgyMTYwLCAnTScsIHUnaScpLAogICAgKDB4MjE2MSwgJ00nLCB1J2lpJyksCiAgICAoMHgyMTYyLCAnTScsIHUnaWlpJyksCiAgICAoMHgyMTYzLCAnTScsIHUnaXYnKSwKICAgICgweDIxNjQsICdNJywgdSd2JyksCiAgICAoMHgyMTY1LCAnTScsIHUndmknKSwKICAgICgweDIxNjYsICdNJywgdSd2aWknKSwKICAgICgweDIxNjcsICdNJywgdSd2aWlpJyksCiAgICAoMHgyMTY4LCAnTScsIHUnaXgnKSwKICAgICgweDIxNjksICdNJywgdSd4JyksCiAgICAoMHgyMTZBLCAnTScsIHUneGknKSwKICAgICgweDIxNkIsICdNJywgdSd4aWknKSwKICAgICgweDIxNkMsICdNJywgdSdsJyksCiAgICAoMHgyMTZELCAnTScsIHUnYycpLAogICAgKDB4MjE2RSwgJ00nLCB1J2QnKSwKICAgICgweDIxNkYsICdNJywgdSdtJyksCiAgICAoMHgyMTcwLCAnTScsIHUnaScpLAogICAgKDB4MjE3MSwgJ00nLCB1J2lpJyksCiAgICAoMHgyMTcyLCAnTScsIHUnaWlpJyksCiAgICAoMHgyMTczLCAnTScsIHUnaXYnKSwKICAgICgweDIxNzQsICdNJywgdSd2JyksCiAgICAoMHgyMTc1LCAnTScsIHUndmknKSwKICAgICgweDIxNzYsICdNJywgdSd2aWknKSwKICAgICgweDIxNzcsICdNJywgdSd2aWlpJyksCiAgICAoMHgyMTc4LCAnTScsIHUnaXgnKSwKICAgICgweDIxNzksICdNJywgdSd4JyksCiAgICAoMHgyMTdBLCAnTScsIHUneGknKSwKICAgICgweDIxN0IsICdNJywgdSd4aWknKSwKICAgICgweDIxN0MsICdNJywgdSdsJyksCiAgICAoMHgyMTdELCAnTScsIHUnYycpLAogICAgKDB4MjE3RSwgJ00nLCB1J2QnKSwKICAgICgweDIxN0YsICdNJywgdSdtJyksCiAgICAoMHgyMTgwLCAnVicpLAogICAgKDB4MjE4MywgJ1gnKSwKICAgICgweDIxODQsICdWJyksCiAgICAoMHgyMTg5LCAnTScsIHUnMOKBhDMnKSwKICAgICgweDIxOEEsICdYJyksCiAgICAoMHgyMTkwLCAnVicpLAogICAgKDB4MjIyQywgJ00nLCB1J+KIq+KIqycpLAogICAgKDB4MjIyRCwgJ00nLCB1J+KIq+KIq+KIqycpLAogICAgKDB4MjIyRSwgJ1YnKSwKICAgICgweDIyMkYsICdNJywgdSfiiK7iiK4nKSwKICAgICgweDIyMzAsICdNJywgdSfiiK7iiK7iiK4nKSwKICAgICgweDIyMzEsICdWJyksCiAgICAoMHgyMjYwLCAnMycpLAogICAgKDB4MjI2MSwgJ1YnKSwKICAgICgweDIyNkUsICczJyksCiAgICAoMHgyMjcwLCAnVicpLAogICAgKDB4MjMyOSwgJ00nLCB1J+OAiCcpLAogICAgKDB4MjMyQSwgJ00nLCB1J+OAiScpLAogICAgKDB4MjMyQiwgJ1YnKSwKICAgICgweDIzRjQsICdYJyksCiAgICAoMHgyNDAwLCAnVicpLAogICAgKDB4MjQyNywgJ1gnKSwKICAgICgweDI0NDAsICdWJyksCiAgICAoMHgyNDRCLCAnWCcpLAogICAgKDB4MjQ2MCwgJ00nLCB1JzEnKSwKICAgICgweDI0NjEsICdNJywgdScyJyksCiAgICAoMHgyNDYyLCAnTScsIHUnMycpLAogICAgKDB4MjQ2MywgJ00nLCB1JzQnKSwKICAgICgweDI0NjQsICdNJywgdSc1JyksCiAgICAoMHgyNDY1LCAnTScsIHUnNicpLAogICAgKDB4MjQ2NiwgJ00nLCB1JzcnKSwKICAgICgweDI0NjcsICdNJywgdSc4JyksCiAgICAoMHgyNDY4LCAnTScsIHUnOScpLAogICAgKDB4MjQ2OSwgJ00nLCB1JzEwJyksCiAgICAoMHgyNDZBLCAnTScsIHUnMTEnKSwKICAgICgweDI0NkIsICdNJywgdScxMicpLAogICAgXQoKZGVmIF9zZWdfMjMoKToKICAgIHJldHVybiBbCiAgICAoMHgyNDZDLCAnTScsIHUnMTMnKSwKICAgICgweDI0NkQsICdNJywgdScxNCcpLAogICAgKDB4MjQ2RSwgJ00nLCB1JzE1JyksCiAgICAoMHgyNDZGLCAnTScsIHUnMTYnKSwKICAgICgweDI0NzAsICdNJywgdScxNycpLAogICAgKDB4MjQ3MSwgJ00nLCB1JzE4JyksCiAgICAoMHgyNDcyLCAnTScsIHUnMTknKSwKICAgICgweDI0NzMsICdNJywgdScyMCcpLAogICAgKDB4MjQ3NCwgJzMnLCB1JygxKScpLAogICAgKDB4MjQ3NSwgJzMnLCB1JygyKScpLAogICAgKDB4MjQ3NiwgJzMnLCB1JygzKScpLAogICAgKDB4MjQ3NywgJzMnLCB1Jyg0KScpLAogICAgKDB4MjQ3OCwgJzMnLCB1Jyg1KScpLAogICAgKDB4MjQ3OSwgJzMnLCB1Jyg2KScpLAogICAgKDB4MjQ3QSwgJzMnLCB1Jyg3KScpLAogICAgKDB4MjQ3QiwgJzMnLCB1Jyg4KScpLAogICAgKDB4MjQ3QywgJzMnLCB1Jyg5KScpLAogICAgKDB4MjQ3RCwgJzMnLCB1JygxMCknKSwKICAgICgweDI0N0UsICczJywgdScoMTEpJyksCiAgICAoMHgyNDdGLCAnMycsIHUnKDEyKScpLAogICAgKDB4MjQ4MCwgJzMnLCB1JygxMyknKSwKICAgICgweDI0ODEsICczJywgdScoMTQpJyksCiAgICAoMHgyNDgyLCAnMycsIHUnKDE1KScpLAogICAgKDB4MjQ4MywgJzMnLCB1JygxNiknKSwKICAgICgweDI0ODQsICczJywgdScoMTcpJyksCiAgICAoMHgyNDg1LCAnMycsIHUnKDE4KScpLAogICAgKDB4MjQ4NiwgJzMnLCB1JygxOSknKSwKICAgICgweDI0ODcsICczJywgdScoMjApJyksCiAgICAoMHgyNDg4LCAnWCcpLAogICAgKDB4MjQ5QywgJzMnLCB1JyhhKScpLAogICAgKDB4MjQ5RCwgJzMnLCB1JyhiKScpLAogICAgKDB4MjQ5RSwgJzMnLCB1JyhjKScpLAogICAgKDB4MjQ5RiwgJzMnLCB1JyhkKScpLAogICAgKDB4MjRBMCwgJzMnLCB1JyhlKScpLAogICAgKDB4MjRBMSwgJzMnLCB1JyhmKScpLAogICAgKDB4MjRBMiwgJzMnLCB1JyhnKScpLAogICAgKDB4MjRBMywgJzMnLCB1JyhoKScpLAogICAgKDB4MjRBNCwgJzMnLCB1JyhpKScpLAogICAgKDB4MjRBNSwgJzMnLCB1JyhqKScpLAogICAgKDB4MjRBNiwgJzMnLCB1JyhrKScpLAogICAgKDB4MjRBNywgJzMnLCB1JyhsKScpLAogICAgKDB4MjRBOCwgJzMnLCB1JyhtKScpLAogICAgKDB4MjRBOSwgJzMnLCB1JyhuKScpLAogICAgKDB4MjRBQSwgJzMnLCB1JyhvKScpLAogICAgKDB4MjRBQiwgJzMnLCB1JyhwKScpLAogICAgKDB4MjRBQywgJzMnLCB1JyhxKScpLAogICAgKDB4MjRBRCwgJzMnLCB1JyhyKScpLAogICAgKDB4MjRBRSwgJzMnLCB1JyhzKScpLAogICAgKDB4MjRBRiwgJzMnLCB1Jyh0KScpLAogICAgKDB4MjRCMCwgJzMnLCB1Jyh1KScpLAogICAgKDB4MjRCMSwgJzMnLCB1Jyh2KScpLAogICAgKDB4MjRCMiwgJzMnLCB1Jyh3KScpLAogICAgKDB4MjRCMywgJzMnLCB1Jyh4KScpLAogICAgKDB4MjRCNCwgJzMnLCB1Jyh5KScpLAogICAgKDB4MjRCNSwgJzMnLCB1Jyh6KScpLAogICAgKDB4MjRCNiwgJ00nLCB1J2EnKSwKICAgICgweDI0QjcsICdNJywgdSdiJyksCiAgICAoMHgyNEI4LCAnTScsIHUnYycpLAogICAgKDB4MjRCOSwgJ00nLCB1J2QnKSwKICAgICgweDI0QkEsICdNJywgdSdlJyksCiAgICAoMHgyNEJCLCAnTScsIHUnZicpLAogICAgKDB4MjRCQywgJ00nLCB1J2cnKSwKICAgICgweDI0QkQsICdNJywgdSdoJyksCiAgICAoMHgyNEJFLCAnTScsIHUnaScpLAogICAgKDB4MjRCRiwgJ00nLCB1J2onKSwKICAgICgweDI0QzAsICdNJywgdSdrJyksCiAgICAoMHgyNEMxLCAnTScsIHUnbCcpLAogICAgKDB4MjRDMiwgJ00nLCB1J20nKSwKICAgICgweDI0QzMsICdNJywgdSduJyksCiAgICAoMHgyNEM0LCAnTScsIHUnbycpLAogICAgKDB4MjRDNSwgJ00nLCB1J3AnKSwKICAgICgweDI0QzYsICdNJywgdSdxJyksCiAgICAoMHgyNEM3LCAnTScsIHUncicpLAogICAgKDB4MjRDOCwgJ00nLCB1J3MnKSwKICAgICgweDI0QzksICdNJywgdSd0JyksCiAgICAoMHgyNENBLCAnTScsIHUndScpLAogICAgKDB4MjRDQiwgJ00nLCB1J3YnKSwKICAgICgweDI0Q0MsICdNJywgdSd3JyksCiAgICAoMHgyNENELCAnTScsIHUneCcpLAogICAgKDB4MjRDRSwgJ00nLCB1J3knKSwKICAgICgweDI0Q0YsICdNJywgdSd6JyksCiAgICAoMHgyNEQwLCAnTScsIHUnYScpLAogICAgKDB4MjREMSwgJ00nLCB1J2InKSwKICAgICgweDI0RDIsICdNJywgdSdjJyksCiAgICAoMHgyNEQzLCAnTScsIHUnZCcpLAogICAgKDB4MjRENCwgJ00nLCB1J2UnKSwKICAgICgweDI0RDUsICdNJywgdSdmJyksCiAgICAoMHgyNEQ2LCAnTScsIHUnZycpLAogICAgKDB4MjRENywgJ00nLCB1J2gnKSwKICAgICgweDI0RDgsICdNJywgdSdpJyksCiAgICAoMHgyNEQ5LCAnTScsIHUnaicpLAogICAgKDB4MjREQSwgJ00nLCB1J2snKSwKICAgICgweDI0REIsICdNJywgdSdsJyksCiAgICAoMHgyNERDLCAnTScsIHUnbScpLAogICAgKDB4MjRERCwgJ00nLCB1J24nKSwKICAgICgweDI0REUsICdNJywgdSdvJyksCiAgICAoMHgyNERGLCAnTScsIHUncCcpLAogICAgKDB4MjRFMCwgJ00nLCB1J3EnKSwKICAgICgweDI0RTEsICdNJywgdSdyJyksCiAgICAoMHgyNEUyLCAnTScsIHUncycpLAogICAgXQoKZGVmIF9zZWdfMjQoKToKICAgIHJldHVybiBbCiAgICAoMHgyNEUzLCAnTScsIHUndCcpLAogICAgKDB4MjRFNCwgJ00nLCB1J3UnKSwKICAgICgweDI0RTUsICdNJywgdSd2JyksCiAgICAoMHgyNEU2LCAnTScsIHUndycpLAogICAgKDB4MjRFNywgJ00nLCB1J3gnKSwKICAgICgweDI0RTgsICdNJywgdSd5JyksCiAgICAoMHgyNEU5LCAnTScsIHUneicpLAogICAgKDB4MjRFQSwgJ00nLCB1JzAnKSwKICAgICgweDI0RUIsICdWJyksCiAgICAoMHgyNzAwLCAnWCcpLAogICAgKDB4MjcwMSwgJ1YnKSwKICAgICgweDJBMEMsICdNJywgdSfiiKviiKviiKviiKsnKSwKICAgICgweDJBMEQsICdWJyksCiAgICAoMHgyQTc0LCAnMycsIHUnOjo9JyksCiAgICAoMHgyQTc1LCAnMycsIHUnPT0nKSwKICAgICgweDJBNzYsICczJywgdSc9PT0nKSwKICAgICgweDJBNzcsICdWJyksCiAgICAoMHgyQURDLCAnTScsIHUn4qudzLgnKSwKICAgICgweDJBREQsICdWJyksCiAgICAoMHgyQjRELCAnWCcpLAogICAgKDB4MkI1MCwgJ1YnKSwKICAgICgweDJCNUEsICdYJyksCiAgICAoMHgyQzAwLCAnTScsIHUn4rCwJyksCiAgICAoMHgyQzAxLCAnTScsIHUn4rCxJyksCiAgICAoMHgyQzAyLCAnTScsIHUn4rCyJyksCiAgICAoMHgyQzAzLCAnTScsIHUn4rCzJyksCiAgICAoMHgyQzA0LCAnTScsIHUn4rC0JyksCiAgICAoMHgyQzA1LCAnTScsIHUn4rC1JyksCiAgICAoMHgyQzA2LCAnTScsIHUn4rC2JyksCiAgICAoMHgyQzA3LCAnTScsIHUn4rC3JyksCiAgICAoMHgyQzA4LCAnTScsIHUn4rC4JyksCiAgICAoMHgyQzA5LCAnTScsIHUn4rC5JyksCiAgICAoMHgyQzBBLCAnTScsIHUn4rC6JyksCiAgICAoMHgyQzBCLCAnTScsIHUn4rC7JyksCiAgICAoMHgyQzBDLCAnTScsIHUn4rC8JyksCiAgICAoMHgyQzBELCAnTScsIHUn4rC9JyksCiAgICAoMHgyQzBFLCAnTScsIHUn4rC+JyksCiAgICAoMHgyQzBGLCAnTScsIHUn4rC/JyksCiAgICAoMHgyQzEwLCAnTScsIHUn4rGAJyksCiAgICAoMHgyQzExLCAnTScsIHUn4rGBJyksCiAgICAoMHgyQzEyLCAnTScsIHUn4rGCJyksCiAgICAoMHgyQzEzLCAnTScsIHUn4rGDJyksCiAgICAoMHgyQzE0LCAnTScsIHUn4rGEJyksCiAgICAoMHgyQzE1LCAnTScsIHUn4rGFJyksCiAgICAoMHgyQzE2LCAnTScsIHUn4rGGJyksCiAgICAoMHgyQzE3LCAnTScsIHUn4rGHJyksCiAgICAoMHgyQzE4LCAnTScsIHUn4rGIJyksCiAgICAoMHgyQzE5LCAnTScsIHUn4rGJJyksCiAgICAoMHgyQzFBLCAnTScsIHUn4rGKJyksCiAgICAoMHgyQzFCLCAnTScsIHUn4rGLJyksCiAgICAoMHgyQzFDLCAnTScsIHUn4rGMJyksCiAgICAoMHgyQzFELCAnTScsIHUn4rGNJyksCiAgICAoMHgyQzFFLCAnTScsIHUn4rGOJyksCiAgICAoMHgyQzFGLCAnTScsIHUn4rGPJyksCiAgICAoMHgyQzIwLCAnTScsIHUn4rGQJyksCiAgICAoMHgyQzIxLCAnTScsIHUn4rGRJyksCiAgICAoMHgyQzIyLCAnTScsIHUn4rGSJyksCiAgICAoMHgyQzIzLCAnTScsIHUn4rGTJyksCiAgICAoMHgyQzI0LCAnTScsIHUn4rGUJyksCiAgICAoMHgyQzI1LCAnTScsIHUn4rGVJyksCiAgICAoMHgyQzI2LCAnTScsIHUn4rGWJyksCiAgICAoMHgyQzI3LCAnTScsIHUn4rGXJyksCiAgICAoMHgyQzI4LCAnTScsIHUn4rGYJyksCiAgICAoMHgyQzI5LCAnTScsIHUn4rGZJyksCiAgICAoMHgyQzJBLCAnTScsIHUn4rGaJyksCiAgICAoMHgyQzJCLCAnTScsIHUn4rGbJyksCiAgICAoMHgyQzJDLCAnTScsIHUn4rGcJyksCiAgICAoMHgyQzJELCAnTScsIHUn4rGdJyksCiAgICAoMHgyQzJFLCAnTScsIHUn4rGeJyksCiAgICAoMHgyQzJGLCAnWCcpLAogICAgKDB4MkMzMCwgJ1YnKSwKICAgICgweDJDNUYsICdYJyksCiAgICAoMHgyQzYwLCAnTScsIHUn4rGhJyksCiAgICAoMHgyQzYxLCAnVicpLAogICAgKDB4MkM2MiwgJ00nLCB1J8mrJyksCiAgICAoMHgyQzYzLCAnTScsIHUn4bW9JyksCiAgICAoMHgyQzY0LCAnTScsIHUnyb0nKSwKICAgICgweDJDNjUsICdWJyksCiAgICAoMHgyQzY3LCAnTScsIHUn4rGoJyksCiAgICAoMHgyQzY4LCAnVicpLAogICAgKDB4MkM2OSwgJ00nLCB1J+KxqicpLAogICAgKDB4MkM2QSwgJ1YnKSwKICAgICgweDJDNkIsICdNJywgdSfisawnKSwKICAgICgweDJDNkMsICdWJyksCiAgICAoMHgyQzZELCAnTScsIHUnyZEnKSwKICAgICgweDJDNkUsICdNJywgdSfJsScpLAogICAgKDB4MkM2RiwgJ00nLCB1J8mQJyksCiAgICAoMHgyQzcwLCAnTScsIHUnyZInKSwKICAgICgweDJDNzEsICdWJyksCiAgICAoMHgyQzcyLCAnTScsIHUn4rGzJyksCiAgICAoMHgyQzczLCAnVicpLAogICAgKDB4MkM3NSwgJ00nLCB1J+KxticpLAogICAgKDB4MkM3NiwgJ1YnKSwKICAgICgweDJDN0MsICdNJywgdSdqJyksCiAgICAoMHgyQzdELCAnTScsIHUndicpLAogICAgKDB4MkM3RSwgJ00nLCB1J8i/JyksCiAgICAoMHgyQzdGLCAnTScsIHUnyYAnKSwKICAgICgweDJDODAsICdNJywgdSfisoEnKSwKICAgICgweDJDODEsICdWJyksCiAgICAoMHgyQzgyLCAnTScsIHUn4rKDJyksCiAgICBdCgpkZWYgX3NlZ18yNSgpOgogICAgcmV0dXJuIFsKICAgICgweDJDODMsICdWJyksCiAgICAoMHgyQzg0LCAnTScsIHUn4rKFJyksCiAgICAoMHgyQzg1LCAnVicpLAogICAgKDB4MkM4NiwgJ00nLCB1J+KyhycpLAogICAgKDB4MkM4NywgJ1YnKSwKICAgICgweDJDODgsICdNJywgdSfisoknKSwKICAgICgweDJDODksICdWJyksCiAgICAoMHgyQzhBLCAnTScsIHUn4rKLJyksCiAgICAoMHgyQzhCLCAnVicpLAogICAgKDB4MkM4QywgJ00nLCB1J+KyjScpLAogICAgKDB4MkM4RCwgJ1YnKSwKICAgICgweDJDOEUsICdNJywgdSfiso8nKSwKICAgICgweDJDOEYsICdWJyksCiAgICAoMHgyQzkwLCAnTScsIHUn4rKRJyksCiAgICAoMHgyQzkxLCAnVicpLAogICAgKDB4MkM5MiwgJ00nLCB1J+KykycpLAogICAgKDB4MkM5MywgJ1YnKSwKICAgICgweDJDOTQsICdNJywgdSfispUnKSwKICAgICgweDJDOTUsICdWJyksCiAgICAoMHgyQzk2LCAnTScsIHUn4rKXJyksCiAgICAoMHgyQzk3LCAnVicpLAogICAgKDB4MkM5OCwgJ00nLCB1J+KymScpLAogICAgKDB4MkM5OSwgJ1YnKSwKICAgICgweDJDOUEsICdNJywgdSfispsnKSwKICAgICgweDJDOUIsICdWJyksCiAgICAoMHgyQzlDLCAnTScsIHUn4rKdJyksCiAgICAoMHgyQzlELCAnVicpLAogICAgKDB4MkM5RSwgJ00nLCB1J+KynycpLAogICAgKDB4MkM5RiwgJ1YnKSwKICAgICgweDJDQTAsICdNJywgdSfisqEnKSwKICAgICgweDJDQTEsICdWJyksCiAgICAoMHgyQ0EyLCAnTScsIHUn4rKjJyksCiAgICAoMHgyQ0EzLCAnVicpLAogICAgKDB4MkNBNCwgJ00nLCB1J+KypScpLAogICAgKDB4MkNBNSwgJ1YnKSwKICAgICgweDJDQTYsICdNJywgdSfisqcnKSwKICAgICgweDJDQTcsICdWJyksCiAgICAoMHgyQ0E4LCAnTScsIHUn4rKpJyksCiAgICAoMHgyQ0E5LCAnVicpLAogICAgKDB4MkNBQSwgJ00nLCB1J+KyqycpLAogICAgKDB4MkNBQiwgJ1YnKSwKICAgICgweDJDQUMsICdNJywgdSfisq0nKSwKICAgICgweDJDQUQsICdWJyksCiAgICAoMHgyQ0FFLCAnTScsIHUn4rKvJyksCiAgICAoMHgyQ0FGLCAnVicpLAogICAgKDB4MkNCMCwgJ00nLCB1J+KysScpLAogICAgKDB4MkNCMSwgJ1YnKSwKICAgICgweDJDQjIsICdNJywgdSfisrMnKSwKICAgICgweDJDQjMsICdWJyksCiAgICAoMHgyQ0I0LCAnTScsIHUn4rK1JyksCiAgICAoMHgyQ0I1LCAnVicpLAogICAgKDB4MkNCNiwgJ00nLCB1J+KytycpLAogICAgKDB4MkNCNywgJ1YnKSwKICAgICgweDJDQjgsICdNJywgdSfisrknKSwKICAgICgweDJDQjksICdWJyksCiAgICAoMHgyQ0JBLCAnTScsIHUn4rK7JyksCiAgICAoMHgyQ0JCLCAnVicpLAogICAgKDB4MkNCQywgJ00nLCB1J+KyvScpLAogICAgKDB4MkNCRCwgJ1YnKSwKICAgICgweDJDQkUsICdNJywgdSfisr8nKSwKICAgICgweDJDQkYsICdWJyksCiAgICAoMHgyQ0MwLCAnTScsIHUn4rOBJyksCiAgICAoMHgyQ0MxLCAnVicpLAogICAgKDB4MkNDMiwgJ00nLCB1J+KzgycpLAogICAgKDB4MkNDMywgJ1YnKSwKICAgICgweDJDQzQsICdNJywgdSfis4UnKSwKICAgICgweDJDQzUsICdWJyksCiAgICAoMHgyQ0M2LCAnTScsIHUn4rOHJyksCiAgICAoMHgyQ0M3LCAnVicpLAogICAgKDB4MkNDOCwgJ00nLCB1J+KziScpLAogICAgKDB4MkNDOSwgJ1YnKSwKICAgICgweDJDQ0EsICdNJywgdSfis4snKSwKICAgICgweDJDQ0IsICdWJyksCiAgICAoMHgyQ0NDLCAnTScsIHUn4rONJyksCiAgICAoMHgyQ0NELCAnVicpLAogICAgKDB4MkNDRSwgJ00nLCB1J+KzjycpLAogICAgKDB4MkNDRiwgJ1YnKSwKICAgICgweDJDRDAsICdNJywgdSfis5EnKSwKICAgICgweDJDRDEsICdWJyksCiAgICAoMHgyQ0QyLCAnTScsIHUn4rOTJyksCiAgICAoMHgyQ0QzLCAnVicpLAogICAgKDB4MkNENCwgJ00nLCB1J+KzlScpLAogICAgKDB4MkNENSwgJ1YnKSwKICAgICgweDJDRDYsICdNJywgdSfis5cnKSwKICAgICgweDJDRDcsICdWJyksCiAgICAoMHgyQ0Q4LCAnTScsIHUn4rOZJyksCiAgICAoMHgyQ0Q5LCAnVicpLAogICAgKDB4MkNEQSwgJ00nLCB1J+KzmycpLAogICAgKDB4MkNEQiwgJ1YnKSwKICAgICgweDJDREMsICdNJywgdSfis50nKSwKICAgICgweDJDREQsICdWJyksCiAgICAoMHgyQ0RFLCAnTScsIHUn4rOfJyksCiAgICAoMHgyQ0RGLCAnVicpLAogICAgKDB4MkNFMCwgJ00nLCB1J+KzoScpLAogICAgKDB4MkNFMSwgJ1YnKSwKICAgICgweDJDRTIsICdNJywgdSfis6MnKSwKICAgICgweDJDRTMsICdWJyksCiAgICAoMHgyQ0VCLCAnTScsIHUn4rOsJyksCiAgICAoMHgyQ0VDLCAnVicpLAogICAgKDB4MkNFRCwgJ00nLCB1J+KzricpLAogICAgXQoKZGVmIF9zZWdfMjYoKToKICAgIHJldHVybiBbCiAgICAoMHgyQ0VFLCAnVicpLAogICAgKDB4MkNGMiwgJ00nLCB1J+KzsycpLAogICAgKDB4MkNGMywgJ1YnKSwKICAgICgweDJDRjQsICdYJyksCiAgICAoMHgyQ0Y5LCAnVicpLAogICAgKDB4MkQyNiwgJ1gnKSwKICAgICgweDJEMjcsICdWJyksCiAgICAoMHgyRDI4LCAnWCcpLAogICAgKDB4MkQyRCwgJ1YnKSwKICAgICgweDJEMkUsICdYJyksCiAgICAoMHgyRDMwLCAnVicpLAogICAgKDB4MkQ2OCwgJ1gnKSwKICAgICgweDJENkYsICdNJywgdSfitaEnKSwKICAgICgweDJENzAsICdWJyksCiAgICAoMHgyRDcxLCAnWCcpLAogICAgKDB4MkQ3RiwgJ1YnKSwKICAgICgweDJEOTcsICdYJyksCiAgICAoMHgyREEwLCAnVicpLAogICAgKDB4MkRBNywgJ1gnKSwKICAgICgweDJEQTgsICdWJyksCiAgICAoMHgyREFGLCAnWCcpLAogICAgKDB4MkRCMCwgJ1YnKSwKICAgICgweDJEQjcsICdYJyksCiAgICAoMHgyREI4LCAnVicpLAogICAgKDB4MkRCRiwgJ1gnKSwKICAgICgweDJEQzAsICdWJyksCiAgICAoMHgyREM3LCAnWCcpLAogICAgKDB4MkRDOCwgJ1YnKSwKICAgICgweDJEQ0YsICdYJyksCiAgICAoMHgyREQwLCAnVicpLAogICAgKDB4MkRENywgJ1gnKSwKICAgICgweDJERDgsICdWJyksCiAgICAoMHgyRERGLCAnWCcpLAogICAgKDB4MkRFMCwgJ1YnKSwKICAgICgweDJFM0MsICdYJyksCiAgICAoMHgyRTgwLCAnVicpLAogICAgKDB4MkU5QSwgJ1gnKSwKICAgICgweDJFOUIsICdWJyksCiAgICAoMHgyRTlGLCAnTScsIHUn5q+NJyksCiAgICAoMHgyRUEwLCAnVicpLAogICAgKDB4MkVGMywgJ00nLCB1J+m+nycpLAogICAgKDB4MkVGNCwgJ1gnKSwKICAgICgweDJGMDAsICdNJywgdSfkuIAnKSwKICAgICgweDJGMDEsICdNJywgdSfkuKgnKSwKICAgICgweDJGMDIsICdNJywgdSfkuLYnKSwKICAgICgweDJGMDMsICdNJywgdSfkuL8nKSwKICAgICgweDJGMDQsICdNJywgdSfkuZknKSwKICAgICgweDJGMDUsICdNJywgdSfkuoUnKSwKICAgICgweDJGMDYsICdNJywgdSfkuownKSwKICAgICgweDJGMDcsICdNJywgdSfkuqAnKSwKICAgICgweDJGMDgsICdNJywgdSfkuronKSwKICAgICgweDJGMDksICdNJywgdSflhL8nKSwKICAgICgweDJGMEEsICdNJywgdSflhaUnKSwKICAgICgweDJGMEIsICdNJywgdSflhasnKSwKICAgICgweDJGMEMsICdNJywgdSflhoInKSwKICAgICgweDJGMEQsICdNJywgdSflhpYnKSwKICAgICgweDJGMEUsICdNJywgdSflhqsnKSwKICAgICgweDJGMEYsICdNJywgdSflh6AnKSwKICAgICgweDJGMTAsICdNJywgdSflh7UnKSwKICAgICgweDJGMTEsICdNJywgdSfliIAnKSwKICAgICgweDJGMTIsICdNJywgdSflipsnKSwKICAgICgweDJGMTMsICdNJywgdSfli7knKSwKICAgICgweDJGMTQsICdNJywgdSfljJUnKSwKICAgICgweDJGMTUsICdNJywgdSfljJonKSwKICAgICgweDJGMTYsICdNJywgdSfljLgnKSwKICAgICgweDJGMTcsICdNJywgdSfljYEnKSwKICAgICgweDJGMTgsICdNJywgdSfljZwnKSwKICAgICgweDJGMTksICdNJywgdSfljaknKSwKICAgICgweDJGMUEsICdNJywgdSfljoInKSwKICAgICgweDJGMUIsICdNJywgdSfljrYnKSwKICAgICgweDJGMUMsICdNJywgdSflj4gnKSwKICAgICgweDJGMUQsICdNJywgdSflj6MnKSwKICAgICgweDJGMUUsICdNJywgdSflm5cnKSwKICAgICgweDJGMUYsICdNJywgdSflnJ8nKSwKICAgICgweDJGMjAsICdNJywgdSflo6snKSwKICAgICgweDJGMjEsICdNJywgdSflpIInKSwKICAgICgweDJGMjIsICdNJywgdSflpIonKSwKICAgICgweDJGMjMsICdNJywgdSflpJUnKSwKICAgICgweDJGMjQsICdNJywgdSflpKcnKSwKICAgICgweDJGMjUsICdNJywgdSflpbMnKSwKICAgICgweDJGMjYsICdNJywgdSflrZAnKSwKICAgICgweDJGMjcsICdNJywgdSflroAnKSwKICAgICgweDJGMjgsICdNJywgdSflr7gnKSwKICAgICgweDJGMjksICdNJywgdSflsI8nKSwKICAgICgweDJGMkEsICdNJywgdSflsKInKSwKICAgICgweDJGMkIsICdNJywgdSflsLgnKSwKICAgICgweDJGMkMsICdNJywgdSflsa4nKSwKICAgICgweDJGMkQsICdNJywgdSflsbEnKSwKICAgICgweDJGMkUsICdNJywgdSflt5snKSwKICAgICgweDJGMkYsICdNJywgdSflt6UnKSwKICAgICgweDJGMzAsICdNJywgdSflt7EnKSwKICAgICgweDJGMzEsICdNJywgdSflt74nKSwKICAgICgweDJGMzIsICdNJywgdSflubInKSwKICAgICgweDJGMzMsICdNJywgdSflubonKSwKICAgICgweDJGMzQsICdNJywgdSflub8nKSwKICAgICgweDJGMzUsICdNJywgdSflu7QnKSwKICAgICgweDJGMzYsICdNJywgdSflu74nKSwKICAgICgweDJGMzcsICdNJywgdSflvIsnKSwKICAgICgweDJGMzgsICdNJywgdSflvJMnKSwKICAgICgweDJGMzksICdNJywgdSflvZAnKSwKICAgIF0KCmRlZiBfc2VnXzI3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkYzQSwgJ00nLCB1J+W9oScpLAogICAgKDB4MkYzQiwgJ00nLCB1J+W9sycpLAogICAgKDB4MkYzQywgJ00nLCB1J+W/gycpLAogICAgKDB4MkYzRCwgJ00nLCB1J+aIiCcpLAogICAgKDB4MkYzRSwgJ00nLCB1J+aIticpLAogICAgKDB4MkYzRiwgJ00nLCB1J+aJiycpLAogICAgKDB4MkY0MCwgJ00nLCB1J+aUrycpLAogICAgKDB4MkY0MSwgJ00nLCB1J+aUtCcpLAogICAgKDB4MkY0MiwgJ00nLCB1J+aWhycpLAogICAgKDB4MkY0MywgJ00nLCB1J+aWlycpLAogICAgKDB4MkY0NCwgJ00nLCB1J+aWpCcpLAogICAgKDB4MkY0NSwgJ00nLCB1J+aWuScpLAogICAgKDB4MkY0NiwgJ00nLCB1J+aXoCcpLAogICAgKDB4MkY0NywgJ00nLCB1J+aXpScpLAogICAgKDB4MkY0OCwgJ00nLCB1J+absCcpLAogICAgKDB4MkY0OSwgJ00nLCB1J+aciCcpLAogICAgKDB4MkY0QSwgJ00nLCB1J+acqCcpLAogICAgKDB4MkY0QiwgJ00nLCB1J+asoCcpLAogICAgKDB4MkY0QywgJ00nLCB1J+atoicpLAogICAgKDB4MkY0RCwgJ00nLCB1J+atuScpLAogICAgKDB4MkY0RSwgJ00nLCB1J+ausycpLAogICAgKDB4MkY0RiwgJ00nLCB1J+aviycpLAogICAgKDB4MkY1MCwgJ00nLCB1J+avlCcpLAogICAgKDB4MkY1MSwgJ00nLCB1J+avmycpLAogICAgKDB4MkY1MiwgJ00nLCB1J+awjycpLAogICAgKDB4MkY1MywgJ00nLCB1J+awlCcpLAogICAgKDB4MkY1NCwgJ00nLCB1J+awtCcpLAogICAgKDB4MkY1NSwgJ00nLCB1J+eBqycpLAogICAgKDB4MkY1NiwgJ00nLCB1J+eIqicpLAogICAgKDB4MkY1NywgJ00nLCB1J+eIticpLAogICAgKDB4MkY1OCwgJ00nLCB1J+eIuycpLAogICAgKDB4MkY1OSwgJ00nLCB1J+eIvycpLAogICAgKDB4MkY1QSwgJ00nLCB1J+eJhycpLAogICAgKDB4MkY1QiwgJ00nLCB1J+eJmScpLAogICAgKDB4MkY1QywgJ00nLCB1J+eJmycpLAogICAgKDB4MkY1RCwgJ00nLCB1J+eKrCcpLAogICAgKDB4MkY1RSwgJ00nLCB1J+eOhCcpLAogICAgKDB4MkY1RiwgJ00nLCB1J+eOiScpLAogICAgKDB4MkY2MCwgJ00nLCB1J+eTnCcpLAogICAgKDB4MkY2MSwgJ00nLCB1J+eTpicpLAogICAgKDB4MkY2MiwgJ00nLCB1J+eUmCcpLAogICAgKDB4MkY2MywgJ00nLCB1J+eUnycpLAogICAgKDB4MkY2NCwgJ00nLCB1J+eUqCcpLAogICAgKDB4MkY2NSwgJ00nLCB1J+eUsCcpLAogICAgKDB4MkY2NiwgJ00nLCB1J+eWiycpLAogICAgKDB4MkY2NywgJ00nLCB1J+eWkicpLAogICAgKDB4MkY2OCwgJ00nLCB1J+eZticpLAogICAgKDB4MkY2OSwgJ00nLCB1J+eZvScpLAogICAgKDB4MkY2QSwgJ00nLCB1J+earicpLAogICAgKDB4MkY2QiwgJ00nLCB1J+eavycpLAogICAgKDB4MkY2QywgJ00nLCB1J+ebricpLAogICAgKDB4MkY2RCwgJ00nLCB1J+efmycpLAogICAgKDB4MkY2RSwgJ00nLCB1J+efoicpLAogICAgKDB4MkY2RiwgJ00nLCB1J+efsycpLAogICAgKDB4MkY3MCwgJ00nLCB1J+ekuicpLAogICAgKDB4MkY3MSwgJ00nLCB1J+emuCcpLAogICAgKDB4MkY3MiwgJ00nLCB1J+emvicpLAogICAgKDB4MkY3MywgJ00nLCB1J+eptCcpLAogICAgKDB4MkY3NCwgJ00nLCB1J+eriycpLAogICAgKDB4MkY3NSwgJ00nLCB1J+eruScpLAogICAgKDB4MkY3NiwgJ00nLCB1J+exsycpLAogICAgKDB4MkY3NywgJ00nLCB1J+ezuCcpLAogICAgKDB4MkY3OCwgJ00nLCB1J+e8ticpLAogICAgKDB4MkY3OSwgJ00nLCB1J+e9kScpLAogICAgKDB4MkY3QSwgJ00nLCB1J+e+iicpLAogICAgKDB4MkY3QiwgJ00nLCB1J+e+vScpLAogICAgKDB4MkY3QywgJ00nLCB1J+iAgScpLAogICAgKDB4MkY3RCwgJ00nLCB1J+iAjCcpLAogICAgKDB4MkY3RSwgJ00nLCB1J+iAkicpLAogICAgKDB4MkY3RiwgJ00nLCB1J+iAsycpLAogICAgKDB4MkY4MCwgJ00nLCB1J+iBvycpLAogICAgKDB4MkY4MSwgJ00nLCB1J+iCiScpLAogICAgKDB4MkY4MiwgJ00nLCB1J+iHoycpLAogICAgKDB4MkY4MywgJ00nLCB1J+iHqicpLAogICAgKDB4MkY4NCwgJ00nLCB1J+iHsycpLAogICAgKDB4MkY4NSwgJ00nLCB1J+iHvCcpLAogICAgKDB4MkY4NiwgJ00nLCB1J+iIjCcpLAogICAgKDB4MkY4NywgJ00nLCB1J+iImycpLAogICAgKDB4MkY4OCwgJ00nLCB1J+iInycpLAogICAgKDB4MkY4OSwgJ00nLCB1J+iJricpLAogICAgKDB4MkY4QSwgJ00nLCB1J+iJsicpLAogICAgKDB4MkY4QiwgJ00nLCB1J+iJuCcpLAogICAgKDB4MkY4QywgJ00nLCB1J+iZjScpLAogICAgKDB4MkY4RCwgJ00nLCB1J+iZqycpLAogICAgKDB4MkY4RSwgJ00nLCB1J+ihgCcpLAogICAgKDB4MkY4RiwgJ00nLCB1J+ihjCcpLAogICAgKDB4MkY5MCwgJ00nLCB1J+ihoycpLAogICAgKDB4MkY5MSwgJ00nLCB1J+ilvicpLAogICAgKDB4MkY5MiwgJ00nLCB1J+imiycpLAogICAgKDB4MkY5MywgJ00nLCB1J+inkicpLAogICAgKDB4MkY5NCwgJ00nLCB1J+iogCcpLAogICAgKDB4MkY5NSwgJ00nLCB1J+iwtycpLAogICAgKDB4MkY5NiwgJ00nLCB1J+ixhicpLAogICAgKDB4MkY5NywgJ00nLCB1J+ixlScpLAogICAgKDB4MkY5OCwgJ00nLCB1J+ixuCcpLAogICAgKDB4MkY5OSwgJ00nLCB1J+iynScpLAogICAgKDB4MkY5QSwgJ00nLCB1J+i1pCcpLAogICAgKDB4MkY5QiwgJ00nLCB1J+i1sCcpLAogICAgKDB4MkY5QywgJ00nLCB1J+i2sycpLAogICAgKDB4MkY5RCwgJ00nLCB1J+i6qycpLAogICAgXQoKZGVmIF9zZWdfMjgoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjlFLCAnTScsIHUn6LuKJyksCiAgICAoMHgyRjlGLCAnTScsIHUn6L6bJyksCiAgICAoMHgyRkEwLCAnTScsIHUn6L6wJyksCiAgICAoMHgyRkExLCAnTScsIHUn6L61JyksCiAgICAoMHgyRkEyLCAnTScsIHUn6YKRJyksCiAgICAoMHgyRkEzLCAnTScsIHUn6YWJJyksCiAgICAoMHgyRkE0LCAnTScsIHUn6YeGJyksCiAgICAoMHgyRkE1LCAnTScsIHUn6YeMJyksCiAgICAoMHgyRkE2LCAnTScsIHUn6YeRJyksCiAgICAoMHgyRkE3LCAnTScsIHUn6ZW3JyksCiAgICAoMHgyRkE4LCAnTScsIHUn6ZaAJyksCiAgICAoMHgyRkE5LCAnTScsIHUn6ZicJyksCiAgICAoMHgyRkFBLCAnTScsIHUn6Zq2JyksCiAgICAoMHgyRkFCLCAnTScsIHUn6Zq5JyksCiAgICAoMHgyRkFDLCAnTScsIHUn6ZuoJyksCiAgICAoMHgyRkFELCAnTScsIHUn6Z2RJyksCiAgICAoMHgyRkFFLCAnTScsIHUn6Z2eJyksCiAgICAoMHgyRkFGLCAnTScsIHUn6Z2iJyksCiAgICAoMHgyRkIwLCAnTScsIHUn6Z2pJyksCiAgICAoMHgyRkIxLCAnTScsIHUn6Z+LJyksCiAgICAoMHgyRkIyLCAnTScsIHUn6Z+tJyksCiAgICAoMHgyRkIzLCAnTScsIHUn6Z+zJyksCiAgICAoMHgyRkI0LCAnTScsIHUn6aCBJyksCiAgICAoMHgyRkI1LCAnTScsIHUn6aKoJyksCiAgICAoMHgyRkI2LCAnTScsIHUn6aObJyksCiAgICAoMHgyRkI3LCAnTScsIHUn6aOfJyksCiAgICAoMHgyRkI4LCAnTScsIHUn6aaWJyksCiAgICAoMHgyRkI5LCAnTScsIHUn6aaZJyksCiAgICAoMHgyRkJBLCAnTScsIHUn6aasJyksCiAgICAoMHgyRkJCLCAnTScsIHUn6aqoJyksCiAgICAoMHgyRkJDLCAnTScsIHUn6auYJyksCiAgICAoMHgyRkJELCAnTScsIHUn6aufJyksCiAgICAoMHgyRkJFLCAnTScsIHUn6aylJyksCiAgICAoMHgyRkJGLCAnTScsIHUn6ayvJyksCiAgICAoMHgyRkMwLCAnTScsIHUn6ayyJyksCiAgICAoMHgyRkMxLCAnTScsIHUn6ay8JyksCiAgICAoMHgyRkMyLCAnTScsIHUn6a2aJyksCiAgICAoMHgyRkMzLCAnTScsIHUn6bOlJyksCiAgICAoMHgyRkM0LCAnTScsIHUn6bm1JyksCiAgICAoMHgyRkM1LCAnTScsIHUn6bm/JyksCiAgICAoMHgyRkM2LCAnTScsIHUn6bqlJyksCiAgICAoMHgyRkM3LCAnTScsIHUn6bq7JyksCiAgICAoMHgyRkM4LCAnTScsIHUn6buDJyksCiAgICAoMHgyRkM5LCAnTScsIHUn6buNJyksCiAgICAoMHgyRkNBLCAnTScsIHUn6buRJyksCiAgICAoMHgyRkNCLCAnTScsIHUn6bu5JyksCiAgICAoMHgyRkNDLCAnTScsIHUn6bu9JyksCiAgICAoMHgyRkNELCAnTScsIHUn6byOJyksCiAgICAoMHgyRkNFLCAnTScsIHUn6byTJyksCiAgICAoMHgyRkNGLCAnTScsIHUn6bygJyksCiAgICAoMHgyRkQwLCAnTScsIHUn6by7JyksCiAgICAoMHgyRkQxLCAnTScsIHUn6b2KJyksCiAgICAoMHgyRkQyLCAnTScsIHUn6b2SJyksCiAgICAoMHgyRkQzLCAnTScsIHUn6b6NJyksCiAgICAoMHgyRkQ0LCAnTScsIHUn6b6cJyksCiAgICAoMHgyRkQ1LCAnTScsIHUn6b6gJyksCiAgICAoMHgyRkQ2LCAnWCcpLAogICAgKDB4MzAwMCwgJzMnLCB1JyAnKSwKICAgICgweDMwMDEsICdWJyksCiAgICAoMHgzMDAyLCAnTScsIHUnLicpLAogICAgKDB4MzAwMywgJ1YnKSwKICAgICgweDMwMzYsICdNJywgdSfjgJInKSwKICAgICgweDMwMzcsICdWJyksCiAgICAoMHgzMDM4LCAnTScsIHUn5Y2BJyksCiAgICAoMHgzMDM5LCAnTScsIHUn5Y2EJyksCiAgICAoMHgzMDNBLCAnTScsIHUn5Y2FJyksCiAgICAoMHgzMDNCLCAnVicpLAogICAgKDB4MzA0MCwgJ1gnKSwKICAgICgweDMwNDEsICdWJyksCiAgICAoMHgzMDk3LCAnWCcpLAogICAgKDB4MzA5OSwgJ1YnKSwKICAgICgweDMwOUIsICczJywgdScg44KZJyksCiAgICAoMHgzMDlDLCAnMycsIHUnIOOCmicpLAogICAgKDB4MzA5RCwgJ1YnKSwKICAgICgweDMwOUYsICdNJywgdSfjgojjgoonKSwKICAgICgweDMwQTAsICdWJyksCiAgICAoMHgzMEZGLCAnTScsIHUn44Kz44OIJyksCiAgICAoMHgzMTAwLCAnWCcpLAogICAgKDB4MzEwNSwgJ1YnKSwKICAgICgweDMxMkUsICdYJyksCiAgICAoMHgzMTMxLCAnTScsIHUn4YSAJyksCiAgICAoMHgzMTMyLCAnTScsIHUn4YSBJyksCiAgICAoMHgzMTMzLCAnTScsIHUn4YaqJyksCiAgICAoMHgzMTM0LCAnTScsIHUn4YSCJyksCiAgICAoMHgzMTM1LCAnTScsIHUn4YasJyksCiAgICAoMHgzMTM2LCAnTScsIHUn4YatJyksCiAgICAoMHgzMTM3LCAnTScsIHUn4YSDJyksCiAgICAoMHgzMTM4LCAnTScsIHUn4YSEJyksCiAgICAoMHgzMTM5LCAnTScsIHUn4YSFJyksCiAgICAoMHgzMTNBLCAnTScsIHUn4YawJyksCiAgICAoMHgzMTNCLCAnTScsIHUn4YaxJyksCiAgICAoMHgzMTNDLCAnTScsIHUn4YayJyksCiAgICAoMHgzMTNELCAnTScsIHUn4YazJyksCiAgICAoMHgzMTNFLCAnTScsIHUn4Ya0JyksCiAgICAoMHgzMTNGLCAnTScsIHUn4Ya1JyksCiAgICAoMHgzMTQwLCAnTScsIHUn4YSaJyksCiAgICAoMHgzMTQxLCAnTScsIHUn4YSGJyksCiAgICAoMHgzMTQyLCAnTScsIHUn4YSHJyksCiAgICAoMHgzMTQzLCAnTScsIHUn4YSIJyksCiAgICAoMHgzMTQ0LCAnTScsIHUn4YShJyksCiAgICBdCgpkZWYgX3NlZ18yOSgpOgogICAgcmV0dXJuIFsKICAgICgweDMxNDUsICdNJywgdSfhhIknKSwKICAgICgweDMxNDYsICdNJywgdSfhhIonKSwKICAgICgweDMxNDcsICdNJywgdSfhhIsnKSwKICAgICgweDMxNDgsICdNJywgdSfhhIwnKSwKICAgICgweDMxNDksICdNJywgdSfhhI0nKSwKICAgICgweDMxNEEsICdNJywgdSfhhI4nKSwKICAgICgweDMxNEIsICdNJywgdSfhhI8nKSwKICAgICgweDMxNEMsICdNJywgdSfhhJAnKSwKICAgICgweDMxNEQsICdNJywgdSfhhJEnKSwKICAgICgweDMxNEUsICdNJywgdSfhhJInKSwKICAgICgweDMxNEYsICdNJywgdSfhhaEnKSwKICAgICgweDMxNTAsICdNJywgdSfhhaInKSwKICAgICgweDMxNTEsICdNJywgdSfhhaMnKSwKICAgICgweDMxNTIsICdNJywgdSfhhaQnKSwKICAgICgweDMxNTMsICdNJywgdSfhhaUnKSwKICAgICgweDMxNTQsICdNJywgdSfhhaYnKSwKICAgICgweDMxNTUsICdNJywgdSfhhacnKSwKICAgICgweDMxNTYsICdNJywgdSfhhagnKSwKICAgICgweDMxNTcsICdNJywgdSfhhaknKSwKICAgICgweDMxNTgsICdNJywgdSfhhaonKSwKICAgICgweDMxNTksICdNJywgdSfhhasnKSwKICAgICgweDMxNUEsICdNJywgdSfhhawnKSwKICAgICgweDMxNUIsICdNJywgdSfhha0nKSwKICAgICgweDMxNUMsICdNJywgdSfhha4nKSwKICAgICgweDMxNUQsICdNJywgdSfhha8nKSwKICAgICgweDMxNUUsICdNJywgdSfhhbAnKSwKICAgICgweDMxNUYsICdNJywgdSfhhbEnKSwKICAgICgweDMxNjAsICdNJywgdSfhhbInKSwKICAgICgweDMxNjEsICdNJywgdSfhhbMnKSwKICAgICgweDMxNjIsICdNJywgdSfhhbQnKSwKICAgICgweDMxNjMsICdNJywgdSfhhbUnKSwKICAgICgweDMxNjQsICdYJyksCiAgICAoMHgzMTY1LCAnTScsIHUn4YSUJyksCiAgICAoMHgzMTY2LCAnTScsIHUn4YSVJyksCiAgICAoMHgzMTY3LCAnTScsIHUn4YeHJyksCiAgICAoMHgzMTY4LCAnTScsIHUn4YeIJyksCiAgICAoMHgzMTY5LCAnTScsIHUn4YeMJyksCiAgICAoMHgzMTZBLCAnTScsIHUn4YeOJyksCiAgICAoMHgzMTZCLCAnTScsIHUn4YeTJyksCiAgICAoMHgzMTZDLCAnTScsIHUn4YeXJyksCiAgICAoMHgzMTZELCAnTScsIHUn4YeZJyksCiAgICAoMHgzMTZFLCAnTScsIHUn4YScJyksCiAgICAoMHgzMTZGLCAnTScsIHUn4YedJyksCiAgICAoMHgzMTcwLCAnTScsIHUn4YefJyksCiAgICAoMHgzMTcxLCAnTScsIHUn4YSdJyksCiAgICAoMHgzMTcyLCAnTScsIHUn4YSeJyksCiAgICAoMHgzMTczLCAnTScsIHUn4YSgJyksCiAgICAoMHgzMTc0LCAnTScsIHUn4YSiJyksCiAgICAoMHgzMTc1LCAnTScsIHUn4YSjJyksCiAgICAoMHgzMTc2LCAnTScsIHUn4YSnJyksCiAgICAoMHgzMTc3LCAnTScsIHUn4YSpJyksCiAgICAoMHgzMTc4LCAnTScsIHUn4YSrJyksCiAgICAoMHgzMTc5LCAnTScsIHUn4YSsJyksCiAgICAoMHgzMTdBLCAnTScsIHUn4YStJyksCiAgICAoMHgzMTdCLCAnTScsIHUn4YSuJyksCiAgICAoMHgzMTdDLCAnTScsIHUn4YSvJyksCiAgICAoMHgzMTdELCAnTScsIHUn4YSyJyksCiAgICAoMHgzMTdFLCAnTScsIHUn4YS2JyksCiAgICAoMHgzMTdGLCAnTScsIHUn4YWAJyksCiAgICAoMHgzMTgwLCAnTScsIHUn4YWHJyksCiAgICAoMHgzMTgxLCAnTScsIHUn4YWMJyksCiAgICAoMHgzMTgyLCAnTScsIHUn4YexJyksCiAgICAoMHgzMTgzLCAnTScsIHUn4YeyJyksCiAgICAoMHgzMTg0LCAnTScsIHUn4YWXJyksCiAgICAoMHgzMTg1LCAnTScsIHUn4YWYJyksCiAgICAoMHgzMTg2LCAnTScsIHUn4YWZJyksCiAgICAoMHgzMTg3LCAnTScsIHUn4YaEJyksCiAgICAoMHgzMTg4LCAnTScsIHUn4YaFJyksCiAgICAoMHgzMTg5LCAnTScsIHUn4YaIJyksCiAgICAoMHgzMThBLCAnTScsIHUn4YaRJyksCiAgICAoMHgzMThCLCAnTScsIHUn4YaSJyksCiAgICAoMHgzMThDLCAnTScsIHUn4YaUJyksCiAgICAoMHgzMThELCAnTScsIHUn4YaeJyksCiAgICAoMHgzMThFLCAnTScsIHUn4YahJyksCiAgICAoMHgzMThGLCAnWCcpLAogICAgKDB4MzE5MCwgJ1YnKSwKICAgICgweDMxOTIsICdNJywgdSfkuIAnKSwKICAgICgweDMxOTMsICdNJywgdSfkuownKSwKICAgICgweDMxOTQsICdNJywgdSfkuIknKSwKICAgICgweDMxOTUsICdNJywgdSflm5snKSwKICAgICgweDMxOTYsICdNJywgdSfkuIonKSwKICAgICgweDMxOTcsICdNJywgdSfkuK0nKSwKICAgICgweDMxOTgsICdNJywgdSfkuIsnKSwKICAgICgweDMxOTksICdNJywgdSfnlLInKSwKICAgICgweDMxOUEsICdNJywgdSfkuZknKSwKICAgICgweDMxOUIsICdNJywgdSfkuJknKSwKICAgICgweDMxOUMsICdNJywgdSfkuIEnKSwKICAgICgweDMxOUQsICdNJywgdSflpKknKSwKICAgICgweDMxOUUsICdNJywgdSflnLAnKSwKICAgICgweDMxOUYsICdNJywgdSfkuronKSwKICAgICgweDMxQTAsICdWJyksCiAgICAoMHgzMUJCLCAnWCcpLAogICAgKDB4MzFDMCwgJ1YnKSwKICAgICgweDMxRTQsICdYJyksCiAgICAoMHgzMUYwLCAnVicpLAogICAgKDB4MzIwMCwgJzMnLCB1JyjhhIApJyksCiAgICAoMHgzMjAxLCAnMycsIHUnKOGEgiknKSwKICAgICgweDMyMDIsICczJywgdSco4YSDKScpLAogICAgKDB4MzIwMywgJzMnLCB1JyjhhIUpJyksCiAgICAoMHgzMjA0LCAnMycsIHUnKOGEhiknKSwKICAgIF0KCmRlZiBfc2VnXzMwKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzIwNSwgJzMnLCB1JyjhhIcpJyksCiAgICAoMHgzMjA2LCAnMycsIHUnKOGEiSknKSwKICAgICgweDMyMDcsICczJywgdSco4YSLKScpLAogICAgKDB4MzIwOCwgJzMnLCB1JyjhhIwpJyksCiAgICAoMHgzMjA5LCAnMycsIHUnKOGEjiknKSwKICAgICgweDMyMEEsICczJywgdSco4YSPKScpLAogICAgKDB4MzIwQiwgJzMnLCB1JyjhhJApJyksCiAgICAoMHgzMjBDLCAnMycsIHUnKOGEkSknKSwKICAgICgweDMyMEQsICczJywgdSco4YSSKScpLAogICAgKDB4MzIwRSwgJzMnLCB1JyjqsIApJyksCiAgICAoMHgzMjBGLCAnMycsIHUnKOuCmCknKSwKICAgICgweDMyMTAsICczJywgdSco64ukKScpLAogICAgKDB4MzIxMSwgJzMnLCB1JyjrnbwpJyksCiAgICAoMHgzMjEyLCAnMycsIHUnKOuniCknKSwKICAgICgweDMyMTMsICczJywgdSco67CUKScpLAogICAgKDB4MzIxNCwgJzMnLCB1JyjsgqwpJyksCiAgICAoMHgzMjE1LCAnMycsIHUnKOyVhCknKSwKICAgICgweDMyMTYsICczJywgdSco7J6QKScpLAogICAgKDB4MzIxNywgJzMnLCB1JyjssKgpJyksCiAgICAoMHgzMjE4LCAnMycsIHUnKOy5tCknKSwKICAgICgweDMyMTksICczJywgdSco7YOAKScpLAogICAgKDB4MzIxQSwgJzMnLCB1JyjtjIwpJyksCiAgICAoMHgzMjFCLCAnMycsIHUnKO2VmCknKSwKICAgICgweDMyMUMsICczJywgdSco7KO8KScpLAogICAgKDB4MzIxRCwgJzMnLCB1JyjsmKTsoIQpJyksCiAgICAoMHgzMjFFLCAnMycsIHUnKOyYpO2bhCknKSwKICAgICgweDMyMUYsICdYJyksCiAgICAoMHgzMjIwLCAnMycsIHUnKOS4gCknKSwKICAgICgweDMyMjEsICczJywgdSco5LqMKScpLAogICAgKDB4MzIyMiwgJzMnLCB1JyjkuIkpJyksCiAgICAoMHgzMjIzLCAnMycsIHUnKOWbmyknKSwKICAgICgweDMyMjQsICczJywgdSco5LqUKScpLAogICAgKDB4MzIyNSwgJzMnLCB1Jyjlha0pJyksCiAgICAoMHgzMjI2LCAnMycsIHUnKOS4gyknKSwKICAgICgweDMyMjcsICczJywgdSco5YWrKScpLAogICAgKDB4MzIyOCwgJzMnLCB1JyjkuZ0pJyksCiAgICAoMHgzMjI5LCAnMycsIHUnKOWNgSknKSwKICAgICgweDMyMkEsICczJywgdSco5pyIKScpLAogICAgKDB4MzIyQiwgJzMnLCB1JyjngaspJyksCiAgICAoMHgzMjJDLCAnMycsIHUnKOawtCknKSwKICAgICgweDMyMkQsICczJywgdSco5pyoKScpLAogICAgKDB4MzIyRSwgJzMnLCB1Jyjph5EpJyksCiAgICAoMHgzMjJGLCAnMycsIHUnKOWcnyknKSwKICAgICgweDMyMzAsICczJywgdSco5pelKScpLAogICAgKDB4MzIzMSwgJzMnLCB1JyjmoKopJyksCiAgICAoMHgzMjMyLCAnMycsIHUnKOaciSknKSwKICAgICgweDMyMzMsICczJywgdSco56S+KScpLAogICAgKDB4MzIzNCwgJzMnLCB1JyjlkI0pJyksCiAgICAoMHgzMjM1LCAnMycsIHUnKOeJuSknKSwKICAgICgweDMyMzYsICczJywgdSco6LKhKScpLAogICAgKDB4MzIzNywgJzMnLCB1JyjnpZ0pJyksCiAgICAoMHgzMjM4LCAnMycsIHUnKOWKtCknKSwKICAgICgweDMyMzksICczJywgdSco5LujKScpLAogICAgKDB4MzIzQSwgJzMnLCB1JyjlkbwpJyksCiAgICAoMHgzMjNCLCAnMycsIHUnKOWtpiknKSwKICAgICgweDMyM0MsICczJywgdSco55ujKScpLAogICAgKDB4MzIzRCwgJzMnLCB1JyjkvIEpJyksCiAgICAoMHgzMjNFLCAnMycsIHUnKOizhyknKSwKICAgICgweDMyM0YsICczJywgdSco5Y2UKScpLAogICAgKDB4MzI0MCwgJzMnLCB1Jyjnpa0pJyksCiAgICAoMHgzMjQxLCAnMycsIHUnKOS8kSknKSwKICAgICgweDMyNDIsICczJywgdSco6IeqKScpLAogICAgKDB4MzI0MywgJzMnLCB1Jyjoh7MpJyksCiAgICAoMHgzMjQ0LCAnTScsIHUn5ZWPJyksCiAgICAoMHgzMjQ1LCAnTScsIHUn5bm8JyksCiAgICAoMHgzMjQ2LCAnTScsIHUn5paHJyksCiAgICAoMHgzMjQ3LCAnTScsIHUn566PJyksCiAgICAoMHgzMjQ4LCAnVicpLAogICAgKDB4MzI1MCwgJ00nLCB1J3B0ZScpLAogICAgKDB4MzI1MSwgJ00nLCB1JzIxJyksCiAgICAoMHgzMjUyLCAnTScsIHUnMjInKSwKICAgICgweDMyNTMsICdNJywgdScyMycpLAogICAgKDB4MzI1NCwgJ00nLCB1JzI0JyksCiAgICAoMHgzMjU1LCAnTScsIHUnMjUnKSwKICAgICgweDMyNTYsICdNJywgdScyNicpLAogICAgKDB4MzI1NywgJ00nLCB1JzI3JyksCiAgICAoMHgzMjU4LCAnTScsIHUnMjgnKSwKICAgICgweDMyNTksICdNJywgdScyOScpLAogICAgKDB4MzI1QSwgJ00nLCB1JzMwJyksCiAgICAoMHgzMjVCLCAnTScsIHUnMzEnKSwKICAgICgweDMyNUMsICdNJywgdSczMicpLAogICAgKDB4MzI1RCwgJ00nLCB1JzMzJyksCiAgICAoMHgzMjVFLCAnTScsIHUnMzQnKSwKICAgICgweDMyNUYsICdNJywgdSczNScpLAogICAgKDB4MzI2MCwgJ00nLCB1J+GEgCcpLAogICAgKDB4MzI2MSwgJ00nLCB1J+GEgicpLAogICAgKDB4MzI2MiwgJ00nLCB1J+GEgycpLAogICAgKDB4MzI2MywgJ00nLCB1J+GEhScpLAogICAgKDB4MzI2NCwgJ00nLCB1J+GEhicpLAogICAgKDB4MzI2NSwgJ00nLCB1J+GEhycpLAogICAgKDB4MzI2NiwgJ00nLCB1J+GEiScpLAogICAgKDB4MzI2NywgJ00nLCB1J+GEiycpLAogICAgKDB4MzI2OCwgJ00nLCB1J+GEjCcpLAogICAgKDB4MzI2OSwgJ00nLCB1J+GEjicpLAogICAgKDB4MzI2QSwgJ00nLCB1J+GEjycpLAogICAgKDB4MzI2QiwgJ00nLCB1J+GEkCcpLAogICAgKDB4MzI2QywgJ00nLCB1J+GEkScpLAogICAgKDB4MzI2RCwgJ00nLCB1J+GEkicpLAogICAgKDB4MzI2RSwgJ00nLCB1J+qwgCcpLAogICAgKDB4MzI2RiwgJ00nLCB1J+uCmCcpLAogICAgXQoKZGVmIF9zZWdfMzEoKToKICAgIHJldHVybiBbCiAgICAoMHgzMjcwLCAnTScsIHUn64ukJyksCiAgICAoMHgzMjcxLCAnTScsIHUn6528JyksCiAgICAoMHgzMjcyLCAnTScsIHUn66eIJyksCiAgICAoMHgzMjczLCAnTScsIHUn67CUJyksCiAgICAoMHgzMjc0LCAnTScsIHUn7IKsJyksCiAgICAoMHgzMjc1LCAnTScsIHUn7JWEJyksCiAgICAoMHgzMjc2LCAnTScsIHUn7J6QJyksCiAgICAoMHgzMjc3LCAnTScsIHUn7LCoJyksCiAgICAoMHgzMjc4LCAnTScsIHUn7Lm0JyksCiAgICAoMHgzMjc5LCAnTScsIHUn7YOAJyksCiAgICAoMHgzMjdBLCAnTScsIHUn7YyMJyksCiAgICAoMHgzMjdCLCAnTScsIHUn7ZWYJyksCiAgICAoMHgzMjdDLCAnTScsIHUn7LC46rOgJyksCiAgICAoMHgzMjdELCAnTScsIHUn7KO87J2YJyksCiAgICAoMHgzMjdFLCAnTScsIHUn7JqwJyksCiAgICAoMHgzMjdGLCAnVicpLAogICAgKDB4MzI4MCwgJ00nLCB1J+S4gCcpLAogICAgKDB4MzI4MSwgJ00nLCB1J+S6jCcpLAogICAgKDB4MzI4MiwgJ00nLCB1J+S4iScpLAogICAgKDB4MzI4MywgJ00nLCB1J+WbmycpLAogICAgKDB4MzI4NCwgJ00nLCB1J+S6lCcpLAogICAgKDB4MzI4NSwgJ00nLCB1J+WFrScpLAogICAgKDB4MzI4NiwgJ00nLCB1J+S4gycpLAogICAgKDB4MzI4NywgJ00nLCB1J+WFqycpLAogICAgKDB4MzI4OCwgJ00nLCB1J+S5nScpLAogICAgKDB4MzI4OSwgJ00nLCB1J+WNgScpLAogICAgKDB4MzI4QSwgJ00nLCB1J+aciCcpLAogICAgKDB4MzI4QiwgJ00nLCB1J+eBqycpLAogICAgKDB4MzI4QywgJ00nLCB1J+awtCcpLAogICAgKDB4MzI4RCwgJ00nLCB1J+acqCcpLAogICAgKDB4MzI4RSwgJ00nLCB1J+mHkScpLAogICAgKDB4MzI4RiwgJ00nLCB1J+WcnycpLAogICAgKDB4MzI5MCwgJ00nLCB1J+aXpScpLAogICAgKDB4MzI5MSwgJ00nLCB1J+agqicpLAogICAgKDB4MzI5MiwgJ00nLCB1J+aciScpLAogICAgKDB4MzI5MywgJ00nLCB1J+ekvicpLAogICAgKDB4MzI5NCwgJ00nLCB1J+WQjScpLAogICAgKDB4MzI5NSwgJ00nLCB1J+eJuScpLAogICAgKDB4MzI5NiwgJ00nLCB1J+iyoScpLAogICAgKDB4MzI5NywgJ00nLCB1J+elnScpLAogICAgKDB4MzI5OCwgJ00nLCB1J+WKtCcpLAogICAgKDB4MzI5OSwgJ00nLCB1J+enmCcpLAogICAgKDB4MzI5QSwgJ00nLCB1J+eUtycpLAogICAgKDB4MzI5QiwgJ00nLCB1J+WlsycpLAogICAgKDB4MzI5QywgJ00nLCB1J+mBqScpLAogICAgKDB4MzI5RCwgJ00nLCB1J+WEqicpLAogICAgKDB4MzI5RSwgJ00nLCB1J+WNsCcpLAogICAgKDB4MzI5RiwgJ00nLCB1J+azqCcpLAogICAgKDB4MzJBMCwgJ00nLCB1J+mghScpLAogICAgKDB4MzJBMSwgJ00nLCB1J+S8kScpLAogICAgKDB4MzJBMiwgJ00nLCB1J+WGmScpLAogICAgKDB4MzJBMywgJ00nLCB1J+atoycpLAogICAgKDB4MzJBNCwgJ00nLCB1J+S4iicpLAogICAgKDB4MzJBNSwgJ00nLCB1J+S4rScpLAogICAgKDB4MzJBNiwgJ00nLCB1J+S4iycpLAogICAgKDB4MzJBNywgJ00nLCB1J+W3picpLAogICAgKDB4MzJBOCwgJ00nLCB1J+WPsycpLAogICAgKDB4MzJBOSwgJ00nLCB1J+WMuycpLAogICAgKDB4MzJBQSwgJ00nLCB1J+WulycpLAogICAgKDB4MzJBQiwgJ00nLCB1J+WtpicpLAogICAgKDB4MzJBQywgJ00nLCB1J+eboycpLAogICAgKDB4MzJBRCwgJ00nLCB1J+S8gScpLAogICAgKDB4MzJBRSwgJ00nLCB1J+izhycpLAogICAgKDB4MzJBRiwgJ00nLCB1J+WNlCcpLAogICAgKDB4MzJCMCwgJ00nLCB1J+WknCcpLAogICAgKDB4MzJCMSwgJ00nLCB1JzM2JyksCiAgICAoMHgzMkIyLCAnTScsIHUnMzcnKSwKICAgICgweDMyQjMsICdNJywgdSczOCcpLAogICAgKDB4MzJCNCwgJ00nLCB1JzM5JyksCiAgICAoMHgzMkI1LCAnTScsIHUnNDAnKSwKICAgICgweDMyQjYsICdNJywgdSc0MScpLAogICAgKDB4MzJCNywgJ00nLCB1JzQyJyksCiAgICAoMHgzMkI4LCAnTScsIHUnNDMnKSwKICAgICgweDMyQjksICdNJywgdSc0NCcpLAogICAgKDB4MzJCQSwgJ00nLCB1JzQ1JyksCiAgICAoMHgzMkJCLCAnTScsIHUnNDYnKSwKICAgICgweDMyQkMsICdNJywgdSc0NycpLAogICAgKDB4MzJCRCwgJ00nLCB1JzQ4JyksCiAgICAoMHgzMkJFLCAnTScsIHUnNDknKSwKICAgICgweDMyQkYsICdNJywgdSc1MCcpLAogICAgKDB4MzJDMCwgJ00nLCB1JzHmnIgnKSwKICAgICgweDMyQzEsICdNJywgdScy5pyIJyksCiAgICAoMHgzMkMyLCAnTScsIHUnM+aciCcpLAogICAgKDB4MzJDMywgJ00nLCB1JzTmnIgnKSwKICAgICgweDMyQzQsICdNJywgdSc15pyIJyksCiAgICAoMHgzMkM1LCAnTScsIHUnNuaciCcpLAogICAgKDB4MzJDNiwgJ00nLCB1JzfmnIgnKSwKICAgICgweDMyQzcsICdNJywgdSc45pyIJyksCiAgICAoMHgzMkM4LCAnTScsIHUnOeaciCcpLAogICAgKDB4MzJDOSwgJ00nLCB1JzEw5pyIJyksCiAgICAoMHgzMkNBLCAnTScsIHUnMTHmnIgnKSwKICAgICgweDMyQ0IsICdNJywgdScxMuaciCcpLAogICAgKDB4MzJDQywgJ00nLCB1J2hnJyksCiAgICAoMHgzMkNELCAnTScsIHUnZXJnJyksCiAgICAoMHgzMkNFLCAnTScsIHUnZXYnKSwKICAgICgweDMyQ0YsICdNJywgdSdsdGQnKSwKICAgICgweDMyRDAsICdNJywgdSfjgqInKSwKICAgICgweDMyRDEsICdNJywgdSfjgqQnKSwKICAgICgweDMyRDIsICdNJywgdSfjgqYnKSwKICAgICgweDMyRDMsICdNJywgdSfjgqgnKSwKICAgIF0KCmRlZiBfc2VnXzMyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzJENCwgJ00nLCB1J+OCqicpLAogICAgKDB4MzJENSwgJ00nLCB1J+OCqycpLAogICAgKDB4MzJENiwgJ00nLCB1J+OCrScpLAogICAgKDB4MzJENywgJ00nLCB1J+OCrycpLAogICAgKDB4MzJEOCwgJ00nLCB1J+OCsScpLAogICAgKDB4MzJEOSwgJ00nLCB1J+OCsycpLAogICAgKDB4MzJEQSwgJ00nLCB1J+OCtScpLAogICAgKDB4MzJEQiwgJ00nLCB1J+OCtycpLAogICAgKDB4MzJEQywgJ00nLCB1J+OCuScpLAogICAgKDB4MzJERCwgJ00nLCB1J+OCuycpLAogICAgKDB4MzJERSwgJ00nLCB1J+OCvScpLAogICAgKDB4MzJERiwgJ00nLCB1J+OCvycpLAogICAgKDB4MzJFMCwgJ00nLCB1J+ODgScpLAogICAgKDB4MzJFMSwgJ00nLCB1J+ODhCcpLAogICAgKDB4MzJFMiwgJ00nLCB1J+ODhicpLAogICAgKDB4MzJFMywgJ00nLCB1J+ODiCcpLAogICAgKDB4MzJFNCwgJ00nLCB1J+ODiicpLAogICAgKDB4MzJFNSwgJ00nLCB1J+ODiycpLAogICAgKDB4MzJFNiwgJ00nLCB1J+ODjCcpLAogICAgKDB4MzJFNywgJ00nLCB1J+ODjScpLAogICAgKDB4MzJFOCwgJ00nLCB1J+ODjicpLAogICAgKDB4MzJFOSwgJ00nLCB1J+ODjycpLAogICAgKDB4MzJFQSwgJ00nLCB1J+ODkicpLAogICAgKDB4MzJFQiwgJ00nLCB1J+ODlScpLAogICAgKDB4MzJFQywgJ00nLCB1J+ODmCcpLAogICAgKDB4MzJFRCwgJ00nLCB1J+ODmycpLAogICAgKDB4MzJFRSwgJ00nLCB1J+ODnicpLAogICAgKDB4MzJFRiwgJ00nLCB1J+ODnycpLAogICAgKDB4MzJGMCwgJ00nLCB1J+ODoCcpLAogICAgKDB4MzJGMSwgJ00nLCB1J+ODoScpLAogICAgKDB4MzJGMiwgJ00nLCB1J+ODoicpLAogICAgKDB4MzJGMywgJ00nLCB1J+ODpCcpLAogICAgKDB4MzJGNCwgJ00nLCB1J+ODpicpLAogICAgKDB4MzJGNSwgJ00nLCB1J+ODqCcpLAogICAgKDB4MzJGNiwgJ00nLCB1J+ODqScpLAogICAgKDB4MzJGNywgJ00nLCB1J+ODqicpLAogICAgKDB4MzJGOCwgJ00nLCB1J+ODqycpLAogICAgKDB4MzJGOSwgJ00nLCB1J+ODrCcpLAogICAgKDB4MzJGQSwgJ00nLCB1J+ODrScpLAogICAgKDB4MzJGQiwgJ00nLCB1J+ODrycpLAogICAgKDB4MzJGQywgJ00nLCB1J+ODsCcpLAogICAgKDB4MzJGRCwgJ00nLCB1J+ODsScpLAogICAgKDB4MzJGRSwgJ00nLCB1J+ODsicpLAogICAgKDB4MzJGRiwgJ1gnKSwKICAgICgweDMzMDAsICdNJywgdSfjgqLjg5Hjg7zjg4gnKSwKICAgICgweDMzMDEsICdNJywgdSfjgqLjg6vjg5XjgqEnKSwKICAgICgweDMzMDIsICdNJywgdSfjgqLjg7Pjg5rjgqInKSwKICAgICgweDMzMDMsICdNJywgdSfjgqLjg7zjg6snKSwKICAgICgweDMzMDQsICdNJywgdSfjgqTjg4vjg7PjgrAnKSwKICAgICgweDMzMDUsICdNJywgdSfjgqTjg7Pjg4EnKSwKICAgICgweDMzMDYsICdNJywgdSfjgqbjgqnjg7MnKSwKICAgICgweDMzMDcsICdNJywgdSfjgqjjgrnjgq/jg7zjg4knKSwKICAgICgweDMzMDgsICdNJywgdSfjgqjjg7zjgqvjg7wnKSwKICAgICgweDMzMDksICdNJywgdSfjgqrjg7PjgrknKSwKICAgICgweDMzMEEsICdNJywgdSfjgqrjg7zjg6AnKSwKICAgICgweDMzMEIsICdNJywgdSfjgqvjgqTjg6onKSwKICAgICgweDMzMEMsICdNJywgdSfjgqvjg6njg4Pjg4gnKSwKICAgICgweDMzMEQsICdNJywgdSfjgqvjg63jg6rjg7wnKSwKICAgICgweDMzMEUsICdNJywgdSfjgqzjg63jg7MnKSwKICAgICgweDMzMEYsICdNJywgdSfjgqzjg7Pjg54nKSwKICAgICgweDMzMTAsICdNJywgdSfjgq7jgqwnKSwKICAgICgweDMzMTEsICdNJywgdSfjgq7jg4vjg7wnKSwKICAgICgweDMzMTIsICdNJywgdSfjgq3jg6Xjg6rjg7wnKSwKICAgICgweDMzMTMsICdNJywgdSfjgq7jg6vjg4Djg7wnKSwKICAgICgweDMzMTQsICdNJywgdSfjgq3jg60nKSwKICAgICgweDMzMTUsICdNJywgdSfjgq3jg63jgrDjg6njg6AnKSwKICAgICgweDMzMTYsICdNJywgdSfjgq3jg63jg6Hjg7zjg4jjg6snKSwKICAgICgweDMzMTcsICdNJywgdSfjgq3jg63jg6/jg4Pjg4gnKSwKICAgICgweDMzMTgsICdNJywgdSfjgrDjg6njg6AnKSwKICAgICgweDMzMTksICdNJywgdSfjgrDjg6njg6Djg4jjg7MnKSwKICAgICgweDMzMUEsICdNJywgdSfjgq/jg6vjgrzjgqTjg60nKSwKICAgICgweDMzMUIsICdNJywgdSfjgq/jg63jg7zjg40nKSwKICAgICgweDMzMUMsICdNJywgdSfjgrHjg7zjgrknKSwKICAgICgweDMzMUQsICdNJywgdSfjgrPjg6vjg4onKSwKICAgICgweDMzMUUsICdNJywgdSfjgrPjg7zjg50nKSwKICAgICgweDMzMUYsICdNJywgdSfjgrXjgqTjgq/jg6snKSwKICAgICgweDMzMjAsICdNJywgdSfjgrXjg7Pjg4Hjg7zjg6AnKSwKICAgICgweDMzMjEsICdNJywgdSfjgrfjg6rjg7PjgrAnKSwKICAgICgweDMzMjIsICdNJywgdSfjgrvjg7Pjg4EnKSwKICAgICgweDMzMjMsICdNJywgdSfjgrvjg7Pjg4gnKSwKICAgICgweDMzMjQsICdNJywgdSfjg4Djg7zjgrknKSwKICAgICgweDMzMjUsICdNJywgdSfjg4fjgrcnKSwKICAgICgweDMzMjYsICdNJywgdSfjg4njg6snKSwKICAgICgweDMzMjcsICdNJywgdSfjg4jjg7MnKSwKICAgICgweDMzMjgsICdNJywgdSfjg4rjg44nKSwKICAgICgweDMzMjksICdNJywgdSfjg47jg4Pjg4gnKSwKICAgICgweDMzMkEsICdNJywgdSfjg4/jgqTjg4QnKSwKICAgICgweDMzMkIsICdNJywgdSfjg5Hjg7zjgrvjg7Pjg4gnKSwKICAgICgweDMzMkMsICdNJywgdSfjg5Hjg7zjg4QnKSwKICAgICgweDMzMkQsICdNJywgdSfjg5Djg7zjg6zjg6snKSwKICAgICgweDMzMkUsICdNJywgdSfjg5TjgqLjgrnjg4jjg6snKSwKICAgICgweDMzMkYsICdNJywgdSfjg5Tjgq/jg6snKSwKICAgICgweDMzMzAsICdNJywgdSfjg5TjgrMnKSwKICAgICgweDMzMzEsICdNJywgdSfjg5Pjg6snKSwKICAgICgweDMzMzIsICdNJywgdSfjg5XjgqHjg6njg4Pjg4knKSwKICAgICgweDMzMzMsICdNJywgdSfjg5XjgqPjg7zjg4gnKSwKICAgICgweDMzMzQsICdNJywgdSfjg5bjg4Pjgrfjgqfjg6snKSwKICAgICgweDMzMzUsICdNJywgdSfjg5Xjg6njg7MnKSwKICAgICgweDMzMzYsICdNJywgdSfjg5jjgq/jgr/jg7zjg6snKSwKICAgICgweDMzMzcsICdNJywgdSfjg5rjgr0nKSwKICAgIF0KCmRlZiBfc2VnXzMzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzMzOCwgJ00nLCB1J+ODmuODi+ODkicpLAogICAgKDB4MzMzOSwgJ00nLCB1J+ODmOODq+ODhCcpLAogICAgKDB4MzMzQSwgJ00nLCB1J+ODmuODs+OCuScpLAogICAgKDB4MzMzQiwgJ00nLCB1J+ODmuODvOOCuCcpLAogICAgKDB4MzMzQywgJ00nLCB1J+ODmeODvOOCvycpLAogICAgKDB4MzMzRCwgJ00nLCB1J+ODneOCpOODs+ODiCcpLAogICAgKDB4MzMzRSwgJ00nLCB1J+ODnOODq+ODiCcpLAogICAgKDB4MzMzRiwgJ00nLCB1J+ODm+ODsycpLAogICAgKDB4MzM0MCwgJ00nLCB1J+ODneODs+ODiScpLAogICAgKDB4MzM0MSwgJ00nLCB1J+ODm+ODvOODqycpLAogICAgKDB4MzM0MiwgJ00nLCB1J+ODm+ODvOODsycpLAogICAgKDB4MzM0MywgJ00nLCB1J+ODnuOCpOOCr+ODrScpLAogICAgKDB4MzM0NCwgJ00nLCB1J+ODnuOCpOODqycpLAogICAgKDB4MzM0NSwgJ00nLCB1J+ODnuODg+ODjycpLAogICAgKDB4MzM0NiwgJ00nLCB1J+ODnuODq+OCrycpLAogICAgKDB4MzM0NywgJ00nLCB1J+ODnuODs+OCt+ODp+ODsycpLAogICAgKDB4MzM0OCwgJ00nLCB1J+ODn+OCr+ODreODsycpLAogICAgKDB4MzM0OSwgJ00nLCB1J+ODn+ODqicpLAogICAgKDB4MzM0QSwgJ00nLCB1J+ODn+ODquODkOODvOODqycpLAogICAgKDB4MzM0QiwgJ00nLCB1J+ODoeOCrCcpLAogICAgKDB4MzM0QywgJ00nLCB1J+ODoeOCrOODiOODsycpLAogICAgKDB4MzM0RCwgJ00nLCB1J+ODoeODvOODiOODqycpLAogICAgKDB4MzM0RSwgJ00nLCB1J+ODpOODvOODiScpLAogICAgKDB4MzM0RiwgJ00nLCB1J+ODpOODvOODqycpLAogICAgKDB4MzM1MCwgJ00nLCB1J+ODpuOCouODsycpLAogICAgKDB4MzM1MSwgJ00nLCB1J+ODquODg+ODiOODqycpLAogICAgKDB4MzM1MiwgJ00nLCB1J+ODquODqScpLAogICAgKDB4MzM1MywgJ00nLCB1J+ODq+ODlOODvCcpLAogICAgKDB4MzM1NCwgJ00nLCB1J+ODq+ODvOODluODqycpLAogICAgKDB4MzM1NSwgJ00nLCB1J+ODrOODoCcpLAogICAgKDB4MzM1NiwgJ00nLCB1J+ODrOODs+ODiOOCsuODsycpLAogICAgKDB4MzM1NywgJ00nLCB1J+ODr+ODg+ODiCcpLAogICAgKDB4MzM1OCwgJ00nLCB1JzDngrknKSwKICAgICgweDMzNTksICdNJywgdScx54K5JyksCiAgICAoMHgzMzVBLCAnTScsIHUnMueCuScpLAogICAgKDB4MzM1QiwgJ00nLCB1JzPngrknKSwKICAgICgweDMzNUMsICdNJywgdSc054K5JyksCiAgICAoMHgzMzVELCAnTScsIHUnNeeCuScpLAogICAgKDB4MzM1RSwgJ00nLCB1JzbngrknKSwKICAgICgweDMzNUYsICdNJywgdSc354K5JyksCiAgICAoMHgzMzYwLCAnTScsIHUnOOeCuScpLAogICAgKDB4MzM2MSwgJ00nLCB1JznngrknKSwKICAgICgweDMzNjIsICdNJywgdScxMOeCuScpLAogICAgKDB4MzM2MywgJ00nLCB1JzEx54K5JyksCiAgICAoMHgzMzY0LCAnTScsIHUnMTLngrknKSwKICAgICgweDMzNjUsICdNJywgdScxM+eCuScpLAogICAgKDB4MzM2NiwgJ00nLCB1JzE054K5JyksCiAgICAoMHgzMzY3LCAnTScsIHUnMTXngrknKSwKICAgICgweDMzNjgsICdNJywgdScxNueCuScpLAogICAgKDB4MzM2OSwgJ00nLCB1JzE354K5JyksCiAgICAoMHgzMzZBLCAnTScsIHUnMTjngrknKSwKICAgICgweDMzNkIsICdNJywgdScxOeeCuScpLAogICAgKDB4MzM2QywgJ00nLCB1JzIw54K5JyksCiAgICAoMHgzMzZELCAnTScsIHUnMjHngrknKSwKICAgICgweDMzNkUsICdNJywgdScyMueCuScpLAogICAgKDB4MzM2RiwgJ00nLCB1JzIz54K5JyksCiAgICAoMHgzMzcwLCAnTScsIHUnMjTngrknKSwKICAgICgweDMzNzEsICdNJywgdSdocGEnKSwKICAgICgweDMzNzIsICdNJywgdSdkYScpLAogICAgKDB4MzM3MywgJ00nLCB1J2F1JyksCiAgICAoMHgzMzc0LCAnTScsIHUnYmFyJyksCiAgICAoMHgzMzc1LCAnTScsIHUnb3YnKSwKICAgICgweDMzNzYsICdNJywgdSdwYycpLAogICAgKDB4MzM3NywgJ00nLCB1J2RtJyksCiAgICAoMHgzMzc4LCAnTScsIHUnZG0yJyksCiAgICAoMHgzMzc5LCAnTScsIHUnZG0zJyksCiAgICAoMHgzMzdBLCAnTScsIHUnaXUnKSwKICAgICgweDMzN0IsICdNJywgdSflubPmiJAnKSwKICAgICgweDMzN0MsICdNJywgdSfmmK3lkownKSwKICAgICgweDMzN0QsICdNJywgdSflpKfmraMnKSwKICAgICgweDMzN0UsICdNJywgdSfmmI7msrsnKSwKICAgICgweDMzN0YsICdNJywgdSfmoKrlvI/kvJrnpL4nKSwKICAgICgweDMzODAsICdNJywgdSdwYScpLAogICAgKDB4MzM4MSwgJ00nLCB1J25hJyksCiAgICAoMHgzMzgyLCAnTScsIHUnzrxhJyksCiAgICAoMHgzMzgzLCAnTScsIHUnbWEnKSwKICAgICgweDMzODQsICdNJywgdSdrYScpLAogICAgKDB4MzM4NSwgJ00nLCB1J2tiJyksCiAgICAoMHgzMzg2LCAnTScsIHUnbWInKSwKICAgICgweDMzODcsICdNJywgdSdnYicpLAogICAgKDB4MzM4OCwgJ00nLCB1J2NhbCcpLAogICAgKDB4MzM4OSwgJ00nLCB1J2tjYWwnKSwKICAgICgweDMzOEEsICdNJywgdSdwZicpLAogICAgKDB4MzM4QiwgJ00nLCB1J25mJyksCiAgICAoMHgzMzhDLCAnTScsIHUnzrxmJyksCiAgICAoMHgzMzhELCAnTScsIHUnzrxnJyksCiAgICAoMHgzMzhFLCAnTScsIHUnbWcnKSwKICAgICgweDMzOEYsICdNJywgdSdrZycpLAogICAgKDB4MzM5MCwgJ00nLCB1J2h6JyksCiAgICAoMHgzMzkxLCAnTScsIHUna2h6JyksCiAgICAoMHgzMzkyLCAnTScsIHUnbWh6JyksCiAgICAoMHgzMzkzLCAnTScsIHUnZ2h6JyksCiAgICAoMHgzMzk0LCAnTScsIHUndGh6JyksCiAgICAoMHgzMzk1LCAnTScsIHUnzrxsJyksCiAgICAoMHgzMzk2LCAnTScsIHUnbWwnKSwKICAgICgweDMzOTcsICdNJywgdSdkbCcpLAogICAgKDB4MzM5OCwgJ00nLCB1J2tsJyksCiAgICAoMHgzMzk5LCAnTScsIHUnZm0nKSwKICAgICgweDMzOUEsICdNJywgdSdubScpLAogICAgKDB4MzM5QiwgJ00nLCB1J868bScpLAogICAgXQoKZGVmIF9zZWdfMzQoKToKICAgIHJldHVybiBbCiAgICAoMHgzMzlDLCAnTScsIHUnbW0nKSwKICAgICgweDMzOUQsICdNJywgdSdjbScpLAogICAgKDB4MzM5RSwgJ00nLCB1J2ttJyksCiAgICAoMHgzMzlGLCAnTScsIHUnbW0yJyksCiAgICAoMHgzM0EwLCAnTScsIHUnY20yJyksCiAgICAoMHgzM0ExLCAnTScsIHUnbTInKSwKICAgICgweDMzQTIsICdNJywgdSdrbTInKSwKICAgICgweDMzQTMsICdNJywgdSdtbTMnKSwKICAgICgweDMzQTQsICdNJywgdSdjbTMnKSwKICAgICgweDMzQTUsICdNJywgdSdtMycpLAogICAgKDB4MzNBNiwgJ00nLCB1J2ttMycpLAogICAgKDB4MzNBNywgJ00nLCB1J23iiJVzJyksCiAgICAoMHgzM0E4LCAnTScsIHUnbeKIlXMyJyksCiAgICAoMHgzM0E5LCAnTScsIHUncGEnKSwKICAgICgweDMzQUEsICdNJywgdSdrcGEnKSwKICAgICgweDMzQUIsICdNJywgdSdtcGEnKSwKICAgICgweDMzQUMsICdNJywgdSdncGEnKSwKICAgICgweDMzQUQsICdNJywgdSdyYWQnKSwKICAgICgweDMzQUUsICdNJywgdSdyYWTiiJVzJyksCiAgICAoMHgzM0FGLCAnTScsIHUncmFk4oiVczInKSwKICAgICgweDMzQjAsICdNJywgdSdwcycpLAogICAgKDB4MzNCMSwgJ00nLCB1J25zJyksCiAgICAoMHgzM0IyLCAnTScsIHUnzrxzJyksCiAgICAoMHgzM0IzLCAnTScsIHUnbXMnKSwKICAgICgweDMzQjQsICdNJywgdSdwdicpLAogICAgKDB4MzNCNSwgJ00nLCB1J252JyksCiAgICAoMHgzM0I2LCAnTScsIHUnzrx2JyksCiAgICAoMHgzM0I3LCAnTScsIHUnbXYnKSwKICAgICgweDMzQjgsICdNJywgdSdrdicpLAogICAgKDB4MzNCOSwgJ00nLCB1J212JyksCiAgICAoMHgzM0JBLCAnTScsIHUncHcnKSwKICAgICgweDMzQkIsICdNJywgdSdudycpLAogICAgKDB4MzNCQywgJ00nLCB1J868dycpLAogICAgKDB4MzNCRCwgJ00nLCB1J213JyksCiAgICAoMHgzM0JFLCAnTScsIHUna3cnKSwKICAgICgweDMzQkYsICdNJywgdSdtdycpLAogICAgKDB4MzNDMCwgJ00nLCB1J2vPiScpLAogICAgKDB4MzNDMSwgJ00nLCB1J23PiScpLAogICAgKDB4MzNDMiwgJ1gnKSwKICAgICgweDMzQzMsICdNJywgdSdicScpLAogICAgKDB4MzNDNCwgJ00nLCB1J2NjJyksCiAgICAoMHgzM0M1LCAnTScsIHUnY2QnKSwKICAgICgweDMzQzYsICdNJywgdSdj4oiVa2cnKSwKICAgICgweDMzQzcsICdYJyksCiAgICAoMHgzM0M4LCAnTScsIHUnZGInKSwKICAgICgweDMzQzksICdNJywgdSdneScpLAogICAgKDB4MzNDQSwgJ00nLCB1J2hhJyksCiAgICAoMHgzM0NCLCAnTScsIHUnaHAnKSwKICAgICgweDMzQ0MsICdNJywgdSdpbicpLAogICAgKDB4MzNDRCwgJ00nLCB1J2trJyksCiAgICAoMHgzM0NFLCAnTScsIHUna20nKSwKICAgICgweDMzQ0YsICdNJywgdSdrdCcpLAogICAgKDB4MzNEMCwgJ00nLCB1J2xtJyksCiAgICAoMHgzM0QxLCAnTScsIHUnbG4nKSwKICAgICgweDMzRDIsICdNJywgdSdsb2cnKSwKICAgICgweDMzRDMsICdNJywgdSdseCcpLAogICAgKDB4MzNENCwgJ00nLCB1J21iJyksCiAgICAoMHgzM0Q1LCAnTScsIHUnbWlsJyksCiAgICAoMHgzM0Q2LCAnTScsIHUnbW9sJyksCiAgICAoMHgzM0Q3LCAnTScsIHUncGgnKSwKICAgICgweDMzRDgsICdYJyksCiAgICAoMHgzM0Q5LCAnTScsIHUncHBtJyksCiAgICAoMHgzM0RBLCAnTScsIHUncHInKSwKICAgICgweDMzREIsICdNJywgdSdzcicpLAogICAgKDB4MzNEQywgJ00nLCB1J3N2JyksCiAgICAoMHgzM0RELCAnTScsIHUnd2InKSwKICAgICgweDMzREUsICdNJywgdSd24oiVbScpLAogICAgKDB4MzNERiwgJ00nLCB1J2HiiJVtJyksCiAgICAoMHgzM0UwLCAnTScsIHUnMeaXpScpLAogICAgKDB4MzNFMSwgJ00nLCB1JzLml6UnKSwKICAgICgweDMzRTIsICdNJywgdScz5pelJyksCiAgICAoMHgzM0UzLCAnTScsIHUnNOaXpScpLAogICAgKDB4MzNFNCwgJ00nLCB1JzXml6UnKSwKICAgICgweDMzRTUsICdNJywgdSc25pelJyksCiAgICAoMHgzM0U2LCAnTScsIHUnN+aXpScpLAogICAgKDB4MzNFNywgJ00nLCB1Jzjml6UnKSwKICAgICgweDMzRTgsICdNJywgdSc55pelJyksCiAgICAoMHgzM0U5LCAnTScsIHUnMTDml6UnKSwKICAgICgweDMzRUEsICdNJywgdScxMeaXpScpLAogICAgKDB4MzNFQiwgJ00nLCB1JzEy5pelJyksCiAgICAoMHgzM0VDLCAnTScsIHUnMTPml6UnKSwKICAgICgweDMzRUQsICdNJywgdScxNOaXpScpLAogICAgKDB4MzNFRSwgJ00nLCB1JzE15pelJyksCiAgICAoMHgzM0VGLCAnTScsIHUnMTbml6UnKSwKICAgICgweDMzRjAsICdNJywgdScxN+aXpScpLAogICAgKDB4MzNGMSwgJ00nLCB1JzE45pelJyksCiAgICAoMHgzM0YyLCAnTScsIHUnMTnml6UnKSwKICAgICgweDMzRjMsICdNJywgdScyMOaXpScpLAogICAgKDB4MzNGNCwgJ00nLCB1JzIx5pelJyksCiAgICAoMHgzM0Y1LCAnTScsIHUnMjLml6UnKSwKICAgICgweDMzRjYsICdNJywgdScyM+aXpScpLAogICAgKDB4MzNGNywgJ00nLCB1JzI05pelJyksCiAgICAoMHgzM0Y4LCAnTScsIHUnMjXml6UnKSwKICAgICgweDMzRjksICdNJywgdScyNuaXpScpLAogICAgKDB4MzNGQSwgJ00nLCB1JzI35pelJyksCiAgICAoMHgzM0ZCLCAnTScsIHUnMjjml6UnKSwKICAgICgweDMzRkMsICdNJywgdScyOeaXpScpLAogICAgKDB4MzNGRCwgJ00nLCB1JzMw5pelJyksCiAgICAoMHgzM0ZFLCAnTScsIHUnMzHml6UnKSwKICAgICgweDMzRkYsICdNJywgdSdnYWwnKSwKICAgIF0KCmRlZiBfc2VnXzM1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MzQwMCwgJ1YnKSwKICAgICgweDREQjYsICdYJyksCiAgICAoMHg0REMwLCAnVicpLAogICAgKDB4OUZDRCwgJ1gnKSwKICAgICgweEEwMDAsICdWJyksCiAgICAoMHhBNDhELCAnWCcpLAogICAgKDB4QTQ5MCwgJ1YnKSwKICAgICgweEE0QzcsICdYJyksCiAgICAoMHhBNEQwLCAnVicpLAogICAgKDB4QTYyQywgJ1gnKSwKICAgICgweEE2NDAsICdNJywgdSfqmYEnKSwKICAgICgweEE2NDEsICdWJyksCiAgICAoMHhBNjQyLCAnTScsIHUn6pmDJyksCiAgICAoMHhBNjQzLCAnVicpLAogICAgKDB4QTY0NCwgJ00nLCB1J+qZhScpLAogICAgKDB4QTY0NSwgJ1YnKSwKICAgICgweEE2NDYsICdNJywgdSfqmYcnKSwKICAgICgweEE2NDcsICdWJyksCiAgICAoMHhBNjQ4LCAnTScsIHUn6pmJJyksCiAgICAoMHhBNjQ5LCAnVicpLAogICAgKDB4QTY0QSwgJ00nLCB1J+qZiycpLAogICAgKDB4QTY0QiwgJ1YnKSwKICAgICgweEE2NEMsICdNJywgdSfqmY0nKSwKICAgICgweEE2NEQsICdWJyksCiAgICAoMHhBNjRFLCAnTScsIHUn6pmPJyksCiAgICAoMHhBNjRGLCAnVicpLAogICAgKDB4QTY1MCwgJ00nLCB1J+qZkScpLAogICAgKDB4QTY1MSwgJ1YnKSwKICAgICgweEE2NTIsICdNJywgdSfqmZMnKSwKICAgICgweEE2NTMsICdWJyksCiAgICAoMHhBNjU0LCAnTScsIHUn6pmVJyksCiAgICAoMHhBNjU1LCAnVicpLAogICAgKDB4QTY1NiwgJ00nLCB1J+qZlycpLAogICAgKDB4QTY1NywgJ1YnKSwKICAgICgweEE2NTgsICdNJywgdSfqmZknKSwKICAgICgweEE2NTksICdWJyksCiAgICAoMHhBNjVBLCAnTScsIHUn6pmbJyksCiAgICAoMHhBNjVCLCAnVicpLAogICAgKDB4QTY1QywgJ00nLCB1J+qZnScpLAogICAgKDB4QTY1RCwgJ1YnKSwKICAgICgweEE2NUUsICdNJywgdSfqmZ8nKSwKICAgICgweEE2NUYsICdWJyksCiAgICAoMHhBNjYwLCAnTScsIHUn6pmhJyksCiAgICAoMHhBNjYxLCAnVicpLAogICAgKDB4QTY2MiwgJ00nLCB1J+qZoycpLAogICAgKDB4QTY2MywgJ1YnKSwKICAgICgweEE2NjQsICdNJywgdSfqmaUnKSwKICAgICgweEE2NjUsICdWJyksCiAgICAoMHhBNjY2LCAnTScsIHUn6pmnJyksCiAgICAoMHhBNjY3LCAnVicpLAogICAgKDB4QTY2OCwgJ00nLCB1J+qZqScpLAogICAgKDB4QTY2OSwgJ1YnKSwKICAgICgweEE2NkEsICdNJywgdSfqmasnKSwKICAgICgweEE2NkIsICdWJyksCiAgICAoMHhBNjZDLCAnTScsIHUn6pmtJyksCiAgICAoMHhBNjZELCAnVicpLAogICAgKDB4QTY4MCwgJ00nLCB1J+qagScpLAogICAgKDB4QTY4MSwgJ1YnKSwKICAgICgweEE2ODIsICdNJywgdSfqmoMnKSwKICAgICgweEE2ODMsICdWJyksCiAgICAoMHhBNjg0LCAnTScsIHUn6pqFJyksCiAgICAoMHhBNjg1LCAnVicpLAogICAgKDB4QTY4NiwgJ00nLCB1J+qahycpLAogICAgKDB4QTY4NywgJ1YnKSwKICAgICgweEE2ODgsICdNJywgdSfqmoknKSwKICAgICgweEE2ODksICdWJyksCiAgICAoMHhBNjhBLCAnTScsIHUn6pqLJyksCiAgICAoMHhBNjhCLCAnVicpLAogICAgKDB4QTY4QywgJ00nLCB1J+qajScpLAogICAgKDB4QTY4RCwgJ1YnKSwKICAgICgweEE2OEUsICdNJywgdSfqmo8nKSwKICAgICgweEE2OEYsICdWJyksCiAgICAoMHhBNjkwLCAnTScsIHUn6pqRJyksCiAgICAoMHhBNjkxLCAnVicpLAogICAgKDB4QTY5MiwgJ00nLCB1J+qakycpLAogICAgKDB4QTY5MywgJ1YnKSwKICAgICgweEE2OTQsICdNJywgdSfqmpUnKSwKICAgICgweEE2OTUsICdWJyksCiAgICAoMHhBNjk2LCAnTScsIHUn6pqXJyksCiAgICAoMHhBNjk3LCAnVicpLAogICAgKDB4QTY5OCwgJ1gnKSwKICAgICgweEE2OUYsICdWJyksCiAgICAoMHhBNkY4LCAnWCcpLAogICAgKDB4QTcwMCwgJ1YnKSwKICAgICgweEE3MjIsICdNJywgdSfqnKMnKSwKICAgICgweEE3MjMsICdWJyksCiAgICAoMHhBNzI0LCAnTScsIHUn6pylJyksCiAgICAoMHhBNzI1LCAnVicpLAogICAgKDB4QTcyNiwgJ00nLCB1J+qcpycpLAogICAgKDB4QTcyNywgJ1YnKSwKICAgICgweEE3MjgsICdNJywgdSfqnKknKSwKICAgICgweEE3MjksICdWJyksCiAgICAoMHhBNzJBLCAnTScsIHUn6pyrJyksCiAgICAoMHhBNzJCLCAnVicpLAogICAgKDB4QTcyQywgJ00nLCB1J+qcrScpLAogICAgKDB4QTcyRCwgJ1YnKSwKICAgICgweEE3MkUsICdNJywgdSfqnK8nKSwKICAgICgweEE3MkYsICdWJyksCiAgICAoMHhBNzMyLCAnTScsIHUn6pyzJyksCiAgICAoMHhBNzMzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMzYoKToKICAgIHJldHVybiBbCiAgICAoMHhBNzM0LCAnTScsIHUn6py1JyksCiAgICAoMHhBNzM1LCAnVicpLAogICAgKDB4QTczNiwgJ00nLCB1J+qctycpLAogICAgKDB4QTczNywgJ1YnKSwKICAgICgweEE3MzgsICdNJywgdSfqnLknKSwKICAgICgweEE3MzksICdWJyksCiAgICAoMHhBNzNBLCAnTScsIHUn6py7JyksCiAgICAoMHhBNzNCLCAnVicpLAogICAgKDB4QTczQywgJ00nLCB1J+qcvScpLAogICAgKDB4QTczRCwgJ1YnKSwKICAgICgweEE3M0UsICdNJywgdSfqnL8nKSwKICAgICgweEE3M0YsICdWJyksCiAgICAoMHhBNzQwLCAnTScsIHUn6p2BJyksCiAgICAoMHhBNzQxLCAnVicpLAogICAgKDB4QTc0MiwgJ00nLCB1J+qdgycpLAogICAgKDB4QTc0MywgJ1YnKSwKICAgICgweEE3NDQsICdNJywgdSfqnYUnKSwKICAgICgweEE3NDUsICdWJyksCiAgICAoMHhBNzQ2LCAnTScsIHUn6p2HJyksCiAgICAoMHhBNzQ3LCAnVicpLAogICAgKDB4QTc0OCwgJ00nLCB1J+qdiScpLAogICAgKDB4QTc0OSwgJ1YnKSwKICAgICgweEE3NEEsICdNJywgdSfqnYsnKSwKICAgICgweEE3NEIsICdWJyksCiAgICAoMHhBNzRDLCAnTScsIHUn6p2NJyksCiAgICAoMHhBNzRELCAnVicpLAogICAgKDB4QTc0RSwgJ00nLCB1J+qdjycpLAogICAgKDB4QTc0RiwgJ1YnKSwKICAgICgweEE3NTAsICdNJywgdSfqnZEnKSwKICAgICgweEE3NTEsICdWJyksCiAgICAoMHhBNzUyLCAnTScsIHUn6p2TJyksCiAgICAoMHhBNzUzLCAnVicpLAogICAgKDB4QTc1NCwgJ00nLCB1J+qdlScpLAogICAgKDB4QTc1NSwgJ1YnKSwKICAgICgweEE3NTYsICdNJywgdSfqnZcnKSwKICAgICgweEE3NTcsICdWJyksCiAgICAoMHhBNzU4LCAnTScsIHUn6p2ZJyksCiAgICAoMHhBNzU5LCAnVicpLAogICAgKDB4QTc1QSwgJ00nLCB1J+qdmycpLAogICAgKDB4QTc1QiwgJ1YnKSwKICAgICgweEE3NUMsICdNJywgdSfqnZ0nKSwKICAgICgweEE3NUQsICdWJyksCiAgICAoMHhBNzVFLCAnTScsIHUn6p2fJyksCiAgICAoMHhBNzVGLCAnVicpLAogICAgKDB4QTc2MCwgJ00nLCB1J+qdoScpLAogICAgKDB4QTc2MSwgJ1YnKSwKICAgICgweEE3NjIsICdNJywgdSfqnaMnKSwKICAgICgweEE3NjMsICdWJyksCiAgICAoMHhBNzY0LCAnTScsIHUn6p2lJyksCiAgICAoMHhBNzY1LCAnVicpLAogICAgKDB4QTc2NiwgJ00nLCB1J+qdpycpLAogICAgKDB4QTc2NywgJ1YnKSwKICAgICgweEE3NjgsICdNJywgdSfqnaknKSwKICAgICgweEE3NjksICdWJyksCiAgICAoMHhBNzZBLCAnTScsIHUn6p2rJyksCiAgICAoMHhBNzZCLCAnVicpLAogICAgKDB4QTc2QywgJ00nLCB1J+qdrScpLAogICAgKDB4QTc2RCwgJ1YnKSwKICAgICgweEE3NkUsICdNJywgdSfqna8nKSwKICAgICgweEE3NkYsICdWJyksCiAgICAoMHhBNzcwLCAnTScsIHUn6p2vJyksCiAgICAoMHhBNzcxLCAnVicpLAogICAgKDB4QTc3OSwgJ00nLCB1J+qduicpLAogICAgKDB4QTc3QSwgJ1YnKSwKICAgICgweEE3N0IsICdNJywgdSfqnbwnKSwKICAgICgweEE3N0MsICdWJyksCiAgICAoMHhBNzdELCAnTScsIHUn4bW5JyksCiAgICAoMHhBNzdFLCAnTScsIHUn6p2/JyksCiAgICAoMHhBNzdGLCAnVicpLAogICAgKDB4QTc4MCwgJ00nLCB1J+qegScpLAogICAgKDB4QTc4MSwgJ1YnKSwKICAgICgweEE3ODIsICdNJywgdSfqnoMnKSwKICAgICgweEE3ODMsICdWJyksCiAgICAoMHhBNzg0LCAnTScsIHUn6p6FJyksCiAgICAoMHhBNzg1LCAnVicpLAogICAgKDB4QTc4NiwgJ00nLCB1J+qehycpLAogICAgKDB4QTc4NywgJ1YnKSwKICAgICgweEE3OEIsICdNJywgdSfqnownKSwKICAgICgweEE3OEMsICdWJyksCiAgICAoMHhBNzhELCAnTScsIHUnyaUnKSwKICAgICgweEE3OEUsICdWJyksCiAgICAoMHhBNzhGLCAnWCcpLAogICAgKDB4QTc5MCwgJ00nLCB1J+qekScpLAogICAgKDB4QTc5MSwgJ1YnKSwKICAgICgweEE3OTIsICdNJywgdSfqnpMnKSwKICAgICgweEE3OTMsICdWJyksCiAgICAoMHhBNzk0LCAnWCcpLAogICAgKDB4QTdBMCwgJ00nLCB1J+qeoScpLAogICAgKDB4QTdBMSwgJ1YnKSwKICAgICgweEE3QTIsICdNJywgdSfqnqMnKSwKICAgICgweEE3QTMsICdWJyksCiAgICAoMHhBN0E0LCAnTScsIHUn6p6lJyksCiAgICAoMHhBN0E1LCAnVicpLAogICAgKDB4QTdBNiwgJ00nLCB1J+qepycpLAogICAgKDB4QTdBNywgJ1YnKSwKICAgICgweEE3QTgsICdNJywgdSfqnqknKSwKICAgICgweEE3QTksICdWJyksCiAgICAoMHhBN0FBLCAnTScsIHUnyaYnKSwKICAgICgweEE3QUIsICdYJyksCiAgICAoMHhBN0Y4LCAnTScsIHUnxKcnKSwKICAgIF0KCmRlZiBfc2VnXzM3KCk6CiAgICByZXR1cm4gWwogICAgKDB4QTdGOSwgJ00nLCB1J8WTJyksCiAgICAoMHhBN0ZBLCAnVicpLAogICAgKDB4QTgyQywgJ1gnKSwKICAgICgweEE4MzAsICdWJyksCiAgICAoMHhBODNBLCAnWCcpLAogICAgKDB4QTg0MCwgJ1YnKSwKICAgICgweEE4NzgsICdYJyksCiAgICAoMHhBODgwLCAnVicpLAogICAgKDB4QThDNSwgJ1gnKSwKICAgICgweEE4Q0UsICdWJyksCiAgICAoMHhBOERBLCAnWCcpLAogICAgKDB4QThFMCwgJ1YnKSwKICAgICgweEE4RkMsICdYJyksCiAgICAoMHhBOTAwLCAnVicpLAogICAgKDB4QTk1NCwgJ1gnKSwKICAgICgweEE5NUYsICdWJyksCiAgICAoMHhBOTdELCAnWCcpLAogICAgKDB4QTk4MCwgJ1YnKSwKICAgICgweEE5Q0UsICdYJyksCiAgICAoMHhBOUNGLCAnVicpLAogICAgKDB4QTlEQSwgJ1gnKSwKICAgICgweEE5REUsICdWJyksCiAgICAoMHhBOUUwLCAnWCcpLAogICAgKDB4QUEwMCwgJ1YnKSwKICAgICgweEFBMzcsICdYJyksCiAgICAoMHhBQTQwLCAnVicpLAogICAgKDB4QUE0RSwgJ1gnKSwKICAgICgweEFBNTAsICdWJyksCiAgICAoMHhBQTVBLCAnWCcpLAogICAgKDB4QUE1QywgJ1YnKSwKICAgICgweEFBN0MsICdYJyksCiAgICAoMHhBQTgwLCAnVicpLAogICAgKDB4QUFDMywgJ1gnKSwKICAgICgweEFBREIsICdWJyksCiAgICAoMHhBQUY3LCAnWCcpLAogICAgKDB4QUIwMSwgJ1YnKSwKICAgICgweEFCMDcsICdYJyksCiAgICAoMHhBQjA5LCAnVicpLAogICAgKDB4QUIwRiwgJ1gnKSwKICAgICgweEFCMTEsICdWJyksCiAgICAoMHhBQjE3LCAnWCcpLAogICAgKDB4QUIyMCwgJ1YnKSwKICAgICgweEFCMjcsICdYJyksCiAgICAoMHhBQjI4LCAnVicpLAogICAgKDB4QUIyRiwgJ1gnKSwKICAgICgweEFCQzAsICdWJyksCiAgICAoMHhBQkVFLCAnWCcpLAogICAgKDB4QUJGMCwgJ1YnKSwKICAgICgweEFCRkEsICdYJyksCiAgICAoMHhBQzAwLCAnVicpLAogICAgKDB4RDdBNCwgJ1gnKSwKICAgICgweEQ3QjAsICdWJyksCiAgICAoMHhEN0M3LCAnWCcpLAogICAgKDB4RDdDQiwgJ1YnKSwKICAgICgweEQ3RkMsICdYJyksCiAgICAoMHhGOTAwLCAnTScsIHUn6LGIJyksCiAgICAoMHhGOTAxLCAnTScsIHUn5pu0JyksCiAgICAoMHhGOTAyLCAnTScsIHUn6LuKJyksCiAgICAoMHhGOTAzLCAnTScsIHUn6LOIJyksCiAgICAoMHhGOTA0LCAnTScsIHUn5ruRJyksCiAgICAoMHhGOTA1LCAnTScsIHUn5LiyJyksCiAgICAoMHhGOTA2LCAnTScsIHUn5Y+lJyksCiAgICAoMHhGOTA3LCAnTScsIHUn6b6cJyksCiAgICAoMHhGOTA5LCAnTScsIHUn5aWRJyksCiAgICAoMHhGOTBBLCAnTScsIHUn6YeRJyksCiAgICAoMHhGOTBCLCAnTScsIHUn5ZaHJyksCiAgICAoMHhGOTBDLCAnTScsIHUn5aWIJyksCiAgICAoMHhGOTBELCAnTScsIHUn5oe2JyksCiAgICAoMHhGOTBFLCAnTScsIHUn55mpJyksCiAgICAoMHhGOTBGLCAnTScsIHUn576FJyksCiAgICAoMHhGOTEwLCAnTScsIHUn6Ji/JyksCiAgICAoMHhGOTExLCAnTScsIHUn6J66JyksCiAgICAoMHhGOTEyLCAnTScsIHUn6KO4JyksCiAgICAoMHhGOTEzLCAnTScsIHUn6YKPJyksCiAgICAoMHhGOTE0LCAnTScsIHUn5qiCJyksCiAgICAoMHhGOTE1LCAnTScsIHUn5rSbJyksCiAgICAoMHhGOTE2LCAnTScsIHUn54OZJyksCiAgICAoMHhGOTE3LCAnTScsIHUn54+eJyksCiAgICAoMHhGOTE4LCAnTScsIHUn6JC9JyksCiAgICAoMHhGOTE5LCAnTScsIHUn6YWqJyksCiAgICAoMHhGOTFBLCAnTScsIHUn6aexJyksCiAgICAoMHhGOTFCLCAnTScsIHUn5LqCJyksCiAgICAoMHhGOTFDLCAnTScsIHUn5Y21JyksCiAgICAoMHhGOTFELCAnTScsIHUn5qyEJyksCiAgICAoMHhGOTFFLCAnTScsIHUn54ibJyksCiAgICAoMHhGOTFGLCAnTScsIHUn6JitJyksCiAgICAoMHhGOTIwLCAnTScsIHUn6bieJyksCiAgICAoMHhGOTIxLCAnTScsIHUn5bWQJyksCiAgICAoMHhGOTIyLCAnTScsIHUn5r+rJyksCiAgICAoMHhGOTIzLCAnTScsIHUn6JeNJyksCiAgICAoMHhGOTI0LCAnTScsIHUn6KWkJyksCiAgICAoMHhGOTI1LCAnTScsIHUn5ouJJyksCiAgICAoMHhGOTI2LCAnTScsIHUn6IeYJyksCiAgICAoMHhGOTI3LCAnTScsIHUn6KCfJyksCiAgICAoMHhGOTI4LCAnTScsIHUn5buKJyksCiAgICAoMHhGOTI5LCAnTScsIHUn5pyXJyksCiAgICAoMHhGOTJBLCAnTScsIHUn5rWqJyksCiAgICAoMHhGOTJCLCAnTScsIHUn54u8JyksCiAgICAoMHhGOTJDLCAnTScsIHUn6YOOJyksCiAgICAoMHhGOTJELCAnTScsIHUn5L6GJyksCiAgICBdCgpkZWYgX3NlZ18zOCgpOgogICAgcmV0dXJuIFsKICAgICgweEY5MkUsICdNJywgdSflhrcnKSwKICAgICgweEY5MkYsICdNJywgdSfli54nKSwKICAgICgweEY5MzAsICdNJywgdSfmk4QnKSwKICAgICgweEY5MzEsICdNJywgdSfmq5MnKSwKICAgICgweEY5MzIsICdNJywgdSfniJAnKSwKICAgICgweEY5MzMsICdNJywgdSfnm6cnKSwKICAgICgweEY5MzQsICdNJywgdSfogIEnKSwKICAgICgweEY5MzUsICdNJywgdSfomIYnKSwKICAgICgweEY5MzYsICdNJywgdSfomZwnKSwKICAgICgweEY5MzcsICdNJywgdSfot68nKSwKICAgICgweEY5MzgsICdNJywgdSfpnLInKSwKICAgICgweEY5MzksICdNJywgdSfpra8nKSwKICAgICgweEY5M0EsICdNJywgdSfpt7onKSwKICAgICgweEY5M0IsICdNJywgdSfnoownKSwKICAgICgweEY5M0MsICdNJywgdSfnpb8nKSwKICAgICgweEY5M0QsICdNJywgdSfntqAnKSwKICAgICgweEY5M0UsICdNJywgdSfoj4knKSwKICAgICgweEY5M0YsICdNJywgdSfpjIQnKSwKICAgICgweEY5NDAsICdNJywgdSfpub8nKSwKICAgICgweEY5NDEsICdNJywgdSfoq5YnKSwKICAgICgweEY5NDIsICdNJywgdSflo58nKSwKICAgICgweEY5NDMsICdNJywgdSflvIQnKSwKICAgICgweEY5NDQsICdNJywgdSfnsaAnKSwKICAgICgweEY5NDUsICdNJywgdSfogb4nKSwKICAgICgweEY5NDYsICdNJywgdSfniaInKSwKICAgICgweEY5NDcsICdNJywgdSfno4onKSwKICAgICgweEY5NDgsICdNJywgdSfos4InKSwKICAgICgweEY5NDksICdNJywgdSfpm7cnKSwKICAgICgweEY5NEEsICdNJywgdSflo5gnKSwKICAgICgweEY5NEIsICdNJywgdSflsaInKSwKICAgICgweEY5NEMsICdNJywgdSfmqJMnKSwKICAgICgweEY5NEQsICdNJywgdSfmt5onKSwKICAgICgweEY5NEUsICdNJywgdSfmvI8nKSwKICAgICgweEY5NEYsICdNJywgdSfntK8nKSwKICAgICgweEY5NTAsICdNJywgdSfnuLcnKSwKICAgICgweEY5NTEsICdNJywgdSfpmYsnKSwKICAgICgweEY5NTIsICdNJywgdSfli5InKSwKICAgICgweEY5NTMsICdNJywgdSfogosnKSwKICAgICgweEY5NTQsICdNJywgdSflh5wnKSwKICAgICgweEY5NTUsICdNJywgdSflh4wnKSwKICAgICgweEY5NTYsICdNJywgdSfnqJwnKSwKICAgICgweEY5NTcsICdNJywgdSfntr4nKSwKICAgICgweEY5NTgsICdNJywgdSfoj7EnKSwKICAgICgweEY5NTksICdNJywgdSfpmbUnKSwKICAgICgweEY5NUEsICdNJywgdSforoAnKSwKICAgICgweEY5NUIsICdNJywgdSfmi48nKSwKICAgICgweEY5NUMsICdNJywgdSfmqIInKSwKICAgICgweEY5NUQsICdNJywgdSfoq74nKSwKICAgICgweEY5NUUsICdNJywgdSfkuLknKSwKICAgICgweEY5NUYsICdNJywgdSflr6cnKSwKICAgICgweEY5NjAsICdNJywgdSfmgJInKSwKICAgICgweEY5NjEsICdNJywgdSfnjocnKSwKICAgICgweEY5NjIsICdNJywgdSfnlbAnKSwKICAgICgweEY5NjMsICdNJywgdSfljJcnKSwKICAgICgweEY5NjQsICdNJywgdSfno7snKSwKICAgICgweEY5NjUsICdNJywgdSfkvr8nKSwKICAgICgweEY5NjYsICdNJywgdSflvqknKSwKICAgICgweEY5NjcsICdNJywgdSfkuI0nKSwKICAgICgweEY5NjgsICdNJywgdSfms4wnKSwKICAgICgweEY5NjksICdNJywgdSfmlbgnKSwKICAgICgweEY5NkEsICdNJywgdSfntKInKSwKICAgICgweEY5NkIsICdNJywgdSflj4MnKSwKICAgICgweEY5NkMsICdNJywgdSfloZ4nKSwKICAgICgweEY5NkQsICdNJywgdSfnnIEnKSwKICAgICgweEY5NkUsICdNJywgdSfokYknKSwKICAgICgweEY5NkYsICdNJywgdSfoqqonKSwKICAgICgweEY5NzAsICdNJywgdSfmrronKSwKICAgICgweEY5NzEsICdNJywgdSfovrAnKSwKICAgICgweEY5NzIsICdNJywgdSfmsognKSwKICAgICgweEY5NzMsICdNJywgdSfmi74nKSwKICAgICgweEY5NzQsICdNJywgdSfoi6UnKSwKICAgICgweEY5NzUsICdNJywgdSfmjqAnKSwKICAgICgweEY5NzYsICdNJywgdSfnlaUnKSwKICAgICgweEY5NzcsICdNJywgdSfkuq4nKSwKICAgICgweEY5NzgsICdNJywgdSflhaknKSwKICAgICgweEY5NzksICdNJywgdSflh4knKSwKICAgICgweEY5N0EsICdNJywgdSfmooEnKSwKICAgICgweEY5N0IsICdNJywgdSfns6cnKSwKICAgICgweEY5N0MsICdNJywgdSfoia8nKSwKICAgICgweEY5N0QsICdNJywgdSfoq5InKSwKICAgICgweEY5N0UsICdNJywgdSfph48nKSwKICAgICgweEY5N0YsICdNJywgdSfli7UnKSwKICAgICgweEY5ODAsICdNJywgdSflkYInKSwKICAgICgweEY5ODEsICdNJywgdSflpbMnKSwKICAgICgweEY5ODIsICdNJywgdSflu6wnKSwKICAgICgweEY5ODMsICdNJywgdSfml4UnKSwKICAgICgweEY5ODQsICdNJywgdSfmv74nKSwKICAgICgweEY5ODUsICdNJywgdSfnpKonKSwKICAgICgweEY5ODYsICdNJywgdSfplq0nKSwKICAgICgweEY5ODcsICdNJywgdSfpqaonKSwKICAgICgweEY5ODgsICdNJywgdSfpupcnKSwKICAgICgweEY5ODksICdNJywgdSfpu44nKSwKICAgICgweEY5OEEsICdNJywgdSflipsnKSwKICAgICgweEY5OEIsICdNJywgdSfmm4YnKSwKICAgICgweEY5OEMsICdNJywgdSfmrbcnKSwKICAgICgweEY5OEQsICdNJywgdSfovaInKSwKICAgICgweEY5OEUsICdNJywgdSflubQnKSwKICAgICgweEY5OEYsICdNJywgdSfmhpAnKSwKICAgICgweEY5OTAsICdNJywgdSfmiIAnKSwKICAgICgweEY5OTEsICdNJywgdSfmkponKSwKICAgIF0KCmRlZiBfc2VnXzM5KCk6CiAgICByZXR1cm4gWwogICAgKDB4Rjk5MiwgJ00nLCB1J+a8oycpLAogICAgKDB4Rjk5MywgJ00nLCB1J+eFiScpLAogICAgKDB4Rjk5NCwgJ00nLCB1J+eSiScpLAogICAgKDB4Rjk5NSwgJ00nLCB1J+eniicpLAogICAgKDB4Rjk5NiwgJ00nLCB1J+e3tCcpLAogICAgKDB4Rjk5NywgJ00nLCB1J+iBrycpLAogICAgKDB4Rjk5OCwgJ00nLCB1J+i8picpLAogICAgKDB4Rjk5OSwgJ00nLCB1J+iTricpLAogICAgKDB4Rjk5QSwgJ00nLCB1J+mAoycpLAogICAgKDB4Rjk5QiwgJ00nLCB1J+mNiicpLAogICAgKDB4Rjk5QywgJ00nLCB1J+WIlycpLAogICAgKDB4Rjk5RCwgJ00nLCB1J+WKoycpLAogICAgKDB4Rjk5RSwgJ00nLCB1J+WSvScpLAogICAgKDB4Rjk5RiwgJ00nLCB1J+eDiCcpLAogICAgKDB4RjlBMCwgJ00nLCB1J+ijgicpLAogICAgKDB4RjlBMSwgJ00nLCB1J+iqqicpLAogICAgKDB4RjlBMiwgJ00nLCB1J+W7iScpLAogICAgKDB4RjlBMywgJ00nLCB1J+W/tScpLAogICAgKDB4RjlBNCwgJ00nLCB1J+aNuycpLAogICAgKDB4RjlBNSwgJ00nLCB1J+auricpLAogICAgKDB4RjlBNiwgJ00nLCB1J+ewvicpLAogICAgKDB4RjlBNywgJ00nLCB1J+eNtScpLAogICAgKDB4RjlBOCwgJ00nLCB1J+S7pCcpLAogICAgKDB4RjlBOSwgJ00nLCB1J+WbuScpLAogICAgKDB4RjlBQSwgJ00nLCB1J+WvpycpLAogICAgKDB4RjlBQiwgJ00nLCB1J+W2uicpLAogICAgKDB4RjlBQywgJ00nLCB1J+aAnCcpLAogICAgKDB4RjlBRCwgJ00nLCB1J+eOsicpLAogICAgKDB4RjlBRSwgJ00nLCB1J+eRqScpLAogICAgKDB4RjlBRiwgJ00nLCB1J+e+micpLAogICAgKDB4RjlCMCwgJ00nLCB1J+iBhicpLAogICAgKDB4RjlCMSwgJ00nLCB1J+mItCcpLAogICAgKDB4RjlCMiwgJ00nLCB1J+mbticpLAogICAgKDB4RjlCMywgJ00nLCB1J+mdiCcpLAogICAgKDB4RjlCNCwgJ00nLCB1J+mgmCcpLAogICAgKDB4RjlCNSwgJ00nLCB1J+S+iycpLAogICAgKDB4RjlCNiwgJ00nLCB1J+emricpLAogICAgKDB4RjlCNywgJ00nLCB1J+mGtCcpLAogICAgKDB4RjlCOCwgJ00nLCB1J+mauCcpLAogICAgKDB4RjlCOSwgJ00nLCB1J+aDoScpLAogICAgKDB4RjlCQSwgJ00nLCB1J+S6hicpLAogICAgKDB4RjlCQiwgJ00nLCB1J+WDmicpLAogICAgKDB4RjlCQywgJ00nLCB1J+WvricpLAogICAgKDB4RjlCRCwgJ00nLCB1J+WwvycpLAogICAgKDB4RjlCRSwgJ00nLCB1J+aWmScpLAogICAgKDB4RjlCRiwgJ00nLCB1J+aogicpLAogICAgKDB4RjlDMCwgJ00nLCB1J+eHjicpLAogICAgKDB4RjlDMSwgJ00nLCB1J+eZgicpLAogICAgKDB4RjlDMiwgJ00nLCB1J+iTvCcpLAogICAgKDB4RjlDMywgJ00nLCB1J+mBvCcpLAogICAgKDB4RjlDNCwgJ00nLCB1J+m+jScpLAogICAgKDB4RjlDNSwgJ00nLCB1J+aaiCcpLAogICAgKDB4RjlDNiwgJ00nLCB1J+mYricpLAogICAgKDB4RjlDNywgJ00nLCB1J+WKiScpLAogICAgKDB4RjlDOCwgJ00nLCB1J+aduycpLAogICAgKDB4RjlDOSwgJ00nLCB1J+afsycpLAogICAgKDB4RjlDQSwgJ00nLCB1J+a1gScpLAogICAgKDB4RjlDQiwgJ00nLCB1J+a6nCcpLAogICAgKDB4RjlDQywgJ00nLCB1J+eQiScpLAogICAgKDB4RjlDRCwgJ00nLCB1J+eVmScpLAogICAgKDB4RjlDRSwgJ00nLCB1J+ehqycpLAogICAgKDB4RjlDRiwgJ00nLCB1J+e0kCcpLAogICAgKDB4RjlEMCwgJ00nLCB1J+mhnicpLAogICAgKDB4RjlEMSwgJ00nLCB1J+WFrScpLAogICAgKDB4RjlEMiwgJ00nLCB1J+aIricpLAogICAgKDB4RjlEMywgJ00nLCB1J+mZuCcpLAogICAgKDB4RjlENCwgJ00nLCB1J+WAqycpLAogICAgKDB4RjlENSwgJ00nLCB1J+W0mScpLAogICAgKDB4RjlENiwgJ00nLCB1J+a3qicpLAogICAgKDB4RjlENywgJ00nLCB1J+i8qicpLAogICAgKDB4RjlEOCwgJ00nLCB1J+W+iycpLAogICAgKDB4RjlEOSwgJ00nLCB1J+aFhCcpLAogICAgKDB4RjlEQSwgJ00nLCB1J+aglycpLAogICAgKDB4RjlEQiwgJ00nLCB1J+eOhycpLAogICAgKDB4RjlEQywgJ00nLCB1J+mahicpLAogICAgKDB4RjlERCwgJ00nLCB1J+WIqScpLAogICAgKDB4RjlERSwgJ00nLCB1J+WQjycpLAogICAgKDB4RjlERiwgJ00nLCB1J+WxpScpLAogICAgKDB4RjlFMCwgJ00nLCB1J+aYkycpLAogICAgKDB4RjlFMSwgJ00nLCB1J+adjicpLAogICAgKDB4RjlFMiwgJ00nLCB1J+aiqCcpLAogICAgKDB4RjlFMywgJ00nLCB1J+azpScpLAogICAgKDB4RjlFNCwgJ00nLCB1J+eQhicpLAogICAgKDB4RjlFNSwgJ00nLCB1J+eXoicpLAogICAgKDB4RjlFNiwgJ00nLCB1J+e9uScpLAogICAgKDB4RjlFNywgJ00nLCB1J+ijjycpLAogICAgKDB4RjlFOCwgJ00nLCB1J+ijoScpLAogICAgKDB4RjlFOSwgJ00nLCB1J+mHjCcpLAogICAgKDB4RjlFQSwgJ00nLCB1J+mboicpLAogICAgKDB4RjlFQiwgJ00nLCB1J+WMvycpLAogICAgKDB4RjlFQywgJ00nLCB1J+a6uicpLAogICAgKDB4RjlFRCwgJ00nLCB1J+WQnScpLAogICAgKDB4RjlFRSwgJ00nLCB1J+eHkCcpLAogICAgKDB4RjlFRiwgJ00nLCB1J+eSmCcpLAogICAgKDB4RjlGMCwgJ00nLCB1J+iXuicpLAogICAgKDB4RjlGMSwgJ00nLCB1J+maoycpLAogICAgKDB4RjlGMiwgJ00nLCB1J+mxlycpLAogICAgKDB4RjlGMywgJ00nLCB1J+m6nycpLAogICAgKDB4RjlGNCwgJ00nLCB1J+aelycpLAogICAgKDB4RjlGNSwgJ00nLCB1J+a3iycpLAogICAgXQoKZGVmIF9zZWdfNDAoKToKICAgIHJldHVybiBbCiAgICAoMHhGOUY2LCAnTScsIHUn6IeoJyksCiAgICAoMHhGOUY3LCAnTScsIHUn56uLJyksCiAgICAoMHhGOUY4LCAnTScsIHUn56ygJyksCiAgICAoMHhGOUY5LCAnTScsIHUn57KSJyksCiAgICAoMHhGOUZBLCAnTScsIHUn54uAJyksCiAgICAoMHhGOUZCLCAnTScsIHUn54KZJyksCiAgICAoMHhGOUZDLCAnTScsIHUn6K2YJyksCiAgICAoMHhGOUZELCAnTScsIHUn5LuAJyksCiAgICAoMHhGOUZFLCAnTScsIHUn6Iy2JyksCiAgICAoMHhGOUZGLCAnTScsIHUn5Yi6JyksCiAgICAoMHhGQTAwLCAnTScsIHUn5YiHJyksCiAgICAoMHhGQTAxLCAnTScsIHUn5bqmJyksCiAgICAoMHhGQTAyLCAnTScsIHUn5ouTJyksCiAgICAoMHhGQTAzLCAnTScsIHUn57OWJyksCiAgICAoMHhGQTA0LCAnTScsIHUn5a6FJyksCiAgICAoMHhGQTA1LCAnTScsIHUn5rSeJyksCiAgICAoMHhGQTA2LCAnTScsIHUn5pq0JyksCiAgICAoMHhGQTA3LCAnTScsIHUn6Ly7JyksCiAgICAoMHhGQTA4LCAnTScsIHUn6KGMJyksCiAgICAoMHhGQTA5LCAnTScsIHUn6ZmNJyksCiAgICAoMHhGQTBBLCAnTScsIHUn6KaLJyksCiAgICAoMHhGQTBCLCAnTScsIHUn5buTJyksCiAgICAoMHhGQTBDLCAnTScsIHUn5YWAJyksCiAgICAoMHhGQTBELCAnTScsIHUn5ZeAJyksCiAgICAoMHhGQTBFLCAnVicpLAogICAgKDB4RkExMCwgJ00nLCB1J+WhmicpLAogICAgKDB4RkExMSwgJ1YnKSwKICAgICgweEZBMTIsICdNJywgdSfmmbQnKSwKICAgICgweEZBMTMsICdWJyksCiAgICAoMHhGQTE1LCAnTScsIHUn5YeeJyksCiAgICAoMHhGQTE2LCAnTScsIHUn54yqJyksCiAgICAoMHhGQTE3LCAnTScsIHUn55uKJyksCiAgICAoMHhGQTE4LCAnTScsIHUn56S8JyksCiAgICAoMHhGQTE5LCAnTScsIHUn56WeJyksCiAgICAoMHhGQTFBLCAnTScsIHUn56WlJyksCiAgICAoMHhGQTFCLCAnTScsIHUn56aPJyksCiAgICAoMHhGQTFDLCAnTScsIHUn6Z2WJyksCiAgICAoMHhGQTFELCAnTScsIHUn57K+JyksCiAgICAoMHhGQTFFLCAnTScsIHUn5769JyksCiAgICAoMHhGQTFGLCAnVicpLAogICAgKDB4RkEyMCwgJ00nLCB1J+iYkicpLAogICAgKDB4RkEyMSwgJ1YnKSwKICAgICgweEZBMjIsICdNJywgdSfoq7gnKSwKICAgICgweEZBMjMsICdWJyksCiAgICAoMHhGQTI1LCAnTScsIHUn6YC4JyksCiAgICAoMHhGQTI2LCAnTScsIHUn6YO9JyksCiAgICAoMHhGQTI3LCAnVicpLAogICAgKDB4RkEyQSwgJ00nLCB1J+mjrycpLAogICAgKDB4RkEyQiwgJ00nLCB1J+mjvCcpLAogICAgKDB4RkEyQywgJ00nLCB1J+mkqCcpLAogICAgKDB4RkEyRCwgJ00nLCB1J+m2tCcpLAogICAgKDB4RkEyRSwgJ00nLCB1J+mDnicpLAogICAgKDB4RkEyRiwgJ00nLCB1J+matycpLAogICAgKDB4RkEzMCwgJ00nLCB1J+S+ricpLAogICAgKDB4RkEzMSwgJ00nLCB1J+WDpycpLAogICAgKDB4RkEzMiwgJ00nLCB1J+WFjScpLAogICAgKDB4RkEzMywgJ00nLCB1J+WLiScpLAogICAgKDB4RkEzNCwgJ00nLCB1J+WLpCcpLAogICAgKDB4RkEzNSwgJ00nLCB1J+WNkScpLAogICAgKDB4RkEzNiwgJ00nLCB1J+WWnScpLAogICAgKDB4RkEzNywgJ00nLCB1J+WYhicpLAogICAgKDB4RkEzOCwgJ00nLCB1J+WZqCcpLAogICAgKDB4RkEzOSwgJ00nLCB1J+WhgCcpLAogICAgKDB4RkEzQSwgJ00nLCB1J+WiqCcpLAogICAgKDB4RkEzQiwgJ00nLCB1J+WxpCcpLAogICAgKDB4RkEzQywgJ00nLCB1J+WxricpLAogICAgKDB4RkEzRCwgJ00nLCB1J+aClCcpLAogICAgKDB4RkEzRSwgJ00nLCB1J+aFqCcpLAogICAgKDB4RkEzRiwgJ00nLCB1J+aGjicpLAogICAgKDB4RkE0MCwgJ00nLCB1J+aHsicpLAogICAgKDB4RkE0MSwgJ00nLCB1J+aVjycpLAogICAgKDB4RkE0MiwgJ00nLCB1J+aXoicpLAogICAgKDB4RkE0MywgJ00nLCB1J+aakScpLAogICAgKDB4RkE0NCwgJ00nLCB1J+aihScpLAogICAgKDB4RkE0NSwgJ00nLCB1J+a1tycpLAogICAgKDB4RkE0NiwgJ00nLCB1J+a4micpLAogICAgKDB4RkE0NywgJ00nLCB1J+a8oicpLAogICAgKDB4RkE0OCwgJ00nLCB1J+eFricpLAogICAgKDB4RkE0OSwgJ00nLCB1J+eIqycpLAogICAgKDB4RkE0QSwgJ00nLCB1J+eQoicpLAogICAgKDB4RkE0QiwgJ00nLCB1J+eikScpLAogICAgKDB4RkE0QywgJ00nLCB1J+ekvicpLAogICAgKDB4RkE0RCwgJ00nLCB1J+eliScpLAogICAgKDB4RkE0RSwgJ00nLCB1J+eliCcpLAogICAgKDB4RkE0RiwgJ00nLCB1J+elkCcpLAogICAgKDB4RkE1MCwgJ00nLCB1J+ellicpLAogICAgKDB4RkE1MSwgJ00nLCB1J+elnScpLAogICAgKDB4RkE1MiwgJ00nLCB1J+emjScpLAogICAgKDB4RkE1MywgJ00nLCB1J+emjicpLAogICAgKDB4RkE1NCwgJ00nLCB1J+epgCcpLAogICAgKDB4RkE1NSwgJ00nLCB1J+eqgScpLAogICAgKDB4RkE1NiwgJ00nLCB1J+evgCcpLAogICAgKDB4RkE1NywgJ00nLCB1J+e3tCcpLAogICAgKDB4RkE1OCwgJ00nLCB1J+e4iScpLAogICAgKDB4RkE1OSwgJ00nLCB1J+e5gScpLAogICAgKDB4RkE1QSwgJ00nLCB1J+e9sicpLAogICAgKDB4RkE1QiwgJ00nLCB1J+iAhScpLAogICAgKDB4RkE1QywgJ00nLCB1J+iHrScpLAogICAgKDB4RkE1RCwgJ00nLCB1J+iJuScpLAogICAgKDB4RkE1RiwgJ00nLCB1J+iRlycpLAogICAgXQoKZGVmIF9zZWdfNDEoKToKICAgIHJldHVybiBbCiAgICAoMHhGQTYwLCAnTScsIHUn6KSQJyksCiAgICAoMHhGQTYxLCAnTScsIHUn6KaWJyksCiAgICAoMHhGQTYyLCAnTScsIHUn6KyBJyksCiAgICAoMHhGQTYzLCAnTScsIHUn6Ky5JyksCiAgICAoMHhGQTY0LCAnTScsIHUn6LOTJyksCiAgICAoMHhGQTY1LCAnTScsIHUn6LSIJyksCiAgICAoMHhGQTY2LCAnTScsIHUn6L62JyksCiAgICAoMHhGQTY3LCAnTScsIHUn6YC4JyksCiAgICAoMHhGQTY4LCAnTScsIHUn6ZujJyksCiAgICAoMHhGQTY5LCAnTScsIHUn6Z+/JyksCiAgICAoMHhGQTZBLCAnTScsIHUn6aC7JyksCiAgICAoMHhGQTZCLCAnTScsIHUn5oG1JyksCiAgICAoMHhGQTZDLCAnTScsIHUn8KSLricpLAogICAgKDB4RkE2RCwgJ00nLCB1J+iImCcpLAogICAgKDB4RkE2RSwgJ1gnKSwKICAgICgweEZBNzAsICdNJywgdSfkuKYnKSwKICAgICgweEZBNzEsICdNJywgdSflhrUnKSwKICAgICgweEZBNzIsICdNJywgdSflhagnKSwKICAgICgweEZBNzMsICdNJywgdSfkvoAnKSwKICAgICgweEZBNzQsICdNJywgdSflhYUnKSwKICAgICgweEZBNzUsICdNJywgdSflhoAnKSwKICAgICgweEZBNzYsICdNJywgdSfli4cnKSwKICAgICgweEZBNzcsICdNJywgdSfli7onKSwKICAgICgweEZBNzgsICdNJywgdSfllp0nKSwKICAgICgweEZBNzksICdNJywgdSfllZUnKSwKICAgICgweEZBN0EsICdNJywgdSfllpknKSwKICAgICgweEZBN0IsICdNJywgdSfll6InKSwKICAgICgweEZBN0MsICdNJywgdSfloZonKSwKICAgICgweEZBN0QsICdNJywgdSflorMnKSwKICAgICgweEZBN0UsICdNJywgdSflpYQnKSwKICAgICgweEZBN0YsICdNJywgdSflpZQnKSwKICAgICgweEZBODAsICdNJywgdSflqaInKSwKICAgICgweEZBODEsICdNJywgdSflrKgnKSwKICAgICgweEZBODIsICdNJywgdSflu5InKSwKICAgICgweEZBODMsICdNJywgdSflu5knKSwKICAgICgweEZBODQsICdNJywgdSflvaknKSwKICAgICgweEZBODUsICdNJywgdSflvq0nKSwKICAgICgweEZBODYsICdNJywgdSfmg5gnKSwKICAgICgweEZBODcsICdNJywgdSfmhY4nKSwKICAgICgweEZBODgsICdNJywgdSfmhIgnKSwKICAgICgweEZBODksICdNJywgdSfmho4nKSwKICAgICgweEZBOEEsICdNJywgdSfmhaAnKSwKICAgICgweEZBOEIsICdNJywgdSfmh7InKSwKICAgICgweEZBOEMsICdNJywgdSfmiLQnKSwKICAgICgweEZBOEQsICdNJywgdSfmj4QnKSwKICAgICgweEZBOEUsICdNJywgdSfmkJwnKSwKICAgICgweEZBOEYsICdNJywgdSfmkZInKSwKICAgICgweEZBOTAsICdNJywgdSfmlZYnKSwKICAgICgweEZBOTEsICdNJywgdSfmmbQnKSwKICAgICgweEZBOTIsICdNJywgdSfmnJcnKSwKICAgICgweEZBOTMsICdNJywgdSfmnJsnKSwKICAgICgweEZBOTQsICdNJywgdSfmnZYnKSwKICAgICgweEZBOTUsICdNJywgdSfmrbknKSwKICAgICgweEZBOTYsICdNJywgdSfmrronKSwKICAgICgweEZBOTcsICdNJywgdSfmtYEnKSwKICAgICgweEZBOTgsICdNJywgdSfmu5snKSwKICAgICgweEZBOTksICdNJywgdSfmu4snKSwKICAgICgweEZBOUEsICdNJywgdSfmvKInKSwKICAgICgweEZBOUIsICdNJywgdSfngJ4nKSwKICAgICgweEZBOUMsICdNJywgdSfnha4nKSwKICAgICgweEZBOUQsICdNJywgdSfnnqcnKSwKICAgICgweEZBOUUsICdNJywgdSfniLUnKSwKICAgICgweEZBOUYsICdNJywgdSfniq8nKSwKICAgICgweEZBQTAsICdNJywgdSfnjKonKSwKICAgICgweEZBQTEsICdNJywgdSfnkbEnKSwKICAgICgweEZBQTIsICdNJywgdSfnlIYnKSwKICAgICgweEZBQTMsICdNJywgdSfnlLsnKSwKICAgICgweEZBQTQsICdNJywgdSfnmJ0nKSwKICAgICgweEZBQTUsICdNJywgdSfnmJ8nKSwKICAgICgweEZBQTYsICdNJywgdSfnm4onKSwKICAgICgweEZBQTcsICdNJywgdSfnm5snKSwKICAgICgweEZBQTgsICdNJywgdSfnm7QnKSwKICAgICgweEZBQTksICdNJywgdSfnnYonKSwKICAgICgweEZBQUEsICdNJywgdSfnnYAnKSwKICAgICgweEZBQUIsICdNJywgdSfno4wnKSwKICAgICgweEZBQUMsICdNJywgdSfnqrEnKSwKICAgICgweEZBQUQsICdNJywgdSfnr4AnKSwKICAgICgweEZBQUUsICdNJywgdSfnsbsnKSwKICAgICgweEZBQUYsICdNJywgdSfntZsnKSwKICAgICgweEZBQjAsICdNJywgdSfnt7QnKSwKICAgICgweEZBQjEsICdNJywgdSfnvL4nKSwKICAgICgweEZBQjIsICdNJywgdSfogIUnKSwKICAgICgweEZBQjMsICdNJywgdSfojZInKSwKICAgICgweEZBQjQsICdNJywgdSfoj68nKSwKICAgICgweEZBQjUsICdNJywgdSfonbknKSwKICAgICgweEZBQjYsICdNJywgdSfopYEnKSwKICAgICgweEZBQjcsICdNJywgdSfopoYnKSwKICAgICgweEZBQjgsICdNJywgdSfoppYnKSwKICAgICgweEZBQjksICdNJywgdSfoqr8nKSwKICAgICgweEZBQkEsICdNJywgdSfoq7gnKSwKICAgICgweEZBQkIsICdNJywgdSfoq4snKSwKICAgICgweEZBQkMsICdNJywgdSforIEnKSwKICAgICgweEZBQkQsICdNJywgdSfoq74nKSwKICAgICgweEZBQkUsICdNJywgdSfoq60nKSwKICAgICgweEZBQkYsICdNJywgdSforLknKSwKICAgICgweEZBQzAsICdNJywgdSforoonKSwKICAgICgweEZBQzEsICdNJywgdSfotIgnKSwKICAgICgweEZBQzIsICdNJywgdSfovLgnKSwKICAgICgweEZBQzMsICdNJywgdSfpgbInKSwKICAgICgweEZBQzQsICdNJywgdSfphpknKSwKICAgIF0KCmRlZiBfc2VnXzQyKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkFDNSwgJ00nLCB1J+mJticpLAogICAgKDB4RkFDNiwgJ00nLCB1J+mZvCcpLAogICAgKDB4RkFDNywgJ00nLCB1J+mboycpLAogICAgKDB4RkFDOCwgJ00nLCB1J+mdlicpLAogICAgKDB4RkFDOSwgJ00nLCB1J+mfmycpLAogICAgKDB4RkFDQSwgJ00nLCB1J+mfvycpLAogICAgKDB4RkFDQiwgJ00nLCB1J+mgiycpLAogICAgKDB4RkFDQywgJ00nLCB1J+mguycpLAogICAgKDB4RkFDRCwgJ00nLCB1J+mskicpLAogICAgKDB4RkFDRSwgJ00nLCB1J+m+nCcpLAogICAgKDB4RkFDRiwgJ00nLCB1J/CioYonKSwKICAgICgweEZBRDAsICdNJywgdSfwoqGEJyksCiAgICAoMHhGQUQxLCAnTScsIHUn8KOPlScpLAogICAgKDB4RkFEMiwgJ00nLCB1J+OunScpLAogICAgKDB4RkFEMywgJ00nLCB1J+SAmCcpLAogICAgKDB4RkFENCwgJ00nLCB1J+SAuScpLAogICAgKDB4RkFENSwgJ00nLCB1J/CliYknKSwKICAgICgweEZBRDYsICdNJywgdSfwpbOQJyksCiAgICAoMHhGQUQ3LCAnTScsIHUn8Ke7kycpLAogICAgKDB4RkFEOCwgJ00nLCB1J+m9gycpLAogICAgKDB4RkFEOSwgJ00nLCB1J+m+jicpLAogICAgKDB4RkFEQSwgJ1gnKSwKICAgICgweEZCMDAsICdNJywgdSdmZicpLAogICAgKDB4RkIwMSwgJ00nLCB1J2ZpJyksCiAgICAoMHhGQjAyLCAnTScsIHUnZmwnKSwKICAgICgweEZCMDMsICdNJywgdSdmZmknKSwKICAgICgweEZCMDQsICdNJywgdSdmZmwnKSwKICAgICgweEZCMDUsICdNJywgdSdzdCcpLAogICAgKDB4RkIwNywgJ1gnKSwKICAgICgweEZCMTMsICdNJywgdSfVtNW2JyksCiAgICAoMHhGQjE0LCAnTScsIHUn1bTVpScpLAogICAgKDB4RkIxNSwgJ00nLCB1J9W01asnKSwKICAgICgweEZCMTYsICdNJywgdSfVvtW2JyksCiAgICAoMHhGQjE3LCAnTScsIHUn1bTVrScpLAogICAgKDB4RkIxOCwgJ1gnKSwKICAgICgweEZCMUQsICdNJywgdSfXmda0JyksCiAgICAoMHhGQjFFLCAnVicpLAogICAgKDB4RkIxRiwgJ00nLCB1J9ey1rcnKSwKICAgICgweEZCMjAsICdNJywgdSfXoicpLAogICAgKDB4RkIyMSwgJ00nLCB1J9eQJyksCiAgICAoMHhGQjIyLCAnTScsIHUn15MnKSwKICAgICgweEZCMjMsICdNJywgdSfXlCcpLAogICAgKDB4RkIyNCwgJ00nLCB1J9ebJyksCiAgICAoMHhGQjI1LCAnTScsIHUn15wnKSwKICAgICgweEZCMjYsICdNJywgdSfXnScpLAogICAgKDB4RkIyNywgJ00nLCB1J9eoJyksCiAgICAoMHhGQjI4LCAnTScsIHUn16onKSwKICAgICgweEZCMjksICczJywgdScrJyksCiAgICAoMHhGQjJBLCAnTScsIHUn16nXgScpLAogICAgKDB4RkIyQiwgJ00nLCB1J9ep14InKSwKICAgICgweEZCMkMsICdNJywgdSfXqda814EnKSwKICAgICgweEZCMkQsICdNJywgdSfXqda814InKSwKICAgICgweEZCMkUsICdNJywgdSfXkNa3JyksCiAgICAoMHhGQjJGLCAnTScsIHUn15DWuCcpLAogICAgKDB4RkIzMCwgJ00nLCB1J9eQ1rwnKSwKICAgICgweEZCMzEsICdNJywgdSfXkda8JyksCiAgICAoMHhGQjMyLCAnTScsIHUn15LWvCcpLAogICAgKDB4RkIzMywgJ00nLCB1J9eT1rwnKSwKICAgICgweEZCMzQsICdNJywgdSfXlNa8JyksCiAgICAoMHhGQjM1LCAnTScsIHUn15XWvCcpLAogICAgKDB4RkIzNiwgJ00nLCB1J9eW1rwnKSwKICAgICgweEZCMzcsICdYJyksCiAgICAoMHhGQjM4LCAnTScsIHUn15jWvCcpLAogICAgKDB4RkIzOSwgJ00nLCB1J9eZ1rwnKSwKICAgICgweEZCM0EsICdNJywgdSfXmta8JyksCiAgICAoMHhGQjNCLCAnTScsIHUn15vWvCcpLAogICAgKDB4RkIzQywgJ00nLCB1J9ec1rwnKSwKICAgICgweEZCM0QsICdYJyksCiAgICAoMHhGQjNFLCAnTScsIHUn157WvCcpLAogICAgKDB4RkIzRiwgJ1gnKSwKICAgICgweEZCNDAsICdNJywgdSfXoNa8JyksCiAgICAoMHhGQjQxLCAnTScsIHUn16HWvCcpLAogICAgKDB4RkI0MiwgJ1gnKSwKICAgICgweEZCNDMsICdNJywgdSfXo9a8JyksCiAgICAoMHhGQjQ0LCAnTScsIHUn16TWvCcpLAogICAgKDB4RkI0NSwgJ1gnKSwKICAgICgweEZCNDYsICdNJywgdSfXpta8JyksCiAgICAoMHhGQjQ3LCAnTScsIHUn16fWvCcpLAogICAgKDB4RkI0OCwgJ00nLCB1J9eo1rwnKSwKICAgICgweEZCNDksICdNJywgdSfXqda8JyksCiAgICAoMHhGQjRBLCAnTScsIHUn16rWvCcpLAogICAgKDB4RkI0QiwgJ00nLCB1J9eV1rknKSwKICAgICgweEZCNEMsICdNJywgdSfXkda/JyksCiAgICAoMHhGQjRELCAnTScsIHUn15vWvycpLAogICAgKDB4RkI0RSwgJ00nLCB1J9ek1r8nKSwKICAgICgweEZCNEYsICdNJywgdSfXkNecJyksCiAgICAoMHhGQjUwLCAnTScsIHUn2bEnKSwKICAgICgweEZCNTIsICdNJywgdSfZuycpLAogICAgKDB4RkI1NiwgJ00nLCB1J9m+JyksCiAgICAoMHhGQjVBLCAnTScsIHUn2oAnKSwKICAgICgweEZCNUUsICdNJywgdSfZuicpLAogICAgKDB4RkI2MiwgJ00nLCB1J9m/JyksCiAgICAoMHhGQjY2LCAnTScsIHUn2bknKSwKICAgICgweEZCNkEsICdNJywgdSfapCcpLAogICAgKDB4RkI2RSwgJ00nLCB1J9qmJyksCiAgICAoMHhGQjcyLCAnTScsIHUn2oQnKSwKICAgICgweEZCNzYsICdNJywgdSfagycpLAogICAgKDB4RkI3QSwgJ00nLCB1J9qGJyksCiAgICAoMHhGQjdFLCAnTScsIHUn2ocnKSwKICAgICgweEZCODIsICdNJywgdSfajScpLAogICAgXQoKZGVmIF9zZWdfNDMoKToKICAgIHJldHVybiBbCiAgICAoMHhGQjg0LCAnTScsIHUn2ownKSwKICAgICgweEZCODYsICdNJywgdSfajicpLAogICAgKDB4RkI4OCwgJ00nLCB1J9qIJyksCiAgICAoMHhGQjhBLCAnTScsIHUn2pgnKSwKICAgICgweEZCOEMsICdNJywgdSfakScpLAogICAgKDB4RkI4RSwgJ00nLCB1J9qpJyksCiAgICAoMHhGQjkyLCAnTScsIHUn2q8nKSwKICAgICgweEZCOTYsICdNJywgdSfasycpLAogICAgKDB4RkI5QSwgJ00nLCB1J9qxJyksCiAgICAoMHhGQjlFLCAnTScsIHUn2ronKSwKICAgICgweEZCQTAsICdNJywgdSfauycpLAogICAgKDB4RkJBNCwgJ00nLCB1J9uAJyksCiAgICAoMHhGQkE2LCAnTScsIHUn24EnKSwKICAgICgweEZCQUEsICdNJywgdSfavicpLAogICAgKDB4RkJBRSwgJ00nLCB1J9uSJyksCiAgICAoMHhGQkIwLCAnTScsIHUn25MnKSwKICAgICgweEZCQjIsICdWJyksCiAgICAoMHhGQkMyLCAnWCcpLAogICAgKDB4RkJEMywgJ00nLCB1J9qtJyksCiAgICAoMHhGQkQ3LCAnTScsIHUn24cnKSwKICAgICgweEZCRDksICdNJywgdSfbhicpLAogICAgKDB4RkJEQiwgJ00nLCB1J9uIJyksCiAgICAoMHhGQkRELCAnTScsIHUn24fZtCcpLAogICAgKDB4RkJERSwgJ00nLCB1J9uLJyksCiAgICAoMHhGQkUwLCAnTScsIHUn24UnKSwKICAgICgweEZCRTIsICdNJywgdSfbiScpLAogICAgKDB4RkJFNCwgJ00nLCB1J9uQJyksCiAgICAoMHhGQkU4LCAnTScsIHUn2YknKSwKICAgICgweEZCRUEsICdNJywgdSfYptinJyksCiAgICAoMHhGQkVDLCAnTScsIHUn2KbblScpLAogICAgKDB4RkJFRSwgJ00nLCB1J9im2YgnKSwKICAgICgweEZCRjAsICdNJywgdSfYptuHJyksCiAgICAoMHhGQkYyLCAnTScsIHUn2KbbhicpLAogICAgKDB4RkJGNCwgJ00nLCB1J9im24gnKSwKICAgICgweEZCRjYsICdNJywgdSfYptuQJyksCiAgICAoMHhGQkY5LCAnTScsIHUn2KbZiScpLAogICAgKDB4RkJGQywgJ00nLCB1J9uMJyksCiAgICAoMHhGQzAwLCAnTScsIHUn2KbYrCcpLAogICAgKDB4RkMwMSwgJ00nLCB1J9im2K0nKSwKICAgICgweEZDMDIsICdNJywgdSfYptmFJyksCiAgICAoMHhGQzAzLCAnTScsIHUn2KbZiScpLAogICAgKDB4RkMwNCwgJ00nLCB1J9im2YonKSwKICAgICgweEZDMDUsICdNJywgdSfYqNisJyksCiAgICAoMHhGQzA2LCAnTScsIHUn2KjYrScpLAogICAgKDB4RkMwNywgJ00nLCB1J9io2K4nKSwKICAgICgweEZDMDgsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQzA5LCAnTScsIHUn2KjZiScpLAogICAgKDB4RkMwQSwgJ00nLCB1J9io2YonKSwKICAgICgweEZDMEIsICdNJywgdSfYqtisJyksCiAgICAoMHhGQzBDLCAnTScsIHUn2KrYrScpLAogICAgKDB4RkMwRCwgJ00nLCB1J9iq2K4nKSwKICAgICgweEZDMEUsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQzBGLCAnTScsIHUn2KrZiScpLAogICAgKDB4RkMxMCwgJ00nLCB1J9iq2YonKSwKICAgICgweEZDMTEsICdNJywgdSfYq9isJyksCiAgICAoMHhGQzEyLCAnTScsIHUn2KvZhScpLAogICAgKDB4RkMxMywgJ00nLCB1J9ir2YknKSwKICAgICgweEZDMTQsICdNJywgdSfYq9mKJyksCiAgICAoMHhGQzE1LCAnTScsIHUn2KzYrScpLAogICAgKDB4RkMxNiwgJ00nLCB1J9is2YUnKSwKICAgICgweEZDMTcsICdNJywgdSfYrdisJyksCiAgICAoMHhGQzE4LCAnTScsIHUn2K3ZhScpLAogICAgKDB4RkMxOSwgJ00nLCB1J9iu2KwnKSwKICAgICgweEZDMUEsICdNJywgdSfYrtitJyksCiAgICAoMHhGQzFCLCAnTScsIHUn2K7ZhScpLAogICAgKDB4RkMxQywgJ00nLCB1J9iz2KwnKSwKICAgICgweEZDMUQsICdNJywgdSfYs9itJyksCiAgICAoMHhGQzFFLCAnTScsIHUn2LPYricpLAogICAgKDB4RkMxRiwgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDMjAsICdNJywgdSfYtditJyksCiAgICAoMHhGQzIxLCAnTScsIHUn2LXZhScpLAogICAgKDB4RkMyMiwgJ00nLCB1J9i22KwnKSwKICAgICgweEZDMjMsICdNJywgdSfYttitJyksCiAgICAoMHhGQzI0LCAnTScsIHUn2LbYricpLAogICAgKDB4RkMyNSwgJ00nLCB1J9i22YUnKSwKICAgICgweEZDMjYsICdNJywgdSfYt9itJyksCiAgICAoMHhGQzI3LCAnTScsIHUn2LfZhScpLAogICAgKDB4RkMyOCwgJ00nLCB1J9i42YUnKSwKICAgICgweEZDMjksICdNJywgdSfYudisJyksCiAgICAoMHhGQzJBLCAnTScsIHUn2LnZhScpLAogICAgKDB4RkMyQiwgJ00nLCB1J9i62KwnKSwKICAgICgweEZDMkMsICdNJywgdSfYutmFJyksCiAgICAoMHhGQzJELCAnTScsIHUn2YHYrCcpLAogICAgKDB4RkMyRSwgJ00nLCB1J9mB2K0nKSwKICAgICgweEZDMkYsICdNJywgdSfZgdiuJyksCiAgICAoMHhGQzMwLCAnTScsIHUn2YHZhScpLAogICAgKDB4RkMzMSwgJ00nLCB1J9mB2YknKSwKICAgICgweEZDMzIsICdNJywgdSfZgdmKJyksCiAgICAoMHhGQzMzLCAnTScsIHUn2YLYrScpLAogICAgKDB4RkMzNCwgJ00nLCB1J9mC2YUnKSwKICAgICgweEZDMzUsICdNJywgdSfZgtmJJyksCiAgICAoMHhGQzM2LCAnTScsIHUn2YLZiicpLAogICAgKDB4RkMzNywgJ00nLCB1J9mD2KcnKSwKICAgICgweEZDMzgsICdNJywgdSfZg9isJyksCiAgICAoMHhGQzM5LCAnTScsIHUn2YPYrScpLAogICAgKDB4RkMzQSwgJ00nLCB1J9mD2K4nKSwKICAgICgweEZDM0IsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQzNDLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkMzRCwgJ00nLCB1J9mD2YknKSwKICAgICgweEZDM0UsICdNJywgdSfZg9mKJyksCiAgICBdCgpkZWYgX3NlZ180NCgpOgogICAgcmV0dXJuIFsKICAgICgweEZDM0YsICdNJywgdSfZhNisJyksCiAgICAoMHhGQzQwLCAnTScsIHUn2YTYrScpLAogICAgKDB4RkM0MSwgJ00nLCB1J9mE2K4nKSwKICAgICgweEZDNDIsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQzQzLCAnTScsIHUn2YTZiScpLAogICAgKDB4RkM0NCwgJ00nLCB1J9mE2YonKSwKICAgICgweEZDNDUsICdNJywgdSfZhdisJyksCiAgICAoMHhGQzQ2LCAnTScsIHUn2YXYrScpLAogICAgKDB4RkM0NywgJ00nLCB1J9mF2K4nKSwKICAgICgweEZDNDgsICdNJywgdSfZhdmFJyksCiAgICAoMHhGQzQ5LCAnTScsIHUn2YXZiScpLAogICAgKDB4RkM0QSwgJ00nLCB1J9mF2YonKSwKICAgICgweEZDNEIsICdNJywgdSfZhtisJyksCiAgICAoMHhGQzRDLCAnTScsIHUn2YbYrScpLAogICAgKDB4RkM0RCwgJ00nLCB1J9mG2K4nKSwKICAgICgweEZDNEUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQzRGLCAnTScsIHUn2YbZiScpLAogICAgKDB4RkM1MCwgJ00nLCB1J9mG2YonKSwKICAgICgweEZDNTEsICdNJywgdSfZh9isJyksCiAgICAoMHhGQzUyLCAnTScsIHUn2YfZhScpLAogICAgKDB4RkM1MywgJ00nLCB1J9mH2YknKSwKICAgICgweEZDNTQsICdNJywgdSfZh9mKJyksCiAgICAoMHhGQzU1LCAnTScsIHUn2YrYrCcpLAogICAgKDB4RkM1NiwgJ00nLCB1J9mK2K0nKSwKICAgICgweEZDNTcsICdNJywgdSfZitiuJyksCiAgICAoMHhGQzU4LCAnTScsIHUn2YrZhScpLAogICAgKDB4RkM1OSwgJ00nLCB1J9mK2YknKSwKICAgICgweEZDNUEsICdNJywgdSfZitmKJyksCiAgICAoMHhGQzVCLCAnTScsIHUn2LDZsCcpLAogICAgKDB4RkM1QywgJ00nLCB1J9ix2bAnKSwKICAgICgweEZDNUQsICdNJywgdSfZidmwJyksCiAgICAoMHhGQzVFLCAnMycsIHUnINmM2ZEnKSwKICAgICgweEZDNUYsICczJywgdScg2Y3ZkScpLAogICAgKDB4RkM2MCwgJzMnLCB1JyDZjtmRJyksCiAgICAoMHhGQzYxLCAnMycsIHUnINmP2ZEnKSwKICAgICgweEZDNjIsICczJywgdScg2ZDZkScpLAogICAgKDB4RkM2MywgJzMnLCB1JyDZkdmwJyksCiAgICAoMHhGQzY0LCAnTScsIHUn2KbYsScpLAogICAgKDB4RkM2NSwgJ00nLCB1J9im2LInKSwKICAgICgweEZDNjYsICdNJywgdSfYptmFJyksCiAgICAoMHhGQzY3LCAnTScsIHUn2KbZhicpLAogICAgKDB4RkM2OCwgJ00nLCB1J9im2YknKSwKICAgICgweEZDNjksICdNJywgdSfYptmKJyksCiAgICAoMHhGQzZBLCAnTScsIHUn2KjYsScpLAogICAgKDB4RkM2QiwgJ00nLCB1J9io2LInKSwKICAgICgweEZDNkMsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQzZELCAnTScsIHUn2KjZhicpLAogICAgKDB4RkM2RSwgJ00nLCB1J9io2YknKSwKICAgICgweEZDNkYsICdNJywgdSfYqNmKJyksCiAgICAoMHhGQzcwLCAnTScsIHUn2KrYsScpLAogICAgKDB4RkM3MSwgJ00nLCB1J9iq2LInKSwKICAgICgweEZDNzIsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQzczLCAnTScsIHUn2KrZhicpLAogICAgKDB4RkM3NCwgJ00nLCB1J9iq2YknKSwKICAgICgweEZDNzUsICdNJywgdSfYqtmKJyksCiAgICAoMHhGQzc2LCAnTScsIHUn2KvYsScpLAogICAgKDB4RkM3NywgJ00nLCB1J9ir2LInKSwKICAgICgweEZDNzgsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQzc5LCAnTScsIHUn2KvZhicpLAogICAgKDB4RkM3QSwgJ00nLCB1J9ir2YknKSwKICAgICgweEZDN0IsICdNJywgdSfYq9mKJyksCiAgICAoMHhGQzdDLCAnTScsIHUn2YHZiScpLAogICAgKDB4RkM3RCwgJ00nLCB1J9mB2YonKSwKICAgICgweEZDN0UsICdNJywgdSfZgtmJJyksCiAgICAoMHhGQzdGLCAnTScsIHUn2YLZiicpLAogICAgKDB4RkM4MCwgJ00nLCB1J9mD2KcnKSwKICAgICgweEZDODEsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQzgyLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkM4MywgJ00nLCB1J9mD2YknKSwKICAgICgweEZDODQsICdNJywgdSfZg9mKJyksCiAgICAoMHhGQzg1LCAnTScsIHUn2YTZhScpLAogICAgKDB4RkM4NiwgJ00nLCB1J9mE2YknKSwKICAgICgweEZDODcsICdNJywgdSfZhNmKJyksCiAgICAoMHhGQzg4LCAnTScsIHUn2YXYpycpLAogICAgKDB4RkM4OSwgJ00nLCB1J9mF2YUnKSwKICAgICgweEZDOEEsICdNJywgdSfZhtixJyksCiAgICAoMHhGQzhCLCAnTScsIHUn2YbYsicpLAogICAgKDB4RkM4QywgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDOEQsICdNJywgdSfZhtmGJyksCiAgICAoMHhGQzhFLCAnTScsIHUn2YbZiScpLAogICAgKDB4RkM4RiwgJ00nLCB1J9mG2YonKSwKICAgICgweEZDOTAsICdNJywgdSfZidmwJyksCiAgICAoMHhGQzkxLCAnTScsIHUn2YrYsScpLAogICAgKDB4RkM5MiwgJ00nLCB1J9mK2LInKSwKICAgICgweEZDOTMsICdNJywgdSfZitmFJyksCiAgICAoMHhGQzk0LCAnTScsIHUn2YrZhicpLAogICAgKDB4RkM5NSwgJ00nLCB1J9mK2YknKSwKICAgICgweEZDOTYsICdNJywgdSfZitmKJyksCiAgICAoMHhGQzk3LCAnTScsIHUn2KbYrCcpLAogICAgKDB4RkM5OCwgJ00nLCB1J9im2K0nKSwKICAgICgweEZDOTksICdNJywgdSfYptiuJyksCiAgICAoMHhGQzlBLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkM5QiwgJ00nLCB1J9im2YcnKSwKICAgICgweEZDOUMsICdNJywgdSfYqNisJyksCiAgICAoMHhGQzlELCAnTScsIHUn2KjYrScpLAogICAgKDB4RkM5RSwgJ00nLCB1J9io2K4nKSwKICAgICgweEZDOUYsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQ0EwLCAnTScsIHUn2KjZhycpLAogICAgKDB4RkNBMSwgJ00nLCB1J9iq2KwnKSwKICAgICgweEZDQTIsICdNJywgdSfYqtitJyksCiAgICBdCgpkZWYgX3NlZ180NSgpOgogICAgcmV0dXJuIFsKICAgICgweEZDQTMsICdNJywgdSfYqtiuJyksCiAgICAoMHhGQ0E0LCAnTScsIHUn2KrZhScpLAogICAgKDB4RkNBNSwgJ00nLCB1J9iq2YcnKSwKICAgICgweEZDQTYsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQ0E3LCAnTScsIHUn2KzYrScpLAogICAgKDB4RkNBOCwgJ00nLCB1J9is2YUnKSwKICAgICgweEZDQTksICdNJywgdSfYrdisJyksCiAgICAoMHhGQ0FBLCAnTScsIHUn2K3ZhScpLAogICAgKDB4RkNBQiwgJ00nLCB1J9iu2KwnKSwKICAgICgweEZDQUMsICdNJywgdSfYrtmFJyksCiAgICAoMHhGQ0FELCAnTScsIHUn2LPYrCcpLAogICAgKDB4RkNBRSwgJ00nLCB1J9iz2K0nKSwKICAgICgweEZDQUYsICdNJywgdSfYs9iuJyksCiAgICAoMHhGQ0IwLCAnTScsIHUn2LPZhScpLAogICAgKDB4RkNCMSwgJ00nLCB1J9i12K0nKSwKICAgICgweEZDQjIsICdNJywgdSfYtdiuJyksCiAgICAoMHhGQ0IzLCAnTScsIHUn2LXZhScpLAogICAgKDB4RkNCNCwgJ00nLCB1J9i22KwnKSwKICAgICgweEZDQjUsICdNJywgdSfYttitJyksCiAgICAoMHhGQ0I2LCAnTScsIHUn2LbYricpLAogICAgKDB4RkNCNywgJ00nLCB1J9i22YUnKSwKICAgICgweEZDQjgsICdNJywgdSfYt9itJyksCiAgICAoMHhGQ0I5LCAnTScsIHUn2LjZhScpLAogICAgKDB4RkNCQSwgJ00nLCB1J9i52KwnKSwKICAgICgweEZDQkIsICdNJywgdSfYudmFJyksCiAgICAoMHhGQ0JDLCAnTScsIHUn2LrYrCcpLAogICAgKDB4RkNCRCwgJ00nLCB1J9i62YUnKSwKICAgICgweEZDQkUsICdNJywgdSfZgdisJyksCiAgICAoMHhGQ0JGLCAnTScsIHUn2YHYrScpLAogICAgKDB4RkNDMCwgJ00nLCB1J9mB2K4nKSwKICAgICgweEZDQzEsICdNJywgdSfZgdmFJyksCiAgICAoMHhGQ0MyLCAnTScsIHUn2YLYrScpLAogICAgKDB4RkNDMywgJ00nLCB1J9mC2YUnKSwKICAgICgweEZDQzQsICdNJywgdSfZg9isJyksCiAgICAoMHhGQ0M1LCAnTScsIHUn2YPYrScpLAogICAgKDB4RkNDNiwgJ00nLCB1J9mD2K4nKSwKICAgICgweEZDQzcsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQ0M4LCAnTScsIHUn2YPZhScpLAogICAgKDB4RkNDOSwgJ00nLCB1J9mE2KwnKSwKICAgICgweEZDQ0EsICdNJywgdSfZhNitJyksCiAgICAoMHhGQ0NCLCAnTScsIHUn2YTYricpLAogICAgKDB4RkNDQywgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDQ0QsICdNJywgdSfZhNmHJyksCiAgICAoMHhGQ0NFLCAnTScsIHUn2YXYrCcpLAogICAgKDB4RkNDRiwgJ00nLCB1J9mF2K0nKSwKICAgICgweEZDRDAsICdNJywgdSfZhdiuJyksCiAgICAoMHhGQ0QxLCAnTScsIHUn2YXZhScpLAogICAgKDB4RkNEMiwgJ00nLCB1J9mG2KwnKSwKICAgICgweEZDRDMsICdNJywgdSfZhtitJyksCiAgICAoMHhGQ0Q0LCAnTScsIHUn2YbYricpLAogICAgKDB4RkNENSwgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDRDYsICdNJywgdSfZhtmHJyksCiAgICAoMHhGQ0Q3LCAnTScsIHUn2YfYrCcpLAogICAgKDB4RkNEOCwgJ00nLCB1J9mH2YUnKSwKICAgICgweEZDRDksICdNJywgdSfZh9mwJyksCiAgICAoMHhGQ0RBLCAnTScsIHUn2YrYrCcpLAogICAgKDB4RkNEQiwgJ00nLCB1J9mK2K0nKSwKICAgICgweEZDREMsICdNJywgdSfZitiuJyksCiAgICAoMHhGQ0RELCAnTScsIHUn2YrZhScpLAogICAgKDB4RkNERSwgJ00nLCB1J9mK2YcnKSwKICAgICgweEZDREYsICdNJywgdSfYptmFJyksCiAgICAoMHhGQ0UwLCAnTScsIHUn2KbZhycpLAogICAgKDB4RkNFMSwgJ00nLCB1J9io2YUnKSwKICAgICgweEZDRTIsICdNJywgdSfYqNmHJyksCiAgICAoMHhGQ0UzLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkNFNCwgJ00nLCB1J9iq2YcnKSwKICAgICgweEZDRTUsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQ0U2LCAnTScsIHUn2KvZhycpLAogICAgKDB4RkNFNywgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDRTgsICdNJywgdSfYs9mHJyksCiAgICAoMHhGQ0U5LCAnTScsIHUn2LTZhScpLAogICAgKDB4RkNFQSwgJ00nLCB1J9i02YcnKSwKICAgICgweEZDRUIsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQ0VDLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkNFRCwgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDRUUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQ0VGLCAnTScsIHUn2YbZhycpLAogICAgKDB4RkNGMCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDRjEsICdNJywgdSfZitmHJyksCiAgICAoMHhGQ0YyLCAnTScsIHUn2YDZjtmRJyksCiAgICAoMHhGQ0YzLCAnTScsIHUn2YDZj9mRJyksCiAgICAoMHhGQ0Y0LCAnTScsIHUn2YDZkNmRJyksCiAgICAoMHhGQ0Y1LCAnTScsIHUn2LfZiScpLAogICAgKDB4RkNGNiwgJ00nLCB1J9i32YonKSwKICAgICgweEZDRjcsICdNJywgdSfYudmJJyksCiAgICAoMHhGQ0Y4LCAnTScsIHUn2LnZiicpLAogICAgKDB4RkNGOSwgJ00nLCB1J9i62YknKSwKICAgICgweEZDRkEsICdNJywgdSfYutmKJyksCiAgICAoMHhGQ0ZCLCAnTScsIHUn2LPZiScpLAogICAgKDB4RkNGQywgJ00nLCB1J9iz2YonKSwKICAgICgweEZDRkQsICdNJywgdSfYtNmJJyksCiAgICAoMHhGQ0ZFLCAnTScsIHUn2LTZiicpLAogICAgKDB4RkNGRiwgJ00nLCB1J9it2YknKSwKICAgICgweEZEMDAsICdNJywgdSfYrdmKJyksCiAgICAoMHhGRDAxLCAnTScsIHUn2KzZiScpLAogICAgKDB4RkQwMiwgJ00nLCB1J9is2YonKSwKICAgICgweEZEMDMsICdNJywgdSfYrtmJJyksCiAgICAoMHhGRDA0LCAnTScsIHUn2K7ZiicpLAogICAgKDB4RkQwNSwgJ00nLCB1J9i12YknKSwKICAgICgweEZEMDYsICdNJywgdSfYtdmKJyksCiAgICBdCgpkZWYgX3NlZ180NigpOgogICAgcmV0dXJuIFsKICAgICgweEZEMDcsICdNJywgdSfYttmJJyksCiAgICAoMHhGRDA4LCAnTScsIHUn2LbZiicpLAogICAgKDB4RkQwOSwgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMEEsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDBCLCAnTScsIHUn2LTYricpLAogICAgKDB4RkQwQywgJ00nLCB1J9i02YUnKSwKICAgICgweEZEMEQsICdNJywgdSfYtNixJyksCiAgICAoMHhGRDBFLCAnTScsIHUn2LPYsScpLAogICAgKDB4RkQwRiwgJ00nLCB1J9i12LEnKSwKICAgICgweEZEMTAsICdNJywgdSfYttixJyksCiAgICAoMHhGRDExLCAnTScsIHUn2LfZiScpLAogICAgKDB4RkQxMiwgJ00nLCB1J9i32YonKSwKICAgICgweEZEMTMsICdNJywgdSfYudmJJyksCiAgICAoMHhGRDE0LCAnTScsIHUn2LnZiicpLAogICAgKDB4RkQxNSwgJ00nLCB1J9i62YknKSwKICAgICgweEZEMTYsICdNJywgdSfYutmKJyksCiAgICAoMHhGRDE3LCAnTScsIHUn2LPZiScpLAogICAgKDB4RkQxOCwgJ00nLCB1J9iz2YonKSwKICAgICgweEZEMTksICdNJywgdSfYtNmJJyksCiAgICAoMHhGRDFBLCAnTScsIHUn2LTZiicpLAogICAgKDB4RkQxQiwgJ00nLCB1J9it2YknKSwKICAgICgweEZEMUMsICdNJywgdSfYrdmKJyksCiAgICAoMHhGRDFELCAnTScsIHUn2KzZiScpLAogICAgKDB4RkQxRSwgJ00nLCB1J9is2YonKSwKICAgICgweEZEMUYsICdNJywgdSfYrtmJJyksCiAgICAoMHhGRDIwLCAnTScsIHUn2K7ZiicpLAogICAgKDB4RkQyMSwgJ00nLCB1J9i12YknKSwKICAgICgweEZEMjIsICdNJywgdSfYtdmKJyksCiAgICAoMHhGRDIzLCAnTScsIHUn2LbZiScpLAogICAgKDB4RkQyNCwgJ00nLCB1J9i22YonKSwKICAgICgweEZEMjUsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDI2LCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQyNywgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMjgsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDI5LCAnTScsIHUn2LTYsScpLAogICAgKDB4RkQyQSwgJ00nLCB1J9iz2LEnKSwKICAgICgweEZEMkIsICdNJywgdSfYtdixJyksCiAgICAoMHhGRDJDLCAnTScsIHUn2LbYsScpLAogICAgKDB4RkQyRCwgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMkUsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDJGLCAnTScsIHUn2LTYricpLAogICAgKDB4RkQzMCwgJ00nLCB1J9i02YUnKSwKICAgICgweEZEMzEsICdNJywgdSfYs9mHJyksCiAgICAoMHhGRDMyLCAnTScsIHUn2LTZhycpLAogICAgKDB4RkQzMywgJ00nLCB1J9i32YUnKSwKICAgICgweEZEMzQsICdNJywgdSfYs9isJyksCiAgICAoMHhGRDM1LCAnTScsIHUn2LPYrScpLAogICAgKDB4RkQzNiwgJ00nLCB1J9iz2K4nKSwKICAgICgweEZEMzcsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDM4LCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQzOSwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEM0EsICdNJywgdSfYt9mFJyksCiAgICAoMHhGRDNCLCAnTScsIHUn2LjZhScpLAogICAgKDB4RkQzQywgJ00nLCB1J9in2YsnKSwKICAgICgweEZEM0UsICdWJyksCiAgICAoMHhGRDQwLCAnWCcpLAogICAgKDB4RkQ1MCwgJ00nLCB1J9iq2KzZhScpLAogICAgKDB4RkQ1MSwgJ00nLCB1J9iq2K3YrCcpLAogICAgKDB4RkQ1MywgJ00nLCB1J9iq2K3ZhScpLAogICAgKDB4RkQ1NCwgJ00nLCB1J9iq2K7ZhScpLAogICAgKDB4RkQ1NSwgJ00nLCB1J9iq2YXYrCcpLAogICAgKDB4RkQ1NiwgJ00nLCB1J9iq2YXYrScpLAogICAgKDB4RkQ1NywgJ00nLCB1J9iq2YXYricpLAogICAgKDB4RkQ1OCwgJ00nLCB1J9is2YXYrScpLAogICAgKDB4RkQ1QSwgJ00nLCB1J9it2YXZiicpLAogICAgKDB4RkQ1QiwgJ00nLCB1J9it2YXZiScpLAogICAgKDB4RkQ1QywgJ00nLCB1J9iz2K3YrCcpLAogICAgKDB4RkQ1RCwgJ00nLCB1J9iz2KzYrScpLAogICAgKDB4RkQ1RSwgJ00nLCB1J9iz2KzZiScpLAogICAgKDB4RkQ1RiwgJ00nLCB1J9iz2YXYrScpLAogICAgKDB4RkQ2MSwgJ00nLCB1J9iz2YXYrCcpLAogICAgKDB4RkQ2MiwgJ00nLCB1J9iz2YXZhScpLAogICAgKDB4RkQ2NCwgJ00nLCB1J9i12K3YrScpLAogICAgKDB4RkQ2NiwgJ00nLCB1J9i12YXZhScpLAogICAgKDB4RkQ2NywgJ00nLCB1J9i02K3ZhScpLAogICAgKDB4RkQ2OSwgJ00nLCB1J9i02KzZiicpLAogICAgKDB4RkQ2QSwgJ00nLCB1J9i02YXYricpLAogICAgKDB4RkQ2QywgJ00nLCB1J9i02YXZhScpLAogICAgKDB4RkQ2RSwgJ00nLCB1J9i22K3ZiScpLAogICAgKDB4RkQ2RiwgJ00nLCB1J9i22K7ZhScpLAogICAgKDB4RkQ3MSwgJ00nLCB1J9i32YXYrScpLAogICAgKDB4RkQ3MywgJ00nLCB1J9i32YXZhScpLAogICAgKDB4RkQ3NCwgJ00nLCB1J9i32YXZiicpLAogICAgKDB4RkQ3NSwgJ00nLCB1J9i52KzZhScpLAogICAgKDB4RkQ3NiwgJ00nLCB1J9i52YXZhScpLAogICAgKDB4RkQ3OCwgJ00nLCB1J9i52YXZiScpLAogICAgKDB4RkQ3OSwgJ00nLCB1J9i62YXZhScpLAogICAgKDB4RkQ3QSwgJ00nLCB1J9i62YXZiicpLAogICAgKDB4RkQ3QiwgJ00nLCB1J9i62YXZiScpLAogICAgKDB4RkQ3QywgJ00nLCB1J9mB2K7ZhScpLAogICAgKDB4RkQ3RSwgJ00nLCB1J9mC2YXYrScpLAogICAgKDB4RkQ3RiwgJ00nLCB1J9mC2YXZhScpLAogICAgKDB4RkQ4MCwgJ00nLCB1J9mE2K3ZhScpLAogICAgKDB4RkQ4MSwgJ00nLCB1J9mE2K3ZiicpLAogICAgKDB4RkQ4MiwgJ00nLCB1J9mE2K3ZiScpLAogICAgKDB4RkQ4MywgJ00nLCB1J9mE2KzYrCcpLAogICAgKDB4RkQ4NSwgJ00nLCB1J9mE2K7ZhScpLAogICAgKDB4RkQ4NywgJ00nLCB1J9mE2YXYrScpLAogICAgKDB4RkQ4OSwgJ00nLCB1J9mF2K3YrCcpLAogICAgKDB4RkQ4QSwgJ00nLCB1J9mF2K3ZhScpLAogICAgXQoKZGVmIF9zZWdfNDcoKToKICAgIHJldHVybiBbCiAgICAoMHhGRDhCLCAnTScsIHUn2YXYrdmKJyksCiAgICAoMHhGRDhDLCAnTScsIHUn2YXYrNitJyksCiAgICAoMHhGRDhELCAnTScsIHUn2YXYrNmFJyksCiAgICAoMHhGRDhFLCAnTScsIHUn2YXYrtisJyksCiAgICAoMHhGRDhGLCAnTScsIHUn2YXYrtmFJyksCiAgICAoMHhGRDkwLCAnWCcpLAogICAgKDB4RkQ5MiwgJ00nLCB1J9mF2KzYricpLAogICAgKDB4RkQ5MywgJ00nLCB1J9mH2YXYrCcpLAogICAgKDB4RkQ5NCwgJ00nLCB1J9mH2YXZhScpLAogICAgKDB4RkQ5NSwgJ00nLCB1J9mG2K3ZhScpLAogICAgKDB4RkQ5NiwgJ00nLCB1J9mG2K3ZiScpLAogICAgKDB4RkQ5NywgJ00nLCB1J9mG2KzZhScpLAogICAgKDB4RkQ5OSwgJ00nLCB1J9mG2KzZiScpLAogICAgKDB4RkQ5QSwgJ00nLCB1J9mG2YXZiicpLAogICAgKDB4RkQ5QiwgJ00nLCB1J9mG2YXZiScpLAogICAgKDB4RkQ5QywgJ00nLCB1J9mK2YXZhScpLAogICAgKDB4RkQ5RSwgJ00nLCB1J9io2K7ZiicpLAogICAgKDB4RkQ5RiwgJ00nLCB1J9iq2KzZiicpLAogICAgKDB4RkRBMCwgJ00nLCB1J9iq2KzZiScpLAogICAgKDB4RkRBMSwgJ00nLCB1J9iq2K7ZiicpLAogICAgKDB4RkRBMiwgJ00nLCB1J9iq2K7ZiScpLAogICAgKDB4RkRBMywgJ00nLCB1J9iq2YXZiicpLAogICAgKDB4RkRBNCwgJ00nLCB1J9iq2YXZiScpLAogICAgKDB4RkRBNSwgJ00nLCB1J9is2YXZiicpLAogICAgKDB4RkRBNiwgJ00nLCB1J9is2K3ZiScpLAogICAgKDB4RkRBNywgJ00nLCB1J9is2YXZiScpLAogICAgKDB4RkRBOCwgJ00nLCB1J9iz2K7ZiScpLAogICAgKDB4RkRBOSwgJ00nLCB1J9i12K3ZiicpLAogICAgKDB4RkRBQSwgJ00nLCB1J9i02K3ZiicpLAogICAgKDB4RkRBQiwgJ00nLCB1J9i22K3ZiicpLAogICAgKDB4RkRBQywgJ00nLCB1J9mE2KzZiicpLAogICAgKDB4RkRBRCwgJ00nLCB1J9mE2YXZiicpLAogICAgKDB4RkRBRSwgJ00nLCB1J9mK2K3ZiicpLAogICAgKDB4RkRBRiwgJ00nLCB1J9mK2KzZiicpLAogICAgKDB4RkRCMCwgJ00nLCB1J9mK2YXZiicpLAogICAgKDB4RkRCMSwgJ00nLCB1J9mF2YXZiicpLAogICAgKDB4RkRCMiwgJ00nLCB1J9mC2YXZiicpLAogICAgKDB4RkRCMywgJ00nLCB1J9mG2K3ZiicpLAogICAgKDB4RkRCNCwgJ00nLCB1J9mC2YXYrScpLAogICAgKDB4RkRCNSwgJ00nLCB1J9mE2K3ZhScpLAogICAgKDB4RkRCNiwgJ00nLCB1J9i52YXZiicpLAogICAgKDB4RkRCNywgJ00nLCB1J9mD2YXZiicpLAogICAgKDB4RkRCOCwgJ00nLCB1J9mG2KzYrScpLAogICAgKDB4RkRCOSwgJ00nLCB1J9mF2K7ZiicpLAogICAgKDB4RkRCQSwgJ00nLCB1J9mE2KzZhScpLAogICAgKDB4RkRCQiwgJ00nLCB1J9mD2YXZhScpLAogICAgKDB4RkRCQywgJ00nLCB1J9mE2KzZhScpLAogICAgKDB4RkRCRCwgJ00nLCB1J9mG2KzYrScpLAogICAgKDB4RkRCRSwgJ00nLCB1J9is2K3ZiicpLAogICAgKDB4RkRCRiwgJ00nLCB1J9it2KzZiicpLAogICAgKDB4RkRDMCwgJ00nLCB1J9mF2KzZiicpLAogICAgKDB4RkRDMSwgJ00nLCB1J9mB2YXZiicpLAogICAgKDB4RkRDMiwgJ00nLCB1J9io2K3ZiicpLAogICAgKDB4RkRDMywgJ00nLCB1J9mD2YXZhScpLAogICAgKDB4RkRDNCwgJ00nLCB1J9i52KzZhScpLAogICAgKDB4RkRDNSwgJ00nLCB1J9i12YXZhScpLAogICAgKDB4RkRDNiwgJ00nLCB1J9iz2K7ZiicpLAogICAgKDB4RkRDNywgJ00nLCB1J9mG2KzZiicpLAogICAgKDB4RkRDOCwgJ1gnKSwKICAgICgweEZERjAsICdNJywgdSfYtdmE25InKSwKICAgICgweEZERjEsICdNJywgdSfZgtmE25InKSwKICAgICgweEZERjIsICdNJywgdSfYp9mE2YTZhycpLAogICAgKDB4RkRGMywgJ00nLCB1J9in2YPYqNixJyksCiAgICAoMHhGREY0LCAnTScsIHUn2YXYrdmF2K8nKSwKICAgICgweEZERjUsICdNJywgdSfYtdmE2LnZhScpLAogICAgKDB4RkRGNiwgJ00nLCB1J9ix2LPZiNmEJyksCiAgICAoMHhGREY3LCAnTScsIHUn2LnZhNmK2YcnKSwKICAgICgweEZERjgsICdNJywgdSfZiNiz2YTZhScpLAogICAgKDB4RkRGOSwgJ00nLCB1J9i12YTZiScpLAogICAgKDB4RkRGQSwgJzMnLCB1J9i12YTZiSDYp9mE2YTZhyDYudmE2YrZhyDZiNiz2YTZhScpLAogICAgKDB4RkRGQiwgJzMnLCB1J9is2YQg2KzZhNin2YTZhycpLAogICAgKDB4RkRGQywgJ00nLCB1J9ix24zYp9mEJyksCiAgICAoMHhGREZELCAnVicpLAogICAgKDB4RkRGRSwgJ1gnKSwKICAgICgweEZFMDAsICdJJyksCiAgICAoMHhGRTEwLCAnMycsIHUnLCcpLAogICAgKDB4RkUxMSwgJ00nLCB1J+OAgScpLAogICAgKDB4RkUxMiwgJ1gnKSwKICAgICgweEZFMTMsICczJywgdSc6JyksCiAgICAoMHhGRTE0LCAnMycsIHUnOycpLAogICAgKDB4RkUxNSwgJzMnLCB1JyEnKSwKICAgICgweEZFMTYsICczJywgdSc/JyksCiAgICAoMHhGRTE3LCAnTScsIHUn44CWJyksCiAgICAoMHhGRTE4LCAnTScsIHUn44CXJyksCiAgICAoMHhGRTE5LCAnWCcpLAogICAgKDB4RkUyMCwgJ1YnKSwKICAgICgweEZFMjcsICdYJyksCiAgICAoMHhGRTMxLCAnTScsIHUn4oCUJyksCiAgICAoMHhGRTMyLCAnTScsIHUn4oCTJyksCiAgICAoMHhGRTMzLCAnMycsIHUnXycpLAogICAgKDB4RkUzNSwgJzMnLCB1JygnKSwKICAgICgweEZFMzYsICczJywgdScpJyksCiAgICAoMHhGRTM3LCAnMycsIHUneycpLAogICAgKDB4RkUzOCwgJzMnLCB1J30nKSwKICAgICgweEZFMzksICdNJywgdSfjgJQnKSwKICAgICgweEZFM0EsICdNJywgdSfjgJUnKSwKICAgICgweEZFM0IsICdNJywgdSfjgJAnKSwKICAgICgweEZFM0MsICdNJywgdSfjgJEnKSwKICAgICgweEZFM0QsICdNJywgdSfjgIonKSwKICAgICgweEZFM0UsICdNJywgdSfjgIsnKSwKICAgIF0KCmRlZiBfc2VnXzQ4KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkUzRiwgJ00nLCB1J+OAiCcpLAogICAgKDB4RkU0MCwgJ00nLCB1J+OAiScpLAogICAgKDB4RkU0MSwgJ00nLCB1J+OAjCcpLAogICAgKDB4RkU0MiwgJ00nLCB1J+OAjScpLAogICAgKDB4RkU0MywgJ00nLCB1J+OAjicpLAogICAgKDB4RkU0NCwgJ00nLCB1J+OAjycpLAogICAgKDB4RkU0NSwgJ1YnKSwKICAgICgweEZFNDcsICczJywgdSdbJyksCiAgICAoMHhGRTQ4LCAnMycsIHUnXScpLAogICAgKDB4RkU0OSwgJzMnLCB1JyDMhScpLAogICAgKDB4RkU0RCwgJzMnLCB1J18nKSwKICAgICgweEZFNTAsICczJywgdScsJyksCiAgICAoMHhGRTUxLCAnTScsIHUn44CBJyksCiAgICAoMHhGRTUyLCAnWCcpLAogICAgKDB4RkU1NCwgJzMnLCB1JzsnKSwKICAgICgweEZFNTUsICczJywgdSc6JyksCiAgICAoMHhGRTU2LCAnMycsIHUnPycpLAogICAgKDB4RkU1NywgJzMnLCB1JyEnKSwKICAgICgweEZFNTgsICdNJywgdSfigJQnKSwKICAgICgweEZFNTksICczJywgdScoJyksCiAgICAoMHhGRTVBLCAnMycsIHUnKScpLAogICAgKDB4RkU1QiwgJzMnLCB1J3snKSwKICAgICgweEZFNUMsICczJywgdSd9JyksCiAgICAoMHhGRTVELCAnTScsIHUn44CUJyksCiAgICAoMHhGRTVFLCAnTScsIHUn44CVJyksCiAgICAoMHhGRTVGLCAnMycsIHUnIycpLAogICAgKDB4RkU2MCwgJzMnLCB1JyYnKSwKICAgICgweEZFNjEsICczJywgdScqJyksCiAgICAoMHhGRTYyLCAnMycsIHUnKycpLAogICAgKDB4RkU2MywgJ00nLCB1Jy0nKSwKICAgICgweEZFNjQsICczJywgdSc8JyksCiAgICAoMHhGRTY1LCAnMycsIHUnPicpLAogICAgKDB4RkU2NiwgJzMnLCB1Jz0nKSwKICAgICgweEZFNjcsICdYJyksCiAgICAoMHhGRTY4LCAnMycsIHUnXFwnKSwKICAgICgweEZFNjksICczJywgdSckJyksCiAgICAoMHhGRTZBLCAnMycsIHUnJScpLAogICAgKDB4RkU2QiwgJzMnLCB1J0AnKSwKICAgICgweEZFNkMsICdYJyksCiAgICAoMHhGRTcwLCAnMycsIHUnINmLJyksCiAgICAoMHhGRTcxLCAnTScsIHUn2YDZiycpLAogICAgKDB4RkU3MiwgJzMnLCB1JyDZjCcpLAogICAgKDB4RkU3MywgJ1YnKSwKICAgICgweEZFNzQsICczJywgdScg2Y0nKSwKICAgICgweEZFNzUsICdYJyksCiAgICAoMHhGRTc2LCAnMycsIHUnINmOJyksCiAgICAoMHhGRTc3LCAnTScsIHUn2YDZjicpLAogICAgKDB4RkU3OCwgJzMnLCB1JyDZjycpLAogICAgKDB4RkU3OSwgJ00nLCB1J9mA2Y8nKSwKICAgICgweEZFN0EsICczJywgdScg2ZAnKSwKICAgICgweEZFN0IsICdNJywgdSfZgNmQJyksCiAgICAoMHhGRTdDLCAnMycsIHUnINmRJyksCiAgICAoMHhGRTdELCAnTScsIHUn2YDZkScpLAogICAgKDB4RkU3RSwgJzMnLCB1JyDZkicpLAogICAgKDB4RkU3RiwgJ00nLCB1J9mA2ZInKSwKICAgICgweEZFODAsICdNJywgdSfYoScpLAogICAgKDB4RkU4MSwgJ00nLCB1J9iiJyksCiAgICAoMHhGRTgzLCAnTScsIHUn2KMnKSwKICAgICgweEZFODUsICdNJywgdSfYpCcpLAogICAgKDB4RkU4NywgJ00nLCB1J9ilJyksCiAgICAoMHhGRTg5LCAnTScsIHUn2KYnKSwKICAgICgweEZFOEQsICdNJywgdSfYpycpLAogICAgKDB4RkU4RiwgJ00nLCB1J9ioJyksCiAgICAoMHhGRTkzLCAnTScsIHUn2KknKSwKICAgICgweEZFOTUsICdNJywgdSfYqicpLAogICAgKDB4RkU5OSwgJ00nLCB1J9irJyksCiAgICAoMHhGRTlELCAnTScsIHUn2KwnKSwKICAgICgweEZFQTEsICdNJywgdSfYrScpLAogICAgKDB4RkVBNSwgJ00nLCB1J9iuJyksCiAgICAoMHhGRUE5LCAnTScsIHUn2K8nKSwKICAgICgweEZFQUIsICdNJywgdSfYsCcpLAogICAgKDB4RkVBRCwgJ00nLCB1J9ixJyksCiAgICAoMHhGRUFGLCAnTScsIHUn2LInKSwKICAgICgweEZFQjEsICdNJywgdSfYsycpLAogICAgKDB4RkVCNSwgJ00nLCB1J9i0JyksCiAgICAoMHhGRUI5LCAnTScsIHUn2LUnKSwKICAgICgweEZFQkQsICdNJywgdSfYticpLAogICAgKDB4RkVDMSwgJ00nLCB1J9i3JyksCiAgICAoMHhGRUM1LCAnTScsIHUn2LgnKSwKICAgICgweEZFQzksICdNJywgdSfYuScpLAogICAgKDB4RkVDRCwgJ00nLCB1J9i6JyksCiAgICAoMHhGRUQxLCAnTScsIHUn2YEnKSwKICAgICgweEZFRDUsICdNJywgdSfZgicpLAogICAgKDB4RkVEOSwgJ00nLCB1J9mDJyksCiAgICAoMHhGRURELCAnTScsIHUn2YQnKSwKICAgICgweEZFRTEsICdNJywgdSfZhScpLAogICAgKDB4RkVFNSwgJ00nLCB1J9mGJyksCiAgICAoMHhGRUU5LCAnTScsIHUn2YcnKSwKICAgICgweEZFRUQsICdNJywgdSfZiCcpLAogICAgKDB4RkVFRiwgJ00nLCB1J9mJJyksCiAgICAoMHhGRUYxLCAnTScsIHUn2YonKSwKICAgICgweEZFRjUsICdNJywgdSfZhNiiJyksCiAgICAoMHhGRUY3LCAnTScsIHUn2YTYoycpLAogICAgKDB4RkVGOSwgJ00nLCB1J9mE2KUnKSwKICAgICgweEZFRkIsICdNJywgdSfZhNinJyksCiAgICAoMHhGRUZELCAnWCcpLAogICAgKDB4RkVGRiwgJ0knKSwKICAgICgweEZGMDAsICdYJyksCiAgICAoMHhGRjAxLCAnMycsIHUnIScpLAogICAgKDB4RkYwMiwgJzMnLCB1JyInKSwKICAgIF0KCmRlZiBfc2VnXzQ5KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkYwMywgJzMnLCB1JyMnKSwKICAgICgweEZGMDQsICczJywgdSckJyksCiAgICAoMHhGRjA1LCAnMycsIHUnJScpLAogICAgKDB4RkYwNiwgJzMnLCB1JyYnKSwKICAgICgweEZGMDcsICczJywgdSdcJycpLAogICAgKDB4RkYwOCwgJzMnLCB1JygnKSwKICAgICgweEZGMDksICczJywgdScpJyksCiAgICAoMHhGRjBBLCAnMycsIHUnKicpLAogICAgKDB4RkYwQiwgJzMnLCB1JysnKSwKICAgICgweEZGMEMsICczJywgdScsJyksCiAgICAoMHhGRjBELCAnTScsIHUnLScpLAogICAgKDB4RkYwRSwgJ00nLCB1Jy4nKSwKICAgICgweEZGMEYsICczJywgdScvJyksCiAgICAoMHhGRjEwLCAnTScsIHUnMCcpLAogICAgKDB4RkYxMSwgJ00nLCB1JzEnKSwKICAgICgweEZGMTIsICdNJywgdScyJyksCiAgICAoMHhGRjEzLCAnTScsIHUnMycpLAogICAgKDB4RkYxNCwgJ00nLCB1JzQnKSwKICAgICgweEZGMTUsICdNJywgdSc1JyksCiAgICAoMHhGRjE2LCAnTScsIHUnNicpLAogICAgKDB4RkYxNywgJ00nLCB1JzcnKSwKICAgICgweEZGMTgsICdNJywgdSc4JyksCiAgICAoMHhGRjE5LCAnTScsIHUnOScpLAogICAgKDB4RkYxQSwgJzMnLCB1JzonKSwKICAgICgweEZGMUIsICczJywgdSc7JyksCiAgICAoMHhGRjFDLCAnMycsIHUnPCcpLAogICAgKDB4RkYxRCwgJzMnLCB1Jz0nKSwKICAgICgweEZGMUUsICczJywgdSc+JyksCiAgICAoMHhGRjFGLCAnMycsIHUnPycpLAogICAgKDB4RkYyMCwgJzMnLCB1J0AnKSwKICAgICgweEZGMjEsICdNJywgdSdhJyksCiAgICAoMHhGRjIyLCAnTScsIHUnYicpLAogICAgKDB4RkYyMywgJ00nLCB1J2MnKSwKICAgICgweEZGMjQsICdNJywgdSdkJyksCiAgICAoMHhGRjI1LCAnTScsIHUnZScpLAogICAgKDB4RkYyNiwgJ00nLCB1J2YnKSwKICAgICgweEZGMjcsICdNJywgdSdnJyksCiAgICAoMHhGRjI4LCAnTScsIHUnaCcpLAogICAgKDB4RkYyOSwgJ00nLCB1J2knKSwKICAgICgweEZGMkEsICdNJywgdSdqJyksCiAgICAoMHhGRjJCLCAnTScsIHUnaycpLAogICAgKDB4RkYyQywgJ00nLCB1J2wnKSwKICAgICgweEZGMkQsICdNJywgdSdtJyksCiAgICAoMHhGRjJFLCAnTScsIHUnbicpLAogICAgKDB4RkYyRiwgJ00nLCB1J28nKSwKICAgICgweEZGMzAsICdNJywgdSdwJyksCiAgICAoMHhGRjMxLCAnTScsIHUncScpLAogICAgKDB4RkYzMiwgJ00nLCB1J3InKSwKICAgICgweEZGMzMsICdNJywgdSdzJyksCiAgICAoMHhGRjM0LCAnTScsIHUndCcpLAogICAgKDB4RkYzNSwgJ00nLCB1J3UnKSwKICAgICgweEZGMzYsICdNJywgdSd2JyksCiAgICAoMHhGRjM3LCAnTScsIHUndycpLAogICAgKDB4RkYzOCwgJ00nLCB1J3gnKSwKICAgICgweEZGMzksICdNJywgdSd5JyksCiAgICAoMHhGRjNBLCAnTScsIHUneicpLAogICAgKDB4RkYzQiwgJzMnLCB1J1snKSwKICAgICgweEZGM0MsICczJywgdSdcXCcpLAogICAgKDB4RkYzRCwgJzMnLCB1J10nKSwKICAgICgweEZGM0UsICczJywgdSdeJyksCiAgICAoMHhGRjNGLCAnMycsIHUnXycpLAogICAgKDB4RkY0MCwgJzMnLCB1J2AnKSwKICAgICgweEZGNDEsICdNJywgdSdhJyksCiAgICAoMHhGRjQyLCAnTScsIHUnYicpLAogICAgKDB4RkY0MywgJ00nLCB1J2MnKSwKICAgICgweEZGNDQsICdNJywgdSdkJyksCiAgICAoMHhGRjQ1LCAnTScsIHUnZScpLAogICAgKDB4RkY0NiwgJ00nLCB1J2YnKSwKICAgICgweEZGNDcsICdNJywgdSdnJyksCiAgICAoMHhGRjQ4LCAnTScsIHUnaCcpLAogICAgKDB4RkY0OSwgJ00nLCB1J2knKSwKICAgICgweEZGNEEsICdNJywgdSdqJyksCiAgICAoMHhGRjRCLCAnTScsIHUnaycpLAogICAgKDB4RkY0QywgJ00nLCB1J2wnKSwKICAgICgweEZGNEQsICdNJywgdSdtJyksCiAgICAoMHhGRjRFLCAnTScsIHUnbicpLAogICAgKDB4RkY0RiwgJ00nLCB1J28nKSwKICAgICgweEZGNTAsICdNJywgdSdwJyksCiAgICAoMHhGRjUxLCAnTScsIHUncScpLAogICAgKDB4RkY1MiwgJ00nLCB1J3InKSwKICAgICgweEZGNTMsICdNJywgdSdzJyksCiAgICAoMHhGRjU0LCAnTScsIHUndCcpLAogICAgKDB4RkY1NSwgJ00nLCB1J3UnKSwKICAgICgweEZGNTYsICdNJywgdSd2JyksCiAgICAoMHhGRjU3LCAnTScsIHUndycpLAogICAgKDB4RkY1OCwgJ00nLCB1J3gnKSwKICAgICgweEZGNTksICdNJywgdSd5JyksCiAgICAoMHhGRjVBLCAnTScsIHUneicpLAogICAgKDB4RkY1QiwgJzMnLCB1J3snKSwKICAgICgweEZGNUMsICczJywgdSd8JyksCiAgICAoMHhGRjVELCAnMycsIHUnfScpLAogICAgKDB4RkY1RSwgJzMnLCB1J34nKSwKICAgICgweEZGNUYsICdNJywgdSfipoUnKSwKICAgICgweEZGNjAsICdNJywgdSfipoYnKSwKICAgICgweEZGNjEsICdNJywgdScuJyksCiAgICAoMHhGRjYyLCAnTScsIHUn44CMJyksCiAgICAoMHhGRjYzLCAnTScsIHUn44CNJyksCiAgICAoMHhGRjY0LCAnTScsIHUn44CBJyksCiAgICAoMHhGRjY1LCAnTScsIHUn44O7JyksCiAgICAoMHhGRjY2LCAnTScsIHUn44OyJyksCiAgICBdCgpkZWYgX3NlZ181MCgpOgogICAgcmV0dXJuIFsKICAgICgweEZGNjcsICdNJywgdSfjgqEnKSwKICAgICgweEZGNjgsICdNJywgdSfjgqMnKSwKICAgICgweEZGNjksICdNJywgdSfjgqUnKSwKICAgICgweEZGNkEsICdNJywgdSfjgqcnKSwKICAgICgweEZGNkIsICdNJywgdSfjgqknKSwKICAgICgweEZGNkMsICdNJywgdSfjg6MnKSwKICAgICgweEZGNkQsICdNJywgdSfjg6UnKSwKICAgICgweEZGNkUsICdNJywgdSfjg6cnKSwKICAgICgweEZGNkYsICdNJywgdSfjg4MnKSwKICAgICgweEZGNzAsICdNJywgdSfjg7wnKSwKICAgICgweEZGNzEsICdNJywgdSfjgqInKSwKICAgICgweEZGNzIsICdNJywgdSfjgqQnKSwKICAgICgweEZGNzMsICdNJywgdSfjgqYnKSwKICAgICgweEZGNzQsICdNJywgdSfjgqgnKSwKICAgICgweEZGNzUsICdNJywgdSfjgqonKSwKICAgICgweEZGNzYsICdNJywgdSfjgqsnKSwKICAgICgweEZGNzcsICdNJywgdSfjgq0nKSwKICAgICgweEZGNzgsICdNJywgdSfjgq8nKSwKICAgICgweEZGNzksICdNJywgdSfjgrEnKSwKICAgICgweEZGN0EsICdNJywgdSfjgrMnKSwKICAgICgweEZGN0IsICdNJywgdSfjgrUnKSwKICAgICgweEZGN0MsICdNJywgdSfjgrcnKSwKICAgICgweEZGN0QsICdNJywgdSfjgrknKSwKICAgICgweEZGN0UsICdNJywgdSfjgrsnKSwKICAgICgweEZGN0YsICdNJywgdSfjgr0nKSwKICAgICgweEZGODAsICdNJywgdSfjgr8nKSwKICAgICgweEZGODEsICdNJywgdSfjg4EnKSwKICAgICgweEZGODIsICdNJywgdSfjg4QnKSwKICAgICgweEZGODMsICdNJywgdSfjg4YnKSwKICAgICgweEZGODQsICdNJywgdSfjg4gnKSwKICAgICgweEZGODUsICdNJywgdSfjg4onKSwKICAgICgweEZGODYsICdNJywgdSfjg4snKSwKICAgICgweEZGODcsICdNJywgdSfjg4wnKSwKICAgICgweEZGODgsICdNJywgdSfjg40nKSwKICAgICgweEZGODksICdNJywgdSfjg44nKSwKICAgICgweEZGOEEsICdNJywgdSfjg48nKSwKICAgICgweEZGOEIsICdNJywgdSfjg5InKSwKICAgICgweEZGOEMsICdNJywgdSfjg5UnKSwKICAgICgweEZGOEQsICdNJywgdSfjg5gnKSwKICAgICgweEZGOEUsICdNJywgdSfjg5snKSwKICAgICgweEZGOEYsICdNJywgdSfjg54nKSwKICAgICgweEZGOTAsICdNJywgdSfjg58nKSwKICAgICgweEZGOTEsICdNJywgdSfjg6AnKSwKICAgICgweEZGOTIsICdNJywgdSfjg6EnKSwKICAgICgweEZGOTMsICdNJywgdSfjg6InKSwKICAgICgweEZGOTQsICdNJywgdSfjg6QnKSwKICAgICgweEZGOTUsICdNJywgdSfjg6YnKSwKICAgICgweEZGOTYsICdNJywgdSfjg6gnKSwKICAgICgweEZGOTcsICdNJywgdSfjg6knKSwKICAgICgweEZGOTgsICdNJywgdSfjg6onKSwKICAgICgweEZGOTksICdNJywgdSfjg6snKSwKICAgICgweEZGOUEsICdNJywgdSfjg6wnKSwKICAgICgweEZGOUIsICdNJywgdSfjg60nKSwKICAgICgweEZGOUMsICdNJywgdSfjg68nKSwKICAgICgweEZGOUQsICdNJywgdSfjg7MnKSwKICAgICgweEZGOUUsICdNJywgdSfjgpknKSwKICAgICgweEZGOUYsICdNJywgdSfjgponKSwKICAgICgweEZGQTAsICdYJyksCiAgICAoMHhGRkExLCAnTScsIHUn4YSAJyksCiAgICAoMHhGRkEyLCAnTScsIHUn4YSBJyksCiAgICAoMHhGRkEzLCAnTScsIHUn4YaqJyksCiAgICAoMHhGRkE0LCAnTScsIHUn4YSCJyksCiAgICAoMHhGRkE1LCAnTScsIHUn4YasJyksCiAgICAoMHhGRkE2LCAnTScsIHUn4YatJyksCiAgICAoMHhGRkE3LCAnTScsIHUn4YSDJyksCiAgICAoMHhGRkE4LCAnTScsIHUn4YSEJyksCiAgICAoMHhGRkE5LCAnTScsIHUn4YSFJyksCiAgICAoMHhGRkFBLCAnTScsIHUn4YawJyksCiAgICAoMHhGRkFCLCAnTScsIHUn4YaxJyksCiAgICAoMHhGRkFDLCAnTScsIHUn4YayJyksCiAgICAoMHhGRkFELCAnTScsIHUn4YazJyksCiAgICAoMHhGRkFFLCAnTScsIHUn4Ya0JyksCiAgICAoMHhGRkFGLCAnTScsIHUn4Ya1JyksCiAgICAoMHhGRkIwLCAnTScsIHUn4YSaJyksCiAgICAoMHhGRkIxLCAnTScsIHUn4YSGJyksCiAgICAoMHhGRkIyLCAnTScsIHUn4YSHJyksCiAgICAoMHhGRkIzLCAnTScsIHUn4YSIJyksCiAgICAoMHhGRkI0LCAnTScsIHUn4YShJyksCiAgICAoMHhGRkI1LCAnTScsIHUn4YSJJyksCiAgICAoMHhGRkI2LCAnTScsIHUn4YSKJyksCiAgICAoMHhGRkI3LCAnTScsIHUn4YSLJyksCiAgICAoMHhGRkI4LCAnTScsIHUn4YSMJyksCiAgICAoMHhGRkI5LCAnTScsIHUn4YSNJyksCiAgICAoMHhGRkJBLCAnTScsIHUn4YSOJyksCiAgICAoMHhGRkJCLCAnTScsIHUn4YSPJyksCiAgICAoMHhGRkJDLCAnTScsIHUn4YSQJyksCiAgICAoMHhGRkJELCAnTScsIHUn4YSRJyksCiAgICAoMHhGRkJFLCAnTScsIHUn4YSSJyksCiAgICAoMHhGRkJGLCAnWCcpLAogICAgKDB4RkZDMiwgJ00nLCB1J+GFoScpLAogICAgKDB4RkZDMywgJ00nLCB1J+GFoicpLAogICAgKDB4RkZDNCwgJ00nLCB1J+GFoycpLAogICAgKDB4RkZDNSwgJ00nLCB1J+GFpCcpLAogICAgKDB4RkZDNiwgJ00nLCB1J+GFpScpLAogICAgKDB4RkZDNywgJ00nLCB1J+GFpicpLAogICAgKDB4RkZDOCwgJ1gnKSwKICAgICgweEZGQ0EsICdNJywgdSfhhacnKSwKICAgICgweEZGQ0IsICdNJywgdSfhhagnKSwKICAgICgweEZGQ0MsICdNJywgdSfhhaknKSwKICAgICgweEZGQ0QsICdNJywgdSfhhaonKSwKICAgIF0KCmRlZiBfc2VnXzUxKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkZDRSwgJ00nLCB1J+GFqycpLAogICAgKDB4RkZDRiwgJ00nLCB1J+GFrCcpLAogICAgKDB4RkZEMCwgJ1gnKSwKICAgICgweEZGRDIsICdNJywgdSfhha0nKSwKICAgICgweEZGRDMsICdNJywgdSfhha4nKSwKICAgICgweEZGRDQsICdNJywgdSfhha8nKSwKICAgICgweEZGRDUsICdNJywgdSfhhbAnKSwKICAgICgweEZGRDYsICdNJywgdSfhhbEnKSwKICAgICgweEZGRDcsICdNJywgdSfhhbInKSwKICAgICgweEZGRDgsICdYJyksCiAgICAoMHhGRkRBLCAnTScsIHUn4YWzJyksCiAgICAoMHhGRkRCLCAnTScsIHUn4YW0JyksCiAgICAoMHhGRkRDLCAnTScsIHUn4YW1JyksCiAgICAoMHhGRkRELCAnWCcpLAogICAgKDB4RkZFMCwgJ00nLCB1J8KiJyksCiAgICAoMHhGRkUxLCAnTScsIHUnwqMnKSwKICAgICgweEZGRTIsICdNJywgdSfCrCcpLAogICAgKDB4RkZFMywgJzMnLCB1JyDMhCcpLAogICAgKDB4RkZFNCwgJ00nLCB1J8KmJyksCiAgICAoMHhGRkU1LCAnTScsIHUnwqUnKSwKICAgICgweEZGRTYsICdNJywgdSfigqknKSwKICAgICgweEZGRTcsICdYJyksCiAgICAoMHhGRkU4LCAnTScsIHUn4pSCJyksCiAgICAoMHhGRkU5LCAnTScsIHUn4oaQJyksCiAgICAoMHhGRkVBLCAnTScsIHUn4oaRJyksCiAgICAoMHhGRkVCLCAnTScsIHUn4oaSJyksCiAgICAoMHhGRkVDLCAnTScsIHUn4oaTJyksCiAgICAoMHhGRkVELCAnTScsIHUn4pagJyksCiAgICAoMHhGRkVFLCAnTScsIHUn4peLJyksCiAgICAoMHhGRkVGLCAnWCcpLAogICAgKDB4MTAwMDAsICdWJyksCiAgICAoMHgxMDAwQywgJ1gnKSwKICAgICgweDEwMDBELCAnVicpLAogICAgKDB4MTAwMjcsICdYJyksCiAgICAoMHgxMDAyOCwgJ1YnKSwKICAgICgweDEwMDNCLCAnWCcpLAogICAgKDB4MTAwM0MsICdWJyksCiAgICAoMHgxMDAzRSwgJ1gnKSwKICAgICgweDEwMDNGLCAnVicpLAogICAgKDB4MTAwNEUsICdYJyksCiAgICAoMHgxMDA1MCwgJ1YnKSwKICAgICgweDEwMDVFLCAnWCcpLAogICAgKDB4MTAwODAsICdWJyksCiAgICAoMHgxMDBGQiwgJ1gnKSwKICAgICgweDEwMTAwLCAnVicpLAogICAgKDB4MTAxMDMsICdYJyksCiAgICAoMHgxMDEwNywgJ1YnKSwKICAgICgweDEwMTM0LCAnWCcpLAogICAgKDB4MTAxMzcsICdWJyksCiAgICAoMHgxMDE4QiwgJ1gnKSwKICAgICgweDEwMTkwLCAnVicpLAogICAgKDB4MTAxOUMsICdYJyksCiAgICAoMHgxMDFEMCwgJ1YnKSwKICAgICgweDEwMUZFLCAnWCcpLAogICAgKDB4MTAyODAsICdWJyksCiAgICAoMHgxMDI5RCwgJ1gnKSwKICAgICgweDEwMkEwLCAnVicpLAogICAgKDB4MTAyRDEsICdYJyksCiAgICAoMHgxMDMwMCwgJ1YnKSwKICAgICgweDEwMzFGLCAnWCcpLAogICAgKDB4MTAzMjAsICdWJyksCiAgICAoMHgxMDMyNCwgJ1gnKSwKICAgICgweDEwMzMwLCAnVicpLAogICAgKDB4MTAzNEIsICdYJyksCiAgICAoMHgxMDM4MCwgJ1YnKSwKICAgICgweDEwMzlFLCAnWCcpLAogICAgKDB4MTAzOUYsICdWJyksCiAgICAoMHgxMDNDNCwgJ1gnKSwKICAgICgweDEwM0M4LCAnVicpLAogICAgKDB4MTAzRDYsICdYJyksCiAgICAoMHgxMDQwMCwgJ00nLCB1J/CQkKgnKSwKICAgICgweDEwNDAxLCAnTScsIHUn8JCQqScpLAogICAgKDB4MTA0MDIsICdNJywgdSfwkJCqJyksCiAgICAoMHgxMDQwMywgJ00nLCB1J/CQkKsnKSwKICAgICgweDEwNDA0LCAnTScsIHUn8JCQrCcpLAogICAgKDB4MTA0MDUsICdNJywgdSfwkJCtJyksCiAgICAoMHgxMDQwNiwgJ00nLCB1J/CQkK4nKSwKICAgICgweDEwNDA3LCAnTScsIHUn8JCQrycpLAogICAgKDB4MTA0MDgsICdNJywgdSfwkJCwJyksCiAgICAoMHgxMDQwOSwgJ00nLCB1J/CQkLEnKSwKICAgICgweDEwNDBBLCAnTScsIHUn8JCQsicpLAogICAgKDB4MTA0MEIsICdNJywgdSfwkJCzJyksCiAgICAoMHgxMDQwQywgJ00nLCB1J/CQkLQnKSwKICAgICgweDEwNDBELCAnTScsIHUn8JCQtScpLAogICAgKDB4MTA0MEUsICdNJywgdSfwkJC2JyksCiAgICAoMHgxMDQwRiwgJ00nLCB1J/CQkLcnKSwKICAgICgweDEwNDEwLCAnTScsIHUn8JCQuCcpLAogICAgKDB4MTA0MTEsICdNJywgdSfwkJC5JyksCiAgICAoMHgxMDQxMiwgJ00nLCB1J/CQkLonKSwKICAgICgweDEwNDEzLCAnTScsIHUn8JCQuycpLAogICAgKDB4MTA0MTQsICdNJywgdSfwkJC8JyksCiAgICAoMHgxMDQxNSwgJ00nLCB1J/CQkL0nKSwKICAgICgweDEwNDE2LCAnTScsIHUn8JCQvicpLAogICAgKDB4MTA0MTcsICdNJywgdSfwkJC/JyksCiAgICAoMHgxMDQxOCwgJ00nLCB1J/CQkYAnKSwKICAgICgweDEwNDE5LCAnTScsIHUn8JCRgScpLAogICAgKDB4MTA0MUEsICdNJywgdSfwkJGCJyksCiAgICAoMHgxMDQxQiwgJ00nLCB1J/CQkYMnKSwKICAgICgweDEwNDFDLCAnTScsIHUn8JCRhCcpLAogICAgKDB4MTA0MUQsICdNJywgdSfwkJGFJyksCiAgICBdCgpkZWYgX3NlZ181MigpOgogICAgcmV0dXJuIFsKICAgICgweDEwNDFFLCAnTScsIHUn8JCRhicpLAogICAgKDB4MTA0MUYsICdNJywgdSfwkJGHJyksCiAgICAoMHgxMDQyMCwgJ00nLCB1J/CQkYgnKSwKICAgICgweDEwNDIxLCAnTScsIHUn8JCRiScpLAogICAgKDB4MTA0MjIsICdNJywgdSfwkJGKJyksCiAgICAoMHgxMDQyMywgJ00nLCB1J/CQkYsnKSwKICAgICgweDEwNDI0LCAnTScsIHUn8JCRjCcpLAogICAgKDB4MTA0MjUsICdNJywgdSfwkJGNJyksCiAgICAoMHgxMDQyNiwgJ00nLCB1J/CQkY4nKSwKICAgICgweDEwNDI3LCAnTScsIHUn8JCRjycpLAogICAgKDB4MTA0MjgsICdWJyksCiAgICAoMHgxMDQ5RSwgJ1gnKSwKICAgICgweDEwNEEwLCAnVicpLAogICAgKDB4MTA0QUEsICdYJyksCiAgICAoMHgxMDgwMCwgJ1YnKSwKICAgICgweDEwODA2LCAnWCcpLAogICAgKDB4MTA4MDgsICdWJyksCiAgICAoMHgxMDgwOSwgJ1gnKSwKICAgICgweDEwODBBLCAnVicpLAogICAgKDB4MTA4MzYsICdYJyksCiAgICAoMHgxMDgzNywgJ1YnKSwKICAgICgweDEwODM5LCAnWCcpLAogICAgKDB4MTA4M0MsICdWJyksCiAgICAoMHgxMDgzRCwgJ1gnKSwKICAgICgweDEwODNGLCAnVicpLAogICAgKDB4MTA4NTYsICdYJyksCiAgICAoMHgxMDg1NywgJ1YnKSwKICAgICgweDEwODYwLCAnWCcpLAogICAgKDB4MTA5MDAsICdWJyksCiAgICAoMHgxMDkxQywgJ1gnKSwKICAgICgweDEwOTFGLCAnVicpLAogICAgKDB4MTA5M0EsICdYJyksCiAgICAoMHgxMDkzRiwgJ1YnKSwKICAgICgweDEwOTQwLCAnWCcpLAogICAgKDB4MTA5ODAsICdWJyksCiAgICAoMHgxMDlCOCwgJ1gnKSwKICAgICgweDEwOUJFLCAnVicpLAogICAgKDB4MTA5QzAsICdYJyksCiAgICAoMHgxMEEwMCwgJ1YnKSwKICAgICgweDEwQTA0LCAnWCcpLAogICAgKDB4MTBBMDUsICdWJyksCiAgICAoMHgxMEEwNywgJ1gnKSwKICAgICgweDEwQTBDLCAnVicpLAogICAgKDB4MTBBMTQsICdYJyksCiAgICAoMHgxMEExNSwgJ1YnKSwKICAgICgweDEwQTE4LCAnWCcpLAogICAgKDB4MTBBMTksICdWJyksCiAgICAoMHgxMEEzNCwgJ1gnKSwKICAgICgweDEwQTM4LCAnVicpLAogICAgKDB4MTBBM0IsICdYJyksCiAgICAoMHgxMEEzRiwgJ1YnKSwKICAgICgweDEwQTQ4LCAnWCcpLAogICAgKDB4MTBBNTAsICdWJyksCiAgICAoMHgxMEE1OSwgJ1gnKSwKICAgICgweDEwQTYwLCAnVicpLAogICAgKDB4MTBBODAsICdYJyksCiAgICAoMHgxMEIwMCwgJ1YnKSwKICAgICgweDEwQjM2LCAnWCcpLAogICAgKDB4MTBCMzksICdWJyksCiAgICAoMHgxMEI1NiwgJ1gnKSwKICAgICgweDEwQjU4LCAnVicpLAogICAgKDB4MTBCNzMsICdYJyksCiAgICAoMHgxMEI3OCwgJ1YnKSwKICAgICgweDEwQjgwLCAnWCcpLAogICAgKDB4MTBDMDAsICdWJyksCiAgICAoMHgxMEM0OSwgJ1gnKSwKICAgICgweDEwRTYwLCAnVicpLAogICAgKDB4MTBFN0YsICdYJyksCiAgICAoMHgxMTAwMCwgJ1YnKSwKICAgICgweDExMDRFLCAnWCcpLAogICAgKDB4MTEwNTIsICdWJyksCiAgICAoMHgxMTA3MCwgJ1gnKSwKICAgICgweDExMDgwLCAnVicpLAogICAgKDB4MTEwQkQsICdYJyksCiAgICAoMHgxMTBCRSwgJ1YnKSwKICAgICgweDExMEMyLCAnWCcpLAogICAgKDB4MTEwRDAsICdWJyksCiAgICAoMHgxMTBFOSwgJ1gnKSwKICAgICgweDExMEYwLCAnVicpLAogICAgKDB4MTEwRkEsICdYJyksCiAgICAoMHgxMTEwMCwgJ1YnKSwKICAgICgweDExMTM1LCAnWCcpLAogICAgKDB4MTExMzYsICdWJyksCiAgICAoMHgxMTE0NCwgJ1gnKSwKICAgICgweDExMTgwLCAnVicpLAogICAgKDB4MTExQzksICdYJyksCiAgICAoMHgxMTFEMCwgJ1YnKSwKICAgICgweDExMURBLCAnWCcpLAogICAgKDB4MTE2ODAsICdWJyksCiAgICAoMHgxMTZCOCwgJ1gnKSwKICAgICgweDExNkMwLCAnVicpLAogICAgKDB4MTE2Q0EsICdYJyksCiAgICAoMHgxMjAwMCwgJ1YnKSwKICAgICgweDEyMzZGLCAnWCcpLAogICAgKDB4MTI0MDAsICdWJyksCiAgICAoMHgxMjQ2MywgJ1gnKSwKICAgICgweDEyNDcwLCAnVicpLAogICAgKDB4MTI0NzQsICdYJyksCiAgICAoMHgxMzAwMCwgJ1YnKSwKICAgICgweDEzNDJGLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfNTMoKToKICAgIHJldHVybiBbCiAgICAoMHgxNjgwMCwgJ1YnKSwKICAgICgweDE2QTM5LCAnWCcpLAogICAgKDB4MTZGMDAsICdWJyksCiAgICAoMHgxNkY0NSwgJ1gnKSwKICAgICgweDE2RjUwLCAnVicpLAogICAgKDB4MTZGN0YsICdYJyksCiAgICAoMHgxNkY4RiwgJ1YnKSwKICAgICgweDE2RkEwLCAnWCcpLAogICAgKDB4MUIwMDAsICdWJyksCiAgICAoMHgxQjAwMiwgJ1gnKSwKICAgICgweDFEMDAwLCAnVicpLAogICAgKDB4MUQwRjYsICdYJyksCiAgICAoMHgxRDEwMCwgJ1YnKSwKICAgICgweDFEMTI3LCAnWCcpLAogICAgKDB4MUQxMjksICdWJyksCiAgICAoMHgxRDE1RSwgJ00nLCB1J/CdhZfwnYWlJyksCiAgICAoMHgxRDE1RiwgJ00nLCB1J/CdhZjwnYWlJyksCiAgICAoMHgxRDE2MCwgJ00nLCB1J/CdhZjwnYWl8J2FricpLAogICAgKDB4MUQxNjEsICdNJywgdSfwnYWY8J2FpfCdha8nKSwKICAgICgweDFEMTYyLCAnTScsIHUn8J2FmPCdhaXwnYWwJyksCiAgICAoMHgxRDE2MywgJ00nLCB1J/CdhZjwnYWl8J2FsScpLAogICAgKDB4MUQxNjQsICdNJywgdSfwnYWY8J2FpfCdhbInKSwKICAgICgweDFEMTY1LCAnVicpLAogICAgKDB4MUQxNzMsICdYJyksCiAgICAoMHgxRDE3QiwgJ1YnKSwKICAgICgweDFEMUJCLCAnTScsIHUn8J2GufCdhaUnKSwKICAgICgweDFEMUJDLCAnTScsIHUn8J2GuvCdhaUnKSwKICAgICgweDFEMUJELCAnTScsIHUn8J2GufCdhaXwnYWuJyksCiAgICAoMHgxRDFCRSwgJ00nLCB1J/CdhrrwnYWl8J2FricpLAogICAgKDB4MUQxQkYsICdNJywgdSfwnYa58J2FpfCdha8nKSwKICAgICgweDFEMUMwLCAnTScsIHUn8J2GuvCdhaXwnYWvJyksCiAgICAoMHgxRDFDMSwgJ1YnKSwKICAgICgweDFEMURFLCAnWCcpLAogICAgKDB4MUQyMDAsICdWJyksCiAgICAoMHgxRDI0NiwgJ1gnKSwKICAgICgweDFEMzAwLCAnVicpLAogICAgKDB4MUQzNTcsICdYJyksCiAgICAoMHgxRDM2MCwgJ1YnKSwKICAgICgweDFEMzcyLCAnWCcpLAogICAgKDB4MUQ0MDAsICdNJywgdSdhJyksCiAgICAoMHgxRDQwMSwgJ00nLCB1J2InKSwKICAgICgweDFENDAyLCAnTScsIHUnYycpLAogICAgKDB4MUQ0MDMsICdNJywgdSdkJyksCiAgICAoMHgxRDQwNCwgJ00nLCB1J2UnKSwKICAgICgweDFENDA1LCAnTScsIHUnZicpLAogICAgKDB4MUQ0MDYsICdNJywgdSdnJyksCiAgICAoMHgxRDQwNywgJ00nLCB1J2gnKSwKICAgICgweDFENDA4LCAnTScsIHUnaScpLAogICAgKDB4MUQ0MDksICdNJywgdSdqJyksCiAgICAoMHgxRDQwQSwgJ00nLCB1J2snKSwKICAgICgweDFENDBCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0MEMsICdNJywgdSdtJyksCiAgICAoMHgxRDQwRCwgJ00nLCB1J24nKSwKICAgICgweDFENDBFLCAnTScsIHUnbycpLAogICAgKDB4MUQ0MEYsICdNJywgdSdwJyksCiAgICAoMHgxRDQxMCwgJ00nLCB1J3EnKSwKICAgICgweDFENDExLCAnTScsIHUncicpLAogICAgKDB4MUQ0MTIsICdNJywgdSdzJyksCiAgICAoMHgxRDQxMywgJ00nLCB1J3QnKSwKICAgICgweDFENDE0LCAnTScsIHUndScpLAogICAgKDB4MUQ0MTUsICdNJywgdSd2JyksCiAgICAoMHgxRDQxNiwgJ00nLCB1J3cnKSwKICAgICgweDFENDE3LCAnTScsIHUneCcpLAogICAgKDB4MUQ0MTgsICdNJywgdSd5JyksCiAgICAoMHgxRDQxOSwgJ00nLCB1J3onKSwKICAgICgweDFENDFBLCAnTScsIHUnYScpLAogICAgKDB4MUQ0MUIsICdNJywgdSdiJyksCiAgICAoMHgxRDQxQywgJ00nLCB1J2MnKSwKICAgICgweDFENDFELCAnTScsIHUnZCcpLAogICAgKDB4MUQ0MUUsICdNJywgdSdlJyksCiAgICAoMHgxRDQxRiwgJ00nLCB1J2YnKSwKICAgICgweDFENDIwLCAnTScsIHUnZycpLAogICAgKDB4MUQ0MjEsICdNJywgdSdoJyksCiAgICAoMHgxRDQyMiwgJ00nLCB1J2knKSwKICAgICgweDFENDIzLCAnTScsIHUnaicpLAogICAgKDB4MUQ0MjQsICdNJywgdSdrJyksCiAgICAoMHgxRDQyNSwgJ00nLCB1J2wnKSwKICAgICgweDFENDI2LCAnTScsIHUnbScpLAogICAgKDB4MUQ0MjcsICdNJywgdSduJyksCiAgICAoMHgxRDQyOCwgJ00nLCB1J28nKSwKICAgICgweDFENDI5LCAnTScsIHUncCcpLAogICAgKDB4MUQ0MkEsICdNJywgdSdxJyksCiAgICAoMHgxRDQyQiwgJ00nLCB1J3InKSwKICAgICgweDFENDJDLCAnTScsIHUncycpLAogICAgKDB4MUQ0MkQsICdNJywgdSd0JyksCiAgICAoMHgxRDQyRSwgJ00nLCB1J3UnKSwKICAgICgweDFENDJGLCAnTScsIHUndicpLAogICAgKDB4MUQ0MzAsICdNJywgdSd3JyksCiAgICAoMHgxRDQzMSwgJ00nLCB1J3gnKSwKICAgICgweDFENDMyLCAnTScsIHUneScpLAogICAgKDB4MUQ0MzMsICdNJywgdSd6JyksCiAgICAoMHgxRDQzNCwgJ00nLCB1J2EnKSwKICAgICgweDFENDM1LCAnTScsIHUnYicpLAogICAgKDB4MUQ0MzYsICdNJywgdSdjJyksCiAgICAoMHgxRDQzNywgJ00nLCB1J2QnKSwKICAgICgweDFENDM4LCAnTScsIHUnZScpLAogICAgKDB4MUQ0MzksICdNJywgdSdmJyksCiAgICAoMHgxRDQzQSwgJ00nLCB1J2cnKSwKICAgICgweDFENDNCLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0M0MsICdNJywgdSdpJyksCiAgICBdCgpkZWYgX3NlZ181NCgpOgogICAgcmV0dXJuIFsKICAgICgweDFENDNELCAnTScsIHUnaicpLAogICAgKDB4MUQ0M0UsICdNJywgdSdrJyksCiAgICAoMHgxRDQzRiwgJ00nLCB1J2wnKSwKICAgICgweDFENDQwLCAnTScsIHUnbScpLAogICAgKDB4MUQ0NDEsICdNJywgdSduJyksCiAgICAoMHgxRDQ0MiwgJ00nLCB1J28nKSwKICAgICgweDFENDQzLCAnTScsIHUncCcpLAogICAgKDB4MUQ0NDQsICdNJywgdSdxJyksCiAgICAoMHgxRDQ0NSwgJ00nLCB1J3InKSwKICAgICgweDFENDQ2LCAnTScsIHUncycpLAogICAgKDB4MUQ0NDcsICdNJywgdSd0JyksCiAgICAoMHgxRDQ0OCwgJ00nLCB1J3UnKSwKICAgICgweDFENDQ5LCAnTScsIHUndicpLAogICAgKDB4MUQ0NEEsICdNJywgdSd3JyksCiAgICAoMHgxRDQ0QiwgJ00nLCB1J3gnKSwKICAgICgweDFENDRDLCAnTScsIHUneScpLAogICAgKDB4MUQ0NEQsICdNJywgdSd6JyksCiAgICAoMHgxRDQ0RSwgJ00nLCB1J2EnKSwKICAgICgweDFENDRGLCAnTScsIHUnYicpLAogICAgKDB4MUQ0NTAsICdNJywgdSdjJyksCiAgICAoMHgxRDQ1MSwgJ00nLCB1J2QnKSwKICAgICgweDFENDUyLCAnTScsIHUnZScpLAogICAgKDB4MUQ0NTMsICdNJywgdSdmJyksCiAgICAoMHgxRDQ1NCwgJ00nLCB1J2cnKSwKICAgICgweDFENDU1LCAnWCcpLAogICAgKDB4MUQ0NTYsICdNJywgdSdpJyksCiAgICAoMHgxRDQ1NywgJ00nLCB1J2onKSwKICAgICgweDFENDU4LCAnTScsIHUnaycpLAogICAgKDB4MUQ0NTksICdNJywgdSdsJyksCiAgICAoMHgxRDQ1QSwgJ00nLCB1J20nKSwKICAgICgweDFENDVCLCAnTScsIHUnbicpLAogICAgKDB4MUQ0NUMsICdNJywgdSdvJyksCiAgICAoMHgxRDQ1RCwgJ00nLCB1J3AnKSwKICAgICgweDFENDVFLCAnTScsIHUncScpLAogICAgKDB4MUQ0NUYsICdNJywgdSdyJyksCiAgICAoMHgxRDQ2MCwgJ00nLCB1J3MnKSwKICAgICgweDFENDYxLCAnTScsIHUndCcpLAogICAgKDB4MUQ0NjIsICdNJywgdSd1JyksCiAgICAoMHgxRDQ2MywgJ00nLCB1J3YnKSwKICAgICgweDFENDY0LCAnTScsIHUndycpLAogICAgKDB4MUQ0NjUsICdNJywgdSd4JyksCiAgICAoMHgxRDQ2NiwgJ00nLCB1J3knKSwKICAgICgweDFENDY3LCAnTScsIHUneicpLAogICAgKDB4MUQ0NjgsICdNJywgdSdhJyksCiAgICAoMHgxRDQ2OSwgJ00nLCB1J2InKSwKICAgICgweDFENDZBLCAnTScsIHUnYycpLAogICAgKDB4MUQ0NkIsICdNJywgdSdkJyksCiAgICAoMHgxRDQ2QywgJ00nLCB1J2UnKSwKICAgICgweDFENDZELCAnTScsIHUnZicpLAogICAgKDB4MUQ0NkUsICdNJywgdSdnJyksCiAgICAoMHgxRDQ2RiwgJ00nLCB1J2gnKSwKICAgICgweDFENDcwLCAnTScsIHUnaScpLAogICAgKDB4MUQ0NzEsICdNJywgdSdqJyksCiAgICAoMHgxRDQ3MiwgJ00nLCB1J2snKSwKICAgICgweDFENDczLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0NzQsICdNJywgdSdtJyksCiAgICAoMHgxRDQ3NSwgJ00nLCB1J24nKSwKICAgICgweDFENDc2LCAnTScsIHUnbycpLAogICAgKDB4MUQ0NzcsICdNJywgdSdwJyksCiAgICAoMHgxRDQ3OCwgJ00nLCB1J3EnKSwKICAgICgweDFENDc5LCAnTScsIHUncicpLAogICAgKDB4MUQ0N0EsICdNJywgdSdzJyksCiAgICAoMHgxRDQ3QiwgJ00nLCB1J3QnKSwKICAgICgweDFENDdDLCAnTScsIHUndScpLAogICAgKDB4MUQ0N0QsICdNJywgdSd2JyksCiAgICAoMHgxRDQ3RSwgJ00nLCB1J3cnKSwKICAgICgweDFENDdGLCAnTScsIHUneCcpLAogICAgKDB4MUQ0ODAsICdNJywgdSd5JyksCiAgICAoMHgxRDQ4MSwgJ00nLCB1J3onKSwKICAgICgweDFENDgyLCAnTScsIHUnYScpLAogICAgKDB4MUQ0ODMsICdNJywgdSdiJyksCiAgICAoMHgxRDQ4NCwgJ00nLCB1J2MnKSwKICAgICgweDFENDg1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0ODYsICdNJywgdSdlJyksCiAgICAoMHgxRDQ4NywgJ00nLCB1J2YnKSwKICAgICgweDFENDg4LCAnTScsIHUnZycpLAogICAgKDB4MUQ0ODksICdNJywgdSdoJyksCiAgICAoMHgxRDQ4QSwgJ00nLCB1J2knKSwKICAgICgweDFENDhCLCAnTScsIHUnaicpLAogICAgKDB4MUQ0OEMsICdNJywgdSdrJyksCiAgICAoMHgxRDQ4RCwgJ00nLCB1J2wnKSwKICAgICgweDFENDhFLCAnTScsIHUnbScpLAogICAgKDB4MUQ0OEYsICdNJywgdSduJyksCiAgICAoMHgxRDQ5MCwgJ00nLCB1J28nKSwKICAgICgweDFENDkxLCAnTScsIHUncCcpLAogICAgKDB4MUQ0OTIsICdNJywgdSdxJyksCiAgICAoMHgxRDQ5MywgJ00nLCB1J3InKSwKICAgICgweDFENDk0LCAnTScsIHUncycpLAogICAgKDB4MUQ0OTUsICdNJywgdSd0JyksCiAgICAoMHgxRDQ5NiwgJ00nLCB1J3UnKSwKICAgICgweDFENDk3LCAnTScsIHUndicpLAogICAgKDB4MUQ0OTgsICdNJywgdSd3JyksCiAgICAoMHgxRDQ5OSwgJ00nLCB1J3gnKSwKICAgICgweDFENDlBLCAnTScsIHUneScpLAogICAgKDB4MUQ0OUIsICdNJywgdSd6JyksCiAgICAoMHgxRDQ5QywgJ00nLCB1J2EnKSwKICAgICgweDFENDlELCAnWCcpLAogICAgKDB4MUQ0OUUsICdNJywgdSdjJyksCiAgICAoMHgxRDQ5RiwgJ00nLCB1J2QnKSwKICAgICgweDFENEEwLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfNTUoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDRBMiwgJ00nLCB1J2cnKSwKICAgICgweDFENEEzLCAnWCcpLAogICAgKDB4MUQ0QTUsICdNJywgdSdqJyksCiAgICAoMHgxRDRBNiwgJ00nLCB1J2snKSwKICAgICgweDFENEE3LCAnWCcpLAogICAgKDB4MUQ0QTksICdNJywgdSduJyksCiAgICAoMHgxRDRBQSwgJ00nLCB1J28nKSwKICAgICgweDFENEFCLCAnTScsIHUncCcpLAogICAgKDB4MUQ0QUMsICdNJywgdSdxJyksCiAgICAoMHgxRDRBRCwgJ1gnKSwKICAgICgweDFENEFFLCAnTScsIHUncycpLAogICAgKDB4MUQ0QUYsICdNJywgdSd0JyksCiAgICAoMHgxRDRCMCwgJ00nLCB1J3UnKSwKICAgICgweDFENEIxLCAnTScsIHUndicpLAogICAgKDB4MUQ0QjIsICdNJywgdSd3JyksCiAgICAoMHgxRDRCMywgJ00nLCB1J3gnKSwKICAgICgweDFENEI0LCAnTScsIHUneScpLAogICAgKDB4MUQ0QjUsICdNJywgdSd6JyksCiAgICAoMHgxRDRCNiwgJ00nLCB1J2EnKSwKICAgICgweDFENEI3LCAnTScsIHUnYicpLAogICAgKDB4MUQ0QjgsICdNJywgdSdjJyksCiAgICAoMHgxRDRCOSwgJ00nLCB1J2QnKSwKICAgICgweDFENEJBLCAnWCcpLAogICAgKDB4MUQ0QkIsICdNJywgdSdmJyksCiAgICAoMHgxRDRCQywgJ1gnKSwKICAgICgweDFENEJELCAnTScsIHUnaCcpLAogICAgKDB4MUQ0QkUsICdNJywgdSdpJyksCiAgICAoMHgxRDRCRiwgJ00nLCB1J2onKSwKICAgICgweDFENEMwLCAnTScsIHUnaycpLAogICAgKDB4MUQ0QzEsICdNJywgdSdsJyksCiAgICAoMHgxRDRDMiwgJ00nLCB1J20nKSwKICAgICgweDFENEMzLCAnTScsIHUnbicpLAogICAgKDB4MUQ0QzQsICdYJyksCiAgICAoMHgxRDRDNSwgJ00nLCB1J3AnKSwKICAgICgweDFENEM2LCAnTScsIHUncScpLAogICAgKDB4MUQ0QzcsICdNJywgdSdyJyksCiAgICAoMHgxRDRDOCwgJ00nLCB1J3MnKSwKICAgICgweDFENEM5LCAnTScsIHUndCcpLAogICAgKDB4MUQ0Q0EsICdNJywgdSd1JyksCiAgICAoMHgxRDRDQiwgJ00nLCB1J3YnKSwKICAgICgweDFENENDLCAnTScsIHUndycpLAogICAgKDB4MUQ0Q0QsICdNJywgdSd4JyksCiAgICAoMHgxRDRDRSwgJ00nLCB1J3knKSwKICAgICgweDFENENGLCAnTScsIHUneicpLAogICAgKDB4MUQ0RDAsICdNJywgdSdhJyksCiAgICAoMHgxRDREMSwgJ00nLCB1J2InKSwKICAgICgweDFENEQyLCAnTScsIHUnYycpLAogICAgKDB4MUQ0RDMsICdNJywgdSdkJyksCiAgICAoMHgxRDRENCwgJ00nLCB1J2UnKSwKICAgICgweDFENEQ1LCAnTScsIHUnZicpLAogICAgKDB4MUQ0RDYsICdNJywgdSdnJyksCiAgICAoMHgxRDRENywgJ00nLCB1J2gnKSwKICAgICgweDFENEQ4LCAnTScsIHUnaScpLAogICAgKDB4MUQ0RDksICdNJywgdSdqJyksCiAgICAoMHgxRDREQSwgJ00nLCB1J2snKSwKICAgICgweDFENERCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0REMsICdNJywgdSdtJyksCiAgICAoMHgxRDRERCwgJ00nLCB1J24nKSwKICAgICgweDFENERFLCAnTScsIHUnbycpLAogICAgKDB4MUQ0REYsICdNJywgdSdwJyksCiAgICAoMHgxRDRFMCwgJ00nLCB1J3EnKSwKICAgICgweDFENEUxLCAnTScsIHUncicpLAogICAgKDB4MUQ0RTIsICdNJywgdSdzJyksCiAgICAoMHgxRDRFMywgJ00nLCB1J3QnKSwKICAgICgweDFENEU0LCAnTScsIHUndScpLAogICAgKDB4MUQ0RTUsICdNJywgdSd2JyksCiAgICAoMHgxRDRFNiwgJ00nLCB1J3cnKSwKICAgICgweDFENEU3LCAnTScsIHUneCcpLAogICAgKDB4MUQ0RTgsICdNJywgdSd5JyksCiAgICAoMHgxRDRFOSwgJ00nLCB1J3onKSwKICAgICgweDFENEVBLCAnTScsIHUnYScpLAogICAgKDB4MUQ0RUIsICdNJywgdSdiJyksCiAgICAoMHgxRDRFQywgJ00nLCB1J2MnKSwKICAgICgweDFENEVELCAnTScsIHUnZCcpLAogICAgKDB4MUQ0RUUsICdNJywgdSdlJyksCiAgICAoMHgxRDRFRiwgJ00nLCB1J2YnKSwKICAgICgweDFENEYwLCAnTScsIHUnZycpLAogICAgKDB4MUQ0RjEsICdNJywgdSdoJyksCiAgICAoMHgxRDRGMiwgJ00nLCB1J2knKSwKICAgICgweDFENEYzLCAnTScsIHUnaicpLAogICAgKDB4MUQ0RjQsICdNJywgdSdrJyksCiAgICAoMHgxRDRGNSwgJ00nLCB1J2wnKSwKICAgICgweDFENEY2LCAnTScsIHUnbScpLAogICAgKDB4MUQ0RjcsICdNJywgdSduJyksCiAgICAoMHgxRDRGOCwgJ00nLCB1J28nKSwKICAgICgweDFENEY5LCAnTScsIHUncCcpLAogICAgKDB4MUQ0RkEsICdNJywgdSdxJyksCiAgICAoMHgxRDRGQiwgJ00nLCB1J3InKSwKICAgICgweDFENEZDLCAnTScsIHUncycpLAogICAgKDB4MUQ0RkQsICdNJywgdSd0JyksCiAgICAoMHgxRDRGRSwgJ00nLCB1J3UnKSwKICAgICgweDFENEZGLCAnTScsIHUndicpLAogICAgKDB4MUQ1MDAsICdNJywgdSd3JyksCiAgICAoMHgxRDUwMSwgJ00nLCB1J3gnKSwKICAgICgweDFENTAyLCAnTScsIHUneScpLAogICAgKDB4MUQ1MDMsICdNJywgdSd6JyksCiAgICAoMHgxRDUwNCwgJ00nLCB1J2EnKSwKICAgICgweDFENTA1LCAnTScsIHUnYicpLAogICAgKDB4MUQ1MDYsICdYJyksCiAgICAoMHgxRDUwNywgJ00nLCB1J2QnKSwKICAgIF0KCmRlZiBfc2VnXzU2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ1MDgsICdNJywgdSdlJyksCiAgICAoMHgxRDUwOSwgJ00nLCB1J2YnKSwKICAgICgweDFENTBBLCAnTScsIHUnZycpLAogICAgKDB4MUQ1MEIsICdYJyksCiAgICAoMHgxRDUwRCwgJ00nLCB1J2onKSwKICAgICgweDFENTBFLCAnTScsIHUnaycpLAogICAgKDB4MUQ1MEYsICdNJywgdSdsJyksCiAgICAoMHgxRDUxMCwgJ00nLCB1J20nKSwKICAgICgweDFENTExLCAnTScsIHUnbicpLAogICAgKDB4MUQ1MTIsICdNJywgdSdvJyksCiAgICAoMHgxRDUxMywgJ00nLCB1J3AnKSwKICAgICgweDFENTE0LCAnTScsIHUncScpLAogICAgKDB4MUQ1MTUsICdYJyksCiAgICAoMHgxRDUxNiwgJ00nLCB1J3MnKSwKICAgICgweDFENTE3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1MTgsICdNJywgdSd1JyksCiAgICAoMHgxRDUxOSwgJ00nLCB1J3YnKSwKICAgICgweDFENTFBLCAnTScsIHUndycpLAogICAgKDB4MUQ1MUIsICdNJywgdSd4JyksCiAgICAoMHgxRDUxQywgJ00nLCB1J3knKSwKICAgICgweDFENTFELCAnWCcpLAogICAgKDB4MUQ1MUUsICdNJywgdSdhJyksCiAgICAoMHgxRDUxRiwgJ00nLCB1J2InKSwKICAgICgweDFENTIwLCAnTScsIHUnYycpLAogICAgKDB4MUQ1MjEsICdNJywgdSdkJyksCiAgICAoMHgxRDUyMiwgJ00nLCB1J2UnKSwKICAgICgweDFENTIzLCAnTScsIHUnZicpLAogICAgKDB4MUQ1MjQsICdNJywgdSdnJyksCiAgICAoMHgxRDUyNSwgJ00nLCB1J2gnKSwKICAgICgweDFENTI2LCAnTScsIHUnaScpLAogICAgKDB4MUQ1MjcsICdNJywgdSdqJyksCiAgICAoMHgxRDUyOCwgJ00nLCB1J2snKSwKICAgICgweDFENTI5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1MkEsICdNJywgdSdtJyksCiAgICAoMHgxRDUyQiwgJ00nLCB1J24nKSwKICAgICgweDFENTJDLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MkQsICdNJywgdSdwJyksCiAgICAoMHgxRDUyRSwgJ00nLCB1J3EnKSwKICAgICgweDFENTJGLCAnTScsIHUncicpLAogICAgKDB4MUQ1MzAsICdNJywgdSdzJyksCiAgICAoMHgxRDUzMSwgJ00nLCB1J3QnKSwKICAgICgweDFENTMyLCAnTScsIHUndScpLAogICAgKDB4MUQ1MzMsICdNJywgdSd2JyksCiAgICAoMHgxRDUzNCwgJ00nLCB1J3cnKSwKICAgICgweDFENTM1LCAnTScsIHUneCcpLAogICAgKDB4MUQ1MzYsICdNJywgdSd5JyksCiAgICAoMHgxRDUzNywgJ00nLCB1J3onKSwKICAgICgweDFENTM4LCAnTScsIHUnYScpLAogICAgKDB4MUQ1MzksICdNJywgdSdiJyksCiAgICAoMHgxRDUzQSwgJ1gnKSwKICAgICgweDFENTNCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1M0MsICdNJywgdSdlJyksCiAgICAoMHgxRDUzRCwgJ00nLCB1J2YnKSwKICAgICgweDFENTNFLCAnTScsIHUnZycpLAogICAgKDB4MUQ1M0YsICdYJyksCiAgICAoMHgxRDU0MCwgJ00nLCB1J2knKSwKICAgICgweDFENTQxLCAnTScsIHUnaicpLAogICAgKDB4MUQ1NDIsICdNJywgdSdrJyksCiAgICAoMHgxRDU0MywgJ00nLCB1J2wnKSwKICAgICgweDFENTQ0LCAnTScsIHUnbScpLAogICAgKDB4MUQ1NDUsICdYJyksCiAgICAoMHgxRDU0NiwgJ00nLCB1J28nKSwKICAgICgweDFENTQ3LCAnWCcpLAogICAgKDB4MUQ1NEEsICdNJywgdSdzJyksCiAgICAoMHgxRDU0QiwgJ00nLCB1J3QnKSwKICAgICgweDFENTRDLCAnTScsIHUndScpLAogICAgKDB4MUQ1NEQsICdNJywgdSd2JyksCiAgICAoMHgxRDU0RSwgJ00nLCB1J3cnKSwKICAgICgweDFENTRGLCAnTScsIHUneCcpLAogICAgKDB4MUQ1NTAsICdNJywgdSd5JyksCiAgICAoMHgxRDU1MSwgJ1gnKSwKICAgICgweDFENTUyLCAnTScsIHUnYScpLAogICAgKDB4MUQ1NTMsICdNJywgdSdiJyksCiAgICAoMHgxRDU1NCwgJ00nLCB1J2MnKSwKICAgICgweDFENTU1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ1NTYsICdNJywgdSdlJyksCiAgICAoMHgxRDU1NywgJ00nLCB1J2YnKSwKICAgICgweDFENTU4LCAnTScsIHUnZycpLAogICAgKDB4MUQ1NTksICdNJywgdSdoJyksCiAgICAoMHgxRDU1QSwgJ00nLCB1J2knKSwKICAgICgweDFENTVCLCAnTScsIHUnaicpLAogICAgKDB4MUQ1NUMsICdNJywgdSdrJyksCiAgICAoMHgxRDU1RCwgJ00nLCB1J2wnKSwKICAgICgweDFENTVFLCAnTScsIHUnbScpLAogICAgKDB4MUQ1NUYsICdNJywgdSduJyksCiAgICAoMHgxRDU2MCwgJ00nLCB1J28nKSwKICAgICgweDFENTYxLCAnTScsIHUncCcpLAogICAgKDB4MUQ1NjIsICdNJywgdSdxJyksCiAgICAoMHgxRDU2MywgJ00nLCB1J3InKSwKICAgICgweDFENTY0LCAnTScsIHUncycpLAogICAgKDB4MUQ1NjUsICdNJywgdSd0JyksCiAgICAoMHgxRDU2NiwgJ00nLCB1J3UnKSwKICAgICgweDFENTY3LCAnTScsIHUndicpLAogICAgKDB4MUQ1NjgsICdNJywgdSd3JyksCiAgICAoMHgxRDU2OSwgJ00nLCB1J3gnKSwKICAgICgweDFENTZBLCAnTScsIHUneScpLAogICAgKDB4MUQ1NkIsICdNJywgdSd6JyksCiAgICAoMHgxRDU2QywgJ00nLCB1J2EnKSwKICAgICgweDFENTZELCAnTScsIHUnYicpLAogICAgKDB4MUQ1NkUsICdNJywgdSdjJyksCiAgICBdCgpkZWYgX3NlZ181NygpOgogICAgcmV0dXJuIFsKICAgICgweDFENTZGLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1NzAsICdNJywgdSdlJyksCiAgICAoMHgxRDU3MSwgJ00nLCB1J2YnKSwKICAgICgweDFENTcyLCAnTScsIHUnZycpLAogICAgKDB4MUQ1NzMsICdNJywgdSdoJyksCiAgICAoMHgxRDU3NCwgJ00nLCB1J2knKSwKICAgICgweDFENTc1LCAnTScsIHUnaicpLAogICAgKDB4MUQ1NzYsICdNJywgdSdrJyksCiAgICAoMHgxRDU3NywgJ00nLCB1J2wnKSwKICAgICgweDFENTc4LCAnTScsIHUnbScpLAogICAgKDB4MUQ1NzksICdNJywgdSduJyksCiAgICAoMHgxRDU3QSwgJ00nLCB1J28nKSwKICAgICgweDFENTdCLCAnTScsIHUncCcpLAogICAgKDB4MUQ1N0MsICdNJywgdSdxJyksCiAgICAoMHgxRDU3RCwgJ00nLCB1J3InKSwKICAgICgweDFENTdFLCAnTScsIHUncycpLAogICAgKDB4MUQ1N0YsICdNJywgdSd0JyksCiAgICAoMHgxRDU4MCwgJ00nLCB1J3UnKSwKICAgICgweDFENTgxLCAnTScsIHUndicpLAogICAgKDB4MUQ1ODIsICdNJywgdSd3JyksCiAgICAoMHgxRDU4MywgJ00nLCB1J3gnKSwKICAgICgweDFENTg0LCAnTScsIHUneScpLAogICAgKDB4MUQ1ODUsICdNJywgdSd6JyksCiAgICAoMHgxRDU4NiwgJ00nLCB1J2EnKSwKICAgICgweDFENTg3LCAnTScsIHUnYicpLAogICAgKDB4MUQ1ODgsICdNJywgdSdjJyksCiAgICAoMHgxRDU4OSwgJ00nLCB1J2QnKSwKICAgICgweDFENThBLCAnTScsIHUnZScpLAogICAgKDB4MUQ1OEIsICdNJywgdSdmJyksCiAgICAoMHgxRDU4QywgJ00nLCB1J2cnKSwKICAgICgweDFENThELCAnTScsIHUnaCcpLAogICAgKDB4MUQ1OEUsICdNJywgdSdpJyksCiAgICAoMHgxRDU4RiwgJ00nLCB1J2onKSwKICAgICgweDFENTkwLCAnTScsIHUnaycpLAogICAgKDB4MUQ1OTEsICdNJywgdSdsJyksCiAgICAoMHgxRDU5MiwgJ00nLCB1J20nKSwKICAgICgweDFENTkzLCAnTScsIHUnbicpLAogICAgKDB4MUQ1OTQsICdNJywgdSdvJyksCiAgICAoMHgxRDU5NSwgJ00nLCB1J3AnKSwKICAgICgweDFENTk2LCAnTScsIHUncScpLAogICAgKDB4MUQ1OTcsICdNJywgdSdyJyksCiAgICAoMHgxRDU5OCwgJ00nLCB1J3MnKSwKICAgICgweDFENTk5LCAnTScsIHUndCcpLAogICAgKDB4MUQ1OUEsICdNJywgdSd1JyksCiAgICAoMHgxRDU5QiwgJ00nLCB1J3YnKSwKICAgICgweDFENTlDLCAnTScsIHUndycpLAogICAgKDB4MUQ1OUQsICdNJywgdSd4JyksCiAgICAoMHgxRDU5RSwgJ00nLCB1J3knKSwKICAgICgweDFENTlGLCAnTScsIHUneicpLAogICAgKDB4MUQ1QTAsICdNJywgdSdhJyksCiAgICAoMHgxRDVBMSwgJ00nLCB1J2InKSwKICAgICgweDFENUEyLCAnTScsIHUnYycpLAogICAgKDB4MUQ1QTMsICdNJywgdSdkJyksCiAgICAoMHgxRDVBNCwgJ00nLCB1J2UnKSwKICAgICgweDFENUE1LCAnTScsIHUnZicpLAogICAgKDB4MUQ1QTYsICdNJywgdSdnJyksCiAgICAoMHgxRDVBNywgJ00nLCB1J2gnKSwKICAgICgweDFENUE4LCAnTScsIHUnaScpLAogICAgKDB4MUQ1QTksICdNJywgdSdqJyksCiAgICAoMHgxRDVBQSwgJ00nLCB1J2snKSwKICAgICgweDFENUFCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1QUMsICdNJywgdSdtJyksCiAgICAoMHgxRDVBRCwgJ00nLCB1J24nKSwKICAgICgweDFENUFFLCAnTScsIHUnbycpLAogICAgKDB4MUQ1QUYsICdNJywgdSdwJyksCiAgICAoMHgxRDVCMCwgJ00nLCB1J3EnKSwKICAgICgweDFENUIxLCAnTScsIHUncicpLAogICAgKDB4MUQ1QjIsICdNJywgdSdzJyksCiAgICAoMHgxRDVCMywgJ00nLCB1J3QnKSwKICAgICgweDFENUI0LCAnTScsIHUndScpLAogICAgKDB4MUQ1QjUsICdNJywgdSd2JyksCiAgICAoMHgxRDVCNiwgJ00nLCB1J3cnKSwKICAgICgweDFENUI3LCAnTScsIHUneCcpLAogICAgKDB4MUQ1QjgsICdNJywgdSd5JyksCiAgICAoMHgxRDVCOSwgJ00nLCB1J3onKSwKICAgICgweDFENUJBLCAnTScsIHUnYScpLAogICAgKDB4MUQ1QkIsICdNJywgdSdiJyksCiAgICAoMHgxRDVCQywgJ00nLCB1J2MnKSwKICAgICgweDFENUJELCAnTScsIHUnZCcpLAogICAgKDB4MUQ1QkUsICdNJywgdSdlJyksCiAgICAoMHgxRDVCRiwgJ00nLCB1J2YnKSwKICAgICgweDFENUMwLCAnTScsIHUnZycpLAogICAgKDB4MUQ1QzEsICdNJywgdSdoJyksCiAgICAoMHgxRDVDMiwgJ00nLCB1J2knKSwKICAgICgweDFENUMzLCAnTScsIHUnaicpLAogICAgKDB4MUQ1QzQsICdNJywgdSdrJyksCiAgICAoMHgxRDVDNSwgJ00nLCB1J2wnKSwKICAgICgweDFENUM2LCAnTScsIHUnbScpLAogICAgKDB4MUQ1QzcsICdNJywgdSduJyksCiAgICAoMHgxRDVDOCwgJ00nLCB1J28nKSwKICAgICgweDFENUM5LCAnTScsIHUncCcpLAogICAgKDB4MUQ1Q0EsICdNJywgdSdxJyksCiAgICAoMHgxRDVDQiwgJ00nLCB1J3InKSwKICAgICgweDFENUNDLCAnTScsIHUncycpLAogICAgKDB4MUQ1Q0QsICdNJywgdSd0JyksCiAgICAoMHgxRDVDRSwgJ00nLCB1J3UnKSwKICAgICgweDFENUNGLCAnTScsIHUndicpLAogICAgKDB4MUQ1RDAsICdNJywgdSd3JyksCiAgICAoMHgxRDVEMSwgJ00nLCB1J3gnKSwKICAgICgweDFENUQyLCAnTScsIHUneScpLAogICAgXQoKZGVmIF9zZWdfNTgoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDVEMywgJ00nLCB1J3onKSwKICAgICgweDFENUQ0LCAnTScsIHUnYScpLAogICAgKDB4MUQ1RDUsICdNJywgdSdiJyksCiAgICAoMHgxRDVENiwgJ00nLCB1J2MnKSwKICAgICgweDFENUQ3LCAnTScsIHUnZCcpLAogICAgKDB4MUQ1RDgsICdNJywgdSdlJyksCiAgICAoMHgxRDVEOSwgJ00nLCB1J2YnKSwKICAgICgweDFENURBLCAnTScsIHUnZycpLAogICAgKDB4MUQ1REIsICdNJywgdSdoJyksCiAgICAoMHgxRDVEQywgJ00nLCB1J2knKSwKICAgICgweDFENURELCAnTScsIHUnaicpLAogICAgKDB4MUQ1REUsICdNJywgdSdrJyksCiAgICAoMHgxRDVERiwgJ00nLCB1J2wnKSwKICAgICgweDFENUUwLCAnTScsIHUnbScpLAogICAgKDB4MUQ1RTEsICdNJywgdSduJyksCiAgICAoMHgxRDVFMiwgJ00nLCB1J28nKSwKICAgICgweDFENUUzLCAnTScsIHUncCcpLAogICAgKDB4MUQ1RTQsICdNJywgdSdxJyksCiAgICAoMHgxRDVFNSwgJ00nLCB1J3InKSwKICAgICgweDFENUU2LCAnTScsIHUncycpLAogICAgKDB4MUQ1RTcsICdNJywgdSd0JyksCiAgICAoMHgxRDVFOCwgJ00nLCB1J3UnKSwKICAgICgweDFENUU5LCAnTScsIHUndicpLAogICAgKDB4MUQ1RUEsICdNJywgdSd3JyksCiAgICAoMHgxRDVFQiwgJ00nLCB1J3gnKSwKICAgICgweDFENUVDLCAnTScsIHUneScpLAogICAgKDB4MUQ1RUQsICdNJywgdSd6JyksCiAgICAoMHgxRDVFRSwgJ00nLCB1J2EnKSwKICAgICgweDFENUVGLCAnTScsIHUnYicpLAogICAgKDB4MUQ1RjAsICdNJywgdSdjJyksCiAgICAoMHgxRDVGMSwgJ00nLCB1J2QnKSwKICAgICgweDFENUYyLCAnTScsIHUnZScpLAogICAgKDB4MUQ1RjMsICdNJywgdSdmJyksCiAgICAoMHgxRDVGNCwgJ00nLCB1J2cnKSwKICAgICgweDFENUY1LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1RjYsICdNJywgdSdpJyksCiAgICAoMHgxRDVGNywgJ00nLCB1J2onKSwKICAgICgweDFENUY4LCAnTScsIHUnaycpLAogICAgKDB4MUQ1RjksICdNJywgdSdsJyksCiAgICAoMHgxRDVGQSwgJ00nLCB1J20nKSwKICAgICgweDFENUZCLCAnTScsIHUnbicpLAogICAgKDB4MUQ1RkMsICdNJywgdSdvJyksCiAgICAoMHgxRDVGRCwgJ00nLCB1J3AnKSwKICAgICgweDFENUZFLCAnTScsIHUncScpLAogICAgKDB4MUQ1RkYsICdNJywgdSdyJyksCiAgICAoMHgxRDYwMCwgJ00nLCB1J3MnKSwKICAgICgweDFENjAxLCAnTScsIHUndCcpLAogICAgKDB4MUQ2MDIsICdNJywgdSd1JyksCiAgICAoMHgxRDYwMywgJ00nLCB1J3YnKSwKICAgICgweDFENjA0LCAnTScsIHUndycpLAogICAgKDB4MUQ2MDUsICdNJywgdSd4JyksCiAgICAoMHgxRDYwNiwgJ00nLCB1J3knKSwKICAgICgweDFENjA3LCAnTScsIHUneicpLAogICAgKDB4MUQ2MDgsICdNJywgdSdhJyksCiAgICAoMHgxRDYwOSwgJ00nLCB1J2InKSwKICAgICgweDFENjBBLCAnTScsIHUnYycpLAogICAgKDB4MUQ2MEIsICdNJywgdSdkJyksCiAgICAoMHgxRDYwQywgJ00nLCB1J2UnKSwKICAgICgweDFENjBELCAnTScsIHUnZicpLAogICAgKDB4MUQ2MEUsICdNJywgdSdnJyksCiAgICAoMHgxRDYwRiwgJ00nLCB1J2gnKSwKICAgICgweDFENjEwLCAnTScsIHUnaScpLAogICAgKDB4MUQ2MTEsICdNJywgdSdqJyksCiAgICAoMHgxRDYxMiwgJ00nLCB1J2snKSwKICAgICgweDFENjEzLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2MTQsICdNJywgdSdtJyksCiAgICAoMHgxRDYxNSwgJ00nLCB1J24nKSwKICAgICgweDFENjE2LCAnTScsIHUnbycpLAogICAgKDB4MUQ2MTcsICdNJywgdSdwJyksCiAgICAoMHgxRDYxOCwgJ00nLCB1J3EnKSwKICAgICgweDFENjE5LCAnTScsIHUncicpLAogICAgKDB4MUQ2MUEsICdNJywgdSdzJyksCiAgICAoMHgxRDYxQiwgJ00nLCB1J3QnKSwKICAgICgweDFENjFDLCAnTScsIHUndScpLAogICAgKDB4MUQ2MUQsICdNJywgdSd2JyksCiAgICAoMHgxRDYxRSwgJ00nLCB1J3cnKSwKICAgICgweDFENjFGLCAnTScsIHUneCcpLAogICAgKDB4MUQ2MjAsICdNJywgdSd5JyksCiAgICAoMHgxRDYyMSwgJ00nLCB1J3onKSwKICAgICgweDFENjIyLCAnTScsIHUnYScpLAogICAgKDB4MUQ2MjMsICdNJywgdSdiJyksCiAgICAoMHgxRDYyNCwgJ00nLCB1J2MnKSwKICAgICgweDFENjI1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ2MjYsICdNJywgdSdlJyksCiAgICAoMHgxRDYyNywgJ00nLCB1J2YnKSwKICAgICgweDFENjI4LCAnTScsIHUnZycpLAogICAgKDB4MUQ2MjksICdNJywgdSdoJyksCiAgICAoMHgxRDYyQSwgJ00nLCB1J2knKSwKICAgICgweDFENjJCLCAnTScsIHUnaicpLAogICAgKDB4MUQ2MkMsICdNJywgdSdrJyksCiAgICAoMHgxRDYyRCwgJ00nLCB1J2wnKSwKICAgICgweDFENjJFLCAnTScsIHUnbScpLAogICAgKDB4MUQ2MkYsICdNJywgdSduJyksCiAgICAoMHgxRDYzMCwgJ00nLCB1J28nKSwKICAgICgweDFENjMxLCAnTScsIHUncCcpLAogICAgKDB4MUQ2MzIsICdNJywgdSdxJyksCiAgICAoMHgxRDYzMywgJ00nLCB1J3InKSwKICAgICgweDFENjM0LCAnTScsIHUncycpLAogICAgKDB4MUQ2MzUsICdNJywgdSd0JyksCiAgICAoMHgxRDYzNiwgJ00nLCB1J3UnKSwKICAgIF0KCmRlZiBfc2VnXzU5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ2MzcsICdNJywgdSd2JyksCiAgICAoMHgxRDYzOCwgJ00nLCB1J3cnKSwKICAgICgweDFENjM5LCAnTScsIHUneCcpLAogICAgKDB4MUQ2M0EsICdNJywgdSd5JyksCiAgICAoMHgxRDYzQiwgJ00nLCB1J3onKSwKICAgICgweDFENjNDLCAnTScsIHUnYScpLAogICAgKDB4MUQ2M0QsICdNJywgdSdiJyksCiAgICAoMHgxRDYzRSwgJ00nLCB1J2MnKSwKICAgICgweDFENjNGLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2NDAsICdNJywgdSdlJyksCiAgICAoMHgxRDY0MSwgJ00nLCB1J2YnKSwKICAgICgweDFENjQyLCAnTScsIHUnZycpLAogICAgKDB4MUQ2NDMsICdNJywgdSdoJyksCiAgICAoMHgxRDY0NCwgJ00nLCB1J2knKSwKICAgICgweDFENjQ1LCAnTScsIHUnaicpLAogICAgKDB4MUQ2NDYsICdNJywgdSdrJyksCiAgICAoMHgxRDY0NywgJ00nLCB1J2wnKSwKICAgICgweDFENjQ4LCAnTScsIHUnbScpLAogICAgKDB4MUQ2NDksICdNJywgdSduJyksCiAgICAoMHgxRDY0QSwgJ00nLCB1J28nKSwKICAgICgweDFENjRCLCAnTScsIHUncCcpLAogICAgKDB4MUQ2NEMsICdNJywgdSdxJyksCiAgICAoMHgxRDY0RCwgJ00nLCB1J3InKSwKICAgICgweDFENjRFLCAnTScsIHUncycpLAogICAgKDB4MUQ2NEYsICdNJywgdSd0JyksCiAgICAoMHgxRDY1MCwgJ00nLCB1J3UnKSwKICAgICgweDFENjUxLCAnTScsIHUndicpLAogICAgKDB4MUQ2NTIsICdNJywgdSd3JyksCiAgICAoMHgxRDY1MywgJ00nLCB1J3gnKSwKICAgICgweDFENjU0LCAnTScsIHUneScpLAogICAgKDB4MUQ2NTUsICdNJywgdSd6JyksCiAgICAoMHgxRDY1NiwgJ00nLCB1J2EnKSwKICAgICgweDFENjU3LCAnTScsIHUnYicpLAogICAgKDB4MUQ2NTgsICdNJywgdSdjJyksCiAgICAoMHgxRDY1OSwgJ00nLCB1J2QnKSwKICAgICgweDFENjVBLCAnTScsIHUnZScpLAogICAgKDB4MUQ2NUIsICdNJywgdSdmJyksCiAgICAoMHgxRDY1QywgJ00nLCB1J2cnKSwKICAgICgweDFENjVELCAnTScsIHUnaCcpLAogICAgKDB4MUQ2NUUsICdNJywgdSdpJyksCiAgICAoMHgxRDY1RiwgJ00nLCB1J2onKSwKICAgICgweDFENjYwLCAnTScsIHUnaycpLAogICAgKDB4MUQ2NjEsICdNJywgdSdsJyksCiAgICAoMHgxRDY2MiwgJ00nLCB1J20nKSwKICAgICgweDFENjYzLCAnTScsIHUnbicpLAogICAgKDB4MUQ2NjQsICdNJywgdSdvJyksCiAgICAoMHgxRDY2NSwgJ00nLCB1J3AnKSwKICAgICgweDFENjY2LCAnTScsIHUncScpLAogICAgKDB4MUQ2NjcsICdNJywgdSdyJyksCiAgICAoMHgxRDY2OCwgJ00nLCB1J3MnKSwKICAgICgweDFENjY5LCAnTScsIHUndCcpLAogICAgKDB4MUQ2NkEsICdNJywgdSd1JyksCiAgICAoMHgxRDY2QiwgJ00nLCB1J3YnKSwKICAgICgweDFENjZDLCAnTScsIHUndycpLAogICAgKDB4MUQ2NkQsICdNJywgdSd4JyksCiAgICAoMHgxRDY2RSwgJ00nLCB1J3knKSwKICAgICgweDFENjZGLCAnTScsIHUneicpLAogICAgKDB4MUQ2NzAsICdNJywgdSdhJyksCiAgICAoMHgxRDY3MSwgJ00nLCB1J2InKSwKICAgICgweDFENjcyLCAnTScsIHUnYycpLAogICAgKDB4MUQ2NzMsICdNJywgdSdkJyksCiAgICAoMHgxRDY3NCwgJ00nLCB1J2UnKSwKICAgICgweDFENjc1LCAnTScsIHUnZicpLAogICAgKDB4MUQ2NzYsICdNJywgdSdnJyksCiAgICAoMHgxRDY3NywgJ00nLCB1J2gnKSwKICAgICgweDFENjc4LCAnTScsIHUnaScpLAogICAgKDB4MUQ2NzksICdNJywgdSdqJyksCiAgICAoMHgxRDY3QSwgJ00nLCB1J2snKSwKICAgICgweDFENjdCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2N0MsICdNJywgdSdtJyksCiAgICAoMHgxRDY3RCwgJ00nLCB1J24nKSwKICAgICgweDFENjdFLCAnTScsIHUnbycpLAogICAgKDB4MUQ2N0YsICdNJywgdSdwJyksCiAgICAoMHgxRDY4MCwgJ00nLCB1J3EnKSwKICAgICgweDFENjgxLCAnTScsIHUncicpLAogICAgKDB4MUQ2ODIsICdNJywgdSdzJyksCiAgICAoMHgxRDY4MywgJ00nLCB1J3QnKSwKICAgICgweDFENjg0LCAnTScsIHUndScpLAogICAgKDB4MUQ2ODUsICdNJywgdSd2JyksCiAgICAoMHgxRDY4NiwgJ00nLCB1J3cnKSwKICAgICgweDFENjg3LCAnTScsIHUneCcpLAogICAgKDB4MUQ2ODgsICdNJywgdSd5JyksCiAgICAoMHgxRDY4OSwgJ00nLCB1J3onKSwKICAgICgweDFENjhBLCAnTScsIHUnYScpLAogICAgKDB4MUQ2OEIsICdNJywgdSdiJyksCiAgICAoMHgxRDY4QywgJ00nLCB1J2MnKSwKICAgICgweDFENjhELCAnTScsIHUnZCcpLAogICAgKDB4MUQ2OEUsICdNJywgdSdlJyksCiAgICAoMHgxRDY4RiwgJ00nLCB1J2YnKSwKICAgICgweDFENjkwLCAnTScsIHUnZycpLAogICAgKDB4MUQ2OTEsICdNJywgdSdoJyksCiAgICAoMHgxRDY5MiwgJ00nLCB1J2knKSwKICAgICgweDFENjkzLCAnTScsIHUnaicpLAogICAgKDB4MUQ2OTQsICdNJywgdSdrJyksCiAgICAoMHgxRDY5NSwgJ00nLCB1J2wnKSwKICAgICgweDFENjk2LCAnTScsIHUnbScpLAogICAgKDB4MUQ2OTcsICdNJywgdSduJyksCiAgICAoMHgxRDY5OCwgJ00nLCB1J28nKSwKICAgICgweDFENjk5LCAnTScsIHUncCcpLAogICAgKDB4MUQ2OUEsICdNJywgdSdxJyksCiAgICBdCgpkZWYgX3NlZ182MCgpOgogICAgcmV0dXJuIFsKICAgICgweDFENjlCLCAnTScsIHUncicpLAogICAgKDB4MUQ2OUMsICdNJywgdSdzJyksCiAgICAoMHgxRDY5RCwgJ00nLCB1J3QnKSwKICAgICgweDFENjlFLCAnTScsIHUndScpLAogICAgKDB4MUQ2OUYsICdNJywgdSd2JyksCiAgICAoMHgxRDZBMCwgJ00nLCB1J3cnKSwKICAgICgweDFENkExLCAnTScsIHUneCcpLAogICAgKDB4MUQ2QTIsICdNJywgdSd5JyksCiAgICAoMHgxRDZBMywgJ00nLCB1J3onKSwKICAgICgweDFENkE0LCAnTScsIHUnxLEnKSwKICAgICgweDFENkE1LCAnTScsIHUnyLcnKSwKICAgICgweDFENkE2LCAnWCcpLAogICAgKDB4MUQ2QTgsICdNJywgdSfOsScpLAogICAgKDB4MUQ2QTksICdNJywgdSfOsicpLAogICAgKDB4MUQ2QUEsICdNJywgdSfOsycpLAogICAgKDB4MUQ2QUIsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2QUMsICdNJywgdSfOtScpLAogICAgKDB4MUQ2QUQsICdNJywgdSfOticpLAogICAgKDB4MUQ2QUUsICdNJywgdSfOtycpLAogICAgKDB4MUQ2QUYsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2QjAsICdNJywgdSfOuScpLAogICAgKDB4MUQ2QjEsICdNJywgdSfOuicpLAogICAgKDB4MUQ2QjIsICdNJywgdSfOuycpLAogICAgKDB4MUQ2QjMsICdNJywgdSfOvCcpLAogICAgKDB4MUQ2QjQsICdNJywgdSfOvScpLAogICAgKDB4MUQ2QjUsICdNJywgdSfOvicpLAogICAgKDB4MUQ2QjYsICdNJywgdSfOvycpLAogICAgKDB4MUQ2QjcsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2QjgsICdNJywgdSfPgScpLAogICAgKDB4MUQ2QjksICdNJywgdSfOuCcpLAogICAgKDB4MUQ2QkEsICdNJywgdSfPgycpLAogICAgKDB4MUQ2QkIsICdNJywgdSfPhCcpLAogICAgKDB4MUQ2QkMsICdNJywgdSfPhScpLAogICAgKDB4MUQ2QkQsICdNJywgdSfPhicpLAogICAgKDB4MUQ2QkUsICdNJywgdSfPhycpLAogICAgKDB4MUQ2QkYsICdNJywgdSfPiCcpLAogICAgKDB4MUQ2QzAsICdNJywgdSfPiScpLAogICAgKDB4MUQ2QzEsICdNJywgdSfiiIcnKSwKICAgICgweDFENkMyLCAnTScsIHUnzrEnKSwKICAgICgweDFENkMzLCAnTScsIHUnzrInKSwKICAgICgweDFENkM0LCAnTScsIHUnzrMnKSwKICAgICgweDFENkM1LCAnTScsIHUnzrQnKSwKICAgICgweDFENkM2LCAnTScsIHUnzrUnKSwKICAgICgweDFENkM3LCAnTScsIHUnzrYnKSwKICAgICgweDFENkM4LCAnTScsIHUnzrcnKSwKICAgICgweDFENkM5LCAnTScsIHUnzrgnKSwKICAgICgweDFENkNBLCAnTScsIHUnzrknKSwKICAgICgweDFENkNCLCAnTScsIHUnzronKSwKICAgICgweDFENkNDLCAnTScsIHUnzrsnKSwKICAgICgweDFENkNELCAnTScsIHUnzrwnKSwKICAgICgweDFENkNFLCAnTScsIHUnzr0nKSwKICAgICgweDFENkNGLCAnTScsIHUnzr4nKSwKICAgICgweDFENkQwLCAnTScsIHUnzr8nKSwKICAgICgweDFENkQxLCAnTScsIHUnz4AnKSwKICAgICgweDFENkQyLCAnTScsIHUnz4EnKSwKICAgICgweDFENkQzLCAnTScsIHUnz4MnKSwKICAgICgweDFENkQ1LCAnTScsIHUnz4QnKSwKICAgICgweDFENkQ2LCAnTScsIHUnz4UnKSwKICAgICgweDFENkQ3LCAnTScsIHUnz4YnKSwKICAgICgweDFENkQ4LCAnTScsIHUnz4cnKSwKICAgICgweDFENkQ5LCAnTScsIHUnz4gnKSwKICAgICgweDFENkRBLCAnTScsIHUnz4knKSwKICAgICgweDFENkRCLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDZEQywgJ00nLCB1J861JyksCiAgICAoMHgxRDZERCwgJ00nLCB1J864JyksCiAgICAoMHgxRDZERSwgJ00nLCB1J866JyksCiAgICAoMHgxRDZERiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZFMCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZFMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZFMiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDZFMywgJ00nLCB1J86yJyksCiAgICAoMHgxRDZFNCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZFNSwgJ00nLCB1J860JyksCiAgICAoMHgxRDZFNiwgJ00nLCB1J861JyksCiAgICAoMHgxRDZFNywgJ00nLCB1J862JyksCiAgICAoMHgxRDZFOCwgJ00nLCB1J863JyksCiAgICAoMHgxRDZFOSwgJ00nLCB1J864JyksCiAgICAoMHgxRDZFQSwgJ00nLCB1J865JyksCiAgICAoMHgxRDZFQiwgJ00nLCB1J866JyksCiAgICAoMHgxRDZFQywgJ00nLCB1J867JyksCiAgICAoMHgxRDZFRCwgJ00nLCB1J868JyksCiAgICAoMHgxRDZFRSwgJ00nLCB1J869JyksCiAgICAoMHgxRDZFRiwgJ00nLCB1J86+JyksCiAgICAoMHgxRDZGMCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDZGMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZGMiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZGMywgJ00nLCB1J864JyksCiAgICAoMHgxRDZGNCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDZGNSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDZGNiwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDZGNywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZGOCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZGOSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDZGQSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDZGQiwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ2RkMsICdNJywgdSfOsScpLAogICAgKDB4MUQ2RkQsICdNJywgdSfOsicpLAogICAgKDB4MUQ2RkUsICdNJywgdSfOsycpLAogICAgKDB4MUQ2RkYsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3MDAsICdNJywgdSfOtScpLAogICAgXQoKZGVmIF9zZWdfNjEoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDcwMSwgJ00nLCB1J862JyksCiAgICAoMHgxRDcwMiwgJ00nLCB1J863JyksCiAgICAoMHgxRDcwMywgJ00nLCB1J864JyksCiAgICAoMHgxRDcwNCwgJ00nLCB1J865JyksCiAgICAoMHgxRDcwNSwgJ00nLCB1J866JyksCiAgICAoMHgxRDcwNiwgJ00nLCB1J867JyksCiAgICAoMHgxRDcwNywgJ00nLCB1J868JyksCiAgICAoMHgxRDcwOCwgJ00nLCB1J869JyksCiAgICAoMHgxRDcwOSwgJ00nLCB1J86+JyksCiAgICAoMHgxRDcwQSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDcwQiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDcwQywgJ00nLCB1J8+BJyksCiAgICAoMHgxRDcwRCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDcwRiwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDcxMCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDcxMSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDcxMiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDcxMywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDcxNCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDcxNSwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3MTYsICdNJywgdSfOtScpLAogICAgKDB4MUQ3MTcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MTgsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MTksICdNJywgdSfPhicpLAogICAgKDB4MUQ3MUEsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MUIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MUMsICdNJywgdSfOsScpLAogICAgKDB4MUQ3MUQsICdNJywgdSfOsicpLAogICAgKDB4MUQ3MUUsICdNJywgdSfOsycpLAogICAgKDB4MUQ3MUYsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3MjAsICdNJywgdSfOtScpLAogICAgKDB4MUQ3MjEsICdNJywgdSfOticpLAogICAgKDB4MUQ3MjIsICdNJywgdSfOtycpLAogICAgKDB4MUQ3MjMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MjQsICdNJywgdSfOuScpLAogICAgKDB4MUQ3MjUsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MjYsICdNJywgdSfOuycpLAogICAgKDB4MUQ3MjcsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3MjgsICdNJywgdSfOvScpLAogICAgKDB4MUQ3MjksICdNJywgdSfOvicpLAogICAgKDB4MUQ3MkEsICdNJywgdSfOvycpLAogICAgKDB4MUQ3MkIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MkMsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MkQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MkUsICdNJywgdSfPgycpLAogICAgKDB4MUQ3MkYsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3MzAsICdNJywgdSfPhScpLAogICAgKDB4MUQ3MzEsICdNJywgdSfPhicpLAogICAgKDB4MUQ3MzIsICdNJywgdSfPhycpLAogICAgKDB4MUQ3MzMsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3MzQsICdNJywgdSfPiScpLAogICAgKDB4MUQ3MzUsICdNJywgdSfiiIcnKSwKICAgICgweDFENzM2LCAnTScsIHUnzrEnKSwKICAgICgweDFENzM3LCAnTScsIHUnzrInKSwKICAgICgweDFENzM4LCAnTScsIHUnzrMnKSwKICAgICgweDFENzM5LCAnTScsIHUnzrQnKSwKICAgICgweDFENzNBLCAnTScsIHUnzrUnKSwKICAgICgweDFENzNCLCAnTScsIHUnzrYnKSwKICAgICgweDFENzNDLCAnTScsIHUnzrcnKSwKICAgICgweDFENzNELCAnTScsIHUnzrgnKSwKICAgICgweDFENzNFLCAnTScsIHUnzrknKSwKICAgICgweDFENzNGLCAnTScsIHUnzronKSwKICAgICgweDFENzQwLCAnTScsIHUnzrsnKSwKICAgICgweDFENzQxLCAnTScsIHUnzrwnKSwKICAgICgweDFENzQyLCAnTScsIHUnzr0nKSwKICAgICgweDFENzQzLCAnTScsIHUnzr4nKSwKICAgICgweDFENzQ0LCAnTScsIHUnzr8nKSwKICAgICgweDFENzQ1LCAnTScsIHUnz4AnKSwKICAgICgweDFENzQ2LCAnTScsIHUnz4EnKSwKICAgICgweDFENzQ3LCAnTScsIHUnz4MnKSwKICAgICgweDFENzQ5LCAnTScsIHUnz4QnKSwKICAgICgweDFENzRBLCAnTScsIHUnz4UnKSwKICAgICgweDFENzRCLCAnTScsIHUnz4YnKSwKICAgICgweDFENzRDLCAnTScsIHUnz4cnKSwKICAgICgweDFENzRELCAnTScsIHUnz4gnKSwKICAgICgweDFENzRFLCAnTScsIHUnz4knKSwKICAgICgweDFENzRGLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDc1MCwgJ00nLCB1J861JyksCiAgICAoMHgxRDc1MSwgJ00nLCB1J864JyksCiAgICAoMHgxRDc1MiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc1MywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc1NCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc1NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc1NiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDc1NywgJ00nLCB1J86yJyksCiAgICAoMHgxRDc1OCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDc1OSwgJ00nLCB1J860JyksCiAgICAoMHgxRDc1QSwgJ00nLCB1J861JyksCiAgICAoMHgxRDc1QiwgJ00nLCB1J862JyksCiAgICAoMHgxRDc1QywgJ00nLCB1J863JyksCiAgICAoMHgxRDc1RCwgJ00nLCB1J864JyksCiAgICAoMHgxRDc1RSwgJ00nLCB1J865JyksCiAgICAoMHgxRDc1RiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc2MCwgJ00nLCB1J867JyksCiAgICAoMHgxRDc2MSwgJ00nLCB1J868JyksCiAgICAoMHgxRDc2MiwgJ00nLCB1J869JyksCiAgICAoMHgxRDc2MywgJ00nLCB1J86+JyksCiAgICAoMHgxRDc2NCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc2NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc2NiwgJ00nLCB1J8+BJyksCiAgICBdCgpkZWYgX3NlZ182MigpOgogICAgcmV0dXJuIFsKICAgICgweDFENzY3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzY4LCAnTScsIHUnz4MnKSwKICAgICgweDFENzY5LCAnTScsIHUnz4QnKSwKICAgICgweDFENzZBLCAnTScsIHUnz4UnKSwKICAgICgweDFENzZCLCAnTScsIHUnz4YnKSwKICAgICgweDFENzZDLCAnTScsIHUnz4cnKSwKICAgICgweDFENzZELCAnTScsIHUnz4gnKSwKICAgICgweDFENzZFLCAnTScsIHUnz4knKSwKICAgICgweDFENzZGLCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDc3MCwgJ00nLCB1J86xJyksCiAgICAoMHgxRDc3MSwgJ00nLCB1J86yJyksCiAgICAoMHgxRDc3MiwgJ00nLCB1J86zJyksCiAgICAoMHgxRDc3MywgJ00nLCB1J860JyksCiAgICAoMHgxRDc3NCwgJ00nLCB1J861JyksCiAgICAoMHgxRDc3NSwgJ00nLCB1J862JyksCiAgICAoMHgxRDc3NiwgJ00nLCB1J863JyksCiAgICAoMHgxRDc3NywgJ00nLCB1J864JyksCiAgICAoMHgxRDc3OCwgJ00nLCB1J865JyksCiAgICAoMHgxRDc3OSwgJ00nLCB1J866JyksCiAgICAoMHgxRDc3QSwgJ00nLCB1J867JyksCiAgICAoMHgxRDc3QiwgJ00nLCB1J868JyksCiAgICAoMHgxRDc3QywgJ00nLCB1J869JyksCiAgICAoMHgxRDc3RCwgJ00nLCB1J86+JyksCiAgICAoMHgxRDc3RSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc3RiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc4MCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc4MSwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc4MywgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc4NCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc4NSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc4NiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc4NywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc4OCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc4OSwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3OEEsICdNJywgdSfOtScpLAogICAgKDB4MUQ3OEIsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3OEMsICdNJywgdSfOuicpLAogICAgKDB4MUQ3OEQsICdNJywgdSfPhicpLAogICAgKDB4MUQ3OEUsICdNJywgdSfPgScpLAogICAgKDB4MUQ3OEYsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3OTAsICdNJywgdSfOsScpLAogICAgKDB4MUQ3OTEsICdNJywgdSfOsicpLAogICAgKDB4MUQ3OTIsICdNJywgdSfOsycpLAogICAgKDB4MUQ3OTMsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3OTQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3OTUsICdNJywgdSfOticpLAogICAgKDB4MUQ3OTYsICdNJywgdSfOtycpLAogICAgKDB4MUQ3OTcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3OTgsICdNJywgdSfOuScpLAogICAgKDB4MUQ3OTksICdNJywgdSfOuicpLAogICAgKDB4MUQ3OUEsICdNJywgdSfOuycpLAogICAgKDB4MUQ3OUIsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3OUMsICdNJywgdSfOvScpLAogICAgKDB4MUQ3OUQsICdNJywgdSfOvicpLAogICAgKDB4MUQ3OUUsICdNJywgdSfOvycpLAogICAgKDB4MUQ3OUYsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3QTAsICdNJywgdSfPgScpLAogICAgKDB4MUQ3QTEsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3QTIsICdNJywgdSfPgycpLAogICAgKDB4MUQ3QTMsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3QTQsICdNJywgdSfPhScpLAogICAgKDB4MUQ3QTUsICdNJywgdSfPhicpLAogICAgKDB4MUQ3QTYsICdNJywgdSfPhycpLAogICAgKDB4MUQ3QTcsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3QTgsICdNJywgdSfPiScpLAogICAgKDB4MUQ3QTksICdNJywgdSfiiIcnKSwKICAgICgweDFEN0FBLCAnTScsIHUnzrEnKSwKICAgICgweDFEN0FCLCAnTScsIHUnzrInKSwKICAgICgweDFEN0FDLCAnTScsIHUnzrMnKSwKICAgICgweDFEN0FELCAnTScsIHUnzrQnKSwKICAgICgweDFEN0FFLCAnTScsIHUnzrUnKSwKICAgICgweDFEN0FGLCAnTScsIHUnzrYnKSwKICAgICgweDFEN0IwLCAnTScsIHUnzrcnKSwKICAgICgweDFEN0IxLCAnTScsIHUnzrgnKSwKICAgICgweDFEN0IyLCAnTScsIHUnzrknKSwKICAgICgweDFEN0IzLCAnTScsIHUnzronKSwKICAgICgweDFEN0I0LCAnTScsIHUnzrsnKSwKICAgICgweDFEN0I1LCAnTScsIHUnzrwnKSwKICAgICgweDFEN0I2LCAnTScsIHUnzr0nKSwKICAgICgweDFEN0I3LCAnTScsIHUnzr4nKSwKICAgICgweDFEN0I4LCAnTScsIHUnzr8nKSwKICAgICgweDFEN0I5LCAnTScsIHUnz4AnKSwKICAgICgweDFEN0JBLCAnTScsIHUnz4EnKSwKICAgICgweDFEN0JCLCAnTScsIHUnz4MnKSwKICAgICgweDFEN0JELCAnTScsIHUnz4QnKSwKICAgICgweDFEN0JFLCAnTScsIHUnz4UnKSwKICAgICgweDFEN0JGLCAnTScsIHUnz4YnKSwKICAgICgweDFEN0MwLCAnTScsIHUnz4cnKSwKICAgICgweDFEN0MxLCAnTScsIHUnz4gnKSwKICAgICgweDFEN0MyLCAnTScsIHUnz4knKSwKICAgICgweDFEN0MzLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDdDNCwgJ00nLCB1J861JyksCiAgICAoMHgxRDdDNSwgJ00nLCB1J864JyksCiAgICAoMHgxRDdDNiwgJ00nLCB1J866JyksCiAgICAoMHgxRDdDNywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDdDOCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDdDOSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDdDQSwgJ00nLCB1J8+dJyksCiAgICAoMHgxRDdDQywgJ1gnKSwKICAgICgweDFEN0NFLCAnTScsIHUnMCcpLAogICAgXQoKZGVmIF9zZWdfNjMoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDdDRiwgJ00nLCB1JzEnKSwKICAgICgweDFEN0QwLCAnTScsIHUnMicpLAogICAgKDB4MUQ3RDEsICdNJywgdSczJyksCiAgICAoMHgxRDdEMiwgJ00nLCB1JzQnKSwKICAgICgweDFEN0QzLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RDQsICdNJywgdSc2JyksCiAgICAoMHgxRDdENSwgJ00nLCB1JzcnKSwKICAgICgweDFEN0Q2LCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RDcsICdNJywgdSc5JyksCiAgICAoMHgxRDdEOCwgJ00nLCB1JzAnKSwKICAgICgweDFEN0Q5LCAnTScsIHUnMScpLAogICAgKDB4MUQ3REEsICdNJywgdScyJyksCiAgICAoMHgxRDdEQiwgJ00nLCB1JzMnKSwKICAgICgweDFEN0RDLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3REQsICdNJywgdSc1JyksCiAgICAoMHgxRDdERSwgJ00nLCB1JzYnKSwKICAgICgweDFEN0RGLCAnTScsIHUnNycpLAogICAgKDB4MUQ3RTAsICdNJywgdSc4JyksCiAgICAoMHgxRDdFMSwgJ00nLCB1JzknKSwKICAgICgweDFEN0UyLCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RTMsICdNJywgdScxJyksCiAgICAoMHgxRDdFNCwgJ00nLCB1JzInKSwKICAgICgweDFEN0U1LCAnTScsIHUnMycpLAogICAgKDB4MUQ3RTYsICdNJywgdSc0JyksCiAgICAoMHgxRDdFNywgJ00nLCB1JzUnKSwKICAgICgweDFEN0U4LCAnTScsIHUnNicpLAogICAgKDB4MUQ3RTksICdNJywgdSc3JyksCiAgICAoMHgxRDdFQSwgJ00nLCB1JzgnKSwKICAgICgweDFEN0VCLCAnTScsIHUnOScpLAogICAgKDB4MUQ3RUMsICdNJywgdScwJyksCiAgICAoMHgxRDdFRCwgJ00nLCB1JzEnKSwKICAgICgweDFEN0VFLCAnTScsIHUnMicpLAogICAgKDB4MUQ3RUYsICdNJywgdSczJyksCiAgICAoMHgxRDdGMCwgJ00nLCB1JzQnKSwKICAgICgweDFEN0YxLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RjIsICdNJywgdSc2JyksCiAgICAoMHgxRDdGMywgJ00nLCB1JzcnKSwKICAgICgweDFEN0Y0LCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RjUsICdNJywgdSc5JyksCiAgICAoMHgxRDdGNiwgJ00nLCB1JzAnKSwKICAgICgweDFEN0Y3LCAnTScsIHUnMScpLAogICAgKDB4MUQ3RjgsICdNJywgdScyJyksCiAgICAoMHgxRDdGOSwgJ00nLCB1JzMnKSwKICAgICgweDFEN0ZBLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RkIsICdNJywgdSc1JyksCiAgICAoMHgxRDdGQywgJ00nLCB1JzYnKSwKICAgICgweDFEN0ZELCAnTScsIHUnNycpLAogICAgKDB4MUQ3RkUsICdNJywgdSc4JyksCiAgICAoMHgxRDdGRiwgJ00nLCB1JzknKSwKICAgICgweDFEODAwLCAnWCcpLAogICAgKDB4MUVFMDAsICdNJywgdSfYpycpLAogICAgKDB4MUVFMDEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFMDIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFMDMsICdNJywgdSfYrycpLAogICAgKDB4MUVFMDQsICdYJyksCiAgICAoMHgxRUUwNSwgJ00nLCB1J9mIJyksCiAgICAoMHgxRUUwNiwgJ00nLCB1J9iyJyksCiAgICAoMHgxRUUwNywgJ00nLCB1J9itJyksCiAgICAoMHgxRUUwOCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUUwOSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUUwQSwgJ00nLCB1J9mDJyksCiAgICAoMHgxRUUwQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUUwQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUUwRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUUwRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUUwRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUUxMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUUxMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUUxMiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUUxMywgJ00nLCB1J9ixJyksCiAgICAoMHgxRUUxNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUUxNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUUxNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUUxNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUUxOCwgJ00nLCB1J9iwJyksCiAgICAoMHgxRUUxOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUUxQSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUUxQiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUUxQywgJ00nLCB1J9muJyksCiAgICAoMHgxRUUxRCwgJ00nLCB1J9q6JyksCiAgICAoMHgxRUUxRSwgJ00nLCB1J9qhJyksCiAgICAoMHgxRUUxRiwgJ00nLCB1J9mvJyksCiAgICAoMHgxRUUyMCwgJ1gnKSwKICAgICgweDFFRTIxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTIyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTIzLCAnWCcpLAogICAgKDB4MUVFMjQsICdNJywgdSfZhycpLAogICAgKDB4MUVFMjUsICdYJyksCiAgICAoMHgxRUUyNywgJ00nLCB1J9itJyksCiAgICAoMHgxRUUyOCwgJ1gnKSwKICAgICgweDFFRTI5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTJBLCAnTScsIHUn2YMnKSwKICAgICgweDFFRTJCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRTJDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRTJELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTJFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTJGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTMwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTMxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTMyLCAnTScsIHUn2YInKSwKICAgIF0KCmRlZiBfc2VnXzY0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVFMzMsICdYJyksCiAgICAoMHgxRUUzNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUUzNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUUzNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUUzNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUUzOCwgJ1gnKSwKICAgICgweDFFRTM5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTNBLCAnWCcpLAogICAgKDB4MUVFM0IsICdNJywgdSfYuicpLAogICAgKDB4MUVFM0MsICdYJyksCiAgICAoMHgxRUU0MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU0MywgJ1gnKSwKICAgICgweDFFRTQ3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTQ4LCAnWCcpLAogICAgKDB4MUVFNDksICdNJywgdSfZiicpLAogICAgKDB4MUVFNEEsICdYJyksCiAgICAoMHgxRUU0QiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUU0QywgJ1gnKSwKICAgICgweDFFRTRELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTRFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTRGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTUwLCAnWCcpLAogICAgKDB4MUVFNTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFNTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFNTMsICdYJyksCiAgICAoMHgxRUU1NCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUU1NSwgJ1gnKSwKICAgICgweDFFRTU3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTU4LCAnWCcpLAogICAgKDB4MUVFNTksICdNJywgdSfYticpLAogICAgKDB4MUVFNUEsICdYJyksCiAgICAoMHgxRUU1QiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUU1QywgJ1gnKSwKICAgICgweDFFRTVELCAnTScsIHUn2ronKSwKICAgICgweDFFRTVFLCAnWCcpLAogICAgKDB4MUVFNUYsICdNJywgdSfZrycpLAogICAgKDB4MUVFNjAsICdYJyksCiAgICAoMHgxRUU2MSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUU2MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU2MywgJ1gnKSwKICAgICgweDFFRTY0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTY1LCAnWCcpLAogICAgKDB4MUVFNjcsICdNJywgdSfYrScpLAogICAgKDB4MUVFNjgsICdNJywgdSfYtycpLAogICAgKDB4MUVFNjksICdNJywgdSfZiicpLAogICAgKDB4MUVFNkEsICdNJywgdSfZgycpLAogICAgKDB4MUVFNkIsICdYJyksCiAgICAoMHgxRUU2QywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUU2RCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUU2RSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUU2RiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUU3MCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUU3MSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUU3MiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUU3MywgJ1gnKSwKICAgICgweDFFRTc0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTc1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTc2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTc3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTc4LCAnWCcpLAogICAgKDB4MUVFNzksICdNJywgdSfYticpLAogICAgKDB4MUVFN0EsICdNJywgdSfYuCcpLAogICAgKDB4MUVFN0IsICdNJywgdSfYuicpLAogICAgKDB4MUVFN0MsICdNJywgdSfZricpLAogICAgKDB4MUVFN0QsICdYJyksCiAgICAoMHgxRUU3RSwgJ00nLCB1J9qhJyksCiAgICAoMHgxRUU3RiwgJ1gnKSwKICAgICgweDFFRTgwLCAnTScsIHUn2KcnKSwKICAgICgweDFFRTgxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTgyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTgzLCAnTScsIHUn2K8nKSwKICAgICgweDFFRTg0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTg1LCAnTScsIHUn2YgnKSwKICAgICgweDFFRTg2LCAnTScsIHUn2LInKSwKICAgICgweDFFRTg3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTg4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRTg5LCAnTScsIHUn2YonKSwKICAgICgweDFFRThBLCAnWCcpLAogICAgKDB4MUVFOEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFOEMsICdNJywgdSfZhScpLAogICAgKDB4MUVFOEQsICdNJywgdSfZhicpLAogICAgKDB4MUVFOEUsICdNJywgdSfYsycpLAogICAgKDB4MUVFOEYsICdNJywgdSfYuScpLAogICAgKDB4MUVFOTAsICdNJywgdSfZgScpLAogICAgKDB4MUVFOTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFOTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFOTMsICdNJywgdSfYsScpLAogICAgKDB4MUVFOTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFOTUsICdNJywgdSfYqicpLAogICAgKDB4MUVFOTYsICdNJywgdSfYqycpLAogICAgKDB4MUVFOTcsICdNJywgdSfYricpLAogICAgKDB4MUVFOTgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFOTksICdNJywgdSfYticpLAogICAgKDB4MUVFOUEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFOUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFOUMsICdYJyksCiAgICAoMHgxRUVBMSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUVBMiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUVBMywgJ00nLCB1J9ivJyksCiAgICAoMHgxRUVBNCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzY1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVFQTUsICdNJywgdSfZiCcpLAogICAgKDB4MUVFQTYsICdNJywgdSfYsicpLAogICAgKDB4MUVFQTcsICdNJywgdSfYrScpLAogICAgKDB4MUVFQTgsICdNJywgdSfYtycpLAogICAgKDB4MUVFQTksICdNJywgdSfZiicpLAogICAgKDB4MUVFQUEsICdYJyksCiAgICAoMHgxRUVBQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUVBQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUVBRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUVBRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUVBRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUVCMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUVCMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUVCMiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUVCMywgJ00nLCB1J9ixJyksCiAgICAoMHgxRUVCNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUVCNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUVCNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUVCNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUVCOCwgJ00nLCB1J9iwJyksCiAgICAoMHgxRUVCOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUVCQSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUVCQiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUVCQywgJ1gnKSwKICAgICgweDFFRUYwLCAnVicpLAogICAgKDB4MUVFRjIsICdYJyksCiAgICAoMHgxRjAwMCwgJ1YnKSwKICAgICgweDFGMDJDLCAnWCcpLAogICAgKDB4MUYwMzAsICdWJyksCiAgICAoMHgxRjA5NCwgJ1gnKSwKICAgICgweDFGMEEwLCAnVicpLAogICAgKDB4MUYwQUYsICdYJyksCiAgICAoMHgxRjBCMSwgJ1YnKSwKICAgICgweDFGMEJGLCAnWCcpLAogICAgKDB4MUYwQzEsICdWJyksCiAgICAoMHgxRjBEMCwgJ1gnKSwKICAgICgweDFGMEQxLCAnVicpLAogICAgKDB4MUYwRTAsICdYJyksCiAgICAoMHgxRjEwMSwgJzMnLCB1JzAsJyksCiAgICAoMHgxRjEwMiwgJzMnLCB1JzEsJyksCiAgICAoMHgxRjEwMywgJzMnLCB1JzIsJyksCiAgICAoMHgxRjEwNCwgJzMnLCB1JzMsJyksCiAgICAoMHgxRjEwNSwgJzMnLCB1JzQsJyksCiAgICAoMHgxRjEwNiwgJzMnLCB1JzUsJyksCiAgICAoMHgxRjEwNywgJzMnLCB1JzYsJyksCiAgICAoMHgxRjEwOCwgJzMnLCB1JzcsJyksCiAgICAoMHgxRjEwOSwgJzMnLCB1JzgsJyksCiAgICAoMHgxRjEwQSwgJzMnLCB1JzksJyksCiAgICAoMHgxRjEwQiwgJ1gnKSwKICAgICgweDFGMTEwLCAnMycsIHUnKGEpJyksCiAgICAoMHgxRjExMSwgJzMnLCB1JyhiKScpLAogICAgKDB4MUYxMTIsICczJywgdScoYyknKSwKICAgICgweDFGMTEzLCAnMycsIHUnKGQpJyksCiAgICAoMHgxRjExNCwgJzMnLCB1JyhlKScpLAogICAgKDB4MUYxMTUsICczJywgdScoZiknKSwKICAgICgweDFGMTE2LCAnMycsIHUnKGcpJyksCiAgICAoMHgxRjExNywgJzMnLCB1JyhoKScpLAogICAgKDB4MUYxMTgsICczJywgdScoaSknKSwKICAgICgweDFGMTE5LCAnMycsIHUnKGopJyksCiAgICAoMHgxRjExQSwgJzMnLCB1JyhrKScpLAogICAgKDB4MUYxMUIsICczJywgdScobCknKSwKICAgICgweDFGMTFDLCAnMycsIHUnKG0pJyksCiAgICAoMHgxRjExRCwgJzMnLCB1JyhuKScpLAogICAgKDB4MUYxMUUsICczJywgdScobyknKSwKICAgICgweDFGMTFGLCAnMycsIHUnKHApJyksCiAgICAoMHgxRjEyMCwgJzMnLCB1JyhxKScpLAogICAgKDB4MUYxMjEsICczJywgdScociknKSwKICAgICgweDFGMTIyLCAnMycsIHUnKHMpJyksCiAgICAoMHgxRjEyMywgJzMnLCB1Jyh0KScpLAogICAgKDB4MUYxMjQsICczJywgdScodSknKSwKICAgICgweDFGMTI1LCAnMycsIHUnKHYpJyksCiAgICAoMHgxRjEyNiwgJzMnLCB1Jyh3KScpLAogICAgKDB4MUYxMjcsICczJywgdScoeCknKSwKICAgICgweDFGMTI4LCAnMycsIHUnKHkpJyksCiAgICAoMHgxRjEyOSwgJzMnLCB1Jyh6KScpLAogICAgKDB4MUYxMkEsICdNJywgdSfjgJRz44CVJyksCiAgICAoMHgxRjEyQiwgJ00nLCB1J2MnKSwKICAgICgweDFGMTJDLCAnTScsIHUncicpLAogICAgKDB4MUYxMkQsICdNJywgdSdjZCcpLAogICAgKDB4MUYxMkUsICdNJywgdSd3eicpLAogICAgKDB4MUYxMkYsICdYJyksCiAgICAoMHgxRjEzMCwgJ00nLCB1J2EnKSwKICAgICgweDFGMTMxLCAnTScsIHUnYicpLAogICAgKDB4MUYxMzIsICdNJywgdSdjJyksCiAgICAoMHgxRjEzMywgJ00nLCB1J2QnKSwKICAgICgweDFGMTM0LCAnTScsIHUnZScpLAogICAgKDB4MUYxMzUsICdNJywgdSdmJyksCiAgICAoMHgxRjEzNiwgJ00nLCB1J2cnKSwKICAgICgweDFGMTM3LCAnTScsIHUnaCcpLAogICAgKDB4MUYxMzgsICdNJywgdSdpJyksCiAgICAoMHgxRjEzOSwgJ00nLCB1J2onKSwKICAgICgweDFGMTNBLCAnTScsIHUnaycpLAogICAgKDB4MUYxM0IsICdNJywgdSdsJyksCiAgICAoMHgxRjEzQywgJ00nLCB1J20nKSwKICAgICgweDFGMTNELCAnTScsIHUnbicpLAogICAgKDB4MUYxM0UsICdNJywgdSdvJyksCiAgICAoMHgxRjEzRiwgJ00nLCB1J3AnKSwKICAgICgweDFGMTQwLCAnTScsIHUncScpLAogICAgKDB4MUYxNDEsICdNJywgdSdyJyksCiAgICAoMHgxRjE0MiwgJ00nLCB1J3MnKSwKICAgIF0KCmRlZiBfc2VnXzY2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUYxNDMsICdNJywgdSd0JyksCiAgICAoMHgxRjE0NCwgJ00nLCB1J3UnKSwKICAgICgweDFGMTQ1LCAnTScsIHUndicpLAogICAgKDB4MUYxNDYsICdNJywgdSd3JyksCiAgICAoMHgxRjE0NywgJ00nLCB1J3gnKSwKICAgICgweDFGMTQ4LCAnTScsIHUneScpLAogICAgKDB4MUYxNDksICdNJywgdSd6JyksCiAgICAoMHgxRjE0QSwgJ00nLCB1J2h2JyksCiAgICAoMHgxRjE0QiwgJ00nLCB1J212JyksCiAgICAoMHgxRjE0QywgJ00nLCB1J3NkJyksCiAgICAoMHgxRjE0RCwgJ00nLCB1J3NzJyksCiAgICAoMHgxRjE0RSwgJ00nLCB1J3BwdicpLAogICAgKDB4MUYxNEYsICdNJywgdSd3YycpLAogICAgKDB4MUYxNTAsICdWJyksCiAgICAoMHgxRjE2QSwgJ00nLCB1J21jJyksCiAgICAoMHgxRjE2QiwgJ00nLCB1J21kJyksCiAgICAoMHgxRjE2QywgJ1gnKSwKICAgICgweDFGMTcwLCAnVicpLAogICAgKDB4MUYxOTAsICdNJywgdSdkaicpLAogICAgKDB4MUYxOTEsICdWJyksCiAgICAoMHgxRjE5QiwgJ1gnKSwKICAgICgweDFGMUU2LCAnVicpLAogICAgKDB4MUYyMDAsICdNJywgdSfjgbvjgYsnKSwKICAgICgweDFGMjAxLCAnTScsIHUn44Kz44KzJyksCiAgICAoMHgxRjIwMiwgJ00nLCB1J+OCtScpLAogICAgKDB4MUYyMDMsICdYJyksCiAgICAoMHgxRjIxMCwgJ00nLCB1J+aJiycpLAogICAgKDB4MUYyMTEsICdNJywgdSflrZcnKSwKICAgICgweDFGMjEyLCAnTScsIHUn5Y+MJyksCiAgICAoMHgxRjIxMywgJ00nLCB1J+ODhycpLAogICAgKDB4MUYyMTQsICdNJywgdSfkuownKSwKICAgICgweDFGMjE1LCAnTScsIHUn5aSaJyksCiAgICAoMHgxRjIxNiwgJ00nLCB1J+inoycpLAogICAgKDB4MUYyMTcsICdNJywgdSflpKknKSwKICAgICgweDFGMjE4LCAnTScsIHUn5LqkJyksCiAgICAoMHgxRjIxOSwgJ00nLCB1J+aYoCcpLAogICAgKDB4MUYyMUEsICdNJywgdSfnhKEnKSwKICAgICgweDFGMjFCLCAnTScsIHUn5paZJyksCiAgICAoMHgxRjIxQywgJ00nLCB1J+WJjScpLAogICAgKDB4MUYyMUQsICdNJywgdSflvownKSwKICAgICgweDFGMjFFLCAnTScsIHUn5YaNJyksCiAgICAoMHgxRjIxRiwgJ00nLCB1J+aWsCcpLAogICAgKDB4MUYyMjAsICdNJywgdSfliJ0nKSwKICAgICgweDFGMjIxLCAnTScsIHUn57WCJyksCiAgICAoMHgxRjIyMiwgJ00nLCB1J+eUnycpLAogICAgKDB4MUYyMjMsICdNJywgdSfosqknKSwKICAgICgweDFGMjI0LCAnTScsIHUn5aOwJyksCiAgICAoMHgxRjIyNSwgJ00nLCB1J+WQuScpLAogICAgKDB4MUYyMjYsICdNJywgdSfmvJQnKSwKICAgICgweDFGMjI3LCAnTScsIHUn5oqVJyksCiAgICAoMHgxRjIyOCwgJ00nLCB1J+aNlScpLAogICAgKDB4MUYyMjksICdNJywgdSfkuIAnKSwKICAgICgweDFGMjJBLCAnTScsIHUn5LiJJyksCiAgICAoMHgxRjIyQiwgJ00nLCB1J+mBiicpLAogICAgKDB4MUYyMkMsICdNJywgdSflt6YnKSwKICAgICgweDFGMjJELCAnTScsIHUn5LitJyksCiAgICAoMHgxRjIyRSwgJ00nLCB1J+WPsycpLAogICAgKDB4MUYyMkYsICdNJywgdSfmjIcnKSwKICAgICgweDFGMjMwLCAnTScsIHUn6LWwJyksCiAgICAoMHgxRjIzMSwgJ00nLCB1J+aJkycpLAogICAgKDB4MUYyMzIsICdNJywgdSfnpoEnKSwKICAgICgweDFGMjMzLCAnTScsIHUn56m6JyksCiAgICAoMHgxRjIzNCwgJ00nLCB1J+WQiCcpLAogICAgKDB4MUYyMzUsICdNJywgdSfmuoAnKSwKICAgICgweDFGMjM2LCAnTScsIHUn5pyJJyksCiAgICAoMHgxRjIzNywgJ00nLCB1J+aciCcpLAogICAgKDB4MUYyMzgsICdNJywgdSfnlLMnKSwKICAgICgweDFGMjM5LCAnTScsIHUn5YmyJyksCiAgICAoMHgxRjIzQSwgJ00nLCB1J+WWticpLAogICAgKDB4MUYyM0IsICdYJyksCiAgICAoMHgxRjI0MCwgJ00nLCB1J+OAlOacrOOAlScpLAogICAgKDB4MUYyNDEsICdNJywgdSfjgJTkuInjgJUnKSwKICAgICgweDFGMjQyLCAnTScsIHUn44CU5LqM44CVJyksCiAgICAoMHgxRjI0MywgJ00nLCB1J+OAlOWuieOAlScpLAogICAgKDB4MUYyNDQsICdNJywgdSfjgJTngrnjgJUnKSwKICAgICgweDFGMjQ1LCAnTScsIHUn44CU5omT44CVJyksCiAgICAoMHgxRjI0NiwgJ00nLCB1J+OAlOebl+OAlScpLAogICAgKDB4MUYyNDcsICdNJywgdSfjgJTli53jgJUnKSwKICAgICgweDFGMjQ4LCAnTScsIHUn44CU5pWX44CVJyksCiAgICAoMHgxRjI0OSwgJ1gnKSwKICAgICgweDFGMjUwLCAnTScsIHUn5b6XJyksCiAgICAoMHgxRjI1MSwgJ00nLCB1J+WPrycpLAogICAgKDB4MUYyNTIsICdYJyksCiAgICAoMHgxRjMwMCwgJ1YnKSwKICAgICgweDFGMzIxLCAnWCcpLAogICAgKDB4MUYzMzAsICdWJyksCiAgICAoMHgxRjMzNiwgJ1gnKSwKICAgICgweDFGMzM3LCAnVicpLAogICAgKDB4MUYzN0QsICdYJyksCiAgICAoMHgxRjM4MCwgJ1YnKSwKICAgICgweDFGMzk0LCAnWCcpLAogICAgKDB4MUYzQTAsICdWJyksCiAgICAoMHgxRjNDNSwgJ1gnKSwKICAgICgweDFGM0M2LCAnVicpLAogICAgKDB4MUYzQ0IsICdYJyksCiAgICAoMHgxRjNFMCwgJ1YnKSwKICAgICgweDFGM0YxLCAnWCcpLAogICAgKDB4MUY0MDAsICdWJyksCiAgICAoMHgxRjQzRiwgJ1gnKSwKICAgICgweDFGNDQwLCAnVicpLAogICAgXQoKZGVmIF9zZWdfNjcoKToKICAgIHJldHVybiBbCiAgICAoMHgxRjQ0MSwgJ1gnKSwKICAgICgweDFGNDQyLCAnVicpLAogICAgKDB4MUY0RjgsICdYJyksCiAgICAoMHgxRjRGOSwgJ1YnKSwKICAgICgweDFGNEZELCAnWCcpLAogICAgKDB4MUY1MDAsICdWJyksCiAgICAoMHgxRjUzRSwgJ1gnKSwKICAgICgweDFGNTQwLCAnVicpLAogICAgKDB4MUY1NDQsICdYJyksCiAgICAoMHgxRjU1MCwgJ1YnKSwKICAgICgweDFGNTY4LCAnWCcpLAogICAgKDB4MUY1RkIsICdWJyksCiAgICAoMHgxRjY0MSwgJ1gnKSwKICAgICgweDFGNjQ1LCAnVicpLAogICAgKDB4MUY2NTAsICdYJyksCiAgICAoMHgxRjY4MCwgJ1YnKSwKICAgICgweDFGNkM2LCAnWCcpLAogICAgKDB4MUY3MDAsICdWJyksCiAgICAoMHgxRjc3NCwgJ1gnKSwKICAgICgweDIwMDAwLCAnVicpLAogICAgKDB4MkE2RDcsICdYJyksCiAgICAoMHgyQTcwMCwgJ1YnKSwKICAgICgweDJCNzM1LCAnWCcpLAogICAgKDB4MkI3NDAsICdWJyksCiAgICAoMHgyQjgxRSwgJ1gnKSwKICAgICgweDJGODAwLCAnTScsIHUn5Li9JyksCiAgICAoMHgyRjgwMSwgJ00nLCB1J+S4uCcpLAogICAgKDB4MkY4MDIsICdNJywgdSfkuYEnKSwKICAgICgweDJGODAzLCAnTScsIHUn8KCEoicpLAogICAgKDB4MkY4MDQsICdNJywgdSfkvaAnKSwKICAgICgweDJGODA1LCAnTScsIHUn5L6uJyksCiAgICAoMHgyRjgwNiwgJ00nLCB1J+S+uycpLAogICAgKDB4MkY4MDcsICdNJywgdSflgIInKSwKICAgICgweDJGODA4LCAnTScsIHUn5YG6JyksCiAgICAoMHgyRjgwOSwgJ00nLCB1J+WCmScpLAogICAgKDB4MkY4MEEsICdNJywgdSflg6cnKSwKICAgICgweDJGODBCLCAnTScsIHUn5YOPJyksCiAgICAoMHgyRjgwQywgJ00nLCB1J+OSnicpLAogICAgKDB4MkY4MEQsICdNJywgdSfwoJi6JyksCiAgICAoMHgyRjgwRSwgJ00nLCB1J+WFjScpLAogICAgKDB4MkY4MEYsICdNJywgdSflhZQnKSwKICAgICgweDJGODEwLCAnTScsIHUn5YWkJyksCiAgICAoMHgyRjgxMSwgJ00nLCB1J+WFtycpLAogICAgKDB4MkY4MTIsICdNJywgdSfwoJScJyksCiAgICAoMHgyRjgxMywgJ00nLCB1J+OSuScpLAogICAgKDB4MkY4MTQsICdNJywgdSflhacnKSwKICAgICgweDJGODE1LCAnTScsIHUn5YaNJyksCiAgICAoMHgyRjgxNiwgJ00nLCB1J/CglYsnKSwKICAgICgweDJGODE3LCAnTScsIHUn5YaXJyksCiAgICAoMHgyRjgxOCwgJ00nLCB1J+WGpCcpLAogICAgKDB4MkY4MTksICdNJywgdSfku4wnKSwKICAgICgweDJGODFBLCAnTScsIHUn5YasJyksCiAgICAoMHgyRjgxQiwgJ00nLCB1J+WGtScpLAogICAgKDB4MkY4MUMsICdNJywgdSfwqYefJyksCiAgICAoMHgyRjgxRCwgJ00nLCB1J+WHtScpLAogICAgKDB4MkY4MUUsICdNJywgdSfliIMnKSwKICAgICgweDJGODFGLCAnTScsIHUn45OfJyksCiAgICAoMHgyRjgyMCwgJ00nLCB1J+WIuycpLAogICAgKDB4MkY4MjEsICdNJywgdSfliYYnKSwKICAgICgweDJGODIyLCAnTScsIHUn5YmyJyksCiAgICAoMHgyRjgyMywgJ00nLCB1J+WJtycpLAogICAgKDB4MkY4MjQsICdNJywgdSfjlJUnKSwKICAgICgweDJGODI1LCAnTScsIHUn5YuHJyksCiAgICAoMHgyRjgyNiwgJ00nLCB1J+WLiScpLAogICAgKDB4MkY4MjcsICdNJywgdSfli6QnKSwKICAgICgweDJGODI4LCAnTScsIHUn5Yu6JyksCiAgICAoMHgyRjgyOSwgJ00nLCB1J+WMhScpLAogICAgKDB4MkY4MkEsICdNJywgdSfljIYnKSwKICAgICgweDJGODJCLCAnTScsIHUn5YyXJyksCiAgICAoMHgyRjgyQywgJ00nLCB1J+WNiScpLAogICAgKDB4MkY4MkQsICdNJywgdSfljZEnKSwKICAgICgweDJGODJFLCAnTScsIHUn5Y2aJyksCiAgICAoMHgyRjgyRiwgJ00nLCB1J+WNsycpLAogICAgKDB4MkY4MzAsICdNJywgdSfljb0nKSwKICAgICgweDJGODMxLCAnTScsIHUn5Y2/JyksCiAgICAoMHgyRjgzNCwgJ00nLCB1J/CgqKwnKSwKICAgICgweDJGODM1LCAnTScsIHUn54GwJyksCiAgICAoMHgyRjgzNiwgJ00nLCB1J+WPiicpLAogICAgKDB4MkY4MzcsICdNJywgdSflj58nKSwKICAgICgweDJGODM4LCAnTScsIHUn8KCtoycpLAogICAgKDB4MkY4MzksICdNJywgdSflj6snKSwKICAgICgweDJGODNBLCAnTScsIHUn5Y+xJyksCiAgICAoMHgyRjgzQiwgJ00nLCB1J+WQhicpLAogICAgKDB4MkY4M0MsICdNJywgdSflkp4nKSwKICAgICgweDJGODNELCAnTScsIHUn5ZC4JyksCiAgICAoMHgyRjgzRSwgJ00nLCB1J+WRiCcpLAogICAgKDB4MkY4M0YsICdNJywgdSflkagnKSwKICAgICgweDJGODQwLCAnTScsIHUn5ZKiJyksCiAgICAoMHgyRjg0MSwgJ00nLCB1J+WTticpLAogICAgKDB4MkY4NDIsICdNJywgdSfllJAnKSwKICAgICgweDJGODQzLCAnTScsIHUn5ZWTJyksCiAgICAoMHgyRjg0NCwgJ00nLCB1J+WVoycpLAogICAgKDB4MkY4NDUsICdNJywgdSflloQnKSwKICAgICgweDJGODQ3LCAnTScsIHUn5ZaZJyksCiAgICAoMHgyRjg0OCwgJ00nLCB1J+WWqycpLAogICAgKDB4MkY4NDksICdNJywgdSfllrMnKSwKICAgICgweDJGODRBLCAnTScsIHUn5ZeCJyksCiAgICAoMHgyRjg0QiwgJ00nLCB1J+WclicpLAogICAgKDB4MkY4NEMsICdNJywgdSflmIYnKSwKICAgICgweDJGODRELCAnTScsIHUn5ZyXJyksCiAgICBdCgpkZWYgX3NlZ182OCgpOgogICAgcmV0dXJuIFsKICAgICgweDJGODRFLCAnTScsIHUn5ZmRJyksCiAgICAoMHgyRjg0RiwgJ00nLCB1J+WZtCcpLAogICAgKDB4MkY4NTAsICdNJywgdSfliIcnKSwKICAgICgweDJGODUxLCAnTScsIHUn5aOuJyksCiAgICAoMHgyRjg1MiwgJ00nLCB1J+WfjicpLAogICAgKDB4MkY4NTMsICdNJywgdSfln7QnKSwKICAgICgweDJGODU0LCAnTScsIHUn5aCNJyksCiAgICAoMHgyRjg1NSwgJ00nLCB1J+WeiycpLAogICAgKDB4MkY4NTYsICdNJywgdSfloLInKSwKICAgICgweDJGODU3LCAnTScsIHUn5aCxJyksCiAgICAoMHgyRjg1OCwgJ00nLCB1J+WirCcpLAogICAgKDB4MkY4NTksICdNJywgdSfwoZOkJyksCiAgICAoMHgyRjg1QSwgJ00nLCB1J+WjsicpLAogICAgKDB4MkY4NUIsICdNJywgdSflo7cnKSwKICAgICgweDJGODVDLCAnTScsIHUn5aSGJyksCiAgICAoMHgyRjg1RCwgJ00nLCB1J+WkmicpLAogICAgKDB4MkY4NUUsICdNJywgdSflpKInKSwKICAgICgweDJGODVGLCAnTScsIHUn5aWiJyksCiAgICAoMHgyRjg2MCwgJ00nLCB1J/ChmqgnKSwKICAgICgweDJGODYxLCAnTScsIHUn8KGbqicpLAogICAgKDB4MkY4NjIsICdNJywgdSflp6wnKSwKICAgICgweDJGODYzLCAnTScsIHUn5aibJyksCiAgICAoMHgyRjg2NCwgJ00nLCB1J+WopycpLAogICAgKDB4MkY4NjUsICdNJywgdSflp5gnKSwKICAgICgweDJGODY2LCAnTScsIHUn5ammJyksCiAgICAoMHgyRjg2NywgJ00nLCB1J+ObricpLAogICAgKDB4MkY4NjgsICdYJyksCiAgICAoMHgyRjg2OSwgJ00nLCB1J+WsiCcpLAogICAgKDB4MkY4NkEsICdNJywgdSflrL4nKSwKICAgICgweDJGODZDLCAnTScsIHUn8KGniCcpLAogICAgKDB4MkY4NkQsICdNJywgdSflr4MnKSwKICAgICgweDJGODZFLCAnTScsIHUn5a+YJyksCiAgICAoMHgyRjg2RiwgJ00nLCB1J+WvpycpLAogICAgKDB4MkY4NzAsICdNJywgdSflr7MnKSwKICAgICgweDJGODcxLCAnTScsIHUn8KGsmCcpLAogICAgKDB4MkY4NzIsICdNJywgdSflr78nKSwKICAgICgweDJGODczLCAnTScsIHUn5bCGJyksCiAgICAoMHgyRjg3NCwgJ1gnKSwKICAgICgweDJGODc1LCAnTScsIHUn5bCiJyksCiAgICAoMHgyRjg3NiwgJ00nLCB1J+OegScpLAogICAgKDB4MkY4NzcsICdNJywgdSflsaAnKSwKICAgICgweDJGODc4LCAnTScsIHUn5bGuJyksCiAgICAoMHgyRjg3OSwgJ00nLCB1J+WzgCcpLAogICAgKDB4MkY4N0EsICdNJywgdSflso0nKSwKICAgICgweDJGODdCLCAnTScsIHUn8KG3pCcpLAogICAgKDB4MkY4N0MsICdNJywgdSfltYMnKSwKICAgICgweDJGODdELCAnTScsIHUn8KG3picpLAogICAgKDB4MkY4N0UsICdNJywgdSflta4nKSwKICAgICgweDJGODdGLCAnTScsIHUn5bWrJyksCiAgICAoMHgyRjg4MCwgJ00nLCB1J+W1vCcpLAogICAgKDB4MkY4ODEsICdNJywgdSflt6EnKSwKICAgICgweDJGODgyLCAnTScsIHUn5beiJyksCiAgICAoMHgyRjg4MywgJ00nLCB1J+OgrycpLAogICAgKDB4MkY4ODQsICdNJywgdSflt70nKSwKICAgICgweDJGODg1LCAnTScsIHUn5bioJyksCiAgICAoMHgyRjg4NiwgJ00nLCB1J+W4vScpLAogICAgKDB4MkY4ODcsICdNJywgdSfluaknKSwKICAgICgweDJGODg4LCAnTScsIHUn46GiJyksCiAgICAoMHgyRjg4OSwgJ00nLCB1J/CihoMnKSwKICAgICgweDJGODhBLCAnTScsIHUn46G8JyksCiAgICAoMHgyRjg4QiwgJ00nLCB1J+W6sCcpLAogICAgKDB4MkY4OEMsICdNJywgdSflurMnKSwKICAgICgweDJGODhELCAnTScsIHUn5bq2JyksCiAgICAoMHgyRjg4RSwgJ00nLCB1J+W7iicpLAogICAgKDB4MkY4OEYsICdNJywgdSfwqo6SJyksCiAgICAoMHgyRjg5MCwgJ00nLCB1J+W7vicpLAogICAgKDB4MkY4OTEsICdNJywgdSfwooyxJyksCiAgICAoMHgyRjg5MywgJ00nLCB1J+iIgScpLAogICAgKDB4MkY4OTQsICdNJywgdSflvKInKSwKICAgICgweDJGODk2LCAnTScsIHUn46OHJyksCiAgICAoMHgyRjg5NywgJ00nLCB1J/CjirgnKSwKICAgICgweDJGODk4LCAnTScsIHUn8KaHmicpLAogICAgKDB4MkY4OTksICdNJywgdSflvaInKSwKICAgICgweDJGODlBLCAnTScsIHUn5b2rJyksCiAgICAoMHgyRjg5QiwgJ00nLCB1J+OjoycpLAogICAgKDB4MkY4OUMsICdNJywgdSflvponKSwKICAgICgweDJGODlELCAnTScsIHUn5b+NJyksCiAgICAoMHgyRjg5RSwgJ00nLCB1J+W/lycpLAogICAgKDB4MkY4OUYsICdNJywgdSflv7knKSwKICAgICgweDJGOEEwLCAnTScsIHUn5oKBJyksCiAgICAoMHgyRjhBMSwgJ00nLCB1J+OkuicpLAogICAgKDB4MkY4QTIsICdNJywgdSfjpJwnKSwKICAgICgweDJGOEEzLCAnTScsIHUn5oKUJyksCiAgICAoMHgyRjhBNCwgJ00nLCB1J/Cim5QnKSwKICAgICgweDJGOEE1LCAnTScsIHUn5oOHJyksCiAgICAoMHgyRjhBNiwgJ00nLCB1J+aFiCcpLAogICAgKDB4MkY4QTcsICdNJywgdSfmhYwnKSwKICAgICgweDJGOEE4LCAnTScsIHUn5oWOJyksCiAgICAoMHgyRjhBOSwgJ00nLCB1J+aFjCcpLAogICAgKDB4MkY4QUEsICdNJywgdSfmhbonKSwKICAgICgweDJGOEFCLCAnTScsIHUn5oaOJyksCiAgICAoMHgyRjhBQywgJ00nLCB1J+aGsicpLAogICAgKDB4MkY4QUQsICdNJywgdSfmhqQnKSwKICAgICgweDJGOEFFLCAnTScsIHUn5oavJyksCiAgICAoMHgyRjhBRiwgJ00nLCB1J+aHnicpLAogICAgKDB4MkY4QjAsICdNJywgdSfmh7InKSwKICAgICgweDJGOEIxLCAnTScsIHUn5oe2JyksCiAgICAoMHgyRjhCMiwgJ00nLCB1J+aIkCcpLAogICAgKDB4MkY4QjMsICdNJywgdSfmiJsnKSwKICAgICgweDJGOEI0LCAnTScsIHUn5omdJyksCiAgICBdCgpkZWYgX3NlZ182OSgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOEI1LCAnTScsIHUn5oqxJyksCiAgICAoMHgyRjhCNiwgJ00nLCB1J+aLlCcpLAogICAgKDB4MkY4QjcsICdNJywgdSfmjZAnKSwKICAgICgweDJGOEI4LCAnTScsIHUn8KKsjCcpLAogICAgKDB4MkY4QjksICdNJywgdSfmjL0nKSwKICAgICgweDJGOEJBLCAnTScsIHUn5ou8JyksCiAgICAoMHgyRjhCQiwgJ00nLCB1J+aNqCcpLAogICAgKDB4MkY4QkMsICdNJywgdSfmjoMnKSwKICAgICgweDJGOEJELCAnTScsIHUn5o+kJyksCiAgICAoMHgyRjhCRSwgJ00nLCB1J/Cir7EnKSwKICAgICgweDJGOEJGLCAnTScsIHUn5pCiJyksCiAgICAoMHgyRjhDMCwgJ00nLCB1J+aPhScpLAogICAgKDB4MkY4QzEsICdNJywgdSfmjqknKSwKICAgICgweDJGOEMyLCAnTScsIHUn46iuJyksCiAgICAoMHgyRjhDMywgJ00nLCB1J+aRqScpLAogICAgKDB4MkY4QzQsICdNJywgdSfmkb4nKSwKICAgICgweDJGOEM1LCAnTScsIHUn5pKdJyksCiAgICAoMHgyRjhDNiwgJ00nLCB1J+aRtycpLAogICAgKDB4MkY4QzcsICdNJywgdSfjqawnKSwKICAgICgweDJGOEM4LCAnTScsIHUn5pWPJyksCiAgICAoMHgyRjhDOSwgJ00nLCB1J+aVrCcpLAogICAgKDB4MkY4Q0EsICdNJywgdSfwo4CKJyksCiAgICAoMHgyRjhDQiwgJ00nLCB1J+aXoycpLAogICAgKDB4MkY4Q0MsICdNJywgdSfmm7gnKSwKICAgICgweDJGOENELCAnTScsIHUn5pmJJyksCiAgICAoMHgyRjhDRSwgJ00nLCB1J+OsmScpLAogICAgKDB4MkY4Q0YsICdNJywgdSfmmpEnKSwKICAgICgweDJGOEQwLCAnTScsIHUn46yIJyksCiAgICAoMHgyRjhEMSwgJ00nLCB1J+OrpCcpLAogICAgKDB4MkY4RDIsICdNJywgdSflhpInKSwKICAgICgweDJGOEQzLCAnTScsIHUn5YaVJyksCiAgICAoMHgyRjhENCwgJ00nLCB1J+acgCcpLAogICAgKDB4MkY4RDUsICdNJywgdSfmmpwnKSwKICAgICgweDJGOEQ2LCAnTScsIHUn6IKtJyksCiAgICAoMHgyRjhENywgJ00nLCB1J+SPmScpLAogICAgKDB4MkY4RDgsICdNJywgdSfmnJcnKSwKICAgICgweDJGOEQ5LCAnTScsIHUn5pybJyksCiAgICAoMHgyRjhEQSwgJ00nLCB1J+acoScpLAogICAgKDB4MkY4REIsICdNJywgdSfmnZ4nKSwKICAgICgweDJGOERDLCAnTScsIHUn5p2TJyksCiAgICAoMHgyRjhERCwgJ00nLCB1J/Cjj4MnKSwKICAgICgweDJGOERFLCAnTScsIHUn462JJyksCiAgICAoMHgyRjhERiwgJ00nLCB1J+afuicpLAogICAgKDB4MkY4RTAsICdNJywgdSfmnoUnKSwKICAgICgweDJGOEUxLCAnTScsIHUn5qGSJyksCiAgICAoMHgyRjhFMiwgJ00nLCB1J+aihScpLAogICAgKDB4MkY4RTMsICdNJywgdSfwo5GtJyksCiAgICAoMHgyRjhFNCwgJ00nLCB1J+aijicpLAogICAgKDB4MkY4RTUsICdNJywgdSfmoJ8nKSwKICAgICgweDJGOEU2LCAnTScsIHUn5qSUJyksCiAgICAoMHgyRjhFNywgJ00nLCB1J+OunScpLAogICAgKDB4MkY4RTgsICdNJywgdSfmpYInKSwKICAgICgweDJGOEU5LCAnTScsIHUn5qajJyksCiAgICAoMHgyRjhFQSwgJ00nLCB1J+anqicpLAogICAgKDB4MkY4RUIsICdNJywgdSfmqqgnKSwKICAgICgweDJGOEVDLCAnTScsIHUn8KOaoycpLAogICAgKDB4MkY4RUQsICdNJywgdSfmq5snKSwKICAgICgweDJGOEVFLCAnTScsIHUn47CYJyksCiAgICAoMHgyRjhFRiwgJ00nLCB1J+asoScpLAogICAgKDB4MkY4RjAsICdNJywgdSfwo6KnJyksCiAgICAoMHgyRjhGMSwgJ00nLCB1J+atlCcpLAogICAgKDB4MkY4RjIsICdNJywgdSfjsY4nKSwKICAgICgweDJGOEYzLCAnTScsIHUn5q2yJyksCiAgICAoMHgyRjhGNCwgJ00nLCB1J+aunycpLAogICAgKDB4MkY4RjUsICdNJywgdSfmrronKSwKICAgICgweDJGOEY2LCAnTScsIHUn5q67JyksCiAgICAoMHgyRjhGNywgJ00nLCB1J/Cjqo0nKSwKICAgICgweDJGOEY4LCAnTScsIHUn8KG0iycpLAogICAgKDB4MkY4RjksICdNJywgdSfwo6u6JyksCiAgICAoMHgyRjhGQSwgJ00nLCB1J+axjicpLAogICAgKDB4MkY4RkIsICdNJywgdSfwo7K8JyksCiAgICAoMHgyRjhGQywgJ00nLCB1J+ayvycpLAogICAgKDB4MkY4RkQsICdNJywgdSfms40nKSwKICAgICgweDJGOEZFLCAnTScsIHUn5rGnJyksCiAgICAoMHgyRjhGRiwgJ00nLCB1J+a0licpLAogICAgKDB4MkY5MDAsICdNJywgdSfmtL4nKSwKICAgICgweDJGOTAxLCAnTScsIHUn5rW3JyksCiAgICAoMHgyRjkwMiwgJ00nLCB1J+a1gScpLAogICAgKDB4MkY5MDMsICdNJywgdSfmtaknKSwKICAgICgweDJGOTA0LCAnTScsIHUn5rW4JyksCiAgICAoMHgyRjkwNSwgJ00nLCB1J+a2hScpLAogICAgKDB4MkY5MDYsICdNJywgdSfwo7SeJyksCiAgICAoMHgyRjkwNywgJ00nLCB1J+a0tCcpLAogICAgKDB4MkY5MDgsICdNJywgdSfmuK8nKSwKICAgICgweDJGOTA5LCAnTScsIHUn5rmuJyksCiAgICAoMHgyRjkwQSwgJ00nLCB1J+O0sycpLAogICAgKDB4MkY5MEIsICdNJywgdSfmu4snKSwKICAgICgweDJGOTBDLCAnTScsIHUn5ruHJyksCiAgICAoMHgyRjkwRCwgJ00nLCB1J/Cju5EnKSwKICAgICgweDJGOTBFLCAnTScsIHUn5re5JyksCiAgICAoMHgyRjkwRiwgJ00nLCB1J+a9ricpLAogICAgKDB4MkY5MTAsICdNJywgdSfwo72eJyksCiAgICAoMHgyRjkxMSwgJ00nLCB1J/Cjvo4nKSwKICAgICgweDJGOTEyLCAnTScsIHUn5r+GJyksCiAgICAoMHgyRjkxMywgJ00nLCB1J+eAuScpLAogICAgKDB4MkY5MTQsICdNJywgdSfngJ4nKSwKICAgICgweDJGOTE1LCAnTScsIHUn54CbJyksCiAgICAoMHgyRjkxNiwgJ00nLCB1J+O2licpLAogICAgKDB4MkY5MTcsICdNJywgdSfngYonKSwKICAgICgweDJGOTE4LCAnTScsIHUn54G9JyksCiAgICBdCgpkZWYgX3NlZ183MCgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOTE5LCAnTScsIHUn54G3JyksCiAgICAoMHgyRjkxQSwgJ00nLCB1J+eCrScpLAogICAgKDB4MkY5MUIsICdNJywgdSfwoJSlJyksCiAgICAoMHgyRjkxQywgJ00nLCB1J+eFhScpLAogICAgKDB4MkY5MUQsICdNJywgdSfwpImjJyksCiAgICAoMHgyRjkxRSwgJ00nLCB1J+eGnCcpLAogICAgKDB4MkY5MUYsICdYJyksCiAgICAoMHgyRjkyMCwgJ00nLCB1J+eIqCcpLAogICAgKDB4MkY5MjEsICdNJywgdSfniLUnKSwKICAgICgweDJGOTIyLCAnTScsIHUn54mQJyksCiAgICAoMHgyRjkyMywgJ00nLCB1J/CkmIgnKSwKICAgICgweDJGOTI0LCAnTScsIHUn54qAJyksCiAgICAoMHgyRjkyNSwgJ00nLCB1J+eKlScpLAogICAgKDB4MkY5MjYsICdNJywgdSfwpJy1JyksCiAgICAoMHgyRjkyNywgJ00nLCB1J/CkoJQnKSwKICAgICgweDJGOTI4LCAnTScsIHUn5426JyksCiAgICAoMHgyRjkyOSwgJ00nLCB1J+eOiycpLAogICAgKDB4MkY5MkEsICdNJywgdSfjuqwnKSwKICAgICgweDJGOTJCLCAnTScsIHUn546lJyksCiAgICAoMHgyRjkyQywgJ00nLCB1J+O6uCcpLAogICAgKDB4MkY5MkUsICdNJywgdSfnkYcnKSwKICAgICgweDJGOTJGLCAnTScsIHUn55GcJyksCiAgICAoMHgyRjkzMCwgJ00nLCB1J+eRsScpLAogICAgKDB4MkY5MzEsICdNJywgdSfnkoUnKSwKICAgICgweDJGOTMyLCAnTScsIHUn55OKJyksCiAgICAoMHgyRjkzMywgJ00nLCB1J+O8mycpLAogICAgKDB4MkY5MzQsICdNJywgdSfnlKQnKSwKICAgICgweDJGOTM1LCAnTScsIHUn8KSwticpLAogICAgKDB4MkY5MzYsICdNJywgdSfnlL4nKSwKICAgICgweDJGOTM3LCAnTScsIHUn8KSykicpLAogICAgKDB4MkY5MzgsICdNJywgdSfnlbAnKSwKICAgICgweDJGOTM5LCAnTScsIHUn8KKGnycpLAogICAgKDB4MkY5M0EsICdNJywgdSfnmJAnKSwKICAgICgweDJGOTNCLCAnTScsIHUn8KS+oScpLAogICAgKDB4MkY5M0MsICdNJywgdSfwpL64JyksCiAgICAoMHgyRjkzRCwgJ00nLCB1J/ClgYQnKSwKICAgICgweDJGOTNFLCAnTScsIHUn47+8JyksCiAgICAoMHgyRjkzRiwgJ00nLCB1J+SAiCcpLAogICAgKDB4MkY5NDAsICdNJywgdSfnm7QnKSwKICAgICgweDJGOTQxLCAnTScsIHUn8KWDsycpLAogICAgKDB4MkY5NDIsICdNJywgdSfwpYOyJyksCiAgICAoMHgyRjk0MywgJ00nLCB1J/ClhJknKSwKICAgICgweDJGOTQ0LCAnTScsIHUn8KWEsycpLAogICAgKDB4MkY5NDUsICdNJywgdSfnnJ4nKSwKICAgICgweDJGOTQ2LCAnTScsIHUn55yfJyksCiAgICAoMHgyRjk0OCwgJ00nLCB1J+ediicpLAogICAgKDB4MkY5NDksICdNJywgdSfkgLknKSwKICAgICgweDJGOTRBLCAnTScsIHUn556LJyksCiAgICAoMHgyRjk0QiwgJ00nLCB1J+SBhicpLAogICAgKDB4MkY5NEMsICdNJywgdSfkgpYnKSwKICAgICgweDJGOTRELCAnTScsIHUn8KWQnScpLAogICAgKDB4MkY5NEUsICdNJywgdSfnoY4nKSwKICAgICgweDJGOTRGLCAnTScsIHUn56KMJyksCiAgICAoMHgyRjk1MCwgJ00nLCB1J+ejjCcpLAogICAgKDB4MkY5NTEsICdNJywgdSfkg6MnKSwKICAgICgweDJGOTUyLCAnTScsIHUn8KWYpicpLAogICAgKDB4MkY5NTMsICdNJywgdSfnpZYnKSwKICAgICgweDJGOTU0LCAnTScsIHUn8KWamicpLAogICAgKDB4MkY5NTUsICdNJywgdSfwpZuFJyksCiAgICAoMHgyRjk1NiwgJ00nLCB1J+emjycpLAogICAgKDB4MkY5NTcsICdNJywgdSfnp6snKSwKICAgICgweDJGOTU4LCAnTScsIHUn5ISvJyksCiAgICAoMHgyRjk1OSwgJ00nLCB1J+epgCcpLAogICAgKDB4MkY5NUEsICdNJywgdSfnqYonKSwKICAgICgweDJGOTVCLCAnTScsIHUn56mPJyksCiAgICAoMHgyRjk1QywgJ00nLCB1J/ClpbwnKSwKICAgICgweDJGOTVELCAnTScsIHUn8KWqpycpLAogICAgKDB4MkY5NUYsICdYJyksCiAgICAoMHgyRjk2MCwgJ00nLCB1J+SIgicpLAogICAgKDB4MkY5NjEsICdNJywgdSfwpa6rJyksCiAgICAoMHgyRjk2MiwgJ00nLCB1J+evhicpLAogICAgKDB4MkY5NjMsICdNJywgdSfnr4knKSwKICAgICgweDJGOTY0LCAnTScsIHUn5IinJyksCiAgICAoMHgyRjk2NSwgJ00nLCB1J/ClsoAnKSwKICAgICgweDJGOTY2LCAnTScsIHUn57OSJyksCiAgICAoMHgyRjk2NywgJ00nLCB1J+SKoCcpLAogICAgKDB4MkY5NjgsICdNJywgdSfns6gnKSwKICAgICgweDJGOTY5LCAnTScsIHUn57OjJyksCiAgICAoMHgyRjk2QSwgJ00nLCB1J+e0gCcpLAogICAgKDB4MkY5NkIsICdNJywgdSfwpb6GJyksCiAgICAoMHgyRjk2QywgJ00nLCB1J+e1oycpLAogICAgKDB4MkY5NkQsICdNJywgdSfkjIEnKSwKICAgICgweDJGOTZFLCAnTScsIHUn57eHJyksCiAgICAoMHgyRjk2RiwgJ00nLCB1J+e4gicpLAogICAgKDB4MkY5NzAsICdNJywgdSfnuYUnKSwKICAgICgweDJGOTcxLCAnTScsIHUn5Iy0JyksCiAgICAoMHgyRjk3MiwgJ00nLCB1J/CmiKgnKSwKICAgICgweDJGOTczLCAnTScsIHUn8KaJhycpLAogICAgKDB4MkY5NzQsICdNJywgdSfkjZknKSwKICAgICgweDJGOTc1LCAnTScsIHUn8KaLmScpLAogICAgKDB4MkY5NzYsICdNJywgdSfnvbonKSwKICAgICgweDJGOTc3LCAnTScsIHUn8KaMvicpLAogICAgKDB4MkY5NzgsICdNJywgdSfnvpUnKSwKICAgICgweDJGOTc5LCAnTScsIHUn57+6JyksCiAgICAoMHgyRjk3QSwgJ00nLCB1J+iAhScpLAogICAgKDB4MkY5N0IsICdNJywgdSfwppOaJyksCiAgICAoMHgyRjk3QywgJ00nLCB1J/CmlKMnKSwKICAgICgweDJGOTdELCAnTScsIHUn6IGgJyksCiAgICAoMHgyRjk3RSwgJ00nLCB1J/CmlqgnKSwKICAgICgweDJGOTdGLCAnTScsIHUn6IGwJyksCiAgICBdCgpkZWYgX3NlZ183MSgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOTgwLCAnTScsIHUn8KONnycpLAogICAgKDB4MkY5ODEsICdNJywgdSfkj5UnKSwKICAgICgweDJGOTgyLCAnTScsIHUn6IKyJyksCiAgICAoMHgyRjk4MywgJ00nLCB1J+iEgycpLAogICAgKDB4MkY5ODQsICdNJywgdSfkkIsnKSwKICAgICgweDJGOTg1LCAnTScsIHUn6IS+JyksCiAgICAoMHgyRjk4NiwgJ00nLCB1J+WqtScpLAogICAgKDB4MkY5ODcsICdNJywgdSfwpp6nJyksCiAgICAoMHgyRjk4OCwgJ00nLCB1J/CmnrUnKSwKICAgICgweDJGOTg5LCAnTScsIHUn8KOOkycpLAogICAgKDB4MkY5OEEsICdNJywgdSfwo46cJyksCiAgICAoMHgyRjk4QiwgJ00nLCB1J+iIgScpLAogICAgKDB4MkY5OEMsICdNJywgdSfoiIQnKSwKICAgICgweDJGOThELCAnTScsIHUn6L6eJyksCiAgICAoMHgyRjk4RSwgJ00nLCB1J+SRqycpLAogICAgKDB4MkY5OEYsICdNJywgdSfoipEnKSwKICAgICgweDJGOTkwLCAnTScsIHUn6IqLJyksCiAgICAoMHgyRjk5MSwgJ00nLCB1J+iKnScpLAogICAgKDB4MkY5OTIsICdNJywgdSflirMnKSwKICAgICgweDJGOTkzLCAnTScsIHUn6IqxJyksCiAgICAoMHgyRjk5NCwgJ00nLCB1J+iKsycpLAogICAgKDB4MkY5OTUsICdNJywgdSfoir0nKSwKICAgICgweDJGOTk2LCAnTScsIHUn6IumJyksCiAgICAoMHgyRjk5NywgJ00nLCB1J/CmrLwnKSwKICAgICgweDJGOTk4LCAnTScsIHUn6IulJyksCiAgICAoMHgyRjk5OSwgJ00nLCB1J+iMnScpLAogICAgKDB4MkY5OUEsICdNJywgdSfojaMnKSwKICAgICgweDJGOTlCLCAnTScsIHUn6I6tJyksCiAgICAoMHgyRjk5QywgJ00nLCB1J+iMoycpLAogICAgKDB4MkY5OUQsICdNJywgdSfojr0nKSwKICAgICgweDJGOTlFLCAnTScsIHUn6I+nJyksCiAgICAoMHgyRjk5RiwgJ00nLCB1J+iRlycpLAogICAgKDB4MkY5QTAsICdNJywgdSfojZMnKSwKICAgICgweDJGOUExLCAnTScsIHUn6I+KJyksCiAgICAoMHgyRjlBMiwgJ00nLCB1J+iPjCcpLAogICAgKDB4MkY5QTMsICdNJywgdSfoj5wnKSwKICAgICgweDJGOUE0LCAnTScsIHUn8KawticpLAogICAgKDB4MkY5QTUsICdNJywgdSfwprWrJyksCiAgICAoMHgyRjlBNiwgJ00nLCB1J/Cms5UnKSwKICAgICgweDJGOUE3LCAnTScsIHUn5JSrJyksCiAgICAoMHgyRjlBOCwgJ00nLCB1J+iTsScpLAogICAgKDB4MkY5QTksICdNJywgdSfok7MnKSwKICAgICgweDJGOUFBLCAnTScsIHUn6JSWJyksCiAgICAoMHgyRjlBQiwgJ00nLCB1J/Cnj4onKSwKICAgICgweDJGOUFDLCAnTScsIHUn6JWkJyksCiAgICAoMHgyRjlBRCwgJ00nLCB1J/CmvKwnKSwKICAgICgweDJGOUFFLCAnTScsIHUn5JWdJyksCiAgICAoMHgyRjlBRiwgJ00nLCB1J+SVoScpLAogICAgKDB4MkY5QjAsICdNJywgdSfwpr6xJyksCiAgICAoMHgyRjlCMSwgJ00nLCB1J/Cng5InKSwKICAgICgweDJGOUIyLCAnTScsIHUn5JWrJyksCiAgICAoMHgyRjlCMywgJ00nLCB1J+iZkCcpLAogICAgKDB4MkY5QjQsICdNJywgdSfomZwnKSwKICAgICgweDJGOUI1LCAnTScsIHUn6JmnJyksCiAgICAoMHgyRjlCNiwgJ00nLCB1J+iZqScpLAogICAgKDB4MkY5QjcsICdNJywgdSfomqknKSwKICAgICgweDJGOUI4LCAnTScsIHUn6JqIJyksCiAgICAoMHgyRjlCOSwgJ00nLCB1J+icjicpLAogICAgKDB4MkY5QkEsICdNJywgdSfom6InKSwKICAgICgweDJGOUJCLCAnTScsIHUn6J25JyksCiAgICAoMHgyRjlCQywgJ00nLCB1J+icqCcpLAogICAgKDB4MkY5QkQsICdNJywgdSfonasnKSwKICAgICgweDJGOUJFLCAnTScsIHUn6J6GJyksCiAgICAoMHgyRjlCRiwgJ1gnKSwKICAgICgweDJGOUMwLCAnTScsIHUn6J+hJyksCiAgICAoMHgyRjlDMSwgJ00nLCB1J+iggScpLAogICAgKDB4MkY5QzIsICdNJywgdSfkl7knKSwKICAgICgweDJGOUMzLCAnTScsIHUn6KGgJyksCiAgICAoMHgyRjlDNCwgJ00nLCB1J+ihoycpLAogICAgKDB4MkY5QzUsICdNJywgdSfwp5mnJyksCiAgICAoMHgyRjlDNiwgJ00nLCB1J+ijlycpLAogICAgKDB4MkY5QzcsICdNJywgdSfoo54nKSwKICAgICgweDJGOUM4LCAnTScsIHUn5Ji1JyksCiAgICAoMHgyRjlDOSwgJ00nLCB1J+ijuicpLAogICAgKDB4MkY5Q0EsICdNJywgdSfjkrsnKSwKICAgICgweDJGOUNCLCAnTScsIHUn8KeiricpLAogICAgKDB4MkY5Q0MsICdNJywgdSfwp6WmJyksCiAgICAoMHgyRjlDRCwgJ00nLCB1J+SavicpLAogICAgKDB4MkY5Q0UsICdNJywgdSfkm4cnKSwKICAgICgweDJGOUNGLCAnTScsIHUn6KqgJyksCiAgICAoMHgyRjlEMCwgJ00nLCB1J+irrScpLAogICAgKDB4MkY5RDEsICdNJywgdSforoonKSwKICAgICgweDJGOUQyLCAnTScsIHUn6LGVJyksCiAgICAoMHgyRjlEMywgJ00nLCB1J/CnsqgnKSwKICAgICgweDJGOUQ0LCAnTScsIHUn6LKrJyksCiAgICAoMHgyRjlENSwgJ00nLCB1J+izgScpLAogICAgKDB4MkY5RDYsICdNJywgdSfotJsnKSwKICAgICgweDJGOUQ3LCAnTScsIHUn6LW3JyksCiAgICAoMHgyRjlEOCwgJ00nLCB1J/CnvK8nKSwKICAgICgweDJGOUQ5LCAnTScsIHUn8KCghCcpLAogICAgKDB4MkY5REEsICdNJywgdSfot4snKSwKICAgICgweDJGOURCLCAnTScsIHUn6La8JyksCiAgICAoMHgyRjlEQywgJ00nLCB1J+i3sCcpLAogICAgKDB4MkY5REQsICdNJywgdSfwoKOeJyksCiAgICAoMHgyRjlERSwgJ00nLCB1J+i7lCcpLAogICAgKDB4MkY5REYsICdNJywgdSfovLgnKSwKICAgICgweDJGOUUwLCAnTScsIHUn8KiXkicpLAogICAgKDB4MkY5RTEsICdNJywgdSfwqJetJyksCiAgICAoMHgyRjlFMiwgJ00nLCB1J+mClCcpLAogICAgKDB4MkY5RTMsICdNJywgdSfpg7EnKSwKICAgIF0KCmRlZiBfc2VnXzcyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5RTQsICdNJywgdSfphJEnKSwKICAgICgweDJGOUU1LCAnTScsIHUn8KicricpLAogICAgKDB4MkY5RTYsICdNJywgdSfphJsnKSwKICAgICgweDJGOUU3LCAnTScsIHUn6Yi4JyksCiAgICAoMHgyRjlFOCwgJ00nLCB1J+mLlycpLAogICAgKDB4MkY5RTksICdNJywgdSfpi5gnKSwKICAgICgweDJGOUVBLCAnTScsIHUn6Ym8JyksCiAgICAoMHgyRjlFQiwgJ00nLCB1J+mPuScpLAogICAgKDB4MkY5RUMsICdNJywgdSfpkJUnKSwKICAgICgweDJGOUVELCAnTScsIHUn8KivuicpLAogICAgKDB4MkY5RUUsICdNJywgdSfplosnKSwKICAgICgweDJGOUVGLCAnTScsIHUn5KaVJyksCiAgICAoMHgyRjlGMCwgJ00nLCB1J+mWtycpLAogICAgKDB4MkY5RjEsICdNJywgdSfwqLW3JyksCiAgICAoMHgyRjlGMiwgJ00nLCB1J+SnpicpLAogICAgKDB4MkY5RjMsICdNJywgdSfpm4MnKSwKICAgICgweDJGOUY0LCAnTScsIHUn5bayJyksCiAgICAoMHgyRjlGNSwgJ00nLCB1J+mcoycpLAogICAgKDB4MkY5RjYsICdNJywgdSfwqYWFJyksCiAgICAoMHgyRjlGNywgJ00nLCB1J/CpiJonKSwKICAgICgweDJGOUY4LCAnTScsIHUn5KmuJyksCiAgICAoMHgyRjlGOSwgJ00nLCB1J+SpticpLAogICAgKDB4MkY5RkEsICdNJywgdSfpn6AnKSwKICAgICgweDJGOUZCLCAnTScsIHUn8KmQiicpLAogICAgKDB4MkY5RkMsICdNJywgdSfkqrInKSwKICAgICgweDJGOUZELCAnTScsIHUn8KmSlicpLAogICAgKDB4MkY5RkUsICdNJywgdSfpoIsnKSwKICAgICgweDJGQTAwLCAnTScsIHUn6aCpJyksCiAgICAoMHgyRkEwMSwgJ00nLCB1J/CplrYnKSwKICAgICgweDJGQTAyLCAnTScsIHUn6aOiJyksCiAgICAoMHgyRkEwMywgJ00nLCB1J+SssycpLAogICAgKDB4MkZBMDQsICdNJywgdSfppKknKSwKICAgICgweDJGQTA1LCAnTScsIHUn6aanJyksCiAgICAoMHgyRkEwNiwgJ00nLCB1J+mngicpLAogICAgKDB4MkZBMDcsICdNJywgdSfpp74nKSwKICAgICgweDJGQTA4LCAnTScsIHUn5K+OJyksCiAgICAoMHgyRkEwOSwgJ00nLCB1J/CprLAnKSwKICAgICgweDJGQTBBLCAnTScsIHUn6aySJyksCiAgICAoMHgyRkEwQiwgJ00nLCB1J+mxgCcpLAogICAgKDB4MkZBMEMsICdNJywgdSfps70nKSwKICAgICgweDJGQTBELCAnTScsIHUn5LOOJyksCiAgICAoMHgyRkEwRSwgJ00nLCB1J+SzrScpLAogICAgKDB4MkZBMEYsICdNJywgdSfptacnKSwKICAgICgweDJGQTEwLCAnTScsIHUn8KqDjicpLAogICAgKDB4MkZBMTEsICdNJywgdSfks7gnKSwKICAgICgweDJGQTEyLCAnTScsIHUn8KqEhScpLAogICAgKDB4MkZBMTMsICdNJywgdSfwqoiOJyksCiAgICAoMHgyRkExNCwgJ00nLCB1J/CqipEnKSwKICAgICgweDJGQTE1LCAnTScsIHUn6bq7JyksCiAgICAoMHgyRkExNiwgJ00nLCB1J+S1licpLAogICAgKDB4MkZBMTcsICdNJywgdSfpu7knKSwKICAgICgweDJGQTE4LCAnTScsIHUn6bu+JyksCiAgICAoMHgyRkExOSwgJ00nLCB1J+m8hScpLAogICAgKDB4MkZBMUEsICdNJywgdSfpvI8nKSwKICAgICgweDJGQTFCLCAnTScsIHUn6byWJyksCiAgICAoMHgyRkExQywgJ00nLCB1J+m8uycpLAogICAgKDB4MkZBMUQsICdNJywgdSfwqpiAJyksCiAgICAoMHgyRkExRSwgJ1gnKSwKICAgICgweEUwMTAwLCAnSScpLAogICAgKDB4RTAxRjAsICdYJyksCiAgICBdCgp1dHM0NmRhdGEgPSB0dXBsZSgKICAgIF9zZWdfMCgpCiAgICArIF9zZWdfMSgpCiAgICArIF9zZWdfMigpCiAgICArIF9zZWdfMygpCiAgICArIF9zZWdfNCgpCiAgICArIF9zZWdfNSgpCiAgICArIF9zZWdfNigpCiAgICArIF9zZWdfNygpCiAgICArIF9zZWdfOCgpCiAgICArIF9zZWdfOSgpCiAgICArIF9zZWdfMTAoKQogICAgKyBfc2VnXzExKCkKICAgICsgX3NlZ18xMigpCiAgICArIF9zZWdfMTMoKQogICAgKyBfc2VnXzE0KCkKICAgICsgX3NlZ18xNSgpCiAgICArIF9zZWdfMTYoKQogICAgKyBfc2VnXzE3KCkKICAgICsgX3NlZ18xOCgpCiAgICArIF9zZWdfMTkoKQogICAgKyBfc2VnXzIwKCkKICAgICsgX3NlZ18yMSgpCiAgICArIF9zZWdfMjIoKQogICAgKyBfc2VnXzIzKCkKICAgICsgX3NlZ18yNCgpCiAgICArIF9zZWdfMjUoKQogICAgKyBfc2VnXzI2KCkKICAgICsgX3NlZ18yNygpCiAgICArIF9zZWdfMjgoKQogICAgKyBfc2VnXzI5KCkKICAgICsgX3NlZ18zMCgpCiAgICArIF9zZWdfMzEoKQogICAgKyBfc2VnXzMyKCkKICAgICsgX3NlZ18zMygpCiAgICArIF9zZWdfMzQoKQogICAgKyBfc2VnXzM1KCkKICAgICsgX3NlZ18zNigpCiAgICArIF9zZWdfMzcoKQogICAgKyBfc2VnXzM4KCkKICAgICsgX3NlZ18zOSgpCiAgICArIF9zZWdfNDAoKQogICAgKyBfc2VnXzQxKCkKICAgICsgX3NlZ180MigpCiAgICArIF9zZWdfNDMoKQogICAgKyBfc2VnXzQ0KCkKICAgICsgX3NlZ180NSgpCiAgICArIF9zZWdfNDYoKQogICAgKyBfc2VnXzQ3KCkKICAgICsgX3NlZ180OCgpCiAgICArIF9zZWdfNDkoKQogICAgKyBfc2VnXzUwKCkKICAgICsgX3NlZ181MSgpCiAgICArIF9zZWdfNTIoKQogICAgKyBfc2VnXzUzKCkKICAgICsgX3NlZ181NCgpCiAgICArIF9zZWdfNTUoKQogICAgKyBfc2VnXzU2KCkKICAgICsgX3NlZ181NygpCiAgICArIF9zZWdfNTgoKQogICAgKyBfc2VnXzU5KCkKICAgICsgX3NlZ182MCgpCiAgICArIF9zZWdfNjEoKQogICAgKyBfc2VnXzYyKCkKICAgICsgX3NlZ182MygpCiAgICArIF9zZWdfNjQoKQogICAgKyBfc2VnXzY1KCkKICAgICsgX3NlZ182NigpCiAgICArIF9zZWdfNjcoKQogICAgKyBfc2VnXzY4KCkKICAgICsgX3NlZ182OSgpCiAgICArIF9zZWdfNzAoKQogICAgKyBfc2VnXzcxKCkKICAgICsgX3NlZ183MigpCikKUEsDBBQAAAAAAAAAIQDdxKYFMDkBADA5AQAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lwYWRkcmVzcy5weSMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlIEluYy4KIyAgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgoKIiIiQSBmYXN0LCBsaWdodHdlaWdodCBJUHY0L0lQdjYgbWFuaXB1bGF0aW9uIGxpYnJhcnkgaW4gUHl0aG9uLgoKVGhpcyBsaWJyYXJ5IGlzIHVzZWQgdG8gY3JlYXRlL3Bva2UvbWFuaXB1bGF0ZSBJUHY0IGFuZCBJUHY2IGFkZHJlc3NlcwphbmQgbmV0d29ya3MuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHN0cnVjdAoKX192ZXJzaW9uX18gPSAnMS4wLjE3JwoKIyBDb21wYXRpYmlsaXR5IGZ1bmN0aW9ucwpfY29tcGF0X2ludF90eXBlcyA9IChpbnQsKQp0cnk6CiAgICBfY29tcGF0X2ludF90eXBlcyA9IChpbnQsIGxvbmcpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBwYXNzCnRyeToKICAgIF9jb21wYXRfc3RyID0gdW5pY29kZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2NvbXBhdF9zdHIgPSBzdHIKICAgIGFzc2VydCBieXRlcyAhPSBzdHIKaWYgYidcMCdbMF0gPT0gMDogICMgUHl0aG9uIDMgc2VtYW50aWNzCiAgICBkZWYgX2NvbXBhdF9ieXRlc190b19ieXRlX3ZhbHMoYnl0KToKICAgICAgICByZXR1cm4gYnl0CmVsc2U6CiAgICBkZWYgX2NvbXBhdF9ieXRlc190b19ieXRlX3ZhbHMoYnl0KToKICAgICAgICByZXR1cm4gW3N0cnVjdC51bnBhY2soYichQicsIGIpWzBdIGZvciBiIGluIGJ5dF0KdHJ5OgogICAgX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMgPSBpbnQuZnJvbV9ieXRlcwpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBkZWYgX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoYnl0dmFscywgZW5kaWFuZXNzKToKICAgICAgICBhc3NlcnQgZW5kaWFuZXNzID09ICdiaWcnCiAgICAgICAgcmVzID0gMAogICAgICAgIGZvciBidiBpbiBieXR2YWxzOgogICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidiwgX2NvbXBhdF9pbnRfdHlwZXMpCiAgICAgICAgICAgIHJlcyA9IChyZXMgPDwgOCkgKyBidgogICAgICAgIHJldHVybiByZXMKCgpkZWYgX2NvbXBhdF90b19ieXRlcyhpbnR2YWwsIGxlbmd0aCwgZW5kaWFuZXNzKToKICAgIGFzc2VydCBpc2luc3RhbmNlKGludHZhbCwgX2NvbXBhdF9pbnRfdHlwZXMpCiAgICBhc3NlcnQgZW5kaWFuZXNzID09ICdiaWcnCiAgICBpZiBsZW5ndGggPT0gNDoKICAgICAgICBpZiBpbnR2YWwgPCAwIG9yIGludHZhbCA+PSAyICoqIDMyOgogICAgICAgICAgICByYWlzZSBzdHJ1Y3QuZXJyb3IoImludGVnZXIgb3V0IG9mIHJhbmdlIGZvciAnSScgZm9ybWF0IGNvZGUiKQogICAgICAgIHJldHVybiBzdHJ1Y3QucGFjayhiJyFJJywgaW50dmFsKQogICAgZWxpZiBsZW5ndGggPT0gMTY6CiAgICAgICAgaWYgaW50dmFsIDwgMCBvciBpbnR2YWwgPj0gMiAqKiAxMjg6CiAgICAgICAgICAgIHJhaXNlIHN0cnVjdC5lcnJvcigiaW50ZWdlciBvdXQgb2YgcmFuZ2UgZm9yICdRUScgZm9ybWF0IGNvZGUiKQogICAgICAgIHJldHVybiBzdHJ1Y3QucGFjayhiJyFRUScsIGludHZhbCA+PiA2NCwgaW50dmFsICYgMHhmZmZmZmZmZmZmZmZmZmZmKQogICAgZWxzZToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKaWYgaGFzYXR0cihpbnQsICdiaXRfbGVuZ3RoJyk6CiAgICAjIE5vdCBpbnQuYml0X2xlbmd0aCAsIHNpbmNlIHRoYXQgd29uJ3Qgd29yayBpbiAyLjcgd2hlcmUgbG9uZyBleGlzdHMKICAgIGRlZiBfY29tcGF0X2JpdF9sZW5ndGgoaSk6CiAgICAgICAgcmV0dXJuIGkuYml0X2xlbmd0aCgpCmVsc2U6CiAgICBkZWYgX2NvbXBhdF9iaXRfbGVuZ3RoKGkpOgogICAgICAgIGZvciByZXMgaW4gaXRlcnRvb2xzLmNvdW50KCk6CiAgICAgICAgICAgIGlmIGkgPj4gcmVzID09IDA6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzCgoKZGVmIF9jb21wYXRfcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcD0xKToKICAgIGFzc2VydCBzdGVwID4gMAogICAgaSA9IHN0YXJ0CiAgICB3aGlsZSBpIDwgZW5kOgogICAgICAgIHlpZWxkIGkKICAgICAgICBpICs9IHN0ZXAKCgpjbGFzcyBfVG90YWxPcmRlcmluZ01peGluKG9iamVjdCk6CiAgICBfX3Nsb3RzX18gPSAoKQoKICAgICMgSGVscGVyIHRoYXQgZGVyaXZlcyB0aGUgb3RoZXIgY29tcGFyaXNvbiBvcGVyYXRpb25zIGZyb20KICAgICMgX19sdF9fIGFuZCBfX2VxX18KICAgICMgV2UgYXZvaWQgZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nIGJlY2F1c2UgaXQgZG9lc24ndCBoYW5kbGUKICAgICMgTm90SW1wbGVtZW50ZWQgY29ycmVjdGx5IHlldCAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwMDQyKQogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGVxdWFsID0gc2VsZi5fX2VxX18ob3RoZXIpCiAgICAgICAgaWYgZXF1YWwgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBub3QgZXF1YWwKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgbGVzcyA9IHNlbGYuX19sdF9fKG90aGVyKQogICAgICAgIGlmIGxlc3MgaXMgTm90SW1wbGVtZW50ZWQgb3Igbm90IGxlc3M6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZXFfXyhvdGhlcikKICAgICAgICByZXR1cm4gbGVzcwoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGxlc3MgPSBzZWxmLl9fbHRfXyhvdGhlcikKICAgICAgICBpZiBsZXNzIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlcXVhbCA9IHNlbGYuX19lcV9fKG90aGVyKQogICAgICAgIGlmIGVxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gbm90IChsZXNzIG9yIGVxdWFsKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGxlc3MgPSBzZWxmLl9fbHRfXyhvdGhlcikKICAgICAgICBpZiBsZXNzIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gbm90IGxlc3MKCgpJUFY0TEVOR1RIID0gMzIKSVBWNkxFTkdUSCA9IDEyOAoKCmNsYXNzIEFkZHJlc3NWYWx1ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgIiIiQSBWYWx1ZSBFcnJvciByZWxhdGVkIHRvIHRoZSBhZGRyZXNzLiIiIgoKCmNsYXNzIE5ldG1hc2tWYWx1ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgIiIiQSBWYWx1ZSBFcnJvciByZWxhdGVkIHRvIHRoZSBuZXRtYXNrLiIiIgoKCmRlZiBpcF9hZGRyZXNzKGFkZHJlc3MpOgogICAgIiIiVGFrZSBhbiBJUCBzdHJpbmcvaW50IGFuZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyLCB0aGUgSVAgYWRkcmVzcy4gIEVpdGhlciBJUHY0IG9yCiAgICAgICAgICBJUHY2IGFkZHJlc3NlcyBtYXkgYmUgc3VwcGxpZWQ7IGludGVnZXJzIGxlc3MgdGhhbiAyKiozMiB3aWxsCiAgICAgICAgICBiZSBjb25zaWRlcmVkIHRvIGJlIElQdjQgYnkgZGVmYXVsdC4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIElQdjRBZGRyZXNzIG9yIElQdjZBZGRyZXNzIG9iamVjdC4KCiAgICBSYWlzZXM6CiAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlICphZGRyZXNzKiBwYXNzZWQgaXNuJ3QgZWl0aGVyIGEgdjQgb3IgYSB2NgogICAgICAgICAgYWRkcmVzcwoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY0QWRkcmVzcyhhZGRyZXNzKQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjZBZGRyZXNzKGFkZHJlc3MpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgYnl0ZXMpOgogICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKAogICAgICAgICAgICAnJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBhZGRyZXNzLiAnCiAgICAgICAgICAgICdEaWQgeW91IHBhc3MgaW4gYSBieXRlcyAoc3RyIGluIFB5dGhvbiAyKSBpbnN0ZWFkIG9mJwogICAgICAgICAgICAnIGEgdW5pY29kZSBvYmplY3Q/JyAlIGFkZHJlc3MpCgogICAgcmFpc2UgVmFsdWVFcnJvcignJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBhZGRyZXNzJyAlCiAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpCgoKZGVmIGlwX25ldHdvcmsoYWRkcmVzcywgc3RyaWN0PVRydWUpOgogICAgIiIiVGFrZSBhbiBJUCBzdHJpbmcvaW50IGFuZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyLCB0aGUgSVAgbmV0d29yay4gIEVpdGhlciBJUHY0IG9yCiAgICAgICAgICBJUHY2IG5ldHdvcmtzIG1heSBiZSBzdXBwbGllZDsgaW50ZWdlcnMgbGVzcyB0aGFuIDIqKjMyIHdpbGwKICAgICAgICAgIGJlIGNvbnNpZGVyZWQgdG8gYmUgSVB2NCBieSBkZWZhdWx0LgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gSVB2NE5ldHdvcmsgb3IgSVB2Nk5ldHdvcmsgb2JqZWN0LgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgc3RyaW5nIHBhc3NlZCBpc24ndCBlaXRoZXIgYSB2NCBvciBhIHY2CiAgICAgICAgICBhZGRyZXNzLiBPciBpZiB0aGUgbmV0d29yayBoYXMgaG9zdCBiaXRzIHNldC4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NE5ldHdvcmsoYWRkcmVzcywgc3RyaWN0KQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjZOZXR3b3JrKGFkZHJlc3MsIHN0cmljdCkKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoCiAgICAgICAgICAgICclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IG5ldHdvcmsuICcKICAgICAgICAgICAgJ0RpZCB5b3UgcGFzcyBpbiBhIGJ5dGVzIChzdHIgaW4gUHl0aG9uIDIpIGluc3RlYWQgb2YnCiAgICAgICAgICAgICcgYSB1bmljb2RlIG9iamVjdD8nICUgYWRkcmVzcykKCiAgICByYWlzZSBWYWx1ZUVycm9yKCclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IG5ldHdvcmsnICUKICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykKCgpkZWYgaXBfaW50ZXJmYWNlKGFkZHJlc3MpOgogICAgIiIiVGFrZSBhbiBJUCBzdHJpbmcvaW50IGFuZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyLCB0aGUgSVAgYWRkcmVzcy4gIEVpdGhlciBJUHY0IG9yCiAgICAgICAgICBJUHY2IGFkZHJlc3NlcyBtYXkgYmUgc3VwcGxpZWQ7IGludGVnZXJzIGxlc3MgdGhhbiAyKiozMiB3aWxsCiAgICAgICAgICBiZSBjb25zaWRlcmVkIHRvIGJlIElQdjQgYnkgZGVmYXVsdC4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIElQdjRJbnRlcmZhY2Ugb3IgSVB2NkludGVyZmFjZSBvYmplY3QuCgogICAgUmFpc2VzOgogICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBzdHJpbmcgcGFzc2VkIGlzbid0IGVpdGhlciBhIHY0IG9yIGEgdjYKICAgICAgICAgIGFkZHJlc3MuCgogICAgTm90ZXM6CiAgICAgICAgVGhlIElQdj9JbnRlcmZhY2UgY2xhc3NlcyBkZXNjcmliZSBhbiBBZGRyZXNzIG9uIGEgcGFydGljdWxhcgogICAgICAgIE5ldHdvcmssIHNvIHRoZXkncmUgYmFzaWNhbGx5IGEgY29tYmluYXRpb24gb2YgYm90aCB0aGUgQWRkcmVzcwogICAgICAgIGFuZCBOZXR3b3JrIGNsYXNzZXMuCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjRJbnRlcmZhY2UoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY2SW50ZXJmYWNlKGFkZHJlc3MpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgaW50ZXJmYWNlJyAlCiAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpCgoKZGVmIHY0X2ludF90b19wYWNrZWQoYWRkcmVzcyk6CiAgICAiIiJSZXByZXNlbnQgYW4gYWRkcmVzcyBhcyA0IHBhY2tlZCBieXRlcyBpbiBuZXR3b3JrIChiaWctZW5kaWFuKSBvcmRlci4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYW4gSVB2NCBJUCBhZGRyZXNzLgoKICAgIFJldHVybnM6CiAgICAgICAgVGhlIGludGVnZXIgYWRkcmVzcyBwYWNrZWQgYXMgNCBieXRlcyBpbiBuZXR3b3JrIChiaWctZW5kaWFuKSBvcmRlci4KCiAgICBSYWlzZXM6CiAgICAgICAgVmFsdWVFcnJvcjogSWYgdGhlIGludGVnZXIgaXMgbmVnYXRpdmUgb3IgdG9vIGxhcmdlIHRvIGJlIGFuCiAgICAgICAgICBJUHY0IElQIGFkZHJlc3MuCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jb21wYXRfdG9fYnl0ZXMoYWRkcmVzcywgNCwgJ2JpZycpCiAgICBleGNlcHQgKHN0cnVjdC5lcnJvciwgT3ZlcmZsb3dFcnJvcik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQWRkcmVzcyBuZWdhdGl2ZSBvciB0b28gbGFyZ2UgZm9yIElQdjQiKQoKCmRlZiB2Nl9pbnRfdG9fcGFja2VkKGFkZHJlc3MpOgogICAgIiIiUmVwcmVzZW50IGFuIGFkZHJlc3MgYXMgMTYgcGFja2VkIGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY2IElQIGFkZHJlc3MuCgogICAgUmV0dXJuczoKICAgICAgICBUaGUgaW50ZWdlciBhZGRyZXNzIHBhY2tlZCBhcyAxNiBieXRlcyBpbiBuZXR3b3JrIChiaWctZW5kaWFuKSBvcmRlci4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NvbXBhdF90b19ieXRlcyhhZGRyZXNzLCAxNiwgJ2JpZycpCiAgICBleGNlcHQgKHN0cnVjdC5lcnJvciwgT3ZlcmZsb3dFcnJvcik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQWRkcmVzcyBuZWdhdGl2ZSBvciB0b28gbGFyZ2UgZm9yIElQdjYiKQoKCmRlZiBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKToKICAgICIiIkhlbHBlciB0byBzcGxpdCB0aGUgbmV0bWFzayBhbmQgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IgaWYgbmVlZGVkIiIiCiAgICBhZGRyID0gX2NvbXBhdF9zdHIoYWRkcmVzcykuc3BsaXQoJy8nKQogICAgaWYgbGVuKGFkZHIpID4gMjoKICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiT25seSBvbmUgJy8nIHBlcm1pdHRlZCBpbiAlciIgJSBhZGRyZXNzKQogICAgcmV0dXJuIGFkZHIKCgpkZWYgX2ZpbmRfYWRkcmVzc19yYW5nZShhZGRyZXNzZXMpOgogICAgIiIiRmluZCBhIHNlcXVlbmNlIG9mIHNvcnRlZCBkZWR1cGxpY2F0ZWQgSVB2I0FkZHJlc3MuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzZXM6IGEgbGlzdCBvZiBJUHYjQWRkcmVzcyBvYmplY3RzLgoKICAgIFlpZWxkczoKICAgICAgICBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGFuZCBsYXN0IElQIGFkZHJlc3NlcyBpbiB0aGUgc2VxdWVuY2UuCgogICAgIiIiCiAgICBpdCA9IGl0ZXIoYWRkcmVzc2VzKQogICAgZmlyc3QgPSBsYXN0ID0gbmV4dChpdCkKICAgIGZvciBpcCBpbiBpdDoKICAgICAgICBpZiBpcC5faXAgIT0gbGFzdC5faXAgKyAxOgogICAgICAgICAgICB5aWVsZCBmaXJzdCwgbGFzdAogICAgICAgICAgICBmaXJzdCA9IGlwCiAgICAgICAgbGFzdCA9IGlwCiAgICB5aWVsZCBmaXJzdCwgbGFzdAoKCmRlZiBfY291bnRfcmlnaHRoYW5kX3plcm9fYml0cyhudW1iZXIsIGJpdHMpOgogICAgIiIiQ291bnQgdGhlIG51bWJlciBvZiB6ZXJvIGJpdHMgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZS4KCiAgICBBcmdzOgogICAgICAgIG51bWJlcjogYW4gaW50ZWdlci4KICAgICAgICBiaXRzOiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIHRvIGNvdW50LgoKICAgIFJldHVybnM6CiAgICAgICAgVGhlIG51bWJlciBvZiB6ZXJvIGJpdHMgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgbnVtYmVyLgoKICAgICIiIgogICAgaWYgbnVtYmVyID09IDA6CiAgICAgICAgcmV0dXJuIGJpdHMKICAgIHJldHVybiBtaW4oYml0cywgX2NvbXBhdF9iaXRfbGVuZ3RoKH5udW1iZXIgJiAobnVtYmVyIC0gMSkpKQoKCmRlZiBzdW1tYXJpemVfYWRkcmVzc19yYW5nZShmaXJzdCwgbGFzdCk6CiAgICAiIiJTdW1tYXJpemUgYSBuZXR3b3JrIHJhbmdlIGdpdmVuIHRoZSBmaXJzdCBhbmQgbGFzdCBJUCBhZGRyZXNzZXMuCgogICAgRXhhbXBsZToKICAgICAgICA+Pj4gbGlzdChzdW1tYXJpemVfYWRkcmVzc19yYW5nZShJUHY0QWRkcmVzcygnMTkyLjAuMi4wJyksCiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMTMwJykpKQogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQogICAgICAgIFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI1JyksIElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8zMScpLAogICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi4xMzAvMzInKV0KCiAgICBBcmdzOgogICAgICAgIGZpcnN0OiB0aGUgZmlyc3QgSVB2NEFkZHJlc3Mgb3IgSVB2NkFkZHJlc3MgaW4gdGhlIHJhbmdlLgogICAgICAgIGxhc3Q6IHRoZSBsYXN0IElQdjRBZGRyZXNzIG9yIElQdjZBZGRyZXNzIGluIHRoZSByYW5nZS4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIGl0ZXJhdG9yIG9mIHRoZSBzdW1tYXJpemVkIElQdig0fDYpIG5ldHdvcmsgb2JqZWN0cy4KCiAgICBSYWlzZToKICAgICAgICBUeXBlRXJyb3I6CiAgICAgICAgICAgIElmIHRoZSBmaXJzdCBhbmQgbGFzdCBvYmplY3RzIGFyZSBub3QgSVAgYWRkcmVzc2VzLgogICAgICAgICAgICBJZiB0aGUgZmlyc3QgYW5kIGxhc3Qgb2JqZWN0cyBhcmUgbm90IHRoZSBzYW1lIHZlcnNpb24uCiAgICAgICAgVmFsdWVFcnJvcjoKICAgICAgICAgICAgSWYgdGhlIGxhc3Qgb2JqZWN0IGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGZpcnN0LgogICAgICAgICAgICBJZiB0aGUgdmVyc2lvbiBvZiB0aGUgZmlyc3QgYWRkcmVzcyBpcyBub3QgNCBvciA2LgoKICAgICIiIgogICAgaWYgKG5vdCAoaXNpbnN0YW5jZShmaXJzdCwgX0Jhc2VBZGRyZXNzKSBhbmQKICAgICAgICAgICAgIGlzaW5zdGFuY2UobGFzdCwgX0Jhc2VBZGRyZXNzKSkpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignZmlyc3QgYW5kIGxhc3QgbXVzdCBiZSBJUCBhZGRyZXNzZXMsIG5vdCBuZXR3b3JrcycpCiAgICBpZiBmaXJzdC52ZXJzaW9uICE9IGxhc3QudmVyc2lvbjoKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24iICUgKAogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCkpCiAgICBpZiBmaXJzdCA+IGxhc3Q6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbGFzdCBJUCBhZGRyZXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIGZpcnN0JykKCiAgICBpZiBmaXJzdC52ZXJzaW9uID09IDQ6CiAgICAgICAgaXAgPSBJUHY0TmV0d29yawogICAgZWxpZiBmaXJzdC52ZXJzaW9uID09IDY6CiAgICAgICAgaXAgPSBJUHY2TmV0d29yawogICAgZWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd1bmtub3duIElQIHZlcnNpb24nKQoKICAgIGlwX2JpdHMgPSBmaXJzdC5fbWF4X3ByZWZpeGxlbgogICAgZmlyc3RfaW50ID0gZmlyc3QuX2lwCiAgICBsYXN0X2ludCA9IGxhc3QuX2lwCiAgICB3aGlsZSBmaXJzdF9pbnQgPD0gbGFzdF9pbnQ6CiAgICAgICAgbmJpdHMgPSBtaW4oX2NvdW50X3JpZ2h0aGFuZF96ZXJvX2JpdHMoZmlyc3RfaW50LCBpcF9iaXRzKSwKICAgICAgICAgICAgICAgICAgICBfY29tcGF0X2JpdF9sZW5ndGgobGFzdF9pbnQgLSBmaXJzdF9pbnQgKyAxKSAtIDEpCiAgICAgICAgbmV0ID0gaXAoKGZpcnN0X2ludCwgaXBfYml0cyAtIG5iaXRzKSkKICAgICAgICB5aWVsZCBuZXQKICAgICAgICBmaXJzdF9pbnQgKz0gMSA8PCBuYml0cwogICAgICAgIGlmIGZpcnN0X2ludCAtIDEgPT0gaXAuX0FMTF9PTkVTOgogICAgICAgICAgICBicmVhawoKCmRlZiBfY29sbGFwc2VfYWRkcmVzc2VzX2ludGVybmFsKGFkZHJlc3Nlcyk6CiAgICAiIiJMb29wcyB0aHJvdWdoIHRoZSBhZGRyZXNzZXMsIGNvbGxhcHNpbmcgY29uY3VycmVudCBuZXRibG9ja3MuCgogICAgRXhhbXBsZToKCiAgICAgICAgaXAxID0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNicpCiAgICAgICAgaXAyID0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuNjQvMjYnKQogICAgICAgIGlwMyA9IElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNicpCiAgICAgICAgaXA0ID0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTkyLzI2JykKCiAgICAgICAgX2NvbGxhcHNlX2FkZHJlc3Nlc19pbnRlcm5hbChbaXAxLCBpcDIsIGlwMywgaXA0XSkgLT4KICAgICAgICAgIFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JyldCgogICAgICAgIFRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseTsgaXQgaXMgY2FsbGVkIHZpYQogICAgICAgICAgY29sbGFwc2VfYWRkcmVzc2VzKFtdKS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3NlczogQSBsaXN0IG9mIElQdjROZXR3b3JrJ3Mgb3IgSVB2Nk5ldHdvcmsncwoKICAgIFJldHVybnM6CiAgICAgICAgQSBsaXN0IG9mIElQdjROZXR3b3JrJ3Mgb3IgSVB2Nk5ldHdvcmsncyBkZXBlbmRpbmcgb24gd2hhdCB3ZSB3ZXJlCiAgICAgICAgcGFzc2VkLgoKICAgICIiIgogICAgIyBGaXJzdCBtZXJnZQogICAgdG9fbWVyZ2UgPSBsaXN0KGFkZHJlc3NlcykKICAgIHN1Ym5ldHMgPSB7fQogICAgd2hpbGUgdG9fbWVyZ2U6CiAgICAgICAgbmV0ID0gdG9fbWVyZ2UucG9wKCkKICAgICAgICBzdXBlcm5ldCA9IG5ldC5zdXBlcm5ldCgpCiAgICAgICAgZXhpc3RpbmcgPSBzdWJuZXRzLmdldChzdXBlcm5ldCkKICAgICAgICBpZiBleGlzdGluZyBpcyBOb25lOgogICAgICAgICAgICBzdWJuZXRzW3N1cGVybmV0XSA9IG5ldAogICAgICAgIGVsaWYgZXhpc3RpbmcgIT0gbmV0OgogICAgICAgICAgICAjIE1lcmdlIGNvbnNlY3V0aXZlIHN1Ym5ldHMKICAgICAgICAgICAgZGVsIHN1Ym5ldHNbc3VwZXJuZXRdCiAgICAgICAgICAgIHRvX21lcmdlLmFwcGVuZChzdXBlcm5ldCkKICAgICMgVGhlbiBpdGVyYXRlIG92ZXIgcmVzdWx0aW5nIG5ldHdvcmtzLCBza2lwcGluZyBzdWJzdW1lZCBzdWJuZXRzCiAgICBsYXN0ID0gTm9uZQogICAgZm9yIG5ldCBpbiBzb3J0ZWQoc3VibmV0cy52YWx1ZXMoKSk6CiAgICAgICAgaWYgbGFzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBTaW5jZSB0aGV5IGFyZSBzb3J0ZWQsCiAgICAgICAgICAgICMgbGFzdC5uZXR3b3JrX2FkZHJlc3MgPD0gbmV0Lm5ldHdvcmtfYWRkcmVzcyBpcyBhIGdpdmVuLgogICAgICAgICAgICBpZiBsYXN0LmJyb2FkY2FzdF9hZGRyZXNzID49IG5ldC5icm9hZGNhc3RfYWRkcmVzczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgeWllbGQgbmV0CiAgICAgICAgbGFzdCA9IG5ldAoKCmRlZiBjb2xsYXBzZV9hZGRyZXNzZXMoYWRkcmVzc2VzKToKICAgICIiIkNvbGxhcHNlIGEgbGlzdCBvZiBJUCBvYmplY3RzLgoKICAgIEV4YW1wbGU6CiAgICAgICAgY29sbGFwc2VfYWRkcmVzc2VzKFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI1JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi4xMjgvMjUnKV0pIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JyldCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzZXM6IEFuIGl0ZXJhdG9yIG9mIElQdjROZXR3b3JrIG9yIElQdjZOZXR3b3JrIG9iamVjdHMuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBpdGVyYXRvciBvZiB0aGUgY29sbGFwc2VkIElQdig0fDYpTmV0d29yayBvYmplY3RzLgoKICAgIFJhaXNlczoKICAgICAgICBUeXBlRXJyb3I6IElmIHBhc3NlZCBhIGxpc3Qgb2YgbWl4ZWQgdmVyc2lvbiBvYmplY3RzLgoKICAgICIiIgogICAgYWRkcnMgPSBbXQogICAgaXBzID0gW10KICAgIG5ldHMgPSBbXQoKICAgICMgc3BsaXQgSVAgYWRkcmVzc2VzIGFuZCBuZXR3b3JrcwogICAgZm9yIGlwIGluIGFkZHJlc3NlczoKICAgICAgICBpZiBpc2luc3RhbmNlKGlwLCBfQmFzZUFkZHJlc3MpOgogICAgICAgICAgICBpZiBpcHMgYW5kIGlwc1stMV0uX3ZlcnNpb24gIT0gaXAuX3ZlcnNpb246CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24iICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwLCBpcHNbLTFdKSkKICAgICAgICAgICAgaXBzLmFwcGVuZChpcCkKICAgICAgICBlbGlmIGlwLl9wcmVmaXhsZW4gPT0gaXAuX21heF9wcmVmaXhsZW46CiAgICAgICAgICAgIGlmIGlwcyBhbmQgaXBzWy0xXS5fdmVyc2lvbiAhPSBpcC5fdmVyc2lvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAsIGlwc1stMV0pKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpcHMuYXBwZW5kKGlwLmlwKQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBpcHMuYXBwZW5kKGlwLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBuZXRzIGFuZCBuZXRzWy0xXS5fdmVyc2lvbiAhPSBpcC5fdmVyc2lvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAsIG5ldHNbLTFdKSkKICAgICAgICAgICAgbmV0cy5hcHBlbmQoaXApCgogICAgIyBzb3J0IGFuZCBkZWR1cAogICAgaXBzID0gc29ydGVkKHNldChpcHMpKQoKICAgICMgZmluZCBjb25zZWN1dGl2ZSBhZGRyZXNzIHJhbmdlcyBpbiB0aGUgc29ydGVkIHNlcXVlbmNlIGFuZCBzdW1tYXJpemUgdGhlbQogICAgaWYgaXBzOgogICAgICAgIGZvciBmaXJzdCwgbGFzdCBpbiBfZmluZF9hZGRyZXNzX3JhbmdlKGlwcyk6CiAgICAgICAgICAgIGFkZHJzLmV4dGVuZChzdW1tYXJpemVfYWRkcmVzc19yYW5nZShmaXJzdCwgbGFzdCkpCgogICAgcmV0dXJuIF9jb2xsYXBzZV9hZGRyZXNzZXNfaW50ZXJuYWwoYWRkcnMgKyBuZXRzKQoKCmRlZiBnZXRfbWl4ZWRfdHlwZV9rZXkob2JqKToKICAgICIiIlJldHVybiBhIGtleSBzdWl0YWJsZSBmb3Igc29ydGluZyBiZXR3ZWVuIG5ldHdvcmtzIGFuZCBhZGRyZXNzZXMuCgogICAgQWRkcmVzcyBhbmQgTmV0d29yayBvYmplY3RzIGFyZSBub3Qgc29ydGFibGUgYnkgZGVmYXVsdDsgdGhleSdyZQogICAgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgc28gdGhlIGV4cHJlc3Npb24KCiAgICAgICAgSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMCcpIDw9IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKQoKICAgIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UuICBUaGVyZSBhcmUgc29tZSB0aW1lcyBob3dldmVyLCB3aGVyZSB5b3UgbWF5IHdpc2gKICAgIHRvIGhhdmUgaXBhZGRyZXNzIHNvcnQgdGhlc2UgZm9yIHlvdSBhbnl3YXkuIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsIHlvdQogICAgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBrZXk9IGFyZ3VtZW50IHRvIHNvcnRlZCgpLgoKICAgIEFyZ3M6CiAgICAgIG9iajogZWl0aGVyIGEgTmV0d29yayBvciBBZGRyZXNzIG9iamVjdC4KICAgIFJldHVybnM6CiAgICAgIGFwcHJvcHJpYXRlIGtleS4KCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBfQmFzZU5ldHdvcmspOgogICAgICAgIHJldHVybiBvYmouX2dldF9uZXR3b3Jrc19rZXkoKQogICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgX0Jhc2VBZGRyZXNzKToKICAgICAgICByZXR1cm4gb2JqLl9nZXRfYWRkcmVzc19rZXkoKQogICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgoKY2xhc3MgX0lQQWRkcmVzc0Jhc2UoX1RvdGFsT3JkZXJpbmdNaXhpbik6CgogICAgIiIiVGhlIG1vdGhlciBjbGFzcy4iIiIKCiAgICBfX3Nsb3RzX18gPSAoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4cGxvZGVkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbG9uZ2hhbmQgdmVyc2lvbiBvZiB0aGUgSVAgYWRkcmVzcyBhcyBhIHN0cmluZy4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fZXhwbG9kZV9zaG9ydGhhbmRfaXBfc3RyaW5nKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wcmVzc2VkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgc2hvcnRoYW5kIHZlcnNpb24gb2YgdGhlIElQIGFkZHJlc3MgYXMgYSBzdHJpbmcuIiIiCiAgICAgICAgcmV0dXJuIF9jb21wYXRfc3RyKHNlbGYpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmV2ZXJzZV9wb2ludGVyKHNlbGYpOgogICAgICAgICIiIlRoZSBuYW1lIG9mIHRoZSByZXZlcnNlIEROUyBwb2ludGVyIGZvciB0aGUgSVAgYWRkcmVzcywgZS5nLjoKICAgICAgICAgICAgPj4+IGlwYWRkcmVzcy5pcF9hZGRyZXNzKCIxMjcuMC4wLjEiKS5yZXZlcnNlX3BvaW50ZXIKICAgICAgICAgICAgJzEuMC4wLjEyNy5pbi1hZGRyLmFycGEnCiAgICAgICAgICAgID4+PiBpcGFkZHJlc3MuaXBfYWRkcmVzcygiMjAwMTpkYjg6OjEiKS5yZXZlcnNlX3BvaW50ZXIKICAgICAgICAgICAgJzEuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjguYi5kLjAuMS4wLjAuMi5pcDYuYXJwYScKCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3JldmVyc2VfcG9pbnRlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICBtc2cgPSAnJTIwMHMgaGFzIG5vIHZlcnNpb24gc3BlY2lmaWVkJyAlICh0eXBlKHNlbGYpLCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKG1zZykKCiAgICBkZWYgX2NoZWNrX2ludF9hZGRyZXNzKHNlbGYsIGFkZHJlc3MpOgogICAgICAgIGlmIGFkZHJlc3MgPCAwOgogICAgICAgICAgICBtc2cgPSAiJWQgKDwgMCkgaXMgbm90IHBlcm1pdHRlZCBhcyBhbiBJUHYlZCBhZGRyZXNzIgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoYWRkcmVzcywgc2VsZi5fdmVyc2lvbikpCiAgICAgICAgaWYgYWRkcmVzcyA+IHNlbGYuX0FMTF9PTkVTOgogICAgICAgICAgICBtc2cgPSAiJWQgKD49IDIqKiVkKSBpcyBub3QgcGVybWl0dGVkIGFzIGFuIElQdiVkIGFkZHJlc3MiCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChhZGRyZXNzLCBzZWxmLl9tYXhfcHJlZml4bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbikpCgogICAgZGVmIF9jaGVja19wYWNrZWRfYWRkcmVzcyhzZWxmLCBhZGRyZXNzLCBleHBlY3RlZF9sZW4pOgogICAgICAgIGFkZHJlc3NfbGVuID0gbGVuKGFkZHJlc3MpCiAgICAgICAgaWYgYWRkcmVzc19sZW4gIT0gZXhwZWN0ZWRfbGVuOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAnJXIgKGxlbiAlZCAhPSAlZCkgaXMgbm90IHBlcm1pdHRlZCBhcyBhbiBJUHYlZCBhZGRyZXNzLiAnCiAgICAgICAgICAgICAgICAnRGlkIHlvdSBwYXNzIGluIGEgYnl0ZXMgKHN0ciBpbiBQeXRob24gMikgaW5zdGVhZCBvZicKICAgICAgICAgICAgICAgICcgYSB1bmljb2RlIG9iamVjdD8nCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGFkZHJlc3MsIGFkZHJlc3NfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbGVuLCBzZWxmLl92ZXJzaW9uKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaXBfaW50X2Zyb21fcHJlZml4KGNscywgcHJlZml4bGVuKToKICAgICAgICAiIiJUdXJuIHRoZSBwcmVmaXggbGVuZ3RoIGludG8gYSBiaXR3aXNlIG5ldG1hc2sKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHJlZml4bGVuOiBBbiBpbnRlZ2VyLCB0aGUgcHJlZml4IGxlbmd0aC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50ZWdlci4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscy5fQUxMX09ORVMgXiAoY2xzLl9BTExfT05FUyA+PiBwcmVmaXhsZW4pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3ByZWZpeF9mcm9tX2lwX2ludChjbHMsIGlwX2ludCk6CiAgICAgICAgIiIiUmV0dXJuIHByZWZpeCBsZW5ndGggZnJvbSB0aGUgYml0d2lzZSBuZXRtYXNrLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9pbnQ6IEFuIGludGVnZXIsIHRoZSBuZXRtYXNrIGluIGV4cGFuZGVkIGJpdHdpc2UgZm9ybWF0CgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IElmIHRoZSBpbnB1dCBpbnRlcm1pbmdsZXMgemVyb2VzICYgb25lcwogICAgICAgICIiIgogICAgICAgIHRyYWlsaW5nX3plcm9lcyA9IF9jb3VudF9yaWdodGhhbmRfemVyb19iaXRzKGlwX2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuX21heF9wcmVmaXhsZW4pCiAgICAgICAgcHJlZml4bGVuID0gY2xzLl9tYXhfcHJlZml4bGVuIC0gdHJhaWxpbmdfemVyb2VzCiAgICAgICAgbGVhZGluZ19vbmVzID0gaXBfaW50ID4+IHRyYWlsaW5nX3plcm9lcwogICAgICAgIGFsbF9vbmVzID0gKDEgPDwgcHJlZml4bGVuKSAtIDEKICAgICAgICBpZiBsZWFkaW5nX29uZXMgIT0gYWxsX29uZXM6CiAgICAgICAgICAgIGJ5dGVzbGVuID0gY2xzLl9tYXhfcHJlZml4bGVuIC8vIDgKICAgICAgICAgICAgZGV0YWlscyA9IF9jb21wYXRfdG9fYnl0ZXMoaXBfaW50LCBieXRlc2xlbiwgJ2JpZycpCiAgICAgICAgICAgIG1zZyA9ICdOZXRtYXNrIHBhdHRlcm4gJXIgbWl4ZXMgemVyb2VzICYgb25lcycKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBkZXRhaWxzKQogICAgICAgIHJldHVybiBwcmVmaXhsZW4KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVwb3J0X2ludmFsaWRfbmV0bWFzayhjbHMsIG5ldG1hc2tfc3RyKToKICAgICAgICBtc2cgPSAnJXIgaXMgbm90IGEgdmFsaWQgbmV0bWFzaycgJSBuZXRtYXNrX3N0cgogICAgICAgIHJhaXNlIE5ldG1hc2tWYWx1ZUVycm9yKG1zZykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcHJlZml4X2Zyb21fcHJlZml4X3N0cmluZyhjbHMsIHByZWZpeGxlbl9zdHIpOgogICAgICAgICIiIlJldHVybiBwcmVmaXggbGVuZ3RoIGZyb20gYSBudW1lcmljIHN0cmluZwoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW5fc3RyOiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLCB0aGUgcHJlZml4IGxlbmd0aC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIG5ldG1hc2sKICAgICAgICAiIiIKICAgICAgICAjIGludCBhbGxvd3MgYSBsZWFkaW5nICsvLSBhcyB3ZWxsIGFzIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UsCiAgICAgICAgIyBzbyB3ZSBlbnN1cmUgdGhhdCBpc24ndCB0aGUgY2FzZQogICAgICAgIGlmIG5vdCBfQmFzZVY0Ll9ERUNJTUFMX0RJR0lUUy5pc3N1cGVyc2V0KHByZWZpeGxlbl9zdHIpOgogICAgICAgICAgICBjbHMuX3JlcG9ydF9pbnZhbGlkX25ldG1hc2socHJlZml4bGVuX3N0cikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByZWZpeGxlbiA9IGludChwcmVmaXhsZW5fc3RyKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBjbHMuX3JlcG9ydF9pbnZhbGlkX25ldG1hc2socHJlZml4bGVuX3N0cikKICAgICAgICBpZiBub3QgKDAgPD0gcHJlZml4bGVuIDw9IGNscy5fbWF4X3ByZWZpeGxlbik6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhwcmVmaXhsZW5fc3RyKQogICAgICAgIHJldHVybiBwcmVmaXhsZW4KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcHJlZml4X2Zyb21faXBfc3RyaW5nKGNscywgaXBfc3RyKToKICAgICAgICAiIiJUdXJuIGEgbmV0bWFzay9ob3N0bWFzayBzdHJpbmcgaW50byBhIHByZWZpeCBsZW5ndGgKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBUaGUgbmV0bWFzay9ob3N0bWFzayB0byBiZSBjb252ZXJ0ZWQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50ZWdlciwgdGhlIHByZWZpeCBsZW5ndGguCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgTmV0bWFza1ZhbHVlRXJyb3I6IElmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBuZXRtYXNrL2hvc3RtYXNrCiAgICAgICAgIiIiCiAgICAgICAgIyBQYXJzZSB0aGUgbmV0bWFzay9ob3N0bWFzayBsaWtlIGFuIElQIGFkZHJlc3MuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpcF9pbnQgPSBjbHMuX2lwX2ludF9mcm9tX3N0cmluZyhpcF9zdHIpCiAgICAgICAgZXhjZXB0IEFkZHJlc3NWYWx1ZUVycm9yOgogICAgICAgICAgICBjbHMuX3JlcG9ydF9pbnZhbGlkX25ldG1hc2soaXBfc3RyKQoKICAgICAgICAjIFRyeSBtYXRjaGluZyBhIG5ldG1hc2sgKHRoaXMgd291bGQgYmUgLzEqMCovIGFzIGEgYml0d2lzZSByZWdleHApLgogICAgICAgICMgTm90ZSB0aGF0IHRoZSB0d28gYW1iaWd1b3VzIGNhc2VzIChhbGwtb25lcyBhbmQgYWxsLXplcm9lcykgYXJlCiAgICAgICAgIyB0cmVhdGVkIGFzIG5ldG1hc2tzLgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGNscy5fcHJlZml4X2Zyb21faXBfaW50KGlwX2ludCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIEludmVydCB0aGUgYml0cywgYW5kIHRyeSBtYXRjaGluZyBhIC8wKzErLyBob3N0bWFzayBpbnN0ZWFkLgogICAgICAgIGlwX2ludCBePSBjbHMuX0FMTF9PTkVTCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gY2xzLl9wcmVmaXhfZnJvbV9pcF9pbnQoaXBfaW50KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBjbHMuX3JlcG9ydF9pbnZhbGlkX25ldG1hc2soaXBfc3RyKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKF9jb21wYXRfc3RyKHNlbGYpLCkKCgpjbGFzcyBfQmFzZUFkZHJlc3MoX0lQQWRkcmVzc0Jhc2UpOgoKICAgICIiIkEgZ2VuZXJpYyBJUCBvYmplY3QuCgogICAgVGhpcyBJUCBjbGFzcyBjb250YWlucyB0aGUgdmVyc2lvbiBpbmRlcGVuZGVudCBtZXRob2RzIHdoaWNoIGFyZQogICAgdXNlZCBieSBzaW5nbGUgSVAgYWRkcmVzc2VzLgogICAgIiIiCgogICAgX19zbG90c19fID0gKCkKCiAgICBkZWYgX19pbnRfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5faXAgPT0gb3RoZXIuX2lwIGFuZAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb24pCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0lQQWRkcmVzc0Jhc2UpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VBZGRyZXNzKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlJyAlICgKICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24nICUgKAogICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYuX2lwICE9IG90aGVyLl9pcDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2lwIDwgb3RoZXIuX2lwCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBTaG9ydGhhbmQgZm9yIEludGVnZXIgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLiBUaGlzIGlzIG5vdAogICAgIyBtZWFudCB0byBldmVyIHN1cHBvcnQgYWRkaXRpb24vc3VidHJhY3Rpb24gb2YgYWRkcmVzc2VzLgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhpbnQoc2VsZikgKyBvdGhlcikKCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGludChzZWxmKSAtIG90aGVyKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF9jb21wYXRfc3RyKHNlbGYpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfY29tcGF0X3N0cihzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChoZXgoaW50KHNlbGYuX2lwKSkpCgogICAgZGVmIF9nZXRfYWRkcmVzc19rZXkoc2VsZik6CiAgICAgICAgcmV0dXJuIChzZWxmLl92ZXJzaW9uLCBzZWxmKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKHNlbGYuX2lwLCkKCgpjbGFzcyBfQmFzZU5ldHdvcmsoX0lQQWRkcmVzc0Jhc2UpOgoKICAgICIiIkEgZ2VuZXJpYyBJUCBuZXR3b3JrIG9iamVjdC4KCiAgICBUaGlzIElQIGNsYXNzIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIGluZGVwZW5kZW50IG1ldGhvZHMgd2hpY2ggYXJlCiAgICB1c2VkIGJ5IG5ldHdvcmtzLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgIHNlbGYuX2NhY2hlID0ge30KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfY29tcGF0X3N0cihzZWxmKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5wcmVmaXhsZW4pCgogICAgZGVmIGhvc3RzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIEl0ZXJhdG9yIG92ZXIgdXNhYmxlIGhvc3RzIGluIGEgbmV0d29yay4KCiAgICAgICAgVGhpcyBpcyBsaWtlIF9faXRlcl9fIGV4Y2VwdCBpdCBkb2Vzbid0IHJldHVybiB0aGUgbmV0d29yawogICAgICAgIG9yIGJyb2FkY2FzdCBhZGRyZXNzZXMuCgogICAgICAgICIiIgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgZm9yIHggaW4gX2NvbXBhdF9yYW5nZShuZXR3b3JrICsgMSwgYnJvYWRjYXN0KToKICAgICAgICAgICAgeWllbGQgc2VsZi5fYWRkcmVzc19jbGFzcyh4KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGZvciB4IGluIF9jb21wYXRfcmFuZ2UobmV0d29yaywgYnJvYWRjYXN0ICsgMSk6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2FkZHJlc3NfY2xhc3MoeCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbik6CiAgICAgICAgbmV0d29yayA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICBpZiBuID49IDA6CiAgICAgICAgICAgIGlmIG5ldHdvcmsgKyBuID4gYnJvYWRjYXN0OgogICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkcmVzc19jbGFzcyhuZXR3b3JrICsgbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuICs9IDEKICAgICAgICAgICAgaWYgYnJvYWRjYXN0ICsgbiA8IG5ldHdvcms6CiAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRyZXNzX2NsYXNzKGJyb2FkY2FzdCArIG4pCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9JUEFkZHJlc3NCYXNlKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlTmV0d29yayk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZScgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICBpZiBzZWxmLm5ldHdvcmtfYWRkcmVzcyAhPSBvdGhlci5uZXR3b3JrX2FkZHJlc3M6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmtfYWRkcmVzcyA8IG90aGVyLm5ldHdvcmtfYWRkcmVzcwogICAgICAgIGlmIHNlbGYubmV0bWFzayAhPSBvdGhlci5uZXRtYXNrOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXRtYXNrIDwgb3RoZXIubmV0bWFzawogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl92ZXJzaW9uID09IG90aGVyLl92ZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID09IG90aGVyLm5ldHdvcmtfYWRkcmVzcyBhbmQKICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSA9PSBpbnQob3RoZXIubmV0bWFzaykpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSBeIGludChzZWxmLm5ldG1hc2spKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgb3RoZXIpOgogICAgICAgICMgYWx3YXlzIGZhbHNlIGlmIG9uZSBpcyB2NCBhbmQgdGhlIG90aGVyIGlzIHY2LgogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgbmV0d29yay4KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBfQmFzZU5ldHdvcmspOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIGFkZHJlc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGFkZHJlc3MKICAgICAgICAgICAgcmV0dXJuIChpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpIDw9IGludChvdGhlci5faXApIDw9CiAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpKQoKICAgIGRlZiBvdmVybGFwcyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiVGVsbCBpZiBzZWxmIGlzIHBhcnRseSBjb250YWluZWQgaW4gb3RoZXIuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYubmV0d29ya19hZGRyZXNzIGluIG90aGVyIG9yICgKICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcyBpbiBvdGhlciBvciAoCiAgICAgICAgICAgICAgICBvdGhlci5uZXR3b3JrX2FkZHJlc3MgaW4gc2VsZiBvciAoCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuYnJvYWRjYXN0X2FkZHJlc3MgaW4gc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJyb2FkY2FzdF9hZGRyZXNzKHNlbGYpOgogICAgICAgIHggPSBzZWxmLl9jYWNoZS5nZXQoJ2Jyb2FkY2FzdF9hZGRyZXNzJykKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHggPSBzZWxmLl9hZGRyZXNzX2NsYXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5ob3N0bWFzaykpCiAgICAgICAgICAgIHNlbGYuX2NhY2hlWydicm9hZGNhc3RfYWRkcmVzcyddID0geAogICAgICAgIHJldHVybiB4CgogICAgQHByb3BlcnR5CiAgICBkZWYgaG9zdG1hc2soc2VsZik6CiAgICAgICAgeCA9IHNlbGYuX2NhY2hlLmdldCgnaG9zdG1hc2snKQogICAgICAgIGlmIHggaXMgTm9uZToKICAgICAgICAgICAgeCA9IHNlbGYuX2FkZHJlc3NfY2xhc3MoaW50KHNlbGYubmV0bWFzaykgXiBzZWxmLl9BTExfT05FUykKICAgICAgICAgICAgc2VsZi5fY2FjaGVbJ2hvc3RtYXNrJ10gPSB4CiAgICAgICAgcmV0dXJuIHgKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX3ByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5fcHJlZml4bGVuKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfbmV0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5uZXRtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfaG9zdG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5uZXR3b3JrX2FkZHJlc3MsIHNlbGYuaG9zdG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgbnVtX2FkZHJlc3NlcyhzZWxmKToKICAgICAgICAiIiJOdW1iZXIgb2YgaG9zdHMgaW4gdGhlIGN1cnJlbnQgc3VibmV0LiIiIgogICAgICAgIHJldHVybiBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykgLSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICsgMQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9hZGRyZXNzX2NsYXNzKHNlbGYpOgogICAgICAgICMgUmV0dXJuaW5nIGJhcmUgYWRkcmVzcyBvYmplY3RzIChyYXRoZXIgdGhhbiBpbnRlcmZhY2VzKSBhbGxvd3MgZm9yCiAgICAgICAgIyBtb3JlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyB0aGUgbmV0d29yayBhZGRyZXNzLCBicm9hZGNhc3QKICAgICAgICAjIGFkZHJlc3MgYW5kIGluZGl2aWR1YWwgaG9zdCBhZGRyZXNzZXMuCiAgICAgICAgbXNnID0gJyUyMDBzIGhhcyBubyBhc3NvY2lhdGVkIGFkZHJlc3MgY2xhc3MnICUgKHR5cGUoc2VsZiksKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IobXNnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlZml4bGVuCgogICAgZGVmIGFkZHJlc3NfZXhjbHVkZShzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiUmVtb3ZlIGFuIGFkZHJlc3MgZnJvbSBhIGxhcmdlciBibG9jay4KCiAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBhZGRyMSA9IGlwX25ldHdvcmsoJzE5Mi4wLjIuMC8yOCcpCiAgICAgICAgICAgIGFkZHIyID0gaXBfbmV0d29yaygnMTkyLjAuMi4xLzMyJykKICAgICAgICAgICAgbGlzdChhZGRyMS5hZGRyZXNzX2V4Y2x1ZGUoYWRkcjIpKSA9CiAgICAgICAgICAgICAgICBbSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8zMicpLCBJUHY0TmV0d29yaygnMTkyLjAuMi4yLzMxJyksCiAgICAgICAgICAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuNC8zMCcpLCBJUHY0TmV0d29yaygnMTkyLjAuMi44LzI5JyldCgogICAgICAgIG9yIElQdjY6CgogICAgICAgICAgICBhZGRyMSA9IGlwX25ldHdvcmsoJzIwMDE6ZGI4OjoxLzMyJykKICAgICAgICAgICAgYWRkcjIgPSBpcF9uZXR3b3JrKCcyMDAxOmRiODo6MS8xMjgnKQogICAgICAgICAgICBsaXN0KGFkZHIxLmFkZHJlc3NfZXhjbHVkZShhZGRyMikpID0KICAgICAgICAgICAgICAgIFtpcF9uZXR3b3JrKCcyMDAxOmRiODo6MS8xMjgnKSwKICAgICAgICAgICAgICAgICBpcF9uZXR3b3JrKCcyMDAxOmRiODo6Mi8xMjcnKSwKICAgICAgICAgICAgICAgICBpcF9uZXR3b3JrKCcyMDAxOmRiODo6NC8xMjYnKSwKICAgICAgICAgICAgICAgICBpcF9uZXR3b3JrKCcyMDAxOmRiODo6OC8xMjUnKSwKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICBpcF9uZXR3b3JrKCcyMDAxOmRiODo4MDAwOjovMzMnKV0KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgb3RoZXI6IEFuIElQdjROZXR3b3JrIG9yIElQdjZOZXR3b3JrIG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpdGVyYXRvciBvZiB0aGUgSVB2KDR8NilOZXR3b3JrIG9iamVjdHMgd2hpY2ggaXMgc2VsZgogICAgICAgICAgICBtaW51cyBvdGhlci4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBUeXBlRXJyb3I6IElmIHNlbGYgYW5kIG90aGVyIGFyZSBvZiBkaWZmZXJpbmcgYWRkcmVzcwogICAgICAgICAgICAgIHZlcnNpb25zLCBvciBpZiBvdGhlciBpcyBub3QgYSBuZXR3b3JrIG9iamVjdC4KICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgb3RoZXIgaXMgbm90IGNvbXBsZXRlbHkgY29udGFpbmVkIGJ5IHNlbGYuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl92ZXJzaW9uID09IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24iICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VOZXR3b3JrKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBpcyBub3QgYSBuZXR3b3JrIG9iamVjdCIgJSBvdGhlcikKCiAgICAgICAgaWYgbm90IG90aGVyLnN1Ym5ldF9vZihzZWxmKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgbm90IGNvbnRhaW5lZCBpbiAlcycgJSAob3RoZXIsIHNlbGYpKQogICAgICAgIGlmIG90aGVyID09IHNlbGY6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBjb21wYXJpbmcgdGhlIG5ldHdvcmsgb2Ygb3RoZXIuCiAgICAgICAgb3RoZXIgPSBvdGhlci5fX2NsYXNzX18oJyVzLyVzJyAlIChvdGhlci5uZXR3b3JrX2FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5wcmVmaXhsZW4pKQoKICAgICAgICBzMSwgczIgPSBzZWxmLnN1Ym5ldHMoKQogICAgICAgIHdoaWxlIHMxICE9IG90aGVyIGFuZCBzMiAhPSBvdGhlcjoKICAgICAgICAgICAgaWYgb3RoZXIuc3VibmV0X29mKHMxKToKICAgICAgICAgICAgICAgIHlpZWxkIHMyCiAgICAgICAgICAgICAgICBzMSwgczIgPSBzMS5zdWJuZXRzKCkKICAgICAgICAgICAgZWxpZiBvdGhlci5zdWJuZXRfb2YoczIpOgogICAgICAgICAgICAgICAgeWllbGQgczEKICAgICAgICAgICAgICAgIHMxLCBzMiA9IHMyLnN1Ym5ldHMoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUncyBhIGJ1ZyBzb21ld2hlcmUuCiAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignRXJyb3IgcGVyZm9ybWluZyBleGNsdXNpb246ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzMTogJXMgczI6ICVzIG90aGVyOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMxLCBzMiwgb3RoZXIpKQogICAgICAgIGlmIHMxID09IG90aGVyOgogICAgICAgICAgICB5aWVsZCBzMgogICAgICAgIGVsaWYgczIgPT0gb3RoZXI6CiAgICAgICAgICAgIHlpZWxkIHMxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUncyBhIGJ1ZyBzb21ld2hlcmUuCiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdFcnJvciBwZXJmb3JtaW5nIGV4Y2x1c2lvbjogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnczE6ICVzIHMyOiAlcyBvdGhlcjogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMxLCBzMiwgb3RoZXIpKQoKICAgIGRlZiBjb21wYXJlX25ldHdvcmtzKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJDb21wYXJlIHR3byBJUCBvYmplY3RzLgoKICAgICAgICBUaGlzIGlzIG9ubHkgY29uY2VybmVkIGFib3V0IHRoZSBjb21wYXJpc29uIG9mIHRoZSBpbnRlZ2VyCiAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5ldHdvcmsgYWRkcmVzc2VzLiAgVGhpcyBtZWFucyB0aGF0IHRoZQogICAgICAgIGhvc3QgYml0cyBhcmVuJ3QgY29uc2lkZXJlZCBhdCBhbGwgaW4gdGhpcyBtZXRob2QuICBJZiB5b3Ugd2FudAogICAgICAgIHRvIGNvbXBhcmUgaG9zdCBiaXRzLCB5b3UgY2FuIGVhc2lseSBlbm91Z2ggZG8gYQogICAgICAgICdIb3N0QS5faXAgPCBIb3N0Qi5faXAnCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIG90aGVyOiBBbiBJUCBvYmplY3QuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIElmIHRoZSBJUCB2ZXJzaW9ucyBvZiBzZWxmIGFuZCBvdGhlciBhcmUgdGhlIHNhbWUsIHJldHVybnM6CgogICAgICAgICAgICAtMSBpZiBzZWxmIDwgb3RoZXI6CiAgICAgICAgICAgICAgZWc6IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKSA8IElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNScpCiAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpIDwKICAgICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoyMDAwLzEyNCcpCiAgICAgICAgICAgIDAgaWYgc2VsZiA9PSBvdGhlcgogICAgICAgICAgICAgIGVnOiBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JykgPT0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpCiAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpID09CiAgICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MTAwMC8xMjQnKQogICAgICAgICAgICAxIGlmIHNlbGYgPiBvdGhlcgogICAgICAgICAgICAgIGVnOiBJUHY0TmV0d29yaygnMTkyLjAuMi4xMjgvMjUnKSA+IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKQogICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjIwMDAvMTI0JykgPgogICAgICAgICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpCgogICAgICAgICAgUmFpc2VzOgogICAgICAgICAgICAgIFR5cGVFcnJvciBpZiB0aGUgSVAgdmVyc2lvbnMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgIiIiCiAgICAgICAgIyBkb2VzIHRoaXMgbmVlZCB0byByYWlzZSBhIFZhbHVlRXJyb3I/CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICAjIHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb24gYmVsb3cgaGVyZToKICAgICAgICBpZiBzZWxmLm5ldHdvcmtfYWRkcmVzcyA8IG90aGVyLm5ldHdvcmtfYWRkcmVzczoKICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgaWYgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPiBvdGhlci5uZXR3b3JrX2FkZHJlc3M6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgIyBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9PSBvdGhlci5uZXR3b3JrX2FkZHJlc3MgYmVsb3cgaGVyZToKICAgICAgICBpZiBzZWxmLm5ldG1hc2sgPCBvdGhlci5uZXRtYXNrOgogICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICBpZiBzZWxmLm5ldG1hc2sgPiBvdGhlci5uZXRtYXNrOgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIHJldHVybiAwCgogICAgZGVmIF9nZXRfbmV0d29ya3Nfa2V5KHNlbGYpOgogICAgICAgICIiIk5ldHdvcmstb25seSBrZXkgZnVuY3Rpb24uCgogICAgICAgIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaWRlbnRpZmllcyB0aGlzIGFkZHJlc3MnIG5ldHdvcmsgYW5kCiAgICAgICAgbmV0bWFzay4gVGhpcyBmdW5jdGlvbiBpcyBhIHN1aXRhYmxlICJrZXkiIGFyZ3VtZW50IGZvciBzb3J0ZWQoKQogICAgICAgIGFuZCBsaXN0LnNvcnQoKS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLl92ZXJzaW9uLCBzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5uZXRtYXNrKQoKICAgIGRlZiBzdWJuZXRzKHNlbGYsIHByZWZpeGxlbl9kaWZmPTEsIG5ld19wcmVmaXg9Tm9uZSk6CiAgICAgICAgIiIiVGhlIHN1Ym5ldHMgd2hpY2ggam9pbiB0byBtYWtlIHRoZSBjdXJyZW50IHN1Ym5ldC4KCiAgICAgICAgSW4gdGhlIGNhc2UgdGhhdCBzZWxmIGNvbnRhaW5zIG9ubHkgb25lIElQCiAgICAgICAgKHNlbGYuX3ByZWZpeGxlbiA9PSAzMiBmb3IgSVB2NCBvciBzZWxmLl9wcmVmaXhsZW4gPT0gMTI4CiAgICAgICAgZm9yIElQdjYpLCB5aWVsZCBhbiBpdGVyYXRvciB3aXRoIGp1c3Qgb3Vyc2VsZi4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHJlZml4bGVuX2RpZmY6IEFuIGludGVnZXIsIHRoZSBhbW91bnQgdGhlIHByZWZpeCBsZW5ndGgKICAgICAgICAgICAgICBzaG91bGQgYmUgaW5jcmVhc2VkIGJ5LiBUaGlzIHNob3VsZCBub3QgYmUgc2V0IGlmCiAgICAgICAgICAgICAgbmV3X3ByZWZpeCBpcyBhbHNvIHNldC4KICAgICAgICAgICAgbmV3X3ByZWZpeDogVGhlIGRlc2lyZWQgbmV3IHByZWZpeCBsZW5ndGguIFRoaXMgbXVzdCBiZSBhCiAgICAgICAgICAgICAgbGFyZ2VyIG51bWJlciAoc21hbGxlciBwcmVmaXgpIHRoYW4gdGhlIGV4aXN0aW5nIHByZWZpeC4KICAgICAgICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgc2V0IGlmIHByZWZpeGxlbl9kaWZmIGlzIGFsc28gc2V0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpdGVyYXRvciBvZiBJUHYoNHw2KSBvYmplY3RzLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IFRoZSBwcmVmaXhsZW5fZGlmZiBpcyB0b28gc21hbGwgb3IgdG9vIGxhcmdlLgogICAgICAgICAgICAgICAgT1IKICAgICAgICAgICAgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXggYXJlIGJvdGggc2V0IG9yIG5ld19wcmVmaXgKICAgICAgICAgICAgICBpcyBhIHNtYWxsZXIgbnVtYmVyIHRoYW4gdGhlIGN1cnJlbnQgcHJlZml4IChzbWFsbGVyCiAgICAgICAgICAgICAgbnVtYmVyIG1lYW5zIGEgbGFyZ2VyIG5ldHdvcmspCgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSBzZWxmLl9tYXhfcHJlZml4bGVuOgogICAgICAgICAgICB5aWVsZCBzZWxmCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBuZXdfcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBuZXdfcHJlZml4IDwgc2VsZi5fcHJlZml4bGVuOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmV3IHByZWZpeCBtdXN0IGJlIGxvbmdlcicpCiAgICAgICAgICAgIGlmIHByZWZpeGxlbl9kaWZmICE9IDE6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjYW5ub3Qgc2V0IHByZWZpeGxlbl9kaWZmIGFuZCBuZXdfcHJlZml4JykKICAgICAgICAgICAgcHJlZml4bGVuX2RpZmYgPSBuZXdfcHJlZml4IC0gc2VsZi5fcHJlZml4bGVuCgogICAgICAgIGlmIHByZWZpeGxlbl9kaWZmIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigncHJlZml4IGxlbmd0aCBkaWZmIG11c3QgYmUgPiAwJykKICAgICAgICBuZXdfcHJlZml4bGVuID0gc2VsZi5fcHJlZml4bGVuICsgcHJlZml4bGVuX2RpZmYKCiAgICAgICAgaWYgbmV3X3ByZWZpeGxlbiA+IHNlbGYuX21heF9wcmVmaXhsZW46CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAncHJlZml4IGxlbmd0aCBkaWZmICVkIGlzIGludmFsaWQgZm9yIG5ldGJsb2NrICVzJyAlICgKICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4bGVuLCBzZWxmKSkKCiAgICAgICAgc3RhcnQgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgZW5kID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpICsgMQogICAgICAgIHN0ZXAgPSAoaW50KHNlbGYuaG9zdG1hc2spICsgMSkgPj4gcHJlZml4bGVuX2RpZmYKICAgICAgICBmb3IgbmV3X2FkZHIgaW4gX2NvbXBhdF9yYW5nZShzdGFydCwgZW5kLCBzdGVwKToKICAgICAgICAgICAgY3VycmVudCA9IHNlbGYuX19jbGFzc19fKChuZXdfYWRkciwgbmV3X3ByZWZpeGxlbikpCiAgICAgICAgICAgIHlpZWxkIGN1cnJlbnQKCiAgICBkZWYgc3VwZXJuZXQoc2VsZiwgcHJlZml4bGVuX2RpZmY9MSwgbmV3X3ByZWZpeD1Ob25lKToKICAgICAgICAiIiJUaGUgc3VwZXJuZXQgY29udGFpbmluZyB0aGUgY3VycmVudCBuZXR3b3JrLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZjogQW4gaW50ZWdlciwgdGhlIGFtb3VudCB0aGUgcHJlZml4IGxlbmd0aCBvZgogICAgICAgICAgICAgIHRoZSBuZXR3b3JrIHNob3VsZCBiZSBkZWNyZWFzZWQgYnkuICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYQogICAgICAgICAgICAgIC8yNCBuZXR3b3JrIGFuZCBhIHByZWZpeGxlbl9kaWZmIG9mIDMsIGEgc3VwZXJuZXQgd2l0aCBhCiAgICAgICAgICAgICAgLzIxIG5ldG1hc2sgaXMgcmV0dXJuZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIElQdjQgbmV0d29yayBvYmplY3QuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgc2VsZi5wcmVmaXhsZW4gLSBwcmVmaXhsZW5fZGlmZiA8IDAuIEkuZS4sIHlvdSBoYXZlCiAgICAgICAgICAgICAgYSBuZWdhdGl2ZSBwcmVmaXggbGVuZ3RoLgogICAgICAgICAgICAgICAgT1IKICAgICAgICAgICAgSWYgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXggYXJlIGJvdGggc2V0IG9yIG5ld19wcmVmaXggaXMgYQogICAgICAgICAgICAgIGxhcmdlciBudW1iZXIgdGhhbiB0aGUgY3VycmVudCBwcmVmaXggKGxhcmdlciBudW1iZXIgbWVhbnMgYQogICAgICAgICAgICAgIHNtYWxsZXIgbmV0d29yaykKCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IDA6CiAgICAgICAgICAgIHJldHVybiBzZWxmCgogICAgICAgIGlmIG5ld19wcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG5ld19wcmVmaXggPiBzZWxmLl9wcmVmaXhsZW46CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduZXcgcHJlZml4IG11c3QgYmUgc2hvcnRlcicpCiAgICAgICAgICAgIGlmIHByZWZpeGxlbl9kaWZmICE9IDE6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjYW5ub3Qgc2V0IHByZWZpeGxlbl9kaWZmIGFuZCBuZXdfcHJlZml4JykKICAgICAgICAgICAgcHJlZml4bGVuX2RpZmYgPSBzZWxmLl9wcmVmaXhsZW4gLSBuZXdfcHJlZml4CgogICAgICAgIG5ld19wcmVmaXhsZW4gPSBzZWxmLnByZWZpeGxlbiAtIHByZWZpeGxlbl9kaWZmCiAgICAgICAgaWYgbmV3X3ByZWZpeGxlbiA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAnY3VycmVudCBwcmVmaXhsZW4gaXMgJWQsIGNhbm5vdCBoYXZlIGEgcHJlZml4bGVuX2RpZmYgb2YgJWQnICUKICAgICAgICAgICAgICAgIChzZWxmLnByZWZpeGxlbiwgcHJlZml4bGVuX2RpZmYpKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygoCiAgICAgICAgICAgIGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJiAoaW50KHNlbGYubmV0bWFzaykgPDwgcHJlZml4bGVuX2RpZmYpLAogICAgICAgICAgICBuZXdfcHJlZml4bGVuCiAgICAgICAgKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19tdWx0aWNhc3Qoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbXVsdGljYXN0IHVzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCiAgICAgICAgICAgIFNlZSBSRkMgMjM3MyAyLjcgZm9yIGRldGFpbHMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfbXVsdGljYXN0IGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19tdWx0aWNhc3QpCgogICAgZGVmIHN1Ym5ldF9vZihzZWxmLCBvdGhlcik6CiAgICAgICAgIyBhbHdheXMgZmFsc2UgaWYgb25lIGlzIHY0IGFuZCB0aGUgb3RoZXIgaXMgdjYuCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBuZXR3b3JrLgogICAgICAgIGlmIChoYXNhdHRyKG90aGVyLCAnbmV0d29ya19hZGRyZXNzJykgYW5kCiAgICAgICAgICAgICAgICBoYXNhdHRyKG90aGVyLCAnYnJvYWRjYXN0X2FkZHJlc3MnKSk6CiAgICAgICAgICAgIHJldHVybiAob3RoZXIubmV0d29ya19hZGRyZXNzIDw9IHNlbGYubmV0d29ya19hZGRyZXNzIGFuZAogICAgICAgICAgICAgICAgICAgIG90aGVyLmJyb2FkY2FzdF9hZGRyZXNzID49IHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBhZGRyZXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdVbmFibGUgdG8gdGVzdCBzdWJuZXQgY29udGFpbm1lbnQgd2l0aCBlbGVtZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0eXBlICVzJyAlIHR5cGUob3RoZXIpKQoKICAgIGRlZiBzdXBlcm5ldF9vZihzZWxmLCBvdGhlcik6CiAgICAgICAgIyBhbHdheXMgZmFsc2UgaWYgb25lIGlzIHY0IGFuZCB0aGUgb3RoZXIgaXMgdjYuCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBuZXR3b3JrLgogICAgICAgIGlmIChoYXNhdHRyKG90aGVyLCAnbmV0d29ya19hZGRyZXNzJykgYW5kCiAgICAgICAgICAgICAgICBoYXNhdHRyKG90aGVyLCAnYnJvYWRjYXN0X2FkZHJlc3MnKSk6CiAgICAgICAgICAgIHJldHVybiAob3RoZXIubmV0d29ya19hZGRyZXNzID49IHNlbGYubmV0d29ya19hZGRyZXNzIGFuZAogICAgICAgICAgICAgICAgICAgIG90aGVyLmJyb2FkY2FzdF9hZGRyZXNzIDw9IHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBhZGRyZXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdVbmFibGUgdG8gdGVzdCBzdWJuZXQgY29udGFpbm1lbnQgd2l0aCBlbGVtZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0eXBlICVzJyAlIHR5cGUob3RoZXIpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Jlc2VydmVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgb3RoZXJ3aXNlIElFVEYgcmVzZXJ2ZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gb25lIG9mIHRoZQogICAgICAgICAgICByZXNlcnZlZCBJUHY2IE5ldHdvcmsgcmFuZ2VzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3Jlc2VydmVkIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19yZXNlcnZlZCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19saW5rX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIGxpbmstbG9jYWwuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIgUkZDIDQyOTEuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfbGlua19sb2NhbCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfbGlua19sb2NhbCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcml2YXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHJpdmF0ZSBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeSBvciBpYW5hLWlwdjYtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19wcml2YXRlIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19wcml2YXRlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHB1YmxpYyBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY0LXNwZWNpYWwtcmVnaXN0cnkgb3IgaWFuYS1pcHY2LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBub3Qgc2VsZi5pc19wcml2YXRlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoaXMgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgMjM3MyAyLjUuMi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc191bnNwZWNpZmllZCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfdW5zcGVjaWZpZWQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbG9vcGJhY2soc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgMjM3MyAyLjUuMy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19sb29wYmFjayBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfbG9vcGJhY2spCgoKY2xhc3MgX0Jhc2VWNChvYmplY3QpOgoKICAgICIiIkJhc2UgSVB2NCBvYmplY3QuCgogICAgVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIGJ5IElQdjQgb2JqZWN0cyBpbiBib3RoIHNpbmdsZSBJUAogICAgYWRkcmVzc2VzIGFuZCBuZXR3b3Jrcy4KCiAgICAiIiIKCiAgICBfX3Nsb3RzX18gPSAoKQogICAgX3ZlcnNpb24gPSA0CiAgICAjIEVxdWl2YWxlbnQgdG8gMjU1LjI1NS4yNTUuMjU1IG9yIDMyIGJpdHMgb2YgMSdzLgogICAgX0FMTF9PTkVTID0gKDIgKiogSVBWNExFTkdUSCkgLSAxCiAgICBfREVDSU1BTF9ESUdJVFMgPSBmcm96ZW5zZXQoJzAxMjM0NTY3ODknKQoKICAgICMgdGhlIHZhbGlkIG9jdGV0cyBmb3IgaG9zdCBhbmQgbmV0bWFza3MuIG9ubHkgdXNlZnVsIGZvciBJUHY0LgogICAgX3ZhbGlkX21hc2tfb2N0ZXRzID0gZnJvemVuc2V0KFsyNTUsIDI1NCwgMjUyLCAyNDgsIDI0MCwgMjI0LCAxOTIsIDEyOCwgMF0pCgogICAgX21heF9wcmVmaXhsZW4gPSBJUFY0TEVOR1RICiAgICAjIFRoZXJlIGFyZSBvbmx5IGEgaGFuZGZ1bCBvZiB2YWxpZCB2NCBuZXRtYXNrcywgc28gd2UgY2FjaGUgdGhlbSBhbGwKICAgICMgd2hlbiBjb25zdHJ1Y3RlZCAoc2VlIF9tYWtlX25ldG1hc2soKSkuCiAgICBfbmV0bWFza19jYWNoZSA9IHt9CgogICAgZGVmIF9leHBsb2RlX3Nob3J0aGFuZF9pcF9zdHJpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIF9jb21wYXRfc3RyKHNlbGYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX21ha2VfbmV0bWFzayhjbHMsIGFyZyk6CiAgICAgICAgIiIiTWFrZSBhIChuZXRtYXNrLCBwcmVmaXhfbGVuKSB0dXBsZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudC4KCiAgICAgICAgQXJndW1lbnQgY2FuIGJlOgogICAgICAgIC0gYW4gaW50ZWdlciAodGhlIHByZWZpeCBsZW5ndGgpCiAgICAgICAgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZWZpeCBsZW5ndGggKGUuZy4gIjI0IikKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IG5ldG1hc2sgKGUuZy4gIjI1NS4yNTUuMjU1LjAiKQogICAgICAgICIiIgogICAgICAgIGlmIGFyZyBub3QgaW4gY2xzLl9uZXRtYXNrX2NhY2hlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICAgICAgcHJlZml4bGVuID0gYXJnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBuZXRtYXNrIGluIHByZWZpeCBsZW5ndGggZm9ybQogICAgICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGNscy5fcHJlZml4X2Zyb21fcHJlZml4X3N0cmluZyhhcmcpCiAgICAgICAgICAgICAgICBleGNlcHQgTmV0bWFza1ZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBuZXRtYXNrIG9yIGhvc3RtYXNrIGluIGRvdHRlZC1xdWFkIGZvcm0uCiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIG1heSByYWlzZSBOZXRtYXNrVmFsdWVFcnJvci4KICAgICAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX3ByZWZpeF9mcm9tX2lwX3N0cmluZyhhcmcpCiAgICAgICAgICAgIG5ldG1hc2sgPSBJUHY0QWRkcmVzcyhjbHMuX2lwX2ludF9mcm9tX3ByZWZpeChwcmVmaXhsZW4pKQogICAgICAgICAgICBjbHMuX25ldG1hc2tfY2FjaGVbYXJnXSA9IG5ldG1hc2ssIHByZWZpeGxlbgogICAgICAgIHJldHVybiBjbHMuX25ldG1hc2tfY2FjaGVbYXJnXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9pcF9pbnRfZnJvbV9zdHJpbmcoY2xzLCBpcF9zdHIpOgogICAgICAgICIiIlR1cm4gdGhlIGdpdmVuIElQIHN0cmluZyBpbnRvIGFuIGludGVnZXIgZm9yIGNvbXBhcmlzb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogQSBzdHJpbmcsIHRoZSBJUCBpcF9zdHIuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBJUCBpcF9zdHIgYXMgYW4gaW50ZWdlci4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogaWYgaXBfc3RyIGlzbid0IGEgdmFsaWQgSVB2NCBBZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXBfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcignQWRkcmVzcyBjYW5ub3QgYmUgZW1wdHknKQoKICAgICAgICBvY3RldHMgPSBpcF9zdHIuc3BsaXQoJy4nKQogICAgICAgIGlmIGxlbihvY3RldHMpICE9IDQ6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCJFeHBlY3RlZCA0IG9jdGV0cyBpbiAlciIgJSBpcF9zdHIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzKAogICAgICAgICAgICAgICAgbWFwKGNscy5fcGFyc2Vfb2N0ZXQsIG9jdGV0cyksICdiaWcnKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIiVzIGluICVyIiAlIChleGMsIGlwX3N0cikpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX29jdGV0KGNscywgb2N0ZXRfc3RyKToKICAgICAgICAiIiJDb252ZXJ0IGEgZGVjaW1hbCBvY3RldCBpbnRvIGFuIGludGVnZXIuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIG9jdGV0X3N0cjogQSBzdHJpbmcsIHRoZSBudW1iZXIgdG8gcGFyc2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBvY3RldCBhcyBhbiBpbnRlZ2VyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBvY3RldCBpc24ndCBzdHJpY3RseSBhIGRlY2ltYWwgZnJvbSBbMC4uMjU1XS4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9jdGV0X3N0cjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW1wdHkgb2N0ZXQgbm90IHBlcm1pdHRlZCIpCiAgICAgICAgIyBXaGl0ZWxpc3QgdGhlIGNoYXJhY3RlcnMsIHNpbmNlIGludCgpIGFsbG93cyBhIGxvdCBvZiBiaXphcnJlIHN0dWZmLgogICAgICAgIGlmIG5vdCBjbHMuX0RFQ0lNQUxfRElHSVRTLmlzc3VwZXJzZXQob2N0ZXRfc3RyKToKICAgICAgICAgICAgbXNnID0gIk9ubHkgZGVjaW1hbCBkaWdpdHMgcGVybWl0dGVkIGluICVyIgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIG9jdGV0X3N0cikKICAgICAgICAjIFdlIGRvIHRoZSBsZW5ndGggY2hlY2sgc2Vjb25kLCBzaW5jZSB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgZXJyb3IKICAgICAgICAjIGlzIGxpa2VseSB0byBiZSBtb3JlIGluZm9ybWF0aXZlIGZvciB0aGUgdXNlcgogICAgICAgIGlmIGxlbihvY3RldF9zdHIpID4gMzoKICAgICAgICAgICAgbXNnID0gIkF0IG1vc3QgMyBjaGFyYWN0ZXJzIHBlcm1pdHRlZCBpbiAlciIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBvY3RldF9zdHIpCiAgICAgICAgIyBDb252ZXJ0IHRvIGludGVnZXIgKHdlIGtub3cgZGlnaXRzIGFyZSBsZWdhbCkKICAgICAgICBvY3RldF9pbnQgPSBpbnQob2N0ZXRfc3RyLCAxMCkKICAgICAgICAjIEFueSBvY3RldHMgdGhhdCBsb29rIGxpa2UgdGhleSAqbWlnaHQqIGJlIHdyaXR0ZW4gaW4gb2N0YWwsCiAgICAgICAgIyBhbmQgd2hpY2ggZG9uJ3QgbG9vayBleGFjdGx5IHRoZSBzYW1lIGluIGJvdGggb2N0YWwgYW5kCiAgICAgICAgIyBkZWNpbWFsIGFyZSByZWplY3RlZCBhcyBhbWJpZ3VvdXMKICAgICAgICBpZiBvY3RldF9pbnQgPiA3IGFuZCBvY3RldF9zdHJbMF0gPT0gJzAnOgogICAgICAgICAgICBtc2cgPSAiQW1iaWd1b3VzIChvY3RhbC9kZWNpbWFsKSB2YWx1ZSBpbiAlciBub3QgcGVybWl0dGVkIgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIG9jdGV0X3N0cikKICAgICAgICBpZiBvY3RldF9pbnQgPiAyNTU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9jdGV0ICVkICg+IDI1NSkgbm90IHBlcm1pdHRlZCIgJSBvY3RldF9pbnQpCiAgICAgICAgcmV0dXJuIG9jdGV0X2ludAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9zdHJpbmdfZnJvbV9pcF9pbnQoY2xzLCBpcF9pbnQpOgogICAgICAgICIiIlR1cm5zIGEgMzItYml0IGludGVnZXIgaW50byBkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbi4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfaW50OiBBbiBpbnRlZ2VyLCB0aGUgSVAgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIElQIGFkZHJlc3MgYXMgYSBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgbm90YXRpb24uCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnLicuam9pbihfY29tcGF0X3N0cihzdHJ1Y3QudW5wYWNrKGInIUInLCBiKVswXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIGJ5dGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBiIGluIF9jb21wYXRfdG9fYnl0ZXMoaXBfaW50LCA0LCAnYmlnJykpCgogICAgZGVmIF9pc19ob3N0bWFzayhzZWxmLCBpcF9zdHIpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIElQIHN0cmluZyBpcyBhIGhvc3RtYXNrIChyYXRoZXIgdGhhbiBhIG5ldG1hc2spLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IEEgc3RyaW5nLCB0aGUgcG90ZW50aWFsIGhvc3RtYXNrLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIElQIHN0cmluZyBpcyBhIGhvc3RtYXNrLgoKICAgICAgICAiIiIKICAgICAgICBiaXRzID0gaXBfc3RyLnNwbGl0KCcuJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gbWFwKGludCwgYml0cykgaWYgeCBpbiBzZWxmLl92YWxpZF9tYXNrX29jdGV0c10KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSBsZW4oYml0cyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIHBhcnRzWzBdIDwgcGFydHNbLTFdOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfcmV2ZXJzZV9wb2ludGVyKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgcmV2ZXJzZSBETlMgcG9pbnRlciBuYW1lIGZvciB0aGUgSVB2NCBhZGRyZXNzLgoKICAgICAgICBUaGlzIGltcGxlbWVudHMgdGhlIG1ldGhvZCBkZXNjcmliZWQgaW4gUkZDMTAzNSAzLjUuCgogICAgICAgICIiIgogICAgICAgIHJldmVyc2Vfb2N0ZXRzID0gX2NvbXBhdF9zdHIoc2VsZikuc3BsaXQoJy4nKVs6Oi0xXQogICAgICAgIHJldHVybiAnLicuam9pbihyZXZlcnNlX29jdGV0cykgKyAnLmluLWFkZHIuYXJwYScKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtYXhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tYXhfcHJlZml4bGVuCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKCmNsYXNzIElQdjRBZGRyZXNzKF9CYXNlVjQsIF9CYXNlQWRkcmVzcyk6CgogICAgIiIiUmVwcmVzZW50IGFuZCBtYW5pcHVsYXRlIHNpbmdsZSBJUHY0IEFkZHJlc3Nlcy4iIiIKCiAgICBfX3Nsb3RzX18gPSAoJ19pcCcsICdfX3dlYWtyZWZfXycpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgoKICAgICAgICAiIiIKICAgICAgICBBcmdzOgogICAgICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgSVAKCiAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbiBpbnRlZ2VyIGNhbiBiZSBwYXNzZWQsIHNvCiAgICAgICAgICAgICAgSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMScpID09IElQdjRBZGRyZXNzKDMyMjEyMjU5ODUpLgogICAgICAgICAgICAgIG9yLCBtb3JlIGdlbmVyYWxseQogICAgICAgICAgICAgIElQdjRBZGRyZXNzKGludChJUHY0QWRkcmVzcygnMTkyLjAuMi4xJykpKSA9PQogICAgICAgICAgICAgICAgSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMScpCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGlwYWRkcmVzcyBpc24ndCBhIHZhbGlkIElQdjQgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgIyBFZmZpY2llbnQgY29uc3RydWN0b3IgZnJvbSBpbnRlZ2VyLgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICBzZWxmLl9jaGVja19pbnRfYWRkcmVzcyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLl9pcCA9IGFkZHJlc3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQ29uc3RydWN0aW5nIGZyb20gYSBwYWNrZWQgYWRkcmVzcwogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgYnl0ZXMpOgogICAgICAgICAgICBzZWxmLl9jaGVja19wYWNrZWRfYWRkcmVzcyhhZGRyZXNzLCA0KQogICAgICAgICAgICBidnMgPSBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLl9pcCA9IF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzKGJ2cywgJ2JpZycpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFzc3VtZSBpbnB1dCBhcmd1bWVudCB0byBiZSBzdHJpbmcgb3IgYW55IG9iamVjdCByZXByZXNlbnRhdGlvbgogICAgICAgICMgd2hpY2ggY29udmVydHMgaW50byBhIGZvcm1hdHRlZCBJUCBzdHJpbmcuCiAgICAgICAgYWRkcl9zdHIgPSBfY29tcGF0X3N0cihhZGRyZXNzKQogICAgICAgIGlmICcvJyBpbiBhZGRyX3N0cjoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIlVuZXhwZWN0ZWQgJy8nIGluICVyIiAlIGFkZHJlc3MpCiAgICAgICAgc2VsZi5faXAgPSBzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoYWRkcl9zdHIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFja2VkKHNlbGYpOgogICAgICAgICIiIlRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhZGRyZXNzLiIiIgogICAgICAgIHJldHVybiB2NF9pbnRfdG9fcGFja2VkKHNlbGYuX2lwKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Jlc2VydmVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgb3RoZXJ3aXNlIElFVEYgcmVzZXJ2ZWQuCgogICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiB0aGUKICAgICAgICAgICAgIHJlc2VydmVkIElQdjQgTmV0d29yayByYW5nZS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9yZXNlcnZlZF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJpdmF0ZShzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHByaXZhdGUgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY0LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhbnkoc2VsZiBpbiBuZXQgZm9yIG5ldCBpbiBzZWxmLl9jb25zdGFudHMuX3ByaXZhdGVfbmV0d29ya3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYgbm90IGluIHNlbGYuX2NvbnN0YW50cy5fcHVibGljX25ldHdvcmsgYW5kCiAgICAgICAgICAgIG5vdCBzZWxmLmlzX3ByaXZhdGUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbXVsdGljYXN0KHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIG11bHRpY2FzdCB1c2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBtdWx0aWNhc3QuCiAgICAgICAgICAgIFNlZSBSRkMgMzE3MSBmb3IgZGV0YWlscy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9tdWx0aWNhc3RfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Vuc3BlY2lmaWVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgdW5zcGVjaWZpZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGlzIGlzIHRoZSB1bnNwZWNpZmllZCBhZGRyZXNzIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgUkZDIDU3MzUgMy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgPT0gc2VsZi5fY29uc3RhbnRzLl91bnNwZWNpZmllZF9hZGRyZXNzCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbG9vcGJhY2soc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIHBlciBSRkMgMzMzMC4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9sb29wYmFja19uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbGlua19sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBsaW5rLWxvY2FsLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbGluay1sb2NhbCBwZXIgUkZDIDM5MjcuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fbGlua2xvY2FsX25ldHdvcmsKCgpjbGFzcyBJUHY0SW50ZXJmYWNlKElQdjRBZGRyZXNzKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCAoYnl0ZXMsIF9jb21wYXRfaW50X3R5cGVzKSk6CiAgICAgICAgICAgIElQdjRBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjROZXR3b3JrKHNlbGYuX2lwKQogICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIHR1cGxlKToKICAgICAgICAgICAgSVB2NEFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkcmVzc1swXSkKICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IGludChhZGRyZXNzWzFdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWF4X3ByZWZpeGxlbgoKICAgICAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2NE5ldHdvcmsoYWRkcmVzcywgc3RyaWN0PUZhbHNlKQogICAgICAgICAgICBzZWxmLm5ldG1hc2sgPSBzZWxmLm5ldHdvcmsubmV0bWFzawogICAgICAgICAgICBzZWxmLmhvc3RtYXNrID0gc2VsZi5uZXR3b3JrLmhvc3RtYXNrCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBhZGRyID0gX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcykKICAgICAgICBJUHY0QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyWzBdKQoKICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY0TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5uZXR3b3JrLl9wcmVmaXhsZW4KCiAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICBzZWxmLmhvc3RtYXNrID0gc2VsZi5uZXR3b3JrLmhvc3RtYXNrCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lZCcgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmsucHJlZml4bGVuKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGFkZHJlc3NfZXF1YWwgPSBJUHY0QWRkcmVzcy5fX2VxX18oc2VsZiwgb3RoZXIpCiAgICAgICAgaWYgbm90IGFkZHJlc3NfZXF1YWwgb3IgYWRkcmVzc19lcXVhbCBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NfZXF1YWwKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmsgPT0gb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBBbiBpbnRlcmZhY2Ugd2l0aCBhbiBhc3NvY2lhdGVkIG5ldHdvcmsgaXMgTk9UIHRoZQogICAgICAgICAgICAjIHNhbWUgYXMgYW4gdW5hc3NvY2lhdGVkIGFkZHJlc3MuIFRoYXQncyB3aHkgdGhlIGhhc2gKICAgICAgICAgICAgIyB0YWtlcyB0aGUgZXh0cmEgaW5mbyBpbnRvIGFjY291bnQuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGFkZHJlc3NfbGVzcyA9IElQdjRBZGRyZXNzLl9fbHRfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBhZGRyZXNzX2xlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA8IG90aGVyLm5ldHdvcmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgV2UgKmRvKiBhbGxvdyBhZGRyZXNzZXMgYW5kIGludGVyZmFjZXMgdG8gYmUgc29ydGVkLiBUaGUKICAgICAgICAgICAgIyB1bmFzc29jaWF0ZWQgYWRkcmVzcyBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiBhbGwgaW50ZXJmYWNlcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcCBeIHNlbGYuX3ByZWZpeGxlbiBeIGludChzZWxmLm5ldHdvcmsubmV0d29ya19hZGRyZXNzKQoKICAgIF9fcmVkdWNlX18gPSBfSVBBZGRyZXNzQmFzZS5fX3JlZHVjZV9fCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXAoc2VsZik6CiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKHNlbGYuX2lwKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfbmV0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX2hvc3RtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3N0bWFzaykKCgpjbGFzcyBJUHY0TmV0d29yayhfQmFzZVY0LCBfQmFzZU5ldHdvcmspOgoKICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbmQgbWFuaXB1bGF0ZXMgMzItYml0IElQdjQgbmV0d29yayArIGFkZHJlc3Nlcy4uCgogICAgQXR0cmlidXRlczogW2V4YW1wbGVzIGZvciBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI3JyldCiAgICAgICAgLm5ldHdvcmtfYWRkcmVzczogSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMCcpCiAgICAgICAgLmhvc3RtYXNrOiBJUHY0QWRkcmVzcygnMC4wLjAuMzEnKQogICAgICAgIC5icm9hZGNhc3RfYWRkcmVzczogSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMzInKQogICAgICAgIC5uZXRtYXNrOiBJUHY0QWRkcmVzcygnMjU1LjI1NS4yNTUuMjI0JykKICAgICAgICAucHJlZml4bGVuOiAyNwoKICAgICIiIgogICAgIyBDbGFzcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhZGRyZXNzIG9iamVjdHMKICAgIF9hZGRyZXNzX2NsYXNzID0gSVB2NEFkZHJlc3MKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcywgc3RyaWN0PVRydWUpOgoKICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIG5ldyBJUHY0IG5ldHdvcmsgb2JqZWN0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgSVAgWyYgbmV0d29ya10uCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMC8yNCcKICAgICAgICAgICAgICAnMTkyLjAuMi4wLzI1NS4yNTUuMjU1LjAnCiAgICAgICAgICAgICAgJzE5Mi4wLjAuMi8wLjAuMC4yNTUnCiAgICAgICAgICAgICAgYXJlIGFsbCBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgaW4gSVB2NC4gU2ltaWxhcmx5LAogICAgICAgICAgICAgICcxOTIuMC4yLjEnCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMS8yNTUuMjU1LjI1NS4yNTUnCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMS8zMicKICAgICAgICAgICAgICBhcmUgYWxzbyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4gVGhhdCBpcyB0byBzYXksIGZhaWxpbmcgdG8KICAgICAgICAgICAgICBwcm92aWRlIGEgc3VibmV0bWFzayB3aWxsIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCBhIG1hc2sgb2YgLzMyLgoKICAgICAgICAgICAgICBJZiB0aGUgbWFzayAocG9ydGlvbiBhZnRlciB0aGUgLyBpbiB0aGUgYXJndW1lbnQpIGlzIGdpdmVuIGluCiAgICAgICAgICAgICAgZG90dGVkIHF1YWQgZm9ybSwgaXQgaXMgdHJlYXRlZCBhcyBhIG5ldG1hc2sgaWYgaXQgc3RhcnRzIHdpdGggYQogICAgICAgICAgICAgIG5vbi16ZXJvIGZpZWxkIChlLmcuIC8yNTUuMC4wLjAgPT0gLzgpIGFuZCBhcyBhIGhvc3RtYXNrIGlmIGl0CiAgICAgICAgICAgICAgc3RhcnRzIHdpdGggYSB6ZXJvIGZpZWxkIChlLmcuIDAuMjU1LjI1NS4yNTUgPT0gLzgpLCB3aXRoIHRoZQogICAgICAgICAgICAgIHNpbmdsZSBleGNlcHRpb24gb2YgYW4gYWxsLXplcm8gbWFzayB3aGljaCBpcyB0cmVhdGVkIGFzIGEKICAgICAgICAgICAgICBuZXRtYXNrID09IC8wLiBJZiBubyBtYXNrIGlzIGdpdmVuLCBhIGRlZmF1bHQgb2YgLzMyIGlzIHVzZWQuCgogICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYW4gaW50ZWdlciBjYW4gYmUgcGFzc2VkLCBzbwogICAgICAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjEnKSA9PSBJUHY0TmV0d29yaygzMjIxMjI1OTg1KQogICAgICAgICAgICAgIG9yLCBtb3JlIGdlbmVyYWxseQogICAgICAgICAgICAgIElQdjRJbnRlcmZhY2UoaW50KElQdjRJbnRlcmZhY2UoJzE5Mi4wLjIuMScpKSkgPT0KICAgICAgICAgICAgICAgIElQdjRJbnRlcmZhY2UoJzE5Mi4wLjIuMScpCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGlwYWRkcmVzcyBpc24ndCBhIHZhbGlkIElQdjQgYWRkcmVzcy4KICAgICAgICAgICAgTmV0bWFza1ZhbHVlRXJyb3I6IElmIHRoZSBuZXRtYXNrIGlzbid0IHZhbGlkIGZvcgogICAgICAgICAgICAgIGFuIElQdjQgYWRkcmVzcy4KICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgc3RyaWN0IGlzIFRydWUgYW5kIGEgbmV0d29yayBhZGRyZXNzIGlzIG5vdAogICAgICAgICAgICAgIHN1cHBsaWVkLgoKICAgICAgICAiIiIKICAgICAgICBfQmFzZU5ldHdvcmsuX19pbml0X18oc2VsZiwgYWRkcmVzcykKCiAgICAgICAgIyBDb25zdHJ1Y3RpbmcgZnJvbSBhIHBhY2tlZCBhZGRyZXNzIG9yIGludGVnZXIKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIChfY29tcGF0X2ludF90eXBlcywgYnl0ZXMpKToKICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzaygKICAgICAgICAgICAgICAgIHNlbGYuX21heF9wcmVmaXhsZW4pCiAgICAgICAgICAgICMgZml4bWU6IGFkZHJlc3MvbmV0d29yayB0ZXN0IGhlcmUuCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIHR1cGxlKToKICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKICAgICAgICAgICAgICAgIGFyZyA9IGFkZHJlc3NbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2Ugd2VyZW4ndCBnaXZlbiBhbiBhZGRyZXNzWzFdCiAgICAgICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3MoYWRkcmVzc1swXSkKICAgICAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQogICAgICAgICAgICBwYWNrZWQgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgICAgIGlmIHBhY2tlZCAmIGludChzZWxmLm5ldG1hc2spICE9IHBhY2tlZDoKICAgICAgICAgICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKHBhY2tlZCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHByZWZpeCBzdHJpbmcuCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCiAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoYWRkclswXSkpCgogICAgICAgIGlmIGxlbihhZGRyKSA9PSAyOgogICAgICAgICAgICBhcmcgPSBhZGRyWzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJnID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKGFyZykKCiAgICAgICAgaWYgc3RyaWN0OgogICAgICAgICAgICBpZiAoSVB2NEFkZHJlc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmIGludChzZWxmLm5ldG1hc2spKSAhPQogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIGhhcyBob3N0IGJpdHMgc2V0JyAlIHNlbGYpCiAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spKQoKICAgICAgICBpZiBzZWxmLl9wcmVmaXhsZW4gPT0gKHNlbGYuX21heF9wcmVmaXhsZW4gLSAxKToKICAgICAgICAgICAgc2VsZi5ob3N0cyA9IHNlbGYuX19pdGVyX18KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwdWJsaWMgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2NC1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKG5vdCAoc2VsZi5uZXR3b3JrX2FkZHJlc3MgaW4gSVB2NE5ldHdvcmsoJzEwMC42NC4wLjAvMTAnKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MgaW4gSVB2NE5ldHdvcmsoJzEwMC42NC4wLjAvMTAnKSkgYW5kCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5pc19wcml2YXRlKQoKCmNsYXNzIF9JUHY0Q29uc3RhbnRzKG9iamVjdCk6CgogICAgX2xpbmtsb2NhbF9uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzE2OS4yNTQuMC4wLzE2JykKCiAgICBfbG9vcGJhY2tfbmV0d29yayA9IElQdjROZXR3b3JrKCcxMjcuMC4wLjAvOCcpCgogICAgX211bHRpY2FzdF9uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzIyNC4wLjAuMC80JykKCiAgICBfcHVibGljX25ldHdvcmsgPSBJUHY0TmV0d29yaygnMTAwLjY0LjAuMC8xMCcpCgogICAgX3ByaXZhdGVfbmV0d29ya3MgPSBbCiAgICAgICAgSVB2NE5ldHdvcmsoJzAuMC4wLjAvOCcpLAogICAgICAgIElQdjROZXR3b3JrKCcxMC4wLjAuMC84JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzEyNy4wLjAuMC84JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE2OS4yNTQuMC4wLzE2JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE3Mi4xNi4wLjAvMTInKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMC4wLzI5JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjAuMTcwLzMxJyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTIuMTY4LjAuMC8xNicpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTguMTguMC4wLzE1JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5OC41MS4xMDAuMC8yNCcpLAogICAgICAgIElQdjROZXR3b3JrKCcyMDMuMC4xMTMuMC8yNCcpLAogICAgICAgIElQdjROZXR3b3JrKCcyNDAuMC4wLjAvNCcpLAogICAgICAgIElQdjROZXR3b3JrKCcyNTUuMjU1LjI1NS4yNTUvMzInKSwKICAgIF0KCiAgICBfcmVzZXJ2ZWRfbmV0d29yayA9IElQdjROZXR3b3JrKCcyNDAuMC4wLjAvNCcpCgogICAgX3Vuc3BlY2lmaWVkX2FkZHJlc3MgPSBJUHY0QWRkcmVzcygnMC4wLjAuMCcpCgoKSVB2NEFkZHJlc3MuX2NvbnN0YW50cyA9IF9JUHY0Q29uc3RhbnRzCgoKY2xhc3MgX0Jhc2VWNihvYmplY3QpOgoKICAgICIiIkJhc2UgSVB2NiBvYmplY3QuCgogICAgVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIGJ5IElQdjYgb2JqZWN0cyBpbiBib3RoIHNpbmdsZSBJUAogICAgYWRkcmVzc2VzIGFuZCBuZXR3b3Jrcy4KCiAgICAiIiIKCiAgICBfX3Nsb3RzX18gPSAoKQogICAgX3ZlcnNpb24gPSA2CiAgICBfQUxMX09ORVMgPSAoMiAqKiBJUFY2TEVOR1RIKSAtIDEKICAgIF9IRVhURVRfQ09VTlQgPSA4CiAgICBfSEVYX0RJR0lUUyA9IGZyb3plbnNldCgnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZicpCiAgICBfbWF4X3ByZWZpeGxlbiA9IElQVjZMRU5HVEgKCiAgICAjIFRoZXJlIGFyZSBvbmx5IGEgYnVuY2ggb2YgdmFsaWQgdjYgbmV0bWFza3MsIHNvIHdlIGNhY2hlIHRoZW0gYWxsCiAgICAjIHdoZW4gY29uc3RydWN0ZWQgKHNlZSBfbWFrZV9uZXRtYXNrKCkpLgogICAgX25ldG1hc2tfY2FjaGUgPSB7fQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9tYWtlX25ldG1hc2soY2xzLCBhcmcpOgogICAgICAgICIiIk1ha2UgYSAobmV0bWFzaywgcHJlZml4X2xlbikgdHVwbGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnQuCgogICAgICAgIEFyZ3VtZW50IGNhbiBiZToKICAgICAgICAtIGFuIGludGVnZXIgKHRoZSBwcmVmaXggbGVuZ3RoKQogICAgICAgIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggbGVuZ3RoIChlLmcuICIyNCIpCiAgICAgICAgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZWZpeCBuZXRtYXNrIChlLmcuICIyNTUuMjU1LjI1NS4wIikKICAgICAgICAiIiIKICAgICAgICBpZiBhcmcgbm90IGluIGNscy5fbmV0bWFza19jYWNoZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGFyZwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJlZml4bGVuID0gY2xzLl9wcmVmaXhfZnJvbV9wcmVmaXhfc3RyaW5nKGFyZykKICAgICAgICAgICAgbmV0bWFzayA9IElQdjZBZGRyZXNzKGNscy5faXBfaW50X2Zyb21fcHJlZml4KHByZWZpeGxlbikpCiAgICAgICAgICAgIGNscy5fbmV0bWFza19jYWNoZVthcmddID0gbmV0bWFzaywgcHJlZml4bGVuCiAgICAgICAgcmV0dXJuIGNscy5fbmV0bWFza19jYWNoZVthcmddCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2lwX2ludF9mcm9tX3N0cmluZyhjbHMsIGlwX3N0cik6CiAgICAgICAgIiIiVHVybiBhbiBJUHY2IGlwX3N0ciBpbnRvIGFuIGludGVnZXIuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogQSBzdHJpbmcsIHRoZSBJUHY2IGlwX3N0ci4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50LCB0aGUgSVB2NiBhZGRyZXNzCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IGlmIGlwX3N0ciBpc24ndCBhIHZhbGlkIElQdjYgQWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlwX3N0cjoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoJ0FkZHJlc3MgY2Fubm90IGJlIGVtcHR5JykKCiAgICAgICAgcGFydHMgPSBpcF9zdHIuc3BsaXQoJzonKQoKICAgICAgICAjIEFuIElQdjYgYWRkcmVzcyBuZWVkcyBhdCBsZWFzdCAyIGNvbG9ucyAoMyBwYXJ0cykuCiAgICAgICAgX21pbl9wYXJ0cyA9IDMKICAgICAgICBpZiBsZW4ocGFydHMpIDwgX21pbl9wYXJ0czoKICAgICAgICAgICAgbXNnID0gIkF0IGxlYXN0ICVkIHBhcnRzIGV4cGVjdGVkIGluICVyIiAlIChfbWluX3BhcnRzLCBpcF9zdHIpCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZykKCiAgICAgICAgIyBJZiB0aGUgYWRkcmVzcyBoYXMgYW4gSVB2NC1zdHlsZSBzdWZmaXgsIGNvbnZlcnQgaXQgdG8gaGV4YWRlY2ltYWwuCiAgICAgICAgaWYgJy4nIGluIHBhcnRzWy0xXToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXB2NF9pbnQgPSBJUHY0QWRkcmVzcyhwYXJ0cy5wb3AoKSkuX2lwCiAgICAgICAgICAgIGV4Y2VwdCBBZGRyZXNzVmFsdWVFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiJXMgaW4gJXIiICUgKGV4YywgaXBfc3RyKSkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcleCcgJSAoKGlwdjRfaW50ID4+IDE2KSAmIDB4RkZGRikpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJXgnICUgKGlwdjRfaW50ICYgMHhGRkZGKSkKCiAgICAgICAgIyBBbiBJUHY2IGFkZHJlc3MgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gOCBjb2xvbnMgKDkgcGFydHMpLgogICAgICAgICMgVGhlIGV4dHJhIGNvbG9uIGNvbWVzIGZyb20gdXNpbmcgdGhlICI6OiIgbm90YXRpb24gZm9yIGEgc2luZ2xlCiAgICAgICAgIyBsZWFkaW5nIG9yIHRyYWlsaW5nIHplcm8gcGFydC4KICAgICAgICBfbWF4X3BhcnRzID0gY2xzLl9IRVhURVRfQ09VTlQgKyAxCiAgICAgICAgaWYgbGVuKHBhcnRzKSA+IF9tYXhfcGFydHM6CiAgICAgICAgICAgIG1zZyA9ICJBdCBtb3N0ICVkIGNvbG9ucyBwZXJtaXR0ZWQgaW4gJXIiICUgKAogICAgICAgICAgICAgICAgX21heF9wYXJ0cyAtIDEsIGlwX3N0cikKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnKQoKICAgICAgICAjIERpc3JlZ2FyZGluZyB0aGUgZW5kcG9pbnRzLCBmaW5kICc6Oicgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uCiAgICAgICAgIyBUaGlzIGluZGljYXRlcyB0aGF0IGEgcnVuIG9mIHplcm9lcyBoYXMgYmVlbiBza2lwcGVkLgogICAgICAgIHNraXBfaW5kZXggPSBOb25lCiAgICAgICAgZm9yIGkgaW4gX2NvbXBhdF9yYW5nZSgxLCBsZW4ocGFydHMpIC0gMSk6CiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1tpXToKICAgICAgICAgICAgICAgIGlmIHNraXBfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIyBDYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgJzo6JwogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJBdCBtb3N0IG9uZSAnOjonIHBlcm1pdHRlZCBpbiAlciIgJSBpcF9zdHIKICAgICAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cpCiAgICAgICAgICAgICAgICBza2lwX2luZGV4ID0gaQoKICAgICAgICAjIHBhcnRzX2hpIGlzIHRoZSBudW1iZXIgb2YgcGFydHMgdG8gY29weSBmcm9tIGFib3ZlL2JlZm9yZSB0aGUgJzo6JwogICAgICAgICMgcGFydHNfbG8gaXMgdGhlIG51bWJlciBvZiBwYXJ0cyB0byBjb3B5IGZyb20gYmVsb3cvYWZ0ZXIgdGhlICc6OicKICAgICAgICBpZiBza2lwX2luZGV4IGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIElmIHdlIGZvdW5kIGEgJzo6JywgdGhlbiBjaGVjayBpZiBpdCBhbHNvIGNvdmVycyB0aGUgZW5kcG9pbnRzLgogICAgICAgICAgICBwYXJ0c19oaSA9IHNraXBfaW5kZXgKICAgICAgICAgICAgcGFydHNfbG8gPSBsZW4ocGFydHMpIC0gc2tpcF9pbmRleCAtIDEKICAgICAgICAgICAgaWYgbm90IHBhcnRzWzBdOgogICAgICAgICAgICAgICAgcGFydHNfaGkgLT0gMQogICAgICAgICAgICAgICAgaWYgcGFydHNfaGk6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gIkxlYWRpbmcgJzonIG9ubHkgcGVybWl0dGVkIGFzIHBhcnQgb2YgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSBpcF9zdHIpICAjIF46IHJlcXVpcmVzIF46OgogICAgICAgICAgICBpZiBub3QgcGFydHNbLTFdOgogICAgICAgICAgICAgICAgcGFydHNfbG8gLT0gMQogICAgICAgICAgICAgICAgaWYgcGFydHNfbG86CiAgICAgICAgICAgICAgICAgICAgbXNnID0gIlRyYWlsaW5nICc6JyBvbmx5IHBlcm1pdHRlZCBhcyBwYXJ0IG9mICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyA6JCByZXF1aXJlcyA6OiQKICAgICAgICAgICAgcGFydHNfc2tpcHBlZCA9IGNscy5fSEVYVEVUX0NPVU5UIC0gKHBhcnRzX2hpICsgcGFydHNfbG8pCiAgICAgICAgICAgIGlmIHBhcnRzX3NraXBwZWQgPCAxOgogICAgICAgICAgICAgICAgbXNnID0gIkV4cGVjdGVkIGF0IG1vc3QgJWQgb3RoZXIgcGFydHMgd2l0aCAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGNscy5fSEVYVEVUX0NPVU5UIC0gMSwgaXBfc3RyKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSwgYWxsb2NhdGUgdGhlIGVudGlyZSBhZGRyZXNzIHRvIHBhcnRzX2hpLiAgVGhlCiAgICAgICAgICAgICMgZW5kcG9pbnRzIGNvdWxkIHN0aWxsIGJlIGVtcHR5LCBidXQgX3BhcnNlX2hleHRldCgpIHdpbGwgY2hlY2sKICAgICAgICAgICAgIyBmb3IgdGhhdC4KICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSBjbHMuX0hFWFRFVF9DT1VOVDoKICAgICAgICAgICAgICAgIG1zZyA9ICJFeGFjdGx5ICVkIHBhcnRzIGV4cGVjdGVkIHdpdGhvdXQgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChjbHMuX0hFWFRFVF9DT1VOVCwgaXBfc3RyKSkKICAgICAgICAgICAgaWYgbm90IHBhcnRzWzBdOgogICAgICAgICAgICAgICAgbXNnID0gIkxlYWRpbmcgJzonIG9ubHkgcGVybWl0dGVkIGFzIHBhcnQgb2YgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIGlwX3N0cikgICMgXjogcmVxdWlyZXMgXjo6CiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1stMV06CiAgICAgICAgICAgICAgICBtc2cgPSAiVHJhaWxpbmcgJzonIG9ubHkgcGVybWl0dGVkIGFzIHBhcnQgb2YgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIGlwX3N0cikgICMgOiQgcmVxdWlyZXMgOjokCiAgICAgICAgICAgIHBhcnRzX2hpID0gbGVuKHBhcnRzKQogICAgICAgICAgICBwYXJ0c19sbyA9IDAKICAgICAgICAgICAgcGFydHNfc2tpcHBlZCA9IDAKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIE5vdywgcGFyc2UgdGhlIGhleHRldHMgaW50byBhIDEyOC1iaXQgaW50ZWdlci4KICAgICAgICAgICAgaXBfaW50ID0gMAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShwYXJ0c19oaSk6CiAgICAgICAgICAgICAgICBpcF9pbnQgPDw9IDE2CiAgICAgICAgICAgICAgICBpcF9pbnQgfD0gY2xzLl9wYXJzZV9oZXh0ZXQocGFydHNbaV0pCiAgICAgICAgICAgIGlwX2ludCA8PD0gMTYgKiBwYXJ0c19za2lwcGVkCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKC1wYXJ0c19sbywgMCk6CiAgICAgICAgICAgICAgICBpcF9pbnQgPDw9IDE2CiAgICAgICAgICAgICAgICBpcF9pbnQgfD0gY2xzLl9wYXJzZV9oZXh0ZXQocGFydHNbaV0pCiAgICAgICAgICAgIHJldHVybiBpcF9pbnQKICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCIlcyBpbiAlciIgJSAoZXhjLCBpcF9zdHIpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9oZXh0ZXQoY2xzLCBoZXh0ZXRfc3RyKToKICAgICAgICAiIiJDb252ZXJ0IGFuIElQdjYgaGV4dGV0IHN0cmluZyBpbnRvIGFuIGludGVnZXIuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGhleHRldF9zdHI6IEEgc3RyaW5nLCB0aGUgbnVtYmVyIHRvIHBhcnNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgaGV4dGV0IGFzIGFuIGludGVnZXIuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIGlucHV0IGlzbid0IHN0cmljdGx5IGEgaGV4IG51bWJlciBmcm9tCiAgICAgICAgICAgICAgWzAuLkZGRkZdLgoKICAgICAgICAiIiIKICAgICAgICAjIFdoaXRlbGlzdCB0aGUgY2hhcmFjdGVycywgc2luY2UgaW50KCkgYWxsb3dzIGEgbG90IG9mIGJpemFycmUgc3R1ZmYuCiAgICAgICAgaWYgbm90IGNscy5fSEVYX0RJR0lUUy5pc3N1cGVyc2V0KGhleHRldF9zdHIpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJPbmx5IGhleCBkaWdpdHMgcGVybWl0dGVkIGluICVyIiAlIGhleHRldF9zdHIpCiAgICAgICAgIyBXZSBkbyB0aGUgbGVuZ3RoIGNoZWNrIHNlY29uZCwgc2luY2UgdGhlIGludmFsaWQgY2hhcmFjdGVyIGVycm9yCiAgICAgICAgIyBpcyBsaWtlbHkgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZSBmb3IgdGhlIHVzZXIKICAgICAgICBpZiBsZW4oaGV4dGV0X3N0cikgPiA0OgogICAgICAgICAgICBtc2cgPSAiQXQgbW9zdCA0IGNoYXJhY3RlcnMgcGVybWl0dGVkIGluICVyIgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIGhleHRldF9zdHIpCiAgICAgICAgIyBMZW5ndGggY2hlY2sgbWVhbnMgd2UgY2FuIHNraXAgY2hlY2tpbmcgdGhlIGludGVnZXIgdmFsdWUKICAgICAgICByZXR1cm4gaW50KGhleHRldF9zdHIsIDE2KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9jb21wcmVzc19oZXh0ZXRzKGNscywgaGV4dGV0cyk6CiAgICAgICAgIiIiQ29tcHJlc3NlcyBhIGxpc3Qgb2YgaGV4dGV0cy4KCiAgICAgICAgQ29tcHJlc3NlcyBhIGxpc3Qgb2Ygc3RyaW5ncywgcmVwbGFjaW5nIHRoZSBsb25nZXN0IGNvbnRpbnVvdXMKICAgICAgICBzZXF1ZW5jZSBvZiAiMCIgaW4gdGhlIGxpc3Qgd2l0aCAiIiBhbmQgYWRkaW5nIGVtcHR5IHN0cmluZ3MgYXQKICAgICAgICB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBzdWNoIHRoYXQgc3Vic2VxdWVudGx5CiAgICAgICAgY2FsbGluZyAiOiIuam9pbihoZXh0ZXRzKSB3aWxsIHByb2R1Y2UgdGhlIGNvbXByZXNzZWQgdmVyc2lvbiBvZgogICAgICAgIHRoZSBJUHY2IGFkZHJlc3MuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGhleHRldHM6IEEgbGlzdCBvZiBzdHJpbmdzLCB0aGUgaGV4dGV0cyB0byBjb21wcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBsaXN0IG9mIHN0cmluZ3MuCgogICAgICAgICIiIgogICAgICAgIGJlc3RfZG91YmxlY29sb25fc3RhcnQgPSAtMQogICAgICAgIGJlc3RfZG91YmxlY29sb25fbGVuID0gMAogICAgICAgIGRvdWJsZWNvbG9uX3N0YXJ0ID0gLTEKICAgICAgICBkb3VibGVjb2xvbl9sZW4gPSAwCiAgICAgICAgZm9yIGluZGV4LCBoZXh0ZXQgaW4gZW51bWVyYXRlKGhleHRldHMpOgogICAgICAgICAgICBpZiBoZXh0ZXQgPT0gJzAnOgogICAgICAgICAgICAgICAgZG91YmxlY29sb25fbGVuICs9IDEKICAgICAgICAgICAgICAgIGlmIGRvdWJsZWNvbG9uX3N0YXJ0ID09IC0xOgogICAgICAgICAgICAgICAgICAgICMgU3RhcnQgb2YgYSBzZXF1ZW5jZSBvZiB6ZXJvcy4KICAgICAgICAgICAgICAgICAgICBkb3VibGVjb2xvbl9zdGFydCA9IGluZGV4CiAgICAgICAgICAgICAgICBpZiBkb3VibGVjb2xvbl9sZW4gPiBiZXN0X2RvdWJsZWNvbG9uX2xlbjoKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgemVyb3Mgc28gZmFyLgogICAgICAgICAgICAgICAgICAgIGJlc3RfZG91YmxlY29sb25fbGVuID0gZG91YmxlY29sb25fbGVuCiAgICAgICAgICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9zdGFydCA9IGRvdWJsZWNvbG9uX3N0YXJ0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkb3VibGVjb2xvbl9sZW4gPSAwCiAgICAgICAgICAgICAgICBkb3VibGVjb2xvbl9zdGFydCA9IC0xCgogICAgICAgIGlmIGJlc3RfZG91YmxlY29sb25fbGVuID4gMToKICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9lbmQgPSAoYmVzdF9kb3VibGVjb2xvbl9zdGFydCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfZG91YmxlY29sb25fbGVuKQogICAgICAgICAgICAjIEZvciB6ZXJvcyBhdCB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzLgogICAgICAgICAgICBpZiBiZXN0X2RvdWJsZWNvbG9uX2VuZCA9PSBsZW4oaGV4dGV0cyk6CiAgICAgICAgICAgICAgICBoZXh0ZXRzICs9IFsnJ10KICAgICAgICAgICAgaGV4dGV0c1tiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0OmJlc3RfZG91YmxlY29sb25fZW5kXSA9IFsnJ10KICAgICAgICAgICAgIyBGb3IgemVyb3MgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYWRkcmVzcy4KICAgICAgICAgICAgaWYgYmVzdF9kb3VibGVjb2xvbl9zdGFydCA9PSAwOgogICAgICAgICAgICAgICAgaGV4dGV0cyA9IFsnJ10gKyBoZXh0ZXRzCgogICAgICAgIHJldHVybiBoZXh0ZXRzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3N0cmluZ19mcm9tX2lwX2ludChjbHMsIGlwX2ludD1Ob25lKToKICAgICAgICAiIiJUdXJucyBhIDEyOC1iaXQgaW50ZWdlciBpbnRvIGhleGFkZWNpbWFsIG5vdGF0aW9uLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9pbnQ6IEFuIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIHN0cmluZywgdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IFRoZSBhZGRyZXNzIGlzIGJpZ2dlciB0aGFuIDEyOCBiaXRzIG9mIGFsbCBvbmVzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBpcF9pbnQgaXMgTm9uZToKICAgICAgICAgICAgaXBfaW50ID0gaW50KGNscy5faXApCgogICAgICAgIGlmIGlwX2ludCA+IGNscy5fQUxMX09ORVM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0lQdjYgYWRkcmVzcyBpcyB0b28gbGFyZ2UnKQoKICAgICAgICBoZXhfc3RyID0gJyUwMzJ4JyAlIGlwX2ludAogICAgICAgIGhleHRldHMgPSBbJyV4JyAlIGludChoZXhfc3RyW3g6eCArIDRdLCAxNikgZm9yIHggaW4gcmFuZ2UoMCwgMzIsIDQpXQoKICAgICAgICBoZXh0ZXRzID0gY2xzLl9jb21wcmVzc19oZXh0ZXRzKGhleHRldHMpCiAgICAgICAgcmV0dXJuICc6Jy5qb2luKGhleHRldHMpCgogICAgZGVmIF9leHBsb2RlX3Nob3J0aGFuZF9pcF9zdHJpbmcoc2VsZik6CiAgICAgICAgIiIiRXhwYW5kIGEgc2hvcnRlbmVkIElQdjYgYWRkcmVzcy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIElQdjYgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBzdHJpbmcsIHRoZSBleHBhbmRlZCBJUHY2IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZiwgSVB2Nk5ldHdvcmspOgogICAgICAgICAgICBpcF9zdHIgPSBfY29tcGF0X3N0cihzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZiwgSVB2NkludGVyZmFjZSk6CiAgICAgICAgICAgIGlwX3N0ciA9IF9jb21wYXRfc3RyKHNlbGYuaXApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXBfc3RyID0gX2NvbXBhdF9zdHIoc2VsZikKCiAgICAgICAgaXBfaW50ID0gc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGlwX3N0cikKICAgICAgICBoZXhfc3RyID0gJyUwMzJ4JyAlIGlwX2ludAogICAgICAgIHBhcnRzID0gW2hleF9zdHJbeDp4ICsgNF0gZm9yIHggaW4gcmFuZ2UoMCwgMzIsIDQpXQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZiwgKF9CYXNlTmV0d29yaywgSVB2NkludGVyZmFjZSkpOgogICAgICAgICAgICByZXR1cm4gJyVzLyVkJyAlICgnOicuam9pbihwYXJ0cyksIHNlbGYuX3ByZWZpeGxlbikKICAgICAgICByZXR1cm4gJzonLmpvaW4ocGFydHMpCgogICAgZGVmIF9yZXZlcnNlX3BvaW50ZXIoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSByZXZlcnNlIEROUyBwb2ludGVyIG5hbWUgZm9yIHRoZSBJUHY2IGFkZHJlc3MuCgogICAgICAgIFRoaXMgaW1wbGVtZW50cyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBpbiBSRkMzNTk2IDIuNS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV2ZXJzZV9jaGFycyA9IHNlbGYuZXhwbG9kZWRbOjotMV0ucmVwbGFjZSgnOicsICcnKQogICAgICAgIHJldHVybiAnLicuam9pbihyZXZlcnNlX2NoYXJzKSArICcuaXA2LmFycGEnCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWF4X3ByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbWF4X3ByZWZpeGxlbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCgpjbGFzcyBJUHY2QWRkcmVzcyhfQmFzZVY2LCBfQmFzZUFkZHJlc3MpOgoKICAgICIiIlJlcHJlc2VudCBhbmQgbWFuaXB1bGF0ZSBzaW5nbGUgSVB2NiBBZGRyZXNzZXMuIiIiCgogICAgX19zbG90c19fID0gKCdfaXAnLCAnX193ZWFrcmVmX18nKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIG5ldyBJUHY2IGFkZHJlc3Mgb2JqZWN0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgSVAKCiAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbiBpbnRlZ2VyIGNhbiBiZSBwYXNzZWQsIHNvCiAgICAgICAgICAgICAgSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjonKSA9PQogICAgICAgICAgICAgICAgSVB2NkFkZHJlc3MoNDI1NDA3NjY0MTEyODI1OTI4NTY5MDM5ODQ5NTE2NTM4MjY1NjApCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2NkFkZHJlc3MoaW50KElQdjZBZGRyZXNzKCcyMDAxOmRiODo6JykpKSA9PQogICAgICAgICAgICAgICAgSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjonKQoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBJZiBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NiBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIuCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludF9hZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gYWRkcmVzcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBDb25zdHJ1Y3RpbmcgZnJvbSBhIHBhY2tlZCBhZGRyZXNzCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX3BhY2tlZF9hZGRyZXNzKGFkZHJlc3MsIDE2KQogICAgICAgICAgICBidnMgPSBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLl9pcCA9IF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzKGJ2cywgJ2JpZycpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFzc3VtZSBpbnB1dCBhcmd1bWVudCB0byBiZSBzdHJpbmcgb3IgYW55IG9iamVjdCByZXByZXNlbnRhdGlvbgogICAgICAgICMgd2hpY2ggY29udmVydHMgaW50byBhIGZvcm1hdHRlZCBJUCBzdHJpbmcuCiAgICAgICAgYWRkcl9zdHIgPSBfY29tcGF0X3N0cihhZGRyZXNzKQogICAgICAgIGlmICcvJyBpbiBhZGRyX3N0cjoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIlVuZXhwZWN0ZWQgJy8nIGluICVyIiAlIGFkZHJlc3MpCiAgICAgICAgc2VsZi5faXAgPSBzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoYWRkcl9zdHIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFja2VkKHNlbGYpOgogICAgICAgICIiIlRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhZGRyZXNzLiIiIgogICAgICAgIHJldHVybiB2Nl9pbnRfdG9fcGFja2VkKHNlbGYuX2lwKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX211bHRpY2FzdChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBtdWx0aWNhc3QgdXNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KICAgICAgICAgICAgU2VlIFJGQyAyMzczIDIuNyBmb3IgZGV0YWlscy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9tdWx0aWNhc3RfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Jlc2VydmVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgb3RoZXJ3aXNlIElFVEYgcmVzZXJ2ZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gb25lIG9mIHRoZQogICAgICAgICAgICByZXNlcnZlZCBJUHY2IE5ldHdvcmsgcmFuZ2VzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYW55KHNlbGYgaW4geCBmb3IgeCBpbiBzZWxmLl9jb25zdGFudHMuX3Jlc2VydmVkX25ldHdvcmtzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xpbmtfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbGluay1sb2NhbC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgNDI5MS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9saW5rbG9jYWxfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3NpdGVfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3Igc2l0ZS1sb2NhbC4KCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzaXRlLWxvY2FsIGFkZHJlc3Mgc3BhY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBieSBSRkMgMzg3OS4KICAgICAgICBVc2UgaXNfcHJpdmF0ZSB0byB0ZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBpbiB0aGUgc3BhY2Ugb2YgdW5pcXVlIGxvY2FsCiAgICAgICAgYWRkcmVzc2VzIGFzIGRlZmluZWQgYnkgUkZDIDQxOTMuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIgUkZDIDM1MTMgMi41LjYuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fc2l0ZWxvY2FsX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcml2YXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHJpdmF0ZSBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjYtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGFueShzZWxmIGluIG5ldCBmb3IgbmV0IGluIHNlbGYuX2NvbnN0YW50cy5fcHJpdmF0ZV9uZXR3b3JrcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwdWJsaWMgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbm90IHNlbGYuaXNfcHJpdmF0ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Vuc3BlY2lmaWVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgdW5zcGVjaWZpZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGlzIGlzIHRoZSB1bnNwZWNpZmllZCBhZGRyZXNzIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgUkZDIDIzNzMgMi41LjIuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9pcCA9PSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbG9vcGJhY2soc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxvb3BiYWNrIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgMjM3MyAyLjUuMy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2lwID09IDEKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpcHY0X21hcHBlZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIElQdjQgbWFwcGVkIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIElmIHRoZSBJUHY2IGFkZHJlc3MgaXMgYSB2NCBtYXBwZWQgYWRkcmVzcywgcmV0dXJuIHRoZQogICAgICAgICAgICBJUHY0IG1hcHBlZCBhZGRyZXNzLiBSZXR1cm4gTm9uZSBvdGhlcndpc2UuCgogICAgICAgICIiIgogICAgICAgIGlmIChzZWxmLl9pcCA+PiAzMikgIT0gMHhGRkZGOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBJUHY0QWRkcmVzcyhzZWxmLl9pcCAmIDB4RkZGRkZGRkYpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGVyZWRvKHNlbGYpOgogICAgICAgICIiIlR1cGxlIG9mIGVtYmVkZGVkIHRlcmVkbyBJUHMuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFR1cGxlIG9mIHRoZSAoc2VydmVyLCBjbGllbnQpIElQcyBvciBOb25lIGlmIHRoZSBhZGRyZXNzCiAgICAgICAgICAgIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgdGVyZWRvIGFkZHJlc3MgKGRvZXNuJ3Qgc3RhcnQgd2l0aAogICAgICAgICAgICAyMDAxOjovMzIpCgogICAgICAgICIiIgogICAgICAgIGlmIChzZWxmLl9pcCA+PiA5NikgIT0gMHgyMDAxMDAwMDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gKElQdjRBZGRyZXNzKChzZWxmLl9pcCA+PiA2NCkgJiAweEZGRkZGRkZGKSwKICAgICAgICAgICAgICAgIElQdjRBZGRyZXNzKH5zZWxmLl9pcCAmIDB4RkZGRkZGRkYpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpeHRvZm91cihzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIElQdjQgNnRvNCBlbWJlZGRlZCBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgSVB2NCA2dG80LWVtYmVkZGVkIGFkZHJlc3MgaWYgcHJlc2VudCBvciBOb25lIGlmIHRoZQogICAgICAgICAgICBhZGRyZXNzIGRvZXNuJ3QgYXBwZWFyIHRvIGNvbnRhaW4gYSA2dG80IGVtYmVkZGVkIGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIGlmIChzZWxmLl9pcCA+PiAxMTIpICE9IDB4MjAwMjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gSVB2NEFkZHJlc3MoKHNlbGYuX2lwID4+IDgwKSAmIDB4RkZGRkZGRkYpCgoKY2xhc3MgSVB2NkludGVyZmFjZShJUHY2QWRkcmVzcyk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKGJ5dGVzLCBfY29tcGF0X2ludF90eXBlcykpOgogICAgICAgICAgICBJUHY2QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQogICAgICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY2TmV0d29yayhzZWxmLl9pcCkKICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIHR1cGxlKToKICAgICAgICAgICAgSVB2NkFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkcmVzc1swXSkKICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IGludChhZGRyZXNzWzFdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY2TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgICAgIHNlbGYubmV0bWFzayA9IHNlbGYubmV0d29yay5uZXRtYXNrCiAgICAgICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQogICAgICAgIElQdjZBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJbMF0pCiAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2Nk5ldHdvcmsoYWRkcmVzcywgc3RyaWN0PUZhbHNlKQogICAgICAgIHNlbGYubmV0bWFzayA9IHNlbGYubmV0d29yay5uZXRtYXNrCiAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5uZXR3b3JrLl9wcmVmaXhsZW4KICAgICAgICBzZWxmLmhvc3RtYXNrID0gc2VsZi5uZXR3b3JrLmhvc3RtYXNrCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lZCcgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmsucHJlZml4bGVuKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGFkZHJlc3NfZXF1YWwgPSBJUHY2QWRkcmVzcy5fX2VxX18oc2VsZiwgb3RoZXIpCiAgICAgICAgaWYgbm90IGFkZHJlc3NfZXF1YWwgb3IgYWRkcmVzc19lcXVhbCBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NfZXF1YWwKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmsgPT0gb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBBbiBpbnRlcmZhY2Ugd2l0aCBhbiBhc3NvY2lhdGVkIG5ldHdvcmsgaXMgTk9UIHRoZQogICAgICAgICAgICAjIHNhbWUgYXMgYW4gdW5hc3NvY2lhdGVkIGFkZHJlc3MuIFRoYXQncyB3aHkgdGhlIGhhc2gKICAgICAgICAgICAgIyB0YWtlcyB0aGUgZXh0cmEgaW5mbyBpbnRvIGFjY291bnQuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGFkZHJlc3NfbGVzcyA9IElQdjZBZGRyZXNzLl9fbHRfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBhZGRyZXNzX2xlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA8IG90aGVyLm5ldHdvcmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgV2UgKmRvKiBhbGxvdyBhZGRyZXNzZXMgYW5kIGludGVyZmFjZXMgdG8gYmUgc29ydGVkLiBUaGUKICAgICAgICAgICAgIyB1bmFzc29jaWF0ZWQgYWRkcmVzcyBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiBhbGwgaW50ZXJmYWNlcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcCBeIHNlbGYuX3ByZWZpeGxlbiBeIGludChzZWxmLm5ldHdvcmsubmV0d29ya19hZGRyZXNzKQoKICAgIF9fcmVkdWNlX18gPSBfSVBBZGRyZXNzQmFzZS5fX3JlZHVjZV9fCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXAoc2VsZik6CiAgICAgICAgcmV0dXJuIElQdjZBZGRyZXNzKHNlbGYuX2lwKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfbmV0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX2hvc3RtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3N0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc191bnNwZWNpZmllZChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMCBhbmQgc2VsZi5uZXR3b3JrLmlzX3Vuc3BlY2lmaWVkCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbG9vcGJhY2soc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwID09IDEgYW5kIHNlbGYubmV0d29yay5pc19sb29wYmFjawoKCmNsYXNzIElQdjZOZXR3b3JrKF9CYXNlVjYsIF9CYXNlTmV0d29yayk6CgogICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCBtYW5pcHVsYXRlcyAxMjgtYml0IElQdjYgbmV0d29ya3MuCgogICAgQXR0cmlidXRlczogW2V4YW1wbGVzIGZvciBJUHY2KCcyMDAxOmRiODo6MTAwMC8xMjQnKV0KICAgICAgICAubmV0d29ya19hZGRyZXNzOiBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OjEwMDAnKQogICAgICAgIC5ob3N0bWFzazogSVB2NkFkZHJlc3MoJzo6ZicpCiAgICAgICAgLmJyb2FkY2FzdF9hZGRyZXNzOiBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OjEwMGYnKQogICAgICAgIC5uZXRtYXNrOiBJUHY2QWRkcmVzcygnZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmYwJykKICAgICAgICAucHJlZml4bGVuOiAxMjQKCiAgICAiIiIKCiAgICAjIENsYXNzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFkZHJlc3Mgb2JqZWN0cwogICAgX2FkZHJlc3NfY2xhc3MgPSBJUHY2QWRkcmVzcwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBzdHJpY3Q9VHJ1ZSk6CiAgICAgICAgIiIiSW5zdGFudGlhdGUgYSBuZXcgSVB2NiBOZXR3b3JrIG9iamVjdC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIElQdjYgbmV0d29yayBvciB0aGUKICAgICAgICAgICAgICBJUCBhbmQgcHJlZml4L25ldG1hc2suCiAgICAgICAgICAgICAgJzIwMDE6ZGI4OjovMTI4JwogICAgICAgICAgICAgICcyMDAxOmRiODowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMC8xMjgnCiAgICAgICAgICAgICAgJzIwMDE6ZGI4OjonCiAgICAgICAgICAgICAgYXJlIGFsbCBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgaW4gSVB2Ni4gIFRoYXQgaXMgdG8gc2F5LAogICAgICAgICAgICAgIGZhaWxpbmcgdG8gcHJvdmlkZSBhIHN1Ym5ldG1hc2sgd2lsbCBjcmVhdGUgYW4gb2JqZWN0IHdpdGgKICAgICAgICAgICAgICBhIG1hc2sgb2YgLzEyOC4KCiAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbiBpbnRlZ2VyIGNhbiBiZSBwYXNzZWQsIHNvCiAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjonKSA9PQogICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoNDI1NDA3NjY0MTEyODI1OTI4NTY5MDM5ODQ5NTE2NTM4MjY1NjApCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoaW50KElQdjZOZXR3b3JrKCcyMDAxOmRiODo6JykpKSA9PQogICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjonKQoKICAgICAgICAgICAgc3RyaWN0OiBBIGJvb2xlYW4uIElmIHRydWUsIGVuc3VyZSB0aGF0IHdlIGhhdmUgYmVlbiBwYXNzZWQKICAgICAgICAgICAgICBBIHRydWUgbmV0d29yayBhZGRyZXNzLCBlZywgMjAwMTpkYjg6OjEwMDAvMTI0IGFuZCBub3QgYW4KICAgICAgICAgICAgICBJUCBhZGRyZXNzIG9uIGEgbmV0d29yaywgZWcsIDIwMDE6ZGI4OjoxLzEyNC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgYWRkcmVzcyBpc24ndCBhIHZhbGlkIElQdjYgYWRkcmVzcy4KICAgICAgICAgICAgTmV0bWFza1ZhbHVlRXJyb3I6IElmIHRoZSBuZXRtYXNrIGlzbid0IHZhbGlkIGZvcgogICAgICAgICAgICAgIGFuIElQdjYgYWRkcmVzcy4KICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgc3RyaWN0IHdhcyBUcnVlIGFuZCBhIG5ldHdvcmsgYWRkcmVzcyB3YXMgbm90CiAgICAgICAgICAgICAgc3VwcGxpZWQuCgogICAgICAgICIiIgogICAgICAgIF9CYXNlTmV0d29yay5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQoKICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIgb3IgcGFja2VkIGFkZHJlc3MKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIChieXRlcywgX2NvbXBhdF9pbnRfdHlwZXMpKToKICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzaygKICAgICAgICAgICAgICAgIHNlbGYuX21heF9wcmVmaXhsZW4pCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIHR1cGxlKToKICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKICAgICAgICAgICAgICAgIGFyZyA9IGFkZHJlc3NbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKGFkZHJlc3NbMF0pCiAgICAgICAgICAgIHBhY2tlZCA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICAgICAgaWYgcGFja2VkICYgaW50KHNlbGYubmV0bWFzaykgIT0gcGFja2VkOgogICAgICAgICAgICAgICAgaWYgc3RyaWN0OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIGhhcyBob3N0IGJpdHMgc2V0JyAlIHNlbGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MocGFja2VkICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBc3N1bWUgaW5wdXQgYXJndW1lbnQgdG8gYmUgc3RyaW5nIG9yIGFueSBvYmplY3QgcmVwcmVzZW50YXRpb24KICAgICAgICAjIHdoaWNoIGNvbnZlcnRzIGludG8gYSBmb3JtYXR0ZWQgSVAgcHJlZml4IHN0cmluZy4KICAgICAgICBhZGRyID0gX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcykKCiAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoYWRkclswXSkpCgogICAgICAgIGlmIGxlbihhZGRyKSA9PSAyOgogICAgICAgICAgICBhcmcgPSBhZGRyWzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJnID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKGFyZykKCiAgICAgICAgaWYgc3RyaWN0OgogICAgICAgICAgICBpZiAoSVB2NkFkZHJlc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmIGludChzZWxmLm5ldG1hc2spKSAhPQogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIGhhcyBob3N0IGJpdHMgc2V0JyAlIHNlbGYpCiAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spKQoKICAgICAgICBpZiBzZWxmLl9wcmVmaXhsZW4gPT0gKHNlbGYuX21heF9wcmVmaXhsZW4gLSAxKToKICAgICAgICAgICAgc2VsZi5ob3N0cyA9IHNlbGYuX19pdGVyX18KCiAgICBkZWYgaG9zdHMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgSXRlcmF0b3Igb3ZlciB1c2FibGUgaG9zdHMgaW4gYSBuZXR3b3JrLgoKICAgICAgICAgIFRoaXMgaXMgbGlrZSBfX2l0ZXJfXyBleGNlcHQgaXQgZG9lc24ndCByZXR1cm4gdGhlCiAgICAgICAgICBTdWJuZXQtUm91dGVyIGFueWNhc3QgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgbmV0d29yayA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICBmb3IgeCBpbiBfY29tcGF0X3JhbmdlKG5ldHdvcmsgKyAxLCBicm9hZGNhc3QgKyAxKToKICAgICAgICAgICAgeWllbGQgc2VsZi5fYWRkcmVzc19jbGFzcyh4KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3NpdGVfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3Igc2l0ZS1sb2NhbC4KCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzaXRlLWxvY2FsIGFkZHJlc3Mgc3BhY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBieSBSRkMgMzg3OS4KICAgICAgICBVc2UgaXNfcHJpdmF0ZSB0byB0ZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBpbiB0aGUgc3BhY2Ugb2YgdW5pcXVlIGxvY2FsCiAgICAgICAgYWRkcmVzc2VzIGFzIGRlZmluZWQgYnkgUkZDIDQxOTMuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIgUkZDIDM1MTMgMi41LjYuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfc2l0ZV9sb2NhbCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfc2l0ZV9sb2NhbCkKCgpjbGFzcyBfSVB2NkNvbnN0YW50cyhvYmplY3QpOgoKICAgIF9saW5rbG9jYWxfbmV0d29yayA9IElQdjZOZXR3b3JrKCdmZTgwOjovMTAnKQoKICAgIF9tdWx0aWNhc3RfbmV0d29yayA9IElQdjZOZXR3b3JrKCdmZjAwOjovOCcpCgogICAgX3ByaXZhdGVfbmV0d29ya3MgPSBbCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6MS8xMjgnKSwKICAgICAgICBJUHY2TmV0d29yaygnOjovMTI4JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6ZmZmZjowOjAvOTYnKSwKICAgICAgICBJUHY2TmV0d29yaygnMTAwOjovNjQnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMTo6LzIzJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6Mjo6LzQ4JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjovMzInKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMToxMDo6LzI4JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ2ZjMDA6Oi83JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ2ZlODA6Oi8xMCcpLAogICAgXQoKICAgIF9yZXNlcnZlZF9uZXR3b3JrcyA9IFsKICAgICAgICBJUHY2TmV0d29yaygnOjovOCcpLCBJUHY2TmV0d29yaygnMTAwOjovOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDA6Oi83JyksIElQdjZOZXR3b3JrKCc0MDA6Oi82JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzgwMDo6LzUnKSwgSVB2Nk5ldHdvcmsoJzEwMDA6Oi80JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzQwMDA6Oi8zJyksIElQdjZOZXR3b3JrKCc2MDAwOjovMycpLAogICAgICAgIElQdjZOZXR3b3JrKCc4MDAwOjovMycpLCBJUHY2TmV0d29yaygnQTAwMDo6LzMnKSwKICAgICAgICBJUHY2TmV0d29yaygnQzAwMDo6LzMnKSwgSVB2Nk5ldHdvcmsoJ0UwMDA6Oi80JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ0YwMDA6Oi81JyksIElQdjZOZXR3b3JrKCdGODAwOjovNicpLAogICAgICAgIElQdjZOZXR3b3JrKCdGRTAwOjovOScpLAogICAgXQoKICAgIF9zaXRlbG9jYWxfbmV0d29yayA9IElQdjZOZXR3b3JrKCdmZWMwOjovMTAnKQoKCklQdjZBZGRyZXNzLl9jb25zdGFudHMgPSBfSVB2NkNvbnN0YW50cwpQSwMEFAAAAAAAAAAhAPOZI4CbJAAAmyQAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCmxvY2tmaWxlLnB5IC0gUGxhdGZvcm0taW5kZXBlbmRlbnQgYWR2aXNvcnkgZmlsZSBsb2Nrcy4KClJlcXVpcmVzIFB5dGhvbiAyLjUgdW5sZXNzIHlvdSBhcHBseSAyLjQuZGlmZgpMb2NraW5nIGlzIGRvbmUgb24gYSBwZXItdGhyZWFkIGJhc2lzIGluc3RlYWQgb2YgYSBwZXItcHJvY2VzcyBiYXNpcy4KClVzYWdlOgoKPj4+IGxvY2sgPSBMb2NrRmlsZSgnc29tZWZpbGUnKQo+Pj4gdHJ5OgouLi4gICAgIGxvY2suYWNxdWlyZSgpCi4uLiBleGNlcHQgQWxyZWFkeUxvY2tlZDoKLi4uICAgICBwcmludCAnc29tZWZpbGUnLCAnaXMgbG9ja2VkIGFscmVhZHkuJwouLi4gZXhjZXB0IExvY2tGYWlsZWQ6Ci4uLiAgICAgcHJpbnQgJ3NvbWVmaWxlJywgJ2NhblxcJ3QgYmUgbG9ja2VkLicKLi4uIGVsc2U6Ci4uLiAgICAgcHJpbnQgJ2dvdCBsb2NrJwpnb3QgbG9jawo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpUcnVlCj4+PiBsb2NrLnJlbGVhc2UoKQoKPj4+IGxvY2sgPSBMb2NrRmlsZSgnc29tZWZpbGUnKQo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpGYWxzZQo+Pj4gd2l0aCBsb2NrOgouLi4gICAgcHJpbnQgbG9jay5pc19sb2NrZWQoKQpUcnVlCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiAjIEl0IGlzIG9rYXkgdG8gbG9jayB0d2ljZSBmcm9tIHRoZSBzYW1lIHRocmVhZC4uLgo+Pj4gd2l0aCBsb2NrOgouLi4gICAgIGxvY2suYWNxdWlyZSgpCi4uLgo+Pj4gIyBUaG91Z2ggbm8gY291bnRlciBpcyBrZXB0LCBzbyB5b3UgY2FuJ3QgdW5sb2NrIG11bHRpcGxlIHRpbWVzLi4uCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCgpFeGNlcHRpb25zOgoKICAgIEVycm9yIC0gYmFzZSBjbGFzcyBmb3Igb3RoZXIgZXhjZXB0aW9ucwogICAgICAgIExvY2tFcnJvciAtIGJhc2UgY2xhc3MgZm9yIGFsbCBsb2NraW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCAtIEFub3RoZXIgdGhyZWFkIG9yIHByb2Nlc3MgYWxyZWFkeSBob2xkcyB0aGUgbG9jawogICAgICAgICAgICBMb2NrRmFpbGVkIC0gTG9jayBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCiAgICAgICAgVW5sb2NrRXJyb3IgLSBiYXNlIGNsYXNzIGZvciBhbGwgdW5sb2NraW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgQWxyZWFkeVVubG9ja2VkIC0gRmlsZSB3YXMgbm90IGxvY2tlZC4KICAgICAgICAgICAgTm90TXlMb2NrIC0gRmlsZSB3YXMgbG9ja2VkIGJ1dCBub3QgYnkgdGhlIGN1cnJlbnQgdGhyZWFkL3Byb2Nlc3MKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB3YXJuaW5ncwoKIyBXb3JrIHdpdGggUEVQOCBhbmQgbm9uLVBFUDggdmVyc2lvbnMgb2YgdGhyZWFkaW5nIG1vZHVsZS4KaWYgbm90IGhhc2F0dHIodGhyZWFkaW5nLCAiY3VycmVudF90aHJlYWQiKToKICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCA9IHRocmVhZGluZy5jdXJyZW50VGhyZWFkCmlmIG5vdCBoYXNhdHRyKHRocmVhZGluZy5UaHJlYWQsICJnZXRfbmFtZSIpOgogICAgdGhyZWFkaW5nLlRocmVhZC5nZXRfbmFtZSA9IHRocmVhZGluZy5UaHJlYWQuZ2V0TmFtZQoKX19hbGxfXyA9IFsnRXJyb3InLCAnTG9ja0Vycm9yJywgJ0xvY2tUaW1lb3V0JywgJ0FscmVhZHlMb2NrZWQnLAogICAgICAgICAgICdMb2NrRmFpbGVkJywgJ1VubG9ja0Vycm9yJywgJ05vdExvY2tlZCcsICdOb3RNeUxvY2snLAogICAgICAgICAgICdMaW5rRmlsZUxvY2snLCAnTWtkaXJGaWxlTG9jaycsICdTUUxpdGVGaWxlTG9jaycsCiAgICAgICAgICAgJ0xvY2tCYXNlJywgJ2xvY2tlZCddCgoKY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3Igb3RoZXIgZXhjZXB0aW9ucy4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgRXJyb3IKICAgIC4uLiBleGNlcHQgRXhjZXB0aW9uOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja0Vycm9yKEVycm9yKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3IgZXJyb3IgYXJpc2luZyBmcm9tIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIGxvY2suCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIExvY2tFcnJvcgogICAgLi4uIGV4Y2VwdCBFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIExvY2tUaW1lb3V0KExvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBsb2NrIGNyZWF0aW9uIGZhaWxzIHdpdGhpbiBhIHVzZXItZGVmaW5lZCBwZXJpb2Qgb2YgdGltZS4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTG9ja1RpbWVvdXQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgQWxyZWFkeUxvY2tlZChMb2NrRXJyb3IpOgogICAgIiIiU29tZSBvdGhlciB0aHJlYWQvcHJvY2VzcyBpcyBsb2NraW5nIHRoZSBmaWxlLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBBbHJlYWR5TG9ja2VkCiAgICAuLi4gZXhjZXB0IExvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIExvY2tGYWlsZWQoTG9ja0Vycm9yKToKICAgICIiIkxvY2sgZmlsZSBjcmVhdGlvbiBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBMb2NrRmFpbGVkCiAgICAuLi4gZXhjZXB0IExvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIFVubG9ja0Vycm9yKEVycm9yKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3IgZXJyb3JzIGFyaXNpbmcgZnJvbSBhdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBVbmxvY2tFcnJvcgogICAgLi4uIGV4Y2VwdCBFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIE5vdExvY2tlZChVbmxvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdW5sb2NrIGFuIHVubG9ja2VkIGZpbGUuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIE5vdExvY2tlZAogICAgLi4uIGV4Y2VwdCBVbmxvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIE5vdE15TG9jayhVbmxvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdW5sb2NrIGEgZmlsZSBzb21lb25lIGVsc2UgbG9ja2VkLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBOb3RNeUxvY2sKICAgIC4uLiBleGNlcHQgVW5sb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBfU2hhcmVkQmFzZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFjcXVpcmUgdGhlIGxvY2suCgogICAgICAgICogSWYgdGltZW91dCBpcyBvbWl0dGVkIChvciBOb25lKSwgd2FpdCBmb3JldmVyIHRyeWluZyB0byBsb2NrIHRoZQogICAgICAgICAgZmlsZS4KCiAgICAgICAgKiBJZiB0aW1lb3V0ID4gMCwgdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRoYXQgbWFueSBzZWNvbmRzLiAgSWYKICAgICAgICAgIHRoZSBsb2NrIHBlcmlvZCBleHBpcmVzIGFuZCB0aGUgZmlsZSBpcyBzdGlsbCBsb2NrZWQsIHJhaXNlCiAgICAgICAgICBMb2NrVGltZW91dC4KCiAgICAgICAgKiBJZiB0aW1lb3V0IDw9IDAsIHJhaXNlIEFscmVhZHlMb2NrZWQgaW1tZWRpYXRlbHkgaWYgdGhlIGZpbGUgaXMKICAgICAgICAgIGFscmVhZHkgbG9ja2VkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbGVhc2UgdGhlIGxvY2suCgogICAgICAgIElmIHRoZSBmaWxlIGlzIG5vdCBsb2NrZWQsIHJhaXNlIE5vdExvY2tlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnRleHQgbWFuYWdlciBzdXBwb3J0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuYWNxdWlyZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKl9leGMpOgogICAgICAgICIiIgogICAgICAgIENvbnRleHQgbWFuYWdlciBzdXBwb3J0LgogICAgICAgICIiIgogICAgICAgIHNlbGYucmVsZWFzZSgpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzOiAlcj4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnBhdGgpCgoKY2xhc3MgTG9ja0Jhc2UoX1NoYXJlZEJhc2UpOgogICAgIiIiQmFzZSBjbGFzcyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgbG9jayBjbGFzc2VzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxvY2sgPSBMb2NrQmFzZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gTG9ja0Jhc2UoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoTG9ja0Jhc2UsIHNlbGYpLl9faW5pdF9fKHBhdGgpCiAgICAgICAgc2VsZi5sb2NrX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgocGF0aCkgKyAiLmxvY2siCiAgICAgICAgc2VsZi5ob3N0bmFtZSA9IHNvY2tldC5nZXRob3N0bmFtZSgpCiAgICAgICAgc2VsZi5waWQgPSBvcy5nZXRwaWQoKQogICAgICAgIGlmIHRocmVhZGVkOgogICAgICAgICAgICB0ID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKICAgICAgICAgICAgIyBUaHJlYWQgb2JqZWN0cyBpbiBQeXRob24gMi40IGFuZCBlYXJsaWVyIGRvIG5vdCBoYXZlIGlkZW50CiAgICAgICAgICAgICMgYXR0cnMuICBXb3JtIGFyb3VuZCB0aGF0LgogICAgICAgICAgICBpZGVudCA9IGdldGF0dHIodCwgImlkZW50IiwgaGFzaCh0KSkKICAgICAgICAgICAgc2VsZi50bmFtZSA9ICItJXgiICUgKGlkZW50ICYgMHhmZmZmZmZmZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRuYW1lID0gIiIKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHNlbGYubG9ja19maWxlKQoKICAgICAgICAjIHVuaXF1ZSBuYW1lIGlzIG1vc3RseSBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzLCBidXQgbXVzdAogICAgICAgICMgYWxzbyBjb250YWluIHRoZSBwYXRoIC0tIG90aGVyd2lzZSwgdHdvIGFkamFjZW50IGxvY2tlZAogICAgICAgICMgZmlsZXMgY29uZmxpY3QgKG9uZSBmaWxlIGdldHMgbG9ja2VkLCBjcmVhdGluZyBsb2NrLWZpbGUgYW5kCiAgICAgICAgIyB1bmlxdWUgZmlsZSwgdGhlIG90aGVyIG9uZSBnZXRzIGxvY2tlZCwgY3JlYXRpbmcgbG9jay1maWxlCiAgICAgICAgIyBhbmQgb3ZlcndyaXRpbmcgdGhlIGFscmVhZHkgZXhpc3RpbmcgbG9jay1maWxlLCB0aGVuIG9uZQogICAgICAgICMgZ2V0cyB1bmxvY2tlZCwgZGVsZXRpbmcgYm90aCBsb2NrLWZpbGUgYW5kIHVuaXF1ZSBmaWxlLAogICAgICAgICMgZmluYWxseSB0aGUgbGFzdCBsb2NrIGVycm9ycyBvdXQgdXBvbiByZWxlYXNpbmcuCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzJXMuJXMlcyIgJSAoc2VsZi5ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2goc2VsZi5wYXRoKSkpCiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVsbCB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcyBsb2NrZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBsb2NraW5nIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhIGxvY2suICBVc2VmdWwgaWYgYSBsb2NraW5nIHRocmVhZCBmYWlsZWQgdG8gdW5sb2NrLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlczogJXIgLS0gJXI+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi51bmlxdWVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCgoKZGVmIF9mbF9oZWxwZXIoY2xzLCBtb2QsICphcmdzLCAqKmt3ZHMpOgogICAgd2FybmluZ3Mud2FybigiSW1wb3J0IGZyb20gJXMgbW9kdWxlIGluc3RlYWQgb2YgbG9ja2ZpbGUgcGFja2FnZSIgJSBtb2QsCiAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgIyBUaGlzIGlzIGEgYml0IGZ1bmt5LCBidXQgaXQncyBvbmx5IGZvciBhd2hpbGUuICBUaGUgd2F5IHRoZSB1bml0IHRlc3RzCiAgICAjIGFyZSBjb25zdHJ1Y3RlZCB0aGlzIGZ1bmN0aW9uIHdpbmRzIHVwIGFzIGFuIHVuYm91bmQgbWV0aG9kLCBzbyBpdAogICAgIyBhY3R1YWxseSB0YWtlcyB0aHJlZSBhcmdzLCBub3QgdHdvLiAgV2Ugd2FudCB0byB0b3NzIG91dCBzZWxmLgogICAgaWYgbm90IGlzaW5zdGFuY2UoYXJnc1swXSwgc3RyKToKICAgICAgICAjIFdlIGFyZSB0ZXN0aW5nLCBhdm9pZCB0aGUgZmlyc3QgYXJnCiAgICAgICAgYXJncyA9IGFyZ3NbMTpdCiAgICBpZiBsZW4oYXJncykgPT0gMSBhbmQgbm90IGt3ZHM6CiAgICAgICAga3dkc1sidGhyZWFkZWQiXSA9IFRydWUKICAgIHJldHVybiBjbHMoKmFyZ3MsICoqa3dkcykKCgpkZWYgTGlua0ZpbGVMb2NrKCphcmdzLCAqKmt3ZHMpOgogICAgIiIiRmFjdG9yeSBmdW5jdGlvbiBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgRG8gbm90IHVzZSBpbiBuZXcgY29kZS4gIEluc3RlYWQsIGltcG9ydCBMaW5rTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLmxpbmtsb2NrZmlsZSBtb2R1bGUuCiAgICAiIiIKICAgIGZyb20gLiBpbXBvcnQgbGlua2xvY2tmaWxlCiAgICByZXR1cm4gX2ZsX2hlbHBlcihsaW5rbG9ja2ZpbGUuTGlua0xvY2tGaWxlLCAibG9ja2ZpbGUubGlua2xvY2tmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCgoKZGVmIE1rZGlyRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IE1rZGlyTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgbW9kdWxlLgogICAgIiIiCiAgICBmcm9tIC4gaW1wb3J0IG1rZGlybG9ja2ZpbGUKICAgIHJldHVybiBfZmxfaGVscGVyKG1rZGlybG9ja2ZpbGUuTWtkaXJMb2NrRmlsZSwgImxvY2tmaWxlLm1rZGlybG9ja2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKCgpkZWYgU1FMaXRlRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IFNRTGl0ZUxvY2tGaWxlIGZyb20gdGhlCiAgICBsb2NrZmlsZS5ta2RpcmxvY2tmaWxlIG1vZHVsZS4KICAgICIiIgogICAgZnJvbSAuIGltcG9ydCBzcWxpdGVsb2NrZmlsZQogICAgcmV0dXJuIF9mbF9oZWxwZXIoc3FsaXRlbG9ja2ZpbGUuU1FMaXRlTG9ja0ZpbGUsICJsb2NrZmlsZS5zcWxpdGVsb2NrZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2RzKQoKCmRlZiBsb2NrZWQocGF0aCwgdGltZW91dD1Ob25lKToKICAgICIiIkRlY29yYXRvciB3aGljaCBlbmFibGVzIGxvY2tzIGZvciBkZWNvcmF0ZWQgZnVuY3Rpb24uCgogICAgQXJndW1lbnRzOgogICAgIC0gcGF0aDogcGF0aCBmb3IgbG9ja2ZpbGUuCiAgICAgLSB0aW1lb3V0IChvcHRpb25hbCk6IFRpbWVvdXQgZm9yIGFjcXVpcmluZyBsb2NrLgoKICAgICBVc2FnZToKICAgICAgICAgQGxvY2tlZCgnL3Zhci9ydW4vbXluYW1lJywgdGltZW91dD0wKQogICAgICAgICBkZWYgbXluYW1lKC4uLik6CiAgICAgICAgICAgICAuLi4KICAgICIiIgogICAgZGVmIGRlY29yKGZ1bmMpOgogICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKICAgICAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBsb2NrID0gRmlsZUxvY2socGF0aCwgdGltZW91dD10aW1lb3V0KQogICAgICAgICAgICBsb2NrLmFjcXVpcmUoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQogICAgICAgIHJldHVybiB3cmFwcGVyCiAgICByZXR1cm4gZGVjb3IKCgppZiBoYXNhdHRyKG9zLCAibGluayIpOgogICAgZnJvbSAuIGltcG9ydCBsaW5rbG9ja2ZpbGUgYXMgX2xsZgogICAgTG9ja0ZpbGUgPSBfbGxmLkxpbmtMb2NrRmlsZQplbHNlOgogICAgZnJvbSAuIGltcG9ydCBta2RpcmxvY2tmaWxlIGFzIF9tbGYKICAgIExvY2tGaWxlID0gX21sZi5Na2RpckxvY2tGaWxlCgpGaWxlTG9jayA9IExvY2tGaWxlClBLAwQUAAAAAAAAACEAK97yJ1wKAABcCgAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHRpbWUKaW1wb3J0IG9zCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgTG9ja0ZhaWxlZCwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LAogICAgICAgICAgICAgICBBbHJlYWR5TG9ja2VkKQoKCmNsYXNzIExpbmtMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGFjY2VzcyB0byBhIGZpbGUgdXNpbmcgYXRvbWljIHByb3BlcnR5IG9mIGxpbmsoMikuCgogICAgPj4+IGxvY2sgPSBMaW5rTG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgID4+PiBsb2NrID0gTGlua0xvY2tGaWxlKCdzb21lZmlsZScsIHRocmVhZGVkPUZhbHNlKQogICAgIiIiCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9wZW4oc2VsZi51bmlxdWVfbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYudW5pcXVlX25hbWUpCgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgYW5kIGNyZWF0ZSBhIGhhcmQgbGluayB0byBpdC4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MubGluayhzZWxmLnVuaXF1ZV9uYW1lLCBzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgd2UndmUgZG91YmxlLWxvY2tlZD8KICAgICAgICAgICAgICAgIG5saW5rcyA9IG9zLnN0YXQoc2VsZi51bmlxdWVfbmFtZSkuc3RfbmxpbmsKICAgICAgICAgICAgICAgIGlmIG5saW5rcyA9PSAyOgogICAgICAgICAgICAgICAgICAgICMgVGhlIG9yaWdpbmFsIGxpbmsgcGx1cyB0aGUgb25lIEkgY3JlYXRlZCA9PSAyLiAgV2UncmUKICAgICAgICAgICAgICAgICAgICAjIGdvb2QgdG8gZ28uCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlIHRoZSBsb2NrIGNyZWF0aW9uIGZhaWxlZC4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0IC8gMTAgb3IgMC4xKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIHN1Y2NlZWRlZC4gIFdlJ3JlIGdvb2QgdG8gZ28uCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5pc19sb2NrZWQoKSBhbmQKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpIGFuZAogICAgICAgICAgICAgICAgb3Muc3RhdChzZWxmLnVuaXF1ZV9uYW1lKS5zdF9ubGluayA9PSAyKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKToKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhACEmvH4YDAAAGAwAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbgoKaW1wb3J0IHRpbWUKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGVycm5vCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgTG9ja0ZhaWxlZCwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LAogICAgICAgICAgICAgICBBbHJlYWR5TG9ja2VkKQoKCmNsYXNzIE1rZGlyTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIiIiTG9jayBmaWxlIGJ5IGNyZWF0aW5nIGEgZGlyZWN0b3J5LiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxvY2sgPSBNa2RpckxvY2tGaWxlKCdzb21lZmlsZScpCiAgICAgICAgPj4+IGxvY2sgPSBNa2RpckxvY2tGaWxlKCdzb21lZmlsZScsIHRocmVhZGVkPUZhbHNlKQogICAgICAgICIiIgogICAgICAgIExvY2tCYXNlLl9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkLCB0aW1lb3V0KQogICAgICAgICMgTG9jayBmaWxlIGl0c2VsZiBpcyBhIGRpcmVjdG9yeS4gIFBsYWNlIHRoZSB1bmlxdWUgZmlsZSBuYW1lIGludG8KICAgICAgICAjIGl0LgogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5sb2NrX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMuJXMlcyIgJSAoc2VsZi5ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlkKSkKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgogICAgICAgICAgICB3YWl0ID0gMC4xCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2FpdCA9IG1heCgwLCB0aW1lb3V0IC8gMTApCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYubG9ja19maWxlKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIGVyciA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgICAgICAgICBpZiBlcnIuZXJybm8gPT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgICAgICMgQWxyZWFkeSBsb2NrZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgQWxyZWFkeSBsb2NrZWQgYnkgbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lb25lIGVsc2UgaGFzIHRoZSBsb2NrLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAod2FpdCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBDb3VsZG4ndCBjcmVhdGUgdGhlIGxvY2sgZm9yIHNvbWUgb3RoZXIgcmVhc29uCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9wZW4oc2VsZi51bmlxdWVfbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICBvcy51bmxpbmsoc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICBvcy5ybWRpcihzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5pc19sb2NrZWQoKSBhbmQKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihzZWxmLmxvY2tfZmlsZSk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHNlbGYubG9ja19maWxlLCBuYW1lKSkKICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5sb2NrX2ZpbGUpClBLAwQUAAAAAAAAACEAIDxyLcoXAADKFwAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9waWRsb2NrZmlsZS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojIHBpZGxvY2tmaWxlLnB5CiMKIyBDb3B5cmlnaHQgwqkgMjAwOOKAkzIwMDkgQmVuIEZpbm5leSA8YmVuK3B5dGhvbkBiZW5maW5uZXkuaWQuYXU+CiMKIyBUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBtYXkgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHdvcmsKIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UsIHZlcnNpb24gMiBvcgojIGxhdGVyIGFzIHB1Ymxpc2hlZCBieSB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgTm8gd2FycmFudHkgZXhwcmVzc2VkIG9yIGltcGxpZWQuIFNlZSB0aGUgZmlsZSBMSUNFTlNFLlBTRi0yIGZvciBkZXRhaWxzLgoKIiIiIExvY2tmaWxlIGJlaGF2aW91ciBpbXBsZW1lbnRlZCB2aWEgVW5peCBQSUQgZmlsZXMuCiAgICAiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZXJybm8KaW1wb3J0IG9zCmltcG9ydCB0aW1lCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgQWxyZWFkeUxvY2tlZCwgTG9ja0ZhaWxlZCwgTm90TG9ja2VkLCBOb3RNeUxvY2ssCiAgICAgICAgICAgICAgIExvY2tUaW1lb3V0KQoKDApjbGFzcyBQSURMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiIgTG9ja2ZpbGUgaW1wbGVtZW50ZWQgYXMgYSBVbml4IFBJRCBmaWxlLgoKICAgIFRoZSBsb2NrIGZpbGUgaXMgYSBub3JtYWwgZmlsZSBuYW1lZCBieSB0aGUgYXR0cmlidXRlIGBwYXRoYC4KICAgIEEgbG9jaydzIFBJRCBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCwgY29udGFpbmluZwogICAgdGhlIHByb2Nlc3MgSUQgKFBJRCkgb2YgdGhlIHByb2Nlc3MgdGhhdCBhY3F1aXJlZCB0aGUgbG9jay4KCiAgICA+Pj4gbG9jayA9IFBJRExvY2tGaWxlKCdzb21lZmlsZScpCiAgICA+Pj4gbG9jayA9IFBJRExvY2tGaWxlKCdzb21lZmlsZScpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9RmFsc2UsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIyBwaWQgbG9ja2ZpbGVzIGRvbid0IHN1cHBvcnQgdGhyZWFkZWQgb3BlcmF0aW9uLCBzbyBhbHdheXMgZm9yY2UKICAgICAgICAjIEZhbHNlIGFzIHRoZSB0aHJlYWRlZCBhcmcuCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgRmFsc2UsIHRpbWVvdXQpCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IHNlbGYucGF0aAoKICAgIGRlZiByZWFkX3BpZChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBQSUQgZnJvbSB0aGUgbG9jayBmaWxlLgogICAgICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcmVhZF9waWRfZnJvbV9waWRmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgICIiIiBUZXN0IGlmIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBoZWxkLgoKICAgICAgICAgICAgVGhlIGxvY2sgaXMgaGVsZCBpZiB0aGUgUElEIGZpbGUgZm9yIHRoaXMgbG9jayBleGlzdHMuCgogICAgICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5wYXRoKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgIiIiIFRlc3QgaWYgdGhlIGxvY2sgaXMgaGVsZCBieSB0aGUgY3VycmVudCBwcm9jZXNzLgoKICAgICAgICBSZXR1cm5zIGBgVHJ1ZWBgIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgSUQgbWF0Y2hlcyB0aGUKICAgICAgICBudW1iZXIgc3RvcmVkIGluIHRoZSBQSUQgZmlsZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5pc19sb2NrZWQoKSBhbmQgb3MuZ2V0cGlkKCkgPT0gc2VsZi5yZWFkX3BpZCgpCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIgQWNxdWlyZSB0aGUgbG9jay4KCiAgICAgICAgQ3JlYXRlcyB0aGUgUElEIGZpbGUgZm9yIHRoaXMgbG9jaywgb3IgcmFpc2VzIGFuIGVycm9yIGlmCiAgICAgICAgdGhlIGxvY2sgY291bGQgbm90IGJlIGFjcXVpcmVkLgogICAgICAgICIiIgoKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlX3BpZF90b19waWRmaWxlKHNlbGYucGF0aCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBsb2NrIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHNsZWVwIGEgYml0LgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCAvIDEwIG9yIDAuMSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICAiIiIgUmVsZWFzZSB0aGUgbG9jay4KCiAgICAgICAgICAgIFJlbW92ZXMgdGhlIFBJRCBmaWxlIHRvIHJlbGVhc2UgdGhlIGxvY2ssIG9yIHJhaXNlcyBhbgogICAgICAgICAgICBlcnJvciBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGRvZXMgbm90IGhvbGQgdGhlIGxvY2suCgogICAgICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIHJlbW92ZV9leGlzdGluZ19waWRmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICAiIiIgQnJlYWsgYW4gZXhpc3RpbmcgbG9jay4KCiAgICAgICAgICAgIFJlbW92ZXMgdGhlIFBJRCBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLCBvdGhlcndpc2UgZG9lcwogICAgICAgICAgICBub3RoaW5nLgoKICAgICAgICAgICAgIiIiCiAgICAgICAgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUoc2VsZi5wYXRoKQoKCmRlZiByZWFkX3BpZF9mcm9tX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBSZWFkIHRoZSBQSUQgcmVjb3JkZWQgaW4gdGhlIG5hbWVkIFBJRCBmaWxlLgoKICAgICAgICBSZWFkIGFuZCByZXR1cm4gdGhlIG51bWVyaWMgUElEIHJlY29yZGVkIGFzIHRleHQgaW4gdGhlIG5hbWVkCiAgICAgICAgUElEIGZpbGUuIElmIHRoZSBQSUQgZmlsZSBjYW5ub3QgYmUgcmVhZCwgb3IgaWYgdGhlIGNvbnRlbnQgaXMKICAgICAgICBub3QgYSB2YWxpZCBQSUQsIHJldHVybiBgYE5vbmVgYC4KCiAgICAgICAgIiIiCiAgICBwaWQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgcGlkZmlsZSA9IG9wZW4ocGlkZmlsZV9wYXRoLCAncicpCiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgICMgQWNjb3JkaW5nIHRvIHRoZSBGSFMgMi4zIHNlY3Rpb24gb24gUElEIGZpbGVzIGluIC92YXIvcnVuOgogICAgICAgICMKICAgICAgICAjICAgVGhlIGZpbGUgbXVzdCBjb25zaXN0IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZXIgaW4KICAgICAgICAjICAgQVNDSUktZW5jb2RlZCBkZWNpbWFsLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgY2hhcmFjdGVyLgogICAgICAgICMKICAgICAgICAjICAgUHJvZ3JhbXMgdGhhdCByZWFkIFBJRCBmaWxlcyBzaG91bGQgYmUgc29tZXdoYXQgZmxleGlibGUKICAgICAgICAjICAgaW4gd2hhdCB0aGV5IGFjY2VwdDsgaS5lLiwgdGhleSBzaG91bGQgaWdub3JlIGV4dHJhCiAgICAgICAgIyAgIHdoaXRlc3BhY2UsIGxlYWRpbmcgemVyb2VzLCBhYnNlbmNlIG9mIHRoZSB0cmFpbGluZwogICAgICAgICMgICBuZXdsaW5lLCBvciBhZGRpdGlvbmFsIGxpbmVzIGluIHRoZSBQSUQgZmlsZS4KCiAgICAgICAgbGluZSA9IHBpZGZpbGUucmVhZGxpbmUoKS5zdHJpcCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaWQgPSBpbnQobGluZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHBpZGZpbGUuY2xvc2UoKQoKICAgIHJldHVybiBwaWQKCgpkZWYgd3JpdGVfcGlkX3RvX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBXcml0ZSB0aGUgUElEIGluIHRoZSBuYW1lZCBQSUQgZmlsZS4KCiAgICAgICAgR2V0IHRoZSBudW1lcmljIHByb2Nlc3MgSUQgKOKAnFBJROKAnSkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcwogICAgICAgIGFuZCB3cml0ZSBpdCB0byB0aGUgbmFtZWQgZmlsZSBhcyBhIGxpbmUgb2YgdGV4dC4KCiAgICAgICAgIiIiCiAgICBvcGVuX2ZsYWdzID0gKG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wgfCBvcy5PX1dST05MWSkKICAgIG9wZW5fbW9kZSA9IDBvNjQ0CiAgICBwaWRmaWxlX2ZkID0gb3Mub3BlbihwaWRmaWxlX3BhdGgsIG9wZW5fZmxhZ3MsIG9wZW5fbW9kZSkKICAgIHBpZGZpbGUgPSBvcy5mZG9wZW4ocGlkZmlsZV9mZCwgJ3cnKQoKICAgICMgQWNjb3JkaW5nIHRvIHRoZSBGSFMgMi4zIHNlY3Rpb24gb24gUElEIGZpbGVzIGluIC92YXIvcnVuOgogICAgIwogICAgIyAgIFRoZSBmaWxlIG11c3QgY29uc2lzdCBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVyIGluCiAgICAjICAgQVNDSUktZW5jb2RlZCBkZWNpbWFsLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgY2hhcmFjdGVyLiBGb3IKICAgICMgICBleGFtcGxlLCBpZiBjcm9uZCB3YXMgcHJvY2VzcyBudW1iZXIgMjUsIC92YXIvcnVuL2Nyb25kLnBpZAogICAgIyAgIHdvdWxkIGNvbnRhaW4gdGhyZWUgY2hhcmFjdGVyczogdHdvLCBmaXZlLCBhbmQgbmV3bGluZS4KCiAgICBwaWQgPSBvcy5nZXRwaWQoKQogICAgcGlkZmlsZS53cml0ZSgiJXNcbiIgJSBwaWQpCiAgICBwaWRmaWxlLmNsb3NlKCkKCgpkZWYgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBSZW1vdmUgdGhlIG5hbWVkIFBJRCBmaWxlIGlmIGl0IGV4aXN0cy4KCiAgICAgICAgUmVtb3ZpbmcgYSBQSUQgZmlsZSB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBwdXRzIHVzIGluIHRoZQogICAgICAgIGRlc2lyZWQgc3RhdGUsIHNvIHdlIGlnbm9yZSB0aGUgY29uZGl0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90CiAgICAgICAgZXhpc3QuCgogICAgICAgICIiIgogICAgdHJ5OgogICAgICAgIG9zLnJlbW92ZShwaWRmaWxlX3BhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlClBLAwQUAAAAAAAAACEAu4XwvYIVAACCFQAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbgoKaW1wb3J0IHRpbWUKaW1wb3J0IG9zCgp0cnk6CiAgICB1bmljb2RlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICB1bmljb2RlID0gc3RyCgpmcm9tIC4gaW1wb3J0IExvY2tCYXNlLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsIEFscmVhZHlMb2NrZWQKCgpjbGFzcyBTUUxpdGVMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiRGVtb25zdHJhdGUgU1FMLWJhc2VkIGxvY2tpbmcuIgoKICAgIHRlc3RkYiA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IFNRTGl0ZUxvY2tGaWxlKCdzb21lZmlsZScpCiAgICAgICAgPj4+IGxvY2sgPSBTUUxpdGVMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICBzZWxmLmxvY2tfZmlsZSA9IHVuaWNvZGUoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IHVuaWNvZGUoc2VsZi51bmlxdWVfbmFtZSkKCiAgICAgICAgaWYgU1FMaXRlTG9ja0ZpbGUudGVzdGRiIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCB0ZW1wZmlsZQogICAgICAgICAgICBfZmQsIHRlc3RkYiA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBvcy5jbG9zZShfZmQpCiAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZGIpCiAgICAgICAgICAgIGRlbCBfZmQsIHRlbXBmaWxlCiAgICAgICAgICAgIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYiA9IHRlc3RkYgoKICAgICAgICBpbXBvcnQgc3FsaXRlMwogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNxbGl0ZTMuY29ubmVjdChTUUxpdGVMb2NrRmlsZS50ZXN0ZGIpCgogICAgICAgIGMgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGMuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgIigiCiAgICAgICAgICAgICAgICAgICAgICAiICAgbG9ja19maWxlIHZhcmNoYXIoMzIpLCIKICAgICAgICAgICAgICAgICAgICAgICIgICB1bmlxdWVfbmFtZSB2YXJjaGFyKDMyKSIKICAgICAgICAgICAgICAgICAgICAgICIpIikKICAgICAgICBleGNlcHQgc3FsaXRlMy5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCiAgICAgICAgICAgIGltcG9ydCBhdGV4aXQKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKG9zLnVubGluaywgU1FMaXRlTG9ja0ZpbGUudGVzdGRiKQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhaXQgPSAwLjEKICAgICAgICBlbGlmIHRpbWVvdXQgPD0gMDoKICAgICAgICAgICAgd2FpdCA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICB3YWl0ID0gdGltZW91dCAvIDEwCgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgICAgICMgTm90IGxvY2tlZC4gIFRyeSB0byBsb2NrIGl0LgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImluc2VydCBpbnRvIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgKGxvY2tfZmlsZSwgdW5pcXVlX25hbWUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdmFsdWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgKD8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwgc2VsZi51bmlxdWVfbmFtZSkpCiAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKCiAgICAgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdGhlIG9ubHkgbG9jayBob2xkZXIuCiAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwpKQogICAgICAgICAgICAgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCiAgICAgICAgICAgICAgICBpZiBsZW4ocm93cykgPiAxOgogICAgICAgICAgICAgICAgICAgICMgTm9wZS4gIFNvbWVvbmUgZWxzZSBnb3QgdGhlcmUuICBSZW1vdmUgb3VyIGxvY2suCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBZdXAuICBXZSdyZSBkb25lLCBzbyBnbyBob21lLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHRoZSBvbmx5IGxvY2sgaG9sZGVyLgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgICAgICAgICAgaWYgbGVuKHJvd3MpID09IDE6CiAgICAgICAgICAgICAgICAgICAgIyBXZSdyZSB0aGUgbG9ja2VyLCBzbyBnbyBob21lLgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgd2FpdCBhIGJpdCBsb25nZXIuCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAjIE5vIG1vcmUgd2FpdGluZy4KICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lb25lIGVsc2UgaGFzIHRoZSBsb2NrIGFuZCB3ZSBhcmUgaW1wYXRpZW50Li4KICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJSBzZWxmLnBhdGgpCgogICAgICAgICAgICAjIFdlbGwsIG9rYXkuICBXZSdsbCBnaXZlIGl0IGEgYml0IGxvbmdlci4KICAgICAgICAgICAgdGltZS5zbGVlcCh3YWl0KQoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSAoYnkgJXMpIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5fd2hvX2lzX2xvY2tpbmcoKSkpCiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKCiAgICBkZWYgX3dob19pc19sb2NraW5nKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgdW5pcXVlX25hbWUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICByZXR1cm4gY3Vyc29yLmZldGNob25lKClbMF0KCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwpKQogICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgIHJldHVybiBub3Qgbm90IHJvd3MKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iCiAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhbmQgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsIHNlbGYudW5pcXVlX25hbWUpKQogICAgICAgIHJldHVybiBub3Qgbm90IGN1cnNvci5mZXRjaGFsbCgpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwpKQogICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQpQSwMEFAAAAAAAAAAhAJEjCdk4CgAAOAoAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3ltbGlua2xvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgdGltZQoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwKICAgICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCkKCgpjbGFzcyBTeW1saW5rTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIiIiTG9jayBhY2Nlc3MgdG8gYSBmaWxlIHVzaW5nIHN5bWxpbmsoMikuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIyBzdXBlcihTeW1saW5rTG9ja0ZpbGUpLl9faW5pdCguLi4pCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQsIHRpbWVvdXQpCiAgICAgICAgIyBzcGxpdCBpdCBiYWNrIQogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYudW5pcXVlX25hbWUpWzFdCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAjIEhvcGVmdWxseSB1bm5lY2Vzc2FyeSBmb3Igc3ltbGluay4KICAgICAgICAjIHRyeToKICAgICAgICAjICAgICBvcGVuKHNlbGYudW5pcXVlX25hbWUsICJ3YiIpLmNsb3NlKCkKICAgICAgICAjIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICMgICAgIHJhaXNlIExvY2tGYWlsZWQoImZhaWxlZCB0byBjcmVhdGUgJXMiICUgc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgVHJ5IGFuZCBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rIHRvIGl0LgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHNlbGYudW5pcXVlX25hbWUsIHNlbGYubG9ja19maWxlKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBmYWlsZWQuICBNYXliZSB3ZSd2ZSBkb3VibGUtbG9ja2VkPwogICAgICAgICAgICAgICAgaWYgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgICAgICAgICAjIExpbmtlZCB0byBvdXQgdW5pcXVlIG5hbWUuIFByb2NlZWQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlIHRoZSBsb2NrIGNyZWF0aW9uIGZhaWxlZC4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHRpbWVvdXQgLyAxMCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2UgMC4xKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIHN1Y2NlZWRlZC4gIFdlJ3JlIGdvb2QgdG8gZ28uCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBlbGlmIG5vdCBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNsaW5rKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIChvcy5wYXRoLmlzbGluayhzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgICAgIGFuZCBvcy5yZWFkbGluayhzZWxmLmxvY2tfZmlsZSkgPT0gc2VsZi51bmlxdWVfbmFtZSkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmxvY2tfZmlsZSk6ICAjIGV4aXN0cyAmJiBsaW5rCiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKUEsDBBQAAAAAAAAAIQDWUhkj/g8AAP4PAAAqAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL29yZGVyZWRkaWN0LnB5IyBDb3B5cmlnaHQgKGMpIDIwMDkgUmF5bW9uZCBIZXR0aW5nZXIKIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCiMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAojIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCiMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAojIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiMgICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAojICAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKIyAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKIyAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKIyAgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiMgICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwojICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiMgICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCmZyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbgoKY2xhc3MgT3JkZXJlZERpY3QoZGljdCwgRGljdE1peGluKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fX2VuZAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgc2VsZi51cGRhdGUoKmFyZ3MsICoqa3dkcykKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgc2VsZi5fX2VuZCA9IGVuZCA9IFtdCiAgICAgICAgZW5kICs9IFtOb25lLCBlbmQsIGVuZF0gICAgICAgICAjIHNlbnRpbmVsIG5vZGUgZm9yIGRvdWJseSBsaW5rZWQgbGlzdAogICAgICAgIHNlbGYuX19tYXAgPSB7fSAgICAgICAgICAgICAgICAgIyBrZXkgLS0+IFtrZXksIHByZXYsIG5leHRdCiAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgIGVuZCA9IHNlbGYuX19lbmQKICAgICAgICAgICAgY3VyciA9IGVuZFsxXQogICAgICAgICAgICBjdXJyWzJdID0gZW5kWzFdID0gc2VsZi5fX21hcFtrZXldID0gW2tleSwgY3VyciwgZW5kXQogICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBkaWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSkKICAgICAgICBrZXksIHByZXYsIG5leHQgPSBzZWxmLl9fbWFwLnBvcChrZXkpCiAgICAgICAgcHJldlsyXSA9IG5leHQKICAgICAgICBuZXh0WzFdID0gcHJldgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCiAgICAgICAgY3VyciA9IGVuZFsyXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IGVuZDoKICAgICAgICAgICAgeWllbGQgY3VyclswXQogICAgICAgICAgICBjdXJyID0gY3VyclsyXQoKICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgZW5kID0gc2VsZi5fX2VuZAogICAgICAgIGN1cnIgPSBlbmRbMV0KICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCBlbmQ6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMF0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMV0KCiAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCiAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAga2V5ID0gcmV2ZXJzZWQoc2VsZikubmV4dCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAga2V5ID0gaXRlcihzZWxmKS5uZXh0KCkKICAgICAgICB2YWx1ZSA9IHNlbGYucG9wKGtleSkKICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQogICAgICAgIHRtcCA9IHNlbGYuX19tYXAsIHNlbGYuX19lbmQKICAgICAgICBkZWwgc2VsZi5fX21hcCwgc2VsZi5fX2VuZAogICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCiAgICAgICAgc2VsZi5fX21hcCwgc2VsZi5fX2VuZCA9IHRtcAogICAgICAgIGlmIGluc3RfZGljdDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChpdGVtcywpCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKCiAgICBzZXRkZWZhdWx0ID0gRGljdE1peGluLnNldGRlZmF1bHQKICAgIHVwZGF0ZSA9IERpY3RNaXhpbi51cGRhdGUKICAgIHBvcCA9IERpY3RNaXhpbi5wb3AKICAgIHZhbHVlcyA9IERpY3RNaXhpbi52YWx1ZXMKICAgIGl0ZW1zID0gRGljdE1peGluLml0ZW1zCiAgICBpdGVya2V5cyA9IERpY3RNaXhpbi5pdGVya2V5cwogICAgaXRlcnZhbHVlcyA9IERpY3RNaXhpbi5pdGVydmFsdWVzCiAgICBpdGVyaXRlbXMgPSBEaWN0TWl4aW4uaXRlcml0ZW1zCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByZXR1cm4gJyVzKCknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICBkID0gY2xzKCkKICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgogICAgICAgICAgICBpZiBsZW4oc2VsZikgIT0gbGVuKG90aGVyKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBmb3IgcCwgcSBpbiAgemlwKHNlbGYuaXRlbXMoKSwgb3RoZXIuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBwICE9IHE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgpQSwMEFAAAAAAAAAAhADwpWMbQAgAA0AIAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE2LjgiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxNiAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAgXaWygECAAABAgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpmcm9tIC5fX2Fib3V0X18gaW1wb3J0ICgKICAgIF9fYXV0aG9yX18sIF9fY29weXJpZ2h0X18sIF9fZW1haWxfXywgX19saWNlbnNlX18sIF9fc3VtbWFyeV9fLCBfX3RpdGxlX18sCiAgICBfX3VyaV9fLCBfX3ZlcnNpb25fXwopCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQpQSwMEFAAAAAAAAAAhAOZpSuNcAwAAXAMAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3lzCgoKUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKIyBmbGFrZTg6IG5vcWEKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiIKICAgIENyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4KICAgICIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pClBLAwQUAAAAAAAAACEA+v2kEogFAACIBQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhAH0sK1cmIAAAJiAAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgKAogICAgUGFyc2VFeGNlcHRpb24sIFBhcnNlUmVzdWx0cywgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwKKQpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgR3JvdXAsIEZvcndhcmQsIFF1b3RlZFN0cmluZwpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBTcGVjaWZpZXIsIEludmFsaWRTcGVjaWZpZXIKCgpfX2FsbF9fID0gWwogICAgIkludmFsaWRNYXJrZXIiLCAiVW5kZWZpbmVkQ29tcGFyaXNvbiIsICJVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUiLAogICAgIk1hcmtlciIsICJkZWZhdWx0X2Vudmlyb25tZW50IiwKXQoKCmNsYXNzIEludmFsaWRNYXJrZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgbWFya2VyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRDb21wYXJpc29uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgdmFsdWUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEEgbmFtZSB3YXMgYXR0ZW1wdGVkIHRvIGJlIHVzZWQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbnNpZGUgb2YgdGhlCiAgICBlbnZpcm9ubWVudC4KICAgICIiIgoKCmNsYXNzIE5vZGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi52YWx1ZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9KT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpKQoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIFZhcmlhYmxlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKCmNsYXNzIFZhbHVlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuICciezB9IicuZm9ybWF0KHNlbGYpCgoKY2xhc3MgT3AoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKVkFSSUFCTEUgPSAoCiAgICBMKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfAogICAgTCgiaW1wbGVtZW50YXRpb25fbmFtZSIpIHwKICAgIEwoInB5dGhvbl9mdWxsX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9yZWxlYXNlIikgfAogICAgTCgicGxhdGZvcm1fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX21hY2hpbmUiKSB8CiAgICBMKCJwbGF0Zm9ybV9zeXN0ZW0iKSB8CiAgICBMKCJweXRob25fdmVyc2lvbiIpIHwKICAgIEwoInN5c19wbGF0Zm9ybSIpIHwKICAgIEwoIm9zX25hbWUiKSB8CiAgICBMKCJvcy5uYW1lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJzeXMucGxhdGZvcm0iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnZlcnNpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLm1hY2hpbmUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyB1bmRvY3VtZW50ZWQgc2V0dXB0b29scyBsZWdhY3kKICAgIEwoImV4dHJhIikKKQpBTElBU0VTID0gewogICAgJ29zLm5hbWUnOiAnb3NfbmFtZScsCiAgICAnc3lzLnBsYXRmb3JtJzogJ3N5c19wbGF0Zm9ybScsCiAgICAncGxhdGZvcm0udmVyc2lvbic6ICdwbGF0Zm9ybV92ZXJzaW9uJywKICAgICdwbGF0Zm9ybS5tYWNoaW5lJzogJ3BsYXRmb3JtX21hY2hpbmUnLAogICAgJ3BsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nLAogICAgJ3B5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nCn0KVkFSSUFCTEUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhcmlhYmxlKEFMSUFTRVMuZ2V0KHRbMF0sIHRbMF0pKSkKClZFUlNJT05fQ01QID0gKAogICAgTCgiPT09IikgfAogICAgTCgiPT0iKSB8CiAgICBMKCI+PSIpIHwKICAgIEwoIjw9IikgfAogICAgTCgiIT0iKSB8CiAgICBMKCJ+PSIpIHwKICAgIEwoIj4iKSB8CiAgICBMKCI8IikKKQoKTUFSS0VSX09QID0gVkVSU0lPTl9DTVAgfCBMKCJub3QgaW4iKSB8IEwoImluIikKTUFSS0VSX09QLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBPcCh0WzBdKSkKCk1BUktFUl9WQUxVRSA9IFF1b3RlZFN0cmluZygiJyIpIHwgUXVvdGVkU3RyaW5nKCciJykKTUFSS0VSX1ZBTFVFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYWx1ZSh0WzBdKSkKCkJPT0xPUCA9IEwoImFuZCIpIHwgTCgib3IiKQoKTUFSS0VSX1ZBUiA9IFZBUklBQkxFIHwgTUFSS0VSX1ZBTFVFCgpNQVJLRVJfSVRFTSA9IEdyb3VwKE1BUktFUl9WQVIgKyBNQVJLRVJfT1AgKyBNQVJLRVJfVkFSKQpNQVJLRVJfSVRFTS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdHVwbGUodFswXSkpCgpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQoKTUFSS0VSX0VYUFIgPSBGb3J3YXJkKCkKTUFSS0VSX0FUT00gPSBNQVJLRVJfSVRFTSB8IEdyb3VwKExQQVJFTiArIE1BUktFUl9FWFBSICsgUlBBUkVOKQpNQVJLRVJfRVhQUiA8PCBNQVJLRVJfQVRPTSArIFplcm9Pck1vcmUoQk9PTE9QICsgTUFSS0VSX0VYUFIpCgpNQVJLRVIgPSBzdHJpbmdTdGFydCArIE1BUktFUl9FWFBSICsgc3RyaW5nRW5kCgoKZGVmIF9jb2VyY2VfcGFyc2VfcmVzdWx0KHJlc3VsdHMpOgogICAgaWYgaXNpbnN0YW5jZShyZXN1bHRzLCBQYXJzZVJlc3VsdHMpOgogICAgICAgIHJldHVybiBbX2NvZXJjZV9wYXJzZV9yZXN1bHQoaSkgZm9yIGkgaW4gcmVzdWx0c10KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCgpkZWYgX2Zvcm1hdF9tYXJrZXIobWFya2VyLCBmaXJzdD1UcnVlKToKICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICMgU29tZXRpbWVzIHdlIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSBbWy4uLl1dIHdoaWNoIGlzIGEgc2luZ2xlIGl0ZW0gbGlzdAogICAgIyB3aGVyZSB0aGUgc2luZ2xlIGl0ZW0gaXMgaXRzZWxmIGl0J3Mgb3duIGxpc3QuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHNraXAKICAgICMgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBleHRyYW5lb3VzICgpIG9uIHRoZQogICAgIyBvdXRzaWRlLgogICAgaWYgKGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KSBhbmQgbGVuKG1hcmtlcikgPT0gMSBhbmQKICAgICAgICAgICAgaXNpbnN0YW5jZShtYXJrZXJbMF0sIChsaXN0LCB0dXBsZSkpKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIobWFya2VyWzBdKQoKICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICBpbm5lciA9IChfZm9ybWF0X21hcmtlcihtLCBmaXJzdD1GYWxzZSkgZm9yIG0gaW4gbWFya2VyKQogICAgICAgIGlmIGZpcnN0OgogICAgICAgICAgICByZXR1cm4gIiAiLmpvaW4oaW5uZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIoIiArICIgIi5qb2luKGlubmVyKSArICIpIgogICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgIHJldHVybiAiICIuam9pbihbbS5zZXJpYWxpemUoKSBmb3IgbSBpbiBtYXJrZXJdKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFya2VyCgoKX29wZXJhdG9ycyA9IHsKICAgICJpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIGluIHJocywKICAgICJub3QgaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBub3QgaW4gcmhzLAogICAgIjwiOiBvcGVyYXRvci5sdCwKICAgICI8PSI6IG9wZXJhdG9yLmxlLAogICAgIj09Ijogb3BlcmF0b3IuZXEsCiAgICAiIT0iOiBvcGVyYXRvci5uZSwKICAgICI+PSI6IG9wZXJhdG9yLmdlLAogICAgIj4iOiBvcGVyYXRvci5ndCwKfQoKCmRlZiBfZXZhbF9vcChsaHMsIG9wLCByaHMpOgogICAgdHJ5OgogICAgICAgIHNwZWMgPSBTcGVjaWZpZXIoIiIuam9pbihbb3Auc2VyaWFsaXplKCksIHJoc10pKQogICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByZXR1cm4gc3BlYy5jb250YWlucyhsaHMpCgogICAgb3BlciA9IF9vcGVyYXRvcnMuZ2V0KG9wLnNlcmlhbGl6ZSgpKQogICAgaWYgb3BlciBpcyBOb25lOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZENvbXBhcmlzb24oCiAgICAgICAgICAgICJVbmRlZmluZWQgezAhcn0gb24gezEhcn0gYW5kIHsyIXJ9LiIuZm9ybWF0KG9wLCBsaHMsIHJocykKICAgICAgICApCgogICAgcmV0dXJuIG9wZXIobGhzLCByaHMpCgoKX3VuZGVmaW5lZCA9IG9iamVjdCgpCgoKZGVmIF9nZXRfZW52KGVudmlyb25tZW50LCBuYW1lKToKICAgIHZhbHVlID0gZW52aXJvbm1lbnQuZ2V0KG5hbWUsIF91bmRlZmluZWQpCgogICAgaWYgdmFsdWUgaXMgX3VuZGVmaW5lZDoKICAgICAgICByYWlzZSBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoCiAgICAgICAgICAgICJ7MCFyfSBkb2VzIG5vdCBleGlzdCBpbiBldmFsdWF0aW9uIGVudmlyb25tZW50LiIuZm9ybWF0KG5hbWUpCiAgICAgICAgKQoKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBfZXZhbHVhdGVfbWFya2VycyhtYXJrZXJzLCBlbnZpcm9ubWVudCk6CiAgICBncm91cHMgPSBbW11dCgogICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlciwgZW52aXJvbm1lbnQpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICAgICAgbGhzLCBvcCwgcmhzID0gbWFya2VyCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxocywgVmFyaWFibGUpOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIGxocy52YWx1ZSkKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IHJocy52YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gbGhzLnZhbHVlCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgcmhzLnZhbHVlKQoKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWxfb3AobGhzX3ZhbHVlLCBvcCwgcmhzX3ZhbHVlKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbWFya2VyIGluIFsiYW5kIiwgIm9yIl0KICAgICAgICAgICAgaWYgbWFya2VyID09ICJvciI6CiAgICAgICAgICAgICAgICBncm91cHMuYXBwZW5kKFtdKQoKICAgIHJldHVybiBhbnkoYWxsKGl0ZW0pIGZvciBpdGVtIGluIGdyb3VwcykKCgpkZWYgZm9ybWF0X2Z1bGxfdmVyc2lvbihpbmZvKToKICAgIHZlcnNpb24gPSAnezAubWFqb3J9LnswLm1pbm9yfS57MC5taWNyb30nLmZvcm1hdChpbmZvKQogICAga2luZCA9IGluZm8ucmVsZWFzZWxldmVsCiAgICBpZiBraW5kICE9ICdmaW5hbCc6CiAgICAgICAgdmVyc2lvbiArPSBraW5kWzBdICsgc3RyKGluZm8uc2VyaWFsKQogICAgcmV0dXJuIHZlcnNpb24KCgpkZWYgZGVmYXVsdF9lbnZpcm9ubWVudCgpOgogICAgaWYgaGFzYXR0cihzeXMsICdpbXBsZW1lbnRhdGlvbicpOgogICAgICAgIGl2ZXIgPSBmb3JtYXRfZnVsbF92ZXJzaW9uKHN5cy5pbXBsZW1lbnRhdGlvbi52ZXJzaW9uKQogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSBzeXMuaW1wbGVtZW50YXRpb24ubmFtZQogICAgZWxzZToKICAgICAgICBpdmVyID0gJzAnCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9ICcnCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wbGVtZW50YXRpb25fbmFtZSI6IGltcGxlbWVudGF0aW9uX25hbWUsCiAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiBpdmVyLAogICAgICAgICJvc19uYW1lIjogb3MubmFtZSwKICAgICAgICAicGxhdGZvcm1fbWFjaGluZSI6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAicGxhdGZvcm1fcmVsZWFzZSI6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAicGxhdGZvcm1fc3lzdGVtIjogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgInBsYXRmb3JtX3ZlcnNpb24iOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgInB5dGhvbl9mdWxsX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICAicHl0aG9uX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpWzozXSwKICAgICAgICAic3lzX3BsYXRmb3JtIjogc3lzLnBsYXRmb3JtLAogICAgfQoKCmNsYXNzIE1hcmtlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fbWFya2VycyA9IF9jb2VyY2VfcGFyc2VfcmVzdWx0KE1BUktFUi5wYXJzZVN0cmluZyhtYXJrZXIpKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJfc3RyID0gIkludmFsaWQgbWFya2VyOiB7MCFyfSwgcGFyc2UgZXJyb3IgYXQgezEhcn0iLmZvcm1hdCgKICAgICAgICAgICAgICAgIG1hcmtlciwgbWFya2VyW2UubG9jOmUubG9jICsgOF0pCiAgICAgICAgICAgIHJhaXNlIEludmFsaWRNYXJrZXIoZXJyX3N0cikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIoc2VsZi5fbWFya2VycykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TWFya2VyKHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpCgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIGVudmlyb25tZW50PU5vbmUpOgogICAgICAgICIiIkV2YWx1YXRlIGEgbWFya2VyLgoKICAgICAgICBSZXR1cm4gdGhlIGJvb2xlYW4gZnJvbSBldmFsdWF0aW5nIHRoZSBnaXZlbiBtYXJrZXIgYWdhaW5zdCB0aGUKICAgICAgICBlbnZpcm9ubWVudC4gZW52aXJvbm1lbnQgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gb3ZlcnJpZGUgYWxsIG9yCiAgICAgICAgcGFydCBvZiB0aGUgZGV0ZXJtaW5lZCBlbnZpcm9ubWVudC4KCiAgICAgICAgVGhlIGVudmlyb25tZW50IGlzIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBQeXRob24gcHJvY2Vzcy4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50ID0gZGVmYXVsdF9lbnZpcm9ubWVudCgpCiAgICAgICAgaWYgZW52aXJvbm1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQudXBkYXRlKGVudmlyb25tZW50KQoKICAgICAgICByZXR1cm4gX2V2YWx1YXRlX21hcmtlcnMoc2VsZi5fbWFya2VycywgY3VycmVudF9lbnZpcm9ubWVudCkKUEsDBBQAAAAAAAAAIQCuEZ/z5xAAAOcQAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3RyaW5nCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0ICgKICAgIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsIG9yaWdpbmFsVGV4dEZvciwgUGFyc2VFeGNlcHRpb24KKQpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyJ1teIF0rJykoInVybCIpClVSTCA9IChBVCArIFVSSSkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwKICAgICAgICAgICAgICAgICAgICAgICBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UpKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgJycpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBFUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEVSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBcCiAgICBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudCwgcGFyc2UgZXJyb3IgYXQgXCJ7MCFyfVwiIi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jOmUubG9jICsgOF0pKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQB8RYOMeW0AAHltAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGFiYwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMsIHdpdGhfbWV0YWNsYXNzCmZyb20gLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIExlZ2FjeVZlcnNpb24sIHBhcnNlCgoKY2xhc3MgSW52YWxpZFNwZWNpZmllcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBzcGVjaWZpZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIEJhc2VTcGVjaWZpZXIod2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIG9iamVjdCkpOgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHN0ciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4gVGhpcwogICAgICAgIHNob3VsZCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgU3BlY2lmaWVyIGl0c2VsZi4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBub3QgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYW4gaXRlcmFibGUgb2YgaXRlbXMgYW5kIGZpbHRlcnMgdGhlbSBzbyB0aGF0IG9ubHkgaXRlbXMgd2hpY2gKICAgICAgICBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllciBhcmUgYWxsb3dlZCBpbiBpdC4KICAgICAgICAiIiIKCgpjbGFzcyBfSW5kaXZpZHVhbFNwZWNpZmllcihCYXNlU3BlY2lmaWVyKToKCiAgICBfb3BlcmF0b3JzID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlYz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2goc3BlYykKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRTcGVjaWZpZXIoIkludmFsaWQgc3BlY2lmaWVyOiAnezB9JyIuZm9ybWF0KHNwZWMpKQoKICAgICAgICBzZWxmLl9zcGVjID0gKAogICAgICAgICAgICBtYXRjaC5ncm91cCgib3BlcmF0b3IiKS5zdHJpcCgpLAogICAgICAgICAgICBtYXRjaC5ncm91cCgidmVyc2lvbiIpLnN0cmlwKCksCiAgICAgICAgKQoKICAgICAgICAjIFN0b3JlIHdoZXRoZXIgb3Igbm90IHRoaXMgU3BlY2lmaWVyIHNob3VsZCBhY2NlcHQgcHJlcmVsZWFzZXMKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn17Mn0pPiIuZm9ybWF0KAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgc3RyKHNlbGYpLAogICAgICAgICAgICBwcmUsCiAgICAgICAgKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoKnNlbGYuX3NwZWMpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWMpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyA9PSBvdGhlci5fc3BlYwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgIT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX2dldF9vcGVyYXRvcihzZWxmLCBvcCk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9jb21wYXJlX3swfSIuZm9ybWF0KHNlbGYuX29wZXJhdG9yc1tvcF0pKQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcGVyYXRvcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHByZXJlbGVhc2VzIGFyZSB0byBiZSBhbGxvd2VkIG9yIG5vdC4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBOb3JtYWxpemUgaXRlbSB0byBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiwgdGhpcyBhbGxvd3MgdXMgdG8gaGF2ZQogICAgICAgICMgYSBzaG9ydGN1dCBmb3IgYGAiMi4wIiBpbiBTcGVjaWZpZXIoIj49MiIpCiAgICAgICAgaXRlbSA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzdXBwb3J0aW5nIHByZXJlbGVhc2VzIGluIHRoaXMgc3BlY2lmaWVyCiAgICAgICAgIyBvciBub3QsIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHByZXJlbGVhc2VzIHRoYW4gd2UgY2FuIHNob3J0IGNpcmN1aXQKICAgICAgICAjIGxvZ2ljIGlmIHRoaXMgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2VzLgogICAgICAgIGlmIGl0ZW0uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBBY3R1YWxseSBkbyB0aGUgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIGlzIGNvbnRhaW5lZAogICAgICAgICMgd2l0aGluIHRoaXMgU3BlY2lmaWVyIG9yIG5vdC4KICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKHNlbGYub3BlcmF0b3IpKGl0ZW0sIHNlbGYudmVyc2lvbikKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICB5aWVsZGVkID0gRmFsc2UKICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgIGt3ID0geyJwcmVyZWxlYXNlcyI6IHByZXJlbGVhc2VzIGlmIHByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGVsc2UgVHJ1ZX0KCiAgICAgICAgIyBBdHRlbXB0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgYW5kIGlmIGFueSBvZgogICAgICAgICMgdGhlbSBtYXRjaCwgeWllbGQgdGhlbS4KICAgICAgICBmb3IgdmVyc2lvbiBpbiBpdGVyYWJsZToKICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgICAgICAgICAgaWYgc2VsZi5jb250YWlucyhwYXJzZWRfdmVyc2lvbiwgKiprdyk6CiAgICAgICAgICAgICAgICAjIElmIG91ciB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgYW5kIHdlIHdlcmUgbm90IHNldCB0byBhbGxvdwogICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgdGhlbiB3ZSdsbCBzdG9yZSBpdCBmb3IgbGF0ZXIgaW5jYXNlIG5vdGhpbmcKICAgICAgICAgICAgICAgICMgZWxzZSBtYXRjaGVzIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICAgICAgICAgaWYgKHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAocHJlcmVsZWFzZXMgb3Igc2VsZi5wcmVyZWxlYXNlcykpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgIyBFaXRoZXIgdGhpcyBpcyBub3QgYSBwcmVyZWxlYXNlLCBvciB3ZSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAjIGFjY2VwdGluZyBwcmVyZWxlYXNlcyBmcm9tIHRoZSBiZWdpbmluZy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgaXRlcmF0ZWQgb3ZlciBldmVyeXRoaW5nLCBkZXRlcm1pbmUgaWYgd2UndmUgeWllbGRlZAogICAgICAgICMgYW55IHZhbHVlcywgYW5kIGlmIHdlIGhhdmUgbm90IGFuZCB3ZSBoYXZlIGFueSBwcmVyZWxlYXNlcyBzdG9yZWQgdXAKICAgICAgICAjIHRoZW4gd2Ugd2lsbCBnbyBhaGVhZCBhbmQgeWllbGQgdGhlIHByZXJlbGVhc2VzLgogICAgICAgIGlmIG5vdCB5aWVsZGVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgoKY2xhc3MgTGVnYWN5U3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KD09fCE9fDw9fD49fDx8PikpCiAgICAgICAgXHMqCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgIFteLDtccyldKiAjIFNpbmNlIHRoaXMgaXMgYSAibGVnYWN5IiBzcGVjaWZpZXIsIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgY2FuIGJlIGp1c3QgYWJvdXQgYW55dGhpbmcsIHdlIG1hdGNoIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0IGZvciB3aGl0ZXNwYWNlLCBhIHNlbWktY29sb24gZm9yIG1hcmtlciBzdXBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgIyBhIGNsb3NpbmcgcGFyZW4gc2luY2UgdmVyc2lvbnMgY2FuIGJlIGVuY2xvc2VkIGluCiAgICAgICAgICAgICAgICAgICAgICAjIHRoZW0sIGFuZCBhIGNvbW1hIHNpbmNlIGl0J3MgYSB2ZXJzaW9uIHNlcGFyYXRvci4KICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICB9CgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IExlZ2FjeVZlcnNpb24oc3RyKHZlcnNpb24pKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgIT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPCBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgoKZGVmIF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHdyYXBwZWQoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3NwZWN0aXZlLCBWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGZuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKQogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4ofj18PT18IT18PD18Pj18PHw+fD09PSkpCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgaWRlbnRpdHkgb3BlcmF0b3JzIGFsbG93IGZvciBhbiBlc2NhcGUgaGF0Y2ggdGhhdCB3aWxsCiAgICAgICAgICAgICAgICAjIGRvIGFuIGV4YWN0IHN0cmluZyBtYXRjaCBvZiB0aGUgdmVyc2lvbiB5b3Ugd2lzaCB0byBpbnN0YWxsLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgbm90IGJlIHBhcnNlZCBieSBQRVAgNDQwIGFuZCB3ZSBjYW5ub3QgZGV0ZXJtaW5lCiAgICAgICAgICAgICAgICAjIGFueSBzZW1hbnRpYyBtZWFuaW5nIGZyb20gaXQuIFRoaXMgb3BlcmF0b3IgaXMgZGlzY291cmFnZWQKICAgICAgICAgICAgICAgICMgYnV0IGluY2x1ZGVkIGVudGlyZWx5IGFzIGFuIGVzY2FwZSBoYXRjaC4KICAgICAgICAgICAgICAgICg/PD09PT0pICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBpZGVudGl0eSBvcGVyYXRvcgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICBbXlxzXSogICAgIyBXZSBqdXN0IG1hdGNoIGV2ZXJ5dGhpbmcsIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgYXJlIG9ubHkgdGVzdGluZyBmb3Igc3RyaWN0IGlkZW50aXR5LgogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBhbGxvdyBmb3Igd2lsZCBjYXJkIGFuZCBsb2NhbAogICAgICAgICAgICAgICAgIyB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgc28gd2UgaGF2ZSB0byBkZWZpbmUgdGhlc2UgdHdvCiAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzZXBhcmF0ZWx5IHRvIGVuYWJsZSB0aGF0LgogICAgICAgICAgICAgICAgKD88PT09fCE9KSAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgZXF1YWxzIGFuZCBub3QgZXF1YWxzCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CgogICAgICAgICAgICAgICAgIyBZb3UgY2Fubm90IHVzZSBhIHdpbGQgY2FyZCBhbmQgYSBkZXYgb3IgbG9jYWwgdmVyc2lvbgogICAgICAgICAgICAgICAgIyB0b2dldGhlciBzbyBncm91cCB0aGVtIHdpdGggYSB8IGFuZCBtYWtlIHRoZW0gb3B0aW9uYWwuCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/OlwrW2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopPyAjIGxvY2FsCiAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgIFwuXCogICMgV2lsZCBjYXJkIHN5bnRheCBvZiAuKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgY29tcGF0aWJsZSBvcGVyYXRvciByZXF1aXJlcyBhdCBsZWFzdCB0d28gZGlnaXRzIGluIHRoZQogICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgICAgICAoPzw9fj0pICAgICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciB0aGUgY29tcGF0aWJsZSBvcGVyYXRvcgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykrICAgIyByZWxlYXNlICAoV2UgaGF2ZSBhICsgaW5zdGVhZCBvZiBhICopCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIEFsbCBvdGhlciBvcGVyYXRvcnMgb25seSBhbGxvdyBhIHN1YiBzZXQgb2Ygd2hhdCB0aGUKICAgICAgICAgICAgICAgICMgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgZG8uIFNwZWNpZmljYWxseSB0aGV5IGRvIG5vdCBhbGxvdwogICAgICAgICAgICAgICAgIyBsb2NhbCB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgbm9yIGRvIHRoZXkgYWxsb3cgdGhlIHByZWZpeAogICAgICAgICAgICAgICAgIyBtYXRjaGluZyB3aWxkIGNhcmRzLgogICAgICAgICAgICAgICAgKD88IT09fCE9fH49KSAgICAgICAgICMgV2UgaGF2ZSBzcGVjaWFsIGNhc2VzIGZvciB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1hdGNoIGhlcmUuCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIn49IjogImNvbXBhdGlibGUiLAogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgICAgICI9PT0iOiAiYXJiaXRyYXJ5IiwKICAgIH0KCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfY29tcGF0aWJsZShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb21wYXRpYmxlIHJlbGVhc2VzIGhhdmUgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbiBvZiA+PSBhbmQgPT0uIFRoYXQKICAgICAgICAjIGlzIHRoYXQgfj0yLjIgaXMgZXF1aXZhbGVudCB0byA+PTIuMiw9PTIuKi4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAgICAjIGltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIHRoZSBvdGhlciBzcGVjaWZpZXJzIGluc3RlYWQgb2YKICAgICAgICAjIGltcGxlbWVudGluZyBpdCBvdXJzZWx2ZXMuIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY29uc3RydWN0CiAgICAgICAgIyB0aGUgb3RoZXIgc3BlY2lmaWVycy4KCiAgICAgICAgIyBXZSB3YW50IGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHZlcnNpb24sIGJ1dCB3ZSB3YW50IHRvCiAgICAgICAgIyBpZ25vcmUgcG9zdCBhbmQgZGV2IHJlbGVhc2VzIGFuZCB3ZSB3YW50IHRvIHRyZWF0IHRoZSBwcmUtcmVsZWFzZSBhcwogICAgICAgICMgaXQncyBvd24gc2VwYXJhdGUgc2VnbWVudC4KICAgICAgICBwcmVmaXggPSAiLiIuam9pbigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIGl0ZXJ0b29scy50YWtld2hpbGUoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IChub3QgeC5zdGFydHN3aXRoKCJwb3N0IikgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5zdGFydHN3aXRoKCJkZXYiKSksCiAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fc3BsaXQoc3BlYyksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIClbOi0xXQogICAgICAgICkKCiAgICAgICAgIyBBZGQgdGhlIHByZWZpeCBub3RhdGlvbiB0byB0aGUgZW5kIG9mIG91ciBzdHJpbmcKICAgICAgICBwcmVmaXggKz0gIi4qIgoKICAgICAgICByZXR1cm4gKHNlbGYuX2dldF9vcGVyYXRvcigiPj0iKShwcm9zcGVjdGl2ZSwgc3BlYykgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfb3BlcmF0b3IoIj09IikocHJvc3BlY3RpdmUsIHByZWZpeCkpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgcHJlZml4IG1hdGNoaW5nCiAgICAgICAgaWYgc3BlYy5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwcmVmaXggbWF0Y2hpbmcgd2Ugd2FudCB0byBpZ25vcmUgbG9jYWwgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKICAgICAgICAgICAgIyBTcGxpdCB0aGUgc3BlYyBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhbiBpbXBsaWNpdAogICAgICAgICAgICAjIGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgIHNwZWMgPSBfdmVyc2lvbl9zcGxpdChzcGVjWzotMl0pICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgLioKCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUKICAgICAgICAgICAgIyBpcyBhbiBpbXBsaWNpdCBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZQogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gX3ZlcnNpb25fc3BsaXQoc3RyKHByb3NwZWN0aXZlKSkKCiAgICAgICAgICAgICMgU2hvcnRlbiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiB0byBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNwZWMKICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllciBpcyBhIHByZWZpeCBvZiB0aGUKICAgICAgICAgICAgIyBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG9yIG5vdC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBwcm9zcGVjdGl2ZVs6bGVuKHNwZWMpXQoKICAgICAgICAgICAgIyBQYWQgb3V0IG91ciB0d28gc2lkZXMgd2l0aCB6ZXJvcyBzbyB0aGF0IHRoZXkgYm90aCBlcXVhbCB0aGUgc2FtZQogICAgICAgICAgICAjIGxlbmd0aC4KICAgICAgICAgICAgc3BlYywgcHJvc3BlY3RpdmUgPSBfcGFkX3ZlcnNpb24oc3BlYywgcHJvc3BlY3RpdmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHN0cmluZyBpbnRvIGEgVmVyc2lvbgogICAgICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAgICAgIyBJZiB0aGUgc3BlY2lmaWVyIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBzZWdtZW50LCB0aGVuIHdlIHdhbnQgdG8KICAgICAgICAgICAgIyBhY3QgYXMgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gYWxzbyBkb2VzIG5vdCBoYXZlIGEgbG9jYWwKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBpZiBub3Qgc3BlYy5sb2NhbDoKICAgICAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzcGVjCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9jb21wYXJlX2VxdWFsKHByb3NwZWN0aXZlLCBzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA8IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHByZS1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdCBwcmUtcmVsZWFzZQogICAgICAgICMgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyIChlLmcuIDwzLjEgc2hvdWxkCiAgICAgICAgIyBub3QgbWF0Y2ggMy4xLmRldjAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4wLmRldjApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3ByZXJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgbGVzcyB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUgc2FtZQogICAgICAgICMgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlID4gc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcG9zdC1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdAogICAgICAgICMgcG9zdC1yZWxlYXNlIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllcgogICAgICAgICMgKGUuZy4gPjMuMSBzaG91bGQgbm90IG1hdGNoIDMuMC5wb3N0MCwgYnV0IHNob3VsZCBtYXRjaCAzLjIucG9zdDApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3Bvc3RyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wb3N0cmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgRW5zdXJlIHRoYXQgd2UgZG8gbm90IGFsbG93IGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUgdmVyc2lvbiBtZW50aW9uZWQKICAgICAgICAjIGluIHRoZSBzcGVjaWZpZXIsIHdoaWNoIGlzIHRlY2hpbmNhbGx5IGdyZWF0ZXIgdGhhbiwgdG8gbWF0Y2guCiAgICAgICAgaWYgcHJvc3BlY3RpdmUubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUKICAgICAgICAjIHNhbWUgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfY29tcGFyZV9hcmJpdHJhcnkoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBzdHIocHJvc3BlY3RpdmUpLmxvd2VyKCkgPT0gc3RyKHNwZWMpLmxvd2VyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHByZXJlbGVhc2VzIHNldCBmb3IgdGhpcywgdGhlbiB3ZSdsbCBqdXN0CiAgICAgICAgIyBibGluZGx5IHVzZSB0aGF0LgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBMb29rIGF0IGFsbCBvZiBvdXIgc3BlY2lmaWVycyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGluY2x1c2l2ZQogICAgICAgICMgb3BlcmF0b3JzLCBhbmQgaWYgdGhleSBhcmUgaWYgdGhleSBhcmUgaW5jbHVkaW5nIGFuIGV4cGxpY2l0CiAgICAgICAgIyBwcmVyZWxlYXNlLgogICAgICAgIG9wZXJhdG9yLCB2ZXJzaW9uID0gc2VsZi5fc3BlYwogICAgICAgIGlmIG9wZXJhdG9yIGluIFsiPT0iLCAiPj0iLCAiPD0iLCAifj0iLCAiPT09Il06CiAgICAgICAgICAgICMgVGhlID09IHNwZWNpZmllciBjYW4gaW5jbHVkZSBhIHRyYWlsaW5nIC4qLCBpZiBpdCBkb2VzIHdlCiAgICAgICAgICAgICMgd2FudCB0byByZW1vdmUgYmVmb3JlIHBhcnNpbmcuCiAgICAgICAgICAgIGlmIG9wZXJhdG9yID09ICI9PSIgYW5kIHZlcnNpb24uZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6LTJdCgogICAgICAgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uLCBhbmQgaWYgaXQgaXMgYSBwcmUtcmVsZWFzZSB0aGFuIHRoaXMKICAgICAgICAgICAgIyBzcGVjaWZpZXIgYWxsb3dzIHByZS1yZWxlYXNlcy4KICAgICAgICAgICAgaWYgcGFyc2UodmVyc2lvbikuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKCl9wcmVmaXhfcmVnZXggPSByZS5jb21waWxlKHIiXihbMC05XSspKCg/OmF8YnxjfHJjKVswLTldKykkIikKCgpkZWYgX3ZlcnNpb25fc3BsaXQodmVyc2lvbik6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gdmVyc2lvbi5zcGxpdCgiLiIpOgogICAgICAgIG1hdGNoID0gX3ByZWZpeF9yZWdleC5zZWFyY2goaXRlbSkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChtYXRjaC5ncm91cHMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9wYWRfdmVyc2lvbihsZWZ0LCByaWdodCk6CiAgICBsZWZ0X3NwbGl0LCByaWdodF9zcGxpdCA9IFtdLCBbXQoKICAgICMgR2V0IHRoZSByZWxlYXNlIHNlZ21lbnQgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCBsZWZ0KSkpCiAgICByaWdodF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgcmlnaHQpKSkKCiAgICAjIEdldCB0aGUgcmVzdCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxlZnRbbGVuKGxlZnRfc3BsaXRbMF0pOl0pCiAgICByaWdodF9zcGxpdC5hcHBlbmQocmlnaHRbbGVuKHJpZ2h0X3NwbGl0WzBdKTpdKQoKICAgICMgSW5zZXJ0IG91ciBwYWRkaW5nCiAgICBsZWZ0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihyaWdodF9zcGxpdFswXSkgLSBsZW4obGVmdF9zcGxpdFswXSkpLAogICAgKQogICAgcmlnaHRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKGxlZnRfc3BsaXRbMF0pIC0gbGVuKHJpZ2h0X3NwbGl0WzBdKSksCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqbGVmdF9zcGxpdCkpLAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpyaWdodF9zcGxpdCkpLAogICAgKQoKCmNsYXNzIFNwZWNpZmllclNldChCYXNlU3BlY2lmaWVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBTcGxpdCBvbiAsIHRvIGJyZWFrIGVhY2ggaW5kaWRpdnVhbCBzcGVjaWZpZXIgaW50byBpdCdzIG93biBpdGVtLCBhbmQKICAgICAgICAjIHN0cmlwIGVhY2ggaXRlbSB0byByZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAgIHNwZWNpZmllcnMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNwZWNpZmllcnMuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCgogICAgICAgICMgUGFyc2VkIGVhY2ggaW5kaXZpZHVhbCBzcGVjaWZpZXIsIGF0dGVtcHRpbmcgZmlyc3QgdG8gbWFrZSBpdCBhCiAgICAgICAgIyBTcGVjaWZpZXIgYW5kIGZhbGxpbmcgYmFjayB0byBhIExlZ2FjeVNwZWNpZmllci4KICAgICAgICBwYXJzZWQgPSBzZXQoKQogICAgICAgIGZvciBzcGVjaWZpZXIgaW4gc3BlY2lmaWVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChTcGVjaWZpZXIoc3BlY2lmaWVyKSkKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKExlZ2FjeVNwZWNpZmllcihzcGVjaWZpZXIpKQoKICAgICAgICAjIFR1cm4gb3VyIHBhcnNlZCBzcGVjaWZpZXJzIGludG8gYSBmcm96ZW4gc2V0IGFuZCBzYXZlIHRoZW0gZm9yIGxhdGVyLgogICAgICAgIHNlbGYuX3NwZWNzID0gZnJvemVuc2V0KHBhcnNlZCkKCiAgICAgICAgIyBTdG9yZSBvdXIgcHJlcmVsZWFzZXMgdmFsdWUgc28gd2UgY2FuIHVzZSBpdCBsYXRlciB0byBkZXRlcm1pbmUgaWYKICAgICAgICAjIHdlIGFjY2VwdCBwcmVyZWxlYXNlcyBvciBub3QuCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8U3BlY2lmaWVyU2V0KHswIXJ9ezF9KT4iLmZvcm1hdChzdHIoc2VsZiksIHByZSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiwiLmpvaW4oc29ydGVkKHN0cihzKSBmb3IgcyBpbiBzZWxmLl9zcGVjcykpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KCkKICAgICAgICBzcGVjaWZpZXIuX3NwZWNzID0gZnJvemVuc2V0KHNlbGYuX3NwZWNzIHwgb3RoZXIuX3NwZWNzKQoKICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBvdGhlci5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyA9PSBvdGhlci5fcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbWJpbmUgU3BlY2lmaWVyU2V0cyB3aXRoIFRydWUgYW5kIEZhbHNlIHByZXJlbGVhc2UgIgogICAgICAgICAgICAgICAgIm92ZXJyaWRlcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHNwZWNpZmllcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgPT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyAhPSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zcGVjcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBleHBsaWNpdCBwcmVyZWxlYXNlIG1vZGlmaWVyLCB0aGVuIHdlJ2xsCiAgICAgICAgIyBwYXNzIHRoYXQgdGhyb3VnaCBoZXJlLgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzcGVjaWZpZXJzLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZvcmNlZCB2YWx1ZSwKICAgICAgICAjIHRoZW4gd2UnbGwganVzdCByZXR1cm4gTm9uZSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGhhdmUKICAgICAgICAjIHByZS1yZWxlYXNlcyBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYuX3NwZWNzOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIE90aGVyd2lzZSB3ZSdsbCBzZWUgaWYgYW55IG9mIHRoZSBnaXZlbiBzcGVjaWZpZXJzIGFjY2VwdAogICAgICAgICMgcHJlcmVsZWFzZXMsIGlmIGFueSBvZiB0aGVtIGRvIHdlJ2xsIHJldHVybiBUcnVlLCBvdGhlcndpc2UgRmFsc2UuCiAgICAgICAgcmV0dXJuIGFueShzLnByZXJlbGVhc2VzIGZvciBzIGluIHNlbGYuX3NwZWNzKQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBFbnN1cmUgdGhhdCBvdXIgaXRlbSBpcyBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiBpbnN0YW5jZS4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICBpdGVtID0gcGFyc2UoaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgV2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byBhbGxvdyBwcmUtcmVsZWFzZXMgYnkgbG9va2luZyB0bwogICAgICAgICMgc2VlIGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBpdGVtcyBzdXBwb3J0cyB0aGVtLiBJZiBub25lIG9mIHRoZW0gZG8KICAgICAgICAjIGFuZCB0aGlzIGl0ZW0gaXMgYSBwcmUtcmVsZWFzZSB0aGVuIHdlIGRvIG5vdCBhbGxvdyBpdCBhbmQgd2UgY2FuCiAgICAgICAgIyBzaG9ydCBjaXJjdWl0IHRoYXQgaGVyZS4KICAgICAgICAjIE5vdGU6IFRoaXMgbWVhbnMgdGhhdCAxLjAuZGV2MSB3b3VsZCBub3QgYmUgY29udGFpbmVkIGluIHNvbWV0aGluZwogICAgICAgICMgICAgICAgbGlrZSA+PTEuMC5kZXZhYmMgaG93ZXZlciBpdCB3b3VsZCBiZSBpbiA+PTEuMC5kZWJhYmMsPjAuMC5kZXYwCiAgICAgICAgaWYgbm90IHByZXJlbGVhc2VzIGFuZCBpdGVtLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFdlIHNpbXBseSBkaXNwYXRjaCB0byB0aGUgdW5kZXJseWluZyBzcGVjcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQogICAgICAgICMgZ2l2ZW4gdmVyc2lvbiBpcyBjb250YWluZWQgd2l0aGluIGFsbCBvZiB0aGVtLgogICAgICAgICMgTm90ZTogVGhpcyB1c2Ugb2YgYWxsKCkgaGVyZSBtZWFucyB0aGF0IGFuIGVtcHR5IHNldCBvZiBzcGVjaWZpZXJzCiAgICAgICAgIyAgICAgICB3aWxsIGFsd2F5cyByZXR1cm4gVHJ1ZSwgdGhpcyBpcyBhbiBleHBsaWNpdCBkZXNpZ24gZGVjaXNpb24uCiAgICAgICAgcmV0dXJuIGFsbCgKICAgICAgICAgICAgcy5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5fc3BlY3MKICAgICAgICApCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSB3YW50IHRvIHdyYXAgb3VyIGl0ZXJhYmxlIGluIHRoZQogICAgICAgICMgZmlsdGVyIG1ldGhvZCBmb3IgZWFjaCBvbmUsIHRoaXMgd2lsbCBhY3QgYXMgYSBsb2dpY2FsIEFORCBhbW9uZ3N0CiAgICAgICAgIyBlYWNoIHNwZWNpZmllci4KICAgICAgICBpZiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5fc3BlY3M6CiAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IHNwZWMuZmlsdGVyKGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1ib29sKHByZXJlbGVhc2VzKSkKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlCiAgICAgICAgIyBJZiB3ZSBkbyBub3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSByb3VnaCBmaWx0ZXIKICAgICAgICAjIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBhbnkgcHJlLXJlbGVhc2VzLCB1bmxlc3MgdGhlcmUgYXJlIG5vIGZpbmFsCiAgICAgICAgIyByZWxlYXNlcywgYW5kIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBMZWdhY3lWZXJzaW9uIGluIGdlbmVyYWwuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgd2Ugc29tZSBraW5kIG9mIFZlcnNpb24gY2xhc3MgZm9yIHRoaXMgaXRlbS4KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZShpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IGl0ZW0KCiAgICAgICAgICAgICAgICAjIEZpbHRlciBvdXQgYW55IGl0ZW0gd2hpY2ggaXMgcGFyc2VkIGFzIGEgTGVnYWN5VmVyc2lvbgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFN0b3JlIGFueSBpdGVtIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgZm9yIGxhdGVyIHVubGVzcyB3ZSd2ZQogICAgICAgICAgICAgICAgIyBhbHJlYWR5IGZvdW5kIGEgZmluYWwgdmVyc2lvbiBvciB3ZSBhcmUgYWNjZXB0aW5nIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKGl0ZW0pCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGZvdW5kIG5vIGl0ZW1zIGV4Y2VwdCBmb3IgcHJlLXJlbGVhc2VzLCB0aGVuIHdlJ2xsIGdvCiAgICAgICAgICAgICMgYWhlYWQgYW5kIHVzZSB0aGUgcHJlLXJlbGVhc2VzCiAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXMgYW5kIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRfcHJlcmVsZWFzZXMKCiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAMXqJw+lAQAApQEAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHJlCgoKX2Nhbm9uaWNhbGl6ZV9yZWdleCA9IHJlLmNvbXBpbGUociJbLV8uXSsiKQoKCmRlZiBjYW5vbmljYWxpemVfbmFtZShuYW1lKToKICAgICMgVGhpcyBpcyB0YWtlbiBmcm9tIFBFUCA1MDMuCiAgICByZXR1cm4gX2Nhbm9uaWNhbGl6ZV9yZWdleC5zdWIoIi0iLCBuYW1lKS5sb3dlcigpClBLAwQUAAAAAAAAACEADu/GoSQtAAAkLQAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsKICAgICJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIgpdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwKICAgIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXSwKKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUoCiAgICByIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFLAopCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwgInByZXZpZXciOiAiYyIsICItIjogImZpbmFsLSIsICJyYyI6ICJjIiwgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLAogICAgICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLnBvc3RbMV0pKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5kZXZbMV0pKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICIrezB9Ii5mb3JtYXQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpKQogICAgICAgICAgICApCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHZlcnNpb25fc3RyaW5nID0gc3RyKHNlbGYpCiAgICAgICAgaWYgIisiIGluIHZlcnNpb25fc3RyaW5nOgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9zdHJpbmcuc3BsaXQoIisiLCAxKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5kZXYgb3Igc2VsZi5fdmVyc2lvbi5wcmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5wb3N0KQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdCgKICAgICAgICAgICAgaXRlcnRvb2xzLmRyb3B3aGlsZSgKICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4ID09IDAsCiAgICAgICAgICAgICAgICByZXZlcnNlZChyZWxlYXNlKSwKICAgICAgICAgICAgKQogICAgICAgICkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKAogICAgICAgICAgICAoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpCiAgICAgICAgICAgIGZvciBpIGluIGxvY2FsCiAgICAgICAgKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAyS1AJj6TAQA+kwEANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0Zi04CiIiIgpQYWNrYWdlIHJlc291cmNlIEFQSQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCnN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKdG8gaGF2ZSB0aGVpciBwYXRoIHBhcnRzIHNlcGFyYXRlZCB3aXRoIGBgL2BgLCAqbm90KiB3aGF0ZXZlciB0aGUgbG9jYWwKcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCm5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCgpUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAouZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi56aXAgZmlsZXMgYW5kIHdpdGggY3VzdG9tIFBFUCAzMDIgbG9hZGVycyB0aGF0IHN1cHBvcnQgdGhlIGBgZ2V0X2RhdGEoKWBgCm1ldGhvZC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGlvCmltcG9ydCB0aW1lCmltcG9ydCByZQppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHN0YXQKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgcGtndXRpbAppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcGxpc3RsaWIKaW1wb3J0IGVtYWlsLnBhcnNlcgppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpdGVydG9vbHMKZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfaW1wb3J0ZXIKCnRyeToKICAgIGltcG9ydCBfaW1wCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDMuMiBjb21wYXRpYmlsaXR5CiAgICBpbXBvcnQgaW1wIGFzIF9pbXAKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBtYXAsIGZpbHRlcgoKIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCmZyb20gb3MgaW1wb3J0IHV0aW1lCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IG1rZGlyLCByZW5hbWUsIHVubGluawogICAgV1JJVEVfU1VQUE9SVCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBubyB3cml0ZSBzdXBwb3J0LCBwcm9iYWJseSB1bmRlciBHQUUKICAgIFdSSVRFX1NVUFBPUlQgPSBGYWxzZQoKZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCmZyb20gb3MucGF0aCBpbXBvcnQgaXNkaXIsIHNwbGl0Cgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeSBhcyBpbXBvcnRsaWJfbWFjaGluZXJ5CiAgICAjIGFjY2VzcyBhdHRyaWJ1dGUgdG8gZm9yY2UgaW1wb3J0IHVuZGVyIGRlbGF5ZWQgaW1wb3J0IG1lY2hhbmlzbXMuCiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5Ll9fbmFtZV9fCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydGxpYl9tYWNoaW5lcnkgPSBOb25lCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBhcHBkaXJzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBhY2thZ2luZwpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbicpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLnJlcXVpcmVtZW50cycpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5tYXJrZXJzJykKCgppZiAoMywgMCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgbXNnID0gKAogICAgICAgICJTdXBwb3J0IGZvciBQeXRob24gMy4wLTMuMiBoYXMgYmVlbiBkcm9wcGVkLiBGdXR1cmUgdmVyc2lvbnMgIgogICAgICAgICJ3aWxsIGZhaWwgaGVyZS4iCiAgICApCiAgICB3YXJuaW5ncy53YXJuKG1zZykKCiMgZGVjbGFyZSBzb21lIGdsb2JhbHMgdGhhdCB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgdG8KIyBzYXRpc2Z5IHRoZSBsaW50ZXJzLgpyZXF1aXJlID0gTm9uZQp3b3JraW5nX3NldCA9IE5vbmUKCgpjbGFzcyBQRVA0NDBXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKICAgICIiIgogICAgVXNlZCB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggYSB2ZXJzaW9uIG9yIHNwZWNpZmllciBub3QgY29tcGx5aW5nIHdpdGgKICAgIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfU2V0dXB0b29sc1ZlcnNpb25NaXhpbihvYmplY3QpOgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19oYXNoX18oKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDwgb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbHRfXyhvdGhlcikKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sZV9fKG90aGVyKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID09IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPj0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ2VfXyhvdGhlcikKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2d0X18ob3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgIT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbmVfXyhvdGhlcikKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gdHVwbGUoc2VsZilba2V5XQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCiAgICAgICAgcmVwbGFjZSA9IHsKICAgICAgICAgICAgJ3ByZSc6ICdjJywKICAgICAgICAgICAgJ3ByZXZpZXcnOiAnYycsCiAgICAgICAgICAgICctJzogJ2ZpbmFsLScsCiAgICAgICAgICAgICdyYyc6ICdjJywKICAgICAgICAgICAgJ2Rldic6ICdAJywKICAgICAgICB9LmdldAoKICAgICAgICBkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICAgICAgICAgIGZvciBwYXJ0IGluIGNvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICAgICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQsIHBhcnQpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICcuJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgogICAgICAgICAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkICcqJyArIHBhcnQKCiAgICAgICAgICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgICAgICAgICB5aWVsZCAnKmZpbmFsJwoKICAgICAgICBkZWYgb2xkX3BhcnNlX3ZlcnNpb24ocyk6CiAgICAgICAgICAgIHBhcnRzID0gW10KICAgICAgICAgICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKICAgICAgICAgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJzAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgICAgICByZXR1cm4gdHVwbGUocGFydHMpCgogICAgICAgICMgV2FybiBmb3IgdXNlIG9mIHRoaXMgZnVuY3Rpb24KICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiWW91IGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGUgcmVzdWx0IG9mICIKICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbi4gVGhpcyBpcyBhIGxlZ2FjeSBiZWhhdmlvciB3aGljaCBpcyAiCiAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgd2l0aCB0aGUgbmV3IHZlcnNpb24gY2xhc3MgaW50cm9kdWNlZCBpbiBzZXR1cHRvb2xzICIKICAgICAgICAgICAgIjguMC4gSW4gbW9zdCBjYXNlcywgY29udmVyc2lvbiB0byBhIHR1cGxlIGlzIHVubmVjZXNzYXJ5LiBGb3IgIgogICAgICAgICAgICAiY29tcGFyaXNvbiBvZiB2ZXJzaW9ucywgc29ydCB0aGUgVmVyc2lvbiBpbnN0YW5jZXMgZGlyZWN0bHkuIElmICIKICAgICAgICAgICAgInlvdSBoYXZlIGFub3RoZXIgdXNlIGNhc2UgcmVxdWlyaW5nIHRoZSB0dXBsZSwgcGxlYXNlIGZpbGUgYSAiCiAgICAgICAgICAgICJidWcgd2l0aCB0aGUgc2V0dXB0b29scyBwcm9qZWN0IGRlc2NyaWJpbmcgdGhhdCBuZWVkLiIsCiAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICAgICBzdGFja2xldmVsPTEsCiAgICAgICAgKQoKICAgICAgICBmb3IgcGFydCBpbiBvbGRfcGFyc2VfdmVyc2lvbihzdHIoc2VsZikpOgogICAgICAgICAgICB5aWVsZCBwYXJ0CgoKY2xhc3MgU2V0dXB0b29sc1ZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgcGFzcwoKCmNsYXNzIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uKToKICAgIHBhc3MKCgpkZWYgcGFyc2VfdmVyc2lvbih2KToKICAgIHRyeToKICAgICAgICByZXR1cm4gU2V0dXB0b29sc1ZlcnNpb24odikKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24odikKCgpfc3RhdGVfdmFycyA9IHt9CgoKZGVmIF9kZWNsYXJlX3N0YXRlKHZhcnR5cGUsICoqa3cpOgogICAgZ2xvYmFscygpLnVwZGF0ZShrdykKICAgIF9zdGF0ZV92YXJzLnVwZGF0ZShkaWN0LmZyb21rZXlzKGt3LCB2YXJ0eXBlKSkKCgpkZWYgX19nZXRzdGF0ZV9fKCk6CiAgICBzdGF0ZSA9IHt9CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBfc3RhdGVfdmFycy5pdGVtcygpOgogICAgICAgIHN0YXRlW2tdID0gZ1snX3NnZXRfJyArIHZdKGdba10pCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX19zZXRzdGF0ZV9fKHN0YXRlKToKICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgZ1snX3NzZXRfJyArIF9zdGF0ZV92YXJzW2tdXShrLCBnW2tdLCB2KQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9zZ2V0X2RpY3QodmFsKToKICAgIHJldHVybiB2YWwuY29weSgpCgoKZGVmIF9zc2V0X2RpY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuY2xlYXIoKQogICAgb2IudXBkYXRlKHN0YXRlKQoKCmRlZiBfc2dldF9vYmplY3QodmFsKToKICAgIHJldHVybiB2YWwuX19nZXRzdGF0ZV9fKCkKCgpkZWYgX3NzZXRfb2JqZWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLl9fc2V0c3RhdGVfXyhzdGF0ZSkKCgpfc2dldF9ub25lID0gX3NzZXRfbm9uZSA9IGxhbWJkYSAqYXJnczogTm9uZQoKCmRlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgoKICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgogICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CiAgICBkaXN0dXRpbHMuICBCdXQgd2hhdCB3ZSB3YW50IHdoZW4gY2hlY2tpbmcgY29tcGF0aWJpbGl0eSBpcyB0byBrbm93IHRoZQogICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CiAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgT1MuCgogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCiAgICBwbGF0Zm9ybSBzdHJpbmdzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleHRlbmRlZCBhY2NvcmRpbmdseS4KICAgICIiIgogICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCiAgICBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCiAgICBpZiBtIGlzIG5vdCBOb25lIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBub3QgTWFjIE9TIFgKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgpfX2FsbF9fID0gWwogICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgJ2dldF9kaXN0cmlidXRpb24nLAogICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsCiAgICAnaXRlcl9lbnRyeV9wb2ludHMnLAogICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAogICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKCiAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAogICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKICAgICdmaW5kX2Rpc3RyaWJ1dGlvbnMnLCAnc2V0X2V4dHJhY3Rpb25fcGF0aCcsICdjbGVhbnVwX3Jlc291cmNlcycsCiAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAoKICAgICMgUHJpbWFyeSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCiAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAogICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKCiAgICAjIEV4Y2VwdGlvbnMKICAgICdSZXNvbHV0aW9uRXJyb3InLCAnVmVyc2lvbkNvbmZsaWN0JywgJ0Rpc3RyaWJ1dGlvbk5vdEZvdW5kJywKICAgICdVbmtub3duRXh0cmEnLCAnRXh0cmFjdGlvbkVycm9yJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUEVQNDQwV2FybmluZycsCgogICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcwogICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAogICAgJ2dldF9wbGF0Zm9ybScsICdjb21wYXRpYmxlX3BsYXRmb3JtcycsICd5aWVsZF9saW5lcycsICdzcGxpdF9zZWN0aW9ucycsCiAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsICdpbnZhbGlkX21hcmtlcicsICdldmFsdWF0ZV9tYXJrZXInLAoKICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKICAgICdlbnN1cmVfZGlyZWN0b3J5JywgJ25vcm1hbGl6ZV9wYXRoJywKCiAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCiAgICAnRUdHX0RJU1QnLCAnQklOQVJZX0RJU1QnLCAnU09VUkNFX0RJU1QnLCAnQ0hFQ0tPVVRfRElTVCcsICdERVZFTE9QX0RJU1QnLAoKICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKICAgICdJTWV0YWRhdGFQcm92aWRlcicsICdJUmVzb3VyY2VQcm92aWRlcicsICdGaWxlTWV0YWRhdGEnLAogICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKICAgICdyZWdpc3Rlcl9maW5kZXInLCAncmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXInLCAncmVnaXN0ZXJfbG9hZGVyX3R5cGUnLAogICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAoKICAgICMgRGVwcmVjYXRlZC9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkKICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKXQoKCmNsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgogICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKHNlbGYuYXJncykKCgpjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIgogICAgQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24uCgogICAgU2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24gYW5kIHRoZSByZXF1ZXN0ZWQKICAgIFJlcXVpcmVtZW50LgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gIntzZWxmLmRpc3R9IGlzIGluc3RhbGxlZCBidXQge3NlbGYucmVxfSBpcyByZXF1aXJlZCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiB3aXRoX2NvbnRleHQoc2VsZiwgcmVxdWlyZWRfYnkpOgogICAgICAgICIiIgogICAgICAgIElmIHJlcXVpcmVkX2J5IGlzIG5vbi1lbXB0eSwgcmV0dXJuIGEgdmVyc2lvbiBvZiBzZWxmIHRoYXQgaXMgYQogICAgICAgIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmVkX2J5OgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIGFyZ3MgPSBzZWxmLmFyZ3MgKyAocmVxdWlyZWRfYnksKQogICAgICAgIHJldHVybiBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KCphcmdzKQoKCmNsYXNzIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoVmVyc2lvbkNvbmZsaWN0KToKICAgICIiIgogICAgQSBWZXJzaW9uQ29uZmxpY3QgdGhhdCBhY2NlcHRzIGEgdGhpcmQgcGFyYW1ldGVyLCB0aGUgc2V0IG9mIHRoZQogICAgcmVxdWlyZW1lbnRzIHRoYXQgcmVxdWlyZWQgdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24uCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSBWZXJzaW9uQ29uZmxpY3QuX3RlbXBsYXRlICsgJyBieSB7c2VsZi5yZXF1aXJlZF9ieX0nCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZWRfYnkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1syXQoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgoKICAgIF90ZW1wbGF0ZSA9ICgiVGhlICd7c2VsZi5yZXF9JyBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCAiCiAgICAgICAgICAgICAgICAgImFuZCBpcyByZXF1aXJlZCBieSB7c2VsZi5yZXF1aXJlcnNfc3RyfSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVyc19zdHIoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYucmVxdWlyZXJzOgogICAgICAgICAgICByZXR1cm4gJ3RoZSBhcHBsaWNhdGlvbicKICAgICAgICByZXR1cm4gJywgJy5qb2luKHNlbGYucmVxdWlyZXJzKQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcG9ydCgpCgoKY2xhc3MgVW5rbm93bkV4dHJhKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgoKCl9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQoKUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KRUdHX0RJU1QgPSAzCkJJTkFSWV9ESVNUID0gMgpTT1VSQ0VfRElTVCA9IDEKQ0hFQ0tPVVRfRElTVCA9IDAKREVWRUxPUF9ESVNUID0gLTEKCgpkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgogICAgIiIiUmVnaXN0ZXIgYHByb3ZpZGVyX2ZhY3RvcnlgIHRvIG1ha2UgcHJvdmlkZXJzIGZvciBgbG9hZGVyX3R5cGVgCgogICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAogICAgYW5kIGBwcm92aWRlcl9mYWN0b3J5YCBpcyBhIGZ1bmN0aW9uIHRoYXQsIHBhc3NlZCBhICptb2R1bGUqIG9iamVjdCwKICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KICAgICIiIgogICAgX3Byb3ZpZGVyX2ZhY3Rvcmllc1tsb2FkZXJfdHlwZV0gPSBwcm92aWRlcl9mYWN0b3J5CgoKZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CiAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlT3JSZXEsIFJlcXVpcmVtZW50KToKICAgICAgICByZXR1cm4gd29ya2luZ19zZXQuZmluZChtb2R1bGVPclJlcSkgb3IgcmVxdWlyZShzdHIobW9kdWxlT3JSZXEpKVswXQogICAgdHJ5OgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCgoKZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgogICAgaWYgbm90IF9jYWNoZToKICAgICAgICB2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCiAgICAgICAgIyBmYWxsYmFjayBmb3IgTWFjUG9ydHMKICAgICAgICBpZiB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICBwbGlzdCA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0KToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3RsaWIsICdyZWFkUGxpc3QnKToKICAgICAgICAgICAgICAgICAgICBwbGlzdF9jb250ZW50ID0gcGxpc3RsaWIucmVhZFBsaXN0KHBsaXN0KQogICAgICAgICAgICAgICAgICAgIGlmICdQcm9kdWN0VmVyc2lvbicgaW4gcGxpc3RfY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0X2NvbnRlbnRbJ1Byb2R1Y3RWZXJzaW9uJ10KCiAgICAgICAgX2NhY2hlLmFwcGVuZCh2ZXJzaW9uLnNwbGl0KCcuJykpCiAgICByZXR1cm4gX2NhY2hlWzBdCgoKZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKICAgIHJldHVybiB7J1Bvd2VyUEMnOiAncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6ICdwcGMnfS5nZXQobWFjaGluZSwgbWFjaGluZSkKCgpkZWYgZ2V0X2J1aWxkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucwoKICAgIFhYWCBDdXJyZW50bHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBgYGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpYGAsIGJ1dCBpdAogICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQoKICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKICAgICAgICAgICAgcmV0dXJuICJtYWNvc3gtJWQuJWQtJXMiICUgKGludCh2ZXJzaW9uWzBdKSwgaW50KHZlcnNpb25bMV0pLAogICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIGlmIHNvbWVvbmUgaXMgcnVubmluZyBhIG5vbi1NYWMgZGFyd2luIHN5c3RlbSwgdGhpcyB3aWxsIGZhbGwKICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCmRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCiMgWFhYIGJhY2t3YXJkIGNvbXBhdApnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0KCgpkZWYgY29tcGF0aWJsZV9wbGF0Zm9ybXMocHJvdmlkZWQsIHJlcXVpcmVkKToKICAgICIiIkNhbiBjb2RlIGZvciB0aGUgYHByb3ZpZGVkYCBwbGF0Zm9ybSBydW4gb24gdGhlIGByZXF1aXJlZGAgcGxhdGZvcm0/CgogICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCgogICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KICAgICIiIgogICAgaWYgcHJvdmlkZWQgaXMgTm9uZSBvciByZXF1aXJlZCBpcyBOb25lIG9yIHByb3ZpZGVkID09IHJlcXVpcmVkOgogICAgICAgICMgZWFzeSBjYXNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIE1hYyBPUyBYIHNwZWNpYWwgY2FzZXMKICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKICAgIGlmIHJlcU1hYzoKICAgICAgICBwcm92TWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQoKICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KICAgICAgICBpZiBub3QgcHJvdk1hYzoKICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAogICAgICAgICAgICAjIHVzZSB0aGUgbmV3IG1hY29zeCBkZXNpZ25hdGlvbi4KICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCiAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CiAgICAgICAgICAgICAgICBkdmVyc2lvbiA9IGludChwcm92RGFyd2luLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KICAgICAgICBpZiBwcm92TWFjLmdyb3VwKDEpICE9IHJlcU1hYy5ncm91cCgxKSBvciBcCiAgICAgICAgICAgICAgICBwcm92TWFjLmdyb3VwKDMpICE9IHJlcU1hYy5ncm91cCgzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPwogICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gYGRpc3Rfc3BlY2AgYW5kIHJ1biBpdHMgYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgbnMuY2xlYXIoKQogICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgoKIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CnJ1bl9tYWluID0gcnVuX3NjcmlwdAoKCmRlZiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpOgogICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgUmVxdWlyZW1lbnQpOgogICAgICAgIGRpc3QgPSBnZXRfcHJvdmlkZXIoZGlzdCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQogICAgcmV0dXJuIGRpc3QKCgpkZWYgbG9hZF9lbnRyeV9wb2ludChkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKCgpkZWYgZ2V0X2VudHJ5X21hcChkaXN0LCBncm91cD1Ob25lKToKICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCgoKZGVmIGdldF9lbnRyeV9pbmZvKGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCgoKY2xhc3MgSU1ldGFkYXRhUHJvdmlkZXI6CiAgICBkZWYgaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCgogICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCgogICAgICAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIGVhY2ggbGluZSwgYW5kIGxpbmVzCiAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihuYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKG5hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKICAgIGRlZiBydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKCgpjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CiAgICAiIiJBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlIGNvbnRhaW4gdGhlIG5hbWVkIHJlc291cmNlPyIiIgoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKCmNsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKICAgICIiIkEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBvbiBzeXMucGF0aCAob3IgYSBzaW1pbGFyIGxpc3QpIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIHdvcmtpbmcgc2V0IGZyb20gbGlzdCBvZiBwYXRoIGVudHJpZXMgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQogICAgICAgIHNlbGYuYnlfa2V5ID0ge30KICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCgogICAgICAgIGlmIGVudHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCgogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgogICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbWFzdGVyKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHdzID0gY2xzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBUaGUgbWFpbiBwcm9ncmFtIGRvZXMgbm90IGxpc3QgYW55IHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXR1cm4gd3MKCiAgICAgICAgIyBlbnN1cmUgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cy5yZXF1aXJlKF9fcmVxdWlyZXNfXykKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICByZXR1cm4gY2xzLl9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhfX3JlcXVpcmVzX18pCgogICAgICAgIHJldHVybiB3cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhjbHMsIHJlcV9zcGVjKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdvcmtpbmcgc2V0IGZyb20gYSByZXF1aXJlbWVudCBzcGVjLiBSZXdyaXRlcyBzeXMucGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKICAgICAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAogICAgICAgIHdzID0gY2xzKFtdKQogICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxX3NwZWMpCiAgICAgICAgZGlzdHMgPSB3cy5yZXNvbHZlKHJlcXMsIEVudmlyb25tZW50KCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIHdzLmFkZChkaXN0KQoKICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3cy5lbnRyaWVzOgogICAgICAgICAgICAgICAgd3MuYWRkX2VudHJ5KGVudHJ5KQoKICAgICAgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCiAgICAgICAgc3lzLnBhdGhbOl0gPSB3cy5lbnRyaWVzCiAgICAgICAgcmV0dXJuIHdzCgogICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CiAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAoKICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucwogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKICAgICAgICBhbHdheXMgYXBwZW5kZWQgdG8gYGAuZW50cmllc2BgLCBldmVuIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwogICAgICAgIGVxdWFsIGBgc3lzLnBhdGhgYC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIHNlbGYuZW50cmllcy5hcHBlbmQoZW50cnkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVHJ1ZSBpZiBgZGlzdGAgaXMgdGhlIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIGl0cyBwcm9qZWN0IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmluZCBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyByZXF1aXJlbWVudCBgcmVxYAoKICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKICAgICAgICByZXR1cm5zIGl0IGFzIGxvbmcgYXMgaXQgbWVldHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVkIGJ5CiAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAogICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgogICAgICAgIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgYGBOb25lYGAKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCiAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgaXRlcl9lbnRyeV9wb2ludHMoc2VsZiwgZ3JvdXAsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCgogICAgICAgIElmIGBuYW1lYCBpcyBOb25lLCB5aWVsZHMgYWxsIGVudHJ5IHBvaW50cyBpbiBgZ3JvdXBgIGZyb20gYWxsCiAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAogICAgICAgICAgICBlbGlmIG5hbWUgaW4gZW50cmllczoKICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCByZXF1aXJlcywgc2NyaXB0X25hbWUpOgogICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgICAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgICAgICBucy5jbGVhcigpCiAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlKHJlcXVpcmVzKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKCiAgICAgICAgVGhlIHlpZWxkIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgaXRlbXMnIHBhdGggZW50cmllcyB3ZXJlCiAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSB7fQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5lbnRyeV9rZXlzOgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGEgY2FjaGUgaXNzdWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZW50cnlfa2V5c1tpdGVtXToKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV0gPSAxCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCwgZW50cnk9Tm9uZSwgaW5zZXJ0PVRydWUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCgogICAgICAgIElmIGBlbnRyeWAgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBgYC5sb2NhdGlvbmBgIG9mIGBkaXN0YC4KICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgoKICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LCB1bmxlc3MgYHJlcGxhY2U9VHJ1ZWAuCiAgICAgICAgSWYgaXQncyBhZGRlZCwgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2QKICAgICAgICB3aWxsIGJlIGNhbGxlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpbnNlcnQ6CiAgICAgICAgICAgIGRpc3QuaW5zZXJ0X29uKHNlbGYuZW50cmllcywgZW50cnksIHJlcGxhY2U9cmVwbGFjZSkKCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBrZXlzMiA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGRpc3QubG9jYXRpb24sIFtdKQogICAgICAgIGlmIG5vdCByZXBsYWNlIGFuZCBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKICAgICAgICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnlfa2V5W2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXMyOgogICAgICAgICAgICBrZXlzMi5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcmVxdWlyZW1lbnRzLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UpOgogICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMuICBgZW52YCwKICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCiAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQogICAgICAgIGVudHJ5IG9yIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQuICBgaW5zdGFsbGVyYCwgaWYgc3VwcGxpZWQsCiAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCiAgICAgICAgYGBOb25lYGAuCgogICAgICAgIFVubGVzcyBgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlYCwgcmFpc2VzIGEgVmVyc2lvbkNvbmZsaWN0IGV4Y2VwdGlvbiBpZgogICAgICAgIGFueSByZXF1aXJlbWVudHMgYXJlIGZvdW5kIG9uIHRoZSBwYXRoIHRoYXQgaGF2ZSB0aGUgY29ycmVjdCBuYW1lIGJ1dAogICAgICAgIHRoZSB3cm9uZyB2ZXJzaW9uLiAgT3RoZXJ3aXNlLCBpZiBhbiBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCBpdCB3aWxsIGJlCiAgICAgICAgaW52b2tlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIGFjdGl2YXRlCiAgICAgICAgaXQuCiAgICAgICAgIiIiCgogICAgICAgICMgc2V0IHVwIHRoZSBzdGFjawogICAgICAgIHJlcXVpcmVtZW50cyA9IGxpc3QocmVxdWlyZW1lbnRzKVs6Oi0xXQogICAgICAgICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKICAgICAgICBwcm9jZXNzZWQgPSB7fQogICAgICAgICMga2V5IC0+IGRpc3QKICAgICAgICBiZXN0ID0ge30KICAgICAgICB0b19hY3RpdmF0ZSA9IFtdCgogICAgICAgIHJlcV9leHRyYXMgPSBfUmVxRXh0cmFzKCkKCiAgICAgICAgIyBNYXBwaW5nIG9mIHJlcXVpcmVtZW50IHRvIHNldCBvZiBkaXN0cmlidXRpb25zIHRoYXQgcmVxdWlyZWQgaXQ7CiAgICAgICAgIyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvIGFib3V0IGNvbmZsaWN0cy4KICAgICAgICByZXF1aXJlZF9ieSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKCiAgICAgICAgd2hpbGUgcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKICAgICAgICAgICAgcmVxID0gcmVxdWlyZW1lbnRzLnBvcCgwKQogICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub3QgcmVxX2V4dHJhcy5tYXJrZXJzX3Bhc3MocmVxKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXN0ID0gYmVzdC5nZXQocmVxLmtleSkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKICAgICAgICAgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZSBvciAoZGlzdCBub3QgaW4gcmVxIGFuZCByZXBsYWNlX2NvbmZsaWN0aW5nKToKICAgICAgICAgICAgICAgICAgICB3cyA9IHNlbGYKICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgYW4gZW1wdHkgZW52aXJvbm1lbnQgYW5kIHdvcmtpbmdzZXQgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IGZ1cnRoZXIgY29uZmxpY3RzIHdpdGggdGhlIGNvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoW10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaChyZXEsIHdzLCBpbnN0YWxsZXIpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcnMgPSByZXF1aXJlZF9ieS5nZXQocmVxLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZChyZXEsIHJlcXVpcmVycykKICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICAjIE9vcHMsIHRoZSAiYmVzdCIgc28gZmFyIGNvbmZsaWN0cyB3aXRoIGEgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgZGVwZW5kZW50X3JlcSA9IHJlcXVpcmVkX2J5W3JlcV0KICAgICAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpLndpdGhfY29udGV4dChkZXBlbmRlbnRfcmVxKQoKICAgICAgICAgICAgIyBwdXNoIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9udG8gdGhlIHN0YWNrCiAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdCiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQobmV3X3JlcXVpcmVtZW50cykKCiAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIG5ldyByZXF1aXJlbWVudHMgbmVlZGVkIGJ5IHJlcQogICAgICAgICAgICBmb3IgbmV3X3JlcXVpcmVtZW50IGluIG5ld19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXF1aXJlZF9ieVtuZXdfcmVxdWlyZW1lbnRdLmFkZChyZXEucHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgcmVxX2V4dHJhc1tuZXdfcmVxdWlyZW1lbnRdID0gcmVxLmV4dHJhcwoKICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCgogICAgICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQogICAgICAgIHJldHVybiB0b19hY3RpdmF0ZQoKICAgIGRlZiBmaW5kX3BsdWdpbnMoc2VsZiwgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgogICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCgogICAgICAgIEV4YW1wbGUgdXNhZ2U6OgoKICAgICAgICAgICAgZGlzdHJpYnV0aW9ucywgZXJyb3JzID0gd29ya2luZ19zZXQuZmluZF9wbHVnaW5zKAogICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCiAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvcnMKICAgICAgICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkJywgZXJyb3JzKQoKICAgICAgICBUaGUgYHBsdWdpbl9lbnZgIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UgdGhhdCBjb250YWlucwogICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgogICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKICAgICAgICBjb250YWlucyBhbGwgY3VycmVudGx5LWF2YWlsYWJsZSBkaXN0cmlidXRpb25zLiAgSWYgYGZ1bGxfZW52YCBpcyBub3QKICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgogICAgICAgIGBgc3lzLnBhdGhgYCB3aWxsIGJlIHNjYW5uZWQgZm9yIGRpc3RyaWJ1dGlvbnMuCgogICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCiAgICAgICAgYGByZXNvbHZlKClgYCBtZXRob2QuIFRoZSBgZmFsbGJhY2tgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkCiAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCiAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKICAgICAgICB0aGF0IHdlcmUgbG9hZGFibGUsIGFsb25nIHdpdGggYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbmVlZGVkCiAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQogICAgICAgIGVycm9yIHRoYXQgb2NjdXJyZWQuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIGEgYGBEaXN0cmlidXRpb25Ob3RGb3VuZGBgIG9yCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KICAgICAgICAiIiIKCiAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQogICAgICAgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpCgogICAgICAgIGVycm9yX2luZm8gPSB7fQogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQoKICAgICAgICBpZiBmdWxsX2VudiBpcyBOb25lOgogICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CgogICAgICAgIHNoYWRvd19zZXQgPSBzZWxmLl9fY2xhc3NfXyhbXSkKICAgICAgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAogICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCBzZWxmKSkKCiAgICAgICAgZm9yIHByb2plY3RfbmFtZSBpbiBwbHVnaW5fcHJvamVjdHM6CgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CgogICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCgogICAgICAgICAgICAgICAgZXhjZXB0IFJlc29sdXRpb25FcnJvciBhcyB2OgogICAgICAgICAgICAgICAgICAgICMgc2F2ZSBlcnJvciBpbmZvCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYKICAgICAgICAgICAgICAgICAgICBpZiBmYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBnaXZlIHVwIG9uIHRoaXMgcHJvamVjdCwga2VlcCBnb2luZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQoKICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gdHJ5IGFueSBtb3JlIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSBsaXN0KGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKCiAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbnMsIGVycm9yX2luZm8KCiAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCiAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKICAgICAgICByZXR1cm4gdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9ucyB0aGF0IG5lZWRlZCB0byBiZQogICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQogICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIG5lZWRlZCA9IHNlbGYucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgICAgICByZXR1cm4gbmVlZGVkCgogICAgZGVmIHN1YnNjcmliZShzZWxmLCBjYWxsYmFjaywgZXhpc3Rpbmc9VHJ1ZSk6CiAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zCgogICAgICAgIElmIGBleGlzdGluZz1UcnVlYCAoZGVmYXVsdCksCiAgICAgICAgY2FsbCBvbiBhbGwgZXhpc3Rpbmcgb25lcywgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQogICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmVudHJpZXNbOl0sIHNlbGYuZW50cnlfa2V5cy5jb3B5KCksIHNlbGYuYnlfa2V5LmNvcHkoKSwKICAgICAgICAgICAgc2VsZi5jYWxsYmFja3NbOl0KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBlX2tfYl9jKToKICAgICAgICBlbnRyaWVzLCBrZXlzLCBieV9rZXksIGNhbGxiYWNrcyA9IGVfa19iX2MKICAgICAgICBzZWxmLmVudHJpZXMgPSBlbnRyaWVzWzpdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ga2V5cy5jb3B5KCkKICAgICAgICBzZWxmLmJ5X2tleSA9IGJ5X2tleS5jb3B5KCkKICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IGNhbGxiYWNrc1s6XQoKCmNsYXNzIF9SZXFFeHRyYXMoZGljdCk6CiAgICAiIiIKICAgIE1hcCBlYWNoIHJlcXVpcmVtZW50IHRvIHRoZSBleHRyYXMgdGhhdCBkZW1hbmRlZCBpdC4KICAgICIiIgoKICAgIGRlZiBtYXJrZXJzX3Bhc3Moc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBtYXJrZXJzIGZvciByZXEgYWdhaW5zdCBlYWNoIGV4dHJhIHRoYXQKICAgICAgICBkZW1hbmRlZCBpdC4KCiAgICAgICAgUmV0dXJuIEZhbHNlIGlmIHRoZSByZXEgaGFzIGEgbWFya2VyIGFuZCBmYWlscwogICAgICAgIGV2YWx1YXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIFRydWUuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfZXZhbHMgPSAoCiAgICAgICAgICAgIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSkKICAgICAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuZ2V0KHJlcSwgKCkpICsgKE5vbmUsKQogICAgICAgICkKICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIgb3IgYW55KGV4dHJhX2V2YWxzKQoKCmNsYXNzIEVudmlyb25tZW50KG9iamVjdCk6CiAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWFyY2hfcGF0aD1Ob25lLCBwbGF0Zm9ybT1nZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCksCiAgICAgICAgICAgIHB5dGhvbj1QWV9NQUpPUik6CiAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBvbiBgc2VhcmNoX3BhdGhgIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCgogICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCiAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKICAgICAgICB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBgcHl0aG9uYCBpcyBhbgogICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMy4zJ2BgKTsKICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgoKICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CiAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgIHJ1bm5pbmcgcGxhdGZvcm0gb3IgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5weXRob24gPSBweXRob24KICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCgogICAgZGVmIGNhbl9hZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PwoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9uIG11c3QgbWF0Y2ggdGhlIHBsYXRmb3JtIGFuZCBweXRob24gdmVyc2lvbgogICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gPT0gc2VsZi5weXRob24pIFwKICAgICAgICAgICAgYW5kIGNvbXBhdGlibGVfcGxhdGZvcm1zKGRpc3QucGxhdGZvcm0sIHNlbGYucGxhdGZvcm0pCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcFtkaXN0LmtleV0ucmVtb3ZlKGRpc3QpCgogICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiU2NhbiBgc2VhcmNoX3BhdGhgIGZvciBkaXN0cmlidXRpb25zIHVzYWJsZSBpbiB0aGlzIGVudmlyb25tZW50CgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bwogICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCgogICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAoKICAgICAgICBVc2VzIGNhc2UtaW5zZW5zaXRpdmUgYHByb2plY3RfbmFtZWAgY29tcGFyaXNvbiwgYXNzdW1pbmcgYWxsIHRoZQogICAgICAgIHByb2plY3QncyBkaXN0cmlidXRpb25zIHVzZSB0aGVpciBwcm9qZWN0J3MgbmFtZSBjb252ZXJ0ZWQgdG8gYWxsCiAgICAgICAgbG93ZXJjYXNlIGFzIHRoZWlyIGtleS4KCiAgICAgICAgIiIiCiAgICAgICAgZGlzdHJpYnV0aW9uX2tleSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RtYXAuZ2V0KGRpc3RyaWJ1dGlvbl9rZXksIFtdKQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhZGRlZAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgICAgICAgICAgZGlzdHMuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgICAgICBkaXN0cy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdoYXNoY21wJyksIHJldmVyc2U9VHJ1ZSkKCiAgICBkZWYgYmVzdF9tYXRjaChzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKCiAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGlmIGFuIHVuc3VpdGFibGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5CiAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgogICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAgICAgICBlbnZpcm9ubWVudCB0aGF0IG1lZXRzIHRoZSBgYFJlcXVpcmVtZW50YGAgaW4gYHJlcWAuICBJZiBubyBzdWl0YWJsZQogICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICMgdHJ5IHRvIGRvd25sb2FkL2luc3RhbGwKICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKCiAgICAgICAgT2J0YWluIGEgZGlzdHJvIHRoYXQgbWF0Y2hlcyByZXF1aXJlbWVudCAoZS5nLiB2aWEgZG93bmxvYWQpLiAgSW4gdGhlCiAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKICAgICAgICBOb25lIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIG1ldGhvZCBpcyBhIGhvb2sgdGhhdCBhbGxvd3Mgc3ViY2xhc3NlcwogICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjawogICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKICAgICAgICBpZiBpbnN0YWxsZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgogICAgICAgICAgICBpZiBzZWxmW2tleV06CiAgICAgICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgc2VsZi5hZGQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBFbnZpcm9ubWVudCk6CiAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJBZGQgYW4gZW52aXJvbm1lbnQgb3IgZGlzdHJpYnV0aW9uIHRvIGFuIGVudmlyb25tZW50IiIiCiAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQogICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CiAgICAgICAgICAgIG5ldyArPSBlbnYKICAgICAgICByZXR1cm4gbmV3CgoKIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQpBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQKCgpjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQoKICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgoKICAgIG1hbmFnZXIKICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgoKICAgIGNhY2hlX3BhdGgKICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KCiAgICBvcmlnaW5hbF9lcnJvcgogICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCiAgICAiIiIKCgpjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CiAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQoKICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5oYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeT8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gc3BlY2lmaWVkIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBkaXJlY3RvcnkiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtcyBleHRyYWN0aW5nIGZpbGUocykiIiIKCiAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgY2FjaGVfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgQ2FuJ3QgZXh0cmFjdCBmaWxlKHMpIHRvIGVnZyBjYWNoZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpIHRvIHRoZSBQeXRob24gZWdnCiAgICAgICAgICAgIGNhY2hlOgoKICAgICAgICAgICAgICB7b2xkX2V4Y30KCiAgICAgICAgICAgIFRoZSBQeXRob24gZWdnIGNhY2hlIGRpcmVjdG9yeSBpcyBjdXJyZW50bHkgc2V0IHRvOgoKICAgICAgICAgICAgICB7Y2FjaGVfcGF0aH0KCiAgICAgICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgWW91IGNhbgogICAgICAgICAgICBjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50CiAgICAgICAgICAgIHZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgogICAgICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIGVyci5tYW5hZ2VyID0gc2VsZgogICAgICAgIGVyci5jYWNoZV9wYXRoID0gY2FjaGVfcGF0aAogICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKICAgICAgICByYWlzZSBlcnIKCiAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CiAgICAgICAgIiIiUmV0dXJuIGFic29sdXRlIGxvY2F0aW9uIGluIGNhY2hlIGZvciBgYXJjaGl2ZV9uYW1lYCBhbmQgYG5hbWVzYAoKICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKICAgICAgICBub3QgYWxyZWFkeSBleGlzdC4gIGBhcmNoaXZlX25hbWVgIHNob3VsZCBiZSB0aGUgYmFzZSBmaWxlbmFtZSBvZiB0aGUKICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAogICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQogICAgICAgIHNlcXVlbmNlIG9mIHBhdGggbmFtZSBwYXJ0cyAidW5kZXIiIHRoZSBlZ2cncyBleHRyYWN0aW9uIGxvY2F0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwogICAgICAgIG9idGFpbiBhbiBleHRyYWN0aW9uIGxvY2F0aW9uLCBhbmQgb25seSBmb3IgbmFtZXMgdGhleSBpbnRlbmQgdG8KICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBleHRyYWN0X3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCiAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUgKyAnLXRtcCcsICpuYW1lcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHNlbGYuX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChleHRyYWN0X3BhdGgpCgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzW3RhcmdldF9wYXRoXSA9IDEKICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIHBhdGggaXMgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIGFuIGluc2VjdXJlCiAgICAgICAgbG9jYXRpb24sIHN1Y2ggYXMgL3RtcCwgaXQgb3BlbnMgdXAgYW4gb3Bwb3J0dW5pdHkgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgICAgcmVwbGFjZSBhbiBleHRyYWN0ZWQgZmlsZSB3aXRoIGFuIHVuYXV0aG9yaXplZCBwYXlsb2FkLiBXYXJuIHRoZSB1c2VyCiAgICAgICAgaWYgYSBrbm93biBpbnNlY3VyZSBsb2NhdGlvbiBpcyB1c2VkLgoKICAgICAgICBTZWUgRGlzdHJpYnV0ZSAjMzc1IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKG9zLmVudmlyb25bJ3dpbmRpciddKToKICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBwZXJtaXNzaW9ucyBhcmUgZ2VuZXJhbGx5IHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIyAgYW5kIHRlbXAgZGlyZWN0b3JpZXMgYXJlIG5vdCB3cml0YWJsZSBieSBvdGhlciB1c2Vycywgc28KICAgICAgICAgICAgIyAgYnlwYXNzIHRoZSB3YXJuaW5nLgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JV09USCBvciBtb2RlICYgc3RhdC5TX0lXR1JQOgogICAgICAgICAgICBtc2cgPSAoIiVzIGlzIHdyaXRhYmxlIGJ5IGdyb3VwL290aGVycyBhbmQgdnVsbmVyYWJsZSB0byBhdHRhY2sgIgogICAgICAgICAgICAgICAgIndoZW4gIgogICAgICAgICAgICAgICAgInVzZWQgd2l0aCBnZXRfcmVzb3VyY2VfZmlsZW5hbWUuIENvbnNpZGVyIGEgbW9yZSBzZWN1cmUgIgogICAgICAgICAgICAgICAgImxvY2F0aW9uIChzZXQgd2l0aCAuc2V0X2V4dHJhY3Rpb25fcGF0aCBvciB0aGUgIgogICAgICAgICAgICAgICAgIlBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQgdmFyaWFibGUpLiIgJSBwYXRoKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCgogICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAoKICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAogICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KCiAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CiAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCiAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmlsZXN5c3RlbS4KCiAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAogICAgICAgIGlzIHRoZSBuYW1lIGl0IHdpbGwgYmUgcmVuYW1lZCB0byBieSB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgcm91dGluZQogICAgICAgIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXNvdXJjZSBleGVjdXRhYmxlCiAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQodGVtcG5hbWUpLnN0X21vZGUpIHwgMG81NTUpICYgMG83Nzc3CiAgICAgICAgICAgIG9zLmNobW9kKHRlbXBuYW1lLCBtb2RlKQoKICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIlNldCB0aGUgYmFzZSBwYXRoIHdoZXJlIHJlc291cmNlcyB3aWxsIGJlIGV4dHJhY3RlZCB0bywgaWYgbmVlZGVkLgoKICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCiAgICAgICAgcGF0aCBkZWZhdWx0cyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBgZ2V0X2RlZmF1bHRfY2FjaGUoKWBgLiAgKFdoaWNoCiAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQogICAgICAgIGRldGFpbHMuKQoKICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgogICAgICAgIGluZm9ybWF0aW9uIGdpdmVuIGJ5IHRoZSBgYElSZXNvdXJjZVByb3ZpZGVyYGAuICBZb3UgbWF5IHNldCB0aGlzIHRvIGEKICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCiAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB3aWxsIGJlIGFibGUgdG8gcmVtb3ZlIGFsbCBleHRyYWN0ZWQgZmlsZXMuCgogICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQogICAgICAgIG1hbmFnZXIgb25jZSByZXNvdXJjZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgdW5sZXNzIHlvdSBmaXJzdCBjYWxsCiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FjaGVkX2ZpbGVzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAoKICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGFsbCBleHRyYWN0ZWQgcmVzb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXR1cm5pbmcgYSBsaXN0CiAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAogICAgICAgIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBleHRyYWN0aW9uIHBhdGggaXMgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCiAgICAgICAgYGBhdGV4aXRgYCBmdW5jdGlvbiBpZiB5b3Ugd2lzaCB0byBlbnN1cmUgY2xlYW51cCBvZiBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFhYWAoKCmRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICBvciBhIHBsYXRmb3JtLXJlbGV2YW50IHVzZXIgY2FjaGUgZGlyIGZvciBhbiBhcHAKICAgIG5hbWVkICJQeXRob24tRWdncyIuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTl9FR0dfQ0FDSEUnKQogICAgICAgIG9yIGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoYXBwbmFtZT0nUHl0aG9uLUVnZ3MnKQogICAgKQoKCmRlZiBzYWZlX25hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCgoKZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKICAgICIiIgogICAgdHJ5OgogICAgICAgICMgbm9ybWFsaXplIHRoZSB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIHN0cihwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHZlcnNpb24pKQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpCiAgICAgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCgoKZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS4tXSsnLCAnXycsIGV4dHJhKS5sb3dlcigpCgoKZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KCiAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KICAgICIiIgogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsICdfJykKCgpkZWYgaW52YWxpZF9tYXJrZXIodGV4dCk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRleHQgYXMgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlcjsgcmV0dXJuIGFuIGV4Y2VwdGlvbgogICAgaWYgaW52YWxpZCBvciBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBldmFsdWF0ZV9tYXJrZXIodGV4dCkKICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgIGUuZmlsZW5hbWUgPSBOb25lCiAgICAgICAgZS5saW5lbm8gPSBOb25lCiAgICAgICAgcmV0dXJuIGUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBldmFsdWF0ZV9tYXJrZXIodGV4dCwgZXh0cmE9Tm9uZSk6CiAgICAiIiIKICAgIEV2YWx1YXRlIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXIuCiAgICBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG1hcmtlciByZXN1bHQgaW4gdGhpcyBlbnZpcm9ubWVudC4KICAgIFJhaXNlIFN5bnRheEVycm9yIGlmIG1hcmtlciBpcyBpbnZhbGlkLgoKICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgJ3B5cGFyc2luZycgbW9kdWxlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgbWFya2VyID0gcGFja2FnaW5nLm1hcmtlcnMuTWFya2VyKHRleHQpCiAgICAgICAgcmV0dXJuIG1hcmtlci5ldmFsdWF0ZSgpCiAgICBleGNlcHQgcGFja2FnaW5nLm1hcmtlcnMuSW52YWxpZE1hcmtlciBhcyBlOgogICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUpCgoKY2xhc3MgTnVsbFByb3ZpZGVyOgogICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCgogICAgZWdnX25hbWUgPSBOb25lCiAgICBlZ2dfaW5mbyA9IE5vbmUKICAgIGxvYWRlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19yZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKCd1dGYtOCcpIGlmIHNpeC5QWTMgZWxzZSB2YWx1ZQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUKICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKCJObyBzY3JpcHQgbmFtZWQgJXIiICUgc2NyaXB0X25hbWUpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzZWxmLmdldF9tZXRhZGF0YShzY3JpcHQpLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2NyaXB0X3RleHQucmVwbGFjZSgnXHInLCAnXG4nKQogICAgICAgIHNjcmlwdF9maWxlbmFtZSA9IHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIHNjcmlwdCkKICAgICAgICBuYW1lc3BhY2VbJ19fZmlsZV9fJ10gPSBzY3JpcHRfZmlsZW5hbWUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgogICAgICAgICAgICBzb3VyY2UgPSBvcGVuKHNjcmlwdF9maWxlbmFtZSkucmVhZCgpCiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCiAgICAgICAgICAgIGNhY2hlW3NjcmlwdF9maWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2NyaXB0X2NvZGUgPSBjb21waWxlKHNjcmlwdF90ZXh0LCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhzY3JpcHRfY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiByZXNvdXJjZV9uYW1lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZV9uYW1lLnNwbGl0KCcvJykpCiAgICAgICAgcmV0dXJuIGJhc2UKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCiAgICAgICAgKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKG9iamVjdCwgTnVsbFByb3ZpZGVyKQoKCmNsYXNzIEVnZ1Byb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIE51bGxQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCiAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKICAgICAgICAjIHdlIGFzc3VtZSBoZXJlIHRoYXQgb3VyIG1ldGFkYXRhIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgImJhc2tldCIKICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAogICAgICAgIG9sZCA9IE5vbmUKICAgICAgICB3aGlsZSBwYXRoICE9IG9sZDoKICAgICAgICAgICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2xkID0gcGF0aAogICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQoKCmNsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSksICdyYicpCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHN0cmVhbToKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVnaXN0ZXIoY2xzKToKICAgICAgICBsb2FkZXJfY2xzID0gZ2V0YXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnU291cmNlRmlsZUxvYWRlcicsCiAgICAgICAgICAgIHR5cGUoTm9uZSkpCiAgICAgICAgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX2NscywgY2xzKQoKCkRlZmF1bHRQcm92aWRlci5fcmVnaXN0ZXIoKQoKCmNsYXNzIEVtcHR5UHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKCiAgICBfaXNkaXIgPSBfaGFzID0gbGFtYmRhIHNlbGYsIHBhdGg6IEZhbHNlCiAgICBfZ2V0ID0gbGFtYmRhIHNlbGYsIHBhdGg6ICcnCiAgICBfbGlzdGRpciA9IGxhbWJkYSBzZWxmLCBwYXRoOiBbXQogICAgbW9kdWxlX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCgplbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQoKCmNsYXNzIFppcE1hbmlmZXN0cyhkaWN0KToKICAgICIiIgogICAgemlwIG1hbmlmZXN0IGJ1aWxkZXIKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ1aWxkKGNscywgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSBkaWN0aW9uYXJ5IHNpbWlsYXIgdG8gdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICBjYWNoZXMsIGV4Y2VwdCBpbnN0ZWFkIG9mIHR1cGxlcywgc3RvcmUgWmlwSW5mbyBvYmplY3RzLgoKICAgICAgICBVc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAob3Muc2VwKSBmb3IgdGhlIHBhdGgga2V5cwogICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHlweSBvbiBXaW5kb3dzLgogICAgICAgICIiIgogICAgICAgIHdpdGggQ29udGV4dHVhbFppcEZpbGUocGF0aCkgYXMgemZpbGU6CiAgICAgICAgICAgIGl0ZW1zID0gKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUucmVwbGFjZSgnLycsIG9zLnNlcCksCiAgICAgICAgICAgICAgICAgICAgemZpbGUuZ2V0aW5mbyhuYW1lKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHpmaWxlLm5hbWVsaXN0KCkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGljdChpdGVtcykKCiAgICBsb2FkID0gYnVpbGQKCgpjbGFzcyBNZW1vaXplZFppcE1hbmlmZXN0cyhaaXBNYW5pZmVzdHMpOgogICAgIiIiCiAgICBNZW1vaXplZCB6aXBmaWxlIG1hbmlmZXN0cy4KICAgICIiIgogICAgbWFuaWZlc3RfbW9kID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnbWFuaWZlc3RfbW9kJywgJ21hbmlmZXN0IG10aW1lJykKCiAgICBkZWYgbG9hZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGEgbWFuaWZlc3QgYXQgcGF0aCBvciByZXR1cm4gYSBzdWl0YWJsZSBtYW5pZmVzdCBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQoKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmIG9yIHNlbGZbcGF0aF0ubXRpbWUgIT0gbXRpbWU6CiAgICAgICAgICAgIG1hbmlmZXN0ID0gc2VsZi5idWlsZChwYXRoKQogICAgICAgICAgICBzZWxmW3BhdGhdID0gc2VsZi5tYW5pZmVzdF9tb2QobWFuaWZlc3QsIG10aW1lKQoKICAgICAgICByZXR1cm4gc2VsZltwYXRoXS5tYW5pZmVzdAoKCmNsYXNzIENvbnRleHR1YWxaaXBGaWxlKHppcGZpbGUuWmlwRmlsZSk6CiAgICAiIiIKICAgIFN1cHBsZW1lbnQgWmlwRmlsZSBjbGFzcyB0byBzdXBwb3J0IGNvbnRleHQgbWFuYWdlciBmb3IgUHl0aG9uIDIuNgogICAgIiIiCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgWmlwRmlsZSBvciBDb250ZXh0dWFsWmlwRmlsZSBhcyBhcHByb3ByaWF0ZQogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIoemlwZmlsZS5aaXBGaWxlLCAnX19leGl0X18nKToKICAgICAgICAgICAgcmV0dXJuIHppcGZpbGUuWmlwRmlsZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHN1cGVyKENvbnRleHR1YWxaaXBGaWxlLCBjbHMpLl9fbmV3X18oY2xzKQoKCmNsYXNzIFppcFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKCiAgICBlYWdlcnMgPSBOb25lCiAgICBfemlwX21hbmlmZXN0cyA9IE1lbW9pemVkWmlwTWFuaWZlc3RzKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZSArIG9zLnNlcAoKICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYSB6aXBmaWxlIHN1YnBhdGgKICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICkKCiAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QuCiAgICAgICAgIyBwc2V1ZG8tZnMgcGF0aAogICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgemlwaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5femlwX21hbmlmZXN0cy5sb2FkKHNlbGYubG9hZGVyLmFyY2hpdmUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgICAgICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QgLnppcCIKICAgICAgICAgICAgKQogICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwogICAgICAgIHppcF9wYXRoID0gc2VsZi5fcmVzb3VyY2VfdG9femlwKHJlc291cmNlX25hbWUpCiAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCiAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGVhZ2VyczoKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQogICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2RhdGVfYW5kX3NpemUoemlwX3N0YXQpOgogICAgICAgIHNpemUgPSB6aXBfc3RhdC5maWxlX3NpemUKICAgICAgICAjIHltZGhtcyt3ZGF5LCB5ZGF5LCBkc3QKICAgICAgICBkYXRlX3RpbWUgPSB6aXBfc3RhdC5kYXRlX3RpbWUgKyAoMCwgMCwgLTEpCiAgICAgICAgIyAxOTgwIG9mZnNldCBhbHJlYWR5IGRvbmUKICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCwgc2l6ZQoKICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CgogICAgICAgIGlmIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgogICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgb3MucGF0aC5qb2luKHppcF9wYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUobGFzdCkKCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKCiAgICAgICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5yZW5hbWUiIGFuZCAib3MudW5saW5rIiBhcmUgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHRoaXMgcGxhdGZvcm0nKQogICAgICAgIHRyeToKCiAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKCIuJGV4dHJhY3QiLCBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCkpCiAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKICAgICAgICAgICAgb3MuY2xvc2Uob3V0ZikKICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLCB0aW1lc3RhbXApKQogICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGJlY2FtZSBjdXJyZW50IHNpbmNlIGl0IHdhcyBjaGVja2VkIGFib3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAjICBzbyBwcm9jZWVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAjIHJlcG9ydCBhIHVzZXItZnJpZW5kbHkgZXJyb3IKICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgIGRlZiBfaXNfY3VycmVudChzZWxmLCBmaWxlX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZV9wYXRoIGlzIGN1cnJlbnQgZm9yIHRoaXMgemlwX3BhdGgKICAgICAgICAiIiIKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlX3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ID0gb3Muc3RhdChmaWxlX3BhdGgpCiAgICAgICAgaWYgc3RhdC5zdF9zaXplICE9IHNpemUgb3Igc3RhdC5zdF9tdGltZSAhPSB0aW1lc3RhbXA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgbWF0Y2gKICAgICAgICB6aXBfY29udGVudHMgPSBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICByZXR1cm4gemlwX2NvbnRlbnRzID09IGZpbGVfY29udGVudHMKCiAgICBkZWYgX2dldF9lYWdlcl9yZXNvdXJjZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKICAgICAgICAgICAgZWFnZXJzID0gW10KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCduYXRpdmVfbGlicy50eHQnLCAnZWFnZXJfcmVzb3VyY2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKICAgICAgICAgICAgc2VsZi5lYWdlcnMgPSBlYWdlcnMKICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKCiAgICBkZWYgX2luZGV4KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbmQgPSB7fQogICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaW4gaW5kOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQogICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAogICAgICAgICAgICByZXR1cm4gaW5kCgogICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpCiAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKCiAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKCgpjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCgogICAgVXNhZ2U6OgoKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YSgiL3BhdGgvdG8vUEtHLUlORk8iKQoKICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKICAgIHdoaWNoIGlzIHRyZWF0ZWQgYXMgZXhpc3RpbmcsIGFuZCB3aWxsIGJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdAogICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lID09ICdQS0ctSU5GTycgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgIT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5wYXRoLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgogICAgICAgICAgICBtZXRhZGF0YSA9IGYucmVhZCgpCiAgICAgICAgc2VsZi5fd2Fybl9vbl9yZXBsYWNlbWVudChtZXRhZGF0YSkKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX3dhcm5fb25fcmVwbGFjZW1lbnQoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICMgUHl0aG9uIDIuNiBhbmQgMy4yIGNvbXBhdCBmb3I6IHJlcGxhY2VtZW50X2NoYXIgPSAn77+9JwogICAgICAgIHJlcGxhY2VtZW50X2NoYXIgPSBiJ1x4ZWZceGJmXHhiZCcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcmVwbGFjZW1lbnRfY2hhciBpbiBtZXRhZGF0YToKICAgICAgICAgICAgdG1wbCA9ICJ7c2VsZi5wYXRofSBjb3VsZCBub3QgYmUgcHJvcGVybHkgZGVjb2RlZCBpbiBVVEYtOCIKICAgICAgICAgICAgbXNnID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgoKY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgZWdnIGRpcmVjdG9yaWVzCgogICAgVXNhZ2U6OgoKICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CgogICAgICAgIGVnZ19pbmZvID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLmVnZy1pbmZvIgogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpciwgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgoKICAgICAgICBlZ2dfcGF0aCA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS12ZXItcHl2ZXItZXRjLmVnZyIKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZWdnX2luZm8pOgogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCgoKY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIC5lZ2cgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgogICAgICAgICIiIkNyZWF0ZSBhIG1ldGFkYXRhIHByb3ZpZGVyIGZyb20gYSB6aXBpbXBvcnRlciIiIgoKICAgICAgICBzZWxmLnppcF9wcmUgPSBpbXBvcnRlci5hcmNoaXZlICsgb3Muc2VwCiAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgogICAgICAgIGlmIGltcG9ydGVyLnByZWZpeDoKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IGltcG9ydGVyLmFyY2hpdmUKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzPXt9KQoKCmRlZiByZWdpc3Rlcl9maW5kZXIoaW1wb3J0ZXJfdHlwZSwgZGlzdHJpYnV0aW9uX2ZpbmRlcik6CiAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCiAgICB0aGF0IHBhdGggaXRlbS4gIFNlZSBgYHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoYGAgZm9yIGFuIGV4YW1wbGUuIiIiCiAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCgoKZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQogICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQoKCmRlZiBmaW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiCiAgICBGaW5kIGVnZ3MgaW4gemlwIGZpbGVzOyBwb3NzaWJseSBtdWx0aXBsZSBuZXN0ZWQgZWdncy4KICAgICIiIgogICAgaWYgaW1wb3J0ZXIuYXJjaGl2ZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICMgd2hlZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaW5kZXIKICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSBQS0ctSU5GTyBtZXRhZGF0YSwgYW5kIHdvbid0IGV2ZXIgY29udGFpbiBlZ2dzCiAgICAgICAgcmV0dXJuCiAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKGltcG9ydGVyKQogICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICBpZiBvbmx5OgogICAgICAgICMgZG9uJ3QgeWllbGQgbmVzdGVkIGRpc3Ryb3MKICAgICAgICByZXR1cm4KICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKICAgICAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHN1Yml0ZW0pOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9lZ2dzX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbmRfZWdnc19pbl96aXApCgoKZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgIHJldHVybiAoKQoKCnJlZ2lzdGVyX2ZpbmRlcihvYmplY3QsIGZpbmRfbm90aGluZykKCgpkZWYgX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybiB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIKICAgIGJ5IHZlcnNpb24gbnVtYmVyLgoKICAgID4+PiBuYW1lcyA9ICdiYXInLCAnZm9vJywgJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycsICdmb28nLCAnYmFyJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICAiIiIKICAgIGRlZiBfYnlfdmVyc2lvbihuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAiIiIKICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4obmFtZS5zcGxpdCgnLScpLCBbZXh0XSkKICAgICAgICByZXR1cm4gW3BhY2thZ2luZy52ZXJzaW9uLnBhcnNlKHBhcnQpIGZvciBwYXJ0IGluIHBhcnRzXQoKICAgIHJldHVybiBzb3J0ZWQobmFtZXMsIGtleT1fYnlfdmVyc2lvbiwgcmV2ZXJzZT1UcnVlKQoKCmRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgb24gYSBzeXMucGF0aCBkaXJlY3RvcnkiIiIKICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKCiAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGhfaXRlbSkgYW5kIG9zLmFjY2VzcyhwYXRoX2l0ZW0sIG9zLlJfT0spOgogICAgICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aF9pdGVtKToKICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKICAgICAgICAgICAgcGF0aF9pdGVtX2VudHJpZXMgPSBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG9zLmxpc3RkaXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHBhdGhfaXRlbV9lbnRyaWVzOgogICAgICAgICAgICAgICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCiAgICAgICAgICAgICAgICBpZiBsb3dlci5lbmRzd2l0aCgnLmVnZy1pbmZvJykgb3IgbG93ZXIuZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIGVnZy1pbmZvIGRpcmVjdG9yeSwgYWxsb3cgZ2V0dGluZyBtZXRhZGF0YQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ob3MubGlzdGRpcihmdWxscGF0aCkpID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGVnZyBkaXJlY3RvcnksIHNraXAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShwYXRoX2l0ZW0sIGZ1bGxwYXRoKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKGZ1bGxwYXRoKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIGVudHJ5LCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1ERVZFTE9QX0RJU1QKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBfaXNfdW5wYWNrZWRfZWdnKGVudHJ5KToKICAgICAgICAgICAgICAgICAgICBkaXN0cyA9IGZpbmRfZGlzdHJpYnV0aW9ucyhvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkpCiAgICAgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgIGVsaWYgbm90IG9ubHkgYW5kIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWxpbmsnKToKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKSBhcyBlbnRyeV9maWxlOgogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9saW5lcyA9IGVudHJ5X2ZpbGUucmVhZGxpbmVzKCkKICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBlbnRyeV9saW5lczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgICAgICAgICBkaXN0cyA9IGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBkaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCgpyZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmluZF9vbl9wYXRoKQoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX2hhbmRsZXJzPXt9KQpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfcGFja2FnZXM9e30pCgoKZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CgogICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9lbnRyeSwgbW9kdWxlTmFtZSwgbW9kdWxlKToKICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKCiAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKICAgIHJldHVybiBhIHN1YnBhdGggaWYgdGhlIG1vZHVsZSBfX3BhdGhfXyBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4KICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KICAgICIiIgogICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCgoKZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CiAgICAiIiJFbnN1cmUgdGhhdCBuYW1lZCBwYWNrYWdlIGluY2x1ZGVzIGEgc3VicGF0aCBvZiBwYXRoX2l0ZW0gKGlmIG5lZWRlZCkiIiIKCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBpZiBpbXBvcnRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShwYWNrYWdlTmFtZSkKICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZU5hbWUpCiAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSB0eXBlcy5Nb2R1bGVUeXBlKHBhY2thZ2VOYW1lKQogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IFtdCiAgICAgICAgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCiAgICBlbGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhY2thZ2VOYW1lKQogICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCiAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgaWYgc3VicGF0aCBpcyBub3QgTm9uZToKICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCiAgICAgICAgcGF0aC5hcHBlbmQoc3VicGF0aCkKICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICAgICAgX3JlYnVpbGRfbW9kX3BhdGgocGF0aCwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIHJldHVybiBzdWJwYXRoCgoKZGVmIF9yZWJ1aWxkX21vZF9wYXRoKG9yaWdfcGF0aCwgcGFja2FnZV9uYW1lLCBtb2R1bGUpOgogICAgIiIiCiAgICBSZWJ1aWxkIG1vZHVsZS5fX3BhdGhfXyBlbnN1cmluZyB0aGF0IGFsbCBlbnRyaWVzIGFyZSBvcmRlcmVkCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN5cy5wYXRoIG9yZGVyCiAgICAiIiIKICAgIHN5c19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIHN5cy5wYXRoXQoKICAgIGRlZiBzYWZlX3N5c19wYXRoX2luZGV4KGVudHJ5KToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTIwIGFuZCAjNTEzLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN5c19wYXRoLmluZGV4KGVudHJ5KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCgogICAgZGVmIHBvc2l0aW9uX2luX3N5c19wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgb3JkaW5hbCBvZiB0aGUgcGF0aCBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gc3lzLnBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoX3BhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgbW9kdWxlX3BhcnRzID0gcGFja2FnZV9uYW1lLmNvdW50KCcuJykgKyAxCiAgICAgICAgcGFydHMgPSBwYXRoX3BhcnRzWzotbW9kdWxlX3BhcnRzXQogICAgICAgIHJldHVybiBzYWZlX3N5c19wYXRoX2luZGV4KF9ub3JtYWxpemVfY2FjaGVkKG9zLnNlcC5qb2luKHBhcnRzKSkpCgogICAgb3JpZ19wYXRoLnNvcnQoa2V5PXBvc2l0aW9uX2luX3N5c19wYXRoKQogICAgbW9kdWxlLl9fcGF0aF9fWzpdID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIG9yaWdfcGF0aF0KCgpkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgogICAgIiIiRGVjbGFyZSB0aGF0IHBhY2thZ2UgJ3BhY2thZ2VOYW1lJyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlIiIiCgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGlmIHBhY2thZ2VOYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoLCBwYXJlbnQgPSBzeXMucGF0aCwgTm9uZQogICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQogICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwYXJlbnQpCiAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbcGFyZW50XS5fX3BhdGhfXwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQoKICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAogICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYXJlbnQsIFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhY2thZ2VOYW1lLCBbXSkKCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgogICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCiAgICAgICAgICAgICMgaWYgdGhleSBhcHBseQogICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCgogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCAoKSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKICAgICAgICAgICAgaWYgc3VicGF0aDoKICAgICAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLCBwYWNrYWdlKQogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgICIiIkNvbXB1dGUgYW4gbnMtcGFja2FnZSBzdWJwYXRoIGZvciBhIGZpbGVzeXN0ZW0gb3IgemlwZmlsZSBpbXBvcnRlciIiIgoKICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplX2NhY2hlZChzdWJwYXRoKQogICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgogICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pID09IG5vcm1hbGl6ZWQ6CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHBhdGggaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgIHJldHVybiBzdWJwYXRoCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmlsZV9uc19oYW5kbGVyKQoKCmRlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICByZXR1cm4gTm9uZQoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKG9iamVjdCwgbnVsbF9uc19oYW5kbGVyKQoKCmRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBmaWxlL2RpciBuYW1lIGZvciBjb21wYXJpc29uIHB1cnBvc2VzIiIiCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKCgpkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsIF9jYWNoZT17fSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jYWNoZVtmaWxlbmFtZV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIHVucGFja2VkIGVnZy4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKQogICAgKQoKCmRlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CiAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKICAgIG5hbWUgPSBwYXJ0cy5wb3AoKQogICAgaWYgcGFydHM6CiAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCiAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1twYXJlbnRdLCBuYW1lLCBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0pCgoKZGVmIHlpZWxkX2xpbmVzKHN0cnMpOgogICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgc3RyaW5nIG9yIHNlcXVlbmNlIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBzID0gcy5zdHJpcCgpCiAgICAgICAgICAgICMgc2tpcCBibGFuayBsaW5lcy9jb21tZW50cwogICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCiAgICBlbHNlOgogICAgICAgIGZvciBzcyBpbiBzdHJzOgogICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCgoKTU9EVUxFID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCkVHR19OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiIKICAgICg/UDxuYW1lPlteLV0rKSAoCiAgICAgICAgLSg/UDx2ZXI+W14tXSspICgKICAgICAgICAgICAgLXB5KD9QPHB5dmVyPlteLV0rKSAoCiAgICAgICAgICAgICAgICAtKD9QPHBsYXQ+LispCiAgICAgICAgICAgICk/CiAgICAgICAgKT8KICAgICk/CiAgICAiIiIsCiAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKKS5tYXRjaAoKCmNsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgYW4gYWR2ZXJ0aXNlZCBpbXBvcnRhYmxlIG9iamVjdCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKICAgICAgICBpZiBub3QgTU9EVUxFKG1vZHVsZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCiAgICAgICAgc2VsZi5leHRyYXMgPSBSZXF1aXJlbWVudC5wYXJzZSgoInhbJXNdIiAlICcsJy5qb2luKGV4dHJhcykpKS5leHRyYXMKICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcyA9ICIlcyA9ICVzIiAlIChzZWxmLm5hbWUsIHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgaWYgc2VsZi5hdHRyczoKICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBSZXF1aXJlIHBhY2thZ2VzIGZvciB0aGlzIEVudHJ5UG9pbnQsIHRoZW4gcmVzb2x2ZSBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZSBvciBhcmdzIG9yIGt3YXJnczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJzIHRvIGxvYWQgYXJlIGRlcHJlY2F0ZWQuICBDYWxsIC5yZXNvbHZlIGFuZCAiCiAgICAgICAgICAgICAgICAiLnJlcXVpcmUgc2VwYXJhdGVseS4iLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yLAogICAgICAgICAgICApCiAgICAgICAgaWYgcmVxdWlyZToKICAgICAgICAgICAgc2VsZi5yZXF1aXJlKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIGl0cyBtb2R1bGUgYW5kIGF0dHJzLgogICAgICAgICIiIgogICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZnJvbWxpc3Q9WydfX25hbWVfXyddLCBsZXZlbD0wKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0b29scy5yZWR1Y2UoZ2V0YXR0ciwgc2VsZi5hdHRycywgbW9kdWxlKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKHN0cihleGMpKQoKICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5leHRyYXMgYW5kIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQogICAgICAgIHJlcXMgPSBzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpCiAgICAgICAgaXRlbXMgPSB3b3JraW5nX3NldC5yZXNvbHZlKHJlcXMsIGVudiwgaW5zdGFsbGVyKQogICAgICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZCwgaXRlbXMpKQoKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInXHMqJwogICAgICAgIHInKD9QPG5hbWU+Lis/KVxzKicKICAgICAgICByJz1ccyonCiAgICAgICAgcicoP1A8bW9kdWxlPltcdy5dKylccyonCiAgICAgICAgcicoOlxzKig/UDxhdHRyPltcdy5dKykpP1xzKicKICAgICAgICByJyg/UDxleHRyYXM+XFsuKlxdKT9ccyokJwogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlKGNscywgc3JjLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCgogICAgICAgIEVudHJ5IHBvaW50IHN5bnRheCBmb2xsb3dzIHRoZSBmb3JtOjoKCiAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSwgZXh0cmEyXQoKICAgICAgICBUaGUgZW50cnkgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIHJlcXVpcmVkLCBidXQgdGhlIGBgOmF0dHJzYGAgYW5kCiAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAogICAgICAgICIiIgogICAgICAgIG0gPSBjbHMucGF0dGVybi5tYXRjaChzcmMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIG1zZyA9ICJFbnRyeVBvaW50IG11c3QgYmUgaW4gJ25hbWU9bW9kdWxlOmF0dHJzIFtleHRyYXNdJyBmb3JtYXQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzcmMpCiAgICAgICAgcmVzID0gbS5ncm91cGRpY3QoKQogICAgICAgIGV4dHJhcyA9IGNscy5fcGFyc2VfZXh0cmFzKHJlc1snZXh0cmFzJ10pCiAgICAgICAgYXR0cnMgPSByZXNbJ2F0dHInXS5zcGxpdCgnLicpIGlmIHJlc1snYXR0ciddIGVsc2UgKCkKICAgICAgICByZXR1cm4gY2xzKHJlc1snbmFtZSddLCByZXNbJ21vZHVsZSddLCBhdHRycywgZXh0cmFzLCBkaXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9leHRyYXMoY2xzLCBleHRyYXNfc3BlYyk6CiAgICAgICAgaWYgbm90IGV4dHJhc19zcGVjOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgneCcgKyBleHRyYXNfc3BlYykKICAgICAgICBpZiByZXEuc3BlY3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQogICAgICAgIHJldHVybiByZXEuZXh0cmFzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYW4gZW50cnkgcG9pbnQgZ3JvdXAiIiIKICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgdGhpcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgogICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQogICAgICAgICAgICBpZiBlcC5uYW1lIGluIHRoaXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKICAgICAgICAgICAgdGhpc1tlcC5uYW1lXSA9IGVwCiAgICAgICAgcmV0dXJuIHRoaXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9tYXAoY2xzLCBkYXRhLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKICAgICAgICBtYXBzID0ge30KICAgICAgICBmb3IgZ3JvdXAsIGxpbmVzIGluIGRhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQogICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKICAgICAgICAgICAgaWYgZ3JvdXAgaW4gbWFwczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKICAgICAgICByZXR1cm4gbWFwcwoKCmRlZiBfcmVtb3ZlX21kNV9mcmFnbWVudChsb2NhdGlvbik6CiAgICBpZiBub3QgbG9jYXRpb246CiAgICAgICAgcmV0dXJuICcnCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UobG9jYXRpb24pCiAgICBpZiBwYXJzZWRbLTFdLnN0YXJ0c3dpdGgoJ21kNT0nKToKICAgICAgICByZXR1cm4gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFyc2VkWzotMV0gKyAoJycsKSkKICAgIHJldHVybiBsb2NhdGlvbgoKCmRlZiBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpOgogICAgIiIiCiAgICBHaXZlbiBhbiBpdGVyYWJsZSBvZiBsaW5lcyBmcm9tIGEgTWV0YWRhdGEgZmlsZSwgcmV0dXJuCiAgICB0aGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gZmllbGQsIGlmIHByZXNlbnQsIG9yIE5vbmUgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBpc192ZXJzaW9uX2xpbmUgPSBsYW1iZGEgbGluZTogbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3ZlcnNpb246JykKICAgIHZlcnNpb25fbGluZXMgPSBmaWx0ZXIoaXNfdmVyc2lvbl9saW5lLCBsaW5lcykKICAgIGxpbmUgPSBuZXh0KGl0ZXIodmVyc2lvbl9saW5lcyksICcnKQogICAgXywgXywgdmFsdWUgPSBsaW5lLnBhcnRpdGlvbignOicpCiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZhbHVlLnN0cmlwKCkpIG9yIE5vbmUKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCiAgICBQS0dfSU5GTyA9ICdQS0ctSU5GTycKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYXRpb249Tm9uZSwgbWV0YWRhdGE9Tm9uZSwgcHJvamVjdF9uYW1lPU5vbmUsCiAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgcHlfdmVyc2lvbj1QWV9NQUpPUiwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCk6CiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBzYWZlX25hbWUocHJvamVjdF9uYW1lIG9yICdVbmtub3duJykKICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5weV92ZXJzaW9uID0gcHlfdmVyc2lvbgogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHNlbGYucHJlY2VkZW5jZSA9IHByZWNlZGVuY2UKICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSAqIDQKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKICAgICAgICBpZiBleHQubG93ZXIoKSBpbiBfZGlzdHJpYnV0aW9uSW1wbDoKICAgICAgICAgICAgY2xzID0gX2Rpc3RyaWJ1dGlvbkltcGxbZXh0Lmxvd2VyKCldCgogICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBtYXRjaC5ncm91cCgKICAgICAgICAgICAgICAgICAgICAnbmFtZScsICd2ZXInLCAncHl2ZXInLCAncGxhdCcKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdwogICAgICAgICkuX3JlbG9hZF92ZXJzaW9uKCkKCiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaGNtcChzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLnBhcnNlZF92ZXJzaW9uLAogICAgICAgICAgICBzZWxmLnByZWNlZGVuY2UsCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBfcmVtb3ZlX21kNV9mcmFnbWVudChzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yICcnLAogICAgICAgICAgICBzZWxmLnBsYXRmb3JtIG9yICcnLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPCBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID49IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICAjIEl0J3Mgbm90IGEgRGlzdHJpYnV0aW9uLCBzbyB0aGV5IGFyZSBub3QgZXF1YWwKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA9PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucwogICAgIyBtYXkgbm90IGtub3cgdGhlaXIgbmFtZSBvciB2ZXJzaW9uIHdpdGhvdXQgbG9hZGluZyBQS0ctSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBrZXkoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa2V5CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX3BhcnNlZF92ZXJzaW9uIik6CiAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgoKICAgIGRlZiBfd2Fybl9sZWdhY3lfdmVyc2lvbihzZWxmKToKICAgICAgICBMViA9IHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24KICAgICAgICBpc19sZWdhY3kgPSBpc2luc3RhbmNlKHNlbGYuX3BhcnNlZF92ZXJzaW9uLCBMVikKICAgICAgICBpZiBub3QgaXNfbGVnYWN5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXaGlsZSBhbiBlbXB0eSB2ZXJzaW9uIGlzIHRlY2huaWNhbGx5IGEgbGVnYWN5IHZlcnNpb24gYW5kCiAgICAgICAgIyBpcyBub3QgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24sIGl0J3MgYWxzbyB1bmxpa2VseSB0bwogICAgICAgICMgYWN0dWFsbHkgY29tZSBmcm9tIHNvbWVvbmUgYW5kIGluc3RlYWQgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdAogICAgICAgICMgaXQgY29tZXMgZnJvbSBzZXR1cHRvb2xzIGF0dGVtcHRpbmcgdG8gcGFyc2UgYSBmaWxlbmFtZSBhbmQKICAgICAgICAjIGluY2x1ZGluZyBpdCBpbiB0aGUgbGlzdC4gU28gZm9yIHRoYXQgd2UnbGwgZ2F0ZSB0aGlzIHdhcm5pbmcKICAgICAgICAjIG9uIGlmIHRoZSB2ZXJzaW9uIGlzIGFueXRoaW5nIGF0IGFsbCBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgICd7cHJvamVjdF9uYW1lfSAoe3ZlcnNpb259KScgaXMgYmVpbmcgcGFyc2VkIGFzIGEgbGVnYWN5LAogICAgICAgICAgICBub24gUEVQIDQ0MCwKICAgICAgICAgICAgdmVyc2lvbi4gWW91IG1heSBmaW5kIG9kZCBiZWhhdmlvciBhbmQgc29ydCBvcmRlci4KICAgICAgICAgICAgSW4gcGFydGljdWxhciBpdCB3aWxsIGJlIHNvcnRlZCBhcyBsZXNzIHRoYW4gMC4wLiBJdAogICAgICAgICAgICBpcyByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIFBFUCA0NDAgY29tcGF0aWJsZQogICAgICAgICAgICB2ZXJzaW9ucy4KICAgICAgICAgICAgIiIiKS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJyAnKQoKICAgICAgICB3YXJuaW5ncy53YXJuKHRtcGwuZm9ybWF0KCoqdmFycyhzZWxmKSksIFBFUDQ0MFdhcm5pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgdG1wbCA9ICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciAlcyBmaWxlIgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih0bXBsICUgc2VsZi5QS0dfSU5GTywgc2VsZikKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KICAgICAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6CiAgICAgICAgICAgICAgICBmb3IgZXh0cmEsIHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEsIG1hcmtlciA9IGV4dHJhLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggd2FybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub3QgZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gc2FmZV9leHRyYShleHRyYSkgb3IgTm9uZQogICAgICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsIFtdKS5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQogICAgICAgICAgICByZXR1cm4gZG0KCiAgICBkZWYgcmVxdWlyZXMoc2VsZiwgZXh0cmFzPSgpKToKICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCiAgICAgICAgZG0gPSBzZWxmLl9kZXBfbWFwCiAgICAgICAgZGVwcyA9IFtdCiAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsICgpKSkKICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKAogICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGRlcHMKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgZGVmIGFjdGl2YXRlKHNlbGYsIHBhdGg9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIGRpc3RyaWJ1dGlvbiBpcyBpbXBvcnRhYmxlIG9uIGBwYXRoYCAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgsIHJlcGxhY2U9cmVwbGFjZSkKICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwa2cpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKICAgICAgICBmaWxlbmFtZSA9ICIlcy0lcy1weSVzIiAlICgKICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKICAgICAgICApCgogICAgICAgIGlmIHNlbGYucGxhdGZvcm06CiAgICAgICAgICAgIGZpbGVuYW1lICs9ICctJyArIHNlbGYucGxhdGZvcm0KICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLCBzZWxmLmxvY2F0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsICd2ZXJzaW9uJywgTm9uZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb24pCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICIiIkRlbGVnYXRlIGFsbCB1bnJlY29nbml6ZWQgcHVibGljIGF0dHJpYnV0ZXMgdG8gLm1ldGFkYXRhIHByb3ZpZGVyIiIiCiAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGF0dHIpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9maWxlbmFtZShjbHMsIGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgICAgICAgICBzcGVjID0gIiVzPT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3BlYyA9ICIlcz09PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCgogICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLCBuYW1lKSwpKQogICAgICAgIHJldHVybiBlcC5sb2FkKCkKCiAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcCA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKICAgICAgICAgICAgKQogICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCwge30pCiAgICAgICAgcmV0dXJuIGVwX21hcAoKICAgIGRlZiBnZXRfZW50cnlfaW5mbyhzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCgogICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2M9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIHNlbGYubG9jYXRpb24gaXMgb24gcGF0aAoKICAgICAgICBJZiByZXBsYWNlPUZhbHNlIChkZWZhdWx0KToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IGluIHBhdGggYW55d2hlcmUsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudC4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCB0byB0aGUgZW5kIG9mIHBhdGguCiAgICAgICAgSWYgcmVwbGFjZT1UcnVlOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgb24gcGF0aCBhbnl3aGVyZSAobm90IGVnZ3MpCiAgICAgICAgICAgICAgb3IgaGlnaGVyIHByaW9yaXR5IHRoYW4gaXRzIHBhcmVudCAoZWdncykKICAgICAgICAgICAgICBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQsCiAgICAgICAgICAgICAgICByZW1vdmluZyBhbnkgbG93ZXItcHJpb3JpdHkgZW50cmllcy4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCBpdCB0byB0aGUgZnJvbnQgb2YgcGF0aC4KICAgICAgICAiIiIKCiAgICAgICAgbG9jID0gbG9jIG9yIHNlbGYubG9jYXRpb24KICAgICAgICBpZiBub3QgbG9jOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbmxvYyA9IF9ub3JtYWxpemVfY2FjaGVkKGxvYykKICAgICAgICBiZGlyID0gb3MucGF0aC5kaXJuYW1lKG5sb2MpCiAgICAgICAgbnBhdGggPSBbKHAgYW5kIF9ub3JtYWxpemVfY2FjaGVkKHApIG9yIHApIGZvciBwIGluIHBhdGhdCgogICAgICAgIGZvciBwLCBpdGVtIGluIGVudW1lcmF0ZShucGF0aCk6CiAgICAgICAgICAgIGlmIGl0ZW0gPT0gbmxvYzoKICAgICAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtb2RpZnkgcGF0aCAoZXZlbiByZW1vdmluZyBkdXBsaWNhdGVzKSBpZiBmb3VuZCBhbmQgbm90IHJlcGxhY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBpdGVtID09IGJkaXIgYW5kIHNlbGYucHJlY2VkZW5jZSA9PSBFR0dfRElTVDoKICAgICAgICAgICAgICAgICMgaWYgaXQncyBhbiAuZWdnLCBnaXZlIGl0IHByZWNlZGVuY2Ugb3ZlciBpdHMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIFVOTEVTUyBpdCdzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBzeXMucGF0aCBhbmQgcmVwbGFjZT1GYWxzZQogICAgICAgICAgICAgICAgaWYgKG5vdCByZXBsYWNlKSBhbmQgbmxvYyBpbiBucGF0aFtwOl06CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgICAgICBwYXRoLmluc2VydChwLCBsb2MpCiAgICAgICAgICAgICAgICBucGF0aC5pbnNlcnQocCwgbmxvYykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBsb2MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChsb2MpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHAgaXMgdGhlIHNwb3Qgd2hlcmUgd2UgZm91bmQgb3IgaW5zZXJ0ZWQgbG9jOyBub3cgcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBucCA9IG5wYXRoLmluZGV4KG5sb2MsIHAgKyAxKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgbnBhdGhbbnBdLCBwYXRoW25wXQogICAgICAgICAgICAgICAgIyBoYSEKICAgICAgICAgICAgICAgIHAgPSBucAoKICAgICAgICByZXR1cm4KCiAgICBkZWYgY2hlY2tfdmVyc2lvbl9jb25mbGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICMgaWdub3JlIHRoZSBpbmV2aXRhYmxlIHNldHVwdG9vbHMgc2VsZi1jb25mbGljdHMgIDooCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQogICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCiAgICAgICAgZm9yIG1vZG5hbWUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAogICAgICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtb2RuYW1lIGluICgncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJywgJ3NpdGUnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKICAgICAgICAgICAgaWYgZm4gYW5kIChub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgZm4uc3RhcnRzd2l0aChzZWxmLmxvY2F0aW9uKSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAogICAgICAgICAgICAgICAgIk1vZHVsZSAlcyB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmcm9tICVzLCBidXQgJXMgaXMgYmVpbmcgYWRkZWQiCiAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnZlcnNpb24KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIgKyByZXByKHNlbGYpKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9uZShzZWxmLCAqKmt3KToKICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCiAgICAgICAgbmFtZXMgPSAncHJvamVjdF9uYW1lIHZlcnNpb24gcHlfdmVyc2lvbiBwbGF0Zm9ybSBsb2NhdGlvbiBwcmVjZWRlbmNlJwogICAgICAgIGZvciBhdHRyIGluIG5hbWVzLnNwbGl0KCk6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqKmt3KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dHJhcyhzZWxmKToKICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGFja2FnZXMgaW5zdGFsbGVkIGJ5IGRpc3R1dGlscyAoZS5nLiBudW1weSBvciBzY2lweSksCiAgICAgICAgd2hpY2ggdXNlcyBhbiBvbGQgc2FmZV92ZXJzaW9uLCBhbmQgc28KICAgICAgICB0aGVpciB2ZXJzaW9uIG51bWJlcnMgY2FuIGdldCBtYW5nbGVkIHdoZW4KICAgICAgICBjb252ZXJ0ZWQgdG8gZmlsZW5hbWVzIChlLmcuLCAxLjExLjAuZGV2MCsyMzI5ZWFlIHRvCiAgICAgICAgMS4xMS4wLmRldjBfMjMyOWVhZSkuIFRoZXNlIGRpc3RyaWJ1dGlvbnMgd2lsbCBub3QgYmUKICAgICAgICBwYXJzZWQgcHJvcGVybHkKICAgICAgICBkb3duc3RyZWFtIGJ5IERpc3RyaWJ1dGlvbiBhbmQgc2FmZV92ZXJzaW9uLCBzbwogICAgICAgIHRha2UgYW4gZXh0cmEgc3RlcCBhbmQgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbQogICAgICAgIHRoZSBtZXRhZGF0YSBmaWxlIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBtZF92ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICBpZiBtZF92ZXJzaW9uOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWRfdmVyc2lvbgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgRGlzdEluZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhLCAuZGlzdC1pbmZvIHN0eWxlIiIiCiAgICBQS0dfSU5GTyA9ICdNRVRBREFUQScKICAgIEVRRVEgPSByZS5jb21waWxlKHIiKFtcKCxdKVxzKihcZC4qPylccyooWyxcKV0pIikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfcGFyc2VkX3BrZ19pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIGFuZCBjYWNoZSBtZXRhZGF0YSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgIHNlbGYuX3BrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKG1ldGFkYXRhKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9jb21wdXRlX2RlcGVuZGVuY2llcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIGRlZiBfY29tcHV0ZV9kZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgIiIiUmVjb21wdXRlIHRoaXMgZGlzdHJpYnV0aW9uJ3MgZGVwZW5kZW5jaWVzLiIiIgogICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CgogICAgICAgIHJlcXMgPSBbXQogICAgICAgICMgSW5jbHVkaW5nIGFueSBjb25kaXRpb24gZXhwcmVzc2lvbnMKICAgICAgICBmb3IgcmVxIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdSZXF1aXJlcy1EaXN0Jykgb3IgW106CiAgICAgICAgICAgIHJlcXMuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXEpKQoKICAgICAgICBkZWYgcmVxc19mb3JfZXh0cmEoZXh0cmEpOgogICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm1hcmtlciBvciByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICAgICBjb21tb24gPSBmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoTm9uZSkpCiAgICAgICAgZG1bTm9uZV0uZXh0ZW5kKGNvbW1vbikKCiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdQcm92aWRlcy1FeHRyYScpIG9yIFtdOgogICAgICAgICAgICBzX2V4dHJhID0gc2FmZV9leHRyYShleHRyYS5zdHJpcCgpKQogICAgICAgICAgICBkbVtzX2V4dHJhXSA9IGxpc3QoZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKGV4dHJhKSkgLSBjb21tb24pCgogICAgICAgIHJldHVybiBkbQoKCl9kaXN0cmlidXRpb25JbXBsID0gewogICAgJy5lZ2cnOiBEaXN0cmlidXRpb24sCiAgICAnLmVnZy1pbmZvJzogRWdnSW5mb0Rpc3RyaWJ1dGlvbiwKICAgICcuZGlzdC1pbmZvJzogRGlzdEluZm9EaXN0cmlidXRpb24sCiAgICB9CgoKZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsICoqa3cpOgogICAgbGV2ZWwgPSAxCiAgICBnID0gZ2xvYmFscygpCiAgICB0cnk6CiAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZwogICAgICAgIHdoaWxlIHN5cy5fZ2V0ZnJhbWUobGV2ZWwpLmZfZ2xvYmFscyBpcyBnOgogICAgICAgICAgICBsZXZlbCArPSAxCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICB3YXJuaW5ncy53YXJuKHN0YWNrbGV2ZWw9bGV2ZWwgKyAxLCAqYXJncywgKiprdykKCgpjbGFzcyBSZXF1aXJlbWVudFBhcnNlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5hcmdzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoc3Rycyk6CiAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAoKICAgIGBzdHJzYCBtdXN0IGJlIGEgc3RyaW5nLCBvciBhIChwb3NzaWJseS1uZXN0ZWQpIGl0ZXJhYmxlIHRoZXJlb2YuCiAgICAiIiIKICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucwogICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICMgRHJvcCBjb21tZW50cyAtLSBhIGhhc2ggd2l0aG91dCBhIHNwYWNlIG1heSBiZSBpbiBhIFVSTC4KICAgICAgICBpZiAnICMnIGluIGxpbmU6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzpsaW5lLmZpbmQoJyAjJyldCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGxpbmUgY29udGludWF0aW9uLCBkcm9wIGl0LCBhbmQgYXBwZW5kIHRoZSBuZXh0IGxpbmUuCiAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXS5zdHJpcCgpCiAgICAgICAgICAgIGxpbmUgKz0gbmV4dChsaW5lcykKICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChsaW5lKQoKCmNsYXNzIFJlcXVpcmVtZW50KHBhY2thZ2luZy5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgIiIiRE8gTk9UIENBTEwgVEhJUyBVTkRPQ1VNRU5URUQgTUVUSE9EOyB1c2UgUmVxdWlyZW1lbnQucGFyc2UoKSEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cGVyKFJlcXVpcmVtZW50LCBzZWxmKS5fX2luaXRfXyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IHBhY2thZ2luZy5yZXF1aXJlbWVudHMuSW52YWxpZFJlcXVpcmVtZW50IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlcXVpcmVtZW50UGFyc2VFcnJvcihzdHIoZSkpCiAgICAgICAgc2VsZi51bnNhZmVfbmFtZSA9IHNlbGYubmFtZQogICAgICAgIHByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShzZWxmLm5hbWUpCiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHNlbGYuc3BlY3MgPSBbCiAgICAgICAgICAgIChzcGVjLm9wZXJhdG9yLCBzcGVjLnZlcnNpb24pIGZvciBzcGVjIGluIHNlbGYuc3BlY2lmaWVyXQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUobWFwKHNhZmVfZXh0cmEsIHNlbGYuZXh0cmFzKSkKICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBzZWxmLnNwZWNpZmllciwKICAgICAgICAgICAgZnJvemVuc2V0KHNlbGYuZXh0cmFzKSwKICAgICAgICAgICAgc3RyKHNlbGYubWFya2VyKSBpZiBzZWxmLm1hcmtlciBlbHNlIE5vbmUsCiAgICAgICAgKQogICAgICAgIHNlbGYuX19oYXNoID0gaGFzaChzZWxmLmhhc2hDbXApCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaXNpbnN0YW5jZShvdGhlciwgUmVxdWlyZW1lbnQpIGFuZAogICAgICAgICAgICBzZWxmLmhhc2hDbXAgPT0gb3RoZXIuaGFzaENtcAogICAgICAgICkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgaWYgaXRlbS5rZXkgIT0gc2VsZi5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnZlcnNpb24KCiAgICAgICAgIyBBbGxvdyBwcmVyZWxlYXNlcyBhbHdheXMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9mCiAgICAgICAgIyB0aGlzIG1ldGhvZC4gSW4gdGhlIGZ1dHVyZSB0aGlzIHNob3VsZCBiZSBzbWFydGVyIGFuZCBmb2xsb3cgUEVQIDQ0MAogICAgICAgICMgbW9yZSBhY2N1cmF0ZWx5LgogICAgICAgIHJldHVybiBzZWxmLnNwZWNpZmllci5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1UcnVlKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2gKCiAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwYXJzZShzKToKICAgICAgICByZXEsID0gcGFyc2VfcmVxdWlyZW1lbnRzKHMpCiAgICAgICAgcmV0dXJuIHJlcQoKCmRlZiBfZ2V0X21ybyhjbHMpOgogICAgIiIiR2V0IGFuIG1ybyBmb3IgYSB0eXBlIG9yIGNsYXNzaWMgY2xhc3MiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKGNscywgdHlwZSk6CgogICAgICAgIGNsYXNzIGNscyhjbHMsIG9iamVjdCk6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIGNscy5fX21yb19fWzE6XQogICAgcmV0dXJuIGNscy5fX21yb19fCgoKZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKICAgICIiIlJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIGBvYmAgZnJvbSBgcmVnaXN0cnlgIiIiCiAgICBmb3IgdCBpbiBfZ2V0X21ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKToKICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgogICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0KCgpkZWYgZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCgoKZGVmIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIlNhbmRib3gtYnlwYXNzaW5nIHZlcnNpb24gb2YgZW5zdXJlX2RpcmVjdG9yeSgpIiIiCiAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MubWtkaXIiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4nKQogICAgZGlybmFtZSwgZmlsZW5hbWUgPSBzcGxpdChwYXRoKQogICAgaWYgZGlybmFtZSBhbmQgZmlsZW5hbWUgYW5kIG5vdCBpc2RpcihkaXJuYW1lKToKICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkoZGlybmFtZSkKICAgICAgICBta2RpcihkaXJuYW1lLCAwbzc1NSkKCgpkZWYgc3BsaXRfc2VjdGlvbnMocyk6CiAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sIGNvbnRlbnQpIHBhaXJzCgogICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKICAgIGFuZCBlYWNoIGBgY29udGVudGBgIGlzIGEgbGlzdCBvZiBzdHJpcHBlZCBsaW5lcyBleGNsdWRpbmcgYmxhbmsgbGluZXMgYW5kCiAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCiAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KICAgICIiIgogICAgc2VjdGlvbiA9IE5vbmUKICAgIGNvbnRlbnQgPSBbXQogICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMocyk6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CiAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gb3IgY29udGVudDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250ZW50ID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQoKICAgICMgd3JhcCB1cCBsYXN0IHNlZ21lbnQKICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKCgpkZWYgX21rc3RlbXAoKmFyZ3MsICoqa3cpOgogICAgb2xkX29wZW4gPSBvcy5vcGVuCiAgICB0cnk6CiAgICAgICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZwogICAgICAgIG9zLm9wZW4gPSBvc19vcGVuCiAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rc3RlbXAoKmFyZ3MsICoqa3cpCiAgICBmaW5hbGx5OgogICAgICAgICMgYW5kIHRoZW4gcHV0IGl0IGJhY2sKICAgICAgICBvcy5vcGVuID0gb2xkX29wZW4KCgojIFNpbGVuY2UgdGhlIFBFUDQ0MFdhcm5pbmcgYnkgZGVmYXVsdCwgc28gdGhhdCBlbmQgdXNlcnMgZG9uJ3QgZ2V0IGhpdCBieSBpdAojIHJhbmRvbWx5IGp1c3QgYmVjYXVzZSB0aGV5IHVzZSBwa2dfcmVzb3VyY2VzLiBXZSB3YW50IHRvIGFwcGVuZCB0aGUgcnVsZQojIGJlY2F1c2Ugd2Ugd2FudCBlYXJsaWVyIHVzZXMgb2YgZmlsdGVyd2FybmluZ3MgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcwojIG9uZS4Kd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBFUDQ0MFdhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzIDEuMwpkZWYgX2NhbGxfYXNpZGUoZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIGYoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGYKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplKGc9Z2xvYmFscygpKToKICAgICJTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgKGRlbGliZXJhdGVseSBub3Qgc3RhdGUtc2F2ZWQpIgogICAgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCiAgICBnWydfbWFuYWdlciddID0gbWFuYWdlcgogICAgZm9yIG5hbWUgaW4gZGlyKG1hbmFnZXIpOgogICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgZ1tuYW1lXSA9IGdldGF0dHIobWFuYWdlciwgbmFtZSkKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplX21hc3Rlcl93b3JraW5nX3NldCgpOgogICAgIiIiCiAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAKICAgIEFQSSBhdmFpbGFibGUuCgogICAgVGhpcyBmdW5jdGlvbiBoYXMgZXhwbGljaXQgZWZmZWN0cyBvbiB0aGUgZ2xvYmFsIHN0YXRlCiAgICBvZiBwa2dfcmVzb3VyY2VzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIG9uY2UgYXQKICAgIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG1vZHVsZS4KCiAgICBJbnZvY2F0aW9uIGJ5IG90aGVyIHBhY2thZ2VzIGlzIHVuc3VwcG9ydGVkIGFuZCBkb25lCiAgICBhdCB0aGVpciBvd24gcmlzay4KICAgICIiIgogICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0Ll9idWlsZF9tYXN0ZXIoKQogICAgX2RlY2xhcmVfc3RhdGUoJ29iamVjdCcsIHdvcmtpbmdfc2V0PXdvcmtpbmdfc2V0KQoKICAgIHJlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCiAgICBpdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQogICAgcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgcnVuX21haW4gPSBydW5fc2NyaXB0CiAgICAjIEFjdGl2YXRlIGFsbCBkaXN0cmlidXRpb25zIGFscmVhZHkgb24gc3lzLnBhdGggd2l0aCByZXBsYWNlPUZhbHNlIGFuZAogICAgIyBlbnN1cmUgdGhhdCBhbGwgZGlzdHJpYnV0aW9ucyBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaW4gdGhlIGZ1dHVyZQogICAgIyAoZS5nLiBieSBjYWxsaW5nIGBgcmVxdWlyZSgpYGApIHdpbGwgZ2V0IGFjdGl2YXRlZCBhcyB3ZWxsLAogICAgIyB3aXRoIGhpZ2hlciBwcmlvcml0eSAocmVwbGFjZT1UcnVlKS4KICAgIGRpc3QgPSBOb25lICAjIGVuc3VyZSBkaXN0IGlzIGRlZmluZWQgZm9yIGRlbCBkaXN0IGJlbG93CiAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldDoKICAgICAgICBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9RmFsc2UpCiAgICBkZWwgZGlzdAogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUocmVwbGFjZT1UcnVlKSwgZXhpc3Rpbmc9RmFsc2UpCiAgICB3b3JraW5nX3NldC5lbnRyaWVzID0gW10KICAgICMgbWF0Y2ggb3JkZXIKICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSwgc3lzLnBhdGgpKQogICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQD6WnGMzwsAAM8LAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL19faW5pdF9fLnB5IyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCmZyb20gbWF0aCBpbXBvcnQgY2VpbApmcm9tIHN5cyBpbXBvcnQgc3RkZXJyCmZyb20gdGltZSBpbXBvcnQgdGltZQoKCl9fdmVyc2lvbl9fID0gJzEuMicKCgpjbGFzcyBJbmZpbml0ZShvYmplY3QpOgogICAgZmlsZSA9IHN0ZGVycgogICAgc21hX3dpbmRvdyA9IDEwCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5pbmRleCA9IDAKICAgICAgICBzZWxmLnN0YXJ0X3RzID0gdGltZSgpCiAgICAgICAgc2VsZi5fdHMgPSBzZWxmLnN0YXJ0X3RzCiAgICAgICAgc2VsZi5fZHQgPSBkZXF1ZShtYXhsZW49c2VsZi5zbWFfd2luZG93KQogICAgICAgIGZvciBrZXksIHZhbCBpbiBrd2FyZ3MuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZhbCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIGtleSwgTm9uZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhdmcoc2VsZik6CiAgICAgICAgcmV0dXJuIHN1bShzZWxmLl9kdCkgLyBsZW4oc2VsZi5fZHQpIGlmIHNlbGYuX2R0IGVsc2UgMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVsYXBzZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIGludCh0aW1lKCkgLSBzZWxmLnN0YXJ0X3RzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVsYXBzZWRfdGQoc2VsZik6CiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPXNlbGYuZWxhcHNlZCkKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBuZXh0KHNlbGYsIG49MSk6CiAgICAgICAgaWYgbiA+IDA6CiAgICAgICAgICAgIG5vdyA9IHRpbWUoKQogICAgICAgICAgICBkdCA9IChub3cgLSBzZWxmLl90cykgLyBuCiAgICAgICAgICAgIHNlbGYuX2R0LmFwcGVuZChkdCkKICAgICAgICAgICAgc2VsZi5fdHMgPSBub3cKCiAgICAgICAgc2VsZi5pbmRleCA9IHNlbGYuaW5kZXggKyBuCiAgICAgICAgc2VsZi51cGRhdGUoKQoKICAgIGRlZiBpdGVyKHNlbGYsIGl0KToKICAgICAgICBmb3IgeCBpbiBpdDoKICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICBzZWxmLm5leHQoKQogICAgICAgIHNlbGYuZmluaXNoKCkKCgpjbGFzcyBQcm9ncmVzcyhJbmZpbml0ZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihQcm9ncmVzcywgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYubWF4ID0ga3dhcmdzLmdldCgnbWF4JywgMTAwKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV0YShzZWxmKToKICAgICAgICByZXR1cm4gaW50KGNlaWwoc2VsZi5hdmcgKiBzZWxmLnJlbWFpbmluZykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXRhX3RkKHNlbGYpOgogICAgICAgIHJldHVybiB0aW1lZGVsdGEoc2Vjb25kcz1zZWxmLmV0YSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwZXJjZW50KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnByb2dyZXNzICogMTAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJvZ3Jlc3Moc2VsZik6CiAgICAgICAgcmV0dXJuIG1pbigxLCBzZWxmLmluZGV4IC8gc2VsZi5tYXgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVtYWluaW5nKHNlbGYpOgogICAgICAgIHJldHVybiBtYXgoc2VsZi5tYXggLSBzZWxmLmluZGV4LCAwKQoKICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICBzZWxmLnVwZGF0ZSgpCgogICAgZGVmIGdvdG8oc2VsZiwgaW5kZXgpOgogICAgICAgIGluY3IgPSBpbmRleCAtIHNlbGYuaW5kZXgKICAgICAgICBzZWxmLm5leHQoaW5jcikKCiAgICBkZWYgaXRlcihzZWxmLCBpdCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1heCA9IGxlbihpdCkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGZvciB4IGluIGl0OgogICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgIHNlbGYubmV4dCgpCiAgICAgICAgc2VsZi5maW5pc2goKQpQSwMEFAAAAAAAAAAhAA/DRgN9CgAAfQoAACsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvYmFyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgUHJvZ3Jlc3MKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVsbk1peGluCgoKY2xhc3MgQmFyKFdyaXRlbG5NaXhpbiwgUHJvZ3Jlc3MpOgogICAgd2lkdGggPSAzMgogICAgbWVzc2FnZSA9ICcnCiAgICBzdWZmaXggPSAnJShpbmRleClkLyUobWF4KWQnCiAgICBiYXJfcHJlZml4ID0gJyB8JwogICAgYmFyX3N1ZmZpeCA9ICd8ICcKICAgIGVtcHR5X2ZpbGwgPSAnICcKICAgIGZpbGwgPSAnIycKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgZmlsbGVkX2xlbmd0aCA9IGludChzZWxmLndpZHRoICogc2VsZi5wcm9ncmVzcykKICAgICAgICBlbXB0eV9sZW5ndGggPSBzZWxmLndpZHRoIC0gZmlsbGVkX2xlbmd0aAoKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIGJhciA9IHNlbGYuZmlsbCAqIGZpbGxlZF9sZW5ndGgKICAgICAgICBlbXB0eSA9IHNlbGYuZW1wdHlfZmlsbCAqIGVtcHR5X2xlbmd0aAogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFttZXNzYWdlLCBzZWxmLmJhcl9wcmVmaXgsIGJhciwgZW1wdHksIHNlbGYuYmFyX3N1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4XSkKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgpjbGFzcyBDaGFyZ2luZ0JhcihCYXIpOgogICAgc3VmZml4ID0gJyUocGVyY2VudClkJSUnCiAgICBiYXJfcHJlZml4ID0gJyAnCiAgICBiYXJfc3VmZml4ID0gJyAnCiAgICBlbXB0eV9maWxsID0gdSfiiJknCiAgICBmaWxsID0gdSfilognCgoKY2xhc3MgRmlsbGluZ1NxdWFyZXNCYXIoQ2hhcmdpbmdCYXIpOgogICAgZW1wdHlfZmlsbCA9IHUn4paiJwogICAgZmlsbCA9IHUn4pajJwoKCmNsYXNzIEZpbGxpbmdDaXJjbGVzQmFyKENoYXJnaW5nQmFyKToKICAgIGVtcHR5X2ZpbGwgPSB1J+KXrycKICAgIGZpbGwgPSB1J+KXiScKCgpjbGFzcyBJbmNyZW1lbnRhbEJhcihCYXIpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paPJywgdSfilo4nLCB1J+KWjScsIHUn4paMJywgdSfilosnLCB1J+KWiicsIHUn4paJJywgdSfilognKQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgbnBoYXNlcyA9IGxlbihzZWxmLnBoYXNlcykKICAgICAgICBleHBhbmRlZF9sZW5ndGggPSBpbnQobnBoYXNlcyAqIHNlbGYud2lkdGggKiBzZWxmLnByb2dyZXNzKQogICAgICAgIGZpbGxlZF9sZW5ndGggPSBpbnQoc2VsZi53aWR0aCAqIHNlbGYucHJvZ3Jlc3MpCiAgICAgICAgZW1wdHlfbGVuZ3RoID0gc2VsZi53aWR0aCAtIGZpbGxlZF9sZW5ndGgKICAgICAgICBwaGFzZSA9IGV4cGFuZGVkX2xlbmd0aCAtIChmaWxsZWRfbGVuZ3RoICogbnBoYXNlcykKCiAgICAgICAgbWVzc2FnZSA9IHNlbGYubWVzc2FnZSAlIHNlbGYKICAgICAgICBiYXIgPSBzZWxmLnBoYXNlc1stMV0gKiBmaWxsZWRfbGVuZ3RoCiAgICAgICAgY3VycmVudCA9IHNlbGYucGhhc2VzW3BoYXNlXSBpZiBwaGFzZSA+IDAgZWxzZSAnJwogICAgICAgIGVtcHR5ID0gc2VsZi5lbXB0eV9maWxsICogbWF4KDAsIGVtcHR5X2xlbmd0aCAtIGxlbihjdXJyZW50KSkKICAgICAgICBzdWZmaXggPSBzZWxmLnN1ZmZpeCAlIHNlbGYKICAgICAgICBsaW5lID0gJycuam9pbihbbWVzc2FnZSwgc2VsZi5iYXJfcHJlZml4LCBiYXIsIGN1cnJlbnQsIGVtcHR5LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJhcl9zdWZmaXgsIHN1ZmZpeF0pCiAgICAgICAgc2VsZi53cml0ZWxuKGxpbmUpCgoKY2xhc3MgU2hhZHlCYXIoSW5jcmVtZW50YWxCYXIpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paRJywgdSfilpInLCB1J+KWkycsIHUn4paIJykKUEsDBBQAAAAAAAAAIQAqf/Ew3gUAAN4FAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBJbmZpbml0ZSwgUHJvZ3Jlc3MKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVNaXhpbgoKCmNsYXNzIENvdW50ZXIoV3JpdGVNaXhpbiwgSW5maW5pdGUpOgogICAgbWVzc2FnZSA9ICcnCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGUoc3RyKHNlbGYuaW5kZXgpKQoKCmNsYXNzIENvdW50ZG93bihXcml0ZU1peGluLCBQcm9ncmVzcyk6CiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGUoc3RyKHNlbGYucmVtYWluaW5nKSkKCgpjbGFzcyBTdGFjayhXcml0ZU1peGluLCBQcm9ncmVzcyk6CiAgICBwaGFzZXMgPSAodScgJywgdSfiloEnLCB1J+KWgicsIHUn4paDJywgdSfiloQnLCB1J+KWhScsIHUn4paGJywgdSfilocnLCB1J+KWiCcpCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIG5waGFzZXMgPSBsZW4oc2VsZi5waGFzZXMpCiAgICAgICAgaSA9IG1pbihucGhhc2VzIC0gMSwgaW50KHNlbGYucHJvZ3Jlc3MgKiBucGhhc2VzKSkKICAgICAgICBzZWxmLndyaXRlKHNlbGYucGhhc2VzW2ldKQoKCmNsYXNzIFBpZShTdGFjayk6CiAgICBwaGFzZXMgPSAodSfil4snLCB1J+KXlCcsIHUn4peRJywgdSfil5UnLCB1J+KXjycpClBLAwQUAAAAAAAAACEAzuwPTiYLAAAmCwAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9oZWxwZXJzLnB5IyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKCkhJREVfQ1VSU09SID0gJ1x4MWJbPzI1bCcKU0hPV19DVVJTT1IgPSAnXHgxYls/MjVoJwoKCmNsYXNzIFdyaXRlTWl4aW4ob2JqZWN0KToKICAgIGhpZGVfY3Vyc29yID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoV3JpdGVNaXhpbiwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5fd2lkdGggPSAwCiAgICAgICAgaWYgbWVzc2FnZToKICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQoKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIGlmIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgICAgICBwcmludChISURFX0NVUlNPUiwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgcHJpbnQoc2VsZi5tZXNzYWdlLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2goKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIGIgPSAnXGInICogc2VsZi5fd2lkdGgKICAgICAgICAgICAgYyA9IHMubGp1c3Qoc2VsZi5fd2lkdGgpCiAgICAgICAgICAgIHByaW50KGIgKyBjLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBzZWxmLl93aWR0aCA9IG1heChzZWxmLl93aWR0aCwgbGVuKHMpKQogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2goKQoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpIGFuZCBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICBwcmludChTSE9XX0NVUlNPUiwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCgpjbGFzcyBXcml0ZWxuTWl4aW4ob2JqZWN0KToKICAgIGhpZGVfY3Vyc29yID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoV3JpdGVsbk1peGluLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKSBhbmQgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgcHJpbnQoSElERV9DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgogICAgZGVmIGNsZWFybG4oc2VsZik6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBwcmludCgnXHJceDFiW0snLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKICAgIGRlZiB3cml0ZWxuKHNlbGYsIGxpbmUpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgc2VsZi5jbGVhcmxuKCkKICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoKCkKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgcHJpbnQoZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIGlmIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgICAgICBwcmludChTSE9XX0NVUlNPUiwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCgpmcm9tIHNpZ25hbCBpbXBvcnQgc2lnbmFsLCBTSUdJTlQKZnJvbSBzeXMgaW1wb3J0IGV4aXQKCgpjbGFzcyBTaWdJbnRNaXhpbihvYmplY3QpOgogICAgIiIiUmVnaXN0ZXJzIGEgc2lnbmFsIGhhbmRsZXIgdGhhdCBjYWxscyBmaW5pc2ggb24gU0lHSU5UIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoU2lnSW50TWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzaWduYWwoU0lHSU5ULCBzZWxmLl9zaWdpbnRfaGFuZGxlcikKCiAgICBkZWYgX3NpZ2ludF9oYW5kbGVyKHNlbGYsIHNpZ251bSwgZnJhbWUpOgogICAgICAgIHNlbGYuZmluaXNoKCkKICAgICAgICBleGl0KDApClBLAwQUAAAAAAAAACEAdwhSeyIFAAAiBQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9zcGlubmVyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgSW5maW5pdGUKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVNaXhpbgoKCmNsYXNzIFNwaW5uZXIoV3JpdGVNaXhpbiwgSW5maW5pdGUpOgogICAgbWVzc2FnZSA9ICcnCiAgICBwaGFzZXMgPSAoJy0nLCAnXFwnLCAnfCcsICcvJykKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgaSA9IHNlbGYuaW5kZXggJSBsZW4oc2VsZi5waGFzZXMpCiAgICAgICAgc2VsZi53cml0ZShzZWxmLnBoYXNlc1tpXSkKCgpjbGFzcyBQaWVTcGlubmVyKFNwaW5uZXIpOgogICAgcGhhc2VzID0gW3Un4pe3JywgdSfil7YnLCB1J+KXtScsIHUn4pe0J10KCgpjbGFzcyBNb29uU3Bpbm5lcihTcGlubmVyKToKICAgIHBoYXNlcyA9IFt1J+KXkScsIHUn4peSJywgdSfil5AnLCB1J+KXkyddCgoKY2xhc3MgTGluZVNwaW5uZXIoU3Bpbm5lcik6CiAgICBwaGFzZXMgPSBbdSfijronLCB1J+KOuycsIHUn4o68JywgdSfijr0nLCB1J+KOvCcsIHUn4o67J10KUEsDBBQAAAAAAAAAIQDBIHSOq2sDAKtrAwAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQojCiMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgIFBhdWwgVC4gTWNHdWlyZQojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgojCgpfX2RvY19fID0gXAoiIiIKcHlwYXJzaW5nIG1vZHVsZSAtIENsYXNzZXMgYW5kIG1ldGhvZHMgdG8gZGVmaW5lIGFuZCBleGVjdXRlIHBhcnNpbmcgZ3JhbW1hcnMKClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLAp2cy4gdGhlIHRyYWRpdGlvbmFsIGxleC95YWNjIGFwcHJvYWNoLCBvciB0aGUgdXNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXaXRoIHB5cGFyc2luZywgeW91CmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4KCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIApDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyAKKEx7JysnPFBhcnNlckVsZW1lbnQuX19hZGRfXz59IG9wZXJhdG9yIGdpdmVzIEx7QW5kfSBleHByZXNzaW9ucywgc3RyaW5ncyBhcmUgYXV0by1jb252ZXJ0ZWQgdG8KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6OgoKICAgIGZyb20gcHlwYXJzaW5nIGltcG9ydCBXb3JkLCBhbHBoYXMKCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcKICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiCgogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISIKICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQoKVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoKCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10KClRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYXIgaXMgcXVpdGUgcmVhZGFibGUsIG93aW5nIHRvIHRoZSBzZWxmLWV4cGxhbmF0b3J5CmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4KClRoZSBMe1BhcnNlUmVzdWx0c30gb2JqZWN0IHJldHVybmVkIGZyb20gTHtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBjYW4gYmUgYWNjZXNzZWQgYXMgYSBuZXN0ZWQgbGlzdCwgYSBkaWN0aW9uYXJ5LCBvciBhbgpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLgoKVGhlIHB5cGFyc2luZyBtb2R1bGUgaGFuZGxlcyBzb21lIG9mIHRoZSBwcm9ibGVtcyB0aGF0IGFyZSB0eXBpY2FsbHkgdmV4aW5nIHdoZW4gd3JpdGluZyB0ZXh0IHBhcnNlcnM6CiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pCiAtIHF1b3RlZCBzdHJpbmdzCiAtIGVtYmVkZGVkIGNvbW1lbnRzCiIiIgoKX192ZXJzaW9uX18gPSAiMi4xLjEwIgpfX3ZlcnNpb25UaW1lX18gPSAiMDcgT2N0IDIwMTYgMDE6MzEgVVRDIgpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIKCmltcG9ydCBzdHJpbmcKZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYKaW1wb3J0IGNvcHkKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHJlCmltcG9ydCBzcmVfY29uc3RhbnRzCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcHByaW50CmltcG9ydCB0cmFjZWJhY2sKaW1wb3J0IHR5cGVzCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgp0cnk6CiAgICBmcm9tIF90aHJlYWQgaW1wb3J0IFJMb2NrCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jawoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lCgojfiBzeXMuc3RkZXJyLndyaXRlKCAidGVzdGluZyBweXBhcnNpbmcgbW9kdWxlLCB2ZXJzaW9uICVzLCAlc1xuIiAlIChfX3ZlcnNpb25fXyxfX3ZlcnNpb25UaW1lX18gKSApCgpfX2FsbF9fID0gWwonQW5kJywgJ0Nhc2VsZXNzS2V5d29yZCcsICdDYXNlbGVzc0xpdGVyYWwnLCAnQ2hhcnNOb3RJbicsICdDb21iaW5lJywgJ0RpY3QnLCAnRWFjaCcsICdFbXB0eScsCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLAonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLAonUGFyc2VCYXNlRXhjZXB0aW9uJywgJ1BhcnNlRWxlbWVudEVuaGFuY2UnLCAnUGFyc2VFeGNlcHRpb24nLCAnUGFyc2VFeHByZXNzaW9uJywgJ1BhcnNlRmF0YWxFeGNlcHRpb24nLAonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLAonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIAonV2hpdGUnLCAnV29yZCcsICdXb3JkRW5kJywgJ1dvcmRTdGFydCcsICdaZXJvT3JNb3JlJywKJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywKJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywKJ2RibFNsYXNoQ29tbWVudCcsICdkZWxpbWl0ZWRMaXN0JywgJ2RpY3RPZicsICdkb3duY2FzZVRva2VucycsICdlbXB0eScsICdoZXhudW1zJywKJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLAonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywKJ25lc3RlZEV4cHInLCAnbnVsbERlYnVnQWN0aW9uJywgJ251bXMnLCAnb25lT2YnLCAnb3BBc3NvYycsICdvcGVyYXRvclByZWNlZGVuY2UnLCAncHJpbnRhYmxlcycsCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIAoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsCidzdHJpbmdTdGFydCcsICd0cmFjZVBhcnNlQWN0aW9uJywgJ3VuaWNvZGVTdHJpbmcnLCAndXBjYXNlVG9rZW5zJywgJ3dpdGhBdHRyaWJ1dGUnLAonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywKJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsCl0KCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdClBZXzMgPSBzeXN0ZW1fdmVyc2lvblswXSA9PSAzCmlmIFBZXzM6CiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplCiAgICBiYXNlc3RyaW5nID0gc3RyCiAgICB1bmljaHIgPSBjaHIKICAgIF91c3RyID0gc3RyCgogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucwogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0KCmVsc2U6CiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQKICAgIHJhbmdlID0geHJhbmdlCgogICAgZGVmIF91c3RyKG9iaik6CiAgICAgICAgIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3Igc3RyKG9iaikgdGhhdCB0cmllcyB0byBiZSBVbmljb2RlIGZyaWVuZGx5LiBJdCBmaXJzdCB0cmllcwogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdAogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+LgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOgogICAgICAgICAgICByZXR1cm4gb2JqCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28KICAgICAgICAgICAgIyBpdCB3b24ndCBicmVhayBhbnkgZXhpc3RpbmcgY29kZS4KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopCgogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQKICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpCiAgICAgICAgICAgIHhtbGNoYXJyZWYgPSBSZWdleCgnJiNcZCs7JykKICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpCgogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMKICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10KICAgIGltcG9ydCBfX2J1aWx0aW5fXwogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaW5nbGVBcmdCdWlsdGlucy5hcHBlbmQoZ2V0YXR0cihfX2J1aWx0aW5fXyxmbmFtZSkpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAKX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkKIApkZWYgX3htbF9lc2NhcGUoZGF0YSk6CiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIgoKICAgICMgYW1wZXJzYW5kIG11c3QgYmUgcmVwbGFjZWQgZmlyc3QKICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkKICAgIGZvciBmcm9tXyx0b18gaW4gemlwKGZyb21fc3ltYm9scywgdG9fc3ltYm9scyk6CiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQogICAgcmV0dXJuIGRhdGEKCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToKICAgIHBhc3MKCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiCmhleG51bXMgICAgPSBudW1zICsgIkFCQ0RFRmFiY2RlZiIKYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMKX2JzbGFzaCAgICA9IGNocig5MikKcHJpbnRhYmxlcyA9ICIiLmpvaW4oYyBmb3IgYyBpbiBzdHJpbmcucHJpbnRhYmxlIGlmIGMgbm90IGluIHN0cmluZy53aGl0ZXNwYWNlKQoKY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiJiYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIHBhcnNpbmcgcnVudGltZSBleGNlcHRpb25zIiIiCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcwogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwc3RyLCBsb2M9MCwgbXNnPU5vbmUsIGVsZW09Tm9uZSApOgogICAgICAgIHNlbGYubG9jID0gbG9jCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubXNnID0gcHN0cgogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubXNnID0gbXNnCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHIKICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtCiAgICAgICAgc2VsZi5hcmdzID0gKHBzdHIsIGxvYywgbXNnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9mcm9tX2V4Y2VwdGlvbihjbHMsIHBlKToKICAgICAgICAiIiIKICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiAKICAgICAgICBmcm9tIGFub3RoZXIgLSBhdm9pZHMgaGF2aW5nIF9faW5pdF9fIHNpZ25hdHVyZSBjb25mbGljdHMgYW1vbmcgc3ViY2xhc3NlcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpCgogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOgogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOgogICAgICAgICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAiIiIKICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToKICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxpZiggYW5hbWUgaW4gKCJjb2wiLCAiY29sdW1uIikgKToKICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6CiAgICAgICAgICAgIHJldHVybiBsaW5lKCBzZWxmLmxvYywgc2VsZi5wc3RyICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcCiAgICAgICAgICAgICAgICAoIHNlbGYubXNnLCBzZWxmLmxvYywgc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uICkKICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQogICAgZGVmIG1hcmtJbnB1dGxpbmUoIHNlbGYsIG1hcmtlclN0cmluZyA9ICI+ITwiICk6CiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLgogICAgICAgICIiIgogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDEKICAgICAgICBpZiBtYXJrZXJTdHJpbmc6CiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQogICAgICAgIHJldHVybiBsaW5lX3N0ci5zdHJpcCgpCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQoKY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToKICAgICIiIgogICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHBhcnNlIGV4cHJlc3Npb25zIGRvbid0IG1hdGNoIGNsYXNzOwogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6CiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgIHByaW50KHBlKQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpCiAgICAgICAgICAgIAogICAgcHJpbnRzOjoKICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgIGNvbHVtbjogMQogICAgIiIiCiAgICBwYXNzCgpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQKICAgICAgIGlzIGZvdW5kOyBzdG9wcyBhbGwgcGFyc2luZyBpbW1lZGlhdGVseSIiIgogICAgcGFzcwoKY2xhc3MgUGFyc2VTeW50YXhFeGNlcHRpb24oUGFyc2VGYXRhbEV4Y2VwdGlvbik6CiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIAogICAgICAgaW1tZWRpYXRlbHkgYmVjYXVzZSBhbiB1bmJhY2t0cmFja2FibGUgc3ludGF4IGVycm9yIGhhcyBiZWVuIGZvdW5kIiIiCiAgICBwYXNzCgojfiBjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoKICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBpbnB1dCBzdHJpbmcsIGFuZC9vcgogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUKICAgICAgICN+IGV4Y2VwdGlvbiBpbiBhIHBhcnNlIGFjdGlvbiB0byBjYXVzZSBweXBhcnNpbmcgdG8gdXNlIHRoZSBuZXcgc3RyaW5nL2xvY2F0aW9uLgogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLgogICAgICAgI34gIiIiCiAgICAjfiBkZWYgX19pbml0Xyggc2VsZiwgbmV3c3RyaW5nLCByZXN0YXJ0TG9jICk6CiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcKICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jCgpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UKCmNsYXNzIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6CiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpKToKICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gcmVwcihzZWxmLnR1cFswXSkKICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToKICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQoKY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6CiAgICAiIiIKICAgIFN0cnVjdHVyZWQgcGFyc2UgcmVzdWx0cywgdG8gcHJvdmlkZSBtdWx0aXBsZSBtZWFucyBvZiBhY2Nlc3MgdG8gdGhlIHBhcnNlZCBkYXRhOgogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkKICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikKICAgICAgIC0gYnkgYXR0cmlidXRlIChDe3Jlc3VsdHMuPHJlc3VsdHNOYW1lPn0gLSBzZWUgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOgogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdAogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikKCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6CiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQogICAgICAgIHRlc3QoImxpc3QocmVzdWx0KSIpCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikKICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQogICAgICAgIHRlc3QoInJlc3VsdC5kYXkiKQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikKICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikKICAgICAgICB0ZXN0KCJyZXN1bHQuZHVtcCgpIiwgc3RyKQogICAgcHJpbnRzOjoKICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCiAgICAgICAgcmVzdWx0WzBdIC0+ICcxOTk5JwogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnCiAgICAgICAgJ21vbnRoJyBpbiByZXN1bHQgLT4gVHJ1ZQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UKICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQogICAgICAgIC0gZGF5OiAzMQogICAgICAgIC0gbW9udGg6IDEyCiAgICAgICAgLSB5ZWFyOiAxOTk5CiAgICAiIiIKICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOgogICAgICAgICAgICByZXR1cm4gdG9rbGlzdAogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykKICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlCiAgICAgICAgcmV0dXJuIHJldG9iagoKICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6CiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoKICAgICAgICAgICAgc2VsZi5fX2RvaW5pdCA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9CiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QKICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwKICAgICAgICAgICAgaWYgdG9rbGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6CiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHRva2xpc3RbOl0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToKICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkKCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToKICAgICAgICAgICAgaWYgbm90IG1vZGFsOgogICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXNbbmFtZV0gPSAwCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOgogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgICAgICB0b2tsaXN0ID0gWyB0b2tsaXN0IF0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva2xpc3QuY29weSgpLDApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQogICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0uX19uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0WzBdCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0CgogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0W2ldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbaV1bLTFdWzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQoKICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToKICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW3ZdCiAgICAgICAgICAgIHN1YiA9IHZbMF0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6CiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0W2tdID0gdgogICAgICAgICAgICBzdWIgPSB2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW19QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHYsMCldCiAgICAgICAgICAgIHN1YiA9IHYKICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICBzdWIuX19wYXJlbnQgPSB3a3JlZihzZWxmKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaSwoaW50LHNsaWNlKSk6CiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQoKICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6CiAgICAgICAgICAgICAgICBpZiBpIDwgMDoKICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQogICAgICAgICAgICAjIGdldCByZW1vdmVkIGluZGljZXMKICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQogICAgICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoKICAgICAgICAgICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToKICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2RpY3RbaV0KCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6CiAgICAgICAgcmV0dXJuIGsgaW4gc2VsZi5fX3Rva2RpY3QKCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApCiAgICBkZWYgX19ib29sX18oc2VsZik6IHJldHVybiAoIG5vdCBub3Qgc2VsZi5fX3Rva2xpc3QgKQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApCiAgICBkZWYgX19yZXZlcnNlZF9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdFs6Oi0xXSApCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdC5pdGVya2V5cygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpCgogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpCiAgICAgICAgICAgIAogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToKICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQoKICAgIGlmIFBZXzM6CiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICAKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMy54IG9ubHkpLiIiIgoKICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICBlbHNlOgogICAgICAgIGl0ZXJrZXlzID0gX2l0ZXJrZXlzCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGl0ZXJ2YWx1ZXMgPSBfaXRlcnZhbHVlcwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGl0ZXJpdGVtcyA9IF9pdGVyaXRlbXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiIKCiAgICAgICAgZGVmIGtleXMoIHNlbGYgKToKICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiIKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQoKICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiIKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpCiAgICAgICAgICAgICAgICAKICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToKICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZXMgKGFzIGEgbGlzdCBvZiB0dXBsZXMgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCgogICAgZGVmIGhhc2tleXMoIHNlbGYgKToKICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcKICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiIKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fdG9rZGljdCkKICAgICAgICAKICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vCiAgICAgICAgYXJndW1lbnQgb3IgYW4gaW50ZWdlciBhcmd1bWVudCwgaXQgd2lsbCB1c2UgQ3tsaXN0fSBzZW1hbnRpY3MKICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIAogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0KICAgICAgICBzZW1hbnRpY3MgYW5kIHBvcCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGFueSBkZWZpbmVkIAogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIAogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgwKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddCgogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkKICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpCgogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QKICAgICAgICAgICAgIyByZW1vdmVkIGZyb20gbGlzdCBmb3JtIG9mIHJlc3VsdHMpCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMKICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQogICAgICAgICAgICAtIExBQkVMOiBBQUIKCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBhcmdzID0gWy0xXQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGsgPT0gJ2RlZmF1bHQnOgogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwb3AoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgaykKICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIAogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciAKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSBpbiBzZWxmKToKICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdCiAgICAgICAgICAgIGRlbCBzZWxmW2luZGV4XQogICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVmYXVsdHZhbHVlID0gYXJnc1sxXQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlCgogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHRWYWx1ZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubwogICAgICAgIHN1Y2ggbmFtZSwgdGhlbiByZXR1cm5zIHRoZSBnaXZlbiBDe2RlZmF1bHRWYWx1ZX0gb3IgQ3tOb25lfSBpZiBubwogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuCgogICAgICAgIFNpbWlsYXIgdG8gQ3tkaWN0LmdldCgpfS4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJwogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIikpICMgLT4gTm9uZQogICAgICAgICIiIgogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQoKICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToKICAgICAgICAiIiIKICAgICAgICBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuCiAgICAgICAgCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCgogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMKICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMuaW5zZXJ0KDAsIGxvY24pCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9fdG9rbGlzdC5pbnNlcnQoaW5kZXgsIGluc1N0cikKICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOgogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpCgogICAgZGVmIGFwcGVuZCggc2VsZiwgaXRlbSApOgogICAgICAgICIiIgogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQKICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoc3VtKG1hcChpbnQsIHRva2VucykpKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQogICAgICAgICIiIgogICAgICAgIHNlbGYuX190b2tsaXN0LmFwcGVuZChpdGVtKQoKICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToKICAgICAgICAiIiIKICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBhcHBlbmQgdGhlIHJldmVyc2Ugb2YgdGhlIG1hdGNoZWQgc3RyaW5ncywgdG8gbWFrZSBhIHBhbGluZHJvbWUKICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkKICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHRva2VucykKICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtc2VxLCBQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdC5leHRlbmQoaXRlbXNlcSkKCiAgICBkZWYgY2xlYXIoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0WzpdCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQoKICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgbmFtZSApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICAKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX190b2tkaWN0OgogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6CiAgICAgICAgcmV0ID0gc2VsZi5jb3B5KCkKICAgICAgICByZXQgKz0gb3RoZXIKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoKICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX190b2tsaXN0KQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0CiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQogICAgICAgICAgICBvdGhlcmRpY3RpdGVtcyA9IFsoaywgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodlswXSxhZGRvZmZzZXQodlsxXSkpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6CiAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpCiAgICAgICAgICAgIAogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdAogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpIGFuZCBvdGhlciA9PSAwOgogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdAogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmCiAgICAgICAgCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nCgogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOgogICAgICAgIG91dCA9IFtdCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fX3Rva2xpc3Q6CiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoIGl0ZW0sIFBhcnNlUmVzdWx0cyApOgogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBfdXN0cihpdGVtKSApCiAgICAgICAgcmV0dXJuIG91dAoKICAgIGRlZiBhc0xpc3QoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKICAgICAgICAgICAgcmVzdWx0ID0gcGF0dC5wYXJzZVN0cmluZygic2xka2ogbHNka2ogc2xka2oiKQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cwogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10KICAgICAgICAgICAgCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdAogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9saXN0KSwgcmVzdWx0X2xpc3QpICMgLT4gPGNsYXNzICdsaXN0Jz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQoKICAgIGRlZiBhc0RpY3QoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBuYW1lZCBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGRpY3Rpb25hcnkuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdF9kaWN0ID0gcmVzdWx0LmFzRGljdCgpCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQoKICAgICAgICAgICAgIyBldmVuIHRob3VnaCBhIFBhcnNlUmVzdWx0cyBzdXBwb3J0cyBkaWN0LWxpa2UgYWNjZXNzLCBzb21ldGltZSB5b3UganVzdCBuZWVkIHRvIGhhdmUgYSBkaWN0CiAgICAgICAgICAgIGltcG9ydCBqc29uCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdC5hc0RpY3QoKSkpICMgLT4geyJtb250aCI6ICIzMSIsICJkYXkiOiAiMTk5OSIsICJ5ZWFyIjogIjEyIn0KICAgICAgICAiIiIKICAgICAgICBpZiBQWV8zOgogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVtcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcwogICAgICAgICAgICAKICAgICAgICBkZWYgdG9JdGVtKG9iaik6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgaWYgb2JqLmhhc2tleXMoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9JdGVtKHYpIGZvciB2IGluIG9ial0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBvYmoKICAgICAgICAgICAgICAgIAogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpCgogICAgZGVmIGNvcHkoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkKICAgICAgICByZXQuX19wYXJlbnQgPSBzZWxmLl9fcGFyZW50CiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkKICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToKICAgICAgICAiIiIKICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4KICAgICAgICAiIiIKICAgICAgICBubCA9ICJcbiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiB2bGlzdCkKICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiCgogICAgICAgICMgY29sbGFwc2Ugb3V0IGluZGVudHMgaWYgZm9ybWF0dGluZyBpcyBub3QgZGVzaXJlZAogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6CiAgICAgICAgICAgIGluZGVudCA9ICIiCiAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCA9ICIiCiAgICAgICAgICAgIG5sID0gIiIKCiAgICAgICAgc2VsZlRhZyA9IE5vbmUKICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToKICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQoKICAgICAgICBpZiBub3Qgc2VsZlRhZzoKICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6CiAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSIKCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQoKICAgICAgICBmb3IgaSxyZXMgaW4gZW51bWVyYXRlKHNlbGYuX190b2tsaXN0KToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwobmFtZWRJdGVtc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQKICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoKICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5OgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9ICJJVEVNIgogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQm9keVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0KCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwvIiwgc2VsZlRhZywgIj4iIF0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpCgogICAgZGVmIF9fbG9va3VwKHNlbGYsc3ViKToKICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6CiAgICAgICAgICAgICAgICBpZiBzdWIgaXMgdjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gawogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdldE5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0cyBuYW1lIGZvciB0aGlzIHRva2VuIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHNldmVyYWwgCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpCiAgICAgICAgICAgIGhvdXNlX251bWJlcl9leHByID0gU3VwcHJlc3MoJyMnKSArIFdvcmQobnVtcywgYWxwaGFudW1zKQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSAKICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoaW50ZWdlcikoImFnZSIpKQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9pbmZvLnBhcnNlU3RyaW5nKCIyMiAxMTEtMjItMzMzMyAjMjIxQiIpCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgYWdlIDogMjIKICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMKICAgICAgICAgICAgaG91c2VfbnVtYmVyIDogMjIxQgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX19uYW1lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6CiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQogICAgICAgICAgICBpZiBwYXI6CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZAogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kCiAgICAgICAgICAgICAgIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC52YWx1ZXMoKSkpWzBdWzFdIGluICgwLC0xKSk6CiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9LgogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkCiAgICAgICAgaW4gYSBuZXN0ZWQgZGlzcGxheSBvZiBvdGhlciBkYXRhLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10KICAgICAgICAgICAgLSBkYXk6IDE5OTkKICAgICAgICAgICAgLSBtb250aDogMzEKICAgICAgICAgICAgLSB5ZWFyOiAxMgogICAgICAgICIiIgogICAgICAgIG91dCA9IFtdCiAgICAgICAgTkwgPSAnXG4nCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkKICAgICAgICBpZiBmdWxsOgogICAgICAgICAgICBpZiBzZWxmLmhhc2tleXMoKToKICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlcHIodikpCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6CiAgICAgICAgICAgICAgICB2ID0gc2VsZgogICAgICAgICAgICAgICAgZm9yIGksdnYgaW4gZW51bWVyYXRlKHYpOgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQogICAgICAgICAgICAKICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpCgogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLgogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgCiAgICAgICAgQ3twcHJpbnQucHByaW50fSBtZXRob2QuIChVe2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3BwcmludC5odG1sI3BwcmludC5wcHJpbnR9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkKICAgICAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtIHwgR3JvdXAoJygnICsgZnVuYyArICcpJykKICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkKICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpCiAgICAgICAgICAgIHJlc3VsdC5wcHJpbnQod2lkdGg9NDApCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWydmbmEnLAogICAgICAgICAgICAgWydhJywKICAgICAgICAgICAgICAnYicsCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLAogICAgICAgICAgICAgICcxMDAnXV0KICAgICAgICAiIiIKICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykKCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICggc2VsZi5fX3Rva2xpc3QsCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwKICAgICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLAogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLHN0YXRlKToKICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdCiAgICAgICAgKHNlbGYuX190b2tkaWN0LAogICAgICAgICBwYXIsCiAgICAgICAgIGluQWNjdW1OYW1lcywKICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9CiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykKICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSB3a3JlZihwYXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUKCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkKCmNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykKCmRlZiBjb2wgKGxvYyxzdHJnKToKICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuCgogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcKICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuCiAgICIiIgogICAgcyA9IHN0cmcKICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQoKZGVmIGxpbmVubyhsb2Msc3RyZyk6CiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuCiAgIFRoZSBmaXJzdCBsaW5lIGlzIG51bWJlciAxLgoKICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLgogICAiIiIKICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQoKZGVmIGxpbmUoIGxvYywgc3RyZyApOgogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICAgICAgIiIiCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykKICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpCiAgICBpZiBuZXh0Q1IgPj0gMDoKICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOl0KCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToKICAgIHByaW50ICgoIk1hdGNoICIgKyBfdXN0cihleHByKSArICIgYXQgbG9jICIgKyBfdXN0cihsb2MpICsgIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkpCgpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6CiAgICBwcmludCAoIk1hdGNoZWQgIiArIF91c3RyKGV4cHIpICsgIiAtPiAiICsgc3RyKHRva3MuYXNMaXN0KCkpKQoKZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOgogICAgcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIgKyBfdXN0cihleGMpKQoKZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6CiAgICAiIiInRG8tbm90aGluZycgZGVidWcgYWN0aW9uLCB0byBzdXBwcmVzcyBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBwYXJzaW5nLiIiIgogICAgcGFzcwoKIyBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLnggLSBub25sb2NhbCBpcyB0b3hpYyB0byBQeXRob24gMiBpbnN0YWxscwojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOgogICAgI34gaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoKICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpCiAgICAjfiBsaW1pdCA9IDAKICAgICN+IGZvdW5kQXJpdHkgPSBGYWxzZQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOgogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkKICAgICAgICAjfiB3aGlsZSAxOgogICAgICAgICAgICAjfiB0cnk6CiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pCiAgICAgICAgICAgICAgICAjfiBmb3VuZEFyaXR5ID0gVHJ1ZQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldAogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgI34gaWYgbGltaXQgPT0gbWF4YXJncyBvciBmb3VuZEFyaXR5OgogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxCiAgICAgICAgICAgICAgICAjfiBjb250aW51ZQogICAgI34gcmV0dXJuIHdyYXBwZXIKCiMgdGhpcyB2ZXJzaW9uIGlzIFB5dGhvbiAyLngtMy54IGNyb3NzLWNvbXBhdGlibGUKJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0JwpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToKICAgIGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6CiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQogICAgbGltaXQgPSBbMF0KICAgIGZvdW5kQXJpdHkgPSBbRmFsc2VdCiAgICAKICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzCiAgICBpZiBzeXN0ZW1fdmVyc2lvbls6Ml0gPj0gKDMsNSk6CiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6CiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDEKICAgICAgICAgICAgb2Zmc2V0ID0gLTMgaWYgc3lzdGVtX3ZlcnNpb24gPT0gKDMsNSwwKSBlbHNlIC0yCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQogICAgICAgIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD0wKToKICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQogICAgICAgICAgICByZXR1cm4gWyhmcmFtZV9zdW1tYXJ5LmZpbGVuYW1lLCBmcmFtZV9zdW1tYXJ5LmxpbmVubyldCiAgICBlbHNlOgogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjawogICAgICAgIGV4dHJhY3RfdGIgPSB0cmFjZWJhY2suZXh0cmFjdF90YgogICAgCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byAKICAgICMgdXNlcidzIHBhcnNlIGFjdGlvbiAnZnVuYycsIHNvIHRoYXQgd2UgZG9uJ3QgaW5jdXIgY2FsbCBwZW5hbHR5IGF0IHBhcnNlIHRpbWUKICAgIAogICAgTElORV9ESUZGID0gNgogICAgIyBJRiBBTlkgQ09ERSBDSEFOR0VTLCBFVkVOIEpVU1QgQ09NTUVOVFMgT1IgQkxBTksgTElORVMsIEJFVFdFRU4gVEhFIE5FWFQgTElORSBBTkQgCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0KICAgIHBhX2NhbGxfbGluZV9zeW50aCA9ICh0aGlzX2xpbmVbMF0sIHRoaXNfbGluZVsxXStMSU5FX0RJRkYpCgogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOgogICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkKICAgICAgICAgICAgICAgIGZvdW5kQXJpdHlbMF0gPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAjIHJlLXJhaXNlIFR5cGVFcnJvcnMgaWYgdGhleSBkaWQgbm90IGNvbWUgZnJvbSBvdXIgYXJpdHkgdGVzdGluZwogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRyYWN0X3RiKHRiLCBsaW1pdD0yKVstMV1bOjJdID09IHBhX2NhbGxfbGluZV9zeW50aDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHRiCgogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoKICAgICAgICAgICAgICAgICAgICBsaW1pdFswXSArPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQKICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiIKICAgIHRyeToKICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQoKICAgIHJldHVybiB3cmFwcGVyCgpjbGFzcyBQYXJzZXJFbGVtZW50KG9iamVjdCk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIgogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIgogICAgdmVyYm9zZV9zdGFja3RyYWNlID0gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycyggY2hhcnMgKToKICAgICAgICByIiIiCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUKICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJ2prbCddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5zZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCIgXHQiKQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddCiAgICAgICAgIiIiCiAgICAgICAgUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTID0gY2hhcnMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgaW5saW5lTGl0ZXJhbHNVc2luZyhjbHMpOgogICAgICAgICIiIgogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbAogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgCgogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQoKCiAgICAgICAgICAgICMgY2hhbmdlIHRvIFN1cHByZXNzCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IGNscwoKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdCgpCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUwogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZSAjIHVzZWQgd2hlbiBjaGVja2luZyBmb3IgbGVmdC1yZWN1cnNpb24KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UKICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpCiAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleAogICAgICAgIHNlbGYuZXJybXNnID0gIiIKICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMKICAgICAgICBzZWxmLnJlID0gTm9uZQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UKCiAgICBkZWYgY29weSggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSBjb3B5IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fS4gIFVzZWZ1bCBmb3IgZGVmaW5pbmcgZGlmZmVyZW50IHBhcnNlIGFjdGlvbnMKICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06OgogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQogICAgICAgICIiIgogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApCiAgICAgICAgY3B5LnBhcnNlQWN0aW9uID0gc2VsZi5wYXJzZUFjdGlvbls6XQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoKICAgICAgICAgICAgY3B5LndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICByZXR1cm4gY3B5CgogICAgZGVmIHNldE5hbWUoIHNlbGYsIG5hbWUgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOgogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuCiAgICAgICAgTk9URTogdGhpcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBvcmlnaW5hbCBDe1BhcnNlckVsZW1lbnR9IG9iamVjdDsKICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbgogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLgoKICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwKICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gCiAgICAgICAgc2VlIEx7SXtfX2NhbGxfX308X19jYWxsX18+fS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQoKICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06CiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCiAgICAgICAgIiIiCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTFdCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUKICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQogICAgICAgIG5ld3NlbGYubW9kYWxSZXN1bHRzID0gbm90IGxpc3RBbGxNYXRjaGVzCiAgICAgICAgcmV0dXJuIG5ld3NlbGYKCiAgICBkZWYgc2V0QnJlYWsoc2VsZixicmVha0ZsYWcgPSBUcnVlKToKICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bwogICAgICAgICAgIGRpc2FibGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgYnJlYWtGbGFnOgogICAgICAgICAgICBfcGFyc2VNZXRob2QgPSBzZWxmLl9wYXJzZQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOgogICAgICAgICAgICAgICAgaW1wb3J0IHBkYgogICAgICAgICAgICAgICAgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QKICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBicmVha2VyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToKICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2UuX29yaWdpbmFsUGFyc2VNZXRob2QKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLgogICAgICAgIFBhcnNlIGFjdGlvbiBmbiBpcyBhIGNhbGxhYmxlIG1ldGhvZCB3aXRoIDAtMyBhcmd1bWVudHMsIGNhbGxlZCBhcyBDe2ZuKHMsbG9jLHRva3MpfSwKICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOgogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykKICAgICAgICAgLSBsb2MgPSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdGNoaW5nIHN1YnN0cmluZwogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QKICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybgogICAgICAgIHZhbHVlIGZyb20gZm4sIGFuZCB0aGUgbW9kaWZpZWQgbGlzdCBvZiB0b2tlbnMgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbC4KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4KCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6CiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcKCiAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICAgICAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCgogICAgICAgICAgICAjIHVzZSBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0byBpbnRzIGF0IHBhcnNlIHRpbWUKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOgogICAgICAgICIiIgogICAgICAgIEFkZCBwYXJzZSBhY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4KICAgICAgICAKICAgICAgICBTZWUgZXhhbXBsZXMgaW4gTHtJe2NvcHl9PGNvcHk+fS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgYWRkQ29uZGl0aW9uKHNlbGYsICpmbnMsICoqa3dhcmdzKToKICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgCiAgICAgICAgZnVuY3Rpb25zIHBhc3NlZCB0byBDe2FkZENvbmRpdGlvbn0gbmVlZCB0byByZXR1cm4gYm9vbGVhbiBzdWNjZXNzL2ZhaWwgb2YgdGhlIGNvbmRpdGlvbi4KCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6CiAgICAgICAgIC0gbWVzc2FnZSA9IGRlZmluZSBhIGN1c3RvbSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIHJhaXNlZCBleGNlcHRpb24KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24KICAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkKICAgICAgICAgICAgeWVhcl9pbnQuYWRkQ29uZGl0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdID49IDIwMDAsIG1lc3NhZ2U9Ik9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciIpCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcgoKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBFeGNlcHRpb246IE9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgIiIiCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpCiAgICAgICAgZXhjX3R5cGUgPSBQYXJzZUZhdGFsRXhjZXB0aW9uIGlmIGt3YXJncy5nZXQoImZhdGFsIiwgRmFsc2UpIGVsc2UgUGFyc2VFeGNlcHRpb24KICAgICAgICBmb3IgZm4gaW4gZm5zOgogICAgICAgICAgICBkZWYgcGEocyxsLHQpOgogICAgICAgICAgICAgICAgaWYgbm90IGJvb2woX3RyaW1fYXJpdHkoZm4pKHMsbCx0KSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykKICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRGYWlsQWN0aW9uKCBzZWxmLCBmbiApOgogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzCiAgICAgICAgICAgQ3tmbihzLGxvYyxleHByLGVycil9IHdoZXJlOgogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQKICAgICAgICAgICAgLSBleHByID0gdGhlIHBhcnNlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQKICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bgogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0KICAgICAgICAgICBpZiBpdCBpcyBkZXNpcmVkIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseS4iIiIKICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlCiAgICAgICAgd2hpbGUgZXhwcnNGb3VuZDoKICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQoKICAgICAgICBpZiBzZWxmLnNraXBXaGl0ZXNwYWNlOgogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycwogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gd3Q6CiAgICAgICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldHVybiB0b2tlbmxpc3QKCiAgICAjfiBAcHJvZmlsZQogICAgZGVmIF9wYXJzZU5vQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOgogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkKCiAgICAgICAgaWYgZGVidWdnaW5nIG9yIHNlbGYuZmFpbEFjdGlvbjoKICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkKICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1swXSggaW5zdHJpbmcsIGxvYywgc2VsZiApCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgI34gcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIsIGVycikKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxBY3Rpb246CiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApCiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYwogICAgICAgICAgICBpZiBzZWxmLm1heUluZGV4RXJyb3Igb3IgbG9jID49IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCgogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQoKICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToKICAgICAgICAgICAgaWYgZGVidWdnaW5nOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApCgogICAgICAgIGlmIGRlYnVnZ2luZzoKICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaGVkIixzZWxmLCItPiIscmV0VG9rZW5zLmFzTGlzdCgpKQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkKCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zCgogICAgZGVmIHRyeVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdCiAgICAgICAgZXhjZXB0IFBhcnNlRmF0YWxFeGNlcHRpb246CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgIAogICAgZGVmIGNhblBhcnNlTmV4dChzZWxmLCBpbnN0cmluZywgbG9jKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIGNhY2hlID0ge30KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQoKICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkKCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUKCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpCiAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToKICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpCgogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpCgogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9waXRlbShGYWxzZSkKCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQoKICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpCgogICAgZWxzZToKICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9CiAgICAgICAgICAgICAgICBrZXlfZmlmbyA9IGNvbGxlY3Rpb25zLmRlcXVlKFtdLCBzaXplKQoKICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQoKICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uYXBwZW5kKGtleSkKCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkKCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMKICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwKICAgIHBhY2tyYXRfY2FjaGVfbG9jayA9IFJMb2NrKCkKICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0KCiAgICAjIHRoaXMgbWV0aG9kIGdldHMgcmVwZWF0ZWRseSBjYWxsZWQgZHVyaW5nIGJhY2t0cmFja2luZyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyAtCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOgogICAgICAgIEhJVCwgTUlTUyA9IDAsIDEKICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoKICAgICAgICAgICAgY2FjaGUgPSBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUKICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbTUlTU10gKz0gMQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sKICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDEKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEV4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUKICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkKCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHJlc2V0Q2FjaGUoKToKICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1s6XSA9IFswXSAqIGxlbihQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHMpCgogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToKICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4KICAgICAgICAgICBSZXBlYXRlZCBwYXJzZSBhdHRlbXB0cyBhdCB0aGUgc2FtZSBzdHJpbmcgbG9jYXRpb24gKHdoaWNoIGhhcHBlbnMKICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZgogICAgICAgICAgIGJvdGggdmFsaWQgcmVzdWx0cyBhbmQgcGFyc2luZyBleGNlcHRpb25zLgogICAgICAgICAgIAogICAgICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgICAgIC0gY2FjaGVfc2l6ZV9saW1pdCAtIChkZWZhdWx0PUN7MTI4fSkgLSBpZiBhbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsCiAgICAgICAgICAgICAgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQuCiAgICAgICAgICAgIAogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0CiAgICAgICAgICAgaGF2ZSBzaWRlLWVmZmVjdHMuICBGb3IgdGhpcyByZWFzb24sIHBhY2tyYXQgcGFyc2luZyBpcyBkaXNhYmxlZCB3aGVuCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmCiAgICAgICAgICAgeW91ciBwcm9ncmFtIHVzZXMgQ3twc3ljb30gdG8gImNvbXBpbGUgYXMgeW91IGdvIiwgeW91IG11c3QgY2FsbAogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLAogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkKICAgICAgICAgICBhZnRlciBpbXBvcnRpbmcgcHlwYXJzaW5nLgogICAgICAgICAgIAogICAgICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAgICBpbXBvcnQgcHlwYXJzaW5nCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZDoKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX1VuYm91bmRlZENhY2hlKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYXJzZSA9IFBhcnNlckVsZW1lbnQuX3BhcnNlQ2FjaGUKCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUKICAgICAgICBleHByZXNzaW9uIGhhcyBiZWVuIGJ1aWx0LgoKICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUKICAgICAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGVuIHNldCBDe3BhcnNlQWxsfSB0byBUcnVlIChlcXVpdmFsZW50IHRvIGVuZGluZwogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLgoKICAgICAgICBOb3RlOiBDe3BhcnNlU3RyaW5nfSBpbXBsaWNpdGx5IGNhbGxzIEN7ZXhwYW5kdGFicygpfSBvbiB0aGUgaW5wdXQgc3RyaW5nLAogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kCiAgICAgICAgdGhlIGdyYW1tYXIgdXNlcyBwYXJzZSBhY3Rpb25zIHRoYXQgdXNlIHRoZSBDe2xvY30gYXJndW1lbnQgdG8gaW5kZXggaW50byB0aGUKICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQKICAgICAgICBzdHJpbmcgYnk6CiAgICAgICAgIC0gY2FsbGluZyBDe3BhcnNlV2l0aFRhYnN9IG9uIHlvdXIgZ3JhbW1hciBiZWZvcmUgY2FsbGluZyBDe3BhcnNlU3RyaW5nfQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkKICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kCiAgICAgICAgICAgcmVmZXJlbmNlIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHBhcnNlIGFjdGlvbidzIEN7c30gYXJndW1lbnQKICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnLCBwYXJzZUFsbD1UcnVlKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGVuZCBvZiB0ZXh0CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkKICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6CiAgICAgICAgICAgIGluc3RyaW5nID0gaW5zdHJpbmcuZXhwYW5kdGFicygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApCiAgICAgICAgICAgIGlmIHBhcnNlQWxsOgogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQogICAgICAgICAgICAgICAgc2UuX3BhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbnMKCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBTY2FuIHRoZSBpbnB1dCBzdHJpbmcgZm9yIGV4cHJlc3Npb24gbWF0Y2hlcy4gIEVhY2ggbWF0Y2ggd2lsbCByZXR1cm4gdGhlCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbAogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYKICAgICAgICBDe292ZXJsYXB9IGlzIHNwZWNpZmllZCwgdGhlbiBvdmVybGFwcGluZyBtYXRjaGVzIHdpbGwgYmUgcmVwb3J0ZWQuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcKICAgICAgICBiZWluZyBwYXJzZWQuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhcnNpbmcKICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkKICAgICAgICAgICAgZm9yIHRva2VucyxzdGFydCxlbmQgaW4gV29yZChhbHBoYXMpLnNjYW5TdHJpbmcoc291cmNlKToKICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkKICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkKICAgICAgICAKICAgICAgICBwcmludHM6OgogICAgICAgIAogICAgICAgICAgICBzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODcKICAgICAgICAgICAgXl5eXl4KICAgICAgICAgICAgc2xkamYKICAgICAgICAgICAgICAgICAgICBeXl5eXl5eCiAgICAgICAgICAgICAgICAgICAgbHNkamprZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xka2pmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkKICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQoKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoKICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgbG9jID0gMAogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkKICAgICAgICBtYXRjaGVzID0gMAogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgbG9jIDw9IGluc3RybGVuIGFuZCBtYXRjaGVzIDwgbWF4TWF0Y2hlczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgICAgICBuZXh0TG9jLHRva2VucyA9IHBhcnNlRm4oIGluc3RyaW5nLCBwcmVsb2MsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VucywgcHJlbG9jLCBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0bG9jID4gbG9jOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgZGVmIHRyYW5zZm9ybVN0cmluZyggc2VsZiwgaW5zdHJpbmcgKToKICAgICAgICAiIiIKICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkKICAgICAgICBiZSByZXR1cm5lZCBmcm9tIGEgcGFyc2UgYWN0aW9uLiAgVG8gdXNlIEN7dHJhbnNmb3JtU3RyaW5nfSwgZGVmaW5lIGEgZ3JhbW1hciBhbmQKICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsCiAgICAgICAgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgdGV4dCBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gdGhlIGxvZ2ljIGluIHRoZSBwYXJzZQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpCiAgICAgICAgUHJpbnRzOjoKICAgICAgICAgICAgTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yay4KICAgICAgICAiIiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIGxhc3RFID0gMAogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcKICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIGluc3RyaW5nW2xhc3RFOnNdICkKICAgICAgICAgICAgICAgIGlmIHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0LmFzTGlzdCgpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0CiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQogICAgICAgICAgICAgICAgbGFzdEUgPSBlCiAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdHJpbmdbbGFzdEU6XSkKICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6CiAgICAgICAgIiIiCiAgICAgICAgQW5vdGhlciBleHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgc2ltcGxpZnlpbmcgdGhlIGFjY2VzcyB0byB0aGUgdG9rZW5zIGZvdW5kCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwKICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycwogICAgICAgICAgICBjYXBfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJ10KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBzcGxpdChzZWxmLCBpbnN0cmluZywgbWF4c3BsaXQ9X01BWF9JTlQsIGluY2x1ZGVTZXBhcmF0b3JzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLgogICAgICAgIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbCBDe21heHNwbGl0fSBhcmd1bWVudCwgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHM7CiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICAKICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpCiAgICAgICAgICAgIHByaW50KGxpc3QocHVuYy5zcGxpdCgiVGhpcywgdGhpcz8sIHRoaXMgc2VudGVuY2UsIGlzIGJhZGx5IHB1bmN0dWF0ZWQhIikpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10KICAgICAgICAiIiIKICAgICAgICBzcGxpdHMgPSAwCiAgICAgICAgbGFzdCA9IDAKICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKGluc3RyaW5nLCBtYXhNYXRjaGVzPW1heHNwbGl0KToKICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoKICAgICAgICAgICAgICAgIHlpZWxkIHRbMF0KICAgICAgICAgICAgbGFzdCA9IGUKICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0KCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtBbmR9fS4gQWRkaW5nIHN0cmluZ3MgdG8gYSBQYXJzZXJFbGVtZW50CiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0LgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIgogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIgogICAgICAgICAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkKICAgICAgICBQcmludHM6OgogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYKCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBBbmQuX0Vycm9yU3RvcCgpLCBvdGhlciBdICkKCiAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmCgogICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZgogICAgICAgIEN7ZXhwciArIGV4cHIgKyBleHByfS4gIEV4cHJlc3Npb25zIG1heSBhbHNvIG1lIG11bHRpcGxpZWQgYnkgYSAyLWludGVnZXIKICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcwogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoKICAgICAgICAgLSBDe2V4cHIqKG4sTm9uZSl9IG9yIEN7ZXhwcioobiwpfSBpcyBlcXVpdmFsZW50CiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikKICAgICAgICAgLSBDe2V4cHIqKE5vbmUsbil9IGlzIGVxdWl2YWxlbnQgdG8gQ3tleHByKigwLG4pfQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9CiAgICAgICAgIC0gQ3tleHByKigxLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtPbmVPck1vcmV9KGV4cHIpfQoKICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYKICAgICAgICBtb3JlIHRoYW4gbiBleHBycyBleGlzdCBpbiB0aGUgaW5wdXQgc3RyZWFtOyB0aGF0IGlzLAogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHIKICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQogICAgICAgIEN7ZXhwciooTm9uZSxuKSArIH5leHByfQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToKICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIsMAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6CiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0KICAgICAgICAgICAgaWYgb3RoZXJbMF0gaXMgTm9uZToKICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbmVPck1vcmUoc2VsZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBpc2luc3RhbmNlKG90aGVyWzFdLGludCk6CiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcgogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgJyVzJyBvYmplY3RzIiwgdHlwZShvdGhlcikpCgogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgbmVnYXRpdmUgdmFsdWUiKQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpCiAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gb3B0RWxlbWVudHMgPT0gMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpCgogICAgICAgIGlmIChvcHRFbGVtZW50cyk6CiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOgogICAgICAgICAgICAgICAgaWYgbj4xOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChuLTEpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikKICAgICAgICAgICAgaWYgbWluRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOgogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXQgPSBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6CiAgICAgICAgICAgICAgICByZXQgPSBzZWxmCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9fbXVsX18ob3RoZXIpCgogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciB8IHNlbGYKCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE9yKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciBeIHNlbGYKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gRWFjaCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgJiBzZWxmCgogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gTm90QW55KCBzZWxmICkKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uCiAgICAgICAgCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBnaXZlbiB3aXRoIGEgdHJhaWxpbmcgQ3snKid9IGNoYXJhY3RlciwgdGhlbiBDe2xpc3RBbGxNYXRjaGVzfSB3aWxsIGJlCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uCiAgICAgICAgICAgCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBvbWl0dGVkLCBzYW1lIGFzIGNhbGxpbmcgQ3tMe2NvcHl9fS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgdGhlc2UgYXJlIGVxdWl2YWxlbnQKICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICAKICAgICAgICAiIiIKICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQoKICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20KICAgICAgICBjbHV0dGVyaW5nIHVwIHJldHVybmVkIG91dHB1dC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBEaXNhYmxlcyB0aGUgc2tpcHBpbmcgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkKICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMKICAgICAgICAiIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IGNoYXJzCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciB0byBleHBhbmQgQ3s8VEFCPn1zIHRvIHNwYWNlcyBiZWZvcmUgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLgogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQKICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLgogICAgICAgICIiIgogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBleHByZXNzaW9uIHRvIGJlIGlnbm9yZWQgKGUuZy4sIGNvbW1lbnRzKSB3aGlsZSBkb2luZyBwYXR0ZXJuCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXIKICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJ10KICAgICAgICAgICAgCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonLCAnbHNramQnXQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBvdGhlciA9IFN1cHByZXNzKG90aGVyKQoKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToKICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZCggU3VwcHJlc3MoIG90aGVyLmNvcHkoKSApICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXREZWJ1Z0FjdGlvbnMoIHNlbGYsIHN0YXJ0QWN0aW9uLCBzdWNjZXNzQWN0aW9uLCBleGNlcHRpb25BY3Rpb24gKToKICAgICAgICAiIiIKICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25BY3Rpb24gb3IgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbikKICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToKICAgICAgICAiIiIKICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQogICAgICAgICAgICB0ZXJtID0gd2QgfCBpbnRlZ2VyCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZAogICAgICAgICAgICB3ZC5zZXREZWJ1ZygpCgogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpCiAgICAgICAgCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkKICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWydhYmMnXQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgNygxLDgpCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxMiksIChsaW5lOjEsIGNvbDoxMykKICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikKCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUKICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nCiAgICAgICAgdG8gbWF0Y2ggdGhlIEN7d2R9IGV4cHJlc3Npb24sIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBDeyJNYXRjaCA8ZXhwcm5hbWU+IGF0IGxvYyA8bj4oPGxpbmU+LDxjb2w+KSJ9CiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sCiAgICAgICAgd2hpY2ggbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLSBmb3IgaW5zdGFuY2UsIHRoZSBkZWZhdWx0CiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgZmxhZzoKICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHBhc3MKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQoKICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwKICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgb3BlbmVkLCByZWFkLCBhbmQgY2xvc2VkIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGZpbGVfb3JfZmlsZW5hbWUucmVhZCgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyIG9yIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcgoKICAgIGRlZiBfX25lX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpCgogICAgZGVmIF9fcmVxX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19ybmVfXyhzZWxmLG90aGVyKToKICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQoKICAgIGRlZiBtYXRjaGVzKHNlbGYsIHRlc3RTdHJpbmcsIHBhcnNlQWxsPVRydWUpOgogICAgICAgICIiIgogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSAKICAgICAgICBpbmxpbmUgbWljcm90ZXN0cyBvZiBzdWIgZXhwcmVzc2lvbnMgd2hpbGUgYnVpbGRpbmcgdXAgbGFyZ2VyIHBhcnNlci4KICAgICAgICAgICAKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAtIHRlc3RTdHJpbmcgLSB0byB0ZXN0IGFnYWluc3QgdGhpcyBleHByZXNzaW9uIGZvciBhIG1hdGNoCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMKICAgICAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIAogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiBhIHNlcmllcyBvZiB0ZXN0IHN0cmluZ3MsIHNob3dpbmcgZWFjaAogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLgogICAgICAgICAgIAogICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMgICAgICAgICAgIAogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCAKICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nCiAgICAgICAgIC0gZnVsbER1bXAgLSAoZGVmYXVsdD1De1RydWV9KSAtIGR1bXAgcmVzdWx0cyBhcyBsaXN0IGZvbGxvd2VkIGJ5IHJlc3VsdHMgbmFtZXMgaW4gbmVzdGVkIG91dGxpbmU7CiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdAogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQKICAgICAgICAgLSBmYWlsdXJlVGVzdHMgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGVzIGlmIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHBhcnNpbmcKCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZAogICAgICAgIChvciBmYWlsZWQgaWYgQ3tmYWlsdXJlVGVzdHN9IGlzIFRydWUpLCBhbmQgdGhlIHJlc3VsdHMgY29udGFpbiBhIGxpc3Qgb2YgbGluZXMgb2YgZWFjaCAKICAgICAgICB0ZXN0J3Mgb3V0cHV0CiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpCgogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycKICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcgogICAgICAgICAgICAgICAgMTAwCiAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXIKICAgICAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAgICAgJycnKQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQoKICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3RlcgogICAgICAgICAgICAgICAgMTAwWgogICAgICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJwogICAgICAgICAgICAgICAgLS4xMDAKICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nCiAgICAgICAgICAgICAgICAzLjE0LjE1OQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkKICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikKICAgICAgICBwcmludHM6OgogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXIKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIFsxMDBdCgogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXIKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICBbLTEwMF0KCiAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgIDYuMDJlMjMKICAgICAgICAgICAgWzYuMDJlKzIzXQoKICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICBbMWUtMTJdCgogICAgICAgICAgICBTdWNjZXNzCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3RlcgogICAgICAgICAgICAxMDBaCiAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQoKICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJwogICAgICAgICAgICAtLjEwMAogICAgICAgICAgICBeCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIHtyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24gfCByZWFsIG51bWJlciB8IHNpZ25lZCBpbnRlZ2VyfSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCgogICAgICAgICAgICAjIHRvbyBtYW55ICcuJwogICAgICAgICAgICAzLjE0LjE1OQogICAgICAgICAgICAgICAgXgogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpCgogICAgICAgICAgICBTdWNjZXNzCgogICAgICAgIEVhY2ggdGVzdCBzdHJpbmcgbXVzdCBiZSBvbiBhIHNpbmdsZSBsaW5lLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGEgc3RyaW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUKICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6OgoKICAgICAgICAgICAgZXhwci5ydW5UZXN0KHIidGhpcyBpcyBhIHRlc3RcXG4gb2Ygc3RyaW5ncyB0aGF0IHNwYW5zIFxcbiAzIGxpbmVzIikKICAgICAgICAKICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tZW50LCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkKICAgICAgICBhbGxSZXN1bHRzID0gW10KICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgc3VjY2VzcyA9IFRydWUKICAgICAgICBmb3IgdCBpbiB0ZXN0czoKICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC5tYXRjaGVzKHQsIEZhbHNlKSBvciBjb21tZW50cyBhbmQgbm90IHQ6CiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCB0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdCiAgICAgICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJzZVN0cmluZyh0LCBwYXJzZUFsbD1wYXJzZUFsbCkKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cwogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIgogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0OgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQobGluZShwZS5sb2MsIHQpKQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKnBlLmxvYyArICdeJyArIGZhdGFsKQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzCiAgICAgICAgICAgICAgICByZXN1bHQgPSBwZQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMKCiAgICAgICAgICAgIGlmIHByaW50UmVzdWx0czoKICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpCiAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4ob3V0KSkKCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQogICAgICAgIAogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzCgogICAgICAgIApjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToKICAgICIiIgogICAgQWJzdHJhY3QgQ3tQYXJzZXJFbGVtZW50fSBzdWJjbGFzcywgZm9yIGRlZmluaW5nIGF0b21pYyBtYXRjaGluZyBwYXR0ZXJucy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoVG9rZW4sc2VsZikuX19pbml0X18oIHNhdmVsaXN0PUZhbHNlICkKCgpjbGFzcyBFbXB0eShUb2tlbik6CiAgICAiIiIKICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubmFtZSA9ICJFbXB0eSIKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgoKY2xhc3MgTm9NYXRjaChUb2tlbik6CiAgICAiIiIKICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCIKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCgpjbGFzcyBMaXRlcmFsKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuCiAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGEnKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICJibGFoIgogICAgCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4KICAgIAogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLAogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6CiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkKICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90KgogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsCiAgICAjIHNob3J0LWNpcmN1aXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgYW5kIGF2b2lkIGNhbGxpbmcgc3RhcnRzd2l0aAogICAgI34gQHByb2ZpbGUKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQKICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQpfTCA9IExpdGVyYWwKUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbAoKY2xhc3MgS2V5d29yZChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEga2V5d29yZCwgdGhhdCBpcywgaXQgbXVzdCBiZQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToKICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uCiAgICAgLSBDe0tleXdvcmQoImlmIil9IHdpbGwgbm90OyBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZiB4PTEnfSwgb3IgQ3snaWYoeT09MiknfQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoKICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywKICAgICAgICAgIGRlZmF1bHRpbmcgdG8gYWxsIGFscGhhbnVtZXJpY3MgKyAiXyIgYW5kICIkIgogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uCiAgICAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24KCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4KICAgICIiIgogICAgREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gYWxwaGFudW1zKyJfJCIKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6CiAgICAgICAgc3VwZXIoS2V5d29yZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOgogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMKICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcKICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzCiAgICAgICAgaWYgY2FzZWxlc3M6CiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkKICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQogICAgICAgIHNlbGYuaWRlbnRDaGFycyA9IHNldChpZGVudENoYXJzKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5jYXNlbGVzczoKICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQKICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQKICAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToKICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kCiAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkKICAgICAgICBjLmlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUwogICAgICAgIHJldHVybiBjCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6CiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMKICAgICAgICAiIiIKICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzCgpjbGFzcyBDYXNlbGVzc0xpdGVyYWwoTGl0ZXJhbCk6CiAgICAiIiIKICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLgogICAgTm90ZTogdGhlIG1hdGNoZWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgY2FzZSBvZiB0aGUgZ2l2ZW4KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0LgoKICAgIEV4YW1wbGU6OgogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddCiAgICAgICAgCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzS2V5d29yZH0uKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6CiAgICAgICAgc3VwZXIoQ2FzZWxlc3NMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZy51cHBlcigpICkKICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLgogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcKICAgICAgICBzZWxmLm5hbWUgPSAiJyVzJyIgJSBzZWxmLnJldHVyblN0cmluZwogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToKICAgICIiIgogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9LgoKICAgIEV4YW1wbGU6OgogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10KICAgICAgICAKICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NMaXRlcmFsfS4pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOgogICAgICAgIHN1cGVyKENhc2VsZXNzS2V5d29yZCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnMsIGNhc2VsZXNzPVRydWUgKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQKICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6CiAgICAiIiIKICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIAogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoKICAgICAtIEN7bWF0Y2hfc3RyaW5nfSAtIHN0cmluZyB0byBiZSBtYXRjaGVkCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gKICAgIAogICAgVGhlIHJlc3VsdHMgZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugd2lsbCBjb250YWluIHRoZSBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9sbG93aW5nIG5hbWVkIHJlc3VsdHM6CiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZwogICAgCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4KICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICdBVENBVENHQUFUR0dBJyAod2l0aCB1cCB0byAxIG1pc21hdGNoZXMpIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKCiAgICAgICAgIyBleGFjdCBtYXRjaAogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVRHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVRHR0EnXSwgeydtaXNtYXRjaGVzJzogW1tdXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQoKICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcwogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIiwgbWF4TWlzbWF0Y2hlcz0yKQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hdGNoX3N0cmluZywgbWF4TWlzbWF0Y2hlcz0xKToKICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcKICAgICAgICBzZWxmLm1hdGNoX3N0cmluZyA9IG1hdGNoX3N0cmluZwogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBtYXhsb2MgPSBzdGFydCArIGxlbihzZWxmLm1hdGNoX3N0cmluZykKCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOgogICAgICAgICAgICBtYXRjaF9zdHJpbmcgPSBzZWxmLm1hdGNoX3N0cmluZwogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQogICAgICAgICAgICBtYXhNaXNtYXRjaGVzID0gc2VsZi5tYXhNaXNtYXRjaGVzCgogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOgogICAgICAgICAgICAgICAgc3JjLG1hdCA9IHNfbQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1pc21hdGNoZXMpID4gbWF4TWlzbWF0Y2hlczoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvYyA9IG1hdGNoX3N0cmluZ2xvYyArIDEKICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nCiAgICAgICAgICAgICAgICByZXN1bHRzWydtaXNtYXRjaGVzJ10gPSBtaXNtYXRjaGVzCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzCgogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKCmNsYXNzIFdvcmQoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgYWxsb3dlZCBpbml0aWFsIGNoYXJhY3RlcnMsCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwKICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwKICAgIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGEKICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsCiAgICBDe2V4Y2x1ZGVDaGFyc30gcGFyYW1ldGVyIGNhbiBsaXN0IGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBmb3VuZCBpbiAKICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcwogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4KICAgIAogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4KICAgIAogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiAKICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUKICAgIEl7c2V0c30gb2YgbWF0Y2hhYmxlIGNoYXJhY3RlcnMuIFRoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCAiQWRkIiwgIkFBQSIsCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9LgoKICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6CiAgICAgLSBMe2FscGhhc30KICAgICAtIEx7bnVtc30KICAgICAtIEx7YWxwaGFudW1zfQogICAgIC0gTHtoZXhudW1zfQogICAgIC0gTHthbHBoYXM4Yml0fSAoYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBhY2NlbnRlZCwgdGlsZGVkLCB1bWxhdXRlZCwgZXRjLikKICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQoKICAgIEV4YW1wbGU6OgogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cwogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpICMgZXF1aXZhbGVudCB0byBXb3JkKCIwMTIzNDU2Nzg5Iikgb3IgV29yZChzcmFuZ2UoIjAtOSIpKQogICAgICAgIAogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlCiAgICAgICAgY2FwaXRhbF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpCgogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJwogICAgICAgIGhvc3RuYW1lID0gV29yZChhbHBoYXMsIGFscGhhbnVtcysnLScpCiAgICAgICAgCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpCiAgICAgICAgcm9tYW4gPSBXb3JkKCJJVlhMQ0RNIikKICAgICAgICAKICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcKICAgICAgICBjc3ZfdmFsdWUgPSBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0iLCIpCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6CiAgICAgICAgc3VwZXIoV29yZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOgogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykKICAgICAgICAgICAgaWYgYm9keUNoYXJzOgogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzCiAgICAgICAgc2VsZi5pbml0Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQogICAgICAgIGlmIGJvZHlDaGFycyA6CiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycwogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChib2R5Q2hhcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGluaXRDaGFycykKCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwCgogICAgICAgIGlmIG1pbiA8IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuYXNLZXl3b3JkID0gYXNLZXl3b3JkCgogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6CiAgICAgICAgICAgIGlmIHNlbGYuYm9keUNoYXJzT3JpZyA9PSBzZWxmLmluaXRDaGFyc09yaWc6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIiVzWyVzXSoiICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkKICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBzZWxmLnJlID0gTm9uZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5yZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQogICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHQuZ3JvdXAoKQoKICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgbG9jICs9IDEKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycwogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6CiAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UKICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOgogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUKICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOgogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUKICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoKICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOgogICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCgogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoV29yZCxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOgogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbOjRdKyIuLi4iCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzCgogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgUmVnZXgoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLgogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBmb3JtIHJlY29nbml6ZWQgYnkgdGhlIGluYnVpbHQgUHl0aG9uIHJlIG1vZHVsZS4KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIAogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4KCiAgICBFeGFtcGxlOjoKICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikKICAgICAgICBkYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQ/KS0oP1A8ZGF5PlxkXGQ/KScpCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpCiAgICAiIiIKICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToKICAgICAgICAiIiJUaGUgcGFyYW1ldGVycyBDe3BhdHRlcm59IGFuZCBDe2ZsYWdzfSBhcmUgcGFzc2VkIHRvIHRoZSBDe3JlLmNvbXBpbGUoKX0gZnVuY3Rpb24gYXMtaXMuIFNlZSB0aGUgUHl0aG9uIEN7cmV9IG1vZHVsZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGFjY2VwdGFibGUgcGF0dGVybnMgYW5kIGZsYWdzLiIiIgogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncwoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybgogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6CiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IFwKICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKICAgICAgICAgICAgCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpCgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICBkID0gcmVzdWx0Lmdyb3VwZGljdCgpCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQogICAgICAgIGlmIGQ6CiAgICAgICAgICAgIGZvciBrIGluIGQ6CiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdCiAgICAgICAgcmV0dXJuIGxvYyxyZXQKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlZ2V4LHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToKICAgIHIiIiIKICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGRlbGltaXRlZCBieSBxdW90aW5nIGNoYXJhY3RlcnMuCiAgICAKICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgICAgICAgLSBxdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgcXVvdGUgZGVsaW1pdGluZyBzdHJpbmcKICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pCiAgICAgICAgLSBtdWx0aWxpbmUgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBxdW90ZXMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKGRlZmF1bHQ9Q3tGYWxzZX0pCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpCiAgICAgICAgLSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgLSBjb252ZXJ0IGVzY2FwZWQgd2hpdGVzcGFjZSAoQ3snXHQnfSwgQ3snXG4nfSwgZXRjLikgdG8gYWN0dWFsIHdoaXRlc3BhY2UgKGRlZmF1bHQ9Q3tUcnVlfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICBxcyA9IFF1b3RlZFN0cmluZygnIicpCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykKICAgICAgICBwcmludChjb21wbGV4X3FzLnNlYXJjaFN0cmluZygnbHNqZGYge3tUaGlzIGlzIHRoZSAicXVvdGUifX0gc2xkamYnKSkKICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpCiAgICBwcmludHM6OgogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlIHdpdGggImVtYmVkZGVkIiBxdW90ZXMnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOgogICAgICAgIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX2luaXRfXygpCgogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5CiAgICAgICAgcXVvdGVDaGFyID0gcXVvdGVDaGFyLnN0cmlwKCkKICAgICAgICBpZiBub3QgcXVvdGVDaGFyOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpCgogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOgogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBxdW90ZUNoYXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgZW5kUXVvdGVDaGFyOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkKCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXIKICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpCiAgICAgICAgc2VsZi5maXJzdFF1b3RlQ2hhciA9IHF1b3RlQ2hhclswXQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQogICAgICAgIHNlbGYuZXNjQ2hhciA9IGVzY0NoYXIKICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUKICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMKICAgICAgICBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyA9IGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcwoKICAgICAgICBpZiBtdWx0aWxpbmU6CiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXAogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLAogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwKICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZsYWdzID0gMAogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXAogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLAogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwKICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkKICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9ICgKICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmVuZFF1b3RlQ2hhciktMSwwLC0xKSkgKyAnKScKICAgICAgICAgICAgICAgICkKICAgICAgICBpZiBlc2NRdW90ZToKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcyknICUgcmUuZXNjYXBlKGVzY1F1b3RlKSkKICAgICAgICBpZiBlc2NDaGFyOgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQogICAgICAgICAgICBzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiA9IHJlLmVzY2FwZShzZWxmLmVzY0NoYXIpKyIoLikiCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4KICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwKICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQoKICAgICAgICBpZiBzZWxmLnVucXVvdGVSZXN1bHRzOgoKICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzCiAgICAgICAgICAgIHJldCA9IHJldFtzZWxmLnF1b3RlQ2hhckxlbjotc2VsZi5lbmRRdW90ZUNoYXJMZW5dCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoKICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHInXHQnIDogJ1x0JywKICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLAogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHInIDogJ1xyJywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uod3NsaXQsIHdzY2hhcikKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY0NoYXI6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCJcZzwxPiIscmV0KQoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHF1b3RlcwogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToKICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikKCiAgICAgICAgcmV0dXJuIGxvYywgcmV0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIENoYXJzTm90SW4oVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwKICAgIGluY2x1ZGUgd2hpdGVzcGFjZSBpbiBtYXRjaGVkIGNoYXJhY3RlcnMgaWYgbm90IGxpc3RlZCBpbiB0aGUgcHJvdmlkZWQgZXhjbHVzaW9uIHNldCAtIHNlZSBleGFtcGxlKS4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwKICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGEKICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcKICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykKICAgICAgICBwcmludChkZWxpbWl0ZWRMaXN0KGNzdl92YWx1ZSkucGFyc2VTdHJpbmcoImRrbHMsbHNka2pmLHMxMiAzNCxAISMsMjEzIikpCiAgICBwcmludHM6OgogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToKICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMKCiAgICAgICAgaWYgbWluIDwgMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikKCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4KCiAgICAgICAgaWYgbWF4ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UCgogICAgICAgIGlmIGV4YWN0ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdAogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0CgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bGVuIGFuZCBcCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToKICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycwoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBXaGl0ZShUb2tlbik6CiAgICAiIiIKICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMKICAgIGFyZSBzaWduaWZpY2FudC4gIERlZmluZSB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLAogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuCiAgICAiIiIKICAgIHdoaXRlU3RycyA9IHsKICAgICAgICAiICIgOiAiPFNQQz4iLAogICAgICAgICJcdCI6ICI8VEFCPiIsCiAgICAgICAgIlxuIjogIjxMRj4iLAogICAgICAgICJcciI6ICI8Q1I+IiwKICAgICAgICAiXGYiOiAiPEZGPiIsCiAgICAgICAgfQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToKICAgICAgICBzdXBlcihXaGl0ZSxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkKICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbgogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkKICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOgogICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQoKCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgpjbGFzcyBHb1RvQ29sdW1uKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6CiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2wgPSBjb2xubwoKICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGlmIGNvbChsb2MsaW5zdHJpbmcpICE9IHNlbGYuY29sOgogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6CiAgICAgICAgICAgICAgICBsb2MgKz0gMQogICAgICAgIHJldHVybiBsb2MKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHRoaXNjb2wgPSBjb2woIGxvYywgaW5zdHJpbmcgKQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkKICAgICAgICBuZXdsb2MgPSBsb2MgKyBzZWxmLmNvbCAtIHRoaXNjb2wKICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldAoKCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZwogICAgCiAgICBFeGFtcGxlOjoKICAgIAogICAgICAgIHRlc3QgPSAnJydcCiAgICAgICAgQUFBIHRoaXMgbGluZQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQogICAgICAgIEIgQUFBIGFuZCBkZWZpbml0ZWx5IG5vdCB0aGlzIG9uZQogICAgICAgICcnJwoKICAgICAgICBmb3IgdCBpbiAoTGluZVN0YXJ0KCkgKyAnQUFBJyArIHJlc3RPZkxpbmUpLnNlYXJjaFN0cmluZyh0ZXN0KToKICAgICAgICAgICAgcHJpbnQodCkKICAgIAogICAgUHJpbnRzOjoKICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIAoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoTGluZVN0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIGxpbmUiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2M8bGVuKGluc3RyaW5nKToKICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOgogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJzZSBzdHJpbmcKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoU3RyaW5nU3RhcnQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2MgIT0gMDoKICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMKICAgICAgICAgICAgaWYgbG9jICE9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCAwICk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlIHN0cmluZwogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihTdHJpbmdFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0IgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYywgW10KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFdvcmQsIGFuZAogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9CiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywKICAgIHVzZSBDe1dvcmRTdGFydChhbHBoYW51bXMpfS4gQ3tXb3JkU3RhcnR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToKICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykKICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIHN0YXJ0IG9mIGEgd29yZCIKCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jICE9IDA6CiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3IKICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHJldHVybiBsb2MsIFtdCgpjbGFzcyBXb3JkRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kCiAgICBpcyBub3QgZm9sbG93ZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLAogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZgogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBlbmQgb2YgYSBsaW5lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6CiAgICAgICAgc3VwZXIoV29yZEVuZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgZW5kIG9mIGEgd29yZCIKCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcgogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToKICAgICIiIgogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6CiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykKCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBleHBycyApIF0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSApOgogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpCiAgICAgICAgICAgICMgaWYgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBwcm92aWRlZCwgd3JhcCB3aXRoIExpdGVyYWwKICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOgogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykKICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoZXhwcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoIGV4cHJzICkKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IEZhbHNlCgogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6CiAgICAgICAgcmV0dXJuIHNlbGYuZXhwcnNbaV0KCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOgogICAgICAgIHNlbGYuZXhwcnMuYXBwZW5kKCBvdGhlciApCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24KICAgICAgICAgICBhbGwgY29udGFpbmVkIGV4cHJlc3Npb25zLiIiIgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOgogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zdHJlYW1saW5lKCkKCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkKCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApCiAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gcGFyc2UgYWN0aW9ucyBvciByZXN1bHRzTmFtZXMgb24gdGhlIG5lc3RlZCBBbmQncwogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOgogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbMF0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQKICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQKICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yCgogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IHNlbGYuZXhwcnNbOi0xXSArIG90aGVyLmV4cHJzWzpdCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5CiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3IKCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6CiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQogICAgICAgIAogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQogICAgICAgIHJldC5leHBycyA9IFtlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzXQogICAgICAgIHJldHVybiByZXQKCmNsYXNzIEFuZChQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgbmFtZV9leHByID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pCiAgICAgICAgIyBtb3JlIGVhc2lseSB3cml0dGVuIGFzOgogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQogICAgIiIiCgogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHN1cGVyKEFuZC5fRXJyb3JTdG9wLHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToKICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICAjIHBhc3MgRmFsc2UgYXMgbGFzdCBhcmcgdG8gX3BhcnNlIGZvciBmaXJzdCBlbGVtZW50LCBzaW5jZSB3ZSBhbHJlYWR5CiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICBlcnJvclN0b3AgPSBGYWxzZQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToKICAgICAgICAgICAgICAgIGVycm9yU3RvcCA9IFRydWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uLl9mcm9tX2V4Y2VwdGlvbihwZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOgogICAgICAgICAgICAgICAgcmVzdWx0bGlzdCArPSBleHBydG9rZW5zCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdAoKICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNBbmQoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKICAgICAgICAgICAgaWYgbm90IGUubWF5UmV0dXJuRW1wdHk6CiAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yCiAgICAgICAgCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkKICAgIHByaW50czo6CiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgaWYgc2VsZi5leHByczoKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIG1heEV4Y0xvYyA9IC0xCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQogICAgICAgIG1hdGNoZXMgPSBbXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnIKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzYXZlIG1hdGNoIGFtb25nIGFsbCBtYXRjaGVzLCB0byByZXRyeSBsb25nZXN0IHRvIHNob3J0ZXN0CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpCgogICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnIKICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwoKICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQoKCiAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjT3IoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J3wnfSBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGNvbnN0cnVjdCBNYXRjaEZpcnN0IHVzaW5nICd8JyBvcGVyYXRvcgogICAgICAgIAogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSB8IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0KCiAgICAgICAgIyBwdXQgbW9yZSBzZWxlY3RpdmUgZXhwcmVzc2lvbiBmaXJzdAogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOgogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIGlmIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBtYXhFeGNMb2MgPSAtMQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIHJldHVybiByZXQKICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykKCiAgICAgICAgIyBvbmx5IGdvdCBoZXJlIGlmIG5vIGV4cHJlc3Npb24gbWF0Y2hlZCwgcmFpc2UgZXhjZXB0aW9uIGZvciBtYXRjaCB0aGF0IG1hZGUgaXQgdGhlIGZ1cnRoZXN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpCgogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIHwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQsIGJ1dCBpbiBhbnkgb3JkZXIuCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpCiAgICAgICAgc2hhcGVfdHlwZSA9IG9uZU9mKCJTUVVBUkUgQ0lSQ0xFIFRSSUFOR0xFIFNUQVIgSEVYQUdPTiBPQ1RBR09OIikKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikKICAgICAgICBwb3NuX2F0dHIgPSAicG9zbjoiICsgR3JvdXAoaW50ZWdlcigieCIpICsgJywnICsgaW50ZWdlcigieSIpKSgicG9zbiIpCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikKICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpCgogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIAogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQogICAgICAgIHNoYXBlX3NwZWMgPSBzaGFwZV9hdHRyICYgcG9zbl9hdHRyICYgT3B0aW9uYWwoY29sb3JfYXR0cikgJiBPcHRpb25hbChzaXplX2F0dHIpCgogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnCiAgICAgICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODAKICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwCiAgICAgICAgICAgICcnJwogICAgICAgICAgICApCiAgICBwcmludHM6OgogICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dCiAgICAgICAgLSBjb2xvcjogQkxBQ0sKICAgICAgICAtIHBvc246IFsnMTAwJywgJywnLCAnMTIwJ10KICAgICAgICAgIC0geDogMTAwCiAgICAgICAgICAtIHk6IDEyMAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQoKCiAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MAogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQogICAgICAgIC0gY29sb3I6IEJMVUUKICAgICAgICAtIHBvc246IFsnNTAnLCAnLCcsICc4MCddCiAgICAgICAgICAtIHg6IDUwCiAgICAgICAgICAtIHk6IDgwCiAgICAgICAgLSBzaGFwZTogQ0lSQ0xFCiAgICAgICAgLSBzaXplOiA1MAoKCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MAogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQogICAgICAgIC0gY29sb3I6IEdSRUVOCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQogICAgICAgICAgLSB4OiAyMAogICAgICAgICAgLSB5OiA0MAogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFCiAgICAgICAgLSBzaXplOiAyMAogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToKICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOgogICAgICAgICAgICBzZWxmLm9wdDFtYXAgPSBkaWN0KChpZChlLmV4cHIpLGUpIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSkKICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0KICAgICAgICAgICAgc2VsZi5vcHRpb25hbHMgPSBvcHQxICsgb3B0MgogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIG5vdCBpc2luc3RhbmNlKGUsKE9wdGlvbmFsLFplcm9Pck1vcmUsT25lT3JNb3JlKSkgXQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZAogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UKICAgICAgICB0bXBMb2MgPSBsb2MKICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQogICAgICAgIG1hdGNoT3JkZXIgPSBbXQoKICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlCiAgICAgICAgd2hpbGUga2VlcE1hdGNoaW5nOgogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkCiAgICAgICAgICAgIGZhaWxlZCA9IFtdCiAgICAgICAgICAgIGZvciBlIGluIHRtcEV4cHJzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcmRlci5hcHBlbmQoc2VsZi5vcHQxbWFwLmdldChpZChlKSxlKSkKICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBlIGluIHRtcE9wdDoKICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOgogICAgICAgICAgICAgICAga2VlcE1hdGNoaW5nID0gRmFsc2UKCiAgICAgICAgaWYgdG1wUmVxZDoKICAgICAgICAgICAgbWlzc2luZyA9ICIsICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiB0bXBSZXFkKQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkKCiAgICAgICAgIyBhZGQgYW55IHVubWF0Y2hlZCBPcHRpb25hbHMsIGluIGNhc2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQKICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0KCiAgICAgICAgcmVzdWx0bGlzdCA9IFtdCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoKICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQogICAgICAgICAgICByZXN1bHRsaXN0LmFwcGVuZChyZXN1bHRzKQoKICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkKICAgICAgICByZXR1cm4gbG9jLCBmaW5hbFJlc3VsdHMKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6CiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkKICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBUb2tlbik6CiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKExpdGVyYWwoZXhwcikpCiAgICAgICAgc2VsZi5leHByID0gZXhwcgogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICBpZiBleHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3IKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkKICAgICAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIGV4cHIud2hpdGVDaGFycyApCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdAogICAgICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IGV4cHIuY2FsbFByZXBhcnNlCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpCgogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToKICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0OgogICAgICAgICAgICByYWlzZSBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKCBwYXJzZUVsZW1lbnRMaXN0K1tzZWxmXSApCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcikgKQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBMb29rYWhlYWQgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe0ZvbGxvd2VkQnl9CiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5CiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50CiAgICBwb3NpdGlvbi4gIEN7Rm9sbG93ZWRCeX0gYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyB1c2UgRm9sbG93ZWRCeSB0byBtYXRjaCBhIGxhYmVsIG9ubHkgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSAnOicKICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykKICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIAogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkKICAgIHByaW50czo6CiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgIHJldHVybiBsb2MsIFtdCgoKY2xhc3MgTm90QW55KFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQKICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQogICAgYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlICd+JyBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICAKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoTm90QW55LHNlbGYpLl9faW5pdF9fKGV4cHIpCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6CiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQogICAgICAgIGVuZGVyID0gc3RvcE9uCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQogICAgICAgIHNlbGYubm90X2VuZGVyID0gfmVuZGVyIGlmIGVuZGVyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc2VsZl9leHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMKICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQogICAgICAgIAogICAgICAgICMgbXVzdCBiZSBhdCBsZWFzdCBvbmUgKGJ1dCBmaXJzdCBzZWUgaWYgd2UgYXJlIHRoZSBzdG9wT24gc2VudGluZWw7CiAgICAgICAgIyBpZiBzbywgZmFpbCkKICAgICAgICBpZiBjaGVja19lbmRlcjoKICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoYXNJZ25vcmVFeHBycyA9IChub3Qgbm90IHNlbGYuaWdub3JlRXhwcnMpCiAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoKICAgICAgICAgICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBpZiB0bXB0b2tlbnMgb3IgdG1wdG9rZW5zLmhhc2tleXMoKToKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMKICAgICAgICAKY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToKICAgICIiIgogICAgUmVwZXRpdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KICAgIAogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCBvbmUgb3IgbW9yZSB0aW1lcwogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiAKICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIAoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQoKICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQoKICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICMgQmV0dGVyIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ0JMQUNLJ11dCiAgICAgICAgCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMKICAgICAgICAoYXR0cl9leHByICogKDEsKSkucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkKICAgICIiIgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgWmVyb09yTW9yZShfTXVsdGlwbGVNYXRjaCk6CiAgICAiIiIKICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgogICAgCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcwogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiAKICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIAoKICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9CiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOgogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIAogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihaZXJvT3JNb3JlLCBzZWxmKS5wYXJzZUltcGwoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zKQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdLi4uIgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6CiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiIKCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkKY2xhc3MgT3B0aW9uYWwoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzCiAgICAgLSBkZWZhdWx0IChvcHRpb25hbCkgLSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBVUyBwb3N0YWwgY29kZSBjYW4gYmUgYSA1LWRpZ2l0IHppcCwgcGx1cyBvcHRpb25hbCA0LWRpZ2l0IHF1YWxpZmllcgogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQogICAgICAgIHppcC5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQogICAgICAgICAgICAxMjM0NQogICAgICAgICAgICAKICAgICAgICAgICAgIyBaSVArNCBmb3JtCiAgICAgICAgICAgIDEyMTAxLTAwMDEKICAgICAgICAgICAgCiAgICAgICAgICAgICMgaW52YWxpZCBaSVAKICAgICAgICAgICAgOTg3NjUtCiAgICAgICAgICAgICcnJykKICAgIHByaW50czo6CiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQogICAgICAgIDEyMzQ1CiAgICAgICAgWycxMjM0NSddCgogICAgICAgICMgWklQKzQgZm9ybQogICAgICAgIDEyMTAxLTAwMDEKICAgICAgICBbJzEyMTAxLTAwMDEnXQoKICAgICAgICAjIGludmFsaWQgWklQCiAgICAgICAgOTg3NjUtCiAgICAgICAgICAgICBeCiAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNSksIChsaW5lOjEsIGNvbDo2KQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOgogICAgICAgIHN1cGVyKE9wdGlvbmFsLHNlbGYpLl9faW5pdF9fKCBleHByLCBzYXZlbGlzdD1GYWxzZSApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QKICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOgogICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRWYWx1ZSBpcyBub3QgX29wdGlvbmFsTm90TWF0Y2hlZDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQogICAgICAgICAgICAgICAgICAgIHRva2Vuc1tzZWxmLmV4cHIucmVzdWx0c05hbWVdID0gc2VsZi5kZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQogICAgICAgIHJldHVybiBsb2MsIHRva2VucwoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBUb2tlbiBmb3Igc2tpcHBpbmcgb3ZlciBhbGwgdW5kZWZpbmVkIHRleHQgdW50aWwgdGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBpcyBmb3VuZC4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIHRhcmdldCBleHByZXNzaW9uIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBza2lwcGVkCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCAKICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuCiAgICAgLSBpZ25vcmUgLSAoZGVmYXVsdD1De05vbmV9KSB1c2VkIHRvIGRlZmluZSBncmFtbWFycyAodHlwaWNhbGx5IHF1b3RlZCBzdHJpbmdzIGFuZCAKICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSAKICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBza2lwcGVkIHRlc3Q7IGlmIGZvdW5kIGJlZm9yZSB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgZm91bmQsIAogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaAoKICAgIEV4YW1wbGU6OgogICAgICAgIHJlcG9ydCA9ICcnJwogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMAoKICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQogICAgICAgICAgICAgMTAxIHwgQ3JpdGljYWwgfCBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoICAgICAgICAgICAgICAgICB8ICAgICAgICAgIDYKICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0CiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0NwogICAgICAgICAgICAnJycKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykKICAgICAgICAjIHVzZSBTa2lwVG8gdG8gc2ltcGx5IG1hdGNoIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIG5leHQgU0VQCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaAogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkKICAgICAgICBzdHJpbmdfZGF0YSA9IFNraXBUbyhTRVAsIGlnbm9yZT1xdW90ZWRTdHJpbmcpCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkKICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoInNldiIpICsgU0VQIAogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIAogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkKICAgICAgICAKICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOgogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpCiAgICBwcmludHM6OgogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddCiAgICAgICAgLSBkYXlzX29wZW46IDYKICAgICAgICAtIGRlc2M6IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gKICAgICAgICAtIGlzc3VlX251bTogMTAxCiAgICAgICAgLSBzZXY6IENyaXRpY2FsCiAgICAgICAgWyc5NCcsICdDb3NtZXRpYycsICJTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykiLCAnMTQnXQogICAgICAgIC0gZGF5c19vcGVuOiAxNAogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpCiAgICAgICAgLSBpc3N1ZV9udW06IDk0CiAgICAgICAgLSBzZXY6IENvc21ldGljCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddCiAgICAgICAgLSBkYXlzX29wZW46IDQ3CiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cwogICAgICAgIC0gaXNzdWVfbnVtOiA3OQogICAgICAgIC0gc2V2OiBNaW5vcgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToKICAgICAgICBzdXBlciggU2tpcFRvLCBzZWxmICkuX19pbml0X18oIG90aGVyICkKICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQogICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbE9uLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gZmFpbE9uCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc3RhcnRsb2MgPSBsb2MKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBleHByID0gc2VsZi5leHByCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UKICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlID0gc2VsZi5pZ25vcmVFeHByLnRyeVBhcnNlIGlmIHNlbGYuaWdub3JlRXhwciBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICAKICAgICAgICB0bXBsb2MgPSBsb2MKICAgICAgICB3aGlsZSB0bXBsb2MgPD0gaW5zdHJsZW46CiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcwogICAgICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0KGluc3RyaW5nLCB0bXBsb2MpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucwogICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHByX3BhcnNlKGluc3RyaW5nLCB0bXBsb2MsIGRvQWN0aW9ucz1GYWxzZSwgY2FsbFByZVBhcnNlPUZhbHNlKQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToKICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZwogICAgICAgICAgICAgICAgdG1wbG9jICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZyB3aXRob3V0IG1hdGNoaW5nIHNraXB0byBleHByLCBmYWlsCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICAjIGJ1aWxkIHVwIHJldHVybiB2YWx1ZXMKICAgICAgICBsb2MgPSB0bXBsb2MKICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10KICAgICAgICBza2lwcmVzdWx0ID0gUGFyc2VSZXN1bHRzKHNraXB0ZXh0KQogICAgICAgIAogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOgogICAgICAgICAgICBsb2MsIG1hdCA9IGV4cHJfcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucyxjYWxsUHJlUGFyc2U9RmFsc2UpCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0CgogICAgICAgIHJldHVybiBsb2MsIHNraXByZXN1bHQKCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uCiAgICBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGtub3duLCBpdCBpcyBhc3NpZ25lZCB0byB0aGUgQ3tGb3J3YXJkfSB2YXJpYWJsZSB1c2luZyB0aGUgJzw8JyBvcGVyYXRvci4KCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuCiAgICBTcGVjaWZpY2FsbHksICd8JyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzw8Jywgc28gdGhhdDo6CiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMKICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoKICAgICAgICAoZndkRXhwciA8PCBhKSB8IGIgfCBjCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91CiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6CiAgICAgICAgZndkRXhwciA8PCAoYSB8IGIgfCBjKQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uCgogICAgU2VlIEx7UGFyc2VSZXN1bHRzLnBwcmludH0gZm9yIGFuIGV4YW1wbGUgb2YgYSByZWN1cnNpdmUgcGFyc2VyIGNyZWF0ZWQgdXNpbmcKICAgIEN7Rm9yd2FyZH0uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXI9Tm9uZSApOgogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApCgogICAgZGVmIF9fbHNoaWZ0X18oIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpCiAgICAgICAgc2VsZi5leHByID0gb3RoZXIKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3IKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gc2VsZi5leHByLm1heVJldHVybkVtcHR5CiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QKICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpCiAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAKICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXIKICAgIAogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToKICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkKICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iCgogICAgICAgICMgc3R1YmJlZCBvdXQgZm9yIG5vdyAtIGNyZWF0ZXMgYXdmdWwgbWVtb3J5IGFuZCBwZXJmIGlzc3VlcwogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSIKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IHNlbGYuX3JldmVydENsYXNzCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZwoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpCiAgICAgICAgICAgIHJldCA8PD0gc2VsZgogICAgICAgICAgICByZXR1cm4gcmV0CgpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICIuLi4iCgpjbGFzcyBUb2tlbkNvbnZlcnRlcihQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOgogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gRmFsc2UKCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsKICAgIHRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgQ3snYWRqYWNlbnQ9RmFsc2UnfSBpbiB0aGUgY29uc3RydWN0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgcmVhbCA9IFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZwogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10KCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczLjE0MTYnXQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6CiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApCiAgICAgICAgIyBzdXBwcmVzcyB3aGl0ZXNwYWNlLXN0cmlwcGluZyBpbiBjb250YWluZWQgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCByZS1lbmFibGUgaXQgb24gdGhlIENvbWJpbmUgaXRzZWxmCiAgICAgICAgaWYgYWRqYWNlbnQ6CiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICBzZWxmLmFkamFjZW50ID0gYWRqYWNlbnQKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcKICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIHNlbGYuYWRqYWNlbnQ6CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBDb21iaW5lLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpCiAgICAgICAgZGVsIHJldFRva3NbOl0KICAgICAgICByZXRUb2tzICs9IFBhcnNlUmVzdWx0cyhbICIiLmpvaW4odG9rZW5saXN0Ll9hc1N0cmluZ0xpc3Qoc2VsZi5qb2luU3RyaW5nKSkgXSwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMpCgogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOgogICAgICAgICAgICByZXR1cm4gWyByZXRUb2tzIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcmV0VG9rcwoKY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGVkIHRva2VucyBhcyBhIGxpc3QgLSB1c2VmdWwgZm9yIHJldHVybmluZyB0b2tlbnMgb2YgQ3tMe1plcm9Pck1vcmV9fSBhbmQgQ3tMe09uZU9yTW9yZX19IGV4cHJlc3Npb25zLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMpCiAgICAgICAgbnVtID0gV29yZChudW1zKQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQogICAgICAgIGZ1bmMgPSBpZGVudCArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQoKICAgICAgICBmdW5jID0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkKICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQoKY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciB0byByZXR1cm4gYSByZXBldGl0aXZlIGV4cHJlc3Npb24gYXMgYSBsaXN0LCBidXQgYWxzbyBhcyBhIGRpY3Rpb25hcnkuCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCgogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCIKICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgCiAgICAgICAgIyBwcmludCBhdHRyaWJ1dGVzIGFzIHBsYWluIGdyb3VwcwogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkKICAgICAgICAKICAgICAgICAjIGluc3RlYWQgb2YgT25lT3JNb3JlKGV4cHIpLCBwYXJzZSB1c2luZyBEaWN0KE9uZU9yTW9yZShHcm91cChleHByKSkpIC0gRGljdCB3aWxsIGF1dG8tYXNzaWduIG5hbWVzCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICAKICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdAogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIAogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkKICAgIHByaW50czo6CiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQoKICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0CiAgICAgICAgLSBzaGFwZTogU1FVQVJFCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXAKICAgICAgICBTUVVBUkUKICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9CiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICBmb3IgaSx0b2sgaW4gZW51bWVyYXRlKHRva2VubGlzdCk6CiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpa2V5ID0gdG9rWzBdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOgogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQogICAgICAgICAgICBpZiBsZW4odG9rKT09MToKICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rWzFdLGkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkKICAgICAgICAgICAgICAgIGRlbCBkaWN0dmFsdWVbMF0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQoKICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lOgogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbmxpc3QKCgpjbGFzcyBTdXBwcmVzcyhUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4KCiAgICBFeGFtcGxlOjoKICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIgogICAgICAgIHdkID0gV29yZChhbHBoYXMpCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkKCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQKICAgICAgICB3ZF9saXN0MiA9IHdkICsgWmVyb09yTW9yZShTdXBwcmVzcygnLCcpICsgd2QpCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkKICAgIHByaW50czo6CiAgICAgICAgWydhJywgJywnLCAnYicsICcsJywgJ2MnLCAnLCcsICdkJ10KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQogICAgIiIiCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToKICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6CiAgICAiIiIKICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kQ2FsbCk6CiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQogICAgZGVmIF9fY2FsbF9fKHNlbGYscyxsLHQpOgogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoKICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpCiAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCgpkZWYgdHJhY2VQYXJzZUFjdGlvbihmKToKICAgICIiIgogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gCiAgICAKICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59CiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4KCiAgICBFeGFtcGxlOjoKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQoKICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbgogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6CiAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNvcnRlZChzZXQoJycuam9pbih0b2tlbnMpKSkKCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQogICAgICAgIHByaW50KHdkcy5wYXJzZVN0cmluZygic2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYiKSkKICAgIHByaW50czo6CiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkKICAgICAgICA8PGxlYXZpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyAocmV0OiAnZGZqa2xzJykKICAgICAgICBbJ2RmamtscyddCiAgICAiIiIKICAgIGYgPSBfdHJpbV9hcml0eShmKQogICAgZGVmIHooKnBhQXJncyk6CiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fCiAgICAgICAgcyxsLHQgPSBwYUFyZ3NbLTM6XQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6CiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIj4+ZW50ZXJpbmcgJXMobGluZTogJyVzJywgJWQsICVyKVxuIiAlICh0aGlzRnVuYyxsaW5lKGwscyksbCx0KSApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQogICAgICAgICAgICByYWlzZQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKHJldDogJXIpXG4iICUgKHRoaXNGdW5jLHJldCkgKQogICAgICAgIHJldHVybiByZXQKICAgIHRyeToKICAgICAgICB6Ll9fbmFtZV9fID0gZi5fX25hbWVfXwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiB6CgojCiMgZ2xvYmFsIGhlbHBlcnMKIwpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLgogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kCiAgICBjb21tZW50cywgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBDe2NvbWJpbmU9VHJ1ZX0gaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZAogICAgYXMgYSBsaXN0IG9mIHRva2Vucywgd2l0aCB0aGUgZGVsaW1pdGVycyBzdXBwcmVzc2VkLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWEsYmIsY2MiKSAjIC0+IFsnYWEnLCAnYmInLCAnY2MnXQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddCiAgICAiIiIKICAgIGRsTmFtZSA9IF91c3RyKGV4cHIpKyIgWyIrX3VzdHIoZGVsaW0pKyIgIitfdXN0cihleHByKSsiXS4uLiIKICAgIGlmIGNvbWJpbmU6CiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkKCmRlZiBjb3VudGVkQXJyYXkoIGV4cHIsIGludEV4cHI9Tm9uZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLgogICAgVGhpcyBoZWxwZXIgZGVmaW5lcyBhIHBhdHRlcm4gb2YgdGhlIGZvcm06OgogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuCiAgICBUaGUgbWF0Y2hlZCB0b2tlbnMgcmV0dXJucyB0aGUgYXJyYXkgb2YgZXhwciB0b2tlbnMgYXMgYSBsaXN0IC0gdGhlIGxlYWRpbmcgY291bnQgdG9rZW4gaXMgc3VwcHJlc3NlZC4KICAgIAogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQoKICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwKICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkKICAgICAgICBiaW5hcnlDb25zdGFudCA9IFdvcmQoJzAxJykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6IGludCh0WzBdLCAyKSkKICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10KICAgICIiIgogICAgYXJyYXlFeHByID0gRm9yd2FyZCgpCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToKICAgICAgICBuID0gdFswXQogICAgICAgIGFycmF5RXhwciA8PCAobiBhbmQgR3JvdXAoQW5kKFtleHByXSpuKSkgb3IgR3JvdXAoZW1wdHkpKQogICAgICAgIHJldHVybiBbXQogICAgaWYgaW50RXhwciBpcyBOb25lOgogICAgICAgIGludEV4cHIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OmludCh0WzBdKSkKICAgIGVsc2U6CiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpCiAgICBpbnRFeHByLnNldE5hbWUoImFycmF5TGVuIikKICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpCgpkZWYgX2ZsYXR0ZW4oTCk6CiAgICByZXQgPSBbXQogICAgZm9yIGkgaW4gTDoKICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6CiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0LmFwcGVuZChpKQogICAgcmV0dXJuIHJldAoKZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MKICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoKICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykKICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkKICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZAogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGEKICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuCiAgICAiIiIKICAgIHJlcCA9IEZvcndhcmQoKQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOgogICAgICAgIGlmIHQ6CiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOgogICAgICAgICAgICAgICAgcmVwIDw8IHRbMF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2VucwogICAgICAgICAgICAgICAgdGZsYXQgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVwIDw8IEVtcHR5KCkKICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpCiAgICByZXR1cm4gcmVwCgpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcwogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6OgogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkKICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07CiAgICB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZWQsIHNvCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9LgogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLgogICAgIiIiCiAgICByZXAgPSBGb3J3YXJkKCkKICAgIGUyID0gZXhwci5jb3B5KCkKICAgIHJlcCA8PD0gZTIKICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToKICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpCiAgICAgICAgZGVmIG11c3RNYXRjaFRoZXNlVG9rZW5zKHMsbCx0KToKICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIiwwLCIiKQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkKICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQogICAgcmV0dXJuIHJlcAoKZGVmIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMocyk6CiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0KICAgIGZvciBjIGluIHIiXF4tXSI6CiAgICAgICAgcyA9IHMucmVwbGFjZShjLF9ic2xhc2grYykKICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikKICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikKICAgIHJldHVybiBfdXN0cihzKQoKZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwKICAgIGJ1dCByZXR1cm5zIGEgQ3tMe01hdGNoRmlyc3R9fSBmb3IgYmVzdCBwZXJmb3JtYW5jZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gc3RycyAtIGEgc3RyaW5nIG9mIHNwYWNlLWRlbGltaXRlZCBsaXRlcmFscywgb3IgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBsaXRlcmFscwogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MKICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleAogICAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UsIHdpbGwgZ2VuZXJhdGUgYSBDe01hdGNoRmlyc3R9IG9iamVjdCAoaWYgQ3tjYXNlbGVzcz1UcnVlfSwgb3IKICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikKCiAgICBFeGFtcGxlOjoKICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykKICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0KICAgICAgICBwcmludChjb21wYXJpc29uX2V4cHIuc2VhcmNoU3RyaW5nKCJCID0gMTIgIEFBPTIzIEI8PUFBIEFBPjEyIikpCiAgICBwcmludHM6OgogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQogICAgIiIiCiAgICBpZiBjYXNlbGVzczoKICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkKICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi51cHBlcigpLnN0YXJ0c3dpdGgoYS51cHBlcigpKSApCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwKICAgIGVsc2U6CiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYSA9PSBiICkKICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkKICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwKCiAgICBzeW1ib2xzID0gW10KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToKICAgICAgICBzeW1ib2xzID0gc3Rycy5zcGxpdCgpCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgY29sbGVjdGlvbnMuSXRlcmFibGUpOgogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpCiAgICBlbHNlOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICBpZiBub3Qgc3ltYm9sczoKICAgICAgICByZXR1cm4gTm9NYXRjaCgpCgogICAgaSA9IDAKICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToKICAgICAgICBjdXIgPSBzeW1ib2xzW2ldCiAgICAgICAgZm9yIGosb3RoZXIgaW4gZW51bWVyYXRlKHN5bWJvbHNbaSsxOl0pOgogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToKICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6CiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0KICAgICAgICAgICAgICAgIHN5bWJvbHMuaW5zZXJ0KGksb3RoZXIpCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpICs9IDEKCiAgICBpZiBub3QgY2FzZWxlc3MgYW5kIHVzZVJlZ2V4OgogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbGVuKHN5bWJvbHMpPT1sZW4oIiIuam9pbihzeW1ib2xzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJ8Ii5qb2luKHJlLmVzY2FwZShzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQoKCiAgICAjIGxhc3QgcmVzb3J0LCBqdXN0IHVzZSBNYXRjaEZpcnN0CiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQoKZGVmIGRpY3RPZigga2V5LCB2YWx1ZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucwogICAgZm9yIHRoZSBrZXkgYW5kIHZhbHVlLiAgVGFrZXMgY2FyZSBvZiBkZWZpbmluZyB0aGUgQ3tMe0RpY3R9fSwgQ3tMe1plcm9Pck1vcmV9fSwgYW5kIEN7THtHcm91cH19IHRva2VucwogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUKICAgIHBhdHRlcm4gY2FuIGluY2x1ZGUgbmFtZWQgcmVzdWx0cywgc28gdGhhdCB0aGUgQ3tEaWN0fSByZXN1bHRzIGNhbiBpbmNsdWRlIG5hbWVkIHRva2VuCiAgICBmaWVsZHMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIgogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsCiAgICAgICAgYXR0cl92YWx1ZSA9IFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKQoKICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQKICAgICAgICByZXN1bHQgPSBkaWN0T2YoYXR0cl9sYWJlbCwgYXR0cl92YWx1ZSkucGFyc2VTdHJpbmcodGV4dCkKICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkKICAgICAgICBwcmludChyZXN1bHQuc2hhcGUpICAjIG9iamVjdCBhdHRyaWJ1dGUgYWNjZXNzIHdvcmtzIHRvbwogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkKICAgIHByaW50czo6CiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwCiAgICAgICAgU1FVQVJFCiAgICAgICAgU1FVQVJFCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQogICAgIiIiCiAgICByZXR1cm4gRGljdCggWmVyb09yTW9yZSggR3JvdXAgKCBrZXkgKyB2YWx1ZSApICkgKQoKZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToKICAgICIiIgogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bwogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bwogICAgcmV2ZXJ0IHNlcGFyYXRlIHRva2VucyB3aXRoIGludGVydmVuaW5nIHdoaXRlc3BhY2UgYmFjayB0byB0aGUgb3JpZ2luYWwgbWF0Y2hpbmcKICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIAogICAgICAgCiAgICBJZiB0aGUgb3B0aW9uYWwgQ3thc1N0cmluZ30gYXJndW1lbnQgaXMgcGFzc2VkIGFzIEN7RmFsc2V9LCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYSAKICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIAogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiAKICAgIHRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDe0x7b3JpZ2luYWxUZXh0Rm9yfX0gY29udGFpbnMgZXhwcmVzc2lvbnMgd2l0aCBkZWZpbmVkCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UKICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICIKICAgICAgICBmb3IgdGFnIGluICgiYiIsImkiKToKICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpCiAgICAgICAgICAgIHByaW50KHBhdHQuc2VhcmNoU3RyaW5nKHNyYylbMF0pCiAgICBwcmludHM6OgogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddCiAgICAgICAgWyc8aT50ZXh0PC9pPiddCiAgICAiIiIKICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykKICAgIGVuZGxvY01hcmtlciA9IGxvY01hcmtlci5jb3B5KCkKICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQogICAgaWYgYXNTdHJpbmc6CiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQogICAgZWxzZToKICAgICAgICBkZWYgZXh0cmFjdFRleHQocyxsLHQpOgogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQogICAgbWF0Y2hFeHByLmlnbm9yZUV4cHJzID0gZXhwci5pZ25vcmVFeHBycwogICAgcmV0dXJuIG1hdGNoRXhwcgoKZGVmIHVuZ3JvdXAoZXhwcik6IAogICAgIiIiCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbgogICAgaWYgYWxsIGJ1dCBvbmUgYXJlIG5vbi1lbXB0eS4KICAgICIiIgogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pCgpkZWYgbG9jYXRlZEV4cHIoZXhwcik6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWNvcmF0ZSBhIHJldHVybmVkIHRva2VuIHdpdGggaXRzIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzdHJpbmcuCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoKICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zCiAgICAgLSBsb2NuX2VuZCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBlbmRzCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMKCiAgICBCZSBjYXJlZnVsIGlmIHRoZSBpbnB1dCB0ZXh0IGNvbnRhaW5zIEN7PFRBQj59IGNoYXJhY3RlcnMsIHlvdSBtYXkgd2FudCB0byBjYWxsCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0KCiAgICBFeGFtcGxlOjoKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToKICAgICAgICAgICAgcHJpbnQobWF0Y2gpCiAgICBwcmludHM6OgogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dCiAgICAgICAgW1s4LCAnbGtzZGpqZicsIDE1XV0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dCiAgICAiIiIKICAgIGxvY2F0b3IgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDogbCkKICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpCgoKIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMKZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikKbGluZVN0YXJ0ICAgPSBMaW5lU3RhcnQoKS5zZXROYW1lKCJsaW5lU3RhcnQiKQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikKc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikKc3RyaW5nRW5kICAgPSBTdHJpbmdFbmQoKS5zZXROYW1lKCJzdHJpbmdFbmQiKQoKX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkKX2VzY2FwZWRIZXhDaGFyID0gUmVnZXgociJcXDA/W3hYXVswLTlhLWZBLUZdKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF0ubHN0cmlwKHInXDB4JyksMTYpKSkKX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9cidcXScsIGV4YWN0PTEpIHwgUmVnZXgociJcdyIsIHJlLlVOSUNPREUpCl9jaGFyUmFuZ2UgPSBHcm91cChfc2luZ2xlQ2hhciArIFN1cHByZXNzKCItIikgKyBfc2luZ2xlQ2hhcikKX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIgoKZGVmIHNyYW5nZShzKToKICAgIHIiIiIKICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MKICAgIHN5bnRheCBmcm9tIHJlZ2V4cCAnW10nIHN0cmluZyByYW5nZSBkZWZpbml0aW9uczo6CiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogICAgICAgIHNyYW5nZSgiW2EteiRfXSIpIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiRfIgogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZAogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuCiAgICBUaGUgdmFsdWVzIGVuY2xvc2VkIGluIHRoZSBbXSdzIG1heSBiZToKICAgICAtIGEgc2luZ2xlIGNoYXJhY3RlcgogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQogICAgIC0gYW4gZXNjYXBlZCBoZXggY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1x4J30gKEN7XHgyMX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikgCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIAogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQogICAgIC0gYSByYW5nZSBvZiBhbnkgb2YgdGhlIGFib3ZlLCBzZXBhcmF0ZWQgYnkgYSBkYXNoIChDeydhLXonfSwgZXRjLikKICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQogICAgIiIiCiAgICBfZXhwYW5kZWQgPSBsYW1iZGEgcDogcCBpZiBub3QgaXNpbnN0YW5jZShwLFBhcnNlUmVzdWx0cykgZWxzZSAnJy5qb2luKHVuaWNocihjKSBmb3IgYyBpbiByYW5nZShvcmQocFswXSksb3JkKHBbMV0pKzEpKQogICAgdHJ5OgogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gIiIKCmRlZiBtYXRjaE9ubHlBdENvbChuKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYwogICAgY29sdW1uIGluIHRoZSBpbnB1dCB0ZXh0LgogICAgIiIiCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToKICAgICAgICBpZiBjb2wobG9jbixzdHJnKSAhPSBuOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQogICAgcmV0dXJuIHZlcmlmeUNvbAoKZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb21tb24gcGFyc2UgYWN0aW9ucyB0aGF0IHNpbXBseSByZXR1cm4gYSBsaXRlcmFsIHZhbHVlLiAgRXNwZWNpYWxseQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQogICAgICAgIHRlcm0gPSBuYSB8IG51bQogICAgICAgIAogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQogICAgIiIiCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0KCmRlZiByZW1vdmVRdW90ZXMocyxsLHQpOgogICAgIiIiCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciXQoKICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMKICAgICAgICBxdW90ZWRTdHJpbmcuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlUXVvdGVzKQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdCiAgICAiIiIKICAgIHJldHVybiB0WzBdWzE6LTFdCgpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCAKICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcgogICAgdGhlIHRva2VuLCBhcyBpbiBDe2hleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSl9LCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuCgogICAgRXhhbXBsZSAoY29tcGFyZSB0aGUgbGFzdCB0byBleGFtcGxlIGluIEx7UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmd9OjoKICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkKICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycKICAgICAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWEKICAgICAgICAgICAgJycnKQogICAgICAgIAogICAgICAgIHVwcGVyd29yZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudXBwZXIpKQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJwogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlCiAgICAgICAgICAgICcnJykKCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkKICAgICAgICBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKS5ydW5UZXN0cygnJycKICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yawogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdCgogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UKICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQoKICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10KICAgICIiIgogICAgZGVmIHBhKHMsbCx0KToKICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdCgogICAgdHJ5OgogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpCiAgICBwYS5fX25hbWVfXyA9IGZ1bmNfbmFtZQoKICAgIHJldHVybiBwYQoKdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiIKCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIgogICAgCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOgogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIgogICAgaWYgaXNpbnN0YW5jZSh0YWdTdHIsYmFzZXN0cmluZyk6CiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cgogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQogICAgZWxzZToKICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUKCiAgICB0YWdBdHRyTmFtZSA9IFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXy06IikKICAgIGlmICh4bWwpOgogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXAogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpCiAgICBlbHNlOgogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikKICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwKICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikKICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikKCiAgICBvcGVuVGFnID0gb3BlblRhZy5zZXRSZXN1bHRzTmFtZSgic3RhcnQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwlcz4iICUgcmVzbmFtZSkKICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkKICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQogICAgY2xvc2VUYWcudGFnID0gcmVzbmFtZQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnCgpkZWYgbWFrZUhUTUxUYWdzKHRhZ1N0cik6CiAgICAiIiIKICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMKICAgIHRhZ3MgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzIGFuZCB3aXRoIHF1b3RlZCBvciB1bnF1b3RlZCB2YWx1ZXMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+JwogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQogICAgICAgIGxpbmtfZXhwciA9IGEgKyBTa2lwVG8oYV9lbmQpKCJsaW5rX3RleHQiKSArIGFfZW5kCiAgICAgICAgCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToKICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGluIHRoZSA8QT4gdGFnIChsaWtlICJocmVmIiBzaG93biBoZXJlKSBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFzIG5hbWVkIHJlc3VsdHMKICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikKICAgIHByaW50czo6CiAgICAgICAgcHlwYXJzaW5nIC0+IGh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20KICAgICIiIgogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApCgpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToKICAgICIiIgogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgWE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuCgogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe21ha2VIVE1MVGFnc30KICAgICIiIgogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkKCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gY3JlYXRlIGEgdmFsaWRhdGluZyBwYXJzZSBhY3Rpb24gdG8gYmUgdXNlZCB3aXRoIHN0YXJ0IHRhZ3MgY3JlYXRlZAogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcKICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcwogICAgQ3s8VEQ+fSBvciBDezxESVY+fS4KCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdAogICAgb2YgZmlsdGVyIGF0dHJpYnV0ZXMgbmFtZXMgYW5kIHZhbHVlcyBhczoKICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbgogICAgICAgICAgcmVzZXJ2ZWQgd29yZCwgYXMgaW4gQ3sqKnsiY2xhc3MiOiJDdXN0b21lciIsICJhbGlnbiI6InJpZ2h0In19CiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkKICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUKICAgIG5hbWVzIGFyZSBtYXRjaGVkIGluc2Vuc2l0aXZlIHRvIHVwcGVyL2xvd2VyIGNhc2UuCiAgICAgICAKICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uCgogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcwogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGh0bWwgPSAnJycKICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgU29tZSB0ZXh0CiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+CiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+CiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIAogICAgICAgICcnJwogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQoKICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIgogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQogICAgICAgIAogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUKICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkKICAgIHByaW50czo6CiAgICAgICAgMSA0IDAgMSAwCgogICAgICAgIDEgNCAwIDEgMAogICAgICAgIDEsMyAyLDMgMSwxCiAgICAiIiIKICAgIGlmIGFyZ3M6CiAgICAgICAgYXR0cnMgPSBhcmdzWzpdCiAgICBlbHNlOgogICAgICAgIGF0dHJzID0gYXR0ckRpY3QuaXRlbXMoKQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10KICAgIGRlZiBwYShzLGwsdG9rZW5zKToKICAgICAgICBmb3IgYXR0ck5hbWUsYXR0clZhbHVlIGluIGF0dHJzOgogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQogICAgICAgICAgICBpZiBhdHRyVmFsdWUgIT0gd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgYW5kIHRva2Vuc1thdHRyTmFtZV0gIT0gYXR0clZhbHVlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQogICAgcmV0dXJuIHBhCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkKCmRlZiB3aXRoQ2xhc3MoY2xhc3NuYW1lLCBuYW1lc3BhY2U9JycpOgogICAgIiIiCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQogICAgZGlmZmljdWx0IGJlY2F1c2UgQ3tjbGFzc30gaXMgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4KCiAgICBFeGFtcGxlOjoKICAgICAgICBodG1sID0gJycnCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIFNvbWUgdGV4dAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+CiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAnJycKICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikKICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQogICAgICAgIAogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkKICAgICAgICAKICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkKICAgIHByaW50czo6CiAgICAgICAgMSA0IDAgMSAwCgogICAgICAgIDEgNCAwIDEgMAogICAgICAgIDEsMyAyLDMgMSwxCiAgICAiIiIKICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIgogICAgcmV0dXJuIHdpdGhBdHRyaWJ1dGUoKip7Y2xhc3NhdHRyIDogY2xhc3NuYW1lfSkgICAgICAgIAoKb3BBc3NvYyA9IF9Db25zdGFudHMoKQpvcEFzc29jLkxFRlQgPSBvYmplY3QoKQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkKCmRlZiBpbmZpeE5vdGF0aW9uKCBiYXNlRXhwciwgb3BMaXN0LCBscGFyPVN1cHByZXNzKCcoJyksIHJwYXI9U3VwcHJlc3MoJyknKSApOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZgogICAgb3BlcmF0b3JzIHdvcmtpbmcgaW4gYSBwcmVjZWRlbmNlIGhpZXJhcmNoeS4gIE9wZXJhdG9ycyBtYXkgYmUgdW5hcnkgb3IKICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIAogICAgb2YgcGFyZW50aGVzZXMgdG8gb3ZlcnJpZGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgKHNlZSBleGFtcGxlIGJlbG93KS4KICAgIAogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICB3aGVuIHVzaW5nIGluZml4Tm90YXRpb24uIFNlZSBMe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdH0gZm9yIGEKICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQKICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUKICAgICAgZXhwcmVzc2lvbiBncmFtbWFyOyBlYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToKICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOwogICAgICAgICAgbWF5IGFsc28gYmUgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTGl0ZXJhbDsKICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zCiAgICAgICAtIG51bVRlcm1zIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgZm9yIHRoaXMgb3BlcmF0b3IgKG11c3QKICAgICAgICAgIGJlIDEsIDIsIG9yIDMpCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMKICAgICAgICAgIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdmUsIHVzaW5nIHRoZSBweXBhcnNpbmctZGVmaW5lZAogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoaXMgb3BlcmF0b3IgZXhwcmVzc2lvbiAodGhlCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkKICAgICAtIHJwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyByaWdodC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcpJyl9KQoKICAgIEV4YW1wbGU6OgogICAgICAgICMgc2ltcGxlIGV4YW1wbGUgb2YgZm91ci1mdW5jdGlvbiBhcml0aG1ldGljIHdpdGggaW50cyBhbmQgdmFyaWFibGUgbmFtZXMKICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcgogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgCiAgICAgICAgCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgKCctJywgMSwgb3BBc3NvYy5SSUdIVCksCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksCiAgICAgICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycKICAgICAgICAgICAgNSszKjYKICAgICAgICAgICAgKDUrMykqNgogICAgICAgICAgICAtMi0tMTEKICAgICAgICAgICAgJycnLCBmdWxsRHVtcD1GYWxzZSkKICAgIHByaW50czo6CiAgICAgICAgNSszKjYKICAgICAgICBbWzUsICcrJywgWzMsICcqJywgNl1dXQoKICAgICAgICAoNSszKSo2CiAgICAgICAgW1tbNSwgJysnLCAzXSwgJyonLCA2XV0KCiAgICAgICAgLTItLTExCiAgICAgICAgW1tbJy0nLCAyXSwgJy0nLCBbJy0nLCAxMV1dXQogICAgIiIiCiAgICByZXQgPSBGb3J3YXJkKCkKICAgIGxhc3RFeHByID0gYmFzZUV4cHIgfCAoIGxwYXIgKyByZXQgKyBycGFyICkKICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6CiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0KICAgICAgICB0ZXJtTmFtZSA9ICIlcyB0ZXJtIiAlIG9wRXhwciBpZiBhcml0eSA8IDMgZWxzZSAiJXMlcyB0ZXJtIiAlIG9wRXhwcgogICAgICAgIGlmIGFyaXR5ID09IDM6CiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBudW10ZXJtcz0zLCBvcEV4cHIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3Qgb2YgdHdvIGV4cHJlc3Npb25zIikKICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcgogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpCiAgICAgICAgaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5MRUZUOgogICAgICAgICAgICBpZiBhcml0eSA9PSAxOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6CiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoKICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToKICAgICAgICAgICAgICAgICMgdHJ5IHRvIGF2b2lkIExSIHdpdGggdGhpcyBleHRyYSB0ZXN0CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToKICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KG9wRXhwci5leHByICsgdGhpc0V4cHIpICsgR3JvdXAoIG9wRXhwciArIHRoaXNFeHByICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIHRoaXNFeHByICkgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGluZGljYXRlIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdml0eSIpCiAgICAgICAgaWYgcGE6CiAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbiggcGEgKQogICAgICAgIHRoaXNFeHByIDw8PSAoIG1hdGNoRXhwci5zZXROYW1lKHRlcm1OYW1lKSB8IGxhc3RFeHByICkKICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByCiAgICByZXQgPDw9IGxhc3RFeHByCiAgICByZXR1cm4gcmV0CgpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uCiIiIihEZXByZWNhdGVkKSBGb3JtZXIgbmFtZSBvZiBDe0x7aW5maXhOb3RhdGlvbn19LCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iIiIKCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpCnNnbFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyIpCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfAogICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgicXVvdGVkU3RyaW5nIHVzaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIikKdW5pY29kZVN0cmluZyA9IENvbWJpbmUoX0woJ3UnKSArIHF1b3RlZFN0cmluZy5jb3B5KCkpLnNldE5hbWUoInVuaWNvZGUgc3RyaW5nIGxpdGVyYWwiKQoKZGVmIG5lc3RlZEV4cHIob3BlbmVyPSIoIiwgY2xvc2VyPSIpIiwgY29udGVudD1Ob25lLCBpZ25vcmVFeHByPXF1b3RlZFN0cmluZy5jb3B5KCkpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZwogICAgZGVsaW1pdGVycyAoIigiIGFuZCAiKSIgYXJlIHRoZSBkZWZhdWx0KS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gb3BlbmVyIC0gb3BlbmluZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKCJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbgogICAgIC0gY2xvc2VyIC0gY2xvc2luZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKSJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbgogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pCiAgICAgLSBpZ25vcmVFeHByIC0gZXhwcmVzc2lvbiBmb3IgaWdub3Jpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIChkZWZhdWx0PUN7cXVvdGVkU3RyaW5nfSkKCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQKICAgIGV4cHJlc3Npb24gd2lsbCBjYXB0dXJlIGFsbCB3aGl0ZXNwYWNlLWRlbGltaXRlZCBjb250ZW50IGJldHdlZW4gZGVsaW1pdGVycwogICAgYXMgYSBsaXN0IG9mIHNlcGFyYXRlIHZhbHVlcy4KCiAgICBVc2UgdGhlIEN7aWdub3JlRXhwcn0gYXJndW1lbnQgdG8gZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgbWF5IGNvbnRhaW4KICAgIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIG9wZW5pbmcKICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50CiAgICBleHByZXNzaW9uLiAgU3BlY2lmeSBtdWx0aXBsZSBleHByZXNzaW9ucyB1c2luZyBhbiBDe0x7T3J9fSBvciBDe0x7TWF0Y2hGaXJzdH19LgogICAgVGhlIGRlZmF1bHQgaXMgTHtxdW90ZWRTdHJpbmd9LCBidXQgaWYgbm8gZXhwcmVzc2lvbnMgYXJlIHRvIGJlIGlnbm9yZWQsCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpCiAgICAgICAgZGVjbF9kYXRhX3R5cGUgPSBDb21iaW5lKGRhdGFfdHlwZSArIE9wdGlvbmFsKFdvcmQoJyonKSkpCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIKICAgICAgICBhcmcgPSBHcm91cChkZWNsX2RhdGFfdHlwZSArIGlkZW50KQogICAgICAgIExQQVIsUlBBUiA9IG1hcChTdXBwcmVzcywgIigpIikKCiAgICAgICAgY29kZV9ib2R5ID0gbmVzdGVkRXhwcigneycsICd9JywgaWdub3JlRXhwcj0ocXVvdGVkU3RyaW5nIHwgY1N0eWxlQ29tbWVudCkpCgogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSAKICAgICAgICAgICAgICAgICAgICAgICsgaWRlbnQoIm5hbWUiKQogICAgICAgICAgICAgICAgICAgICAgKyBMUEFSICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChhcmcpLCBbXSkoImFyZ3MiKSArIFJQQVIgCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQogICAgICAgIGNfZnVuY3Rpb24uaWdub3JlKGNTdHlsZUNvbW1lbnQpCiAgICAgICAgCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycKICAgICAgICAgICAgaW50IGlzX29kZChpbnQgeCkgeyAKICAgICAgICAgICAgICAgIHJldHVybiAoeCUyKTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgZGVjX3RvX2hleChjaGFyIGhjaGFyKSB7IAogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmQoaGNoYXIpLW9yZCgnMCcpKTsgCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfQogICAgICAgICcnJwogICAgICAgIGZvciBmdW5jIGluIGNfZnVuY3Rpb24uc2VhcmNoU3RyaW5nKHNvdXJjZV9jb2RlKToKICAgICAgICAgICAgcHJpbnQoIiUobmFtZSlzICglKHR5cGUpcykgYXJnczogJShhcmdzKXMiICUgZnVuYykKCiAgICBwcmludHM6OgogICAgICAgIGlzX29kZCAoaW50KSBhcmdzOiBbWydpbnQnLCAneCddXQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQogICAgIiIiCiAgICBpZiBvcGVuZXIgPT0gY2xvc2VyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQogICAgaWYgY29udGVudCBpcyBOb25lOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlbmVyLGJhc2VzdHJpbmcpIGFuZCBpc2luc3RhbmNlKGNsb3NlcixiYXNlc3RyaW5nKToKICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6CiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHN0cmluZ3MgaWYgbm8gY29udGVudCBleHByZXNzaW9uIGlzIGdpdmVuIikKICAgIHJldCA9IEZvcndhcmQoKQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToKICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggaWdub3JlRXhwciB8IHJldCB8IGNvbnRlbnQgKSArIFN1cHByZXNzKGNsb3NlcikgKQogICAgZWxzZToKICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQogICAgcmV0LnNldE5hbWUoJ25lc3RlZCAlcyVzIGV4cHJlc3Npb24nICUgKG9wZW5lcixjbG9zZXIpKQogICAgcmV0dXJuIHJldAoKZGVmIGluZGVudGVkQmxvY2soYmxvY2tTdGF0ZW1lbnRFeHByLCBpbmRlbnRTdGFjaywgaW5kZW50PVRydWUpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzCiAgICB0aG9zZSB1c2VkIHRvIGRlZmluZSBibG9jayBzdGF0ZW1lbnRzIGluIFB5dGhvbiBzb3VyY2UgY29kZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gYmxvY2tTdGF0ZW1lbnRFeHByIC0gZXhwcmVzc2lvbiBkZWZpbmluZyBzeW50YXggb2Ygc3RhdGVtZW50IHRoYXQKICAgICAgICAgICAgaXMgcmVwZWF0ZWQgd2l0aGluIHRoZSBpbmRlbnRlZCBibG9jawogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjawogICAgICAgICAgICAobXVsdGlwbGUgc3RhdGVtZW50V2l0aEluZGVudGVkQmxvY2sgZXhwcmVzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGdyYW1tYXIKICAgICAgICAgICAgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluZGVudFN0YWNrKQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlCiAgICAgICAgICAgIHRoZSBjdXJyZW50IGxldmVsOyBzZXQgdG8gRmFsc2UgZm9yIGJsb2NrIG9mIGxlZnQtbW9zdCBzdGF0ZW1lbnRzCiAgICAgICAgICAgIChkZWZhdWx0PUN7VHJ1ZX0pCgogICAgQSB2YWxpZCBibG9jayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIEN7YmxvY2tTdGF0ZW1lbnR9LgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGEgPSAnJycKICAgICAgICBkZWYgQSh6KToKICAgICAgICAgIEExCiAgICAgICAgICBCID0gMTAwCiAgICAgICAgICBHID0gQTIKICAgICAgICAgIEEyCiAgICAgICAgICBBMwogICAgICAgIEIKICAgICAgICBkZWYgQkIoYSxiLGMpOgogICAgICAgICAgQkIxCiAgICAgICAgICBkZWYgQkJBKCk6CiAgICAgICAgICAgIGJiYTEKICAgICAgICAgICAgYmJhMgogICAgICAgICAgICBiYmEzCiAgICAgICAgQwogICAgICAgIEQKICAgICAgICBkZWYgc3BhbSh4LHkpOgogICAgICAgICAgICAgZGVmIGVnZ3Moeik6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICcnJwoKCiAgICAgICAgaW5kZW50U3RhY2sgPSBbMV0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpCgogICAgICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpCiAgICAgICAgZnVuY19ib2R5ID0gaW5kZW50ZWRCbG9jayhzdG10LCBpbmRlbnRTdGFjaykKICAgICAgICBmdW5jRGVmID0gR3JvdXAoIGZ1bmNEZWNsICsgZnVuY19ib2R5ICkKCiAgICAgICAgcnZhbHVlID0gRm9yd2FyZCgpCiAgICAgICAgZnVuY0NhbGwgPSBHcm91cChpZGVudGlmaWVyICsgIigiICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChydmFsdWUpKSArICIpIikKICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpCiAgICAgICAgYXNzaWdubWVudCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiPSIgKyBydmFsdWUpCiAgICAgICAgc3RtdCA8PCAoIGZ1bmNEZWYgfCBhc3NpZ25tZW50IHwgaWRlbnRpZmllciApCgogICAgICAgIG1vZHVsZV9ib2R5ID0gT25lT3JNb3JlKHN0bXQpCgogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpCiAgICAgICAgcGFyc2VUcmVlLnBwcmludCgpCiAgICBwcmludHM6OgogICAgICAgIFtbJ2RlZicsCiAgICAgICAgICAnQScsCiAgICAgICAgICBbJygnLCAneicsICcpJ10sCiAgICAgICAgICAnOicsCiAgICAgICAgICBbWydBMSddLCBbWydCJywgJz0nLCAnMTAwJ11dLCBbWydHJywgJz0nLCAnQTInXV0sIFsnQTInXSwgWydBMyddXV0sCiAgICAgICAgICdCJywKICAgICAgICAgWydkZWYnLAogICAgICAgICAgJ0JCJywKICAgICAgICAgIFsnKCcsICdhJywgJ2InLCAnYycsICcpJ10sCiAgICAgICAgICAnOicsCiAgICAgICAgICBbWydCQjEnXSwgW1snZGVmJywgJ0JCQScsIFsnKCcsICcpJ10sICc6JywgW1snYmJhMSddLCBbJ2JiYTInXSwgWydiYmEzJ11dXV1dXSwKICAgICAgICAgJ0MnLAogICAgICAgICAnRCcsCiAgICAgICAgIFsnZGVmJywKICAgICAgICAgICdzcGFtJywKICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1tbJ2RlZicsICdlZ2dzJywgWycoJywgJ3onLCAnKSddLCAnOicsIFtbJ3Bhc3MnXV1dXV1dXSAKICAgICIiIgogICAgZGVmIGNoZWNrUGVlckluZGVudChzLGwsdCk6CiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybgogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpCiAgICAgICAgaWYgY3VyQ29sICE9IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgcGVlciBlbnRyeSIpCgogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToKICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQogICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgc3ViZW50cnkiKQoKICAgIGRlZiBjaGVja1VuaW5kZW50KHMsbCx0KToKICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuCiAgICAgICAgY3VyQ29sID0gY29sKGwscykKICAgICAgICBpZiBub3QoaW5kZW50U3RhY2sgYW5kIGN1ckNvbCA8IGluZGVudFN0YWNrWy0xXSBhbmQgY3VyQ29sIDw9IGluZGVudFN0YWNrWy0yXSk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGFuIHVuaW5kZW50IikKICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQoKICAgIE5MID0gT25lT3JNb3JlKExpbmVFbmQoKS5zZXRXaGl0ZXNwYWNlQ2hhcnMoIlx0ICIpLnN1cHByZXNzKCkpCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQogICAgUEVFUiAgID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1BlZXJJbmRlbnQpLnNldE5hbWUoJycpCiAgICBVTkRFTlQgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrVW5pbmRlbnQpLnNldE5hbWUoJ1VOSU5ERU5UJykKICAgIGlmIGluZGVudDoKICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsKICAgICAgICAgICAgI34gRm9sbG93ZWRCeShibG9ja1N0YXRlbWVudEV4cHIpICsKICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpCiAgICBlbHNlOgogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKwogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApCiAgICBibG9ja1N0YXRlbWVudEV4cHIuaWdub3JlKF9ic2xhc2ggKyBMaW5lRW5kKCkpCiAgICByZXR1cm4gc21FeHByLnNldE5hbWUoJ2luZGVudGVkIGJsb2NrJykKCmFscGhhczhiaXQgPSBzcmFuZ2UociJbXDB4YzAtXDB4ZDZcMHhkOC1cMHhmNlwweGY4LVwweGZmXSIpCnB1bmM4Yml0ID0gc3JhbmdlKHIiW1wweGExLVwweGJmXDB4ZDdcMHhmN10iKQoKYW55T3BlblRhZyxhbnlDbG9zZVRhZyA9IG1ha2VIVE1MVGFncyhXb3JkKGFscGhhcyxhbHBoYW51bXMrIl86Iikuc2V0TmFtZSgnYW55IHRhZycpKQpfaHRtbEVudGl0eU1hcCA9IGRpY3QoemlwKCJndCBsdCBhbXAgbmJzcCBxdW90IGFwb3MiLnNwbGl0KCksJz48JiAiXCcnKSkKY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikKZGVmIHJlcGxhY2VIVE1MRW50aXR5KHQpOgogICAgIiIiSGVscGVyIHBhcnNlciBhY3Rpb24gdG8gcmVwbGFjZSBjb21tb24gSFRNTCBlbnRpdGllcyB3aXRoIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyIiIgogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkKCiMgaXQncyBlYXN5IHRvIGdldCB0aGVzZSBjb21tZW50IHN0cnVjdHVyZXMgd3JvbmcgLSB0aGV5J3JlIHZlcnkgY29tbW9uLCBzbyBtYXkgYXMgd2VsbCBtYWtlIHRoZW0gYXZhaWxhYmxlCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7LyogLi4uICovfSIKCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDezwhLS0gLi4uIC0tPn0iCgpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpCmRibFNsYXNoQ29tbWVudCA9IFJlZ2V4KHIiLy8oPzpcXFxufFteXG5dKSoiKS5zZXROYW1lKCIvLyBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svLyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iCgpjcHBTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLyd8IGRibFNsYXNoQ29tbWVudCkuc2V0TmFtZSgiQysrIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiBlaXRoZXIgZm9ybSBDe0x7Y1N0eWxlQ29tbWVudH19IG9yIEN7THtkYmxTbGFzaENvbW1lbnR9fSIKCmphdmFTdHlsZUNvbW1lbnQgPSBjcHBTdHlsZUNvbW1lbnQKIlNhbWUgYXMgQ3tMe2NwcFN0eWxlQ29tbWVudH19IgoKcHl0aG9uU3R5bGVDb21tZW50ID0gUmVnZXgociIjLioiKS5zZXROYW1lKCJQeXRob24gc3R5bGUgY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7IyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iCgpfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUoV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCggV29yZCgiIFx0IikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQpjb21tYVNlcGFyYXRlZExpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWFTZXBhcmF0ZWRMaXN0IikKIiIiKERlcHJlY2F0ZWQpIFByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIgoKIyBzb21lIG90aGVyIHVzZWZ1bCBleHByZXNzaW9ucyAtIHVzaW5nIGxvd2VyLWNhc2UgY2xhc3MgbmFtZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IHVzaW5nIHRoaXMgYXMgYSBuYW1lc3BhY2UKY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoKICAgICIiIgogICAgSGVyZSBhcmUgc29tZSBjb21tb24gbG93LWxldmVsIGV4cHJlc3Npb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiBqdW1wLXN0YXJ0aW5nIHBhcnNlciBkZXZlbG9wbWVudDoKICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pCiAgICAgLSBjb21tb24gTHtwcm9ncmFtbWluZyBpZGVudGlmaWVyczxpZGVudGlmaWVyPn0KICAgICAtIG5ldHdvcmsgYWRkcmVzc2VzIChMe01BQzxtYWNfYWRkcmVzcz59LCBMe0lQdjQ8aXB2NF9hZGRyZXNzPn0sIEx7SVB2NjxpcHY2X2FkZHJlc3M+fSkKICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0KICAgICAtIEx7VVVJRDx1dWlkPn0KICAgICAtIEx7Y29tbWEtc2VwYXJhdGVkIGxpc3Q8Y29tbWFfc2VwYXJhdGVkX2xpc3Q+fQogICAgUGFyc2UgYWN0aW9uczoKICAgICAtIEN7THtjb252ZXJ0VG9JbnRlZ2VyfX0KICAgICAtIEN7THtjb252ZXJ0VG9GbG9hdH19CiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19CiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZXRpbWV9fQogICAgIC0gQ3tMe3N0cmlwSFRNTFRhZ3N9fQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319CiAgICAgLSBDe0x7ZG93bmNhc2VUb2tlbnN9fQoKICAgIEV4YW1wbGU6OgogICAgICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlCiAgICAgICAgICAgIDEwMAogICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICsxMDAKICAgICAgICAgICAgMy4xNDE1OQogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICAgICAgICAgIDEwMAogICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICsxMDAKICAgICAgICAgICAgMy4xNDE1OQogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBoZXggbnVtYmVycwogICAgICAgICAgICAxMDAKICAgICAgICAgICAgRkYKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGZyYWN0aW9ucwogICAgICAgICAgICAxLzIKICAgICAgICAgICAgLTMvNAogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMKICAgICAgICAgICAgMQogICAgICAgICAgICAxLzIKICAgICAgICAgICAgLTMvNAogICAgICAgICAgICAxLTMvNAogICAgICAgICAgICAnJycpCgogICAgICAgIGltcG9ydCB1dWlkCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIHV1aWQKICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiAgICAgICAgICAgICcnJykKICAgIHByaW50czo6CiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQogICAgICAgIDEwMAogICAgICAgIFsxMDBdCgogICAgICAgIC0xMDAKICAgICAgICBbLTEwMF0KCiAgICAgICAgKzEwMAogICAgICAgIFsxMDBdCgogICAgICAgIDMuMTQxNTkKICAgICAgICBbMy4xNDE1OV0KCiAgICAgICAgNi4wMmUyMwogICAgICAgIFs2LjAyZSsyM10KCiAgICAgICAgMWUtMTIKICAgICAgICBbMWUtMTJdCgogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQKICAgICAgICAxMDAKICAgICAgICBbMTAwLjBdCgogICAgICAgIC0xMDAKICAgICAgICBbLTEwMC4wXQoKICAgICAgICArMTAwCiAgICAgICAgWzEwMC4wXQoKICAgICAgICAzLjE0MTU5CiAgICAgICAgWzMuMTQxNTldCgogICAgICAgIDYuMDJlMjMKICAgICAgICBbNi4wMmUrMjNdCgogICAgICAgIDFlLTEyCiAgICAgICAgWzFlLTEyXQoKICAgICAgICAjIGhleCBudW1iZXJzCiAgICAgICAgMTAwCiAgICAgICAgWzI1Nl0KCiAgICAgICAgRkYKICAgICAgICBbMjU1XQoKICAgICAgICAjIGZyYWN0aW9ucwogICAgICAgIDEvMgogICAgICAgIFswLjVdCgogICAgICAgIC0zLzQKICAgICAgICBbLTAuNzVdCgogICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zCiAgICAgICAgMQogICAgICAgIFsxXQoKICAgICAgICAxLzIKICAgICAgICBbMC41XQoKICAgICAgICAtMy80CiAgICAgICAgWy0wLjc1XQoKICAgICAgICAxLTMvNAogICAgICAgIFsxLjc1XQoKICAgICAgICAjIHV1aWQKICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgKICAgICAgICBbVVVJRCgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JyldCiAgICAiIiIKCiAgICBjb252ZXJ0VG9JbnRlZ2VyID0gdG9rZW5NYXAoaW50KQogICAgIiIiCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQKICAgICIiIgoKICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpCiAgICAiIiIKICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgbnVtYmVycyB0byBQeXRob24gZmxvYXQKICAgICIiIgoKICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIgoKICAgIGhleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXROYW1lKCJoZXggaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwxNikpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiIKCiAgICBzaWduZWRfaW50ZWdlciA9IFJlZ2V4KHInWystXT9cZCsnKS5zZXROYW1lKCJzaWduZWQgaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiCgogICAgZnJhY3Rpb24gPSAoc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkgKyAnLycgKyBzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSkuc2V0TmFtZSgiZnJhY3Rpb24iKQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiIKICAgIGZyYWN0aW9uLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0OiB0WzBdL3RbLTFdKQoKICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpCiAgICAiIiJtaXhlZCBpbnRlZ2VyIG9mIHRoZSBmb3JtICdpbnRlZ2VyIC0gZnJhY3Rpb24nLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgaW50ZWdlciwgcmV0dXJucyBmbG9hdCIiIgogICAgbWl4ZWRfaW50ZWdlci5hZGRQYXJzZUFjdGlvbihzdW0pCgogICAgcmVhbCA9IFJlZ2V4KHInWystXT9cZCtcLlxkKicpLnNldE5hbWUoInJlYWwgbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm5zIGEgZmxvYXQiIiIKCiAgICBzY2lfcmVhbCA9IFJlZ2V4KHInWystXT9cZCsoW2VFXVsrLV0/XGQrfFwuXGQqKFtlRV1bKy1dP1xkKyk/KScpLnNldE5hbWUoInJlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIG9wdGlvbmFsIHNjaWVudGlmaWMgbm90YXRpb24gYW5kIHJldHVybnMgYSBmbG9hdCIiIgoKICAgICMgc3RyZWFtbGluaW5nIHRoaXMgZXhwcmVzc2lvbiBtYWtlcyB0aGUgZG9jcyBuaWNlci1sb29raW5nCiAgICBudW1iZXIgPSAoc2NpX3JlYWwgfCByZWFsIHwgc2lnbmVkX2ludGVnZXIpLnN0cmVhbWxpbmUoKQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIgoKICAgIGZudW1iZXIgPSBSZWdleChyJ1srLV0/XGQrXC4/XGQqKFtlRV1bKy1dP1xkKyk/Jykuc2V0TmFtZSgiZm51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiIKICAgIAogICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykuc2V0TmFtZSgiaWRlbnRpZmllciIpCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiIKICAgIAogICAgaXB2NF9hZGRyZXNzID0gUmVnZXgocicoMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKFwuKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KSl7M30nKS5zZXROYW1lKCJJUHY0IGFkZHJlc3MiKQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiCgogICAgX2lwdjZfcGFydCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17MSw0fScpLnNldE5hbWUoImhleF9pbnRlZ2VyIikKICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikKICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MgPSAoT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkgKyAiOjoiICsgT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkpLnNldE5hbWUoInNob3J0IElQdjYgYWRkcmVzcyIpCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzLmFkZENvbmRpdGlvbihsYW1iZGEgdDogc3VtKDEgZm9yIHR0IGluIHQgaWYgcHlwYXJzaW5nX2NvbW1vbi5faXB2Nl9wYXJ0Lm1hdGNoZXModHQpKSA8IDgpCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikKICAgIGlwdjZfYWRkcmVzcyA9IENvbWJpbmUoKF9mdWxsX2lwdjZfYWRkcmVzcyB8IF9taXhlZF9pcHY2X2FkZHJlc3MgfCBfc2hvcnRfaXB2Nl9hZGRyZXNzKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKSkuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikKICAgICJJUHY2IGFkZHJlc3MgKGxvbmcsIHNob3J0LCBvciBtaXhlZCBmb3JtKSIKICAgIAogICAgbWFjX2FkZHJlc3MgPSBSZWdleChyJ1swLTlhLWZBLUZdezJ9KFs6Li1dKVswLTlhLWZBLUZdezJ9KD86XDFbMC05YS1mQS1GXXsyfSl7NH0nKS5zZXROYW1lKCJNQUMgYWRkcmVzcyIpCiAgICAiTUFDIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHggKG1heSBhbHNvIGhhdmUgJy0nIG9yICcuJyBkZWxpbWl0ZXJzKSIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgY29udmVydFRvRGF0ZShmbXQ9IiVZLSVtLSVkIik6CiAgICAgICAgIiIiCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGUKCiAgICAgICAgUGFyYW1zIC0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkIn0pCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkYXRlX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZS5jb3B5KCkKICAgICAgICAgICAgZGF0ZV9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZSgpKQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZSgxOTk5LCAxMiwgMzEpXQogICAgICAgICIiIgogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQogICAgICAgIHJldHVybiBjdnRfZm4KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGV0aW1lIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZXRpbWUKCiAgICAgICAgUGFyYW1zIC0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkVCVIOiVNOiVTLiVmIn0pCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkdF9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGV0aW1lLmNvcHkoKQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkKICAgICAgICAgICAgcHJpbnQoZHRfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMVQyMzo1OTo1OS45OTkiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQogICAgICAgICIiIgogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpCiAgICAgICAgcmV0dXJuIGN2dF9mbgoKICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpCiAgICAiSVNPODYwMSBkYXRlIChDe3l5eXktbW0tZGR9KSIKCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQogICAgIklTTzg2MDEgZGF0ZXRpbWUgKEN7eXl5eS1tbS1kZFRoaDptbTpzcy5zKFp8Ky0wMDowMCl9KSAtIHRyYWlsaW5nIHNlY29uZHMsIG1pbGxpc2Vjb25kcywgYW5kIHRpbWV6b25lIG9wdGlvbmFsOyBhY2NlcHRzIHNlcGFyYXRpbmcgQ3snVCd9IG9yIEN7JyAnfSIKCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQogICAgIlVVSUQgKEN7eHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4fSkiCgogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc3RyaXBIVE1MVGFncyhzLCBsLCB0b2tlbnMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGFjdGlvbiB0byByZW1vdmUgSFRNTCB0YWdzIGZyb20gd2ViIHBhZ2UgSFRNTCBzb3VyY2UKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgc3RyaXAgSFRNTCBsaW5rcyBmcm9tIG5vcm1hbCB0ZXh0IAogICAgICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQogICAgICAgICAgICB0YWJsZV90ZXh0ID0gdGQgKyBTa2lwVG8odGRfZW5kKS5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLnN0cmlwSFRNTFRhZ3MpKCJib2R5IikgKyB0ZF9lbmQKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJwogICAgICAgICIiIgogICAgICAgIHJldHVybiBweXBhcnNpbmdfY29tbW9uLl9odG1sX3N0cmlwcGVyLnRyYW5zZm9ybVN0cmluZyh0b2tlbnNbMF0pCgogICAgX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT3B0aW9uYWwoIFdoaXRlKCIgXHQiKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikKICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikKICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIgoKICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiIKCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiIKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgoKICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQoKICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpCgogICAgY29sdW1uTmFtZSAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikKICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQoKICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykKICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQogICAgCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQoKICAgICMgZGVtbyBydW5UZXN0cyBtZXRob2QsIGluY2x1ZGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0ZXN0IHN0cmluZwogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIgogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQogICAgICAgIHNlbGVjdCAqIGZyb20gU1lTLlhZWlpZCgogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiCiAgICAgICAgU0VMRUNUICogZnJvbSBYWVpaWSwgQUJDCgogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkCiAgICAgICAgU2VsZWN0IEFBLEJCLENDIGZyb20gU3lzLmR1YWwKCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMKICAgICAgICBTZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsLCBUYWJsZTIKCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwKICAgICAgICBYZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsCgogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwKICAgICAgICBTZWxlY3QKCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwKICAgICAgICBTZWxlY3QgXl5eIGZyb3ggU3lzLmR1YWwKCiAgICAgICAgIiIiKQoKICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIC0xMDAKICAgICAgICArMTAwCiAgICAgICAgMy4xNDE1OQogICAgICAgIDYuMDJlMjMKICAgICAgICAxZS0xMgogICAgICAgICIiIikKCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiCiAgICAgICAgMTAwCiAgICAgICAgLTEwMAogICAgICAgICsxMDAKICAgICAgICAzLjE0MTU5CiAgICAgICAgNi4wMmUyMwogICAgICAgIDFlLTEyCiAgICAgICAgIiIiKQoKICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiCiAgICAgICAgMTAwCiAgICAgICAgRkYKICAgICAgICAiIiIpCgogICAgaW1wb3J0IHV1aWQKICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCIiIgogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OAogICAgICAgICIiIikKUEsDBBQAAAAAAAAAIQBgHgeNBQMAAAUDAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlLXZlbmRvci5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBwaXAKaW1wb3J0IGdsb2IKaW1wb3J0IHNodXRpbAoKaGVyZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQoKZGVmIHVzYWdlKCk6CiAgICBwcmludCgiVXNhZ2U6IHJlLXZlbmRvci5weSBbY2xlYW58dmVuZG9yXSIpCiAgICBzeXMuZXhpdCgxKQoKZGVmIGNsZWFuKCk6CiAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihoZXJlKToKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKGhlcmUsIGZuKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZGlybmFtZSkKICAgICMgc2l4IGlzIGEgc2luZ2xlIGZpbGUsIG5vdCBhIHBhY2thZ2UKICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oaGVyZSwgJ3NpeC5weScpKQoKZGVmIHZlbmRvcigpOgogICAgcGlwLm1haW4oWydpbnN0YWxsJywgJy10JywgaGVyZSwgJy1yJywgJ3ZlbmRvci50eHQnXSkKICAgIGZvciBkaXJuYW1lIGluIGdsb2IuZ2xvYignKi5lZ2ctaW5mbycpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZGlybmFtZSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CiAgICAgICAgdXNhZ2UoKQogICAgaWYgc3lzLmFyZ3ZbMV0gPT0gJ2NsZWFuJzoKICAgICAgICBjbGVhbigpCiAgICBlbGlmIHN5cy5hcmd2WzFdID09ICd2ZW5kb3InOgogICAgICAgIHZlbmRvcigpCiAgICBlbHNlOgogICAgICAgIHVzYWdlKCkKUEsDBBQAAAAAAAAAIQAfxu4w9w0AAPcNAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19faW5pdF9fLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgICBfXwojICAvX18pICBfICBfICAgICBfICAgXyBfLyAgIF8KIyAvICggICAoLSAoLyAoLyAoLSBfKSAgLyAgXykKIyAgICAgICAgICAvCgoiIiIKUmVxdWVzdHMgSFRUUCBMaWJyYXJ5Cn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKUmVxdWVzdHMgaXMgYW4gSFRUUCBsaWJyYXJ5LCB3cml0dGVuIGluIFB5dGhvbiwgZm9yIGh1bWFuIGJlaW5ncy4gQmFzaWMgR0VUCnVzYWdlOgoKICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICA+Pj4gciA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly93d3cucHl0aG9uLm9yZycpCiAgID4+PiByLnN0YXR1c19jb2RlCiAgIDIwMAogICA+Pj4gJ1B5dGhvbiBpcyBhIHByb2dyYW1taW5nIGxhbmd1YWdlJyBpbiByLmNvbnRlbnQKICAgVHJ1ZQoKLi4uIG9yIFBPU1Q6CgogICA+Pj4gcGF5bG9hZCA9IGRpY3Qoa2V5MT0ndmFsdWUxJywga2V5Mj0ndmFsdWUyJykKICAgPj4+IHIgPSByZXF1ZXN0cy5wb3N0KCdodHRwOi8vaHR0cGJpbi5vcmcvcG9zdCcsIGRhdGE9cGF5bG9hZCkKICAgPj4+IHByaW50KHIudGV4dCkKICAgewogICAgIC4uLgogICAgICJmb3JtIjogewogICAgICAgImtleTIiOiAidmFsdWUyIiwKICAgICAgICJrZXkxIjogInZhbHVlMSIKICAgICB9LAogICAgIC4uLgogICB9CgpUaGUgb3RoZXIgSFRUUCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgLSBzZWUgYHJlcXVlc3RzLmFwaWAuIEZ1bGwgZG9jdW1lbnRhdGlvbgppcyBhdCA8aHR0cDovL3B5dGhvbi1yZXF1ZXN0cy5vcmc+LgoKOmNvcHlyaWdodDogKGMpIDIwMTcgYnkgS2VubmV0aCBSZWl0ei4KOmxpY2Vuc2U6IEFwYWNoZSAyLjAsIHNlZSBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCiIiIgoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgdXJsbGliMwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjaGFyZGV0CmltcG9ydCB3YXJuaW5ncwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nCgoKZGVmIGNoZWNrX2NvbXBhdGliaWxpdHkodXJsbGliM192ZXJzaW9uLCBjaGFyZGV0X3ZlcnNpb24pOgogICAgdXJsbGliM192ZXJzaW9uID0gdXJsbGliM192ZXJzaW9uLnNwbGl0KCcuJykKICAgIGFzc2VydCB1cmxsaWIzX3ZlcnNpb24gIT0gWydkZXYnXSAgIyBWZXJpZnkgdXJsbGliMyBpc24ndCBpbnN0YWxsZWQgZnJvbSBnaXQuCgogICAgIyBTb21ldGltZXMsIHVybGxpYjMgb25seSByZXBvcnRzIGl0cyB2ZXJzaW9uIGFzIDE2LjEuCiAgICBpZiBsZW4odXJsbGliM192ZXJzaW9uKSA9PSAyOgogICAgICAgIHVybGxpYjNfdmVyc2lvbi5hcHBlbmQoJzAnKQoKICAgICMgQ2hlY2sgdXJsbGliMyBmb3IgY29tcGF0aWJpbGl0eS4KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSB1cmxsaWIzX3ZlcnNpb24gICMgbm9xYTogRjgxMQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGludChtYWpvciksIGludChtaW5vciksIGludChwYXRjaCkKICAgICMgdXJsbGliMyA+PSAxLjIxLjEsIDw9IDEuMjIKICAgIGFzc2VydCBtYWpvciA9PSAxCiAgICBhc3NlcnQgbWlub3IgPj0gMjEKICAgIGFzc2VydCBtaW5vciA8PSAyMgoKICAgICMgQ2hlY2sgY2hhcmRldCBmb3IgY29tcGF0aWJpbGl0eS4KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBjaGFyZGV0X3ZlcnNpb24uc3BsaXQoJy4nKVs6M10KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBpbnQobWFqb3IpLCBpbnQobWlub3IpLCBpbnQocGF0Y2gpCiAgICAjIGNoYXJkZXQgPj0gMy4wLjIsIDwgMy4xLjAKICAgIGFzc2VydCBtYWpvciA9PSAzCiAgICBhc3NlcnQgbWlub3IgPCAxCiAgICBhc3NlcnQgcGF0Y2ggPj0gMgoKCiMgQ2hlY2sgaW1wb3J0ZWQgZGVwZW5kZW5jaWVzIGZvciBjb21wYXRpYmlsaXR5Lgp0cnk6CiAgICBjaGVja19jb21wYXRpYmlsaXR5KHVybGxpYjMuX192ZXJzaW9uX18sIGNoYXJkZXQuX192ZXJzaW9uX18pCmV4Y2VwdCAoQXNzZXJ0aW9uRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgd2FybmluZ3Mud2FybigidXJsbGliMyAoezB9KSBvciBjaGFyZGV0ICh7MX0pIGRvZXNuJ3QgbWF0Y2ggYSBzdXBwb3J0ZWQgIgogICAgICAgICAgICAgICAgICAidmVyc2lvbiEiLmZvcm1hdCh1cmxsaWIzLl9fdmVyc2lvbl9fLCBjaGFyZGV0Ll9fdmVyc2lvbl9fKSwKICAgICAgICAgICAgICAgICAgUmVxdWVzdHNEZXBlbmRlbmN5V2FybmluZykKCiMgQXR0ZW1wdCB0byBlbmFibGUgdXJsbGliMydzIFNOSSBzdXBwb3J0LCBpZiBwb3NzaWJsZQojIHRyeToKIyAgICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmNvbnRyaWIgaW1wb3J0IHB5b3BlbnNzbAojICAgICBweW9wZW5zc2wuaW5qZWN0X2ludG9fdXJsbGliMygpCiMgZXhjZXB0IEltcG9ydEVycm9yOgojICAgICBwYXNzCgojIHVybGxpYjMncyBEZXBlbmRlbmN5V2FybmluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXBlbmRlbmN5V2FybmluZykKCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX3RpdGxlX18sIF9fZGVzY3JpcHRpb25fXywgX191cmxfXywgX192ZXJzaW9uX18KZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fYnVpbGRfXywgX19hdXRob3JfXywgX19hdXRob3JfZW1haWxfXywgX19saWNlbnNlX18KZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fY29weXJpZ2h0X18sIF9fY2FrZV9fCgpmcm9tIC4gaW1wb3J0IHV0aWxzCmZyb20gLiBpbXBvcnQgcGFja2FnZXMKZnJvbSAubW9kZWxzIGltcG9ydCBSZXF1ZXN0LCBSZXNwb25zZSwgUHJlcGFyZWRSZXF1ZXN0CmZyb20gLmFwaSBpbXBvcnQgcmVxdWVzdCwgZ2V0LCBoZWFkLCBwb3N0LCBwYXRjaCwgcHV0LCBkZWxldGUsIG9wdGlvbnMKZnJvbSAuc2Vzc2lvbnMgaW1wb3J0IHNlc3Npb24sIFNlc3Npb24KZnJvbSAuc3RhdHVzX2NvZGVzIGltcG9ydCBjb2Rlcwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBSZXF1ZXN0RXhjZXB0aW9uLCBUaW1lb3V0LCBVUkxSZXF1aXJlZCwKICAgIFRvb01hbnlSZWRpcmVjdHMsIEhUVFBFcnJvciwgQ29ubmVjdGlvbkVycm9yLAogICAgRmlsZU1vZGVXYXJuaW5nLCBDb25uZWN0VGltZW91dCwgUmVhZFRpbWVvdXQKKQoKIyBTZXQgZGVmYXVsdCBsb2dnaW5nIGhhbmRsZXIgdG8gYXZvaWQgIk5vIGhhbmRsZXIgZm91bmQiIHdhcm5pbmdzLgppbXBvcnQgbG9nZ2luZwp0cnk6ICAjIFB5dGhvbiAyLjcrCiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgICAgcGFzcwoKbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKCiMgRmlsZU1vZGVXYXJuaW5ncyBnbyBvZmYgcGVyIHRoZSBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBGaWxlTW9kZVdhcm5pbmcsIGFwcGVuZD1UcnVlKQpQSwMEFAAAAAAAAAAhAN98eSW0AQAAtAEAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX192ZXJzaW9uX18ucHkjIC4tLiAuLS4gLi0uIC4gLiAuLS4gLi0uIC4tLiAuLS4KIyB8KCAgfC0gIHwufCB8IHwgfC0gIGAtLiAgfCAgYC0uCiMgJyAnIGAtJyBgLWAuYC0nIGAtJyBgLScgICcgIGAtJwoKX190aXRsZV9fID0gJ3JlcXVlc3RzJwpfX2Rlc2NyaXB0aW9uX18gPSAnUHl0aG9uIEhUVFAgZm9yIEh1bWFucy4nCl9fdXJsX18gPSAnaHR0cDovL3B5dGhvbi1yZXF1ZXN0cy5vcmcnCl9fdmVyc2lvbl9fID0gJzIuMTguNCcKX19idWlsZF9fID0gMHgwMjE4MDQKX19hdXRob3JfXyA9ICdLZW5uZXRoIFJlaXR6JwpfX2F1dGhvcl9lbWFpbF9fID0gJ21lQGtlbm5ldGhyZWl0ei5vcmcnCl9fbGljZW5zZV9fID0gJ0FwYWNoZSAyLjAnCl9fY29weXJpZ2h0X18gPSAnQ29weXJpZ2h0IDIwMTcgS2VubmV0aCBSZWl0eicKX19jYWtlX18gPSB1J1x1MjcyOCBcVTAwMDFmMzcwIFx1MjcyOCcKUEsDBBQAAAAAAAAAIQCIqTm7SAQAAEgEAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19pbnRlcm5hbF91dGlscy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuX2ludGVybmFsX3V0aWxzCn5+fn5+fn5+fn5+fn5+CgpQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSBjb25zdW1lZCBpbnRlcm5hbGx5IGJ5IFJlcXVlc3RzCndoaWNoIGRlcGVuZCBvbiBleHRyZW1lbHkgZmV3IGV4dGVybmFsIGhlbHBlcnMgKHN1Y2ggYXMgY29tcGF0KQoiIiIKCmZyb20gLmNvbXBhdCBpbXBvcnQgaXNfcHkyLCBidWlsdGluX3N0ciwgc3RyCgoKZGVmIHRvX25hdGl2ZV9zdHJpbmcoc3RyaW5nLCBlbmNvZGluZz0nYXNjaWknKToKICAgICIiIkdpdmVuIGEgc3RyaW5nIG9iamVjdCwgcmVnYXJkbGVzcyBvZiB0eXBlLCByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YKICAgIHRoYXQgc3RyaW5nIGluIHRoZSBuYXRpdmUgc3RyaW5nIHR5cGUsIGVuY29kaW5nIGFuZCBkZWNvZGluZyB3aGVyZQogICAgbmVjZXNzYXJ5LiBUaGlzIGFzc3VtZXMgQVNDSUkgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cmluZywgYnVpbHRpbl9zdHIpOgogICAgICAgIG91dCA9IHN0cmluZwogICAgZWxzZToKICAgICAgICBpZiBpc19weTI6CiAgICAgICAgICAgIG91dCA9IHN0cmluZy5lbmNvZGUoZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3V0ID0gc3RyaW5nLmRlY29kZShlbmNvZGluZykKCiAgICByZXR1cm4gb3V0CgoKZGVmIHVuaWNvZGVfaXNfYXNjaWkodV9zdHJpbmcpOgogICAgIiIiRGV0ZXJtaW5lIGlmIHVuaWNvZGUgc3RyaW5nIG9ubHkgY29udGFpbnMgQVNDSUkgY2hhcmFjdGVycy4KCiAgICA6cGFyYW0gc3RyIHVfc3RyaW5nOiB1bmljb2RlIHN0cmluZyB0byBjaGVjay4gTXVzdCBiZSB1bmljb2RlCiAgICAgICAgYW5kIG5vdCBQeXRob24gMiBgc3RyYC4KICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICBhc3NlcnQgaXNpbnN0YW5jZSh1X3N0cmluZywgc3RyKQogICAgdHJ5OgogICAgICAgIHVfc3RyaW5nLmVuY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQpQSwMEFAAAAAAAAAAhACNQ3lIYUgAAGFIAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmFkYXB0ZXJzCn5+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgdHJhbnNwb3J0IGFkYXB0ZXJzIHRoYXQgUmVxdWVzdHMgdXNlcyB0byBkZWZpbmUKYW5kIG1haW50YWluIGNvbm5lY3Rpb25zLgoiIiIKCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzb2NrZXQKCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5wb29sbWFuYWdlciBpbXBvcnQgUG9vbE1hbmFnZXIsIHByb3h5X2Zyb21fdXJsCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsIGltcG9ydCBUaW1lb3V0IGFzIFRpbWVvdXRTYXVjZQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IENsb3NlZFBvb2xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgQ29ubmVjdFRpbWVvdXRFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSFRUUEVycm9yIGFzIF9IVFRQRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IE1heFJldHJ5RXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IE5ld0Nvbm5lY3Rpb25FcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUHJveHlFcnJvciBhcyBfUHJveHlFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUHJvdG9jb2xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUmVhZFRpbWVvdXRFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgU1NMRXJyb3IgYXMgX1NTTEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBSZXNwb25zZUVycm9yCgpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlc3BvbnNlCmZyb20gLmNvbXBhdCBpbXBvcnQgdXJscGFyc2UsIGJhc2VzdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IChERUZBVUxUX0NBX0JVTkRMRV9QQVRILCBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZCwgZ2V0X2F1dGhfZnJvbV91cmwsIHVybGRlZnJhZ2F1dGgsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3Byb3h5KQpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmNvb2tpZXMgaW1wb3J0IGV4dHJhY3RfY29va2llc190b19qYXIKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKENvbm5lY3Rpb25FcnJvciwgQ29ubmVjdFRpbWVvdXQsIFJlYWRUaW1lb3V0LCBTU0xFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5RXJyb3IsIFJldHJ5RXJyb3IsIEludmFsaWRTY2hlbWEpCmZyb20gLmF1dGggaW1wb3J0IF9iYXNpY19hdXRoX3N0cgoKdHJ5OgogICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmNvbnRyaWIuc29ja3MgaW1wb3J0IFNPQ0tTUHJveHlNYW5hZ2VyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBTT0NLU1Byb3h5TWFuYWdlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJhaXNlIEludmFsaWRTY2hlbWEoIk1pc3NpbmcgZGVwZW5kZW5jaWVzIGZvciBTT0NLUyBzdXBwb3J0LiIpCgpERUZBVUxUX1BPT0xCTE9DSyA9IEZhbHNlCkRFRkFVTFRfUE9PTFNJWkUgPSAxMApERUZBVUxUX1JFVFJJRVMgPSAwCkRFRkFVTFRfUE9PTF9USU1FT1VUID0gTm9uZQoKCmNsYXNzIEJhc2VBZGFwdGVyKG9iamVjdCk6CiAgICAiIiJUaGUgQmFzZSBUcmFuc3BvcnQgQWRhcHRlciIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCYXNlQWRhcHRlciwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9VHJ1ZSwKICAgICAgICAgICAgIGNlcnQ9Tm9uZSwgcHJveGllcz1Ob25lKToKICAgICAgICAiIiJTZW5kcyBQcmVwYXJlZFJlcXVlc3Qgb2JqZWN0LiBSZXR1cm5zIFJlc3BvbnNlIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgYmVpbmcgc2VudC4KICAgICAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIFdoZXRoZXIgdG8gc3RyZWFtIHRoZSByZXF1ZXN0IGNvbnRlbnQuCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzZW5kCiAgICAgICAgICAgIGRhdGEgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LAogICAgICAgICAgICByZWFkIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgICAgIDp0eXBlIHRpbWVvdXQ6IGZsb2F0IG9yIHR1cGxlCiAgICAgICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIEFueSB1c2VyLXByb3ZpZGVkIFNTTCBjZXJ0aWZpY2F0ZSB0byBiZSB0cnVzdGVkLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIFRoZSBwcm94aWVzIGRpY3Rpb25hcnkgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbGVhbnMgdXAgYWRhcHRlciBzcGVjaWZpYyBpdGVtcy4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgSFRUUEFkYXB0ZXIoQmFzZUFkYXB0ZXIpOgogICAgIiIiVGhlIGJ1aWx0LWluIEhUVFAgQWRhcHRlciBmb3IgdXJsbGliMy4KCiAgICBQcm92aWRlcyBhIGdlbmVyYWwtY2FzZSBpbnRlcmZhY2UgZm9yIFJlcXVlc3RzIHNlc3Npb25zIHRvIGNvbnRhY3QgSFRUUCBhbmQKICAgIEhUVFBTIHVybHMgYnkgaW1wbGVtZW50aW5nIHRoZSBUcmFuc3BvcnQgQWRhcHRlciBpbnRlcmZhY2UuIFRoaXMgY2xhc3Mgd2lsbAogICAgdXN1YWxseSBiZSBjcmVhdGVkIGJ5IHRoZSA6Y2xhc3M6YFNlc3Npb24gPFNlc3Npb24+YCBjbGFzcyB1bmRlciB0aGUKICAgIGNvdmVycy4KCiAgICA6cGFyYW0gcG9vbF9jb25uZWN0aW9uczogVGhlIG51bWJlciBvZiB1cmxsaWIzIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUuCiAgICA6cGFyYW0gcG9vbF9tYXhzaXplOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSBpbiB0aGUgcG9vbC4KICAgIDpwYXJhbSBtYXhfcmV0cmllczogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZWFjaCBjb25uZWN0aW9uCiAgICAgICAgc2hvdWxkIGF0dGVtcHQuIE5vdGUsIHRoaXMgYXBwbGllcyBvbmx5IHRvIGZhaWxlZCBETlMgbG9va3Vwcywgc29ja2V0CiAgICAgICAgY29ubmVjdGlvbnMgYW5kIGNvbm5lY3Rpb24gdGltZW91dHMsIG5ldmVyIHRvIHJlcXVlc3RzIHdoZXJlIGRhdGEgaGFzCiAgICAgICAgbWFkZSBpdCB0byB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCBSZXF1ZXN0cyBkb2VzIG5vdCByZXRyeSBmYWlsZWQKICAgICAgICBjb25uZWN0aW9ucy4gSWYgeW91IG5lZWQgZ3JhbnVsYXIgY29udHJvbCBvdmVyIHRoZSBjb25kaXRpb25zIHVuZGVyCiAgICAgICAgd2hpY2ggd2UgcmV0cnkgYSByZXF1ZXN0LCBpbXBvcnQgdXJsbGliMydzIGBgUmV0cnlgYCBjbGFzcyBhbmQgcGFzcwogICAgICAgIHRoYXQgaW5zdGVhZC4KICAgIDpwYXJhbSBwb29sX2Jsb2NrOiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIHBvb2wgc2hvdWxkIGJsb2NrIGZvciBjb25uZWN0aW9ucy4KCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBhID0gcmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXIobWF4X3JldHJpZXM9MykKICAgICAgPj4+IHMubW91bnQoJ2h0dHA6Ly8nLCBhKQogICAgIiIiCiAgICBfX2F0dHJzX18gPSBbJ21heF9yZXRyaWVzJywgJ2NvbmZpZycsICdfcG9vbF9jb25uZWN0aW9ucycsICdfcG9vbF9tYXhzaXplJywKICAgICAgICAgICAgICAgICAnX3Bvb2xfYmxvY2snXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sX2Nvbm5lY3Rpb25zPURFRkFVTFRfUE9PTFNJWkUsCiAgICAgICAgICAgICAgICAgcG9vbF9tYXhzaXplPURFRkFVTFRfUE9PTFNJWkUsIG1heF9yZXRyaWVzPURFRkFVTFRfUkVUUklFUywKICAgICAgICAgICAgICAgICBwb29sX2Jsb2NrPURFRkFVTFRfUE9PTEJMT0NLKToKICAgICAgICBpZiBtYXhfcmV0cmllcyA9PSBERUZBVUxUX1JFVFJJRVM6CiAgICAgICAgICAgIHNlbGYubWF4X3JldHJpZXMgPSBSZXRyeSgwLCByZWFkPUZhbHNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4X3JldHJpZXMgPSBSZXRyeS5mcm9tX2ludChtYXhfcmV0cmllcykKICAgICAgICBzZWxmLmNvbmZpZyA9IHt9CiAgICAgICAgc2VsZi5wcm94eV9tYW5hZ2VyID0ge30KCiAgICAgICAgc3VwZXIoSFRUUEFkYXB0ZXIsIHNlbGYpLl9faW5pdF9fKCkKCiAgICAgICAgc2VsZi5fcG9vbF9jb25uZWN0aW9ucyA9IHBvb2xfY29ubmVjdGlvbnMKICAgICAgICBzZWxmLl9wb29sX21heHNpemUgPSBwb29sX21heHNpemUKICAgICAgICBzZWxmLl9wb29sX2Jsb2NrID0gcG9vbF9ibG9jawoKICAgICAgICBzZWxmLmluaXRfcG9vbG1hbmFnZXIocG9vbF9jb25uZWN0aW9ucywgcG9vbF9tYXhzaXplLCBibG9jaz1wb29sX2Jsb2NrKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGRpY3QoKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpIGZvciBhdHRyIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2F0dHJzX18pCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgIyBDYW4ndCBoYW5kbGUgYnkgYWRkaW5nICdwcm94eV9tYW5hZ2VyJyB0byBzZWxmLl9fYXR0cnNfXyBiZWNhdXNlCiAgICAgICAgIyBzZWxmLnBvb2xtYW5hZ2VyIHVzZXMgYSBsYW1iZGEgZnVuY3Rpb24sIHdoaWNoIGlzbid0IHBpY2tsZWFibGUuCiAgICAgICAgc2VsZi5wcm94eV9tYW5hZ2VyID0ge30KICAgICAgICBzZWxmLmNvbmZpZyA9IHt9CgogICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQoKICAgICAgICBzZWxmLmluaXRfcG9vbG1hbmFnZXIoc2VsZi5fcG9vbF9jb25uZWN0aW9ucywgc2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1zZWxmLl9wb29sX2Jsb2NrKQoKICAgIGRlZiBpbml0X3Bvb2xtYW5hZ2VyKHNlbGYsIGNvbm5lY3Rpb25zLCBtYXhzaXplLCBibG9jaz1ERUZBVUxUX1BPT0xCTE9DSywgKipwb29sX2t3YXJncyk6CiAgICAgICAgIiIiSW5pdGlhbGl6ZXMgYSB1cmxsaWIzIFBvb2xNYW5hZ2VyLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkKICAgICAgICBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gY29ubmVjdGlvbnM6IFRoZSBudW1iZXIgb2YgdXJsbGliMyBjb25uZWN0aW9uIHBvb2xzIHRvIGNhY2hlLgogICAgICAgIDpwYXJhbSBtYXhzaXplOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSBpbiB0aGUgcG9vbC4KICAgICAgICA6cGFyYW0gYmxvY2s6IEJsb2NrIHdoZW4gbm8gZnJlZSBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLgogICAgICAgIDpwYXJhbSBwb29sX2t3YXJnczogRXh0cmEga2V5d29yZCBhcmd1bWVudHMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBQb29sIE1hbmFnZXIuCiAgICAgICAgIiIiCiAgICAgICAgIyBzYXZlIHRoZXNlIHZhbHVlcyBmb3IgcGlja2xpbmcKICAgICAgICBzZWxmLl9wb29sX2Nvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMKICAgICAgICBzZWxmLl9wb29sX21heHNpemUgPSBtYXhzaXplCiAgICAgICAgc2VsZi5fcG9vbF9ibG9jayA9IGJsb2NrCgogICAgICAgIHNlbGYucG9vbG1hbmFnZXIgPSBQb29sTWFuYWdlcihudW1fcG9vbHM9Y29ubmVjdGlvbnMsIG1heHNpemU9bWF4c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s9YmxvY2ssIHN0cmljdD1UcnVlLCAqKnBvb2xfa3dhcmdzKQoKICAgIGRlZiBwcm94eV9tYW5hZ2VyX2ZvcihzZWxmLCBwcm94eSwgKipwcm94eV9rd2FyZ3MpOgogICAgICAgICIiIlJldHVybiB1cmxsaWIzIFByb3h5TWFuYWdlciBmb3IgdGhlIGdpdmVuIHByb3h5LgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkKICAgICAgICBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcHJveHk6IFRoZSBwcm94eSB0byByZXR1cm4gYSB1cmxsaWIzIFByb3h5TWFuYWdlciBmb3IuCiAgICAgICAgOnBhcmFtIHByb3h5X2t3YXJnczogRXh0cmEga2V5d29yZCBhcmd1bWVudHMgdXNlZCB0byBjb25maWd1cmUgdGhlIFByb3h5IE1hbmFnZXIuCiAgICAgICAgOnJldHVybnM6IFByb3h5TWFuYWdlcgogICAgICAgIDpydHlwZTogdXJsbGliMy5Qcm94eU1hbmFnZXIKICAgICAgICAiIiIKICAgICAgICBpZiBwcm94eSBpbiBzZWxmLnByb3h5X21hbmFnZXI6CiAgICAgICAgICAgIG1hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJbcHJveHldCiAgICAgICAgZWxpZiBwcm94eS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3NvY2tzJyk6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKHByb3h5KQogICAgICAgICAgICBtYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyW3Byb3h5XSA9IFNPQ0tTUHJveHlNYW5hZ2VyKAogICAgICAgICAgICAgICAgcHJveHksCiAgICAgICAgICAgICAgICB1c2VybmFtZT11c2VybmFtZSwKICAgICAgICAgICAgICAgIHBhc3N3b3JkPXBhc3N3b3JkLAogICAgICAgICAgICAgICAgbnVtX3Bvb2xzPXNlbGYuX3Bvb2xfY29ubmVjdGlvbnMsCiAgICAgICAgICAgICAgICBtYXhzaXplPXNlbGYuX3Bvb2xfbWF4c2l6ZSwKICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2ssCiAgICAgICAgICAgICAgICAqKnByb3h5X2t3YXJncwogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJveHlfaGVhZGVycyA9IHNlbGYucHJveHlfaGVhZGVycyhwcm94eSkKICAgICAgICAgICAgbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcltwcm94eV0gPSBwcm94eV9mcm9tX3VybCgKICAgICAgICAgICAgICAgIHByb3h5LAogICAgICAgICAgICAgICAgcHJveHlfaGVhZGVycz1wcm94eV9oZWFkZXJzLAogICAgICAgICAgICAgICAgbnVtX3Bvb2xzPXNlbGYuX3Bvb2xfY29ubmVjdGlvbnMsCiAgICAgICAgICAgICAgICBtYXhzaXplPXNlbGYuX3Bvb2xfbWF4c2l6ZSwKICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2ssCiAgICAgICAgICAgICAgICAqKnByb3h5X2t3YXJncykKCiAgICAgICAgcmV0dXJuIG1hbmFnZXIKCiAgICBkZWYgY2VydF92ZXJpZnkoc2VsZiwgY29ubiwgdXJsLCB2ZXJpZnksIGNlcnQpOgogICAgICAgICIiIlZlcmlmeSBhIFNTTCBjZXJ0aWZpY2F0ZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyCiAgICAgICAgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIGNvbm46IFRoZSB1cmxsaWIzIGNvbm5lY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2VydC4KICAgICAgICA6cGFyYW0gdXJsOiBUaGUgcmVxdWVzdGVkIFVSTC4KICAgICAgICA6cGFyYW0gdmVyaWZ5OiBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHZlcmlmeS4KICAgICAgICAiIiIKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdodHRwcycpIGFuZCB2ZXJpZnk6CgogICAgICAgICAgICBjZXJ0X2xvYyA9IE5vbmUKCiAgICAgICAgICAgICMgQWxsb3cgc2VsZi1zcGVjaWZpZWQgY2VydCBsb2NhdGlvbi4KICAgICAgICAgICAgaWYgdmVyaWZ5IGlzIG5vdCBUcnVlOgogICAgICAgICAgICAgICAgY2VydF9sb2MgPSB2ZXJpZnkKCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0X2xvYzoKICAgICAgICAgICAgICAgIGNlcnRfbG9jID0gREVGQVVMVF9DQV9CVU5ETEVfUEFUSAoKICAgICAgICAgICAgaWYgbm90IGNlcnRfbG9jIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhjZXJ0X2xvYyk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIFRMUyBDQSBjZXJ0aWZpY2F0ZSBidW5kbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY2VydF9sb2MpKQoKICAgICAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGNlcnRfbG9jKToKICAgICAgICAgICAgICAgIGNvbm4uY2FfY2VydHMgPSBjZXJ0X2xvYwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29ubi5jYV9jZXJ0X2RpciA9IGNlcnRfbG9jCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9OT05FJwogICAgICAgICAgICBjb25uLmNhX2NlcnRzID0gTm9uZQogICAgICAgICAgICBjb25uLmNhX2NlcnRfZGlyID0gTm9uZQoKICAgICAgICBpZiBjZXJ0OgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjZXJ0LCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGNvbm4uY2VydF9maWxlID0gY2VydFswXQogICAgICAgICAgICAgICAgY29ubi5rZXlfZmlsZSA9IGNlcnRbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbm4uY2VydF9maWxlID0gY2VydAogICAgICAgICAgICAgICAgY29ubi5rZXlfZmlsZSA9IE5vbmUKICAgICAgICAgICAgaWYgY29ubi5jZXJ0X2ZpbGUgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhjb25uLmNlcnRfZmlsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCB0aGUgVExTIGNlcnRpZmljYXRlIGZpbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY29ubi5jZXJ0X2ZpbGUpKQogICAgICAgICAgICBpZiBjb25uLmtleV9maWxlIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoY29ubi5rZXlfZmlsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCB0aGUgVExTIGtleSBmaWxlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhdGg6IHswfSIuZm9ybWF0KGNvbm4ua2V5X2ZpbGUpKQoKICAgIGRlZiBidWlsZF9yZXNwb25zZShzZWxmLCByZXEsIHJlc3ApOgogICAgICAgICIiIkJ1aWxkcyBhIDpjbGFzczpgUmVzcG9uc2UgPHJlcXVlc3RzLlJlc3BvbnNlPmAgb2JqZWN0IGZyb20gYSB1cmxsaWIzCiAgICAgICAgcmVzcG9uc2UuIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQKICAgICAgICBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YAoKICAgICAgICA6cGFyYW0gcmVxOiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlc3BvbnNlLgogICAgICAgIDpwYXJhbSByZXNwOiBUaGUgdXJsbGliMyByZXNwb25zZSBvYmplY3QuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgIHJlc3BvbnNlID0gUmVzcG9uc2UoKQoKICAgICAgICAjIEZhbGxiYWNrIHRvIE5vbmUgaWYgdGhlcmUncyBubyBzdGF0dXNfY29kZSwgZm9yIHdoYXRldmVyIHJlYXNvbi4KICAgICAgICByZXNwb25zZS5zdGF0dXNfY29kZSA9IGdldGF0dHIocmVzcCwgJ3N0YXR1cycsIE5vbmUpCgogICAgICAgICMgTWFrZSBoZWFkZXJzIGNhc2UtaW5zZW5zaXRpdmUuCiAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoZ2V0YXR0cihyZXNwLCAnaGVhZGVycycsIHt9KSkKCiAgICAgICAgIyBTZXQgZW5jb2RpbmcuCiAgICAgICAgcmVzcG9uc2UuZW5jb2RpbmcgPSBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpCiAgICAgICAgcmVzcG9uc2UucmF3ID0gcmVzcAogICAgICAgIHJlc3BvbnNlLnJlYXNvbiA9IHJlc3BvbnNlLnJhdy5yZWFzb24KCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXEudXJsLCBieXRlcyk6CiAgICAgICAgICAgIHJlc3BvbnNlLnVybCA9IHJlcS51cmwuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gcmVxLnVybAoKICAgICAgICAjIEFkZCBuZXcgY29va2llcyBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihyZXNwb25zZS5jb29raWVzLCByZXEsIHJlc3ApCgogICAgICAgICMgR2l2ZSB0aGUgUmVzcG9uc2Ugc29tZSBjb250ZXh0LgogICAgICAgIHJlc3BvbnNlLnJlcXVlc3QgPSByZXEKICAgICAgICByZXNwb25zZS5jb25uZWN0aW9uID0gc2VsZgoKICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICBkZWYgZ2V0X2Nvbm5lY3Rpb24oc2VsZiwgdXJsLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlJldHVybnMgYSB1cmxsaWIzIGNvbm5lY3Rpb24gZm9yIHRoZSBnaXZlbiBVUkwuIFRoaXMgc2hvdWxkIG5vdCBiZQogICAgICAgIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCB0byBjb25uZWN0IHRvLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIEEgUmVxdWVzdHMtc3R5bGUgZGljdGlvbmFyeSBvZiBwcm94aWVzIHVzZWQgb24gdGhpcyByZXF1ZXN0LgogICAgICAgIDpydHlwZTogdXJsbGliMy5Db25uZWN0aW9uUG9vbAogICAgICAgICIiIgogICAgICAgIHByb3h5ID0gc2VsZWN0X3Byb3h5KHVybCwgcHJveGllcykKCiAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgIHByb3h5ID0gcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkKHByb3h5LCAnaHR0cCcpCiAgICAgICAgICAgIHByb3h5X21hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJfZm9yKHByb3h5KQogICAgICAgICAgICBjb25uID0gcHJveHlfbWFuYWdlci5jb25uZWN0aW9uX2Zyb21fdXJsKHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE9ubHkgc2NoZW1lIHNob3VsZCBiZSBsb3dlciBjYXNlCiAgICAgICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgdXJsID0gcGFyc2VkLmdldHVybCgpCiAgICAgICAgICAgIGNvbm4gPSBzZWxmLnBvb2xtYW5hZ2VyLmNvbm5lY3Rpb25fZnJvbV91cmwodXJsKQoKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJEaXNwb3NlcyBvZiBhbnkgaW50ZXJuYWwgc3RhdGUuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBjbG9zZXMgdGhlIFBvb2xNYW5hZ2VyIGFuZCBhbnkgYWN0aXZlIFByb3h5TWFuYWdlciwKICAgICAgICB3aGljaCBjbG9zZXMgYW55IHBvb2xlZCBjb25uZWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBvb2xtYW5hZ2VyLmNsZWFyKCkKICAgICAgICBmb3IgcHJveHkgaW4gc2VsZi5wcm94eV9tYW5hZ2VyLnZhbHVlcygpOgogICAgICAgICAgICBwcm94eS5jbGVhcigpCgogICAgZGVmIHJlcXVlc3RfdXJsKHNlbGYsIHJlcXVlc3QsIHByb3hpZXMpOgogICAgICAgICIiIk9idGFpbiB0aGUgdXJsIHRvIHVzZSB3aGVuIG1ha2luZyB0aGUgZmluYWwgcmVxdWVzdC4KCiAgICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgdGhlIGZ1bGwgVVJMIGhhcyB0bwogICAgICAgIGJlIHVzZWQuIE90aGVyd2lzZSwgd2Ugc2hvdWxkIG9ubHkgdXNlIHRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIFVSTC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBwcm94aWVzOiBBIGRpY3Rpb25hcnkgb2Ygc2NoZW1lcyBvciBzY2hlbWVzIGFuZCBob3N0cyB0byBwcm94eSBVUkxzLgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgcHJveHkgPSBzZWxlY3RfcHJveHkocmVxdWVzdC51cmwsIHByb3hpZXMpCiAgICAgICAgc2NoZW1lID0gdXJscGFyc2UocmVxdWVzdC51cmwpLnNjaGVtZQoKICAgICAgICBpc19wcm94aWVkX2h0dHBfcmVxdWVzdCA9IChwcm94eSBhbmQgc2NoZW1lICE9ICdodHRwcycpCiAgICAgICAgdXNpbmdfc29ja3NfcHJveHkgPSBGYWxzZQogICAgICAgIGlmIHByb3h5OgogICAgICAgICAgICBwcm94eV9zY2hlbWUgPSB1cmxwYXJzZShwcm94eSkuc2NoZW1lLmxvd2VyKCkKICAgICAgICAgICAgdXNpbmdfc29ja3NfcHJveHkgPSBwcm94eV9zY2hlbWUuc3RhcnRzd2l0aCgnc29ja3MnKQoKICAgICAgICB1cmwgPSByZXF1ZXN0LnBhdGhfdXJsCiAgICAgICAgaWYgaXNfcHJveGllZF9odHRwX3JlcXVlc3QgYW5kIG5vdCB1c2luZ19zb2Nrc19wcm94eToKICAgICAgICAgICAgdXJsID0gdXJsZGVmcmFnYXV0aChyZXF1ZXN0LnVybCkKCiAgICAgICAgcmV0dXJuIHVybAoKICAgIGRlZiBhZGRfaGVhZGVycyhzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIiIiQWRkIGFueSBoZWFkZXJzIG5lZWRlZCBieSB0aGUgY29ubmVjdGlvbi4gQXMgb2YgdjIuMCB0aGlzIGRvZXMKICAgICAgICBub3RoaW5nIGJ5IGRlZmF1bHQsIGJ1dCBpcyBsZWZ0IGZvciBvdmVycmlkaW5nIGJ5IHVzZXJzIHRoYXQgc3ViY2xhc3MKICAgICAgICB0aGUgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCB0byBhZGQgaGVhZGVycyB0by4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBUaGUga2V5d29yZCBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbCB0byBzZW5kKCkuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBwcm94eV9oZWFkZXJzKHNlbGYsIHByb3h5KToKICAgICAgICAiIiJSZXR1cm5zIGEgZGljdGlvbmFyeSBvZiB0aGUgaGVhZGVycyB0byBhZGQgdG8gYW55IHJlcXVlc3Qgc2VudAogICAgICAgIHRocm91Z2ggYSBwcm94eS4gVGhpcyB3b3JrcyB3aXRoIHVybGxpYjMgbWFnaWMgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUKICAgICAgICBjb3JyZWN0bHkgc2VudCB0byB0aGUgcHJveHksIHJhdGhlciB0aGFuIGluIGEgdHVubmVsbGVkIHJlcXVlc3QgaWYKICAgICAgICBDT05ORUNUIGlzIGJlaW5nIHVzZWQuCgogICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZQogICAgICAgIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IFRoZSB1cmwgb2YgdGhlIHByb3h5IGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC4KICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0ge30KICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBnZXRfYXV0aF9mcm9tX3VybChwcm94eSkKCiAgICAgICAgaWYgdXNlcm5hbWU6CiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cih1c2VybmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKQoKICAgICAgICByZXR1cm4gaGVhZGVycwoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9VHJ1ZSwgY2VydD1Ob25lLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlNlbmRzIFByZXBhcmVkUmVxdWVzdCBvYmplY3QuIFJldHVybnMgUmVzcG9uc2Ugb2JqZWN0LgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgV2hldGhlciB0byBzdHJlYW0gdGhlIHJlcXVlc3QgY29udGVudC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUgb3IgdXJsbGliMyBUaW1lb3V0IG9iamVjdAogICAgICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyCiAgICAgICAgICAgIHdlIHZlcmlmeSB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdAogICAgICAgICAgICBtdXN0IGJlIGEgcGF0aCB0byBhIENBIGJ1bmRsZSB0byB1c2UKICAgICAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBBbnkgdXNlci1wcm92aWRlZCBTU0wgY2VydGlmaWNhdGUgdG8gYmUgdHJ1c3RlZC4KICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBUaGUgcHJveGllcyBkaWN0aW9uYXJ5IHRvIGFwcGx5IHRvIHRoZSByZXF1ZXN0LgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgY29ubiA9IHNlbGYuZ2V0X2Nvbm5lY3Rpb24ocmVxdWVzdC51cmwsIHByb3hpZXMpCgogICAgICAgIHNlbGYuY2VydF92ZXJpZnkoY29ubiwgcmVxdWVzdC51cmwsIHZlcmlmeSwgY2VydCkKICAgICAgICB1cmwgPSBzZWxmLnJlcXVlc3RfdXJsKHJlcXVlc3QsIHByb3hpZXMpCiAgICAgICAgc2VsZi5hZGRfaGVhZGVycyhyZXF1ZXN0KQoKICAgICAgICBjaHVua2VkID0gbm90IChyZXF1ZXN0LmJvZHkgaXMgTm9uZSBvciAnQ29udGVudC1MZW5ndGgnIGluIHJlcXVlc3QuaGVhZGVycykKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCB0dXBsZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbm5lY3QsIHJlYWQgPSB0aW1lb3V0CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dFNhdWNlKGNvbm5lY3Q9Y29ubmVjdCwgcmVhZD1yZWFkKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIHN0cmluZyBmb3JtYXR0aW5nIGVycm9yLgogICAgICAgICAgICAgICAgZXJyID0gKCJJbnZhbGlkIHRpbWVvdXQgezB9LiBQYXNzIGEgKGNvbm5lY3QsIHJlYWQpICIKICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCB0dXBsZSwgb3IgYSBzaW5nbGUgZmxvYXQgdG8gc2V0ICIKICAgICAgICAgICAgICAgICAgICAgICAiYm90aCB0aW1lb3V0cyB0byB0aGUgc2FtZSB2YWx1ZSIuZm9ybWF0KHRpbWVvdXQpKQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXRTYXVjZSk6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dFNhdWNlKGNvbm5lY3Q9dGltZW91dCwgcmVhZD10aW1lb3V0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG5vdCBjaHVua2VkOgogICAgICAgICAgICAgICAgcmVzcCA9IGNvbm4udXJsb3BlbigKICAgICAgICAgICAgICAgICAgICBtZXRob2Q9cmVxdWVzdC5tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgdXJsPXVybCwKICAgICAgICAgICAgICAgICAgICBib2R5PXJlcXVlc3QuYm9keSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXJlcXVlc3QuaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHByZWxvYWRfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXNlbGYubWF4X3JldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0CiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIFNlbmQgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGNvbm4sICdwcm94eV9wb29sJyk6CiAgICAgICAgICAgICAgICAgICAgY29ubiA9IGNvbm4ucHJveHlfcG9vbAoKICAgICAgICAgICAgICAgIGxvd19jb25uID0gY29ubi5fZ2V0X2Nvbm4odGltZW91dD1ERUZBVUxUX1BPT0xfVElNRU9VVCkKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4ucHV0cmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYWNjZXB0X2VuY29kaW5nPVRydWUpCgogICAgICAgICAgICAgICAgICAgIGZvciBoZWFkZXIsIHZhbHVlIGluIHJlcXVlc3QuaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5wdXRoZWFkZXIoaGVhZGVyLCB2YWx1ZSkKCiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uZW5kaGVhZGVycygpCgogICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJlcXVlc3QuYm9keToKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChoZXgobGVuKGkpKVsyOl0uZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoaSkKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChiJ1xyXG4nKQogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoYicwXHJcblxyXG4nKQoKICAgICAgICAgICAgICAgICAgICAjIFJlY2VpdmUgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgUHl0aG9uIDIuNysgdmVyc2lvbnMsIHVzZSBidWZmZXJpbmcgb2YgSFRUUAogICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3BvbnNlcwogICAgICAgICAgICAgICAgICAgICAgICByID0gbG93X2Nvbm4uZ2V0cmVzcG9uc2UoYnVmZmVyaW5nPVRydWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjYgdmVyc2lvbnMgYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGxvd19jb25uLmdldHJlc3BvbnNlKCkKCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IEhUVFBSZXNwb25zZS5mcm9tX2h0dHBsaWIoCiAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2w9Y29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbj1sb3dfY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGhpdCBhbnkgcHJvYmxlbXMgaGVyZSwgY2xlYW4gdXAgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgIyBUaGVuLCByZXJhaXNlIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSB0aGUgYWN0dWFsIGV4Y2VwdGlvbi4KICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IChQcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGVycjoKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGVyciwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBDb25uZWN0VGltZW91dEVycm9yKToKICAgICAgICAgICAgICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgaW4gMy4wLjA6IHNlZSAjMjgxMQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZS5yZWFzb24sIE5ld0Nvbm5lY3Rpb25FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXQoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgUmVzcG9uc2VFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIF9Qcm94eUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIFByb3h5RXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgX1NTTEVycm9yKToKICAgICAgICAgICAgICAgICMgVGhpcyBicmFuY2ggaXMgZm9yIHVybGxpYjMgdjEuMjIgYW5kIGxhdGVyLgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgZXhjZXB0IENsb3NlZFBvb2xFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgX1Byb3h5RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgUHJveHlFcnJvcihlKQoKICAgICAgICBleGNlcHQgKF9TU0xFcnJvciwgX0hUVFBFcnJvcikgYXMgZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBfU1NMRXJyb3IpOgogICAgICAgICAgICAgICAgIyBUaGlzIGJyYW5jaCBpcyBmb3IgdXJsbGliMyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gdjEuMjIKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIFJlYWRUaW1lb3V0RXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXQoZSwgcmVxdWVzdD1yZXF1ZXN0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfcmVzcG9uc2UocmVxdWVzdCwgcmVzcCkKUEsDBBQAAAAAAAAAIQCYY+gvXRgAAF0YAAArAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2FwaS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYXBpCn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUmVxdWVzdHMgQVBJLgoKOmNvcHlyaWdodDogKGMpIDIwMTIgYnkgS2VubmV0aCBSZWl0ei4KOmxpY2Vuc2U6IEFwYWNoZTIsIHNlZSBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCiIiIgoKZnJvbSAuIGltcG9ydCBzZXNzaW9ucwoKCmRlZiByZXF1ZXN0KG1ldGhvZCwgdXJsLCAqKmt3YXJncyk6CiAgICAiIiJDb25zdHJ1Y3RzIGFuZCBzZW5kcyBhIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgoKICAgIDpwYXJhbSBtZXRob2Q6IG1ldGhvZCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBsaXN0IG9mIHR1cGxlcyBgYFsoa2V5LCB2YWx1ZSldYGAgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGhlYWRlcnM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBIVFRQIEhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGNvb2tpZXM6IChvcHRpb25hbCkgRGljdCBvciBDb29raWVKYXIgb2JqZWN0IHRvIHNlbmQgd2l0aCB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBmaWxlczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIGBgJ25hbWUnOiBmaWxlLWxpa2Utb2JqZWN0c2BgIChvciBgYHsnbmFtZSc6IGZpbGUtdHVwbGV9YGApIGZvciBtdWx0aXBhcnQgZW5jb2RpbmcgdXBsb2FkLgogICAgICAgIGBgZmlsZS10dXBsZWBgIGNhbiBiZSBhIDItdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iailgYCwgMy10dXBsZSBgYCgnZmlsZW5hbWUnLCBmaWxlb2JqLCAnY29udGVudF90eXBlJylgYAogICAgICAgIG9yIGEgNC10dXBsZSBgYCgnZmlsZW5hbWUnLCBmaWxlb2JqLCAnY29udGVudF90eXBlJywgY3VzdG9tX2hlYWRlcnMpYGAsIHdoZXJlIGBgJ2NvbnRlbnQtdHlwZSdgYCBpcyBhIHN0cmluZwogICAgICAgIGRlZmluaW5nIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuIGZpbGUgYW5kIGBgY3VzdG9tX2hlYWRlcnNgYCBhIGRpY3QtbGlrZSBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGhlYWRlcnMKICAgICAgICB0byBhZGQgZm9yIHRoZSBmaWxlLgogICAgOnBhcmFtIGF1dGg6IChvcHRpb25hbCkgQXV0aCB0dXBsZSB0byBlbmFibGUgQmFzaWMvRGlnZXN0L0N1c3RvbSBIVFRQIEF1dGguCiAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbWFueSBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZCBkYXRhCiAgICAgICAgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LCByZWFkCiAgICAgICAgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZQogICAgOnBhcmFtIGFsbG93X3JlZGlyZWN0czogKG9wdGlvbmFsKSBCb29sZWFuLiBFbmFibGUvZGlzYWJsZSBHRVQvT1BUSU9OUy9QT1NUL1BVVC9QQVRDSC9ERUxFVEUvSEVBRCByZWRpcmVjdGlvbi4gRGVmYXVsdHMgdG8gYGBUcnVlYGAuCiAgICA6dHlwZSBhbGxvd19yZWRpcmVjdHM6IGJvb2wKICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgbWFwcGluZyBwcm90b2NvbCB0byB0aGUgVVJMIG9mIHRoZSBwcm94eS4KICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UuIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSBpZiBgYEZhbHNlYGAsIHRoZSByZXNwb25zZSBjb250ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgZG93bmxvYWRlZC4KICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50IGNlcnQgZmlsZSAoLnBlbSkuIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICAjIEJ5IHVzaW5nIHRoZSAnd2l0aCcgc3RhdGVtZW50IHdlIGFyZSBzdXJlIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgdGh1cyB3ZQogICAgIyBhdm9pZCBsZWF2aW5nIHNvY2tldHMgb3BlbiB3aGljaCBjYW4gdHJpZ2dlciBhIFJlc291cmNlV2FybmluZyBpbiBzb21lCiAgICAjIGNhc2VzLCBhbmQgbG9vayBsaWtlIGEgbWVtb3J5IGxlYWsgaW4gb3RoZXJzLgogICAgd2l0aCBzZXNzaW9ucy5TZXNzaW9uKCkgYXMgc2Vzc2lvbjoKICAgICAgICByZXR1cm4gc2Vzc2lvbi5yZXF1ZXN0KG1ldGhvZD1tZXRob2QsIHVybD11cmwsICoqa3dhcmdzKQoKCmRlZiBnZXQodXJsLCBwYXJhbXM9Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgR0VUIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIHBhcmFtczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICByZXR1cm4gcmVxdWVzdCgnZ2V0JywgdXJsLCBwYXJhbXM9cGFyYW1zLCAqKmt3YXJncykKCgpkZWYgb3B0aW9ucyh1cmwsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhbiBPUFRJT05TIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgcmV0dXJuIHJlcXVlc3QoJ29wdGlvbnMnLCB1cmwsICoqa3dhcmdzKQoKCmRlZiBoZWFkKHVybCwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgSEVBRCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgRmFsc2UpCiAgICByZXR1cm4gcmVxdWVzdCgnaGVhZCcsIHVybCwgKiprd2FyZ3MpCgoKZGVmIHBvc3QodXJsLCBkYXRhPU5vbmUsIGpzb249Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgUE9TVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwb3N0JywgdXJsLCBkYXRhPWRhdGEsIGpzb249anNvbiwgKiprd2FyZ3MpCgoKZGVmIHB1dCh1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgUFVUIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ3B1dCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCgpkZWYgcGF0Y2godXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBBVENIIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ3BhdGNoJywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKCmRlZiBkZWxldGUodXJsLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBERUxFVEUgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ2RlbGV0ZScsIHVybCwgKiprd2FyZ3MpClBLAwQUAAAAAAAAACEAA63ykgAmAAAAJgAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hdXRoLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5hdXRoCn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBoYW5kbGVycyBmb3IgUmVxdWVzdHMuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGltZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBiYXNlNjQgaW1wb3J0IGI2NGVuY29kZQoKZnJvbSAuY29tcGF0IGltcG9ydCB1cmxwYXJzZSwgc3RyLCBiYXNlc3RyaW5nCmZyb20gLmNvb2tpZXMgaW1wb3J0IGV4dHJhY3RfY29va2llc190b19qYXIKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLnV0aWxzIGltcG9ydCBwYXJzZV9kaWN0X2hlYWRlcgoKQ09OVEVOVF9UWVBFX0ZPUk1fVVJMRU5DT0RFRCA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCkNPTlRFTlRfVFlQRV9NVUxUSV9QQVJUID0gJ211bHRpcGFydC9mb3JtLWRhdGEnCgoKZGVmIF9iYXNpY19hdXRoX3N0cih1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgIiIiUmV0dXJucyBhIEJhc2ljIEF1dGggc3RyaW5nLiIiIgoKICAgICMgIkkgd2FudCB1cyB0byBwdXQgYSBiaWctb2wnIGNvbW1lbnQgb24gdG9wIG9mIGl0IHRoYXQKICAgICMgc2F5cyB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIGR1bWIgYnV0IHdlIG5lZWQgdG8gcHJlc2VydmUKICAgICMgaXQgYmVjYXVzZSBwZW9wbGUgYXJlIHJlbHlpbmcgb24gaXQuIgogICAgIyAgICAtIEx1a2FzYQogICAgIwogICAgIyBUaGVzZSBhcmUgaGVyZSBzb2xlbHkgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICMgZm9yIHRoaW5ncyBsaWtlIGludHMuIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIDMuMC4wLgogICAgaWYgbm90IGlzaW5zdGFuY2UodXNlcm5hbWUsIGJhc2VzdHJpbmcpOgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJOb24tc3RyaW5nIHVzZXJuYW1lcyB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgaW4gUmVxdWVzdHMgIgogICAgICAgICAgICAiMy4wLjAuIFBsZWFzZSBjb252ZXJ0IHRoZSBvYmplY3QgeW91J3ZlIHBhc3NlZCBpbiAoezAhcn0pIHRvICIKICAgICAgICAgICAgImEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCBpbiB0aGUgbmVhciBmdXR1cmUgdG8gYXZvaWQgIgogICAgICAgICAgICAicHJvYmxlbXMuIi5mb3JtYXQodXNlcm5hbWUpLAogICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgKQogICAgICAgIHVzZXJuYW1lID0gc3RyKHVzZXJuYW1lKQoKICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhc3N3b3JkLCBiYXNlc3RyaW5nKToKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiTm9uLXN0cmluZyBwYXNzd29yZHMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGluIFJlcXVlc3RzICIKICAgICAgICAgICAgIjMuMC4wLiBQbGVhc2UgY29udmVydCB0aGUgb2JqZWN0IHlvdSd2ZSBwYXNzZWQgaW4gKHswIXJ9KSB0byAiCiAgICAgICAgICAgICJhIHN0cmluZyBvciBieXRlcyBvYmplY3QgaW4gdGhlIG5lYXIgZnV0dXJlIHRvIGF2b2lkICIKICAgICAgICAgICAgInByb2JsZW1zLiIuZm9ybWF0KHBhc3N3b3JkKSwKICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICkKICAgICAgICBwYXNzd29yZCA9IHN0cihwYXNzd29yZCkKICAgICMgLS0gRW5kIFJlbW92YWwgLS0KCiAgICBpZiBpc2luc3RhbmNlKHVzZXJuYW1lLCBzdHIpOgogICAgICAgIHVzZXJuYW1lID0gdXNlcm5hbWUuZW5jb2RlKCdsYXRpbjEnKQoKICAgIGlmIGlzaW5zdGFuY2UocGFzc3dvcmQsIHN0cik6CiAgICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5lbmNvZGUoJ2xhdGluMScpCgogICAgYXV0aHN0ciA9ICdCYXNpYyAnICsgdG9fbmF0aXZlX3N0cmluZygKICAgICAgICBiNjRlbmNvZGUoYic6Jy5qb2luKCh1c2VybmFtZSwgcGFzc3dvcmQpKSkuc3RyaXAoKQogICAgKQoKICAgIHJldHVybiBhdXRoc3RyCgoKY2xhc3MgQXV0aEJhc2Uob2JqZWN0KToKICAgICIiIkJhc2UgY2xhc3MgdGhhdCBhbGwgYXV0aCBpbXBsZW1lbnRhdGlvbnMgZGVyaXZlIGZyb20iIiIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignQXV0aCBob29rcyBtdXN0IGJlIGNhbGxhYmxlLicpCgoKY2xhc3MgSFRUUEJhc2ljQXV0aChBdXRoQmFzZSk6CiAgICAiIiJBdHRhY2hlcyBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uIHRvIHRoZSBnaXZlbiBSZXF1ZXN0IG9iamVjdC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gYWxsKFsKICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9PSBnZXRhdHRyKG90aGVyLCAndXNlcm5hbWUnLCBOb25lKSwKICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9PSBnZXRhdHRyKG90aGVyLCAncGFzc3dvcmQnLCBOb25lKQogICAgICAgIF0pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgIHIuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCiAgICAgICAgcmV0dXJuIHIKCgpjbGFzcyBIVFRQUHJveHlBdXRoKEhUVFBCYXNpY0F1dGgpOgogICAgIiIiQXR0YWNoZXMgSFRUUCBQcm94eSBBdXRoZW50aWNhdGlvbiB0byBhIGdpdmVuIFJlcXVlc3Qgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICByLmhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cihzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIHJldHVybiByCgoKY2xhc3MgSFRUUERpZ2VzdEF1dGgoQXV0aEJhc2UpOgogICAgIiIiQXR0YWNoZXMgSFRUUCBEaWdlc3QgQXV0aGVudGljYXRpb24gdG8gdGhlIGdpdmVuIFJlcXVlc3Qgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAogICAgICAgICMgS2VlcCBzdGF0ZSBpbiBwZXItdGhyZWFkIGxvY2FsIHN0b3JhZ2UKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwgPSB0aHJlYWRpbmcubG9jYWwoKQoKICAgIGRlZiBpbml0X3Blcl90aHJlYWRfc3RhdGUoc2VsZik6CiAgICAgICAgIyBFbnN1cmUgc3RhdGUgaXMgaW5pdGlhbGl6ZWQganVzdCBvbmNlIHBlci10aHJlYWQKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLl90aHJlYWRfbG9jYWwsICdpbml0Jyk6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5pbml0ID0gVHJ1ZQogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZSA9ICcnCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudCA9IDAKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwgPSB7fQogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwucG9zID0gTm9uZQogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IE5vbmUKCiAgICBkZWYgYnVpbGRfZGlnZXN0X2hlYWRlcihzZWxmLCBtZXRob2QsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKCiAgICAgICAgcmVhbG0gPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbFsncmVhbG0nXQogICAgICAgIG5vbmNlID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWxbJ25vbmNlJ10KICAgICAgICBxb3AgPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbC5nZXQoJ3FvcCcpCiAgICAgICAgYWxnb3JpdGhtID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwuZ2V0KCdhbGdvcml0aG0nKQogICAgICAgIG9wYXF1ZSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsLmdldCgnb3BhcXVlJykKICAgICAgICBoYXNoX3V0ZjggPSBOb25lCgogICAgICAgIGlmIGFsZ29yaXRobSBpcyBOb25lOgogICAgICAgICAgICBfYWxnb3JpdGhtID0gJ01ENScKICAgICAgICBlbHNlOgogICAgICAgICAgICBfYWxnb3JpdGhtID0gYWxnb3JpdGhtLnVwcGVyKCkKICAgICAgICAjIGxhbWJkYXMgYXNzdW1lIGRpZ2VzdCBtb2R1bGVzIGFyZSBpbXBvcnRlZCBhdCB0aGUgdG9wIGxldmVsCiAgICAgICAgaWYgX2FsZ29yaXRobSA9PSAnTUQ1JyBvciBfYWxnb3JpdGhtID09ICdNRDUtU0VTUyc6CiAgICAgICAgICAgIGRlZiBtZDVfdXRmOCh4KToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgc3RyKToKICAgICAgICAgICAgICAgICAgICB4ID0geC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLm1kNSh4KS5oZXhkaWdlc3QoKQogICAgICAgICAgICBoYXNoX3V0ZjggPSBtZDVfdXRmOAogICAgICAgIGVsaWYgX2FsZ29yaXRobSA9PSAnU0hBJzoKICAgICAgICAgICAgZGVmIHNoYV91dGY4KHgpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBzdHIpOgogICAgICAgICAgICAgICAgICAgIHggPSB4LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIuc2hhMSh4KS5oZXhkaWdlc3QoKQogICAgICAgICAgICBoYXNoX3V0ZjggPSBzaGFfdXRmOAoKICAgICAgICBLRCA9IGxhbWJkYSBzLCBkOiBoYXNoX3V0ZjgoIiVzOiVzIiAlIChzLCBkKSkKCiAgICAgICAgaWYgaGFzaF91dGY4IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgWFhYIG5vdCBpbXBsZW1lbnRlZCB5ZXQKICAgICAgICBlbnRkaWcgPSBOb25lCiAgICAgICAgcF9wYXJzZWQgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgIzogcGF0aCBpcyByZXF1ZXN0LXVyaSBkZWZpbmVkIGluIFJGQyAyNjE2IHdoaWNoIHNob3VsZCBub3QgYmUgZW1wdHkKICAgICAgICBwYXRoID0gcF9wYXJzZWQucGF0aCBvciAiLyIKICAgICAgICBpZiBwX3BhcnNlZC5xdWVyeToKICAgICAgICAgICAgcGF0aCArPSAnPycgKyBwX3BhcnNlZC5xdWVyeQoKICAgICAgICBBMSA9ICclczolczolcycgJSAoc2VsZi51c2VybmFtZSwgcmVhbG0sIHNlbGYucGFzc3dvcmQpCiAgICAgICAgQTIgPSAnJXM6JXMnICUgKG1ldGhvZCwgcGF0aCkKCiAgICAgICAgSEExID0gaGFzaF91dGY4KEExKQogICAgICAgIEhBMiA9IGhhc2hfdXRmOChBMikKCiAgICAgICAgaWYgbm9uY2UgPT0gc2VsZi5fdGhyZWFkX2xvY2FsLmxhc3Rfbm9uY2U6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudCArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50ID0gMQogICAgICAgIG5jdmFsdWUgPSAnJTA4eCcgJSBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQKICAgICAgICBzID0gc3RyKHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudCkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcyArPSBub25jZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzICs9IHRpbWUuY3RpbWUoKS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzICs9IG9zLnVyYW5kb20oOCkKCiAgICAgICAgY25vbmNlID0gKGhhc2hsaWIuc2hhMShzKS5oZXhkaWdlc3QoKVs6MTZdKQogICAgICAgIGlmIF9hbGdvcml0aG0gPT0gJ01ENS1TRVNTJzoKICAgICAgICAgICAgSEExID0gaGFzaF91dGY4KCclczolczolcycgJSAoSEExLCBub25jZSwgY25vbmNlKSkKCiAgICAgICAgaWYgbm90IHFvcDoKICAgICAgICAgICAgcmVzcGRpZyA9IEtEKEhBMSwgIiVzOiVzIiAlIChub25jZSwgSEEyKSkKICAgICAgICBlbGlmIHFvcCA9PSAnYXV0aCcgb3IgJ2F1dGgnIGluIHFvcC5zcGxpdCgnLCcpOgogICAgICAgICAgICBub25jZWJpdCA9ICIlczolczolczolczolcyIgJSAoCiAgICAgICAgICAgICAgICBub25jZSwgbmN2YWx1ZSwgY25vbmNlLCAnYXV0aCcsIEhBMgogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3BkaWcgPSBLRChIQTEsIG5vbmNlYml0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYIGhhbmRsZSBhdXRoLWludC4KICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmxhc3Rfbm9uY2UgPSBub25jZQoKICAgICAgICAjIFhYWCBzaG91bGQgdGhlIHBhcnRpYWwgZGlnZXN0cyBiZSBlbmNvZGVkIHRvbz8KICAgICAgICBiYXNlID0gJ3VzZXJuYW1lPSIlcyIsIHJlYWxtPSIlcyIsIG5vbmNlPSIlcyIsIHVyaT0iJXMiLCAnIFwKICAgICAgICAgICAgICAgJ3Jlc3BvbnNlPSIlcyInICUgKHNlbGYudXNlcm5hbWUsIHJlYWxtLCBub25jZSwgcGF0aCwgcmVzcGRpZykKICAgICAgICBpZiBvcGFxdWU6CiAgICAgICAgICAgIGJhc2UgKz0gJywgb3BhcXVlPSIlcyInICUgb3BhcXVlCiAgICAgICAgaWYgYWxnb3JpdGhtOgogICAgICAgICAgICBiYXNlICs9ICcsIGFsZ29yaXRobT0iJXMiJyAlIGFsZ29yaXRobQogICAgICAgIGlmIGVudGRpZzoKICAgICAgICAgICAgYmFzZSArPSAnLCBkaWdlc3Q9IiVzIicgJSBlbnRkaWcKICAgICAgICBpZiBxb3A6CiAgICAgICAgICAgIGJhc2UgKz0gJywgcW9wPSJhdXRoIiwgbmM9JXMsIGNub25jZT0iJXMiJyAlIChuY3ZhbHVlLCBjbm9uY2UpCgogICAgICAgIHJldHVybiAnRGlnZXN0ICVzJyAlIChiYXNlKQoKICAgIGRlZiBoYW5kbGVfcmVkaXJlY3Qoc2VsZiwgciwgKiprd2FyZ3MpOgogICAgICAgICIiIlJlc2V0IG51bV80MDFfY2FsbHMgY291bnRlciBvbiByZWRpcmVjdHMuIiIiCiAgICAgICAgaWYgci5pc19yZWRpcmVjdDoKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSAxCgogICAgZGVmIGhhbmRsZV80MDEoc2VsZiwgciwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIHRoZSBnaXZlbiByZXNwb25zZSBhbmQgdHJpZXMgZGlnZXN0LWF1dGgsIGlmIG5lZWRlZC4KCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICAjIElmIHJlc3BvbnNlIGlzIG5vdCA0eHgsIGRvIG5vdCBhdXRoCiAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8zNzcyCiAgICAgICAgaWYgbm90IDQwMCA8PSByLnN0YXR1c19jb2RlIDwgNTAwOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKICAgICAgICAgICAgcmV0dXJuIHIKCiAgICAgICAgaWYgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBSZXdpbmQgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yIG9mIHRoZSBib2R5IHRvIHdoZXJlCiAgICAgICAgICAgICMgaXQgd2FzIHRvIHJlc2VuZCB0aGUgcmVxdWVzdC4KICAgICAgICAgICAgci5yZXF1ZXN0LmJvZHkuc2VlayhzZWxmLl90aHJlYWRfbG9jYWwucG9zKQogICAgICAgIHNfYXV0aCA9IHIuaGVhZGVycy5nZXQoJ3d3dy1hdXRoZW50aWNhdGUnLCAnJykKCiAgICAgICAgaWYgJ2RpZ2VzdCcgaW4gc19hdXRoLmxvd2VyKCkgYW5kIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzIDwgMjoKCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzICs9IDEKICAgICAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ2RpZ2VzdCAnLCBmbGFncz1yZS5JR05PUkVDQVNFKQogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbCA9IHBhcnNlX2RpY3RfaGVhZGVyKHBhdC5zdWIoJycsIHNfYXV0aCwgY291bnQ9MSkpCgogICAgICAgICAgICAjIENvbnN1bWUgY29udGVudCBhbmQgcmVsZWFzZSB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbgogICAgICAgICAgICAjIHRvIGFsbG93IG91ciBuZXcgcmVxdWVzdCB0byByZXVzZSB0aGUgc2FtZSBvbmUuCiAgICAgICAgICAgIHIuY29udGVudAogICAgICAgICAgICByLmNsb3NlKCkKICAgICAgICAgICAgcHJlcCA9IHIucmVxdWVzdC5jb3B5KCkKICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihwcmVwLl9jb29raWVzLCByLnJlcXVlc3QsIHIucmF3KQogICAgICAgICAgICBwcmVwLnByZXBhcmVfY29va2llcyhwcmVwLl9jb29raWVzKQoKICAgICAgICAgICAgcHJlcC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBzZWxmLmJ1aWxkX2RpZ2VzdF9oZWFkZXIoCiAgICAgICAgICAgICAgICBwcmVwLm1ldGhvZCwgcHJlcC51cmwpCiAgICAgICAgICAgIF9yID0gci5jb25uZWN0aW9uLnNlbmQocHJlcCwgKiprd2FyZ3MpCiAgICAgICAgICAgIF9yLmhpc3RvcnkuYXBwZW5kKHIpCiAgICAgICAgICAgIF9yLnJlcXVlc3QgPSBwcmVwCgogICAgICAgICAgICByZXR1cm4gX3IKCiAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSAxCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgIyBJbml0aWFsaXplIHBlci10aHJlYWQgc3RhdGUsIGlmIG5lZWRlZAogICAgICAgIHNlbGYuaW5pdF9wZXJfdGhyZWFkX3N0YXRlKCkKICAgICAgICAjIElmIHdlIGhhdmUgYSBzYXZlZCBub25jZSwgc2tpcCB0aGUgNDAxCiAgICAgICAgaWYgc2VsZi5fdGhyZWFkX2xvY2FsLmxhc3Rfbm9uY2U6CiAgICAgICAgICAgIHIuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gc2VsZi5idWlsZF9kaWdlc3RfaGVhZGVyKHIubWV0aG9kLCByLnVybCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgPSByLmJvZHkudGVsbCgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIEhUVFBEaWdlc3RBdXRoIGJlaW5nIHJldXNlZCBhbmQgdGhlIGJvZHkgb2YKICAgICAgICAgICAgIyB0aGUgcHJldmlvdXMgcmVxdWVzdCB3YXMgYSBmaWxlLWxpa2Ugb2JqZWN0LCBwb3MgaGFzIHRoZQogICAgICAgICAgICAjIGZpbGUgcG9zaXRpb24gb2YgdGhlIHByZXZpb3VzIGJvZHkuIEVuc3VyZSBpdCdzIHNldCB0bwogICAgICAgICAgICAjIE5vbmUuCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgPSBOb25lCiAgICAgICAgci5yZWdpc3Rlcl9ob29rKCdyZXNwb25zZScsIHNlbGYuaGFuZGxlXzQwMSkKICAgICAgICByLnJlZ2lzdGVyX2hvb2soJ3Jlc3BvbnNlJywgc2VsZi5oYW5kbGVfcmVkaXJlY3QpCiAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSAxCgogICAgICAgIHJldHVybiByCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGFsbChbCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPT0gZ2V0YXR0cihvdGhlciwgJ3VzZXJuYW1lJywgTm9uZSksCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPT0gZ2V0YXR0cihvdGhlciwgJ3Bhc3N3b3JkJywgTm9uZSkKICAgICAgICBdKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgpQSwMEFAAAAAAAAAAhAAWh2vXwIgQA8CIEAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbQojIElzc3VlcjogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzA3NjY5MDA1MjA0CiMgTUQ1IEZpbmdlcnByaW50OiAzZTo0NTo1MjoxNTowOTo1MTo5MjplMTpiNzo1ZDozNzo5ZjpiMTo4NzoyOTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOmJjOjk2OjhiOmQ0OmY0OjlkOjYyOjJhOmE4OjlhOjgxOmYyOjE1OjAxOjUyOmE0OjFkOjgyOjljCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpkNDoxMDo0MDplNDpiYjozZTpjNzo0MjpjOTplMzo4MTpkMzoxZTpmMjphNDoxYTo0ODpiNjo2ODo1Yzo5NjplNzpjZTpmMzpjMTpkZjo2YzpkNDozMzoxYzo5OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrRwpBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CmIzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXcKTURCYUZ3MHlPREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQpZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYUR1YVoKamM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAp4eTBTeTZzY1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUzhwRjk0RzNWTlRDT1hrTno4a0hwCjFXcmpzb2s2VmprNGJ3WThpR2xiS2szRnAxUzRiSW5NbS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEcKc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgpVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWGd6VC9MQ3JCYkJsRFNnZUY1OU44CjlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096CnlqMWhUZE5HQ2JNK3c2RGpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UKMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95R2ovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUApBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhIaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkCkRLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUNYNFhTUVJqYmdiTUUKSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMiIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4ODU2NTgxMjUKIyBNRDUgRmluZ2VycHJpbnQ6IDk0OjE0Ojc3OjdlOjNlOjVlOmZkOjhmOjMwOmJkOjQxOmIwOmNmOmU3OmQwOjMwCiMgU0hBMSBGaW5nZXJwcmludDogNzU6ZTA6YWI6YjY6MTM6ODU6MTI6Mjc6MWM6MDQ6Zjg6NWY6ZGQ6ZGU6Mzg6ZTQ6Yjc6MjQ6MmU6ZmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNhOjQyOmRkOjQxOjc0OjVmOmQwOmI4OjFlOmI5OjAyOjM2OjJjOmY5OmQ4OmJmOjcxOjlkOmExOmJkOjFiOjFlOmZjOjk0OjZmOjViOjRjOjk5OmY0OjJjOjFiOjllCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJTEJBQUFBQUFCRDRZbTVnMHdEUVlKS29aSWh2Y05BUUVGQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqSXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURZeE1qRTFNRGd3TURBd1doY05NakV4TWpFMQpNRGd3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU01qRVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLYlBKQTYrTG04b21VVkN4S3MrSVZTYkM5Ti9oSEQ2RXJQTAp2NGRmeG4rRzA3SXdYTmI5cmZGNzNPWDRZSllKa2hEMTBGUGUrM3QrYzRpc1VvaDdTcWJLU2FaZXFLZU1XaEc4CmVvTHJ2b3pwczZ5V0pRZVhTcGtxQnkrMEhuZS9pZysxQW53YmxyakZ1VG9zdk5ZU3VldFpmZUxRQm9aZlhrbHEKdFRsZWlEVHN2SGdNQ0ppRWJLak5TN1NnZlF4NVRmQzRMY3NoeXRWc1czM2hvQ21Fb2ZuVGxFbkxKR0tSSUx6ZApDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTFRmdXdOaHYyR1hxRjRHM3lZUk9JWEovZ2t3cFJsNHBhCnpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDeWdQQ200OENBd0VBQWFPQm5EQ0IKbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbStJSApWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuCmJHOWlZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0cKM2xtMG1pM2YzQm1HTGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHcwpKMC9Xd2JnY1EzaXpESnI4Nml3OGJtRWJUVXNwOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPCjI5MXhOQnJCVk5wR1ArRFRLcXR0VkNMMU9tTE5JRys2S1luWDNaSHUwMXlpUHFGYlFmWGY1V1JETGVuVk9hdlMKb3QrM2k5REFnQmtjUmNBdGpPajRMYVIwVmtuRkJiVlBGZDV1UkhnNWg2aCt1L041R0pHNzlHK2R3ZkNNTll4ZApBZnZEYmJudlJHMTVSakYrQ3Y2cGdzSC83NnR1SU1SUXlWK2RUWnNYakF6bEFjbWdRV3B6VS9xbFVMUnVKUS83ClRCajAvVkxaam1teDZCRVAzb2pZK3gxSjk2cmVsYzhnZU1KZ0V0c2xRSXhxL0g1Q09FQmtFdmVlZ2VHVExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjA2Njg0Njk2Mjc5NDcyMzEwMjU0Mjc3ODcwMTgwOTY2NzIzNDE1CiMgTUQ1IEZpbmdlcnByaW50OiBjZDo2ODpiNjphNzpjNzpjNDpjZTo3NTplMDoxZDo0Zjo1Nzo0NDo2MTo5MjowOQojIFNIQTEgRmluZ2VycHJpbnQ6IDEzOjJkOjBkOjQ1OjUzOjRiOjY5Ojk3OmNkOmIyOmQ1OmMzOjM5OmUyOjU1Ojc2OjYwOjliOjVjOmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjowNDpjZjo1ZTpiMTpmMzo5YTpmYTo3NjoyZjoyYjpiMToyMDpmMjo5NjpjYjphNToyMDpjMTpiOTo3ZDpiMTo1ODo5NTo2NTpiODoxYzpiOTphMTo3Yjo3Mjo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUdqQ0NBd0lDRVFDYmZnWkpvejVpdWRYdWtFaHhLZTlYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCmNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAphV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAphV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKSUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxRVVHTytpMnQKS21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdQpreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCkNDK1ZrNytxUnkrb1JwZndFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkoKWHd6dzNzSjJ6cS8zYXZMNlFhYWlNeFRKNVhwajA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdQppbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCjJ5RlBocGswZGpaWDNkQVZMOFd0ZnhVZk4ySnpQdFRuWDg0WEE5czEraXZicm1BSlh4NWZqMjY3Q3ozcVdoTWUKREdCdnRjQzFJeUl1Qnd2THFYVExSN3Nkd2RlbGE4d3Ywa0w5U2QybmljOVR1dG9BV2lpL2d0LzR1aE1kVUlhQwovWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCkY0RXJXamZKWGlyMHh1S2hYRlNicGxRQXovRHh3Y2VZTUJvN05oYmJvMjdxL2EyeXd0cnZBa2NUaXNEeHN6R3QKVHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhdDIwWGo1MGVnV1RoL3NWRnVxMXJ1UXA2VGs5TGhPNUw4WDNkRVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgU3ViamVjdDogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgTGFiZWw6ICJFbnRydXN0Lm5ldCBQcmVtaXVtIDIwNDggU2VjdXJlIFNlcnZlciBDQSIKIyBTZXJpYWw6IDk0NjA2OTI0MAojIE1ENSBGaW5nZXJwcmludDogZWU6Mjk6MzE6YmM6MzI6N2U6OWE6ZTY6ZTg6YjU6Zjc6NTE6YjQ6MzQ6NzE6OTAKIyBTSEExIEZpbmdlcnByaW50OiA1MDozMDowNjowOToxZDo5NzpkNDpmNTphZTozOTpmNzpjYjplNzo5Mjo3ZDo3ZDo2NToyZDozNDozMQojIFNIQTI1NiBGaW5nZXJwcmludDogNmQ6YzQ6NzE6NzI6ZTA6MWM6YmM6YjA6YmY6NjI6NTg6MGQ6ODk6NWY6ZTI6Yjg6YWM6OWE6ZDQ6Zjg6NzM6ODA6MWU6MGM6MTA6Yjk6Yzg6Mzc6ZDI6MWU6YjE6NzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lFT0dQZStEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKUlc1MGNuVnpkQzV1WlhReFFEQStCZ05WQkFzVU4zZDNkeTVsYm5SeWRYTjBMbTVsZEM5RFVGTmZNakEwT0NCcApibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHBiV2wwY3lCc2FXRmlMaWt4SlRBakJnTlZCQXNUSENoaktTQXhPVGs1CklFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4TnpVd05URmFGdzB5T1RBMwpNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTNkM2QzCkxtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKWVdJdUtURWxNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFRwpBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKSzB2UnZ3dEtUWTd0Z0hhbFo3ZDRRTUJ6UXNob3dOdFRLOTFldUhhWU5aT0xHcDE4RXpvT0gxdTNIcy9sSkJRZQpzWUdwalgyNHpHdExBL0VDRE55cnBVQWtBSDkwbEtHZENDbXppQXYxaDNlZFZjM2t3MzdYYW1TcmhSU0dsVnVYCk1sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKWFR6V25MTFBLUVA1TDZSUXN0Ukl6Z1V5VllyOXNtUk1EdVNZQjNYYmY5KzVDRlZnaFRBcCtYdElwR21HNHpVLwpIb1pkZW5vVnZlOEFqaFVpVkJjQWtDYVR2QTVKYUpHLytFZlRuWlZDd1E1TjMyOG16OE1ZSVdKbVEzRFcxY0FICjRRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlYKSFE0RUZnUVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUR1YgpqMWFiTU9kVG1YeDZlYWRObDljWmxaRDdCaC9LTTN4R1k0K1daaVQ2UUJzaEo4cm1jblB5VC80eG1mM0lERXhvClU4YUFnaE9ZK3JhdDJsMDk4YzV1OWhVUmxJSU03aitWcnhHckQ5Y3YzaDhEajFjc0hzbTdtaHBFbGVzWVQ2WWYKelgxWEVDK2JCQWxhaExWdTJCMDY0ZGFlMFd4NVhua2NGTVhqMEV5VE8yVTg3ZDg5dnFibGxSckR0Um5EdlY1Ygp1LzhqNzJnWnl4S1RKMXdETFc4dzBCNjJHcXplV3ZmUnFxZ25wdjU1Z2NSNW1UTlh1aEt3cWVCQ2JKUEtWdDcrCmJZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZW5ORk1GWTNoN0NJM3pKcERDNWZjZ0pDTnMyZWJiMGdJRlZiUHYvRXIKZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIFN1YmplY3Q6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIExhYmVsOiAiQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCIKIyBTZXJpYWw6IDMzNTU0NjE3CiMgTUQ1IEZpbmdlcnByaW50OiBhYzpiNjo5NDphNTo5YzoxNzplMDpkNzo5MTo1Mjo5YjpiMTo5NzowNjphNjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ0OmRlOjIwOmQwOjVlOjY2OmZjOjUzOmZlOjFhOjUwOjg4OjJjOjc4OmRiOjI4OjUyOmNhOmU0Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNjphZjo1NzphOTpmNjo3NjpiMDphYjoxMjo2MDo5NTphYTo1ZTpiYTpkZTpmMjoyYTpiMzoxMToxOTpkNjo0NDphYzo5NTpjZDo0Yjo5MzpkYjpmMzpmMjo2YTplYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUVBZ0FBdVRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWURWUVFHRXdKSgpSVEVTTUJBR0ExVUVDaE1KUW1Gc2RHbHRiM0psTVJNd0VRWURWUVFMRXdwRGVXSmxjbFJ5ZFhOME1TSXdJQVlEClZRUURFeGxDWVd4MGFXMXZjbVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBNQjRYRFRBd01EVXhNakU0TkRZd01Gb1gKRFRJMU1EVXhNakl6TlRrd01Gb3dXakVMTUFrR0ExVUVCaE1DU1VVeEVqQVFCZ05WQkFvVENVSmhiSFJwYlc5eQpaVEVUTUJFR0ExVUVDeE1LUTNsaVpYSlVjblZ6ZERFaU1DQUdBMVVFQXhNWlFtRnNkR2x0YjNKbElFTjVZbVZ5ClZISjFjM1FnVW05dmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtNRXV5S3IKbUQxWDZDWnltclY1MUNuaTRlaVZnTEd3NDF1T0t5bWFaTitoWGUyd0NRVnQyeWd1em1LaVl2NjBpTm9TNnpqcgpJWjNBUVNzQlVudUlkOU1jajhlNnVZaTFhZ25uYytnUlFLZlJ6TXBpalMzbGp3dW1VTktvVU1NbzZ2V3JKWWVLCm1wWWNxV2U0UHd6VjkvbFNFeS9DRzlWd2NQQ1B3QkxLQnN1YTRkbktNM3AzMXZqc3VmRm9SRUpJRTlMQXdxU3UKWG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDlYYklHZXZPRjZ1dlVBNjVlaEQ1Zi94WHRhYno1T1RaeQpkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcmwzUmpNNzFvR0RId2VJMTJ2L3llCmpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JVkRhR2V6cTEKQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyCjloa1RJN2dRQ3ZsWXBOUmhjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3gKamt6U3N3RjA3cjUxWGdkSUduOXcveFpjaE1CNWhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMApFcG4zbzBXQzR6eGU5WjJldGNpZWZDN0lwSjVPQ0JSTGJmMXdiV3NhWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6CmtzTGk0eGFObWpJQ3E0NFkzZWtRRWU1K05hdVFyejR3bEhyUU16Mm5aUS8xL0k2ZVlzOUhSQ3dCWGJzZHRUTFMKUjlJNEx0RCtnZHd5YWg2MTdqelYvT2VCSFJuREpFTHFZem1wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBMYWJlbDogIkFkZFRydXN0IEV4dGVybmFsIFJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxZDozNTo1NDowNDo4NTo3ODpiMDozZjo0Mjo0Mjo0ZDpiZjoyMDo3MzowYTozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDAyOmZhOmYzOmUyOjkxOjQzOjU0OjY4OjYwOjc4OjU3OjY5OjRkOmY1OmU0OjViOjY4Ojg1OjE4OjY4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ODo3ZjphNDo1MTozODoyMjo3ODpmZjpmMDpjODpiMToxZjo4ZDo0MzpkNTo3Njo2NzoxYzo2ZTpiMjpiYzplYTpiNDoxMzpmYjo4MzpkOTo2NTpkMDo2ZDoyZjpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU5qQ0NBeDZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnZNUXN3Q1FZRFZRUUdFd0pUUlRFVQpNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SmpBa0JnTlZCQXNUSFVGa1pGUnlkWE4wSUVWNGRHVnlibUZzCklGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGZUhSbGNtNWhiQ0JEUVNCU2IyOTAKTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3TkRnek9Gb3diekVMTUFrR0ExVUVCaE1DVTBVeApGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlVjblZ6ZENCRmVIUmxjbTVoCmJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZ1VtOXYKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dApIN3hzRDgyMStpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5CnVNcS9Oemd0SGo2UlFhMXdWc2Z3VHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelgKbWs2dkJiT21jWlNjY2JOUVlBckhFNTA0QjRZQ3FPbW9hU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWAphMFRreDYzdWJVRmZjbHB4Q0RlemVXV2tXYUNVTi9jQUx3M0NrbkxhMERoeTJ4U29SY1JkS24yM3ROYkU3cXpOCkUwUzN5U3ZkUXdBbCttRzVhV3BZSXhHM3B6T1BWblZaOWMwcDEwYTNDaXRsdHROQ2J4V3l1SHY3NytsZFU5VTAKV2ljQ0F3RUFBYU9CM0RDQjJUQWRCZ05WSFE0RUZnUVVyYjJZZWpTMEp2ZjZ4Q1pVN3dPOTRDVExWQm93Q3dZRApWUjBQQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnWmtHQTFVZEl3U0JrVENCam9BVXJiMlllalMwCkp2ZjZ4Q1pVN3dPOTRDVExWQnFoYzZSeE1HOHhDekFKQmdOVkJBWVRBbE5GTVJRd0VnWURWUVFLRXd0QlpHUlUKY25WemRDQkJRakVtTUNRR0ExVUVDeE1kUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnVkZSUUlFNWxkSGR2Y21zeApJakFnQmdOVkJBTVRHVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnNJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOCkFRRUZCUUFEZ2dFQkFMQ2I0SVVsd3RZajRnK1dCcEtkUVppYzJZUjVnZGtlV3hRSEl6WmxqN0RZZDd1c1FXeEgKWUlOUnNQa3lQZWY4OWlZVHg0QVdwYjlhL0lmUGVIbUpJWnJpVEFjS2hqVzg4dDVSeE5LV3Q5eCtUdTV3L1J3NQo2d3dDVVJRdGpyMFc0TUhmUm5YbkpLM3M5RUswaFpOd0VHZTZuUVkxU2hqVEszck1VVUtoZW1QUjVydWh4U3ZDCk5yNFREZWE5WTM1NWU2Y0pEVUNyYXQyUGlzUDI5b3dhUWdWUjFFWDFuNmRpSVdnVklFTThtZWQ4dlNUWXFaRVgKYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1RytHTW1JUExIekh4UkV6R0JITkpkbUFQeC9pOUY0QnJMdW5NVEE1YQptbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY0NjYwODIwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjphNTpjMzplZDo1ZDpkZDozZTowMDpjMTozZDo4Nzo5MjoxZjoxZDozZjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGIzOjFlOmIxOmI3OjQwOmUzOjZjOjg0OjAyOmRhOmRjOjM3OmQ0OjRkOmY1OmQ0OjY3OjQ5OjUyOmY5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MzpjMTo3Njo0Mzo0ZjoxYjpjNjpkNTphZDpmNDo1YjowZTo3NjplNzoyNzoyODo3Yzo4ZDplNTo3NjoxNjpjMTplNjplNjoxNDoxYToyYjoyYzpiYzo3ZDo4ZTo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wCkxtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKd2IzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVcKS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTBNbG9YRFRJMk1URXlOekl3Ck5UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1Ua3cKTndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeQpaV1psY21WdVkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WCkJBTVRKRVZ1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGbwpOdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzekE5dTNnM3MrSUlSZTdiSldLS2Y0CjRMbEFjVGZGeTBjT2x5cG93Q0tWWWhYYlI5bjEwQ3YvZ2t2SnJUN2VUTnVRZ0ZBL0NZcUVBT3d3Q2owWXpmdjkKS2xtYUk1VVhMRVdlSDI1RGVXME1YSmorU0tmRkkwZGNYdjF1NXg2MDltaEYwWWFEVzZLS2piSGpLWUQrSlhHSQpyYjY4ajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpCjk0RGtaZnMwTnc0cGdIQk5yemlHTHA1L1Y2K2VGNjdySE1zb0lWKzJITmpub2dRaStkUGEyTXNDQXdFQUFhT0IKc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBckJnTlZIUkFFSkRBaQpnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJvCmtPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REhobWFrOGZkTFEvdUUKdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0Ck8xS3pLdHZuMUlTTVkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWEKQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUAo5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFNXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvCmV1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMHRIdXUyZ3VRT0hYdmdSMW0KMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IEdsb2JhbCBDQSIKIyBTZXJpYWw6IDE0NDQ3MAojIE1ENSBGaW5nZXJwcmludDogZjc6NzU6YWI6Mjk6ZmI6NTE6NGU6Yjc6Nzc6NWU6ZmY6MDU6M2M6OTk6OGU6ZjUKIyBTSEExIEZpbmdlcnByaW50OiBkZToyODpmNDphNDpmZjplNTpiOToyZjphMzpjNTowMzpkMTphMzo0OTphNzpmOTo5NjoyYTo4MjoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogZmY6ODU6NmE6MmQ6MjU6MWQ6Y2Q6ODg6ZDM6NjY6NTY6ZjQ6NTA6MTI6Njc6OTg6Y2Y6YWI6YWE6ZGU6NDA6Nzk6OWM6NzI6MmQ6ZTQ6ZDI6YjU6ZGI6MzY6YTc6M2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWRENDQWp5Z0F3SUJBZ0lEQWpSV01BMEdDU3FHU0liM0RRRUJCUVVBTUVJeEN6QUpCZ05WQkFZVEFsVlQKTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNUnN3R1FZRFZRUURFeEpIWlc5VWNuVnpkQ0JIYkc5aQpZV3dnUTBFd0hoY05NREl3TlRJeE1EUXdNREF3V2hjTk1qSXdOVEl4TURRd01EQXdXakJDTVFzd0NRWURWUVFHCkV3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWJNQmtHQTFVRUF4TVNSMlZ2VkhKMWMzUWcKUjJ4dlltRnNJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyc3dZWXpEOQo5QmNqR2xaK1c5ODhiRGprY2JkNGtkUzhvZGhNK0toRHRnUHBUU0VIQ0lqYVdDOW1PU205QlhpTG5Uam9CYmRxCmZuR2s1c1JncHJEdmdPU0pLQStlSmRidGcvT3RwcEhIbU1sQ0dEVVVuYTJZUnBJdVQ4cnhoMFBCRnBWWExWRHYKaVMyQWVsZXQ4dTVmYTlJQWpia1UrQlFWTmRuQVJxTjdjc2lSdjhsVks4M1FsejZjSm1UTTM4NkRHWEhLVHViVQoxWHVwR2MxVjNzanMwbDQ0VStWY1Q0d3QvbEFqTnZ4bTVzdU9wRGtaQUxlVkFqbVJDdzcrT0M3UkhRV2E5azArCmJ3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVdlRMckdBTW9VZ1J4NWFzelBlRTR1d2MyaEdLY2Vlb1cKTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQQplcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWa0RCRjlxbjFsCnVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW4KWjU3UXp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmUwp0UVdWWXJtbTNvazlObnM0ZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGClBzZUtVZ3piRmJTOWJadmx4ckZVYUtuamFaQzJtcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW4KaHc0RWJOWC8zYUJkN1lkU3R5c1ZBcTQ1cG1wMDZkckU1N3hOTkI2cFhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVgo1ZkVXQ1JFMTFhemJKSEZ3TEpoV0M5a1h0TkhqVVN0ZWRlalYwTnhQTk8zQ0JXYUFvY3ZtTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjY1OjU4OjhiOmEyOjFhOjMxOjcyOjczOjY4OjVjOmI0OmE1OjdhOjA3OjQ4CiMgU0hBMSBGaW5nZXJwcmludDogZTY6MjE6ZjM6MzU6NDM6Nzk6MDU6OWE6NGI6Njg6MzA6OWQ6OGE6MmY6NzQ6MjI6MTU6ODc6ZWM6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQ1OjliOjlmOjYzOmIyOjI1OjU5OmY1OmZhOjVkOjRjOjZkOmIzOmY5OmY3OjJmOmYxOjkzOjQyOjAzOjM1Ojc4OmYwOjczOmJmOjFkOjFiOjQ2OmNiOmI5OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJNQjRYRFRBME1ETXdOREExTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRQpCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wCklGVnVhWFpsY25OaGJDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWVYKVmFDanh1QWZqSjBoVU5mQnZpdGJ0YVNlb2RseVdMMEFHMHkvWWNrVUhVV0NxOFlkZ05ZOTZ4Q2NPcTl0SlBpOApjUUdlQnZWOFh4N0JEbFhLZzVwWk1LNFp5ekJJbGUwaU40MzBTcHB5Wmo2dGxjRGdGZ0RnRUI4ck1RN1hsRlRUClFqT2dOQjBlUlhiZFQ4b1lOK3lGRlhvWkNQelZ4NXp3OHFrdUVLbVM1ajFZUGFrV2FEd3ZkU0VZZnloM3BlRmgKRjdlbTZmZ2VtZHR6YnZRS29pRnM3dHFxaFpKbXIvWjZhNExhdWlJSU5RL1BRdkUxK21ydWZpc2x6RG9SNUcydgpjN0oySGEzUXNuaG5HcVE1SEZFTFoxYUQvVGhkRGM3ZDhMc3JsaC9lZXpKUy9SMjd0UWFoc2lGZXBkYVZhSC93Cm1aN2NSUWcrNTlJSkRUV1UzWUJPVTVmWHRRbEVJR1FXRndNQ1RGTU5hTjdWcW5KTmsyMkNEdHVjdmMrMDgxeGQKVkhwcENaYlcyeEhCalhXb3RNODV5TTQ4dkNSODVtTEs0YjE5cDcxWFpRdmsvaVh0dG1rUTNDZ2FScjBCSGRDWAp0ZUdZTzhBM1pOWTlsTzRMNGZVb3JndFd2M0dMSXlsQmpvYkZTMUo3MkhHckg0b1ZwanVEV3RkWUFWSEdURUhaCmY5aEJaM0tpS045Z2c2bWV5SHY4VTNOeVdmV1RlaGQyRHM3MzVWelpDMVUwb3FwYnRXcFU1eFBLVit5WGJmUmUKQmk5RmkxalVJeGFTNUJadUtHTlpNTjlRQVp4amlScWYyeGVVZ25BM3d5U2Vta2ZXV3NwT3FHbUpjaCtSYk50KwpuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4bmk0b1Bta21NOFY3QWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQjhHQTFVZEl3UVkKTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlgKSXdqaG1GN0RXZ2gycWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bgpBTlhIL0t0dGdDSndwUXpnWFFRcEF2dkxvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6CnV6WVltNFVQRmQzdUxheDJrN25aQVkxSUVLajc5VGlHOGRzS3hyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU4KUG5iaXVjb244bCtmNzI1WkRRYllLeGVrMG54cnUxOFVHa2lQR2t6bnMwY2Nqa3hGS3lEdVNOL24zUW1PR0tqYQpRSTJTSmhGVFlYTmQ2NzNueEUwcE4ySHJyRGt0Wnk0VzF2VUFnNFdoekg5MnhIM2t0MHRtN3dORllHbTJERktXCmtvUmVwcU8xcEQ0cjJjellHMGVxOGtUYVQva0Q2UEFVeXovemc5N1F3VlRqdCtnS04wMkxJRmtETUJtaExNaTkKRVIvZnJzbEt4Zk1uWm1hR3JHaVIvOW5tVXh3UGkxeHBaUW9teUI0MHcxMVJlOWVwbkFhaE50M1ZpWlM4MmVRdApERjRKYkFpWGZLTTlmSlAvUDZFVXA4KzFYZXZiMnh6RWR0K0l1YjFGQlpVYnJ2eEdha3l2U09QT3JnL1NmdXZtCmJKeFBnV3A2Wkt5N1B0WG55M1l1eGFkSXdWeVFEOHZJUC9ybU11R05HMitrNW83WStTbElpczV6L2l3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDM0OmZjOmI4OmQwOjM2OmRiOjllOjE0OmIzOmMyOmYyOmRiOjhmOmU0Ojk0OmM3CiMgU0hBMSBGaW5nZXJwcmludDogMzc6OWE6MTk6N2I6NDE6ODU6NDU6MzU6MGM6YTY6MDM6Njk6ZjM6M2M6MmU6YWY6NDc6NGY6MjA6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjIzOjRmOjNiOmM4OjUyOjdjOmE1OjYyOjhlOmVjOjgxOmFkOjVkOjY5Ojg5OjVkOmE1OjY4OjBkOmM5OjFkOjFjOmI4OjQ3OjdmOjMzOmY4Ojc4OmI5OjViOjBiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJJREl3SGhjTk1EUXdNekEwTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRApWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxCmMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFDelZGTEJ5VDd5MmR5eFV4cFpLZWV4dzBVbzVkZlI3Y1hGUzZHcWRIdFhyMG9tL05qMVhxZHVHZHQwREU4MQpXeklMQWVQYjYzcDNOZXFxV3VEVzZLRlhsUENRbzNSV2xFUXdBeDVjVGl1RkpuU0NlZ3gyb0c5TnprRXRvQlVHCkZGKzNRczE3ajFoaE5Od3FDUGt1d3dHbUlrUWNUQWVDNWx2TzBFcDhCTk1aY3lmd3FwaC9McTlPNjRjZUpIZHEKWGJib1cwVzYzTU9oQlc5V2pvOFFKcVZKd3k3WFFZY2k0RStHeW1DMTZxRmp3QUdYRUhtOUFEd1NiU3NWc2F4TApzZTRZdVU2VzNOeDIvenUrejE4RHdQdzc2TDVHRy8vYVFNSlM5LzdqT3ZkcWR6WFEybzNyWGhocU1jY2V1andiCktOWnJWTWFxVzllaUxCc1p6S0lDOXB0WnZUZHJoclZ0Z3JyWTZzbFd2S2syV1AwK0dmUHREQ2Fwa3pqNFQ4RmQKSWdiUWwrcmhyY1pWNElFcktJTTYrdlI3SVZFQXZsSTR6czFtZWFqMGdWYmkwSU1KUjFGYlVHclAyMGdhWFQ3Mwp5L1psOTJ6eGxmZ0NPekpXZ2psNlc3MHZpUnUvb2JUby8zK05qTjhEOFdCT1dCRk02Nk0vRUN1RG1nRnoyWlJ0CmhBQW5acXp3Y0VBSlFwS3RUNU1OWVFsUkpOaVMxUXVVWWJLSHN1My9talgvaFZUSzdVUkRyQnM4Rm10SVNnb2MKUUlnZmtzSUxBQVgvOHNnQ1NxU3FxY3labHB3dldPQjk0YjY3Qjl4ZkJISmNNVFREN0Y4dDREMWtrQ0xtMGV5NApMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHOGRoY3lGVlF5V2k5cUxvMkNRSURBUUFCbzJNd1lUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBZkJnTlYKSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFEKTDFFdXhCUmEzdWdaNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJncgpGZzVmTnVIOEtyVXdKTS9nWXd4N1dCcittYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvCmFnL0h0UFFUeE9SYjdRclNwSmRNS3UwdmJCS0pQZkVuY0twcUExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVkKVDFVNlUrUHY4dlNmeDN6WVdLOHBJcGU0NEwyUkxyQjI3RmNSeis4cFJQUHBoWHBnWStSZE00a1gyVEdxMnRiegpHRFZ5ejRjckwyTWpoRjJFakQ5WG9JajhtWkVvSm1tWjFJK1hSTDZPMVVpeHBDZ3A4UlcwNGVXZTNmaVBwbThtCjF3azhPaHdSRHFac04vZXRSSWNzS01mWWRJS3owRzlLVjdzMUtTZWdpK2docDRka05sM00yQmFzeDdJblFKSlYKT0NpTlVXN2RGR2RUYkhGY0pvUk5kVnEyZm1CV3FVMnQrNXNlbC9NTjJkS1hWSGZhUFJLMzRCN3ZDQWFzK1lXSAo2YUxjcjM0WUVvUDlWaGRCTHRVcGduMlo5REgyY2FuUExBRW5wUVc1cXJKSVRpcnZuNU5TVVpVOFVuT09Wa3dYClFNQUpLT1NMYWtoVDIrek5WVlh4eHZqcG9peE1wdEVtWDM2dldremFINmJ5SEN4K3JnSVcwbGJRTDFkVFIraVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgU3ViamVjdDogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBMYWJlbDogIlZpc2EgZUNvbW1lcmNlIFJvb3QiCiMgU2VyaWFsOiAyNTk1MjE4MDc3NjI4NTgzNjA0ODAyNDg5MDI0MTUwNTU2NTc5NAojIE1ENSBGaW5nZXJwcmludDogZmM6MTE6Yjg6ZDg6MDg6OTM6MzA6MDA6NmQ6MjM6Zjk6N2U6ZWI6NTI6MWU6MDIKIyBTSEExIEZpbmdlcnByaW50OiA3MDoxNzo5Yjo4Njo4YzowMDphNDpmYTo2MDo5MTo1MjoyMjozZjo5ZjozZTozMjpiZDplMDowNTo2MgojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZmE6Yzk6YmQ6NTU6ZmI6MGE6Yzc6OGQ6NTM6YmI6ZWU6NWM6ZjE6ZDU6OTc6OTg6OWY6ZDA6YWE6YWI6MjA6YTI6NTE6NTE6YmQ6ZjE6NzM6M2U6ZTc6ZDE6MjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvakNDQW9xZ0F3SUJBZ0lRRTRZMVRSMC9CdkxCK1dVRjFaQWNZakFOQmdrcWhraUc5dzBCQVFVRkFEQnIKTVFzd0NRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbApjbTVoZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52CmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMldoY05Nakl3TmpJME1EQXhOakV5V2pCck1Rc3cKQ1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsY201aApkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnZiVzFsCmNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgKMm1DeGxDZkxGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RQpscEY3c0RQd3NSUk9FVysxUUs4YlJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWClpxVzFMUzdZZ0ZteXB3MjNSdXdoWS84MXE2VUN6eXIwVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEKMjk5eU9JenpscjN4Rjd6U3VqdEZXc2FuOXNZWGl3R2QvQm1vS29NV3VEcEkvazQrb0tzR0dlbFQ4NEFUQiswdAp2ejhLUEZVZ09Td3NBR2wwbFVxOElMS3BlZVVZaVpHbzNCeE43N3QrTnd0ZC9qbWxpRktNQUd6c0dIeEJ2ZmFMCmRYZTZZSjJFNS80dEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUVZPSU1QUHl3L2NETWV6VWIrQjR3ZzROZkR0ekFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQVgvRkJmWHhjQ0xrcjROV1NSL3BuWEtVVHd3TWhteXRNaVViUFdVM0ovcVZBdG1QTjNYRW9sV2NSCnpDU3MwMFJzY2E0QklHc0RvbzhZdHlrNmZlVVdZRk40UE1DdkZZUDNqMUl6Skwxa2s1ZnVpL2ZiR0todGNiUDMKTEJmUWRDVnA5LzVyUEpTK1RVdEJqRTdpYzlEamtDSnpRODN6NytwenprV0tzS1pKLzB4OW5YR0l4SFlka0ZzZAo3djNNOSs3OVlLV3hlaFp4MFJiUWZCSThiR21YMjY1Zk9acHdMd1U4R1VZRW1TQTIwR0J1WVFhN0ZrS01jUGN3CisrRGJacU1BQWIzbUxOcVJYNkJHaTAxcW5EMDkzUVZHL25hL29Bbzg1QURtSjdmL2hDM2V1aUlubGhCeDZ5THQKMzk4em5NL2pyYTZPMUk3bVQxR3ZGcExnWFBZSER3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBMYWJlbDogIkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDQ5Ojc5OjA0OmIwOmViOjg3OjE5OmFjOjQ3OmIwOmJjOjExOjUxOjliOjc0OmQwCiMgU0hBMSBGaW5nZXJwcmludDogZDE6ZWI6MjM6YTQ6NmQ6MTc6ZDY6OGY6ZDk6MjU6NjQ6YzI6ZjE6ZjE6NjA6MTc6NjQ6ZDg6ZTM6NDkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ3OmE3OmEwOmZiOjVkOjdlOjI3OjMxOmQ3OjcxOmU5OjQ4OjRlOmJjOmRlOmY3OjFkOjVmOjBjOjNlOjBhOjI5OjQ4Ojc4OjJiOmM4OjNlOmUwOmVhOjY5OjllOmY0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0F3U1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3cKR0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sagpZWFJsSUZObGNuWnBZMlZ6TUI0WERUQTBNREV3TVRBd01EQXdNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ01Fa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnd3SFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2d3UlEyOXRiMlJ2SUVOQklFeHBiV2wwWldReElUQWZCZ05WQkFNTQpHRUZCUVNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFMNUFuZlJ1NGVwMmh4eE5SVVNPdmtiSWd3YWR3U3IrR0IrTzVBTDY4NnRkVUlvV01RdWEKQnRERmNDTE5TUzFVWTh5MmJtaEdDMVBxeTB3a3dMeHlUdXJ4RmE3MFZKb1NDc042c2pOZzR0cUpWZk1pV1BQZQozTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVc2kxNEhaR1dDd0Vpd3FKSDVZWjkySUZDb2tjZG10ZXQ0CllnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXWTE5empOb0ZtYWc0cU1zWGVEWlIKck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakhZcHkrZzhjbQplejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVCm9CRUtJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdld1lEVlIwZkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdgpRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0CmIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbTdsM3NBZzlnMW8xUQpHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDIKRzl3ODRGb1Z4cDdaOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaQpsMkQ0a0Y1MDFLS2FVNzN5cVdqZ29tN0MxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzCnNtUGk5V0lzZ3RScUFFRlE4VG1EbjVYcE5wYVliZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSIKIyBTZXJpYWw6IDk4NTAyNjY5OQojIE1ENSBGaW5nZXJwcmludDogMjc6ZGU6MzY6ZmU6NzI6Yjc6MDA6MDM6MDA6OWQ6ZjQ6ZjA6MWU6NmM6MDQ6MjQKIyBTSEExIEZpbmdlcnByaW50OiBkZTozZjo0MDpiZDo1MDo5MzpkMzo5Yjo2Yzo2MDpmNjpkYTpiYzowNzo2MjowMTowMDo4OTo3NjpjOQojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6NWU6ZGU6M2I6YmI6ZjA6OWM6OGE6ZTE6NWM6NzI6ZWY6YzA6NzI6Njg6ZDY6OTM6YTI6MWM6OTk6NmY6ZDU6MWU6Njc6Y2E6MDc6OTQ6NjA6ZmQ6NmQ6ODg6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwRENDQkxpZ0F3SUJBZ0lFT3JaUWl6QU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFbE1DTUdBMVVFQ3hNY1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV1TUN3R0ExVUVBeE1sVVhWdlZtRmthWE1nVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBek1Ua3hPRE16TXpOYUZ3MHlNVEF6TVRjeE9ETXoKTXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVdwpJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSCmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcApsaTRrVkVBa09QY2FoZHhZVE11a0owS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJECnJPcG0yUmdiYUlyMVZ4cVl1dlh0ZGoxODJkNlVhanRMRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkoKV0NDWWZxdGZmcC9wMWszc2czU3B4MnpZN2lsS2hTb0dGUGxVNXRQYVpRZUxZemNTMTlEc3czc2dRVVNqN2N1ZwpGK0Z4WmM0ZFpqSDNkZ0VaeUgwRFdMYVZTUjJtRWlib3hneDI0T05teStwZHBpYnU1Y3hmdldlbkFTY09vc3BVCnhiRjZsUjF4SGtvcGlnUGNha1hCcEJsZWJ6Yk53Nkt3dC81Y09PSlN2UGhFUSthUXV3SURBUUFCbzRJQ1VqQ0MKQWs0d1BRWUlLd1lCQlFVSEFRRUVNVEF2TUMwR0NDc0dBUVVGQnpBQmhpRm9kSFJ3Y3pvdkwyOWpjM0F1Y1hWdgpkbUZrYVhOdlptWnphRzl5WlM1amIyMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0NBUm9HQTFVZElBU0NBUkV3CmdnRU5NSUlCQ1FZSkt3WUJCQUcrV0FBQk1JSDdNSUhVQmdnckJnRUZCUWNDQWpDQnh4cUJ4RkpsYkdsaGJtTmwKSUc5dUlIUm9aU0JSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEowZVNCaApjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5ClpDQjBaWEp0Y3lCaGJtUWdZMjl1WkdsMGFXOXVjeUJ2WmlCMWMyVXNJR05sY25ScFptbGpZWFJwYjI0Z2NISmgKWTNScFkyVnpMQ0JoYm1RZ2RHaGxJRkYxYjFaaFpHbHpJRU5sY25ScFptbGpZWFJsSUZCdmJHbGplUzR3SWdZSQpLd1lCQlFVSEFnRVdGbWgwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE11WW0wd0hRWURWUjBPQkJZRUZJdExiZTNUCktia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdUJnTlZIU01FZ2FZd2dhT0FGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnEKeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcApkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEClZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNnRsQ0wKTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTawpmbklZajlsb2ZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4CjdDOVRxbk43QXoxMGJ1WVdudXVsTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVIKY0hoWEhUTWUvUUtabkF6TkNnVlB4N3VPcEhYNlNtMnhnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweQptUU02aXN4VUpUa3hnWHNUSWxHNlJteWh1NTc2Qkd4SkpuU1AwblByekRDaTV1cFpJb2Y0bC9VTy9lck1rcVFXCnhGSVk2aUhPc2ZIbWhJSGx1cW1HS1BKRFdsMFNuYXdlMmFqbENtcW5mNkNIS2MveWlVM1U3TVhpNW5yUU5pT0sKU25RMitRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIiCiMgU2VyaWFsOiAxMjg5CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTozOTo3YjpkZDpmODpiYTplYzo4MjplOTphYzo2MjpiYTowYzo1NDowMDoyYgojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOjNhOmZiOmNmOjEyOjQwOjM2OjRiOjQ0OmIyOjE2OjIwOjg4OjgwOjQ4OjM5OjE5OjkzOjdjOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTphMDpkZDo3ZDpkNzoyMDphZDpiNzpmZjowNTpmODozZDo1NDoyYjoyMDo5ZDpjNzpmZjo0NToyODpmNzpkNjo3NzpiMTo4Mzo4OTpmZTphNTplNTpjNDo5ZTo4NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnR6Q0NBNStnQXdJQkFnSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTWpBZUZ3MHdOakV4TWpReE9ESTNNREJhRncwek1URXhNalF4T0RJek16TmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNhCkdNcExsQTBBTGE4REtZcndENEhJcmt3WmhSMEluNnNwUklYekw0R3RNaDZRUnIramhpWWFIdjUrSEJnNlhKeGcKRnlvNmRJTXpNSDFoVkJITDdhdmc1dEtpZnZWcmJ4aTNDZ3N0L2VrKzd3ckdzeERwM01KR0YvaGQvYVRhLzU1SgpXcHptTStZa2x2Yy91bHNySEhvMXd0Wm4vcXRtVUl0dEtHQXI3OWRndzhlVHZJMDJrZk4vK05zUkU4U2NkM2JCCnJyY0Nhb0Y2cVVXRDRnWG11VmJCbERlUFNIRmpJdXdYWlFlVmlrdmZqOFphQ3VXdzQxOWVheEdyRFBtRjYwVHAKK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3lsWlV0UW9mWDFiT1FRN2RzRS9IZTNmYkUrSWsvMFhYMQprc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dDY2LzNGc3ZielNVcjVSLzdtcC9pClVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhud1E1aFlJaXoKUHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZwovek9oRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVICm95Y1I3aFlRZTd4RlNreXlCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUkKeVY3N3pHSGNpek4zMDBReU5RbGlCSklXRU5pZUowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyCkE4UVpSdEdVYXpCdUJnTlZIU01FWnpCbGdCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhNkZKcEVjd1JURUwKTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVApFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmCkJsdW9ybkZkTHdVdlorWVRSWVBFTnZiendDWU1EYlZIWkYzNHRITEpScVVER0NkVmlYaDlkdXFXTklBWElOem4KZy9pTi9BZTQybDlOTG1leWhQM1pSUHgzVUlIbWZMVEpEUXR5VS9oMkJ3ZEJSNVlNKytDQ0pwTlZqUDRpSDJCbApmRi9uSnJQM01wQ1lVTlEzY1ZYMmtpRjQ5NVY1K3ZndEpvZG1WakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLCldXUEtqYUpXMWFjdnZGWWZ6em5CNHZzS3FCVXNmVTE2WThac2wwUTgwbS9EU2hjSytKRFNWNklaVWFVdGwwSGEKQjArcFVOcVFqWlJHNFQ3d2xQMFFBRGoxTytoQTRiUnVWaG9nekc5WWplMHVSWS9XNlpNLzU3RXMzenJXSW96YwpoTHNpYjlENDVNWTU2UVNJUE1PNjYxVjZiWUNaSlBWc0FmdjRsN0NVVyt2OTBtL3hkMmdOTldRanJMaFZvUVBSClRVSVozUGgxV1ZhaithaEplZml2RHJrUm9IeTNhdTAwMExZbVlqZ2Fod3o0NlAwdTA1Qi9CNUVxSGRaK1hJV0QKbWJBNENEL3BYdmsxQitUSlltNVhmNmRRbGZlNnlKdm1qcUlCeGRabXYzbGg4endjNGJtQ1hGMmd3K25ZU0wwWgpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSTRwRVpYTkx4SWQyNkYwS0NsM0dCVXpHcG4vWjlZcjl5CjRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04VkNMQUFWQnBRNTcwc3U5dCtPemEKOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIgojIFNlcmlhbDogMTQ3OAojIE1ENSBGaW5nZXJwcmludDogMzE6ODU6M2M6NjI6OTQ6OTc6NjM6Yjk6YWE6ZmQ6ODk6NGU6YWY6NmY6ZTA6Y2YKIyBTSEExIEZpbmdlcnByaW50OiAxZjo0OToxNDpmNzpkODo3NDo5NToxZDpkZDphZTowMjpjMDpiZTpmZDozYToyZDo4Mjo3NTo1MTo4NQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6ZjE6ZmM6N2Y6MjA6NWQ6Zjg6YWQ6ZGQ6ZWI6N2Y6ZTA6MDc6ZGQ6NTc6ZTM6YWY6Mzc6NWE6OWM6NGQ6OGQ6NzM6NTQ6NmI6ZjQ6ZjE6ZmU6ZDE6ZTE6OGQ6MzUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ016QWVGdzB3TmpFeE1qUXhPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFETQpWMElXVkp6bW1OUFRUZTcrN2NlZlF6bEtaYlBvRm9nMDJ3MVprWFRQa3JnRVFLMENTekdydkkyUmFOZ2dEaG9CCjRocDdUaGRkNG9xM1A1a2F6ZXRocThKbHBoKzN0NzIzai96OWNJOExvR2UrQWFKWnozSG1EeWwyLzdGV2VVVXIKSDU1NlZPaWpLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZAo4bHl5QlROdmlqYk8wQk5PLzc5S0REUk1wc01odlZBRVZldXh1NTM3UlI1a0ZkNVZBWXdDZHJYTG9UOUNhYnd2CnZXaERGbGFKS2pkaGtmMm1yazdBeXhSbGxEZExrZ2J2Qk5ESW5JamJDM3VCcjdFOUtzUmxPbmkyN3R5QXNkTFQKbVp3NjdtdGFhN09OdDlYT25NSytwVXN2RnJHZWFEc0diNjU5bi9qZTdNd3BwNWlqSlVNdjcvRmZKdUdJVGZoZQpidGZaRkc0Wk0ybW5PNFNKazhSVFZST2hVWGhBK0xqSm91NTd1bEpDZzU0VTdRVlNXbGxXcDVmOG5UOEtLZGpjClQ1RU9FN3plbGFUZmk1bStySnN6aU8rMWdhOGJ4aUpUeVBiSDdwY1VzTVY4ZUZMSThNNXVkMkNFcHVrcWRpRHQKV0FFWE1KUHBHb3ZnYzJQWmFwS1VTVTYwclVxRnhLTWlNUHdKN1dnaWM2YUlERlVoV01YaE9wOHEzY3Joa09EWgpjNnRzZ0xqb0MyU1RvSnlNR2YrejBnenNrU2FIaXJPaTRYQ1BMQXJselcxb1VldmFQd1YvaXpMbUUxeHIvbDlBCjRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHp1RDg3blNWTDJ2OUE2d0lEQVFBQm80SUJsVENDQVpFd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVEJna3JCZ0VFQWI1WUFBTXdnY1V3Z1pNRwpDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqWVhSbElHTnZibk4wCmFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdQpkQzR3TFFZSUt3WUJCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53CmN6QUxCZ05WSFE4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEcKQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREViTUJrR0ExVUVBeE1TVVhWdlZtRmthWE1nClVtOXZkQ0JEUVNBemdnSUZ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBVDYyZ0xFejZ3UEp2OTJaVnF5TTAKN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbQpkMW80MTcrc2h2enVYWU84QnNiUmQyc1BiU1F2UzNwc3B3ZVd5dU9FbjYySWl4MnJGbzFiWmhmWkZ2U0xnTkxkCitMSjJ3L3c0RTZvTTNrSnBLMjd6UE91QUo5djFwa1FObjFwVldRdlZEVkpJeGE2ZjhpK0F4ZW95VURVU2x5N0IKNGYveEk0aFJPSi95WmxaMjV3OVJsNlZTREUxSlVaVTJQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTgp0NTRDcm5NQXlOb2pBK2o1NmhsMFlnQ1V5eUlndnBTbldiV0NhcjZaZVhxcDhrb2tVdmQwL2JwTzVxZ2RBbTZ4CkRZQkV3YTdUSXpkZnU0VjhLNUl1Nkg2bGk5Mlo0YjhuYnkxZHFudUgvZ3JkUy95TzlTYmtibkJDYmpQc01aNTcKazhIa3lXa2FQY0JyVGlKdDdxdFlUY2JRUWNFcjZrOFNoMTdyUmRoczlaZ0MwNkRZVllvR21SbWlvSGZSTUo2cwp6SFh1Zy9Xd1lqblBiRmZpVE5LUkN3NTFLQnVhdi8wYVEvSEtkL3M3ajJHNGFTZ1dRZ1JlY0NvY0lkaVA0YjBqCld5MTBRSkxaWXhrTmM5MXB2R0pIdk9CMEs3THJmYjVCRzdYQVJzV2hJc3RmVHNFb2t0NFl1dFVxS0xzUml4ZVQKbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicnFaNWhIWTh5Mm80TTFuUStld2trMmdGM1I4UTd6VFNNbWZYSwo0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZjE6YmM6NjM6NmE6NTQ6ZTA6YjU6Mjc6ZjU6Y2Q6ZTc6MWE6ZTM6NGQ6NmU6NGEKIyBTSEExIEZpbmdlcnByaW50OiAzNjpiMToyYjo0OTpmOTo4MTo5ZTpkNzo0Yzo5ZTpiYzozODowZjpjNjo1Njo4Zjo1ZDphYzpiMjpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6NWU6NzI6ZWQ6OWY6NTY6MGU6ZWM6NmU6YjQ6ODA6MDA6NzM6YTQ6M2Y6YzM6YWQ6MTk6MTk6NWE6Mzk6MjI6ODI6MDE6Nzg6OTU6OTc6NGE6OTk6MDI6NmI6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURXakNDQWtLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJRTVFzd0NRWURWUVFHRXdKS1VERVkKTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdIaGNOTURNd09UTXdNRFF5TURRNVdoY05Nak13T1RNd01EUXlNRFE1CldqQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWUQKVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN6cy81LzAyMng3eFo4VjZVTWJYYUtMMHUvWlB0TTdvcnc4eWw4CjlmL3VLdURwNmJwYlpDS2FtbThzT2lacFVRV1pKdHpWSEdweHhwcDlIcDNkZkd6R2pHZG5Tajc0Y2JBWko2a0oKREthVnYwdU1EUHBWbUR2WTZDS2hTM0U0ZWF5WGttbXppWDdxSVdnR21CU1doOUpoTnJ4dEoxYWVWKzdBd0ZiOQpNcytrMlk3Q0k5ZU5xUFBZSmF5WDVIQTQ5TFk2dEowN2x5WkRvNkc4U1ZseVRDTXdod0ZZOWs2K0hHaFdacS9OClFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkREpaa25kd2k5MlNMMzJIZUZaUlNGYUI5VXNsTHFDSEoKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjJKQ2h6QWdNQkFBR2pQekE5TUIwRwpBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkcKa2wzZzBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmcgpVajk0bks5TnJ2alZUOCthbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241CkJ3K1NVRW1LM1RHWFg4bnBONm83V1dXWGxETEpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlUKSlJETDhUcnkyZnJiU1ZhN3B2Nm5RVFhENEloaHlZakgzellRSXBoWjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdApSU2ZsTU1GZTh0b1R5eVZDVVpWSEE0eHNJY3gwUXUxVC96T0xqdzlYQVJZdno2YnV5WEFpRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgU3ViamVjdDogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIExhYmVsOiAiU29uZXJhIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDI5CiMgTUQ1IEZpbmdlcnByaW50OiBhMzplYzo3NTowZjoyZTo4ODpkZjpmYTo0ODowMTo0ZTowYjo1Yzo0ODo2ZjpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OmY3OjZkOmU2OjA3OjdjOjkwOmM1OmIxOjNlOjkzOjFhOmI3OjQxOjEwOmI0OmYyOmU0OjlhOjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3OTowODpiNDowMzoxNDpjMTozODoxMDowYjo1MTo4ZDowNzozNTo4MDo3ZjpmYjpmYzpmODo1MTo4YTowMDo5NTozMzo3MTowNTpiYTozODo2YjoxNTozZDpkOToyNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUApNQTBHQTFVRUNoTUdVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4Ck1EUXdOakEzTWprME1Gb1hEVEl4TURRd05qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlYKQkFvVEJsTnZibVZ5WVRFWk1CY0dBMVVFQXhNUVUyOXVaWEpoSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpBWFNqV2R5dkFObHNkRStoWTMvRWk5dlgrQUxUVTc0VytvClo2bS9BeHhOakc4eVI5VkJhS1FUQk1FMURKcUVRL3hjSGYrSnMrZ1hHTTJSWC91SjQrcS9UbDE4R3liVGRYbnQKNW9UalYrV3RLY1QwT2lqbnBYdUVObW16L1Y1MnZhTXRtZE9RVGlNb2ZSaGo4VlE3SnAxMlc1ZENzdit1OEU3cwozVG1WVG9NR2YrZEpRTWpGQWJKVVdtWWRQZno1NlR3S25vRzRjUEFCaStRalZIeklydmlRSGdDV2N0UlV6MkVqCnZPcjduUUtWMGJhNWNUcHBDRDhQdE9GQ3g0ajFQNWlvcDdvYzRIRng3MWhYZ1ZCNlhHdDBSZzZEQTVqRGpxaHUKOG5ZeWJpZUR3blB6M0Jqb3RKUHFkVVJyQkdBZ2NWZUhuZk8rb0pBalBZb2s0ZG9oMjhNQ0F3RUFBYU16TURFdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ05WSFE0RUNnUUlTcUNxV0lUVFhqd3dDd1lEVlIwUEJBUURBZ0VHCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmF6b2Y1Rm5JVlYwc2QyWnZub2lZdzdKTm4zOVl0MGpTdjl6aWwKenFzV3Vhc3ZmRFhMck5BUHRFd3IvSUR2YTR5Ulh6WjI5OXV6R3hucTlMSVIvV0Z4Ukw4b3N6b2R2N05ENkorLwozREVJY2JDZGpkWTBSektReG1Vazk2QktmQVJ6anpsdkY0eHl0YjFMeUhyNGU0UERLRTZjQ2VwblA3Sm5CQnZECkZOcjQ1MGtra2RBZGF2cGhPZTlyNXlGMUJnZllFclFoSUhCQ2NZSGFQSm8ydnFaYkRXcHNtaCtSZS9uNTcwSzYKVGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeEV0ektPNmd1blJSYUJYVzM3TmRqNHJvMXRnUUlrZWphblp6MgpaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExIbGxwd3JOOU0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBTdWJqZWN0OiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgTGFiZWw6ICJYUmFtcCBHbG9iYWwgQ0EgUm9vdCIKIyBTZXJpYWw6IDEwNzEwODkwODgwMzY1MTUwOTY5Mjk4MDEyNDIzMzc0NTAxNDk1NwojIE1ENSBGaW5nZXJwcmludDogYTE6MGI6NDQ6YjM6Y2E6MTA6ZDg6MDA6NmU6OWQ6MGY6ZDg6MGY6OTI6MGE6ZDEKIyBTSEExIEZpbmdlcnByaW50OiBiODowMTo4NjpkMTplYjo5Yzo4NjphNTo0MTowNDpjZjozMDo1NDpmMzo0Yzo1MjpiNzplNTo1ODpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogY2U6Y2Q6ZGM6OTA6NTA6OTk6ZDg6ZGE6ZGY6YzU6YjE6ZDI6MDk6Yjc6Mzc6Y2I6ZTI6YzE6OGM6ZmI6MmM6MTA6YzA6ZmY6MGI6Y2Y6MGQ6MzI6ODY6ZmM6MWE6YTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFawpNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZClVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3gKTkRBMFdoY05NelV3TVRBeE1EVXpOekU1V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkMwpkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5CmRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1lKQjY5RmJTNgozOGVNcFNlMk9BdHA4N1pPcUN3dUlSMWNSTjhoWFg0amRQNWVmclJLdDZhdEg2N2dCaGJpbTF2WlozUnJYWUNQCktaMkdHOW1jRFpodGRoQW9XT1Jsc0g5S21IbWY0TU14Zm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1EKRHhJRU01ZGZUMkZhOE9UNWthdm5IVHU4Nk0vMGF5MDBmT0pJWVJ5TzgyRkV6RytnU3FtVXNFM2E1NmswZW5JNApxRUhNUEpRUmZldklwb3kzaHN2S016dlpQVGVMKzNvK2hpem5jOWNLVjZ4a214bnI5QThFQ0lxc0F4Y1paUFJhCkpTS05OQ3l5OW1nZEVtM1RpaDRVMnNTUHB1SWpoZFY2RGIxcTRPbnM3QmU3UWh0bnFpWHRSWU1oL01ISmZOVmkKUHZyeXhTM1QvZFJsQWdNQkFBR2pnWjh3Z1p3d0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUApCQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNWlBvajBHWTRRSm5NNWk1QVNzCmpWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTlqY213dWVISmhiWEJ6WldOMWNtbDAKZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjL0toNFp6WHhIZkFSCnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYQpJUjlObVhtZDRjOG5ueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5Cmk2bXg1TythR3RBOWFabnVxQ2lqNFR5ejhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVEKTys3RVRQVHNKM3hDd25SOGdvb0p5YlFESmJ3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkdvIERhZGR5IENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA5MTpkZTowNjoyNTphYjpkYTpmZDozMjoxNzowYzpiYjoyNToxNzoyYTo4NDo2NwojIFNIQTEgRmluZ2VycHJpbnQ6IDI3Ojk2OmJhOmU2OjNmOjE4OjAxOmUyOjc3OjI2OjFiOmEwOmQ3Ojc3OjcwOjAyOjhmOjIwOmVlOmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMzo4NDo2YjpmMjo0Yjo5ZTo5MzpjYTo2NDoyNzo0YzowZTpjNjo3YzoxZTpjYzo1ZTowMjo0ZjpmYzphYzpkMjpkNzo0MDoxOTozNTowZTo4MTpmZTo1NDo2YTplNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaApNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFCllXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTMKTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSbwpaU0JIYnlCRVlXUmtlU0JIY205MWNDd2dTVzVqTGpFeE1DOEdBMVVFQ3hNb1IyOGdSR0ZrWkhrZ1EyeGhjM01nCk1pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTQXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRU4KQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQQpQVllZWXdodjJ2TE0wRDkvQWxRaVZCRFlzb0hVd0hVOVMzL0hkOE0rZUtzYUE3VWdheTlxSzdIRmlIN0V1eDZ3CndkaEZKMitxTjFqM2h5YlgyQzMycVJlM0gzSTJUcVlYUDJXWWt0c3FibDJpL29qZ0M5NS81WTBWNGV2TE90WGkKRXFJVExkaU9yMThTUGFBSUJRaTJYS1ZsT0FSRm1SNmpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWQphdng0QTZsTmY0REQrcXRhL0tGQXBNb1pGdjZ5eU85ZWN3M3VkNzJhOW5tWXZMRUhaNklWRGQyZ1dNWkVld28rCllpaGZ1a0VIVTFqUEVYNDRkTVg0LzdWcGtJK0VkT3FYRzY4Q0FRT2pnY0F3Z2Iwd0hRWURWUjBPQkJZRUZOTEUKc05LUjFFd1JjYk5oeXoyaC90Mm9hdFRqTUlHTkJnTlZIU01FZ1lVd2dZS0FGTkxFc05LUjFFd1JjYk5oeXoyaAovdDJvYXRUam9XZWtaVEJqTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1CklFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltUFFvWitZZUFFVzVwNUpZWE1QODBrV055Ck9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3RJM2xwamJpMlRjN1AKVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSCmRFci9WeHFIRDNWSUxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWYKUmVZTm55aWNzYmtxV2xldE53K3ZIWC9idlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJTdGFyZmllbGQgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDMyOjRhOjRiOmJiOmM4OjYzOjY5OjliOmJlOjc0OjlhOmM2OmRkOjFkOjQ2OjI0CiMgU0hBMSBGaW5nZXJwcmludDogYWQ6N2U6MWM6Mjg6YjA6NjQ6ZWY6OGY6NjA6MDM6NDA6MjA6MTQ6YzM6ZDA6ZTM6Mzc6MGU6YjU6OGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE0OjY1OmZhOjIwOjUzOjk3OmI4Ojc2OmZhOmE2OmYwOmE5Ojk1OjhlOjU1OjkwOmU0OjBmOmNjOjdmOmFhOjRmOmI3OmMyOmM4OjY3Ojc1OjIxOmZiOjVmOmI2OjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SlZVekVsCk1DTUdBMVVFQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXAKVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURRdwpOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFCkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnAKWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmCjhNT2gydFRZYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4KK2xxMmN3UWxadXQzZitkWnhrcVpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMApYOXREa1lJMjJXWThzYmk1Z3YyY09qNFF5RHZ2Qm1WbWVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhCks0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NORjRBemJsNUtYWm5KSG9lMG5SckEKMVc0VE5TTmUzNXRmUGUvVzkzYkM2ajY3ZUEwY1FtZHJCTmo0MXRwdmkvSkVvQUdyQWdFRG80SEZNSUhDTUIwRwpBMVVkRGdRV0JCUy9YN2ZSenQwZmh2UmJWYXpjMXhEQ0RxbUk1ekNCa2dZRFZSMGpCSUdLTUlHSGdCUy9YN2ZSCnp0MGZodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjAKWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQXNUS1ZOMFlYSm1hV1ZzWkNCRApiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBV2RQNGlkMGNrYVZhR3NhZlB6V2RxYkFZY2FUMWVwb1hrSkt0djMKTDdJZXpNZGVhdGlEaDZHWDcwazFQbmNHUVZoaXY0NVl1QXBuUCt5ejNTRm1IOGxVK25MTVBVeEEySUd2ZDU2RAplcnVpeC9VMEY0N1pFVUQwL0N3cVRSVi9wMkpkTGlYVEFBc2dHaDFvK1JlNDlMMkw3U2haM1UwV2l4ZUR5TEpsCnh5MTZwYXE4VTRadDNWZWt5dmdnUVF0bzhQVDdkTDVXWFhwNTlma2RoZU10bGI3MWNaQkR6STBmbWdBS2h5bnAKVlNKWUFDUHE0eEpES1Z0SENOMk1RV3BsQnFqbElhcEJ0SlVobGJsOTBUU3JFOWF0dk56aVBUbk52VDUxY0tFWQpXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTNRQkZHbWg5NURtSy9ENWZzNEM4ZkY1UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlRhaXdhbiBHUkNBIgojIFNlcmlhbDogNDIwMjMwNzA4MDc3MDg3MjQxNTk5OTExNDA1NTY1MjcwNjY4NzAKIyBNRDUgRmluZ2VycHJpbnQ6IDM3Ojg1OjQ0OjUzOjMyOjQ1OjFmOjIwOmYwOmYzOjk1OmUxOjI1OmM0OjQzOjRlCiMgU0hBMSBGaW5nZXJwcmludDogZjQ6OGI6MTE6YmY6ZGU6YWI6YmU6OTQ6NTQ6MjA6NzE6ZTY6NDE6ZGU6NmI6YmU6ODg6MmI6NDA6YjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc2OjAwOjI5OjVlOmVmOmU4OjViOjllOjFmOmQ2OjI0OmRiOjc2OjA2OjJhOmFhOmFlOjU5OjgxOjhhOjU0OmQyOjc3OjRjOmQ0OmMwOmIyOmMwOjExOjMxOmUxOmIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJUUg1MVpXdGN2d2daRXBZQUlhZU5lOWpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1Rc3dDUVlEVlFRR0V3SlVWekV3TUM0R0ExVUVDZ3duUjI5MlpYSnViV1Z1ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBeU1USXdOVEV6TWpNek0xb1hEVE15TVRJd05URXpNak16TTFvdwpQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHZkbVZ5Ym0xbGJuUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOdzhYUgpJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxCmdRZFc4b3I1QnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3kKeWh3T2VZSFd0WEJpQ0FFdVRrOE8xUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0cwpGL3RueU1LdHNjMkF0SmZjZGdFV0ZlbHExNlRoZUVmT2h0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyCmpXUit0U0JxblR1QnRvOUFBR2RMaVlhNHpHWCtGVlBwQk1IV1h4MUUxd292SjVwR2ZhRU5kYTFVaGhYY1NUdngKbHM0UG02RHNvM3BkdnRVcWRVTGxlOTZsdHFxdktLeXNrS3c0dDlWb05TWjYzUGM3OC8xRm05RzdRM2h1Yi9GQwpWR3FZOEEydGwrbFNYdW5WYW5MZWF2Y2JZQlQwcGVTMmNXZXFIK3JpVGNGQ1FQNW5SaGM0TDBjL2NaeXU1U0hLCllTMXRCNmlFZkMzdVVTWHhZNUNlL2VGWGlHdnZpaU50c2VhOVA2M1JQWllMaFkzTmF5ZTd0d1diN0x1UnFRb0gKRWdLWFRpQ1E4UDhOSHVKQk85TkFPdWVOWGRwbTVBS3dCMUtZWEE2T001ekNwcFg3VlJsdVRJNnVTdys5d1RoTgpYbytFSFdiTnhXQ1d0RkphQlltT2xYcVl3WkU4bFNPeUR2UjV0TWw4d1VvaEFnTUJBQUdqYWpCb01CMEdBMVVkCkRnUVdCQlRNek8vTUtXQ2tPN0dTdGp6Nk1tS1ByQ1VWT3pBTUJnTlZIUk1FQlRBREFRSC9NRGtHQkdjcUJ3QUUKTVRBdk1DMENBUUF3Q1FZRkt3NERBaG9GQURBSEJnVm5LZ01BQUFRVUE1dndJaFAvbFNnMjA5eWV3REw3TVRxSwpVV1V3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUVDQVN2b215YzVlTU4xUGhuUjJXUFd1czRNemVLUjZkQmNaClR1bFN0Ym5nQ25SaXFtaktlS0JNbW80c0l5N1ZhaElrdjlSbzA0clEySnlmdEI4TTNqaCtWemo4amVKUFhneWYKcXp2Uy8zV1h5NlRqWndqLzVjQVd0VWdCZmVuNUN2OGI1V3BwdjNnaHFNS25JNm1HcTNaVzZBNE05aFBkS21hSwpaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjJOZS8vQUhZMlJUS2J4a2FGWGVJa3NCN2pTSmFZVjBlVVZYb1BRYkZFCkpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVUQ3Z3NMMHU4cVYxYllIK01oNlhnVW1NcXZ0ZzcKaFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6RHhBUnZCTUIxdVVPMDcrMQpFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmtaNk1tCm5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1gKdWRwVkJya2s3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuegpzc1F3bVNOT1hmSklvUklNM0JLUUNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlCkxNRERhdjd2M0F1bitrYmZZTnVjcGxsUWRTTnBjNU95K2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWwKcFlZc2ZQUVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSIKIyBTZXJpYWw6IDE3MTU0NzE3OTM0MTIwNTg3ODYyMTY3Nzk0OTE0MDcxNDI1MDgxCiMgTUQ1IEZpbmdlcnByaW50OiA4NzpjZTowYjo3YjoyYTowZTo0OTowMDplMTo1ODo3MTo5YjozNzphODo5Mzo3MgojIFNIQTEgRmluZ2VycHJpbnQ6IDA1OjYzOmI4OjYzOjBkOjYyOmQ3OjVhOmJiOmM4OmFiOjFlOjRiOmRmOmI1OmE4Ojk5OmIyOjRkOjQzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo5MDo5OTpiNTowMTo1ZTo4Zjo0ODo2YzowMDpiYzplYTo5ZDoxMToxZTplNzoyMTpmYTpiYTozNTo1YTo4OTpiYzpmMTpkZjo2OTo1NjoxZTozZDpjNjozMjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHR6Q0NBcCtnQXdJQkFnSVFET2ZnNVJmWVJ2NlA1V0Q4Ry9Bd09UQU5CZ2txaGtpRzl3MEJBUVVGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4TVRFd01EQXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3YwpKcFNJcXZUTzlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQCm1ESTJkc3plM1R5b291OXEreUh5VW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZysKd1J2RGpEUFoyQzhZL2lnUHM2ZUQxc051Uk1CaE5aWVcvbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNApWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweW9lYjZwTm5WRnpGMXJvVjlJcTQvCkFVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmR0hkUEFnTUIKQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRVwpCQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVuCnB5R2Q4MjNJRHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkMKZFdLdWgrdnkxZG5lVnJPZnpNNFVLTGtObDJCY0VreFk1Tk05ZzBsRldKYzFhUnFvUitwV3hubXJFdGhuZ1lUZgpmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtCk5XMWZpUUcyU1Z1ZkFRV2JxejBsd2N5MmY4THhiNGJHK21SbzY0RXRsT3RDdC9xTUh0MWk4YjVRWjdkc3ZmUHgKSDJzTU5nY1dmemQ4cVZ0dGV2RVNSbUNEMXljRXZrdk9sNzdEWnlwb0VkK0E1d3d6WnI4VERSUnU4MzhmWXhBZQorbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDEwOTQ0NzE5NTk4OTUyMDQwMzc0OTUxODMyOTYzNzk0NDU0MzQ2CiMgTUQ1IEZpbmdlcnByaW50OiA3OTplNDphOTo4NDowZDo3ZDozYTo5NjpkNzpjMDo0ZjplMjo0Mzo0Yzo4OToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IGE4Ojk4OjVkOjNhOjY1OmU1OmU1OmM0OmIyOmQ3OmQ2OjZkOjQwOmM2OmRkOjJmOmIxOjljOjU0OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0Mzo0ODphMDplOTo0NDo0Yzo3ODpjYjoyNjo1ZTowNTo4ZDo1ZTo4OTo0NDpiNDpkODo0Zjo5Njo2MjpiZDoyNjpkYjoyNTo3Zjo4OTozNDphNDo0MzpjNzowMTo2MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHJ6Q0NBcGVnQXdJQkFnSVFDRHZnVnBCQ1JyR2hkV3JKV1pISFNqQU5CZ2txaGtpRzl3MEJBUVVGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkQKUVRBZUZ3MHdOakV4TVRBd01EQXdNREJhRncwek1URXhNVEF3TURBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVOQk1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTRqdmhFWExlcUtUVG8xZXFVS0tQQzNlUXlhS2w3aExPbGxzQgpDU0RNQVpPblRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3Cm5oNlZmZTYzU0tNSTJ0YXZlZ3c1Qm1WL1NsMGZ2QmY0cTc3dUtOZDBmM3A0bVZtRmFHNWNJekpMdjA3QTZGcHQKNDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUg0aWRxOUpveitFa0lZSXZVWDdRNmhMK2hxa3BNZlQ3UApUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveTd2clRDMExVcTdkQk10b00xTy80CmdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUgpUTHRtOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3IKaE1BdHVkWEgvdlRCSDFqTHVHMmNlblRubUNtckViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZwowNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0dGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGClBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODZVQWIzTHVqRVYwbHMKWVNFWTFRU3RlRHdzT29CcnArdXZGUlRwMkluQnVUaHM0cEZzaXY5a3VYY2xWekRBR3lTajRkenAzMGQ4dGJRawpDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDM1NTM0MDAwNzY0MTA1NDc5MTk3MjQ3MzA3MzQzNzgxMDAwODcKIyBNRDUgRmluZ2VycHJpbnQ6IGQ0Ojc0OmRlOjU3OjVjOjM5OmIyOmQzOjljOjg1OjgzOmM1OmMwOjY1OjQ5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogNWY6Yjc6ZWU6MDY6MzM6ZTI6NTk6ZGI6YWQ6MGM6NGM6OWE6ZTY6ZDM6OGY6MWE6NjE6Yzc6ZGM6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc0OjMxOmU1OmY0OmMzOmMxOmNlOjQ2OjkwOjc3OjRmOjBiOjYxOmUwOjU0OjQwOjg4OjNiOmE5OmEwOjFlOmQwOjBiOmE2OmFiOmQ3OjgwOjZlOmQzOmIxOjE4OmNmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3S1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1agpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXdNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1WTJVZwpSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtCis5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKUE50ME9LUkt6RTBsZ3ZkS3BWTVNPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTQp4Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0M01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCCklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWVoMTBhVUFzZwpFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lYwpuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6CmVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrS21ORVZYNThTdm53MgpZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EiCiMgU2VyaWFsOiAxNzc3NzAyMDgwNDU5MzQwNDAyNDE0Njg3NjA0ODgzMjc1OTUwNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDg4OjJjOjhjOjUyOmI4OmEyOjNjOmYzOmY3OmJiOjAzOmVhOmFlOmFjOjQyOjBiCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6MjA6NzQ6NDE6NzI6OWM6ZGQ6OTI6ZWM6Nzk6MzE6ZDg6MjM6MTA6OGQ6YzI6ODE6OTI6ZTI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBmOjk5OjNjOjhhOmVmOjk3OmJhOmFmOjU2Ojg3OjE0OjBlOmQ1OjlhOmQxOjgyOjFiOmI0OmFmOmFjOmYwOmFhOjlhOjU4OmI1OmQ1OjdhOjMzOjhhOjNhOmZiOmNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3ClBURUxNQWtHQTFVRUJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnoKY3lBeUlGQnlhVzFoY25rZ1EwRXdIaGNOT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOQpNUXN3Q1FZRFZRUUdFd0pHVWpFUk1BOEdBMVVFQ2hNSVEyVnlkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56CklESWdVSEpwYldGeWVTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOeFEKbHRBUytEWFNDSGg2dGxKdy9XL3V6N2tSeTExMzRlenBmZ1NOMXN4dmMwTlhZS3d6Q2tUc0ExOGNnQ1NSNWFpUgpWaEtDOStBcjlOdXVZUzZKRUkxcmJMcXpBcjNWTnNWSU55UGk4Rm8zVWpNWEV1TFJZRTIrTDBFUjQvWVhKUXlMCmtjQWJtWHVaVmcydjd0SzhSMWZqZVVsN05Ja25KSVRlc2V6cFdFNytUdDlhdmtHdHJBakZHQTd2MGxQdWJOQ2QKRWdFVGpkeUFZdmVWcVVTSVNuRk9ZRldlMnlNWmVWWUhERDlqQzF5dzRyNStGZnlVTTFoQk9IVEU0WStMM3lhcwpIN1dMTzdkRFdXdXdKS1p0a0l2RWN1cGRNNWkzeTk1ZWUrK1U4UnMreXNraHdjV1lBcXFpOWx0M20vVitsbFUwCkhHZHB3UEZDNDBlcy9DZ2NabFVDQXdFQUFhT0JqRENCaVRBUEJnTlZIUk1FQ0RBR0FRSC9BZ0VLTUFzR0ExVWQKRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNDNNdDM4c09LQXplM2JPa3lubTRqcnZvTUlrd0VRWUpZSVpJQVliNApRZ0VCQkFRREFnRUdNRGNHQTFVZEh3UXdNQzR3TEtBcW9DaUdKbWgwZEhBNkx5OTNkM2N1WTJWeWRIQnNkWE11ClkyOXRMME5TVEM5amJHRnpjekl1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ25WTStJUkJuTDM5Ui8KQU45V00ySzE5MUVCa092RFA5R0lST2trWGUvbkZMMGd0NW84QVA1dG45dVEzTmYwWXRhTGNGM241UVJJcVdoOAp5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSVHRNVFpHbmtMdVBUNTVzSm1hYmdsWnZPR3RkL3Zqek9Vck1SCkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLys3VUNtbllSME9ibmNIb1VXMmlrYmhpTUEKeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVy8vMUlNd3JoM0tXQgprSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIFN1YmplY3Q6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgTGFiZWw6ICJEU1QgUm9vdCBDQSBYMyIKIyBTZXJpYWw6IDkxMjk5NzM1NTc1MzM5OTUzMzM1OTE5MjY2OTY1ODAzNzc4MTU1CiMgTUQ1IEZpbmdlcnByaW50OiA0MTowMzo1MjpkYzowZjpmNzo1MDoxYjoxNjpmMDowMjo4ZTpiYTo2Zjo0NTpjNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmM5OjAyOjRmOjU0OmQ4OmY2OmRmOjk0OjkzOjVmOmIxOjczOjI2OjM4OmNhOjZhOmQ3OjdjOjEzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjo4NzoyNjowMzozMTphNzoyNDowMzpkOTowOTpmMTowNTplNjo5YjpjZjowZDozMjplMTpiZDoyNDo5MzpmZjpjNjpkOToyMDo2ZDoxMTpiYzpkNjo3NzowNzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFNqQ0NBaktnQXdJQkFnSVFSSyt3Z05hako3cUpNRG1HTHZoQWF6QU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUQXdNRGt6TURJeE1USXhPVm9YRFRJeE1Ea3pNREUwTURFeE5Wb3cKUHpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SY3dGUVlEVlFRRApFdzVFVTFRZ1VtOXZkQ0JEUVNCWU16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOK3Y2WmRRQ0lOWHRNeGlaZmFRZ3V6SDB5eHJNTXBiN05uRGZjZEF3UmdVaStEb00zWkpLdU0vSVVtVHJFNE8Kcno1SXkyWHUvTk1oRDJYU0t0a3lqNHpsOTNld0VudTFsY0NKbzZtNjdYTXVlZ3dHTW9PaWZvb1VNTTBSb09FcQpPTGw1Q2pIOVVMMkFaZCszVVdPRHlPS0lZZXBMWVlIc1VtdTVvdUpMR2lpZlNLT2VETm9Kamo0WExoN2RJTjliCnhpcUtxeTY5Y0szRkN4b2xrSFJ5eFh0cXF6VFdNSW4vNVdnVGUxUUx5TmF1N0ZxY2toNDlaTE9NeHQrL3lVRncKN0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGR1dG9sdWNiWTM4RVZBanFyMm03eFBpNzFYQWljUE5hRAphZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRTUEwR0NTcUcKU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OQppa3VnZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyCkF2SFJBb3NaeTVRNlhrakVHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnoKUjhzcnpKbXdOMGpQNDFaTDljOFBESEl5aDhid1JMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNQpKREdGb3FnQ1dqQkg0ZDFRQjd3Q0NaQUE2MlJqWUpzV3ZJakpFdWJTZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvCk9iOFZaUnpJOW5lV2FncU5kd3ZZa1FzRWpnZmJLYllLN3AyQ05UVVEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gR29sZCBDQSAtIEcyIgojIFNlcmlhbDogMTM0OTI4MTU1NjE4MDY5OTEyODAKIyBNRDUgRmluZ2VycHJpbnQ6IDI0Ojc3OmQ5OmE4OjkxOmQxOjNiOmZhOjg4OjJkOmMyOmZmOmY4OmNkOjMzOjkzCiMgU0hBMSBGaW5nZXJwcmludDogZDg6YzU6Mzg6OGE6Yjc6MzA6MWI6MWI6NmU6ZDQ6N2E6ZTY6NDU6MjU6M2E6NmY6OWY6MWE6Mjc6NjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDYyOmRkOjBiOmU5OmI5OmY1OjBhOjE2OjNlOmEwOmY4OmU3OjVjOjA1OjNiOjFlOmNhOjU3OmVhOjU1OmM4OjY4OjhmOjY0OjdjOjY4OjgxOmYyOmM4OjM1OjdiOjk1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WCkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG4KYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRgpNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUCmQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUMKQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxdDIvOAo3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrCmJicUJISDVDakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2MKNmJNOEs4dnpBUk8vV3MvQnRRcGd2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRQplbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkCk1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSQWlUeXN5YlVhOW9FVmVYQkNzZHQKTURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmRqSWozbzAyeQpNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5CkZHa09wZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGkKYUc1OWplODgzV1gwWGF4Ujd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TQpnSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCCnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjcKbHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybgo4TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92CkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTYKNDVSODhhN0EzaGZtNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6TwpVWXJIVURGdTRVcCtHQzlwV2JZOVpJRXI0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1Ck8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0MKYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtR3U2dUxmdElkeGYrdSt5dgpHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHBtby9hCjc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0MKaGRpRHl5Smt2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMwo5MnFnUW13TE9NN1hkVkF5a3NMZkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwCkxkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3cKWk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWp2aU92cnYxdkErQUNPekIyK2h0dApRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiIKIyBTZXJpYWw6IDU3MDAzODMwNTMxMTc1OTk1NjMKIyBNRDUgRmluZ2VycHJpbnQ6IGUwOjA2OmExOmM5OjdkOmNmOmM5OmZjOjBkOmMwOjU2Ojc1Ojk2OmQ4OjYyOjEzCiMgU0hBMSBGaW5nZXJwcmludDogOWI6YWE6ZTU6OWY6NTY6ZWU6MjE6Y2I6NDM6NWE6YmU6MjU6OTM6ZGY6YTc6ZjA6NDA6ZDE6MWQ6Y2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOjZjOjRkOmEyOmJiOmI5OmJhOjU5OmI2OmYzOjkzOjk3OjY4OjM3OjQyOjQ2OmMzOmMwOjA1Ojk5OjNmOmE5OjhmOjAyOjBkOjFkOmVkOmJlOmQ0OjhhOjgxOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFCkJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVlVM2RwYzNOVGFXZHUKSUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYRFRBMk1UQXlOVEE0TXpJME5sb1hEVE0yTVRBeU5UQTRNekkwTmxvdwpSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZClUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0TjBNdgpGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyCllUN1FiTkhtKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUYKbmJBVmxETGFZUTFIVFdCQ3JwSkg2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSAo2QVRLNzJveGg5VEF0dm1VY1h0blpMaTJrVXBDZTJVdU1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0CmVKTUVMcHlDYlRhcHhERmtINGFEQ3lyME5RcDR5VlhQUWJCSDZUQ2ZtYjVocUFhRXVTaDZYempaRzZrNHNJTi8KYzhIRE8wZ3FnZzhobTdqTXFEWERoQnVEc3o2K3BKVnBBVHFKQUhnRTJjbjBtUm1yVm41Ymk0WTVGWkdrRUN3SgpNb0JnczVQQUtyWVlDNTEralVueUVFcC8rZFZHTHhtU281bW5KcXk3akR6bURyeEhCOXh6VWZGd1pDOEkrYlJICkhUQnNST29wTjRXU2FHYThnemorZXprdTAxRHdIL3RlWUxhcHB2b25RZkdiR0hMeTlZUjBTc2xueEZTdVNHVGYKak5GdXNCM2hCNDhJSHBtY2NlbE0yS1gzUnhJZmRORlJub2J6d3FJalFBdHoyMHVtNTNNR2pNR2c2Y0ZackViNgo1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYQ082SE9TS0dzZzBQV0VQM2NhbElMdjNxMWg4Q0F3RUFBYU9CCnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVUKRjZETndlUkJ0anBiTzh0Rm5iMGN3cGo2aGxnd0h3WURWUjBqQkJnd0ZvQVVGNkROd2VSQnRqcGJPOHRGbmIwYwp3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCmNEb3ZMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUIKQUhQR2dlQW4waTBQNEpVdzRwcEJmMUFzWDE5aVlhbUdhbWtZREhSSjFsMkU2a0ZTR0c5WXJWQldJR3JHdlNocApXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUZrV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5CnhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTDNYV2d3RjE1a0l3YjRGRG0zakgrbUh0d1g2V1EKMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4L3VObmNxQ3h2MXlMNVBxWgpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmFER2k4CmFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlgKZW0xWnFTcVBlOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUgpkQXRxL2dzRC9LTlZWNG4rU3N1dVd4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvCk9NcFhFQTI5TUMvSHBlWkJvTnF1QlllYW9LUmxiRXdKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWSsKaEFobTBzUTJmYWMrRVB5STROU0E1UUM5cXZOT0JxTjZhdmxpY3VNSlQrdWJEZ0VqOForN2ZOemNiQkdYSmJMeQp0R01VMGdZcVo0eUQ5YzdxQjlpYWFoN3M1QXE3S2t6ckNXQTV6c3BpMkM1dQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDMyNzk4MjI2NTUxMjU2OTYzMzI0MzEzODA2NDM2OTgxOTgyMzY5CiMgTUQ1IEZpbmdlcnByaW50OiAwMjoyNjpjMzowMTo1ZTowODozMDozNzo0MzphOTpkMDo3ZDpjZjozNzplNjpiZgojIFNIQTEgRmluZ2VycHJpbnQ6IDMyOjNjOjExOjhlOjFiOmY3OmI4OmI2OjUyOjU0OmUyOmUyOjEwOjBkOmQ2OjAyOjkwOjM3OmYwOjk2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNzpkNToxMDowNjpjNToxMjplYTphYjo2Mjo2NDoyMTpmMTplYzo4Yzo5MjowMTozZjpjNTpmODoyYTplOTo4ZTplNTozMzplYjo0NjoxOTpiODpkZTpiNDpkMDo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWQpNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vClIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXgKTWpjd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNRmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhaVzlVY25WemRDQlFjbWx0WVhKNUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXZyZ1ZlLy9VZkgxbnJZTmtlOGhDVXkzZjlvUUlJR0hXQVZscW5FUVJyKzkyL1pWK3ptRXd1M3FEWHdLOQpBV2JLN2hXTmI2RXduTDJoaFo2VU92TldpQUF4ejlqdWFwWUMyZTBEalB0MWJlZnF1RlVXQlJhYTlPQmVzWWpBClpJVmNGVTJJeDdlNjRIWHByUVU5bmNlSlNPQzdLTWdENFRDVFpGNVN3Rmx3SWpWWGlJcnhsUXFEMTd3eGN3RTAKN2U5R2NlQnJBcWcxY211WG0yYmd5eHg1WDlnYUJHZ2VSd0xtbldEaU5wY0IzODQxa3QrK1o4ZHRkMWs3ajUzVwprQldVdkVJMEVNRTUrYkVuUG43V2luWEZzcStXMDZMZW0rU1l2bjNoNllHdHRtLzgxdzdhNERTd0RScDM1K01JCm1POVkrcHlFdHphdnd0K3MwdlFRQm5CeE5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVMTlZRUVpjVmkvQ1BObUZiU3Z0cjJabkpNNUl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGcHdmeXpkdHpSUDlZWlJxU2ErUzdpcThYRU4zR0hIb09vMEhucDNEd1ExCjZDZVBiSkMva1JZa1JqNUtUczRyRnRVTFVoMzhIMmVpQWtVeFQ4N3orZ09uZVoxVGF0bmFZenI0Z05mVG1lR2wKNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTk5XTXppVW5XbTA3S3grZE9DUUQzMnNmdm1XS1pkN2FWSWw2SwpvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhRmxveHQvbTBjWUFTU0pseWMxcFpVOEZqClVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcxcmlSL2FZTkt4b1UKQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSIKIyBTZXJpYWw6IDY5NTI5MTgxOTkyMDM5MjAzNTY2Mjk4OTUzNzg3NzEyOTQwOTA5CiMgTUQ1IEZpbmdlcnByaW50OiA4YzpjYTpkYzowYjoyMjpjZTpmNTpiZTo3MjphYzo0MToxYToxMTphODpkODoxMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkxOmM2OmQ2OmVlOjNlOjhhOmM4OjYzOjg0OmU1OjQ4OmMyOjk5OjI5OjVjOjc1OjZjOjgxOjdiOjgxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZDo3MjoyZjo4MTphOTpjMToxMzpjMDo3OToxZDpmMTozNjphMjo5Njo2ZDpiMjo2Yzo5NTowYTo5NzoxZDpiNDo2Yjo0MTo5OTpmNDplYTo1NDpiNzo4YjpmYjo5ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSVFORTdWVnlEVjdleEo5Qy9PTjlzcmJUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hIekFkQmdOVgpCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URTNNREF3TURBd1doY05Nell3Ck56RTJNak0xT1RVNVdqQ0JxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWoKTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZRwpBMVVFQ3hNdktHTXBJREl3TURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4SHpBZEJnTlZCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3NvUEQ3Z0ZuVW5NZWt6NTJoV1hNSkVFVU1EU3h1YVBGcwpXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSjFDUmZCc0RNUkpTVWpRSmliK3RhCjNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjcS9nY2ZvbWsKNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNgpTay9LYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKCk5xUjMySHVIVUVUVlBtNHBhZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUApyODdMZXYweGtocHF0dk5HNjFkSVVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVCkRXNUZ2bFhvazlMT0F6L3QyaVd3SFZmTEhqcDJvRXpzVUhib1pISU1wS254dUl2VzFvZUV1ekxsUVJIQWQ5bXoKWUozckc5WFJia1JFcWFZQjdGVmlIWGU0WEk1SVNYeWNPMWNScksxek40NHZlRnlRYUVmWllHRG0vQWM5SWlBWAp4UGNXNmNUWWN2bkljM3pmRmk4VnFUNzlhaWUyb2V0YXVwZ2YxZU5OWkFxZEU4aGh1dlU1SEllNnVMMTdJbi8yCi9xeEFlZVdzRUc4OWp4dDVkb3ZFTjdNaEdJVGxOZ0RyWXlDWnVlbitNd1M3UWNqQkF2bEVZeUNlZ2M1QzA5WS8KTEhiVFk1eFozWSttNFE2Z0xrSDNMcFZIejd6OU0vUDJDMkYrZnBFcmdVZkNKekR1cHhCZE40OWNPU3ZrQlBCNwpqVmFNYUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUiCiMgU2VyaWFsOiAzMzAzNzY0NDE2NzU2ODA1ODk3MDE2NDcxOTQ3NTY3NjEwMTQ1MAojIE1ENSBGaW5nZXJwcmludDogY2I6MTc6ZTQ6MzE6Njc6M2U6ZTI6MDk6ZmU6NDU6NTc6OTM6ZjM6MGE6ZmE6MWMKIyBTSEExIEZpbmdlcnByaW50OiA0ZTpiNjpkNTo3ODo0OTo5YjoxYzpjZjo1Zjo1ODoxZTphZDo1NjpiZTozZDo5Yjo2Nzo0NDphNTplNQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6Y2Y6YWI6N2U6NDM6Yzg6ZDg6ODA6ZDA6NmI6MjY6MmE6OTQ6ZGU6ZWU6ZTQ6YjQ6NjU6OTk6ODk6YzM6ZDA6Y2E6ZjE6OWI6YWY6NjQ6MDU6ZTQ6MWE6Yjc6ZGYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUwekNDQTd1Z0F3SUJBZ0lRR05yUm5pWjk2THRLSVZqTnpHczdTakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKeWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFcKWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNUlDMGdSelV3SGhjTk1EWXhNVEE0TURBd01EQXdXaGNOTXpZd056RTJNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZKQWdJS1hvMQpubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLemovaTVWYmV4CnQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXoKU2RoRFkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRRwpCTytRdWVRQTVOMDZ0Um4vQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrCnJDcFN4NC9WQkVua2pXTkhpRHhwZzh2K1I3MHJmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC8KTkllV2l1NVQ2Q1VWQWdNQkFBR2pnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXdIekFICkJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnkKYVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZIL1RaYWZDM2V5NzhEQUo4ME01K2dLdgpNekV6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDVEpFb3dYMkxQMkJxWUx6M3EzSmt0dlhmMnBYa2lPT3pFCnA2QjRFcTFpRGtWd1pNWG5sMll0bUFsK1g2L1d6Q2hsOGdHcUNCcEgzdm41ZkpKYUNHa2dEZGsrYlc0OERXN1kKNWdhUlFCaTUrTUh0Mzl0QnF1Q1dJTW5OWkJVNGdjbVU3cUtFS1FzVGI0N2JETjBsQXR1a2l4bEUwa0Y2QldsSwpXRTlneW42Q2Fnc0NxaVVYT2JYYmYrZUVaU3FWaXIyRzNsNkJGb010RU16ZS9haUNLbTBvSHcwTHhPWG5HaVlaCjRmUVJieEMxbGZ6blFnVXkyODZkVVY0b3RwNkYwMXZ2cFgxRlFIS090dzVyRGdiN016VkljYmlkSjR2RVpWOE4KaG5hY1JIcjJsVnoyWFRJSU02UlV0aGcvYUZ6eVFrcUZPRlNEWDlIb0xQS3NFZGFvN1dOcQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZVRydXN0IENBIgojIFNlcmlhbDogMTcxOTk3NzQ1ODkxMjUyNzc3ODgzNjI3NTcwMTQyNjY4NjIwMzIKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjMyOmMzOmE3OjZkOjI1OjU3OmM3OjY4OjA5OjlkOmVhOjJkOmE5OmEyOmQxCiMgU0hBMSBGaW5nZXJwcmludDogODc6ODI6YzY6YzM6MDQ6MzU6M2I6Y2Y6ZDI6OTY6OTI6ZDI6NTk6M2U6N2Q6NDQ6ZDk6MzQ6ZmY6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYxOmMxOmI1OjBhOmU1OmEyOjBkOmQ4OjAzOjBlOmM5OmY2OmJjOjI0OjgyOjNkOmQzOjY3OmI1OjI1OjU3OjU5OmI0OmU3OjFiOjYxOmZjOmU5OmY3OjM3OjVkOjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKRnpBVkJnTlZCQU1URGxObFkzVnlaVlJ5ZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJegpNVEU1TkRBMU5Wb3dTREVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52CmNuQnZjbUYwYVc5dU1SY3dGUVlEVlFRREV3NVRaV04xY21WVWNuVnpkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUt1a2dlV1Z6ZlgyRkk3Q1Q4clU0bmlWV0p4QjRRMlpRQ1FYT1pFegpadW0rNFlPdllseUowZndrVzJHejRCRVJRUndkYnZDNHUvamVwNEc2cGtqR254Mjl2bzZwUVQ2NGxPMHBHdFNPCjBnTWRBKzl0RFdjY1Y5Y0dyY3JJOWY0T3IyWWxTQVNXQzEyanVoYkRDRS9SUnZnVVhQTElYZ0daYmYySXpJYW8Kd1c4eFFteFNQbWpMOHhrMDM3dUhHRmFBSnNUUTNNQnYzOTZnd3BFV29HUVJTMFM4SHZibittUGVacXgycEhHago3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYjAxay91bks4UkNTYzQzT3o5NjlYTDBJbW5hbDB1Z0JTCjhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1IdXJzQ0F3RUFBYU9CblRDQm1qQVQKQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnCkpZWWphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0MKTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0Mwo2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1U2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvCjNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGZtYng4SVZRcjVGaWl1MWNwcnA2cG94a20KRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWm5NVUZkQXZuWnlQUwpDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmUgR2xvYmFsIENBIgojIFNlcmlhbDogOTc1MTgzNjE2NzczMTA1MTU1NDIzMjExOTQ4MTQ1Njk3ODU5NwojIE1ENSBGaW5nZXJwcmludDogY2Y6ZjQ6Mjc6MGQ6ZDQ6ZWQ6ZGM6NjU6MTY6NDk6NmQ6M2Q6ZGE6YmY6NmU6ZGUKIyBTSEExIEZpbmdlcnByaW50OiAzYTo0NDo3Mzo1YTplNTo4MTo5MDoxZjoyNDo4Njo2MTo0NjoxZTozYjo5YzpjNDo1ZjpmNTozYToxYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDI6MDA6ZjU6MDQ6M2E6Yzg6NTk6MGU6YmI6NTI6N2Q6MjA6OWU6ZDE6NTA6MzA6Mjk6ZmI6Y2I6ZDQ6MWM6YTE6YjU6MDY6ZWM6Mjc6ZjE6NWE6ZGU6N2Q6YWM6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4Ck1qTXhNVGsxTWpBMldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWcKUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdk5TN1lyR3hWYVFaeDVSTm9KTE5QMk13aFIvanhZRGlKCmlRUHB2ZXBlUmxNSjNGejFXdWozUlNvQzZ6RmgxeWt6VE03SGZBbzNmZys2TXBqaEhaZXZqOGZjeVRpVzg5c2EKL0ZIdGFNYlFicVI4Sk5HdVFzaVdVR011NFA1MS9waW5YMGt1bGVNNU0yU09IcVJma05KblBMTFova0c1VmFjSgpqbklGSG92ZFJJV0NRdEJKd0IxZzhORVhMSlhyOXFYQmtxUEZ3cWNJWUExZ0JCQ1dlWjRXTk9hcHR2b2xSVG5JCkhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWSERHQTc2b1lhOEo3MTlyTytUTWcxZlc5YWpNdGdRVDcKc0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkwWFBuajNwREFnTUJBQUdqZ1owdwpnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3cKS2FBbm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzRwpBUVFCZ2pjVkFRUURBZ0VBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMClVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNitPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE8KSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbQpJNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81M0NZTnY2WkhkQWJZCmlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTA0MzUwNTEzNjQ4MjQ5MjMyOTQxOTk4NTA4OTg1ODM0NDY0NTczCiMgTUQ1IEZpbmdlcnByaW50OiA1Yzo0ODpkYzpmNzo0Mjo3MjplYzo1Njo5NDo2ZDoxYzpjYzo3MTozNTo4MDo3NQojIFNIQTEgRmluZ2VycHJpbnQ6IDY2OjMxOmJmOjllOmY3OjRmOjllOmI2OmM5OmQ1OmE2OjBjOmJhOjZhOmJlOmQxOmY3OmJkOmVmOjdiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYzoyYzpkNjozZDpmNzo4MDo2ZjphMzo5OTplZDplODowOToxMTo2Yjo1Nzo1YjpmODo3OTo4OTpmMDo2NToxODpmOTo4MDo4Yzo4NjowNTowMzoxNzo4YjphZjo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUhUQ0NBd1dnQXdJQkFnSVFUb0V0aW9KbDRBc0M3ajQxQWtibFBUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4SnpBbEJnTlYKQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXlNREV3TURBdwpNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNCTVNSM0psCllYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRFQwMVAKUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzClVjRWJWQVNZMDZtL3dlYUtYVHVIKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkKMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3d4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOApRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVjRFYWpjTnhvMmY4RVNJbDMzclhwCisyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBMUtHenFTWCsKRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1TwpuS1ZJckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmcKUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbU52Ylc5a2IyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dQpRWFYwYUc5eWFYUjVMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZClNkT0g1RU9DNnovSnF2V290ZTlWZkNGU1pmblZEZUZzOUQ2TWszT1JMZ0xFVGdkeGI4Q1BPR0VJcUI2QkNzQXYKSUM5Qmk1SGNTRVc4OGNiZXVuWnJNOGdBTFRGR1RPM25uYytJbFA4endGYm9KSVltdU5nNE9OOHFhOTBTek1jLwpSeGRNb3NJR2xnblcyLzQvUEVaQjMxamlWZzg4TzhFY2t6WFpPRktzN3Nqc0xqQk9sRFcwSkI5TGVHbmE4Z0k0CnpKVlNrL0J3SlZtY0lHZkU3dm1MVjJIMGtuWjlQNFNOVmJmbzVhelY4ZlVaVnFaYSs1QWNyNVByNVJ6VVo1ZGQKQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOKzhjRmR1UFlTbzM4TkJlanhpRW92akJGTVI3SGVMNVlZVGlzTytJQgpaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBTdWJqZWN0OiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBMYWJlbDogIk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjY5NzkxNTE1MjkzNzQ5NzQ5MDQzNzU1NjM4NjgxMjQ4NzkwNAojIE1ENSBGaW5nZXJwcmludDogZDM6ZjM6YTY6MTY6YzA6ZmE6NmI6MWQ6NTk6YjE6MmQ6OTY6NGQ6MGU6MTE6MmUKIyBTSEExIEZpbmdlcnByaW50OiA3NDpmODphMzpjMzplZjplNzpiMzo5MDowNjo0Yjo4Mzo5MDozYzoyMTo2NDo2MDoyMDplNTpkZjpjZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6ZjA6YmE6MDA6YTM6YWM6N2E6ZjM6YWM6ODg6NGM6MDc6MmI6MTA6MTE6YTA6Nzc6YmQ6Nzc6YzA6OTc6ZjQ6MDE6NjQ6YjI6Zjg6NTk6OGE6YmQ6ODM6ODY6MGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdQpNVEF3TGdZRFZRUURFeWRPWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwCmRIa3dIaGNOTURZeE1qQXhNREF3TURBd1doY05Namt4TWpNeE1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011TVRBd0xnWURWUVFERXlkTwpaWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURrdkg2U01HM0cySTRyQzd4R3p1QW5sdDdlK2ZvUzB6d3oKYzdNRUw3eHhqT1dmdGlKZ1BsOWR6Z24vZ2d3Ym1sRlFHaWFKM2RWaFhSbmNFZzh0Q3FKRFhSZlFOSklnNm5QUApPQ3dHSmdsNmN2ZjZVREw0d3BQVGFhSWp6a0d4ek9UVkh6YlJpanI0akdQaUZGbHA3UTNUZjJ2b3VBUGxUMnJsCm1HTnBTQVcrTHY4enR1bVhXV240WnhtdWsyR1dSQlhUY3JBL3ZHcDk3RWgvamNPcnFuRXJVMmxCVXpTMXNMbkYKQmdyRXNFWDFRVjF1aVVWN1BUc21qSFRDNWRMUmZiSVIxUHRZTWlLYWdNbmMvUXpwZjE0RGw4NDdBQlNISjNBNApxWTV1c3lkMm1GSGdCZU1ocXhyVmhTSThLYldhRnNXQXFQUzdhekNQTDBZQ29yRU1JdURUQWdNQkFBR2pnWmN3CmdaUXdIUVlEVlIwT0JCWUVGQ0V3eWZzQTEwNlkyb2VxS3RDbkxyRkFNYWRNTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUZJR0ExVWRId1JMTUVrd1I2QkZvRU9HUVdoMGRIQTZMeTlqY213dQpibVYwYzI5c2MzTnNMbU52YlM5T1pYUjNiM0pyVTI5c2RYUnBiMjV6UTJWeWRHbG1hV05oZEdWQmRYUm9iM0pwCmRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDN3Jrdm50MWZyZjZvdHQzTkhoV3JCNUtVZDVPYzgKNmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UTRMcUlMUHhGekJpd21aVlJEdXdkdUlqLwpoMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvR0dVc3lmSmo0YWtICi9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITgpwR3hsYUtGSmRseER5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNDE1NzgyODM4NjcwODY2OTI2MzgyNTY5MjE1ODk3MDc5MzgwOTAKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjYyOmZmOjc0OjlkOjMxOjUzOjVlOjY4OjRhOmQ1Ojc4OmFhOjFlOmJmOjIzCiMgU0hBMSBGaW5nZXJwcmludDogOWY6NzQ6NGU6OWY6MmI6NGQ6YmE6ZWM6MGY6MzE6MmM6NTA6YjY6NTY6M2I6OGU6MmQ6OTM6YzM6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjkzOjkyOjdhOjA2OjE0OjU0Ojk3Ojg5OmFkOmNlOjJmOjhmOjM0OmY3OmYwOmI2OjZkOjBmOjNhOmUzOmEzOmI4OjRkOjIxOmVjOjE1OmRiOmJhOjRmOmFkOmM3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaVRDQ0FnK2dBd0lCQWdJUUgwZXZxbUlBY0ZCVVRBR2VtMk9aS2pBS0JnZ3Foa2pPUFFRREF6Q0JoVEVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVApJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd016QTJNREF3Ck1EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHkKWldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TgpUMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1IKRnRTcllwbjFQbElMQnM1QkFIK1g0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSgpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaXd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXCkJCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkdGQWtLK3FEbQpmUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2CkdEZUFVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EiCiMgU2VyaWFsOiA4NjcxODg3Nzg3MTEzMzE1OTA5MDA4MDU1NTkxMTgyMzU0ODMxNAojIE1ENSBGaW5nZXJwcmludDogYmM6NmM6NTE6MzM6YTc6ZTk6ZDM6NjY6NjM6NTQ6MTU6NzI6MWI6MjE6OTI6OTMKIyBTSEExIEZpbmdlcnByaW50OiA1OToyMjphMTplMTo1YTplYToxNjozNToyMTpmODo5ODozOTo2YTo0Njo0NjpiMDo0NDoxYjowZjphOQojIFNIQTI1NiBGaW5nZXJwcmludDogNDE6Yzk6MjM6ODY6NmE6YjQ6Y2E6ZDY6Yjc6YWQ6NTc6ODA6ODE6NTg6MmU6MDI6MDc6OTc6YTY6Y2I6ZGY6NGY6ZmY6Nzg6Y2U6ODM6OTY6YjM6ODk6Mzc6ZDc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ4VENDQXRtZ0F3SUJBZ0lRUVQxeXgvUnJINEZEZmZIU0tGVGZtakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKaWpFTE1Ba0dBMVVFQmhNQ1EwZ3hFREFPQmdOVkJBb1RCMWRKVTJWTFpYa3hHekFaQmdOVkJBc1RFa052Y0hseQphV2RvZENBb1l5a2dNakF3TlRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sClpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhRU0JEUVRBZUZ3MHcKTlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEVlFRR0V3SkRTREVRTUE0RwpBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXdJQVlEClZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlgKU1ZObFMyVjVJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF5MCt6QUpzOU50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSClZWdXVrK2czL3l0cjZkVHF2aXJkcUZFcjEyYkRZVnhnQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjIKdzkzTnZLU0x0WmxodUFHaW85Uk4xQVU5a2EzNHRBaHhaSzl3OFJ4cmZ2YkRkNTBrYzN2a0RJemgyVGJobVlzRgptUXZ0UlRFSnlzSUEyL2R5b0phcWxZZlFqc2UyWVhNTmRtYU0zQnUwWTZLZmY1TVRNUEdoSjl2Wi95eFZpSkdnCjRFOEhzQ2hXakJnYmwwU09pZDNnRjI3bkt1K1BPUW94aElMWVFCUkpMbnBCNUtmKzQyVE13Vmx4U3l3aHAxdDkKNEIzUkxvR2J3OWhvOTcyV0c2eHdzUllVQzl0Z3VTWUJCUUlEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVzd04rcmphOHNIblIzSlFtdGhHK0liSnBocFF3CkVBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFdWgvd3VIYnJQNXdVT3gKU1BNb3dCMHV5UWxCK3BRQUhLU2txMGxQanowZTcwMXZ2YnlrOXZJbU1Na1F5aDJJKzNRWkg0VkZ2YkJzVWZrMgpmdHYxVERJNlFVOWJSOC9vQ3kyMnhCbWRkTVZIeGp0cUQ2d1UyenowYzV5cEJkOEEzSFI0K3ZnMVlGa0NFeGg4CnZQdE5zQ0J0UTd0Z01IcG5NMXpGbWRINExUbFNjL3VNcXBjbFhITFpDQjZyVGp6amdUR2ZBNmI3d1A0cGlGWGEKaE5WUUE3YmloS09tTnFvUk9nSGhHRXZXUkdpelBmbFRkSVN6UnBGR2xnQzNnQ3kyNGVNUTR0dWk1eWlQQVpaaQpGajRBNHh5bE5vRVlva3hTZHNBUm8yN21IYnJqV3I0MlU4VStkWStHYVNsWVU3V2N1MitmWE1VWTdOMHY0WmpKCi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIFN1YmplY3Q6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgTGFiZWw6ICJDZXJ0aWduYSIKIyBTZXJpYWw6IDE4MzY0ODAyOTc0MjA5MzYyMTc1CiMgTUQ1IEZpbmdlcnByaW50OiBhYjo1NzphNjo1Yjo3ZDo0Mjo4MjoxOTpiNTpkODo1ODoyNjoyODo1ZTpmZDpmZgojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOjJlOjEzOjYzOjQ1Ojg2OmE0OjZmOjFhOmIyOjYwOjY4OjM3OjU4OjJkOmM0OmFjOmZkOjk0Ojk3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzpiNjphMjpkYjoyZTpkNzpjZTo0ODo4NDoyZjo3YTpjNTozMjo0MTpjNzpiNzoxZDo1NDoxNDo0YjpmYjo0MDpjMToxZjozZjoxZDowYjo0MjpmNTplZTphMToyZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVgpCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYCkRUQTNNRFl5T1RFMU1UTXdOVm9YRFRJM01EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVEKQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3FYT0VtN1JGSFllR2lmQlo0ClFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SEd4bnkKZ1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhidwp6QmZzVjEvcG9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRCjEzMHlHTE1MTEdxL2pqOFVFWWtnRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjIKSnNnbHJnVkt0T2RqTFBPTUZsTitYUHNSR2dqQlJtS2ZJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2JrdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkV3ClpBWURWUjBqQkYwd1c0QVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkdoT0tRMk1EUXhDekFKQmdOVkJBWVQKQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhnZ2tBL3R6agpBUS9KU1A4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFoUU1la25IMlFxL2hvMkdlNi9QQUQvS2wxTnFWNXRhK2FEWTlmbTRmVElydjBROGgKYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzK0ltdmFZUzUvMUhJOTNURGhIa3hBR1l3UDE1elJnekI3bUZuYwpmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1UEJTMXhwODFIbERRd1k5cWNFUUNZc3V1CkhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkxZ2tJbDJQbHdTNncKdDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDM4CiMgTUQ1IEZpbmdlcnByaW50OiA3NDowMTo0YTo5MTpiMTowODpjNDo1ODpjZTo0NzpjZDpmMDpkZDoxMTo1MzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDg1OmE0OjA4OmMwOjljOjE5OjNlOjVkOjUxOjU4OjdkOmNkOmQ2OjEzOjMwOmZkOjhjOmRlOjM3OmJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjoxOToxYTo1MDpkMDpjMzo5Nzo3Zjo3ZDphOTo5YjpjZDphYTpjODo2YToyMjo3ZDphZTpiOTo2Nzo5ZTpjNzowYjphMzpiMDpjOTpkOToyMjo3MTpjMTo3MDpkMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFYwpNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqCklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkIKSURJd0hoY05PVGt3TnpBNU1USXhNVEF3V2hjTk1Ua3dOekE1TWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRQpSVEVjTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsClUyVmpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTAKSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDckM2TTE0SXNwRkxFVQpoYTg4RU9RNWJ6VmRTcTdkNm1HTmxVbjBiMlNqR21CbXBLbEFJb1RaMUtYbGVKTU9hQUd0dVUxY09zN1R1S2hDClFOL1BvN3FDV1dxU0c2d2NtdG9JS3lVbitXa2pSL0hnNnl4Nm0vVVRBdEIrTkh6Q25qd0FXYXYxMmd6MU1qd3IKckZEYTFzUGVnNVRLcUF5Wk1nNElTRlpiYXZ2YTRWaFlBVWxmY2tFOEZRWUJqbDJ0cXJpVHRNMmU2NmZvYWkxUwpOTnM2NzF4MVVkcmI4ekg1N25HWU1zUlVGVVFNK1p0VjdhM2ZHQWlnbzRhS1NlNVRCWThaVE5YZVdIbWIwbW9jClFxdkYxYWZQYUErVzVPRmhtSFpoeUpGODFqNEE0cEZRaCtHZEN1YXRsOUlkeGpwOXk3emFBelRWamxzQjlXb0gKdHhhMmJrcC9BZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlF4dzNrYnV2VlQxeGZnaVhvdEYyd0tzeXVkTXpBUApCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFsR1JaclRsazV5bnJFLzVhdzRzVFY4Z0VKUEIwZDhCZzQyZjc2WW1tZzcrV2dueHUxTU05NzU2QWJyc3AKdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeXpoZnpMTWRpTmxYaUl0aUpWYlNZU0twayt0WWNOdGhFZUZwYQpJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4clo3L2dGbmttMFcwOWp1d3pUa1ptRExsCjZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEdkeWQxTHgrNGl2bisKeGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgU3ViamVjdDogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIExhYmVsOiAiQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdCIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4Nzc0ODQzNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDcyOmU0OjRhOjg3OmUzOjY5OjQwOjgwOjc3OmVhOmJjOmUzOmY0OmZmOmYwOmUxCiMgU0hBMSBGaW5nZXJwcmludDogNWY6NDM6ZTU6YjE6YmY6Zjg6Nzg6OGM6YWM6MWM6Yzc6Y2E6NGE6OWE6YzY6MjI6MmI6Y2M6MzQ6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OjBhOmRmOjAwOjYzOmU5OjYzOjU2Ojc1OjBjOjI5OjY1OmRkOjBhOjA4OjY3OmRhOjBiOjljOmJkOjZlOjc3OjcxOjRhOmVhOmZiOjIzOjQ5OmFiOjM5OjNkOmEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHCkExVUVDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmgKYkNCU2IyOTBNQjRYRFRBMk1USXhOVEE0TURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRQpDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTCmIyOTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQStNaTh2UlJRWmhQLzhOTjUKN0NQeXR4ckhqb1h4RW5PbUdhb1EyNXlpWlhSYWR6NVJmVmIyM0NPMjFPMWZXTEUzVGRWSkRtNzFhb2ZXMG96UwpKOGJpL3phZm1HV2dFMDdHS21TYjFaQVN6eFFHOUR2ajFDaSs2QTc0cTA1SWxHMk9sVEVRWE8yaUxiM1ZPbTJ5CkhMdGd3RVpMQWZWSnJuNUdpdEIwamFFTUFzN3UvT2VQdUd0bTgzOUVBTDltSlJRcjNSQXdIUWVXUDAzMmE3aVAKdDNzTXBUanIza2ZiMVYwNS9JaW44OWNxZFBIb1dxSTduMUM2cG94Rk5jSlFaWlhjWTRMdjNiOTNUWnhpeVdOegpGdEFwRDBtcFNQQ3pxcmRzeGFjd09VQmRyc1RpWFNaVDhNNGNJd2hocUpRWnVnUmlRT3dmT0hCM0VnWnhwekFZClhTVW5wUUlEQVFBQm80R2xNSUdpTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUIwR0ExVWREZ1FXQkJTMkNIc05lc3lzSUV5R1ZqSmV6NnR1aFMxd1Z6QS9CZ05WSFI4RU9EQTJNRFNnTXFBdwpoaTVvZEhSd09pOHZkM2QzTWk1d2RXSnNhV010ZEhKMWMzUXVZMjl0TDJOeWJDOWpkQzlqZEhKdmIzUXVZM0pzCk1COEdBMVVkSXdRWU1CYUFGTFlJZXcxNnpLd2dUSVpXTWw3UHEyNkZMWEJYTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQlc3d29qb0ZST2xaZkorSW5hUmNIVW93QWw5QjhUcTdlamhWaHB3akN0MkJXS0xlUEp6WUZhK0hNagpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpNU1YekxxWFpJK080VGtvZ3AyNENKSjhpWUdkN2l4MXlDY1V4ClhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDJoTzBqOW4wSHEwViswOSt6dittS3RzMm8Kb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVFgzRUpJcmR1UHVvYwpBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogImVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI4OTU2MDg4NjgyNzM1MTg5NjU1MDMwNTI5MDU3MzUyNzYwNDc3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjoyZTowMDpjYToyNjowNjo5MDozZDphZDpmZTo2ZjoxNTo2ODpkMzo2YjpiMwojIFNIQTEgRmluZ2VycHJpbnQ6IDY3OjY1OjBkOmYxOjdlOjhlOjdlOjViOjgyOjQwOmE0OmY0OjU2OjRiOmNmOmUyOjNkOjY5OmM2OmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMDphNjpmNDpkYzo2MzphMjo0YjpmZDpjZjo1NDplZjoyYTo2YTowODoyYTowYTo3MjpkZTozNTo4MDozZToyZjpmNTpmZjo1Mjo3YTplNTpkODo3MjowNjpkZjpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZQpNUXN3Q1FZRFZRUUdFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwClpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14TWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNdwpJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXFNQ2dHQTFVRUN3d2haVkJMClNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSApTeVpiQ1VOc0laNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoCmlqSHlsM1NKQ1JJbUhKN0syUktpbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1gKRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXZxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMQpUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWDEycnVPempqSzlTWERya2I1d2RKCmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPV1FxcmFmZkEKc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VQpXSDErRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTCm5UMElGYVVRQVMyek1uYW9sUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEgKZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5L3Z2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcApOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpWm8xakRpVk4xUm15NW5rM3B5S2RWREVDCkF3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWlNQXdHQTFVZEV3UUYKTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCCnV2bDJJQ08xSjJCMDFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWwKUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUApKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFZ4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvCmdwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUE5YdWJyamxwQzJKZ1FDQTIKajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyR05tNgo1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCCm8yTTNJVXhFeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMKL2pRNmZianBLZHgycWNndytCUnhnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyegpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeXNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFClc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9EQkNFSVo0M3lna25RVy8yeHpRK0QKaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgU3ViamVjdDogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgTGFiZWw6ICJjZXJ0U0lHTiBST09UIENBIgojIFNlcmlhbDogMzUyMTAyMjcyNDkxNTQKIyBNRDUgRmluZ2VycHJpbnQ6IDE4Ojk4OmMwOmQ2OmU5OjNhOmZjOmY5OmIwOmY1OjBjOmY3OjRiOjAxOjQ0OjE3CiMgU0hBMSBGaW5nZXJwcmludDogZmE6Yjc6ZWU6MzY6OTc6MjY6NjI6ZmI6MmQ6YjA6MmE6ZjY6YmY6MDM6ZmQ6ZTg6N2M6NGI6MmY6OWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVhOmE5OjYyOmM0OmZhOjRhOjZiOmFmOmViOmU0OjE1OjE5OjZkOjM1OjFjOmNkOjg4OjhkOjRmOjUzOmYzOmZhOjhhOmU2OmQ3OmM0OjY2OmE5OjRlOjYwOjQyOmJiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlET0RDQ0FpQ2dBd0lCQWdJR0lBWUZGbkFDTUEwR0NTcUdTSWIzRFFFQkJRVUFNRHN4Q3pBSkJnTlZCQVlUCkFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkQKUVRBZUZ3MHdOakEzTURReE56SXdNRFJhRncwek1UQTNNRFF4TnpJd01EUmFNRHN4Q3pBSkJnTlZCQVlUQWxKUApNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SUpVcU90ZHUwS0J1cVY1RG8KMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhIcmZBUQpVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkClJkWTR6VFcyc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1EKT0E3K2oweGJtMGJxUWZXd0NIVEQwSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dgpKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0M0FBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDCkF3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBY1l3SFFZRFZSME8KQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUErMGh5SgpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZCk1uUThTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1oKNDRneCtGa2FnUW5JbDZaMHgyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SQpKZDFoSnlNY3RURUhCRGEwR3BDOW9IUnhVSWx0dkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053CmkvbkRoRHdUcW42U20xZFRrL3B3d3BFT01mbWJaMTNwbGpoZVg3TnpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE4KOXU2d1drNUpSRlJZWDBLRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjg4MDkxMDU3Njk5Mjg1NjQzMTM5ODQwODUyMDk5NzU4ODU1OTkKIyBNRDUgRmluZ2VycHJpbnQ6IGI1OmU4OjM0OjM2OmM5OjEwOjQ0OjU4OjQ4OjcwOjZkOjJlOjgzOmQ0OmI4OjA1CiMgU0hBMSBGaW5nZXJwcmludDogMDM6OWU6ZWQ6Yjg6MGI6ZTc6YTA6M2M6Njk6NTM6ODk6M2I6MjA6ZDI6ZDk6MzI6M2E6NGM6MmE6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI0Ojc4OmI4OjEyOjI1OjBkOmY4Ojc4OjYzOjVjOjJhOmE3OmVjOjdkOjE1OjVlOmFhOjYyOjVlOmU4OjI5OjE2OmUyOmNkOjI5OjQzOjYxOjg4OjZjOmQxOmZiOmQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEL2pDQ0F1YWdBd0lCQWdJUUZheHVsQm15ZVV0QjlpZXB3eGdQSHpBTkJna3Foa2lHOXcwQkFRc0ZBRENCCm1ERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1QKTUNoaktTQXlNREE0SUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cwplVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlU0F0SUVjek1CNFhEVEE0TURRd01qQXdNREF3TUZvWERUTTNNVEl3TVRJek5UazFPVm93Z1pneEN6QUoKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3T0NCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwCkJnTlZCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU56aVhtSllIVE5YT1RJegordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1aksvQkd2RVN5aWFIQUtBeEpjQ0dWbjJUQXBwTVNBbVVtCmhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFYzVJaWFhY0RpR3lkWThoUzJwZ24KNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0NJU2h3aVAvVwpKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMCkRtS3VkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkMKaHVPbDFVY0NBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpIUVlEVlIwT0JCWUVGTVI1eW82aFRnTWRITnhyMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCCkFRQXR4UlBQVm9CN2VuaTluNjRzbWVmdjJ0K1VYZ2xwcCtkdWFJeTljcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEIKelU2QjhBOEV4Q1N6TkpiR3Bxb3czMmhoYzlmNWpvV0o3dzVlbFNoS0tpZVBFSTR1ZkliRUFwN2FESGRsRGtRTgprdjM5c3hZMitoRU5IWXdPQjRscUtWYjNjdlRkRlp4M05XWlhxeE5UMkk3QlFNWFhFeFphY3NlM2FRSEVlckdECkFXaDlqVUdobEJqQkpWejg4UDZEQW9kOERRM1BMZ2hjU2tBTlB1eUJZZVlrMjhyZ0RpMEhzajVXM0kzMVFZVUgKU0pzTUM4dEpQMzNzdC8zTGpXZUpHcXZ0dXg2akFBZ0lGeXFDWERGZFJvb3RENGFiZE5sRis5UkFzWHFxYUMyRwpzcGtpNGNFcng1ejQ4MStvZ2hMckdSRXQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogNzE3NTgzMjA2NzI4MjU0MTAwMjA2NjE2MjEwODUyNTY0NzI0MDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjlkOmVhOjYwOjI0OmM0OmZkOjIyOjUzOjNlOmNjOjNhOjcyOmQ5OjI5OjRmCiMgU0hBMSBGaW5nZXJwcmludDogYWE6ZGI6YmM6MjI6MjM6OGY6YzQ6MDE6YTE6Mjc6YmI6Mzg6ZGQ6ZjQ6MWQ6ZGI6MDg6OWU6ZjA6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjMxOjBkOjUwOmFmOjE4OmE2OjQ0OjcxOjkwOjM3OjJhOjg2OmFmOmFmOjhiOjk1OjFmOmZiOjQzOjFkOjgzOjdmOjFlOjU2Ojg4OmI0OjU5OjcxOmVkOjE1OjU3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaURDQ0FnMmdBd0lCQWdJUU5md21YTm1FVDhrOUpqMVhtNjdYVmpBS0JnZ3Foa2pPUFFRREF6Q0JoREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFNE1EWUdBMVVFQ3hNdktHTXAKSURJd01EY2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaQpCZ05WQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE1qQWVGdzB3TnpFeE1EVXdNREF3Ck1EQmFGdzB6T0RBeE1UZ3lNelU1TlRsYU1JR0VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGgKZDNSbExDQkpibU11TVRnd05nWURWUVFMRXk4b1l5a2dNakF3TnlCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZwpZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2CmRDQkRRU0F0SUVjeU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFb3RXY2dudVZuZkZTZUlmK2loYS8KQmViZm93SlBEUWZHQUZHNkRBSlNMU0trUWpuRS9vL3F5Y0crMUUzL24zcWU0ckY4bXEybmhnbHpoOUhubXVONgpwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNTgvc0l4cEhSK3ltVm8wSXdRREFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVbXRnQU1BRG5hMytGR082THRzNksKRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU5HNGs4VklaMwpLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94ClhaM0tycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEyNzYxNDE1NzA1NjY4MTI5OTgwNTU1NjQ3NjI3NTk5NTQxNDc3OQojIE1ENSBGaW5nZXJwcmludDogZmI6MWI6NWQ6NDM6OGE6OTQ6Y2Q6NDQ6YzY6NzY6ZjI6NDM6NGI6NDc6ZTc6MzEKIyBTSEExIEZpbmdlcnByaW50OiBmMTo4Yjo1Mzo4ZDoxYjplOTowMzpiNjphNjpmMDo1Njo0Mzo1YjoxNzoxNTo4OTpjYTpmMzo2YjpmMgojIFNIQTI1NiBGaW5nZXJwcmludDogNGI6MDM6ZjQ6NTg6MDc6YWQ6NzA6ZjI6MWI6ZmM6MmM6YWU6NzE6Yzk6ZmQ6ZTQ6NjA6NGM6MDY6NGM6ZjU6ZmY6YjY6ODY6YmE6ZTU6ZGI6YWE6ZDc6ZmQ6ZDM6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lRWUFHWHQwYW42clMwbXRaTEwvZVErekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKcmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EZ2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaUJnTlYKQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE16QWVGdzB3T0RBME1ESXdNREF3TURCYQpGdzB6TnpFeU1ERXlNelU1TlRsYU1JR3VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGhkM1JsCkxDQkpibU11TVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpJRVJwZG1semFXOXUKTVRnd05nWURWUVFMRXk4b1l5a2dNakF3T0NCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbApaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2ZENCRFFTQXRJRWN6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc3I4bkxQdmIyRnZkZUhzYm5uZG0KZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXRQMExNcW1zeXdDUExMRUhkNU4vOApZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQytCc1VhMExmCmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzkKOWlyWTdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyUwp6aGtHY3VZTVhEaHB4d1RXdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrCk9RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVVyV3lxbEdDYzdlVC8rajRLZEN0akEvZTJXYjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUJwQQoySlZsckFtU2ljWTU5QkRscVE1bVUxMTQzdm9ra2J2blJGSGZ4aFkwQ3U5cVJGSHFLd2VLQTNyRDZ6OEtMRklXCm9DdER1U1dRUDNDcE15VnRSUm9vT3lmUHFzTXBRaHZmTzB6QU16UmJRWWkvYXl0bHJ5anZzdlhEcW1iT2UxYnUKdDhqTFo4SEpuQm9ZdU1URFNRUHhZQTVRelViRjgzZDU5N1lWNERqYnh5OG9vQXcvZHlaMDJTVVMyakhhR2g3YwpLVUdSSWp4cHA3c0M4clpjSndPSjlBYnFtK1J5Z3VPaENjSHBBQm5UUHRSd2E3cHhwcXBZcnZTNzZXeTI3NGZNCm03di9PZVpXWWRNS3A4UmNUR0I3QlhjbWVyL1lCMUlzWXZkd1k5azV2Rzhjd25uY2RpbXZ6c1VzWkFSZWlEWnUKTWRSQUdtSTBOajgxQWE2c1k2QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDgwNjgyODYzMjAzMzgxMDY1NzgyMTc3OTA4NzUxNzk0NjE5MjQzCiMgTUQ1IEZpbmdlcnByaW50OiAwMTo1ZTpkODo2YjpiZDo2ZjozZDo4ZTphMTozMTpmODoxMjplMDo5ODo3Mzo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOjE3Ojg0OmQ1OjM3OmYzOjAzOjdkOmVjOjcwOmZlOjU3OjhiOjUxOjlhOjk5OmU2OjEwOmQ3OmIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZTpkYjo3YTpjNDozYjo4MjphMDo2YTo4Nzo2MTplODpkNzpiZTo0OTo3OTplYjpmMjo2MToxZjo3ZDpkNzo5YjpmOToxYzoxYzo2Yjo1Njo2YToyMTo5ZTpkNzo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3JqQ0NBaldnQXdJQkFnSVFQTEwwU0FvQTR2N3JKRHRlWUQ3RGF6QUtCZ2dxaGtqT1BRUURBekNCbURFTApNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1RNQ2hqCktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTIKTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazFPVm93Z1pneEN6QUpCZ05WCkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZ01qQXcKTnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVgpCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICk1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0wKU28xN1ZEczZibDhWQXNCUXBzOGxMMzNLU0xqSFVHTWNLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbAp0Skx0YkN5ZjY5MURpYUk4UzBpUkhWRHNKdC9XWUM2OUlhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJWZk5WZFJWZnNsc3EwRGFmd0JvL3ErRVZYVk1Bb0cKQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR1NXV2Fib0NkNkx1dnBhaUlqd0g1SFRScWp5U2t3Q1kvdHNYempiTGtHVApxUTdtbmR3eEhMS2dweGdjZWVISE5nSXdPbGF2bW5Sczl2dUQ0RFBUQ0YraG5NSmJuMGJXdHN1UkJtT2lCdWN6CnJENm9nUkxReTdyUWtndTJucGFxQkErSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA4NTIwOTU3NDczNDA4NDU4MTkxNzc2Mzc1MjY0NDAzMTcyNjg3NwojIE1ENSBGaW5nZXJwcmludDogOGU6YWQ6YjU6MDE6YWE6NGQ6ODE6ZTQ6OGM6MWQ6ZDE6ZTE6MTQ6MDA6OTU6MTkKIyBTSEExIEZpbmdlcnByaW50OiAzNjo3OTpjYTozNTo2Njo4Nzo3MjozMDo0ZDozMDphNTpmYjo4NzozYjowZjphNzo3YjpiNzowZDo1NAojIFNIQTI1NiBGaW5nZXJwcmludDogMjM6OTk6NTY6MTE6Mjc6YTU6NzE6MjU6ZGU6OGM6ZWY6ZWE6NjE6MGQ6ZGY6MmY6YTA6Nzg6YjU6Yzg6MDY6N2Y6NGU6ODI6ODI6OTA6YmY6Yjg6NjA6ZTg6NGI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1VENDQTZHZ0F3SUJBZ0lRUUJyRVpDR3pFeUVERHJ2a0VockZIVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKdlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd09DQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1UZ3dOZ1lEVlFRREV5OVcKWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlZVekVYCk1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjAKSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eQpJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oCmJDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4MkUzWHJFQk5OdGkxeFdiLzFoYWpDTWoxbUNPa2RlUW1JTjY1bGdaT0l6Rgo5dVZraGJTaWNmdnR2Ym5helUwQXRNZ3RjNlhIYVhHVkh6azhza1FIbk9nTytrMUt4Q0hmS1dHUE1pSmhnc1dICkgyNk1mRjhXSUZGRTBYQlBWK3JqSE9QTWVlNVkyQTdDczBXVHdDem5taGNyZXdBM2VrRXplT0V6NHZNUUduK0gKTEw3MjlmZEM0dVcvaDJLSlh3QkwzOFhkNUhWRU1rRTZIbkZ1YWNzTGRVWUkwY3JTSzVYUXovdTVRR3RrakZkTgovQk1SZVlUdFhsVDJOSjhJQWZNUUpRWVhTdHJ4SFhwbWE1aGdacVRaNzlJdWd2SHc3d25xUk1rVmF1SURialBUCnJKOVZBTWYyQ0dxVXVWL2M0RFB4aEdENVd5Y1J0UHdXOHJ0V2FvQWxqUUlEQVFBQm80R3lNSUd2TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUcwR0NDc0dBUVVGQndFTUJHRXdYNkZkb0ZzdwpXVEJYTUZVV0NXbHRZV2RsTDJkcFpqQWhNQjh3QndZRkt3NERBaG9FRkkvbDB4cUdySTJPYThQUGdHclVTQmdzCmV4a3VNQ1VXSTJoMGRIQTZMeTlzYjJkdkxuWmxjbWx6YVdkdUxtTnZiUzkyYzJ4dloyOHVaMmxtTUIwR0ExVWQKRGdRV0JCUzJkL3BwU0VlZlV4TFZ3dW9ITW5ZSDBaY0hHVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBU3ZqNApzQVBtTEdkNzVKUjNZOHh1VFBsOURnM2N5TGsxdVhCUFkvb2srbXlEakVlZE8yUHptdmwyTXBXUnNYZThySnErCnNlUXhJY2FCbFZaYURySEMxTEdtV2F6eFk4dTRUQjFaa0VydmtCWW9IMXF1RVB1QlVEZ01iTXp4UGNQMVkrT3oKNHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4UC9qZ2RGY3JHSjJCdE1RbzJwU1hwWERyckIyKwpCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1B3R1pzWTZycDJhUVc5SUhSCmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNG1KTzMKN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IgojIFNlcmlhbDogNjMxNDM0ODQzNDgxNTM1MDY2NjUzMTE5ODU1MDE0NTg2NDAwNTEKIyBNRDUgRmluZ2VycHJpbnQ6IDNhOjUyOmUxOmU3OmZkOjZmOjNhOmUzOjZmOmYzOjZmOjk5OjFiOmY5OjIyOjQxCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZDU6ZDg6ZGY6OGY6MDI6MzE6ZDE6OGQ6Zjc6OWQ6Yjc6Y2Y6OGE6MmQ6NjQ6Yzk6M2Y6NmM6M2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmRkOmQ3OmVhOjkwOmJiOjU3OmM5OjNlOjEzOjVkOmM4OjVlOmE2OmZjOmQ1OjQ4OjBiOjYwOjMyOjM5OmJkOmM0OjU0OmZjOjc1OjhiOjJhOjI2OmNmOjdmOjc5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEaERDQ0F3cWdBd0lCQWdJUUw0RCtJNHdPSWc5SVp4SW9rWWVzc3pBS0JnZ3Foa2pPUFFRREF6Q0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwClUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2cKU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbgpiaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1CklDMGdSelF3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBU25WbnA4VXRwa213NHRYTmhlckpJOS9nSG0KR1VvOUZBTkwrbUFuSU5tRGlXbjZWTWFhR0Y1VkttVGVCdmFOU2p1dEVEeGxQWkNJQkluZ01HR3pybDBCcDN2ZQpmTEsreW1WaEFJYXUybzk3MEltdFRSMVpta0d4dkVlQTNKNWl3L21qZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUoKYVcxaFoyVXZaMmxtTUNFd0h6QUhCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZagphSFIwY0RvdkwyeHZaMjh1ZG1WeWFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGTE1XCmtmM3VwbTdrdFM1Smo0ZDRnWURzNWJHMU1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01HWWhEQmdtWUZvNGUxWkMKNEtmOE5vUlJrU0FzZGsxRFBjUWRoQ1BRck5aOE5RYk96V205a0EzYmJFaENIUTZxUWdJeEFKdzlTRGtqT1ZnYQpGUkpaYXA3djFWbXlIVklzbVhITnh5bmZHeXBoZTNIUjN2UEE1UTA2U3FvdHA5aUdLdDB1RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIFN1YmplY3Q6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBMYWJlbDogIk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSIKIyBTZXJpYWw6IDgwNTQ0Mjc0ODQxNjE2CiMgTUQ1IEZpbmdlcnByaW50OiBjNTphMTpiNzpmZjo3MzpkZDpkNjpkNzozNDozMjoxODpkZjpmYzozYzphZDo4OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA2OjA4OjNmOjU5OjNmOjE1OmExOjA0OmEwOjY5OmE0OjZiOmE5OjAzOmQwOjA2OmI3Ojk3OjA5OjkxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yzo2MTpkYTpjMzphMjpkZTpmMDozMTo1MDo2YjplMDozNjpkMjphNjpmZTo0MDoxOTo5NDpmYjpkMTozZDpmOTpjODpkNDo2Njo1OTo5Mjo3NDpjNDo0NjplYzo5OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRRwpFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzCk1EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMGRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmwKY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUgpkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3hNakEyTVRVd09ESXhXakNCCnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4T1pYUk0KYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbQphV05oZEdsdmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56CklFZHZiR1FwSUViRmtYUmhic082YzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeENSZWM3NUxiUlREb2ZUamw1QnUwakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVApsRjhhZkZ0dHZ6QlBoQ2Yybng5SnZNYVpDcER5RC9WL1E0UTNZMUdMZXFWdy9IcFl6WTZiN2NOR2JJUndYZHJ6CkFaQWovRTR3cVg3aEoyUG43V1E4b0xqSk0yUCtGcEQvc0xqOTE2akF3SlJEQzdiVldhYWVWdEFrSDNCNXI5czUKVkExbGRka1ZRWlFCcjE3czlvM3gvNjFrL2lDYTExenIvcVlmQ0dTamkzWlZyUjQ3S0dBdWh5WG9xcThmeG1SRwpJTGR3Znp6ZVNOdVdVN2M1ZCtRYTRzY1doSGFYV3krN0dSV0YrR21GOVptbnFmSTBwNm0ycGdQOGI0WTlWSHgyCkJKdHIrVUJkQURUSExwbDFuZVdJQTZwTitBUFNRbmJBR3dJREFLaUxvMFV3UXpBU0JnTlZIUk1CQWY4RUNEQUcKQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV6UHBuay9DMnVOQ2x3Qjd6VS8yTQpVOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXcVp3OFVRQ2d3QkVJQmFlWjVtOEJpRlJoCmJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGFZdE9VWmNUaDVtMkMKK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGCnVMamJ2clc1S2ZuYU53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTIKWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1ZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogMTAwMDAwMTIKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOmE1OjBmOmY4OjViOjlhOjdkOjZkOjMwOmFlOjU0OjVhOmUzOjQyOmEyOjhhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6YWY6ODI6Nzk6OTE6ODY6Yzc6YjQ6NzU6MDc6Y2I6Y2Y6MDM6NTc6NDY6ZWI6MDQ6ZGQ6Yjc6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY2OjhjOjgzOjk0OjdkOmE2OjNiOjcyOjRiOmVjOmUxOjc0OjNjOjMxOmEwOmU2OmFlOmQwOmRiOjhlOmM1OmIzOjFiOmUzOjc3OmJiOjc4OjRmOjkxOmI2OjcxOjZmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGeWpDQ0E3S2dBd0lCQWdJRUFKaVdqREFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjeU1CNFhEVEE0TURNeU5qRXhNVGd4TjFvWApEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaNTI5MQpxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwCnVPVWZpVXRudldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFUKWjV1VzZNN1h4Z3BUMEd0Smx2T2pDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RQpwTWZROVhRK3BWMGFDUEtiSmRMMnJBUW1QbFU2WWlpbGU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwCjVSYm4zSkJWM3cvb09NMlpOeUZQWGZVaWIyckZFaFpnRjFYeVpXYW1wekNST01FNEhZWUVoTG9hSlhoZW5hL00KVUdEV0U0ZFM3V01mYldWOXdoVVlkTXJoZm1RcGpITFlGaE45QzBsSzhTZ2JJSFJyeFQzZHNLcElDVDB1Z3BUTgpHbVhaSzRpYW1id1lmcC91ZldaOFByMlV1SUhPelpnd2VNRnZaOUMrWCtCbzdkN2lzY2tzV1hpU3F0OHJZR1B5CjVWNjU0OHI2ZjFDR1BxSTBHQXdKYUNnUkhPVGh1VncrUjdveVB4ak1XNFQxODJ0MHhISjA0ZU9Mb0VxOWpXWXYKNnEwMTJpRFRpSUpoOEJJaXRyelExYVRzcjFTSUpTUThwMjJ4Y2lrL1BsZW1mMVd2YmliRy91Zk1RRnhSUklFSwplTjVLemxXL0hkWFp0MWJ2OEhiL0MzbTFyNzM3cVdtUlJwZG9nQlEySGJOL3V5bVlOcVVnK29KZ1lqT2s3TmE2CkI2ZHV4YzhVcHVmV2tqVFlnZlg4SFYycVhCNzJvMDA3dVBjNUFnTUJBQUdqZ1pjd2daUXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekJTQmdOVkhTQUVTekJKTUVjR0JGVWRJQUF3UHpBOUJnZ3JCZ0VGQlFjQ0FSWXhhSFIwY0RvdgpMM2QzZHk1d2EybHZkbVZ5YUdWcFpDNXViQzl3YjJ4cFkybGxjeTl5YjI5MExYQnZiR2xqZVMxSE1qQU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSkZvTW9jVkhZbml0ZkdzTmlnMGpRdDhZb2pyTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQ0FRQ29RVXBuS3BLQmdsQnU0ZGZZc3prNzh3SVZDVkJSN3kyOUpIdUloanY1dEx5UwpDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXorNTFJdnV4QlE0RWZma2RBSE9WNkNNcXFpM1d0Rk1UQzZHWThnZ2VuCjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3amYvU1Q3WndhVWI3ZFJVRy9rU1MwSDR6cFg4OTcKSVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOa3FiRzlBY2xWTXdXVnhKSwpnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmtDcFlMCis2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEwKdkp4eGN5cEZVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbQpiRWdlcW1pU0JlR0NjMXFiM0FkYkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrCk4xdHJTdDhzVjRwQVdqYTYzWFZFQ0RkQ2NBeiszRjRob0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkMKWTdCWE4wVXRlNHFjdndYcVpWVXo5emtReFNncUlYb2Jpc1FrK1Q4VnlKb1ZJUFZWWXBidGJaTlF2T1NxZUszWgp5d3BsaDZabXdjU0JvM2M2V0I0TDdvT0xuUjdTVXFUTUhXK3dtRzJVTWJYNGNRcmN1Zng5TW1EbTY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBTdWJqZWN0OiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBMYWJlbDogIkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIgojIFNlcmlhbDogMTAwMAojIE1ENSBGaW5nZXJwcmludDogYTg6MGQ6NmY6Mzk6Nzg6Yjk6NDM6NmQ6Nzc6NDI6NmQ6OTg6NWE6Y2M6MjM6Y2EKIyBTSEExIEZpbmdlcnByaW50OiBkNjpkYTphODoyMDo4ZDowOTpkMjoxNTo0ZDoyNDpiNToyZjpjYjozNDo2ZTpiMjo1ODpiMjo4YTo1OAojIFNIQTI1NiBGaW5nZXJwcmludDogZjk6ZTY6N2Q6MzM6NmM6NTE6MDA6MmE6YzA6NTQ6YzY6MzI6MDI6MmQ6NjY6ZGQ6YTI6ZTc6ZTM6ZmY6ZjE6MGE6ZDA6NjE6ZWQ6MzE6ZDg6YmI6YjQ6MTA6Y2Y6YjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNRENDQWhpZ0F3SUJBZ0lDQStnd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1NFc3gKRmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcmIyNW5JRkJ2YzNRZwpVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXhOVEExTVRNeE5Gb1hEVEl6TURVeE5UQTBOVEl5T1Zvd1J6RUxNQWtHCkExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHIKYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzFBcHpRCmpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW4KUHpsVENlcXJhdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaApaWTRiWFNObU83aWxNbEhJaHFxaHFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5Cm5uVjB0dGdDWGpxUWVzQkNObkxzYWszYzc4UUEzeE1ZVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2gKcTVVUlgyMDhvMXhOZzF2eXN4bUtnSXNMaHdJREFRQUJveVl3SkRBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFRApNQTRHQTFVZER3RUIvd1FFQXdJQnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFEa2JWUEs3aWg5bGVnWXNDCm1FRUlqRXk4MnR2dUp4dUM1MnBGN0JhTFQ0V2c4N0p3dlZxV3VzcHViZTVHaTI3bktpNldzeGt6NjdTZnFMSTMKN3Bpb2w3WXV0bWNuMUtaSi9SeVRaWGFlUWkvY0lteWFUL0phRlRteGNkY3JVZWh0SEpqQTJTcjBvWUo3MWNsQgpvaU1CZERoVml3KzVMbWVpSUFRMzJwd0wweGNoNEkrWGVUUnZoRWdDSURNYjVqUkVuNUZ3OUlCZWhFUENLZEpzCkVoVGtZWTJzRUpDZWhGQzc4Slp2UlorSzg4cHNUL29ST2hVVlJzUE5INE5iTFVFUzdWQm5RUk05SWF1VWlxcE8KZk1HeCs2Zld0U2N2bDZ0dTRCM2kwUndzSDBUaS9MNlJvWno3MWlsVGM0YWZVOWhERGwzV1k0SnhIWUIweXZiaQpBbXZaV2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIExhYmVsOiAiU2VjdXJlU2lnbiBSb290Q0ExMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGI3OjUyOjc0OmUyOjkyOmI0OjgwOjkzOmYyOjc1OmU0OmNjOmQ3OmYyOmVhOjI2CiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzQ6OWY6NDg6Zjg6ZjM6NzM6YTA6OWM6MWU6YmQ6Zjg6NWI6YjE6YzM6NjU6Yzc6ZDg6MTE6YjMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOjBmOmVlOmZiOjllOjNhOjU4OjFhOmQ1OmY5OmU5OmRiOjc1Ojg5Ojk4OjU3OjQzOmQyOjYxOjA4OjVjOjRkOjMxOjRmOjZmOjVkOjcyOjU5OmFhOjQyOjE2OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyCk1Da0dBMVVFQ2hNaVNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0cKQTFVRUF4TVRVMlZqZFhKbFUybG5iaUJTYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBMApNRGd3TkRVMk5EZGFNRmd4Q3pBSkJnTlZCQVlUQWtwUU1Tc3dLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwClkyRjBhVzl1SUZObGNuWnBZMlZ6TENCSmJtTXVNUnd3R2dZRFZRUURFeE5UWldOMWNtVlRhV2R1SUZKdmIzUkQKUVRFeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBL1hlcXBSeVFCVHZMVEpzegppMW9VUmFUbmtCYlIzMWZTSVJDa0YvM2ZyTllmcCtUYmZQZnMzN2dEMnBSWS9WMXlmSXcvWHdGbmRCV1c0d0k4Cmg5dXV5d0dPd3ZObXhvVkY5QUxHT3JWaXNxLzZuTCtrNXRTQU1KanpEYmFUajZuVTJEYnlzUHlLeWl5aEZUT1YKTWRyQUcvTHVZcG1HWXorLzNaTXFnNmgydVJNZnQ4NU9Rb1dQSXVjdUd2S1ZDYklGdFVST2Q2RWd2YW55VGdwOQpVSzMxQlExRlQwWngvU2crVS9zRTJDM1haUjFLRy9yUE83QXhtalZ1eUlzRzB3Q1I4cFFJWlV5eE5BWUFlb25pCjhNY0RXYy9WMXVpbk1yUG1tRUNHeGMwbkVvdk1lODYzRVR4aVlBY2pQaXRBYnBTQUNXMjJzMjkzYnpVSVVQc0MKaDhVK2lRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVXL2hOVDdLbGh0UTYwdkZqbXFDK0NmWlh0OTR3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCkFLQ2hPQlptTHFkV0h5R2NCdm9kN2JraXhUZ20yRTVQN0tOL2VkNUdJYUdIZDQ4SENKcXlwTVd2RHpLWUMzeG0KS2JhYmZTVlNTVU9yVEM0cmJucHdyeFlPNHdKcyswTG1HSjFGMkZYSTZEdmQ1K0gwTGdzY05GeHNXRXI3akloUQpYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRT2gyOURieDdWRkFMdVVLdlZhQVlnYTFsbWUrKzVKeS94SVdyClFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDF5OGhTeW4rQi90bHIwL2NSN1NYZitPZjUKcFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MWxnZUxLQk9iakJtTgpRU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBTdWJqZWN0OiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgTGFiZWw6ICJNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkiCiMgU2VyaWFsOiAxNDAxNDcxMjc3NjE5NTc4NDQ3MwojIE1ENSBGaW5nZXJwcmludDogZjg6NDk6ZjQ6MDM6YmM6NDQ6MmQ6ODM6YmU6NDg6Njk6N2Q6Mjk6NjQ6ZmM6YjEKIyBTSEExIEZpbmdlcnByaW50OiA4OTpkZjo3NDpmZTo1YzpmNDowZjo0YTo4MDpmOTplMzozNzo3ZDo1NDpkYTo5MTplMTowMTozMTo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NWY6ODE6ZmU6YTU6ZmE6Yjg6MmM6NjQ6YmY6YTI6ZWE6ZWM6YWY6Y2Q6ZTg6ZTA6Nzc6ZmM6ODY6MjA6YTc6Y2E6ZTU6Mzc6MTY6M2Q6ZjM6NmU6ZGI6ZjM6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MApaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHCkNTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHkKT1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReApGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwCloyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UAprZDZtSnZpWnBXTndyWnV1eWpOQWZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjCmNibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFUKZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0FweG4xbnR4VlV3T1hld2RJLzVuNwpONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bTFIeGRydGJDCnhremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTEKK3JVQ0F3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNClBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUVGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwb2xaTUV5TC9helhtNFE1RHdwTDd2OHU4aAptTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYSS9PTW43NGRzZUdrCmRkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YwoyUG0yRzJKd0N6MDJ5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0CkhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaUxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTc1OTQyNjIwOTk1NAojIE1ENSBGaW5nZXJwcmludDogYzU6ZGY6Yjg6NDk6Y2E6MDU6MTM6NTU6ZWU6MmQ6YmE6MWE6YzM6M2U6YjA6MjgKIyBTSEExIEZpbmdlcnByaW50OiBkNjo5Yjo1NjoxMTo0ODpmMDoxYzo3NzpjNTo0NTo3ODpjMTowOToyNjpkZjo1Yjo4NTo2OTo3NjphZAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6YjU6MjI6ZDc6Yjc6ZjE6Mjc6YWQ6NmE6MDE6MTM6ODY6NWI6ZGY6MWM6ZDQ6MTA6MmU6N2Q6MDc6NTk6YWY6NjM6NWE6N2M6ZjQ6NzI6MGQ6Yzk6NjM6YzU6M2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0Ck1UQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU13bGRwQjVCbmdpRnZYQWc3YUV5aWllL1FWMkVjV3RpSEw4ClJnSkR4N0tLblFSZkpNc3VTK0ZnZ2tiaFVxc01nVWR3Yk4xazBldjFMS01QZ2owTUs2NlgxN1lVaGhCNXV6c1QKZ0hlTUNPRkowbXBpTHg5ZStwWm8zNGtubFRpZkJ0Yyt5Y3NtV1ExejNyREk2U1lPZ3hYRzcxdUwwZ1JneWttbQpLUFpwTy9iTHlDaVI1WjJLWVZjM3JIUVUzSFRnT3U1eUx5NmMrOUM3di9VOUFPRUdNK2lDSzY1VHBqb1djNHpkClFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psT0NaZ2RiS2ZkLytSRk8rdUlFbjhyVUFWU05FQ01XRVoKWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjJ4bW1GZ2hjQ0F3RUFBYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZJL3dTMytvCkxrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlUKUlVtN2xnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcApqak01UmNPTzVMbFhiS3I4RXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLCjZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUViZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVgKbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOFlJdkRRVkVUSTUzTzl6SnJsQUdvbWVjcwpNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdya3BlRE1kbXp0Y3BICldEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIFN1YmplY3Q6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIExhYmVsOiAiQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4IgojIFNlcmlhbDogNjA0NzI3NDI5NzI2Mjc1Mzg4NwojIE1ENSBGaW5nZXJwcmludDogNzM6M2E6NzQ6N2E6ZWM6YmI6YTM6OTY6YTY6YzI6ZTQ6ZTI6Yzg6OWI6YzA6YzMKIyBTSEExIEZpbmdlcnByaW50OiBhZTpjNTpmYjozZjpjODplMTpiZjpjNDplNTo0ZjowMzowNzo1YTo5YTplODowMDpiNzpmNzpiNjpmYQojIFNIQTI1NiBGaW5nZXJwcmludDogMDQ6MDQ6ODA6Mjg6YmY6MWY6Mjg6NjQ6ZDQ6OGY6OWE6ZDQ6ZDg6MzI6OTQ6MzY6NmE6ODI6ODg6NTY6NTU6M2Y6M2I6MTQ6MzA6M2Y6OTA6MTQ6N2Y6NWQ6NDA6ZWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJVSt3Nzd2dXlTRjh3RFFZSktvWklodmNOQVFFRkJRQXdVVEVMTUFrR0ExVUUKQmhNQ1JWTXhRakJBQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaApjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMk9EQWVGdzB3T1RBMU1qQXdPRE00TVRWYUZ3MHpNREV5Ck16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJd1FBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWcKUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCTmpJMk16UXdOamd3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1RERVdGQ5CnRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU0KY2FzOVVYNFBCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmRwpMOUl0V1kxNkNrNldhVklDcWphWTdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpCk5BOXdCajRnR0ZyTzkzSWJKV3lUZEJTVG8zT3hEcXFIRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2gKWDY4Z3ZxQjJmM2JsN0JxR1lUTSs1M3UwUDZBUGpxSzVhbSs1aHladlFXeUlwbEQ5YW1NTDlaTVdHeG1Qc3UyYgptOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WE1iU2N5SkN5ClovUVlGcE02L0VmWTBYaVdNUis2S3d4ZlhabXRZNGxhSkNCMjJOLzlxMDZtSXFxZFh1WW5pbjFvS2FQbmlyamEKRWJzWExabWRFeVJHOThYaTJKK09mOGVQZEcxYXN1aHk5YXp1SkJDdEx4VGEveTJhUm5GSHZrTGZ1d0hiOUgvVApLSTh4V1Z2VHlRS210RkxLYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGCjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1V2emxOMUo1QnRvK1dIV09XazltVkJuZ3hhSjQzQmp1QWlVVmgKT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6Q0JwZ1lEClZSMGdCSUdlTUlHYk1JR1lCZ1JWSFNBQU1JR1BNQzhHQ0NzR0FRVUZCd0lCRmlOb2RIUndPaTh2ZDNkM0xtWnAKY20xaGNISnZabVZ6YVc5dVlXd3VZMjl0TDJOd2N6QmNCZ2dyQmdFRkJRY0NBakJRSGs0QVVBQmhBSE1BWlFCdgpBQ0FBWkFCbEFDQUFiQUJoQUNBQVFnQnZBRzRBWVFCdUFHOEFkZ0JoQUNBQU5BQTNBQ0FBUWdCaEFISUFZd0JsCkFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeEFEY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQmQ5b1BtMDNjWEYKNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4NTF0a2xqWXlHT3lsTW5mWDQwUzJ3QkVxZ0xrOQphbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWtSNzFrTXJ2MkpZU2lKMEwxCklMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUFQ0ODEKUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUwozYS9EVGc0ZkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrClNlVHkzNkxzc1V6QUtoM250TEZsb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYKM2R2ZDZxSjJnSE45OVp3RXhFV041N2tjaTU3cTEzWFJjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTQpaY0Z3Z2JnNC9FTXhzdllETkVleXJQc2lCc3NlM1JkSEhGOW11ZE1hb3RvUnNhUzhJOG5rdm9mL3VaUzIrRjBnClN0UmY1NzFvZTJYeUZSN1NPcWt0NmRockpLeVhXRVJIclZrWThTRmxjTjdPTkdDb1FQSHpQS1RES0NPTS9pY3oKUTBDZ0Z6enI2anV3Y3FhanVVcExYaFpJOUxLOHlJeVN4WjJmckhJMnZEU0FOR3VwaTVMQXVCZnQ3SFpUOVNRQgpqTE1pNkV0OFZjYWQrcU1VdTJXRmJtNVBFbjRLUEoyVgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgU3ViamVjdDogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgTGFiZWw6ICJJemVucGUuY29tIgojIFNlcmlhbDogOTE3NTYzMDY1NDkwMzg5MjQxNTk1NTM2Njg2OTkxNDAyNjIxCiMgTUQ1IEZpbmdlcnByaW50OiBhNjpiMDpjZDo4NTo4MDpkYTo1Yzo1MDozNDphMzozOTo5MDoyZjo1NTo2Nzo3MwojIFNIQTEgRmluZ2VycHJpbnQ6IDJmOjc4OjNkOjI1OjUyOjE4OmE3OjRhOjY1OjM5OjcxOmI1OjJjOmEyOjljOjQ1OjE1OjZmOmU5OjE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNTozMDpjYzo4ZTo5ODozMjoxNTowMjpiYTpkOTo2Zjo5YjoxZjpiYToxYjowOTo5ZToyZDoyOTo5ZTowZjo0NTo0ODpiYjo5MTo0ZjozNjozYjpjMDpkNDo1MzoxZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNApNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2ClpXNXdaUzVqYjIwd0hoY05NRGN4TWpFek1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWUQKVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1agpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREowM3JLRHg2c3A0Ym9GbVZxCnNjSWJSVEp4bGRuK0VGdk1yK2VsZVFHUGljUEs4bFZ4OTNlK2Q1VHpjcVFzUk5pZWtwc1VPcUhuSkpBS0NsYU8KeGRnbWxPSFpTT0V0UHRvS2N0MmptUlhhZ2FLSDlIdHVKbmVKV0szVzZ3eXlRWHB6Ym0zYmVuaEI2UWlJRW42SApMbVlSWTJ4VSt6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYCnVhT0ttTVBzT3pURmxVRnBmblhDUENERllicFJSNkFna0pPaGtFdnpUbnlGUlZTYTBRVW1RYkMxVFIwenZzUUQKeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFRPVGNqN05NQitlQUpSRTFOWk1EaERWcUhJcnl0RzZQKwpKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiS0Y3akplb2RXTEJvQkhteStFNjBRCnJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLMEdxZnZFeU4KQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TApoaWorMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCClFGcU5lYitMejB2UHFoYkJsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSisKSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJREFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdQpabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnClFUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkdOaklnVXpneFF6QkIKQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQ0FRQjRwZ3dXU3A5TWlEckF5dzZsRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYgpsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2FrRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2CmF3bXF4aW51YUVsbk1JQWtlakVXT1Z0KzhSd3UzV3dKcmZJeHdZSk91YnY1dnI4cWhUL0FRS002V2Z4WlN6d28KSk51MEZYV3VEWWk2TG5QQXZWaUg1VUx5NjE3dUhqQWltY3MzMGNRaGJJSHN2bTBtNWh6a1FpQ2VSN0NzZzFsdwpMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUClZ5dmVoUVA1YVRmTG5uaHFCYlRGTVhpSjdIcW5oZUc1ZXp6ZXZoNTVoTTZmY0E1WndqVXVrQ294MmVSRmVrR2sKTGhPYk5BNW1lMG1yWkpmUVJzTjVuWEpRWTZhWVd3YTlTRzNZT1lOdzZEWHdCZEdxdk9QYnlBTHFmUDJDMnNKYgpVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQ0NsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvClFuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvUTBpeTIrdHpKT2VSZjFTa3RvQSsKbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVpXck9aeUdscwpReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDExODA2ODIyNDg0ODAxNTk3MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTo4MDo5ZTo4NDo1YTowZTo2NTowYjoxNzowMjpmMzo1NToxODoyYTozZTpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDc4OjZhOjc0OmFjOjc2OmFiOjE0OjdmOjljOjZhOjMwOjUwOmJhOjllOmE4OjdlOmZlOjlhOmNlOjNjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjozZTo0YTpmYTpjNDo5MTpkZjpkMzozMjpmMzowODo5Yjo4NTo0MjplOTo0NjoxNzpkODo5MzpkNzpmZTo5NDo0ZToxMDphNzo5Mzo3ZTplMjo5ZDo5Njo5MzpjMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKegpJRzltSUVOdmJXMWxjbU5sSUZKdmIzUWdMU0F5TURBNE1CNFhEVEE0TURnd01URXlNamsxTUZvWERUTTRNRGN6Ck1URXlNamsxTUZvd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObFpTQmoKZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0TDJGa1pISmxjM01wTVJJdwpFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnlabWx5YldFZ1V5NUJMakVwCk1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdElESXdNRGd3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN2QU10d055dUFXa282YkhpVWZhTi9HaC8yTmRXOQoyOHNOUkhJK0pyS1FVcnBqT3loWWI2V3piWlNtODkxa0RGWDI5dWZ5SWlLQVh1Rml4cllwNFlGczhyL2xmVEpxClZLQXlHVm4rSDR2WFBXQ0doU1J2NHhHemR6NGdsalVoYTdNSTJYQXVaUGVFa2xQV0RyQ1Fpb3JqaDQwRzA3MlEKRHVLWm9SdUdEdHFhQ3JzTFlWQUdVdkdlZjNic3l3L1FIZzNQbVRBOUhNUkZFRmlzMXRQbzErWHF4UUVIZDlaUgo1Z04vaWtpbFRXaDF1ZW04bms0WmNmVXlTNXh0WUJrTCs4eWRkZHkvSnMyUGszZzVlWE5lSlE3S1hPdDNFZ2ZMClpFRkhjcE9yVU1QckNYWmtOTkk1dDNZUkNRMTJSY1NwcmoxcXI3VjlaUytVV0JEc1hIeXZmdUsyR05uUW0wNWEKU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1Z0QydmxHdHMvNCtFaHlTbkI4ZXNIbkZJYkFVUlJQSHNsMThUbApVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxbHViS2dkYVg4WlNENmUyd3NXc1NhUjZzCisxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEwd2xmMmVPS05jeDUKV2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4CmhkdXViKzg0TXhoMkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlYKSFE0RUZnUVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMQorSG5BK21DSUc4VFpUUUtlRnhtaGdiU2tnYkV3Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOCllXUnlhV1FnS0hObFpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXQKTDJGa1pISmxjM01wTVJJd0VBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeQpabWx5YldFZ1V5NUJMakVwTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0CklESXdNRGlDQ1FDajJrSitwTEd1MmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlYKSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSkFTcnlJMXdxTTU4QzdlNmJYcGVIeEl2ajk5UlpKZTZkcXhHZndXClBKKzBXMmFlYXVmRHVWMkk2QSt0enlNUDNpVTZYc3hQcGNHMUxhd2swbGdIM3FMUGFZUmdNK2dRRFJPcEk5Q0YKNVk1N3BwNDljaE55TS9XcWZjWmpId2owL2dGL0pNOHJMRlFKM3VJcmJaTEdPVThXNmp4K2VrYlVSV3BHcU90MQpnbGFucTZCOGFCTXo5cDB3OEc4bk9TUWpLcEQ5a0NrMThwUGZOS1hHOS9qdmpBOWlTbnl1MC9WVStJMjJtbGFICkZvSTZNNnRhSWdqM2dycnFMdUJIbXJTMVJhTUZPOW5jTGtWQU8rcmNmK2c3NjlIc0p0ZzFwRERGT3F4WG5yTjIKcFNCNytSNUtCV0lCcGloMVlKZVNEVzQrVFRkRERaSVZuQmdpelZHWm9Da2FQRitLTWpOYk1NZUpMMGVZRDZNRAp4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GOWRpanNjaWxJZVVjRTVmdURyM2ZLYW52TkZOYjArUnFFNFFHCnRqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0t6QklLaW5td1BRTi9hVXYwTkNCOXN6VHEKamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2R25yRFFXemlsbTFEZQpmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFoKZDBqUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxNDU0MTUxMTc3MzExMTc4ODQ5NAojIE1ENSBGaW5nZXJwcmludDogOWU6ODA6ZmY6Nzg6MDE6MGM6MmU6YzE6MzY6YmQ6ZmU6OTY6OTA6NmU6MDg6ZjMKIyBTSEExIEZpbmdlcnByaW50OiA0YTpiZDplZTplYzo5NTowZDozNTo5Yzo4OTphZTpjNzo1MjphMToyYzo1YjoyOTpmNjpkNjphYTowYwojIFNIQTI1NiBGaW5nZXJwcmludDogMTM6NjM6MzU6NDM6OTM6MzQ6YTc6Njk6ODA6MTY6YTA6ZDM6MjQ6ZGU6NzI6Mjg6NGU6MDc6OWQ6N2I6NTI6MjA6YmI6OGY6YmQ6NzQ6Nzg6MTY6ZWU6YmU6YmE6Y2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQWVGdzB3T0RBNE1ERXhNak14TkRCYUZ3MHpPREEzTXpFeApNak14TkRCYU1JR3NNUXN3Q1FZRFZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5CmNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUcKQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbApCZ05WQkFNVEhrZHNiMkpoYkNCRGFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPRENDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTURmVnRQa09wdDJSYlFUMi8vQnRobUxOMEVZbFZKSDZ4ZWQKS1lpT05Xd0dNaTVIWXZOSkJMOTlSRGF4Y2N5OVdnbHoxZG1GUlArUlZ5WGZYamFPY05GY2NVTWQyZHJ2WE5MNwpHNzA2dGN1dG84eEVwdzJ1SVJVL3VYcGJrblhZcEJJNGlSbUt0NERTNGpKdlZweVIxb2dRQzdOMFpKSjBZUFAyCnp4aFBZTElqME1jN3ptRkxtWS9DRE5CQXNwamNEYWhPbzdrS3JtQ2dyVVZTWTdwbXZXamcrYjRhcUlHN0hrRjQKZGRQQi9nQlZzSWRVNkNlUU5SMU1NNjJYL0pjdW1JUy9MTW1qdjlHWUVSVHRZL2pLbUloWUY1bnRSUU9YZmp5RwpIb2lNdnZLUmhJOWxOTmdBVEgyM01SZGFLWG9LR0NRd296ZTFlcWtCZlNiVytRNk9XZkg5R3pPMUtUc1hPMEcyCklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk1IL3VjVWE2TGNMMG5uM0hBYTZ4OWtHYm8xMTA2RGJEVndvM1YKeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZU94MllJdGFzd1RYYm82QWwvM0sxZGgzZQpiZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGSFR5bnlRYmVoUDlyCjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZwp6Q3RMa3lrUEFnTUJBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXCkJCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHIKcnUxVThWdVRCalV1WHFHQnNxU0JyekNCckRFTE1Ba0dBMVVFQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcApaQ0FvYzJWbElHTjFjbkpsYm5RZ1lXUmtjbVZ6Y3lCaGRDQjNkM2N1WTJGdFpYSm1hWEp0WVM1amIyMHZZV1JrCmNtVnpjeWt4RWpBUUJnTlZCQVVUQ1VFNE1qYzBNekk0TnpFYk1Ca0dBMVVFQ2hNU1FVTWdRMkZ0WlhKbWFYSnQKWVNCVExrRXVNU2N3SlFZRFZRUURFeDVIYkc5aVlXd2dRMmhoYldKbGNuTnBaMjRnVW05dmRDQXRJREl3TURpQwpDUURKemRQcDFYMGp6akFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293CktBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWkkKaHZjTkFRRUZCUUFEZ2dJQkFJQ0lmM0Rla2lqWkJaUkcvNUJYcWZFdjN4b05hL3A4RGh4SkpIa24yRWFxYnlsWgpVb2h3RXVyZFBmV2JVMVJ2NFdDaXFBbTU3T3RaZk1ZMThkd1k2ZkZuNWErNlJlQUozc3BFRDhJWERuZVJSWG96ClgxK1dMR2lMd1VlUG1Kczl3T3pMOWRXQ2tvUTEwYjQyT0ZaeU1WdEhMYW9YcEdOUjZ3b0JyWC9zZFo3TG9SL3gKZnhLeHVlUmtmMmZXSXlyMHVEbGRtT2docCtHOVBVSWFkSnB3cjJoc1VGMUp6Ly83RGwzbUxFZlhnVHBaQUxWegphMk1nOWpGRkNEa085SEIrUUhCYVA5QnJRcWwwUFNndkFtMTFjcFVKalVoanhzWWpWNUtUWGpYQmpma0s5eXlkClloejJyWHpkcGpFZXRySEhmb1VtK3FScXRkcGpNTkh2a3pleVppOTlCZmZudDB1WWxEWEEyVG9wd1oyeVVETWQKU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdXFxcUhXMlBvaytKcnFOUzRjbmhyRyswNTVGM0xtNnFIMVU5TwpBUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyUDNpWjhudHhQanp4bUtmRkdCSS81cnNvCk0wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnFjNWlKV3pvdUU0Z2UKdjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIFN1YmplY3Q6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIExhYmVsOiAiR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgwOjNhOmJjOjIyOmMxOmU2OmZiOjhkOjliOjNiOjI3OjRhOjMyOjFiOjlhOjAxCiMgU0hBMSBGaW5nZXJwcmludDogNDc6YmU6YWI6Yzk6MjI6ZWE6ZTg6MGU6Nzg6Nzg6MzQ6NjI6YTc6OWY6NDU6YzI6NTQ6ZmQ6ZTY6OGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ1OjE0OjBiOjMyOjQ3OmViOjljOmM4OmM1OmI0OmYwOmQ3OmI1OjMwOjkxOmY3OjMyOjkyOjA4OjllOjZlOjVhOjYzOmUyOjc0OjlkOmQzOmFjOmE5OjE5OjhlOmRhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1QKRVVkdlJHRmtaSGt1WTI5dExDQkpibU11TVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScApabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6Ck5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUgKRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHQTFVRQpBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0QKRTZiRklFTUJPNFR4NW9WSm55ZnE5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSAovUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRCtxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5CkRmTUFaaUxJaldsdE5vd1JHTGZUc2h4Z3REajZBb3pPMDkxR0I5NEtQdXRkZk1oOCs3QXJVNlNTWW1sUkpRVmgKR2tTQmpDeXBRNVlqMzZ3Nmdab09LY1VjcWVsZEhyYWVuakFLT2M3eGlJRDdTMTNNTXV5RllrTWxOQUpXSndHUgp0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBCkFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRkRxYWhRY1FaeWkyNy9hOUJVRnVJTUdVMmcvZU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1oyMTE1MWZtWApXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjdk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1Cjl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3I1TjlzczRVWG5UM1pKRTk1a1RYV1h3VHIKZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVk44R2I1REtqN1RqbwoyR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUkKNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZDY6Mzk6ODE6YzY6NTI6N2U6OTY6Njk6ZmM6ZmM6Y2E6NjY6ZWQ6MDU6ZjI6OTYKIyBTSEExIEZpbmdlcnByaW50OiBiNToxYzowNjo3YzplZToyYjowYzozZDpmODo1NTphYjoyZDo5MjpmNDpmZTozOTpkNDplNzowZjowZQojIFNIQTI1NiBGaW5nZXJwcmludDogMmM6ZTE6Y2I6MGI6Zjk6ZDI6Zjk6ZTE6MDI6OTk6M2Y6YmU6MjE6NTE6NTI6YzM6YjI6ZGQ6MGM6YWI6ZGU6MWM6Njg6ZTU6MzE6OWI6ODM6OTE6NTQ6ZGI6Yjc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzClpDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXcKTUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWdWR1ZqCmFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUwzdHdRUDg5by84QXJGdlc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nCm5MUkpkeklwVnYyNTdJemRJdnB5M0NkaGwrNzJXb1RzYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDEKSE9aLzVGU3VTL2hWY2xjQ0dmZ1hjVm5ySGlnSGRNV2RTTDVzdFBTa3NQTmtOM21Td094R1huL2hiVk5NWXEvTgpId3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZlpURDRwN2ROCmRsb2VkbDQwd09pV1ZwbUtzL0IvcE0yOTNESXhmSkhQNEY4UitHdXFTVnpSbVpUUm91TmpXd2wydFZaaTRVdDAKSFpiVUp0UUlCRm5RbUE0TzV0Nzh3K3dma1BFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2xUd052bEprN21oK0NoVG5VZGdXVVh1RW9rMjFpWFFuQ29LalUKc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeDRtY3VqSlVESmk1RG5Vb3g5ZzYxREx1Mwo0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3RjVva3hCRGdCUGZnCjhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMQptTXBZam4wcTdwQlpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDE3OjM1Ojc0OmFmOjdiOjYxOjFjOmViOmY0OmY5OjNjOmUyOmVlOjQwOmY5OmEyCiMgU0hBMSBGaW5nZXJwcmludDogOTI6NWE6OGY6OGQ6MmM6NmQ6MDQ6ZTA6NjY6NWY6NTk6NmE6ZmY6MjI6ZDg6NjM6ZTg6MjU6NmY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OjhkOjY5OjA1OmEyOmM4Ojg3OjA4OmE0OmIzOjAyOjUxOjkwOmVkOmNmOmVkOmIxOjk3OjRhOjYwOjZhOjEzOmM2OmU1OjI5OjBmOmNiOjJhOmU2OjNlOmRhOmI1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEN3pDQ0F0ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE96QTVCZ05WQkFNVE1sTjBZWEptYVdWcwpaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1Ck1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJBd0RnWUQKVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeQpabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5CmRtbGpaWE1nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcApPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yCjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhaEhRVXcyZWVCR2c2MzQ1QVdoMUsKVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFBMSkdtcHVmZQpoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrCjZtRkJyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcQpBZGN3S3ppSW9yaHRTcHp5RVpHRE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JCmJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFBFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEIKdmU2U2J6SjA4cEdDTDcyQ1FucXRLcmNnZlUyOGVsVVN3aFhxdmZkcWxTNXNkSi9QSExUeXhRR2poZEJ5UHExegpxd3ViZFF4dFJiZU9sS3lXTjdXZzBJOFZSdzdqNklQZGovM3ZRUUYzekNlcFlvVXo4amNJNzNIUGR3YmV5QmtkCmlFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24KMHEyM0tYQjU2anphWXlXZi9XaTNNT3h3KzNXS3QyMWdaN0lleUxucDJLaHZBb3RuRFUwbVYzSGFJUHpCU2xDTgpzU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IENvbW1lcmNpYWwiCiMgU2VyaWFsOiA4NjA4MzU1OTc3OTY0MTM4ODc2CiMgTUQ1IEZpbmdlcnByaW50OiA4Mjo5MjpiYTo1YjplZjpjZDo4YTo2ZjphNjozZDo1NTpmOTo4NDpmNjpkNjpiNwojIFNIQTEgRmluZ2VycHJpbnQ6IGY5OmI1OmI2OjMyOjQ1OjVmOjljOmJlOmVjOjU3OjVmOjgwOmRjOmU5OjZlOjJjOmM3OmIyOjc4OmI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMzo3NjphYjoxZDo1NDpjNTpmOTo4MDozYzplNDpiMjplMjowMTphMDplZTo3ZTplZjo3Yjo1NzpiNjozNjplODphOTozYzo5Yjo4ZDo0ODo2MDpjOTo2Zjo1ZjphNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQkRiMjF0WlhKamFXRnNNQjRYRFRFd01ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYkR1S1AKSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcgpiYTBGOFByVkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMCk1lSXJKbXFiVEZldXJDQSt1a1Y2QmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzEKeUhwNTJVS3FLMzljL3M0bVQ2Tm1nVFd2UkxwVUhod3dNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxcgpWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVblpQR1U0dGV5cTgvCm54NFA1Wm1WdkNUMmxJOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmlzOUFRT3pjQU4vd3I5MUxvV1h5bTllMmlaV0VuU3RCMDNUWDhuZlVZRwpYVVBHaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qCnZiejRZWUNhbnJIT1FuRGlxWDBHSlgwbm9mNXY3TE1lSk5yalMxVWFBRHMxdER2WjExMHcvWUVUaWZMQ0JpdnQKWjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdjB3cWlVT1AyTytndVJNTGJaamlwTTFaSThXMGJNNDBOakQ5ZwpONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDCm5scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IE5ldHdvcmtpbmciCiMgU2VyaWFsOiA4OTU3MzgyODI3MjA2NTQ3NzU3CiMgTUQ1IEZpbmdlcnByaW50OiA0Mjo2NTpjYTpiZTowMTo5YTo5YTo0YzphOTo4Yzo0MTo0OTpjZDpjMDpkNTo3ZgojIFNIQTEgRmluZ2VycHJpbnQ6IDI5OjM2OjIxOjAyOjhiOjIwOmVkOjAyOmY1OjY2OmM1OjMyOmQxOmQ2OmVkOjkwOjlmOjQ1OjAwOjJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYTo4MTplYzo1YTo5Mjo5Nzo3NzpmMTo0NTo5MDo0YTpmMzo4ZDo1ZDo1MDo5Zjo2NjpiNTplMjpjNTo4ZjpjZDpiNTozMTowNTo4YjowZToxNzpmMzpmMDpiNDoxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFd01ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRUhpM3kKWUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YQprQ05ybXJlSWRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMClFFU3hHOWZod29YQTNoQS9QZTI0L1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXAKNnp4RzhEMWd2ejlRMHR3bVFWR2VGRGRDQktOd1Y2Z2JoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kRwp5SDMyOUpLQk52M2JOUEZ5ZnZNTUZyMjBGUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVQngvUzU1emF3bTZpClFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWxYc2haNnFNTDkxdG1ibXpUQ25MUXlGRTJucE4vc3ZxZSsrRVBia1RmTwp0REl1VUZVYU5VNTJRM0VnNzVOM1RoVndMb2ZEd1IxdDNNdTFKOVFzVnRGU1V6cEUwblBJeEJzRlpWcGlrcHp1ClFZMHgyK2MwNmxraDFRRjYxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVloKTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyM1dKWmEzVzNTQUtEMG0waSt3emVrdWpiZ2ZJZUZseG9Wb3Q0dQpvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5L1pGdmdyRytDSlBiRkVmeG9qZkhSWjQ4CngzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0iCiMgU2VyaWFsOiA3ODkzNzA2NTQwNzM0MzUyMTEwCiMgTUQ1IEZpbmdlcnByaW50OiBjNDo1ZDowZTo0ODpiNjphYzoyODozMDo0ZTowYTpiYzpmOTozODoxNjo4Nzo1NwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmE2OjMzOjJjOmUwOjAzOjZmOmIxOjg1OmY2OjYzOjRmOjdkOjZhOjA2OjY1OjI2OjMyOjI4OjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MDphNzozZjo3ZjozNzo2Yjo2MDowNzo0Mjo0ODo5MDo0NTozNDpiMToxNDo4MjpkNTpiZjowZTo2OTo4ZTpjYzo0OTo4ZDpmNToyNTo3NzplYjpmMjplOTozYjo5YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6CmRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeU9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0cKQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVQpjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF4QkxmCnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bkJLQVEKSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWgoramplUkZjVjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTCnM4UGhhSnlKK0hvQVZ0NzBWWlZzKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTUKSE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWRHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNwo3ME8vTmJ1YTJQbHpweXp5MEZmdUtFNG1YNCtRYUFrdnVQamNCdWt1bWo1UnA5RWl4QXFuT0Voc3Mvbi9mYXVHClYrTzYxb1Y0ZDdwRDZraC85dGkrSTIwZXY5RTJiRmhjOGU2a0dWUWE5UVBTZHViaGpMMDhzOU5JUytMSStIK1MKcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43Uwo1dTA0NnV3QkhqeElWa2tKeDB3M0FKNklEc0J6NFc5bTZYSkhNRDRRNVFzRHlacENBR3pGbEg1aHhJcmZmNElhCkMxbkVXVEozczd4Z2FWWTUvYlFHZXl6V1pEYlp2VWp0aEI5K3BTS1BLcmhDOUlLMzFGT1FlRTR0R3YyQmIwVFgKT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbytOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRQpGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXZNaVBJczBsYVVaeDIKS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCCjhPV3ljdnBFZ2pOQzZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFEKTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYwowamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsrNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRCnU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVkJ0V1Z5dUVrbHV0ODlwTUYKdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnSXhwSApZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4CkdLYTFxRjYwZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU8KUnRHZEZOckhGK1FGbG96RUpMVWJ6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZQpLZUMydUFsb0dSd1lRdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MiCiMgU2VyaWFsOiA4NDAxMjI0OTA3ODYxNDkwMjYwCiMgTUQ1IEZpbmdlcnByaW50OiA2NDpiMDowOTo1NTpjZjpiMTpkNTo5OTplMjpiZToxMzphYjphNjo1ZDplYTo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjIzOjZiOjAwOjJmOjFkOjE2Ojg2OjUzOjAxOjU1OjZjOjExOmE0OjM3OmNhOmViOmZmOmMzOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZDo3MTpmZDpmNjpkYTo5NzplNDpjZjo2MjpkMTo2NDo3YTpkZDoyNTo4MTpiMDo3ZDo3OTphZDpmODozOTo3ZTpiNDplYzpiYTo5Yzo1ZTo4NDo4ODo4MjoxNDoyMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQwpWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRCmNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeE1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUoKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdApWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRTk1GNGJGWjBECjBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UU44TzkKc3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwRwpBMVVkRGdRV0JCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnMKYW9iZ3hDZDA1RGhUMXdWL0d6VGp4aSt6eWdrOE41M1g1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SQpmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTWVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSIKIyBTZXJpYWw6IDI3OTc0NAojIE1ENSBGaW5nZXJwcmludDogZDU6ZTk6ODE6NDA6YzU6MTg6Njk6ZmM6NDY6MmM6ODk6NzU6NjI6MGY6YWE6NzgKIyBTSEExIEZpbmdlcnByaW50OiAwNzplMDozMjplMDoyMDpiNzoyYzozZjoxOToyZjowNjoyODphMjo1OTozYToxOTphNzowZjowNjo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6NTg6NDY6OGQ6NTU6ZjU6OGU6NDk6N2U6NzQ6Mzk6ODI6ZDI6YjU6MDA6MTA6YjY6ZDE6NjU6Mzc6NGE6Y2Y6ODM6YTc6ZDQ6YTM6MmQ6Yjc6Njg6YzQ6NDA6OGUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk0KTVNJd0lBWURWUVFLRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RApaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVCmNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeU1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTMKV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZwpVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU0l3CklBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySApVVitycERLbVlZZTJiZytHMGpBQ2wvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNClRYUGI4NjVQeDFiVldxZVdpZnJ6cTJqVUk0WlpKODhKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlUKQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDRmT1F0Zi9Xc1grc1duN0V0MGJyTQprVUozVENYSmtEaHYyL0RNKzQ0ZWwxaysxV0JPNWdVbzdVbDVFMHU2U05zditYTFRPY3IrSDlnMGN2VzBRTTh4CkFjUHMzaEV0RjEwZnVGRFJYaG1uYWQ0SE15aktVSlg1cDFUTFZJWlFSYW41U1FJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUthb3JTTE9BVDJtby85aTBFaWRpMTV5CnNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2pqU2ZlQzRKajBPN2VERGQ1UVZzaXNyQ2FRVnltY09EVTBIZkwKSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMW1TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOApKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqWnQzaHJ2SkJXOHFZClZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYWE6MDg6OGY6ZjY6Zjk6N2I6Yjc6ZjI6YjE6YTc6MWU6OWI6ZWE6ZWE6YmQ6NzkKIyBTSEExIEZpbmdlcnByaW50OiBjZjo5ZTo4Nzo2ZDpkMzplYjpmYzo0MjoyNjo5NzphMzpiNTphMzo3YTphMDo3NjphOTowNjoyMzo0OAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZDg6OGY6ZTE6MTA6MWM6NDE6YWU6M2U6ODA6MWI6Zjg6YmU6NTY6MzU6MGU6ZTk6YmE6ZDE6YTY6Yjk6YmQ6NTE6NWU6ZGM6NWM6NmQ6NWI6ODc6MTE6YWM6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQW1PZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJmTVFzd0NRWURWUVFHRXdKVVZ6RVMKTUJBR0ExVUVDZ3dKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVQpWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3T0RJNE1EY3lORE16CldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKVkVGSlYwRk8KTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkUKQWNLMEhNTXhRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISApLM1hMZkordXRkR2RJemRqcDl4Q29pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYClJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3oKclgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXJ5K1VQaXpnTjdncjgvZytZbnpBeAozV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3EKaGtpRzl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQwpNRXJKay85cTU2WUFmNGxDbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzClhlYlE3OU5xWnA0VktJVjY2SUlBckI2bkNXbFdRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkQKbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWVQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bgphc3BIWWNONitOT1NCQis0SUlUaE5sUVd4MERlTzRwejNOL0dDVXpmN05yLzFGTkNvY255WWgwaWd6eVh4ZmtaCllpZXNaU0xYMHp6RzVZNnlVOHhKenJ3dy9uc09NNUQ3N2RJVWtSOEhydz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNmM6Mzk6N2Q6YTQ6MGU6NTU6NTk6YjI6M2Y6ZDY6NDE6YjE6MTI6NTA6ZGU6NDMKIyBTSEExIEZpbmdlcnByaW50OiA1ZjozYjo4YzpmMjpmODoxMDpiMzo3ZDo3ODpiNDpjZTplYzoxOToxOTpjMzo3MzozNDpiOTpjNzo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogNTE6M2I6MmM6ZWM6Yjg6MTA6ZDQ6Y2Q6ZTU6ZGQ6ODU6Mzk6MWE6ZGY6YzY6YzI6ZGQ6NjA6ZDg6N2I6Yjc6MzY6ZDI6YjU6MjE6NDg6NGE6YTQ6N2E6MGU6YmU6ZjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREJkTVFzd0NRWURWUVFHRXdKS1VERWwKTUNNR0ExVUVDaE1jVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZQpVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmhkR2x2YmlCU2IyOTBRMEV5TUI0WERUQTVNRFV5T1RBMU1EQXpPVm9YCkRUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnkKZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5YVhSNUlFTnZiVzExYm1sagpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkFWCk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3IKemJsK2RwKysrVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTQpWQVgzTnVSRmczc1VaZGJjREUzUjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRCmhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5Wc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V08Kb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUtFT3RPZ2hZNnJDY01VL0d0MVNTdwphd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOFFJSDRENWNzCk9QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRgpjb0p4RGpyU3pHK250S0VqdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjCm9rZ2ZHVCtPayt2eCtoZnV6VTdqQkJKVjF1WGszZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDgKdC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cXRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeQoxVWtDOWdMbDlCL3JmTm1XVmFuLzdJcjVtVWYvTlZvQ3FnVExpbHVIY1NtUnZhUzBlZzI5bXZWWEl3QUhJUmMvClNqblJCVWtMcDdZM2dhVmRqS296WG9Fb2ZLZDlKK3NBcm8wMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNzM6OWY6NGM6NGI6NzM6NWI6Nzk6ZTk6ZmE6YmE6MWM6ZWY6NmU6Y2I6ZDU6YzkKIyBTSEExIEZpbmdlcnByaW50OiBmZTo0NTo2NTo5Yjo3OTowMzo1Yjo5ODphMTo2MTpiNTo1MToyZTphYzpkYTo1ODowOTo0ODoyMjo0ZAojIFNIQTI1NiBGaW5nZXJwcmludDogYmM6MTA6NGY6MTU6YTQ6OGI6ZTc6MDk6ZGM6YTU6NDI6YTc6ZTE6ZDQ6Yjk6ZGY6NmY6MDU6NDU6Mjc6ZTg6MDI6ZWE6YTk6MmQ6NTk6NTQ6NDQ6MjU6OGE6ZmU6NzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXgKUkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwCll5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXcKTmpFek5EazFNbG9YRFRNeE1USXdNVEV6TkRrMU1sb3dnWlV4Q3pBSkJnTlZCQVlUQWtkU01VUXdRZ1lEVlFRSwpFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRU5sCmNuUXVJRUYxZEdodmNtbDBlVEZBTUQ0R0ExVUVBeE0zU0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCU2IyOTBRMEVnTWpBeE1UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLbFRBT011cHZhTyttRFlMWlUrK0N3cVZFN051WVJobEZoUGp6Mkw1RVB6CmRZbU5VZVRETjlLS2lFMTVIcmNTM1VONFNvcVM1dGRJMVEra09pbEVOYmdIOW1nZFZjMDRVZkNNSkRHRnI0UEoKZmVsM3IrMGFlNTBYK2JPZE9GQVBwbHA1a1lDdk42Nm0wekg3dFNZSm5UeGE3MUhGSzkrV1hlc3lIZ0xhY0VucwpiZ3pJbWplTjkvRTJZRXNtTElLZTBIanpEUTlqcEZFdzRma3JKeElIMk9xOUdHS1lzRmszZmI3dTh5QlJRbHFECjc1TzZhUlh4WXAyZm1UbUNvYmQwTG92VXhRdDdML0RJQ3RvOWVRcWFreHlsS0hKemtVT2FwOUZOaFlTNXFYU1AKRkVESDNONnNRV1JzdEJtYkFtTnRKR1NQUkxJbDZzNWRkQXhqTWx5TmgrVUNBd0VBQWFPQmlUQ0JoakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVwcEZDL1JOaFNpT2VDS1FwCjVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQThNQVdDQXk1bmNqQUZnZ011WlhVd0JvSUVMbVZrZFRBR2dnUXUKYjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdWIzSm5NQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0WGRNaUthaHNvZzJwCjZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jNwpkSXNYUlNaTUZwR0QvbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzCk5ucS9vbk42OTQvQnRacWhGTEtQTTU4Tjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWEkKbDdXZG1wbE5zRHo0U2dDYlpOMmZPVXZSSjllNAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBTdWJqZWN0OiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIExhYmVsOiAiQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogNjI3MTg0NDc3MjQyNDc3MDUwOAojIE1ENSBGaW5nZXJwcmludDogNjk6YzE6MGQ6NGY6MDc6YTM6MWI6YzM6ZmU6NTY6M2Q6MDQ6YmM6MTE6ZjY6YTYKIyBTSEExIEZpbmdlcnByaW50OiBmMzo3MzpiMzo4NzowNjo1YToyODo4NDo4YTpmMjpmMzo0YTpjZToxOToyYjpkZDpjNzo4ZTo5YzphYwojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6OTI6NjA6ODQ6ZWM6OTY6M2E6NjQ6Yjk6NmU6MmE6YmU6MDE6Y2U6MGI6YTg6NmE6NjQ6ZmI6ZmU6YmM6Yzc6YWE6YjU6YWY6YzE6NTU6YjM6N2Y6ZDc6NjA6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUUKQmhNQ1NWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4dwpNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCklFTkJNQjRYRFRFeE1Ea3lNakV4TWpJd01sb1hEVE13TURreU1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUMKU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMQpPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTBJRU5CCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcDhiRXBTbWtMTy9sR01Xd1VLTnYKVVR1ZkNsckp3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWAo0YXk4SU1LeDRJTlJpbWxOQUpaYWJ5L0FSSDZqRHVTUnpWanUzUHZISGtWSDNTZTVDQUdmcGlFZDlVRXRMMHo5CktLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082emZCOUUxZkFYZEtEYTBoTXhLdWZnRnBiT3IzSnB5SS8KZ0Njeld3NjNpZ3hkQnpjSXkyelNla2NpUkRYRnpNd3VqdDBxN2JkOVpnMWZZVkVpVlJ2alJ1UGpQZEExWXByYgpyeFRJVzZITWlSdmhNQ2I4b0pzZmdhZEhId1Ryb3ptU0JwK1owNy9UNms5UW5Cbitsb2NlUEdYMm94Z2tnNFlRCjUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkYKYmU4bEVmS1hHa0poOTBxWDZJdXhFQWY2WllHeW9qblA5enovR1B2RzhWcUxXZUlDckh1UzBFNFVUMWxGOWd4ZQpLRit3NkQ5Rno4K3ZtMi83aE5OM1dwVnZySlNFbnU2OHdFcVBTcFA0UkNIaU1VVmhVRTRRMk9NMWZFd1p0TjRGCnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjhFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm4KZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNWpGNjZDeUNVM251RHVQL2pWbzIzRWVrNwpqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZaURySW4zaG03WW56CmV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTAplM0tId0dDbVNVeUlXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwCmpzTmpMaU5tc0dlK2I3YkFFemxncXFJMEpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHoKV29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4SzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VgpTTTBSRmJuQUtWeTA2SWozUGphdXQyTDlIbUxlY0hnUUhFaGIycnlrT0xwbjdWVStYbGZmMUFOQVRJR2swazlqCnB3bENDUlQ4QUtuQ2dITlBMc0JBMlJGN1NPcDZBc0RUNnlnQkpsaDB3Y0J6SW0yVGxmMDVmYnNxNC9hQzR5eVgKWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPawpmY3ZIbFhIbzJxTjh4Y0w0ZEpJRUc0YXNwQ0pUUUxhcy9reDJ6L3VVTXNBMW4zWS9idVdRYnFDbUpxSzRMTDdSCks0WDlwMmpJdWdFcnNXeDBIYmh6bGVmdXQ4Y2w4QUJNQUxKK3RndUxIUFBBVUo0bHVlQUkzalptL3plbDBidFUKWkN6Sko3VkxrbjVsLzlNdDRibE92SCtrUVNHUVFYZW1PUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVQpMeXNSSnlVM2VFeFJhckR6ekZoZEZQRnFTQlgvd2dlMnNZMFBqbHhRUnJNOXZ3R1lUN0paVkVjK05IdDRiVmFUCkxuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgU3ViamVjdDogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIExhYmVsOiAiVHJ1c3RpcyBGUFMgUm9vdCBDQSIKIyBTZXJpYWw6IDM2MDUzNjQwMzc1Mzk5MDM0MzA0NzI0OTg4OTc1NTYzNzEwNTUzCiMgTUQ1IEZpbmdlcnByaW50OiAzMDpjOTplNzoxZTo2YjplNjoxNDplYjo2NTpiMjoxNjo2OToyMDozMTo2Nzo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmMwOjM4OjBiOjMzOmMzOmY2OmE2OjBjOjg2OjE1OjIyOjkzOmQ5OmRmOmY1OjRiOjgxOmMwOjA0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMTpiNDo4Mjo5OTphYjphNToyMDo4ZjplOTo2MzowYTpjZTo1NTpjYTo2ODphMDozZTpkYTo1YTo1MTo5Yzo4ODowMjphMDpkMzphNjo3MzpiZTo4Zjo4ZTo1NTo3ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFp6Q0NBaytnQXdJQkFnSVFHeCt0dGlENUpOTTJhL2ZIOFl5Z1dUQU5CZ2txaGtpRzl3MEJBUVVGQURCRgpNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFZISjFjM1JwY3lCTWFXMXBkR1ZrTVJ3d0dnWURWUVFMCkV4TlVjblZ6ZEdseklFWlFVeUJTYjI5MElFTkJNQjRYRFRBek1USXlNekV5TVRRd05sb1hEVEkwTURFeU1URXgKTXpZMU5Gb3dSVEVMTUFrR0ExVUVCaE1DUjBJeEdEQVdCZ05WQkFvVEQxUnlkWE4wYVhNZ1RHbHRhWFJsWkRFYwpNQm9HQTFVRUN4TVRWSEoxYzNScGN5QkdVRk1nVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVZRZTU0N05kRGZ4SXpOanB2dG84QTJtZlJDNnFjK2dJTVBwcWRaaDhtUVJVTisKQU9xR2VTb0R2VDAzbVlsbXQrV0tWb2FUbkdoTGFBU01rNU1DUGpEU056b2lZWWtjaFU1OWo5V3ZlelgyZmloSAppVEhjRG5sa0g1blNXN3IrZjJDL3Jldm5QRGdwYWkvbGtRdFYvK3h2V05VdHlkNU1abkdQRE5jRTJnZm1IaGpqCnZTa0NxUG9jNFZ1NWc2aEJTTHdhY1kzbll1VXRzdXZmZk0vYnExcktNZkZNSXZNRkUvZUMrWE41REw3WFN4ekEKMFJVOGswRmswZWErSXhjaUFJbGVIMnVsckc2blM0enRvM0xtcjJOTkw0WFNGRFdhTGs2TTZqS1lLSWFoa1FsQgpPclRoNC9MNjhNa0tva0hkcWVNRHg0Z1ZPeHpVR3BUWG4yUlpFbTBDQXdFQUFhTlRNRkV3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUzYrbkVsZVl0WFFTVWhoZ3R4NjdKa0Rvc2haekFkQmdOVkhRNEUKRmdRVXV2cHhKWG1MVjBFbElZWUxjZXV5WkE2TElXY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSDVZLy8wMQpHWDJjR0UrZXNDdThqb3dVL3l5ZzJrZGJ3KytCTGE4RjZuUklXL00rVGdmSGJjV3prODhpTlZ5MlAzVW5Yd21XCnphRCt2a0FNWEJKVitKT0N5aW5wWGo5V1Y0czROdmRGR2t3b3paNUJ1TzFXVElTa1FNaTRzS1VyYVhBRWFzUDQKMUJJeStRN0RzZHd5aEVRc2I4dEdEK3BtUVE5UDhWaWxwZzBORDJIZXBaNWRmV1doUEJmbnFGVk83NkRIN2NaRQpmMVQxbytDUDhIeFZJbzhwdG9HajRXMU9MQnVBWit5dElKOE1ZbUhWbC85RDdTM0IybDBwS29VL3JHWHVoZzhGCmpaQmYzKzZmOUwvdUhmdVk1SCtRSzRSNEVBNXNTVlB2RlZ0bFJrcGRyN3I3T25JZHpmWWxpQjZYekNHY0tRRU4KWmV0WDJmTlhscnRJellFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogNDY6YTc6ZDI6ZmU6NDU6ZmI6NjQ6NWE6YTg6NTk6OTA6OWI6Nzg6NDQ6OWI6MjkKIyBTSEExIEZpbmdlcnByaW50OiA0OTowYTo3NTo3NDpkZTo4NzowYTo0NzpmZTo1ODplZTpmNjpjNzo2YjplYjpjNjowYjoxMjo0MDo5OQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6MTE6NDA6MjU6MTk6N2M6NWI6Yjk6NWQ6OTQ6ZTY6M2Q6NTU6Y2Q6NDM6Nzk6MDg6NDc6YjY6NDY6YjI6M2M6ZGY6MTE6YWQ6YTQ6YTA6MGU6ZmY6MTU6ZmI6NDgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ01pQlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZkhYdmZCQjlSMyswTWg5UFQxYWVUdU1nSGJvNFlmNUZrTnV1ZDFnMUxyCjZoeGhGVWk3SFFmS2pLNnczSmFkNnNOZ2tvYUNLSE9jVmdiL1MyVHdEQ28zU2JYbHp3eDg3dkZLdTNNd1pmUFYKTDRPMmZ1UG45WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MQoxSzJHU2N1VnIxUUdiTmdHRTQxYi8rRW1HVm5BSkxxQmNYbVFSRkJvSkpSZnVMTVI4U2xCWWFOQnl5TTIxY0h4Ck1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVQ3FUcWMvc0xVZWdUQnhqNkR2RXIwVlFWZlR6aDk3UVoKUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmZhd3JiRDAyVFRxaWd6WHN1OGxrQgphcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSXpSRm8xY2xyClVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGkKRlJobkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSUwpQL1RpelBKaGs5SDlaMnZYVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OCjlTRzlkS3BONm5JRFNkdkhYeDFpWThmOTNaSHNNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFAKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1tQWQrQmlrb0wxUnB6egp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVMThoCjlicXdPbEk1TEpLd2JBREo3ODRnN3dieWxwN3BwSFIvZWhiOHQvVzIreFViUDZ1bXdISmRFTEZ4N3J4UDQ2MnMKQTIwdWNTNnZ4T090bzcwTUVhZTAvMHF5ZXhBUUg2ZFhRYkxBcnZRc1dkWkhFSWp6SVZFcE1NcGdocTlHcXgzdApPbHV3bE41RTQwRUlvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvCitmc2ljZGw5c3oxR3Y3U0VyNUFjRDQ4U2FxL3Y3aDU2cmdKS2loY3JkdjZzVklra0xFOC90cktuVG95b2taZjcKS2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkRG5rTS9jcnFKSUJ5dzVjLzhuZXJReUlLeCt1MgpESVNDTElCclFZb0l3T3VsYTkrWkVzdUsxVjZBREpIZ0pnZzJTTVg2T0JFMS95V0RMZko2djlyOWp2Nmx5MFVzCkg4U0lVNjUzRHRtYWRzV09MQjJqdXRYc01xN0FxcXozMFhwTjY5UUg0a2ozSW82d3BKOXF6bzZ5c21EMG95TFEKSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNwo1dDk4YmlHQ3dXZzVUYlNZV0daaXpFcVFYc1A2SndTeGVSVjBtY3krclNEZUptQWM2MVpScHFQcTVLTS9wLzloCjNQRmFUV3d5STBQdXJLanU3a29TQ1R4ZGNjSytlZnJDaDJnZEMvMWNhY3dHMEpwOVZKa3F5VGthR2E5TEtrUHoKWTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU5ySmdXVnFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogM2Q6M2I6MTg6OWU6MmM6NjQ6NWE6ZTg6ZDU6ODg6Y2U6MGU6Zjk6Mzc6YzI6ZWMKIyBTSEExIEZpbmdlcnByaW50OiBkYTpmYTpmNzpmYTo2Njo4NDplYzowNjo4ZjoxNDo1MDpiZDpjNzpjMjo4MTphNTpiYzphOTo2NDo1NwojIFNIQTI1NiBGaW5nZXJwcmludDogZWQ6Zjc6ZWI6YmM6YTI6N2E6MmE6Mzg6NGQ6Mzg6N2I6N2Q6NDA6MTA6YzY6NjY6ZTI6ZWQ6YjQ6ODQ6M2U6NGM6Mjk6YjQ6YWU6MWQ6NWI6OTM6MzI6ZTY6YjI6NGQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ015QlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklETWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWGFDcFVXVU9PVjhsNmRkakVHTW5xYjhSQjJ1QUNhdFZJMnpTUkhzSjhZClpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0UKTjNjb1RSaVI1ci9WVXYxeExYQSs1OGJFaXVQd0tBdjBkcGloaTRkVnNqb1QvTGMrSnplT0l1T29UeXJ2WUxzOQp0em5ERGdGSG1WMFNUOXREK2xlaDdmbWR2aEZISmxzVG1LdGRGb3F3Tnh4WG5VWC9pSlkydjd2S0IzdHZoMlBYCjBESnExbDFzRFBHemJqbmlhekV1T1FBbkZONDR3T3daWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMKLzNBVEFPdXg5VE42UzlaVitBV05TMm13OWJNb05sd1V4RkZ6VFdzTDhUUUgyeGM1MTl3b2UydjFuL011d1U4WApLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVi9hZm1pU1RZCnpJdzBiT0lqTDlrU0dpRzVWWkZ2QzVGNUdReXRRSWdMY09KNjBnN1lhRWk3Z2hNNUVGanAyQ29IeGhMYldOdlMKTzFVUVJ3VVZaMkorR0dPbVJqOEpEbFF5WHI4Tllub243NERvMjlsTEJsbzNXaVhRQ0JKMzFHOEpVSmM5eUIzRAozNHhGTUZiRzAyU3JadlBBWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQCks5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXFqNkc4QmFWbW9zOGJkcktFWkxGTU9WTEFNTHJ3akVzQ3NMYTMKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkVlNHpmL2xiKzc0c3V3dgpUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFBQ0FqClFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYUwpJR3JzL0NJQktNK0d1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEyCkhKTHc1UVkzM0tibWtKczRqMXhyRzBhR1EwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2EKTzVTM0hXQ250WnpuS1dsWFdwdVRla013R3dQWFlzaEFwcXI4Wk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94dgowMzNhU0YvcnRKQzhMYWtjQzZ3YzFhSm9JSUFFMXZ5eGp5KzdTakVOU29ZYzYrSTJLU2IxMnRqRThuVmh6MzZ1CmRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJejZNa0UKa2JJUk5CRSs2dEJER1I4RGs1QU0vMUU5Vi9SQmJ1SExvTDdyeVdQTmJjemsrRGFxYUozdHZWMlhjRVFOdGc0MQozT0VNWGJ1Z1VaVExmaGJyRVMramtrWElUSEhadk1tWlVsZEdMMURQdlRWcDlEMFZ6Z2FsTEE4KzlvRzZsTHZECnU3OWxlTktHZWY5Sk94cUREUERlZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHEKNC9nN3U5eE4xMlR5VWI3bXFxdGE2VEh1QnJ4enZ4TmlDcC9IdVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmYjo0MDphODo0ZTozOTo5Mjo4YToxZDpmZTo4ZToyZjpjNDoyNzplYTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU1OmE2OjcyOjNlOmNiOmYyOmVjOmNkOmMzOjIzOjc0OjcwOjE5OjlkOjJhOmJlOjExOmUzOjgxOmQxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZDo3MzpkYTpkMzoxYzo2NDo0ZjpmMTpiNDozYjplZjowYzpjZDpkYTo5Njo3MTowYjo5YzpkOTo4Nzo1ZTpjYTo3ZTozMTo3MDo3YTpmMzplOTo2ZDo1MjoyYjpiZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4TURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzlkWlB3WWlKdkpLN2dlbmFzZmIzWkpOVzR0L3pOCjhFTGc2M2lJVmw2Ym1sUWRUUXlLOXRQUGNQUlN0ZGlUQk9OR2huRkJTaXZ3S2l4VkE5Wkl3K0E1T08zeVhEdy8KUkx5VFBXR3JUczBOdnZBZ0oxZ09SSDhFR29lbDE1WVVOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNApocVgyaXlzNTJxTXpWTm42Y2hyM0loVWNpSkZyZjJibHcycUFzQ1R6MzRaRmlQMFpmM1dISHgreEd3cHpKRnU1ClplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXMGVEclhsdE0KRW5BTWJFUWdxeEhZOUJuMjBweFNOK2Y2dHNJeE8wclVGSm10eHhyMVhWLzZCN2g4RFIvV2d4NnpBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMxCkEvZDJPMkdDYWhLcUdGUHJBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3kKV0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYmZzRHVYbWtxSmE5YzFoM2Ewbm5KODVjcDRJYUgzZ1JaRC9GWgoxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUdWNwSDlzcnk5dWV0dVVnL3ZCYTN3VzMwCjZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2hQMEhIUndBMTFmWFQKOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwClRwUERwRlFVV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBTdWJqZWN0OiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIExhYmVsOiAiRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSIKIyBTZXJpYWw6IDExMjMyNDgyODY3NjIwMDI5MTg3MTkyNjQzMTg4ODQ5NDk0NTg2NgojIE1ENSBGaW5nZXJwcmludDogNDM6NWU6ODg6ZDQ6N2Q6MWE6NGE6N2U6ZmQ6ODQ6MmU6NTI6ZWI6MDE6ZDQ6NmYKIyBTSEExIEZpbmdlcnByaW50OiBjOTphODpiOTplNzo1NTo4MDo1ZTo1ODplMzo1Mzo3NzphNzoyNTplYjphZjpjMzo3YjoyNzpjYzpkNwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6ODQ6YmE6NDM6NDI6OTA6ODU6MTY6ZTc6NzU6NzM6YzA6OTk6MmY6MDk6Nzk6Y2E6MDg6NGU6NDY6ODU6Njg6MWY6ZjE6OTU6Y2M6YmE6OGE6MjI6OWI6OGE6NzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBekNDQXV1Z0F3SUJBZ0lRVklENW9IUHRQd0JNeW9uWTQzSG1TakFOQmdrcWhraUc5dzBCQVFVRkFEQjEKTVFzd0NRWURWUVFHRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MQpjekVvTUNZR0ExVUVBd3dmUlVVZ1EyVnlkR2xtYVdOaGRHbHZiaUJEWlc1MGNtVWdVbTl2ZENCRFFURVlNQllHCkNTcUdTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNQ0lZRHpJd01UQXhNRE13TVRBeE1ETXdXaGdQTWpBek1ERXkKTVRjeU16VTVOVGxhTUhVeEN6QUpCZ05WQkFZVEFrVkZNU0l3SUFZRFZRUUtEQmxCVXlCVFpYSjBhV1pwZEhObApaWEpwYldsemEyVnphM1Z6TVNnd0pnWURWUVFEREI5RlJTQkRaWEowYVdacFkyRjBhVzl1SUVObGJuUnlaU0JTCmIyOTBJRU5CTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x3YTJsQWMyc3VaV1V3Z2dFaU1BMEdDU3FHU0liM0RRRUIKQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJSU1EczRNVkxxd2Q0bGZORTd2c0xEUDkwam1HN3NXTHFJOWlyb1dVeQpldXVPRjArVzJBcDdrYUpqYk1lTVRDNTV2NmtGL0dsY2xZMWkrYmx3N2NOUmZkQ1Q1bXpyTUV2aHZIMi9VcHZPCmJudGw4aml4d0tJeTcyS3lhT0JoVThFMmxmL3NsTG8ycnB3Y3B6SVA1WHkweG05MC9Yc1k2S3hYN1FZZ1N6SXcKV0Z2OXpham1vZnh3dkk2U2M5dVhwM3docmozQjlVaUhiQ2U5bnlWMGdWV3c5M1gyUGFSa2E5WlA1ODVBclEvZApNdE84aWhKVG1NbUoreEFkVFg3TmZoOVdEU0Z3aGZZZ2d4LzJ1aDhFaitwM2lEWEUvK3BPb1l0TlAyTWJSTU5FCjFDVjJ5cmVOMXg1S1ptVE5YTVdjZytIQ0NJaWE3RTZqOFQ0Y0xObHNIYUZMQWdNQkFBR2pnWW93Z1ljd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCTHlXajdxVmh5Lwp6UWFzOGZFbHlhbEwxQlNaTUVVR0ExVWRKUVErTUR3R0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREFRWUlLd1lCCkJRVUhBd01HQ0NzR0FRVUZCd01FQmdnckJnRUZCUWNEQ0FZSUt3WUJCUVVIQXdrd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnRUJBSHYyNU1BTnFobEh0MDFYby82dHU3RnExUStlMitSanhZNmhVRmFUbHJnNHdDUWlacnhURkdHVgp2OURIS3BZNVAzMG9zeEJBSVdyRXI3QlNkeGpobHRoV1hlUGRObDRkcDFCVW9NVXE1S3FNbElwUG5UWC9kcVFHCkU1R2lvbjBBUkQ5VjA0SThHdFZidkZaTUlpNUdRNG9rUUMzekVyZzdjQnFrbHJrYXI0ZEJHbW9ZRFFaUHh6NXUKdVNsTkRVbUpFWWN5VytaTEJNamtYT1owYzVSZEZwZ1RsZjc3MjdGRTVUcHdyRGRyNXJNemNpakpzMWVnOWdJVwppQVlMdHFaTElDalUzajJMclRjRlUzVCtic3k4UXhkeFh2bkZ6QnFwWWU3M2RnenpjdlJ5cmM5eUFqWUhSOC92CkdWQ0pZTXpwSkpVUHdzc2Q4bTkya01mTWRjR1d4WjA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSIKIyBTZXJpYWw6IDYyMzYwMwojIE1ENSBGaW5nZXJwcmludDogY2Q6ZTA6MjU6Njk6OGQ6NDc6YWM6OWM6ODk6MzU6OTA6Zjc6ZmQ6NTE6M2Q6MmYKIyBTSEExIEZpbmdlcnByaW50OiA1ODplODphYjpiMDozNjoxNTozMzpmYjo4MDpmNzo5YjoxYjo2ZDoyOTpkMzpmZjo4ZDo1ZjowMDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6ZTc6YTQ6NDI6YWM6ZjA6ZWE6NjI6ODc6MDU6MDA6NTQ6YjU6MjU6NjQ6YjY6NTA6ZTQ6ZjQ6OWU6NDI6ZTM6NDg6ZDY6YWE6Mzg6ZTA6Mzk6ZTk6NTc6YjE6YzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnTWpBd09UQWVGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhCk1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU0KSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOT3lTczk2Uis5MW15UDZPaS9XVUVXSk5UckdhOXYrMndCb3FPQURFUjAzClVBaWZUVXBvbERXelU5R1VZNmNnVnEvZVVYanNLajN6U0VoUVBncmZSbFdMSjIzREVFME5rVkpEMklmZ1hVNDIKdFNIS1h6bEFCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5Ugp5U1BvY3E2MHZGWUpmeExMSExHdktaQUt5VlhNRDlPMEd1MUhOVnBLN1p4ekJDSFFxcjBNRTdVQXlpWnN4R3NNCmxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6cCtoblVxdVZIK0JHUHRpa3c4cGF4VEdBNkVpYW41UnAKL2huZDJITjhnY3FXM283dHN6SUZaWVEwNXViOVZ4QzFYM2EvTDdBUURjVUNBd0VBQWFPQ0FSb3dnZ0VXTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQM2FGTVNmTU40aHZSNUNPZnlyWXlOSjRQR0VNQTRHCkExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1VtOXZkQ1V5TUVOc1lYTnpKVEl3TXlVeQpNRU5CSlRJd01pVXlNREl3TURrc1R6MUVMVlJ5ZFhOMEpUSXdSMjFpU0N4RFBVUkZQMk5sY25ScFptbGpZWFJsCmNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0dQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnMKTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBd09TNWpjbXd3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptMkg2Tk1MVndNZW5pCmFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0Swp6Q1VxTlFUNFlKRVZkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4ClBJV21hd29tRGVDVG1HQ3Vmc1lrbDRwaFg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1kKSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IgojIFNlcmlhbDogNjIzNjA0CiMgTUQ1IEZpbmdlcnByaW50OiBhYTpjNjo0MzoyYzo1ZToyZDpjZDpjNDozNDpjMDo1MDo0ZjoxMTowMjo0ZjpiNgojIFNIQTEgRmluZ2VycHJpbnQ6IDk2OmM5OjFiOjBiOjk1OmI0OjEwOjk4OjQyOmZhOmQwOmQ4OjIyOjc5OmZlOjYwOmZhOmI5OjE2OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZTpjNTo0OTo2Yjo5ODo4YzplOTo4NjoyNTpiOTozNDowOToyZTplYzoyOTowODpiZTpkMDpiMDpmMzoxNjpjMjpkNDo3MzowYzo4NDplYTpmMTpmMzpkMzo0ODo4MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQWVGdzB3T1RFeE1EVXdPRFV3TkRaYUZ3MHlPVEV4TURVd09EVXcKTkRaYU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVgpCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmU2VncG4KbGpnSjloQk9sU0p6bVkzYUZTM25CZndaY3lLM2pwZ0F2RHc5cktGcys5WjVKVXV0OE14azJvZytLYmdQQ2RNMAozVFAxWXRIaHpSbnA3aGhQVEZpdTRoN1dERnNWV3RnNnVNUVlaQjdqTTdLMWlYZE9ETC9abEdzVGwyOFNvLzZaCnFRVE1GZXhnYURidENIdTM5YitUN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFIKcDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjBzVVlnb3ZzZU8zRHZrNWg5akhPVzhzWHZoWEN0S1NiOApIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNTExSDNhNlVDQXdFQUFhT0NBU1F3CmdnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2Y29wOU50ZWEKSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGdwpPaTh2WkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoCmMzTWxNakF6SlRJd1EwRWxNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUUKUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScGIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdApkSEoxYzNRdWJtVjBMMk55YkM5a0xYUnlkWE4wWDNKdmIzUmZZMnhoYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1ClkzSnNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEwN1h0YVBLU1VpTzhhRVhVSEw3UCtQUG9lVVNicmgvWXAKM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQpuc0t0akhFaDhscHJyOTg4VGxXdnNvUmxGSW01ZDhzcU1iN1BvMjNQYjBpVU1rWnY1M0dNb0thRUdUY0g4Z05GCkNTdUdkWHpmWDJsWEFOdHUyS1p5SWt0UTFIV1lWdCszR1A5RFExQ3Vla1I3OEhsUjEwTTlwOU9CMC9ESlQ3bmEKeHBlRzBJTEQ1RUp0L3JEaVpFNE9KdWRBTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWApLVnd2dm9GQnVZei82bjFnQnA3TjF6M1RMcU1WdktqbUp1VnZ3OXk0QXlIcW54YnhMRlMxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIFN1YmplY3Q6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgTGFiZWw6ICJDQSBEaXNpZyBSb290IFIyIgojIFNlcmlhbDogMTA1NzIzNTA2MDIzOTMzMzgyMTEKIyBNRDUgRmluZ2VycHJpbnQ6IDI2OjAxOmZiOmQ4OjI3OmE3OjE3OjlhOjQ1OjU0OjM4OjFhOjQzOjAxOjNiOjAzCiMgU0hBMSBGaW5nZXJwcmludDogYjU6NjE6ZWI6ZWE6YTQ6ZGU6ZTQ6MjU6NGI6Njk6MWE6OTg6YTU6NTc6NDc6YzI6MzQ6Yzc6ZDk6NzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUyOjNkOjRhOjAzOjZkOjdiOjcwOmU5OmY1Ojk1OmIxOjQyOjIwOjc5OmQyOmI5OjFlOmRmOmJiOjFmOmI2OjUxOmEwOjYzOjNlOmFhOjhhOjlkOmM1OmY4OjA3OjAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WCkJBWVRBbE5MTVJNd0VRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXUKTVJrd0Z3WURWUVFERXhCRFFTQkVhWE5wWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReQpNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3hFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4CkV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScGMybG5JRkp2YjNRZ1VqSXcKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2lvOFFBQ2RhRlhTMXRGUGJDdzNPZQpOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IClBXU2I2V2lheHN3YlA3cStzb3MwQWk2WVZSbjhqRytxWDlwTXprMERJYVBZMGpTVFZwYkxUQXdBRmp4ZkdzM0kKeDJ5bXJkTXhwN3pvNWVGbTF0TDdBN1JCWmNrUXJnNEZZOGFBYW1rdy9kTHVrTzhOSjkrZmxYUDA0U1hhYkJiZQpRVGcwNm92ODBlZ0VGR0V0UVg2c3gzZE95MUZVKzE2U0dCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSCnl5WCtoazRrTGxZTWVFMmVBUkttSzZjQlpXNThZaDJFaE4vcXdHdTFwU3FWZzhOVEVReHpIUXV5UnBEUlFqck8KUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmE1QmVueTkxMgpIOUFaZHVnc0JiUFduRFRZbHR4aGg1RUY1RVFJTThIYXVRaGwxSzZ5TmczcnVqaTZET1dibnV1Tlp0Mlp6OWFKClFmWUVrb29wS1cxck9oem5kWDBDY1E3endPZTl5eG5kbldDeXdtWmd0ckVFN3NubWhybWFaa0NvNXhIdGdVVUQKaS9abldlakJCaEc5M2MrQUFrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9ScwpuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpRmgvZjVEY2ZFWFA3a0FwbFE2SU5mUGdHQVZVemZiQU51UFQxCnJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dVF1MHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWYKR29wVHB0aTcyVFZWc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYgpsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmVkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthCitlbFNMb3RnRXF2ODlXQlc3eEJjaThRYVF0eURXMlFPeTdXODFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWwKVEZ0eHllZ3h2dWc0QmtpaEd1THEwdDRTT1ZnYS80QU9nblhtdDhrSGJBN3Yvemp4bUhIRXQzOE9GZEFsYWIwaQpuU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDF1dEkzCmd6aFRPRFk3ejJ6cCtXc08wUHNFNkU5MzEyVUJlSVlNZWo0aFl2Ri9ZM0VNeVo5RTI2Z25vblcrYm9FKzE4RHIKRzVnUGNGdzBzb3JNd0lVWTYyNTZzL2Rhb1FlL3FVS1M4MkFpbCtRVW9RZWJUbmJBam4zOXBDWEhSKzMvSDNPcwp6TU9sNlc4S2pwdGx3bENGdGFPZ1V4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4Ckw0eXNFcjN2UUNqOEtXZWZzaE5QWmlURVV4bnBIaWtWNytadHNIOHRaLzN6YkJ0MVJxUGxTaGZwcE5jTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgU3ViamVjdDogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgTGFiZWw6ICJBQ0NWUkFJWjEiCiMgU2VyaWFsOiA2ODI4NTAzMzg0NzQ4Njk2ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBkMDphMDo1YTplZTowNTpiNjowOTo5NDoyMTphMTo3ZDpmMTpiMjoyOTo4MjowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkzOjA1OjdhOjg4OjE1OmM2OjRmOmNlOjg4OjJmOmZhOjkxOjE2OjUyOjI4Ojc4OmJjOjUzOjY0OjE3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTo2ZTpjMDoxMjplMTphNzpkYTo5ZDpiZTozNDoxOTo0ZDo0Nzo4YTpkNzpjMDpkYjoxODoyMjpmYjowNzoxZDpmMToyOTo4MTo0OTo2ZTpkMTowNDozODo0MToxMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRQpBd3dKUVVORFZsSkJTVm94TVJBd0RnWURWUVFMREFkUVMwbEJRME5XTVEwd0N3WURWUVFLREFSQlEwTldNUXN3CkNRWURWUVFHRXdKRlV6QWVGdzB4TVRBMU1EVXdPVE0zTXpkYUZ3MHpNREV5TXpFd09UTTNNemRhTUVJeEVqQVEKQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORApWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNiCnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTWptb1kKSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXbwpHMmlvUGVqMFJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBCmxIUHJ6ZzVYUEFPQk9wMEtvVmREYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHIKSUE4d0tGU1ZmK0R1emdwbW5kRkFMVzRpcjUwYXdRVVowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLwowS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFER1d1em5kTjl3cnFPREplcld4NWVICms2Zkdpb296bDJBM0VENlhQbTRwRmRhaEQ5R0lMQktmYjZxa3hrTHJRYUxqbFVQVEFZVnRqcnM3OHlNMngvNDcKNEtFbEIwaXJ5WWwwL3dpUGdML0FsbVh6N3V4TGFMMmRpTU14czBEeDZNLzJPTHVjNU5GLzFPVlltM3o2MVBNTwptM1dSNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhCmNYcGthdGNuWUdNTjI4NUo5WTBma0lreUYvaHpRN2pTV3BPR1lkYmhkUXJxZVdaMmlFOXg2d1FsMWdwYWVwUGwKdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSS1EyNlpJTUFwY1FyQVpRSURBUUFCbzRJQ3l6Q0NBc2N3ZlFZSQpLd1lCQlFVSEFRRUVjVEJ2TUV3R0NDc0dBUVVGQnpBQ2hrQm9kSFJ3T2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzClpXRmtiV2x1TDBGeVkyaHBkbTl6TDJObGNuUnBabWxqWVdSdmN5OXlZV2w2WVdOamRqRXVZM0owTUI4R0NDc0cKQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgpWdXFCNVRiTWpCNC92VEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk5LSHRPUGZOeWVUClZmWlc2b0hsTnN5TUhqKzlNSUlCY3dZRFZSMGdCSUlCYWpDQ0FXWXdnZ0ZpQmdSVkhTQUFNSUlCV0RDQ0FTSUcKQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQQpjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmhBTzBBZWdBZ0FHUUFaUUFnQUd3QVlRQWdBRUVBClF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQVl3QnVBRzhBYkFCdkFHY0EKN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqQUhRQQpjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBClF3QlFBRk1BSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUEKY3pBd0JnZ3JCZ0VGQlFjQ0FSWWthSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdQphSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMGRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0CmFXNHZRWEpqYUdsMmIzTXZZMlZ5ZEdsbWFXTmhaRzl6TDNKaGFYcGhZMk4yTVY5a1pYSXVZM0pzTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBWEJnTlZIUkVFRURBT2dReGhZMk4yUUdGalkzWXVaWE13RFFZSktvWklodmNOQVFFRgpCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwCkQ3MEVSOW0rMjdVcDJwdlpycW1aMWRNOE1KUDFqYUdvL0FhTlJQVEtGcFY4TTl4aWk2ZzMrQ2ZZQ1MwYjc4Z1UKSnlDcFpFVC9MdFoxcW14TllFQVpTVU5VWTlyaXpMcG01VTlFZWx2WmFvRXJRTlYvK1FFbldDekk3VWlSZkQrbQpBTS9FS1hNUk50NkdHVDZkN2htS0c5V3c3WTQ5bkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBECnZWK0pIYW5Cc015WjRrMEFDdHJKSjF2bkU1QmM1UFV6b2xWdDNPQUpUUyt4SmxzbmRRQUp4R0ozS1FoZm5sbXMKdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXM3NDUGRLNmpUMmlXSAo3ZWhWUkUySTlEWitoSnA0clBjT1Zra08xak1sMW9SUVFtd2dFaDBxMWI2ODhuQ0JwSEJndmdXMW01NEVSTDVoCkk2enBwU1NNRVlDVVdxS2l1VW5Td2R6UnArMHhFU3llR2FidTRWWGh3T3JQRFlUa0Y3ZWlmS1hlVlNVRzdzekEKaDF4QTJzeVZQMVhnTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RgpkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQzZGpESjlldytmN1pmYzNRbjQ4TEZGaFJueStMd3pndDN1aVAxbzJICnBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcEVmYlJEMHRWTkVZcWk0WTcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDMyNjIKIyBNRDUgRmluZ2VycHJpbnQ6IGY5OjAzOjdlOmNmOmU2OjllOjNjOjczOjdhOjJhOjkwOjA3OjY5OmZmOjJiOjk2CiMgU0hBMSBGaW5nZXJwcmludDogOWM6YmI6NDg6NTM6ZjY6YTQ6ZjY6ZDM6NTI6YTQ6ZTg6MzI6NTI6NTU6NjA6MTM6ZjU6YWQ6YWY6NjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU5Ojc2OjkwOjA3OmY3OjY4OjVkOjBmOmNkOjUwOjg3OjJmOjlmOjk1OmQ1Ojc1OjVhOjViOjJiOjQ1OjdkOjgxOmYzOjY5OjJiOjYxOjBhOjk4OjY3OjJmOjBlOjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJQ0RMNHdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNWRmN4CkVqQVFCZ05WQkFvVENWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVQKVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEUVRBZUZ3MHhNakEyTWpjd05qSTRNek5hRncwek1ERXlNekV4TlRVNQpOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUtFd2xVUVVsWFFVNHRRMEV4RURBT0JnTlZCQXNUCkIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDbkpmRgoxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6CjBBTGZVUFpWcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2gKTUJ3cW9KaW1GYjN1L1JrMjhPS1JRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSAp6SWgxSHJ0c0J2K2JhejRYN0dHcWNYekdIYUwzU2VrVnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjCjQ2S29rV29md3BGRmlGemxtTGh4cFJVWnlYeDFFY3h3ZEU4dG14MlJSUDFXS0tEK3U0WnF5UHBjQzFqY3hrdDIKeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTlzeTJzYlpDaQpsYUxPejlxQzV3YzBHWmJwdUNHcUtYNm1PTDZPS1VvaFpua2ZzOE8xQ1dmZTF0UUhSdk1xMnVZaU4yRExnYllQCm9BL3B5SlYvdjFXUkJYclBQUlhBYjk0SmxBR0QxelFiekVDbDhMaWJaOVdZa1R1bmhIaVZKcVJhQ1BncmRMUUEKQkR6ZnVCU082Titwald4bmtqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRQpxWVNqTXErdTdtc1hpN0t4L216aGtJeUlxSmRJenNoTnkvTUd6MTlxQ2tLeEhoNTNMNDZnNXBJT0J2d0ZJdEltCjRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVh6U0JkdStXSGRYbHRka0NZNFFXd2E2Z2NGR245MHhITmNnTAoxeWc5aVhIWnFqTkI2aFFiYkNFQXdHeENHWDZmYVZzZ1F0K2kwdHJFZkpkTGpiRG9yTWp1cFdrRW1RcVNwcXNuCkxocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0YKSDZ2UE5Pdy9LUDRNOFZlR1RzbFY5eHpVMktWOUJucHYxZDhRMzRGT0lXV3h0dUVYZVpWRkJzNWZ6TnhHaVdObwpSSTJUOUdSd29EMmRLQVhET1hDNFluc2cvZVRiNlFpaHVKNDlDY2RQK3l6NGszWkIzbExnNFZmU25RTzhkNTcrCm5pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZ2xQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gKMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQQTlnSzhreGtScjA1WXVXVwo2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM21pNFRXCm5zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWoKd2ExOWhBTThFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXegphR0hRUmlhcElWSnBMZXN1eCt0M3pxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15Ckt3YlFCTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBTdWJqZWN0OiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBMYWJlbDogIlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEiCiMgU2VyaWFsOiAxOTkwNDE5NjY3NDEwOTAxMDc5NjQ5MDQyODcyMTc3ODY4MDE1NTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjQxOjQ5OjFiOjE4OjU2OjlhOjI2OmY1OmFkOmMyOjY2OmZiOjQwOmE1OjRjCiMgU0hBMSBGaW5nZXJwcmludDogNDM6MTM6YmI6OTY6ZjE6ZDU6ODY6OWI6YzE6NGU6NmE6OTI6ZjY6Y2Y6ZjY6MzQ6Njk6ODc6ODI6MzcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGRkOjY5OjM2OmZlOjIxOmY4OmYwOjc3OmMxOjIzOmExOmE1OjIxOmMxOjIyOjI0OmY3OjIyOjU1OmI3OjNlOjAzOmE3OjI2OjA2OjkzOmU4OmEyOjRiOjBmOmEzOjg5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Ck56RVVNQklHQTFVRUNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnYKYjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0TVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRApWUVFLREF0VVpXeHBZVk52Ym1WeVlURWZNQjBHQTFVRUF3d1dWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1LKzZ5ZndJYVB6YVNaVmZwM0YKVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBM0dWMQo3Q3BOWDhHSDlTQmxLNEdvUno2Skk1VXdGcEIvNkZjSFNPY1pycjlGWjdFM0d3WXEvdDc1ckgyRCsxNjY1SStYClo3NUxqbzFrQjFjNFZXazBOajBUU085UDR0Tm1IcVRQR3JkZU5qUFV0QWE5R0FIOWQ0UlFBRVgxakYzb0k3eCsKL2pYaDdWQjdxVENOR2RNSmptaG5YYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDcwo4MU10OEJ6MTdXdzVPWE9BRnNoU3NDUE40RDdjM1R4SG9MczFpdUtZYUl1KzViOXk3dEw2cGUwUzdmeVlHS2ttCmR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzRjBmVVRQSFNpWGsrVFQyWXFHSGUKT2g3UytGNEQ0TUhKSEl6VGpVM1RsVGF6TjE5alk1c3pGUEF0Sm10VGZJbU1Nc0p1N0QwaEFEbkpvV2ppVUlNdQpzRG9yOHphZ3JDL2tiMkhDVVFrNVBvdFR1YnRuMnR4VHVYWlpOcDFENVNEZ1BUSmdoU0pSdDhjenU5MFZMNlI0CnBnZDdnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnMKc2xFU2wxTXBXdFR3RWhEY1R3SzdFcEl2WXRRL2FVTjhEZGI4V0hVQmlKMVlGa3ZldXBEL1J3R0pCbXIyWDdLUQphck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CQUFHalB6QTlNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEClZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVdETlhyK251cUYrZ1RFakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObXpxak1EZnoxbWdibApkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGoKVFFwZ2NtTE5rUWZXcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZApZMmdlYSt6RFRZYTRFekF2WFVZTlIwUFZHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3ClE0V1F4WXBZeG1VS2VGZnl4aU1QQWRrZ1M5NFArNUtGZFNwY2M0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUkKT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9USnNqckROWW1pTGJBSk0rNwp2VnZyZFgzcENJNkdNeXg1ZHdscHBZbjhzM0NRaDNhUDB5SzdRczY5Y3dzZ0ppclFtejF3SGlSc3pZZDJxUmVXCnQ4OE5rdnVPR0ttWVNkR2UvbUJFY2lHNUdlM0M5VEh4T1VpSWtDUjFWQmF0enZUNGFSUmtPZnVqdUxwd1FNY24KSEwvRVZsUDZZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeApTSzIzNnRoWmlOU1F2eGF6MmVtc1dXRlV5Qnk2eXNISzRia2dUSTg2azRtbG9NeS8wL1oxcEhXV2JWWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgU3ViamVjdDogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBMYWJlbDogIkUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA3NjY3NDQ3MjA2NzAzMjU0MzU1CiMgTUQ1IEZpbmdlcnByaW50OiBiODphMTowMzo2MzpiMDpiZDoyMTo3MTo3MDo4YTo2ZjoxMzozYTpiYjo3OTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDUxOmM2OmU3OjA4OjQ5OjA2OjZlOmYzOjkyOmQ0OjVjOmEwOjBkOjZkOmEzOjYyOjhmOmMzOjUyOjM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiMDpiZjpkNToyYjpiMDpkNzpkOTpiZDo5MjpiZjo1ZDo0ZDpjMTozZDphMjo1NTpjMDoyYzo1NDoyZjozNzo4Mzo2NTplYTo4OTozOToxMTpmNTo1ZTo1NTpmMjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1N6Q0NCRE9nQXdJQkFnSUlhbWcrbkZHYnkxTXdEUVlKS29aSWh2Y05BUUVMQlFBd2diSXhDekFKQmdOVgpCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQStCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDCmFXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocGVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlYKQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMQpaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRFek1ETXdOVEV5TURrME9Gb1hEVEl6Ck1ETXdNekV5TURrME9Gb3dnYkl4Q3pBSkJnTlZCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQSsKQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQ2FXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocAplbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOClpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjFaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0dlUva3dWUkhvVmlWRjU2Qy9VWQpCNE91ZnE5ODk5U0thNlZqUXptNVMvZkR4bVNKUFpRdVZJQlNPVGtIUzB2ZGhRZDJoOHkvTDVWTXpIMm5QYnhICkQ1aHcrSXlGSG5TT2ttMGJRTkdaRGJ0MWJzaXBhNXJBaERHdnlrUEw2eXMwNkkrWGF3R2IxUTVLQ0twYmtuU0YKUTlPQXJxR0lXNjZ6Nmw3TEZwcDNSTWloOWxSb3p0NlBseXU2VzBBQ0RHUVh3TFdUemVIeEUyYk9ESG52MFpFbwpxMStnRWxJd2N4bU9qK0dNQjZMRHUwcnc2aDhWcU80bHpLUkcrQnNpNzdNT1E3b3NKTGpGTEZ6VUhQaGRaTDNECmsxNG9wejhuOFk0ZTB5cFFCYU5WMmN2bk9WUEFtSjZNVkdLTEpyRDNmWTE4NU1hZVprSlZna2Zuc2xpTlp2Y0gKZkM0MjVsQWNQOXRESk1XL2hrZDVzM2tjOTFyMEUreHMrRC9pV1IrVjdrSSt1YTJvTW9WSmwwYitTekdQV3N1dApkRWNmNlpHMzN5Z0VJcURVRDEzaWVVL3FiSVdHdmFpbXp1VDZ3K0d6cnQ0OFVlN0xFM3dCZjRRT1hWR1VuaE1NCnRpNmxUUGs1Y0Radmxzb3VERVJWeGNyNlhRS2ozOVprakZxekFRcXB0UXBIRi8vdmtVQXFqcUZHT2pHWTVSSDgKekx0SlZvcjh1ZEJobW05bGJPYkR5ejUxU2Y2UHArS0p4V2ZYblVZVFRqRjJPeVN6bmhGbGhxdC83eDNVK0x6bgpyRnBjdDFwSFhGWE9WYlFpY1Z0YkMvRFAzS0JoWk9xcDEyZ0tZNmZnRFQrZ3I5T3Ewbjd2VWFEbVVTdFZraFVYClU4dTNaZzVtVFBqNWRVeVE1eEp3eDBVQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZDN2oyN0pKMEp4VWVWejYKSnlyK3pFN1M2RTVVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUx1UGJza25RbkZSNQpYUG9uS3Y3TVR0TG9UbFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFGCk56cjBUYmRGNGtWMUpJKzJkMUxvSE5nUWsyWHo4bGtHcEQ0ZUtleGQwZENyZk9BS2tFaDQ3VTZZQTVuK0tHQ1IKSFRBZHVHTjhxT1kxdGZyVFlYYm0xZ2RMeW1tYXNvUjZkNU5GRnhXZkpOQ1lFeEwvdTZBdS9VNU1oL2pPWEtxWQpHd1hnQUVaS2dvQ2xNNHNvM08wNDA5L2xQdW4rKzFuZFlZUlAwbFNXRTJFVFBvK0FhYjZUUjdVMVE5SmF1ejFjCjc3TkNSODA3VlJNR3NBbmIvV1AyT29nS21XOSs0YzRiVTJwRVppTlJDSHU4VzFLaS9RWTNPRUJoajBxV3VKQTMKK0diSGVKQUFGUzZMclZFMVV3ZW9hMml1K1U0OEJ5Yk5DQVZ3ekRrL2RyMmwwMmNtQVlhbVU5SmdPM3hEZjFXSwp2SlVhd1NnNVRCOUQwcEgwY2xtS3VWYjhQN1NkMm5DY2RscU1RMUR1ampCeVRkLy9TZmZHcVdmWmJhd0NFZUk2CkZpV25XQWpMYjFOQm5FZzRSMmd6MGRmSGo5UjBJZFREQlpCNi84NldpTEVWS1YwanE5QmdvUkpQM3ZRWHpUTGwKeWIvSVE2MzlMbzd4citMMG1Qb1NIeURZd0tjTWhjV1E5RHN0bGlheExMNU1xK3V4MG9ySjIzZ1REeDRKblcyUApBSjhDMnNINkgzcDZDY1JLNW9ncWw1K0ppLzAzWDE4NnpqaFpoa3V2Y1F1MDJQSndUNTh5RStPd3AxZmwydHBECnk0UTA4aWpFNm0zMEt1L0JhM2JhKzM2N2hUelNVOEpOdm5IaFJkSDlJMmNORTNYN3oyVm5JcDJ1c0FuUkNmOGQKTkwvK0k1YzMwam42UFEwR0M3VGJPNk9yYjF3ZHRuN29zNEkwN1FaY0pBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMmI6OWI6OWU6ZTQ6N2I6NmM6MWY6MDA6NzI6MWE6Y2M6YzE6Nzc6Nzk6ZGY6NmEKIyBTSEExIEZpbmdlcnByaW50OiA1OTowZDoyZDo3ZDo4ODo0Zjo0MDoyZTo2MTo3ZTphNTo2MjozMjoxNzo2NTpjZjoxNzpkODo5NDplOQojIFNIQTI1NiBGaW5nZXJwcmludDogOTE6ZTI6ZjU6Nzg6OGQ6NTg6MTA6ZWI6YTc6YmE6NTg6NzM6N2Q6ZTE6NTQ6OGE6OGU6Y2E6Y2Q6MDE6NDU6OTg6YmM6MGI6MTQ6M2U6MDQ6MWI6MTc6MDU6MjU6NTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdIaGNOTURneE1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxWDlvYlgraHprZVhhWFBTaTVrZmw4MmhWWUFVZApBcVN6bTFuekhvcXZOSzM4RGNMWlNCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDCkZvVDZackFJeGxRamdlVE51VWsvOWs5dU4wZ29PQS9GdnVkb2NQMDVsMDNTeDVpUlVLckVSTE1qZlRsSDZWSmkKMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAyY3UrZmpPbGJwU0Q4RFQ2SWF2cQpqbktnUDZUZU1GdnZoazFxbFZ0RFJLZ1FGUnpsQVZmRm1QSG1CaWlScWlERnQxTW1VVU95Q3hHVldPSEFEM2JaCndJMThnZk55Y0o1di9ocU8yVjgxeHJKdk5IeStTRS9pV2puWDJKMTRucCtHUGdOZUdZdEVvdFhIQWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTLwpXU0EyQUhtZ29DSnJqTlh5WWRLNExNdUNTakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBTVFPaVlRc2ZkT2h5Ck5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazRyNnA4RlUzenRxT05wZlNPOWtTcHArZ2hsYTArQUdJV2lQQUMKdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZnZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWdwpJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSM3AxbTBJdlZWR2I2CmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUApCU2VPRTZGdXdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBTdWJqZWN0OiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgTGFiZWw6ICJBdG9zIFRydXN0ZWRSb290IDIwMTEiCiMgU2VyaWFsOiA2NjQzODc3NDk3ODEzMzE2NDAyCiMgTUQ1IEZpbmdlcnByaW50OiBhZTpiOTpjNDozMjo0YjphYzo3Zjo1ZDo2NjpjYzo3Nzo5NDpiYjoyYTo3Nzo1NgojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOmIxOmY1OjNlOjU1OjBjOjFkOmM1OmYxOmQ0OmU2OmI3OjZhOjQ2OjRiOjU1OjA2OjAyOmFjOjIxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMzo1NjpiZTphMjo0NDpiNzphOToxZTpiMzo1ZDo1MzpjYTo5YTpkNzo4Njo0YTpjZTowMTo4ZToyZDozNTpkNTpmODpmOTo2ZDpkZjo2ODphNjpmNDoxYTphNDo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRQpBd3dWUVhSdmN5QlVjblZ6ZEdWa1VtOXZkQ0F5TURFeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWURWUVFHCkV3SkVSVEFlRncweE1UQTNNRGN4TkRVNE16QmFGdzB6TURFeU16RXlNelU1TlRsYU1Ed3hIakFjQmdOVkJBTU0KRlVGMGIzTWdWSEoxYzNSbFpGSnZiM1FnTWpBeE1URU5NQXNHQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQwpSRVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1ZoVHVYYnlvN0xqdlBwdk1wCk5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cjU0ck0KVkQ2UVVNK0ExSlg3NkxXQzFCVEZ0cWxWSlZmYnNWRDJzR0JrV1hwcHp3TzNidzIreWo1dmRITHFxakFxYzJLKwpTWkZoeUJIK0RnTXE5Mm9nM0FJVkRWNFZhdnpqZ3NHMXhaMWtDV3lqV1pnSEo4Y2JsaXRoZEhGc1EvSDNOWWtRCjRKN3NWYUUzSXFLSEJBVXNSMzIwSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MEwKY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1J6M2JGbXg1VmRKeDRJYkh3TGZFTG44TFZsaGdmOEZRaQplb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UmwrbHdycnc3R1d6YklUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaYk5zaE1CZ0cKQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqCnZaZnphMXp2N3YxQXB0K2hrNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1AKRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaFRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwYwptYUhGQ043OTV0clYxbHBGRE1TM3dyVVU3N1FSL3c0VnRmWDEyOGE5NjFxbjhGWWlxVHhsVk1ZVnFMMkduczJECmxtaDZjWUdKNFF2aDZoRWJhQWpNYVo3c25rR2VSREltZXVLSENuRTk2K1JhcE5MYnhjM0czbUIvdWZOUFJKTHYKS3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAxIEczIgojIFNlcmlhbDogNjg3MDQ5NjQ5NjI2NjY5MjUwNzM2MjcxMDM3NjA2NTU0NjI0MDc4NzIwMDM0MTk1CiMgTUQ1IEZpbmdlcnByaW50OiBhNDpiYzo1YjozZjpmZTozNzo5YTpmYTo2NDpmMDplMjpmYTowNTozZDowYjphYgojIFNIQTEgRmluZ2VycHJpbnQ6IDFiOjhlOmVhOjU3Ojk2OjI5OjFhOmM5OjM5OmVhOmI4OjBhOjgxOjFhOjczOjczOmMwOjkzOjc5OjY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4YTo4Njo2ZjpkMTpiMjo3NjpiNTo3ZTo1Nzo4ZTo5MjoxYzo2NTo4Mjo4YToyYjplZDo1ODplOTpmMjpmMjo4ODowNTo0MTozNDpiNzpmMTpmNDpiZjpjOTpjYzo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDAKTWpBeE1USXhOekkzTkRSYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNndmxBUWp1bnliRUMwQkp5RnVUSEszQzNrRWFrRVBCdFYKd2VkWU1CMGt0TVB2aGQ2TUxPSEJQZCtDNWsrdFI0ZHM3RnRKd1VyVnU0L3NoNngvZ3BxRzdEMERtVklCMGpXZQpyTnJ3VThsbVBOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxCjY4WGZ1dzZjd0kySDQ0ZzRoV2Y2UHNlcjRCT2NCUmlZejVQMXNaSzAvQ1BUejlYRUowbmduanliQ0tPTFhTb2gKNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU5vZmpTeHhSM1c1QTJCNEdiUGdiNlVsNWp4YVlBL3FYcApVaHRTdFpJNWNnTUpZcjJ3WUJadXB0MGx3Z05tM2ZNRTBVRGlUb3VHOUcvbGc2QW5oRjRFd2ZXUXZUQTl4TytvCmFidzRtNlNrbHRGaTJtbkFBWmF1eThSUk5Pb01xdjhoamxtUFNsemtZWnFuMHVrcWVJMVJQVG9WN3FKWmpxbGMKM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovRwpLdWJYOVpxeldCNHZNSWtJRzFTaXRaZ2o3QWgzSEpWZFlkSExpWnhmb2txUm11OGhxa2tXQ0tpOVlTZ3h5WFN0CmhmYlp4YkdMMGVVUU1rMWZpeUE2UEVrZk00VlpEZHZMQ1hWRGFYUDdhM0Y5OE4vRVRIM0dveTdJbFhuTGM2S08KVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZ3QzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdAp6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyCmNETVQvdUZQcGlOM0dQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU4KcVhzQ0hLblFPMThMd0lFNlBXVGh2NmN0VHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNQpZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlArVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2CmIyWDUyejNzSWV4ZTlQU0x5bUJsVk5GeFpQVDVwcU9CTXpZemNmQ2tlRjlPcllNaDNqUkpqZWhackozeWRsbzIKOGhQMHIrQUp4MkVxYlBmZ25hNjdoa29vYnk3dXRIbk5rRFBEczNiNjlmQnNuUUdRK3A2UTlweHl6MGZhd3gvawpOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qClpnS0F2UVU2TzBlYzdBQW1UUFdJVWIrb0kzOFlCN0FMN1lzbW9XVFRZVXJyWEovZXM2OW5BN01mM1cxZGFXaHAKcTE0NjdIeHB2TWM3aFU2ZUZibTBGVS9EbFhwWTE4bHM2V3k1OHlsalhyUXM4QzA5N1ZwbDRLbGJRTUpJbVlGdApuaDhHS2p3U3RJc1BtNklrOEthTjFucmdTN1prbG1PVmhNSkt6Und1SkljellPWEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIgRzMiCiMgU2VyaWFsOiAzOTAxNTYwNzk0NTg5NTkyNTc0NDYxMzMxNjkyNjYwNzk5NjIwMjY4MjQ3MjU4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGFmOjBjOjg2OjZlOmJmOjQwOjJkOjdmOjBiOjNlOjEyOjUwOmJhOjEyOjNkOjA2CiMgU0hBMSBGaW5nZXJwcmludDogMDk6M2M6NjE6ZjM6OGI6OGI6ZGM6N2Q6NTU6ZGY6NzU6Mzg6MDI6MDU6MDA6ZTE6MjU6ZjU6Yzg6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhmOmU0OmZiOjBhOmY5OjNhOjRkOjBkOjY3OmRiOjBiOmViOmIyOjNlOjM3OmM3OjFiOmYzOjI1OmRjOmJjOmRkOjI0OjBlOmEwOjRkOmFmOjU4OmI0OjdlOjE4OjQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwMApNakF4TVRJeE9EVTVNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2hyaVd5QVJqY1Y0Zy9SdXY1citMckkzSGltdEZoWmlGZgpxcThuVWVWdUd4YlVMWDFRc0ZOM3ZYZzZZT0prQXB0OGhwdldHbzZ0L3g4VmY5V1ZIaExMNWhTRUJNSGZOck1XCm40cmp5ZHVZTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW0KYzVHUVlhWURGQ0R5NTRlamlLMnRvSXovcGdzbFVpWG5GZ0hWeTdnMWdReWpPL0RoNGZ4YVhjNkFjVzM0U2FzKwpPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3Arb01pd016QWtkMDU2T1hieE1tTzdGR21oNzdGT202UlExCm85L05nSjhNU1BzYzlQRy9Tcmo2MVl4eFNzY2ZyZjVCbXJPRFhmS0VWdStsVjBQT0thMk1xMVcveFB0YkFkMGoKSWFGWUFJN0QwR29UN1JQakVpdUEzR2ZtbGJMTkhpSnVLdmhCMVBMS0ZBZU5pbFVTeG1uMXVJWm9MMU5lc05LcQpJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6CjhlUVFzU1d1MVpLN0U4RU00RG5hdERsWHRhczFxbkloTzRNMTV6SGZlaUZ1dURJSWZSMHlrUlZLWW5MUDQzZWgKdk5VUkczWUJad2pnUVF2RDZ4VnUrS1FaMmFLcnIrSW5VbFlyQW9vc0ZDVDV2MElDdnliSXhvL2diamg5VXkzbAo3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhobFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHCmNDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkMKcm9palExaDVmcTdLcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYQpXL1paR1lqZVZZZzNVUXQ0WEFvZW8wTDl4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRuCmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnemRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUKK1YrdFlsVWttbEtZN1ZIbm9YNlhPdVl2SHhIYVU0QXNoWjZyTlJEYklsOXF4VjZYVS9JeUFna3dvMWp3RFFIVgpjc2F4ZkdsN3cvVTJSY3hoYmw1TWxNVmVydWdPWG91Lzk4M2c3YUVPR3pQdVZCaitENzd2Zm9SclErTndtTnRkCmRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmcKS0NManNaV0R6WVdtM1M4UDUyZFNicnN2aFh6MVNuUG54VDdBdlNFU0JULzh0d05KQWx2SUplYmlWRGoxZVllTQpIVk95VG9WN0JqakhMUGo0c0hLTkplVjNVdlFESEVpbVVGK0lJREJ1OG9KRHF6MlhoT2RUK3lIQlR3OGltb2E0CldTcjJSejBaaUMzb2hlR2U3SVVJYXJGc05Na2Q3RWdyTzNqdFpzU09lV21EM24rTQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyIKIyBTZXJpYWw6IDI2ODA5MDc2MTE3MDQ2MTQ2MjQ2Mzk5NTk1MjE1NzMyNzI0MjEzNzA4OTIzOTU4MQojIE1ENSBGaW5nZXJwcmludDogZGY6N2Q6Yjk6YWQ6NTQ6NmY6Njg6YTE6ZGY6ODk6NTc6MDM6OTc6NDM6YjA6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA0ODoxMjpiZDo5MjozYzphODpjNDozOTowNjplNzozMDo2ZDoyNzo5NjplNjphNDpjZjoyMjoyZTo3ZAojIFNIQTI1NiBGaW5nZXJwcmludDogODg6ZWY6ODE6ZGU6MjA6MmU6YjA6MTg6NDU6MmU6NDM6Zjg6NjQ6NzI6NWM6ZWE6NWY6YmQ6MWY6YzI6ZDk6ZDI6MDU6NzM6MDc6MDk6YzU6ZDg6Yjg6Njk6MGY6NDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwCk1qQXhNVEl5TURJMk16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDenl3NFFaNDdxRkplbk1pb0tWalovYUV6SHMyODZJeFNSCi94bC9wY3FzN3JOMm5YcnBpeHVyYXpIYitndFRUSy9GcFJwNVBJcE0vNnpmSmQ1TzJZSXlDMFRleXR1TXJLTnUKRm9NN3BtUkxNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUgpVN094N3NXVGFZSStGclVvUnFIZTZva0o3VU80QlVhS2h2VlpSNzRiYndFaEVMbjlxZElveWhBNUNjb1ROcytjCnJhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzSTRaeVlVVXBTRmxvYjNlbUxvRytCMDF2cjg3RVJST1IKRkhBR2p4K2YrSWRwc1E3dnc0a1o2K29jWWZ4NmJJcmMxZ01MbmlhNkV0M1VWRG1ySnFNejZuV0IyaTNORDAvawpBOUh2RlpjYmE1REZBcENUWmdJaHNVZmVpNXBLZ0xsVmo3V2lMOERXTTJmYWZzU250QVJFNjBmNzVsaTU5d3p3CmV5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWwKc1NxaU1kNW1CUGZBZE9oeDN2ODlXY3lXSmhLTGhaVlhHcXRyZFF0RVBSRW9QSHRodCtLUFowL2w3RHhNWUlCcApWemdlQVZ1TlZlakgzOERNZHlNMFNYVjg5cGdSNnkzZTdVRXVGQVVDZitEK0lPczE1eEdzSXM1WFBkN0pNRzBRCkE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXRyUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCsKeWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSQpGVUJoeW5MV2NLelN0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2Cm94WHFBLzRUaTJUazA4SFM2SVQ3U2RFUVRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmcKdS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1RGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUAowQWovdUhZVWJ0N2xKK3lyZUxWVHViWS82Q0Q1MHFpK1lVYktoNHlFOC9ueG9HaWJJaDZCSnBzUUJKRnh3QVlmCjNLRFR1VmFuNDVndGY0T2QzNHdybkRLT01wVHdBVHdpS3A5RHdpN0RtRGtIT0h2OFhnQkNIL015Sm5tRGhQYmwKOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkKwpEaGNJMDBpWDBIR1M4QTg1UGpScUhIM1k4aUt1dTJuME03U21TRlhSRHc0bTZPeTJDeTJuaFRYTi9WbkluOUhOClBsb3BOTGs5aE02eFpkUlprWkZXZFNIQmQ1NzVldUZnbmRPdEJCajBmT3RlazQ5VFNpSXArRWdyUGsyR3JGdC8KeXdhWldXRFlXR1dWalVUUjkzOStKMzk5cm9EMUIweTJQcHh4VkprRVMvMVkrWmowCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIiCiMgU2VyaWFsOiAxNTM4NTM0ODE2MDg0MDIxMzkzODY0MzAzMzYyMDg5NDkwNTQxOQojIE1ENSBGaW5nZXJwcmludDogOTI6Mzg6Yjk6Zjg6NjM6MjQ6ODI6NjU6MmM6NTc6MzM6ZTY6ZmU6ODE6OGY6OWQKIyBTSEExIEZpbmdlcnByaW50OiBhMTo0Yjo0ODpkOTo0MzplZTowYTowZTo0MDo5MDo0ZjozYzplMDphNDpjMDo5MTo5Mzo1MTo1ZDozZgojIFNIQTI1NiBGaW5nZXJwcmludDogN2Q6MDU6ZWI6YjY6ODI6MzM6OWY6OGM6OTQ6NTE6ZWU6MDk6NGU6ZWI6ZmU6ZmE6Nzk6NTM6YTE6MTQ6ZWQ6YjI6ZjQ6NDk6NDk6NDU6MmY6YWI6N2Q6MmY6YzE6ODUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdSekl3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFo1eWd2VWo4MmNrbUlrelR6K0dvZU1WU0EKbjYxVVFiVkgzNWFvMUsrQUxia0t6M1g5aWFWOUpQcmpJZ3dydkpVWEN6Ty9HVTFCQnBBQXZReE5FUDRIdGVjYwpiaUpWTVdXWHZkTVgwaDVpODl2cWJGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwCkVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3Vldtdm8yaWZ2OTIyZWJQeW5YQXBWZlNyLzVWaDg4bEEKYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1BZTGZ5a3FHeHZZbUpIekROdzZZdQpZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbmxUR05BZ01CCkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVcKQkJUT3cwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSQpRVzVwSjZkMUVlODhoalp2MHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJCjBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmkKbG13T1JHWVFSSSt0QmV2NGVheW1HK2czTkoxVHlXR3FvbEt2U25BV2hzSTZ5TEVUY0RiWXorNzBDalRWVzB6OQpCNXlpdXRrQmNsenpUY0hkRHJFY0RjUmp2cTMwRlB1SjdLSkJEa3pNeUZkQTBHNERxczBNam9tWm1XendQREN2Ck9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KSWhOemJNOG05WW9wNXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIgojIFNlcmlhbDogMTU0NTkzMTI5ODEwMDg1NTM3MzE5MjgzODQ5NTMxMzU0MjY3OTYKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjdmOjY1OjMxOjBjOjgxOmRmOjhkOmJhOjNlOjk5OmUyOjVjOmFkOjZlOmZiCiMgU0hBMSBGaW5nZXJwcmludDogZjU6MTc6YTI6NGY6OWE6NDg6YzY6Yzk6Zjg6YTI6MDA6MjY6OWY6ZGM6MGY6NDg6MmM6YWI6MzA6ODkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdlOjM3OmNiOjhiOjRjOjQ3OjA5OjBjOmFiOjM2OjU1OjFiOmE2OmY0OjVkOmI4OjQwOjY4OjBmOmJhOjE2OjZhOjk1OjJkOmIxOjAwOjcxOjdmOjQzOjA1OjNmOmMyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUmpDQ0FjMmdBd0lCQWdJUUM2RmEraDNmb0xWSlJLL05KS0JzN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZwpSek13SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdkakFRQmdjcQpoa2pPUFFJQkJnVXJnUVFBSWdOaUFBUVo1N3lzUkdYdHpiZy9XUHVOc1ZlcFJDMEZGZkx2Qy84UWRKKzFZbEpmClpuNGY1ZHdiUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1EKUlNBUFdYWVExcUFrOEMzZU52SnNLVG1qUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRlVhRk5ONktEZWM2TkhTcmtoREFLQmdncWhrak9QUVFECkF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5WVo1ZUVKSlpWcm1EeHhEbk9PbFkKSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kxdlVoWnNjdgo2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIiCiMgU2VyaWFsOiA0MjkzNzQzNTQwMDQ2OTc1Mzc4NTM0ODc5NTAzMjAyMjUzNTQxCiMgTUQ1IEZpbmdlcnByaW50OiBlNDphNjo4YTpjODo1NDphYzo1Mjo0Mjo0NjowYTpmZDo3Mjo0ODoxYjoyYTo0NAojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjNjOjI0OmY5OmJmOmQ2OjY2Ojc2OjFiOjI2OjgwOjczOmZlOjA2OmQxOmNjOjhkOjRmOjgyOmE0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjozYzpjYjpiNzo2MDozMTplNTplMDoxMzo4Zjo4ZDpkMzo5YToyMzpmOTpkZTo0NzpmZjpjMzo1ZTo0MzpjMToxNDo0YzplYToyNzpkNDo2YTo1YTpiMTpjYjo1ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGpqQ0NBbmFnQXdJQkFnSVFBenJ4NXFjUnFhQzdLR1N4SFFuNjVUQU5CZ2txaGtpRzl3MEJBUXNGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkgKTWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjeU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1SQoyL091OGpxSmtUeDY1cXNHR212UHJDM29YZ2trUkxwaW1uN1dvNmgrNEZSMUlBV3NVTGVjWXhwc01OemFIeG14CjF4N2UvZGZneTVTRE42N3NIME5PM1hzczByMHVwUy9rcWJpdE90U1pwTFlsNlp0ckFHQ1NZUDlQSVVrWTkyZVEKcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVZCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXegp0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TVVOR1BIZ20rRjZIbUljcjlnK1VRCnZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVgo1dU51NWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZCjFZbDlQTVdMU24vcHZ0c3JGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djQKTmVGMjJkK21RcnZIUkFpR2Z6WjBKRnJhYkEwVVdUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFORwpGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJIUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxCjhyR09tYUZ2RTdGQmNmNklLc2hQRUNCVjEvTVVSZVhnUlBUcWg1VXlrdzcrVTBiNkxKMy9peUs1UzlrSlJhVGUKcExpYVdOMGJmVktmamxsRGlJR2tuaWJWYjYzZERjWTNmZTBEa2h2bGQxOTI3anlOeEYxV1c2TFpabTZ6TlRmbApNclk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMiCiMgU2VyaWFsOiA3MDg5MjQ0NDY5MDMwMjkzMjkxNzYwMDgzMzMzODg0MzY0MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiBmNTo1ZDphNDo1MDphNTpmYjoyODo3ZToxZTowZjowZDpjYzo5Njo1Nzo1NjpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IDdlOjA0OmRlOjg5OjZhOjNlOjY2OjZkOjAwOmU2Ojg3OmQzOjNmOmZhOmQ5OjNiOmU4OjNkOjM0OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMTphZDo2Njo0ODpmODoxMDo0MTozODpjNzozODpmMzo5ZTphNDozMjowMTozMzozOTozZTozYToxODpjYzowMjoyOTo2ZTpmOTo3YzoyYTpjOTplZjo2NzozMTpkMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1B6Q0NBY1dnQXdJQkFnSVFCVlZXdlBKZXBEVTF3NlFQMWF0RmNqQUtCZ2dxaGtqT1BRUURBekJoTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE16QWUKRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVdwpFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWpiMjB4CklEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQ0FRWUYKSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGRwpmcDR0bis2T1l3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPClo5d2ovd01jbytJK28wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWQKQmdOVkhRNEVGZ1FVczl0SXBQbWh4ZGl1TmtITUVXTnBZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeApBSzI4OG13L0VrclJMVG5EQ2dtWGMvU0lOb3lJSjd2bWlJMVFoYWRqK1o0eTNtYVREL0hNc1FtUDNXeXIrbXQvCm9BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0Vk9LYTVWdDgKc3ljWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IgojIFNlcmlhbDogNzQ1MTUwMDU1ODk3NzM3MDc3NzkzMDA4NDg2OTAxNjYxNDIzNgojIE1ENSBGaW5nZXJwcmludDogNzg6ZjI6ZmM6YWE6NjA6MWY6MmY6YjQ6ZWI6Yzk6Mzc6YmE6NTM6MmU6NzU6NDkKIyBTSEExIEZpbmdlcnByaW50OiBkZDpmYjoxNjpjZDo0OTozMTpjOTo3MzphMjowMzo3ZDozZjpjODozYTo0ZDo3ZDo3Nzo1ZDowNTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6MmY6N2I6ZGM6ZjE6YTc6YWY6OWU6NmM6ZTY6NzI6MDE6N2Y6NGY6MTI6YWI6Zjc6NzI6NDA6Yzc6OGU6NzY6MWE6YzI6MDM6ZDE6ZDk6ZDI6MGE6Yzg6OTk6ODgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnClJ6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3kKaXRoWnd1RXBwejFZcTNhYXphNTdHNFFOeERBZjh4dWtPQmJyVnNhWGJSMnJzbm55eWhIUzVGL1dCVHhTRDFJZgp4cDRWcFg2K242bFhGbGxWY3E5b2szRENzcnAxbVdwek1wVFJFRVFRTHQrQzh3ZUU1blE3YlhIaUxRd2I3aURWCnlTQWRZeWt0enV4ZVRzaVQrQ0ZobXpUckJjWmU3RnNhdk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU8KREN1M1Q2Y3cyVmJ1eW50ZDQ2M0pUMTdsTmVjeHk5cVRYdHlPajREYXRwR1lRSkI1dzNqSHRySEV0V29ZT0FNUQpqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNk1VU2FNMEMvCkNOZGFTYVRDNXFtZ1o5MmtKN3loVHptMUVWZ1g5eVJjUm85azk4RnBpSGFZZGoxWlhVSjJoNG1YYVhwSThPQ2kKRWh0bW1uVEsza3NlNXc1anJ1YlU3NUtTT3A0OTNBRGtSU1dKdHBwRUdTdCt3SlMwMG1GdDZ6UFp4ZDlMQkFETQpmUnlWdzQvM0liS3lFYmU3Zi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZCnVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkhkTDRtckxaQmRkNTZyRitOUDhtODAwRVJFbHZsRUZEck1jWEsKY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOG9SN0Z3SStpc1g0S0pwbjE1R2t2bUIwdAo5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMgpTVjFFWStDdG5KWVlaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkCitTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2MKZkZxSzFxSTRtZk40aS9STjBpQUwzZ1R1akp0SGdYSU53QlF5N3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYQpzallVZWdieUpMa0pFVkRYQ0xHNGlYcUVJMkZDS2VXanphSWdRZGZSbkdUWjZpYWhpeFRYVEJteVVFRnhQVDlOCmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTjVyNU4KMFhXczBNcjdRYmhEcGFyVHd3VkVUeXcybStMNjRrVzRJMU5zQm05blZYOUd0VXcvYmloYWVTYlNwS2hpbDlJZQo0dTFLaTd3Yi9VZEtEZDluWm42eVcwSFFPK1QwTy9RRVkrbnZ3bFFBVWFDS0tzbk9lTXpWNm9jRUdMUE9yMG1JCnIvT1NtYmF6NW1FUDBvVUE1MUFhNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEKL1lsZHZJVmlIVExTb0N0VTdacFh3ZHY2RU04WnQ0dEtHNDhCdGllVlUraTJpVzFidkdqVUkraUxVYUpXK2ZDbQpnS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UDgyWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwMTkwOTA4NDUzNzU4MjA5MzMwODk0MTM2MzUyNDg3MzE5MzExNwojIE1ENSBGaW5nZXJwcmludDogMWI6MzE6YjA6NzE6NDA6MzY6Y2M6MTQ6MzY6OTE6YWQ6YzQ6M2U6ZmQ6ZWM6MTgKIyBTSEExIEZpbmdlcnByaW50OiBhZjplNTpkMjo0NDphODpkMToxOTo0MjozMDpmZjo0Nzo5ZjplMjpmODo5NzpiYjpjZDo3YTo4YzpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTI6ZjA6ZTE6YzQ6ZTU6OGU6YzY6Mjk6Mjk6MWI6NjA6MzE6N2Y6MDc6NDY6NzE6Yjg6NWQ6N2U6YTg6MGQ6NWI6MDc6Mjc6MzQ6NjM6NTM6NGI6MzI6YjQ6MDI6MzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WCkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTUKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVApFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUgo2RlNTMGdwV3Nhd05KTjNGejBSbmRKa3JONk45STNBQWNieFQzOFQ2S2hLUFMzOFFWcjJmY0hLM1lYL0pTdzhYCnB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaRkd2bm5MT0ZvSUo2ZHE5eGtOZnMvUTM2bkd6NjM3Q0MKOUJSKytiN0VwaTlQZjVsL3RmeG5RM0s5REFEV2lldHJMTlB0ajVnY0ZLdCs1ZU51L05pbzVKSWsya05yWXJoVgovZXJCdkd5MmkvTU9qWnJrbTJ4cG1maDRTREJGMWEzaERUeEZZUHd5bGxFbnZHZkR5aTYyYStwR3g4Y2dvTEVmClpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNloKK3BVWDJud3pWMEU4alZIdEM3WmNyeXhqR3Q5WHlEKzg2VjNFbTY5Rm1lS2pXaVMwdXFsV1BjOXZxdjlKV0w3dwpxUC8wdUszcE4vdTZ1UFFMT3Zub1EwSWVpZGlFeXhQeDJidmhpV0M0akNoV3JCUWRuQXJuY2V2UER0MDlxWmFoClNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTNzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUMKdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQ0dDZTAxYTYweTFEbWEvUk1obkV3NmFiZgpGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41V2RZZ0dxL3lhcGlxCmNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsCndGVFBvQ1dPQXZuOXNLSU45U0NZUEJNdHJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU0KNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVgoyamVEY2h6VGMrQ2lSNWtET0YzVlNYa0FLUnpIN0pzZ0hBY2thVmQ0c2puOE9vU2d0Wng4amI4dWsySW50em5hCkZ4aXV2VHdKYVArRW16elYxZ3NENDFlZUZQZlI2MC9JdlljanQ3WkpRM21GWExycmtndWh4dWhvcUV3V3NScVoKQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpSwpib0hHaGZLcHBDM245S1VrRUVlRHlzMzBqWGxZc1FhYjV4b3EyWjBCMTVSOTdRTkt5dkRiNktrQlB2VldtY2tlCmprazl1K1VKdWVCUFNaSTlGb0pBek14Wnh1WTY3Ukl1YVR4c2xiSDlxaDE3ZjRhK0hnNHlSdnY3RTQ5MWYweUwKUzBaai9nQTBRSERCdzdtaDNhWnc0Z1N6UWJ6cGdKSHFaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYgpRT2hUc2llZFNybkFkeUdOLzRmeTNyeU03eGZmdDBrTDBmSnVNQXNhRGs1MjdSSDg5ZWxXc24yL3gyMEtrNHlsCjBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJTGFaUmZ5SEIKTlZPRkJrcGRuNjI3RzE5MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyNjQ1MDkzNzY0NzgxMDU4Nzg3NTkxODcxNjQ1NjY1Nzg4NzE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjpmZTo2OTpkMTo5MTpiNzoxOTozMzphMzo3MjphODowZjplMTo1NTplNTpiNQojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOjhmOjFiOjU3OjMzOjBkOmJiOmEyOmQwOjdhOjZjOjUxOmY3OjBlOmU5OjBkOmRhOmI5OmFkOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo5MzpjOTpiMDoyZjpkODphYToxMzplMjoxYzozMToyMjo4YTpjYzpiMDo4MToxOTo2NDozYjo3NDo5Yzo4OTo4OTo2NDpiMTo3NDo2ZDo0NjpjMzpkNDpjYjpkMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNqQ0NBOGFnQXdJQkFnSVFBZjF0TVB5anlsR29HN3hrRGpVRExUQU5CZ2txaGtpRzl3MEJBUXdGQURDQgppREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsCmNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlYKQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBdwpNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WCkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNBRW1VWE5nN0Qyd2l6MEt4WERYYnR6U2ZUVEsxUWcySGlxaUJOQ1Mxa0Nkek9pWi9NUGFuczlzL0IKM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmpZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWQp0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGblJnaFJ5NFlVVkQrOE0vNStiSnovCkZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PK1QyM0xMYjIKVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVAo3OXVxL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2CmMwUGxmZzZsWnJFcGZES0VZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVQKWW82MVpzOGxpTTJFdUxFL3BEa1AyUUtlNnhKTWxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bApjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4eWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlClVCOVhWS2crL1hSakw3RlFaUW5tV0VJdVF4cE10UEFsUjFuNkJCNlQxQ1pHU2xDQnN0NitlTGY4WnhYaHlWZUUKSGc5ajF1bGl1dFpmVlM3cVhNWW9DQVFsT2JnT0s2bnlUSmNjQno4TlV2WHQ3eStDRHdJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUZ6VWZBM1A5d0Y5UVpsbERIUEYKVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXRlBGU1BDZUhsQ2p0SHpvQk42SjIvRk5Rd0lTYnhtdE91b3doVDZLTwpWV0tSODJrVjJMeUk0OFNxQy8zdnFPbExWU29HSUcxVmVDa1o3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zCkFUaVVGSlZEQnduN1lLbnVIS3NTaktDYVhxZVlhbGx0aXo4SSs4alJSYThZRldTUUVnOXpLQzdGNGlSTy9GanMKOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNOFdjUgppUXljRTB4eU5OKzgxWEhmcW5IZDRibHNqRHdTWFdYYXZWY1N0a05yLytYZVRXWVJVYytacnV3WHR1aHhrWXplClNmN2ROWEdpRlNlVUhNOWg0eWE3YjZObkpTRmQ1dDBkQ3k1b0d6dUNyK3lEWjRYVW1GRjBzYm1aZ0luL2YzZ1oKWEhsS1lDNlNRSzVNTnlvc3ljZGl5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05LwpxUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5Y0oydmhzRS96Qis0QUx0UlpoOHRTUVpYcTlFZlg3bVJCClZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3c0F2Z25FekRITmI4NDJtMVIwYUIKTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3hRKzZJSGRmRwpqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTIzMDEzODIzNzIwMTk5NDgxNDU2NTY5NzIwNDQzOTk3NTcyMTM0CiMgTUQ1IEZpbmdlcnByaW50OiBmYTo2ODpiYzpkOTpiNTo3ZjphZDpmZDpjOToxZDowNjo4MzoyODpjYzoyNDpjMQojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmNiOmNhOjVkOmIyOmQ1OjJhOjdmOjY5OjNiOjY3OjRkOmU1OmYwOjVhOjFkOjBjOjk1OjdkOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZjpmNDo2MDpkNTo0Yjo5Yzo4NjpkYTpiZjpiYzpmYzo1NzoxMjplMDo0MDowZDoyYjplZDozZjpiYzo0ZDo0ZjpiZDphYTo4NjplMDo2YTpkYzpkMjphOTphZDo3YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBaFdnQXdJQkFnSVFYSXVaeFZxVXhkSnhWdDdOaVlETUpqQUtCZ2dxaGtqT1BRUURBekNCaURFTApNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sCmVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVQKSlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeApNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUCkNrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWcKVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvCkkrZDYxU1J2VThaYTJFdXJ4dFcyMGVaemNhN2RuTllNWWYzYm9Ja0R1QVVVN0ZmTzdsMC80aUd6enZmVWlubmcKbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXpuUE8vTGx4VHNWK3pmVEovaWpUamVYbWpRakJBTUIwRwpBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCSFU2KzRXTUIKenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiVwpSTlp1OVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0IgojIFNlcmlhbDogMTQzNjcxNDgyOTQ5MjI5NjQ0ODA4NTkwMjIxMjU4MDA5Nzc4OTc0NzQKIyBNRDUgRmluZ2VycHJpbnQ6IDIwOmYwOjI3OjY4OmQxOjdlOmEwOjlkOjBlOmU2OjJhOmNhOmRmOjVjOjg5OjhlCiMgU0hBMSBGaW5nZXJwcmludDogNjk6Njk6NTY6MmU6NDA6ODA6ZjQ6MjQ6YTE6ZTc6MTk6OWY6MTQ6YmE6ZjM6ZWU6NTg6YWI6NmE6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOmM5OjQ5OjExOmMyOjk1OjU2Ojc2OmRiOjZjOjBhOjU1OjA5Ojg2OmQ3OjZlOjNiOmEwOjA1OjY2OjdjOjQ0OjJjOjk3OjYyOmI0OmZiOmI3OjczOmRlOjIyOjhjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCNFRDQ0FZZWdBd0lCQWdJUktqaWtISllLQk41Q3NpaWxDK2cwbUFJd0NnWUlLb1pJemowRUF3SXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdU1aNTA0OXNKUTZmTGprWkhBT2tycHJsT1FjSgpGc3Bqc2JtRytJcFh3VmZPUXZwem9mZGxRdjhld1FDeWJuTU8vOGNoNVJpa3F0bHhQNmpVdWM2TUhhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkZTd2U2MUYKdU9KQWYvc0tidnUrTThrOG80VFZNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURja3FHZ0U2YlBBN0RteENHWAprUG9VVnkwRDdPNDgwMjdLcUd4MnZLTGV1d0lnSjZpRkp6V2JWc2FqOGtmU3QyNGJBZ0FYcW1lbUZaSGUrcFRzCmV3djRuNFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNSIKIyBTZXJpYWw6IDMyNzg1NzkyMDk5OTkwNTA3MjI2NjgwNjk4MDExNTYwOTQ3OTMxMjQ0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZjphZDozYjoxYzowMjoxZTo4YTpiYToxNzo3NDozODo4MTowYzphMjpiYzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjI0OmM2OjMwOmNkOmE0OjE4OmVmOjIwOjY5OmZmOmFkOjRmOmRkOjVmOjQ2OjNhOjFiOjY5OmFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5ZjpiYzoxNDo4YTozZDpkMDowZjpkMjo0ZTphMTozNDo1ODpjYzo0MzpiZjphNzpmNTo5Yzo4MTo4MjpkNzo4MzphNToxMzpmNjplYjplYzoxMDowYzo4OToyNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNlNGa2MKOEdJeExjQjZLUDRhcDF5enRzeVg1MFhVV1ByUmQyMURvc0NIWlRRS0gzcmQ2end6b2NXZFRhUnZRWlU0ZjhrZQpoT3ZSbmttU2g1U0hERHFGU21hZm5WbVRUWmRoQm9aS28wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUkKS29aSXpqMEVBd01EYUFBd1pRSXhBT1ZwRXNsdTI4WXh1Z2xCNFpmNCsvMmE0bjBTeWUxOFpOUExCU1dMVnRtZwo1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJN3lGejlTTzhOZENLb0NPSnV4VW5PCnh3eThwMkZwOGZjNzRTckwrU3Z6WnBBMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMDAwMzAwMQojIE1ENSBGaW5nZXJwcmludDogMGI6NDY6Njc6MDc6ZGI6MTA6MmY6MTk6OGM6MzU6NTA6NjA6ZDE6MGI6ZjQ6MzcKIyBTSEExIEZpbmdlcnByaW50OiBkODplYjo2Yjo0MTo1MTo5Mjo1OTplMDpmMzplNzo4NTowMDpjMDozZDpiNjo4ODo5NzpjOTplZTpmYwojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NGY6YjA6Yjk6NWE6Yjg6YjM6MDA6MzI6ZjQ6MzI6Yjg6NmY6NTM6NWY6ZTE6NzI6YzE6ODU6ZDA6ZmQ6Mzk6ODY6NTg6Mzc6Y2Y6MzY6MTg6N2Y6YTY6ZjQ6MjgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lFQUppaU9UQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN6TUI0WERURXpNVEV4TkRFeE1qZzBNbG9YCkRUSTRNVEV4TXpJek1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNekNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMNHlvbFFQCmNQc3NYRm5yYk1Ta1VlaUZLclBNU2pUeXNGL3pEc2NjUFZNZWlBaG8yRzg5cmNLZXpJSm5CeWVIYUhFNm4zV1cKSWtZRnNPMnR4MXVlS3Q2Yy9EckdsYWYxRjJjWTV5OUpDQXhjeitiTU5PMTQrMUN4M0dzeThLTCt0anprN0ZxWAp4ejhlY0Fnd29OekZzMjF2MElKeUVhdlNnV2haZ2hlM2VKSmcrc3plUDRUcmpUZ3prQXB5SS9vMXpDWnhNZEZ5CktKTFpXeU50WnJWdEIwTHJwalBPa3R2QTlteGplTTNLVGoyMTVWS2I4YjQ3NWxSZ3NHWWVDYXNIL2xTSkVVTFIKOXlTNllIZ2FtUGZKRWYwV3dUVWFWSFh2UTlQbHJrN081M3ZEeGs1aFVVdXJta1ZMb1I5QnZVaFRGWEZrQzRhego1UzYrenFRYndTbUVvclhMQ0NOMlF5SWtIeGNFMUc2Y3h2eC9LMllhN0lybDFzOU45V01KdHhVNTFudXM2K044CjZVNzhkVUxJN1ZpVkRBWkNvcHozNUhDejMzSnZXamRBaWRpRnBOZnhDOTVER2RSS1dDeU1pam1ldjRTSDhSWTcKTmd6cDA3VEtiQmxCVWdtaEhiQnF2NEx2Y0ZFaE10d0Zkb3pMOTJUa0ExQ3ZqSkZucThYeTdsalkzcjczNXpIUApiTWs3Y2NIVmlMVmx2TURvRnhjSEVyVmMwcXNnazdUbWdvTndOc1hObzQydGkreWp3VU9INWtQaU5MNlZpelh0CkJ6bmFxQjE2bnphZUVyQU1aUktRRldEWkprQkU0MVpncFJEVWFqejlRZHdPV2tlMjc1ZGhkVS9aL3NleUhkVHQKWFVtenFXckxab1FUMVZ5ZzNOOXVkd2JSY1hYSVYyK3ZEM2RiQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSVXJmckhrbGV1eWpXY0xoTDc1THBkCklOeVVWekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBTUptZEJUTElYZzQ3bUFFNmlxVG5CL2Q2K09lYTMxQkQKVTVjcVBjbzhSNWd1NFJWNzhaTHpZZHFRSlJabHdKOVVYUTRETzF0M0FweUV0ZzJZWHpUZE8yUEN3eWlCd3B3cApMaW5peU1NQjhqUHFLcXJNQ1FqM1pXZkd6ZC9UdGl1bnZjelJEbkJmdUNQUnk1Rk9DdlRJZXVYWll6YkIxTi84CklwZjNZRjNxS1M5WXNyMVl2WTJXVHhCMXYwaDdQVkdIb1R4MElzTDhCMytBM01Tcy9tckJjREN3Nlk1cDRpeHAKZ1pRSnV0MytUY0NEakpSWXdFWWdyNXdmQXZnMVZVa3ZSdFRBOEtDV0FnOHp4WEh6bmlOOWxMZjlPdE1KZ3dZaAovV0E5cmpMQTB1Nk5wdkRudElKOENzeHd5WG1BK1A1TTl6V0VHWW94K3dyWjEzK2I4S0thYThNRlN1MUJZQlF3CjBhb1JRbTdUSXdJRUM4WmwzZDFTZDlxQmE3S28rZ0U0dVpicUtteG5sNG1VbnJ6aFZOWGthbmp2U3Iwcm1qMUEKZnNiQWRkSnUrMmd3N095TG5mbEpOWm9hTE5temxUblZIcEwzcHJsbEwrVTliVHBJVEFqYzVDZ1NLTDU5TlZ6cQo0QlorRXh0cTF6N1hudnd0ZGJMQkZOVWpBOXRiYndzK2VDOE4zak9ORnJkSTU0T2FnUTk3d1VOTlZRUVhPRXBSCjFWbWlpWFRUbjc0ZVM5ZkdiYmVJSkc5Z2thU0NoVnRXUWJ6UVJLdHFFNzdSTEZpM0VqTllzamRqM0JQMWxCMC8KUUZIMVQvVTY3Y2pGNjhJZUhSYVZlc2QrUW5HVGJrc1Z0ekRmcXUxWGhVaXNIV3JkT1duazRYbDR2czRGdjZFTQo5NEI3SVdjbk1Gaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIgojIFNlcmlhbDogMTAwMDAwMTMKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjA2OmFmOjdiOmU4OjFhOmYxOjlhOmI0OmU4OmQyOjcwOjFmOmMwOmY1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogNzY6ZTI6N2U6YzE6NGY6ZGI6ODI6YzE6YzA6YTY6NzU6YjU6MDU6YmU6M2Q6Mjk6YjQ6ZWQ6ZGI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRkOjI0OjkxOjQxOjRjOmZlOjk1OjY3OjQ2OmVjOjRjOmVmOmE2OmNmOjZmOjcyOmUyOjhhOjEzOjI5OjQzOjJmOjlkOjhhOjkwOjdhOmM0OmNiOjVkOmFkOmMxOjVhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY0RDQ0ExaWdBd0lCQWdJRUFKaVdqVEFOQmdrcWhraUc5dzBCQVFzRkFEQllNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNrd0p3WURWUVFERENCVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnUlZZZ1VtOXZkQ0JEUVRBZUZ3MHhNREV5TURneE1URTVNamxhRncweQpNakV5TURneE1URXdNamhhTUZneEN6QUpCZ05WQkFZVEFrNU1NUjR3SEFZRFZRUUtEQlZUZEdGaGRDQmtaWElnClRtVmtaWEpzWVc1a1pXNHhLVEFuQmdOVkJBTU1JRk4wWVdGMElHUmxjaUJPWldSbGNteGhibVJsYmlCRlZpQlMKYjI5MElFTkJNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTQ4ZCtpZmtrU3pyUwpNNE0xTEduczNBbWs0MUdvSlN0NXVBZzk0Skc2aElYR2hhVEs1c2t1VTZUSkpCNzlWV1p4WFN6RllHZ0V0OW5DClVpWTRpS1RXTzBDbXdzMC96WmlUczFRVVdKWlYxVkQraHEya1kzOWNoL2FPNWllU1p4ZVNBZ01zM05abWRPM2QKWi8vQllZMWpUdytiYlJjd0p1K3IwaDhRb1BuRmZ4WnBnUU5IN1I1b2pYS2hUYklteHJwc1gyM1dyOUd4RTQ2cApyZk5lYVhVbUdENUJLeUYvN290ZEJ3YWRROFFwQ2l2OEtqNkd5enlET3ZuSkRkckZtZUs4ZUVFemR1Ry9MMTNsCnBKaFFEQlhkNFBxY2Z6aG8wTEttZXFmUk1iMStpbGduUTdPNk01SFRwNWdWWEpybTB3OTEyZnhCbUpjK3FpWGIKajVJdXNIc01YL0ZqcVRmNW0zVnBUQ2dtSmRyVjhoSndSVlhqMzNOZU4vVWhiSkNPTlZySjB5UHIwOEMrZUt4QwpLRmhtcFVadGNBTFhFUGxMVlB4ZGhrcUh6My9LUmF3UldyVWdVWTB2aUVlWE9jRFB1c0JDQVVDWlNDRUxhNmZTCi9aYlYwYjVHblVuZ0M2YWdJazQ0ME1FOE1MeHdqeXgxek5ERmpGRTdQWlFJWkNaaGZibkRaWThVbkNIUXF2MFgKY2dPUHZadU01bDVUbnJtZDc0Szc0YnppY2tGYklaVFRSVGVVMGQ4Sk9WM25JNnFhSGNwdHFBcUdoWXFDdmtJSAoxdkk0Z25QYWgxdmxQTk9lUHFjN252UURzL254ZlJOMEF2KzdvZVg2QUhrY3BtWkJpRnhnVjZZdUNjUzYvWnJQCnB4OUF3N3ZNV2dwVlN6czRkbEc0WTR1RWxCYm1Wdk1DQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlA2ckFKQ1luaVQ4cWN3YWl2c251TDh3YnFnNwpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURQZHl4dVZyNU9zN2FFQUpTclI4a04wbmJIaHA4ZEI5TzJ0THNJCmVLOXAwZ3RKM2pQRnJLM0NpQUo5QnJjMUFzRmd5Yi9FNkpUZTFOT3BFeVZhL202aXJuMEYzSDN6YlBCK3BvM3UKMmRmT1dCZm9xU211YzBpSDU1dktiaW1oWkY4WkUvZXVCaEQvVWNhYlRWVWxUNU9aRUFGVGRmRVR6c2VtUVVIUwp2NGlsZjBYOHJMaWx0VE1NZ3NUN0IvWnE1U1dFWHdiS3dZWTVFZHRZelhjN0xNSk1EMTZhNC9DclBtRWJVQ1RDCndQVHhHZkFSS2JhbEdBS2IxMk5NY0l4SG93TkRYTGxkUnFBTmIvOVpqcjdkbjNMRFd5dmZqRnZPNVF4R2JKS3kKQ3FOTVZFSVlGUklZdmRyOHVuUnUvOEcyb0dUWXFWOVZycDljYW5hVzJITm5oL3ROZjF6dWFjcHpFUHVLcWYyZQp2VFk0U1VtSDlBNFU4T21IdUQrblQzcGFqbm5VaytTN2FGS0VyR3pwODVod1ZYSXkrVFNySzBtMXpTQmk1RHA2CloyT3JsdHh0cnBmcy9KOTJWb2d1WnM5YnRzbWtzTmNGdXVFbkw1TzdKaXFpazdBYjg0NitIVUNqdVRhUFBvSWEKR2w2STZsRDRXZUtEUmlrTDQwUmM0WlcyYVpDYUZHK1hyb0hQYU8rWm1yNjE1K0YvK1BvVFJ4Wk16RzBJUU9lTAplRzlRZ2tSUVAyWUdpcXREaEZaS0R5QXRoZzcxMHR2U2VvcEx6YVhvVHZGZUppVUJXU09nZnRMMmZpRlgxeWU4CkZWZE1wRWJCNElNZURFeE5IMDhHR2VMNXFQUTZncUd5ZVVONTFxMXZlaWVRQTZUcUpJYy8yYjNaNmZKZlVFa2MKN3V6WExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjAwMDM4Nzc3OTY4Mzk0MjYKIyBNRDUgRmluZ2VycHJpbnQ6IGIzOjNlOjc3OjczOjc1OmVlOmEwOmQzOmUzOjdlOjQ5OjYzOjQ5OjU5OmJiOmM3CiMgU0hBMSBGaW5nZXJwcmludDogZGY6NzE6N2U6YWE6NGE6ZDk6NGU6Yzk6NTU6ODQ6OTk6NjA6MmQ6NDg6ZGU6NWY6YmM6ZjA6M2E6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVkOjU2OjQ5OjliOmU0OmQyOmUwOjhiOmNmOmNhOmQwOjhhOjNlOjM4OjcyOjNkOjUwOjUwOjNiOmRlOjcwOjY5OjQ4OmU0OjJmOjU1OjYwOjMwOjE5OmU1OjI4OmFlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnUKVkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRneE1qSXpXaGNOTXpRdwpNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3CkpRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkaE5sVAozUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVCitlaGNDdXovbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3AKUzBsNFBKTmdpQ0w4bWRvMnlNS2kxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMQpiVm9FL2M0MHlpVGNkQ01iWFRNVEVsM0VBU1gyTU4wQ1haL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpClQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsM1pCV3p2dXJwV0NkeEozNVVyQ0wKdllmNWp5c2pDaU4yTy9jejRja0E4Mm41UzZMZ1RyeCtrem1FQi9kRWNINytCMXJsc2F6UkdNenlOZVZKU1FqSwpWc2s5K3c4WWZZczd3UlBDVFkvSlR3NDM2UitoRG1yZllpN0xOUVpSZVN6SUpUajAra3VuaVZ5YzB1TU5PWVpLCmRIelZXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFQKYytYdnZxRHRNd3QwdmlBZ3hHZHM4QWdEZWxXQWYwWk9scWYwSGo3aDl0Z0o0VE5rSzJQWE1sNmYrY0I3RDNodgpsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4dXVGdWNBUzZUNkM2YU1ONy96SHdjejA5bENxeEMwRU9vUDVOCmlHVnJlVE8wMXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVTdVUVp3TlB3Qm92dXBIdStRdWNtVk1pT05uWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICjZvaTZtWXRRbE5lQ2dOOWhDUUNUclEwVTVzN0I4amVVZUxCZm5MT2ljN2lQQlpNNHpZMCtzTGo3d00reDh1d3QKTFJ2TTdLcWFzNnBnZ2hzdE84T0VQVmVLbGg2Y2RialRNTTFnQ0lPUTA0NVU4VTFtd0YxMEEwQ2o3b1Yrd2g5MwpuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnRvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzCit3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVllqemxWWUEyMTFRQy8vRzVYYzdVSTIvWVJZUksKVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYZmV1K2gxc1hJRlJSazBwVApBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm9rVExxCmwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEcKNGlaWlJIVWUyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWgptVWxPK0tXQTJ5VVBIR05paXNreloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBCjcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMTk3NjE1Njg0MzkzMzY5OAojIE1ENSBGaW5nZXJwcmludDogMzc6MDY6YTU6YjA6ZmM6ODk6OWQ6YmE6ZjQ6NmI6OGM6MWE6NjQ6Y2Q6ZDU6YmEKIyBTSEExIEZpbmdlcnByaW50OiBiYToyOTo0MTo2MDo3Nzo5ODozZjpmNDpmMzplZjpmMjozMTowNTozYjoyZTplYTo2ZDo0ZDo0NTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogMzA6ZDA6ODk6NWE6OWE6NDQ6OGE6MjY6MjA6OTE6NjM6NTU6MjI6ZDE6ZjU6MjA6MTA6YjU6ODY6N2E6Y2E6ZTE6MmM6Nzg6ZWY6OTU6OGY6ZDQ6ZjQ6Mzg6OWY6MmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk4KTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdQpWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRjMU16TXlXaGNOCk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjAKTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHlQNG83CmVrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3kKUkJiMDZ0RDZIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sUwpiZHNIeW8rMVcvQ0Q4MC9ITGFYSXJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGCi9ZVExOaUNCV1MyYWIyMUlTR0hLVE45VDBhOVN2RVNmcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IKM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1NtSnhaWm9ZK3JmR3d5ajRHRDN2dwpFVXMzb0VSdGU4dW9qSEgwMWJXUk5zendGY1lyM2xFWHNaZE1VRDJ4bFZsOEJYMHRJZFVBdndGbm9sNTdwbHp5Cjl5THhrQTJUMjZwRVVXYk1mWFlENjJxb0tqZ1psM1lOYTRwaCtiejI3bmI5Y0N2ZEtUejRDaDViUWh5TFZpOVYKR3h5aExyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWgoyZmpYY3RzY3ZHMjlaVi92aURVcVppL3U5ck5sOERPTmZKaEJhVVlQUXh4cCtwdTEwR0ZxemNwTDJVeVFScXNWCldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUw0ak05ZjlvWlJPUmljc1BmSXNieVZ0VGRYNVZ5N1cxZjkwZ0QKVy8zRktxRDJjeU9FRUJzQjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU0M0hnbnRpblF0bmJjWkZybEpQcnc2UFJGS013RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKdDJvZElGZmxBV0pCRjlNSjIzWExibFNRZGY0YW40RUt3dDNYOXduUVczSVY1QjRKYWowejh5R2E1aFYrclZIVgpEUkR0ZlVMQWorN0FtZ2pWUWRaY0RpRnBib0JoRGhYQXVNL0ZTUkpTekw0NnpOUXVPQVhlTmYwZmI3aUFhSmc5ClRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdEd0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEcKbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0bTYvbjZKOTFlRXlyUmp1YXpyOEZHRjFORlR3VwptaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXhOUkY0ZUtMZzZUQ01mNERmCldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNE1objUKK2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSgp0c2hxdURESWFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBCkdhUWRwL2xMUXpmY2FGcFB6K3ZDWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnYKOFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEzV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAxMjQ2OTg5MzUyCiMgTUQ1IEZpbmdlcnByaW50OiA0YjplMjpjOTo5MTo5Njo2NTowYzpmNDowZTo1YTo5Mzo5MjphMDowYTpmZTpiMgojIFNIQTEgRmluZ2VycHJpbnQ6IDhjOmY0OjI3OmZkOjc5OjBjOjNhOmQxOjY2OjA2OjhkOmU4OjFlOjU3OmVmOmJiOjkzOjIyOjcyOmQ0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MzpkZjo1Nzo3NDpiMDozZTo3ZjplZjo1ZjplNDowZDo5MzoxYTo3YjplZDpmMTpiYjoyZTo2Yjo0Mjo3Mzo4Yzo0ZTo2ZDozODo0MToxMDozZDozYTphNzpmMzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwCmNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXMKSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WegpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdIaGNOTURrd056QTNNVGN5Ck5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnUKZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dApkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwCmFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUC92YUNlYjl6WVFZS3BTZllzMS9UClJVNGNjdFpPTXZKeWlnLzNneG5RYW9DQUFFVWVzTWZubXI4U1Z5Y2NvMmd2Q29lOWFtc09YbVh6SEhmVjFJV04KY0NHMHN6TG5pNkxWaGprQ3NialNSODdreVVuRU82ZmUrMVI5Vjc3dzZHN0NlYkk2QzFYaVVKZ1dNaE5jTDNoVwp3Y0tVcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xClUxK2NQdlFYTE9acHJFNHlUR0ozNnJmbzViczB2Qm1McnB4UjU3ZCt0Vk94TXlMbGJjOXdQQnI2NHB0bnRvUDAKamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFjaVo2MEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWVaOGRsc2EyZVQ4aWpZZlRod01FWUdwcm1pNVppWE1SckVQUjlSUC8KalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgpSa2Z6Ni9kandVQUZRS1hTdC9TMW1qYS9xWWgyaUFSVkJDdWNoMzhhTnp4K0xhVWEyTlNKWHNxOXJEMXMyRzJ2CjFmTjJEODA3aURnaW5XeVRtc1E5djRJYlpUK21EMTJxL09XeUZjcTFyY2E4UGRDRTZPb0djckJOT1RKNHZ6NFIKbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArdkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSApWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE9lNHBJYjR0RjlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEiCiMgU2VyaWFsOiA1MTU0MzEyNDQ4MTkzMDY0OTExNDExNjEzMzM2OQojIE1ENSBGaW5nZXJwcmludDogYjY6N2U6MWQ6ZjA6NTg6YzU6NDk6NmM6MjQ6M2I6M2Q6ZWQ6OTg6MTg6ZWQ6YmMKIyBTSEExIEZpbmdlcnByaW50OiAyMDpkODowNjo0MDpkZjo5YjoyNTpmNToxMjoyNTozYToxMTplYTpmNzo1OTo4YTplYjoxNDpiNTo0NwojIFNIQTI1NiBGaW5nZXJwcmludDogMDI6ZWQ6MGU6YjI6OGM6MTQ6ZGE6NDU6MTY6NWM6NTY6Njc6OTE6NzA6MGQ6NjQ6NTE6ZDc6ZmI6NTY6ZjA6YjI6YWI6MWQ6M2I6OGU6YjA6NzA6ZTU6NmU6ZGY6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0cKQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCMwpkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1CmRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXEKUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1JVTXhNQjRYRFRFeQpNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEClZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdWJtVjAKTDJ4bFoyRnNMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE1pQkZiblJ5ZFhOMExDQkpibU11SUMwZwpabTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVWRE1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWkKQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHlBc1dmb1BaYjFZc0dHWVpQVXhCdApCeVFub2FENDFVY1pZVXg5eXBNbjZuUU03MitXQ2Y1ajdIQmROcTFuZDY3Sm5YeFZSRHFpWTFFZjllTmkxS2xICkJ6N01JS05DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQwpSOThjcmxPWkY3WnZISDNodnhHVTBRT0lkZVNOaWFTS2QwYmViV0h2QXZYN3RkL00vazcvL3FubXB3SXdXNW5YCmhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDhrbWh0Yzlodkpxd2hBcmladHlaQld5VmdydEJJR3U0RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDRkNBIEVWIFJPT1QiCiMgU2VyaWFsOiA0MDc1NTUyODYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OmUxOmI2OmVkOjI2OjdhOjdhOjQ0OjMwOjMzOjk0OmFiOjdiOjI3OjgxOjMwCiMgU0hBMSBGaW5nZXJwcmludDogZTI6Yjg6Mjk6NGI6NTU6ODQ6YWI6NmI6NTg6YzI6OTA6NDY6NmM6YWM6M2Y6Yjg6Mzk6OGY6ODQ6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOmMzOmQ3OjhlOjRlOjFkOjVlOjQ1OjU0OjdhOjA0OmU2Ojg3OjNlOjY0OmY5OjBjOmY5OjUzOjZkOjFjOmNjOjJlOmY4OjAwOmYzOjU1OmM0OmM1OmZkOjcwOmZkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJRUdFck0xakFOQmdrcWhraUc5dzBCQVFzRkFEQldNUXN3Q1FZRFZRUUdFd0pEClRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlBUMVF3SGhjTk1USXdPREE0TURNd056QXhXaGNOTWpreApNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqCmFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlAKVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WQlUwMwpzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMClRJcFRVbnJEN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUKL1pPa1ZJQk1VdFJTcXk1SjM1RE51RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncAo3aFpaTERSSkdxZ0cxNmlJMGdOeWVqTGk2bWhOYml5V1pYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6CkVwUi8zOHdtbnZGeVhWQmxXWTlwczRkZU1tL0RHSXExbFkrd2VqZmVXa1U3eHpiaDcyZlJPZE9YVzNOaUdVZ3QKaHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWZweTI1SUd2UAphOTMxRGZTQ3QvU3laaTRRS1BhWFdudVdGbzhCR1Mxc2JuODVXQVprZ3dHRGc4Tk5rdDB5eG9la04ra1d6cW90CmFLOEtnV1U2Y01HYnJVMXRWTW9xTFV1Rkc3T0E1bkJGRFd0ZU5mQi9PN2ljNUFSd2lSSWxrOW9LbVNKZ2FtTmcKVG5ZR21FNjlnNjBkV0lvbGhkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVgpQS1B0bDhNZU5QbzQrUWdPNDhCZEs0UFJWbXJKdHFoVVV5NTRNbWM5Z245MDBQdmh0Z1ZndVhEYmpndjVFMWh2CmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWZCZ05WSFNNRUdEQVdnQlRqL2kzOUtOQUwKdGJxMm9zUy9CcW9GakpQN0x6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZApCZ05WSFE0RUZnUVU0LzR0L1NqUUM3VzZ0cUxFdndhcUJZeVQreTh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlQKZWovdFV4UFE0aTlxZWNzQUl5am1IamRYTlltRXduWlBORGF0WjhQT1FRYUl4ZmZ1MkJxNDFndC9VUCtUcWhkTApqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWE0Q1VxbXR6SFFUYjN5SFFGaERtVk9kWUxPNlFuK2dqWVhCNzRCR0JTCkVTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzR0U1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXkKUDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYQkRyRE1sSTFEbGI0cGQxOQp4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam5hSDlkCkNpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE4KNW15ZExJaHlQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZQovdjVXT2FISXoxNmVHV1JHRU5vWGtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaCkFBb0FDeEdWMmxaRkE0Z0tuMmZRMVhteHFJMUFiUTNDZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdloKNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgU3ViamVjdDogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBMYWJlbDogIlRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSIKIyBTZXJpYWw6IDE1NjIzMzY5OTE3MjQ4MQojIE1ENSBGaW5nZXJwcmludDogZGE6NzA6OGU6ZjA6MjI6ZGY6OTM6MjY6ZjY6NWY6OWY6ZDM6MTU6MDY6NTI6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjNDoxODpmNjo0ZDo0NjpkMTpkZjowMDozZDoyNzozMDoxMzo3Mjo0MzphOToxMjoxMTpjNjo3NTpmYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6MzU6MWI6OTA6MzQ6NDQ6YzE6ODU6Y2M6ZGM6NWM6Njk6M2Q6MjQ6ZDg6NTU6NWM6YjI6MDg6ZDY6YTg6MTQ6MTM6MDc6Njk6OWY6NGE6ZjA6NjM6MTk6OWQ6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVKekNDQXcrZ0F3SUJBZ0lIQUk0WC9pUWdnVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUUKQmhNQ1ZGSXhEekFOQmdOVkJBY01Ca0Z1YTJGeVlURk5NRXNHQTFVRUNneEVWTU9jVWt0VVVsVlRWQ0JDYVd4bgphU0RFc0d4bGRHbkZuMmx0SUhabElFSnBiR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnClFTN0ZuaTR4UWpCQUJnTlZCQU1NT1ZURG5GSkxWRkpWVTFRZ1JXeGxhM1J5YjI1cGF5QlRaWEowYVdacGEyRWcKU0dsNmJXVjBJRk5oeEo5c1lYbkVzV1BFc1hQRXNTQklOVEFlRncweE16QTBNekF3T0RBM01ERmFGdzB5TXpBMApNamd3T0RBM01ERmFNSUd4TVFzd0NRWURWUVFHRXdKVVVqRVBNQTBHQTFVRUJ3d0dRVzVyWVhKaE1VMHdTd1lEClZRUUtERVJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzgKZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakZDTUVBR0ExVUVBd3c1Vk1PY1VrdFVVbFZUVkNCRgpiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeElFZzFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwQ1VaNFdXZTYwZ2hVRW9JNVJId1dyb20KLzROWnprUXFMLzdoem1BRC9JMERwZTMvYTZpNnpEUUduMWsxOXV3c3U1MzdqVkpwNDV3bkVGUHpwQUxGcC9rUgpHbWwxYnNNZGk5R1lqWk9IcDNHWERTSEhtZmxTMHl4alhWVzg2QjhCU0xsZy9rSks5c2lBcnMxbWVwNUZpbWgzCjRraG9uNkxhOGVIQkVKL3JQQ21CcCtFeUNOU2dCYkdNKzQyV0FBNCtKZDlUaGlJNy9QUzk4d2wrZCt5RzZ3OHoKNVVOUDlGUjFiU21aTG1aYVE5L0xYTXJJNVRqeGZqczFuUS8weFZxaHpQTWdnQ1RUVit3VnVuVWxtK2hrUzdNMApoTzhFdVBiSmJLb0NQclpWNGpJM1gveG1sMS9OMXA3SElMOU54cXcvZFY4YzdUS2NmR2tBYVpIakl4aFQ2UUlECkFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVZwa0hIdE9zREdsa3RBeFFSOTVETEw0Z3dQc3dEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSjVGZG5zWApTREx5T0lzcHZlNldTazZCR0xGUlJ5RE4wR1N4RHNuWkFka0p6c2laM0dnbEU5UmM4cVBvQlA1eUNjY0xxaDBsClZYNldtbGUzdXNVUmVobm1wMzQ5aFE3MStTNHBMK2Y1YkZnV1YxQWw5ajR1UHFydGQzR3FxcG1XUmdxdWp1d3EKVVJhd1hzM3Fad1FjV0REMVlJcTlwcjFONVphMC9FS0pBV3YyY01oUU9Rd3QxV2JaeU5Lek1yY2JHVzNMTS9uZgpwZVlWaERmd3d2SmxscEtRZC9DdDlKRHBFWGpYazRuQVBRdTZLZlRvbVoxeWp1MmRMKzZTZmFIeC8xMjZNMkNGCll2NEhBcUdFVmthK2xncWFFOWNoVExkOEI1OU9UaitSZFBzbm5SSE0zZWF4eW5GTkV4YzVKc1VwSVN1VEtXcVcKK3F0QjRVdTJOUXZBbXhVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgU3ViamVjdDogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgTGFiZWw6ICJDZXJ0aW5vbWlzIC0gUm9vdCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDE0OjBhOmZkOjhkOmE4OjI4OmI1OjM4OjY5OmRiOjU2OjdlOjYxOjIyOjAzOjNmCiMgU0hBMSBGaW5nZXJwcmludDogOWQ6NzA6YmI6MDE6YTU6YTQ6YTA6MTg6MTE6MmU6Zjc6MWM6MDE6Yjk6MzI6YzU6MzQ6ZTc6ODg6YTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJhOjk5OmY1OmJjOjExOjc0OmI3OjNjOmJiOjFkOjYyOjA4Ojg0OmUwOjFjOjM0OmU1OjFjOmNiOjM5Ojc4OmRhOjEyOjVmOjBlOjMzOjI2Ojg4OjgzOmJmOjQxOjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa2pDQ0EzcWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SkdVakVUCk1CRUdBMVVFQ2hNS1EyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEhUQWIKQmdOVkJBTVRGRU5sY25ScGJtOXRhWE1nTFNCU2IyOTBJRU5CTUI0WERURXpNVEF5TVRBNU1UY3hPRm9YRFRNegpNVEF5TVRBNU1UY3hPRm93V2pFTE1Ba0dBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14CkZ6QVZCZ05WQkFzVERqQXdNRElnTkRNek9UazRPVEF6TVIwd0d3WURWUVFERXhSRFpYSjBhVzV2YldseklDMGcKVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOVE1DUW9zUDVMMgpmeFNlQzV5YWFoMUFNR1Q5cXQ4T0hnWmJuMUNGNnMyTnEwTm4zckQ2Zm9DV25vUjRra2pXNHpudXp1UlpXSmZsCkxpZVk2cE9vZDV0SzhPOTBnQzNyTUIrMTJjZUFuR0lua1lqd1NvbmQzSWptRlBuVkF5Ly9sZHU5bit3cytoUVYKV1pVS3hrZDhhUmk1cHdQNXluYXB6OGR2dEY0Ri91N0JVckoxTW9mczdTbG1PL05LRm9MMjFwcmJjcGpwM3ZERgpUS1dydGVvQjRvd3VaSDlrYi8yakpaT0x5S0lPU1kwMDhCL3NXRVV1TktxRVVMM25za29UdUxBUHJqaGRzS2tiCjVuUEpXcUhaWmtDcXFVMm1OQUt0aEg2eUk4SDdLc1puOURTMnNKVnFNMDl4UkxXdHdIa3ppT0MvN2FPZ0ZMU2MKQ2JBSzQyQysrUGhtaU0xYjhYY0Y0TFZ6YnNGOVJpNk9TeWVtelRVSy9lVk5mYW9xb3luSFdtZ0U2T1hXazZSaQp3c1htOUUvRytaOGFqWUpKR1lyS1dVTTY2QTB5d2ZSTUV3TnZicVkva1hQTHluTnZFaUNMN3NDQ2VONUxMc0pKCnd4M3RGdllrOUNjYlhGY3gzRlh1cUI1dmJLemlSY3hYVjRwMVZ4bmd0VmlaU1RZeFBETUJiUlpLemJncWc0U0cKbS9sZzBoOXRrUVBUWUtiVlBacmRkNUE5TmFTZkQxNzFVa1JwdWNDNjNNOTkzM3paeEt5R0lqSzhlMnVSNzNyNApGMml3NGxOVllDMnZQc0tEMk5rSksvREFaTnVIaTVITWtlc0UvWGEwbFpybUZBWWIxVFFkdnRqL2RCeFRoWm5nCldWSktZZTJJbm10SmlVWitJRnJaNTBybGF1N1NaUkZEQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMAoyVEFmQmdOVkhTTUVHREFXZ0JUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMDJUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBZmoxVTJpSmRHbGcrTzFRbnVyck15T01hYXVvKytSTHJWbDg5VU03ZzZrZ21Kczk1Vm42UkhKay8KMEtHUkhDd1BUNWlWV1ZPOTBDTFlpRjJjTi96N1pNRjRqSXVhWUFucTFmb2hYOUIwWmVkUXhiOHV1UXNMcmJXdwpGNllTak5SaWVPcFdhdXdLMGtERFBBVXdQazJVdDU5S0E5TjlKMHUyL2tUTytoa3pHbTJrUXRIZHpNakkxeFpTCmcwODFsTE1TVlgzbDRrTHI1SnlUQ2NCTVd3ZXJ4MjBSb0ZBWGxDT290UXFTRDdKNndXQXNPTXdhcGx2LzhnemoKcWg4YzNMaWdreWZlWStOL0laODY1Wjc2NEJOcWRldVdYR0tSbEk1blU3YUorQklKeTI5U1d3TnlobENWQ05TTgpoNFlWSDVVazJLUnZtczZrblp0dDBySjJCb2JHVmdqRjZ3bmFOc0liVzBHK1lTcmpjT2E0cHZpMldzUzlJZmYvCnFsK2hiSFk1WnRicVRGWGhBRE9iRTVoanlXL1FBU0FKTjFMbkRFOCt6YnoxWDVZbnB5QUNsZUF1NkFkQkJSOFYKYnRhdzVCbmdEd0tUQUNkeXhZdlJWQjlkU3NOQWwzNVZwbnpCTXdRVUFSMUpJR2tMR1pPZGJsZ2k5MEFNUmd3agpZL001MG45MlVhZjB5S0h4REhZaUkwWlNLUzNpbzBFSFZtbVkwZ1VKdkduSFdtSE5qNEZnRlUyQTNaRGlmY1JRCjhvdzdia3JIeHVhQUt6eUJ2QkdBRmhBbjEvRE5QM25NY3lyRGZsT1IxbTc0OWZQSDBGRk5qa3VsVytZWkZ6dlcKZ1FuY0l0enVqcm5FajFQaFo3c3p1SWdWUnMvdGFUWC9kUTFHODg1eDRjVnJoa0lHdVVFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EiCiMgU2VyaWFsOiAxNTc3Njg1OTU2MTY1ODg0MTQ0MjIxNTkyNzg5NjY3NTA3NTc1NjgKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmViOmI5OjYxOjI4OjJlOmI3OjJmOjk4OmIwOjM1OjI2OjkwOjk5OjUxOjFkCiMgU0hBMSBGaW5nZXJwcmludDogMGY6Zjk6NDA6NzY6MTg6ZDM6ZDc6NmE6NGI6OTg6ZjA6YTg6MzU6OWU6MGM6ZmQ6Mjc6YWM6Y2M6ZWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZiOjljOjA4OmU4OjZlOmIwOmY3OjY3OmNmOmFkOjY1OmNkOjk4OmI2OjIxOjQ5OmU1OjQ5OjRhOjY3OmY1Ojg0OjVlOjdiOmQxOmVkOjAxOjlmOjI3OmI4OjZiOmQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdFRDQ0FwMmdBd0lCQWdJUWRyRWdVblR3aFlkR3MvZ2pHdmJDd0RBTkJna3Foa2lHOXcwQkFRc0ZBREJ0Ck1Rc3dDUVlEVlFRR0V3SkRTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWcKUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aQpZV3dnVW05dmRDQkhRaUJEUVRBZUZ3MHhOREV5TURFeE5UQXdNekphRncwek9URXlNREV4TlRFd016RmFNRzB4CkN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRFZRUUxFeGxQU1ZOVVJTQkcKYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzYjJKaApiQ0JTYjI5MElFZENJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyQmUzCkhFb2tLdGFYc2NyaUh2dDlPTytZOWJJNW1FNG51QkZkZTlJbGxJaUNGU1pxR3pHN3FGc2hJU3ZZRDA2Zld2R3gKV3VSNTFqSWpLK0ZUekpsRlhIdFByYnkvaDBvTFM1ZGFxUFpJN0gxN0RjMGhCdCtlRmYxQmlraTNJUFNoZWh0WAoxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sazkrSEtRVVlPS1hIUXVTUDh5WUZmVHZkdjM3K0VyWE5rCnU3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvUW5jL25TTWJzclk5Z0JRSFRDNVAKOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmdHVXB1dXk5cgpNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUIKQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaApjVmlYZmE0M0ZLOCs1L2VhNG4zMmNaaVpCS3BEZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1CmdTazhyeFdZSVREK0tKQUFqTkhoeS9wZXlQMzRFRVk3b25oQ2tSZDBWUXJlVUdkTlp0R24vLzNad0xXb280ck8KWnZVUFE4Mm5LMWQ3WTBacXFpNVMyUFR0NFcydEtaQjRTTHJoSTZxamlleTFxNWJBdEV1aUhaZWVldkp1UUhIZgphUEZsVGM1OEJkOVRaYW1sOExHWEJIQVZSZ09ZMU5LL1ZMU2dXSDFTYjlwV0ptTFUyTnVKTVc4YzhDTEMwMkljCk5jMU1hUlZVR3BDWTN1c2VYOHAzeDh1T1BVTnBuSnBZMENRNzN4dEFsbjQxcllISFRuRzZpQk09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgU3ViamVjdDogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIExhYmVsOiAiU1pBRklSIFJPT1QgQ0EyIgojIFNlcmlhbDogMzU3MDQzMDM0NzY3MTg2OTE0MjE3Mjc3MzQ0NTg3Mzg2NzQzMzc3NTU4Mjk2MjkyCiMgTUQ1IEZpbmdlcnByaW50OiAxMTo2NDpjMTo4OTpiMDoyNDpiMTo4YzpiMTowNzo3ZTo4OTo5ZTo1MTo5ZTo5OQojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOjUyOmZhOjk1OjNmOmVkOmRiOjI0OjYwOmJkOjZlOjI4OmYzOjljOmNjOmNmOjVlOmIzOjNmOmRlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMTozMzo5ZDozMzoyODoxYTowYjo1NjplNTo1NzpkMzpkMzoyYjoxYzplNzpmOTozNjo3ZTpiMDo5NDpiZDo1ZjphNzoyYTo3ZTo1MDowNDpjODpkZTpkNzpjYTpmZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTApCUUF3VVRFTE1Ba0dBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042ClpXNXBiM2RoSUZNdVFTNHhHREFXQmdOVkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3cKTnpRek16QmFGdzB6TlRFd01Ua3dOelF6TXpCYU1GRXhDekFKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TApjbUZxYjNkaElFbDZZbUVnVW05NmJHbGplbVZ1YVc5M1lTQlRMa0V1TVJnd0ZnWURWUVFEREE5VFdrRkdTVklnClVrOVBWQ0JEUVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMzdkQ1UXFFdk4KUUxYT1llZVd5clNoMmd3aXNQcTFlM1lBZDR3THozMm9oc3dtVWVRZ1BZVU0xbGpqNS9RcUdKM2EwYTRtN3V0VAozUFNRMWhOS0RKQTh3L1RhMG80TmtqcmNzYkgvT043RHVpMWZnTGtDdlVxZEd3KzB3OExCWndQZDNCdWNQYk93CjNnQWVxRFJIdTVyci9nc1V2VGFFMmcwZ3YvcGJ5NmtXSUswNVlPNHZkYmJubDV6NVB2MStUVzlOTCsrSURXcjYKM2ZFOWJpQ2xvQkswVFhDNXp0ZHlPNG1UcDRDRUhDZEpja20xL3p1Vm5zSE15QUhzNkE2S0NwYm5zNmFINWRiNQpCU3NObDBCd1BMcXNkVnFjMVUyZEFnclNTNXRtUzBZSEYyV3RuMnlJQU53aWllRGhaTlJudkRGNVlUeTd5a0hOClhHb0F5RHc0amxpdkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUXVGcWxLR0xYTHpQVnZVUE1qWC9oZDU2end5REFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQVFFQXRYUDRBOXhaV3gxMjZhTXFlNUFvc2szQU0wK3FtckhVdU9Rbi82bVdtYzVHNEcxOFRLSTRwQVp3CjhQUkJFZXcvUjQwL2NvZjVPLzJrYnl0VEFPRC9PYmxxQnc3ckhSejJvbktReTRJOUVZS0wwcnVmS3E4aDVtT0cKblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2N29Qd2dsVjlQSmk4Ukk0Tk9kUWNQdjV2UnRCM3BFQVQreW1DUApva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsNCt2SmhhQWxJRGY3anM0TU5JVGhQSUd5CmQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYrL05OSXh1Wk16U2cKTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiIKIyBTZXJpYWw6IDQ0OTc5OTAwMDE3MjA0MzgzMDk5NDYzNzY0MzU3NTEyNTk2OTY5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZDo0Njo5ZTpkOToyNTo2ZDowODoyMzo1Yjo1ZTo3NDo3ZDoxZToyNzpkYjpmMgojIFNIQTEgRmluZ2VycHJpbnQ6IGQzOmRkOjQ4OjNlOjJiOmJmOjRjOjA1OmU4OmFmOjEwOmY1OmZhOjc2OjI2OmNmOmQzOmRjOjMwOjkyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjo3NjpmMjplZDpkYTplODo3Nzo1YzpkMzo2YzpiMDpmNjozYzpkMTpkNDo2MDozOTo2MTpmNDo5ZTo2Mjo2NTpiYTowMTozYToyZjowMzowNzpiNjpkMDpiODowNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQgpnREVMTUFrR0ExVUVCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11ClFTNHhKekFsQmdOVkJBc1RIa05sY25SMWJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUcKQTFVRUF4TWJRMlZ5ZEhWdElGUnlkWE4wWldRZ1RtVjBkMjl5YXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnegpPVFUyV2hnUE1qQTBOakV3TURZd09ETTVOVFphTUlHQU1Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aClZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNRd0lnWURWUVFERXh0RFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSMwpiM0pySUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDOStYajQ1dFdBCkRHU2RoaHVXWkdjL0lqb2VkUUY5Ny90Y1o0ekp6RnhycVpIbXVVTGxJRXViMnB0N3VabGQyWnVBUzllRVFDc24KMCtpNk1McytDUnFuU1pYdkswQWt3cGZIcCs2YkplK29DZ0NYaFZxcW5kd3B5ZUkxQit0d1RVcld3Yk5XdUtGQgpPSnZSK3pGL2orQmY0YkUvRDQ0V1NXRFhCbzBZK2FvbUVLc3EwOURSWjQwYlJyNUhNTlV1Y3RIRlk5cm5ZM2xFCmZrdGpKSW1HTGpRL0tVeFNpeXFud09LUktJbTV3RnY1SGRubko2My9tZ0tYd2NaUWtwc0NMTDJwdVRSWkNyK0UKU3YvZi9yT2Y2OW1lNEpnajdLWnJkeFlxMjh5dE94eWtoOXhHYzE0WlltaEZWK1NRZ2tLN1F0YndZZURCb3oxbQpvMTMwR082SXlZMFhSU21aTW5VQ01lNHBKc2hyQXVhMVlrVi9OeFZhSTJpSjFEN2VUaWV3OEVBTXZFMFh5MDJpCnN4N1FCbHJkOXBQUFYzV1o5ZnFHR21kNHM3K1cvalRjdmVkU1Z1V3o1WFY3MTBHUkJkeGRhZU9WRFVPNS9JT1cKT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQlJna2cvaUtndGxzd2pieUpETlhYY1BpSFV2M2E3NnhSTGdlegpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllaGl6S1YvTWE1Y2lTaXhxQ2xuckR2RkFTCmFkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk1CaEJndTRNMXQxNW4KM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1EKRi94bGhNY1FTWkRlMjhjbWs0Z21iM0RXQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZgpDVm4wVzNjTE4rbUxJTWI0Q2s0dVdCenJNOURQaG1ESjJ2dUFMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5ClhONDBoejVCc0E3MnVkWS9DUk9XRkMvZW1oMWF1VmJPTlRxd1gzQk5YdU1wOFNNb2NsbTJxOEtNWmlZY2R5d20KZGpXTEtLZHBvUGs3OVNQZGhSQjB5WkFEVnBIbnI3cEgxQktYRVNMam9rbVViT2UzbEV1NkxhVGFNNHRNcGtULwpXanpHSFdUWXRUSGtwang2cUZjTDIrMWhHc3Z4em5OM1k2U0hiMHhST05ia1g4ZWZ0b0VxNUlWSWVWaGVPL2piCkFvSm53VG5idzNSTFBUWWUrU21UaUdoYnFFUVpJZkNuNklFTkxPaVROclEzc3Nxd0d5WjZtaVVmbXBxQW5rc3EKUC91am12NXpNbkhDbnNaeTRZcG9KL0hrRDdURVRLVmhrL2lYRUFjcU1DV3B1Y2h4dU85b3pDMSs5ZUIrRDRLbwpiN2E2YklORGQ4MktraGVobmx0NEZqMUY0ak55M2VGbXlwblR5Y1VtL1Exb0JFYXV0dG1iakw0WnZySEc4aG5qClhBTEtMTmh2U2dmWnlUWGFRSFh5eEtjWmI1NUNFSmgxNXBXTFlMenR4UkxYaXM3Vm1GeFdsZ1BGN25jR05mL1AKNU80L0UySHUyOW90aGZETnJwMnlHQWxGdzVLaGNoZjhSN2FnQ3l6eHhONURhQWhxWHp2d2RtUDd6QVlzcHNiaQpEclc1dmlTUAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogY2E6ZmY6ZTI6ZGI6MDM6ZDk6Y2I6NGI6ZTk6MGY6YWQ6ODQ6ZmQ6N2I6MTg6Y2UKIyBTSEExIEZpbmdlcnByaW50OiAwMTowYzowNjo5NTphNjo5ODoxOToxNDpmZjpiZjo1ZjpjNjpiMDpiNjo5NTplYToyOTplOToxMjphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDA6OTI6OWE6MDI6Y2U6NTM6YjQ6YWM6ZjQ6ZjI6ZmY6YzY6OTg6MWM6ZTQ6NDk6NmY6NzU6NWU6NmQ6NDU6ZmU6MGI6MmE6Njk6MmI6Y2Q6NTI6NTI6M2Y6MzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDekNDQS9PZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCcGpFTE1Ba0dBMVVFQmhNQ1IxSXgKRHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1awpJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlZCQU1UCk4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXYKZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4TVRJeFdqQ0JwakVMTUFrRwpBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oClpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3gKUURBK0JnTlZCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1VtOXZkRU5CSURJd01UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREMrS2svRzRuOFBEd0VYVDJRTnJDUk9uazhabHJ2YlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUEKNHlqc3JpRkJ6aC9hL1gwU1d3R0REN213WDVuaDhoS0RnRTBHUHQrc3IrZWhpR3N4ci9DTDBCZ3p1TnRGYWpUMApBb0FrS0FvQ0ZaVmVkaW9ObVRvVVcvYkx5MU84RTAwQmlEZVVKUnRDdkNMWWpxT1dYanJaTXRzKzZQQVFaZTEwCjRTK25mSzhuTkxzcGZadTJ6d25JNWRNSy9JaGxaWFFLM0hNY1hNMUFzUnpVdG9TTVRGRFBhSTZvV2E3Q0owNkMKb2pYZEZQUWYvN0ozMVljdnFtNTlKQ2ZueHNzbTV1WCtad2RqMkVVTjNUcFpaVGxZZXBLWmNqMmNoRjZJSWJqVgo5Q3o4MlhCU1QzaTR2VHdyaTVXWTliUFJhTThnRkg1TVhGL25pK1gxTllFWk45Y1JDTGRtdnROS3pvTlhBRHJECmdmZ1h5NUkyWGRHajJIVWI0WXNuNm5wSVFmMUZHUWF0SjVsT3dYQkgzYldmZ1ZNUzViR01TRjB4UXhmampNWjYKWTVaTEtUQk9oRTVpR1Y0OHpwZVFwWDhCNjUzZytJdUozU1dZUFpLMmZ1L1o4VkZSZlMwbXlHbFpZZUNzYXJncQpOaEVFZWxDOU1vUytMOXh5MWRjZEZrZmtSMllnUC9TV3hhK09BWHFsRDNwazlRMFloOW11aU5YNmhNRTZ3R2tvCkxmSU5hRkdxNDZWM3hxU1FEcUUzaXpFalI4RUpDT3R1OTNpYjE0TDhoQ0NaU1JtMkVrYXgrMFZWRnFtalpheWMKQncvcWE5d2ZMZ1p5N0lhSUV1UXQyMThGTCtUd0E5TW1NK2VBd3MxQ29SYzBDd0lEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVY1JWbnlNakp2WFZkCmN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFc3YlZSTHFoQllSalR5WXRjV05sMEkKWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrRDFoWWMyUnl4K2hGanR5cDhpWS94bm1Nc1ZNSQpNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck1kL0s0a1BGb3gvbGEvdm90CjlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reWQrMlYKWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYQpqOEdzR3NWbjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oClg5aXpqRmswV2FTclQyeTdIeGpiZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFEKbDAzM0RsWmR3SlZxd2piREcyako5U3JjUjVxK3NzN0ZKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZgpiem9Fdk0xNGlRdU9EeStqcWsraUd4STlGZ2hBRC9GR1ROZXFld2pCQ3ZWdEo5NENqOHJEdFN2SzZldklJVk00CnBjdzcySGMzTUtKUDJXL1I4a0N0UVhvWHhkWktOWW0zUWRWOGhuOVZUWU5LcFhNZ3dEcXZrUEdhSkk3WmpuSEsKZTdpRzJyS1BtVDRkRXcwU0VlN1VxL0RwRlhZQzVPRGZxaUFlVzJHRlpFQ3BrSmNOclZQU1doMkhhZ0NYWldLMAp2bTlxcC9Vc1F1MHlyYllobnI2OAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODE6ZTU6YjQ6MTc6ZWI6YzI6ZjU6ZTE6NGI6MGQ6NDE6N2I6NDk6OTI6ZmU6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA5ZjpmMTo3MTo4ZDo5MjpkNTo5YTpmMzo3ZDo3NDo5NzpiNDpiYzo2Zjo4NDo2ODowYjpiYTpiNjo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogNDQ6YjU6NDU6YWE6OGE6MjU6ZTY6NWE6NzM6Y2E6MTU6ZGM6Mjc6ZmM6MzY6ZDI6NGM6MWM6Yjk6OTU6M2E6MDY6NjU6Mzk6YjE6MTU6ODI6ZGM6NDg6N2I6NDg6MzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3ekNDQWtxZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQ0JxakVMTUFrR0ExVUVCaE1DUjFJeER6QU4KQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hSREJDQmdOVkJBTVRPMGhsCmJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUlVORElGSnYKYjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3TXpjeE1sb3dnYW94Q3pBSgpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqCllXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjUKTVVRd1FnWURWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMApkWFJwYjI1eklFVkRReUJTYjI5MFEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnClFlaExnb1JjNHZneEVabUdaRTRKSlMrZFFTOEtyalZQZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmEKanE0b252a3RUcG52TEVodlRDVXA2TkZ4Vzk4ZHdYVTN0TmY2ZTNwQ25Hb0tWbHA4YVF1cWdBa2tiSDdCUnFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTFFpCkM0S1pKQUVPbkx2a0R2Mi8rNWNnazVrcU1Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HZk9GbUk0b3F4aVJhZXAKbFNUQUdpZWNNanZBd05XNnFlZjRCRU5UaGU1U0lkNmQ5U1dEUHA1WVN5L1haeE1PSVFJd0JlRjFBZDVvN1NvZgpUVXdKQ0Ezc1M2MWtGeWpuZGM1RlpYSWhGOHNpUVE2TUU1ZzRtbFJ0bThyaWZPb0NXQ0tSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkxOTExNTY1Nzc5ODk4MzU2NzA5NzMxMTc2OTY1NjE1NTY0NjM3NzEzCiMgTUQ1IEZpbmdlcnByaW50OiA3ZjowOTo5YzpmNzpkOTpiOTo1Yzo2OTo2OTo1NjpkNTozNzozZToxNDowZDo0MgojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmZkOmQwOmI3OmZkOmEyOjRlOjBkOmFjOjQ5OjJjOmEwOmFjOmE2OjdiOjZhOjFmOmUzOmY3OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNToyYTo0MDoyYjpmYzpkZjoyYzpkNTo0ODowNTo0ZDoyMjo3NTpiMzo5Yzo3ZjpjYTozZTpjMDo5Nzo4MDo3ODpiMDpmMDplYTo3NjplNTo2MTphNjpjNzo0MzozZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVNFU0JWZytRdFBsUldoUzJETjdjczNFWVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFOcFFoN2JhdUtrK25XVDZWak9hVmowVzVRT1ZzalFjbW0xaUJkVFlqK2VKWkorNjIyU0xaT1o1S21ITnI0OWEKaVpGbHVWajh0QU5ma1Q4dEVCWGdmcys4L0g5RFo2aXRYallqMkppelRmTkRuamw4S3Z6c2lOV0k3bkM5aFJZdAo2a3VKUEtOeFF2NGMvZE1jTFJDNGhsVHFRN2pieG9mYXFLNkFKYzk2SmgycWtiQkliNjYxM3A3WTEvb0EvY2FQCjBGRzdZbjJrc1l5eS95QVJ1alZqQllaSFlFTXprUFpIb2dOUGxrMmRUOEhxNnB5aS9qUXUzcmZLRzNha3Q2MmYKNmFqVWVEOTQvdkk0Q1RZZDBoWUN5T3dxYUsvMWpwVHZMUk42SGtKS0hSVXhyZ3dFVi94aGMvTXhWb1l4Z0tERQpFVzR3ZHVPVThGOEV4S3lIY29tWXhaM01Wd2lhOUF6OGZYb0ZPdnBIZ0RtMno0UVRkMjhuNnYrV1p4Y0liZWtOCjFpTlFNTEFWZEJNKzVTLy9EczNFQzBwZDhOZ0FNMGxtNjZFWWZGa3VQU2k1WVhITHRhVzZ1T3JjNG5CdkNHcmMKaDJjMDc5OHdjdDN6eVQ4ai96WGh2aUVwSURDQjVCbWxJT2tseW5NeGRDbSs0a0xWODdJbVpzZG8vUm16NXlDVAptZWhkNEY2SDUwYm9KWndLS1NUVXpWaUdVa0Frc25zUG1CSWdKUGFRYkVmSURic1lJQzdaL2Z5TDhpbnFoM1NWCjRFSlFlSVFFUVdHdzlDRWpqeTNMS0NIeWFtejBHcWJGRkxRM1pVK1YvWURJK0hMbEpXdkVZTEY3Ylk1S2luUE8KV2Z0d2VuTUdFOW5UZERja1FRb1JiNWZjNStSK29iMFY4cnFIRHoxb2loWUhBZ01CQUFHall6QmhNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlNvd2NDYmthaERGWHhkCkJpZTBLbEhZbHd1QnNUQWZCZ05WSFNNRUdEQVdnQlNvd2NDYmthaERGWHhkQmllMEtsSFlsd3VCc1RBTkJna3EKaGtpRzl3MEJBUTBGQUFPQ0FnRUFuRlp2QVg3UnZVejFpc2J3SmgvazREZ1l6RExES1R1ZFFTazBZY2JYOEFDaAo2NlJ5ajVRWHZCTXNkYlJYN2dwOENYcmMxY3FoMERRVCtIZXJuK1grMkI1MGlvVUhqMy9NZVhyS2xzM04vVS83Ci9TTU5rUFgwWHRQR1lYMmVFZUFDN2drRTJRZmRwb3EzRElNa3U0TlFrdjVnZFJFKzJKMndpbnExNEoyYnk1QlMKUzdDVEt0UStGalBsbnNabEZUNWtPd1EvMnd5UFgxd2RhUit2OCtraGpQUHZsL2FhdHhtMmhIU2NvMVMxY0U1agoyRmRkVXlHYlFKSkQrdFozVlROUFpOWDcwQ3hxam0wbHB1K0Y2QUxFVXo2NW5vZTh6RFVhM3FIcGltT0haUjRSCkt0dGpkNWNVdnBvVW1SR3l3TzZ3VC9nVUlUSkRUNStyb3N1b0Q2bzdCbFhHRWlsWENOUTMxNGNuclVsWnA1R3IKUkhwZWpYRGJsODVJVUxGemsvYndnMkQ1emZIaE1mMWJmSEVoWXhRVXFxL0YzcE4rYUxIc0lxS3FrSFdldFVOeQo2bVNqaEV2OURLZ21hM0dYN2xaalp1aENWUG5ISGQvUWoxdmZ5REJ2aVA0TnhETWNVNmlqL1VnUTh1UUtUdUVWClYveHVaRERDVlJIYzZxbk5TbFNzS1dORXowcEFvTlpvV1JzeitlODZpOXNna3R4Q2hMOEJxNGZBMVNDQzI4YTUKZzRWQ1hBOURPMnBKTmRXWTlCVy8rbUdCREFrZ0dOTFFGd3pMU0FCUTZYYUNqR1RYT3FBSFZjd2VNY0R2T3JSbAorK08vUW11ZUQ2aTlhNWpjMk52TGk2VGQxMW4wYnQzK3FzT1IwQzVDQjhBTVRWUE5KTEZNV3g1UjlOL3Brdm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDg3MDk2MTMxNTM2ODQ0MjA5NTYzNTA5MjI4OTUxODc1ODYxNTg5CiMgTUQ1IEZpbmdlcnByaW50OiBhNzplZTpjNDo3ODoyZDoxYjplZToyZDpiOToyOTpjZTpkNjphNzo5NjozMjozMQojIFNIQTEgRmluZ2VycHJpbnQ6IDRmOjY1OjhlOjFmOmU5OjA2OmQ4OjI4OjAyOmU5OjU0OjQ3OjQxOmM5OjU0OjI1OjVkOjY5OmNjOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2YzpjMDo1MDo0MTplNjo0NDo1ZTo3NDo2OTo2Yzo0YzpmYjpjOTpmODowZjo1NDozYjo3ZTphYjpiYjo0NDpiNDpjZTo2Zjo3ODo3Yzo2YTo5OTo3MTpjNDoyZjoxNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hEQ0NBYUtnQXdJQkFnSVNFU0Raa2M2dW8rakY1Ly9wQXEvUGM3eFZNQW9HQ0NxR1NNNDlCQU1ETUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYU1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTTBQVzFhQzMvQkZHdGF0CjkzbndIY21zbHRhZVRwd2Z0RUlSeW9hL2JmdUZvOFhsR1Z6WDdxWS9hV2ZZZU9LbXljVGJMWGt1NTR1TkFtOHgKSWswRzQyQnlSWjBPUW5lZXpzL2xmNFdiR09UOHpDNXkweGFUVHNxWlkxeWhCU3BzQnFOak1HRXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnFEWXdKNWp0cE14andqCkZOaVB3eUNyS0dCWk1COEdBMVVkSXdRWU1CYUFGTnFEWXdKNWp0cE14andqRk5pUHd5Q3JLR0JaTUFvR0NDcUcKU000OUJBTURBMmdBTUdVQ01IRCtzQXZaOTRPWDdQTlZIZFRjc3dZTy9qT1luWXM1a0d1VUllMjIxMTNXVE5jaApwK2UvSVE4cnpmY3EzSVVIblFJeEFJWVVGdVhjc0dYQ3dJNFVuNzhrRm1qbHZQbDVhZHl0UlN2M3RqRnp6QWFsClU1T1JHcE91Y0dwbnV0ZWU1V0VhWHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkyMDM2NTc3ODExOTQ3MDEzNzcwNDAwMTI3MDM0ODI1MTc4ODQ0Nzc1CiMgTUQ1IEZpbmdlcnByaW50OiA3NjowMDpjYzo4MToyOTpjZDo1NTo1ZTo4ODo2YTo3YToyZTpmNzo0ZDozOTpkYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjkxOmU4OjM0OmY3OmUyOmVlOmRkOjA4Ojk1OjAxOjUyOmU5OjU1OjJkOjE0OmU5OjU4OmQ1OjdlCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NjpjNzo3MToyODpkOTo4YzoxODpkOToxYjo0YzpmZDpmZjpiYzoyNTplZTo5MTowMzpkNDo3NTo4ZTphMjphYjphZDo4Mjo2YTo5MDpmMzo0NTo3ZDo0NjowZTpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0N6a0ZVNWZYODJiV1RDcDU5clk0NW5NQTBHQ1NxR1NJYjNEUUVCQ3dVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeE1CNFhEVEUwTURVeU5qQTRORFUxTUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUQ0ZVViYWxzVXdYb3B4QXkxd3BMdXd4UWpjemVZMXdJQ2tFUzNkNW9ldVhUMlIwb2RzTjdmYVlwNmIKd2lUWGovSGJwcWJmUm05UnBuSExQaHN4WjJMM0VWczBKOVY1VG95YldMMGlFQTFjSnd6ZE1PV28wMTBoT0hRWAovdU1mdGs4N2F5M2JmV0FmakgxTUJjTHJBUllWbUJTTzBaQjNJai9zd2ptNGVUcndTU1RpbFpIY1lUU1NqRlIwCjc3RjlqQUhpT0gzQlgycGZKTEtPWWhldGVTQ3RxeDIzNExTV1NFOW1ReEFHRmlRRDRlQ2Nqc1pHVDQ0YW1lR1AKdVk0emJHbmVXSzJnRHFka1ZCRnBSR1pQVEJLbmppeDl4TlJieFFBME1NSFptZjR5emdlRXRFN05DdjgyVFdMeApwMk5YNU50cXA2Ni9LN25KNXJJbmllVittaHhOYU1iQkdONHpLMUZHU3h5Tzl6ME0rWW8wRk1UN016VWo4Y3p4CktzZWx1N0NpenY1VGEwMUJHMllvc3BiNnA2NEtUcms1TTBTY2RNR1RIUGpnbmlRbFEvR2JJNEtxM3l3Z3NOdzIKVGdPemZBTFU1bnNhcW9jVHZ6NmhkTHViRHVIQWs1L1hwR2JLdXhzNzR6RDBNMW1LQjNJRFZlZHphZ014Ym0rVwpHK09pbjYrU3grMzFRcmNsVERzVEJNOGNscThjSXFQUXF3V3lUQklqVXR6OUdWc25uQjQ3ZXYxQ0k5c2pnQlB3CnZGRVZWSlNtZHo3UWRGRzlVUlFJT1RmTEh6U3BNSjFTaEM1VmtMRzYzMVVBQzloV0xiRkpTWEtBcVdMWHdQWVkKRVFSVnpYUjd6MkZ3ZWZSN0xGeGNrdnpsdUZxclRKT1ZvU2Z1cGI3UGNTTkN1cHQyTFFJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWwwWWhWeUUxCjJqWlZ4L1B4TjNEbENQYVRLYll3SHdZRFZSMGpCQmd3Rm9BVWwwWWhWeUUxMmpaVngvUHhOM0RsQ1BhVEtiWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUIzZEFtQjg0RFduNXBoNzZrVE9aMEJQOHBOdVp0UTVpU2FzMDAwRQpQTHVISVQ4MzlIRWwya3U2cTVhQ2daRzI3ZG14cEdXWDRtOWtXYVNXN21ES0h5UDdSYnIvanlUd3lxa3hmM2tmCmdMTXRNcnBrWjJDdnVWbk4zNXBKMDZpQ3NmbVlsSXJNNEx2Z0JCdVpZTEZHWmR3SW9ySkdua1NJNnBOK1Z4YlMKRlhKZkxrdXIxSjFqdU9OSTVmNkVMbGdLbjBNZC9yY1lrb1pEU3c2Y01vWXNZUFhwU09xVjdYQXA4ZFV2L1RXMApWOC9iaFVpWnVjSnZiSS9OZUpXc1pDajlWckREYjhPK1dWTGhYNFNQZ1BMMERUYXRkck9qdGVGa2RqcFkzSDFQClhsWnM1VlZaVjZYZjhZcG1NSXpVVW1JNGQ3UytLTmZLTnNTYkJmRDRGZHZiOGU4MG5SMTRTb2hXWjI1Zy80L0kKaStHT3ZVS3BNd3BaUWhJU0t2cXhuVU9PQlp1WjJtS3RWemF6SGJZTmVTMld1T3Z5REVzTXBaVEdNS2NtR1MzdApUQVpRTVBIOVdEMjVTeGRmR2JScWhGUzBPRTg1b2cyV2FNTW9sUDN0TFI5S2EwT1dMcEFCRVBzNHBvRUwwTDkxCjA5UzV6dkUvYnc0Y0hqZHg1UmlIZFJrL1VMbGVwRVUwcmJESzV1VVRkZzh4RkttT0xaVFcxWVZOY3hWUFMvS3kKUHUxc3ZmME9uV1p6c0QyMDk3K280QkdreEs1MUNVcGpBRWdncHNhZEN3bUt0T0Rtemo3SFBpWTQ2U3ZlcGdoSgpBd1NRaXVtUHYraTJ0Q3FqSTQwY0hMSTVrcWlQQWx4QU9YWFVjMEVDZDk3TjRFT0gxdVM2U3NOc0VuLytLdVlqCjFveHgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjAxMjQ0ODA0MjcwMjA5Njk4Njg3NTk4NzY3NjkzNTU3MzQxNTQ0MQojIE1ENSBGaW5nZXJwcmludDogNTc6MjQ6YjY6NTk6MjQ6NmI6YWU6Yzg6ZmU6MWM6MGM6MjA6ZjI6YzA6NGU6ZWIKIyBTSEExIEZpbmdlcnByaW50OiA3OTo1Zjo4ODo2MDpjNTphYjo3YzozZDo5MjplNjpjYjpmNDo4ZDplMTo0NTpjZDoxMTplZjo2MDowYgojIFNIQTI1NiBGaW5nZXJwcmludDogMjc6OTk6NTg6Mjk6ZmU6NmE6NzU6MTU6YzE6YmY6ZTg6NDg6Zjk6YzQ6NzY6MWQ6YjE6NmM6MjI6NTk6Mjk6MjU6N2I6ZjQ6MGQ6MDg6OTQ6ZjI6OWU6YTg6YmE6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDaGFSdS92Ym05VXBhUEkraEl2eVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3lNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFETXRsZWxNNVFRZ1RKVDMyRitEM1k1ejF6Q1UzVWRTWHFXT04yaWMycnhiOTVlb2xxNWNTRytOdG1oCi9MenViS2g4TkJweEd1Z2EyRjhPUkFidHArRHowbUVMNERLaWx0RTQ4TUxhQVJmODVLeFA2TzZKSG5TclQ3OGUKQ2JZMmFsYno0ZTZXaVdZa0J1VE5RanBLM2VDYXNNU0NSYlAreWF0Y2ZEN0o2eGN2REgxdXJxV1B5S3dsQ20vNgoxVVdZMGpVSjlnTkRsUDdadnlDVmVZQ1lpdG1KTmJ0Ukc2UTNmZnlaTzZ2L3Y2d05qME94bVhzV0VINGRiMGZFCkZZOEVsZ2dHUWdUNGhOWWR2SkdtUXI1SjFXcUlQN3d0VWRHZWplQlN6RmZkTlRWWTI3U1BKSWpraTkvY2ExVFMKZ1N1eXpwSkxIQjlHK2gzWWtzdDJaN1VKbVFubHJCY1VWWERHUEtCV0NnT3ozR0laMzhpMU1ILzFQQ1oxRWIzWApHN09IbmdldlpYSGxvTThhcHdrUUhaT0pabHZvUEdJeXRiVTZidW1GQVl1ZVE0eG5jeWhaVyt2ajNDek1wU1p5ClloSzA1cHlEUlBaUnBPTEFlaVJYeWc2bFB6cTFPNHZsZHU1dzVwTGVGbHdvVzVjWko1TCtlcEpVenBNNUNoYUgKdkdPejliR1RYT0J1dDlEcStXSXlpRVQ3dnljb3RqQ1ZYUklvdVpXK2oxTVk1YUlZRnVKV3BMSXNFUFVkTjZiNAp0L2JRV1Z5Sjk4TFZ0WlIwMGRYK0c3Ync1dFllZTlJOHk2amo5Ump6SVI5dTcwMW9CbnN0WFc1RGlhYkErYUMvCmdoN1BVMyswNnl6YlhmWnFmVUFrQlhLSk9BR1R5M0hDT1YwR0VmWnZlUGczRFRtRUp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVham42UWlMMwo1b2tBVFY1OU00UEx1RzUzaHE4d0h3WURWUjBqQkJnd0ZvQVVham42UWlMMzVva0FUVjU5TTRQTHVHNTNocTh3CkRRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFKakxxMEE4NVRNQ2wzOHRoNmFQMUY1S3I3Z2U1N3R4KzRCa0phbXoKR2o1b1hTY21wN29xNGZCWGd3cGtUeDRpZEJ2cGtGL3dyTS8vVDJoNk9LUVFiQTJ4eDZSM2dCaTJvaWhFZHFjMApuWEdFTDhwWjBrZUltVUVpeVRDWVlXNDlxS2dGYmRFZndGRkVWbjhuTlFMZFhwZ0tRdXN3djQyaG0xR3FPK3FUClJtVEZBSG5lSVd2MlY2Q0cxd1p5N0hCR1M0dHozYUFoZFQ3Y0hjQ1AwMDl6SElYWi9uOWl5SlZ2dHRON2pMcFQKd20rYlJFeDUwQjF3czllZkF2U3lCN0RINWZpdEl3Nm1Wc2twRW5kSTJTOUcvVHZ3L0hSd2txV09PQWdmWkRDMgp0MHY3TnF3UWpxQlNNMk9kQXpWV3hXbTl4aU5hSjVUMnBCTDRMVE04b1ZhbFg5WVo2ZTE4Q0wxM3pTZGt6SlRhClRrWlFoK0Q1d1ZPQUhydXQrMGRTaXh2OW92bmVEaUszUFROWmJOVGU5WlVHTWcxUkdVRmNQazhHOTdrcmdDZjIKbzZwNmZBYmhROE1UT1dJYU5yM2dLQzZVQXVRcExtQlZya0E5c0hTU1h2QWdaSlkvWDBWZGlMV0syZ0tnVzBWVQozamc5Q2NDb1NtVkdGdnlxdjFST1RWdStPRU8zS01xTE02b2FKYm9sWENrdlcwcHVqT290bkNyMkJYYmdkNWVBCmlOMW5FMjhkYUNTTFQ3ZDBnZVgwWUo5NlZkYytOOW9XYXo1M3JLNFljSlVJZVNrRGl2N0JPN00vR2cra08xNGYKV0tHVnlhc3ZjMHJRTFc2YVdROVZHSGd0UEZHbWw0dm11N0p3cWt3UjN2OThLemZVZXRGM05JL24rVUwzUElFTQpTMUlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMyIKIyBTZXJpYWw6IDE0OTIxMDQ5MDgyNzE0ODU2NTMwNzEyMTk5NDE4NjQxNzExNzA0NTU2MTUKIyBNRDUgRmluZ2VycHJpbnQ6IDIxOjM3OmI0OjE3OjE2OjkyOjdiOjY3OjQ2OjcwOmE5Ojk2OmQ3OmE4OjEzOjI0CiMgU0hBMSBGaW5nZXJwcmludDogNmU6MjY6NjQ6ZjM6NTY6YmY6MzQ6NTU6YmY6ZDE6OTM6M2Y6N2M6MDE6ZGU6ZDg6MTM6ZGE6OGE6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI3OmMzOjYyOjMxOjcwOjZlOjgxOjA3OjhjOjM2OjdjOmI4Ojk2OjE5OjhmOjFlOjMyOjA4OmRkOjkyOjY5OjQ5OmRkOjhmOjU3OjA5OmE0OjEwOmY3OjViOjYyOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSVRDQ0FhYWdBd0lCQWdJU0VTRG0rRXo4SkxDK0JVQ3Myb01iTkdBL01Bb0dDQ3FHU000OUJBTURNRUF4CkN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5d1pXNVUKY25WemRDQlNiMjkwSUVOQklFY3pNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3TUZvdwpRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1VUM0JsCmJsUnlkWE4wSUZKdmIzUWdRMEVnUnpNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJLN2xpdVRjcG0KM2dZNm94SDg0Qmp3Ymh5NkxUQU1pZG5XN3B0emc2a2pGWXd2V1lwYTNSVHFuVmtyUTdjRzdESzJ1dTVCdGExZApvWVhNNmgwVVpxTm5ma2JpbFBQbnRsYWhGVm1oVHplWHVTSWV2UkhyOUxJZlhzTVVtdVhabDVtall6QmhNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJIZDhNVWkySTUKRE1sdjRWQk4wQkJZM0pXSWJUQWZCZ05WSFNNRUdEQVdnQlJIZDhNVWkySTVETWx2NFZCTjBCQlkzSldJYlRBSwpCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqNmpjbmJvTUJCZjZGZWs5THlrQmw3K0JGak5BazJ6OCtlMkFjRytxCmo5dUV3b3YxTmNvRzNHUnZhQmJoajVHNUFqRUEyRXVseThMUUNHenBHUHRhM1UxZkpBdXdBQ0VsNzQrbkJDWngKNG54cDVWMmErRUVmT3ptVGs1MVY2czJOOGZ2QgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBTdWJqZWN0OiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIExhYmVsOiAiSVNSRyBSb290IFgxIgojIFNlcmlhbDogMTcyODg2OTI4NjY5NzkwNDc2MDY0NjcwMjQzNTA0MTY5MDYxMTIwCiMgTUQ1IEZpbmdlcnByaW50OiAwYzpkMjpmOTplMDpkYToxNzo3MzplOTplZDo4Njo0ZDphNTplMzo3MDplNzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOmJkOjJhOjc5OmExOjA3OjZhOjMxOmYyOjFkOjI1OjM2OjM1OmNiOjAzOjlkOjQzOjI5OmE1OmU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjpiYzplYzowNjoyNjo0OTo3NjpmMzo3NDo2MDo3Nzo5YTpjZjoyODpjNTphNzpjZjplODphMzpjMDphYTplMToxYTo4ZjpmYzplZTowNTpjMDpiZDpkZjowODpjNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBdwpUekVMTUFrR0ExVUVCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoCmNtTm9JRWR5YjNWd01SVXdFd1lEVlFRREV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTQKV2hjTk16VXdOakEwTVRFd05ETTRXakJQTVFzd0NRWURWUVFHRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdQpaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUVWtjZ1VtOXZkQ0JZCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUszb0pIUDBGRGZ6bTU0clZ5Z2MKaDc3Y3Q5ODRrSXh1UE9aWG9IajNkY0tpL3ZWcWJ2WUFUeWpiM21pR2JFU1R0ckZqL1JRU2E3OGYwdW94bXlGKwowVE04dWtqMTNYbmZzN2ovRXZFaG1rdkJpb1p4YVVwbVpteVBmanh3djYwcElnYno1TURtZ0s3aVM0KzNtWDZVCkE1L1RSNWQ4bVVnalUrZzRyazhLYjRNdTBVbFhqSUIwdHRvdjBEaU5ld053SVJ0MThqQTgrbyt1M2RwanErc1cKVDhLT0VVdCt6d3ZvLzdWM0x2U3llMHJnVEJJbERIQ05BeW1nNFZNazdCUFo3aG0vRUxOS2pEK0pvMkZSM3F5SApCNVQwWTNIc0x1SnZXNWlCNFlsY05IbHNkdTg3a0dKNTV0dWttaThteGRBUTRRN2UyUkNPRnZ1Mzk2ajN4K1VDCkI1aVBOZ2lWNStJM2xnMDJkWjc3RG5LeEhadThBL2xKQmRpQjNRVzBLdFpCNmF3QmRwVUtEOWpmMWIwU0h6VXYKS0JkczBwakJxQWxrZDI1SE43ck9yRmxlYUoxL2N0YUp4UVpCS1Q1WlB0MG05U1RKRWFkYW8weEFIMGFobWJXbgpPbEZ1aGp1ZWZYS25FZ1Y0V2UwK1VYZ1ZDd09QamRBdkJiSStlMG9jUzNNRkV2ekc2dUJRRTN4RGszU3p5blRuCmpoOEJDTkF3MUZ0eE5yUUh1c0V3TUZ4SXQ0STdtS1o5WUlxaW95bUN6THE5Z3dRYm9vTURRYUhXQmZFYndyYncKcUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvck9QTmszc2dyRFFvby8vZmI0aFZDMUNMUUoxM2hlZjRZNTNDSQpyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFk5dW1iYmpBTkJna3EKaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRCjNCZWJZaHRGOEdhVjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0sKTkZ0WTJQd0J5VlM1dUNiTWlvZ3ppVXd0aER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNQpPUkF6STRKTVBKK0dzbFdZSGI0cGhvd2ltNTdpYXp0WE9vSndUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyClRrWFdTdEFtek9WeXlnaHFwWlhqRmFIM3BPM0pMRitsKy8rc0tBSXV2dGQ3dStOeGU1QVcwd2RlUmxOOE53ZEMKak5QRWxwelZtYlVxNEpVYWdFaXVURGtIenN4SHBGS1ZLN3E0KzYzU00xTjk1UjFOYmRXaHNjZENiK1pBSnpWYwpveWkzQjQzbmpUT1E1eU9mKzFDY2VXeEcxYlFWczVadWZwc01sanE0VWkwLzFsdmgrd2pDaFA0a3FLT0oycXhxCjRSZ3FzYWhEWVZ2VEg5dzdqWGJ5TGVpTmRkOFhNMnc5VS90N3kwRmYvOXlpMEdFNDRaYTRyRjJMTjlkMTFUUEEKbVJHdW5VSEJjbldFdmdKQlFsOW5KRWlVMFpzbnZnYy91YmhQZ1hSUjRYcTM3WjBqNHI3ZzFTZ0VFend4QTU3ZAplbXlQeGdjWXhuL2VSNDQvS0o0RUJzK2xWRFIzdmV5Sm0ra1hROTliMjEvK2poNVhvczFBblg1aUl0cmVHQ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBTdWJqZWN0OiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBMYWJlbDogIkFDIFJBSVogRk5NVC1SQ00iCiMgU2VyaWFsOiA0ODU4NzYzMDgyMDY0NDg4MDQ3MDE1NTQ2ODI3NjA1NTQ3NTkKIyBNRDUgRmluZ2VycHJpbnQ6IGUyOjA5OjA0OmI0OmQzOmJkOmQxOmEwOjE0OmZkOjFhOmQyOjQ3OmM0OjU3OjFkCiMgU0hBMSBGaW5nZXJwcmludDogZWM6NTA6MzU6MDc6YjI6MTU6YzQ6OTU6NjI6MTk6ZTI6YTg6OWE6NWI6NDI6OTk6MmM6NGM6MmM6MjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmM1OjU3OjBjOjI5OjAxOjhjOjRkOjY3OmIxOmFhOjEyOjdiOmFmOjEyOmY3OjAzOmI0OjYxOjFlOmJjOjE3OmI3OmRhOmI1OjU3OjM4Ojk0OjE3OjliOjkzOmZhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4CkN6QUpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkoKV2lCR1RrMVVMVkpEVFRBZUZ3MHdPREV3TWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSgpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHClRrMVVMVkpEVFRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTHB4Z0hwTWhtNS8KeUJOdHdNWjlIQUNYanl3TUk3c1Fta0NwR3JlSGlQaWJWbXI3NW51T2k1S09weVZkV1JIYk5pNjNVUmNmcVFnZgpCQmNrV0tvM1NoamY1VG5VVi8zWHdTeVJBWkhpSXRRRHdGajhkMGZzano1MFE3cXNOSTFOT0habmpyREliekF6CldIRmN0UFZyYnRRQlVMZ1RmbXhLbzBuUklCbnV2TUFwR0dXbjN2N3YzUXFRSWVjYVo1SkNFSmhmVHpDOFBoeEYKdEJEWGFFQVV3RUQ2NTNjWGV1WUxqMlZiUE5tYVV0dTF2WjVHenozcmtRVUN3SmF5ZGt4TkVKWTdrdnFjZncrWgozNzRqTlVVZUFseit0YWlibVNYYVh2TWl3em4xNUNvdTA4WWZ4R3lxeFJ4cUFRVktMOUxGd2FnMEpsMW1wZElDCklma1l0d2IxVHBsdnFLdE1VZWpQVUJqRmQ4ZzVDU3hKa2pLWnFMc1hGM213V3NYbW84UlpaVWMxZzE2cDZEVUwKbWJ2a3pTREdtMG9HT2JWby9DSzY3bFdNSzA3cTg3SGovTGFabXRWQytuRk5DTStISG1weGZmblR0T21sY1lGNwp3azVIbHFYMmRvV2pLSS9wZ0c2QlU2VnRYN2hJK2NMNU5xWXVTZis0bHNLTUI3T2JpRmo4NnhzYzNpMXc0cGVTCk1LR0o0N3hWcUNmV1MrMlFyWXY2WXlWWkxhZzEzY3FYTTd6bHpjZWQwZXp2WGc1S2tBWW1ZNjI1MlRVdEI3cDIKWlN5c1Y0OTk5QWVVMTRFQ2xsMmpCMG5WZXRCWCtSdm5VMFoxcXJCNVFzdG9jUWpwWUwwNWFjNzByOE5XUU1ldApVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhaTBiMUFnTUJBQUdqZ1lNd2dZQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUGQ5eGYzRTZKb2JkMlNuOVIyZ3pMK0gKWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxb2RIUndPaTh2ZDNkMwpMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjEKUlh4bERQaXlOOCtzRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTQpMVk4wVjJVZTFiTGRJNEU3cFdZakoyY0pqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmCjc3SXpsaEVZdDhsbHZoamhvNlRjK2hqNTA3d1Rtemw2TkxyVFFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk4KSnBMdUh2VUJLd3JaMXBlYmJ1Q29HUnc2SVlzTUhrQ3RBK2ZkWm43MXVTQU5BK2lXK1lKRjFEbmdvQUJkMTVqbQpmWjVuYzhPYUt2ZXJpNkU2Rk84MHZGSU9pWmlhQkVDRUhYNUZhWk5YenV2TytGQjhUeHh1QkVPYitkWTdJeGpwCjZvN1JUVWFOOFR2a2FzcTYreU8zbS9xWkFTbGFXRm90NC9uVWJRNG1yY0Z1Tkx3eStBd0YrbVdqMnpzM2d5THAKMXR4eU0vMWQ4aUM5ZGp3ajJpajMrUnZyV1dUVjNGOXlmaUQ4elltMWtHZE5Zbm8vVHEwZHd6bitldlFvRnQ5Qgo5a2lBQmRjUFVYbXNFS3ZVN0FObTVtcXd1akdTUWtCcXZqclRjdUZxTjFXOHJCMlZ0MmxoOGtPUmRPYWcwd29rClJxRUlyOWJhUlJtVzFGTWRXNFI1OE1EM1IrK0xqOFVHcnAxTVlwMy9SZ1Q0MDhtMkVDVkFkZjRXcXNsS1lJWXYKdXU4d2QrUlU0cmlFbVZpQXFoT0xVVHBQU1BhTHRyTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAxIgojIFNlcmlhbDogMTQzMjY2OTc4OTE2NjU1ODU2ODc4MDM0NzEyMzE3MjMwMDU0NTM4MzY5OTk0CiMgTUQ1IEZpbmdlcnByaW50OiA0MzpjNjpiZjphZTplYzpmZTphZDoyZjoxODpjNjo4ODo2ODozMDpmYzpjODplNgojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOmE3OmY5OjY1OmVjOjVlOmZjOjM3OjkxOjBmOjFjOjZlOjU5OmZkOmMxOmNjOjZhOjZlOmRlOjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZTpjZDplNjo4ODo0ZjozZDo4NzpiMToxMjo1YjphMzoxYTpjMzpmYzpiMTozZDo3MDoxNjpkZTo3Zjo1NzpjYzo5MDo0ZjplMTpjYjo5NzpjNjphZTo5ODoxOTo2ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXhNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxKNGdISEtlTlhqCmNhOUhnRkIwZlc3WTE0aDI5SmxvOTFnaFlQbDBoQUV2ckFJdGh0T2dRM3BPc3FUUU5yb0J2bzNiU01nSEZ6Wk0KOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xdwpJRkFHYkhyUWdMS20rYS9zUnhtUFVEZ0gzS0tIT1ZqNHV0V3ArVWhuTUpidWxIaGViNG1qVWNBd2htYWhSV2E2ClZPdWp3NUg1U056LzBlZ3dMWDB0ZEhBMTE0Z2s5NTdFV1c2N2M0Y1g4akpHS0xoRCtyY2Rxc3EwOHA4a0RpMUwKOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbQpqZ1N1YkpySXFnMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSVFZeklVMDdMd01sSlF1Q0ZtY3g3SVFUZ29JTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQkFRQ1k4amRhUVpDaEdzVjJVU2dnTmlNT3J1WW91NnI0bEs1SXBEQi9HL3dralV1MHlLR1g5cmJ4ZW5ESQpVNVBNQ0Nqam1DWFBJNlQ1M2lIVGZJVUpyVTZhZFRyQ0MycUplSFpFUnhobGJJMUJqanQvbXN2MHRhZFExd1VzCk4rZ0RTNjNwWWFBQ2J2WHk4TVd5N1Z1MzNQcVVYSGVlRTZWL1VxMlY4dmlUTzk2TFhGdktXbEpiWUs4VTkwdnYKby91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYTJYVjRjZEZ5UXpSMWJsZFp3Z0pjSm1BcHp5TVpGbzZJUTZYVQo1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyeEpORGQyWmh3TG5vUWRlWGVHQURia3B5CnJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAyIgojIFNlcmlhbDogMTQzMjY2OTgyODg1OTYzNTUxODE4MzQ5MTYwNjU4OTI1MDA2OTcwNjUzMjM5CiMgTUQ1IEZpbmdlcnByaW50OiBjODplNTo4ZDpjZTphODo0MjplMjo3YTpjMDoyYTo1Yzo3Yzo5ZToyNjpiZjo2NgojIFNIQTEgRmluZ2VycHJpbnQ6IDVhOjhjOmVmOjQ1OmQ3OmE2Ojk4OjU5Ojc2OjdhOjhjOjhiOjQ0Ojk2OmI1Ojc4OmNmOjQ3OjRiOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxYjphNTpiMjphYTo4Yzo2NTo0MDoxYTo4Mjo5NjowMToxODpmODowYjplYzo0Zjo2MjozMDo0ZDo4MzpjZTpjNDo3MTozYToxOTpjMzo5YzowMToxZTphNDo2ZDpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSVRCbXlmMHBZMWhwOEtEK1dHZVBoYkpydUtOekFOQmdrcWhraUc5dzBCQVF3RgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXlNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUsyV255MmNTa3hLCmdYbFJtZXlLeTJ0Z1VSTzhUVzBHL0xBSWpkMFpFR3JISmd3MTJNQnZJSVRwbExHYmhRUERXOXRLNk1qNGtIYloKVzAvalRPZ0dOazNNbXF3OURKQXJrdFFHR1dDc04wUjVoWUdDclZvMzRBM01uYVpNVW5icVE1MjNCTkZROWxYZwoxZEttU1lYcE4rbktmcTVjbFUxSW1qK3VJRnB0aUpYWk5MaFNHa09Rc0w5c0JibTJlTGZxME9RNlBCSlRZdjlLCjhudStOUVdwRWpUajgyUjBZaXc5QUVsYUtQNHlSTHVIM1dVbkFuRTcya3IzSDlyTjl5RlZrRThQN0s2QzRaOXIKMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmRmTEM2SE03ODNrODFkczhQK0hnZmFqWlJSaWRoVyttZQp6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeGt2OExWL1Nhc3JsWDZhdnZEWGJSCjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTYnRxRFQ2WmoKbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvego3TXQwUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2CitYVXlvMDVmN08wb1l0bE5jL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kKMHUxdWZtOC8waTJCV1NsbXk1QTVsUkVlZENmKzNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlN3RFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tClVqQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFxcWlBanc1NG8rQ2kxTTNtOVpoNk8rb0FBN0NYRHBPOFdxajIKTEl4eWg2bXgvSDl6L1dOeGVLV0hXYzh3NFEwUXNoTmFiWUwxYXVhQW42QUZDMmprUjJ2SGF0KzIvWGN5Y3VVWQorZ24wb0pNc1hkS01kWVYyWlpBTUEzbTNNU05qclhpRENZWm9oTXIvK2M4bW1wSjU1ODFMeGVkaHB4Zkw4NmtTCms1TnJwK2d2VTVMRVlGaXd6QUpSR0Z1RmpXSlpZN2F0dE42YSt5YjNBQ2ZBWFZVM2RKbkpVSC9qV1M1RTR5d2wKN3V4TU1uZTBueHJwUzEwZ3hkcjlISWNXeGtQbzFMc21ta1Z3WHFrTE4xUGlSbnNuL2VCRzhvbTN6RUsyeXlnbQpidG1seVRySVFSTmc5MUNNRmE2eWJSb1ZHbGQ0NXBJcTJXV1FnajlzQXErdUVqb25sallFMXgyaWdHT3BtL0hsCnVyUjhGTEJPeWJFZmRGODQ5bEhxbS9vc29oSFVxUzBuR2tXeHI3Sk9jUTNBV0ViV2FRYkxVOHV6L210QnpVRisKZlV3UGZISjVlbG5OWGtvT3JKdXBtSE41ZkxUMHpMbTRCd3l5ZEZ5NHgyK0lvWkNuOUtyNXYyYzY5Qm9WWWg2MwpuNzQ5c1Ntdlo2RVM4bGdRR1ZNRE1CdTRHb24ybkwyWEE0NmpDZk1kaXlIeHROL2tITkdmWlFJRzZseldFN09FCjc2S2xYSXgzS2Fkb3dHdXVRTktvdE9yTjhJMUxPSndabWhzb1ZMaUprTy9LZFlFK0h2SmtKTWNZcjA3L1I1NEgKOWpWbHBOTUtWdi8xRjJSczc2Z2lKVW1UdHQ4QUY5cFlmbDN1eFJ1dzBkRmZJUkRIK2ZPNkFnb25COFh4MXNmVAo0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDMiCiMgU2VyaWFsOiAxNDMyNjY5ODY2OTkwOTA3NjYyOTQ3MDA2MzUzODEyMzA5MzQ3ODg2NjU5MzAKIyBNRDUgRmluZ2VycHJpbnQ6IGEwOmQ0OmVmOjBiOmY3OmI1OmQ4OjQ5Ojk1OjJhOmVjOmY1OmM0OmZjOjgxOjg3CiMgU0hBMSBGaW5nZXJwcmludDogMGQ6NDQ6ZGQ6OGM6M2M6OGM6MWE6MWE6NTg6NzU6NjQ6ODE6ZTk6MGY6MmU6MmE6ZmY6YjM6ZDI6NmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmNlOjZjOmZlOjdiOmYxOjRlOjYwOmIyOmUzOjQ3OmI4OmRmOmU4OjY4OmNiOjMxOmQwOjJlOmJiOjNhOmRhOjI3OjE1OjY5OmY1OjAzOjQzOmI0OjZkOmIzOmE0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCdGpDQ0FWdWdBd0lCQWdJVEJteWYxWFNYTm1ZL093dWEyZWllZGdQeVNqQUtCZ2dxaGtqT1BRUURBakE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0F6TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdNekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQ21YcDhaQmY4QU5tK2dCRzFiRzhsS2wKdWkyeUV1alNMdGY2eWNYWXFtMGZjNEU3TzVock9Yd3pwY1ZPaG82QUYyaGlSVmQ5UkZnZHN6Zmxad2pyWnQ2agpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlNyCnR0dlhCcDQzckRDR0I1Rnd4NXpFR2JGNHdEQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE0SVdTb3hlM2pma3IKQnFXVHJCcVlhR0Z5K3VHaDBQc2NlR0NtUTVuRnVNUUNJUUNjQXUveGxKeXpsdm5yeGlyNHRpeitPcEFVRnRlTQpZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgNCIKIyBTZXJpYWw6IDE0MzI2Njk4OTc1ODA4MDc2Mzk3NDEwNTIwMDYzMDc2Mzg3Nzg0OTI4NDg3OAojIE1ENSBGaW5nZXJwcmludDogODk6YmM6Mjc6ZDU6ZWI6MTc6OGQ6MDY6NmE6Njk6ZDU6ZmQ6ODk6NDc6YjQ6Y2QKIyBTSEExIEZpbmdlcnByaW50OiBmNjoxMDo4NDowNzpkNjpmODpiYjo2Nzo5ODowYzpjMjplMjo0NDpjMjplYjphZToxYzplZjo2MzpiZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6NWQ6Mjg6NDE6OWU6ZDA6MjA6MjU6Y2Y6YTY6OTA6Mzg6Y2Q6NjI6Mzk6NjI6NDU6OGQ6YTU6YzY6OTU6ZmI6ZGU6YTM6YzI6MmI6MGI6ZmI6MjU6ODk6NzA6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI4akNDQVhpZ0F3SUJBZ0lUQm15ZjE4RzdFRXdwUStWeGUzc3N5QnJCRGpBS0JnZ3Foa2pPUFFRREF6QTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQTBNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ05EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk5LcmlqZFBvMU1OL3NHS2UwdW9lMFpMWTdCaQo5aTBiMndoeElkSUE2R085bWlmNzhEbHVYZW85cGNtQnFxTmJJSmhGWFJiYi9lZ1FiZU9jNE9POVg0Umk4M0JrCk02RExKQzl3dW9paEtxQjErSUd1WWdiRWdkczViaW13SHZvdVhLTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRk5Qc3h6cGxic3poMm5hYVZ2dWM4NFp0VitXQgpNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHFMSWZHOWZoR3QwTzlZbGkvVzY1MStrSTByejJaVnd5empLS2x3CkNrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxQUU0N3hEcVVFcEhKV0VhZElSTnlwNGljaXVSTVN0dVcKMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgU3ViamVjdDogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBMYWJlbDogIkx1eFRydXN0IEdsb2JhbCBSb290IDIiCiMgU2VyaWFsOiA1OTkxNDMzODIyNTczNDE0NzEyMzk0MTA1ODM3Njc4ODExMDMwNTgyMjQ4OTUyMQojIE1ENSBGaW5nZXJwcmludDogYjI6ZTE6MDk6MDA6NjE6YWY6Zjc6ZjE6OTE6NmY6YzQ6YWQ6OGQ6NWU6M2I6N2MKIyBTSEExIEZpbmdlcnByaW50OiAxZTowZTo1NjoxOTowYTpkMTo4YjoyNTo5ODpiMjowNDo0NDpmZjo2Njo4YTowNDoxNzo5OTo1ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTQ6NDU6NWY6NzE6Mjk6YzI6MGI6MTQ6NDc6YzQ6MTg6Zjk6OTc6MTY6OGY6MjQ6YzU6OGY6YzU6MDI6M2I6ZjU6ZGE6NWI6ZTI6ZWI6NmU6MWQ6ZDg6OTA6MmU6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3ekNDQTZ1Z0F3SUJBZ0lVQ242bTMwdEVudHBxSklXZTVyZ1YweFovdTdFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JqRUxNQWtHQTFVRUJoTUNURlV4RmpBVUJnTlZCQW9NRFV4MWVGUnlkWE4wSUZNdVFTNHhIekFkQmdOVgpCQU1NRmt4MWVGUnlkWE4wSUVkc2IySmhiQ0JTYjI5MElESXdIaGNOTVRVd016QTFNVE15TVRVM1doY05NelV3Ck16QTFNVE15TVRVM1dqQkdNUXN3Q1FZRFZRUUdFd0pNVlRFV01CUUdBMVVFQ2d3TlRIVjRWSEoxYzNRZ1V5NUIKTGpFZk1CMEdBMVVFQXd3V1RIVjRWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUWdNakNDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmVGbDc4Um1PbndZb05NUElmNVUybzNDL0lQUElmT2I5d21LYjNGCmlickpnejMzN3NwYnhtMUpjN1RKUnFNYk5CTS93WWxGVi9UWnNmczJaVXY3Q09KSWNSSElianVlbmQrSlpUZW0KaGZZN1JCaTJ4amN3WWtTU2wybDlRakFrNUEwTWlXdGozc1hoMzA2cEZHeFQ0R0hPOWhjdkhUeTk1aUpNSFpQMQpFTVNoZHV4cTNzVnMzNWEwVmtCQ3dHS1NNS0V0RlpTZzBpQUdDVzVxYmVYcnQ3N1U4UEVWZkl2bVRyb1R6RXNuClhwazhGMTJQZ1g4elBVL1RQeHZzWEQvd1BFeDFidkttMVozYUxRZGpBc1p5NlpTOFRFbVZUNGhTeU52b2FZTDQKekRSYkl2Q0dwNG05U0FwdFpvRnR5TWhrK3dIaDlPSGUyWjdkMjF2VUtwa21GUnNlVEpJcGdwN1Zrb0dTUVhBWgo5NlRsazB1OGQyY3gzUno5TVhBTkY1a00rUXc1R1NvWHRUQnhWZFVQcmxqaFBTODBtOCtmOW5pRndwTjZjajVtCmo1d1dFV0NQbm9sdlo3N2dSMW83REpwbmk4OUd4cTQ0by9LbnZPYldoV3N6SkhBaVM4c0ltN3ZJK0FJcEhiNGcKREVhL2E0ZWJzeXBtUWpWR2JLcTZyZm1ZZStsUVZSUXh2N0hhTGUyQXJXZ2srMm1yMkhFVE1PWm5zNGRBL1lsKwo4a1BSRWQ4dlpTOWt6bDhVdWJHL01iMkhlRnBaWllpcS9Ga3lTSWJXVExrcFM1WFRkdk4zSlcxQ0hEaURUZjJqClg1dC9MYXg1R3c1Q01aZGpwUHVLYWRVaURUU1FNQzZvdE9CdHRwU3N2SXRPMTNEOHhUaU9aQ1hoVFRtUXpzbUgKaEZoeEFnTUJBQUdqZ2Fnd2dhVXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkNCZ05WSFNBRU96QTVNRGNHQnl1QgpLd0VCQVFvd0xEQXFCZ2dyQmdFRkJRY0NBUlllYUhSMGNITTZMeTl5WlhCdmMybDBiM0o1TG14MWVIUnlkWE4wCkxteDFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlQvR0NoMitVZ0ZMS0d1OFNzYks3SlQKK0V0OHN6QWRCZ05WSFE0RUZnUVUveGdvZHZsSUJTeWhydkVyR3l1eVUvaExmTE13RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFHb1pGTzF1ZWNFc2g5UU5jSDdYOW5qSkN3Uk94TEhPazNEK3NGVEFNczJaTUdRWHZ3L2w0alA5CkJ6WkFjZzRhdG1wWjFnRGxhQ0RkTG5JTkgycGtNU0NFZlVtbVdqZnJSY21GOWRUSEY1a0g1cHRWNUF6b3FiVE8KakZ1MUVWelBpZzROMXF4M2dmNHluQ1NlY3M1VTg5QnZvbGJXN01NM0xHVll2bGNBR3ZJMSt1dDdNVjNDd1JJOQpsb0dJbG9uQldWeDY1bjl3Tk9lRDRySGg0YmhZNzlTVjVHQ2M4SmFYY296cmhBSXVaWStrdDlKL1o5M0kwNTVjCnFxbWtvQ1VVQnB2c1QzNHRDMzhkZGZFejJPM091SFZ0UGx1NW1CMHhEVmJZUXc4d2tiSUVhOTFXdnBXQVZXZSsKMk0yRDJSanVMZytHTFpLZWNCUHMzbEhKUTNnQ3BVM0krVi9Fa1ZoR0ZuZGFkS3BBdkFlZk1MbXg5eElYM2VQLwpKRUFkZW1yUlR4Z0txcEFkNjBBZTM2RWVSSklRbXZLTjRkRkxScDdvUlVLWDZrV1o4K3htMVFMNjhxWktKS3JlCnpybksrVCtUYi9tanV1cWxQcG10L2Y5N21mVmw3dkJaS0dmWGtKV2tFNFNwaE1Ib3pzNTFrMk1hdkR6cTFXUWYKTFNvU09jYkRXakx0UjVFV0RydzR3VkRlajhvcWtEUWM3a0dVbkY0Wkx2aEZTWmwwa2JBRWIrTUVXckdyS3F2Kwp4OUNXdHRyaFNtUUdibUJOdlVKTy8zamFKTW9idE5lV09XeXU4UTZxcDMxSWl5Qk16MlRXdUpkR3NFN1JLbFk2Cm9KTzlyNEFrNEFwKzU4clZ5dWlGVmR3Mkt1R1VhSlBIWm5KRUQ0QWhNbXdseHlPQWd3cnIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBTdWJqZWN0OiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgTGFiZWw6ICJUVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBkYzowMDo4MTpkYzo2OToyZjozZToyZjpiMDozYjpmNjozZDo1YTo5MTo4ZTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDMxOjQzOjY0OjliOmVjOmNlOjI3OmVjOmVkOjNhOjNmOjBiOjhmOjBkOmU0OmU4OjkxOmRkOmVlOmNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NjplZDpjMzo2ODo5MDo0NjpkNTozYTo0NTozZjpiMzoxMDo0YTpiODowZDpjYTplYzo2NTo4YjoyNjo2MDplYToxNjoyOTpkZDo3ZTo4Njo3OTo5MDo2NDo4NzoxNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeApHREFXQmdOVkJBY1REMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwCmJYTmxiQ0IyWlNCVVpXdHViMnh2YW1scklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHcKS3dZRFZRUUxFeVJMWVcxMUlGTmxjblJwWm1scllYTjViMjRnVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMApCZ05WQkFNVExWUlZRa2xVUVVzZ1MyRnRkU0JUVFNCVFUwd2dTMjlySUZObGNuUnBabWxyWVhOcElDMGdVM1Z5CmRXMGdNVEFlRncweE16RXhNalV3T0RJMU5UVmFGdzAwTXpFd01qVXdPREkxTlRWYU1JSFNNUXN3Q1FZRFZRUUcKRXdKVVVqRVlNQllHQTFVRUJ4TVBSMlZpZW1VZ0xTQkxiMk5oWld4cE1VSXdRQVlEVlFRS0V6bFVkWEpyYVhsbApJRUpwYkdsdGMyVnNJSFpsSUZSbGEyNXZiRzlxYVdzZ1FYSmhjM1JwY20xaElFdDFjblZ0ZFNBdElGUlZRa2xVClFVc3hMVEFyQmdOVkJBc1RKRXRoYlhVZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBJQzBnUzJGdGRTQlQKVFRFMk1EUUdBMVVFQXhNdFZGVkNTVlJCU3lCTFlXMTFJRk5OSUZOVFRDQkxiMnNnVTJWeWRHbG1hV3RoYzJrZwpMU0JUZFhKMWJTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXIzVXdNNnE3CmE5T1pMQkkzaE5tTmU1ZUEwMjduLzV0UWxUNlFsVlpDMXhsOEpvU05rdm9CSFRvUDRtUTR0NHk4NklqNWl5U3IKTHFQMU4rUkFqaGdsZVlOMUh6di9iS2pGeGxiNHRPMktSS09yYkV6OEhkRGM3Mmk5eitTcXp2QlY5NkkwMUlOcgpOM3djd3Y2MUEreFh6cnkwdGNYdEFBOVROeXBOOUU4TWcvdUd6OHYrakU2OWgvbW5peUZYbkhyZkEyZUpMSjJYCllhY1F1RldRZnc0dEp6aDAzK2Y5Mms0UzQwMFZJZ0xJNE9EOEQ2MksxOGxVVU13N0Q4b1dnSVRRVVZiRGpsWi8KaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOVdTTXM1dVdrOTlnTDdlcVFRRVNvbGJ1VDFkQ0FOTFpHZUE0ZgpBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVWlQvSGlvYkdQTjA4VkZ3MStEcnRVZ3hIClY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmCklQUDU0K002Mzh5Y2xOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTQKbHp3REdycER4cGE1UlhJNHM2ZWhsajJSZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3Ywo4akV5VnVwaytlcTFuUlptUW5MemY5T3hNVVA4cEk0WDhXMGpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmCmxvM1B0djBBblZvVW1yOENSUFhCd3A4aVhxSVBvZU09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBTdWJqZWN0OiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBMYWJlbDogIkdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QiCiMgU2VyaWFsOiA5MDA5ODk5NjUwNzQwMTIwMTg2CiMgTUQ1IEZpbmdlcnByaW50OiA2MzpjYzpkOTozZDozNDozNTo1Yzo2Zjo1MzphMzplMjowODo3MDo0ODoxZjpiNAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOjM2OjM4OjViOjgxOjFhOjI1OmMzOjliOjMxOjRlOjgzOmNhOmU5OjM0OjY2OjcwOmNjOjc0OmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpmZjo4ZjpkMDo0NDozMzo0ODo3ZDo2YTo4YTphNjowYzoxYToyOTo3Njo3YTo5ZjpjMjpiYjpiMDo1ZTo0MjowZjo3MTozYToxMzpiOTo5Mjo4OToxZDozODo5MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlEQ0NBM0NnQXdJQkFnSUlmUW1YL3ZCSDZub3dEUVlKS29aSWh2Y05BUUVMQlFBd1lqRUxNQWtHQTFVRQpCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUI0WERURTAKTVRFeU5qQTFNVE14TlZvWERUUXdNVEl6TVRFMU5UazFPVm93WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3QmdOVgpCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3CkhRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEyYU1XOE1oMGRIZWI3ek1OT3daK1ZmeTFZSTkyaGhKQ2ZWWm1Qb2lDN1hKagpEcDZMM1RRc0FsRlJ3eG45V1ZTRXlmRnJzMHl3NmVoR1hUakdvcWN1RVZlNmdoV2luSTl0c0psS0N2THJpWEJqClRubkV0MXU5b2wyeDhrRUNLNjJwT3FQc2VRcnNYenJqL2UrQVBLMDBteHFyaUNaN1ZxS0NoaC9yTlltRGYxK3UKS1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnJwZnRaVHFmcmxZd2lPWG5oTFFpUHpMeVJ1RUgzRk1FagpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSjlDeTVXbVlxc0JlYm5oNTJuVXBtCk1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FReFhBQlpHMTIKWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUAp6Z3NNUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drCkwzMFNnTGRUTUVaZVMxU1pEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUMKakdIZXVMelJMNXo3RDlBcjdSdDJ1ZVE1VmZqNG9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQQpIUUJVbHdiZ3NRZlp4dzljWlgwOGJWbFg1TzJsamVsQVU1OFZTNkJ4OWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDCkF3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZPTEpRSjlOenVpYW9YelBEajlseFNtSWFobFJNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURSU1ZmZwpwOHhvV0xvQkR5c1p6WTJ3WVVXc0VlMWpVR240SDMrK0ZvLzluZXNMcWpKSGR0Sm5KTzI5ZkRNeWx5ckhCWVptCkRSZDlGQlViMU92OUg1cjJYcGRwdHhvbHBBcXprVDlmTnF5TDdGZW9QdWVCaWhoWE9ZVjBHa0xINlZzVFg0LzUKQ09tU2RJMzFSOUtyTzliN2VHWk9ObjM1NlpMcEJONzlTV1A4YmZzVWNaTm5MMGRLdDduL0hpcHpjRVl3djFyeQpMM21sNFkwTTJmbXlZemVNTjJXRmNHcGNXd2x5dWExalBMSGQrUHd5dnplRzVMdU9tQ2QrdWg4VzRYQVI4Z1BmCkpXSXlKeVlZTW9TZi93QTZFN3FhVGZSUHVCUndJckhLSzVET0tjRnc5QytkZi9LUUh0WmEzN2RHL09hRytzdmcKSUhaNnVxYkw5WHplWXFXeGkrN2VnbWFLVGpvd0h6K0F5NjBudWd4ZTE5Q3hWc3AzY2JLMWRhRlFxVUJERjhJbwoyYzlTaTF2SVk5UkNQcUF6ZWtZdTl3b2dSbFIrYWs4eDhZRitRblE0WlhNbjdzWjh1STdYcFRyWG1LR2NqQkJWCjA5dEw3RUNROHMxdVY5SmlEbnhYazdHbmJjMmRnN3NxNStXMk8zRllyZjNSUmJ4YWtlNVRGVy9UUlFsMWJycVEKWFI0RXp6ZmZIcWhtc1l6bUlHcnYvRWhPZEpoQ3J5bHZMbXJIKzMzUlpqRWl6SVlBZm1hRERFTDB2VFNTd3hycQpUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VGFhQXBKVXFseXl2ZGltWUhGbmdWVjNFYjdQVkhoUE9lCk1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTEiCiMgU2VyaWFsOiAxNTc1MjQ0NDA5NTgxMTAwNjQ4OQojIE1ENSBGaW5nZXJwcmludDogNmU6ODU6ZjE6ZGM6MWE6MDA6ZDM6MjI6ZDU6YjI6YjI6YWM6NmI6Mzc6MDU6NDUKIyBTSEExIEZpbmdlcnByaW50OiBmZjpiZDpjZDplNzo4MjpjODo0Mzo1ZTozYzo2ZjoyNjo4Njo1YzpjYTphODozYTo0NTo1YjpjMzowYQojIFNIQTI1NiBGaW5nZXJwcmludDogZDQ6MGU6OWM6ODY6Y2Q6OGY6ZTQ6Njg6YzE6Nzc6Njk6NTk6ZjQ6OWU6YTc6NzQ6ZmE6NTQ6ODY6ODQ6YjY6YzQ6MDY6ZjM6OTA6OTI6NjE6ZjQ6ZGM6ZTI6NTc6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lKQU5xYjdISHpBN0FaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdrTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5ZFhOMFEyOXkKSUZKdmIzUkRaWEowSUVOQkxURXdIaGNOTVRZd01qQTBNVEl6TWpFMldoY05Namt4TWpNeE1UY3lNekUyV2pDQgpwREVMTUFrR0ExVUVCaE1DVUVFeER6QU5CZ05WQkFnTUJsQmhibUZ0WVRFVU1CSUdBMVVFQnd3TFVHRnVZVzFoCklFTnBkSGt4SkRBaUJnTlZCQW9NRzFSeWRYTjBRMjl5SUZONWMzUmxiWE1nVXk0Z1pHVWdVaTVNTGpFbk1DVUcKQTFVRUN3d2VWSEoxYzNSRGIzSWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVI4d0hRWURWUVFEREJaVQpjblZ6ZEVOdmNpQlNiMjkwUTJWeWRDQkRRUzB4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdjQ2M2xlTENKaEpyTXhuSFFGZ0txMW1xalFDai9JREhVSHVPMUNBbXVqSVMyQ05VU1NVUUlwaWQKUnRMQnlaNU9HeTRzRGpqekdpVm9IS1phQmVZZWkwaS9tSlowUG1uSzZiVjRwUWE4MVFCZUNRcnlKM3BTL0MzVgpzZXEwaVdFazh4b1QyNm5QVXUwTUpMcTVudXgrQUhUNms2MXNLWkt1VWJTNzAxZS9zL09valp6MEpFc3ExcG1lCjlKNyt3SDVDT3VjTGxWUGF0MmdPa0V6N2NEK1BTaXlVOHliZFkybXBsTmdRVHNWSENKQ1pHeGROdVd4dTcyQ1YKRVk0aGdMVzlvSFBZMExKM3hFWHFXaWI3Wm5aMitBWWZZVzBQVmNXRHR4QldjZ1lIcGZPeEdnTUZaQTZkV29yVwpobkFiSk43K0tJb3IwR3F3L0hxaTNMSjVEb3RsRHdJREFRQUJvMk13WVRBZEJnTlZIUTRFRmdRVTdtdEpQSG8vCkRlT3hDYmVLeUtzWm4zTXpVT2N3SHdZRFZSMGpCQmd3Rm9BVTdtdEpQSG8vRGVPeENiZUt5S3NabjNNelVPY3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUNVWTFKR1BFKzZQSGgwUlU5b3RSQ2tab0I1ck1aNU5EcDZ0UFZ4QmI1VXJKS0Y1bURvNE52dTdacDVJCi81Q1E3ejNVdUp1MGgzVS9JSnZPY3MraFZjRk5aS0laQnFFSE13d0xLZVh4NnF1ajdMVUtkSkRIZlhMeTExeWYKa2UrUmk3ZmM3V2FpejQ1bU83eWZPZ0xnSjkwV21NQ1YxQXFrNUlHYWRaUTFuSkJmaURjR3JWbVZDckRSWjlNWgp5b25uTWxvMkhENkNxRnFUdnNiUVpKRzJ6OW0yR00vYmZ0SmxvNmJFamhjeHdmdCtkdHZUaGVOWXNuZDZkanRzCkwxQWM1OXYyWjNrZjlZS1ZtZ2VuRksrUDNDZ2had25TMWsxYUhCa2NqbmRjdzVRa1BUSnJTMzdVZUpTRHZqZE4KemwvSEhrNDg0SWt6bFFzUHBUTFdQRnA1TEJrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiIKIyBTZXJpYWw6IDI3MTE2OTQ1MTAxOTkxMDE2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IGEyOmUxOmY4OjE4OjBiOmJhOjQ1OmQ1OmM3OjQxOjJhOmJiOjM3OjUyOjQ1OjY0CiMgU0hBMSBGaW5nZXJwcmludDogYjg6YmU6NmQ6Y2I6NTY6ZjE6NTU6Yjk6NjM6ZDQ6MTI6Y2E6NGU6MDY6MzQ6Yzc6OTQ6YjI6MWM6YzAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA3OjUzOmU5OjQwOjM3OjhjOjFiOmQ1OmUzOjgzOjZlOjM5OjVkOmFlOmE1OmNiOjgzOjllOjUwOjQ2OmYxOmJkOjBlOmFlOjE5OjUxOmNmOjEwOmZlOmM3OmM5OjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHTHpDQ0JCZWdBd0lCQWdJSUphSGZ5alBMV1FJd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2FReEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVmTUIwR0ExVUVBd3dXVkhKMWMzUkRiM0lnClVtOXZkRU5sY25RZ1EwRXRNakFlRncweE5qQXlNRFF4TWpNeU1qTmFGdzB6TkRFeU16RXhOekkyTXpsYU1JR2sKTVFzd0NRWURWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZwpRMmwwZVRFa01DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEClZRUUxEQjVVY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnkKZFhOMFEyOXlJRkp2YjNSRFpYSjBJRU5CTFRJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDbklHN0NLcUppSkpXUWRzZzRmb0RTcThHYlpRV1U5TUVLRU5VQ3JPMmZrOGVIeUxBbkswSU1QUW8rClFWcWVkZDJOeXVDYjdHZ3lwR21TYUl3TGdRNVdvRDRhM1N3bEZJSXZsOU5rUnZSVXFkdzZWQzB4SzVtQzh0a3EKMSs5eEFMZ3hwTDU2SkFmRFFpRHlpdFNTQkJ0bFZreHMxUHUyWVZwSEk3VFlhYlMzT3RCMFBBeDFvWXhPZHFIcAoyeXFsTy9yT3NQOSthaWo5Snh6SXNla3A4VmR1WkxUUXdSVnREcjR1RGtiSVh2UlIvdThPWXpvN2NiclBiMW5LCkRPT2JYVW00VE9KWHNaaUtRbGVjZHUvdnZkRm9xTkwwQ2J0M05iNGxnZ2pFRml4RUlGYXBSQkYzNzEyMEhhcGUKYXo2TE12WUhMMWNFa3NyMS9wM0M2ZWl6amt4TEFqSFo1RHhJZ2lmM0dJSjJTRHB4c1JPaE9kVXV4VFRDSFdLRgozd1ArVGZTdlBkOWNXNDM2Y09HbGZpZkhoaTVxanhMR2hGNURVVkNjR1p0NDV2ejI3VWQrZXoxbTd4TVRpRjg4Cm9XUDcrYXlITlovemdwNmtQd3FjTVdtTG1hU0lTbzV1WmszdkZzUVBlU2doWUEyRkZuM1hWRGp4a2xiOXRUTk0KZzl6WEVKOUwvY2I0UXIyNmZITUM0UDk5elZ2aDFLeGhlMWZWU250YjFJVllKMTIvK0N0Z3JLQW1yaFFoSjhaMwptak9BUEY1R1AvZkRzYU9HTThib1hnMjVOU3lxUnNHRkFuV0FvT3NrK3hXcTVHZC9ibmMvOUFTS0wzeDc0eGRoCjhOMEpxU0RJdmdtazBINUV3N0l3U2ppcXFld1ltZ2VDSzl1NG5CaXQydUJHRjZ6UFhRSURBUUFCbzJNd1lUQWQKQmdOVkhRNEVGZ1FVMmY0aFFHNlVucnliUFp4OW1DQVo1WXd3WXJJd0h3WURWUjBqQkJnd0ZvQVUyZjRoUUc2VQpucnliUFp4OW1DQVo1WXd3WXJJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFKNUZuZ3c3dHUvaE9zaDgwUUE5eitMcUJyV3lPcnNHUzJoNjBDT1gKZEtjczhBalllVnJYV29TSzJCS2FHOWw5WEUxd3hhWDVxK1dqaVluZEFmcnMzZm5wa3BmYnNFWkM4OU5pcXBYKwpNV2NVYVZpUUNxb0w3amNqeDFCUnRQVitudU43OStUTVFqSXRTUXpMLzBrTW14NDAvVzV1bG9wNUE3WnYyd25MCi9WOWxGRGZoT1BYellSWlk1TFZ0RFFzRUd6OVFMWCt6eDNvYUZvQmcrSW9mNlJzcXh2bTZBUnBwdjlKWXgxUlgKQ0kvaE9XQjNTNnhaaEJxSThkM0xUM2pYNStFekxmenVRZm9nc0w3TDl6aVV3T0hRaFErNzdTeHpxKzMra25ZYQpaSDliRFRNSkJ6TjdCajhScEZ4d1BJWEF6K09RcUlOMyt0dm14WXhvWnhCbnBWSXQ4TVNaajMrLzBXdml0VWZXCjJkQ0ZtVTJVbXc5TGplNEFXa2NkRVFPc1FSaXZoN2R2RERxUHlzL2NBOEdpQ2NqbC9ZQmV5R0JDQVJzYVUxcTcKTjZhM3ZMcUU2UjVzR3RSazJ0UkQvcE9MUy9Jc2VSWVExSk1MaUkraDJJWVVScEZIbXlnazcxZFNUbHhDbktyMwpTZXduNkVBZXM2YUpJbktjOVEwenRGaWpNRHZkMUdwVWs3NGFUZk9UbFBmOGhBcy9oQ0JjTkFORXhkcXR2QXJCCkFzOGU1WlRaODQ1YjJFenduZXhoRjdzVU1sUU1BaW1USHBLRzluL3Y1NUlGRGxuZG1RZ3VMdnFjQUZMVHhXWXAKNUtlWFJLUU9LSUVUTmNYMmIyVG1RY1RWTDh3MFJTWFBRUUNXUFVvdXdwYVlUMDVLbkplMzJ4K1NNc2ovRDFGdQoxdXdKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIEVDQS0xIgojIFNlcmlhbDogOTU0ODI0Mjk0Njk4ODYyNTk4NAojIE1ENSBGaW5nZXJwcmludDogMjc6OTI6MjM6MWQ6MGE6ZjU6NDA6N2M6ZTk6ZTY6NmI6OWQ6ZDg6ZjU6ZTc6NmMKIyBTSEExIEZpbmdlcnByaW50OiA1ODpkMTpkZjo5NTo5NTo2Nzo2Yjo2MzpjMDpmMDo1YjoxYzoxNzo0ZDo4Yjo4NDowYjpjODo3ODpiZAojIFNIQTI1NiBGaW5nZXJwcmludDogNWE6ODg6NWQ6YjE6OWM6MDE6ZDk6MTI6YzU6NzU6OTM6ODg6OTM6OGM6YWY6YmI6ZGY6MDM6MWE6YjI6ZDQ6OGU6OTE6ZWU6MTU6NTg6OWI6NDI6OTc6MWQ6MDM6OWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lKQUlTQ0xGOGNZdEJBTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdjTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hGekFWQmdOVkJBTU1EbFJ5ZFhOMFEyOXkKSUVWRFFTMHhNQjRYRFRFMk1ESXdOREV5TXpJek0xb1hEVEk1TVRJek1URTNNamd3TjFvd2dad3hDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFWE1CVUdBMVVFQXd3T1ZISjFjM1JEYjNJZwpSVU5CTFRFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURQaitBUnRaK29kbmJiCjN3OVU3M05qS1lLdFI4YWphKzMrWHpQNFExSHBHak9STVJlZ2RNVFVwd0htc3BJK2FwM3REdmwwbUVEVFB3T0EKQm9KQTZMSGlwMUduSFlNbWE2dmUraGVSSzlqR3JCNnhuaGtCMVplbTZnMjN4RlVmSjN6U0NOVjJIeWtWaDBBNQozVGhGRVhYUW1xYzA0TC9OeUZJZHVVZCtEYmk3eGd6MmMxY1dXbjVEa1I5Vk9zWnRSQVNxbkttY3AweUpGNE91Cm93UmVVb0NMSGhJbEVSblhESDE5TVVSQjZ0dXZzQnp2Z2RBc3hab2htejN0UWp0UUp2THN6bkZoQm1JaFZFNS8Kd1owK2Z5Q01nTXNxMkpkaXlJTXprWDJ3b2xvUFYrZzd6UElsc3RSOEwreE54cUU2RlhybnRsMDE5ZlpJU2paRgpadFM2bUZqQkFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFmCkJnTlZIU01FR0RBV2dCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQlQ0MVhCVndtOG5IYzJGdgpjaXZVd28veVExMEN6c1NVdVpRUmcyZGQ0bWRzZFhhL3V3eXFOc2F0UjVOajNCNSsxdDR1L3VrWk1qZ0RmeFQyCkFITXNXYkVoQnVIN3JCaVZES1AvbVpiM0t5ZWIxU1RNSGQzQk91Q1lSTERFNUQ1M3NYT3BaQ3oySEFGOFAxMUYKaGNDRjV5V1BsZHdYOHp5ZkdtNnd5dU1kS3VsTVkvb2tZV0xXMm42MkhHejFBaDNVS3QxVmtPc3FFVWM4TGw1MApzb0lpcFgxVEgwWHNKNUY5NXlJVzZNQm9OdGpHOFUrQVJETDU0ZEhSSGFyZXFLdWNCSyt0SUE1a21FMmxhOEJJCldKWnBUZHdIakZHVG90K2ZEejJMWUxTQ2phb0lUbUpGNFBrTDB1RGdQRnZlWEhFbkpjTG1BNEdMRUZQangxV2kKdEovWDVnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIgojIFNlcmlhbDogODg3NTY0MDI5NjU1ODMxMDA0MQojIE1ENSBGaW5nZXJwcmludDogODY6Njk6MTI6YzA6NzA6ZjE6ZWM6YWM6YWM6YzI6ZDU6YmM6YTU6NWI6YTE6MjkKIyBTSEExIEZpbmdlcnByaW50OiBiNzphYjozMzowODpkMTplYTo0NDo3NzpiYToxNDo4MDoxMjo1YTo2ZjpiZDphOTozNjo0OTowYzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogODU6NjY6NmE6NTY6MmU6ZTA6YmU6NWM6ZTk6MjU6YzE6ZDg6ODk6MGE6NmY6NzY6YTg6N2U6YzE6NmQ6NGQ6N2Q6NWY6Mjk6ZWE6NzQ6MTk6Y2Y6MjA6MTI6M2I6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzVENDQThXZ0F3SUJBZ0lJZXl5YjB4YUFNcGt3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrR0ExVUUKQmhNQ1ZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRSwpEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZd01qRXlNVGN6T1RNNVdoY05OREV3TWpFeU1UY3oKT1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52CmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUgp4RmRIYXhoM2EzYnkvWlBrUFEvQ0ZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYCnFodkl1RzVpWG1teFg5c3FBbjc4Yk1yelFkanQwT2o4UDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0MKQzUyR1ZXSDllamp0L3VJWkFMZHZvVkJpZFhROG9QcklKWkswYm5vaXgvZ2VvZU95M1pFeHF5c2RCUCtsU2dRMwo2WVdrTXl2OTR0WlZOSHdacEVwb3g3S28wN2ZLb1pPSTY4R1h2SXo1SGRraWhDUjB4d1E5YXFrcGs4enJ1RnZoCi9sOGxxalJZeU1FalZKMGJtQkhET0p4K1BZWnNwUTlBaG53QzlGd0NUeWpMcm5HZkR6cklNLzRSSlRYcS9MckYKWUQzWmZCalZzcW5UZFhnRGNpTEtPc01mN3l6bExxbjZuaXkyVVViOXJ3UFc2bUJvNm9VV05tdUY2UjdBczkzRQpKTnlBS29GQmJaUSt5T0RKZ1VFQW5sNi9mOFVJbUtJWUxFSkFzL2x2T0NkTFRvRDBQWUZINEloODZoek90WFZjClVTNGNLMzhhY2lqbkFMWFJkTWJYNUordEI1TzJVelUxL0Rma3cvWmRGcjRoYzk2U0N2aWdZMnE4bHBKcVB2aTgKWlZXYjN2VU5pU1lFL0NVYXBpVnB5OEp0eW56aVdWK1hyT3Z2THNpODF4dFpQQ3ZNOGhuSWsyc25ZeG5QL09rbQorTXB4bTMrVC9qUm5oRTZaNi95emVBa3pjTHBtcG5idEczUHJHcVVOeENJVElKUldDazRzYkU2eC9jK2NDYnFpCk0rMkhBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlRkQkFrSG92VjZmVkpURXBLVjdqaUFKUTJtV1RBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTjBFQ1FlaTlYcDlVbE1Ta3BYdU9JQWxEYVpaTUE0RwpBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUlCZ1JsQ243SnAwY0hoNXdZZkdWCmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcmRJV1FQWGhxOUxtTHBaYzd0UmlSdXg2bitVQmJrZmxWbWE4ZUVkQmMKSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmaWpoRFB3R0ZwVWVuUFVheXZPVWlhUGQ3bk5ncwpQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2x1MU9KRDdPQVVONUY3a1IvCnE1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcWVyUTAKY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcgphNngrM3V4ak14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJCkgzN2hWWmtMSWQ2VG5ncjc1cU5KdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1kKSzlmMUptekpCalNXRnVwd1dSb3llWGtMdG9oL0QxSklQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dQpuTHdzb0Z2VmFnQ3ZYemZoMWZvUUM1aWNodWNtajg3dzdHNktWd3VBNDA2eXdLQmpZWkM2VldnM2RHcTJrdHVmCm9ZWWl0bVVuRHV5Mm4wSmc1R2ZDdGRwQkM4VFRpMkVidlBvZmtTdlhSQWRldWltczJjWHA3MU5JV3V1QThTaFkKSWMyd0JsWDdKejlUa0hDcEJCNVhKN2s9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDg0OTU3MjM4MTMyOTcyMTY0MjQKIyBNRDUgRmluZ2VycHJpbnQ6IDJlOmRhOmU0OjM5OjdmOjljOjhmOjM3OmQxOjcwOjlmOjI2OjE3OjUxOjNhOjhlCiMgU0hBMSBGaW5nZXJwcmludDogYzM6MTk6N2M6Mzk6MjQ6ZTY6NTQ6YWY6MWI6YzQ6YWI6MjA6OTU6N2E6ZTI6YzM6MGU6MTM6MDI6NmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM0OjE3OmJiOjA2OmNjOjYwOjA3OmRhOjFiOjk2OjFjOjkyOjBiOjhhOmI0OmNlOjNmOmFkOjgyOjBlOjRhOmEzOjBiOjlhOmNiOmM0OmE3OjRlOmJkOmNlOmJjOjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMAphVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6CldqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodmRYTjAKYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52YlNCUwpiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCCkJBQWlBMklBQkVWdXFWREVwaU0ybmw4b2pSZkxsaUprUDl4NmpoM01DTE9pY1NTNmprbTVCQnRIbGxpckxaWEkKN1o0SU5jZ242NG1NVTFqcllvcis4RnNQYXpGU1kwRTdpYzNzN0xhTkdkTTBCOXk3eGdaL3drV1Y3TXQvcUNQZwpDZW1CK3ZOSDA2TmpNR0V3SFFZRFZSME9CQllFRklMUmhYTXc1elVFMDQ0Q2t2dmxwTkhFSWVqTk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVZ3RHRmN6RG5OUVRUamdLUysrV2swY1FoNk0wd0RnWUQKVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HL242MWtScEdEUFliQ1dlKzBGK1M4VAprZHp0NWZ4UWF4RkdSck1jSVFCaXU3N0Q1K2pOQjVuNURRdGRjajdFcWdJd0g3eTZDK0l3SlB0OGJZQlZDcGsrCmdBMHo1V2FqczZPN3BkV0xqd2tzcGwxKzR2QUhDR2h0MG54cGJsL2Y1V3BsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiIKIyBTZXJpYWw6IDYyNDgyMjc0OTQzNTI5NDMzNTAKIyBNRDUgRmluZ2VycHJpbnQ6IGUxOjFlOjMxOjU4OjFhOmFlOjU0OjUzOjAyOmY2OjE3OjZhOjExOjdiOjRkOjk1CiMgU0hBMSBGaW5nZXJwcmludDogNzQ6M2E6ZjA6NTI6OWI6ZDA6MzI6YTA6ZjQ6NGE6ODM6Y2Q6ZDQ6YmE6YTk6N2I6N2M6MmU6YzQ6OWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJlOjdiOmYxOjZjOmMyOjI0Ojg1OmE3OmJiOmUyOmFhOjg2Ojk2Ojc1OjA3OjYxOmIwOmFlOjM5OmJlOjNiOjJmOmU5OmQwOmNjOjZkOjRlOmY3OjM0OjkxOjQyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGNnpDQ0E5T2dBd0lCQWdJSVZyWXB6VFM4ZVBZd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lJeEN6QUpCZ05WCkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUUKQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXlNQjRYRFRFM01EVXpNVEU0TVRRek4xb1hEVFF5Ck1EVXpNREU0TVRRek4xb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEcKQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRApEQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBanpabFFPSFdUY0RYdE9sRzJtdnEKTTBmTlRQbDlmYjY5TFQzdzIzamhocVhadWdsWGFPMVhQcURRQ0VHRDV5aEJKQi9qY2hYUUFScjdYbkFqc3N1ZgpPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3d2NYSHN3eHpwWTZJWEZKM3ZHMmZUaFZVQ0F0Wkp5Y3hhCjRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPWncrb3oxMldHUXZFNDNMcnJkRjkKSFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdytCNktqQlNZUgphWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBCmI5WmhDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVEKR3A4aExIOTR0MlM0Mk9pbTlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVgpQV0tjaGpnR0FHWVM1RmwyV2xQQUFwaWlFQ3RvUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PCnBnV1ZTYm9vaTRpVHNqUWMyS1JWYnJjYzBONlpWVHNqOUNMZytTbG1KdXdnVUhmYlNndVB2dVVDWUhCQlh0U3UKVURraUZDYkxzanR6ZEZWSEIzbUJPYWd3RTBUbEJJcXVsaE1sUWcrNVU4U2IvTTNrSE40OCtxdldCa29mWjZhWQpNQnpkTE52Y0dKVlhac2IvWEl0VzlYY0NBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WCkhTTUVHREFXZ0JUNVlMdlU0OVUwOXJqMUJvQWxwM1BiUm1tb25qQWRCZ05WSFE0RUZnUVUrV0M3MU9QVk5QYTQKOVFhQUphZHoyMFpwcUo0d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCVwpzNDdMQ3AxSmpyK2t4Skc3WmhjRlVaaDErK1ZRTEhxZThSVDZxOU9LUHYrUktZOWppOWkwcVZRQkRiNlRoaS81ClNtM0hYdlZYK2NwVkhCSytSdzgyeGQ5cXQ5dDF3a2NsZjdueFkvaG9MVlVFMGZLTnNLVFB2RHhlSDNqbnBhQWcKY0xBRXhiZjNjcWZlSWcyOU15VkdqR1NTSnVNK0xtT1cycHVNUGZnWUNkY0R6SDJHZ3VES0JBZFJVTmYva3RVTQo3OXFHbjVuWDY3ZXZhT0k1SnBTNmFMZS9nOVBxZW1jOVltZXVKZVZ5Nk9MazdLNFM5a3NyUEovcHNFRHpPRlN6Ci9iZG95TnJHajFFOHN2dVIzQnpubTUzaHR3MXlqK0treEtsNCtlc1VyTVpEQmNKbE9TZ1lBc09Dc3AwRnZtWHQKbGw5bGREejdDVFV1ZTV3VC9Sc1BYY2R0Z1RwV0Q4dzc0YThDTHlLc1JzcEdQS0FjVE5aRXRGNHVYQlZtQ2VFbQpLZjdHVW1HNnNYUC93d3ljNVd4cWxEOFV5a0FXbFlUeldhbXNYMHhoazIzUk84eWlsUXdpcG1kblJDNjUyZEtLClFiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVScndVN1pjZWdiTEhOWWhMRGtCdmpKYzQwdkc5M2RyRVEKdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjFobE1ZZWdvdUNSdzJuNUg5Z29vaQpTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWDlod0oxQzA3Cm1LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDMxODIyNDY1MjY3NTQ1NTUyODUKIyBNRDUgRmluZ2VycHJpbnQ6IDU5OjUzOjIyOjY1OjgzOjQyOjAxOjU0OmMwOmNlOjQyOmI5OjVhOjdjOmYyOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNGM6ZGQ6NTE6YTM6ZDE6ZjU6MjA6MzI6MTQ6YjA6YzY6YzU6MzI6MjM6MDM6OTE6Yzc6NDY6NDI6NmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIyOmEyOmMxOmY3OmJkOmVkOjcwOjRjOmMxOmU3OjAxOmI1OmY0OjA4OmMzOjEwOjg4OjBmOmU5OjU2OmI1OmRlOjJhOjRhOjQ0OmY5OjljOjg3OjNhOjI1OmE3OmM4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDbERDQ0FocWdBd0lCQWdJSUxDbWNXeGJ0QlpVd0NnWUlLb1pJemowRUF3SXdmekVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5QmdOVkJBTU1LMU5UVEM1amIyMGdSVllnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5USXpXaGNOTkRFd01qRXlNVGd4Ck5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NTG1OdgpiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5CkFnRUdCU3VCQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUEKVkliYy9SL2ZBTGhCWWx6Y2NCWXkzaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdQpXbkJhQnUyKzhLR3d5dEFKS2FOak1HRXdIUVlEVlIwT0JCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXOHBlNWQ3U2dhck5xQzFrVWJiWmNwdVgKNWs4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTVFDSzVrQ0pOK3ZwMVJQWgp5dFJySlBPd1BZZEdXQnJzc2Q5disxYTZjR3ZIT016b3NZeFBEL2Z4WjNZT2c5QWVVWThDTUQzMkl5Z21UTVpnCmg1TW1tN0kxSHJyVzl6elJITTc2SlR5bUdvRVZXL01TRDJ6dVpZckpoNmo1QitCaW1veGNTZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KUEsDBBQAAAAAAAAAIQCCsqLP0QEAANEBAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuY2VydHMKfn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHJldHVybnMgdGhlIHByZWZlcnJlZCBkZWZhdWx0IENBIGNlcnRpZmljYXRlIGJ1bmRsZS4gVGhlcmUgaXMKb25seSBvbmUg4oCUIHRoZSBvbmUgZnJvbSB0aGUgY2VydGlmaSBwYWNrYWdlLgoKSWYgeW91IGFyZSBwYWNrYWdpbmcgUmVxdWVzdHMsIGUuZy4sIGZvciBhIExpbnV4IGRpc3RyaWJ1dGlvbiBvciBhIG1hbmFnZWQKZW52aXJvbm1lbnQsIHlvdSBjYW4gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHdoZXJlKCkgdG8gcmV0dXJuIGEgc2VwYXJhdGVseQpwYWNrYWdlZCBDQSBidW5kbGUuCiIiIgpmcm9tIHBpcC5fdmVuZG9yLmNlcnRpZmkgaW1wb3J0IHdoZXJlCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcHJpbnQod2hlcmUoKSkKUEsDBBQAAAAAAAAAIQB3yWFNWgYAAFoGAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NvbXBhdC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuY29tcGF0Cn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgaGFuZGxlcyBpbXBvcnQgY29tcGF0aWJpbGl0eSBpc3N1ZXMgYmV0d2VlbiBQeXRob24gMiBhbmQKUHl0aG9uIDMuCiIiIgoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY2hhcmRldAoKaW1wb3J0IHN5cwoKIyAtLS0tLS0tCiMgUHl0aG9ucwojIC0tLS0tLS0KCiMgU3ludGF4IHN1Z2FyLgpfdmVyID0gc3lzLnZlcnNpb25faW5mbwoKIzogUHl0aG9uIDIueD8KaXNfcHkyID0gKF92ZXJbMF0gPT0gMikKCiM6IFB5dGhvbiAzLng/CmlzX3B5MyA9IChfdmVyWzBdID09IDMpCgojIHRyeToKIyAgICAgaW1wb3J0IHNpbXBsZWpzb24gYXMganNvbgojIGV4Y2VwdCBJbXBvcnRFcnJvcjoKaW1wb3J0IGpzb24KCiMgLS0tLS0tLS0tCiMgU3BlY2lmaWNzCiMgLS0tLS0tLS0tCgppZiBpc19weTI6CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgKAogICAgICAgIHF1b3RlLCB1bnF1b3RlLCBxdW90ZV9wbHVzLCB1bnF1b3RlX3BsdXMsIHVybGVuY29kZSwgZ2V0cHJveGllcywKICAgICAgICBwcm94eV9ieXBhc3MsIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudCwgZ2V0cHJveGllc19lbnZpcm9ubWVudCkKICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCB1cmxzcGxpdCwgdXJsZGVmcmFnCiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IHBhcnNlX2h0dHBfbGlzdAogICAgaW1wb3J0IGNvb2tpZWxpYgogICAgZnJvbSBDb29raWUgaW1wb3J0IE1vcnNlbAogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KCiAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMucGFja2FnZXMub3JkZXJlZF9kaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKICAgIGJ1aWx0aW5fc3RyID0gc3RyCiAgICBieXRlcyA9IHN0cgogICAgc3RyID0gdW5pY29kZQogICAgYmFzZXN0cmluZyA9IGJhc2VzdHJpbmcKICAgIG51bWVyaWNfdHlwZXMgPSAoaW50LCBsb25nLCBmbG9hdCkKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQoKZWxpZiBpc19weTM6CiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHVybHNwbGl0LCB1cmxlbmNvZGUsIHF1b3RlLCB1bnF1b3RlLCBxdW90ZV9wbHVzLCB1bnF1b3RlX3BsdXMsIHVybGRlZnJhZwogICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgcGFyc2VfaHR0cF9saXN0LCBnZXRwcm94aWVzLCBwcm94eV9ieXBhc3MsIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudCwgZ2V0cHJveGllc19lbnZpcm9ubWVudAogICAgZnJvbSBodHRwIGltcG9ydCBjb29raWVqYXIgYXMgY29va2llbGliCiAgICBmcm9tIGh0dHAuY29va2llcyBpbXBvcnQgTW9yc2VsCiAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKCiAgICBidWlsdGluX3N0ciA9IHN0cgogICAgc3RyID0gc3RyCiAgICBieXRlcyA9IGJ5dGVzCiAgICBiYXNlc3RyaW5nID0gKHN0ciwgYnl0ZXMpCiAgICBudW1lcmljX3R5cGVzID0gKGludCwgZmxvYXQpCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwpClBLAwQUAAAAAAAAACEAE0PJMyBHAAAgRwAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jb29raWVzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5jb29raWVzCn5+fn5+fn5+fn5+fn5+fn4KCkNvbXBhdGliaWxpdHkgY29kZSB0byBiZSBhYmxlIHRvIHVzZSBgY29va2llbGliLkNvb2tpZUphcmAgd2l0aCByZXF1ZXN0cy4KCnJlcXVlc3RzLnV0aWxzIGltcG9ydHMgZnJvbSBoZXJlLCBzbyBiZSBjYXJlZnVsIHdpdGggaW1wb3J0cy4KIiIiCgppbXBvcnQgY29weQppbXBvcnQgdGltZQppbXBvcnQgY2FsZW5kYXIKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAuY29tcGF0IGltcG9ydCBjb29raWVsaWIsIHVybHBhcnNlLCB1cmx1bnBhcnNlLCBNb3JzZWwKCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKCgpjbGFzcyBNb2NrUmVxdWVzdChvYmplY3QpOgogICAgIiIiV3JhcHMgYSBgcmVxdWVzdHMuUmVxdWVzdGAgdG8gbWltaWMgYSBgdXJsbGliMi5SZXF1ZXN0YC4KCiAgICBUaGUgY29kZSBpbiBgY29va2llbGliLkNvb2tpZUphcmAgZXhwZWN0cyB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBjb3JyZWN0bHkKICAgIG1hbmFnZSBjb29raWUgcG9saWNpZXMsIGkuZS4sIGRldGVybWluZSB3aGV0aGVyIGEgY29va2llIGNhbiBiZSBzZXQsIGdpdmVuIHRoZQogICAgZG9tYWlucyBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIGNvb2tpZS4KCiAgICBUaGUgb3JpZ2luYWwgcmVxdWVzdCBvYmplY3QgaXMgcmVhZC1vbmx5LiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjb2xsZWN0aW5nCiAgICB0aGUgbmV3IGhlYWRlcnMgdmlhIGBnZXRfbmV3X2hlYWRlcnMoKWAgYW5kIGludGVycHJldGluZyB0aGVtIGFwcHJvcHJpYXRlbHkuIFlvdQogICAgcHJvYmFibHkgd2FudCBgZ2V0X2Nvb2tpZV9oZWFkZXJgLCBkZWZpbmVkIGJlbG93LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVlc3QpOgogICAgICAgIHNlbGYuX3IgPSByZXF1ZXN0CiAgICAgICAgc2VsZi5fbmV3X2hlYWRlcnMgPSB7fQogICAgICAgIHNlbGYudHlwZSA9IHVybHBhcnNlKHNlbGYuX3IudXJsKS5zY2hlbWUKCiAgICBkZWYgZ2V0X3R5cGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZQoKICAgIGRlZiBnZXRfaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gdXJscGFyc2Uoc2VsZi5fci51cmwpLm5ldGxvYwoKICAgIGRlZiBnZXRfb3JpZ2luX3JlcV9ob3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmdldF9ob3N0KCkKCiAgICBkZWYgZ2V0X2Z1bGxfdXJsKHNlbGYpOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHJlc3BvbnNlJ3MgVVJMIGlmIHRoZSB1c2VyIGhhZG4ndCBzZXQgdGhlIEhvc3QKICAgICAgICAjIGhlYWRlcgogICAgICAgIGlmIG5vdCBzZWxmLl9yLmhlYWRlcnMuZ2V0KCdIb3N0Jyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yLnVybAogICAgICAgICMgSWYgdGhleSBkaWQgc2V0IGl0LCByZXRyaWV2ZSBpdCBhbmQgcmVjb25zdHJ1Y3QgdGhlIGV4cGVjdGVkIGRvbWFpbgogICAgICAgIGhvc3QgPSB0b19uYXRpdmVfc3RyaW5nKHNlbGYuX3IuaGVhZGVyc1snSG9zdCddLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHNlbGYuX3IudXJsKQogICAgICAgICMgUmVjb25zdHJ1Y3QgdGhlIFVSTCBhcyB3ZSBleHBlY3QgaXQKICAgICAgICByZXR1cm4gdXJsdW5wYXJzZShbCiAgICAgICAgICAgIHBhcnNlZC5zY2hlbWUsIGhvc3QsIHBhcnNlZC5wYXRoLCBwYXJzZWQucGFyYW1zLCBwYXJzZWQucXVlcnksCiAgICAgICAgICAgIHBhcnNlZC5mcmFnbWVudAogICAgICAgIF0pCgogICAgZGVmIGlzX3VudmVyaWZpYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBoYXNfaGVhZGVyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX3IuaGVhZGVycyBvciBuYW1lIGluIHNlbGYuX25ld19oZWFkZXJzCgogICAgZGVmIGdldF9oZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fci5oZWFkZXJzLmdldChuYW1lLCBzZWxmLl9uZXdfaGVhZGVycy5nZXQobmFtZSwgZGVmYXVsdCkpCgogICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICIiImNvb2tpZWxpYiBoYXMgbm8gbGVnaXRpbWF0ZSB1c2UgZm9yIHRoaXMgbWV0aG9kOyBhZGQgaXQgYmFjayBpZiB5b3UgZmluZCBvbmUuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiQ29va2llIGhlYWRlcnMgc2hvdWxkIGJlIGFkZGVkIHdpdGggYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoKSIpCgogICAgZGVmIGFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICBzZWxmLl9uZXdfaGVhZGVyc1tuYW1lXSA9IHZhbHVlCgogICAgZGVmIGdldF9uZXdfaGVhZGVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbmV3X2hlYWRlcnMKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1bnZlcmlmaWFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaXNfdW52ZXJpZmlhYmxlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcmlnaW5fcmVxX2hvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X29yaWdpbl9yZXFfaG9zdCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfaG9zdCgpCgoKY2xhc3MgTW9ja1Jlc3BvbnNlKG9iamVjdCk6CiAgICAiIiJXcmFwcyBhIGBodHRwbGliLkhUVFBNZXNzYWdlYCB0byBtaW1pYyBhIGB1cmxsaWIuYWRkaW5mb3VybGAuCgogICAgLi4ud2hhdD8gQmFzaWNhbGx5LCBleHBvc2UgdGhlIHBhcnNlZCBIVFRQIGhlYWRlcnMgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlCiAgICB0aGUgd2F5IGBjb29raWVsaWJgIGV4cGVjdHMgdG8gc2VlIHRoZW0uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycyk6CiAgICAgICAgIiIiTWFrZSBhIE1vY2tSZXNwb25zZSBmb3IgYGNvb2tpZWxpYmAgdG8gcmVhZC4KCiAgICAgICAgOnBhcmFtIGhlYWRlcnM6IGEgaHR0cGxpYi5IVFRQTWVzc2FnZSBvciBhbmFsb2dvdXMgY2FycnlpbmcgdGhlIGhlYWRlcnMKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9oZWFkZXJzID0gaGVhZGVycwoKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzCgogICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5faGVhZGVycy5nZXRoZWFkZXJzKG5hbWUpCgoKZGVmIGV4dHJhY3RfY29va2llc190b19qYXIoamFyLCByZXF1ZXN0LCByZXNwb25zZSk6CiAgICAiIiJFeHRyYWN0IHRoZSBjb29raWVzIGZyb20gdGhlIHJlc3BvbnNlIGludG8gYSBDb29raWVKYXIuCgogICAgOnBhcmFtIGphcjogY29va2llbGliLkNvb2tpZUphciAobm90IG5lY2Vzc2FyaWx5IGEgUmVxdWVzdHNDb29raWVKYXIpCiAgICA6cGFyYW0gcmVxdWVzdDogb3VyIG93biByZXF1ZXN0cy5SZXF1ZXN0IG9iamVjdAogICAgOnBhcmFtIHJlc3BvbnNlOiB1cmxsaWIzLkhUVFBSZXNwb25zZSBvYmplY3QKICAgICIiIgogICAgaWYgbm90IChoYXNhdHRyKHJlc3BvbnNlLCAnX29yaWdpbmFsX3Jlc3BvbnNlJykgYW5kCiAgICAgICAgICAgIHJlc3BvbnNlLl9vcmlnaW5hbF9yZXNwb25zZSk6CiAgICAgICAgcmV0dXJuCiAgICAjIHRoZSBfb3JpZ2luYWxfcmVzcG9uc2UgZmllbGQgaXMgdGhlIHdyYXBwZWQgaHR0cGxpYi5IVFRQUmVzcG9uc2Ugb2JqZWN0LAogICAgcmVxID0gTW9ja1JlcXVlc3QocmVxdWVzdCkKICAgICMgcHVsbCBvdXQgdGhlIEhUVFBNZXNzYWdlIHdpdGggdGhlIGhlYWRlcnMgYW5kIHB1dCBpdCBpbiB0aGUgbW9jazoKICAgIHJlcyA9IE1vY2tSZXNwb25zZShyZXNwb25zZS5fb3JpZ2luYWxfcmVzcG9uc2UubXNnKQogICAgamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKCgpkZWYgZ2V0X2Nvb2tpZV9oZWFkZXIoamFyLCByZXF1ZXN0KToKICAgICIiIgogICAgUHJvZHVjZSBhbiBhcHByb3ByaWF0ZSBDb29raWUgaGVhZGVyIHN0cmluZyB0byBiZSBzZW50IHdpdGggYHJlcXVlc3RgLCBvciBOb25lLgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHIgPSBNb2NrUmVxdWVzdChyZXF1ZXN0KQogICAgamFyLmFkZF9jb29raWVfaGVhZGVyKHIpCiAgICByZXR1cm4gci5nZXRfbmV3X2hlYWRlcnMoKS5nZXQoJ0Nvb2tpZScpCgoKZGVmIHJlbW92ZV9jb29raWVfYnlfbmFtZShjb29raWVqYXIsIG5hbWUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgIiIiVW5zZXRzIGEgY29va2llIGJ5IG5hbWUsIGJ5IGRlZmF1bHQgb3ZlciBhbGwgZG9tYWlucyBhbmQgcGF0aHMuCgogICAgV3JhcHMgQ29va2llSmFyLmNsZWFyKCksIGlzIE8obikuCiAgICAiIiIKICAgIGNsZWFyYWJsZXMgPSBbXQogICAgZm9yIGNvb2tpZSBpbiBjb29raWVqYXI6CiAgICAgICAgaWYgY29va2llLm5hbWUgIT0gbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBkb21haW4gaXMgbm90IE5vbmUgYW5kIGRvbWFpbiAhPSBjb29raWUuZG9tYWluOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmUgYW5kIHBhdGggIT0gY29va2llLnBhdGg6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY2xlYXJhYmxlcy5hcHBlbmQoKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkpCgogICAgZm9yIGRvbWFpbiwgcGF0aCwgbmFtZSBpbiBjbGVhcmFibGVzOgogICAgICAgIGNvb2tpZWphci5jbGVhcihkb21haW4sIHBhdGgsIG5hbWUpCgoKY2xhc3MgQ29va2llQ29uZmxpY3RFcnJvcihSdW50aW1lRXJyb3IpOgogICAgIiIiVGhlcmUgYXJlIHR3byBjb29raWVzIHRoYXQgbWVldCB0aGUgY3JpdGVyaWEgc3BlY2lmaWVkIGluIHRoZSBjb29raWUgamFyLgogICAgVXNlIC5nZXQgYW5kIC5zZXQgYW5kIGluY2x1ZGUgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4gb3JkZXIgdG8gYmUgbW9yZSBzcGVjaWZpYy4KICAgICIiIgoKCmNsYXNzIFJlcXVlc3RzQ29va2llSmFyKGNvb2tpZWxpYi5Db29raWVKYXIsIGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nKToKICAgICIiIkNvbXBhdGliaWxpdHkgY2xhc3M7IGlzIGEgY29va2llbGliLkNvb2tpZUphciwgYnV0IGV4cG9zZXMgYSBkaWN0CiAgICBpbnRlcmZhY2UuCgogICAgVGhpcyBpcyB0aGUgQ29va2llSmFyIHdlIGNyZWF0ZSBieSBkZWZhdWx0IGZvciByZXF1ZXN0cyBhbmQgc2Vzc2lvbnMgdGhhdAogICAgZG9uJ3Qgc3BlY2lmeSBvbmUsIHNpbmNlIHNvbWUgY2xpZW50cyBtYXkgZXhwZWN0IHJlc3BvbnNlLmNvb2tpZXMgYW5kCiAgICBzZXNzaW9uLmNvb2tpZXMgdG8gc3VwcG9ydCBkaWN0IG9wZXJhdGlvbnMuCgogICAgUmVxdWVzdHMgZG9lcyBub3QgdXNlIHRoZSBkaWN0IGludGVyZmFjZSBpbnRlcm5hbGx5OyBpdCdzIGp1c3QgZm9yCiAgICBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZXJuYWwgY2xpZW50IGNvZGUuIEFsbCByZXF1ZXN0cyBjb2RlIHNob3VsZCB3b3JrCiAgICBvdXQgb2YgdGhlIGJveCB3aXRoIGV4dGVybmFsbHkgcHJvdmlkZWQgaW5zdGFuY2VzIG9mIGBgQ29va2llSmFyYGAsIGUuZy4KICAgIGBgTFdQQ29va2llSmFyYGAgYW5kIGBgRmlsZUNvb2tpZUphcmBgLgoKICAgIFVubGlrZSBhIHJlZ3VsYXIgQ29va2llSmFyLCB0aGlzIGNsYXNzIGlzIHBpY2tsZWFibGUuCgogICAgLi4gd2FybmluZzo6IGRpY3Rpb25hcnkgb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSBPKDEpIG1heSBiZSBPKG4pLgogICAgIiIiCgogICAgZGVmIGdldChzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIkRpY3QtbGlrZSBnZXQoKSB0aGF0IGFsc28gc3VwcG9ydHMgb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4KICAgICAgICBvcmRlciB0byByZXNvbHZlIG5hbWluZyBjb2xsaXNpb25zIGZyb20gdXNpbmcgb25lIGNvb2tpZSBqYXIgb3ZlcgogICAgICAgIG11bHRpcGxlIGRvbWFpbnMuCgogICAgICAgIC4uIHdhcm5pbmc6OiBvcGVyYXRpb24gaXMgTyhuKSwgbm90IE8oMSkuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9ub19kdXBsaWNhdGVzKG5hbWUsIGRvbWFpbiwgcGF0aCkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIHNldChzZWxmLCBuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpOgogICAgICAgICIiIkRpY3QtbGlrZSBzZXQoKSB0aGF0IGFsc28gc3VwcG9ydHMgb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4KICAgICAgICBvcmRlciB0byByZXNvbHZlIG5hbWluZyBjb2xsaXNpb25zIGZyb20gdXNpbmcgb25lIGNvb2tpZSBqYXIgb3ZlcgogICAgICAgIG11bHRpcGxlIGRvbWFpbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBzdXBwb3J0IGNsaWVudCBjb2RlIHRoYXQgdW5zZXRzIGNvb2tpZXMgYnkgYXNzaWdubWVudCBvZiBhIE5vbmUgdmFsdWU6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKHNlbGYsIG5hbWUsIGRvbWFpbj1rd2FyZ3MuZ2V0KCdkb21haW4nKSwgcGF0aD1rd2FyZ3MuZ2V0KCdwYXRoJykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBNb3JzZWwpOgogICAgICAgICAgICBjID0gbW9yc2VsX3RvX2Nvb2tpZSh2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjID0gY3JlYXRlX2Nvb2tpZShuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCiAgICAgICAgcmV0dXJuIGMKCiAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZXJrZXlzKCkgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIG5hbWVzIG9mIGNvb2tpZXMKICAgICAgICBmcm9tIHRoZSBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBpdGVydmFsdWVzKCkgYW5kIGl0ZXJpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgeWllbGQgY29va2llLm5hbWUKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2Uga2V5cygpIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgbmFtZXMgb2YgY29va2llcyBmcm9tIHRoZQogICAgICAgIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IHZhbHVlcygpIGFuZCBpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkKCiAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlcnZhbHVlcygpIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBvZiB2YWx1ZXMgb2YgY29va2llcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJrZXlzKCkgYW5kIGl0ZXJpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgeWllbGQgY29va2llLnZhbHVlCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgdmFsdWVzKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgb2YgY29va2llcyBmcm9tIHRoZQogICAgICAgIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGtleXMoKSBhbmQgaXRlbXMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkKCiAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVyaXRlbXMoKSB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3Igb2YgbmFtZS12YWx1ZSB0dXBsZXMKICAgICAgICBmcm9tIHRoZSBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBpdGVya2V5cygpIGFuZCBpdGVydmFsdWVzKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUubmFtZSwgY29va2llLnZhbHVlCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVtcygpIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMgZnJvbSB0aGUKICAgICAgICBqYXIuIEFsbG93cyBjbGllbnQtY29kZSB0byBjYWxsIGBgZGljdChSZXF1ZXN0c0Nvb2tpZUphcilgYCBhbmQgZ2V0IGEKICAgICAgICB2YW5pbGxhIHB5dGhvbiBkaWN0IG9mIGtleSB2YWx1ZSBwYWlycy4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGtleXMoKSBhbmQgdmFsdWVzKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKCiAgICBkZWYgbGlzdF9kb21haW5zKHNlbGYpOgogICAgICAgICIiIlV0aWxpdHkgbWV0aG9kIHRvIGxpc3QgYWxsIHRoZSBkb21haW5zIGluIHRoZSBqYXIuIiIiCiAgICAgICAgZG9tYWlucyA9IFtdCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUuZG9tYWluIG5vdCBpbiBkb21haW5zOgogICAgICAgICAgICAgICAgZG9tYWlucy5hcHBlbmQoY29va2llLmRvbWFpbikKICAgICAgICByZXR1cm4gZG9tYWlucwoKICAgIGRlZiBsaXN0X3BhdGhzKHNlbGYpOgogICAgICAgICIiIlV0aWxpdHkgbWV0aG9kIHRvIGxpc3QgYWxsIHRoZSBwYXRocyBpbiB0aGUgamFyLiIiIgogICAgICAgIHBhdGhzID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5wYXRoIG5vdCBpbiBwYXRoczoKICAgICAgICAgICAgICAgIHBhdGhzLmFwcGVuZChjb29raWUucGF0aCkKICAgICAgICByZXR1cm4gcGF0aHMKCiAgICBkZWYgbXVsdGlwbGVfZG9tYWlucyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGRvbWFpbnMgaW4gdGhlIGphci4KICAgICAgICBSZXR1cm5zIEZhbHNlIG90aGVyd2lzZS4KCiAgICAgICAgOnJ0eXBlOiBib29sCiAgICAgICAgIiIiCiAgICAgICAgZG9tYWlucyA9IFtdCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUuZG9tYWluIGlzIG5vdCBOb25lIGFuZCBjb29raWUuZG9tYWluIGluIGRvbWFpbnM6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBkb21haW5zLmFwcGVuZChjb29raWUuZG9tYWluKQogICAgICAgIHJldHVybiBGYWxzZSAgIyB0aGVyZSBpcyBvbmx5IG9uZSBkb21haW4gaW4gamFyCgogICAgZGVmIGdldF9kaWN0KHNlbGYsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIlRha2VzIGFzIGFuIGFyZ3VtZW50IGFuIG9wdGlvbmFsIGRvbWFpbiBhbmQgcGF0aCBhbmQgcmV0dXJucyBhIHBsYWluCiAgICAgICAgb2xkIFB5dGhvbiBkaWN0IG9mIG5hbWUtdmFsdWUgcGFpcnMgb2YgY29va2llcyB0aGF0IG1lZXQgdGhlCiAgICAgICAgcmVxdWlyZW1lbnRzLgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBkaWN0aW9uYXJ5ID0ge30KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIChkb21haW4gaXMgTm9uZSBvciBjb29raWUuZG9tYWluID09IGRvbWFpbikgYW5kCiAgICAgICAgICAgICAgICAocGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGgpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2Nvb2tpZS5uYW1lXSA9IGNvb2tpZS52YWx1ZQogICAgICAgIHJldHVybiBkaWN0aW9uYXJ5CgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZXF1ZXN0c0Nvb2tpZUphciwgc2VsZikuX19jb250YWluc19fKG5hbWUpCiAgICAgICAgZXhjZXB0IENvb2tpZUNvbmZsaWN0RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkRpY3QtbGlrZSBfX2dldGl0ZW1fXygpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY2xpZW50IGNvZGUuIFRocm93cwogICAgICAgIGV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjb29raWUgd2l0aCBuYW1lLiBJbiB0aGF0IGNhc2UsCiAgICAgICAgdXNlIHRoZSBtb3JlIGV4cGxpY2l0IGdldCgpIG1ldGhvZCBpbnN0ZWFkLgoKICAgICAgICAuLiB3YXJuaW5nOjogb3BlcmF0aW9uIGlzIE8obiksIG5vdCBPKDEpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX25vX2R1cGxpY2F0ZXMobmFtZSkKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkRpY3QtbGlrZSBfX3NldGl0ZW1fXyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNsaWVudCBjb2RlLiBUaHJvd3MKICAgICAgICBleGNlcHRpb24gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNvb2tpZSBvZiB0aGF0IG5hbWUgaW4gdGhlIGphci4gSW4gdGhhdAogICAgICAgIGNhc2UsIHVzZSB0aGUgbW9yZSBleHBsaWNpdCBzZXQoKSBtZXRob2QgaW5zdGVhZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNldChuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlcyBhIGNvb2tpZSBnaXZlbiBhIG5hbWUuIFdyYXBzIGBgY29va2llbGliLkNvb2tpZUphcmBgJ3MKICAgICAgICBgYHJlbW92ZV9jb29raWVfYnlfbmFtZSgpYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKHNlbGYsIG5hbWUpCgogICAgZGVmIHNldF9jb29raWUoc2VsZiwgY29va2llLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIGhhc2F0dHIoY29va2llLnZhbHVlLCAnc3RhcnRzd2l0aCcpIGFuZCBjb29raWUudmFsdWUuc3RhcnRzd2l0aCgnIicpIGFuZCBjb29raWUudmFsdWUuZW5kc3dpdGgoJyInKToKICAgICAgICAgICAgY29va2llLnZhbHVlID0gY29va2llLnZhbHVlLnJlcGxhY2UoJ1xcIicsICcnKQogICAgICAgIHJldHVybiBzdXBlcihSZXF1ZXN0c0Nvb2tpZUphciwgc2VsZikuc2V0X2Nvb2tpZShjb29raWUsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJVcGRhdGVzIHRoaXMgamFyIHdpdGggY29va2llcyBmcm9tIGFub3RoZXIgQ29va2llSmFyIG9yIGRpY3QtbGlrZSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBmb3IgY29va2llIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGNvcHkuY29weShjb29raWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS51cGRhdGUob3RoZXIpCgogICAgZGVmIF9maW5kKHNlbGYsIG5hbWUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIlJlcXVlc3RzIHVzZXMgdGhpcyBtZXRob2QgaW50ZXJuYWxseSB0byBnZXQgY29va2llIHZhbHVlcy4KCiAgICAgICAgSWYgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGNvb2tpZXMsIF9maW5kIGFyYml0cmFyaWx5IGNob29zZXMgb25lLgogICAgICAgIFNlZSBfZmluZF9ub19kdXBsaWNhdGVzIGlmIHlvdSB3YW50IGFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgYXJlCiAgICAgICAgY29uZmxpY3RpbmcgY29va2llcy4KCiAgICAgICAgOnBhcmFtIG5hbWU6IGEgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBjb29raWUKICAgICAgICA6cGFyYW0gZG9tYWluOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIGRvbWFpbiBvZiBjb29raWUKICAgICAgICA6cGFyYW0gcGF0aDogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBwYXRoIG9mIGNvb2tpZQogICAgICAgIDpyZXR1cm46IGNvb2tpZS52YWx1ZQogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIGlmIGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgTm9uZSBvciBjb29raWUucGF0aCA9PSBwYXRoOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29va2llLnZhbHVlCgogICAgICAgIHJhaXNlIEtleUVycm9yKCduYW1lPSVyLCBkb21haW49JXIsIHBhdGg9JXInICUgKG5hbWUsIGRvbWFpbiwgcGF0aCkpCgogICAgZGVmIF9maW5kX25vX2R1cGxpY2F0ZXMoc2VsZiwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiQm90aCBgYF9fZ2V0X2l0ZW1fX2BgIGFuZCBgYGdldGBgIGNhbGwgdGhpcyBmdW5jdGlvbjogaXQncyBuZXZlcgogICAgICAgIHVzZWQgZWxzZXdoZXJlIGluIFJlcXVlc3RzLgoKICAgICAgICA6cGFyYW0gbmFtZTogYSBzdHJpbmcgY29udGFpbmluZyBuYW1lIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBkb21haW46IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgZG9tYWluIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBwYXRoOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIHBhdGggb2YgY29va2llCiAgICAgICAgOnJhaXNlcyBLZXlFcnJvcjogaWYgY29va2llIGlzIG5vdCBmb3VuZAogICAgICAgIDpyYWlzZXMgQ29va2llQ29uZmxpY3RFcnJvcjogaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMKICAgICAgICAgICAgdGhhdCBtYXRjaCBuYW1lIGFuZCBvcHRpb25hbGx5IGRvbWFpbiBhbmQgcGF0aAogICAgICAgIDpyZXR1cm46IGNvb2tpZS52YWx1ZQogICAgICAgICIiIgogICAgICAgIHRvUmV0dXJuID0gTm9uZQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIGlmIGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgTm9uZSBvciBjb29raWUucGF0aCA9PSBwYXRoOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b1JldHVybiBpcyBub3QgTm9uZTogICMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMgdGhhdCBtZWV0IHBhc3NlZCBpbiBjcml0ZXJpYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29va2llQ29uZmxpY3RFcnJvcignVGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMgd2l0aCBuYW1lLCAlcicgJSAobmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gY29va2llLnZhbHVlICAjIHdlIHdpbGwgZXZlbnR1YWxseSByZXR1cm4gdGhpcyBhcyBsb25nIGFzIG5vIGNvb2tpZSBjb25mbGljdAoKICAgICAgICBpZiB0b1JldHVybjoKICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25hbWU9JXIsIGRvbWFpbj0lciwgcGF0aD0lcicgJSAobmFtZSwgZG9tYWluLCBwYXRoKSkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgICIiIlVubGlrZSBhIG5vcm1hbCBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4iIiIKICAgICAgICBzdGF0ZSA9IHNlbGYuX19kaWN0X18uY29weSgpCiAgICAgICAgIyByZW1vdmUgdGhlIHVucGlja2xlYWJsZSBSTG9jayBvYmplY3QKICAgICAgICBzdGF0ZS5wb3AoJ19jb29raWVzX2xvY2snKQogICAgICAgIHJldHVybiBzdGF0ZQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgICIiIlVubGlrZSBhIG5vcm1hbCBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4iIiIKICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKICAgICAgICBpZiAnX2Nvb2tpZXNfbG9jaycgbm90IGluIHNlbGYuX19kaWN0X186CiAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jayA9IHRocmVhZGluZy5STG9jaygpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgY29weSBvZiB0aGlzIFJlcXVlc3RzQ29va2llSmFyLiIiIgogICAgICAgIG5ld19jaiA9IFJlcXVlc3RzQ29va2llSmFyKCkKICAgICAgICBuZXdfY2oudXBkYXRlKHNlbGYpCiAgICAgICAgcmV0dXJuIG5ld19jagoKCmRlZiBfY29weV9jb29raWVfamFyKGphcik6CiAgICBpZiBqYXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGhhc2F0dHIoamFyLCAnY29weScpOgogICAgICAgICMgV2UncmUgZGVhbGluZyB3aXRoIGFuIGluc3RhbmNlIG9mIFJlcXVlc3RzQ29va2llSmFyCiAgICAgICAgcmV0dXJuIGphci5jb3B5KCkKICAgICMgV2UncmUgZGVhbGluZyB3aXRoIGEgZ2VuZXJpYyBDb29raWVKYXIgaW5zdGFuY2UKICAgIG5ld19qYXIgPSBjb3B5LmNvcHkoamFyKQogICAgbmV3X2phci5jbGVhcigpCiAgICBmb3IgY29va2llIGluIGphcjoKICAgICAgICBuZXdfamFyLnNldF9jb29raWUoY29weS5jb3B5KGNvb2tpZSkpCiAgICByZXR1cm4gbmV3X2phcgoKCmRlZiBjcmVhdGVfY29va2llKG5hbWUsIHZhbHVlLCAqKmt3YXJncyk6CiAgICAiIiJNYWtlIGEgY29va2llIGZyb20gdW5kZXJzcGVjaWZpZWQgcGFyYW1ldGVycy4KCiAgICBCeSBkZWZhdWx0LCB0aGUgcGFpciBvZiBgbmFtZWAgYW5kIGB2YWx1ZWAgd2lsbCBiZSBzZXQgZm9yIHRoZSBkb21haW4gJycKICAgIGFuZCBzZW50IG9uIGV2ZXJ5IHJlcXVlc3QgKHRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBhICJzdXBlcmNvb2tpZSIpLgogICAgIiIiCiAgICByZXN1bHQgPSBkaWN0KAogICAgICAgIHZlcnNpb249MCwKICAgICAgICBuYW1lPW5hbWUsCiAgICAgICAgdmFsdWU9dmFsdWUsCiAgICAgICAgcG9ydD1Ob25lLAogICAgICAgIGRvbWFpbj0nJywKICAgICAgICBwYXRoPScvJywKICAgICAgICBzZWN1cmU9RmFsc2UsCiAgICAgICAgZXhwaXJlcz1Ob25lLAogICAgICAgIGRpc2NhcmQ9VHJ1ZSwKICAgICAgICBjb21tZW50PU5vbmUsCiAgICAgICAgY29tbWVudF91cmw9Tm9uZSwKICAgICAgICByZXN0PXsnSHR0cE9ubHknOiBOb25lfSwKICAgICAgICByZmMyMTA5PUZhbHNlLCkKCiAgICBiYWRhcmdzID0gc2V0KGt3YXJncykgLSBzZXQocmVzdWx0KQogICAgaWYgYmFkYXJnczoKICAgICAgICBlcnIgPSAnY3JlYXRlX2Nvb2tpZSgpIGdvdCB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnRzOiAlcycKICAgICAgICByYWlzZSBUeXBlRXJyb3IoZXJyICUgbGlzdChiYWRhcmdzKSkKCiAgICByZXN1bHQudXBkYXRlKGt3YXJncykKICAgIHJlc3VsdFsncG9ydF9zcGVjaWZpZWQnXSA9IGJvb2wocmVzdWx0Wydwb3J0J10pCiAgICByZXN1bHRbJ2RvbWFpbl9zcGVjaWZpZWQnXSA9IGJvb2wocmVzdWx0Wydkb21haW4nXSkKICAgIHJlc3VsdFsnZG9tYWluX2luaXRpYWxfZG90J10gPSByZXN1bHRbJ2RvbWFpbiddLnN0YXJ0c3dpdGgoJy4nKQogICAgcmVzdWx0WydwYXRoX3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ3BhdGgnXSkKCiAgICByZXR1cm4gY29va2llbGliLkNvb2tpZSgqKnJlc3VsdCkKCgpkZWYgbW9yc2VsX3RvX2Nvb2tpZShtb3JzZWwpOgogICAgIiIiQ29udmVydCBhIE1vcnNlbCBvYmplY3QgaW50byBhIENvb2tpZSBjb250YWluaW5nIHRoZSBvbmUgay92IHBhaXIuIiIiCgogICAgZXhwaXJlcyA9IE5vbmUKICAgIGlmIG1vcnNlbFsnbWF4LWFnZSddOgogICAgICAgIHRyeToKICAgICAgICAgICAgZXhwaXJlcyA9IGludCh0aW1lLnRpbWUoKSArIGludChtb3JzZWxbJ21heC1hZ2UnXSkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbWF4LWFnZTogJXMgbXVzdCBiZSBpbnRlZ2VyJyAlIG1vcnNlbFsnbWF4LWFnZSddKQogICAgZWxpZiBtb3JzZWxbJ2V4cGlyZXMnXToKICAgICAgICB0aW1lX3RlbXBsYXRlID0gJyVhLCAlZC0lYi0lWSAlSDolTTolUyBHTVQnCiAgICAgICAgZXhwaXJlcyA9IGNhbGVuZGFyLnRpbWVnbSgKICAgICAgICAgICAgdGltZS5zdHJwdGltZShtb3JzZWxbJ2V4cGlyZXMnXSwgdGltZV90ZW1wbGF0ZSkKICAgICAgICApCiAgICByZXR1cm4gY3JlYXRlX2Nvb2tpZSgKICAgICAgICBjb21tZW50PW1vcnNlbFsnY29tbWVudCddLAogICAgICAgIGNvbW1lbnRfdXJsPWJvb2wobW9yc2VsWydjb21tZW50J10pLAogICAgICAgIGRpc2NhcmQ9RmFsc2UsCiAgICAgICAgZG9tYWluPW1vcnNlbFsnZG9tYWluJ10sCiAgICAgICAgZXhwaXJlcz1leHBpcmVzLAogICAgICAgIG5hbWU9bW9yc2VsLmtleSwKICAgICAgICBwYXRoPW1vcnNlbFsncGF0aCddLAogICAgICAgIHBvcnQ9Tm9uZSwKICAgICAgICByZXN0PXsnSHR0cE9ubHknOiBtb3JzZWxbJ2h0dHBvbmx5J119LAogICAgICAgIHJmYzIxMDk9RmFsc2UsCiAgICAgICAgc2VjdXJlPWJvb2wobW9yc2VsWydzZWN1cmUnXSksCiAgICAgICAgdmFsdWU9bW9yc2VsLnZhbHVlLAogICAgICAgIHZlcnNpb249bW9yc2VsWyd2ZXJzaW9uJ10gb3IgMCwKICAgICkKCgpkZWYgY29va2llamFyX2Zyb21fZGljdChjb29raWVfZGljdCwgY29va2llamFyPU5vbmUsIG92ZXJ3cml0ZT1UcnVlKToKICAgICIiIlJldHVybnMgYSBDb29raWVKYXIgZnJvbSBhIGtleS92YWx1ZSBkaWN0aW9uYXJ5LgoKICAgIDpwYXJhbSBjb29raWVfZGljdDogRGljdCBvZiBrZXkvdmFsdWVzIHRvIGluc2VydCBpbnRvIENvb2tpZUphci4KICAgIDpwYXJhbSBjb29raWVqYXI6IChvcHRpb25hbCkgQSBjb29raWVqYXIgdG8gYWRkIHRoZSBjb29raWVzIHRvLgogICAgOnBhcmFtIG92ZXJ3cml0ZTogKG9wdGlvbmFsKSBJZiBGYWxzZSwgd2lsbCBub3QgcmVwbGFjZSBjb29raWVzCiAgICAgICAgYWxyZWFkeSBpbiB0aGUgamFyIHdpdGggbmV3IG9uZXMuCiAgICAiIiIKICAgIGlmIGNvb2tpZWphciBpcyBOb25lOgogICAgICAgIGNvb2tpZWphciA9IFJlcXVlc3RzQ29va2llSmFyKCkKCiAgICBpZiBjb29raWVfZGljdCBpcyBub3QgTm9uZToKICAgICAgICBuYW1lc19mcm9tX2phciA9IFtjb29raWUubmFtZSBmb3IgY29va2llIGluIGNvb2tpZWphcl0KICAgICAgICBmb3IgbmFtZSBpbiBjb29raWVfZGljdDoKICAgICAgICAgICAgaWYgb3ZlcndyaXRlIG9yIChuYW1lIG5vdCBpbiBuYW1lc19mcm9tX2phcik6CiAgICAgICAgICAgICAgICBjb29raWVqYXIuc2V0X2Nvb2tpZShjcmVhdGVfY29va2llKG5hbWUsIGNvb2tpZV9kaWN0W25hbWVdKSkKCiAgICByZXR1cm4gY29va2llamFyCgoKZGVmIG1lcmdlX2Nvb2tpZXMoY29va2llamFyLCBjb29raWVzKToKICAgICIiIkFkZCBjb29raWVzIHRvIGNvb2tpZWphciBhbmQgcmV0dXJucyBhIG1lcmdlZCBDb29raWVKYXIuCgogICAgOnBhcmFtIGNvb2tpZWphcjogQ29va2llSmFyIG9iamVjdCB0byBhZGQgdGhlIGNvb2tpZXMgdG8uCiAgICA6cGFyYW0gY29va2llczogRGljdGlvbmFyeSBvciBDb29raWVKYXIgb2JqZWN0IHRvIGJlIGFkZGVkLgogICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShjb29raWVqYXIsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1lvdSBjYW4gb25seSBtZXJnZSBpbnRvIENvb2tpZUphcicpCgogICAgaWYgaXNpbnN0YW5jZShjb29raWVzLCBkaWN0KToKICAgICAgICBjb29raWVqYXIgPSBjb29raWVqYXJfZnJvbV9kaWN0KAogICAgICAgICAgICBjb29raWVzLCBjb29raWVqYXI9Y29va2llamFyLCBvdmVyd3JpdGU9RmFsc2UpCiAgICBlbGlmIGlzaW5zdGFuY2UoY29va2llcywgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb29raWVqYXIudXBkYXRlKGNvb2tpZXMpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBmb3IgY29va2llX2luX2phciBpbiBjb29raWVzOgogICAgICAgICAgICAgICAgY29va2llamFyLnNldF9jb29raWUoY29va2llX2luX2phcikKCiAgICByZXR1cm4gY29va2llamFyClBLAwQUAAAAAAAAACEA+c7p0CsMAAArDAAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9leGNlcHRpb25zLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5leGNlcHRpb25zCn5+fn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBzZXQgb2YgUmVxdWVzdHMnIGV4Y2VwdGlvbnMuCiIiIgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSFRUUEVycm9yIGFzIEJhc2VIVFRQRXJyb3IKCgpjbGFzcyBSZXF1ZXN0RXhjZXB0aW9uKElPRXJyb3IpOgogICAgIiIiVGhlcmUgd2FzIGFuIGFtYmlndW91cyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB5b3VyCiAgICByZXF1ZXN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBSZXF1ZXN0RXhjZXB0aW9uIHdpdGggYHJlcXVlc3RgIGFuZCBgcmVzcG9uc2VgIG9iamVjdHMuIiIiCiAgICAgICAgcmVzcG9uc2UgPSBrd2FyZ3MucG9wKCdyZXNwb25zZScsIE5vbmUpCiAgICAgICAgc2VsZi5yZXNwb25zZSA9IHJlc3BvbnNlCiAgICAgICAgc2VsZi5yZXF1ZXN0ID0ga3dhcmdzLnBvcCgncmVxdWVzdCcsIE5vbmUpCiAgICAgICAgaWYgKHJlc3BvbnNlIGlzIG5vdCBOb25lIGFuZCBub3Qgc2VsZi5yZXF1ZXN0IGFuZAogICAgICAgICAgICAgICAgaGFzYXR0cihyZXNwb25zZSwgJ3JlcXVlc3QnKSk6CiAgICAgICAgICAgIHNlbGYucmVxdWVzdCA9IHNlbGYucmVzcG9uc2UucmVxdWVzdAogICAgICAgIHN1cGVyKFJlcXVlc3RFeGNlcHRpb24sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCgpjbGFzcyBIVFRQRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBbiBIVFRQIGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIENvbm5lY3Rpb25FcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIkEgQ29ubmVjdGlvbiBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBQcm94eUVycm9yKENvbm5lY3Rpb25FcnJvcik6CiAgICAiIiJBIHByb3h5IGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIFNTTEVycm9yKENvbm5lY3Rpb25FcnJvcik6CiAgICAiIiJBbiBTU0wgZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgVGltZW91dChSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRoZSByZXF1ZXN0IHRpbWVkIG91dC4KCiAgICBDYXRjaGluZyB0aGlzIGVycm9yIHdpbGwgY2F0Y2ggYm90aAogICAgOmV4YzpgfnJlcXVlc3RzLmV4Y2VwdGlvbnMuQ29ubmVjdFRpbWVvdXRgIGFuZAogICAgOmV4YzpgfnJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVhZFRpbWVvdXRgIGVycm9ycy4KICAgICIiIgoKCmNsYXNzIENvbm5lY3RUaW1lb3V0KENvbm5lY3Rpb25FcnJvciwgVGltZW91dCk6CiAgICAiIiJUaGUgcmVxdWVzdCB0aW1lZCBvdXQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuCgogICAgUmVxdWVzdHMgdGhhdCBwcm9kdWNlZCB0aGlzIGVycm9yIGFyZSBzYWZlIHRvIHJldHJ5LgogICAgIiIiCgoKY2xhc3MgUmVhZFRpbWVvdXQoVGltZW91dCk6CiAgICAiIiJUaGUgc2VydmVyIGRpZCBub3Qgc2VuZCBhbnkgZGF0YSBpbiB0aGUgYWxsb3R0ZWQgYW1vdW50IG9mIHRpbWUuIiIiCgoKY2xhc3MgVVJMUmVxdWlyZWQoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBIHZhbGlkIFVSTCBpcyByZXF1aXJlZCB0byBtYWtlIGEgcmVxdWVzdC4iIiIKCgpjbGFzcyBUb29NYW55UmVkaXJlY3RzKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiVG9vIG1hbnkgcmVkaXJlY3RzLiIiIgoKCmNsYXNzIE1pc3NpbmdTY2hlbWEoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJUaGUgVVJMIHNjaGVtYSAoZS5nLiBodHRwIG9yIGh0dHBzKSBpcyBtaXNzaW5nLiIiIgoKCmNsYXNzIEludmFsaWRTY2hlbWEoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJTZWUgZGVmYXVsdHMucHkgZm9yIHZhbGlkIHNjaGVtYXMuIiIiCgoKY2xhc3MgSW52YWxpZFVSTChSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlRoZSBVUkwgcHJvdmlkZWQgd2FzIHNvbWVob3cgaW52YWxpZC4iIiIKCgpjbGFzcyBJbnZhbGlkSGVhZGVyKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiVGhlIGhlYWRlciB2YWx1ZSBwcm92aWRlZCB3YXMgc29tZWhvdyBpbnZhbGlkLiIiIgoKCmNsYXNzIENodW5rZWRFbmNvZGluZ0Vycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiVGhlIHNlcnZlciBkZWNsYXJlZCBjaHVua2VkIGVuY29kaW5nIGJ1dCBzZW50IGFuIGludmFsaWQgY2h1bmsuIiIiCgoKY2xhc3MgQ29udGVudERlY29kaW5nRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbiwgQmFzZUhUVFBFcnJvcik6CiAgICAiIiJGYWlsZWQgdG8gZGVjb2RlIHJlc3BvbnNlIGNvbnRlbnQiIiIKCgpjbGFzcyBTdHJlYW1Db25zdW1lZEVycm9yKFJlcXVlc3RFeGNlcHRpb24sIFR5cGVFcnJvcik6CiAgICAiIiJUaGUgY29udGVudCBmb3IgdGhpcyByZXNwb25zZSB3YXMgYWxyZWFkeSBjb25zdW1lZCIiIgoKCmNsYXNzIFJldHJ5RXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJDdXN0b20gcmV0cmllcyBsb2dpYyBmYWlsZWQiIiIKCgpjbGFzcyBVbnJld2luZGFibGVCb2R5RXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJSZXF1ZXN0cyBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byByZXdpbmQgYSBib2R5IiIiCgojIFdhcm5pbmdzCgoKY2xhc3MgUmVxdWVzdHNXYXJuaW5nKFdhcm5pbmcpOgogICAgIiIiQmFzZSB3YXJuaW5nIGZvciBSZXF1ZXN0cy4iIiIKICAgIHBhc3MKCgpjbGFzcyBGaWxlTW9kZVdhcm5pbmcoUmVxdWVzdHNXYXJuaW5nLCBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiQSBmaWxlIHdhcyBvcGVuZWQgaW4gdGV4dCBtb2RlLCBidXQgUmVxdWVzdHMgZGV0ZXJtaW5lZCBpdHMgYmluYXJ5IGxlbmd0aC4iIiIKICAgIHBhc3MKCgpjbGFzcyBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nKFJlcXVlc3RzV2FybmluZyk6CiAgICAiIiJBbiBpbXBvcnRlZCBkZXBlbmRlbmN5IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZlcnNpb24gcmFuZ2UuIiIiCiAgICBwYXNzClBLAwQUAAAAAAAAACEAhB1g4lMOAABTDgAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5IiIiTW9kdWxlIGNvbnRhaW5pbmcgYnVnIHJlcG9ydCBoZWxwZXIocykuIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBqc29uCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgc3lzCmltcG9ydCBzc2wKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGlkbmEKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgdXJsbGliMwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjaGFyZGV0Cgpmcm9tIC4gaW1wb3J0IF9fdmVyc2lvbl9fIGFzIHJlcXVlc3RzX3ZlcnNpb24KCnRyeToKICAgIGZyb20gLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYiBpbXBvcnQgcHlvcGVuc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHB5b3BlbnNzbCA9IE5vbmUKICAgIE9wZW5TU0wgPSBOb25lCiAgICBjcnlwdG9ncmFwaHkgPSBOb25lCmVsc2U6CiAgICBpbXBvcnQgT3BlblNTTAogICAgaW1wb3J0IGNyeXB0b2dyYXBoeQoKCmRlZiBfaW1wbGVtZW50YXRpb24oKToKICAgICIiIlJldHVybiBhIGRpY3Qgd2l0aCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCB2ZXJzaW9uLgoKICAgIFByb3ZpZGUgYm90aCB0aGUgbmFtZSBhbmQgdGhlIHZlcnNpb24gb2YgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgY3VycmVudGx5IHJ1bm5pbmcuIEZvciBleGFtcGxlLCBvbiBDUHl0aG9uIDIuNy41IGl0IHdpbGwgcmV0dXJuCiAgICB7J25hbWUnOiAnQ1B5dGhvbicsICd2ZXJzaW9uJzogJzIuNy41J30uCgogICAgVGhpcyBmdW5jdGlvbiB3b3JrcyBiZXN0IG9uIENQeXRob24gYW5kIFB5UHk6IGluIHBhcnRpY3VsYXIsIGl0IHByb2JhYmx5CiAgICBkb2Vzbid0IHdvcmsgZm9yIEp5dGhvbiBvciBJcm9uUHl0aG9uLiBGdXR1cmUgaW52ZXN0aWdhdGlvbiBzaG91bGQgYmUgZG9uZQogICAgdG8gd29yayBvdXQgdGhlIGNvcnJlY3Qgc2hhcGUgb2YgdGhlIGNvZGUgZm9yIHRob3NlIHBsYXRmb3Jtcy4KICAgICIiIgogICAgaW1wbGVtZW50YXRpb24gPSBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKQoKICAgIGlmIGltcGxlbWVudGF0aW9uID09ICdDUHl0aG9uJzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogICAgZWxpZiBpbXBsZW1lbnRhdGlvbiA9PSAnUHlQeSc6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9ICclcy4lcy4lcycgJSAoc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWljcm8pCiAgICAgICAgaWYgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLnJlbGVhc2VsZXZlbCAhPSAnZmluYWwnOgogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gJycuam9pbihbCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uLCBzeXMucHlweV92ZXJzaW9uX2luZm8ucmVsZWFzZWxldmVsCiAgICAgICAgICAgIF0pCiAgICBlbGlmIGltcGxlbWVudGF0aW9uID09ICdKeXRob24nOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpICAjIENvbXBsZXRlIEd1ZXNzCiAgICBlbGlmIGltcGxlbWVudGF0aW9uID09ICdJcm9uUHl0aG9uJzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSAgIyBDb21wbGV0ZSBHdWVzcwogICAgZWxzZToKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gJ1Vua25vd24nCgogICAgcmV0dXJuIHsnbmFtZSc6IGltcGxlbWVudGF0aW9uLCAndmVyc2lvbic6IGltcGxlbWVudGF0aW9uX3ZlcnNpb259CgoKZGVmIGluZm8oKToKICAgICIiIkdlbmVyYXRlIGluZm9ybWF0aW9uIGZvciBhIGJ1ZyByZXBvcnQuIiIiCiAgICB0cnk6CiAgICAgICAgcGxhdGZvcm1faW5mbyA9IHsKICAgICAgICAgICAgJ3N5c3RlbSc6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICAgICAncmVsZWFzZSc6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICB9CiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBwbGF0Zm9ybV9pbmZvID0gewogICAgICAgICAgICAnc3lzdGVtJzogJ1Vua25vd24nLAogICAgICAgICAgICAncmVsZWFzZSc6ICdVbmtub3duJywKICAgICAgICB9CgogICAgaW1wbGVtZW50YXRpb25faW5mbyA9IF9pbXBsZW1lbnRhdGlvbigpCiAgICB1cmxsaWIzX2luZm8gPSB7J3ZlcnNpb24nOiB1cmxsaWIzLl9fdmVyc2lvbl9ffQogICAgY2hhcmRldF9pbmZvID0geyd2ZXJzaW9uJzogY2hhcmRldC5fX3ZlcnNpb25fX30KCiAgICBweW9wZW5zc2xfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6IE5vbmUsCiAgICAgICAgJ29wZW5zc2xfdmVyc2lvbic6ICcnLAogICAgfQogICAgaWYgT3BlblNTTDoKICAgICAgICBweW9wZW5zc2xfaW5mbyA9IHsKICAgICAgICAgICAgJ3ZlcnNpb24nOiBPcGVuU1NMLl9fdmVyc2lvbl9fLAogICAgICAgICAgICAnb3BlbnNzbF92ZXJzaW9uJzogJyV4JyAlIE9wZW5TU0wuU1NMLk9QRU5TU0xfVkVSU0lPTl9OVU1CRVIsCiAgICAgICAgfQogICAgY3J5cHRvZ3JhcGh5X2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiBnZXRhdHRyKGNyeXB0b2dyYXBoeSwgJ19fdmVyc2lvbl9fJywgJycpLAogICAgfQogICAgaWRuYV9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogZ2V0YXR0cihpZG5hLCAnX192ZXJzaW9uX18nLCAnJyksCiAgICB9CgogICAgIyBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIFB5dGhvbiAyLjYgc3NsIG1vZHVsZS4KICAgIHN5c3RlbV9zc2wgPSBnZXRhdHRyKHNzbCwgJ09QRU5TU0xfVkVSU0lPTl9OVU1CRVInLCBOb25lKQogICAgc3lzdGVtX3NzbF9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogJyV4JyAlIHN5c3RlbV9zc2wgaWYgc3lzdGVtX3NzbCBpcyBub3QgTm9uZSBlbHNlICcnCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICAncGxhdGZvcm0nOiBwbGF0Zm9ybV9pbmZvLAogICAgICAgICdpbXBsZW1lbnRhdGlvbic6IGltcGxlbWVudGF0aW9uX2luZm8sCiAgICAgICAgJ3N5c3RlbV9zc2wnOiBzeXN0ZW1fc3NsX2luZm8sCiAgICAgICAgJ3VzaW5nX3B5b3BlbnNzbCc6IHB5b3BlbnNzbCBpcyBub3QgTm9uZSwKICAgICAgICAncHlPcGVuU1NMJzogcHlvcGVuc3NsX2luZm8sCiAgICAgICAgJ3VybGxpYjMnOiB1cmxsaWIzX2luZm8sCiAgICAgICAgJ2NoYXJkZXQnOiBjaGFyZGV0X2luZm8sCiAgICAgICAgJ2NyeXB0b2dyYXBoeSc6IGNyeXB0b2dyYXBoeV9pbmZvLAogICAgICAgICdpZG5hJzogaWRuYV9pbmZvLAogICAgICAgICdyZXF1ZXN0cyc6IHsKICAgICAgICAgICAgJ3ZlcnNpb24nOiByZXF1ZXN0c192ZXJzaW9uLAogICAgICAgIH0sCiAgICB9CgoKZGVmIG1haW4oKToKICAgICIiIlByZXR0eS1wcmludCB0aGUgYnVnIGluZm9ybWF0aW9uIGFzIEpTT04uIiIiCiAgICBwcmludChqc29uLmR1bXBzKGluZm8oKSwgc29ydF9rZXlzPVRydWUsIGluZGVudD0yKSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAedqjyv8CAAD/AgAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9ob29rcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuaG9va3MKfn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBjYXBhYmlsaXRpZXMgZm9yIHRoZSBSZXF1ZXN0cyBob29rcyBzeXN0ZW0uCgpBdmFpbGFibGUgaG9va3M6CgpgYHJlc3BvbnNlYGA6CiAgICBUaGUgcmVzcG9uc2UgZ2VuZXJhdGVkIGZyb20gYSBSZXF1ZXN0LgoiIiIKSE9PS1MgPSBbJ3Jlc3BvbnNlJ10KCgpkZWYgZGVmYXVsdF9ob29rcygpOgogICAgcmV0dXJuIGRpY3QoKGV2ZW50LCBbXSkgZm9yIGV2ZW50IGluIEhPT0tTKQoKIyBUT0RPOiByZXNwb25zZSBpcyB0aGUgb25seSBvbmUKCgpkZWYgZGlzcGF0Y2hfaG9vayhrZXksIGhvb2tzLCBob29rX2RhdGEsICoqa3dhcmdzKToKICAgICIiIkRpc3BhdGNoZXMgYSBob29rIGRpY3Rpb25hcnkgb24gYSBnaXZlbiBwaWVjZSBvZiBkYXRhLiIiIgogICAgaG9va3MgPSBob29rcyBvciBkaWN0KCkKICAgIGhvb2tzID0gaG9va3MuZ2V0KGtleSkKICAgIGlmIGhvb2tzOgogICAgICAgIGlmIGhhc2F0dHIoaG9va3MsICdfX2NhbGxfXycpOgogICAgICAgICAgICBob29rcyA9IFtob29rc10KICAgICAgICBmb3IgaG9vayBpbiBob29rczoKICAgICAgICAgICAgX2hvb2tfZGF0YSA9IGhvb2soaG9va19kYXRhLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgX2hvb2tfZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGhvb2tfZGF0YSA9IF9ob29rX2RhdGEKICAgIHJldHVybiBob29rX2RhdGEKUEsDBBQAAAAAAAAAIQBlfUd0A4UAAAOFAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMubW9kZWxzCn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHByaW1hcnkgb2JqZWN0cyB0aGF0IHBvd2VyIFJlcXVlc3RzLgoiIiIKCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IHN5cwoKIyBJbXBvcnQgZW5jb2Rpbmcgbm93LCB0byBhdm9pZCBpbXBsaWNpdCBpbXBvcnQgbGF0ZXIuCiMgSW1wbGljaXQgaW1wb3J0IHdpdGhpbiB0aHJlYWRzIG1heSBjYXVzZSBMb29rdXBFcnJvciB3aGVuIHN0YW5kYXJkIGxpYnJhcnkgaXMgaW4gYSBaSVAsCiMgc3VjaCBhcyBpbiBFbWJlZGRlZCBQeXRob24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM1NzguCmltcG9ydCBlbmNvZGluZ3MuaWRuYQoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmZpZWxkcyBpbXBvcnQgUmVxdWVzdEZpZWxkCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbCBpbXBvcnQgcGFyc2VfdXJsCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCAoCiAgICBEZWNvZGVFcnJvciwgUmVhZFRpbWVvdXRFcnJvciwgUHJvdG9jb2xFcnJvciwgTG9jYXRpb25QYXJzZUVycm9yKQoKZnJvbSBpbyBpbXBvcnQgVW5zdXBwb3J0ZWRPcGVyYXRpb24KZnJvbSAuaG9va3MgaW1wb3J0IGRlZmF1bHRfaG9va3MKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdAoKZnJvbSAuYXV0aCBpbXBvcnQgSFRUUEJhc2ljQXV0aApmcm9tIC5jb29raWVzIGltcG9ydCBjb29raWVqYXJfZnJvbV9kaWN0LCBnZXRfY29va2llX2hlYWRlciwgX2NvcHlfY29va2llX2phcgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBIVFRQRXJyb3IsIE1pc3NpbmdTY2hlbWEsIEludmFsaWRVUkwsIENodW5rZWRFbmNvZGluZ0Vycm9yLAogICAgQ29udGVudERlY29kaW5nRXJyb3IsIENvbm5lY3Rpb25FcnJvciwgU3RyZWFtQ29uc3VtZWRFcnJvcikKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nLCB1bmljb2RlX2lzX2FzY2lpCmZyb20gLnV0aWxzIGltcG9ydCAoCiAgICBndWVzc19maWxlbmFtZSwgZ2V0X2F1dGhfZnJvbV91cmwsIHJlcXVvdGVfdXJpLAogICAgc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlLCB0b19rZXlfdmFsX2xpc3QsIHBhcnNlX2hlYWRlcl9saW5rcywKICAgIGl0ZXJfc2xpY2VzLCBndWVzc19qc29uX3V0Ziwgc3VwZXJfbGVuLCBjaGVja19oZWFkZXJfdmFsaWRpdHkpCmZyb20gLmNvbXBhdCBpbXBvcnQgKAogICAgY29va2llbGliLCB1cmx1bnBhcnNlLCB1cmxzcGxpdCwgdXJsZW5jb2RlLCBzdHIsIGJ5dGVzLAogICAgaXNfcHkyLCBjaGFyZGV0LCBidWlsdGluX3N0ciwgYmFzZXN0cmluZykKZnJvbSAuY29tcGF0IGltcG9ydCBqc29uIGFzIGNvbXBsZXhqc29uCmZyb20gLnN0YXR1c19jb2RlcyBpbXBvcnQgY29kZXMKCiM6IFRoZSBzZXQgb2YgSFRUUCBzdGF0dXMgY29kZXMgdGhhdCBpbmRpY2F0ZSBhbiBhdXRvbWF0aWNhbGx5CiM6IHByb2Nlc3NhYmxlIHJlZGlyZWN0LgpSRURJUkVDVF9TVEFUSSA9ICgKICAgIGNvZGVzLm1vdmVkLCAgICAgICAgICAgICAgICMgMzAxCiAgICBjb2Rlcy5mb3VuZCwgICAgICAgICAgICAgICAjIDMwMgogICAgY29kZXMub3RoZXIsICAgICAgICAgICAgICAgIyAzMDMKICAgIGNvZGVzLnRlbXBvcmFyeV9yZWRpcmVjdCwgICMgMzA3CiAgICBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QsICAjIDMwOAopCgpERUZBVUxUX1JFRElSRUNUX0xJTUlUID0gMzAKQ09OVEVOVF9DSFVOS19TSVpFID0gMTAgKiAxMDI0CklURVJfQ0hVTktfU0laRSA9IDUxMgoKCmNsYXNzIFJlcXVlc3RFbmNvZGluZ01peGluKG9iamVjdCk6CiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoX3VybChzZWxmKToKICAgICAgICAiIiJCdWlsZCB0aGUgcGF0aCBVUkwgdG8gdXNlLiIiIgoKICAgICAgICB1cmwgPSBbXQoKICAgICAgICBwID0gdXJsc3BsaXQoc2VsZi51cmwpCgogICAgICAgIHBhdGggPSBwLnBhdGgKICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcGF0aCA9ICcvJwoKICAgICAgICB1cmwuYXBwZW5kKHBhdGgpCgogICAgICAgIHF1ZXJ5ID0gcC5xdWVyeQogICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICB1cmwuYXBwZW5kKCc/JykKICAgICAgICAgICAgdXJsLmFwcGVuZChxdWVyeSkKCiAgICAgICAgcmV0dXJuICcnLmpvaW4odXJsKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5jb2RlX3BhcmFtcyhkYXRhKToKICAgICAgICAiIiJFbmNvZGUgcGFyYW1ldGVycyBpbiBhIHBpZWNlIG9mIGRhdGEuCgogICAgICAgIFdpbGwgc3VjY2Vzc2Z1bGx5IGVuY29kZSBwYXJhbWV0ZXJzIHdoZW4gcGFzc2VkIGFzIGEgZGljdCBvciBhIGxpc3Qgb2YKICAgICAgICAyLXR1cGxlcy4gT3JkZXIgaXMgcmV0YWluZWQgaWYgZGF0YSBpcyBhIGxpc3Qgb2YgMi10dXBsZXMgYnV0IGFyYml0cmFyeQogICAgICAgIGlmIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFzIGEgZGljdC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCAoc3RyLCBieXRlcykpOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAncmVhZCcpOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAnX19pdGVyX18nKToKICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgZm9yIGssIHZzIGluIHRvX2tleV92YWxfbGlzdChkYXRhKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnMsIGJhc2VzdHJpbmcpIG9yIG5vdCBoYXNhdHRyKHZzLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgICAgICB2cyA9IFt2c10KICAgICAgICAgICAgICAgIGZvciB2IGluIHZzOgogICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoay5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShrLCBzdHIpIGVsc2UgaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmVuY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKHYsIHN0cikgZWxzZSB2KSkKICAgICAgICAgICAgcmV0dXJuIHVybGVuY29kZShyZXN1bHQsIGRvc2VxPVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2VuY29kZV9maWxlcyhmaWxlcywgZGF0YSk6CiAgICAgICAgIiIiQnVpbGQgdGhlIGJvZHkgZm9yIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0LgoKICAgICAgICBXaWxsIHN1Y2Nlc3NmdWxseSBlbmNvZGUgZmlsZXMgd2hlbiBwYXNzZWQgYXMgYSBkaWN0IG9yIGEgbGlzdCBvZgogICAgICAgIHR1cGxlcy4gT3JkZXIgaXMgcmV0YWluZWQgaWYgZGF0YSBpcyBhIGxpc3Qgb2YgdHVwbGVzIGJ1dCBhcmJpdHJhcnkKICAgICAgICBpZiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBhIGRpY3QuCiAgICAgICAgVGhlIHR1cGxlcyBtYXkgYmUgMi10dXBsZXMgKGZpbGVuYW1lLCBmaWxlb2JqKSwgMy10dXBsZXMgKGZpbGVuYW1lLCBmaWxlb2JqLCBjb250ZW50eXBlKQogICAgICAgIG9yIDQtdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiwgY29udGVudHlwZSwgY3VzdG9tX2hlYWRlcnMpLgogICAgICAgICIiIgogICAgICAgIGlmIChub3QgZmlsZXMpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGaWxlcyBtdXN0IGJlIHByb3ZpZGVkLiIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEYXRhIG11c3Qgbm90IGJlIGEgc3RyaW5nLiIpCgogICAgICAgIG5ld19maWVsZHMgPSBbXQogICAgICAgIGZpZWxkcyA9IHRvX2tleV92YWxfbGlzdChkYXRhIG9yIHt9KQogICAgICAgIGZpbGVzID0gdG9fa2V5X3ZhbF9saXN0KGZpbGVzIG9yIHt9KQoKICAgICAgICBmb3IgZmllbGQsIHZhbCBpbiBmaWVsZHM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBiYXNlc3RyaW5nKSBvciBub3QgaGFzYXR0cih2YWwsICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgdmFsID0gW3ZhbF0KICAgICAgICAgICAgZm9yIHYgaW4gdmFsOgogICAgICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAjIERvbid0IGNhbGwgc3RyKCkgb24gYnl0ZXN0cmluZ3M6IGluIFB5MyBpdCBhbGwgZ29lcyB3cm9uZy4KICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBieXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIodikKCiAgICAgICAgICAgICAgICAgICAgbmV3X2ZpZWxkcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC5kZWNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShmaWVsZCwgYnl0ZXMpIGVsc2UgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICB2LmVuY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKHYsIHN0cikgZWxzZSB2KSkKCiAgICAgICAgZm9yIChrLCB2KSBpbiBmaWxlczoKICAgICAgICAgICAgIyBzdXBwb3J0IGZvciBleHBsaWNpdCBmaWxlbmFtZQogICAgICAgICAgICBmdCA9IE5vbmUKICAgICAgICAgICAgZmggPSBOb25lCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgKHR1cGxlLCBsaXN0KSk6CiAgICAgICAgICAgICAgICBpZiBsZW4odikgPT0gMjoKICAgICAgICAgICAgICAgICAgICBmbiwgZnAgPSB2CiAgICAgICAgICAgICAgICBlbGlmIGxlbih2KSA9PSAzOgogICAgICAgICAgICAgICAgICAgIGZuLCBmcCwgZnQgPSB2CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZuLCBmcCwgZnQsIGZoID0gdgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm4gPSBndWVzc19maWxlbmFtZSh2KSBvciBrCiAgICAgICAgICAgICAgICBmcCA9IHYKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnAsIChzdHIsIGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICAgICAgICAgIGZkYXRhID0gZnAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZkYXRhID0gZnAucmVhZCgpCgogICAgICAgICAgICByZiA9IFJlcXVlc3RGaWVsZChuYW1lPWssIGRhdGE9ZmRhdGEsIGZpbGVuYW1lPWZuLCBoZWFkZXJzPWZoKQogICAgICAgICAgICByZi5tYWtlX211bHRpcGFydChjb250ZW50X3R5cGU9ZnQpCiAgICAgICAgICAgIG5ld19maWVsZHMuYXBwZW5kKHJmKQoKICAgICAgICBib2R5LCBjb250ZW50X3R5cGUgPSBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhKG5ld19maWVsZHMpCgogICAgICAgIHJldHVybiBib2R5LCBjb250ZW50X3R5cGUKCgpjbGFzcyBSZXF1ZXN0SG9va3NNaXhpbihvYmplY3QpOgogICAgZGVmIHJlZ2lzdGVyX2hvb2soc2VsZiwgZXZlbnQsIGhvb2spOgogICAgICAgICIiIlByb3Blcmx5IHJlZ2lzdGVyIGEgaG9vay4iIiIKCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHNlbGYuaG9va3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vuc3VwcG9ydGVkIGV2ZW50IHNwZWNpZmllZCwgd2l0aCBldmVudCBuYW1lICIlcyInICUgKGV2ZW50KSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShob29rLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgICAgIHNlbGYuaG9va3NbZXZlbnRdLmFwcGVuZChob29rKQogICAgICAgIGVsaWYgaGFzYXR0cihob29rLCAnX19pdGVyX18nKToKICAgICAgICAgICAgc2VsZi5ob29rc1tldmVudF0uZXh0ZW5kKGggZm9yIGggaW4gaG9vayBpZiBpc2luc3RhbmNlKGgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSkKCiAgICBkZWYgZGVyZWdpc3Rlcl9ob29rKHNlbGYsIGV2ZW50LCBob29rKToKICAgICAgICAiIiJEZXJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGhvb2suCiAgICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBob29rIGV4aXN0ZWQsIEZhbHNlIGlmIG5vdC4KICAgICAgICAiIiIKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmhvb2tzW2V2ZW50XS5yZW1vdmUoaG9vaykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKY2xhc3MgUmVxdWVzdChSZXF1ZXN0SG9va3NNaXhpbik6CiAgICAiIiJBIHVzZXItY3JlYXRlZCA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBvYmplY3QuCgogICAgVXNlZCB0byBwcmVwYXJlIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gLCB3aGljaCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIuCgogICAgOnBhcmFtIG1ldGhvZDogSFRUUCBtZXRob2QgdG8gdXNlLgogICAgOnBhcmFtIHVybDogVVJMIHRvIHNlbmQuCiAgICA6cGFyYW0gaGVhZGVyczogZGljdGlvbmFyeSBvZiBoZWFkZXJzIHRvIHNlbmQuCiAgICA6cGFyYW0gZmlsZXM6IGRpY3Rpb25hcnkgb2Yge2ZpbGVuYW1lOiBmaWxlb2JqZWN0fSBmaWxlcyB0byBtdWx0aXBhcnQgdXBsb2FkLgogICAgOnBhcmFtIGRhdGE6IHRoZSBib2R5IHRvIGF0dGFjaCB0byB0aGUgcmVxdWVzdC4gSWYgYSBkaWN0aW9uYXJ5IGlzIHByb3ZpZGVkLCBmb3JtLWVuY29kaW5nIHdpbGwgdGFrZSBwbGFjZS4KICAgIDpwYXJhbSBqc29uOiBqc29uIGZvciB0aGUgYm9keSB0byBhdHRhY2ggdG8gdGhlIHJlcXVlc3QgKGlmIGZpbGVzIG9yIGRhdGEgaXMgbm90IHNwZWNpZmllZCkuCiAgICA6cGFyYW0gcGFyYW1zOiBkaWN0aW9uYXJ5IG9mIFVSTCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgVVJMLgogICAgOnBhcmFtIGF1dGg6IEF1dGggaGFuZGxlciBvciAodXNlciwgcGFzcykgdHVwbGUuCiAgICA6cGFyYW0gY29va2llczogZGljdGlvbmFyeSBvciBDb29raWVKYXIgb2YgY29va2llcyB0byBhdHRhY2ggdG8gdGhpcyByZXF1ZXN0LgogICAgOnBhcmFtIGhvb2tzOiBkaWN0aW9uYXJ5IG9mIGNhbGxiYWNrIGhvb2tzLCBmb3IgaW50ZXJuYWwgdXNhZ2UuCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMuUmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA+Pj4gcmVxLnByZXBhcmUoKQogICAgICA8UHJlcGFyZWRSZXF1ZXN0IFtHRVRdPgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgIG1ldGhvZD1Ob25lLCB1cmw9Tm9uZSwgaGVhZGVycz1Ob25lLCBmaWxlcz1Ob25lLCBkYXRhPU5vbmUsCiAgICAgICAgICAgIHBhcmFtcz1Ob25lLCBhdXRoPU5vbmUsIGNvb2tpZXM9Tm9uZSwgaG9va3M9Tm9uZSwganNvbj1Ob25lKToKCiAgICAgICAgIyBEZWZhdWx0IGVtcHR5IGRpY3RzIGZvciBkaWN0IHBhcmFtcy4KICAgICAgICBkYXRhID0gW10gaWYgZGF0YSBpcyBOb25lIGVsc2UgZGF0YQogICAgICAgIGZpbGVzID0gW10gaWYgZmlsZXMgaXMgTm9uZSBlbHNlIGZpbGVzCiAgICAgICAgaGVhZGVycyA9IHt9IGlmIGhlYWRlcnMgaXMgTm9uZSBlbHNlIGhlYWRlcnMKICAgICAgICBwYXJhbXMgPSB7fSBpZiBwYXJhbXMgaXMgTm9uZSBlbHNlIHBhcmFtcwogICAgICAgIGhvb2tzID0ge30gaWYgaG9va3MgaXMgTm9uZSBlbHNlIGhvb2tzCgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKICAgICAgICBmb3IgKGssIHYpIGluIGxpc3QoaG9va3MuaXRlbXMoKSk6CiAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfaG9vayhldmVudD1rLCBob29rPXYpCgogICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCiAgICAgICAgc2VsZi5maWxlcyA9IGZpbGVzCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuanNvbiA9IGpzb24KICAgICAgICBzZWxmLnBhcmFtcyA9IHBhcmFtcwogICAgICAgIHNlbGYuYXV0aCA9IGF1dGgKICAgICAgICBzZWxmLmNvb2tpZXMgPSBjb29raWVzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFJlcXVlc3QgWyVzXT4nICUgKHNlbGYubWV0aG9kKQoKICAgIGRlZiBwcmVwYXJlKHNlbGYpOgogICAgICAgICIiIkNvbnN0cnVjdHMgYSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgZm9yIHRyYW5zbWlzc2lvbiBhbmQgcmV0dXJucyBpdC4iIiIKICAgICAgICBwID0gUHJlcGFyZWRSZXF1ZXN0KCkKICAgICAgICBwLnByZXBhcmUoCiAgICAgICAgICAgIG1ldGhvZD1zZWxmLm1ldGhvZCwKICAgICAgICAgICAgdXJsPXNlbGYudXJsLAogICAgICAgICAgICBoZWFkZXJzPXNlbGYuaGVhZGVycywKICAgICAgICAgICAgZmlsZXM9c2VsZi5maWxlcywKICAgICAgICAgICAgZGF0YT1zZWxmLmRhdGEsCiAgICAgICAgICAgIGpzb249c2VsZi5qc29uLAogICAgICAgICAgICBwYXJhbXM9c2VsZi5wYXJhbXMsCiAgICAgICAgICAgIGF1dGg9c2VsZi5hdXRoLAogICAgICAgICAgICBjb29raWVzPXNlbGYuY29va2llcywKICAgICAgICAgICAgaG9va3M9c2VsZi5ob29rcywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHAKCgpjbGFzcyBQcmVwYXJlZFJlcXVlc3QoUmVxdWVzdEVuY29kaW5nTWl4aW4sIFJlcXVlc3RIb29rc01peGluKToKICAgICIiIlRoZSBmdWxseSBtdXRhYmxlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QsCiAgICBjb250YWluaW5nIHRoZSBleGFjdCBieXRlcyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLgoKICAgIEdlbmVyYXRlZCBmcm9tIGVpdGhlciBhIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIG9iamVjdCBvciBtYW51YWxseS4KCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiByZXEgPSByZXF1ZXN0cy5SZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgID4+PiByID0gcmVxLnByZXBhcmUoKQogICAgICA8UHJlcGFyZWRSZXF1ZXN0IFtHRVRdPgoKICAgICAgPj4+IHMgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgICAgPj4+IHMuc2VuZChyKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIzogSFRUUCB2ZXJiIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICAgICBzZWxmLm1ldGhvZCA9IE5vbmUKICAgICAgICAjOiBIVFRQIFVSTCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLgogICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgICM6IGRpY3Rpb25hcnkgb2YgSFRUUCBoZWFkZXJzLgogICAgICAgIHNlbGYuaGVhZGVycyA9IE5vbmUKICAgICAgICAjIFRoZSBgQ29va2llSmFyYCB1c2VkIHRvIGNyZWF0ZSB0aGUgQ29va2llIGhlYWRlciB3aWxsIGJlIHN0b3JlZCBoZXJlCiAgICAgICAgIyBhZnRlciBwcmVwYXJlX2Nvb2tpZXMgaXMgY2FsbGVkCiAgICAgICAgc2VsZi5fY29va2llcyA9IE5vbmUKICAgICAgICAjOiByZXF1ZXN0IGJvZHkgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgICAgIHNlbGYuYm9keSA9IE5vbmUKICAgICAgICAjOiBkaWN0aW9uYXJ5IG9mIGNhbGxiYWNrIGhvb2tzLCBmb3IgaW50ZXJuYWwgdXNhZ2UuCiAgICAgICAgc2VsZi5ob29rcyA9IGRlZmF1bHRfaG9va3MoKQogICAgICAgICM6IGludGVnZXIgZGVub3Rpbmcgc3RhcnRpbmcgcG9zaXRpb24gb2YgYSByZWFkYWJsZSBmaWxlLWxpa2UgYm9keS4KICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gTm9uZQoKICAgIGRlZiBwcmVwYXJlKHNlbGYsCiAgICAgICAgICAgIG1ldGhvZD1Ob25lLCB1cmw9Tm9uZSwgaGVhZGVycz1Ob25lLCBmaWxlcz1Ob25lLCBkYXRhPU5vbmUsCiAgICAgICAgICAgIHBhcmFtcz1Ob25lLCBhdXRoPU5vbmUsIGNvb2tpZXM9Tm9uZSwgaG9va3M9Tm9uZSwganNvbj1Ob25lKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZW50aXJlIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4iIiIKCiAgICAgICAgc2VsZi5wcmVwYXJlX21ldGhvZChtZXRob2QpCiAgICAgICAgc2VsZi5wcmVwYXJlX3VybCh1cmwsIHBhcmFtcykKICAgICAgICBzZWxmLnByZXBhcmVfaGVhZGVycyhoZWFkZXJzKQogICAgICAgIHNlbGYucHJlcGFyZV9jb29raWVzKGNvb2tpZXMpCiAgICAgICAgc2VsZi5wcmVwYXJlX2JvZHkoZGF0YSwgZmlsZXMsIGpzb24pCiAgICAgICAgc2VsZi5wcmVwYXJlX2F1dGgoYXV0aCwgdXJsKQoKICAgICAgICAjIE5vdGUgdGhhdCBwcmVwYXJlX2F1dGggbXVzdCBiZSBsYXN0IHRvIGVuYWJsZSBhdXRoZW50aWNhdGlvbiBzY2hlbWVzCiAgICAgICAgIyBzdWNoIGFzIE9BdXRoIHRvIHdvcmsgb24gYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0LgoKICAgICAgICAjIFRoaXMgTVVTVCBnbyBhZnRlciBwcmVwYXJlX2F1dGguIEF1dGhlbnRpY2F0b3JzIGNvdWxkIGFkZCBhIGhvb2sKICAgICAgICBzZWxmLnByZXBhcmVfaG9va3MoaG9va3MpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFByZXBhcmVkUmVxdWVzdCBbJXNdPicgJSAoc2VsZi5tZXRob2QpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5tZXRob2QgPSBzZWxmLm1ldGhvZAogICAgICAgIHAudXJsID0gc2VsZi51cmwKICAgICAgICBwLmhlYWRlcnMgPSBzZWxmLmhlYWRlcnMuY29weSgpIGlmIHNlbGYuaGVhZGVycyBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICBwLl9jb29raWVzID0gX2NvcHlfY29va2llX2phcihzZWxmLl9jb29raWVzKQogICAgICAgIHAuYm9keSA9IHNlbGYuYm9keQogICAgICAgIHAuaG9va3MgPSBzZWxmLmhvb2tzCiAgICAgICAgcC5fYm9keV9wb3NpdGlvbiA9IHNlbGYuX2JvZHlfcG9zaXRpb24KICAgICAgICByZXR1cm4gcAoKICAgIGRlZiBwcmVwYXJlX21ldGhvZChzZWxmLCBtZXRob2QpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIG1ldGhvZC4iIiIKICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAogICAgICAgIGlmIHNlbGYubWV0aG9kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1ldGhvZCA9IHRvX25hdGl2ZV9zdHJpbmcoc2VsZi5tZXRob2QudXBwZXIoKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9pZG5hX2VuY29kZWRfaG9zdChob3N0KToKICAgICAgICBpbXBvcnQgaWRuYQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhvc3QgPSBpZG5hLmVuY29kZShob3N0LCB1dHM0Nj1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBleGNlcHQgaWRuYS5JRE5BRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcgogICAgICAgIHJldHVybiBob3N0CgogICAgZGVmIHByZXBhcmVfdXJsKHNlbGYsIHVybCwgcGFyYW1zKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBVUkwuIiIiCiAgICAgICAgIzogQWNjZXB0IG9iamVjdHMgdGhhdCBoYXZlIHN0cmluZyByZXByZXNlbnRhdGlvbnMuCiAgICAgICAgIzogV2UncmUgdW5hYmxlIHRvIGJsaW5kbHkgY2FsbCB1bmljb2RlL3N0ciBmdW5jdGlvbnMKICAgICAgICAjOiBhcyB0aGlzIHdpbGwgaW5jbHVkZSB0aGUgYnl0ZXN0cmluZyBpbmRpY2F0b3IgKGInJykKICAgICAgICAjOiBvbiBweXRob24gMy54LgogICAgICAgICM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9wdWxsLzIyMzgKICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgYnl0ZXMpOgogICAgICAgICAgICB1cmwgPSB1cmwuZGVjb2RlKCd1dGY4JykKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwgPSB1bmljb2RlKHVybCkgaWYgaXNfcHkyIGVsc2Ugc3RyKHVybCkKCiAgICAgICAgIyBSZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlcyBmcm9tIHVybAogICAgICAgIHVybCA9IHVybC5sc3RyaXAoKQoKICAgICAgICAjIERvbid0IGRvIGFueSBVUkwgcHJlcGFyYXRpb24gZm9yIG5vbi1IVFRQIHNjaGVtZXMgbGlrZSBgbWFpbHRvYCwKICAgICAgICAjIGBkYXRhYCBldGMgdG8gd29yayBhcm91bmQgZXhjZXB0aW9ucyBmcm9tIGB1cmxfcGFyc2VgLCB3aGljaAogICAgICAgICMgaGFuZGxlcyBSRkMgMzk4NiBvbmx5LgogICAgICAgIGlmICc6JyBpbiB1cmwgYW5kIG5vdCB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdodHRwJyk6CiAgICAgICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFN1cHBvcnQgZm9yIHVuaWNvZGUgZG9tYWluIG5hbWVzIGFuZCBwYXRocy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gcGFyc2VfdXJsKHVybCkKICAgICAgICBleGNlcHQgTG9jYXRpb25QYXJzZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoKmUuYXJncykKCiAgICAgICAgaWYgbm90IHNjaGVtZToKICAgICAgICAgICAgZXJyb3IgPSAoIkludmFsaWQgVVJMIHswIXJ9OiBObyBzY2hlbWEgc3VwcGxpZWQuIFBlcmhhcHMgeW91IG1lYW50IGh0dHA6Ly97MH0/IikKICAgICAgICAgICAgZXJyb3IgPSBlcnJvci5mb3JtYXQodG9fbmF0aXZlX3N0cmluZyh1cmwsICd1dGY4JykpCgogICAgICAgICAgICByYWlzZSBNaXNzaW5nU2NoZW1hKGVycm9yKQoKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgiSW52YWxpZCBVUkwgJXI6IE5vIGhvc3Qgc3VwcGxpZWQiICUgdXJsKQoKICAgICAgICAjIEluIGdlbmVyYWwsIHdlIHdhbnQgdG8gdHJ5IElETkEgZW5jb2RpbmcgdGhlIGhvc3RuYW1lIGlmIHRoZSBzdHJpbmcgY29udGFpbnMKICAgICAgICAjIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBUaGlzIGFsbG93cyB1c2VycyB0byBhdXRvbWF0aWNhbGx5IGdldCB0aGUgY29ycmVjdCBJRE5BCiAgICAgICAgIyBiZWhhdmlvdXIuIEZvciBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSBBU0NJSSBjaGFyYWN0ZXJzLCB3ZSBuZWVkIHRvIGFsc28gdmVyaWZ5CiAgICAgICAgIyBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSB3aWxkY2FyZCAoKiksIGJlZm9yZSBhbGxvd2luZyB0aGUgdW5lbmNvZGVkIGhvc3RuYW1lLgogICAgICAgIGlmIG5vdCB1bmljb2RlX2lzX2FzY2lpKGhvc3QpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBob3N0ID0gc2VsZi5fZ2V0X2lkbmFfZW5jb2RlZF9ob3N0KGhvc3QpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCdVUkwgaGFzIGFuIGludmFsaWQgbGFiZWwuJykKICAgICAgICBlbGlmIGhvc3Quc3RhcnRzd2l0aCh1JyonKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgnVVJMIGhhcyBhbiBpbnZhbGlkIGxhYmVsLicpCgogICAgICAgICMgQ2FyZWZ1bGx5IHJlY29uc3RydWN0IHRoZSBuZXR3b3JrIGxvY2F0aW9uCiAgICAgICAgbmV0bG9jID0gYXV0aCBvciAnJwogICAgICAgIGlmIG5ldGxvYzoKICAgICAgICAgICAgbmV0bG9jICs9ICdAJwogICAgICAgIG5ldGxvYyArPSBob3N0CiAgICAgICAgaWYgcG9ydDoKICAgICAgICAgICAgbmV0bG9jICs9ICc6JyArIHN0cihwb3J0KQoKICAgICAgICAjIEJhcmUgZG9tYWlucyBhcmVuJ3QgdmFsaWQgVVJMcy4KICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcGF0aCA9ICcvJwoKICAgICAgICBpZiBpc19weTI6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2NoZW1lLCBzdHIpOgogICAgICAgICAgICAgICAgc2NoZW1lID0gc2NoZW1lLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5ldGxvYywgc3RyKToKICAgICAgICAgICAgICAgIG5ldGxvYyA9IG5ldGxvYy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzdHIpOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocXVlcnksIHN0cik6CiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZyYWdtZW50LCBzdHIpOgogICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbXMsIChzdHIsIGJ5dGVzKSk6CiAgICAgICAgICAgIHBhcmFtcyA9IHRvX25hdGl2ZV9zdHJpbmcocGFyYW1zKQoKICAgICAgICBlbmNfcGFyYW1zID0gc2VsZi5fZW5jb2RlX3BhcmFtcyhwYXJhbXMpCiAgICAgICAgaWYgZW5jX3BhcmFtczoKICAgICAgICAgICAgaWYgcXVlcnk6CiAgICAgICAgICAgICAgICBxdWVyeSA9ICclcyYlcycgJSAocXVlcnksIGVuY19wYXJhbXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBxdWVyeSA9IGVuY19wYXJhbXMKCiAgICAgICAgdXJsID0gcmVxdW90ZV91cmkodXJsdW5wYXJzZShbc2NoZW1lLCBuZXRsb2MsIHBhdGgsIE5vbmUsIHF1ZXJ5LCBmcmFnbWVudF0pKQogICAgICAgIHNlbGYudXJsID0gdXJsCgogICAgZGVmIHByZXBhcmVfaGVhZGVycyhzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBoZWFkZXJzLiIiIgoKICAgICAgICBzZWxmLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBmb3IgaGVhZGVyIGluIGhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICMgUmFpc2UgZXhjZXB0aW9uIG9uIGludmFsaWQgaGVhZGVyIHZhbHVlLgogICAgICAgICAgICAgICAgY2hlY2tfaGVhZGVyX3ZhbGlkaXR5KGhlYWRlcikKICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gaGVhZGVyCiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbdG9fbmF0aXZlX3N0cmluZyhuYW1lKV0gPSB2YWx1ZQoKICAgIGRlZiBwcmVwYXJlX2JvZHkoc2VsZiwgZGF0YSwgZmlsZXMsIGpzb249Tm9uZSk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgYm9keSBkYXRhLiIiIgoKICAgICAgICAjIENoZWNrIGlmIGZpbGUsIGZvLCBnZW5lcmF0b3IsIGl0ZXJhdG9yLgogICAgICAgICMgSWYgbm90LCBydW4gdGhyb3VnaCBub3JtYWwgcHJvY2Vzcy4KCiAgICAgICAgIyBOb3R0aW4nIG9uIHlvdS4KICAgICAgICBib2R5ID0gTm9uZQogICAgICAgIGNvbnRlbnRfdHlwZSA9IE5vbmUKCiAgICAgICAgaWYgbm90IGRhdGEgYW5kIGpzb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgdXJsbGliMyByZXF1aXJlcyBhIGJ5dGVzLWxpa2UgYm9keS4gUHl0aG9uIDIncyBqc29uLmR1bXBzCiAgICAgICAgICAgICMgcHJvdmlkZXMgdGhpcyBuYXRpdmVseSwgYnV0IFB5dGhvbiAzIGdpdmVzIGEgVW5pY29kZSBzdHJpbmcuCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICAgICAgICBib2R5ID0gY29tcGxleGpzb24uZHVtcHMoanNvbikKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYm9keSwgYnl0ZXMpOgogICAgICAgICAgICAgICAgYm9keSA9IGJvZHkuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlzX3N0cmVhbSA9IGFsbChbCiAgICAgICAgICAgIGhhc2F0dHIoZGF0YSwgJ19faXRlcl9fJyksCiAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKGRhdGEsIChiYXNlc3RyaW5nLCBsaXN0LCB0dXBsZSwgY29sbGVjdGlvbnMuTWFwcGluZykpCiAgICAgICAgXSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW5ndGggPSBzdXBlcl9sZW4oZGF0YSkKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIFVuc3VwcG9ydGVkT3BlcmF0aW9uKToKICAgICAgICAgICAgbGVuZ3RoID0gTm9uZQoKICAgICAgICBpZiBpc19zdHJlYW06CiAgICAgICAgICAgIGJvZHkgPSBkYXRhCgogICAgICAgICAgICBpZiBnZXRhdHRyKGJvZHksICd0ZWxsJywgTm9uZSkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIFJlY29yZCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGJlZm9yZSByZWFkaW5nLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gcmV3aW5kIGEgZmlsZSBpbiB0aGUgZXZlbnQKICAgICAgICAgICAgICAgICMgb2YgYSByZWRpcmVjdC4KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gYm9keS50ZWxsKCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRpZmZlcmVudGlhdGVzIGZyb20gTm9uZSwgYWxsb3dpbmcgdXMgdG8gY2F0Y2gKICAgICAgICAgICAgICAgICAgICAjIGEgZmFpbGVkIGB0ZWxsKClgIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIHJld2luZCB0aGUgYm9keQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvZHlfcG9zaXRpb24gPSBvYmplY3QoKQoKICAgICAgICAgICAgaWYgZmlsZXM6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdTdHJlYW1lZCBib2RpZXMgYW5kIGZpbGVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJykKCiAgICAgICAgICAgIGlmIGxlbmd0aDoKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGJ1aWx0aW5fc3RyKGxlbmd0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXSA9ICdjaHVua2VkJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTXVsdGktcGFydCBmaWxlIHVwbG9hZHMuCiAgICAgICAgICAgIGlmIGZpbGVzOgogICAgICAgICAgICAgICAgKGJvZHksIGNvbnRlbnRfdHlwZSkgPSBzZWxmLl9lbmNvZGVfZmlsZXMoZmlsZXMsIGRhdGEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9lbmNvZGVfcGFyYW1zKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKSBvciBoYXNhdHRyKGRhdGEsICdyZWFkJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwoKICAgICAgICAgICAgc2VsZi5wcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKGJvZHkpCgogICAgICAgICAgICAjIEFkZCBjb250ZW50LXR5cGUgaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgcHJvdmlkZWQuCiAgICAgICAgICAgIGlmIGNvbnRlbnRfdHlwZSBhbmQgKCdjb250ZW50LXR5cGUnIG5vdCBpbiBzZWxmLmhlYWRlcnMpOgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRfdHlwZQoKICAgICAgICBzZWxmLmJvZHkgPSBib2R5CgogICAgZGVmIHByZXBhcmVfY29udGVudF9sZW5ndGgoc2VsZiwgYm9keSk6CiAgICAgICAgIiIiUHJlcGFyZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgYmFzZWQgb24gcmVxdWVzdCBtZXRob2QgYW5kIGJvZHkiIiIKICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBsZW5ndGggPSBzdXBlcl9sZW4oYm9keSkKICAgICAgICAgICAgaWYgbGVuZ3RoOgogICAgICAgICAgICAgICAgIyBJZiBsZW5ndGggZXhpc3RzLCBzZXQgaXQuIE90aGVyd2lzZSwgd2UgZmFsbGJhY2sKICAgICAgICAgICAgICAgICMgdG8gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQuCiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBidWlsdGluX3N0cihsZW5ndGgpCiAgICAgICAgZWxpZiBzZWxmLm1ldGhvZCBub3QgaW4gKCdHRVQnLCAnSEVBRCcpIGFuZCBzZWxmLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpIGlzIE5vbmU6CiAgICAgICAgICAgICMgU2V0IENvbnRlbnQtTGVuZ3RoIHRvIDAgZm9yIG1ldGhvZHMgdGhhdCBjYW4gaGF2ZSBhIGJvZHkKICAgICAgICAgICAgIyBidXQgZG9uJ3QgcHJvdmlkZSBvbmUuIChpLmUuIG5vdCBHRVQgb3IgSEVBRCkKICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gJzAnCgogICAgZGVmIHByZXBhcmVfYXV0aChzZWxmLCBhdXRoLCB1cmw9JycpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGF1dGggZGF0YS4iIiIKCiAgICAgICAgIyBJZiBubyBBdXRoIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQsIGV4dHJhY3QgaXQgZnJvbSB0aGUgVVJMIGZpcnN0LgogICAgICAgIGlmIGF1dGggaXMgTm9uZToKICAgICAgICAgICAgdXJsX2F1dGggPSBnZXRfYXV0aF9mcm9tX3VybChzZWxmLnVybCkKICAgICAgICAgICAgYXV0aCA9IHVybF9hdXRoIGlmIGFueSh1cmxfYXV0aCkgZWxzZSBOb25lCgogICAgICAgIGlmIGF1dGg6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXV0aCwgdHVwbGUpIGFuZCBsZW4oYXV0aCkgPT0gMjoKICAgICAgICAgICAgICAgICMgc3BlY2lhbC1jYXNlIGJhc2ljIEhUVFAgYXV0aAogICAgICAgICAgICAgICAgYXV0aCA9IEhUVFBCYXNpY0F1dGgoKmF1dGgpCgogICAgICAgICAgICAjIEFsbG93IGF1dGggdG8gbWFrZSBpdHMgY2hhbmdlcy4KICAgICAgICAgICAgciA9IGF1dGgoc2VsZikKCiAgICAgICAgICAgICMgVXBkYXRlIHNlbGYgdG8gcmVmbGVjdCB0aGUgYXV0aCBjaGFuZ2VzLgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShyLl9fZGljdF9fKQoKICAgICAgICAgICAgIyBSZWNvbXB1dGUgQ29udGVudC1MZW5ndGgKICAgICAgICAgICAgc2VsZi5wcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKHNlbGYuYm9keSkKCiAgICBkZWYgcHJlcGFyZV9jb29raWVzKHNlbGYsIGNvb2tpZXMpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGNvb2tpZSBkYXRhLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgZ2VuZXJhdGVzIGEgYGBDb29raWVgYCBoZWFkZXIgZnJvbSB0aGUKICAgICAgICBnaXZlbiBjb29raWVzIHVzaW5nIGNvb2tpZWxpYi4gRHVlIHRvIGNvb2tpZWxpYidzIGRlc2lnbiwgdGhlIGhlYWRlcgogICAgICAgIHdpbGwgbm90IGJlIHJlZ2VuZXJhdGVkIGlmIGl0IGFscmVhZHkgZXhpc3RzLCBtZWFuaW5nIHRoaXMgZnVuY3Rpb24KICAgICAgICBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgdGhlIGxpZmUgb2YgdGhlCiAgICAgICAgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIG9iamVjdC4gQW55IHN1YnNlcXVlbnQgY2FsbHMKICAgICAgICB0byBgYHByZXBhcmVfY29va2llc2BgIHdpbGwgaGF2ZSBubyBhY3R1YWwgZWZmZWN0LCB1bmxlc3MgdGhlICJDb29raWUiCiAgICAgICAgaGVhZGVyIGlzIHJlbW92ZWQgYmVmb3JlaGFuZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGNvb2tpZXMsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBzZWxmLl9jb29raWVzID0gY29va2llcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZXMpCgogICAgICAgIGNvb2tpZV9oZWFkZXIgPSBnZXRfY29va2llX2hlYWRlcihzZWxmLl9jb29raWVzLCBzZWxmKQogICAgICAgIGlmIGNvb2tpZV9oZWFkZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29va2llJ10gPSBjb29raWVfaGVhZGVyCgogICAgZGVmIHByZXBhcmVfaG9va3Moc2VsZiwgaG9va3MpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBob29rcy4iIiIKICAgICAgICAjIGhvb2tzIGNhbiBiZSBwYXNzZWQgYXMgTm9uZSB0byB0aGUgcHJlcGFyZSBtZXRob2QgYW5kIHRvIHRoaXMKICAgICAgICAjIG1ldGhvZC4gVG8gcHJldmVudCBpdGVyYXRpbmcgb3ZlciBOb25lLCBzaW1wbHkgdXNlIGFuIGVtcHR5IGxpc3QKICAgICAgICAjIGlmIGhvb2tzIGlzIEZhbHNlLXkKICAgICAgICBob29rcyA9IGhvb2tzIG9yIFtdCiAgICAgICAgZm9yIGV2ZW50IGluIGhvb2tzOgogICAgICAgICAgICBzZWxmLnJlZ2lzdGVyX2hvb2soZXZlbnQsIGhvb2tzW2V2ZW50XSkKCgpjbGFzcyBSZXNwb25zZShvYmplY3QpOgogICAgIiIiVGhlIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0LCB3aGljaCBjb250YWlucyBhCiAgICBzZXJ2ZXIncyByZXNwb25zZSB0byBhbiBIVFRQIHJlcXVlc3QuCiAgICAiIiIKCiAgICBfX2F0dHJzX18gPSBbCiAgICAgICAgJ19jb250ZW50JywgJ3N0YXR1c19jb2RlJywgJ2hlYWRlcnMnLCAndXJsJywgJ2hpc3RvcnknLAogICAgICAgICdlbmNvZGluZycsICdyZWFzb24nLCAnY29va2llcycsICdlbGFwc2VkJywgJ3JlcXVlc3QnCiAgICBdCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvbnRlbnQgPSBGYWxzZQogICAgICAgIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgPSBGYWxzZQogICAgICAgIHNlbGYuX25leHQgPSBOb25lCgogICAgICAgICM6IEludGVnZXIgQ29kZSBvZiByZXNwb25kZWQgSFRUUCBTdGF0dXMsIGUuZy4gNDA0IG9yIDIwMC4KICAgICAgICBzZWxmLnN0YXR1c19jb2RlID0gTm9uZQoKICAgICAgICAjOiBDYXNlLWluc2Vuc2l0aXZlIERpY3Rpb25hcnkgb2YgUmVzcG9uc2UgSGVhZGVycy4KICAgICAgICAjOiBGb3IgZXhhbXBsZSwgYGBoZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ11gYCB3aWxsIHJldHVybiB0aGUKICAgICAgICAjOiB2YWx1ZSBvZiBhIGBgJ0NvbnRlbnQtRW5jb2RpbmcnYGAgcmVzcG9uc2UgaGVhZGVyLgogICAgICAgIHNlbGYuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoKQoKICAgICAgICAjOiBGaWxlLWxpa2Ugb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHJlc3BvbnNlIChmb3IgYWR2YW5jZWQgdXNhZ2UpLgogICAgICAgICM6IFVzZSBvZiBgYHJhd2BgIHJlcXVpcmVzIHRoYXQgYGBzdHJlYW09VHJ1ZWBgIGJlIHNldCBvbiB0aGUgcmVxdWVzdC4KICAgICAgICAjIFRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkgZm9yIHVzZSBpbnRlcm5hbGx5IHRvIFJlcXVlc3RzLgogICAgICAgIHNlbGYucmF3ID0gTm9uZQoKICAgICAgICAjOiBGaW5hbCBVUkwgbG9jYXRpb24gb2YgUmVzcG9uc2UuCiAgICAgICAgc2VsZi51cmwgPSBOb25lCgogICAgICAgICM6IEVuY29kaW5nIHRvIGRlY29kZSB3aXRoIHdoZW4gYWNjZXNzaW5nIHIudGV4dC4KICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQoKICAgICAgICAjOiBBIGxpc3Qgb2YgOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3RzIGZyb20KICAgICAgICAjOiB0aGUgaGlzdG9yeSBvZiB0aGUgUmVxdWVzdC4gQW55IHJlZGlyZWN0IHJlc3BvbnNlcyB3aWxsIGVuZAogICAgICAgICM6IHVwIGhlcmUuIFRoZSBsaXN0IGlzIHNvcnRlZCBmcm9tIHRoZSBvbGRlc3QgdG8gdGhlIG1vc3QgcmVjZW50IHJlcXVlc3QuCiAgICAgICAgc2VsZi5oaXN0b3J5ID0gW10KCiAgICAgICAgIzogVGV4dHVhbCByZWFzb24gb2YgcmVzcG9uZGVkIEhUVFAgU3RhdHVzLCBlLmcuICJOb3QgRm91bmQiIG9yICJPSyIuCiAgICAgICAgc2VsZi5yZWFzb24gPSBOb25lCgogICAgICAgICM6IEEgQ29va2llSmFyIG9mIENvb2tpZXMgdGhlIHNlcnZlciBzZW50IGJhY2suCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdCh7fSkKCiAgICAgICAgIzogVGhlIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQgYmV0d2VlbiBzZW5kaW5nIHRoZSByZXF1ZXN0CiAgICAgICAgIzogYW5kIHRoZSBhcnJpdmFsIG9mIHRoZSByZXNwb25zZSAoYXMgYSB0aW1lZGVsdGEpLgogICAgICAgICM6IFRoaXMgcHJvcGVydHkgc3BlY2lmaWNhbGx5IG1lYXN1cmVzIHRoZSB0aW1lIHRha2VuIGJldHdlZW4gc2VuZGluZwogICAgICAgICM6IHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXF1ZXN0IGFuZCBmaW5pc2hpbmcgcGFyc2luZyB0aGUgaGVhZGVycy4gSXQKICAgICAgICAjOiBpcyB0aGVyZWZvcmUgdW5hZmZlY3RlZCBieSBjb25zdW1pbmcgdGhlIHJlc3BvbnNlIGNvbnRlbnQgb3IgdGhlCiAgICAgICAgIzogdmFsdWUgb2YgdGhlIGBgc3RyZWFtYGAga2V5d29yZCBhcmd1bWVudC4KICAgICAgICBzZWxmLmVsYXBzZWQgPSBkYXRldGltZS50aW1lZGVsdGEoMCkKCiAgICAgICAgIzogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QgdG8gd2hpY2ggdGhpcwogICAgICAgICM6IGlzIGEgcmVzcG9uc2UuCiAgICAgICAgc2VsZi5yZXF1ZXN0ID0gTm9uZQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmc7IGFjY2Vzc2luZyB0aGUgY29udGVudCBhdHRyaWJ1dGUgbWFrZXMKICAgICAgICAjIHN1cmUgdGhlIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcmVhZC4KICAgICAgICBpZiBub3Qgc2VsZi5fY29udGVudF9jb25zdW1lZDoKICAgICAgICAgICAgc2VsZi5jb250ZW50CgogICAgICAgIHJldHVybiBkaWN0KAogICAgICAgICAgICAoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fX2F0dHJzX18KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpCgogICAgICAgICMgcGlja2xlZCBvYmplY3RzIGRvIG5vdCBoYXZlIC5yYXcKICAgICAgICBzZXRhdHRyKHNlbGYsICdfY29udGVudF9jb25zdW1lZCcsIFRydWUpCiAgICAgICAgc2V0YXR0cihzZWxmLCAncmF3JywgTm9uZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8UmVzcG9uc2UgWyVzXT4nICUgKHNlbGYuc3RhdHVzX2NvZGUpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiA6YXR0cjpgc3RhdHVzX2NvZGVgIGlzIGxlc3MgdGhhbiA0MDAuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIGNoZWNrcyBpZiB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlIGlzIGJldHdlZW4KICAgICAgICA0MDAgYW5kIDYwMCB0byBzZWUgaWYgdGhlcmUgd2FzIGEgY2xpZW50IGVycm9yIG9yIGEgc2VydmVyIGVycm9yLiBJZgogICAgICAgIHRoZSBzdGF0dXMgY29kZSwgaXMgYmV0d2VlbiAyMDAgYW5kIDQwMCwgdGhpcyB3aWxsIHJldHVybiBUcnVlLiBUaGlzCiAgICAgICAgaXMgKipub3QqKiBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzcG9uc2UgY29kZSBpcyBgYDIwMCBPS2BgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9rCgogICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiA6YXR0cjpgc3RhdHVzX2NvZGVgIGlzIGxlc3MgdGhhbiA0MDAuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIGNoZWNrcyBpZiB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlIGlzIGJldHdlZW4KICAgICAgICA0MDAgYW5kIDYwMCB0byBzZWUgaWYgdGhlcmUgd2FzIGEgY2xpZW50IGVycm9yIG9yIGEgc2VydmVyIGVycm9yLiBJZgogICAgICAgIHRoZSBzdGF0dXMgY29kZSwgaXMgYmV0d2VlbiAyMDAgYW5kIDQwMCwgdGhpcyB3aWxsIHJldHVybiBUcnVlLiBUaGlzCiAgICAgICAgaXMgKipub3QqKiBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzcG9uc2UgY29kZSBpcyBgYDIwMCBPS2BgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9rCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIkFsbG93cyB5b3UgdG8gdXNlIGEgcmVzcG9uc2UgYXMgYW4gaXRlcmF0b3IuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaXRlcl9jb250ZW50KDEyOCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvayhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgZXhjZXB0IEhUVFBFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19yZWRpcmVjdChzZWxmKToKICAgICAgICAiIiJUcnVlIGlmIHRoaXMgUmVzcG9uc2UgaXMgYSB3ZWxsLWZvcm1lZCBIVFRQIHJlZGlyZWN0IHRoYXQgY291bGQgaGF2ZQogICAgICAgIGJlZW4gcHJvY2Vzc2VkIGF1dG9tYXRpY2FsbHkgKGJ5IDptZXRoOmBTZXNzaW9uLnJlc29sdmVfcmVkaXJlY3RzYCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgnbG9jYXRpb24nIGluIHNlbGYuaGVhZGVycyBhbmQgc2VsZi5zdGF0dXNfY29kZSBpbiBSRURJUkVDVF9TVEFUSSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wZXJtYW5lbnRfcmVkaXJlY3Qoc2VsZik6CiAgICAgICAgIiIiVHJ1ZSBpZiB0aGlzIFJlc3BvbnNlIG9uZSBvZiB0aGUgcGVybWFuZW50IHZlcnNpb25zIG9mIHJlZGlyZWN0LiIiIgogICAgICAgIHJldHVybiAoJ2xvY2F0aW9uJyBpbiBzZWxmLmhlYWRlcnMgYW5kIHNlbGYuc3RhdHVzX2NvZGUgaW4gKGNvZGVzLm1vdmVkX3Blcm1hbmVudGx5LCBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBhIFByZXBhcmVkUmVxdWVzdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBpbiBhIHJlZGlyZWN0IGNoYWluLCBpZiB0aGVyZSBpcyBvbmUuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX25leHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhcHBhcmVudF9lbmNvZGluZyhzZWxmKToKICAgICAgICAiIiJUaGUgYXBwYXJlbnQgZW5jb2RpbmcsIHByb3ZpZGVkIGJ5IHRoZSBjaGFyZGV0IGxpYnJhcnkuIiIiCiAgICAgICAgcmV0dXJuIGNoYXJkZXQuZGV0ZWN0KHNlbGYuY29udGVudClbJ2VuY29kaW5nJ10KCiAgICBkZWYgaXRlcl9jb250ZW50KHNlbGYsIGNodW5rX3NpemU9MSwgZGVjb2RlX3VuaWNvZGU9RmFsc2UpOgogICAgICAgICIiIkl0ZXJhdGVzIG92ZXIgdGhlIHJlc3BvbnNlIGRhdGEuICBXaGVuIHN0cmVhbT1UcnVlIGlzIHNldCBvbiB0aGUKICAgICAgICByZXF1ZXN0LCB0aGlzIGF2b2lkcyByZWFkaW5nIHRoZSBjb250ZW50IGF0IG9uY2UgaW50byBtZW1vcnkgZm9yCiAgICAgICAgbGFyZ2UgcmVzcG9uc2VzLiAgVGhlIGNodW5rIHNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpdCBzaG91bGQKICAgICAgICByZWFkIGludG8gbWVtb3J5LiAgVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGxlbmd0aCBvZiBlYWNoIGl0ZW0KICAgICAgICByZXR1cm5lZCBhcyBkZWNvZGluZyBjYW4gdGFrZSBwbGFjZS4KCiAgICAgICAgY2h1bmtfc2l6ZSBtdXN0IGJlIG9mIHR5cGUgaW50IG9yIE5vbmUuIEEgdmFsdWUgb2YgTm9uZSB3aWxsCiAgICAgICAgZnVuY3Rpb24gZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBgc3RyZWFtYC4KICAgICAgICBzdHJlYW09VHJ1ZSB3aWxsIHJlYWQgZGF0YSBhcyBpdCBhcnJpdmVzIGluIHdoYXRldmVyIHNpemUgdGhlCiAgICAgICAgY2h1bmtzIGFyZSByZWNlaXZlZC4gSWYgc3RyZWFtPUZhbHNlLCBkYXRhIGlzIHJldHVybmVkIGFzCiAgICAgICAgYSBzaW5nbGUgY2h1bmsuCgogICAgICAgIElmIGRlY29kZV91bmljb2RlIGlzIFRydWUsIGNvbnRlbnQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBiZXN0CiAgICAgICAgYXZhaWxhYmxlIGVuY29kaW5nIGJhc2VkIG9uIHRoZSByZXNwb25zZS4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIGdlbmVyYXRlKCk6CiAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB1cmxsaWIzLgogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucmF3LCAnc3RyZWFtJyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGNodW5rIGluIHNlbGYucmF3LnN0cmVhbShjaHVua19zaXplLCBkZWNvZGVfY29udGVudD1UcnVlKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcm90b2NvbEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2h1bmtlZEVuY29kaW5nRXJyb3IoZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBEZWNvZGVFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbnRlbnREZWNvZGluZ0Vycm9yKGUpCiAgICAgICAgICAgICAgICBleGNlcHQgUmVhZFRpbWVvdXRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBTdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBjaHVuayA9IHNlbGYucmF3LnJlYWQoY2h1bmtfc2l6ZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKCiAgICAgICAgICAgIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgPSBUcnVlCgogICAgICAgIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgYW5kIGlzaW5zdGFuY2Uoc2VsZi5fY29udGVudCwgYm9vbCk6CiAgICAgICAgICAgIHJhaXNlIFN0cmVhbUNvbnN1bWVkRXJyb3IoKQogICAgICAgIGVsaWYgY2h1bmtfc2l6ZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoY2h1bmtfc2l6ZSwgaW50KToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjaHVua19zaXplIG11c3QgYmUgYW4gaW50LCBpdCBpcyBpbnN0ZWFkIGEgJXMuIiAlIHR5cGUoY2h1bmtfc2l6ZSkpCiAgICAgICAgIyBzaW11bGF0ZSByZWFkaW5nIHNtYWxsIGNodW5rcyBvZiB0aGUgY29udGVudAogICAgICAgIHJldXNlZF9jaHVua3MgPSBpdGVyX3NsaWNlcyhzZWxmLl9jb250ZW50LCBjaHVua19zaXplKQoKICAgICAgICBzdHJlYW1fY2h1bmtzID0gZ2VuZXJhdGUoKQoKICAgICAgICBjaHVua3MgPSByZXVzZWRfY2h1bmtzIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgZWxzZSBzdHJlYW1fY2h1bmtzCgogICAgICAgIGlmIGRlY29kZV91bmljb2RlOgogICAgICAgICAgICBjaHVua3MgPSBzdHJlYW1fZGVjb2RlX3Jlc3BvbnNlX3VuaWNvZGUoY2h1bmtzLCBzZWxmKQoKICAgICAgICByZXR1cm4gY2h1bmtzCgogICAgZGVmIGl0ZXJfbGluZXMoc2VsZiwgY2h1bmtfc2l6ZT1JVEVSX0NIVU5LX1NJWkUsIGRlY29kZV91bmljb2RlPU5vbmUsIGRlbGltaXRlcj1Ob25lKToKICAgICAgICAiIiJJdGVyYXRlcyBvdmVyIHRoZSByZXNwb25zZSBkYXRhLCBvbmUgbGluZSBhdCBhIHRpbWUuICBXaGVuCiAgICAgICAgc3RyZWFtPVRydWUgaXMgc2V0IG9uIHRoZSByZXF1ZXN0LCB0aGlzIGF2b2lkcyByZWFkaW5nIHRoZQogICAgICAgIGNvbnRlbnQgYXQgb25jZSBpbnRvIG1lbW9yeSBmb3IgbGFyZ2UgcmVzcG9uc2VzLgoKICAgICAgICAuLiBub3RlOjogVGhpcyBtZXRob2QgaXMgbm90IHJlZW50cmFudCBzYWZlLgogICAgICAgICIiIgoKICAgICAgICBwZW5kaW5nID0gTm9uZQoKICAgICAgICBmb3IgY2h1bmsgaW4gc2VsZi5pdGVyX2NvbnRlbnQoY2h1bmtfc2l6ZT1jaHVua19zaXplLCBkZWNvZGVfdW5pY29kZT1kZWNvZGVfdW5pY29kZSk6CgogICAgICAgICAgICBpZiBwZW5kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2h1bmsgPSBwZW5kaW5nICsgY2h1bmsKCiAgICAgICAgICAgIGlmIGRlbGltaXRlcjoKICAgICAgICAgICAgICAgIGxpbmVzID0gY2h1bmsuc3BsaXQoZGVsaW1pdGVyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGluZXMgPSBjaHVuay5zcGxpdGxpbmVzKCkKCiAgICAgICAgICAgIGlmIGxpbmVzIGFuZCBsaW5lc1stMV0gYW5kIGNodW5rIGFuZCBsaW5lc1stMV1bLTFdID09IGNodW5rWy0xXToKICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGVuZGluZyA9IE5vbmUKCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgICAgICBpZiBwZW5kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICB5aWVsZCBwZW5kaW5nCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29udGVudChzZWxmKToKICAgICAgICAiIiJDb250ZW50IG9mIHRoZSByZXNwb25zZSwgaW4gYnl0ZXMuIiIiCgogICAgICAgIGlmIHNlbGYuX2NvbnRlbnQgaXMgRmFsc2U6CiAgICAgICAgICAgICMgUmVhZCB0aGUgY29udGVudHMuCiAgICAgICAgICAgIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBjb250ZW50IGZvciB0aGlzIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGNvbnN1bWVkJykKCiAgICAgICAgICAgIGlmIHNlbGYuc3RhdHVzX2NvZGUgPT0gMCBvciBzZWxmLnJhdyBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fY29udGVudCA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRlbnQgPSBieXRlcygpLmpvaW4oc2VsZi5pdGVyX2NvbnRlbnQoQ09OVEVOVF9DSFVOS19TSVpFKSkgb3IgYnl0ZXMoKQoKICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gVHJ1ZQogICAgICAgICMgZG9uJ3QgbmVlZCB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uOyB0aGF0J3MgYmVlbiBoYW5kbGVkIGJ5IHVybGxpYjMKICAgICAgICAjIHNpbmNlIHdlIGV4aGF1c3RlZCB0aGUgZGF0YS4KICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRleHQoc2VsZik6CiAgICAgICAgIiIiQ29udGVudCBvZiB0aGUgcmVzcG9uc2UsIGluIHVuaWNvZGUuCgogICAgICAgIElmIFJlc3BvbnNlLmVuY29kaW5nIGlzIE5vbmUsIGVuY29kaW5nIHdpbGwgYmUgZ3Vlc3NlZCB1c2luZwogICAgICAgIGBgY2hhcmRldGBgLgoKICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlIGNvbnRlbnQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBzb2xlbHkgb24gSFRUUAogICAgICAgIGhlYWRlcnMsIGZvbGxvd2luZyBSRkMgMjYxNiB0byB0aGUgbGV0dGVyLiBJZiB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mCiAgICAgICAgbm9uLUhUVFAga25vd2xlZGdlIHRvIG1ha2UgYSBiZXR0ZXIgZ3Vlc3MgYXQgdGhlIGVuY29kaW5nLCB5b3Ugc2hvdWxkCiAgICAgICAgc2V0IGBgci5lbmNvZGluZ2BgIGFwcHJvcHJpYXRlbHkgYmVmb3JlIGFjY2Vzc2luZyB0aGlzIHByb3BlcnR5LgogICAgICAgICIiIgoKICAgICAgICAjIFRyeSBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICAgICAgY29udGVudCA9IE5vbmUKICAgICAgICBlbmNvZGluZyA9IHNlbGYuZW5jb2RpbmcKCiAgICAgICAgaWYgbm90IHNlbGYuY29udGVudDoKICAgICAgICAgICAgcmV0dXJuIHN0cignJykKCiAgICAgICAgIyBGYWxsYmFjayB0byBhdXRvLWRldGVjdGVkIGVuY29kaW5nLgogICAgICAgIGlmIHNlbGYuZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmFwcGFyZW50X2VuY29kaW5nCgogICAgICAgICMgRGVjb2RlIHVuaWNvZGUgZnJvbSBnaXZlbiBlbmNvZGluZy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbnRlbnQgPSBzdHIoc2VsZi5jb250ZW50LCBlbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJykKICAgICAgICBleGNlcHQgKExvb2t1cEVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAjIEEgTG9va3VwRXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBlbmNvZGluZyB3YXMgbm90IGZvdW5kIHdoaWNoIGNvdWxkCiAgICAgICAgICAgICMgaW5kaWNhdGUgYSBtaXNzcGVsbGluZyBvciBzaW1pbGFyIG1pc3Rha2UuCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBBIFR5cGVFcnJvciBjYW4gYmUgcmFpc2VkIGlmIGVuY29kaW5nIGlzIE5vbmUKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFNvIHdlIHRyeSBibGluZGx5IGVuY29kaW5nLgogICAgICAgICAgICBjb250ZW50ID0gc3RyKHNlbGYuY29udGVudCwgZXJyb3JzPSdyZXBsYWNlJykKCiAgICAgICAgcmV0dXJuIGNvbnRlbnQKCiAgICBkZWYganNvbihzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlJldHVybnMgdGhlIGpzb24tZW5jb2RlZCBjb250ZW50IG9mIGEgcmVzcG9uc2UsIGlmIGFueS4KCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBganNvbi5sb2Fkc2BgIHRha2VzLgogICAgICAgIDpyYWlzZXMgVmFsdWVFcnJvcjogSWYgdGhlIHJlc3BvbnNlIGJvZHkgZG9lcyBub3QgY29udGFpbiB2YWxpZCBqc29uLgogICAgICAgICIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5lbmNvZGluZyBhbmQgc2VsZi5jb250ZW50IGFuZCBsZW4oc2VsZi5jb250ZW50KSA+IDM6CiAgICAgICAgICAgICMgTm8gZW5jb2Rpbmcgc2V0LiBKU09OIFJGQyA0NjI3IHNlY3Rpb24gMyBzdGF0ZXMgd2Ugc2hvdWxkIGV4cGVjdAogICAgICAgICAgICAjIFVURi04LCAtMTYgb3IgLTMyLiBEZXRlY3Qgd2hpY2ggb25lIHRvIHVzZTsgSWYgdGhlIGRldGVjdGlvbiBvcgogICAgICAgICAgICAjIGRlY29kaW5nIGZhaWxzLCBmYWxsIGJhY2sgdG8gYHNlbGYudGV4dGAgKHVzaW5nIGNoYXJkZXQgdG8gbWFrZQogICAgICAgICAgICAjIGEgYmVzdCBndWVzcykuCiAgICAgICAgICAgIGVuY29kaW5nID0gZ3Vlc3NfanNvbl91dGYoc2VsZi5jb250ZW50KQogICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleGpzb24ubG9hZHMoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGVudC5kZWNvZGUoZW5jb2RpbmcpLCAqKmt3YXJncwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBXcm9uZyBVVEYgY29kZWMgZGV0ZWN0ZWQ7IHVzdWFsbHkgYmVjYXVzZSBpdCdzIG5vdCBVVEYtOAogICAgICAgICAgICAgICAgICAgICMgYnV0IHNvbWUgb3RoZXIgOC1iaXQgY29kZWMuICBUaGlzIGlzIGFuIFJGQyB2aW9sYXRpb24sCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgdGhlIHNlcnZlciBkaWRuJ3QgYm90aGVyIHRvIHRlbGwgdXMgd2hhdCBjb2RlYyAqd2FzKgogICAgICAgICAgICAgICAgICAgICMgdXNlZC4KICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIGNvbXBsZXhqc29uLmxvYWRzKHNlbGYudGV4dCwgKiprd2FyZ3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyB0aGUgcGFyc2VkIGhlYWRlciBsaW5rcyBvZiB0aGUgcmVzcG9uc2UsIGlmIGFueS4iIiIKCiAgICAgICAgaGVhZGVyID0gc2VsZi5oZWFkZXJzLmdldCgnbGluaycpCgogICAgICAgICMgbCA9IE11bHRpRGljdCgpCiAgICAgICAgbCA9IHt9CgogICAgICAgIGlmIGhlYWRlcjoKICAgICAgICAgICAgbGlua3MgPSBwYXJzZV9oZWFkZXJfbGlua3MoaGVhZGVyKQoKICAgICAgICAgICAgZm9yIGxpbmsgaW4gbGlua3M6CiAgICAgICAgICAgICAgICBrZXkgPSBsaW5rLmdldCgncmVsJykgb3IgbGluay5nZXQoJ3VybCcpCiAgICAgICAgICAgICAgICBsW2tleV0gPSBsaW5rCgogICAgICAgIHJldHVybiBsCgogICAgZGVmIHJhaXNlX2Zvcl9zdGF0dXMoc2VsZik6CiAgICAgICAgIiIiUmFpc2VzIHN0b3JlZCA6Y2xhc3M6YEhUVFBFcnJvcmAsIGlmIG9uZSBvY2N1cnJlZC4iIiIKCiAgICAgICAgaHR0cF9lcnJvcl9tc2cgPSAnJwogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5yZWFzb24sIGJ5dGVzKToKICAgICAgICAgICAgIyBXZSBhdHRlbXB0IHRvIGRlY29kZSB1dGYtOCBmaXJzdCBiZWNhdXNlIHNvbWUgc2VydmVycwogICAgICAgICAgICAjIGNob29zZSB0byBsb2NhbGl6ZSB0aGVpciByZWFzb24gc3RyaW5ncy4gSWYgdGhlIHN0cmluZwogICAgICAgICAgICAjIGlzbid0IHV0Zi04LCB3ZSBmYWxsIGJhY2sgdG8gaXNvLTg4NTktMSBmb3IgYWxsIG90aGVyCiAgICAgICAgICAgICMgZW5jb2RpbmdzLiAoU2VlIFBSICMzNTM4KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZWFzb24gPSBzZWxmLnJlYXNvbi5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIHJlYXNvbiA9IHNlbGYucmVhc29uLmRlY29kZSgnaXNvLTg4NTktMScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVhc29uID0gc2VsZi5yZWFzb24KCiAgICAgICAgaWYgNDAwIDw9IHNlbGYuc3RhdHVzX2NvZGUgPCA1MDA6CiAgICAgICAgICAgIGh0dHBfZXJyb3JfbXNnID0gdSclcyBDbGllbnQgRXJyb3I6ICVzIGZvciB1cmw6ICVzJyAlIChzZWxmLnN0YXR1c19jb2RlLCByZWFzb24sIHNlbGYudXJsKQoKICAgICAgICBlbGlmIDUwMCA8PSBzZWxmLnN0YXR1c19jb2RlIDwgNjAwOgogICAgICAgICAgICBodHRwX2Vycm9yX21zZyA9IHUnJXMgU2VydmVyIEVycm9yOiAlcyBmb3IgdXJsOiAlcycgJSAoc2VsZi5zdGF0dXNfY29kZSwgcmVhc29uLCBzZWxmLnVybCkKCiAgICAgICAgaWYgaHR0cF9lcnJvcl9tc2c6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihodHRwX2Vycm9yX21zZywgcmVzcG9uc2U9c2VsZikKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiUmVsZWFzZXMgdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4gT25jZSB0aGlzIG1ldGhvZCBoYXMgYmVlbgogICAgICAgIGNhbGxlZCB0aGUgdW5kZXJseWluZyBgYHJhd2BgIG9iamVjdCBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBhZ2Fpbi4KCiAgICAgICAgKk5vdGU6IFNob3VsZCBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZSBjYWxsZWQgZXhwbGljaXRseS4qCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgIHNlbGYucmF3LmNsb3NlKCkKCiAgICAgICAgcmVsZWFzZV9jb25uID0gZ2V0YXR0cihzZWxmLnJhdywgJ3JlbGVhc2VfY29ubicsIE5vbmUpCiAgICAgICAgaWYgcmVsZWFzZV9jb25uIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZWxlYXNlX2Nvbm4oKQpQSwMEFAAAAAAAAAAhABI83oG3AgAAtwIAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvcGFja2FnZXMucHlpbXBvcnQgc3lzCgojIFRoaXMgY29kZSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCiMgSSBkb24ndCBsaWtlIGl0IGVpdGhlci4gSnVzdCBsb29rIHRoZSBvdGhlciB3YXkuIDopCgpmb3IgcGFja2FnZSBpbiAoJ3VybGxpYjMnLCAnaWRuYScsICdjaGFyZGV0Jyk6CiAgICB2ZW5kb3JlZF9wYWNrYWdlID0gInBpcC5fdmVuZG9yLiIgKyBwYWNrYWdlCiAgICBsb2NhbHMoKVtwYWNrYWdlXSA9IF9faW1wb3J0X18odmVuZG9yZWRfcGFja2FnZSkKICAgICMgVGhpcyB0cmF2ZXJzYWwgaXMgYXBwYXJlbnRseSBuZWNlc3Nhcnkgc3VjaCB0aGF0IHRoZSBpZGVudGl0aWVzIGFyZQogICAgIyBwcmVzZXJ2ZWQgKHJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuKiBpcyB1cmxsaWIzLiopCiAgICBmb3IgbW9kIGluIGxpc3Qoc3lzLm1vZHVsZXMpOgogICAgICAgIGlmIG1vZCA9PSB2ZW5kb3JlZF9wYWNrYWdlIG9yIG1vZC5zdGFydHN3aXRoKHZlbmRvcmVkX3BhY2thZ2UgKyAnLicpOgogICAgICAgICAgICB1bnByZWZpeGVkX21vZCA9IG1vZFtsZW4oInBpcC5fdmVuZG9yLiIpOl0KICAgICAgICAgICAgc3lzLm1vZHVsZXNbJ3BpcC5fdmVuZG9yLnJlcXVlc3RzLnBhY2thZ2VzLicgKyB1bnByZWZpeGVkX21vZF0gPSBzeXMubW9kdWxlc1ttb2RdCgojIEtpbmRhIGNvb2wsIHRob3VnaCwgcmlnaHQ/ClBLAwQUAAAAAAAAACEAX59mmZprAACaawAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zZXNzaW9ucy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuc2Vzc2lvbgp+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBwcm92aWRlcyBhIFNlc3Npb24gb2JqZWN0IHRvIG1hbmFnZSBhbmQgcGVyc2lzdCBzZXR0aW5ncyBhY3Jvc3MKcmVxdWVzdHMgKGNvb2tpZXMsIGF1dGgsIHByb3hpZXMpLgoiIiIKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgdGltZQpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCmZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQoKZnJvbSAuYXV0aCBpbXBvcnQgX2Jhc2ljX2F1dGhfc3RyCmZyb20gLmNvbXBhdCBpbXBvcnQgY29va2llbGliLCBpc19weTMsIE9yZGVyZWREaWN0LCB1cmxqb2luLCB1cmxwYXJzZQpmcm9tIC5jb29raWVzIGltcG9ydCAoCiAgICBjb29raWVqYXJfZnJvbV9kaWN0LCBleHRyYWN0X2Nvb2tpZXNfdG9famFyLCBSZXF1ZXN0c0Nvb2tpZUphciwgbWVyZ2VfY29va2llcykKZnJvbSAubW9kZWxzIGltcG9ydCBSZXF1ZXN0LCBQcmVwYXJlZFJlcXVlc3QsIERFRkFVTFRfUkVESVJFQ1RfTElNSVQKZnJvbSAuaG9va3MgaW1wb3J0IGRlZmF1bHRfaG9va3MsIGRpc3BhdGNoX2hvb2sKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLnV0aWxzIGltcG9ydCB0b19rZXlfdmFsX2xpc3QsIGRlZmF1bHRfaGVhZGVycwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBUb29NYW55UmVkaXJlY3RzLCBJbnZhbGlkU2NoZW1hLCBDaHVua2VkRW5jb2RpbmdFcnJvciwgQ29udGVudERlY29kaW5nRXJyb3IpCgpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmFkYXB0ZXJzIGltcG9ydCBIVFRQQWRhcHRlcgoKZnJvbSAudXRpbHMgaW1wb3J0ICgKICAgIHJlcXVvdGVfdXJpLCBnZXRfZW52aXJvbl9wcm94aWVzLCBnZXRfbmV0cmNfYXV0aCwgc2hvdWxkX2J5cGFzc19wcm94aWVzLAogICAgZ2V0X2F1dGhfZnJvbV91cmwsIHJld2luZF9ib2R5CikKCmZyb20gLnN0YXR1c19jb2RlcyBpbXBvcnQgY29kZXMKCiMgZm9ybWVybHkgZGVmaW5lZCBoZXJlLCByZWV4cG9zZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpmcm9tIC5tb2RlbHMgaW1wb3J0IFJFRElSRUNUX1NUQVRJCgojIFByZWZlcnJlZCBjbG9jaywgYmFzZWQgb24gd2hpY2ggb25lIGlzIG1vcmUgYWNjdXJhdGUgb24gYSBnaXZlbiBzeXN0ZW0uCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgIHRyeTogICMgUHl0aG9uIDMuMysKICAgICAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLnBlcmZfY291bnRlcgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBFYXJsaWVyIHRoYW4gUHl0aG9uIDMuCiAgICAgICAgcHJlZmVycmVkX2Nsb2NrID0gdGltZS5jbG9jawplbHNlOgogICAgcHJlZmVycmVkX2Nsb2NrID0gdGltZS50aW1lCgoKZGVmIG1lcmdlX3NldHRpbmcocmVxdWVzdF9zZXR0aW5nLCBzZXNzaW9uX3NldHRpbmcsIGRpY3RfY2xhc3M9T3JkZXJlZERpY3QpOgogICAgIiIiRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciBhIGdpdmVuIHJlcXVlc3QsIHRha2luZyBpbnRvIGFjY291bnQKICAgIHRoZSBleHBsaWNpdCBzZXR0aW5nIG9uIHRoYXQgcmVxdWVzdCwgYW5kIHRoZSBzZXR0aW5nIGluIHRoZSBzZXNzaW9uLiBJZiBhCiAgICBzZXR0aW5nIGlzIGEgZGljdGlvbmFyeSwgdGhleSB3aWxsIGJlIG1lcmdlZCB0b2dldGhlciB1c2luZyBgZGljdF9jbGFzc2AKICAgICIiIgoKICAgIGlmIHNlc3Npb25fc2V0dGluZyBpcyBOb25lOgogICAgICAgIHJldHVybiByZXF1ZXN0X3NldHRpbmcKCiAgICBpZiByZXF1ZXN0X3NldHRpbmcgaXMgTm9uZToKICAgICAgICByZXR1cm4gc2Vzc2lvbl9zZXR0aW5nCgogICAgIyBCeXBhc3MgaWYgbm90IGEgZGljdGlvbmFyeSAoZS5nLiB2ZXJpZnkpCiAgICBpZiBub3QgKAogICAgICAgICAgICBpc2luc3RhbmNlKHNlc3Npb25fc2V0dGluZywgTWFwcGluZykgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UocmVxdWVzdF9zZXR0aW5nLCBNYXBwaW5nKQogICAgKToKICAgICAgICByZXR1cm4gcmVxdWVzdF9zZXR0aW5nCgogICAgbWVyZ2VkX3NldHRpbmcgPSBkaWN0X2NsYXNzKHRvX2tleV92YWxfbGlzdChzZXNzaW9uX3NldHRpbmcpKQogICAgbWVyZ2VkX3NldHRpbmcudXBkYXRlKHRvX2tleV92YWxfbGlzdChyZXF1ZXN0X3NldHRpbmcpKQoKICAgICMgUmVtb3ZlIGtleXMgdGhhdCBhcmUgc2V0IHRvIE5vbmUuIEV4dHJhY3Qga2V5cyBmaXJzdCB0byBhdm9pZCBhbHRlcmluZwogICAgIyB0aGUgZGljdGlvbmFyeSBkdXJpbmcgaXRlcmF0aW9uLgogICAgbm9uZV9rZXlzID0gW2sgZm9yIChrLCB2KSBpbiBtZXJnZWRfc2V0dGluZy5pdGVtcygpIGlmIHYgaXMgTm9uZV0KICAgIGZvciBrZXkgaW4gbm9uZV9rZXlzOgogICAgICAgIGRlbCBtZXJnZWRfc2V0dGluZ1trZXldCgogICAgcmV0dXJuIG1lcmdlZF9zZXR0aW5nCgoKZGVmIG1lcmdlX2hvb2tzKHJlcXVlc3RfaG9va3MsIHNlc3Npb25faG9va3MsIGRpY3RfY2xhc3M9T3JkZXJlZERpY3QpOgogICAgIiIiUHJvcGVybHkgbWVyZ2VzIGJvdGggcmVxdWVzdHMgYW5kIHNlc3Npb24gaG9va3MuCgogICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIHJlcXVlc3RfaG9va3MgPT0geydyZXNwb25zZSc6IFtdfSwgdGhlCiAgICBtZXJnZSBicmVha3MgU2Vzc2lvbiBob29rcyBlbnRpcmVseS4KICAgICIiIgogICAgaWYgc2Vzc2lvbl9ob29rcyBpcyBOb25lIG9yIHNlc3Npb25faG9va3MuZ2V0KCdyZXNwb25zZScpID09IFtdOgogICAgICAgIHJldHVybiByZXF1ZXN0X2hvb2tzCgogICAgaWYgcmVxdWVzdF9ob29rcyBpcyBOb25lIG9yIHJlcXVlc3RfaG9va3MuZ2V0KCdyZXNwb25zZScpID09IFtdOgogICAgICAgIHJldHVybiBzZXNzaW9uX2hvb2tzCgogICAgcmV0dXJuIG1lcmdlX3NldHRpbmcocmVxdWVzdF9ob29rcywgc2Vzc2lvbl9ob29rcywgZGljdF9jbGFzcykKCgpjbGFzcyBTZXNzaW9uUmVkaXJlY3RNaXhpbihvYmplY3QpOgoKICAgIGRlZiBnZXRfcmVkaXJlY3RfdGFyZ2V0KHNlbGYsIHJlc3ApOgogICAgICAgICIiIlJlY2VpdmVzIGEgUmVzcG9uc2UuIFJldHVybnMgYSByZWRpcmVjdCBVUkkgb3IgYGBOb25lYGAiIiIKICAgICAgICAjIER1ZSB0byB0aGUgbmF0dXJlIG9mIGhvdyByZXF1ZXN0cyBwcm9jZXNzZXMgcmVkaXJlY3RzIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgICAjIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHVwb24gdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGFuZCBhdCBsZWFzdCB0d2ljZQogICAgICAgICMgb24gZWFjaCBzdWJzZXF1ZW50IHJlZGlyZWN0IHJlc3BvbnNlIChpZiBhbnkpLgogICAgICAgICMgSWYgYSBjdXN0b20gbWl4aW4gaXMgdXNlZCB0byBoYW5kbGUgdGhpcyBsb2dpYywgaXQgbWF5IGJlIGFkdmFudGFnZW91cwogICAgICAgICMgdG8gY2FjaGUgdGhlIHJlZGlyZWN0IGxvY2F0aW9uIG9udG8gdGhlIHJlc3BvbnNlIG9iamVjdCBhcyBhIHByaXZhdGUKICAgICAgICAjIGF0dHJpYnV0ZS4KICAgICAgICBpZiByZXNwLmlzX3JlZGlyZWN0OgogICAgICAgICAgICBsb2NhdGlvbiA9IHJlc3AuaGVhZGVyc1snbG9jYXRpb24nXQogICAgICAgICAgICAjIEN1cnJlbnRseSB0aGUgdW5kZXJseWluZyBodHRwIG1vZHVsZSBvbiBweTMgZGVjb2RlIGhlYWRlcnMKICAgICAgICAgICAgIyBpbiBsYXRpbjEsIGJ1dCBlbXBpcmljYWwgZXZpZGVuY2Ugc3VnZ2VzdHMgdGhhdCBsYXRpbjEgaXMgdmVyeQogICAgICAgICAgICAjIHJhcmVseSB1c2VkIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gSFRUUCBoZWFkZXJzLgogICAgICAgICAgICAjIEl0IGlzIG1vcmUgbGlrZWx5IHRvIGdldCBVVEY4IGhlYWRlciByYXRoZXIgdGhhbiBsYXRpbjEuCiAgICAgICAgICAgICMgVGhpcyBjYXVzZXMgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIFVURjggZW5jb2RlZCBsb2NhdGlvbiBoZWFkZXJzLgogICAgICAgICAgICAjIFRvIHNvbHZlIHRoaXMsIHdlIHJlLWVuY29kZSB0aGUgbG9jYXRpb24gaW4gbGF0aW4xLgogICAgICAgICAgICBpZiBpc19weTM6CiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uLmVuY29kZSgnbGF0aW4xJykKICAgICAgICAgICAgcmV0dXJuIHRvX25hdGl2ZV9zdHJpbmcobG9jYXRpb24sICd1dGY4JykKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiByZXNvbHZlX3JlZGlyZWN0cyhzZWxmLCByZXNwLCByZXEsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeT1UcnVlLCBjZXJ0PU5vbmUsIHByb3hpZXM9Tm9uZSwgeWllbGRfcmVxdWVzdHM9RmFsc2UsICoqYWRhcHRlcl9rd2FyZ3MpOgogICAgICAgICIiIlJlY2VpdmVzIGEgUmVzcG9uc2UuIFJldHVybnMgYSBnZW5lcmF0b3Igb2YgUmVzcG9uc2VzIG9yIFJlcXVlc3RzLiIiIgoKICAgICAgICBoaXN0ID0gW10gICMga2VlcCB0cmFjayBvZiBoaXN0b3J5CgogICAgICAgIHVybCA9IHNlbGYuZ2V0X3JlZGlyZWN0X3RhcmdldChyZXNwKQogICAgICAgIHdoaWxlIHVybDoKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdCA9IHJlcS5jb3B5KCkKCiAgICAgICAgICAgICMgVXBkYXRlIGhpc3RvcnkgYW5kIGtlZXAgdHJhY2sgb2YgcmVkaXJlY3RzLgogICAgICAgICAgICAjIHJlc3AuaGlzdG9yeSBtdXN0IGlnbm9yZSB0aGUgb3JpZ2luYWwgcmVxdWVzdCBpbiB0aGlzIGxvb3AKICAgICAgICAgICAgaGlzdC5hcHBlbmQocmVzcCkKICAgICAgICAgICAgcmVzcC5oaXN0b3J5ID0gaGlzdFsxOl0KCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3AuY29udGVudCAgIyBDb25zdW1lIHNvY2tldCBzbyBpdCBjYW4gYmUgcmVsZWFzZWQKICAgICAgICAgICAgZXhjZXB0IChDaHVua2VkRW5jb2RpbmdFcnJvciwgQ29udGVudERlY29kaW5nRXJyb3IsIFJ1bnRpbWVFcnJvcik6CiAgICAgICAgICAgICAgICByZXNwLnJhdy5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQoKICAgICAgICAgICAgaWYgbGVuKHJlc3AuaGlzdG9yeSkgPj0gc2VsZi5tYXhfcmVkaXJlY3RzOgogICAgICAgICAgICAgICAgcmFpc2UgVG9vTWFueVJlZGlyZWN0cygnRXhjZWVkZWQgJXMgcmVkaXJlY3RzLicgJSBzZWxmLm1heF9yZWRpcmVjdHMsIHJlc3BvbnNlPXJlc3ApCgogICAgICAgICAgICAjIFJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gYmFjayBpbnRvIHRoZSBwb29sLgogICAgICAgICAgICByZXNwLmNsb3NlKCkKCiAgICAgICAgICAgICMgSGFuZGxlIHJlZGlyZWN0aW9uIHdpdGhvdXQgc2NoZW1lIChzZWU6IFJGQyAxODA4IFNlY3Rpb24gNCkKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAgICAgICAgICAgICBwYXJzZWRfcnVybCA9IHVybHBhcnNlKHJlc3AudXJsKQogICAgICAgICAgICAgICAgdXJsID0gJyVzOiVzJyAlICh0b19uYXRpdmVfc3RyaW5nKHBhcnNlZF9ydXJsLnNjaGVtZSksIHVybCkKCiAgICAgICAgICAgICMgVGhlIHNjaGVtZSBzaG91bGQgYmUgbG93ZXIgY2FzZS4uLgogICAgICAgICAgICBwYXJzZWQgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIHVybCA9IHBhcnNlZC5nZXR1cmwoKQoKICAgICAgICAgICAgIyBGYWNpbGl0YXRlIHJlbGF0aXZlICdsb2NhdGlvbicgaGVhZGVycywgYXMgYWxsb3dlZCBieSBSRkMgNzIzMS4KICAgICAgICAgICAgIyAoZS5nLiAnL3BhdGgvdG8vcmVzb3VyY2UnIGluc3RlYWQgb2YgJ2h0dHA6Ly9kb21haW4udGxkL3BhdGgvdG8vcmVzb3VyY2UnKQogICAgICAgICAgICAjIENvbXBsaWFudCB3aXRoIFJGQzM5ODYsIHdlIHBlcmNlbnQgZW5jb2RlIHRoZSB1cmwuCiAgICAgICAgICAgIGlmIG5vdCBwYXJzZWQubmV0bG9jOgogICAgICAgICAgICAgICAgdXJsID0gdXJsam9pbihyZXNwLnVybCwgcmVxdW90ZV91cmkodXJsKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVybCA9IHJlcXVvdGVfdXJpKHVybCkKCiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QudXJsID0gdG9fbmF0aXZlX3N0cmluZyh1cmwpCgogICAgICAgICAgICBzZWxmLnJlYnVpbGRfbWV0aG9kKHByZXBhcmVkX3JlcXVlc3QsIHJlc3ApCgogICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMTA4NAogICAgICAgICAgICBpZiByZXNwLnN0YXR1c19jb2RlIG5vdCBpbiAoY29kZXMudGVtcG9yYXJ5X3JlZGlyZWN0LCBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QpOgogICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM0OTAKICAgICAgICAgICAgICAgIHB1cmdlZF9oZWFkZXJzID0gKCdDb250ZW50LUxlbmd0aCcsICdDb250ZW50LVR5cGUnLCAnVHJhbnNmZXItRW5jb2RpbmcnKQogICAgICAgICAgICAgICAgZm9yIGhlYWRlciBpbiBwdXJnZWRfaGVhZGVyczoKICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMucG9wKGhlYWRlciwgTm9uZSkKICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuYm9keSA9IE5vbmUKCiAgICAgICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVsIGhlYWRlcnNbJ0Nvb2tpZSddCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgICMgRXh0cmFjdCBhbnkgY29va2llcyBzZW50IG9uIHRoZSByZXNwb25zZSB0byB0aGUgY29va2llamFyCiAgICAgICAgICAgICMgaW4gdGhlIG5ldyByZXF1ZXN0LiBCZWNhdXNlIHdlJ3ZlIG11dGF0ZWQgb3VyIGNvcGllZCBwcmVwYXJlZAogICAgICAgICAgICAjIHJlcXVlc3QsIHVzZSB0aGUgb2xkIG9uZSB0aGF0IHdlIGhhdmVuJ3QgeWV0IHRvdWNoZWQuCiAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIocHJlcGFyZWRfcmVxdWVzdC5fY29va2llcywgcmVxLCByZXNwLnJhdykKICAgICAgICAgICAgbWVyZ2VfY29va2llcyhwcmVwYXJlZF9yZXF1ZXN0Ll9jb29raWVzLCBzZWxmLmNvb2tpZXMpCiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QucHJlcGFyZV9jb29raWVzKHByZXBhcmVkX3JlcXVlc3QuX2Nvb2tpZXMpCgogICAgICAgICAgICAjIFJlYnVpbGQgYXV0aCBhbmQgcHJveHkgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIHByb3hpZXMgPSBzZWxmLnJlYnVpbGRfcHJveGllcyhwcmVwYXJlZF9yZXF1ZXN0LCBwcm94aWVzKQogICAgICAgICAgICBzZWxmLnJlYnVpbGRfYXV0aChwcmVwYXJlZF9yZXF1ZXN0LCByZXNwKQoKICAgICAgICAgICAgIyBBIGZhaWxlZCB0ZWxsKCkgc2V0cyBgX2JvZHlfcG9zaXRpb25gIHRvIGBvYmplY3QoKWAuIFRoaXMgbm9uLU5vbmUKICAgICAgICAgICAgIyB2YWx1ZSBlbnN1cmVzIGByZXdpbmRhYmxlYCB3aWxsIGJlIFRydWUsIGFsbG93aW5nIHVzIHRvIHJhaXNlIGFuCiAgICAgICAgICAgICMgVW5yZXdpbmRhYmxlQm9keUVycm9yLCBpbnN0ZWFkIG9mIGhhbmdpbmcgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgICAgIHJld2luZGFibGUgPSAoCiAgICAgICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgKCdDb250ZW50LUxlbmd0aCcgaW4gaGVhZGVycyBvciAnVHJhbnNmZXItRW5jb2RpbmcnIGluIGhlYWRlcnMpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQXR0ZW1wdCB0byByZXdpbmQgY29uc3VtZWQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgaWYgcmV3aW5kYWJsZToKICAgICAgICAgICAgICAgIHJld2luZF9ib2R5KHByZXBhcmVkX3JlcXVlc3QpCgogICAgICAgICAgICAjIE92ZXJyaWRlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgogICAgICAgICAgICByZXEgPSBwcmVwYXJlZF9yZXF1ZXN0CgogICAgICAgICAgICBpZiB5aWVsZF9yZXF1ZXN0czoKICAgICAgICAgICAgICAgIHlpZWxkIHJlcQogICAgICAgICAgICBlbHNlOgoKICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNlbmQoCiAgICAgICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgICAgIHN0cmVhbT1zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LAogICAgICAgICAgICAgICAgICAgIHZlcmlmeT12ZXJpZnksCiAgICAgICAgICAgICAgICAgICAgY2VydD1jZXJ0LAogICAgICAgICAgICAgICAgICAgIHByb3hpZXM9cHJveGllcywKICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWRpcmVjdHM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgKiphZGFwdGVyX2t3YXJncwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIoc2VsZi5jb29raWVzLCBwcmVwYXJlZF9yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgcmVkaXJlY3QgdXJsLCBpZiBhbnksIGZvciB0aGUgbmV4dCBsb29wCiAgICAgICAgICAgICAgICB1cmwgPSBzZWxmLmdldF9yZWRpcmVjdF90YXJnZXQocmVzcCkKICAgICAgICAgICAgICAgIHlpZWxkIHJlc3AKCiAgICBkZWYgcmVidWlsZF9hdXRoKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJXaGVuIGJlaW5nIHJlZGlyZWN0ZWQgd2UgbWF5IHdhbnQgdG8gc3RyaXAgYXV0aGVudGljYXRpb24gZnJvbSB0aGUKICAgICAgICByZXF1ZXN0IHRvIGF2b2lkIGxlYWtpbmcgY3JlZGVudGlhbHMuIFRoaXMgbWV0aG9kIGludGVsbGlnZW50bHkgcmVtb3ZlcwogICAgICAgIGFuZCByZWFwcGxpZXMgYXV0aGVudGljYXRpb24gd2hlcmUgcG9zc2libGUgdG8gYXZvaWQgY3JlZGVudGlhbCBsb3NzLgogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICB1cmwgPSBwcmVwYXJlZF9yZXF1ZXN0LnVybAoKICAgICAgICBpZiAnQXV0aG9yaXphdGlvbicgaW4gaGVhZGVyczoKICAgICAgICAgICAgIyBJZiB3ZSBnZXQgcmVkaXJlY3RlZCB0byBhIG5ldyBob3N0LCB3ZSBzaG91bGQgc3RyaXAgb3V0IGFueQogICAgICAgICAgICAjIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMuCiAgICAgICAgICAgIG9yaWdpbmFsX3BhcnNlZCA9IHVybHBhcnNlKHJlc3BvbnNlLnJlcXVlc3QudXJsKQogICAgICAgICAgICByZWRpcmVjdF9wYXJzZWQgPSB1cmxwYXJzZSh1cmwpCgogICAgICAgICAgICBpZiAob3JpZ2luYWxfcGFyc2VkLmhvc3RuYW1lICE9IHJlZGlyZWN0X3BhcnNlZC5ob3N0bmFtZSk6CiAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddCgogICAgICAgICMgLm5ldHJjIG1pZ2h0IGhhdmUgbW9yZSBhdXRoIGZvciB1cyBvbiBvdXIgbmV3IGhvc3QuCiAgICAgICAgbmV3X2F1dGggPSBnZXRfbmV0cmNfYXV0aCh1cmwpIGlmIHNlbGYudHJ1c3RfZW52IGVsc2UgTm9uZQogICAgICAgIGlmIG5ld19hdXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LnByZXBhcmVfYXV0aChuZXdfYXV0aCkKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlYnVpbGRfcHJveGllcyhzZWxmLCBwcmVwYXJlZF9yZXF1ZXN0LCBwcm94aWVzKToKICAgICAgICAiIiJUaGlzIG1ldGhvZCByZS1ldmFsdWF0ZXMgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gYnkgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBJZiB3ZSBhcmUgcmVkaXJlY3RlZCB0byBhIFVSTCBjb3ZlcmVkIGJ5CiAgICAgICAgTk9fUFJPWFksIHdlIHN0cmlwIHRoZSBwcm94eSBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHdlIHNldCBtaXNzaW5nCiAgICAgICAgcHJveHkga2V5cyBmb3IgdGhpcyBVUkwgKGluIGNhc2UgdGhleSB3ZXJlIHN0cmlwcGVkIGJ5IGEgcHJldmlvdXMKICAgICAgICByZWRpcmVjdCkuCgogICAgICAgIFRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIFByb3h5LUF1dGhvcml6YXRpb24gaGVhZGVyIHdoZXJlCiAgICAgICAgbmVjZXNzYXJ5LgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBwcm94aWVzID0gcHJveGllcyBpZiBwcm94aWVzIGlzIG5vdCBOb25lIGVsc2Uge30KICAgICAgICBoZWFkZXJzID0gcHJlcGFyZWRfcmVxdWVzdC5oZWFkZXJzCiAgICAgICAgdXJsID0gcHJlcGFyZWRfcmVxdWVzdC51cmwKICAgICAgICBzY2hlbWUgPSB1cmxwYXJzZSh1cmwpLnNjaGVtZQogICAgICAgIG5ld19wcm94aWVzID0gcHJveGllcy5jb3B5KCkKICAgICAgICBub19wcm94eSA9IHByb3hpZXMuZ2V0KCdub19wcm94eScpCgogICAgICAgIGJ5cGFzc19wcm94eSA9IHNob3VsZF9ieXBhc3NfcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KQogICAgICAgIGlmIHNlbGYudHJ1c3RfZW52IGFuZCBub3QgYnlwYXNzX3Byb3h5OgogICAgICAgICAgICBlbnZpcm9uX3Byb3hpZXMgPSBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCgogICAgICAgICAgICBwcm94eSA9IGVudmlyb25fcHJveGllcy5nZXQoc2NoZW1lLCBlbnZpcm9uX3Byb3hpZXMuZ2V0KCdhbGwnKSkKCiAgICAgICAgICAgIGlmIHByb3h5OgogICAgICAgICAgICAgICAgbmV3X3Byb3hpZXMuc2V0ZGVmYXVsdChzY2hlbWUsIHByb3h5KQoKICAgICAgICBpZiAnUHJveHktQXV0aG9yaXphdGlvbicgaW4gaGVhZGVyczoKICAgICAgICAgICAgZGVsIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKG5ld19wcm94aWVzW3NjaGVtZV0pCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBOb25lLCBOb25lCgogICAgICAgIGlmIHVzZXJuYW1lIGFuZCBwYXNzd29yZDoKICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLCBwYXNzd29yZCkKCiAgICAgICAgcmV0dXJuIG5ld19wcm94aWVzCgogICAgZGVmIHJlYnVpbGRfbWV0aG9kKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJXaGVuIGJlaW5nIHJlZGlyZWN0ZWQgd2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBtZXRob2Qgb2YgdGhlIHJlcXVlc3QKICAgICAgICBiYXNlZCBvbiBjZXJ0YWluIHNwZWNzIG9yIGJyb3dzZXIgYmVoYXZpb3IuCiAgICAgICAgIiIiCiAgICAgICAgbWV0aG9kID0gcHJlcGFyZWRfcmVxdWVzdC5tZXRob2QKCiAgICAgICAgIyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjQKICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5zZWVfb3RoZXIgYW5kIG1ldGhvZCAhPSAnSEVBRCc6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICMgRG8gd2hhdCB0aGUgYnJvd3NlcnMgZG8sIGRlc3BpdGUgc3RhbmRhcmRzLi4uCiAgICAgICAgIyBGaXJzdCwgdHVybiAzMDJzIGludG8gR0VUcy4KICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5mb3VuZCBhbmQgbWV0aG9kICE9ICdIRUFEJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgIyBTZWNvbmQsIGlmIGEgUE9TVCBpcyByZXNwb25kZWQgdG8gd2l0aCBhIDMwMSwgdHVybiBpdCBpbnRvIGEgR0VULgogICAgICAgICMgVGhpcyBiaXphcnJlIGJlaGF2aW91ciBpcyBleHBsYWluZWQgaW4gSXNzdWUgMTcwNC4KICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5tb3ZlZCBhbmQgbWV0aG9kID09ICdQT1NUJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5tZXRob2QgPSBtZXRob2QKCgpjbGFzcyBTZXNzaW9uKFNlc3Npb25SZWRpcmVjdE1peGluKToKICAgICIiIkEgUmVxdWVzdHMgc2Vzc2lvbi4KCiAgICBQcm92aWRlcyBjb29raWUgcGVyc2lzdGVuY2UsIGNvbm5lY3Rpb24tcG9vbGluZywgYW5kIGNvbmZpZ3VyYXRpb24uCgogICAgQmFzaWMgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgICA+Pj4gcy5nZXQoJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CgogICAgT3IgYXMgYSBjb250ZXh0IG1hbmFnZXI6OgoKICAgICAgPj4+IHdpdGggcmVxdWVzdHMuU2Vzc2lvbigpIGFzIHM6CiAgICAgID4+PiAgICAgcy5nZXQoJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICBfX2F0dHJzX18gPSBbCiAgICAgICAgJ2hlYWRlcnMnLCAnY29va2llcycsICdhdXRoJywgJ3Byb3hpZXMnLCAnaG9va3MnLCAncGFyYW1zJywgJ3ZlcmlmeScsCiAgICAgICAgJ2NlcnQnLCAncHJlZmV0Y2gnLCAnYWRhcHRlcnMnLCAnc3RyZWFtJywgJ3RydXN0X2VudicsCiAgICAgICAgJ21heF9yZWRpcmVjdHMnLAogICAgXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKCiAgICAgICAgIzogQSBjYXNlLWluc2Vuc2l0aXZlIGRpY3Rpb25hcnkgb2YgaGVhZGVycyB0byBiZSBzZW50IG9uIGVhY2gKICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBzZW50IGZyb20gdGhpcwogICAgICAgICM6IDpjbGFzczpgU2Vzc2lvbiA8U2Vzc2lvbj5gLgogICAgICAgIHNlbGYuaGVhZGVycyA9IGRlZmF1bHRfaGVhZGVycygpCgogICAgICAgICM6IERlZmF1bHQgQXV0aGVudGljYXRpb24gdHVwbGUgb3Igb2JqZWN0IHRvIGF0dGFjaCB0bwogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgogICAgICAgIHNlbGYuYXV0aCA9IE5vbmUKCiAgICAgICAgIzogRGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIG9yIHByb3RvY29sIGFuZCBob3N0IHRvIHRoZSBVUkwgb2YgdGhlIHByb3h5CiAgICAgICAgIzogKGUuZy4geydodHRwJzogJ2Zvby5iYXI6MzEyOCcsICdodHRwOi8vaG9zdC5uYW1lJzogJ2Zvby5iYXI6NDAxMid9KSB0bwogICAgICAgICM6IGJlIHVzZWQgb24gZWFjaCA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4KICAgICAgICBzZWxmLnByb3hpZXMgPSB7fQoKICAgICAgICAjOiBFdmVudC1oYW5kbGluZyBob29rcy4KICAgICAgICBzZWxmLmhvb2tzID0gZGVmYXVsdF9ob29rcygpCgogICAgICAgICM6IERpY3Rpb25hcnkgb2YgcXVlcnlzdHJpbmcgZGF0YSB0byBhdHRhY2ggdG8gZWFjaAogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLiBUaGUgZGljdGlvbmFyeSB2YWx1ZXMgbWF5IGJlIGxpc3RzIGZvcgogICAgICAgICM6IHJlcHJlc2VudGluZyBtdWx0aXZhbHVlZCBxdWVyeSBwYXJhbWV0ZXJzLgogICAgICAgIHNlbGYucGFyYW1zID0ge30KCiAgICAgICAgIzogU3RyZWFtIHJlc3BvbnNlIGNvbnRlbnQgZGVmYXVsdC4KICAgICAgICBzZWxmLnN0cmVhbSA9IEZhbHNlCgogICAgICAgICM6IFNTTCBWZXJpZmljYXRpb24gZGVmYXVsdC4KICAgICAgICBzZWxmLnZlcmlmeSA9IFRydWUKCiAgICAgICAgIzogU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSBkZWZhdWx0LCBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudAogICAgICAgICM6IGNlcnQgZmlsZSAoLnBlbSkuIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgICAgICBzZWxmLmNlcnQgPSBOb25lCgogICAgICAgICM6IE1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0cyBhbGxvd2VkLiBJZiB0aGUgcmVxdWVzdCBleGNlZWRzIHRoaXMKICAgICAgICAjOiBsaW1pdCwgYSA6Y2xhc3M6YFRvb01hbnlSZWRpcmVjdHNgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCiAgICAgICAgIzogVGhpcyBkZWZhdWx0cyB0byByZXF1ZXN0cy5tb2RlbHMuREVGQVVMVF9SRURJUkVDVF9MSU1JVCwgd2hpY2ggaXMKICAgICAgICAjOiAzMC4KICAgICAgICBzZWxmLm1heF9yZWRpcmVjdHMgPSBERUZBVUxUX1JFRElSRUNUX0xJTUlUCgogICAgICAgICM6IFRydXN0IGVudmlyb25tZW50IHNldHRpbmdzIGZvciBwcm94eSBjb25maWd1cmF0aW9uLCBkZWZhdWx0CiAgICAgICAgIzogYXV0aGVudGljYXRpb24gYW5kIHNpbWlsYXIuCiAgICAgICAgc2VsZi50cnVzdF9lbnYgPSBUcnVlCgogICAgICAgICM6IEEgQ29va2llSmFyIGNvbnRhaW5pbmcgYWxsIGN1cnJlbnRseSBvdXRzdGFuZGluZyBjb29raWVzIHNldCBvbiB0aGlzCiAgICAgICAgIzogc2Vzc2lvbi4gQnkgZGVmYXVsdCBpdCBpcyBhCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0c0Nvb2tpZUphciA8cmVxdWVzdHMuY29va2llcy5SZXF1ZXN0c0Nvb2tpZUphcj5gLCBidXQKICAgICAgICAjOiBtYXkgYmUgYW55IG90aGVyIGBgY29va2llbGliLkNvb2tpZUphcmBgIGNvbXBhdGlibGUgb2JqZWN0LgogICAgICAgIHNlbGYuY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3Qoe30pCgogICAgICAgICMgRGVmYXVsdCBjb25uZWN0aW9uIGFkYXB0ZXJzLgogICAgICAgIHNlbGYuYWRhcHRlcnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgc2VsZi5tb3VudCgnaHR0cHM6Ly8nLCBIVFRQQWRhcHRlcigpKQogICAgICAgIHNlbGYubW91bnQoJ2h0dHA6Ly8nLCBIVFRQQWRhcHRlcigpKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBwcmVwYXJlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIiIiQ29uc3RydWN0cyBhIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBmb3IKICAgICAgICB0cmFuc21pc3Npb24gYW5kIHJldHVybnMgaXQuIFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdGAgaGFzIHNldHRpbmdzCiAgICAgICAgbWVyZ2VkIGZyb20gdGhlIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIGluc3RhbmNlIGFuZCB0aG9zZSBvZiB0aGUKICAgICAgICA6Y2xhc3M6YFNlc3Npb25gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogOmNsYXNzOmBSZXF1ZXN0YCBpbnN0YW5jZSB0byBwcmVwYXJlIHdpdGggdGhpcwogICAgICAgICAgICBzZXNzaW9uJ3Mgc2V0dGluZ3MuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5QcmVwYXJlZFJlcXVlc3QKICAgICAgICAiIiIKICAgICAgICBjb29raWVzID0gcmVxdWVzdC5jb29raWVzIG9yIHt9CgogICAgICAgICMgQm9vdHN0cmFwIENvb2tpZUphci4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3QoY29va2llcykKCiAgICAgICAgIyBNZXJnZSB3aXRoIHNlc3Npb24gY29va2llcwogICAgICAgIG1lcmdlZF9jb29raWVzID0gbWVyZ2VfY29va2llcygKICAgICAgICAgICAgbWVyZ2VfY29va2llcyhSZXF1ZXN0c0Nvb2tpZUphcigpLCBzZWxmLmNvb2tpZXMpLCBjb29raWVzKQoKICAgICAgICAjIFNldCBlbnZpcm9ubWVudCdzIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGlmIG5vdCBleHBsaWNpdGx5IHNldC4KICAgICAgICBhdXRoID0gcmVxdWVzdC5hdXRoCiAgICAgICAgaWYgc2VsZi50cnVzdF9lbnYgYW5kIG5vdCBhdXRoIGFuZCBub3Qgc2VsZi5hdXRoOgogICAgICAgICAgICBhdXRoID0gZ2V0X25ldHJjX2F1dGgocmVxdWVzdC51cmwpCgogICAgICAgIHAgPSBQcmVwYXJlZFJlcXVlc3QoKQogICAgICAgIHAucHJlcGFyZSgKICAgICAgICAgICAgbWV0aG9kPXJlcXVlc3QubWV0aG9kLnVwcGVyKCksCiAgICAgICAgICAgIHVybD1yZXF1ZXN0LnVybCwKICAgICAgICAgICAgZmlsZXM9cmVxdWVzdC5maWxlcywKICAgICAgICAgICAgZGF0YT1yZXF1ZXN0LmRhdGEsCiAgICAgICAgICAgIGpzb249cmVxdWVzdC5qc29uLAogICAgICAgICAgICBoZWFkZXJzPW1lcmdlX3NldHRpbmcocmVxdWVzdC5oZWFkZXJzLCBzZWxmLmhlYWRlcnMsIGRpY3RfY2xhc3M9Q2FzZUluc2Vuc2l0aXZlRGljdCksCiAgICAgICAgICAgIHBhcmFtcz1tZXJnZV9zZXR0aW5nKHJlcXVlc3QucGFyYW1zLCBzZWxmLnBhcmFtcyksCiAgICAgICAgICAgIGF1dGg9bWVyZ2Vfc2V0dGluZyhhdXRoLCBzZWxmLmF1dGgpLAogICAgICAgICAgICBjb29raWVzPW1lcmdlZF9jb29raWVzLAogICAgICAgICAgICBob29rcz1tZXJnZV9ob29rcyhyZXF1ZXN0Lmhvb2tzLCBzZWxmLmhvb2tzKSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHAKCiAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwKICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGRhdGE9Tm9uZSwgaGVhZGVycz1Ob25lLCBjb29raWVzPU5vbmUsIGZpbGVzPU5vbmUsCiAgICAgICAgICAgIGF1dGg9Tm9uZSwgdGltZW91dD1Ob25lLCBhbGxvd19yZWRpcmVjdHM9VHJ1ZSwgcHJveGllcz1Ob25lLAogICAgICAgICAgICBob29rcz1Ob25lLCBzdHJlYW09Tm9uZSwgdmVyaWZ5PU5vbmUsIGNlcnQ9Tm9uZSwganNvbj1Ob25lKToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAsIHByZXBhcmVzIGl0IGFuZCBzZW5kcyBpdC4KICAgICAgICBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbWV0aG9kOiBtZXRob2QgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeQogICAgICAgICAgICBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQKICAgICAgICAgICAgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBoZWFkZXJzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgSFRUUCBIZWFkZXJzIHRvIHNlbmQgd2l0aCB0aGUKICAgICAgICAgICAgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gY29va2llczogKG9wdGlvbmFsKSBEaWN0IG9yIENvb2tpZUphciBvYmplY3QgdG8gc2VuZCB3aXRoIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBmaWxlczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIGBgJ2ZpbGVuYW1lJzogZmlsZS1saWtlLW9iamVjdHNgYAogICAgICAgICAgICBmb3IgbXVsdGlwYXJ0IGVuY29kaW5nIHVwbG9hZC4KICAgICAgICA6cGFyYW0gYXV0aDogKG9wdGlvbmFsKSBBdXRoIHR1cGxlIG9yIGNhbGxhYmxlIHRvIGVuYWJsZQogICAgICAgICAgICBCYXNpYy9EaWdlc3QvQ3VzdG9tIEhUVFAgQXV0aC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgICAgICA6cGFyYW0gYWxsb3dfcmVkaXJlY3RzOiAob3B0aW9uYWwpIFNldCB0byBUcnVlIGJ5IGRlZmF1bHQuCiAgICAgICAgOnR5cGUgYWxsb3dfcmVkaXJlY3RzOiBib29sCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIG9yIHByb3RvY29sIGFuZAogICAgICAgICAgICBob3N0bmFtZSB0byB0aGUgVVJMIG9mIHRoZSBwcm94eS4KICAgICAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIHdoZXRoZXIgdG8gaW1tZWRpYXRlbHkgZG93bmxvYWQgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgIGNvbnRlbnQuIERlZmF1bHRzIHRvIGBgRmFsc2VgYC4KICAgICAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlLiBEZWZhdWx0cyB0byBgYFRydWVgYC4KICAgICAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudCBjZXJ0IGZpbGUgKC5wZW0pLgogICAgICAgICAgICBJZiBUdXBsZSwgKCdjZXJ0JywgJ2tleScpIHBhaXIuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHRoZSBSZXF1ZXN0LgogICAgICAgIHJlcSA9IFJlcXVlc3QoCiAgICAgICAgICAgIG1ldGhvZD1tZXRob2QudXBwZXIoKSwKICAgICAgICAgICAgdXJsPXVybCwKICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICBmaWxlcz1maWxlcywKICAgICAgICAgICAgZGF0YT1kYXRhIG9yIHt9LAogICAgICAgICAgICBqc29uPWpzb24sCiAgICAgICAgICAgIHBhcmFtcz1wYXJhbXMgb3Ige30sCiAgICAgICAgICAgIGF1dGg9YXV0aCwKICAgICAgICAgICAgY29va2llcz1jb29raWVzLAogICAgICAgICAgICBob29rcz1ob29rcywKICAgICAgICApCiAgICAgICAgcHJlcCA9IHNlbGYucHJlcGFyZV9yZXF1ZXN0KHJlcSkKCiAgICAgICAgcHJveGllcyA9IHByb3hpZXMgb3Ige30KCiAgICAgICAgc2V0dGluZ3MgPSBzZWxmLm1lcmdlX2Vudmlyb25tZW50X3NldHRpbmdzKAogICAgICAgICAgICBwcmVwLnVybCwgcHJveGllcywgc3RyZWFtLCB2ZXJpZnksIGNlcnQKICAgICAgICApCgogICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdC4KICAgICAgICBzZW5kX2t3YXJncyA9IHsKICAgICAgICAgICAgJ3RpbWVvdXQnOiB0aW1lb3V0LAogICAgICAgICAgICAnYWxsb3dfcmVkaXJlY3RzJzogYWxsb3dfcmVkaXJlY3RzLAogICAgICAgIH0KICAgICAgICBzZW5kX2t3YXJncy51cGRhdGUoc2V0dGluZ3MpCiAgICAgICAgcmVzcCA9IHNlbGYuc2VuZChwcmVwLCAqKnNlbmRfa3dhcmdzKQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBnZXQoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgR0VUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnR0VUJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgb3B0aW9ucyhzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBPUFRJT05TIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnT1BUSU9OUycsIHVybCwgKiprd2FyZ3MpCgogICAgZGVmIGhlYWQoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgSEVBRCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdIRUFEJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgcG9zdChzZWxmLCB1cmwsIGRhdGE9Tm9uZSwganNvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUE9TVCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BPU1QnLCB1cmwsIGRhdGE9ZGF0YSwganNvbj1qc29uLCAqKmt3YXJncykKCiAgICBkZWYgcHV0KHNlbGYsIHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUFVUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIHBhdGNoKHNlbGYsIHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUEFUQ0ggcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKICAgIGRlZiBkZWxldGUoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgREVMRVRFIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnREVMRVRFJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIiIiU2VuZCBhIGdpdmVuIFByZXBhcmVkUmVxdWVzdC4KCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgICMgU2V0IGRlZmF1bHRzIHRoYXQgdGhlIGhvb2tzIGNhbiB1dGlsaXplIHRvIGVuc3VyZSB0aGV5IGFsd2F5cyBoYXZlCiAgICAgICAgIyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHRvIHJlcHJvZHVjZSB0aGUgcHJldmlvdXMgcmVxdWVzdC4KICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnc3RyZWFtJywgc2VsZi5zdHJlYW0pCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ3ZlcmlmeScsIHNlbGYudmVyaWZ5KQogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdjZXJ0Jywgc2VsZi5jZXJ0KQogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdwcm94aWVzJywgc2VsZi5wcm94aWVzKQoKICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCB1c2VycyBtaWdodCBhY2NpZGVudGFsbHkgc2VuZCBhIFJlcXVlc3Qgb2JqZWN0LgogICAgICAgICMgR3VhcmQgYWdhaW5zdCB0aGF0IHNwZWNpZmljIGZhaWx1cmUgY2FzZS4KICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVlc3QsIFJlcXVlc3QpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdZb3UgY2FuIG9ubHkgc2VuZCBQcmVwYXJlZFJlcXVlc3RzLicpCgogICAgICAgICMgU2V0IHVwIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHJlc29sdmVfcmVkaXJlY3RzIGFuZCBkaXNwYXRjaGluZyBvZiBob29rcwogICAgICAgIGFsbG93X3JlZGlyZWN0cyA9IGt3YXJncy5wb3AoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgc3RyZWFtID0ga3dhcmdzLmdldCgnc3RyZWFtJykKICAgICAgICBob29rcyA9IHJlcXVlc3QuaG9va3MKCiAgICAgICAgIyBHZXQgdGhlIGFwcHJvcHJpYXRlIGFkYXB0ZXIgdG8gdXNlCiAgICAgICAgYWRhcHRlciA9IHNlbGYuZ2V0X2FkYXB0ZXIodXJsPXJlcXVlc3QudXJsKQoKICAgICAgICAjIFN0YXJ0IHRpbWUgKGFwcHJveGltYXRlbHkpIG9mIHRoZSByZXF1ZXN0CiAgICAgICAgc3RhcnQgPSBwcmVmZXJyZWRfY2xvY2soKQoKICAgICAgICAjIFNlbmQgdGhlIHJlcXVlc3QKICAgICAgICByID0gYWRhcHRlci5zZW5kKHJlcXVlc3QsICoqa3dhcmdzKQoKICAgICAgICAjIFRvdGFsIGVsYXBzZWQgdGltZSBvZiB0aGUgcmVxdWVzdCAoYXBwcm94aW1hdGVseSkKICAgICAgICBlbGFwc2VkID0gcHJlZmVycmVkX2Nsb2NrKCkgLSBzdGFydAogICAgICAgIHIuZWxhcHNlZCA9IHRpbWVkZWx0YShzZWNvbmRzPWVsYXBzZWQpCgogICAgICAgICMgUmVzcG9uc2UgbWFuaXB1bGF0aW9uIGhvb2tzCiAgICAgICAgciA9IGRpc3BhdGNoX2hvb2soJ3Jlc3BvbnNlJywgaG9va3MsIHIsICoqa3dhcmdzKQoKICAgICAgICAjIFBlcnNpc3QgY29va2llcwogICAgICAgIGlmIHIuaGlzdG9yeToKCiAgICAgICAgICAgICMgSWYgdGhlIGhvb2tzIGNyZWF0ZSBoaXN0b3J5IHRoZW4gd2Ugd2FudCB0aG9zZSBjb29raWVzIHRvbwogICAgICAgICAgICBmb3IgcmVzcCBpbiByLmhpc3Rvcnk6CiAgICAgICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHNlbGYuY29va2llcywgcmVzcC5yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihzZWxmLmNvb2tpZXMsIHJlcXVlc3QsIHIucmF3KQoKICAgICAgICAjIFJlZGlyZWN0IHJlc29sdmluZyBnZW5lcmF0b3IuCiAgICAgICAgZ2VuID0gc2VsZi5yZXNvbHZlX3JlZGlyZWN0cyhyLCByZXF1ZXN0LCAqKmt3YXJncykKCiAgICAgICAgIyBSZXNvbHZlIHJlZGlyZWN0cyBpZiBhbGxvd2VkLgogICAgICAgIGhpc3RvcnkgPSBbcmVzcCBmb3IgcmVzcCBpbiBnZW5dIGlmIGFsbG93X3JlZGlyZWN0cyBlbHNlIFtdCgogICAgICAgICMgU2h1ZmZsZSB0aGluZ3MgYXJvdW5kIGlmIHRoZXJlJ3MgaGlzdG9yeS4KICAgICAgICBpZiBoaXN0b3J5OgogICAgICAgICAgICAjIEluc2VydCB0aGUgZmlyc3QgKG9yaWdpbmFsKSByZXF1ZXN0IGF0IHRoZSBzdGFydAogICAgICAgICAgICBoaXN0b3J5Lmluc2VydCgwLCByKQogICAgICAgICAgICAjIEdldCB0aGUgbGFzdCByZXF1ZXN0IG1hZGUKICAgICAgICAgICAgciA9IGhpc3RvcnkucG9wKCkKICAgICAgICAgICAgci5oaXN0b3J5ID0gaGlzdG9yeQoKICAgICAgICAjIElmIHJlZGlyZWN0cyBhcmVuJ3QgYmVpbmcgZm9sbG93ZWQsIHN0b3JlIHRoZSByZXNwb25zZSBvbiB0aGUgUmVxdWVzdCBmb3IgUmVzcG9uc2UubmV4dCgpLgogICAgICAgIGlmIG5vdCBhbGxvd19yZWRpcmVjdHM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHIuX25leHQgPSBuZXh0KHNlbGYucmVzb2x2ZV9yZWRpcmVjdHMociwgcmVxdWVzdCwgeWllbGRfcmVxdWVzdHM9VHJ1ZSwgKiprd2FyZ3MpKQogICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgbm90IHN0cmVhbToKICAgICAgICAgICAgci5jb250ZW50CgogICAgICAgIHJldHVybiByCgogICAgZGVmIG1lcmdlX2Vudmlyb25tZW50X3NldHRpbmdzKHNlbGYsIHVybCwgcHJveGllcywgc3RyZWFtLCB2ZXJpZnksIGNlcnQpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoZSBlbnZpcm9ubWVudCBhbmQgbWVyZ2UgaXQgd2l0aCBzb21lIHNldHRpbmdzLgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICAjIEdhdGhlciBjbHVlcyBmcm9tIHRoZSBzdXJyb3VuZGluZyBlbnZpcm9ubWVudC4KICAgICAgICBpZiBzZWxmLnRydXN0X2VudjoKICAgICAgICAgICAgIyBTZXQgZW52aXJvbm1lbnQncyBwcm94aWVzLgogICAgICAgICAgICBub19wcm94eSA9IHByb3hpZXMuZ2V0KCdub19wcm94eScpIGlmIHByb3hpZXMgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgICAgIGVudl9wcm94aWVzID0gZ2V0X2Vudmlyb25fcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KQogICAgICAgICAgICBmb3IgKGssIHYpIGluIGVudl9wcm94aWVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBwcm94aWVzLnNldGRlZmF1bHQoaywgdikKCiAgICAgICAgICAgICMgTG9vayBmb3IgcmVxdWVzdHMgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBhbmQgYmUgY29tcGF0aWJsZQogICAgICAgICAgICAjIHdpdGggY1VSTC4KICAgICAgICAgICAgaWYgdmVyaWZ5IGlzIFRydWUgb3IgdmVyaWZ5IGlzIE5vbmU6CiAgICAgICAgICAgICAgICB2ZXJpZnkgPSAob3MuZW52aXJvbi5nZXQoJ1JFUVVFU1RTX0NBX0JVTkRMRScpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvbi5nZXQoJ0NVUkxfQ0FfQlVORExFJykpCgogICAgICAgICMgTWVyZ2UgYWxsIHRoZSBrd2FyZ3MuCiAgICAgICAgcHJveGllcyA9IG1lcmdlX3NldHRpbmcocHJveGllcywgc2VsZi5wcm94aWVzKQogICAgICAgIHN0cmVhbSA9IG1lcmdlX3NldHRpbmcoc3RyZWFtLCBzZWxmLnN0cmVhbSkKICAgICAgICB2ZXJpZnkgPSBtZXJnZV9zZXR0aW5nKHZlcmlmeSwgc2VsZi52ZXJpZnkpCiAgICAgICAgY2VydCA9IG1lcmdlX3NldHRpbmcoY2VydCwgc2VsZi5jZXJ0KQoKICAgICAgICByZXR1cm4geyd2ZXJpZnknOiB2ZXJpZnksICdwcm94aWVzJzogcHJveGllcywgJ3N0cmVhbSc6IHN0cmVhbSwKICAgICAgICAgICAgICAgICdjZXJ0JzogY2VydH0KCiAgICBkZWYgZ2V0X2FkYXB0ZXIoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBjb25uZWN0aW9uIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBVUkwuCgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuYWRhcHRlcnMuQmFzZUFkYXB0ZXIKICAgICAgICAiIiIKICAgICAgICBmb3IgKHByZWZpeCwgYWRhcHRlcikgaW4gc2VsZi5hZGFwdGVycy5pdGVtcygpOgoKICAgICAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIKCiAgICAgICAgIyBOb3RoaW5nIG1hdGNoZXMgOi0vCiAgICAgICAgcmFpc2UgSW52YWxpZFNjaGVtYSgiTm8gY29ubmVjdGlvbiBhZGFwdGVycyB3ZXJlIGZvdW5kIGZvciAnJXMnIiAlIHVybCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2VzIGFsbCBhZGFwdGVycyBhbmQgYXMgc3VjaCB0aGUgc2Vzc2lvbiIiIgogICAgICAgIGZvciB2IGluIHNlbGYuYWRhcHRlcnMudmFsdWVzKCk6CiAgICAgICAgICAgIHYuY2xvc2UoKQoKICAgIGRlZiBtb3VudChzZWxmLCBwcmVmaXgsIGFkYXB0ZXIpOgogICAgICAgICIiIlJlZ2lzdGVycyBhIGNvbm5lY3Rpb24gYWRhcHRlciB0byBhIHByZWZpeC4KCiAgICAgICAgQWRhcHRlcnMgYXJlIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHByZWZpeCBsZW5ndGguCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGFwdGVyc1twcmVmaXhdID0gYWRhcHRlcgogICAgICAgIGtleXNfdG9fbW92ZSA9IFtrIGZvciBrIGluIHNlbGYuYWRhcHRlcnMgaWYgbGVuKGspIDwgbGVuKHByZWZpeCldCgogICAgICAgIGZvciBrZXkgaW4ga2V5c190b19tb3ZlOgogICAgICAgICAgICBzZWxmLmFkYXB0ZXJzW2tleV0gPSBzZWxmLmFkYXB0ZXJzLnBvcChrZXkpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICBzdGF0ZSA9IGRpY3QoKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpIGZvciBhdHRyIGluIHNlbGYuX19hdHRyc19fKQogICAgICAgIHJldHVybiBzdGF0ZQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQoKCmRlZiBzZXNzaW9uKCk6CiAgICAiIiIKICAgIFJldHVybnMgYSA6Y2xhc3M6YFNlc3Npb25gIGZvciBjb250ZXh0LW1hbmFnZW1lbnQuCgogICAgOnJ0eXBlOiBTZXNzaW9uCiAgICAiIiIKCiAgICByZXR1cm4gU2Vzc2lvbigpClBLAwQUAAAAAAAAACEAQTjX4vsMAAD7DAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgTG9va3VwRGljdAoKX2NvZGVzID0gewoKICAgICMgSW5mb3JtYXRpb25hbC4KICAgIDEwMDogKCdjb250aW51ZScsKSwKICAgIDEwMTogKCdzd2l0Y2hpbmdfcHJvdG9jb2xzJywpLAogICAgMTAyOiAoJ3Byb2Nlc3NpbmcnLCksCiAgICAxMDM6ICgnY2hlY2twb2ludCcsKSwKICAgIDEyMjogKCd1cmlfdG9vX2xvbmcnLCAncmVxdWVzdF91cmlfdG9vX2xvbmcnKSwKICAgIDIwMDogKCdvaycsICdva2F5JywgJ2FsbF9vaycsICdhbGxfb2theScsICdhbGxfZ29vZCcsICdcXG8vJywgJ+KckycpLAogICAgMjAxOiAoJ2NyZWF0ZWQnLCksCiAgICAyMDI6ICgnYWNjZXB0ZWQnLCksCiAgICAyMDM6ICgnbm9uX2F1dGhvcml0YXRpdmVfaW5mbycsICdub25fYXV0aG9yaXRhdGl2ZV9pbmZvcm1hdGlvbicpLAogICAgMjA0OiAoJ25vX2NvbnRlbnQnLCksCiAgICAyMDU6ICgncmVzZXRfY29udGVudCcsICdyZXNldCcpLAogICAgMjA2OiAoJ3BhcnRpYWxfY29udGVudCcsICdwYXJ0aWFsJyksCiAgICAyMDc6ICgnbXVsdGlfc3RhdHVzJywgJ211bHRpcGxlX3N0YXR1cycsICdtdWx0aV9zdGF0aScsICdtdWx0aXBsZV9zdGF0aScpLAogICAgMjA4OiAoJ2FscmVhZHlfcmVwb3J0ZWQnLCksCiAgICAyMjY6ICgnaW1fdXNlZCcsKSwKCiAgICAjIFJlZGlyZWN0aW9uLgogICAgMzAwOiAoJ211bHRpcGxlX2Nob2ljZXMnLCksCiAgICAzMDE6ICgnbW92ZWRfcGVybWFuZW50bHknLCAnbW92ZWQnLCAnXFxvLScpLAogICAgMzAyOiAoJ2ZvdW5kJywpLAogICAgMzAzOiAoJ3NlZV9vdGhlcicsICdvdGhlcicpLAogICAgMzA0OiAoJ25vdF9tb2RpZmllZCcsKSwKICAgIDMwNTogKCd1c2VfcHJveHknLCksCiAgICAzMDY6ICgnc3dpdGNoX3Byb3h5JywpLAogICAgMzA3OiAoJ3RlbXBvcmFyeV9yZWRpcmVjdCcsICd0ZW1wb3JhcnlfbW92ZWQnLCAndGVtcG9yYXJ5JyksCiAgICAzMDg6ICgncGVybWFuZW50X3JlZGlyZWN0JywKICAgICAgICAgICdyZXN1bWVfaW5jb21wbGV0ZScsICdyZXN1bWUnLCksICAjIFRoZXNlIDIgdG8gYmUgcmVtb3ZlZCBpbiAzLjAKCiAgICAjIENsaWVudCBFcnJvci4KICAgIDQwMDogKCdiYWRfcmVxdWVzdCcsICdiYWQnKSwKICAgIDQwMTogKCd1bmF1dGhvcml6ZWQnLCksCiAgICA0MDI6ICgncGF5bWVudF9yZXF1aXJlZCcsICdwYXltZW50JyksCiAgICA0MDM6ICgnZm9yYmlkZGVuJywpLAogICAgNDA0OiAoJ25vdF9mb3VuZCcsICctby0nKSwKICAgIDQwNTogKCdtZXRob2Rfbm90X2FsbG93ZWQnLCAnbm90X2FsbG93ZWQnKSwKICAgIDQwNjogKCdub3RfYWNjZXB0YWJsZScsKSwKICAgIDQwNzogKCdwcm94eV9hdXRoZW50aWNhdGlvbl9yZXF1aXJlZCcsICdwcm94eV9hdXRoJywgJ3Byb3h5X2F1dGhlbnRpY2F0aW9uJyksCiAgICA0MDg6ICgncmVxdWVzdF90aW1lb3V0JywgJ3RpbWVvdXQnKSwKICAgIDQwOTogKCdjb25mbGljdCcsKSwKICAgIDQxMDogKCdnb25lJywpLAogICAgNDExOiAoJ2xlbmd0aF9yZXF1aXJlZCcsKSwKICAgIDQxMjogKCdwcmVjb25kaXRpb25fZmFpbGVkJywgJ3ByZWNvbmRpdGlvbicpLAogICAgNDEzOiAoJ3JlcXVlc3RfZW50aXR5X3Rvb19sYXJnZScsKSwKICAgIDQxNDogKCdyZXF1ZXN0X3VyaV90b29fbGFyZ2UnLCksCiAgICA0MTU6ICgndW5zdXBwb3J0ZWRfbWVkaWFfdHlwZScsICd1bnN1cHBvcnRlZF9tZWRpYScsICdtZWRpYV90eXBlJyksCiAgICA0MTY6ICgncmVxdWVzdGVkX3JhbmdlX25vdF9zYXRpc2ZpYWJsZScsICdyZXF1ZXN0ZWRfcmFuZ2UnLCAncmFuZ2Vfbm90X3NhdGlzZmlhYmxlJyksCiAgICA0MTc6ICgnZXhwZWN0YXRpb25fZmFpbGVkJywpLAogICAgNDE4OiAoJ2ltX2FfdGVhcG90JywgJ3RlYXBvdCcsICdpX2FtX2FfdGVhcG90JyksCiAgICA0MjE6ICgnbWlzZGlyZWN0ZWRfcmVxdWVzdCcsKSwKICAgIDQyMjogKCd1bnByb2Nlc3NhYmxlX2VudGl0eScsICd1bnByb2Nlc3NhYmxlJyksCiAgICA0MjM6ICgnbG9ja2VkJywpLAogICAgNDI0OiAoJ2ZhaWxlZF9kZXBlbmRlbmN5JywgJ2RlcGVuZGVuY3knKSwKICAgIDQyNTogKCd1bm9yZGVyZWRfY29sbGVjdGlvbicsICd1bm9yZGVyZWQnKSwKICAgIDQyNjogKCd1cGdyYWRlX3JlcXVpcmVkJywgJ3VwZ3JhZGUnKSwKICAgIDQyODogKCdwcmVjb25kaXRpb25fcmVxdWlyZWQnLCAncHJlY29uZGl0aW9uJyksCiAgICA0Mjk6ICgndG9vX21hbnlfcmVxdWVzdHMnLCAndG9vX21hbnknKSwKICAgIDQzMTogKCdoZWFkZXJfZmllbGRzX3Rvb19sYXJnZScsICdmaWVsZHNfdG9vX2xhcmdlJyksCiAgICA0NDQ6ICgnbm9fcmVzcG9uc2UnLCAnbm9uZScpLAogICAgNDQ5OiAoJ3JldHJ5X3dpdGgnLCAncmV0cnknKSwKICAgIDQ1MDogKCdibG9ja2VkX2J5X3dpbmRvd3NfcGFyZW50YWxfY29udHJvbHMnLCAncGFyZW50YWxfY29udHJvbHMnKSwKICAgIDQ1MTogKCd1bmF2YWlsYWJsZV9mb3JfbGVnYWxfcmVhc29ucycsICdsZWdhbF9yZWFzb25zJyksCiAgICA0OTk6ICgnY2xpZW50X2Nsb3NlZF9yZXF1ZXN0JywpLAoKICAgICMgU2VydmVyIEVycm9yLgogICAgNTAwOiAoJ2ludGVybmFsX3NlcnZlcl9lcnJvcicsICdzZXJ2ZXJfZXJyb3InLCAnL29cXCcsICfinJcnKSwKICAgIDUwMTogKCdub3RfaW1wbGVtZW50ZWQnLCksCiAgICA1MDI6ICgnYmFkX2dhdGV3YXknLCksCiAgICA1MDM6ICgnc2VydmljZV91bmF2YWlsYWJsZScsICd1bmF2YWlsYWJsZScpLAogICAgNTA0OiAoJ2dhdGV3YXlfdGltZW91dCcsKSwKICAgIDUwNTogKCdodHRwX3ZlcnNpb25fbm90X3N1cHBvcnRlZCcsICdodHRwX3ZlcnNpb24nKSwKICAgIDUwNjogKCd2YXJpYW50X2Fsc29fbmVnb3RpYXRlcycsKSwKICAgIDUwNzogKCdpbnN1ZmZpY2llbnRfc3RvcmFnZScsKSwKICAgIDUwOTogKCdiYW5kd2lkdGhfbGltaXRfZXhjZWVkZWQnLCAnYmFuZHdpZHRoJyksCiAgICA1MTA6ICgnbm90X2V4dGVuZGVkJywpLAogICAgNTExOiAoJ25ldHdvcmtfYXV0aGVudGljYXRpb25fcmVxdWlyZWQnLCAnbmV0d29ya19hdXRoJywgJ25ldHdvcmtfYXV0aGVudGljYXRpb24nKSwKfQoKY29kZXMgPSBMb29rdXBEaWN0KG5hbWU9J3N0YXR1c19jb2RlcycpCgpmb3IgY29kZSwgdGl0bGVzIGluIF9jb2Rlcy5pdGVtcygpOgogICAgZm9yIHRpdGxlIGluIHRpdGxlczoKICAgICAgICBzZXRhdHRyKGNvZGVzLCB0aXRsZSwgY29kZSkKICAgICAgICBpZiBub3QgdGl0bGUuc3RhcnRzd2l0aCgoJ1xcJywgJy8nKSk6CiAgICAgICAgICAgIHNldGF0dHIoY29kZXMsIHRpdGxlLnVwcGVyKCksIGNvZGUpClBLAwQUAAAAAAAAACEA5iDKD8QLAADECwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zdHJ1Y3R1cmVzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5zdHJ1Y3R1cmVzCn5+fn5+fn5+fn5+fn5+fn5+fn4KCkRhdGEgc3RydWN0dXJlcyB0aGF0IHBvd2VyIFJlcXVlc3RzLgoiIiIKCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSAuY29tcGF0IGltcG9ydCBPcmRlcmVkRGljdAoKCmNsYXNzIENhc2VJbnNlbnNpdGl2ZURpY3QoY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiQSBjYXNlLWluc2Vuc2l0aXZlIGBgZGljdGBgLWxpa2Ugb2JqZWN0LgoKICAgIEltcGxlbWVudHMgYWxsIG1ldGhvZHMgYW5kIG9wZXJhdGlvbnMgb2YKICAgIGBgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmdgYCBhcyB3ZWxsIGFzIGRpY3QncyBgYGNvcHlgYC4gQWxzbwogICAgcHJvdmlkZXMgYGBsb3dlcl9pdGVtc2BgLgoKICAgIEFsbCBrZXlzIGFyZSBleHBlY3RlZCB0byBiZSBzdHJpbmdzLiBUaGUgc3RydWN0dXJlIHJlbWVtYmVycyB0aGUKICAgIGNhc2Ugb2YgdGhlIGxhc3Qga2V5IHRvIGJlIHNldCwgYW5kIGBgaXRlcihpbnN0YW5jZSlgYCwKICAgIGBga2V5cygpYGAsIGBgaXRlbXMoKWBgLCBgYGl0ZXJrZXlzKClgYCwgYW5kIGBgaXRlcml0ZW1zKClgYAogICAgd2lsbCBjb250YWluIGNhc2Utc2Vuc2l0aXZlIGtleXMuIEhvd2V2ZXIsIHF1ZXJ5aW5nIGFuZCBjb250YWlucwogICAgdGVzdGluZyBpcyBjYXNlIGluc2Vuc2l0aXZlOjoKCiAgICAgICAgY2lkID0gQ2FzZUluc2Vuc2l0aXZlRGljdCgpCiAgICAgICAgY2lkWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICAgIGNpZFsnYUNDRVBUJ10gPT0gJ2FwcGxpY2F0aW9uL2pzb24nICAjIFRydWUKICAgICAgICBsaXN0KGNpZCkgPT0gWydBY2NlcHQnXSAgIyBUcnVlCgogICAgRm9yIGV4YW1wbGUsIGBgaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddYGAgd2lsbCByZXR1cm4gdGhlCiAgICB2YWx1ZSBvZiBhIGBgJ0NvbnRlbnQtRW5jb2RpbmcnYGAgcmVzcG9uc2UgaGVhZGVyLCByZWdhcmRsZXNzCiAgICBvZiBob3cgdGhlIGhlYWRlciBuYW1lIHdhcyBvcmlnaW5hbGx5IHN0b3JlZC4KCiAgICBJZiB0aGUgY29uc3RydWN0b3IsIGBgLnVwZGF0ZWBgLCBvciBlcXVhbGl0eSBjb21wYXJpc29uCiAgICBvcGVyYXRpb25zIGFyZSBnaXZlbiBrZXlzIHRoYXQgaGF2ZSBlcXVhbCBgYC5sb3dlcigpYGBzLCB0aGUKICAgIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzZWxmLl9zdG9yZSA9IE9yZGVyZWREaWN0KCkKICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CiAgICAgICAgICAgIGRhdGEgPSB7fQogICAgICAgIHNlbGYudXBkYXRlKGRhdGEsICoqa3dhcmdzKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAjIFVzZSB0aGUgbG93ZXJjYXNlZCBrZXkgZm9yIGxvb2t1cHMsIGJ1dCBzdG9yZSB0aGUgYWN0dWFsCiAgICAgICAgIyBrZXkgYWxvbmdzaWRlIHRoZSB2YWx1ZS4KICAgICAgICBzZWxmLl9zdG9yZVtrZXkubG93ZXIoKV0gPSAoa2V5LCB2YWx1ZSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fc3RvcmVba2V5Lmxvd2VyKCldWzFdCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgZGVsIHNlbGYuX3N0b3JlW2tleS5sb3dlcigpXQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gKGNhc2Vka2V5IGZvciBjYXNlZGtleSwgbWFwcGVkdmFsdWUgaW4gc2VsZi5fc3RvcmUudmFsdWVzKCkpCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zdG9yZSkKCiAgICBkZWYgbG93ZXJfaXRlbXMoc2VsZik6CiAgICAgICAgIiIiTGlrZSBpdGVyaXRlbXMoKSwgYnV0IHdpdGggYWxsIGxvd2VyY2FzZSBrZXlzLiIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIChsb3dlcmtleSwga2V5dmFsWzFdKQogICAgICAgICAgICBmb3IgKGxvd2Vya2V5LCBrZXl2YWwpCiAgICAgICAgICAgIGluIHNlbGYuX3N0b3JlLml0ZW1zKCkKICAgICAgICApCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgY29sbGVjdGlvbnMuTWFwcGluZyk6CiAgICAgICAgICAgIG90aGVyID0gQ2FzZUluc2Vuc2l0aXZlRGljdChvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICAjIENvbXBhcmUgaW5zZW5zaXRpdmVseQogICAgICAgIHJldHVybiBkaWN0KHNlbGYubG93ZXJfaXRlbXMoKSkgPT0gZGljdChvdGhlci5sb3dlcl9pdGVtcygpKQoKICAgICMgQ29weSBpcyByZXF1aXJlZAogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZURpY3Qoc2VsZi5fc3RvcmUudmFsdWVzKCkpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoZGljdChzZWxmLml0ZW1zKCkpKQoKCmNsYXNzIExvb2t1cERpY3QoZGljdCk6CiAgICAiIiJEaWN0aW9uYXJ5IGxvb2t1cCBvYmplY3QuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHN1cGVyKExvb2t1cERpY3QsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8bG9va3VwIFwnJXNcJz4nICUgKHNlbGYubmFtZSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAjIFdlIGFsbG93IGZhbGwtdGhyb3VnaCBoZXJlLCBzbyB2YWx1ZXMgZGVmYXVsdCB0byBOb25lCgogICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fLmdldChrZXksIE5vbmUpCgogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18uZ2V0KGtleSwgZGVmYXVsdCkKUEsDBBQAAAAAAAAAIQBHwdlXBGwAAARsAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy51dGlscwp+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gUmVxdWVzdHMKdGhhdCBhcmUgYWxzbyB1c2VmdWwgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLgoiIiIKCmltcG9ydCBjZ2kKaW1wb3J0IGNvZGVjcwppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAppbXBvcnQgd2FybmluZ3MKCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX3ZlcnNpb25fXwpmcm9tIC4gaW1wb3J0IGNlcnRzCiMgdG9fbmF0aXZlX3N0cmluZyBpcyB1bnVzZWQgaGVyZSwgYnV0IGltcG9ydGVkIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC5jb21wYXQgaW1wb3J0IHBhcnNlX2h0dHBfbGlzdCBhcyBfcGFyc2VfbGlzdF9oZWFkZXIKZnJvbSAuY29tcGF0IGltcG9ydCAoCiAgICBxdW90ZSwgdXJscGFyc2UsIGJ5dGVzLCBzdHIsIE9yZGVyZWREaWN0LCB1bnF1b3RlLCBnZXRwcm94aWVzLAogICAgcHJveHlfYnlwYXNzLCB1cmx1bnBhcnNlLCBiYXNlc3RyaW5nLCBpbnRlZ2VyX3R5cGVzLCBpc19weTMsCiAgICBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQpCmZyb20gLmNvb2tpZXMgaW1wb3J0IGNvb2tpZWphcl9mcm9tX2RpY3QKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdApmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnZhbGlkVVJMLCBJbnZhbGlkSGVhZGVyLCBGaWxlTW9kZVdhcm5pbmcsIFVucmV3aW5kYWJsZUJvZHlFcnJvcikKCk5FVFJDX0ZJTEVTID0gKCcubmV0cmMnLCAnX25ldHJjJykKCkRFRkFVTFRfQ0FfQlVORExFX1BBVEggPSBjZXJ0cy53aGVyZSgpCgoKaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgIyBwcm92aWRlIGEgcHJveHlfYnlwYXNzIHZlcnNpb24gb24gV2luZG93cyB3aXRob3V0IEROUyBsb29rdXBzCgogICAgZGVmIHByb3h5X2J5cGFzc19yZWdpc3RyeShob3N0KToKICAgICAgICBpZiBpc19weTM6CiAgICAgICAgICAgIGltcG9ydCB3aW5yZWcKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbXBvcnQgX3dpbnJlZyBhcyB3aW5yZWcKICAgICAgICB0cnk6CiAgICAgICAgICAgIGludGVybmV0U2V0dGluZ3MgPSB3aW5yZWcuT3BlbktleSh3aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgICAgICAgICByJ1NvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEludGVybmV0IFNldHRpbmdzJykKICAgICAgICAgICAgcHJveHlFbmFibGUgPSB3aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlFbmFibGUnKVswXQogICAgICAgICAgICBwcm94eU92ZXJyaWRlID0gd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlPdmVycmlkZScpWzBdCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIG5vdCBwcm94eUVuYWJsZSBvciBub3QgcHJveHlPdmVycmlkZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgbWFrZSBhIGNoZWNrIHZhbHVlIGxpc3QgZnJvbSB0aGUgcmVnaXN0cnkgZW50cnk6IHJlcGxhY2UgdGhlCiAgICAgICAgIyAnPGxvY2FsPicgc3RyaW5nIGJ5IHRoZSBsb2NhbGhvc3QgZW50cnkgYW5kIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgIyBjYW5vbmljYWwgZW50cnkuCiAgICAgICAgcHJveHlPdmVycmlkZSA9IHByb3h5T3ZlcnJpZGUuc3BsaXQoJzsnKQogICAgICAgICMgbm93IGNoZWNrIGlmIHdlIG1hdGNoIG9uZSBvZiB0aGUgcmVnaXN0cnkgdmFsdWVzLgogICAgICAgIGZvciB0ZXN0IGluIHByb3h5T3ZlcnJpZGU6CiAgICAgICAgICAgIGlmIHRlc3QgPT0gJzxsb2NhbD4nOgogICAgICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiBob3N0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIi4iLCByIlwuIikgICAgICMgbWFzayBkb3RzCiAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIioiLCByIi4qIikgICAgICMgY2hhbmdlIGdsb2Igc2VxdWVuY2UKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiPyIsIHIiLiIpICAgICAgIyBjaGFuZ2UgZ2xvYiBjaGFyCiAgICAgICAgICAgIGlmIHJlLm1hdGNoKHRlc3QsIGhvc3QsIHJlLkkpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgcHJveHlfYnlwYXNzKGhvc3QpOiAgIyBub3FhCiAgICAgICAgIiIiUmV0dXJuIFRydWUsIGlmIHRoZSBob3N0IHNob3VsZCBiZSBieXBhc3NlZC4KCiAgICAgICAgQ2hlY2tzIHByb3h5IHNldHRpbmdzIGdhdGhlcmVkIGZyb20gdGhlIGVudmlyb25tZW50LCBpZiBzcGVjaWZpZWQsCiAgICAgICAgb3IgdGhlIHJlZ2lzdHJ5LgogICAgICAgICIiIgogICAgICAgIGlmIGdldHByb3hpZXNfZW52aXJvbm1lbnQoKToKICAgICAgICAgICAgcmV0dXJuIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudChob3N0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfcmVnaXN0cnkoaG9zdCkKCgpkZWYgZGljdF90b19zZXF1ZW5jZShkKToKICAgICIiIlJldHVybnMgYW4gaW50ZXJuYWwgc2VxdWVuY2UgZGljdGlvbmFyeSB1cGRhdGUuIiIiCgogICAgaWYgaGFzYXR0cihkLCAnaXRlbXMnKToKICAgICAgICBkID0gZC5pdGVtcygpCgogICAgcmV0dXJuIGQKCgpkZWYgc3VwZXJfbGVuKG8pOgogICAgdG90YWxfbGVuZ3RoID0gTm9uZQogICAgY3VycmVudF9wb3NpdGlvbiA9IDAKCiAgICBpZiBoYXNhdHRyKG8sICdfX2xlbl9fJyk6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gbGVuKG8pCgogICAgZWxpZiBoYXNhdHRyKG8sICdsZW4nKToKICAgICAgICB0b3RhbF9sZW5ndGggPSBvLmxlbgoKICAgIGVsaWYgaGFzYXR0cihvLCAnZmlsZW5vJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlbm8gPSBvLmZpbGVubygpCiAgICAgICAgZXhjZXB0IGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG90YWxfbGVuZ3RoID0gb3MuZnN0YXQoZmlsZW5vKS5zdF9zaXplCgogICAgICAgICAgICAjIEhhdmluZyB1c2VkIGZzdGF0IHRvIGRldGVybWluZSB0aGUgZmlsZSBsZW5ndGgsIHdlIG5lZWQgdG8KICAgICAgICAgICAgIyBjb25maXJtIHRoYXQgdGhpcyBmaWxlIHdhcyBvcGVuZWQgdXAgaW4gYmluYXJ5IG1vZGUuCiAgICAgICAgICAgIGlmICdiJyBub3QgaW4gby5tb2RlOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3RzIGhhcyBkZXRlcm1pbmVkIHRoZSBjb250ZW50LWxlbmd0aCBmb3IgdGhpcyAiCiAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgdXNpbmcgdGhlIGJpbmFyeSBzaXplIG9mIHRoZSBmaWxlOiBob3dldmVyLCB0aGUgIgogICAgICAgICAgICAgICAgICAgICJmaWxlIGhhcyBiZWVuIG9wZW5lZCBpbiB0ZXh0IG1vZGUgKGkuZS4gd2l0aG91dCB0aGUgJ2InICIKICAgICAgICAgICAgICAgICAgICAiZmxhZyBpbiB0aGUgbW9kZSkuIFRoaXMgbWF5IGxlYWQgdG8gYW4gaW5jb3JyZWN0ICIKICAgICAgICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGguIEluIFJlcXVlc3RzIDMuMCwgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgICAgICJmb3IgZmlsZXMgaW4gdGV4dCBtb2RlLiIpLAogICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlV2FybmluZwogICAgICAgICAgICAgICAgKQoKICAgIGlmIGhhc2F0dHIobywgJ3RlbGwnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnJlbnRfcG9zaXRpb24gPSBvLnRlbGwoKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGluIHNvbWUgd2VpcmQgc2l0dWF0aW9ucywgc3VjaCBhcyB3aGVuIHRoZSBmaWxlCiAgICAgICAgICAgICMgaXMgYWN0dWFsbHkgYSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBsaWtlIHN0ZGluLiBJbiB0aGlzCiAgICAgICAgICAgICMgaW5zdGFuY2UsIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgbGVuZ3RoIGlzLCBzbyBzZXQgaXQgdG8gemVybyBhbmQKICAgICAgICAgICAgIyBsZXQgcmVxdWVzdHMgY2h1bmsgaXQgaW5zdGVhZC4KICAgICAgICAgICAgaWYgdG90YWxfbGVuZ3RoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2xlbmd0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGhhc2F0dHIobywgJ3NlZWsnKSBhbmQgdG90YWxfbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIFN0cmluZ0lPIGFuZCBCeXRlc0lPIGhhdmUgc2VlayBidXQgbm8gdXNlYWJsZSBmaWxlbm8KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIHNlZWsgdG8gZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBvLnNlZWsoMCwgMikKICAgICAgICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggPSBvLnRlbGwoKQoKICAgICAgICAgICAgICAgICAgICAjIHNlZWsgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uIHRvIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAjIHBhcnRpYWxseSByZWFkIGZpbGUtbGlrZSBvYmplY3RzCiAgICAgICAgICAgICAgICAgICAgby5zZWVrKGN1cnJlbnRfcG9zaXRpb24gb3IgMCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIGlmIHRvdGFsX2xlbmd0aCBpcyBOb25lOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IDAKCiAgICByZXR1cm4gbWF4KDAsIHRvdGFsX2xlbmd0aCAtIGN1cnJlbnRfcG9zaXRpb24pCgoKZGVmIGdldF9uZXRyY19hdXRoKHVybCwgcmFpc2VfZXJyb3JzPUZhbHNlKToKICAgICIiIlJldHVybnMgdGhlIFJlcXVlc3RzIHR1cGxlIGF1dGggZm9yIGEgZ2l2ZW4gdXJsIGZyb20gbmV0cmMuIiIiCgogICAgdHJ5OgogICAgICAgIGZyb20gbmV0cmMgaW1wb3J0IG5ldHJjLCBOZXRyY1BhcnNlRXJyb3IKCiAgICAgICAgbmV0cmNfcGF0aCA9IE5vbmUKCiAgICAgICAgZm9yIGYgaW4gTkVUUkNfRklMRVM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguZXhwYW5kdXNlcignfi97MH0nLmZvcm1hdChmKSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgIyBvcy5wYXRoLmV4cGFuZHVzZXIgY2FuIGZhaWwgd2hlbiAkSE9NRSBpcyB1bmRlZmluZWQgYW5kCiAgICAgICAgICAgICAgICAjIGdldHB3dWlkIGZhaWxzLiBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwMTY0ICYKICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8xODQ2CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvYyk6CiAgICAgICAgICAgICAgICBuZXRyY19wYXRoID0gbG9jCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIEFib3J0IGVhcmx5IGlmIHRoZXJlIGlzbid0IG9uZS4KICAgICAgICBpZiBuZXRyY19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByaSA9IHVybHBhcnNlKHVybCkKCiAgICAgICAgIyBTdHJpcCBwb3J0IG51bWJlcnMgZnJvbSBuZXRsb2MuIFRoaXMgd2VpcmQgYGlmLi4uZW5jb2RlYGAgZGFuY2UgaXMKICAgICAgICAjIHVzZWQgZm9yIFB5dGhvbiAzLjIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB1bmljb2RlIGxpdGVyYWxzLgogICAgICAgIHNwbGl0c3RyID0gYic6JwogICAgICAgIGlmIGlzaW5zdGFuY2UodXJsLCBzdHIpOgogICAgICAgICAgICBzcGxpdHN0ciA9IHNwbGl0c3RyLmRlY29kZSgnYXNjaWknKQogICAgICAgIGhvc3QgPSByaS5uZXRsb2Muc3BsaXQoc3BsaXRzdHIpWzBdCgogICAgICAgIHRyeToKICAgICAgICAgICAgX25ldHJjID0gbmV0cmMobmV0cmNfcGF0aCkuYXV0aGVudGljYXRvcnMoaG9zdCkKICAgICAgICAgICAgaWYgX25ldHJjOgogICAgICAgICAgICAgICAgIyBSZXR1cm4gd2l0aCBsb2dpbiAvIHBhc3N3b3JkCiAgICAgICAgICAgICAgICBsb2dpbl9pID0gKDAgaWYgX25ldHJjWzBdIGVsc2UgMSkKICAgICAgICAgICAgICAgIHJldHVybiAoX25ldHJjW2xvZ2luX2ldLCBfbmV0cmNbMl0pCiAgICAgICAgZXhjZXB0IChOZXRyY1BhcnNlRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIElmIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3Igb3IgYSBwZXJtaXNzaW9ucyBpc3N1ZSByZWFkaW5nIHRoZSBmaWxlLAogICAgICAgICAgICAjIHdlJ2xsIGp1c3Qgc2tpcCBuZXRyYyBhdXRoIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIHRvIHJhaXNlIGVycm9ycy4KICAgICAgICAgICAgaWYgcmFpc2VfZXJyb3JzOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAjIEFwcEVuZ2luZSBoYWNraW5lc3MuCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcGFzcwoKCmRlZiBndWVzc19maWxlbmFtZShvYmopOgogICAgIiIiVHJpZXMgdG8gZ3Vlc3MgdGhlIGZpbGVuYW1lIG9mIHRoZSBnaXZlbiBvYmplY3QuIiIiCiAgICBuYW1lID0gZ2V0YXR0cihvYmosICduYW1lJywgTm9uZSkKICAgIGlmIChuYW1lIGFuZCBpc2luc3RhbmNlKG5hbWUsIGJhc2VzdHJpbmcpIGFuZCBuYW1lWzBdICE9ICc8JyBhbmQKICAgICAgICAgICAgbmFtZVstMV0gIT0gJz4nKToKICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShuYW1lKQoKCmRlZiBmcm9tX2tleV92YWxfbGlzdCh2YWx1ZSk6CiAgICAiIiJUYWtlIGFuIG9iamVjdCBhbmQgdGVzdCB0byBzZWUgaWYgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEKICAgIGRpY3Rpb25hcnkuIFVubGVzcyBpdCBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGFzIHN1Y2gsIHJldHVybiBhbgogICAgT3JkZXJlZERpY3QsIGUuZy4sCgogICAgOjoKCiAgICAgICAgPj4+IGZyb21fa2V5X3ZhbF9saXN0KFsoJ2tleScsICd2YWwnKV0pCiAgICAgICAgT3JkZXJlZERpY3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoJ3N0cmluZycpCiAgICAgICAgVmFsdWVFcnJvcjogbmVlZCBtb3JlIHRoYW4gMSB2YWx1ZSB0byB1bnBhY2sKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoeydrZXknOiAndmFsJ30pCiAgICAgICAgT3JkZXJlZERpY3QoWygna2V5JywgJ3ZhbCcpXSkKCiAgICA6cnR5cGU6IE9yZGVyZWREaWN0CiAgICAiIiIKICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoc3RyLCBieXRlcywgYm9vbCwgaW50KSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IGVuY29kZSBvYmplY3RzIHRoYXQgYXJlIG5vdCAyLXR1cGxlcycpCgogICAgcmV0dXJuIE9yZGVyZWREaWN0KHZhbHVlKQoKCmRlZiB0b19rZXlfdmFsX2xpc3QodmFsdWUpOgogICAgIiIiVGFrZSBhbiBvYmplY3QgYW5kIHRlc3QgdG8gc2VlIGlmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhCiAgICBkaWN0aW9uYXJ5LiBJZiBpdCBjYW4gYmUsIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzLCBlLmcuLAoKICAgIDo6CgogICAgICAgID4+PiB0b19rZXlfdmFsX2xpc3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICBbKCdrZXknLCAndmFsJyldCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdCh7J2tleSc6ICd2YWwnfSkKICAgICAgICBbKCdrZXknLCAndmFsJyldCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdCgnc3RyaW5nJykKICAgICAgICBWYWx1ZUVycm9yOiBjYW5ub3QgZW5jb2RlIG9iamVjdHMgdGhhdCBhcmUgbm90IDItdHVwbGVzLgoKICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHN0ciwgYnl0ZXMsIGJvb2wsIGludCkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBlbmNvZGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgMi10dXBsZXMnKQoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGNvbGxlY3Rpb25zLk1hcHBpbmcpOgogICAgICAgIHZhbHVlID0gdmFsdWUuaXRlbXMoKQoKICAgIHJldHVybiBsaXN0KHZhbHVlKQoKCiMgRnJvbSBtaXRzdWhpa28vd2Vya3pldWcgKHVzZWQgd2l0aCBwZXJtaXNzaW9uKS4KZGVmIHBhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICIiIlBhcnNlIGxpc3RzIGFzIGRlc2NyaWJlZCBieSBSRkMgMjA2OCBTZWN0aW9uIDIuCgogICAgSW4gcGFydGljdWxhciwgcGFyc2UgY29tbWEtc2VwYXJhdGVkIGxpc3RzIHdoZXJlIHRoZSBlbGVtZW50cyBvZgogICAgdGhlIGxpc3QgbWF5IGluY2x1ZGUgcXVvdGVkLXN0cmluZ3MuICBBIHF1b3RlZC1zdHJpbmcgY291bGQKICAgIGNvbnRhaW4gYSBjb21tYS4gIEEgbm9uLXF1b3RlZCBzdHJpbmcgY291bGQgaGF2ZSBxdW90ZXMgaW4gdGhlCiAgICBtaWRkbGUuICBRdW90ZXMgYXJlIHJlbW92ZWQgYXV0b21hdGljYWxseSBhZnRlciBwYXJzaW5nLgoKICAgIEl0IGJhc2ljYWxseSB3b3JrcyBsaWtlIDpmdW5jOmBwYXJzZV9zZXRfaGVhZGVyYCBqdXN0IHRoYXQgaXRlbXMKICAgIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgcHJlc2VydmVkLgoKICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdGFuZGFyZCA6Y2xhc3M6YGxpc3RgOgoKICAgID4+PiBwYXJzZV9saXN0X2hlYWRlcigndG9rZW4sICJxdW90ZWQgdmFsdWUiJykKICAgIFsndG9rZW4nLCAncXVvdGVkIHZhbHVlJ10KCiAgICBUbyBjcmVhdGUgYSBoZWFkZXIgZnJvbSB0aGUgOmNsYXNzOmBsaXN0YCBhZ2FpbiwgdXNlIHRoZQogICAgOmZ1bmM6YGR1bXBfaGVhZGVyYCBmdW5jdGlvbi4KCiAgICA6cGFyYW0gdmFsdWU6IGEgc3RyaW5nIHdpdGggYSBsaXN0IGhlYWRlci4KICAgIDpyZXR1cm46IDpjbGFzczpgbGlzdGAKICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gX3BhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICAgICBpZiBpdGVtWzoxXSA9PSBpdGVtWy0xOl0gPT0gJyInOgogICAgICAgICAgICBpdGVtID0gdW5xdW90ZV9oZWFkZXJfdmFsdWUoaXRlbVsxOi0xXSkKICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgcGFyc2VfZGljdF9oZWFkZXIodmFsdWUpOgogICAgIiIiUGFyc2UgbGlzdHMgb2Yga2V5LCB2YWx1ZSBwYWlycyBhcyBkZXNjcmliZWQgYnkgUkZDIDIwNjggU2VjdGlvbiAyIGFuZAogICAgY29udmVydCB0aGVtIGludG8gYSBweXRob24gZGljdDoKCiAgICA+Pj4gZCA9IHBhcnNlX2RpY3RfaGVhZGVyKCdmb289ImlzIGEgZmlzaCIsIGJhcj0iYXMgd2VsbCInKQogICAgPj4+IHR5cGUoZCkgaXMgZGljdAogICAgVHJ1ZQogICAgPj4+IHNvcnRlZChkLml0ZW1zKCkpCiAgICBbKCdiYXInLCAnYXMgd2VsbCcpLCAoJ2ZvbycsICdpcyBhIGZpc2gnKV0KCiAgICBJZiB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgYSBrZXkgaXQgd2lsbCBiZSBgTm9uZWA6CgogICAgPj4+IHBhcnNlX2RpY3RfaGVhZGVyKCdrZXlfd2l0aG91dF92YWx1ZScpCiAgICB7J2tleV93aXRob3V0X3ZhbHVlJzogTm9uZX0KCiAgICBUbyBjcmVhdGUgYSBoZWFkZXIgZnJvbSB0aGUgOmNsYXNzOmBkaWN0YCBhZ2FpbiwgdXNlIHRoZQogICAgOmZ1bmM6YGR1bXBfaGVhZGVyYCBmdW5jdGlvbi4KCiAgICA6cGFyYW0gdmFsdWU6IGEgc3RyaW5nIHdpdGggYSBkaWN0IGhlYWRlci4KICAgIDpyZXR1cm46IDpjbGFzczpgZGljdGAKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGl0ZW0gaW4gX3BhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICAgICBpZiAnPScgbm90IGluIGl0ZW06CiAgICAgICAgICAgIHJlc3VsdFtpdGVtXSA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKICAgICAgICBuYW1lLCB2YWx1ZSA9IGl0ZW0uc3BsaXQoJz0nLCAxKQogICAgICAgIGlmIHZhbHVlWzoxXSA9PSB2YWx1ZVstMTpdID09ICciJzoKICAgICAgICAgICAgdmFsdWUgPSB1bnF1b3RlX2hlYWRlcl92YWx1ZSh2YWx1ZVsxOi0xXSkKICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZQogICAgcmV0dXJuIHJlc3VsdAoKCiMgRnJvbSBtaXRzdWhpa28vd2Vya3pldWcgKHVzZWQgd2l0aCBwZXJtaXNzaW9uKS4KZGVmIHVucXVvdGVfaGVhZGVyX3ZhbHVlKHZhbHVlLCBpc19maWxlbmFtZT1GYWxzZSk6CiAgICByIiIiVW5xdW90ZXMgYSBoZWFkZXIgdmFsdWUuICAoUmV2ZXJzYWwgb2YgOmZ1bmM6YHF1b3RlX2hlYWRlcl92YWx1ZWApLgogICAgVGhpcyBkb2VzIG5vdCB1c2UgdGhlIHJlYWwgdW5xdW90aW5nIGJ1dCB3aGF0IGJyb3dzZXJzIGFyZSBhY3R1YWxseQogICAgdXNpbmcgZm9yIHF1b3RpbmcuCgogICAgOnBhcmFtIHZhbHVlOiB0aGUgaGVhZGVyIHZhbHVlIHRvIHVucXVvdGUuCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbMF0gPT0gdmFsdWVbLTFdID09ICciJzoKICAgICAgICAjIHRoaXMgaXMgbm90IHRoZSByZWFsIHVucXVvdGluZywgYnV0IGZpeGluZyB0aGlzIHNvIHRoYXQgdGhlCiAgICAgICAgIyBSRkMgaXMgbWV0IHdpbGwgcmVzdWx0IGluIGJ1Z3Mgd2l0aCBpbnRlcm5ldCBleHBsb3JlciBhbmQKICAgICAgICAjIHByb2JhYmx5IHNvbWUgb3RoZXIgYnJvd3NlcnMgYXMgd2VsbC4gIElFIGZvciBleGFtcGxlIGlzCiAgICAgICAgIyB1cGxvYWRpbmcgZmlsZXMgd2l0aCAiQzpcZm9vXGJhci50eHQiIGFzIGZpbGVuYW1lCiAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQoKICAgICAgICAjIGlmIHRoaXMgaXMgYSBmaWxlbmFtZSBhbmQgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlcnMgbG9vayBsaWtlCiAgICAgICAgIyBhIFVOQyBwYXRoLCB0aGVuIGp1c3QgcmV0dXJuIHRoZSB2YWx1ZSB3aXRob3V0IHF1b3Rlcy4gIFVzaW5nIHRoZQogICAgICAgICMgcmVwbGFjZSBzZXF1ZW5jZSBiZWxvdyBvbiBhIFVOQyBwYXRoIGhhcyB0aGUgZWZmZWN0IG9mIHR1cm5pbmcKICAgICAgICAjIHRoZSBsZWFkaW5nIGRvdWJsZSBzbGFzaCBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCB0aGVuCiAgICAgICAgIyBfZml4X2llX2ZpbGVuYW1lKCkgZG9lc24ndCB3b3JrIGNvcnJlY3RseS4gIFNlZSAjNDU4LgogICAgICAgIGlmIG5vdCBpc19maWxlbmFtZSBvciB2YWx1ZVs6Ml0gIT0gJ1xcXFwnOgogICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnXFxcXCcsICdcXCcpLnJlcGxhY2UoJ1xcIicsICciJykKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBkaWN0X2Zyb21fY29va2llamFyKGNqKToKICAgICIiIlJldHVybnMgYSBrZXkvdmFsdWUgZGljdGlvbmFyeSBmcm9tIGEgQ29va2llSmFyLgoKICAgIDpwYXJhbSBjajogQ29va2llSmFyIG9iamVjdCB0byBleHRyYWN0IGNvb2tpZXMgZnJvbS4KICAgIDpydHlwZTogZGljdAogICAgIiIiCgogICAgY29va2llX2RpY3QgPSB7fQoKICAgIGZvciBjb29raWUgaW4gY2o6CiAgICAgICAgY29va2llX2RpY3RbY29va2llLm5hbWVdID0gY29va2llLnZhbHVlCgogICAgcmV0dXJuIGNvb2tpZV9kaWN0CgoKZGVmIGFkZF9kaWN0X3RvX2Nvb2tpZWphcihjaiwgY29va2llX2RpY3QpOgogICAgIiIiUmV0dXJucyBhIENvb2tpZUphciBmcm9tIGEga2V5L3ZhbHVlIGRpY3Rpb25hcnkuCgogICAgOnBhcmFtIGNqOiBDb29raWVKYXIgdG8gaW5zZXJ0IGNvb2tpZXMgaW50by4KICAgIDpwYXJhbSBjb29raWVfZGljdDogRGljdCBvZiBrZXkvdmFsdWVzIHRvIGluc2VydCBpbnRvIENvb2tpZUphci4KICAgIDpydHlwZTogQ29va2llSmFyCiAgICAiIiIKCiAgICByZXR1cm4gY29va2llamFyX2Zyb21fZGljdChjb29raWVfZGljdCwgY2opCgoKZGVmIGdldF9lbmNvZGluZ3NfZnJvbV9jb250ZW50KGNvbnRlbnQpOgogICAgIiIiUmV0dXJucyBlbmNvZGluZ3MgZnJvbSBnaXZlbiBjb250ZW50IHN0cmluZy4KCiAgICA6cGFyYW0gY29udGVudDogYnl0ZXN0cmluZyB0byBleHRyYWN0IGVuY29kaW5ncyBmcm9tLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnSW4gcmVxdWVzdHMgMy4wLCBnZXRfZW5jb2RpbmdzX2Zyb21fY29udGVudCB3aWxsIGJlIHJlbW92ZWQuIEZvciAnCiAgICAgICAgJ21vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIGRpc2N1c3Npb24gb24gaXNzdWUgIzIyNjYuIChUaGlzJwogICAgICAgICcgd2FybmluZyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4pJyksCiAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQoKICAgIGNoYXJzZXRfcmUgPSByZS5jb21waWxlKHInPG1ldGEuKj9jaGFyc2V0PVsiXCddKiguKz8pWyJcJz5dJywgZmxhZ3M9cmUuSSkKICAgIHByYWdtYV9yZSA9IHJlLmNvbXBpbGUocic8bWV0YS4qP2NvbnRlbnQ9WyJcJ10qOz9jaGFyc2V0PSguKz8pWyJcJz5dJywgZmxhZ3M9cmUuSSkKICAgIHhtbF9yZSA9IHJlLmNvbXBpbGUocidePFw/eG1sLio/ZW5jb2Rpbmc9WyJcJ10qKC4rPylbIlwnPl0nKQoKICAgIHJldHVybiAoY2hhcnNldF9yZS5maW5kYWxsKGNvbnRlbnQpICsKICAgICAgICAgICAgcHJhZ21hX3JlLmZpbmRhbGwoY29udGVudCkgKwogICAgICAgICAgICB4bWxfcmUuZmluZGFsbChjb250ZW50KSkKCgpkZWYgZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycyhoZWFkZXJzKToKICAgICIiIlJldHVybnMgZW5jb2RpbmdzIGZyb20gZ2l2ZW4gSFRUUCBIZWFkZXIgRGljdC4KCiAgICA6cGFyYW0gaGVhZGVyczogZGljdGlvbmFyeSB0byBleHRyYWN0IGVuY29kaW5nIGZyb20uCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCgogICAgY29udGVudF90eXBlID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpCgogICAgaWYgbm90IGNvbnRlbnRfdHlwZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGNvbnRlbnRfdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihjb250ZW50X3R5cGUpCgogICAgaWYgJ2NoYXJzZXQnIGluIHBhcmFtczoKICAgICAgICByZXR1cm4gcGFyYW1zWydjaGFyc2V0J10uc3RyaXAoIidcIiIpCgogICAgaWYgJ3RleHQnIGluIGNvbnRlbnRfdHlwZToKICAgICAgICByZXR1cm4gJ0lTTy04ODU5LTEnCgoKZGVmIHN0cmVhbV9kZWNvZGVfcmVzcG9uc2VfdW5pY29kZShpdGVyYXRvciwgcik6CiAgICAiIiJTdHJlYW0gZGVjb2RlcyBhIGl0ZXJhdG9yLiIiIgoKICAgIGlmIHIuZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYXRvcjoKICAgICAgICAgICAgeWllbGQgaXRlbQogICAgICAgIHJldHVybgoKICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKHIuZW5jb2RpbmcpKGVycm9ycz0ncmVwbGFjZScpCiAgICBmb3IgY2h1bmsgaW4gaXRlcmF0b3I6CiAgICAgICAgcnYgPSBkZWNvZGVyLmRlY29kZShjaHVuaykKICAgICAgICBpZiBydjoKICAgICAgICAgICAgeWllbGQgcnYKICAgIHJ2ID0gZGVjb2Rlci5kZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgaWYgcnY6CiAgICAgICAgeWllbGQgcnYKCgpkZWYgaXRlcl9zbGljZXMoc3RyaW5nLCBzbGljZV9sZW5ndGgpOgogICAgIiIiSXRlcmF0ZSBvdmVyIHNsaWNlcyBvZiBhIHN0cmluZy4iIiIKICAgIHBvcyA9IDAKICAgIGlmIHNsaWNlX2xlbmd0aCBpcyBOb25lIG9yIHNsaWNlX2xlbmd0aCA8PSAwOgogICAgICAgIHNsaWNlX2xlbmd0aCA9IGxlbihzdHJpbmcpCiAgICB3aGlsZSBwb3MgPCBsZW4oc3RyaW5nKToKICAgICAgICB5aWVsZCBzdHJpbmdbcG9zOnBvcyArIHNsaWNlX2xlbmd0aF0KICAgICAgICBwb3MgKz0gc2xpY2VfbGVuZ3RoCgoKZGVmIGdldF91bmljb2RlX2Zyb21fcmVzcG9uc2Uocik6CiAgICAiIiJSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgY29udGVudCBiYWNrIGluIHVuaWNvZGUuCgogICAgOnBhcmFtIHI6IFJlc3BvbnNlIG9iamVjdCB0byBnZXQgdW5pY29kZSBjb250ZW50IGZyb20uCgogICAgVHJpZWQ6CgogICAgMS4gY2hhcnNldCBmcm9tIGNvbnRlbnQtdHlwZQogICAgMi4gZmFsbCBiYWNrIGFuZCByZXBsYWNlIGFsbCB1bmljb2RlIGNoYXJhY3RlcnMKCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnSW4gcmVxdWVzdHMgMy4wLCBnZXRfdW5pY29kZV9mcm9tX3Jlc3BvbnNlIHdpbGwgYmUgcmVtb3ZlZC4gRm9yICcKICAgICAgICAnbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBpc3N1ZSAjMjI2Ni4gKFRoaXMnCiAgICAgICAgJyB3YXJuaW5nIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiknKSwKICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCgogICAgdHJpZWRfZW5jb2RpbmdzID0gW10KCiAgICAjIFRyeSBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICBlbmNvZGluZyA9IGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMoci5oZWFkZXJzKQoKICAgIGlmIGVuY29kaW5nOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN0cihyLmNvbnRlbnQsIGVuY29kaW5nKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHRyaWVkX2VuY29kaW5ncy5hcHBlbmQoZW5jb2RpbmcpCgogICAgIyBGYWxsIGJhY2s6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cihyLmNvbnRlbnQsIGVuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKQogICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICByZXR1cm4gci5jb250ZW50CgoKIyBUaGUgdW5yZXNlcnZlZCBVUkkgY2hhcmFjdGVycyAoUkZDIDM5ODYpClVOUkVTRVJWRURfU0VUID0gZnJvemVuc2V0KAogICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICsgIjAxMjM0NTY3ODktLl9+IikKCgpkZWYgdW5xdW90ZV91bnJlc2VydmVkKHVyaSk6CiAgICAiIiJVbi1lc2NhcGUgYW55IHBlcmNlbnQtZXNjYXBlIHNlcXVlbmNlcyBpbiBhIFVSSSB0aGF0IGFyZSB1bnJlc2VydmVkCiAgICBjaGFyYWN0ZXJzLiBUaGlzIGxlYXZlcyBhbGwgcmVzZXJ2ZWQsIGlsbGVnYWwgYW5kIG5vbi1BU0NJSSBieXRlcyBlbmNvZGVkLgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHBhcnRzID0gdXJpLnNwbGl0KCclJykKICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihwYXJ0cykpOgogICAgICAgIGggPSBwYXJ0c1tpXVswOjJdCiAgICAgICAgaWYgbGVuKGgpID09IDIgYW5kIGguaXNhbG51bSgpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjID0gY2hyKGludChoLCAxNikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgiSW52YWxpZCBwZXJjZW50LWVzY2FwZSBzZXF1ZW5jZTogJyVzJyIgJSBoKQoKICAgICAgICAgICAgaWYgYyBpbiBVTlJFU0VSVkVEX1NFVDoKICAgICAgICAgICAgICAgIHBhcnRzW2ldID0gYyArIHBhcnRzW2ldWzI6XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFydHNbaV0gPSAnJScgKyBwYXJ0c1tpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcnRzW2ldID0gJyUnICsgcGFydHNbaV0KICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQoKCmRlZiByZXF1b3RlX3VyaSh1cmkpOgogICAgIiIiUmUtcXVvdGUgdGhlIGdpdmVuIFVSSS4KCiAgICBUaGlzIGZ1bmN0aW9uIHBhc3NlcyB0aGUgZ2l2ZW4gVVJJIHRocm91Z2ggYW4gdW5xdW90ZS9xdW90ZSBjeWNsZSB0bwogICAgZW5zdXJlIHRoYXQgaXQgaXMgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBxdW90ZWQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2FmZV93aXRoX3BlcmNlbnQgPSAiISMkJSYnKCkqKywvOjs9P0BbXX4iCiAgICBzYWZlX3dpdGhvdXRfcGVyY2VudCA9ICIhIyQmJygpKissLzo7PT9AW11+IgogICAgdHJ5OgogICAgICAgICMgVW5xdW90ZSBvbmx5IHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMKICAgICAgICAjIFRoZW4gcXVvdGUgb25seSBpbGxlZ2FsIGNoYXJhY3RlcnMgKGRvIG5vdCBxdW90ZSByZXNlcnZlZCwKICAgICAgICAjIHVucmVzZXJ2ZWQsIG9yICclJykKICAgICAgICByZXR1cm4gcXVvdGUodW5xdW90ZV91bnJlc2VydmVkKHVyaSksIHNhZmU9c2FmZV93aXRoX3BlcmNlbnQpCiAgICBleGNlcHQgSW52YWxpZFVSTDoKICAgICAgICAjIFdlIGNvdWxkbid0IHVucXVvdGUgdGhlIGdpdmVuIFVSSSwgc28gbGV0J3MgdHJ5IHF1b3RpbmcgaXQsIGJ1dAogICAgICAgICMgdGhlcmUgbWF5IGJlIHVucXVvdGVkICclJ3MgaW4gdGhlIFVSSS4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhleSdyZQogICAgICAgICMgcHJvcGVybHkgcXVvdGVkIHNvIHRoZXkgZG8gbm90IGNhdXNlIGlzc3VlcyBlbHNld2hlcmUuCiAgICAgICAgcmV0dXJuIHF1b3RlKHVyaSwgc2FmZT1zYWZlX3dpdGhvdXRfcGVyY2VudCkKCgpkZWYgYWRkcmVzc19pbl9uZXR3b3JrKGlwLCBuZXQpOgogICAgIiIiVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGNoZWNrIGlmIGFuIElQIGJlbG9uZ3MgdG8gYSBuZXR3b3JrIHN1Ym5ldAoKICAgIEV4YW1wbGU6IHJldHVybnMgVHJ1ZSBpZiBpcCA9IDE5Mi4xNjguMS4xIGFuZCBuZXQgPSAxOTIuMTY4LjEuMC8yNAogICAgICAgICAgICAgcmV0dXJucyBGYWxzZSBpZiBpcCA9IDE5Mi4xNjguMS4xIGFuZCBuZXQgPSAxOTIuMTY4LjEwMC4wLzI0CgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGlwYWRkciA9IHN0cnVjdC51bnBhY2soJz1MJywgc29ja2V0LmluZXRfYXRvbihpcCkpWzBdCiAgICBuZXRhZGRyLCBiaXRzID0gbmV0LnNwbGl0KCcvJykKICAgIG5ldG1hc2sgPSBzdHJ1Y3QudW5wYWNrKCc9TCcsIHNvY2tldC5pbmV0X2F0b24oZG90dGVkX25ldG1hc2soaW50KGJpdHMpKSkpWzBdCiAgICBuZXR3b3JrID0gc3RydWN0LnVucGFjaygnPUwnLCBzb2NrZXQuaW5ldF9hdG9uKG5ldGFkZHIpKVswXSAmIG5ldG1hc2sKICAgIHJldHVybiAoaXBhZGRyICYgbmV0bWFzaykgPT0gKG5ldHdvcmsgJiBuZXRtYXNrKQoKCmRlZiBkb3R0ZWRfbmV0bWFzayhtYXNrKToKICAgICIiIkNvbnZlcnRzIG1hc2sgZnJvbSAveHggZm9ybWF0IHRvIHh4eC54eHgueHh4Lnh4eAoKICAgIEV4YW1wbGU6IGlmIG1hc2sgaXMgMjQgZnVuY3Rpb24gcmV0dXJucyAyNTUuMjU1LjI1NS4wCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgYml0cyA9IDB4ZmZmZmZmZmYgXiAoMSA8PCAzMiAtIG1hc2spIC0gMQogICAgcmV0dXJuIHNvY2tldC5pbmV0X250b2Eoc3RydWN0LnBhY2soJz5JJywgYml0cykpCgoKZGVmIGlzX2lwdjRfYWRkcmVzcyhzdHJpbmdfaXApOgogICAgIiIiCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgdHJ5OgogICAgICAgIHNvY2tldC5pbmV0X2F0b24oc3RyaW5nX2lwKQogICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIGlzX3ZhbGlkX2NpZHIoc3RyaW5nX25ldHdvcmspOgogICAgIiIiCiAgICBWZXJ5IHNpbXBsZSBjaGVjayBvZiB0aGUgY2lkciBmb3JtYXQgaW4gbm9fcHJveHkgdmFyaWFibGUuCgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGlmIHN0cmluZ19uZXR3b3JrLmNvdW50KCcvJykgPT0gMToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hc2sgPSBpbnQoc3RyaW5nX25ldHdvcmsuc3BsaXQoJy8nKVsxXSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIG1hc2sgPCAxIG9yIG1hc2sgPiAzMjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgc29ja2V0LmluZXRfYXRvbihzdHJpbmdfbmV0d29yay5zcGxpdCgnLycpWzBdKQogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNldF9lbnZpcm9uKGVudl9uYW1lLCB2YWx1ZSk6CiAgICAiIiJTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdlbnZfbmFtZScgdG8gJ3ZhbHVlJwoKICAgIFNhdmUgcHJldmlvdXMgdmFsdWUsIHlpZWxkLCBhbmQgdGhlbiByZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZSBzdG9yZWQgaW4KICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnZW52X25hbWUnLgoKICAgIElmICd2YWx1ZScgaXMgTm9uZSwgZG8gbm90aGluZyIiIgogICAgdmFsdWVfY2hhbmdlZCA9IHZhbHVlIGlzIG5vdCBOb25lCiAgICBpZiB2YWx1ZV9jaGFuZ2VkOgogICAgICAgIG9sZF92YWx1ZSA9IG9zLmVudmlyb24uZ2V0KGVudl9uYW1lKQogICAgICAgIG9zLmVudmlyb25bZW52X25hbWVdID0gdmFsdWUKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBpZiB2YWx1ZV9jaGFuZ2VkOgogICAgICAgICAgICBpZiBvbGRfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW2Vudl9uYW1lXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3MuZW52aXJvbltlbnZfbmFtZV0gPSBvbGRfdmFsdWUKCgpkZWYgc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHkpOgogICAgIiIiCiAgICBSZXR1cm5zIHdoZXRoZXIgd2Ugc2hvdWxkIGJ5cGFzcyBwcm94aWVzIG9yIG5vdC4KCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgZ2V0X3Byb3h5ID0gbGFtYmRhIGs6IG9zLmVudmlyb24uZ2V0KGspIG9yIG9zLmVudmlyb24uZ2V0KGsudXBwZXIoKSkKCiAgICAjIEZpcnN0IGNoZWNrIHdoZXRoZXIgbm9fcHJveHkgaXMgZGVmaW5lZC4gSWYgaXQgaXMsIGNoZWNrIHRoYXQgdGhlIFVSTAogICAgIyB3ZSdyZSBnZXR0aW5nIGlzbid0IGluIHRoZSBub19wcm94eSBsaXN0LgogICAgbm9fcHJveHlfYXJnID0gbm9fcHJveHkKICAgIGlmIG5vX3Byb3h5IGlzIE5vbmU6CiAgICAgICAgbm9fcHJveHkgPSBnZXRfcHJveHkoJ25vX3Byb3h5JykKICAgIG5ldGxvYyA9IHVybHBhcnNlKHVybCkubmV0bG9jCgogICAgaWYgbm9fcHJveHk6CiAgICAgICAgIyBXZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgd2UgbWF0Y2ggaGVyZS4gV2UgbmVlZCB0byBzZWUgaWYgd2UgbWF0Y2gKICAgICAgICAjIHRoZSBlbmQgb2YgdGhlIG5ldGxvYywgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBwb3J0LgogICAgICAgIG5vX3Byb3h5ID0gKAogICAgICAgICAgICBob3N0IGZvciBob3N0IGluIG5vX3Byb3h5LnJlcGxhY2UoJyAnLCAnJykuc3BsaXQoJywnKSBpZiBob3N0CiAgICAgICAgKQoKICAgICAgICBpcCA9IG5ldGxvYy5zcGxpdCgnOicpWzBdCiAgICAgICAgaWYgaXNfaXB2NF9hZGRyZXNzKGlwKToKICAgICAgICAgICAgZm9yIHByb3h5X2lwIGluIG5vX3Byb3h5OgogICAgICAgICAgICAgICAgaWYgaXNfdmFsaWRfY2lkcihwcm94eV9pcCk6CiAgICAgICAgICAgICAgICAgICAgaWYgYWRkcmVzc19pbl9uZXR3b3JrKGlwLCBwcm94eV9pcCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICAgICBlbGlmIGlwID09IHByb3h5X2lwOgogICAgICAgICAgICAgICAgICAgICMgSWYgbm9fcHJveHkgaXAgd2FzIGRlZmluZWQgaW4gcGxhaW4gSVAgbm90YXRpb24gaW5zdGVhZCBvZiBjaWRyIG5vdGF0aW9uICYKICAgICAgICAgICAgICAgICAgICAjIG1hdGNoZXMgdGhlIElQIG9mIHRoZSBpbmRleAogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGhvc3QgaW4gbm9fcHJveHk6CiAgICAgICAgICAgICAgICBpZiBuZXRsb2MuZW5kc3dpdGgoaG9zdCkgb3IgbmV0bG9jLnNwbGl0KCc6JylbMF0uZW5kc3dpdGgoaG9zdCk6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgVVJMIGRvZXMgbWF0Y2ggc29tZXRoaW5nIGluIG5vX3Byb3h5LCBzbyB3ZSBkb24ndCB3YW50CiAgICAgICAgICAgICAgICAgICAgIyB0byBhcHBseSB0aGUgcHJveGllcyBvbiB0aGlzIFVSTC4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgSWYgdGhlIHN5c3RlbSBwcm94eSBzZXR0aW5ncyBpbmRpY2F0ZSB0aGF0IHRoaXMgVVJMIHNob3VsZCBiZSBieXBhc3NlZCwKICAgICMgZG9uJ3QgcHJveHkuCiAgICAjIFRoZSBwcm94eV9ieXBhc3MgZnVuY3Rpb24gaXMgaW5jcmVkaWJseSBidWdneSBvbiBPUyBYIGluIGVhcmx5IHZlcnNpb25zCiAgICAjIG9mIFB5dGhvbiAyLjYsIHNvIGFsbG93IHRoaXMgY2FsbCB0byBmYWlsLiBPbmx5IGNhdGNoIHRoZSBzcGVjaWZpYwogICAgIyBleGNlcHRpb25zIHdlJ3ZlIHNlZW4sIHRob3VnaDogdGhpcyBjYWxsIGZhaWxpbmcgaW4gb3RoZXIgd2F5cyBjYW4gcmV2ZWFsCiAgICAjIGxlZ2l0aW1hdGUgcHJvYmxlbXMuCiAgICB3aXRoIHNldF9lbnZpcm9uKCdub19wcm94eScsIG5vX3Byb3h5X2FyZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBieXBhc3MgPSBwcm94eV9ieXBhc3MobmV0bG9jKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBzb2NrZXQuZ2FpZXJyb3IpOgogICAgICAgICAgICBieXBhc3MgPSBGYWxzZQoKICAgIGlmIGJ5cGFzczoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9Tm9uZSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Qgb2YgZW52aXJvbm1lbnQgcHJveGllcy4KCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgaWYgc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpOgogICAgICAgIHJldHVybiB7fQogICAgZWxzZToKICAgICAgICByZXR1cm4gZ2V0cHJveGllcygpCgoKZGVmIHNlbGVjdF9wcm94eSh1cmwsIHByb3hpZXMpOgogICAgIiIiU2VsZWN0IGEgcHJveHkgZm9yIHRoZSB1cmwsIGlmIGFwcGxpY2FibGUuCgogICAgOnBhcmFtIHVybDogVGhlIHVybCBiZWluZyBmb3IgdGhlIHJlcXVlc3QKICAgIDpwYXJhbSBwcm94aWVzOiBBIGRpY3Rpb25hcnkgb2Ygc2NoZW1lcyBvciBzY2hlbWVzIGFuZCBob3N0cyB0byBwcm94eSBVUkxzCiAgICAiIiIKICAgIHByb3hpZXMgPSBwcm94aWVzIG9yIHt9CiAgICB1cmxwYXJ0cyA9IHVybHBhcnNlKHVybCkKICAgIGlmIHVybHBhcnRzLmhvc3RuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHByb3hpZXMuZ2V0KHVybHBhcnRzLnNjaGVtZSwgcHJveGllcy5nZXQoJ2FsbCcpKQoKICAgIHByb3h5X2tleXMgPSBbCiAgICAgICAgdXJscGFydHMuc2NoZW1lICsgJzovLycgKyB1cmxwYXJ0cy5ob3N0bmFtZSwKICAgICAgICB1cmxwYXJ0cy5zY2hlbWUsCiAgICAgICAgJ2FsbDovLycgKyB1cmxwYXJ0cy5ob3N0bmFtZSwKICAgICAgICAnYWxsJywKICAgIF0KICAgIHByb3h5ID0gTm9uZQogICAgZm9yIHByb3h5X2tleSBpbiBwcm94eV9rZXlzOgogICAgICAgIGlmIHByb3h5X2tleSBpbiBwcm94aWVzOgogICAgICAgICAgICBwcm94eSA9IHByb3hpZXNbcHJveHlfa2V5XQogICAgICAgICAgICBicmVhawoKICAgIHJldHVybiBwcm94eQoKCmRlZiBkZWZhdWx0X3VzZXJfYWdlbnQobmFtZT0icHl0aG9uLXJlcXVlc3RzIik6CiAgICAiIiIKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdXNlciBhZ2VudC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICByZXR1cm4gJyVzLyVzJyAlIChuYW1lLCBfX3ZlcnNpb25fXykKCgpkZWYgZGVmYXVsdF9oZWFkZXJzKCk6CiAgICAiIiIKICAgIDpydHlwZTogcmVxdWVzdHMuc3RydWN0dXJlcy5DYXNlSW5zZW5zaXRpdmVEaWN0CiAgICAiIiIKICAgIHJldHVybiBDYXNlSW5zZW5zaXRpdmVEaWN0KHsKICAgICAgICAnVXNlci1BZ2VudCc6IGRlZmF1bHRfdXNlcl9hZ2VudCgpLAogICAgICAgICdBY2NlcHQtRW5jb2RpbmcnOiAnLCAnLmpvaW4oKCdnemlwJywgJ2RlZmxhdGUnKSksCiAgICAgICAgJ0FjY2VwdCc6ICcqLyonLAogICAgICAgICdDb25uZWN0aW9uJzogJ2tlZXAtYWxpdmUnLAogICAgfSkKCgpkZWYgcGFyc2VfaGVhZGVyX2xpbmtzKHZhbHVlKToKICAgICIiIlJldHVybiBhIGRpY3Qgb2YgcGFyc2VkIGxpbmsgaGVhZGVycyBwcm94aWVzLgoKICAgIGkuZS4gTGluazogPGh0dHA6Ly4uLi9mcm9udC5qcGVnPjsgcmVsPWZyb250OyB0eXBlPSJpbWFnZS9qcGVnIiw8aHR0cDovLy4uLi9iYWNrLmpwZWc+OyByZWw9YmFjazt0eXBlPSJpbWFnZS9qcGVnIgoKICAgIDpydHlwZTogbGlzdAogICAgIiIiCgogICAgbGlua3MgPSBbXQoKICAgIHJlcGxhY2VfY2hhcnMgPSAnIFwnIicKCiAgICBmb3IgdmFsIGluIHJlLnNwbGl0KCcsICo8JywgdmFsdWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdXJsLCBwYXJhbXMgPSB2YWwuc3BsaXQoJzsnLCAxKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB1cmwsIHBhcmFtcyA9IHZhbCwgJycKCiAgICAgICAgbGluayA9IHsndXJsJzogdXJsLnN0cmlwKCc8PiBcJyInKX0KCiAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtcy5zcGxpdCgnOycpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gcGFyYW0uc3BsaXQoJz0nKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBsaW5rW2tleS5zdHJpcChyZXBsYWNlX2NoYXJzKV0gPSB2YWx1ZS5zdHJpcChyZXBsYWNlX2NoYXJzKQoKICAgICAgICBsaW5rcy5hcHBlbmQobGluaykKCiAgICByZXR1cm4gbGlua3MKCgojIE51bGwgYnl0ZXM7IG5vIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2Ugb24gZWFjaCBjYWxsIHRvIGd1ZXNzX2pzb25fdXRmCl9udWxsID0gJ1x4MDAnLmVuY29kZSgnYXNjaWknKSAgIyBlbmNvZGluZyB0byBBU0NJSSBmb3IgUHl0aG9uIDMKX251bGwyID0gX251bGwgKiAyCl9udWxsMyA9IF9udWxsICogMwoKCmRlZiBndWVzc19qc29uX3V0ZihkYXRhKToKICAgICIiIgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgIyBKU09OIGFsd2F5cyBzdGFydHMgd2l0aCB0d28gQVNDSUkgY2hhcmFjdGVycywgc28gZGV0ZWN0aW9uIGlzIGFzCiAgICAjIGVhc3kgYXMgY291bnRpbmcgdGhlIG51bGxzIGFuZCBmcm9tIHRoZWlyIGxvY2F0aW9uIGFuZCBjb3VudAogICAgIyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLiBBbHNvIGRldGVjdCBhIEJPTSwgaWYgcHJlc2VudC4KICAgIHNhbXBsZSA9IGRhdGFbOjRdCiAgICBpZiBzYW1wbGUgaW4gKGNvZGVjcy5CT01fVVRGMzJfTEUsIGNvZGVjcy5CT01fVVRGMzJfQkUpOgogICAgICAgIHJldHVybiAndXRmLTMyJyAgICAgIyBCT00gaW5jbHVkZWQKICAgIGlmIHNhbXBsZVs6M10gPT0gY29kZWNzLkJPTV9VVEY4OgogICAgICAgIHJldHVybiAndXRmLTgtc2lnJyAgIyBCT00gaW5jbHVkZWQsIE1TIHN0eWxlIChkaXNjb3VyYWdlZCkKICAgIGlmIHNhbXBsZVs6Ml0gaW4gKGNvZGVjcy5CT01fVVRGMTZfTEUsIGNvZGVjcy5CT01fVVRGMTZfQkUpOgogICAgICAgIHJldHVybiAndXRmLTE2JyAgICAgIyBCT00gaW5jbHVkZWQKICAgIG51bGxjb3VudCA9IHNhbXBsZS5jb3VudChfbnVsbCkKICAgIGlmIG51bGxjb3VudCA9PSAwOgogICAgICAgIHJldHVybiAndXRmLTgnCiAgICBpZiBudWxsY291bnQgPT0gMjoKICAgICAgICBpZiBzYW1wbGVbOjoyXSA9PSBfbnVsbDI6ICAgIyAxc3QgYW5kIDNyZCBhcmUgbnVsbAogICAgICAgICAgICByZXR1cm4gJ3V0Zi0xNi1iZScKICAgICAgICBpZiBzYW1wbGVbMTo6Ml0gPT0gX251bGwyOiAgIyAybmQgYW5kIDR0aCBhcmUgbnVsbAogICAgICAgICAgICByZXR1cm4gJ3V0Zi0xNi1sZScKICAgICAgICAjIERpZCBub3QgZGV0ZWN0IDIgdmFsaWQgVVRGLTE2IGFzY2lpLXJhbmdlIGNoYXJhY3RlcnMKICAgIGlmIG51bGxjb3VudCA9PSAzOgogICAgICAgIGlmIHNhbXBsZVs6M10gPT0gX251bGwzOgogICAgICAgICAgICByZXR1cm4gJ3V0Zi0zMi1iZScKICAgICAgICBpZiBzYW1wbGVbMTpdID09IF9udWxsMzoKICAgICAgICAgICAgcmV0dXJuICd1dGYtMzItbGUnCiAgICAgICAgIyBEaWQgbm90IGRldGVjdCBhIHZhbGlkIFVURi0zMiBhc2NpaS1yYW5nZSBjaGFyYWN0ZXIKICAgIHJldHVybiBOb25lCgoKZGVmIHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZCh1cmwsIG5ld19zY2hlbWUpOgogICAgIiIiR2l2ZW4gYSBVUkwgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgc2NoZW1lLCBwcmVwZW5kIHRoZSBnaXZlbiBzY2hlbWUuCiAgICBEb2VzIG5vdCByZXBsYWNlIGEgcHJlc2VudCBzY2hlbWUgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlKHVybCwgbmV3X3NjaGVtZSkKCiAgICAjIHVybHBhcnNlIGlzIGEgZmluaWNreSBiZWFzdCwgYW5kIHNvbWV0aW1lcyBkZWNpZGVzIHRoYXQgdGhlcmUgaXNuJ3QgYQogICAgIyBuZXRsb2MgcHJlc2VudC4gQXNzdW1lIHRoYXQgaXQncyBiZWluZyBvdmVyLWNhdXRpb3VzLCBhbmQgc3dpdGNoIG5ldGxvYwogICAgIyBhbmQgcGF0aCBpZiB1cmxwYXJzZSBkZWNpZGVkIHRoZXJlIHdhcyBubyBuZXRsb2MuCiAgICBpZiBub3QgbmV0bG9jOgogICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGgsIG5ldGxvYwoKICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQoKCmRlZiBnZXRfYXV0aF9mcm9tX3VybCh1cmwpOgogICAgIiIiR2l2ZW4gYSB1cmwgd2l0aCBhdXRoZW50aWNhdGlvbiBjb21wb25lbnRzLCBleHRyYWN0IHRoZW0gaW50byBhIHR1cGxlIG9mCiAgICB1c2VybmFtZSxwYXNzd29yZC4KCiAgICA6cnR5cGU6IChzdHIsc3RyKQogICAgIiIiCiAgICBwYXJzZWQgPSB1cmxwYXJzZSh1cmwpCgogICAgdHJ5OgogICAgICAgIGF1dGggPSAodW5xdW90ZShwYXJzZWQudXNlcm5hbWUpLCB1bnF1b3RlKHBhcnNlZC5wYXNzd29yZCkpCiAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIGF1dGggPSAoJycsICcnKQoKICAgIHJldHVybiBhdXRoCgoKIyBNb3ZlZCBvdXRzaWRlIG9mIGZ1bmN0aW9uIHRvIGF2b2lkIHJlY29tcGlsZSBldmVyeSBjYWxsCl9DTEVBTl9IRUFERVJfUkVHRVhfQllURSA9IHJlLmNvbXBpbGUoYideXFxTW15cXHJcXG5dKiR8XiQnKQpfQ0xFQU5fSEVBREVSX1JFR0VYX1NUUiA9IHJlLmNvbXBpbGUocideXFNbXlxyXG5dKiR8XiQnKQoKCmRlZiBjaGVja19oZWFkZXJfdmFsaWRpdHkoaGVhZGVyKToKICAgICIiIlZlcmlmaWVzIHRoYXQgaGVhZGVyIHZhbHVlIGlzIGEgc3RyaW5nIHdoaWNoIGRvZXNuJ3QgY29udGFpbgogICAgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHJldHVybiBjaGFyYWN0ZXJzLiBUaGlzIHByZXZlbnRzIHVuaW50ZW5kZWQKICAgIGhlYWRlciBpbmplY3Rpb24uCgogICAgOnBhcmFtIGhlYWRlcjogdHVwbGUsIGluIHRoZSBmb3JtYXQgKG5hbWUsIHZhbHVlKS4KICAgICIiIgogICAgbmFtZSwgdmFsdWUgPSBoZWFkZXIKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CiAgICAgICAgcGF0ID0gX0NMRUFOX0hFQURFUl9SRUdFWF9CWVRFCiAgICBlbHNlOgogICAgICAgIHBhdCA9IF9DTEVBTl9IRUFERVJfUkVHRVhfU1RSCiAgICB0cnk6CiAgICAgICAgaWYgbm90IHBhdC5tYXRjaCh2YWx1ZSk6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIkludmFsaWQgcmV0dXJuIGNoYXJhY3RlciBvciBsZWFkaW5nIHNwYWNlIGluIGhlYWRlcjogJXMiICUgbmFtZSkKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiVmFsdWUgZm9yIGhlYWRlciB7JXM6ICVzfSBtdXN0IGJlIG9mIHR5cGUgc3RyIG9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcywgbm90ICVzIiAlIChuYW1lLCB2YWx1ZSwgdHlwZSh2YWx1ZSkpKQoKCmRlZiB1cmxkZWZyYWdhdXRoKHVybCk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsIHJlbW92ZSB0aGUgZnJhZ21lbnQgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBwYXJ0LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlKHVybCkKCiAgICAjIHNlZSBmdW5jOmBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWRgCiAgICBpZiBub3QgbmV0bG9jOgogICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGgsIG5ldGxvYwoKICAgIG5ldGxvYyA9IG5ldGxvYy5yc3BsaXQoJ0AnLCAxKVstMV0KCiAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksICcnKSkKCgpkZWYgcmV3aW5kX2JvZHkocHJlcGFyZWRfcmVxdWVzdCk6CiAgICAiIiJNb3ZlIGZpbGUgcG9pbnRlciBiYWNrIHRvIGl0cyByZWNvcmRlZCBzdGFydGluZyBwb3NpdGlvbgogICAgc28gaXQgY2FuIGJlIHJlYWQgYWdhaW4gb24gcmVkaXJlY3QuCiAgICAiIiIKICAgIGJvZHlfc2VlayA9IGdldGF0dHIocHJlcGFyZWRfcmVxdWVzdC5ib2R5LCAnc2VlaycsIE5vbmUpCiAgICBpZiBib2R5X3NlZWsgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UocHJlcGFyZWRfcmVxdWVzdC5fYm9keV9wb3NpdGlvbiwgaW50ZWdlcl90eXBlcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBib2R5X3NlZWsocHJlcGFyZWRfcmVxdWVzdC5fYm9keV9wb3NpdGlvbikKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmV3aW5kaW5nIHJlcXVlc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZHkgZm9yIHJlZGlyZWN0LiIpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiVW5hYmxlIHRvIHJld2luZCByZXF1ZXN0IGJvZHkgZm9yIHJlZGlyZWN0LiIpClBLAwQUAAAAAAAAACEAIXu8CvQmAAD0JgAAJwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXRyeWluZy5weSMjIENvcHlyaWdodCAyMDEzLTIwMTQgUmF5IEhvbGRlcgojIwojIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIyMKIyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMjCiMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgppbXBvcnQgcmFuZG9tCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeAppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmltcG9ydCB0cmFjZWJhY2sKCgojIHN5cy5tYXhpbnQgLyAyLCBzaW5jZSBQeXRob24gMy4yIGRvZXNuJ3QgaGF2ZSBhIHN5cy5tYXhpbnQuLi4KTUFYX1dBSVQgPSAxMDczNzQxODIzCgoKZGVmIHJldHJ5KCpkYXJncywgKipka3cpOgogICAgIiIiCiAgICBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBpbnN0YW50aWF0ZXMgdGhlIFJldHJ5aW5nIG9iamVjdAogICAgQHBhcmFtICpkYXJnczogcG9zaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIFJldHJ5aW5nIG9iamVjdAogICAgQHBhcmFtICoqZGt3OiBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIFJldHJ5aW5nIG9iamVjdAogICAgIiIiCiAgICAjIHN1cHBvcnQgYm90aCBAcmV0cnkgYW5kIEByZXRyeSgpIGFzIHZhbGlkIHN5bnRheAogICAgaWYgbGVuKGRhcmdzKSA9PSAxIGFuZCBjYWxsYWJsZShkYXJnc1swXSk6CiAgICAgICAgZGVmIHdyYXBfc2ltcGxlKGYpOgoKICAgICAgICAgICAgQHNpeC53cmFwcyhmKQogICAgICAgICAgICBkZWYgd3JhcHBlZF9mKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgICAgIHJldHVybiBSZXRyeWluZygpLmNhbGwoZiwgKmFyZ3MsICoqa3cpCgogICAgICAgICAgICByZXR1cm4gd3JhcHBlZF9mCgogICAgICAgIHJldHVybiB3cmFwX3NpbXBsZShkYXJnc1swXSkKCiAgICBlbHNlOgogICAgICAgIGRlZiB3cmFwKGYpOgoKICAgICAgICAgICAgQHNpeC53cmFwcyhmKQogICAgICAgICAgICBkZWYgd3JhcHBlZF9mKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgICAgIHJldHVybiBSZXRyeWluZygqZGFyZ3MsICoqZGt3KS5jYWxsKGYsICphcmdzLCAqKmt3KQoKICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRfZgoKICAgICAgICByZXR1cm4gd3JhcAoKCmNsYXNzIFJldHJ5aW5nKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgc3RvcD1Ob25lLCB3YWl0PU5vbmUsCiAgICAgICAgICAgICAgICAgc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXI9Tm9uZSwKICAgICAgICAgICAgICAgICBzdG9wX21heF9kZWxheT1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZml4ZWQ9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X3JhbmRvbV9taW49Tm9uZSwgd2FpdF9yYW5kb21fbWF4PU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQ9Tm9uZSwgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50PU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyPU5vbmUsIHdhaXRfZXhwb25lbnRpYWxfbWF4PU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cnlfb25fZXhjZXB0aW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cnlfb25fcmVzdWx0PU5vbmUsCiAgICAgICAgICAgICAgICAgd3JhcF9leGNlcHRpb249RmFsc2UsCiAgICAgICAgICAgICAgICAgc3RvcF9mdW5jPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9mdW5jPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9qaXR0ZXJfbWF4PU5vbmUpOgoKICAgICAgICBzZWxmLl9zdG9wX21heF9hdHRlbXB0X251bWJlciA9IDUgaWYgc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIgaXMgTm9uZSBlbHNlIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyCiAgICAgICAgc2VsZi5fc3RvcF9tYXhfZGVsYXkgPSAxMDAgaWYgc3RvcF9tYXhfZGVsYXkgaXMgTm9uZSBlbHNlIHN0b3BfbWF4X2RlbGF5CiAgICAgICAgc2VsZi5fd2FpdF9maXhlZCA9IDEwMDAgaWYgd2FpdF9maXhlZCBpcyBOb25lIGVsc2Ugd2FpdF9maXhlZAogICAgICAgIHNlbGYuX3dhaXRfcmFuZG9tX21pbiA9IDAgaWYgd2FpdF9yYW5kb21fbWluIGlzIE5vbmUgZWxzZSB3YWl0X3JhbmRvbV9taW4KICAgICAgICBzZWxmLl93YWl0X3JhbmRvbV9tYXggPSAxMDAwIGlmIHdhaXRfcmFuZG9tX21heCBpcyBOb25lIGVsc2Ugd2FpdF9yYW5kb21fbWF4CiAgICAgICAgc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgPSAwIGlmIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0IGlzIE5vbmUgZWxzZSB3YWl0X2luY3JlbWVudGluZ19zdGFydAogICAgICAgIHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudCA9IDEwMCBpZiB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgaXMgTm9uZSBlbHNlIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudAogICAgICAgIHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciA9IDEgaWYgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyIGlzIE5vbmUgZWxzZSB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIKICAgICAgICBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heCA9IE1BWF9XQUlUIGlmIHdhaXRfZXhwb25lbnRpYWxfbWF4IGlzIE5vbmUgZWxzZSB3YWl0X2V4cG9uZW50aWFsX21heAogICAgICAgIHNlbGYuX3dhaXRfaml0dGVyX21heCA9IDAgaWYgd2FpdF9qaXR0ZXJfbWF4IGlzIE5vbmUgZWxzZSB3YWl0X2ppdHRlcl9tYXgKCiAgICAgICAgIyBUT0RPIGFkZCBjaGFpbmluZyBvZiBzdG9wIGJlaGF2aW9ycwogICAgICAgICMgc3RvcCBiZWhhdmlvcgogICAgICAgIHN0b3BfZnVuY3MgPSBbXQogICAgICAgIGlmIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdG9wX2Z1bmNzLmFwcGVuZChzZWxmLnN0b3BfYWZ0ZXJfYXR0ZW1wdCkKCiAgICAgICAgaWYgc3RvcF9tYXhfZGVsYXkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0b3BfZnVuY3MuYXBwZW5kKHNlbGYuc3RvcF9hZnRlcl9kZWxheSkKCiAgICAgICAgaWYgc3RvcF9mdW5jIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnN0b3AgPSBzdG9wX2Z1bmMKCiAgICAgICAgZWxpZiBzdG9wIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RvcCA9IGxhbWJkYSBhdHRlbXB0cywgZGVsYXk6IGFueShmKGF0dGVtcHRzLCBkZWxheSkgZm9yIGYgaW4gc3RvcF9mdW5jcykKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdG9wID0gZ2V0YXR0cihzZWxmLCBzdG9wKQoKICAgICAgICAjIFRPRE8gYWRkIGNoYWluaW5nIG9mIHdhaXQgYmVoYXZpb3JzCiAgICAgICAgIyB3YWl0IGJlaGF2aW9yCiAgICAgICAgd2FpdF9mdW5jcyA9IFtsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiAwXQogICAgICAgIGlmIHdhaXRfZml4ZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuZml4ZWRfc2xlZXApCgogICAgICAgIGlmIHdhaXRfcmFuZG9tX21pbiBpcyBub3QgTm9uZSBvciB3YWl0X3JhbmRvbV9tYXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYucmFuZG9tX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2luY3JlbWVudGluZ19zdGFydCBpcyBub3QgTm9uZSBvciB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuaW5jcmVtZW50aW5nX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgaXMgbm90IE5vbmUgb3Igd2FpdF9leHBvbmVudGlhbF9tYXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuZXhwb25lbnRpYWxfc2xlZXApCgogICAgICAgIGlmIHdhaXRfZnVuYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi53YWl0ID0gd2FpdF9mdW5jCgogICAgICAgIGVsaWYgd2FpdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhaXQgPSBsYW1iZGEgYXR0ZW1wdHMsIGRlbGF5OiBtYXgoZihhdHRlbXB0cywgZGVsYXkpIGZvciBmIGluIHdhaXRfZnVuY3MpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FpdCA9IGdldGF0dHIoc2VsZiwgd2FpdCkKCiAgICAgICAgIyByZXRyeSBvbiBleGNlcHRpb24gZmlsdGVyCiAgICAgICAgaWYgcmV0cnlfb25fZXhjZXB0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbiA9IHNlbGYuYWx3YXlzX3JlamVjdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbiA9IHJldHJ5X29uX2V4Y2VwdGlvbgoKICAgICAgICAjIFRPRE8gc2ltcGxpZnkgcmV0cnlpbmcgYnkgRXhjZXB0aW9uIHR5cGVzCiAgICAgICAgIyByZXRyeSBvbiByZXN1bHQgZmlsdGVyCiAgICAgICAgaWYgcmV0cnlfb25fcmVzdWx0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX3Jlc3VsdCA9IHNlbGYubmV2ZXJfcmVqZWN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmV0cnlfb25fcmVzdWx0ID0gcmV0cnlfb25fcmVzdWx0CgogICAgICAgIHNlbGYuX3dyYXBfZXhjZXB0aW9uID0gd3JhcF9leGNlcHRpb24KCiAgICBkZWYgc3RvcF9hZnRlcl9hdHRlbXB0KHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTdG9wIGFmdGVyIHRoZSBwcmV2aW91cyBhdHRlbXB0ID49IHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyLiIiIgogICAgICAgIHJldHVybiBwcmV2aW91c19hdHRlbXB0X251bWJlciA+PSBzZWxmLl9zdG9wX21heF9hdHRlbXB0X251bWJlcgoKICAgIGRlZiBzdG9wX2FmdGVyX2RlbGF5KHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTdG9wIGFmdGVyIHRoZSB0aW1lIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQgPj0gc3RvcF9tYXhfZGVsYXkuIiIiCiAgICAgICAgcmV0dXJuIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMgPj0gc2VsZi5fc3RvcF9tYXhfZGVsYXkKCiAgICBkZWYgbm9fc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIkRvbid0IHNsZWVwIGF0IGFsbCBiZWZvcmUgcmV0cnlpbmcuIiIiCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgZml4ZWRfc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlNsZWVwIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBlYWNoIHJldHJ5LiIiIgogICAgICAgIHJldHVybiBzZWxmLl93YWl0X2ZpeGVkCgogICAgZGVmIHJhbmRvbV9zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU2xlZXAgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB3YWl0X3JhbmRvbV9taW4gYW5kIHdhaXRfcmFuZG9tX21heCIiIgogICAgICAgIHJldHVybiByYW5kb20ucmFuZGludChzZWxmLl93YWl0X3JhbmRvbV9taW4sIHNlbGYuX3dhaXRfcmFuZG9tX21heCkKCiAgICBkZWYgaW5jcmVtZW50aW5nX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiIKICAgICAgICBTbGVlcCBhbiBpbmNyZW1lbnRhbCBhbW91bnQgb2YgdGltZSBhZnRlciBlYWNoIGF0dGVtcHQsIHN0YXJ0aW5nIGF0CiAgICAgICAgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgYW5kIGluY3JlbWVudGluZyBieSB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQKICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2luY3JlbWVudGluZ19zdGFydCArIChzZWxmLl93YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgKiAocHJldmlvdXNfYXR0ZW1wdF9udW1iZXIgLSAxKSkKICAgICAgICBpZiByZXN1bHQgPCAwOgogICAgICAgICAgICByZXN1bHQgPSAwCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBleHBvbmVudGlhbF9zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgZXhwID0gMiAqKiBwcmV2aW91c19hdHRlbXB0X251bWJlcgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciAqIGV4cAogICAgICAgIGlmIHJlc3VsdCA+IHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbWF4OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heAogICAgICAgIGlmIHJlc3VsdCA8IDA6CiAgICAgICAgICAgIHJlc3VsdCA9IDAKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIG5ldmVyX3JlamVjdChzZWxmLCByZXN1bHQpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBhbHdheXNfcmVqZWN0KHNlbGYsIHJlc3VsdCk6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2hvdWxkX3JlamVjdChzZWxmLCBhdHRlbXB0KToKICAgICAgICByZWplY3QgPSBGYWxzZQogICAgICAgIGlmIGF0dGVtcHQuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgcmVqZWN0IHw9IHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbihhdHRlbXB0LnZhbHVlWzFdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlamVjdCB8PSBzZWxmLl9yZXRyeV9vbl9yZXN1bHQoYXR0ZW1wdC52YWx1ZSkKCiAgICAgICAgcmV0dXJuIHJlamVjdAoKICAgIGRlZiBjYWxsKHNlbGYsIGZuLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN0YXJ0X3RpbWUgPSBpbnQocm91bmQodGltZS50aW1lKCkgKiAxMDAwKSkKICAgICAgICBhdHRlbXB0X251bWJlciA9IDEKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBhdHRlbXB0ID0gQXR0ZW1wdChmbigqYXJncywgKiprd2FyZ3MpLCBhdHRlbXB0X251bWJlciwgRmFsc2UpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgIGF0dGVtcHQgPSBBdHRlbXB0KHRiLCBhdHRlbXB0X251bWJlciwgVHJ1ZSkKCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNob3VsZF9yZWplY3QoYXR0ZW1wdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gYXR0ZW1wdC5nZXQoc2VsZi5fd3JhcF9leGNlcHRpb24pCgogICAgICAgICAgICBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zID0gaW50KHJvdW5kKHRpbWUudGltZSgpICogMTAwMCkpIC0gc3RhcnRfdGltZQogICAgICAgICAgICBpZiBzZWxmLnN0b3AoYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3dyYXBfZXhjZXB0aW9uIGFuZCBhdHRlbXB0Lmhhc19leGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgIyBnZXQoKSBvbiBhbiBhdHRlbXB0IHdpdGggYW4gZXhjZXB0aW9uIHNob3VsZCBjYXVzZSBpdCB0byBiZSByYWlzZWQsIGJ1dCByYWlzZSBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICByYWlzZSBhdHRlbXB0LmdldCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3IoYXR0ZW1wdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNsZWVwID0gc2VsZi53YWl0KGF0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKQogICAgICAgICAgICAgICAgaWYgc2VsZi5fd2FpdF9qaXR0ZXJfbWF4OgogICAgICAgICAgICAgICAgICAgIGppdHRlciA9IHJhbmRvbS5yYW5kb20oKSAqIHNlbGYuX3dhaXRfaml0dGVyX21heAogICAgICAgICAgICAgICAgICAgIHNsZWVwID0gc2xlZXAgKyBtYXgoMCwgaml0dGVyKQogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcCAvIDEwMDAuMCkKCiAgICAgICAgICAgIGF0dGVtcHRfbnVtYmVyICs9IDEKCgpjbGFzcyBBdHRlbXB0KG9iamVjdCk6CiAgICAiIiIKICAgIEFuIEF0dGVtcHQgZW5jYXBzdWxhdGVzIGEgY2FsbCB0byBhIHRhcmdldCBmdW5jdGlvbiB0aGF0IG1heSBlbmQgYXMgYQogICAgbm9ybWFsIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBvciBhbiBFeGNlcHRpb24gZGVwZW5kaW5nIG9uIHdoYXQKICAgIG9jY3VycmVkIGR1cmluZyB0aGUgZXhlY3V0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlLCBhdHRlbXB0X251bWJlciwgaGFzX2V4Y2VwdGlvbik6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgc2VsZi5hdHRlbXB0X251bWJlciA9IGF0dGVtcHRfbnVtYmVyCiAgICAgICAgc2VsZi5oYXNfZXhjZXB0aW9uID0gaGFzX2V4Y2VwdGlvbgoKICAgIGRlZiBnZXQoc2VsZiwgd3JhcF9leGNlcHRpb249RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgQXR0ZW1wdCBpbnN0YW5jZSBvciByYWlzZSBhbiBFeGNlcHRpb24uCiAgICAgICAgSWYgd3JhcF9leGNlcHRpb24gaXMgdHJ1ZSwgdGhpcyBBdHRlbXB0IGlzIHdyYXBwZWQgaW5zaWRlIG9mIGEKICAgICAgICBSZXRyeUVycm9yIGJlZm9yZSBiZWluZyByYWlzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICBpZiB3cmFwX2V4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3Ioc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpeC5yZXJhaXNlKHNlbGYudmFsdWVbMF0sIHNlbGYudmFsdWVbMV0sIHNlbGYudmFsdWVbMl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gIkF0dGVtcHRzOiB7MH0sIEVycm9yOlxuezF9Ii5mb3JtYXQoc2VsZi5hdHRlbXB0X251bWJlciwgIiIuam9pbih0cmFjZWJhY2suZm9ybWF0X3RiKHNlbGYudmFsdWVbMl0pKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIkF0dGVtcHRzOiB7MH0sIFZhbHVlOiB7MX0iLmZvcm1hdChzZWxmLmF0dGVtcHRfbnVtYmVyLCBzZWxmLnZhbHVlKQoKCmNsYXNzIFJldHJ5RXJyb3IoRXhjZXB0aW9uKToKICAgICIiIgogICAgQSBSZXRyeUVycm9yIGVuY2Fwc3VsYXRlcyB0aGUgbGFzdCBBdHRlbXB0IGluc3RhbmNlIHJpZ2h0IGJlZm9yZSBnaXZpbmcgdXAuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFzdF9hdHRlbXB0KToKICAgICAgICBzZWxmLmxhc3RfYXR0ZW1wdCA9IGxhc3RfYXR0ZW1wdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiUmV0cnlFcnJvclt7MH1dIi5mb3JtYXQoc2VsZi5sYXN0X2F0dGVtcHQpClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAIgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEAkj71hyULAAAlCwAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5IiIiCnVybGxpYjMgLSBUaHJlYWQtc2FmZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHJlLXVzaW5nLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuY29ubmVjdGlvbnBvb2wgaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uUG9vbCwKICAgIEhUVFBTQ29ubmVjdGlvblBvb2wsCiAgICBjb25uZWN0aW9uX2Zyb21fdXJsCikKCmZyb20gLiBpbXBvcnQgZXhjZXB0aW9ucwpmcm9tIC5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIC5wb29sbWFuYWdlciBpbXBvcnQgUG9vbE1hbmFnZXIsIFByb3h5TWFuYWdlciwgcHJveHlfZnJvbV91cmwKZnJvbSAucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIC51dGlsLnJlcXVlc3QgaW1wb3J0IG1ha2VfaGVhZGVycwpmcm9tIC51dGlsLnVybCBpbXBvcnQgZ2V0X2hvc3QKZnJvbSAudXRpbC50aW1lb3V0IGltcG9ydCBUaW1lb3V0CmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CgoKIyBTZXQgZGVmYXVsdCBsb2dnaW5nIGhhbmRsZXIgdG8gYXZvaWQgIk5vIGhhbmRsZXIgZm91bmQiIHdhcm5pbmdzLgppbXBvcnQgbG9nZ2luZwp0cnk6ICAjIFB5dGhvbiAyLjcrCiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgICAgcGFzcwoKX19hdXRob3JfXyA9ICdBbmRyZXkgUGV0cm92IChhbmRyZXkucGV0cm92QHNoYXpvdy5uZXQpJwpfX2xpY2Vuc2VfXyA9ICdNSVQnCl9fdmVyc2lvbl9fID0gJzEuMjInCgpfX2FsbF9fID0gKAogICAgJ0hUVFBDb25uZWN0aW9uUG9vbCcsCiAgICAnSFRUUFNDb25uZWN0aW9uUG9vbCcsCiAgICAnUG9vbE1hbmFnZXInLAogICAgJ1Byb3h5TWFuYWdlcicsCiAgICAnSFRUUFJlc3BvbnNlJywKICAgICdSZXRyeScsCiAgICAnVGltZW91dCcsCiAgICAnYWRkX3N0ZGVycl9sb2dnZXInLAogICAgJ2Nvbm5lY3Rpb25fZnJvbV91cmwnLAogICAgJ2Rpc2FibGVfd2FybmluZ3MnLAogICAgJ2VuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEnLAogICAgJ2dldF9ob3N0JywKICAgICdtYWtlX2hlYWRlcnMnLAogICAgJ3Byb3h5X2Zyb21fdXJsJywKKQoKbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKCgpkZWYgYWRkX3N0ZGVycl9sb2dnZXIobGV2ZWw9bG9nZ2luZy5ERUJVRyk6CiAgICAiIiIKICAgIEhlbHBlciBmb3IgcXVpY2tseSBhZGRpbmcgYSBTdHJlYW1IYW5kbGVyIHRvIHRoZSBsb2dnZXIuIFVzZWZ1bCBmb3IKICAgIGRlYnVnZ2luZy4KCiAgICBSZXR1cm5zIHRoZSBoYW5kbGVyIGFmdGVyIGFkZGluZyBpdC4KICAgICIiIgogICAgIyBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbiB0aGlzIF9faW5pdF9fLnB5IHRvIGdldCB0aGUgX19uYW1lX18gY29ycmVjdAogICAgIyBldmVuIGlmIHVybGxpYjMgaXMgdmVuZG9yZWQgd2l0aGluIGFub3RoZXIgcGFja2FnZS4KICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCiAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcignJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpcyAlKG1lc3NhZ2UpcycpKQogICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKICAgIGxvZ2dlci5zZXRMZXZlbChsZXZlbCkKICAgIGxvZ2dlci5kZWJ1ZygnQWRkZWQgYSBzdGRlcnIgbG9nZ2luZyBoYW5kbGVyIHRvIGxvZ2dlcjogJXMnLCBfX25hbWVfXykKICAgIHJldHVybiBoYW5kbGVyCgoKIyAuLi4gQ2xlYW4gdXAuCmRlbCBOdWxsSGFuZGxlcgoKCiMgQWxsIHdhcm5pbmcgZmlsdGVycyAqbXVzdCogYmUgYXBwZW5kZWQgdW5sZXNzIHlvdSdyZSByZWFsbHkgY2VydGFpbiB0aGF0IHRoZXkKIyBzaG91bGRuJ3QgYmU6IG90aGVyd2lzZSwgaXQncyB2ZXJ5IGhhcmQgZm9yIHVzZXJzIHRvIHVzZSBtb3N0IFB5dGhvbgojIG1lY2hhbmlzbXMgdG8gc2lsZW5jZSB0aGVtLgojIFNlY3VyaXR5V2FybmluZydzIGFsd2F5cyBnbyBvZmYgYnkgZGVmYXVsdC4Kd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnLCBleGNlcHRpb25zLlNlY3VyaXR5V2FybmluZywgYXBwZW5kPVRydWUpCiMgU3ViamVjdEFsdE5hbWVXYXJuaW5nJ3Mgc2hvdWxkIGdvIG9mZiBvbmNlIHBlciBob3N0Cndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuU3ViamVjdEFsdE5hbWVXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKIyBJbnNlY3VyZVBsYXRmb3JtV2FybmluZydzIGRvbid0IHZhcnkgYmV0d2VlbiByZXF1ZXN0cywgc28gd2Uga2VlcCBpdCBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBleGNlcHRpb25zLkluc2VjdXJlUGxhdGZvcm1XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPVRydWUpCiMgU05JTWlzc2luZ1dhcm5pbmdzIHNob3VsZCBnbyBvZmYgb25seSBvbmNlLgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBleGNlcHRpb25zLlNOSU1pc3NpbmdXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgpkZWYgZGlzYWJsZV93YXJuaW5ncyhjYXRlZ29yeT1leGNlcHRpb25zLkhUVFBXYXJuaW5nKToKICAgICIiIgogICAgSGVscGVyIGZvciBxdWlja2x5IGRpc2FibGluZyBhbGwgdXJsbGliMyB3YXJuaW5ncy4KICAgICIiIgogICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBjYXRlZ29yeSkKUEsDBBQAAAAAAAAAIQAAGdOU3CcAANwnAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX2NvbGxlY3Rpb25zLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcKdHJ5OgogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE5vIHRocmVhZHMgYXZhaWxhYmxlCiAgICBjbGFzcyBSTG9jazoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgICAgICBwYXNzCgoKdHJ5OiAgIyBQeXRob24gMi43KwogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSAucGFja2FnZXMub3JkZXJlZF9kaWN0IGltcG9ydCBPcmRlcmVkRGljdApmcm9tIC5wYWNrYWdlcy5zaXggaW1wb3J0IGl0ZXJrZXlzLCBpdGVydmFsdWVzLCBQWTMKCgpfX2FsbF9fID0gWydSZWNlbnRseVVzZWRDb250YWluZXInLCAnSFRUUEhlYWRlckRpY3QnXQoKCl9OdWxsID0gb2JqZWN0KCkKCgpjbGFzcyBSZWNlbnRseVVzZWRDb250YWluZXIoTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiCiAgICBQcm92aWRlcyBhIHRocmVhZC1zYWZlIGRpY3QtbGlrZSBjb250YWluZXIgd2hpY2ggbWFpbnRhaW5zIHVwIHRvCiAgICBgYG1heHNpemVgYCBrZXlzIHdoaWxlIHRocm93aW5nIGF3YXkgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQga2V5cyBiZXlvbmQKICAgIGBgbWF4c2l6ZWBgLgoKICAgIDpwYXJhbSBtYXhzaXplOgogICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHJlY2VudCBlbGVtZW50cyB0byByZXRhaW4uCgogICAgOnBhcmFtIGRpc3Bvc2VfZnVuYzoKICAgICAgICBFdmVyeSB0aW1lIGFuIGl0ZW0gaXMgZXZpY3RlZCBmcm9tIHRoZSBjb250YWluZXIsCiAgICAgICAgYGBkaXNwb3NlX2Z1bmModmFsdWUpYGAgaXMgY2FsbGVkLiAgQ2FsbGJhY2sgd2hpY2ggd2lsbCBnZXQgY2FsbGVkCiAgICAiIiIKCiAgICBDb250YWluZXJDbHMgPSBPcmRlcmVkRGljdAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTEwLCBkaXNwb3NlX2Z1bmM9Tm9uZSk6CiAgICAgICAgc2VsZi5fbWF4c2l6ZSA9IG1heHNpemUKICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyA9IGRpc3Bvc2VfZnVuYwoKICAgICAgICBzZWxmLl9jb250YWluZXIgPSBzZWxmLkNvbnRhaW5lckNscygpCiAgICAgICAgc2VsZi5sb2NrID0gUkxvY2soKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICMgUmUtaW5zZXJ0IHRoZSBpdGVtLCBtb3ZpbmcgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZXZpY3Rpb24gbGluZS4KICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2NvbnRhaW5lci5wb3Aoa2V5KQogICAgICAgICAgICBzZWxmLl9jb250YWluZXJba2V5XSA9IGl0ZW0KICAgICAgICAgICAgcmV0dXJuIGl0ZW0KCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgZXZpY3RlZF92YWx1ZSA9IF9OdWxsCiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICMgUG9zc2libHkgZXZpY3QgdGhlIGV4aXN0aW5nIHZhbHVlIG9mICdrZXknCiAgICAgICAgICAgIGV2aWN0ZWRfdmFsdWUgPSBzZWxmLl9jb250YWluZXIuZ2V0KGtleSwgX051bGwpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXldID0gdmFsdWUKCiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IGV2aWN0IGFuIGV4aXN0aW5nIHZhbHVlLCB3ZSBtaWdodCBoYXZlIHRvIGV2aWN0IHRoZQogICAgICAgICAgICAjIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5lci4KICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2NvbnRhaW5lcikgPiBzZWxmLl9tYXhzaXplOgogICAgICAgICAgICAgICAgX2tleSwgZXZpY3RlZF92YWx1ZSA9IHNlbGYuX2NvbnRhaW5lci5wb3BpdGVtKGxhc3Q9RmFsc2UpCgogICAgICAgIGlmIHNlbGYuZGlzcG9zZV9mdW5jIGFuZCBldmljdGVkX3ZhbHVlIGlzIG5vdCBfTnVsbDoKICAgICAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmMoZXZpY3RlZF92YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9jb250YWluZXIucG9wKGtleSkKCiAgICAgICAgaWYgc2VsZi5kaXNwb3NlX2Z1bmM6CiAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKHZhbHVlKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NvbnRhaW5lcikKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignSXRlcmF0aW9uIG92ZXIgdGhpcyBjbGFzcyBpcyB1bmxpa2VseSB0byBiZSB0aHJlYWRzYWZlLicpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICAjIENvcHkgcG9pbnRlcnMgdG8gYWxsIHZhbHVlcywgdGhlbiB3aXBlIHRoZSBtYXBwaW5nCiAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoaXRlcnZhbHVlcyhzZWxmLl9jb250YWluZXIpKQogICAgICAgICAgICBzZWxmLl9jb250YWluZXIuY2xlYXIoKQoKICAgICAgICBpZiBzZWxmLmRpc3Bvc2VfZnVuYzoKICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKICAgICAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKHZhbHVlKQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICByZXR1cm4gbGlzdChpdGVya2V5cyhzZWxmLl9jb250YWluZXIpKQoKCmNsYXNzIEhUVFBIZWFkZXJEaWN0KE11dGFibGVNYXBwaW5nKToKICAgICIiIgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgQW4gaXRlcmFibGUgb2YgZmllbGQtdmFsdWUgcGFpcnMuIE11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZmllbGQgbmFtZXMKICAgICAgICB3aGVuIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseS4KCiAgICA6cGFyYW0ga3dhcmdzOgogICAgICAgIEFkZGl0aW9uYWwgZmllbGQtdmFsdWUgcGFpcnMgdG8gcGFzcyBpbiB0byBgYGRpY3QudXBkYXRlYGAuCgogICAgQSBgYGRpY3RgYCBsaWtlIGNvbnRhaW5lciBmb3Igc3RvcmluZyBIVFRQIEhlYWRlcnMuCgogICAgRmllbGQgbmFtZXMgYXJlIHN0b3JlZCBhbmQgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgUkZDIDcyMzAuIEl0ZXJhdGlvbiBwcm92aWRlcyB0aGUgZmlyc3QgY2FzZS1zZW5zaXRpdmUga2V5IHNlZW4gZm9yIGVhY2gKICAgIGNhc2UtaW5zZW5zaXRpdmUgcGFpci4KCiAgICBVc2luZyBgYF9fc2V0aXRlbV9fYGAgc3ludGF4IG92ZXJ3cml0ZXMgZmllbGRzIHRoYXQgY29tcGFyZSBlcXVhbAogICAgY2FzZS1pbnNlbnNpdGl2ZWx5IGluIG9yZGVyIHRvIG1haW50YWluIGBgZGljdGBgJ3MgYXBpLiBGb3IgZmllbGRzIHRoYXQKICAgIGNvbXBhcmUgZXF1YWwsIGluc3RlYWQgY3JlYXRlIGEgbmV3IGBgSFRUUEhlYWRlckRpY3RgYCBhbmQgdXNlIGBgLmFkZGBgCiAgICBpbiBhIGxvb3AuCgogICAgSWYgbXVsdGlwbGUgZmllbGRzIHRoYXQgYXJlIGVxdWFsIGNhc2UtaW5zZW5zaXRpdmVseSBhcmUgcGFzc2VkIHRvIHRoZQogICAgY29uc3RydWN0b3Igb3IgYGAudXBkYXRlYGAsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgYW5kIHNvbWUgd2lsbCBiZQogICAgbG9zdC4KCiAgICA+Pj4gaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KCkKICAgID4+PiBoZWFkZXJzLmFkZCgnU2V0LUNvb2tpZScsICdmb289YmFyJykKICAgID4+PiBoZWFkZXJzLmFkZCgnc2V0LWNvb2tpZScsICdiYXo9cXV4eCcpCiAgICA+Pj4gaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9ICc3JwogICAgPj4+IGhlYWRlcnNbJ1NFVC1jb29raWUnXQogICAgJ2Zvbz1iYXIsIGJhej1xdXh4JwogICAgPj4+IGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10KICAgICc3JwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKEhUVFBIZWFkZXJEaWN0LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gT3JkZXJlZERpY3QoKQogICAgICAgIGlmIGhlYWRlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaGVhZGVycywgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICAgICAgc2VsZi5fY29weV9mcm9tKGhlYWRlcnMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmV4dGVuZChoZWFkZXJzKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgc2VsZi5leHRlbmQoa3dhcmdzKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXSA9IFtrZXksIHZhbF0KICAgICAgICByZXR1cm4gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbCA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICByZXR1cm4gJywgJy5qb2luKHZhbFsxOl0pCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgZGVsIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleS5sb3dlcigpIGluIHNlbGYuX2NvbnRhaW5lcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKSBhbmQgbm90IGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCB0eXBlKHNlbGYpKToKICAgICAgICAgICAgb3RoZXIgPSB0eXBlKHNlbGYpKG90aGVyKQogICAgICAgIHJldHVybiAoZGljdCgoay5sb3dlcigpLCB2KSBmb3IgaywgdiBpbiBzZWxmLml0ZXJtZXJnZWQoKSkgPT0KICAgICAgICAgICAgICAgIGRpY3QoKGsubG93ZXIoKSwgdikgZm9yIGssIHYgaW4gb3RoZXIuaXRlcm1lcmdlZCgpKSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGlmIG5vdCBQWTM6ICAjIFB5dGhvbiAyCiAgICAgICAgaXRlcmtleXMgPSBNdXRhYmxlTWFwcGluZy5pdGVya2V5cwogICAgICAgIGl0ZXJ2YWx1ZXMgPSBNdXRhYmxlTWFwcGluZy5pdGVydmFsdWVzCgogICAgX19tYXJrZXIgPSBvYmplY3QoKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fY29udGFpbmVyKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAjIE9ubHkgcHJvdmlkZSB0aGUgb3JpZ2luYWxseSBjYXNlZCBuYW1lcwogICAgICAgIGZvciB2YWxzIGluIHNlbGYuX2NvbnRhaW5lci52YWx1ZXMoKToKICAgICAgICAgICAgeWllbGQgdmFsc1swXQoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAnJydELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCiAgICAgICAgJycnCiAgICAgICAgIyBVc2luZyB0aGUgTXV0YWJsZU1hcHBpbmcgZnVuY3Rpb24gZGlyZWN0bHkgZmFpbHMgZHVlIHRvIHRoZSBwcml2YXRlIG1hcmtlci4KICAgICAgICAjIFVzaW5nIG9yZGluYXJ5IGRpY3QucG9wIHdvdWxkIGV4cG9zZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcy4KICAgICAgICAjIFNvIGxldCdzIHJlaW52ZW50IHRoZSB3aGVlbC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIGRpc2NhcmQoc2VsZiwga2V5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgYWRkKHNlbGYsIGtleSwgdmFsKToKICAgICAgICAiIiJBZGRzIGEgKG5hbWUsIHZhbHVlKSBwYWlyLCBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUgdmFsdWUgaWYgaXQgYWxyZWFkeQogICAgICAgIGV4aXN0cy4KCiAgICAgICAgPj4+IGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChmb289J2JhcicpCiAgICAgICAgPj4+IGhlYWRlcnMuYWRkKCdGb28nLCAnYmF6JykKICAgICAgICA+Pj4gaGVhZGVyc1snZm9vJ10KICAgICAgICAnYmFyLCBiYXonCiAgICAgICAgIiIiCiAgICAgICAga2V5X2xvd2VyID0ga2V5Lmxvd2VyKCkKICAgICAgICBuZXdfdmFscyA9IFtrZXksIHZhbF0KICAgICAgICAjIEtlZXAgdGhlIGNvbW1vbiBjYXNlIGFrYSBubyBpdGVtIHByZXNlbnQgYXMgZmFzdCBhcyBwb3NzaWJsZQogICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXIuc2V0ZGVmYXVsdChrZXlfbG93ZXIsIG5ld192YWxzKQogICAgICAgIGlmIG5ld192YWxzIGlzIG5vdCB2YWxzOgogICAgICAgICAgICB2YWxzLmFwcGVuZCh2YWwpCgogICAgZGVmIGV4dGVuZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkdlbmVyaWMgaW1wb3J0IGZ1bmN0aW9uIGZvciBhbnkgdHlwZSBvZiBoZWFkZXItbGlrZSBvYmplY3QuCiAgICAgICAgQWRhcHRlZCB2ZXJzaW9uIG9mIE11dGFibGVNYXBwaW5nLnVwZGF0ZSBpbiBvcmRlciB0byBpbnNlcnQgaXRlbXMKICAgICAgICB3aXRoIHNlbGYuYWRkIGluc3RlYWQgb2Ygc2VsZi5fX3NldGl0ZW1fXwogICAgICAgICIiIgogICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXh0ZW5kKCkgdGFrZXMgYXQgbW9zdCAxIHBvc2l0aW9uYWwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoezB9IGdpdmVuKSIuZm9ybWF0KGxlbihhcmdzKSkpCiAgICAgICAgb3RoZXIgPSBhcmdzWzBdIGlmIGxlbihhcmdzKSA+PSAxIGVsc2UgKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gb3RoZXIuaXRlcml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIHZhbCkKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCBvdGhlcltrZXldKQogICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgImtleXMiKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIG90aGVyW2tleV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIHZhbHVlKQoKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2FyZ3MuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWx1ZSkKCiAgICBkZWYgZ2V0bGlzdChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICIiIlJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgbmFtZWQgZmllbGQuIFJldHVybnMgYW4KICAgICAgICBlbXB0eSBsaXN0IGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdC4iIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdmFsc1sxOl0KCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwbGliCiAgICBnZXRoZWFkZXJzID0gZ2V0bGlzdAogICAgZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzID0gZ2V0bGlzdAogICAgaWdldCA9IGdldGxpc3QKCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwLmNvb2tpZWphcgogICAgZ2V0X2FsbCA9IGdldGxpc3QKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHR5cGUoc2VsZikuX19uYW1lX18sIGRpY3Qoc2VsZi5pdGVybWVyZ2VkKCkpKQoKICAgIGRlZiBfY29weV9mcm9tKHNlbGYsIG90aGVyKToKICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICB2YWwgPSBvdGhlci5nZXRsaXN0KGtleSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpOgogICAgICAgICAgICAgICAgIyBEb24ndCBuZWVkIHRvIGNvbnZlcnQgdHVwbGVzCiAgICAgICAgICAgICAgICB2YWwgPSBsaXN0KHZhbCkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXSA9IFtrZXldICsgdmFsCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgY2xvbmUgPSB0eXBlKHNlbGYpKCkKICAgICAgICBjbG9uZS5fY29weV9mcm9tKHNlbGYpCiAgICAgICAgcmV0dXJuIGNsb25lCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAiIiJJdGVyYXRlIG92ZXIgYWxsIGhlYWRlciBsaW5lcywgaW5jbHVkaW5nIGR1cGxpY2F0ZSBvbmVzLiIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgdmFscyA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICAgICAgZm9yIHZhbCBpbiB2YWxzWzE6XToKICAgICAgICAgICAgICAgIHlpZWxkIHZhbHNbMF0sIHZhbAoKICAgIGRlZiBpdGVybWVyZ2VkKHNlbGYpOgogICAgICAgICIiIkl0ZXJhdGUgb3ZlciBhbGwgaGVhZGVycywgbWVyZ2luZyBkdXBsaWNhdGUgb25lcyB0b2dldGhlci4iIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHZhbCA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICAgICAgeWllbGQgdmFsWzBdLCAnLCAnLmpvaW4odmFsWzE6XSkKCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2h0dHBsaWIoY2xzLCBtZXNzYWdlKTogICMgUHl0aG9uIDIKICAgICAgICAiIiJSZWFkIGhlYWRlcnMgZnJvbSBhIFB5dGhvbiAyIGh0dHBsaWIgbWVzc2FnZSBvYmplY3QuIiIiCiAgICAgICAgIyBweXRob24yLjcgZG9lcyBub3QgZXhwb3NlIGEgcHJvcGVyIEFQSSBmb3IgZXhwb3J0aW5nIG11bHRpaGVhZGVycwogICAgICAgICMgZWZmaWNpZW50bHkuIFRoaXMgZnVuY3Rpb24gcmUtcmVhZHMgcmF3IGxpbmVzIGZyb20gdGhlIG1lc3NhZ2UKICAgICAgICAjIG9iamVjdCBhbmQgZXh0cmFjdHMgdGhlIG11bHRpaGVhZGVycyBwcm9wZXJseS4KICAgICAgICBoZWFkZXJzID0gW10KCiAgICAgICAgZm9yIGxpbmUgaW4gbWVzc2FnZS5oZWFkZXJzOgogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoKCcgJywgJ1x0JykpOgogICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGhlYWRlcnNbLTFdCiAgICAgICAgICAgICAgICBoZWFkZXJzWy0xXSA9IChrZXksIHZhbHVlICsgJ1xyXG4nICsgbGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKChrZXksIHZhbHVlLnN0cmlwKCkpKQoKICAgICAgICByZXR1cm4gY2xzKGhlYWRlcnMpClBLAwQUAAAAAAAAACEAYISup8syAADLMgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHNvY2tldApmcm9tIHNvY2tldCBpbXBvcnQgZXJyb3IgYXMgU29ja2V0RXJyb3IsIHRpbWVvdXQgYXMgU29ja2V0VGltZW91dAppbXBvcnQgd2FybmluZ3MKZnJvbSAucGFja2FnZXMgaW1wb3J0IHNpeApmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0IEhUVFBDb25uZWN0aW9uIGFzIF9IVFRQQ29ubmVjdGlvbgpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0IEhUVFBFeGNlcHRpb24gICMgbm9xYTogRjQwMQoKdHJ5OiAgIyBDb21waWxlZCB3aXRoIFNTTD8KICAgIGltcG9ydCBzc2wKICAgIEJhc2VTU0xFcnJvciA9IHNzbC5TU0xFcnJvcgpleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBObyBTU0wuCiAgICBzc2wgPSBOb25lCgogICAgY2xhc3MgQmFzZVNTTEVycm9yKEJhc2VFeGNlcHRpb24pOgogICAgICAgIHBhc3MKCgp0cnk6ICAjIFB5dGhvbiAzOgogICAgIyBOb3QgYSBuby1vcCwgd2UncmUgYWRkaW5nIHRoaXMgdG8gdGhlIG5hbWVzcGFjZSBzbyBpdCBjYW4gYmUgaW1wb3J0ZWQuCiAgICBDb25uZWN0aW9uRXJyb3IgPSBDb25uZWN0aW9uRXJyb3IKZXhjZXB0IE5hbWVFcnJvcjogICMgUHl0aG9uIDI6CiAgICBjbGFzcyBDb25uZWN0aW9uRXJyb3IoRXhjZXB0aW9uKToKICAgICAgICBwYXNzCgoKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgTmV3Q29ubmVjdGlvbkVycm9yLAogICAgQ29ubmVjdFRpbWVvdXRFcnJvciwKICAgIFN1YmplY3RBbHROYW1lV2FybmluZywKICAgIFN5c3RlbVRpbWVXYXJuaW5nLAopCmZyb20gLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUsIENlcnRpZmljYXRlRXJyb3IKCmZyb20gLnV0aWwuc3NsXyBpbXBvcnQgKAogICAgcmVzb2x2ZV9jZXJ0X3JlcXMsCiAgICByZXNvbHZlX3NzbF92ZXJzaW9uLAogICAgYXNzZXJ0X2ZpbmdlcnByaW50LAogICAgY3JlYXRlX3VybGxpYjNfY29udGV4dCwKICAgIHNzbF93cmFwX3NvY2tldAopCgoKZnJvbSAudXRpbCBpbXBvcnQgY29ubmVjdGlvbgoKZnJvbSAuX2NvbGxlY3Rpb25zIGltcG9ydCBIVFRQSGVhZGVyRGljdAoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpwb3J0X2J5X3NjaGVtZSA9IHsKICAgICdodHRwJzogODAsCiAgICAnaHR0cHMnOiA0NDMsCn0KCiMgV2hlbiB1cGRhdGluZyBSRUNFTlRfREFURSwgbW92ZSBpdCB0bwojIHdpdGhpbiB0d28geWVhcnMgb2YgdGhlIGN1cnJlbnQgZGF0ZSwgYW5kIG5vCiMgZWFybGllciB0aGFuIDYgbW9udGhzIGFnby4KUkVDRU5UX0RBVEUgPSBkYXRldGltZS5kYXRlKDIwMTYsIDEsIDEpCgoKY2xhc3MgRHVtbXlDb25uZWN0aW9uKG9iamVjdCk6CiAgICAiIiJVc2VkIHRvIGRldGVjdCBhIGZhaWxlZCBDb25uZWN0aW9uQ2xzIGltcG9ydC4iIiIKICAgIHBhc3MKCgpjbGFzcyBIVFRQQ29ubmVjdGlvbihfSFRUUENvbm5lY3Rpb24sIG9iamVjdCk6CiAgICAiIiIKICAgIEJhc2VkIG9uIGh0dHBsaWIuSFRUUENvbm5lY3Rpb24gYnV0IHByb3ZpZGVzIGFuIGV4dHJhIGNvbnN0cnVjdG9yCiAgICBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBsYXllciBiZXR3ZWVuIG9sZGVyIGFuZCBuZXdlciBQeXRob25zLgoKICAgIEFkZGl0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBhdHRyaWJ1dGVzIG9mIHRoZSBjb25uZWN0aW9uLgogICAgQWNjZXB0ZWQgcGFyYW1ldGVycyBpbmNsdWRlOgoKICAgICAgLSBgYHN0cmljdGBgOiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbGAKICAgICAgLSBgYHNvdXJjZV9hZGRyZXNzYGA6IFNldCB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uCgogICAgICAgIC4uIG5vdGU6OiBUaGlzIGlzIGlnbm9yZWQgZm9yIFB5dGhvbiAyLjYuIEl0IGlzIG9ubHkgYXBwbGllZCBmb3IgMi43IGFuZCAzLngKCiAgICAgIC0gYGBzb2NrZXRfb3B0aW9uc2BgOiBTZXQgc3BlY2lmaWMgb3B0aW9ucyBvbiB0aGUgdW5kZXJseWluZyBzb2NrZXQuIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4KICAgICAgICBkZWZhdWx0cyBhcmUgbG9hZGVkIGZyb20gYGBIVFRQQ29ubmVjdGlvbi5kZWZhdWx0X3NvY2tldF9vcHRpb25zYGAgd2hpY2ggaW5jbHVkZXMgZGlzYWJsaW5nCiAgICAgICAgTmFnbGUncyBhbGdvcml0aG0gKHNldHMgVENQX05PREVMQVkgdG8gMSkgdW5sZXNzIHRoZSBjb25uZWN0aW9uIGlzIGJlaGluZCBhIHByb3h5LgoKICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdpc2ggdG8gZW5hYmxlIFRDUCBLZWVwIEFsaXZlIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0cywKICAgICAgICB5b3UgbWlnaHQgcGFzczo6CgogICAgICAgICAgICBIVFRQQ29ubmVjdGlvbi5kZWZhdWx0X3NvY2tldF9vcHRpb25zICsgWwogICAgICAgICAgICAgICAgKHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fS0VFUEFMSVZFLCAxKSwKICAgICAgICAgICAgXQoKICAgICAgICBPciB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdHMgYnkgcGFzc2luZyBhbiBlbXB0eSBsaXN0IChlLmcuLCBgYFtdYGApLgogICAgIiIiCgogICAgZGVmYXVsdF9wb3J0ID0gcG9ydF9ieV9zY2hlbWVbJ2h0dHAnXQoKICAgICM6IERpc2FibGUgTmFnbGUncyBhbGdvcml0aG0gYnkgZGVmYXVsdC4KICAgICM6IGBgWyhzb2NrZXQuSVBQUk9UT19UQ1AsIHNvY2tldC5UQ1BfTk9ERUxBWSwgMSldYGAKICAgIGRlZmF1bHRfc29ja2V0X29wdGlvbnMgPSBbKHNvY2tldC5JUFBST1RPX1RDUCwgc29ja2V0LlRDUF9OT0RFTEFZLCAxKV0KCiAgICAjOiBXaGV0aGVyIHRoaXMgY29ubmVjdGlvbiB2ZXJpZmllcyB0aGUgaG9zdCdzIGNlcnRpZmljYXRlLgogICAgaXNfdmVyaWZpZWQgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgaWYgc2l4LlBZMzogICMgUHl0aG9uIDMKICAgICAgICAgICAga3cucG9wKCdzdHJpY3QnLCBOb25lKQoKICAgICAgICAjIFByZS1zZXQgc291cmNlX2FkZHJlc3MgaW4gY2FzZSB3ZSBoYXZlIGFuIG9sZGVyIFB5dGhvbiBsaWtlIDIuNi4KICAgICAgICBzZWxmLnNvdXJjZV9hZGRyZXNzID0ga3cuZ2V0KCdzb3VyY2VfYWRkcmVzcycpCgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNyk6ICAjIFB5dGhvbiAyLjYKICAgICAgICAgICAgIyBfSFRUUENvbm5lY3Rpb24gb24gUHl0aG9uIDIuNiB3aWxsIGJhbGsgYXQgdGhpcyBrZXl3b3JkIGFyZywgYnV0CiAgICAgICAgICAgICMgbm90IG5ld2VyIHZlcnNpb25zLiBXZSBjYW4gc3RpbGwgdXNlIGl0IHdoZW4gY3JlYXRpbmcgYQogICAgICAgICAgICAjIGNvbm5lY3Rpb24gdGhvdWdoLCBzbyB3ZSBwb3AgaXQgKmFmdGVyKiB3ZSBoYXZlIHNhdmVkIGl0IGFzCiAgICAgICAgICAgICMgc2VsZi5zb3VyY2VfYWRkcmVzcy4KICAgICAgICAgICAga3cucG9wKCdzb3VyY2VfYWRkcmVzcycsIE5vbmUpCgogICAgICAgICM6IFRoZSBzb2NrZXQgb3B0aW9ucyBwcm92aWRlZCBieSB0aGUgdXNlci4gSWYgbm8gb3B0aW9ucyBhcmUKICAgICAgICAjOiBwcm92aWRlZCwgd2UgdXNlIHRoZSBkZWZhdWx0IG9wdGlvbnMuCiAgICAgICAgc2VsZi5zb2NrZXRfb3B0aW9ucyA9IGt3LnBvcCgnc29ja2V0X29wdGlvbnMnLCBzZWxmLmRlZmF1bHRfc29ja2V0X29wdGlvbnMpCgogICAgICAgICMgU3VwZXJjbGFzcyBhbHNvIHNldHMgc2VsZi5zb3VyY2VfYWRkcmVzcyBpbiBQeXRob24gMi43Ky4KICAgICAgICBfSFRUUENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIgRXN0YWJsaXNoIGEgc29ja2V0IGNvbm5lY3Rpb24gYW5kIHNldCBub2RlbGF5IHNldHRpbmdzIG9uIGl0LgoKICAgICAgICA6cmV0dXJuOiBOZXcgc29ja2V0IGNvbm5lY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfa3cgPSB7fQogICAgICAgIGlmIHNlbGYuc291cmNlX2FkZHJlc3M6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb3VyY2VfYWRkcmVzcyddID0gc2VsZi5zb3VyY2VfYWRkcmVzcwoKICAgICAgICBpZiBzZWxmLnNvY2tldF9vcHRpb25zOgogICAgICAgICAgICBleHRyYV9rd1snc29ja2V0X29wdGlvbnMnXSA9IHNlbGYuc29ja2V0X29wdGlvbnMKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uID0gY29ubmVjdGlvbi5jcmVhdGVfY29ubmVjdGlvbigKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksIHNlbGYudGltZW91dCwgKipleHRyYV9rdykKCiAgICAgICAgZXhjZXB0IFNvY2tldFRpbWVvdXQgYXMgZToKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJDb25uZWN0aW9uIHRvICVzIHRpbWVkIG91dC4gKGNvbm5lY3QgdGltZW91dD0lcykiICUKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYudGltZW91dCkpCgogICAgICAgIGV4Y2VwdCBTb2NrZXRFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlKQoKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBfcHJlcGFyZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgIHNlbGYuc29jayA9IGNvbm4KICAgICAgICAjIHRoZSBfdHVubmVsX2hvc3QgYXR0cmlidXRlIHdhcyBhZGRlZCBpbiBweXRob24gMi42LjMgKHZpYQogICAgICAgICMgaHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9yZXYvMGY1N2IzMGExNTJmKSBzbyBweXRob25zIDIuNigwLTIpIGRvCiAgICAgICAgIyBub3QgaGF2ZSB0aGVtLgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIE5vbmUpOgogICAgICAgICAgICAjIFRPRE86IEZpeCB0dW5uZWwgc28gaXQgZG9lc24ndCBkZXBlbmQgb24gc2VsZi5zb2NrIHN0YXRlLgogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIE1hcmsgdGhpcyBjb25uZWN0aW9uIGFzIG5vdCByZXVzYWJsZQogICAgICAgICAgICBzZWxmLmF1dG9fb3BlbiA9IDAKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICBjb25uID0gc2VsZi5fbmV3X2Nvbm4oKQogICAgICAgIHNlbGYuX3ByZXBhcmVfY29ubihjb25uKQoKICAgIGRlZiByZXF1ZXN0X2NodW5rZWQoc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBbHRlcm5hdGl2ZSB0byB0aGUgY29tbW9uIHJlcXVlc3QgbWV0aG9kLCB3aGljaCBzZW5kcyB0aGUKICAgICAgICBib2R5IHdpdGggY2h1bmtlZCBlbmNvZGluZyBhbmQgbm90IGFzIG9uZSBibG9jawogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChoZWFkZXJzIGlmIGhlYWRlcnMgaXMgbm90IE5vbmUgZWxzZSB7fSkKICAgICAgICBza2lwX2FjY2VwdF9lbmNvZGluZyA9ICdhY2NlcHQtZW5jb2RpbmcnIGluIGhlYWRlcnMKICAgICAgICBza2lwX2hvc3QgPSAnaG9zdCcgaW4gaGVhZGVycwogICAgICAgIHNlbGYucHV0cmVxdWVzdCgKICAgICAgICAgICAgbWV0aG9kLAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIHNraXBfYWNjZXB0X2VuY29kaW5nPXNraXBfYWNjZXB0X2VuY29kaW5nLAogICAgICAgICAgICBza2lwX2hvc3Q9c2tpcF9ob3N0CiAgICAgICAgKQogICAgICAgIGZvciBoZWFkZXIsIHZhbHVlIGluIGhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoaGVhZGVyLCB2YWx1ZSkKICAgICAgICBpZiAndHJhbnNmZXItZW5jb2RpbmcnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignVHJhbnNmZXItRW5jb2RpbmcnLCAnY2h1bmtlZCcpCiAgICAgICAgc2VsZi5lbmRoZWFkZXJzKCkKCiAgICAgICAgaWYgYm9keSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3RyaW5naXNoX3R5cGVzID0gc2l4LnN0cmluZ190eXBlcyArIChzaXguYmluYXJ5X3R5cGUsKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGJvZHksIHN0cmluZ2lzaF90eXBlcyk6CiAgICAgICAgICAgICAgICBib2R5ID0gKGJvZHksKQogICAgICAgICAgICBmb3IgY2h1bmsgaW4gYm9keToKICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2h1bmssIHNpeC5iaW5hcnlfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5lbmNvZGUoJ3V0ZjgnKQogICAgICAgICAgICAgICAgbGVuX3N0ciA9IGhleChsZW4oY2h1bmspKVsyOl0KICAgICAgICAgICAgICAgIHNlbGYuc2VuZChsZW5fc3RyLmVuY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgIHNlbGYuc2VuZChiJ1xyXG4nKQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGNodW5rKQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGInXHJcbicpCgogICAgICAgICMgQWZ0ZXIgdGhlIGlmIGNsYXVzZSwgdG8gYWx3YXlzIGhhdmUgYSBjbG9zZWQgYm9keQogICAgICAgIHNlbGYuc2VuZChiJzBcclxuXHJcbicpCgoKY2xhc3MgSFRUUFNDb25uZWN0aW9uKEhUVFBDb25uZWN0aW9uKToKICAgIGRlZmF1bHRfcG9ydCA9IHBvcnRfYnlfc2NoZW1lWydodHRwcyddCgogICAgc3NsX3ZlcnNpb24gPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsCiAgICAgICAgICAgICAgICAgc3RyaWN0PU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgIHNzbF9jb250ZXh0PU5vbmUsICoqa3cpOgoKICAgICAgICBIVFRQQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCBzdHJpY3Q9c3RyaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgKiprdykKCiAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCiAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKICAgICAgICBzZWxmLnNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKCiAgICAgICAgIyBSZXF1aXJlZCBwcm9wZXJ0eSBmb3IgR29vZ2xlIEFwcEVuZ2luZSAxLjkuMCB3aGljaCBvdGhlcndpc2UgY2F1c2VzCiAgICAgICAgIyBIVFRQUyByZXF1ZXN0cyB0byBnbyBvdXQgYXMgSFRUUC4gKFNlZSBJc3N1ZSAjMzU2KQogICAgICAgIHNlbGYuX3Byb3RvY29sID0gJ2h0dHBzJwoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIGNvbm4gPSBzZWxmLl9uZXdfY29ubigpCiAgICAgICAgc2VsZi5fcHJlcGFyZV9jb25uKGNvbm4pCgogICAgICAgIGlmIHNlbGYuc3NsX2NvbnRleHQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dCA9IGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoCiAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1yZXNvbHZlX3NzbF92ZXJzaW9uKE5vbmUpLAogICAgICAgICAgICAgICAgY2VydF9yZXFzPXJlc29sdmVfY2VydF9yZXFzKE5vbmUpLAogICAgICAgICAgICApCgogICAgICAgIHNlbGYuc29jayA9IHNzbF93cmFwX3NvY2tldCgKICAgICAgICAgICAgc29jaz1jb25uLAogICAgICAgICAgICBrZXlmaWxlPXNlbGYua2V5X2ZpbGUsCiAgICAgICAgICAgIGNlcnRmaWxlPXNlbGYuY2VydF9maWxlLAogICAgICAgICAgICBzc2xfY29udGV4dD1zZWxmLnNzbF9jb250ZXh0LAogICAgICAgICkKCgpjbGFzcyBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbihIVFRQU0Nvbm5lY3Rpb24pOgogICAgIiIiCiAgICBCYXNlZCBvbiBodHRwbGliLkhUVFBTQ29ubmVjdGlvbiBidXQgd3JhcHMgdGhlIHNvY2tldCB3aXRoCiAgICBTU0wgY2VydGlmaWNhdGlvbi4KICAgICIiIgogICAgY2VydF9yZXFzID0gTm9uZQogICAgY2FfY2VydHMgPSBOb25lCiAgICBjYV9jZXJ0X2RpciA9IE5vbmUKICAgIHNzbF92ZXJzaW9uID0gTm9uZQogICAgYXNzZXJ0X2ZpbmdlcnByaW50ID0gTm9uZQoKICAgIGRlZiBzZXRfY2VydChzZWxmLCBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9Tm9uZSwgY2FfY2VydHM9Tm9uZSwKICAgICAgICAgICAgICAgICBhc3NlcnRfaG9zdG5hbWU9Tm9uZSwgYXNzZXJ0X2ZpbmdlcnByaW50PU5vbmUsCiAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyB1c2VkLgogICAgICAgICIiIgogICAgICAgICMgSWYgY2VydF9yZXFzIGlzIG5vdCBwcm92aWRlZCwgd2UgY2FuIHRyeSB0byBndWVzcy4gSWYgdGhlIHVzZXIgZ2F2ZQogICAgICAgICMgdXMgYSBjZXJ0IGRhdGFiYXNlLCB3ZSBhc3N1bWUgdGhleSB3YW50IHRvIHVzZSBpdDogb3RoZXJ3aXNlLCBpZgogICAgICAgICMgdGhleSBnYXZlIHVzIGFuIFNTTCBDb250ZXh0IG9iamVjdCB3ZSBzaG91bGQgdXNlIHdoYXRldmVyIGlzIHNldCBmb3IKICAgICAgICAjIGl0LgogICAgICAgIGlmIGNlcnRfcmVxcyBpcyBOb25lOgogICAgICAgICAgICBpZiBjYV9jZXJ0cyBvciBjYV9jZXJ0X2RpcjoKICAgICAgICAgICAgICAgIGNlcnRfcmVxcyA9ICdDRVJUX1JFUVVJUkVEJwogICAgICAgICAgICBlbGlmIHNlbGYuc3NsX2NvbnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzZWxmLnNzbF9jb250ZXh0LnZlcmlmeV9tb2RlCgogICAgICAgIHNlbGYua2V5X2ZpbGUgPSBrZXlfZmlsZQogICAgICAgIHNlbGYuY2VydF9maWxlID0gY2VydF9maWxlCiAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBjZXJ0X3JlcXMKICAgICAgICBzZWxmLmFzc2VydF9ob3N0bmFtZSA9IGFzc2VydF9ob3N0bmFtZQogICAgICAgIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50ID0gYXNzZXJ0X2ZpbmdlcnByaW50CiAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzIGFuZCBvcy5wYXRoLmV4cGFuZHVzZXIoY2FfY2VydHMpCiAgICAgICAgc2VsZi5jYV9jZXJ0X2RpciA9IGNhX2NlcnRfZGlyIGFuZCBvcy5wYXRoLmV4cGFuZHVzZXIoY2FfY2VydF9kaXIpCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgIyBBZGQgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uCiAgICAgICAgY29ubiA9IHNlbGYuX25ld19jb25uKCkKCiAgICAgICAgaG9zdG5hbWUgPSBzZWxmLmhvc3QKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgIyBfdHVubmVsX2hvc3Qgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjYuMwogICAgICAgICAgICAjIChTZWU6IGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vcmV2LzBmNTdiMzBhMTUyZikKCiAgICAgICAgICAgIHNlbGYuc29jayA9IGNvbm4KICAgICAgICAgICAgIyBDYWxscyBzZWxmLl9zZXRfaG9zdHBvcnQoKSwgc28gc2VsZi5ob3N0IGlzCiAgICAgICAgICAgICMgc2VsZi5fdHVubmVsX2hvc3QgYmVsb3cuCiAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCiAgICAgICAgICAgICMgTWFyayB0aGlzIGNvbm5lY3Rpb24gYXMgbm90IHJldXNhYmxlCiAgICAgICAgICAgIHNlbGYuYXV0b19vcGVuID0gMAoKICAgICAgICAgICAgIyBPdmVycmlkZSB0aGUgaG9zdCB3aXRoIHRoZSBvbmUgd2UncmUgcmVxdWVzdGluZyBkYXRhIGZyb20uCiAgICAgICAgICAgIGhvc3RuYW1lID0gc2VsZi5fdHVubmVsX2hvc3QKCiAgICAgICAgaXNfdGltZV9vZmYgPSBkYXRldGltZS5kYXRlLnRvZGF5KCkgPCBSRUNFTlRfREFURQogICAgICAgIGlmIGlzX3RpbWVfb2ZmOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICdTeXN0ZW0gdGltZSBpcyB3YXkgb2ZmIChiZWZvcmUgezB9KS4gVGhpcyB3aWxsIHByb2JhYmx5ICcKICAgICAgICAgICAgICAgICdsZWFkIHRvIFNTTCB2ZXJpZmljYXRpb24gZXJyb3JzJykuZm9ybWF0KFJFQ0VOVF9EQVRFKSwKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWVXYXJuaW5nCiAgICAgICAgICAgICkKCiAgICAgICAgIyBXcmFwIHNvY2tldCB1c2luZyB2ZXJpZmljYXRpb24gd2l0aCB0aGUgcm9vdCBjZXJ0cyBpbgogICAgICAgICMgdHJ1c3RlZF9yb290X2NlcnRzCiAgICAgICAgaWYgc2VsZi5zc2xfY29udGV4dCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0ID0gY3JlYXRlX3VybGxpYjNfY29udGV4dCgKICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXJlc29sdmVfc3NsX3ZlcnNpb24oc2VsZi5zc2xfdmVyc2lvbiksCiAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9cmVzb2x2ZV9jZXJ0X3JlcXMoc2VsZi5jZXJ0X3JlcXMpLAogICAgICAgICAgICApCgogICAgICAgIGNvbnRleHQgPSBzZWxmLnNzbF9jb250ZXh0CiAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IHJlc29sdmVfY2VydF9yZXFzKHNlbGYuY2VydF9yZXFzKQogICAgICAgIHNlbGYuc29jayA9IHNzbF93cmFwX3NvY2tldCgKICAgICAgICAgICAgc29jaz1jb25uLAogICAgICAgICAgICBrZXlmaWxlPXNlbGYua2V5X2ZpbGUsCiAgICAgICAgICAgIGNlcnRmaWxlPXNlbGYuY2VydF9maWxlLAogICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAogICAgICAgICAgICBjYV9jZXJ0X2Rpcj1zZWxmLmNhX2NlcnRfZGlyLAogICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9aG9zdG5hbWUsCiAgICAgICAgICAgIHNzbF9jb250ZXh0PWNvbnRleHQpCgogICAgICAgIGlmIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50OgogICAgICAgICAgICBhc3NlcnRfZmluZ2VycHJpbnQoc2VsZi5zb2NrLmdldHBlZXJjZXJ0KGJpbmFyeV9mb3JtPVRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQpCiAgICAgICAgZWxpZiBjb250ZXh0LnZlcmlmeV9tb2RlICE9IHNzbC5DRVJUX05PTkUgXAogICAgICAgICAgICAgICAgYW5kIG5vdCBnZXRhdHRyKGNvbnRleHQsICdjaGVja19ob3N0bmFtZScsIEZhbHNlKSBcCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5hc3NlcnRfaG9zdG5hbWUgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAjIFdoaWxlIHVybGxpYjMgYXR0ZW1wdHMgdG8gYWx3YXlzIHR1cm4gb2ZmIGhvc3RuYW1lIG1hdGNoaW5nIGZyb20KICAgICAgICAgICAgIyB0aGUgVExTIGxpYnJhcnksIHRoaXMgY2Fubm90IGFsd2F5cyBiZSBkb25lLiBTbyB3ZSBjaGVjayB3aGV0aGVyCiAgICAgICAgICAgICMgdGhlIFRMUyBMaWJyYXJ5IHN0aWxsIHRoaW5rcyBpdCdzIG1hdGNoaW5nIGhvc3RuYW1lcy4KICAgICAgICAgICAgY2VydCA9IHNlbGYuc29jay5nZXRwZWVyY2VydCgpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSk6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICAgICAnQ2VydGlmaWNhdGUgZm9yIHswfSBoYXMgbm8gYHN1YmplY3RBbHROYW1lYCwgZmFsbGluZyBiYWNrIHRvIGNoZWNrIGZvciBhICcKICAgICAgICAgICAgICAgICAgICAnYGNvbW1vbk5hbWVgIGZvciBub3cuIFRoaXMgZmVhdHVyZSBpcyBiZWluZyByZW1vdmVkIGJ5IG1ham9yIGJyb3dzZXJzIGFuZCAnCiAgICAgICAgICAgICAgICAgICAgJ2RlcHJlY2F0ZWQgYnkgUkZDIDI4MTguIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NoYXpvdy91cmxsaWIzL2lzc3Vlcy80OTcgJwogICAgICAgICAgICAgICAgICAgICdmb3IgZGV0YWlscy4pJy5mb3JtYXQoaG9zdG5hbWUpKSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0QWx0TmFtZVdhcm5pbmcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgX21hdGNoX2hvc3RuYW1lKGNlcnQsIHNlbGYuYXNzZXJ0X2hvc3RuYW1lIG9yIGhvc3RuYW1lKQoKICAgICAgICBzZWxmLmlzX3ZlcmlmaWVkID0gKAogICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID09IHNzbC5DRVJUX1JFUVVJUkVEIG9yCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50IGlzIG5vdCBOb25lCiAgICAgICAgKQoKCmRlZiBfbWF0Y2hfaG9zdG5hbWUoY2VydCwgYXNzZXJ0ZWRfaG9zdG5hbWUpOgogICAgdHJ5OgogICAgICAgIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGFzc2VydGVkX2hvc3RuYW1lKQogICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3IgYXMgZToKICAgICAgICBsb2cuZXJyb3IoCiAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGhvc3RuYW1lOiAlcy4gJwogICAgICAgICAgICAnQ2VydGlmaWNhdGU6ICVzJywgYXNzZXJ0ZWRfaG9zdG5hbWUsIGNlcnQKICAgICAgICApCiAgICAgICAgIyBBZGQgY2VydCB0byBleGNlcHRpb24gYW5kIHJlcmFpc2Ugc28gY2xpZW50IGNvZGUgY2FuIGluc3BlY3QKICAgICAgICAjIHRoZSBjZXJ0IHdoZW4gY2F0Y2hpbmcgdGhlIGV4Y2VwdGlvbiwgaWYgdGhleSB3YW50IHRvCiAgICAgICAgZS5fcGVlcl9jZXJ0ID0gY2VydAogICAgICAgIHJhaXNlCgoKaWYgc3NsOgogICAgIyBNYWtlIGEgY29weSBmb3IgdGVzdGluZy4KICAgIFVudmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24gPSBIVFRQU0Nvbm5lY3Rpb24KICAgIEhUVFBTQ29ubmVjdGlvbiA9IFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uCmVsc2U6CiAgICBIVFRQU0Nvbm5lY3Rpb24gPSBEdW1teUNvbm5lY3Rpb24KUEsDBBQAAAAAAAAAIQAXGhxvHooAAB6KAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbnBvb2wucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgZXJybm8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKCmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmltcG9ydCBzb2NrZXQKCgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBDbG9zZWRQb29sRXJyb3IsCiAgICBQcm90b2NvbEVycm9yLAogICAgRW1wdHlQb29sRXJyb3IsCiAgICBIZWFkZXJQYXJzaW5nRXJyb3IsCiAgICBIb3N0Q2hhbmdlZEVycm9yLAogICAgTG9jYXRpb25WYWx1ZUVycm9yLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3h5RXJyb3IsCiAgICBSZWFkVGltZW91dEVycm9yLAogICAgU1NMRXJyb3IsCiAgICBUaW1lb3V0RXJyb3IsCiAgICBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nLAogICAgTmV3Q29ubmVjdGlvbkVycm9yLAopCmZyb20gLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvcgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKZnJvbSAuY29ubmVjdGlvbiBpbXBvcnQgKAogICAgcG9ydF9ieV9zY2hlbWUsCiAgICBEdW1teUNvbm5lY3Rpb24sCiAgICBIVFRQQ29ubmVjdGlvbiwgSFRUUFNDb25uZWN0aW9uLCBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbiwKICAgIEhUVFBFeGNlcHRpb24sIEJhc2VTU0xFcnJvciwKKQpmcm9tIC5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCgpmcm9tIC51dGlsLmNvbm5lY3Rpb24gaW1wb3J0IGlzX2Nvbm5lY3Rpb25fZHJvcHBlZApmcm9tIC51dGlsLnJlcXVlc3QgaW1wb3J0IHNldF9maWxlX3Bvc2l0aW9uCmZyb20gLnV0aWwucmVzcG9uc2UgaW1wb3J0IGFzc2VydF9oZWFkZXJfcGFyc2luZwpmcm9tIC51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQpmcm9tIC51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAudXRpbC51cmwgaW1wb3J0IGdldF9ob3N0LCBVcmwKCgppZiBzaXguUFkyOgogICAgIyBRdWV1ZSBpcyBpbXBvcnRlZCBmb3Igc2lkZSBlZmZlY3RzIG9uIE1TIFdpbmRvd3MKICAgIGltcG9ydCBRdWV1ZSBhcyBfdW51c2VkX21vZHVsZV9RdWV1ZSAgIyBub3FhOiBGNDAxCgp4cmFuZ2UgPSBzaXgubW92ZXMueHJhbmdlCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9EZWZhdWx0ID0gb2JqZWN0KCkKCgojIFBvb2wgb2JqZWN0cwpjbGFzcyBDb25uZWN0aW9uUG9vbChvYmplY3QpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBhbGwgY29ubmVjdGlvbiBwb29scywgc3VjaCBhcwogICAgOmNsYXNzOmAuSFRUUENvbm5lY3Rpb25Qb29sYCBhbmQgOmNsYXNzOmAuSFRUUFNDb25uZWN0aW9uUG9vbGAuCiAgICAiIiIKCiAgICBzY2hlbWUgPSBOb25lCiAgICBRdWV1ZUNscyA9IHF1ZXVlLkxpZm9RdWV1ZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUpOgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICByYWlzZSBMb2NhdGlvblZhbHVlRXJyb3IoIk5vIGhvc3Qgc3BlY2lmaWVkLiIpCgogICAgICAgIHNlbGYuaG9zdCA9IF9pcHY2X2hvc3QoaG9zdCkubG93ZXIoKQogICAgICAgIHNlbGYuX3Byb3h5X2hvc3QgPSBob3N0Lmxvd2VyKCkKICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcyhob3N0PSVyLCBwb3J0PSVyKScgJSAodHlwZShzZWxmKS5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgogICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICMgUmV0dXJuIEZhbHNlIHRvIHJlLXJhaXNlIGFueSBwb3RlbnRpYWwgZXhjZXB0aW9ucwogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbG9zZSBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zIGFuZCBkaXNhYmxlIHRoZSBwb29sLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCgojIFRoaXMgaXMgdGFrZW4gZnJvbSBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvN2FhYmE3MjFlYmMwL0xpYi9zb2NrZXQucHkjbDI1MgpfYmxvY2tpbmdfZXJybm9zID0gc2V0KFtlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLXSkKCgpjbGFzcyBIVFRQQ29ubmVjdGlvblBvb2woQ29ubmVjdGlvblBvb2wsIFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgVGhyZWFkLXNhZmUgY29ubmVjdGlvbiBwb29sIGZvciBvbmUgaG9zdC4KCiAgICA6cGFyYW0gaG9zdDoKICAgICAgICBIb3N0IHVzZWQgZm9yIHRoaXMgSFRUUCBDb25uZWN0aW9uIChlLmcuICJsb2NhbGhvc3QiKSwgcGFzc2VkIGludG8KICAgICAgICA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgIDpwYXJhbSBwb3J0OgogICAgICAgIFBvcnQgdXNlZCBmb3IgdGhpcyBIVFRQIENvbm5lY3Rpb24gKE5vbmUgaXMgZXF1aXZhbGVudCB0byA4MCksIHBhc3NlZAogICAgICAgIGludG8gOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYC4KCiAgICA6cGFyYW0gc3RyaWN0OgogICAgICAgIENhdXNlcyBCYWRTdGF0dXNMaW5lIHRvIGJlIHJhaXNlZCBpZiB0aGUgc3RhdHVzIGxpbmUgY2FuJ3QgYmUgcGFyc2VkCiAgICAgICAgYXMgYSB2YWxpZCBIVFRQLzEuMCBvciAxLjEgc3RhdHVzIGxpbmUsIHBhc3NlZCBpbnRvCiAgICAgICAgOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYC4KCiAgICAgICAgLi4gbm90ZTo6CiAgICAgICAgICAgT25seSB3b3JrcyBpbiBQeXRob24gMi4gVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpbiBQeXRob24gMy4KCiAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICBTb2NrZXQgdGltZW91dCBpbiBzZWNvbmRzIGZvciBlYWNoIGluZGl2aWR1YWwgY29ubmVjdGlvbi4gVGhpcyBjYW4KICAgICAgICBiZSBhIGZsb2F0IG9yIGludGVnZXIsIHdoaWNoIHNldHMgdGhlIHRpbWVvdXQgZm9yIHRoZSBIVFRQIHJlcXVlc3QsCiAgICAgICAgb3IgYW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAgd2hpY2ggZ2l2ZXMgeW91IG1vcmUKICAgICAgICBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHJlcXVlc3QgdGltZW91dHMuIEFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKICAgICAgICBiZWVuIHBhcnNlZCwgdGhpcyBpcyBhbHdheXMgYSBgdXJsbGliMy51dGlsLlRpbWVvdXRgIG9iamVjdC4KCiAgICA6cGFyYW0gbWF4c2l6ZToKICAgICAgICBOdW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSB0aGF0IGNhbiBiZSByZXVzZWQuIE1vcmUgdGhhbiAxIGlzIHVzZWZ1bAogICAgICAgIGluIG11bHRpdGhyZWFkZWQgc2l0dWF0aW9ucy4gSWYgYGBibG9ja2BgIGlzIHNldCB0byBGYWxzZSwgbW9yZQogICAgICAgIGNvbm5lY3Rpb25zIHdpbGwgYmUgY3JlYXRlZCBidXQgdGhleSB3aWxsIG5vdCBiZSBzYXZlZCBvbmNlIHRoZXkndmUKICAgICAgICBiZWVuIHVzZWQuCgogICAgOnBhcmFtIGJsb2NrOgogICAgICAgIElmIHNldCB0byBUcnVlLCBubyBtb3JlIHRoYW4gYGBtYXhzaXplYGAgY29ubmVjdGlvbnMgd2lsbCBiZSB1c2VkIGF0CiAgICAgICAgYSB0aW1lLiBXaGVuIG5vIGZyZWUgY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZSwgdGhlIGNhbGwgd2lsbCBibG9jawogICAgICAgIHVudGlsIGEgY29ubmVjdGlvbiBoYXMgYmVlbiByZWxlYXNlZC4gVGhpcyBpcyBhIHVzZWZ1bCBzaWRlIGVmZmVjdCBmb3IKICAgICAgICBwYXJ0aWN1bGFyIG11bHRpdGhyZWFkZWQgc2l0dWF0aW9ucyB3aGVyZSBvbmUgZG9lcyBub3Qgd2FudCB0byB1c2UgbW9yZQogICAgICAgIHRoYW4gbWF4c2l6ZSBjb25uZWN0aW9ucyBwZXIgaG9zdCB0byBwcmV2ZW50IGZsb29kaW5nLgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KCiAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICBSZXRyeSBjb25maWd1cmF0aW9uIHRvIHVzZSBieSBkZWZhdWx0IHdpdGggcmVxdWVzdHMgaW4gdGhpcyBwb29sLgoKICAgIDpwYXJhbSBfcHJveHk6CiAgICAgICAgUGFyc2VkIHByb3h5IFVSTCwgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBpbnN0ZWFkLCBzZWUKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuUHJveHlNYW5hZ2VyYCIKCiAgICA6cGFyYW0gX3Byb3h5X2hlYWRlcnM6CiAgICAgICAgQSBkaWN0aW9uYXJ5IHdpdGggcHJveHkgaGVhZGVycywgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LAogICAgICAgIGluc3RlYWQsIHNlZSA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuUHJveHlNYW5hZ2VyYCIKCiAgICA6cGFyYW0gXFwqKmNvbm5fa3c6CiAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBmcmVzaCA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbi5IVFRQQ29ubmVjdGlvbmAsCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb24uSFRUUFNDb25uZWN0aW9uYCBpbnN0YW5jZXMuCiAgICAiIiIKCiAgICBzY2hlbWUgPSAnaHR0cCcKICAgIENvbm5lY3Rpb25DbHMgPSBIVFRQQ29ubmVjdGlvbgogICAgUmVzcG9uc2VDbHMgPSBIVFRQUmVzcG9uc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzdHJpY3Q9RmFsc2UsCiAgICAgICAgICAgICAgICAgdGltZW91dD1UaW1lb3V0LkRFRkFVTFRfVElNRU9VVCwgbWF4c2l6ZT0xLCBibG9jaz1GYWxzZSwKICAgICAgICAgICAgICAgICBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwKICAgICAgICAgICAgICAgICBfcHJveHk9Tm9uZSwgX3Byb3h5X2hlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAqKmNvbm5fa3cpOgogICAgICAgIENvbm5lY3Rpb25Qb29sLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dCk6CiAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0LmZyb21fZmxvYXQodGltZW91dCkKCiAgICAgICAgaWYgcmV0cmllcyBpcyBOb25lOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuREVGQVVMVAoKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcwoKICAgICAgICBzZWxmLnBvb2wgPSBzZWxmLlF1ZXVlQ2xzKG1heHNpemUpCiAgICAgICAgc2VsZi5ibG9jayA9IGJsb2NrCgogICAgICAgIHNlbGYucHJveHkgPSBfcHJveHkKICAgICAgICBzZWxmLnByb3h5X2hlYWRlcnMgPSBfcHJveHlfaGVhZGVycyBvciB7fQoKICAgICAgICAjIEZpbGwgdGhlIHF1ZXVlIHVwIHNvIHRoYXQgZG9pbmcgZ2V0KCkgb24gaXQgd2lsbCBibG9jayBwcm9wZXJseQogICAgICAgIGZvciBfIGluIHhyYW5nZShtYXhzaXplKToKICAgICAgICAgICAgc2VsZi5wb29sLnB1dChOb25lKQoKICAgICAgICAjIFRoZXNlIGFyZSBtb3N0bHkgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyA9IDAKICAgICAgICBzZWxmLm51bV9yZXF1ZXN0cyA9IDAKICAgICAgICBzZWxmLmNvbm5fa3cgPSBjb25uX2t3CgogICAgICAgIGlmIHNlbGYucHJveHk6CiAgICAgICAgICAgICMgRW5hYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIGZvciBwcm94aWVzLCB0byBhdm9pZCBwYWNrZXQgZnJhZ21lbnRhdGlvbi4KICAgICAgICAgICAgIyBXZSBjYW5ub3Qga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgZGVmYXVsdCBzb2NrZXQgb3B0aW9ucywgc28gd2UgY2Fubm90IHJlcGxhY2UgdGhlCiAgICAgICAgICAgICMgbGlzdC4KICAgICAgICAgICAgc2VsZi5jb25uX2t3LnNldGRlZmF1bHQoJ3NvY2tldF9vcHRpb25zJywgW10pCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBmcmVzaCA6Y2xhc3M6YEhUVFBDb25uZWN0aW9uYC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyBuZXcgSFRUUCBjb25uZWN0aW9uICglZCk6ICVzIiwKICAgICAgICAgICAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMsIHNlbGYuaG9zdCkKCiAgICAgICAgY29ubiA9IHNlbGYuQ29ubmVjdGlvbkNscyhob3N0PXNlbGYuaG9zdCwgcG9ydD1zZWxmLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dC5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9c2VsZi5zdHJpY3QsICoqc2VsZi5jb25uX2t3KQogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9nZXRfY29ubihzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGNvbm5lY3Rpb24uIFdpbGwgcmV0dXJuIGEgcG9vbGVkIGNvbm5lY3Rpb24gaWYgb25lIGlzIGF2YWlsYWJsZS4KCiAgICAgICAgSWYgbm8gY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgOnByb3A6YC5ibG9ja2AgaXMgYGBGYWxzZWBgLCB0aGVuIGEKICAgICAgICBmcmVzaCBjb25uZWN0aW9uIGlzIHJldHVybmVkLgoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgU2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIHJhaXNpbmcKICAgICAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmV4Y2VwdGlvbnMuRW1wdHlQb29sRXJyb3JgIGlmIHRoZSBwb29sIGlzIGVtcHR5IGFuZAogICAgICAgICAgICA6cHJvcDpgLmJsb2NrYCBpcyBgYFRydWVgYC4KICAgICAgICAiIiIKICAgICAgICBjb25uID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IHNlbGYucG9vbC5nZXQoYmxvY2s9c2VsZi5ibG9jaywgdGltZW91dD10aW1lb3V0KQoKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIHNlbGYucG9vbCBpcyBOb25lCiAgICAgICAgICAgIHJhaXNlIENsb3NlZFBvb2xFcnJvcihzZWxmLCAiUG9vbCBpcyBjbG9zZWQuIikKCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICBpZiBzZWxmLmJsb2NrOgogICAgICAgICAgICAgICAgcmFpc2UgRW1wdHlQb29sRXJyb3Ioc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb29sIHJlYWNoZWQgbWF4aW11bSBzaXplIGFuZCBubyBtb3JlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW9ucyBhcmUgYWxsb3dlZC4iKQogICAgICAgICAgICBwYXNzICAjIE9oIHdlbGwsIHdlJ2xsIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHRoZW4KCiAgICAgICAgIyBJZiB0aGlzIGlzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLCBjaGVjayBpZiBpdCBnb3QgZGlzY29ubmVjdGVkCiAgICAgICAgaWYgY29ubiBhbmQgaXNfY29ubmVjdGlvbl9kcm9wcGVkKGNvbm4pOgogICAgICAgICAgICBsb2cuZGVidWcoIlJlc2V0dGluZyBkcm9wcGVkIGNvbm5lY3Rpb246ICVzIiwgc2VsZi5ob3N0KQogICAgICAgICAgICBjb25uLmNsb3NlKCkKICAgICAgICAgICAgaWYgZ2V0YXR0cihjb25uLCAnYXV0b19vcGVuJywgMSkgPT0gMDoKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIHByb3hpZWQgY29ubmVjdGlvbiB0aGF0IGhhcyBiZWVuIG11dGF0ZWQgYnkKICAgICAgICAgICAgICAgICMgaHR0cGxpYi5fdHVubmVsKCkgYW5kIGNhbm5vdCBiZSByZXVzZWQgKHNpbmNlIGl0IHdvdWxkCiAgICAgICAgICAgICAgICAjIGF0dGVtcHQgdG8gYnlwYXNzIHRoZSBwcm94eSkKICAgICAgICAgICAgICAgIGNvbm4gPSBOb25lCgogICAgICAgIHJldHVybiBjb25uIG9yIHNlbGYuX25ld19jb25uKCkKCiAgICBkZWYgX3B1dF9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIFB1dCBhIGNvbm5lY3Rpb24gYmFjayBpbnRvIHRoZSBwb29sLgoKICAgICAgICA6cGFyYW0gY29ubjoKICAgICAgICAgICAgQ29ubmVjdGlvbiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGhvc3QgYW5kIHBvcnQgYXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgOm1ldGg6YC5fbmV3X2Nvbm5gIG9yIDptZXRoOmAuX2dldF9jb25uYC4KCiAgICAgICAgSWYgdGhlIHBvb2wgaXMgYWxyZWFkeSBmdWxsLCB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYW5kIGRpc2NhcmRlZAogICAgICAgIGJlY2F1c2Ugd2UgZXhjZWVkZWQgbWF4c2l6ZS4gSWYgY29ubmVjdGlvbnMgYXJlIGRpc2NhcmRlZCBmcmVxdWVudGx5LAogICAgICAgIHRoZW4gbWF4c2l6ZSBzaG91bGQgYmUgaW5jcmVhc2VkLgoKICAgICAgICBJZiB0aGUgcG9vbCBpcyBjbG9zZWQsIHRoZW4gdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW5kIGRpc2NhcmRlZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucG9vbC5wdXQoY29ubiwgYmxvY2s9RmFsc2UpCiAgICAgICAgICAgIHJldHVybiAgIyBFdmVyeXRoaW5nIGlzIGRhbmR5LCBkb25lLgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBzZWxmLnBvb2wgaXMgTm9uZS4KICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdCBxdWV1ZS5GdWxsOgogICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiBzZWxmLmJsb2NrID09IFRydWUKICAgICAgICAgICAgbG9nLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBwb29sIGlzIGZ1bGwsIGRpc2NhcmRpbmcgY29ubmVjdGlvbjogJXMiLAogICAgICAgICAgICAgICAgc2VsZi5ob3N0KQoKICAgICAgICAjIENvbm5lY3Rpb24gbmV2ZXIgZ290IHB1dCBiYWNrIGludG8gdGhlIHBvb2wsIGNsb3NlIGl0LgogICAgICAgIGlmIGNvbm46CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGRlZiBfdmFsaWRhdGVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgcmlnaHQgYmVmb3JlIGEgcmVxdWVzdCBpcyBtYWRlLCBhZnRlciB0aGUgc29ja2V0IGlzIGNyZWF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfcHJlcGFyZV9wcm94eShzZWxmLCBjb25uKToKICAgICAgICAjIE5vdGhpbmcgdG8gZG8gZm9yIEhUVFAgY29ubmVjdGlvbnMuCiAgICAgICAgcGFzcwoKICAgIGRlZiBfZ2V0X3RpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgIiIiIEhlbHBlciB0aGF0IGFsd2F5cyByZXR1cm5zIGEgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAgIiIiCiAgICAgICAgaWYgdGltZW91dCBpcyBfRGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYudGltZW91dC5jbG9uZSgpCgogICAgICAgIGlmIGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dCk6CiAgICAgICAgICAgIHJldHVybiB0aW1lb3V0LmNsb25lKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFVzZXIgcGFzc2VkIHVzIGFuIGludC9mbG9hdC4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksCiAgICAgICAgICAgICMgY2FuIGJlIHJlbW92ZWQgbGF0ZXIKICAgICAgICAgICAgcmV0dXJuIFRpbWVvdXQuZnJvbV9mbG9hdCh0aW1lb3V0KQoKICAgIGRlZiBfcmFpc2VfdGltZW91dChzZWxmLCBlcnIsIHVybCwgdGltZW91dF92YWx1ZSk6CiAgICAgICAgIiIiSXMgdGhlIGVycm9yIGFjdHVhbGx5IGEgdGltZW91dD8gV2lsbCByYWlzZSBhIFJlYWRUaW1lb3V0IG9yIHBhc3MiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShlcnIsIFNvY2tldFRpbWVvdXQpOgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgICAgICAjIFNlZSB0aGUgYWJvdmUgY29tbWVudCBhYm91dCBFQUdBSU4gaW4gUHl0aG9uIDMuIEluIFB5dGhvbiAyIHdlIGhhdmUKICAgICAgICAjIHRvIHNwZWNpZmljYWxseSBjYXRjaCBpdCBhbmQgdGhyb3cgdGhlIHRpbWVvdXQgZXJyb3IKICAgICAgICBpZiBoYXNhdHRyKGVyciwgJ2Vycm5vJykgYW5kIGVyci5lcnJubyBpbiBfYmxvY2tpbmdfZXJybm9zOgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgICAgICAjIENhdGNoIHBvc3NpYmxlIHJlYWQgdGltZW91dHMgdGhyb3duIGFzIFNTTCBlcnJvcnMuIElmIG5vdCB0aGUKICAgICAgICAjIGNhc2UsIHJldGhyb3cgdGhlIG9yaWdpbmFsLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvZjoKICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDI3MgogICAgICAgIGlmICd0aW1lZCBvdXQnIGluIHN0cihlcnIpIG9yICdkaWQgbm90IGNvbXBsZXRlIChyZWFkKScgaW4gc3RyKGVycik6ICAjIFB5dGhvbiAyLjYKICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgdGltZW91dF92YWx1ZSkKCiAgICBkZWYgX21ha2VfcmVxdWVzdChzZWxmLCBjb25uLCBtZXRob2QsIHVybCwgdGltZW91dD1fRGVmYXVsdCwgY2h1bmtlZD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICoqaHR0cGxpYl9yZXF1ZXN0X2t3KToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGEgcmVxdWVzdCBvbiBhIGdpdmVuIHVybGxpYiBjb25uZWN0aW9uIG9iamVjdCB0YWtlbiBmcm9tIG91cgogICAgICAgIHBvb2wuCgogICAgICAgIDpwYXJhbSBjb25uOgogICAgICAgICAgICBhIGNvbm5lY3Rpb24gZnJvbSBvbmUgb2Ygb3VyIGNvbm5lY3Rpb24gcG9vbHMKCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgICAgIFNvY2tldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZSByZXF1ZXN0LiBUaGlzIGNhbiBiZSBhCiAgICAgICAgICAgIGZsb2F0IG9yIGludGVnZXIsIHdoaWNoIHdpbGwgc2V0IHRoZSBzYW1lIHRpbWVvdXQgdmFsdWUgZm9yCiAgICAgICAgICAgIHRoZSBzb2NrZXQgY29ubmVjdCBhbmQgdGhlIHNvY2tldCByZWFkLCBvciBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCwgd2hpY2ggZ2l2ZXMgeW91IG1vcmUgZmluZS1ncmFpbmVkCiAgICAgICAgICAgIGNvbnRyb2wgb3ZlciB5b3VyIHRpbWVvdXRzLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX3JlcXVlc3RzICs9IDEKCiAgICAgICAgdGltZW91dF9vYmogPSBzZWxmLl9nZXRfdGltZW91dCh0aW1lb3V0KQogICAgICAgIHRpbWVvdXRfb2JqLnN0YXJ0X2Nvbm5lY3QoKQogICAgICAgIGNvbm4udGltZW91dCA9IHRpbWVvdXRfb2JqLmNvbm5lY3RfdGltZW91dAoKICAgICAgICAjIFRyaWdnZXIgYW55IGV4dHJhIHZhbGlkYXRpb24gd2UgbmVlZCB0byBkby4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2Nvbm4oY29ubikKICAgICAgICBleGNlcHQgKFNvY2tldFRpbWVvdXQsIEJhc2VTU0xFcnJvcikgYXMgZToKICAgICAgICAgICAgIyBQeTIgcmFpc2VzIHRoaXMgYXMgYSBCYXNlU1NMRXJyb3IsIFB5MyByYWlzZXMgaXQgYXMgc29ja2V0IHRpbWVvdXQuCiAgICAgICAgICAgIHNlbGYuX3JhaXNlX3RpbWVvdXQoZXJyPWUsIHVybD11cmwsIHRpbWVvdXRfdmFsdWU9Y29ubi50aW1lb3V0KQogICAgICAgICAgICByYWlzZQoKICAgICAgICAjIGNvbm4ucmVxdWVzdCgpIGNhbGxzIGh0dHBsaWIuKi5yZXF1ZXN0LCBub3QgdGhlIG1ldGhvZCBpbgogICAgICAgICMgdXJsbGliMy5yZXF1ZXN0LiBJdCBhbHNvIGNhbGxzIG1ha2VmaWxlIChyZWN2KSBvbiB0aGUgc29ja2V0LgogICAgICAgIGlmIGNodW5rZWQ6CiAgICAgICAgICAgIGNvbm4ucmVxdWVzdF9jaHVua2VkKG1ldGhvZCwgdXJsLCAqKmh0dHBsaWJfcmVxdWVzdF9rdykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLnJlcXVlc3QobWV0aG9kLCB1cmwsICoqaHR0cGxpYl9yZXF1ZXN0X2t3KQoKICAgICAgICAjIFJlc2V0IHRoZSB0aW1lb3V0IGZvciB0aGUgcmVjdigpIG9uIHRoZSBzb2NrZXQKICAgICAgICByZWFkX3RpbWVvdXQgPSB0aW1lb3V0X29iai5yZWFkX3RpbWVvdXQKCiAgICAgICAgIyBBcHAgRW5naW5lIGRvZXNuJ3QgaGF2ZSBhIHNvY2sgYXR0cgogICAgICAgIGlmIGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKToKICAgICAgICAgICAgIyBJbiBQeXRob24gMyBzb2NrZXQucHkgd2lsbCBjYXRjaCBFQUdBSU4gYW5kIHJldHVybiBOb25lIHdoZW4geW91CiAgICAgICAgICAgICMgdHJ5IGFuZCByZWFkIGludG8gdGhlIGZpbGUgcG9pbnRlciBjcmVhdGVkIGJ5IGh0dHAuY2xpZW50LCB3aGljaAogICAgICAgICAgICAjIGluc3RlYWQgcmFpc2VzIGEgQmFkU3RhdHVzTGluZSBleGNlcHRpb24uIEluc3RlYWQgb2YgY2F0Y2hpbmcKICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIGFuZCBhc3N1bWluZyBhbGwgQmFkU3RhdHVzTGluZSBleGNlcHRpb25zIGFyZSByZWFkCiAgICAgICAgICAgICMgdGltZW91dHMsIGNoZWNrIGZvciBhIHplcm8gdGltZW91dCBiZWZvcmUgbWFraW5nIHRoZSByZXF1ZXN0LgogICAgICAgICAgICBpZiByZWFkX3RpbWVvdXQgPT0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHJlYWRfdGltZW91dCkKICAgICAgICAgICAgaWYgcmVhZF90aW1lb3V0IGlzIFRpbWVvdXQuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICAgICAgY29ubi5zb2NrLnNldHRpbWVvdXQoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkpCiAgICAgICAgICAgIGVsc2U6ICAjIE5vbmUgb3IgYSB2YWx1ZQogICAgICAgICAgICAgICAgY29ubi5zb2NrLnNldHRpbWVvdXQocmVhZF90aW1lb3V0KQoKICAgICAgICAjIFJlY2VpdmUgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OiAgIyBQeXRob24gMi43LCB1c2UgYnVmZmVyaW5nIG9mIEhUVFAgcmVzcG9uc2VzCiAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gY29ubi5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogICMgUHl0aG9uIDIuNiBhbmQgb2xkZXIsIFB5dGhvbiAzCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBUeXBlRXJyb3IgZnJvbSB0aGUgZXhjZXB0aW9uIGNoYWluIGluIFB5dGhvbiAzOwogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGl0IGxvb2tzIGxpa2UgYSBwcm9ncmFtbWluZyBlcnJvciB3YXMgdGhlIGNhdXNlLgogICAgICAgICAgICAgICAgICAgIHNpeC5yYWlzZV9mcm9tKGUsIE5vbmUpCiAgICAgICAgZXhjZXB0IChTb2NrZXRUaW1lb3V0LCBCYXNlU1NMRXJyb3IsIFNvY2tldEVycm9yKSBhcyBlOgogICAgICAgICAgICBzZWxmLl9yYWlzZV90aW1lb3V0KGVycj1lLCB1cmw9dXJsLCB0aW1lb3V0X3ZhbHVlPXJlYWRfdGltZW91dCkKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgIyBBcHBFbmdpbmUgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBhdHRyLgogICAgICAgIGh0dHBfdmVyc2lvbiA9IGdldGF0dHIoY29ubiwgJ19odHRwX3Zzbl9zdHInLCAnSFRUUC8/JykKICAgICAgICBsb2cuZGVidWcoIiVzOi8vJXM6JXMgXCIlcyAlcyAlc1wiICVzICVzIiwgc2VsZi5zY2hlbWUsIHNlbGYuaG9zdCwgc2VsZi5wb3J0LAogICAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgaHR0cF92ZXJzaW9uLCBodHRwbGliX3Jlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZS5sZW5ndGgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nKGh0dHBsaWJfcmVzcG9uc2UubXNnKQogICAgICAgIGV4Y2VwdCAoSGVhZGVyUGFyc2luZ0Vycm9yLCBUeXBlRXJyb3IpIGFzIGhwZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICAgICAgICAgIGxvZy53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBoZWFkZXJzICh1cmw9JXMpOiAlcycsCiAgICAgICAgICAgICAgICBzZWxmLl9hYnNvbHV0ZV91cmwodXJsKSwgaHBlLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICByZXR1cm4gaHR0cGxpYl9yZXNwb25zZQoKICAgIGRlZiBfYWJzb2x1dGVfdXJsKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBVcmwoc2NoZW1lPXNlbGYuc2NoZW1lLCBob3N0PXNlbGYuaG9zdCwgcG9ydD1zZWxmLnBvcnQsIHBhdGg9cGF0aCkudXJsCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsb3NlIGFsbCBwb29sZWQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgIyBEaXNhYmxlIGFjY2VzcyB0byB0aGUgcG9vbAogICAgICAgIG9sZF9wb29sLCBzZWxmLnBvb2wgPSBzZWxmLnBvb2wsIE5vbmUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgY29ubiA9IG9sZF9wb29sLmdldChibG9jaz1GYWxzZSkKICAgICAgICAgICAgICAgIGlmIGNvbm46CiAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgcGFzcyAgIyBEb25lLgoKICAgIGRlZiBpc19zYW1lX2hvc3Qoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGUgZ2l2ZW4gYGB1cmxgYCBpcyBhIG1lbWJlciBvZiB0aGUgc2FtZSBob3N0IGFzIHRoaXMKICAgICAgICBjb25uZWN0aW9uIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBUT0RPOiBBZGQgb3B0aW9uYWwgc3VwcG9ydCBmb3Igc29ja2V0LmdldGhvc3RieW5hbWUgY2hlY2tpbmcuCiAgICAgICAgc2NoZW1lLCBob3N0LCBwb3J0ID0gZ2V0X2hvc3QodXJsKQoKICAgICAgICBob3N0ID0gX2lwdjZfaG9zdChob3N0KS5sb3dlcigpCgogICAgICAgICMgVXNlIGV4cGxpY2l0IGRlZmF1bHQgcG9ydCBmb3IgY29tcGFyaXNvbiB3aGVuIG5vbmUgaXMgZ2l2ZW4KICAgICAgICBpZiBzZWxmLnBvcnQgYW5kIG5vdCBwb3J0OgogICAgICAgICAgICBwb3J0ID0gcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSkKICAgICAgICBlbGlmIG5vdCBzZWxmLnBvcnQgYW5kIHBvcnQgPT0gcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSk6CiAgICAgICAgICAgIHBvcnQgPSBOb25lCgogICAgICAgIHJldHVybiAoc2NoZW1lLCBob3N0LCBwb3J0KSA9PSAoc2VsZi5zY2hlbWUsIHNlbGYuaG9zdCwgc2VsZi5wb3J0KQoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgcmVkaXJlY3Q9VHJ1ZSwgYXNzZXJ0X3NhbWVfaG9zdD1UcnVlLCB0aW1lb3V0PV9EZWZhdWx0LAogICAgICAgICAgICAgICAgcG9vbF90aW1lb3V0PU5vbmUsIHJlbGVhc2VfY29ubj1Ob25lLCBjaHVua2VkPUZhbHNlLAogICAgICAgICAgICAgICAgYm9keV9wb3M9Tm9uZSwgKipyZXNwb25zZV9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sIGFuZCBwZXJmb3JtIGFuIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyB0aGUKICAgICAgICBsb3dlc3QgbGV2ZWwgY2FsbCBmb3IgbWFraW5nIGEgcmVxdWVzdCwgc28geW91J2xsIG5lZWQgdG8gc3BlY2lmeSBhbGwKICAgICAgICB0aGUgcmF3IGRldGFpbHMuCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBNb3JlIGNvbW1vbmx5LCBpdCdzIGFwcHJvcHJpYXRlIHRvIHVzZSBhIGNvbnZlbmllbmNlIG1ldGhvZCBwcm92aWRlZAogICAgICAgICAgIGJ5IDpjbGFzczpgLlJlcXVlc3RNZXRob2RzYCwgc3VjaCBhcyA6bWV0aDpgcmVxdWVzdGAuCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBgcmVsZWFzZV9jb25uYCB3aWxsIG9ubHkgYmVoYXZlIGFzIGV4cGVjdGVkIGlmCiAgICAgICAgICAgYHByZWxvYWRfY29udGVudD1GYWxzZWAgYmVjYXVzZSB3ZSB3YW50IHRvIG1ha2UKICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PUZhbHNlYCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgc29tZWRheSBzb29uIHdpdGhvdXQKICAgICAgICAgICBicmVha2luZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgOnBhcmFtIG1ldGhvZDoKICAgICAgICAgICAgSFRUUCByZXF1ZXN0IG1ldGhvZCAoc3VjaCBhcyBHRVQsIFBPU1QsIFBVVCwgZXRjLikKCiAgICAgICAgOnBhcmFtIGJvZHk6CiAgICAgICAgICAgIERhdGEgdG8gc2VuZCBpbiB0aGUgcmVxdWVzdCBib2R5ICh1c2VmdWwgZm9yIGNyZWF0aW5nCiAgICAgICAgICAgIFBPU1QgcmVxdWVzdHMsIHNlZSBIVFRQQ29ubmVjdGlvblBvb2wucG9zdF91cmwgZm9yCiAgICAgICAgICAgIG1vcmUgY29udmVuaWVuY2UpLgoKICAgICAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICAgICAgRGljdGlvbmFyeSBvZiBjdXN0b20gaGVhZGVycyB0byBzZW5kLCBzdWNoIGFzIFVzZXItQWdlbnQsCiAgICAgICAgICAgIElmLU5vbmUtTWF0Y2gsIGV0Yy4gSWYgTm9uZSwgcG9vbCBoZWFkZXJzIGFyZSB1c2VkLiBJZiBwcm92aWRlZCwKICAgICAgICAgICAgdGhlc2UgaGVhZGVycyBjb21wbGV0ZWx5IHJlcGxhY2UgYW55IHBvb2wtc3BlY2lmaWMgaGVhZGVycy4KCiAgICAgICAgOnBhcmFtIHJldHJpZXM6CiAgICAgICAgICAgIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgdG8gYWxsb3cgYmVmb3JlIHJhaXNpbmcgYQogICAgICAgICAgICA6Y2xhc3M6YH51cmxsaWIzLmV4Y2VwdGlvbnMuTWF4UmV0cnlFcnJvcmAgZXhjZXB0aW9uLgoKICAgICAgICAgICAgUGFzcyBgYE5vbmVgYCB0byByZXRyeSB1bnRpbCB5b3UgcmVjZWl2ZSBhIHJlc3BvbnNlLiBQYXNzIGEKICAgICAgICAgICAgOmNsYXNzOmB+dXJsbGliMy51dGlsLnJldHJ5LlJldHJ5YCBvYmplY3QgZm9yIGZpbmUtZ3JhaW5lZCBjb250cm9sCiAgICAgICAgICAgIG92ZXIgZGlmZmVyZW50IHR5cGVzIG9mIHJldHJpZXMuCiAgICAgICAgICAgIFBhc3MgYW4gaW50ZWdlciBudW1iZXIgdG8gcmV0cnkgY29ubmVjdGlvbiBlcnJvcnMgdGhhdCBtYW55IHRpbWVzLAogICAgICAgICAgICBidXQgbm8gb3RoZXIgdHlwZXMgb2YgZXJyb3JzLiBQYXNzIHplcm8gdG8gbmV2ZXIgcmV0cnkuCgogICAgICAgICAgICBJZiBgYEZhbHNlYGAsIHRoZW4gcmV0cmllcyBhcmUgZGlzYWJsZWQgYW5kIGFueSBleGNlcHRpb24gaXMgcmFpc2VkCiAgICAgICAgICAgIGltbWVkaWF0ZWx5LiBBbHNvLCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBNYXhSZXRyeUVycm9yIG9uIHJlZGlyZWN0cywKICAgICAgICAgICAgdGhlIHJlZGlyZWN0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQuCgogICAgICAgIDp0eXBlIHJldHJpZXM6IDpjbGFzczpgfnVybGxpYjMudXRpbC5yZXRyeS5SZXRyeWAsIEZhbHNlLCBvciBhbiBpbnQuCgogICAgICAgIDpwYXJhbSByZWRpcmVjdDoKICAgICAgICAgICAgSWYgVHJ1ZSwgYXV0b21hdGljYWxseSBoYW5kbGUgcmVkaXJlY3RzIChzdGF0dXMgY29kZXMgMzAxLCAzMDIsCiAgICAgICAgICAgIDMwMywgMzA3LCAzMDgpLiBFYWNoIHJlZGlyZWN0IGNvdW50cyBhcyBhIHJldHJ5LiBEaXNhYmxpbmcgcmV0cmllcwogICAgICAgICAgICB3aWxsIGRpc2FibGUgcmVkaXJlY3QsIHRvby4KCiAgICAgICAgOnBhcmFtIGFzc2VydF9zYW1lX2hvc3Q6CiAgICAgICAgICAgIElmIGBgVHJ1ZWBgLCB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZSBob3N0IG9mIHRoZSBwb29sIHJlcXVlc3RzIGlzCiAgICAgICAgICAgIGNvbnNpc3RlbnQgZWxzZSB3aWxsIHJhaXNlIEhvc3RDaGFuZ2VkRXJyb3IuIFdoZW4gRmFsc2UsIHlvdSBjYW4KICAgICAgICAgICAgdXNlIHRoZSBwb29sIG9uIGFuIEhUVFAgcHJveHkgYW5kIHJlcXVlc3QgZm9yZWlnbiBob3N0cy4KCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgICAgIElmIHNwZWNpZmllZCwgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHRoaXMgb25lCiAgICAgICAgICAgIHJlcXVlc3QuIEl0IG1heSBiZSBhIGZsb2F0IChpbiBzZWNvbmRzKSBvciBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YC4KCiAgICAgICAgOnBhcmFtIHBvb2xfdGltZW91dDoKICAgICAgICAgICAgSWYgc2V0IGFuZCB0aGUgcG9vbCBpcyBzZXQgdG8gYmxvY2s9VHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCiAgICAgICAgICAgIGJsb2NrIGZvciBgYHBvb2xfdGltZW91dGBgIHNlY29uZHMgYW5kIHJhaXNlIEVtcHR5UG9vbEVycm9yIGlmIG5vCiAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgdGltZSBwZXJpb2QuCgogICAgICAgIDpwYXJhbSByZWxlYXNlX2Nvbm46CiAgICAgICAgICAgIElmIEZhbHNlLCB0aGVuIHRoZSB1cmxvcGVuIGNhbGwgd2lsbCBub3QgcmVsZWFzZSB0aGUgY29ubmVjdGlvbgogICAgICAgICAgICBiYWNrIGludG8gdGhlIHBvb2wgb25jZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkIChidXQgd2lsbCByZWxlYXNlIGlmCiAgICAgICAgICAgIHlvdSByZWFkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHJlc3BvbnNlIHN1Y2ggYXMgd2hlbgogICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PVRydWVgKS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91J3JlIG5vdCBwcmVsb2FkaW5nCiAgICAgICAgICAgIHRoZSByZXNwb25zZSdzIGNvbnRlbnQgaW1tZWRpYXRlbHkuIFlvdSB3aWxsIG5lZWQgdG8gY2FsbAogICAgICAgICAgICBgYHIucmVsZWFzZV9jb25uKClgYCBvbiB0aGUgcmVzcG9uc2UgYGByYGAgdG8gcmV0dXJuIHRoZSBjb25uZWN0aW9uCiAgICAgICAgICAgIGJhY2sgaW50byB0aGUgcG9vbC4gSWYgTm9uZSwgaXQgdGFrZXMgdGhlIHZhbHVlIG9mCiAgICAgICAgICAgIGBgcmVzcG9uc2Vfa3cuZ2V0KCdwcmVsb2FkX2NvbnRlbnQnLCBUcnVlKWBgLgoKICAgICAgICA6cGFyYW0gY2h1bmtlZDoKICAgICAgICAgICAgSWYgVHJ1ZSwgdXJsbGliMyB3aWxsIHNlbmQgdGhlIGJvZHkgdXNpbmcgY2h1bmtlZCB0cmFuc2ZlcgogICAgICAgICAgICBlbmNvZGluZy4gT3RoZXJ3aXNlLCB1cmxsaWIzIHdpbGwgc2VuZCB0aGUgYm9keSB1c2luZyB0aGUgc3RhbmRhcmQKICAgICAgICAgICAgY29udGVudC1sZW5ndGggZm9ybS4gRGVmYXVsdHMgdG8gRmFsc2UuCgogICAgICAgIDpwYXJhbSBpbnQgYm9keV9wb3M6CiAgICAgICAgICAgIFBvc2l0aW9uIHRvIHNlZWsgdG8gaW4gZmlsZS1saWtlIGJvZHkgaW4gdGhlIGV2ZW50IG9mIGEgcmV0cnkgb3IKICAgICAgICAgICAgcmVkaXJlY3QuIFR5cGljYWxseSB0aGlzIHdvbid0IG5lZWQgdG8gYmUgc2V0IGJlY2F1c2UgdXJsbGliMyB3aWxsCiAgICAgICAgICAgIGF1dG8tcG9wdWxhdGUgdGhlIHZhbHVlIHdoZW4gbmVlZGVkLgoKICAgICAgICA6cGFyYW0gXFwqKnJlc3BvbnNlX2t3OgogICAgICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0bwogICAgICAgICAgICA6bWV0aDpgdXJsbGliMy5yZXNwb25zZS5IVFRQUmVzcG9uc2UuZnJvbV9odHRwbGliYAogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5mcm9tX2ludChyZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwgZGVmYXVsdD1zZWxmLnJldHJpZXMpCgogICAgICAgIGlmIHJlbGVhc2VfY29ubiBpcyBOb25lOgogICAgICAgICAgICByZWxlYXNlX2Nvbm4gPSByZXNwb25zZV9rdy5nZXQoJ3ByZWxvYWRfY29udGVudCcsIFRydWUpCgogICAgICAgICMgQ2hlY2sgaG9zdAogICAgICAgIGlmIGFzc2VydF9zYW1lX2hvc3QgYW5kIG5vdCBzZWxmLmlzX3NhbWVfaG9zdCh1cmwpOgogICAgICAgICAgICByYWlzZSBIb3N0Q2hhbmdlZEVycm9yKHNlbGYsIHVybCwgcmV0cmllcykKCiAgICAgICAgY29ubiA9IE5vbmUKCiAgICAgICAgIyBUcmFjayB3aGV0aGVyIGBjb25uYCBuZWVkcyB0byBiZSByZWxlYXNlZCBiZWZvcmUKICAgICAgICAjIHJldHVybmluZy9yYWlzaW5nL3JlY3Vyc2luZy4gVXBkYXRlIHRoaXMgdmFyaWFibGUgaWYgbmVjZXNzYXJ5LCBhbmQKICAgICAgICAjIGxlYXZlIGByZWxlYXNlX2Nvbm5gIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIGZ1bmN0aW9uLiBUaGF0IHdheSwgaWYKICAgICAgICAjIHRoZSBmdW5jdGlvbiByZWN1cnNlcywgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGByZWxlYXNlX2Nvbm5gIHdpbGwgYmUKICAgICAgICAjIHBhc3NlZCBkb3duIGludG8gdGhlIHJlY3Vyc2l2ZSBjYWxsLCBhbmQgaXRzIHZhbHVlIHdpbGwgYmUgcmVzcGVjdGVkLgogICAgICAgICMKICAgICAgICAjIFNlZSBpc3N1ZSAjNjUxIFsxXSBmb3IgZGV0YWlscy4KICAgICAgICAjCiAgICAgICAgIyBbMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9pc3N1ZXMvNjUxPgogICAgICAgIHJlbGVhc2VfdGhpc19jb25uID0gcmVsZWFzZV9jb25uCgogICAgICAgICMgTWVyZ2UgdGhlIHByb3h5IGhlYWRlcnMuIE9ubHkgZG8gdGhpcyBpbiBIVFRQLiBXZSBoYXZlIHRvIGNvcHkgdGhlCiAgICAgICAgIyBoZWFkZXJzIGRpY3Qgc28gd2UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgd2l0aG91dCB0aG9zZSBjaGFuZ2VzIGJlaW5nCiAgICAgICAgIyByZWZsZWN0ZWQgaW4gYW55b25lIGVsc2UncyBjb3B5LgogICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuY29weSgpCiAgICAgICAgICAgIGhlYWRlcnMudXBkYXRlKHNlbGYucHJveHlfaGVhZGVycykKCiAgICAgICAgIyBNdXN0IGtlZXAgdGhlIGV4Y2VwdGlvbiBib3VuZCB0byBhIHNlcGFyYXRlIHZhcmlhYmxlIG9yIGVsc2UgUHl0aG9uIDMKICAgICAgICAjIGNvbXBsYWlucyBhYm91dCBVbmJvdW5kTG9jYWxFcnJvci4KICAgICAgICBlcnIgPSBOb25lCgogICAgICAgICMgS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGNsZWFubHkgZXhpdGVkIHRoZSBleGNlcHQgYmxvY2suIFRoaXMKICAgICAgICAjIGVuc3VyZXMgd2UgZG8gcHJvcGVyIGNsZWFudXAgaW4gZmluYWxseS4KICAgICAgICBjbGVhbl9leGl0ID0gRmFsc2UKCiAgICAgICAgIyBSZXdpbmQgYm9keSBwb3NpdGlvbiwgaWYgbmVlZGVkLiBSZWNvcmQgY3VycmVudCBwb3NpdGlvbgogICAgICAgICMgZm9yIGZ1dHVyZSByZXdpbmRzIGluIHRoZSBldmVudCBvZiBhIHJlZGlyZWN0L3JldHJ5LgogICAgICAgIGJvZHlfcG9zID0gc2V0X2ZpbGVfcG9zaXRpb24oYm9keSwgYm9keV9wb3MpCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBSZXF1ZXN0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBxdWV1ZS4KICAgICAgICAgICAgdGltZW91dF9vYmogPSBzZWxmLl9nZXRfdGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICBjb25uID0gc2VsZi5fZ2V0X2Nvbm4odGltZW91dD1wb29sX3RpbWVvdXQpCgogICAgICAgICAgICBjb25uLnRpbWVvdXQgPSB0aW1lb3V0X29iai5jb25uZWN0X3RpbWVvdXQKCiAgICAgICAgICAgIGlzX25ld19wcm94eV9jb25uID0gc2VsZi5wcm94eSBpcyBub3QgTm9uZSBhbmQgbm90IGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKQogICAgICAgICAgICBpZiBpc19uZXdfcHJveHlfY29ubjoKICAgICAgICAgICAgICAgIHNlbGYuX3ByZXBhcmVfcHJveHkoY29ubikKCiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVxdWVzdCBvbiB0aGUgaHR0cGxpYiBjb25uZWN0aW9uIG9iamVjdC4KICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZSA9IHNlbGYuX21ha2VfcmVxdWVzdChjb25uLCBtZXRob2QsIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXRfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk9Ym9keSwgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQ9Y2h1bmtlZCkKCiAgICAgICAgICAgICMgSWYgd2UncmUgZ29pbmcgdG8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBpbiBgYGZpbmFsbHk6YGAsIHRoZW4KICAgICAgICAgICAgIyB0aGUgcmVzcG9uc2UgZG9lc24ndCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIGNvbm5lY3Rpb24uIE90aGVyd2lzZQogICAgICAgICAgICAjIGl0IHdpbGwgYWxzbyB0cnkgdG8gcmVsZWFzZSBpdCBhbmQgd2UnbGwgaGF2ZSBhIGRvdWJsZS1yZWxlYXNlCiAgICAgICAgICAgICMgbWVzcy4KICAgICAgICAgICAgcmVzcG9uc2VfY29ubiA9IGNvbm4gaWYgbm90IHJlbGVhc2VfY29ubiBlbHNlIE5vbmUKCiAgICAgICAgICAgICMgUGFzcyBtZXRob2QgdG8gUmVzcG9uc2UgZm9yIGxlbmd0aCBjaGVja2luZwogICAgICAgICAgICByZXNwb25zZV9rd1sncmVxdWVzdF9tZXRob2QnXSA9IG1ldGhvZAoKICAgICAgICAgICAgIyBJbXBvcnQgaHR0cGxpYidzIHJlc3BvbnNlIGludG8gb3VyIG93biB3cmFwcGVyIG9iamVjdAogICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuUmVzcG9uc2VDbHMuZnJvbV9odHRwbGliKGh0dHBsaWJfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbD1zZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb249cmVzcG9uc2VfY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgICAgICMgRXZlcnl0aGluZyB3ZW50IGdyZWF0IQogICAgICAgICAgICBjbGVhbl9leGl0ID0gVHJ1ZQoKICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CiAgICAgICAgICAgICMgVGltZWQgb3V0IGJ5IHF1ZXVlLgogICAgICAgICAgICByYWlzZSBFbXB0eVBvb2xFcnJvcihzZWxmLCAiTm8gcG9vbCBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLiIpCgogICAgICAgIGV4Y2VwdCAoVGltZW91dEVycm9yLCBIVFRQRXhjZXB0aW9uLCBTb2NrZXRFcnJvciwgUHJvdG9jb2xFcnJvciwKICAgICAgICAgICAgICAgIEJhc2VTU0xFcnJvciwgU1NMRXJyb3IsIENlcnRpZmljYXRlRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICMgRGlzY2FyZCB0aGUgY29ubmVjdGlvbiBmb3IgdGhlc2UgZXhjZXB0aW9ucy4gSXQgd2lsbCBiZQogICAgICAgICAgICAjIHJlcGxhY2VkIGR1cmluZyB0aGUgbmV4dCBfZ2V0X2Nvbm4oKSBjYWxsLgogICAgICAgICAgICBjbGVhbl9leGl0ID0gRmFsc2UKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCAoQmFzZVNTTEVycm9yLCBDZXJ0aWZpY2F0ZUVycm9yKSk6CiAgICAgICAgICAgICAgICBlID0gU1NMRXJyb3IoZSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIChTb2NrZXRFcnJvciwgTmV3Q29ubmVjdGlvbkVycm9yKSkgYW5kIHNlbGYucHJveHk6CiAgICAgICAgICAgICAgICBlID0gUHJveHlFcnJvcignQ2Fubm90IGNvbm5lY3QgdG8gcHJveHkuJywgZSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIChTb2NrZXRFcnJvciwgSFRUUEV4Y2VwdGlvbikpOgogICAgICAgICAgICAgICAgZSA9IFByb3RvY29sRXJyb3IoJ0Nvbm5lY3Rpb24gYWJvcnRlZC4nLCBlKQoKICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCBlcnJvcj1lLCBfcG9vbD1zZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YWNrdHJhY2U9c3lzLmV4Y19pbmZvKClbMl0pCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXAoKQoKICAgICAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHRoZSBlcnJvciBmb3IgdGhlIHJldHJ5IHdhcm5pbmcuCiAgICAgICAgICAgIGVyciA9IGUKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgbm90IGNsZWFuX2V4aXQ6CiAgICAgICAgICAgICAgICAjIFdlIGhpdCBzb21lIGtpbmQgb2YgZXhjZXB0aW9uLCBoYW5kbGVkIG9yIG90aGVyd2lzZS4gV2UgbmVlZAogICAgICAgICAgICAgICAgIyB0byB0aHJvdyB0aGUgY29ubmVjdGlvbiBhd2F5IHVubGVzcyBleHBsaWNpdGx5IHRvbGQgbm90IHRvLgogICAgICAgICAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgc2V0IHRoZSB2YXJpYWJsZSB0byBOb25lLCBhbmQgbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAjIHdlIHB1dCB0aGUgTm9uZSBiYWNrIGluIHRoZSBwb29sIHRvIGF2b2lkIGxlYWtpbmcgaXQuCiAgICAgICAgICAgICAgICBjb25uID0gY29ubiBhbmQgY29ubi5jbG9zZSgpCiAgICAgICAgICAgICAgICByZWxlYXNlX3RoaXNfY29ubiA9IFRydWUKCiAgICAgICAgICAgIGlmIHJlbGVhc2VfdGhpc19jb25uOgogICAgICAgICAgICAgICAgIyBQdXQgdGhlIGNvbm5lY3Rpb24gYmFjayB0byBiZSByZXVzZWQuIElmIHRoZSBjb25uZWN0aW9uIGlzCiAgICAgICAgICAgICAgICAjIGV4cGlyZWQgdGhlbiBpdCB3aWxsIGJlIE5vbmUsIHdoaWNoIHdpbGwgZ2V0IHJlcGxhY2VkIHdpdGggYQogICAgICAgICAgICAgICAgIyBmcmVzaCBjb25uZWN0aW9uIGR1cmluZyBfZ2V0X2Nvbm4uCiAgICAgICAgICAgICAgICBzZWxmLl9wdXRfY29ubihjb25uKQoKICAgICAgICBpZiBub3QgY29ubjoKICAgICAgICAgICAgIyBUcnkgYWdhaW4KICAgICAgICAgICAgbG9nLndhcm5pbmcoIlJldHJ5aW5nICglcikgYWZ0ZXIgY29ubmVjdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJicm9rZW4gYnkgJyVyJzogJXMiLCByZXRyaWVzLCBlcnIsIHVybCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycywgcmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCwgYXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb25uPXJlbGVhc2VfY29ubiwgYm9keV9wb3M9Ym9keV9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgZGVmIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIGRpc2NhcmQgYW55IHJlbWFpbmluZyByZXNwb25zZSBib2R5LCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wgb25jZSB0aGUgZW50aXJlIHJlc3BvbnNlIGlzIHJlYWQKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWQoKQogICAgICAgICAgICBleGNlcHQgKFRpbWVvdXRFcnJvciwgSFRUUEV4Y2VwdGlvbiwgU29ja2V0RXJyb3IsIFByb3RvY29sRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQmFzZVNTTEVycm9yLCBTU0xFcnJvcikgYXMgZToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBIYW5kbGUgcmVkaXJlY3Q/CiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZWRpcmVjdCBhbmQgcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICBpZiByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMzoKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIHJlc3BvbnNlPXJlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICAgICAgIyBEcmFpbiBhbmQgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBmb3IgdGhpcyByZXNwb25zZSwgc2luY2UKICAgICAgICAgICAgICAgICAgICAjIHdlJ3JlIG5vdCByZXR1cm5pbmcgaXQgdG8gYmUgcmVsZWFzZWQgbWFudWFsbHkuCiAgICAgICAgICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICAgICAjIGRyYWluIGFuZCByZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wgYmVmb3JlIHJlY3Vyc2luZwogICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQoKICAgICAgICAgICAgcmV0cmllcy5zbGVlcF9mb3JfcmV0cnkocmVzcG9uc2UpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVkaXJlY3RpbmcgJXMgLT4gJXMiLCB1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgbWV0aG9kLCByZWRpcmVjdF9sb2NhdGlvbiwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PWFzc2VydF9zYW1lX2hvc3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLCBib2R5X3Bvcz1ib2R5X3BvcywKICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IHRoZSBIVFRQIHJlc3BvbnNlLgogICAgICAgIGhhc19yZXRyeV9hZnRlciA9IGJvb2wocmVzcG9uc2UuZ2V0aGVhZGVyKCdSZXRyeS1BZnRlcicpKQogICAgICAgIGlmIHJldHJpZXMuaXNfcmV0cnkobWV0aG9kLCByZXNwb25zZS5zdGF0dXMsIGhhc19yZXRyeV9hZnRlcik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9zdGF0dXM6CiAgICAgICAgICAgICAgICAgICAgIyBEcmFpbiBhbmQgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBmb3IgdGhpcyByZXNwb25zZSwgc2luY2UKICAgICAgICAgICAgICAgICAgICAjIHdlJ3JlIG5vdCByZXR1cm5pbmcgaXQgdG8gYmUgcmVsZWFzZWQgbWFudWFsbHkuCiAgICAgICAgICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICAgICAjIGRyYWluIGFuZCByZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wgYmVmb3JlIHJlY3Vyc2luZwogICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQoKICAgICAgICAgICAgcmV0cmllcy5zbGVlcChyZXNwb25zZSkKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyeTogJXMiLCB1cmwpCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PWFzc2VydF9zYW1lX2hvc3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLAogICAgICAgICAgICAgICAgYm9keV9wb3M9Ym9keV9wb3MsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgIHJldHVybiByZXNwb25zZQoKCmNsYXNzIEhUVFBTQ29ubmVjdGlvblBvb2woSFRUUENvbm5lY3Rpb25Qb29sKToKICAgICIiIgogICAgU2FtZSBhcyA6Y2xhc3M6YC5IVFRQQ29ubmVjdGlvblBvb2xgLCBidXQgSFRUUFMuCgogICAgV2hlbiBQeXRob24gaXMgY29tcGlsZWQgd2l0aCB0aGUgOm1vZDpgc3NsYCBtb2R1bGUsIHRoZW4KICAgIDpjbGFzczpgLlZlcmlmaWVkSFRUUFNDb25uZWN0aW9uYCBpcyB1c2VkLCB3aGljaCAqY2FuKiB2ZXJpZnkgY2VydGlmaWNhdGVzLAogICAgaW5zdGVhZCBvZiA6Y2xhc3M6YC5IVFRQU0Nvbm5lY3Rpb25gLgoKICAgIDpjbGFzczpgLlZlcmlmaWVkSFRUUFNDb25uZWN0aW9uYCB1c2VzIG9uZSBvZiBgYGFzc2VydF9maW5nZXJwcmludGBgLAogICAgYGBhc3NlcnRfaG9zdG5hbWVgYCBhbmQgYGBob3N0YGAgaW4gdGhpcyBvcmRlciB0byB2ZXJpZnkgY29ubmVjdGlvbnMuCiAgICBJZiBgYGFzc2VydF9ob3N0bmFtZWBgIGlzIEZhbHNlLCBubyB2ZXJpZmljYXRpb24gaXMgZG9uZS4KCiAgICBUaGUgYGBrZXlfZmlsZWBgLCBgYGNlcnRfZmlsZWBgLCBgYGNlcnRfcmVxc2BgLCBgYGNhX2NlcnRzYGAsCiAgICBgYGNhX2NlcnRfZGlyYGAsIGFuZCBgYHNzbF92ZXJzaW9uYGAgYXJlIG9ubHkgdXNlZCBpZiA6bW9kOmBzc2xgIGlzCiAgICBhdmFpbGFibGUgYW5kIGFyZSBmZWQgaW50byA6bWV0aDpgdXJsbGliMy51dGlsLnNzbF93cmFwX3NvY2tldGAgdG8gdXBncmFkZQogICAgdGhlIGNvbm5lY3Rpb24gc29ja2V0IGludG8gYW4gU1NMIHNvY2tldC4KICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwcycKICAgIENvbm5lY3Rpb25DbHMgPSBIVFRQU0Nvbm5lY3Rpb24KCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD1GYWxzZSwgdGltZW91dD1UaW1lb3V0LkRFRkFVTFRfVElNRU9VVCwgbWF4c2l6ZT0xLAogICAgICAgICAgICAgICAgIGJsb2NrPUZhbHNlLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwKICAgICAgICAgICAgICAgICBfcHJveHk9Tm9uZSwgX3Byb3h5X2hlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwgY2VydF9yZXFzPU5vbmUsCiAgICAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwgc3NsX3ZlcnNpb249Tm9uZSwKICAgICAgICAgICAgICAgICBhc3NlcnRfaG9zdG5hbWU9Tm9uZSwgYXNzZXJ0X2ZpbmdlcnByaW50PU5vbmUsCiAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9Tm9uZSwgKipjb25uX2t3KToKCiAgICAgICAgSFRUUENvbm5lY3Rpb25Qb29sLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmljdCwgdGltZW91dCwgbWF4c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIGhlYWRlcnMsIHJldHJpZXMsIF9wcm94eSwgX3Byb3h5X2hlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqY29ubl9rdykKCiAgICAgICAgaWYgY2FfY2VydHMgYW5kIGNlcnRfcmVxcyBpcyBOb25lOgogICAgICAgICAgICBjZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKCiAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCiAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IGNlcnRfcmVxcwogICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cwogICAgICAgIHNlbGYuY2FfY2VydF9kaXIgPSBjYV9jZXJ0X2RpcgogICAgICAgIHNlbGYuc3NsX3ZlcnNpb24gPSBzc2xfdmVyc2lvbgogICAgICAgIHNlbGYuYXNzZXJ0X2hvc3RuYW1lID0gYXNzZXJ0X2hvc3RuYW1lCiAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgPSBhc3NlcnRfZmluZ2VycHJpbnQKCiAgICBkZWYgX3ByZXBhcmVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBgYGNvbm5lY3Rpb25gYCBmb3IgOm1ldGg6YHVybGxpYjMudXRpbC5zc2xfd3JhcF9zb2NrZXRgCiAgICAgICAgYW5kIGVzdGFibGlzaCB0aGUgdHVubmVsIGlmIHByb3h5IGlzIHVzZWQuCiAgICAgICAgIiIiCgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29ubiwgVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24pOgogICAgICAgICAgICBjb25uLnNldF9jZXJ0KGtleV9maWxlPXNlbGYua2V5X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zZWxmLmNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPXNlbGYuY2FfY2VydF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X2hvc3RuYW1lPXNlbGYuYXNzZXJ0X2hvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9maW5nZXJwcmludD1zZWxmLmFzc2VydF9maW5nZXJwcmludCkKICAgICAgICAgICAgY29ubi5zc2xfdmVyc2lvbiA9IHNlbGYuc3NsX3ZlcnNpb24KICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBfcHJlcGFyZV9wcm94eShzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBFc3RhYmxpc2ggdHVubmVsIGNvbm5lY3Rpb24gZWFybHksIGJlY2F1c2Ugb3RoZXJ3aXNlIGh0dHBsaWIKICAgICAgICB3b3VsZCBpbXByb3Blcmx5IHNldCBIb3N0OiBoZWFkZXIgdG8gcHJveHkncyBJUDpwb3J0LgogICAgICAgICIiIgogICAgICAgICMgUHl0aG9uIDIuNysKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNldF90dW5uZWwgPSBjb25uLnNldF90dW5uZWwKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgICAgIHNldF90dW5uZWwgPSBjb25uLl9zZXRfdHVubmVsCgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPD0gKDIsIDYsIDQpIGFuZCBub3Qgc2VsZi5wcm94eV9oZWFkZXJzOiAgIyBQeXRob24gMi42LjQgYW5kIG9sZGVyCiAgICAgICAgICAgIHNldF90dW5uZWwoc2VsZi5fcHJveHlfaG9zdCwgc2VsZi5wb3J0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNldF90dW5uZWwoc2VsZi5fcHJveHlfaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnByb3h5X2hlYWRlcnMpCgogICAgICAgIGNvbm4uY29ubmVjdCgpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBmcmVzaCA6Y2xhc3M6YGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uYC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyBuZXcgSFRUUFMgY29ubmVjdGlvbiAoJWQpOiAlcyIsCiAgICAgICAgICAgICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zLCBzZWxmLmhvc3QpCgogICAgICAgIGlmIG5vdCBzZWxmLkNvbm5lY3Rpb25DbHMgb3Igc2VsZi5Db25uZWN0aW9uQ2xzIGlzIER1bW15Q29ubmVjdGlvbjoKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoIkNhbid0IGNvbm5lY3QgdG8gSFRUUFMgVVJMIGJlY2F1c2UgdGhlIFNTTCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgaXMgbm90IGF2YWlsYWJsZS4iKQoKICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuaG9zdAogICAgICAgIGFjdHVhbF9wb3J0ID0gc2VsZi5wb3J0CiAgICAgICAgaWYgc2VsZi5wcm94eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLnByb3h5Lmhvc3QKICAgICAgICAgICAgYWN0dWFsX3BvcnQgPSBzZWxmLnByb3h5LnBvcnQKCiAgICAgICAgY29ubiA9IHNlbGYuQ29ubmVjdGlvbkNscyhob3N0PWFjdHVhbF9ob3N0LCBwb3J0PWFjdHVhbF9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLnRpbWVvdXQuY29ubmVjdF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PXNlbGYuc3RyaWN0LCAqKnNlbGYuY29ubl9rdykKCiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXBhcmVfY29ubihjb25uKQoKICAgIGRlZiBfdmFsaWRhdGVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgcmlnaHQgYmVmb3JlIGEgcmVxdWVzdCBpcyBtYWRlLCBhZnRlciB0aGUgc29ja2V0IGlzIGNyZWF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoSFRUUFNDb25uZWN0aW9uUG9vbCwgc2VsZikuX3ZhbGlkYXRlX2Nvbm4oY29ubikKCiAgICAgICAgIyBGb3JjZSBjb25uZWN0IGVhcmx5IHRvIGFsbG93IHVzIHRvIHZhbGlkYXRlIHRoZSBjb25uZWN0aW9uLgogICAgICAgIGlmIG5vdCBnZXRhdHRyKGNvbm4sICdzb2NrJywgTm9uZSk6ICAjIEFwcEVuZ2luZSBtaWdodCBub3QgaGF2ZSAgYC5zb2NrYAogICAgICAgICAgICBjb25uLmNvbm5lY3QoKQoKICAgICAgICBpZiBub3QgY29ubi5pc192ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAnVW52ZXJpZmllZCBIVFRQUyByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuICcKICAgICAgICAgICAgICAgICdBZGRpbmcgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIHN0cm9uZ2x5IGFkdmlzZWQuIFNlZTogJwogICAgICAgICAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAgICAgICAgICcjc3NsLXdhcm5pbmdzJyksCiAgICAgICAgICAgICAgICBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nKQoKCmRlZiBjb25uZWN0aW9uX2Zyb21fdXJsKHVybCwgKiprdyk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsLCByZXR1cm4gYW4gOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgIGluc3RhbmNlIG9mIGl0cyBob3N0LgoKICAgIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3Igbm90IGhhdmluZyB0byBwYXJzZSBvdXQgdGhlIHNjaGVtZSwgaG9zdCwgYW5kIHBvcnQKICAgIG9mIHRoZSB1cmwgYmVmb3JlIGNyZWF0aW5nIGFuIDpjbGFzczpgLkNvbm5lY3Rpb25Qb29sYCBpbnN0YW5jZS4KCiAgICA6cGFyYW0gdXJsOgogICAgICAgIEFic29sdXRlIFVSTCBzdHJpbmcgdGhhdCBtdXN0IGluY2x1ZGUgdGhlIHNjaGVtZS4gUG9ydCBpcyBvcHRpb25hbC4KCiAgICA6cGFyYW0gXFwqKmt3OgogICAgICAgIFBhc3NlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBhcHByb3ByaWF0ZQogICAgICAgIDpjbGFzczpgLkNvbm5lY3Rpb25Qb29sYC4gVXNlZnVsIGZvciBzcGVjaWZ5aW5nIHRoaW5ncyBsaWtlCiAgICAgICAgdGltZW91dCwgbWF4c2l6ZSwgaGVhZGVycywgZXRjLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gY29ubiA9IGNvbm5lY3Rpb25fZnJvbV91cmwoJ2h0dHA6Ly9nb29nbGUuY29tLycpCiAgICAgICAgPj4+IHIgPSBjb25uLnJlcXVlc3QoJ0dFVCcsICcvJykKICAgICIiIgogICAgc2NoZW1lLCBob3N0LCBwb3J0ID0gZ2V0X2hvc3QodXJsKQogICAgcG9ydCA9IHBvcnQgb3IgcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSwgODApCiAgICBpZiBzY2hlbWUgPT0gJ2h0dHBzJzoKICAgICAgICByZXR1cm4gSFRUUFNDb25uZWN0aW9uUG9vbChob3N0LCBwb3J0PXBvcnQsICoqa3cpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBIVFRQQ29ubmVjdGlvblBvb2woaG9zdCwgcG9ydD1wb3J0LCAqKmt3KQoKCmRlZiBfaXB2Nl9ob3N0KGhvc3QpOgogICAgIiIiCiAgICBQcm9jZXNzIElQdjYgYWRkcmVzcyBsaXRlcmFscwogICAgIiIiCgogICAgIyBodHRwbGliIGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHdlIGluY2x1ZGUgYnJhY2tldHMgaW4gSVB2NiBhZGRyZXNzZXMKICAgICMgU3BlY2lmaWNhbGx5LCBpZiB3ZSBpbmNsdWRlIGJyYWNrZXRzIGJ1dCBhbHNvIHBhc3MgdGhlIHBvcnQgdGhlbgogICAgIyBodHRwbGliIGNyYXppbHkgZG91YmxlcyB1cCB0aGUgc3F1YXJlIGJyYWNrZXRzIG9uIHRoZSBIb3N0IGhlYWRlci4KICAgICMgSW5zdGVhZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgbmV2ZXIgcGFzcyBgYE5vbmVgYCBhcyB0aGUgcG9ydC4KICAgICMgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBjYW4ndCBhY3R1YWxseQogICAgIyAqYXNzZXJ0KiB0aGF0LiAgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyODUzOQogICAgIwogICAgIyBBbHNvIGlmIGFuIElQdjYgYWRkcmVzcyBsaXRlcmFsIGhhcyBhIHpvbmUgaWRlbnRpZmllciwgdGhlCiAgICAjIHBlcmNlbnQgc2lnbiBtaWdodCBiZSBVUkllbmNvZGVkLCBjb252ZXJ0IGl0IGJhY2sgaW50byBBU0NJSQogICAgaWYgaG9zdC5zdGFydHN3aXRoKCdbJykgYW5kIGhvc3QuZW5kc3dpdGgoJ10nKToKICAgICAgICBob3N0ID0gaG9zdC5yZXBsYWNlKCclMjUnLCAnJScpLnN0cmlwKCdbXScpCiAgICByZXR1cm4gaG9zdApQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABIAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQC3WYt9mEQAAJhEAABIAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2JpbmRpbmdzLnB5IiIiClRoaXMgbW9kdWxlIHVzZXMgY3R5cGVzIHRvIGJpbmQgYSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBmcm9tClNlY3VyZVRyYW5zcG9ydC4gVGhlIGdvYWwgaGVyZSBpcyB0byBwcm92aWRlIHRoZSBsb3ctbGV2ZWwgQVBJIHRvClNlY3VyZVRyYW5zcG9ydC4gVGhlc2UgYXJlIGVzc2VudGlhbGx5IHRoZSBDLWxldmVsIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzLCBhbmQKdGhleSdyZSBwcmV0dHkgZ3Jvc3MgdG8gd29yayB3aXRoLgoKVGhpcyBjb2RlIGlzIGEgYmFzdGFyZGlzZWQgdmVyc2lvbiBvZiB0aGUgY29kZSBmb3VuZCBpbiBXaWxsIEJvbmQncyBvc2NyeXB0bwpsaWJyYXJ5LiBBbiBlbm9ybW91cyBkZWJ0IGlzIG93ZWQgdG8gaGltIGZvciBibGF6aW5nIHRoaXMgdHJhaWwgZm9yIHVzLiBGb3IKdGhhdCByZWFzb24sIHRoaXMgY29kZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBjb3ZlcmVkIGJvdGggYnkgdXJsbGliMydzCmxpY2Vuc2UgYW5kIGJ5IG9zY3J5cHRvJ3M6CgogICAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgV2lsbCBCb25kIDx3aWxsQHdib25kLm5ldD4KCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKICAgIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogICAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCiAgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHBsYXRmb3JtCmZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQpmcm9tIGN0eXBlcyBpbXBvcnQgKAogICAgY192b2lkX3AsIGNfaW50MzIsIGNfY2hhcl9wLCBjX3NpemVfdCwgY19ieXRlLCBjX3VpbnQzMiwgY191bG9uZywgY19sb25nLAogICAgY19ib29sCikKZnJvbSBjdHlwZXMgaW1wb3J0IENETEwsIFBPSU5URVIsIENGVU5DVFlQRQoKCnNlY3VyaXR5X3BhdGggPSBmaW5kX2xpYnJhcnkoJ1NlY3VyaXR5JykKaWYgbm90IHNlY3VyaXR5X3BhdGg6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVGhlIGxpYnJhcnkgU2VjdXJpdHkgY291bGQgbm90IGJlIGZvdW5kJykKCgpjb3JlX2ZvdW5kYXRpb25fcGF0aCA9IGZpbmRfbGlicmFyeSgnQ29yZUZvdW5kYXRpb24nKQppZiBub3QgY29yZV9mb3VuZGF0aW9uX3BhdGg6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVGhlIGxpYnJhcnkgQ29yZUZvdW5kYXRpb24gY291bGQgbm90IGJlIGZvdW5kJykKCgp2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCnZlcnNpb25faW5mbyA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb24uc3BsaXQoJy4nKSkpCmlmIHZlcnNpb25faW5mbyA8ICgxMCwgOCk6CiAgICByYWlzZSBPU0Vycm9yKAogICAgICAgICdPbmx5IE9TIFggMTAuOCBhbmQgbmV3ZXIgYXJlIHN1cHBvcnRlZCwgbm90ICVzLiVzJyAlICgKICAgICAgICAgICAgdmVyc2lvbl9pbmZvWzBdLCB2ZXJzaW9uX2luZm9bMV0KICAgICAgICApCiAgICApCgpTZWN1cml0eSA9IENETEwoc2VjdXJpdHlfcGF0aCwgdXNlX2Vycm5vPVRydWUpCkNvcmVGb3VuZGF0aW9uID0gQ0RMTChjb3JlX2ZvdW5kYXRpb25fcGF0aCwgdXNlX2Vycm5vPVRydWUpCgpCb29sZWFuID0gY19ib29sCkNGSW5kZXggPSBjX2xvbmcKQ0ZTdHJpbmdFbmNvZGluZyA9IGNfdWludDMyCkNGRGF0YSA9IGNfdm9pZF9wCkNGU3RyaW5nID0gY192b2lkX3AKQ0ZBcnJheSA9IGNfdm9pZF9wCkNGTXV0YWJsZUFycmF5ID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5ID0gY192b2lkX3AKQ0ZFcnJvciA9IGNfdm9pZF9wCkNGVHlwZSA9IGNfdm9pZF9wCkNGVHlwZUlEID0gY191bG9uZwoKQ0ZUeXBlUmVmID0gUE9JTlRFUihDRlR5cGUpCkNGQWxsb2NhdG9yUmVmID0gY192b2lkX3AKCk9TU3RhdHVzID0gY19pbnQzMgoKQ0ZEYXRhUmVmID0gUE9JTlRFUihDRkRhdGEpCkNGU3RyaW5nUmVmID0gUE9JTlRFUihDRlN0cmluZykKQ0ZBcnJheVJlZiA9IFBPSU5URVIoQ0ZBcnJheSkKQ0ZNdXRhYmxlQXJyYXlSZWYgPSBQT0lOVEVSKENGTXV0YWJsZUFycmF5KQpDRkRpY3Rpb25hcnlSZWYgPSBQT0lOVEVSKENGRGljdGlvbmFyeSkKQ0ZBcnJheUNhbGxCYWNrcyA9IGNfdm9pZF9wCkNGRGljdGlvbmFyeUtleUNhbGxCYWNrcyA9IGNfdm9pZF9wCkNGRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzID0gY192b2lkX3AKClNlY0NlcnRpZmljYXRlUmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU2VjRXh0ZXJuYWxGb3JtYXQgPSBjX3VpbnQzMgpTZWNFeHRlcm5hbEl0ZW1UeXBlID0gY191aW50MzIKU2VjSWRlbnRpdHlSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNJdGVtSW1wb3J0RXhwb3J0RmxhZ3MgPSBjX3VpbnQzMgpTZWNJdGVtSW1wb3J0RXhwb3J0S2V5UGFyYW1ldGVycyA9IGNfdm9pZF9wClNlY0tleWNoYWluUmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU1NMUHJvdG9jb2wgPSBjX3VpbnQzMgpTU0xDaXBoZXJTdWl0ZSA9IGNfdWludDMyClNTTENvbnRleHRSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNUcnVzdFJlZiA9IFBPSU5URVIoY192b2lkX3ApClNTTENvbm5lY3Rpb25SZWYgPSBjX3VpbnQzMgpTZWNUcnVzdFJlc3VsdFR5cGUgPSBjX3VpbnQzMgpTZWNUcnVzdE9wdGlvbkZsYWdzID0gY191aW50MzIKU1NMUHJvdG9jb2xTaWRlID0gY191aW50MzIKU1NMQ29ubmVjdGlvblR5cGUgPSBjX3VpbnQzMgpTU0xTZXNzaW9uT3B0aW9uID0gY191aW50MzIKCgp0cnk6CiAgICBTZWN1cml0eS5TZWNJdGVtSW1wb3J0LmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZiwKICAgICAgICBDRlN0cmluZ1JlZiwKICAgICAgICBQT0lOVEVSKFNlY0V4dGVybmFsRm9ybWF0KSwKICAgICAgICBQT0lOVEVSKFNlY0V4dGVybmFsSXRlbVR5cGUpLAogICAgICAgIFNlY0l0ZW1JbXBvcnRFeHBvcnRGbGFncywKICAgICAgICBQT0lOVEVSKFNlY0l0ZW1JbXBvcnRFeHBvcnRLZXlQYXJhbWV0ZXJzKSwKICAgICAgICBTZWNLZXljaGFpblJlZiwKICAgICAgICBQT0lOVEVSKENGQXJyYXlSZWYpLAogICAgXQogICAgU2VjdXJpdHkuU2VjSXRlbUltcG9ydC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBTZWN1cml0eS5TZWNLZXlHZXRUeXBlSUQuYXJndHlwZXMgPSBbXQogICAgU2VjdXJpdHkuU2VjS2V5R2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgQ0ZEYXRhUmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNyZWF0ZVdpdGhEYXRhLnJlc3R5cGUgPSBTZWNDZXJ0aWZpY2F0ZVJlZgoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjQ2VydGlmaWNhdGVSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEucmVzdHlwZSA9IENGRGF0YVJlZgoKICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgT1NTdGF0dXMsCiAgICAgICAgY192b2lkX3AKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcucmVzdHlwZSA9IENGU3RyaW5nUmVmCgogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlDcmVhdGVXaXRoQ2VydGlmaWNhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmLAogICAgICAgIFNlY0NlcnRpZmljYXRlUmVmLAogICAgICAgIFBPSU5URVIoU2VjSWRlbnRpdHlSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3VpbnQzMiwKICAgICAgICBjX3ZvaWRfcCwKICAgICAgICBCb29sZWFuLAogICAgICAgIGNfdm9pZF9wLAogICAgICAgIFBPSU5URVIoU2VjS2V5Y2hhaW5SZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkNyZWF0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNLZXljaGFpblJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5EZWxldGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjUEtDUzEySW1wb3J0LmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZiwKICAgICAgICBDRkRpY3Rpb25hcnlSZWYsCiAgICAgICAgUE9JTlRFUihDRkFycmF5UmVmKQogICAgXQogICAgU2VjdXJpdHkuU2VjUEtDUzEySW1wb3J0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNTTFJlYWRGdW5jID0gQ0ZVTkNUWVBFKE9TU3RhdHVzLCBTU0xDb25uZWN0aW9uUmVmLCBjX3ZvaWRfcCwgUE9JTlRFUihjX3NpemVfdCkpCiAgICBTU0xXcml0ZUZ1bmMgPSBDRlVOQ1RZUEUoT1NTdGF0dXMsIFNTTENvbm5lY3Rpb25SZWYsIFBPSU5URVIoY19ieXRlKSwgUE9JTlRFUihjX3NpemVfdCkpCgogICAgU2VjdXJpdHkuU1NMU2V0SU9GdW5jcy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFJlYWRGdW5jLAogICAgICAgIFNTTFdyaXRlRnVuYwogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0SU9GdW5jcy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQZWVySUQuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UGVlcklELnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgQ0ZBcnJheVJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGVBdXRob3JpdGllcy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIENGVHlwZVJlZiwKICAgICAgICBCb29sZWFuCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZUF1dGhvcml0aWVzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xDb25uZWN0aW9uUmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDb25uZWN0aW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFBlZXJEb21haW5OYW1lLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFBlZXJEb21haW5OYW1lLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEhhbmRzaGFrZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xIYW5kc2hha2UucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMUmVhZC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90LAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xSZWFkLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFdyaXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTFdyaXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTENsb3NlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTENsb3NlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE51bWJlclN1cHBvcnRlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXRTdXBwb3J0ZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSksCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldFN1cHBvcnRlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKSwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyRW5hYmxlZENpcGhlcnMuYXJndHlwZSA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXRFbmFibGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXRFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkQ2lwaGVyLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRDaXBoZXIucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMUHJvdG9jb2wpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNlY1RydXN0UmVmKQogICAgXQogICAgU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcy5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZiwKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlc09ubHkuYXJnc3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIEJvb2xlYW4KICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzT25seS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdEV2YWx1YXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIFBPSU5URVIoU2VjVHJ1c3RSZXN1bHRUeXBlKQogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RFdmFsdWF0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4LmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIENGSW5kZXgKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4LnJlc3R5cGUgPSBTZWNDZXJ0aWZpY2F0ZVJlZgoKICAgIFNlY3VyaXR5LlNTTENyZWF0ZUNvbnRleHQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgU1NMUHJvdG9jb2xTaWRlLAogICAgICAgIFNTTENvbm5lY3Rpb25UeXBlCiAgICBdCiAgICBTZWN1cml0eS5TU0xDcmVhdGVDb250ZXh0LnJlc3R5cGUgPSBTU0xDb250ZXh0UmVmCgogICAgU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFNlc3Npb25PcHRpb24sCiAgICAgICAgQm9vbGVhbgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbi5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xQcm90b2NvbAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFByb3RvY29sCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NYXgucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBPU1N0YXR1cywKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBTZWN1cml0eS5TU0xSZWFkRnVuYyA9IFNTTFJlYWRGdW5jCiAgICBTZWN1cml0eS5TU0xXcml0ZUZ1bmMgPSBTU0xXcml0ZUZ1bmMKICAgIFNlY3VyaXR5LlNTTENvbnRleHRSZWYgPSBTU0xDb250ZXh0UmVmCiAgICBTZWN1cml0eS5TU0xQcm90b2NvbCA9IFNTTFByb3RvY29sCiAgICBTZWN1cml0eS5TU0xDaXBoZXJTdWl0ZSA9IFNTTENpcGhlclN1aXRlCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eVJlZiA9IFNlY0lkZW50aXR5UmVmCiAgICBTZWN1cml0eS5TZWNLZXljaGFpblJlZiA9IFNlY0tleWNoYWluUmVmCiAgICBTZWN1cml0eS5TZWNUcnVzdFJlZiA9IFNlY1RydXN0UmVmCiAgICBTZWN1cml0eS5TZWNUcnVzdFJlc3VsdFR5cGUgPSBTZWNUcnVzdFJlc3VsdFR5cGUKICAgIFNlY3VyaXR5LlNlY0V4dGVybmFsRm9ybWF0ID0gU2VjRXh0ZXJuYWxGb3JtYXQKICAgIFNlY3VyaXR5Lk9TU3RhdHVzID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5rU2VjSW1wb3J0RXhwb3J0UGFzc3BocmFzZSA9IENGU3RyaW5nUmVmLmluX2RsbCgKICAgICAgICBTZWN1cml0eSwgJ2tTZWNJbXBvcnRFeHBvcnRQYXNzcGhyYXNlJwogICAgKQogICAgU2VjdXJpdHkua1NlY0ltcG9ydEl0ZW1JZGVudGl0eSA9IENGU3RyaW5nUmVmLmluX2RsbCgKICAgICAgICBTZWN1cml0eSwgJ2tTZWNJbXBvcnRJdGVtSWRlbnRpdHknCiAgICApCgogICAgIyBDb3JlRm91bmRhdGlvbiB0aW1lIQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4uYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbi5yZXN0eXBlID0gQ0ZUeXBlUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlLmFyZ3R5cGVzID0gWwogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlLnJlc3R5cGUgPSBOb25lCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcucmVzdHlwZSA9IENGU3RyaW5nUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyLmFyZ3R5cGVzID0gWwogICAgICAgIENGU3RyaW5nUmVmLAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZ1B0ci5yZXN0eXBlID0gY19jaGFyX3AKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZTdHJpbmdSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRlN0cmluZ0VuY29kaW5nCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcucmVzdHlwZSA9IGNfYm9vbAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBDRkluZGV4CiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUucmVzdHlwZSA9IENGRGF0YVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldEJ5dGVQdHIuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRCeXRlUHRyLnJlc3R5cGUgPSBjX3ZvaWRfcAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBQT0lOVEVSKENGVHlwZVJlZiksCiAgICAgICAgUE9JTlRFUihDRlR5cGVSZWYpLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAogICAgICAgIENGRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlDcmVhdGUucmVzdHlwZSA9IENGRGljdGlvbmFyeVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUdldFZhbHVlLmFyZ3R5cGVzID0gWwogICAgICAgIENGRGljdGlvbmFyeVJlZiwKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUdldFZhbHVlLnJlc3R5cGUgPSBDRlR5cGVSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIFBPSU5URVIoQ0ZUeXBlUmVmKSwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGQXJyYXlDYWxsQmFja3MsCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlLnJlc3R5cGUgPSBDRkFycmF5UmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRkFycmF5Q2FsbEJhY2tzCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZS5yZXN0eXBlID0gQ0ZNdXRhYmxlQXJyYXlSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWYsCiAgICAgICAgY192b2lkX3AKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZS5yZXN0eXBlID0gTm9uZQoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0Q291bnQucmVzdHlwZSA9IENGSW5kZXgKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4LmFyZ3R5cGVzID0gWwogICAgICAgIENGQXJyYXlSZWYsCiAgICAgICAgQ0ZJbmRleAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldFZhbHVlQXRJbmRleC5yZXN0eXBlID0gY192b2lkX3AKCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0ID0gQ0ZBbGxvY2F0b3JSZWYuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGQWxsb2NhdG9yRGVmYXVsdCcKICAgICkKICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVBcnJheUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbChDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVBcnJheUNhbGxCYWNrcycpCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbCgKICAgICAgICBDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzJwogICAgKQogICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbCgKICAgICAgICBDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MnCiAgICApCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmID0gQ0ZUeXBlUmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5UmVmID0gQ0ZBcnJheVJlZgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdSZWYgPSBDRlN0cmluZ1JlZgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5UmVmID0gQ0ZEaWN0aW9uYXJ5UmVmCgpleGNlcHQgKEF0dHJpYnV0ZUVycm9yKToKICAgIHJhaXNlIEltcG9ydEVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgY3R5cGVzJykKCgpjbGFzcyBDRkNvbnN0KG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3Mgb2JqZWN0IHRoYXQgYWN0cyBhcyBlc3NlbnRpYWxseSBhIG5hbWVzcGFjZSBmb3IgQ29yZUZvdW5kYXRpb24KICAgIGNvbnN0YW50cy4KICAgICIiIgogICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4ID0gQ0ZTdHJpbmdFbmNvZGluZygweDA4MDAwMTAwKQoKCmNsYXNzIFNlY3VyaXR5Q29uc3Qob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBvYmplY3QgdGhhdCBhY3RzIGFzIGVzc2VudGlhbGx5IGEgbmFtZXNwYWNlIGZvciBTZWN1cml0eSBjb25zdGFudHMuCiAgICAiIiIKICAgIGtTU0xTZXNzaW9uT3B0aW9uQnJlYWtPblNlcnZlckF1dGggPSAwCgogICAga1NTTFByb3RvY29sMiA9IDEKICAgIGtTU0xQcm90b2NvbDMgPSAyCiAgICBrVExTUHJvdG9jb2wxID0gNAogICAga1RMU1Byb3RvY29sMTEgPSA3CiAgICBrVExTUHJvdG9jb2wxMiA9IDgKCiAgICBrU1NMQ2xpZW50U2lkZSA9IDEKICAgIGtTU0xTdHJlYW1UeXBlID0gMAoKICAgIGtTZWNGb3JtYXRQRU1TZXF1ZW5jZSA9IDEwCgogICAga1NlY1RydXN0UmVzdWx0SW52YWxpZCA9IDAKICAgIGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgPSAxCiAgICAjIFRoaXMgZ2FwIGlzIHByZXNlbnQgb24gcHVycG9zZTogdGhpcyB3YXMga1NlY1RydXN0UmVzdWx0Q29uZmlybSwgd2hpY2gKICAgICMgaXMgZGVwcmVjYXRlZC4KICAgIGtTZWNUcnVzdFJlc3VsdERlbnkgPSAzCiAgICBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZCA9IDQKICAgIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlID0gNQogICAga1NlY1RydXN0UmVzdWx0RmF0YWxUcnVzdEZhaWx1cmUgPSA2CiAgICBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yID0gNwoKICAgIGVyclNTTFByb3RvY29sID0gLTk4MDAKICAgIGVyclNTTFdvdWxkQmxvY2sgPSAtOTgwMwogICAgZXJyU1NMQ2xvc2VkR3JhY2VmdWwgPSAtOTgwNQogICAgZXJyU1NMQ2xvc2VkTm9Ob3RpZnkgPSAtOTgxNgogICAgZXJyU1NMQ2xvc2VkQWJvcnQgPSAtOTgwNgoKICAgIGVyclNTTFhDZXJ0Q2hhaW5JbnZhbGlkID0gLTk4MDcKICAgIGVyclNTTENyeXB0byA9IC05ODA5CiAgICBlcnJTU0xJbnRlcm5hbCA9IC05ODEwCiAgICBlcnJTU0xDZXJ0RXhwaXJlZCA9IC05ODE0CiAgICBlcnJTU0xDZXJ0Tm90WWV0VmFsaWQgPSAtOTgxNQogICAgZXJyU1NMVW5rbm93blJvb3RDZXJ0ID0gLTk4MTIKICAgIGVyclNTTE5vUm9vdENlcnQgPSAtOTgxMwogICAgZXJyU1NMSG9zdE5hbWVNaXNtYXRjaCA9IC05ODQzCiAgICBlcnJTU0xQZWVySGFuZHNoYWtlRmFpbCA9IC05ODI0CiAgICBlcnJTU0xQZWVyVXNlckNhbmNlbGxlZCA9IC05ODM5CiAgICBlcnJTU0xXZWFrUGVlckVwaGVtZXJhbERIS2V5ID0gLTk4NTAKICAgIGVyclNTTFNlcnZlckF1dGhDb21wbGV0ZWQgPSAtOTg0MQogICAgZXJyU1NMUmVjb3JkT3ZlcmZsb3cgPSAtOTg0NwoKICAgIGVyclNlY1ZlcmlmeUZhaWxlZCA9IC02NzgwOAogICAgZXJyU2VjTm9UcnVzdFNldHRpbmdzID0gLTI1MjYzCiAgICBlcnJTZWNJdGVtTm90Rm91bmQgPSAtMjUzMDAKICAgIGVyclNlY0ludmFsaWRUcnVzdFNldHRpbmdzID0gLTI1MjYyCgogICAgIyBDaXBoZXIgc3VpdGVzLiBXZSBvbmx5IHBpY2sgdGhlIG9uZXMgb3VyIGRlZmF1bHQgY2lwaGVyIHN0cmluZyBhbGxvd3MuCiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweEMwMkMKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweEMwMzAKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4QzAyQgogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4QzAyRgogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwQTMKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgwMDlGCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MDBBMgogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDAwOUUKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCA9IDB4QzAyNAogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCA9IDB4QzAyOAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHhDMDBBCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHhDMDE0CiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDA2QgogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwNkEKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM5CiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAzOAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHhDMDIzCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHhDMDI3CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweEMwMDkKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweEMwMTMKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDY3CiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDA0MAogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMzMKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDMyCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgwMDlECiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgwMDlDCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDNECiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDNDCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM1CiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDJGCiAgICBUTFNfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgxMzAxCiAgICBUTFNfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgxMzAyCiAgICBUTFNfQ0hBQ0hBMjBfUE9MWTEzMDVfU0hBMjU2ID0gMHgxMzAzClBLAwQUAAAAAAAAACEABK/ckB4vAAAeLwAASQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9sb3dfbGV2ZWwucHkiIiIKTG93LWxldmVsIGhlbHBlcnMgZm9yIHRoZSBTZWN1cmVUcmFuc3BvcnQgYmluZGluZ3MuCgpUaGVzZSBhcmUgUHl0aG9uIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgaGlnaC1sZXZlbCBBUElzCmJ1dCBhcmUgbmVjZXNzYXJ5IHRvIGdldCB0aGVtIHRvIHdvcmsuIFRoZXkgaW5jbHVkZSBhIHdob2xlIGJ1bmNoIG9mIGxvdy1sZXZlbApDb3JlRm91bmRhdGlvbiBtZXNzaW5nIGFib3V0IGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbmNlcm5zIGluIHRoaXMgbW9kdWxlCmFyZSBhbG1vc3QgZW50aXJlbHkgYWJvdXQgdHJ5aW5nIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBhbmQgcHJvdmlkaW5nCmFwcHJvcHJpYXRlIGFuZCB1c2VmdWwgYXNzaXN0YW5jZSB0byB0aGUgaGlnaGVyLWxldmVsIGNvZGUuCiIiIgppbXBvcnQgYmFzZTY0CmltcG9ydCBjdHlwZXMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCBzc2wKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIC5iaW5kaW5ncyBpbXBvcnQgU2VjdXJpdHksIENvcmVGb3VuZGF0aW9uLCBDRkNvbnN0CgoKIyBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB1c2VkIHRvIGdyYWIgUEVNIGRhdGEgb3V0IG9mIGEgUEVNIGJ1bmRsZS4KX1BFTV9DRVJUU19SRSA9IHJlLmNvbXBpbGUoCiAgICBiIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuKC4qPylcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iLCByZS5ET1RBTEwKKQoKCmRlZiBfY2ZfZGF0YV9mcm9tX2J5dGVzKGJ5dGVzdHJpbmcpOgogICAgIiIiCiAgICBHaXZlbiBhIGJ5dGVzdHJpbmcsIGNyZWF0ZSBhIENGRGF0YSBvYmplY3QgZnJvbSBpdC4gVGhpcyBDRkRhdGEgb2JqZWN0IG11c3QKICAgIGJlIENGUmVsZWFzZWQgYnkgdGhlIGNhbGxlci4KICAgICIiIgogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZSgKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LCBieXRlc3RyaW5nLCBsZW4oYnl0ZXN0cmluZykKICAgICkKCgpkZWYgX2NmX2RpY3Rpb25hcnlfZnJvbV90dXBsZXModHVwbGVzKToKICAgICIiIgogICAgR2l2ZW4gYSBsaXN0IG9mIFB5dGhvbiB0dXBsZXMsIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIENGRGljdGlvbmFyeS4KICAgICIiIgogICAgZGljdGlvbmFyeV9zaXplID0gbGVuKHR1cGxlcykKCiAgICAjIFdlIG5lZWQgdG8gZ2V0IHRoZSBkaWN0aW9uYXJ5IGtleXMgYW5kIHZhbHVlcyBvdXQgaW4gdGhlIHNhbWUgb3JkZXIuCiAgICBrZXlzID0gKHRbMF0gZm9yIHQgaW4gdHVwbGVzKQogICAgdmFsdWVzID0gKHRbMV0gZm9yIHQgaW4gdHVwbGVzKQogICAgY2Zfa2V5cyA9IChDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgKiBkaWN0aW9uYXJ5X3NpemUpKCprZXlzKQogICAgY2ZfdmFsdWVzID0gKENvcmVGb3VuZGF0aW9uLkNGVHlwZVJlZiAqIGRpY3Rpb25hcnlfc2l6ZSkoKnZhbHVlcykKCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5Q3JlYXRlKAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgY2Zfa2V5cywKICAgICAgICBjZl92YWx1ZXMsCiAgICAgICAgZGljdGlvbmFyeV9zaXplLAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MsCiAgICApCgoKZGVmIF9jZl9zdHJpbmdfdG9fdW5pY29kZSh2YWx1ZSk6CiAgICAiIiIKICAgIENyZWF0ZXMgYSBVbmljb2RlIHN0cmluZyBmcm9tIGEgQ0ZTdHJpbmcgb2JqZWN0LiBVc2VkIGVudGlyZWx5IGZvciBlcnJvcgogICAgcmVwb3J0aW5nLgoKICAgIFllcywgaXQgYW5ub3lzIG1lIHF1aXRlIGEgbG90IHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aGlzIGNvbXBsZXguCiAgICAiIiIKICAgIHZhbHVlX2FzX3ZvaWRfcCA9IGN0eXBlcy5jYXN0KHZhbHVlLCBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY192b2lkX3ApKQoKICAgIHN0cmluZyA9IENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZ1B0cigKICAgICAgICB2YWx1ZV9hc192b2lkX3AsCiAgICAgICAgQ0ZDb25zdC5rQ0ZTdHJpbmdFbmNvZGluZ1VURjgKICAgICkKICAgIGlmIHN0cmluZyBpcyBOb25lOgogICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigxMDI0KQogICAgICAgIHJlc3VsdCA9IENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZygKICAgICAgICAgICAgdmFsdWVfYXNfdm9pZF9wLAogICAgICAgICAgICBidWZmZXIsCiAgICAgICAgICAgIDEwMjQsCiAgICAgICAgICAgIENGQ29uc3Qua0NGU3RyaW5nRW5jb2RpbmdVVEY4CiAgICAgICAgKQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoJ0Vycm9yIGNvcHlpbmcgQyBzdHJpbmcgZnJvbSBDRlN0cmluZ1JlZicpCiAgICAgICAgc3RyaW5nID0gYnVmZmVyLnZhbHVlCiAgICBpZiBzdHJpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLmRlY29kZSgndXRmLTgnKQogICAgcmV0dXJuIHN0cmluZwoKCmRlZiBfYXNzZXJ0X25vX2Vycm9yKGVycm9yLCBleGNlcHRpb25fY2xhc3M9Tm9uZSk6CiAgICAiIiIKICAgIENoZWNrcyB0aGUgcmV0dXJuIGNvZGUgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgdG8KICAgIHJlcG9ydAogICAgIiIiCiAgICBpZiBlcnJvciA9PSAwOgogICAgICAgIHJldHVybgoKICAgIGNmX2Vycm9yX3N0cmluZyA9IFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcoZXJyb3IsIE5vbmUpCiAgICBvdXRwdXQgPSBfY2Zfc3RyaW5nX3RvX3VuaWNvZGUoY2ZfZXJyb3Jfc3RyaW5nKQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNmX2Vycm9yX3N0cmluZykKCiAgICBpZiBvdXRwdXQgaXMgTm9uZSBvciBvdXRwdXQgPT0gdScnOgogICAgICAgIG91dHB1dCA9IHUnT1NTdGF0dXMgJXMnICUgZXJyb3IKCiAgICBpZiBleGNlcHRpb25fY2xhc3MgaXMgTm9uZToKICAgICAgICBleGNlcHRpb25fY2xhc3MgPSBzc2wuU1NMRXJyb3IKCiAgICByYWlzZSBleGNlcHRpb25fY2xhc3Mob3V0cHV0KQoKCmRlZiBfY2VydF9hcnJheV9mcm9tX3BlbShwZW1fYnVuZGxlKToKICAgICIiIgogICAgR2l2ZW4gYSBidW5kbGUgb2YgY2VydHMgaW4gUEVNIGZvcm1hdCwgdHVybnMgdGhlbSBpbnRvIGEgQ0ZBcnJheSBvZiBjZXJ0cwogICAgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGNlcnQgY2hhaW4uCiAgICAiIiIKICAgIGRlcl9jZXJ0cyA9IFsKICAgICAgICBiYXNlNjQuYjY0ZGVjb2RlKG1hdGNoLmdyb3VwKDEpKQogICAgICAgIGZvciBtYXRjaCBpbiBfUEVNX0NFUlRTX1JFLmZpbmRpdGVyKHBlbV9idW5kbGUpCiAgICBdCiAgICBpZiBub3QgZGVyX2NlcnRzOgogICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiTm8gcm9vdCBjZXJ0aWZpY2F0ZXMgc3BlY2lmaWVkIikKCiAgICBjZXJ0X2FycmF5ID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUoCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAwLAogICAgICAgIGN0eXBlcy5ieXJlZihDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlQXJyYXlDYWxsQmFja3MpCiAgICApCiAgICBpZiBub3QgY2VydF9hcnJheToKICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIikKCiAgICB0cnk6CiAgICAgICAgZm9yIGRlcl9ieXRlcyBpbiBkZXJfY2VydHM6CiAgICAgICAgICAgIGNlcnRkYXRhID0gX2NmX2RhdGFfZnJvbV9ieXRlcyhkZXJfYnl0ZXMpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0ZGF0YToKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKQogICAgICAgICAgICBjZXJ0ID0gU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDcmVhdGVXaXRoRGF0YSgKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsIGNlcnRkYXRhCiAgICAgICAgICAgICkKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRkYXRhKQogICAgICAgICAgICBpZiBub3QgY2VydDoKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiVW5hYmxlIHRvIGJ1aWxkIGNlcnQgb2JqZWN0ISIpCgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUoY2VydF9hcnJheSwgY2VydCkKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnQpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICMgV2UgbmVlZCB0byBmcmVlIHRoZSBhcnJheSBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBidWJibGVzIGZ1cnRoZXIuCiAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhhdCBpZiBhbiBlcnJvciBvY2N1cnM6IG90aGVyd2lzZSwgdGhlIGNhbGxlcgogICAgICAgICMgc2hvdWxkIGZyZWUuCiAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRfYXJyYXkpCgogICAgcmV0dXJuIGNlcnRfYXJyYXkKCgpkZWYgX2lzX2NlcnQoaXRlbSk6CiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiBhIGdpdmVuIENGVHlwZVJlZiBpcyBhIGNlcnRpZmljYXRlLgogICAgIiIiCiAgICBleHBlY3RlZCA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlEKCkKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRChpdGVtKSA9PSBleHBlY3RlZAoKCmRlZiBfaXNfaWRlbnRpdHkoaXRlbSk6CiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiBhIGdpdmVuIENGVHlwZVJlZiBpcyBhbiBpZGVudGl0eS4KICAgICIiIgogICAgZXhwZWN0ZWQgPSBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRCgpCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQoaXRlbSkgPT0gZXhwZWN0ZWQKCgpkZWYgX3RlbXBvcmFyeV9rZXljaGFpbigpOgogICAgIiIiCiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgTWFjIGtleWNoYWluIHRoYXQgd2UgY2FuIHVzZSB0byB3b3JrIHdpdGgKICAgIGNyZWRlbnRpYWxzLiBUaGlzIGtleWNoYWluIHVzZXMgYSBvbmUtdGltZSBwYXNzd29yZCBhbmQgYSB0ZW1wb3JhcnkgZmlsZSB0bwogICAgc3RvcmUgdGhlIGRhdGEuIFdlIGV4cGVjdCB0byBoYXZlIG9uZSBrZXljaGFpbiBwZXIgc29ja2V0LiBUaGUgcmV0dXJuZWQKICAgIFNlY0tleWNoYWluUmVmIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgaW5jbHVkaW5nIGNhbGxpbmcKICAgIFNlY0tleWNoYWluRGVsZXRlLgoKICAgIFJldHVybnMgYSB0dXBsZSBvZiB0aGUgU2VjS2V5Y2hhaW5SZWYgYW5kIHRoZSBwYXRoIHRvIHRoZSB0ZW1wb3JhcnkKICAgIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGl0LgogICAgIiIiCiAgICAjIFVuZm9ydHVuYXRlbHksIFNlY0tleWNoYWluQ3JlYXRlIHJlcXVpcmVzIGEgcGF0aCB0byBhIGtleWNoYWluLiBUaGlzCiAgICAjIG1lYW5zIHdlIGNhbm5vdCB1c2UgbWtzdGVtcCB0byB1c2UgYSBnZW5lcmljIHRlbXBvcmFyeSBmaWxlLiBJbnN0ZWFkLAogICAgIyB3ZSdyZSBnb2luZyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBhIGZpbGVuYW1lIHRvIHVzZSB0aGVyZS4KICAgICMgVGhpcyBmaWxlbmFtZSB3aWxsIGJlIDggcmFuZG9tIGJ5dGVzIGV4cGFuZGVkIGludG8gYmFzZTY0LiBXZSBhbHNvIG5lZWQKICAgICMgc29tZSByYW5kb20gYnl0ZXMgdG8gcGFzc3dvcmQtcHJvdGVjdCB0aGUga2V5Y2hhaW4gd2UncmUgY3JlYXRpbmcsIHNvIHdlCiAgICAjIGFzayBmb3IgNDAgcmFuZG9tIGJ5dGVzLgogICAgcmFuZG9tX2J5dGVzID0gb3MudXJhbmRvbSg0MCkKICAgIGZpbGVuYW1lID0gYmFzZTY0LmI2NGVuY29kZShyYW5kb21fYnl0ZXNbOjhdKS5kZWNvZGUoJ3V0Zi04JykKICAgIHBhc3N3b3JkID0gYmFzZTY0LmI2NGVuY29kZShyYW5kb21fYnl0ZXNbODpdKSAgIyBNdXN0IGJlIHZhbGlkIFVURi04CiAgICB0ZW1wZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCgogICAga2V5Y2hhaW5fcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyZWN0b3J5LCBmaWxlbmFtZSkuZW5jb2RlKCd1dGYtOCcpCgogICAgIyBXZSBub3cgd2FudCB0byBjcmVhdGUgdGhlIGtleWNoYWluIGl0c2VsZi4KICAgIGtleWNoYWluID0gU2VjdXJpdHkuU2VjS2V5Y2hhaW5SZWYoKQogICAgc3RhdHVzID0gU2VjdXJpdHkuU2VjS2V5Y2hhaW5DcmVhdGUoCiAgICAgICAga2V5Y2hhaW5fcGF0aCwKICAgICAgICBsZW4ocGFzc3dvcmQpLAogICAgICAgIHBhc3N3b3JkLAogICAgICAgIEZhbHNlLAogICAgICAgIE5vbmUsCiAgICAgICAgY3R5cGVzLmJ5cmVmKGtleWNoYWluKQogICAgKQogICAgX2Fzc2VydF9ub19lcnJvcihzdGF0dXMpCgogICAgIyBIYXZpbmcgY3JlYXRlZCB0aGUga2V5Y2hhaW4sIHdlIHdhbnQgdG8gcGFzcyBpdCBvZmYgdG8gdGhlIGNhbGxlci4KICAgIHJldHVybiBrZXljaGFpbiwgdGVtcGRpcmVjdG9yeQoKCmRlZiBfbG9hZF9pdGVtc19mcm9tX2ZpbGUoa2V5Y2hhaW4sIHBhdGgpOgogICAgIiIiCiAgICBHaXZlbiBhIHNpbmdsZSBmaWxlLCBsb2FkcyBhbGwgdGhlIHRydXN0IG9iamVjdHMgZnJvbSBpdCBpbnRvIGFycmF5cyBhbmQKICAgIHRoZSBrZXljaGFpbi4KICAgIFJldHVybnMgYSB0dXBsZSBvZiBsaXN0czogdGhlIGZpcnN0IGxpc3QgaXMgYSBsaXN0IG9mIGlkZW50aXRpZXMsIHRoZQogICAgc2Vjb25kIGEgbGlzdCBvZiBjZXJ0cy4KICAgICIiIgogICAgY2VydGlmaWNhdGVzID0gW10KICAgIGlkZW50aXRpZXMgPSBbXQogICAgcmVzdWx0X2FycmF5ID0gTm9uZQoKICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgIHJhd19maWxlZGF0YSA9IGYucmVhZCgpCgogICAgdHJ5OgogICAgICAgIGZpbGVkYXRhID0gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlKAogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgICAgICByYXdfZmlsZWRhdGEsCiAgICAgICAgICAgIGxlbihyYXdfZmlsZWRhdGEpCiAgICAgICAgKQogICAgICAgIHJlc3VsdF9hcnJheSA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlSZWYoKQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY0l0ZW1JbXBvcnQoCiAgICAgICAgICAgIGZpbGVkYXRhLCAgIyBjZXJ0IGRhdGEKICAgICAgICAgICAgTm9uZSwgICMgRmlsZW5hbWUsIGxlYXZpbmcgaXQgb3V0IGZvciBub3cKICAgICAgICAgICAgTm9uZSwgICMgV2hhdCB0aGUgdHlwZSBvZiB0aGUgZmlsZSBpcywgd2UgZG9uJ3QgY2FyZQogICAgICAgICAgICBOb25lLCAgIyB3aGF0J3MgaW4gdGhlIGZpbGUsIHdlIGRvbid0IGNhcmUKICAgICAgICAgICAgMCwgICMgaW1wb3J0IGZsYWdzCiAgICAgICAgICAgIE5vbmUsICAjIGtleSBwYXJhbXMsIGNhbiBpbmNsdWRlIHBhc3NwaHJhc2UgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICBrZXljaGFpbiwgICMgVGhlIGtleWNoYWluIHRvIGluc2VydCBpbnRvCiAgICAgICAgICAgIGN0eXBlcy5ieXJlZihyZXN1bHRfYXJyYXkpICAjIFJlc3VsdHMKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgQSBDRkFycmF5IGlzIG5vdCB2ZXJ5IHVzZWZ1bCB0byB1cyBhcyBhbiBpbnRlcm1lZGlhcnkKICAgICAgICAjIHJlcHJlc2VudGF0aW9uLCBzbyB3ZSBhcmUgZ29pbmcgdG8gZXh0cmFjdCB0aGUgb2JqZWN0cyB3ZSB3YW50CiAgICAgICAgIyBhbmQgdGhlbiBmcmVlIHRoZSBhcnJheS4gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGhvbGQgb2Yga2V5czogdGhlCiAgICAgICAgIyBrZXljaGFpbiBhbHJlYWR5IGhhcyB0aGVtIQogICAgICAgIHJlc3VsdF9jb3VudCA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudChyZXN1bHRfYXJyYXkpCiAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKHJlc3VsdF9jb3VudCk6CiAgICAgICAgICAgIGl0ZW0gPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4KAogICAgICAgICAgICAgICAgcmVzdWx0X2FycmF5LCBpbmRleAogICAgICAgICAgICApCiAgICAgICAgICAgIGl0ZW0gPSBjdHlwZXMuY2FzdChpdGVtLCBDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYpCgogICAgICAgICAgICBpZiBfaXNfY2VydChpdGVtKToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluKGl0ZW0pCiAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgIGVsaWYgX2lzX2lkZW50aXR5KGl0ZW0pOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4oaXRlbSkKICAgICAgICAgICAgICAgIGlkZW50aXRpZXMuYXBwZW5kKGl0ZW0pCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHJlc3VsdF9hcnJheToKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHJlc3VsdF9hcnJheSkKCiAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGZpbGVkYXRhKQoKICAgIHJldHVybiAoaWRlbnRpdGllcywgY2VydGlmaWNhdGVzKQoKCmRlZiBfbG9hZF9jbGllbnRfY2VydF9jaGFpbihrZXljaGFpbiwgKnBhdGhzKToKICAgICIiIgogICAgTG9hZCBjZXJ0aWZpY2F0ZXMgYW5kIG1heWJlIGtleXMgZnJvbSBhIG51bWJlciBvZiBmaWxlcy4gSGFzIHRoZSBlbmQgZ29hbAogICAgb2YgcmV0dXJuaW5nIGEgQ0ZBcnJheSBjb250YWluaW5nIG9uZSBTZWNJZGVudGl0eVJlZiwgYW5kIHRoZW4gemVybyBvciBtb3JlCiAgICBTZWNDZXJ0aWZpY2F0ZVJlZiBvYmplY3RzLCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgY2xpZW50IGNlcnRpZmljYXRlIHRydXN0CiAgICBjaGFpbi4KICAgICIiIgogICAgIyBPaywgdGhlIHN0cmF0ZWd5LgogICAgIwogICAgIyBUaGlzIHJlbGllcyBvbiBrbm93aW5nIHRoYXQgbWFjT1Mgd2lsbCBub3QgZ2l2ZSB5b3UgYSBTZWNJZGVudGl0eVJlZgogICAgIyB1bmxlc3MgeW91IGhhdmUgaW1wb3J0ZWQgYSBrZXkgaW50byBhIGtleWNoYWluLiBUaGlzIGlzIGEgc29tZXdoYXQKICAgICMgYXJ0aWZpY2lhbCBsaW1pdGF0aW9uIG9mIG1hY09TIChmb3IgZXhhbXBsZSwgaXQgZG9lc24ndCBuZWNlc3NhcmlseQogICAgIyBhZmZlY3QgaU9TKSwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgaW5zaWRlIFNlY3VyaXR5LmZyYW1ld29yayB0aGF0IGxldHMgeW91CiAgICAjIGdldCBhIFNlY0lkZW50aXR5UmVmIHdpdGhvdXQgaGF2aW5nIGEga2V5IGluIGEga2V5Y2hhaW4uCiAgICAjCiAgICAjIFNvIHRoZSBwb2xpY3kgaGVyZSBpcyB3ZSB0YWtlIGFsbCB0aGUgZmlsZXMgYW5kIGl0ZXJhdGUgdGhlbSBpbiBvcmRlci4KICAgICMgRWFjaCBvbmUgd2lsbCB1c2UgU2VjSXRlbUltcG9ydCB0byBoYXZlIG9uZSBvciBtb3JlIG9iamVjdHMgbG9hZGVkIGZyb20KICAgICMgaXQuIFdlIHdpbGwgYWxzbyBwb2ludCBhdCBhIGtleWNoYWluIHRoYXQgbWFjT1MgY2FuIHVzZSB0byB3b3JrIHdpdGggdGhlCiAgICAjIHByaXZhdGUga2V5LgogICAgIwogICAgIyBPbmNlIHdlIGhhdmUgYWxsIHRoZSBvYmplY3RzLCB3ZSdsbCBjaGVjayB3aGF0IHdlIGFjdHVhbGx5IGhhdmUuIElmIHdlCiAgICAjIGFscmVhZHkgaGF2ZSBhIFNlY0lkZW50aXR5UmVmIGluIGhhbmQsIGZhYjogd2UnbGwgdXNlIHRoYXQuIE90aGVyd2lzZSwKICAgICMgd2UnbGwgdGFrZSB0aGUgZmlyc3QgY2VydGlmaWNhdGUgKHdoaWNoIHdlIGFzc3VtZSB0byBiZSBvdXIgbGVhZikgYW5kCiAgICAjIGFzayB0aGUga2V5Y2hhaW4gdG8gZ2l2ZSB1cyBhIFNlY0lkZW50aXR5UmVmIHdpdGggdGhhdCBjZXJ0J3MgYXNzb2NpYXRlZAogICAgIyBrZXkuCiAgICAjCiAgICAjIFdlJ2xsIHRoZW4gcmV0dXJuIGEgQ0ZBcnJheSBjb250YWluaW5nIHRoZSB0cnVzdCBjaGFpbjogb25lCiAgICAjIFNlY0lkZW50aXR5UmVmIGFuZCB0aGVuIHplcm8tb3ItbW9yZSBTZWNDZXJ0aWZpY2F0ZVJlZiBvYmplY3RzLiBUaGUKICAgICMgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGhpcyBDRkFycmF5IHdpbGwgYmUgd2l0aCB0aGUgY2FsbGVyLiBUaGlzCiAgICAjIENGQXJyYXkgbXVzdCByZW1haW4gYWxpdmUgZm9yIHRoZSBlbnRpcmUgY29ubmVjdGlvbiwgc28gaW4gcHJhY3RpY2UgaXQKICAgICMgd2lsbCBiZSBzdG9yZWQgd2l0aCBhIHNpbmdsZSBTU0xTb2NrZXQsIGFsb25nIHdpdGggdGhlIHJlZmVyZW5jZSB0byB0aGUKICAgICMga2V5Y2hhaW4uCiAgICBjZXJ0aWZpY2F0ZXMgPSBbXQogICAgaWRlbnRpdGllcyA9IFtdCgogICAgIyBGaWx0ZXIgb3V0IGJhZCBwYXRocy4KICAgIHBhdGhzID0gKHBhdGggZm9yIHBhdGggaW4gcGF0aHMgaWYgcGF0aCkKCiAgICB0cnk6CiAgICAgICAgZm9yIGZpbGVfcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgbmV3X2lkZW50aXRpZXMsIG5ld19jZXJ0cyA9IF9sb2FkX2l0ZW1zX2Zyb21fZmlsZSgKICAgICAgICAgICAgICAgIGtleWNoYWluLCBmaWxlX3BhdGgKICAgICAgICAgICAgKQogICAgICAgICAgICBpZGVudGl0aWVzLmV4dGVuZChuZXdfaWRlbnRpdGllcykKICAgICAgICAgICAgY2VydGlmaWNhdGVzLmV4dGVuZChuZXdfY2VydHMpCgogICAgICAgICMgT2ssIHdlIGhhdmUgZXZlcnl0aGluZy4gVGhlIHF1ZXN0aW9uIGlzOiBkbyB3ZSBoYXZlIGFuIGlkZW50aXR5PyBJZgogICAgICAgICMgbm90LCB3ZSB3YW50IHRvIGdyYWIgb25lIGZyb20gdGhlIGZpcnN0IGNlcnQgd2UgaGF2ZS4KICAgICAgICBpZiBub3QgaWRlbnRpdGllczoKICAgICAgICAgICAgbmV3X2lkZW50aXR5ID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlSZWYoKQogICAgICAgICAgICBzdGF0dXMgPSBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIGtleWNoYWluLAogICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzWzBdLAogICAgICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKG5ld19pZGVudGl0eSkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHN0YXR1cykKICAgICAgICAgICAgaWRlbnRpdGllcy5hcHBlbmQobmV3X2lkZW50aXR5KQoKICAgICAgICAgICAgIyBXZSBub3cgd2FudCB0byByZWxlYXNlIHRoZSBvcmlnaW5hbCBjZXJ0aWZpY2F0ZSwgYXMgd2Ugbm8gbG9uZ2VyCiAgICAgICAgICAgICMgbmVlZCBpdC4KICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRpZmljYXRlcy5wb3AoMCkpCgogICAgICAgICMgV2Ugbm93IG5lZWQgdG8gYnVpbGQgYSBuZXcgQ0ZBcnJheSB0aGF0IGhvbGRzIHRoZSB0cnVzdCBjaGFpbi4KICAgICAgICB0cnVzdF9jaGFpbiA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlKAogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgICAgICAwLAogICAgICAgICAgICBjdHlwZXMuYnlyZWYoQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzKSwKICAgICAgICApCiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcnRvb2xzLmNoYWluKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcyk6CiAgICAgICAgICAgICMgQXJyYXlBcHBlbmRWYWx1ZSBkb2VzIGEgQ0ZSZXRhaW4gb24gdGhlIGl0ZW0uIFRoYXQncyBmaW5lLAogICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGZpbmFsbHkgYmxvY2sgd2lsbCByZWxlYXNlIG91ciBvdGhlciByZWZzIHRvIHRoZW0uCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZSh0cnVzdF9jaGFpbiwgaXRlbSkKCiAgICAgICAgcmV0dXJuIHRydXN0X2NoYWluCiAgICBmaW5hbGx5OgogICAgICAgIGZvciBvYmogaW4gaXRlcnRvb2xzLmNoYWluKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcyk6CiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShvYmopClBLAwQUAAAAAAAAACEAGMOtk3EqAABxKgAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvYXBwZW5naW5lLnB5IiIiClRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgcG9vbCBtYW5hZ2VyIHRoYXQgdXNlcyBHb29nbGUgQXBwIEVuZ2luZSdzCmBVUkxGZXRjaCBTZXJ2aWNlIDxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvcHl0aG9uL3VybGZldGNoPmBfLgoKRXhhbXBsZSB1c2FnZTo6CgogICAgZnJvbSB1cmxsaWIzIGltcG9ydCBQb29sTWFuYWdlcgogICAgZnJvbSB1cmxsaWIzLmNvbnRyaWIuYXBwZW5naW5lIGltcG9ydCBBcHBFbmdpbmVNYW5hZ2VyLCBpc19hcHBlbmdpbmVfc2FuZGJveAoKICAgIGlmIGlzX2FwcGVuZ2luZV9zYW5kYm94KCk6CiAgICAgICAgIyBBcHBFbmdpbmVNYW5hZ2VyIHVzZXMgQXBwRW5naW5lJ3MgVVJMRmV0Y2ggQVBJIGJlaGluZCB0aGUgc2NlbmVzCiAgICAgICAgaHR0cCA9IEFwcEVuZ2luZU1hbmFnZXIoKQogICAgZWxzZToKICAgICAgICAjIFBvb2xNYW5hZ2VyIHVzZXMgYSBzb2NrZXQtbGV2ZWwgQVBJIGJlaGluZCB0aGUgc2NlbmVzCiAgICAgICAgaHR0cCA9IFBvb2xNYW5hZ2VyKCkKCiAgICByID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cHM6Ly9nb29nbGUuY29tLycpCgpUaGVyZSBhcmUgYGxpbWl0YXRpb25zIDxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvcHl0aG9uL1wKdXJsZmV0Y2gvI1B5dGhvbl9RdW90YXNfYW5kX2xpbWl0cz5gXyB0byB0aGUgVVJMRmV0Y2ggc2VydmljZSBhbmQgaXQgbWF5IG5vdCBiZQp0aGUgYmVzdCBjaG9pY2UgZm9yIHlvdXIgYXBwbGljYXRpb24uIFRoZXJlIGFyZSB0aHJlZSBvcHRpb25zIGZvciB1c2luZwp1cmxsaWIzIG9uIEdvb2dsZSBBcHAgRW5naW5lOgoKMS4gWW91IGNhbiB1c2UgOmNsYXNzOmBBcHBFbmdpbmVNYW5hZ2VyYCB3aXRoIFVSTEZldGNoLiBVUkxGZXRjaCBpcwogICBjb3N0LWVmZmVjdGl2ZSBpbiBtYW55IGNpcmN1bXN0YW5jZXMgYXMgbG9uZyBhcyB5b3VyIHVzYWdlIGlzIHdpdGhpbiB0aGUKICAgbGltaXRhdGlvbnMuCjIuIFlvdSBjYW4gdXNlIGEgbm9ybWFsIDpjbGFzczpgfnVybGxpYjMuUG9vbE1hbmFnZXJgIGJ5IGVuYWJsaW5nIHNvY2tldHMuCiAgIFNvY2tldHMgYWxzbyBoYXZlIGBsaW1pdGF0aW9ucyBhbmQgcmVzdHJpY3Rpb25zCiAgIDxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvcHl0aG9uL3NvY2tldHMvXAogICAjbGltaXRhdGlvbnMtYW5kLXJlc3RyaWN0aW9ucz5gXyBhbmQgaGF2ZSBhIGxvd2VyIGZyZWUgcXVvdGEgdGhhbiBVUkxGZXRjaC4KICAgVG8gdXNlIHNvY2tldHMsIGJlIHN1cmUgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nIGluIHlvdXIgYGBhcHAueWFtbGBgOjoKCiAgICAgICAgZW52X3ZhcmlhYmxlczoKICAgICAgICAgICAgR0FFX1VTRV9TT0NLRVRTX0hUVFBMSUIgOiAndHJ1ZScKCjMuIElmIHlvdSBhcmUgdXNpbmcgYEFwcCBFbmdpbmUgRmxleGlibGUKPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9mbGV4aWJsZS8+YF8sIHlvdSBjYW4gdXNlIHRoZSBzdGFuZGFyZAo6Y2xhc3M6YFBvb2xNYW5hZ2VyYCB3aXRob3V0IGFueSBjb25maWd1cmF0aW9uIG9yIHNwZWNpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKZnJvbSAuLnBhY2thZ2VzLnNpeC5tb3Zlcy51cmxsaWIucGFyc2UgaW1wb3J0IHVybGpvaW4KCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCAoCiAgICBIVFRQRXJyb3IsCiAgICBIVFRQV2FybmluZywKICAgIE1heFJldHJ5RXJyb3IsCiAgICBQcm90b2NvbEVycm9yLAogICAgVGltZW91dEVycm9yLAogICAgU1NMRXJyb3IKKQoKZnJvbSAuLnBhY2thZ2VzLnNpeCBpbXBvcnQgQnl0ZXNJTwpmcm9tIC4ucmVxdWVzdCBpbXBvcnQgUmVxdWVzdE1ldGhvZHMKZnJvbSAuLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSAuLnV0aWwudGltZW91dCBpbXBvcnQgVGltZW91dApmcm9tIC4udXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKCnRyeToKICAgIGZyb20gZ29vZ2xlLmFwcGVuZ2luZS5hcGkgaW1wb3J0IHVybGZldGNoCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHVybGZldGNoID0gTm9uZQoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZyhIVFRQV2FybmluZyk6CiAgICBwYXNzCgoKY2xhc3MgQXBwRW5naW5lUGxhdGZvcm1FcnJvcihIVFRQRXJyb3IpOgogICAgcGFzcwoKCmNsYXNzIEFwcEVuZ2luZU1hbmFnZXIoUmVxdWVzdE1ldGhvZHMpOgogICAgIiIiCiAgICBDb25uZWN0aW9uIG1hbmFnZXIgZm9yIEdvb2dsZSBBcHAgRW5naW5lIHNhbmRib3ggYXBwbGljYXRpb25zLgoKICAgIFRoaXMgbWFuYWdlciB1c2VzIHRoZSBVUkxGZXRjaCBzZXJ2aWNlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlCiAgICBlbXVsYXRlZCBodHRwbGliLCBhbmQgaXMgc3ViamVjdCB0byBVUkxGZXRjaCBsaW1pdGF0aW9ucyBhcyBkZXNjcmliZWQgaW4KICAgIHRoZSBBcHAgRW5naW5lIGRvY3VtZW50YXRpb24gYGhlcmUKICAgIDxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvcHl0aG9uL3VybGZldGNoPmBfLgoKICAgIE5vdGFibHkgaXQgd2lsbCByYWlzZSBhbiA6Y2xhc3M6YEFwcEVuZ2luZVBsYXRmb3JtRXJyb3JgIGlmOgogICAgICAgICogVVJMRmV0Y2ggaXMgbm90IGF2YWlsYWJsZS4KICAgICAgICAqIElmIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGlzIG9uIEFwcCBFbmdpbmUgRmxleGlibGUsIGFzIGZ1bGwgc29ja2V0CiAgICAgICAgICBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KICAgICAgICAqIElmIGEgcmVxdWVzdCBzaXplIGlzIG1vcmUgdGhhbiAxMCBtZWdhYnl0ZXMuCiAgICAgICAgKiBJZiBhIHJlc3BvbnNlIHNpemUgaXMgbW9yZSB0aGFuIDMyIG1lZ2FidHllcy4KICAgICAgICAqIElmIHlvdSB1c2UgYW4gdW5zdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2Qgc3VjaCBhcyBPUFRJT05TLgoKICAgIEJleW9uZCB0aG9zZSBjYXNlcywgaXQgd2lsbCByYWlzZSBub3JtYWwgdXJsbGliMyBlcnJvcnMuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycz1Ob25lLCByZXRyaWVzPU5vbmUsIHZhbGlkYXRlX2NlcnRpZmljYXRlPVRydWUsCiAgICAgICAgICAgICAgICAgdXJsZmV0Y2hfcmV0cmllcz1UcnVlKToKICAgICAgICBpZiBub3QgdXJsZmV0Y2g6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LiIpCgogICAgICAgIGlmIGlzX3Byb2RfYXBwZW5naW5lX212bXMoKToKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVc2Ugbm9ybWFsIHVybGxpYjMuUG9vbE1hbmFnZXIgaW5zdGVhZCBvZiBBcHBFbmdpbmVNYW5hZ2VyIgogICAgICAgICAgICAgICAgIm9uIE1hbmFnZWQgVk1zLCBhcyB1c2luZyBVUkxGZXRjaCBpcyBub3QgbmVjZXNzYXJ5IGluICIKICAgICAgICAgICAgICAgICJ0aGlzIGVudmlyb25tZW50LiIpCgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJ1cmxsaWIzIGlzIHVzaW5nIFVSTEZldGNoIG9uIEdvb2dsZSBBcHAgRW5naW5lIHNhbmRib3ggaW5zdGVhZCAiCiAgICAgICAgICAgICJvZiBzb2NrZXRzLiBUbyB1c2Ugc29ja2V0cyBkaXJlY3RseSBpbnN0ZWFkIG9mIFVSTEZldGNoIHNlZSAiCiAgICAgICAgICAgICJodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3JlZmVyZW5jZS91cmxsaWIzLmNvbnRyaWIuaHRtbC4iLAogICAgICAgICAgICBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcpCgogICAgICAgIFJlcXVlc3RNZXRob2RzLl9faW5pdF9fKHNlbGYsIGhlYWRlcnMpCiAgICAgICAgc2VsZi52YWxpZGF0ZV9jZXJ0aWZpY2F0ZSA9IHZhbGlkYXRlX2NlcnRpZmljYXRlCiAgICAgICAgc2VsZi51cmxmZXRjaF9yZXRyaWVzID0gdXJsZmV0Y2hfcmV0cmllcwoKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzIG9yIFJldHJ5LkRFRkFVTFQKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgogICAgICAgICMgUmV0dXJuIEZhbHNlIHRvIHJlLXJhaXNlIGFueSBwb3RlbnRpYWwgZXhjZXB0aW9ucwogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgIHJldHJpZXM9Tm9uZSwgcmVkaXJlY3Q9VHJ1ZSwgdGltZW91dD1UaW1lb3V0LkRFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpOgoKICAgICAgICByZXRyaWVzID0gc2VsZi5fZ2V0X3JldHJpZXMocmV0cmllcywgcmVkaXJlY3QpCgogICAgICAgIHRyeToKICAgICAgICAgICAgZm9sbG93X3JlZGlyZWN0cyA9ICgKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCBhbmQKICAgICAgICAgICAgICAgICAgICByZXRyaWVzLnJlZGlyZWN0ICE9IDAgYW5kCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcy50b3RhbCkKICAgICAgICAgICAgcmVzcG9uc2UgPSB1cmxmZXRjaC5mZXRjaCgKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHBheWxvYWQ9Ym9keSwKICAgICAgICAgICAgICAgIG1ldGhvZD1tZXRob2QsCiAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMgb3Ige30sCiAgICAgICAgICAgICAgICBhbGxvd190cnVuY2F0ZWQ9RmFsc2UsCiAgICAgICAgICAgICAgICBmb2xsb3dfcmVkaXJlY3RzPXNlbGYudXJsZmV0Y2hfcmV0cmllcyBhbmQgZm9sbG93X3JlZGlyZWN0cywKICAgICAgICAgICAgICAgIGRlYWRsaW5lPXNlbGYuX2dldF9hYnNvbHV0ZV90aW1lb3V0KHRpbWVvdXQpLAogICAgICAgICAgICAgICAgdmFsaWRhdGVfY2VydGlmaWNhdGU9c2VsZi52YWxpZGF0ZV9jZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5EZWFkbGluZUV4Y2VlZGVkRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgVGltZW91dEVycm9yKHNlbGYsIGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5JbnZhbGlkVVJMRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgJ3RvbyBsYXJnZScgaW4gc3RyKGUpOgogICAgICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggcmVxdWVzdCB0b28gbGFyZ2UsIFVSTEZldGNoIG9ubHkgIgogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0cyByZXF1ZXN0cyB1cCB0byAxMG1iIGluIHNpemUuIiwgZSkKICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcihlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guRG93bmxvYWRFcnJvciBhcyBlOgogICAgICAgICAgICBpZiAnVG9vIG1hbnkgcmVkaXJlY3RzJyBpbiBzdHIoZSk6CiAgICAgICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKHNlbGYsIHVybCwgcmVhc29uPWUpCiAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLlJlc3BvbnNlVG9vTGFyZ2VFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIHJlc3BvbnNlIHRvbyBsYXJnZSwgVVJMRmV0Y2ggb25seSBzdXBwb3J0cyIKICAgICAgICAgICAgICAgICJyZXNwb25zZXMgdXAgdG8gMzJtYiBpbiBzaXplLiIsIGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5TU0xDZXJ0aWZpY2F0ZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5JbnZhbGlkTWV0aG9kRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCBkb2VzIG5vdCBzdXBwb3J0IG1ldGhvZDogJXMiICUgbWV0aG9kLCBlKQoKICAgICAgICBodHRwX3Jlc3BvbnNlID0gc2VsZi5fdXJsZmV0Y2hfcmVzcG9uc2VfdG9faHR0cF9yZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsIHJldHJpZXM9cmV0cmllcywgKipyZXNwb25zZV9rdykKCiAgICAgICAgIyBIYW5kbGUgcmVkaXJlY3Q/CiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZWRpcmVjdCBhbmQgaHR0cF9yZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgIGlmIHJlZGlyZWN0X2xvY2F0aW9uOgogICAgICAgICAgICAjIENoZWNrIGZvciByZWRpcmVjdCByZXNwb25zZQogICAgICAgICAgICBpZiAoc2VsZi51cmxmZXRjaF9yZXRyaWVzIGFuZCByZXRyaWVzLnJhaXNlX29uX3JlZGlyZWN0KToKICAgICAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3Ioc2VsZiwgdXJsLCAidG9vIG1hbnkgcmVkaXJlY3RzIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGh0dHBfcmVzcG9uc2Uuc3RhdHVzID09IDMwMzoKICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIHJlc3BvbnNlPWh0dHBfcmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgICAgICAgICBpZiByZXRyaWVzLnJhaXNlX29uX3JlZGlyZWN0OgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKHNlbGYsIHVybCwgInRvbyBtYW55IHJlZGlyZWN0cyIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0dHBfcmVzcG9uc2UKCiAgICAgICAgICAgICAgICByZXRyaWVzLnNsZWVwX2Zvcl9yZXRyeShodHRwX3Jlc3BvbnNlKQogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWRpcmVjdGluZyAlcyAtPiAlcyIsIHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgICAgICAgICByZWRpcmVjdF91cmwgPSB1cmxqb2luKHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgcmVkaXJlY3RfdXJsLCBib2R5LCBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAjIENoZWNrIGlmIHdlIHNob3VsZCByZXRyeSB0aGUgSFRUUCByZXNwb25zZS4KICAgICAgICBoYXNfcmV0cnlfYWZ0ZXIgPSBib29sKGh0dHBfcmVzcG9uc2UuZ2V0aGVhZGVyKCdSZXRyeS1BZnRlcicpKQogICAgICAgIGlmIHJldHJpZXMuaXNfcmV0cnkobWV0aG9kLCBodHRwX3Jlc3BvbnNlLnN0YXR1cywgaGFzX3JldHJ5X2FmdGVyKToKICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KAogICAgICAgICAgICAgICAgbWV0aG9kLCB1cmwsIHJlc3BvbnNlPWh0dHBfcmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cnk6ICVzIiwgdXJsKQogICAgICAgICAgICByZXRyaWVzLnNsZWVwKGh0dHBfcmVzcG9uc2UpCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwKICAgICAgICAgICAgICAgIGJvZHk9Ym9keSwgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgKipyZXNwb25zZV9rdykKCiAgICAgICAgcmV0dXJuIGh0dHBfcmVzcG9uc2UKCiAgICBkZWYgX3VybGZldGNoX3Jlc3BvbnNlX3RvX2h0dHBfcmVzcG9uc2Uoc2VsZiwgdXJsZmV0Y2hfcmVzcCwgKipyZXNwb25zZV9rdyk6CgogICAgICAgIGlmIGlzX3Byb2RfYXBwZW5naW5lKCk6CiAgICAgICAgICAgICMgUHJvZHVjdGlvbiBHQUUgaGFuZGxlcyBkZWZsYXRlIGVuY29kaW5nIGF1dG9tYXRpY2FsbHksIGJ1dCBkb2VzCiAgICAgICAgICAgICMgbm90IHJlbW92ZSB0aGUgZW5jb2RpbmcgaGVhZGVyLgogICAgICAgICAgICBjb250ZW50X2VuY29kaW5nID0gdXJsZmV0Y2hfcmVzcC5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycpCgogICAgICAgICAgICBpZiBjb250ZW50X2VuY29kaW5nID09ICdkZWZsYXRlJzoKICAgICAgICAgICAgICAgIGRlbCB1cmxmZXRjaF9yZXNwLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXQoKICAgICAgICB0cmFuc2Zlcl9lbmNvZGluZyA9IHVybGZldGNoX3Jlc3AuaGVhZGVycy5nZXQoJ3RyYW5zZmVyLWVuY29kaW5nJykKICAgICAgICAjIFdlIGhhdmUgYSBmdWxsIHJlc3BvbnNlJ3MgY29udGVudCwKICAgICAgICAjIHNvIGxldCdzIG1ha2Ugc3VyZSB3ZSBkb24ndCByZXBvcnQgb3Vyc2VsdmVzIGFzIGNodW5rZWQgZGF0YS4KICAgICAgICBpZiB0cmFuc2Zlcl9lbmNvZGluZyA9PSAnY2h1bmtlZCc6CiAgICAgICAgICAgIGVuY29kaW5ncyA9IHRyYW5zZmVyX2VuY29kaW5nLnNwbGl0KCIsIikKICAgICAgICAgICAgZW5jb2RpbmdzLnJlbW92ZSgnY2h1bmtlZCcpCiAgICAgICAgICAgIHVybGZldGNoX3Jlc3AuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSA9ICcsJy5qb2luKGVuY29kaW5ncykKCiAgICAgICAgcmV0dXJuIEhUVFBSZXNwb25zZSgKICAgICAgICAgICAgIyBJbiBvcmRlciBmb3IgZGVjb2RpbmcgdG8gd29yaywgd2UgbXVzdCBwcmVzZW50IHRoZSBjb250ZW50IGFzCiAgICAgICAgICAgICMgYSBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICBib2R5PUJ5dGVzSU8odXJsZmV0Y2hfcmVzcC5jb250ZW50KSwKICAgICAgICAgICAgaGVhZGVycz11cmxmZXRjaF9yZXNwLmhlYWRlcnMsCiAgICAgICAgICAgIHN0YXR1cz11cmxmZXRjaF9yZXNwLnN0YXR1c19jb2RlLAogICAgICAgICAgICAqKnJlc3BvbnNlX2t3CiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X2Fic29sdXRlX3RpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgaWYgdGltZW91dCBpcyBUaW1lb3V0LkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgRGVmZXIgdG8gVVJMRmV0Y2gncyBkZWZhdWx0LgogICAgICAgIGlmIGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dCk6CiAgICAgICAgICAgIGlmIHRpbWVvdXQuX3JlYWQgaXMgbm90IE5vbmUgb3IgdGltZW91dC5fY29ubmVjdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIlVSTEZldGNoIGRvZXMgbm90IHN1cHBvcnQgZ3JhbnVsYXIgdGltZW91dCBzZXR0aW5ncywgIgogICAgICAgICAgICAgICAgICAgICJyZXZlcnRpbmcgdG8gdG90YWwgb3IgZGVmYXVsdCBVUkxGZXRjaCB0aW1lb3V0LiIsCiAgICAgICAgICAgICAgICAgICAgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKQogICAgICAgICAgICByZXR1cm4gdGltZW91dC50b3RhbAogICAgICAgIHJldHVybiB0aW1lb3V0CgogICAgZGVmIF9nZXRfcmV0cmllcyhzZWxmLCByZXRyaWVzLCByZWRpcmVjdCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmV0cmllcywgUmV0cnkpOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuZnJvbV9pbnQoCiAgICAgICAgICAgICAgICByZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwgZGVmYXVsdD1zZWxmLnJldHJpZXMpCgogICAgICAgIGlmIHJldHJpZXMuY29ubmVjdCBvciByZXRyaWVzLnJlYWQgb3IgcmV0cmllcy5yZWRpcmVjdDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCBvbmx5IHN1cHBvcnRzIHRvdGFsIHJldHJpZXMgYW5kIGRvZXMgbm90ICIKICAgICAgICAgICAgICAgICJyZWNvZ25pemUgY29ubmVjdCwgcmVhZCwgb3IgcmVkaXJlY3QgcmV0cnkgcGFyYW1ldGVycy4iLAogICAgICAgICAgICAgICAgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKQoKICAgICAgICByZXR1cm4gcmV0cmllcwoKCmRlZiBpc19hcHBlbmdpbmUoKToKICAgIHJldHVybiAoaXNfbG9jYWxfYXBwZW5naW5lKCkgb3IKICAgICAgICAgICAgaXNfcHJvZF9hcHBlbmdpbmUoKSBvcgogICAgICAgICAgICBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCkpCgoKZGVmIGlzX2FwcGVuZ2luZV9zYW5kYm94KCk6CiAgICByZXR1cm4gaXNfYXBwZW5naW5lKCkgYW5kIG5vdCBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCkKCgpkZWYgaXNfbG9jYWxfYXBwZW5naW5lKCk6CiAgICByZXR1cm4gKCdBUFBFTkdJTkVfUlVOVElNRScgaW4gb3MuZW52aXJvbiBhbmQKICAgICAgICAgICAgJ0RldmVsb3BtZW50LycgaW4gb3MuZW52aXJvblsnU0VSVkVSX1NPRlRXQVJFJ10pCgoKZGVmIGlzX3Byb2RfYXBwZW5naW5lKCk6CiAgICByZXR1cm4gKCdBUFBFTkdJTkVfUlVOVElNRScgaW4gb3MuZW52aXJvbiBhbmQKICAgICAgICAgICAgJ0dvb2dsZSBBcHAgRW5naW5lLycgaW4gb3MuZW52aXJvblsnU0VSVkVSX1NPRlRXQVJFJ10gYW5kCiAgICAgICAgICAgIG5vdCBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCkpCgoKZGVmIGlzX3Byb2RfYXBwZW5naW5lX212bXMoKToKICAgIHJldHVybiBvcy5lbnZpcm9uLmdldCgnR0FFX1ZNJywgRmFsc2UpID09ICd0cnVlJwpQSwMEFAAAAAAAAAAhAC6lcY1+EQAAfhEAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL250bG1wb29sLnB5IiIiCk5UTE0gYXV0aGVudGljYXRpbmcgcG9vbCwgY29udHJpYnV0ZWQgYnkgZXJpa2NlZGVyc3RyYW4KCklzc3VlICMxMCwgc2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdXJsbGliMy9pc3N1ZXMvZGV0YWlsP2lkPTEwCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBsb2dnaW5nIGltcG9ydCBnZXRMb2dnZXIKZnJvbSBudGxtIGltcG9ydCBudGxtCgpmcm9tIC4uIGltcG9ydCBIVFRQU0Nvbm5lY3Rpb25Qb29sCmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0IEhUVFBTQ29ubmVjdGlvbgoKCmxvZyA9IGdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBOVExNQ29ubmVjdGlvblBvb2woSFRUUFNDb25uZWN0aW9uUG9vbCk6CiAgICAiIiIKICAgIEltcGxlbWVudHMgYW4gTlRMTSBhdXRoZW50aWNhdGlvbiB2ZXJzaW9uIG9mIGFuIHVybGxpYjMgY29ubmVjdGlvbiBwb29sCiAgICAiIiIKCiAgICBzY2hlbWUgPSAnaHR0cHMnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXIsIHB3LCBhdXRodXJsLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIGF1dGh1cmwgaXMgYSByYW5kb20gVVJMIG9uIHRoZSBzZXJ2ZXIgdGhhdCBpcyBwcm90ZWN0ZWQgYnkgTlRMTS4KICAgICAgICB1c2VyIGlzIHRoZSBXaW5kb3dzIHVzZXIsIHByb2JhYmx5IGluIHRoZSBET01BSU5cXHVzZXJuYW1lIGZvcm1hdC4KICAgICAgICBwdyBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKE5UTE1Db25uZWN0aW9uUG9vbCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYuYXV0aHVybCA9IGF1dGh1cmwKICAgICAgICBzZWxmLnJhd3VzZXIgPSB1c2VyCiAgICAgICAgdXNlcl9wYXJ0cyA9IHVzZXIuc3BsaXQoJ1xcJywgMSkKICAgICAgICBzZWxmLmRvbWFpbiA9IHVzZXJfcGFydHNbMF0udXBwZXIoKQogICAgICAgIHNlbGYudXNlciA9IHVzZXJfcGFydHNbMV0KICAgICAgICBzZWxmLnB3ID0gcHcKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICMgUGVyZm9ybXMgdGhlIE5UTE0gaGFuZHNoYWtlIHRoYXQgc2VjdXJlcyB0aGUgY29ubmVjdGlvbi4gVGhlIHNvY2tldAogICAgICAgICMgbXVzdCBiZSBrZXB0IG9wZW4gd2hpbGUgcmVxdWVzdHMgYXJlIHBlcmZvcm1lZC4KICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCdTdGFydGluZyBOVExNIEhUVFBTIGNvbm5lY3Rpb24gbm8uICVkOiBodHRwczovLyVzJXMnLAogICAgICAgICAgICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucywgc2VsZi5ob3N0LCBzZWxmLmF1dGh1cmwpCgogICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdLZWVwLUFsaXZlJwogICAgICAgIHJlcV9oZWFkZXIgPSAnQXV0aG9yaXphdGlvbicKICAgICAgICByZXNwX2hlYWRlciA9ICd3d3ctYXV0aGVudGljYXRlJwoKICAgICAgICBjb25uID0gSFRUUFNDb25uZWN0aW9uKGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCkKCiAgICAgICAgIyBTZW5kIG5lZ290aWF0aW9uIG1lc3NhZ2UKICAgICAgICBoZWFkZXJzW3JlcV9oZWFkZXJdID0gKAogICAgICAgICAgICAnTlRMTSAlcycgJSBudGxtLmNyZWF0ZV9OVExNX05FR09USUFURV9NRVNTQUdFKHNlbGYucmF3dXNlcikpCiAgICAgICAgbG9nLmRlYnVnKCdSZXF1ZXN0IGhlYWRlcnM6ICVzJywgaGVhZGVycykKICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsIHNlbGYuYXV0aHVybCwgTm9uZSwgaGVhZGVycykKICAgICAgICByZXMgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICByZXNoZHIgPSBkaWN0KHJlcy5nZXRoZWFkZXJzKCkpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBzdGF0dXM6ICVzICVzJywgcmVzLnN0YXR1cywgcmVzLnJlYXNvbikKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGhlYWRlcnM6ICVzJywgcmVzaGRyKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgZGF0YTogJXMgWy4uLl0nLCByZXMucmVhZCgxMDApKQoKICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzb2NrZXQsIHNvIHRoYXQgaXQgY2FuIG5vdCBiZSBjbG9zZWQgYnkKICAgICAgICAjIHRoZSByZXNwb25zZSBvYmplY3QgKHdlIHdhbnQgdG8ga2VlcCB0aGUgc29ja2V0IG9wZW4pCiAgICAgICAgcmVzLmZwID0gTm9uZQoKICAgICAgICAjIFNlcnZlciBzaG91bGQgcmVzcG9uZCB3aXRoIGEgY2hhbGxlbmdlIG1lc3NhZ2UKICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZXMgPSByZXNoZHJbcmVzcF9oZWFkZXJdLnNwbGl0KCcsICcpCiAgICAgICAgYXV0aF9oZWFkZXJfdmFsdWUgPSBOb25lCiAgICAgICAgZm9yIHMgaW4gYXV0aF9oZWFkZXJfdmFsdWVzOgogICAgICAgICAgICBpZiBzWzo1XSA9PSAnTlRMTSAnOgogICAgICAgICAgICAgICAgYXV0aF9oZWFkZXJfdmFsdWUgPSBzWzU6XQogICAgICAgIGlmIGF1dGhfaGVhZGVyX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignVW5leHBlY3RlZCAlcyByZXNwb25zZSBoZWFkZXI6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcF9oZWFkZXIsIHJlc2hkcltyZXNwX2hlYWRlcl0pKQoKICAgICAgICAjIFNlbmQgYXV0aGVudGljYXRpb24gbWVzc2FnZQogICAgICAgIFNlcnZlckNoYWxsZW5nZSwgTmVnb3RpYXRlRmxhZ3MgPSBcCiAgICAgICAgICAgIG50bG0ucGFyc2VfTlRMTV9DSEFMTEVOR0VfTUVTU0FHRShhdXRoX2hlYWRlcl92YWx1ZSkKICAgICAgICBhdXRoX21zZyA9IG50bG0uY3JlYXRlX05UTE1fQVVUSEVOVElDQVRFX01FU1NBR0UoU2VydmVyQ2hhbGxlbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWdvdGlhdGVGbGFncykKICAgICAgICBoZWFkZXJzW3JlcV9oZWFkZXJdID0gJ05UTE0gJXMnICUgYXV0aF9tc2cKICAgICAgICBsb2cuZGVidWcoJ1JlcXVlc3QgaGVhZGVyczogJXMnLCBoZWFkZXJzKQogICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgc2VsZi5hdXRodXJsLCBOb25lLCBoZWFkZXJzKQogICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2Ugc3RhdHVzOiAlcyAlcycsIHJlcy5zdGF0dXMsIHJlcy5yZWFzb24pCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBoZWFkZXJzOiAlcycsIGRpY3QocmVzLmdldGhlYWRlcnMoKSkpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBkYXRhOiAlcyBbLi4uXScsIHJlcy5yZWFkKClbOjEwMF0pCiAgICAgICAgaWYgcmVzLnN0YXR1cyAhPSAyMDA6CiAgICAgICAgICAgIGlmIHJlcy5zdGF0dXMgPT0gNDAxOgogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdTZXJ2ZXIgcmVqZWN0ZWQgcmVxdWVzdDogd3JvbmcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VybmFtZSBvciBwYXNzd29yZCcpCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignV3Jvbmcgc2VydmVyIHJlc3BvbnNlOiAlcyAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy5zdGF0dXMsIHJlcy5yZWFzb24pKQoKICAgICAgICByZXMuZnAgPSBOb25lCiAgICAgICAgbG9nLmRlYnVnKCdDb25uZWN0aW9uIGVzdGFibGlzaGVkJykKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz0zLAogICAgICAgICAgICAgICAgcmVkaXJlY3Q9VHJ1ZSwgYXNzZXJ0X3NhbWVfaG9zdD1UcnVlKToKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdLZWVwLUFsaXZlJwogICAgICAgIHJldHVybiBzdXBlcihOVExNQ29ubmVjdGlvblBvb2wsIHNlbGYpLnVybG9wZW4obWV0aG9kLCB1cmwsIGJvZHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0KQpQSwMEFAAAAAAAAAAhAPMqtnH6OwAA+jsAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3B5b3BlbnNzbC5weSIiIgpTU0wgd2l0aCBTTklfLXN1cHBvcnQgZm9yIFB5dGhvbiAyLiBGb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGlmIHlvdSB3b3VsZApsaWtlIHRvIHZlcmlmeSBTU0wgY2VydGlmaWNhdGVzIGluIFB5dGhvbiAyLiBOb3RlLCB0aGUgZGVmYXVsdCBsaWJyYXJpZXMgZG8KKm5vdCogZG8gY2VydGlmaWNhdGUgY2hlY2tpbmc7IHlvdSBuZWVkIHRvIGRvIGFkZGl0aW9uYWwgd29yayB0byB2YWxpZGF0ZQpjZXJ0aWZpY2F0ZXMgeW91cnNlbGYuCgpUaGlzIG5lZWRzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgaW5zdGFsbGVkOgoKKiBweU9wZW5TU0wgKHRlc3RlZCB3aXRoIDE2LjAuMCkKKiBjcnlwdG9ncmFwaHkgKG1pbmltdW0gMS4zLjQsIGZyb20gcHlvcGVuc3NsKQoqIGlkbmEgKG1pbmltdW0gMi4wLCBmcm9tIGNyeXB0b2dyYXBoeSkKCkhvd2V2ZXIsIHB5b3BlbnNzbCBkZXBlbmRzIG9uIGNyeXB0b2dyYXBoeSwgd2hpY2ggZGVwZW5kcyBvbiBpZG5hLCBzbyB3aGlsZSB3ZQp1c2UgYWxsIHRocmVlIGRpcmVjdGx5IGhlcmUgd2UgZW5kIHVwIGhhdmluZyByZWxhdGl2ZWx5IGZldyBwYWNrYWdlcyByZXF1aXJlZC4KCllvdSBjYW4gaW5zdGFsbCB0aGVtIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgoKICAgIHBpcCBpbnN0YWxsIHB5b3BlbnNzbCBjcnlwdG9ncmFwaHkgaWRuYQoKVG8gYWN0aXZhdGUgY2VydGlmaWNhdGUgY2hlY2tpbmcsIGNhbGwKOmZ1bmM6YH51cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsLmluamVjdF9pbnRvX3VybGxpYjNgIGZyb20geW91ciBQeXRob24gY29kZQpiZWZvcmUgeW91IGJlZ2luIG1ha2luZyBIVFRQIHJlcXVlc3RzLiBUaGlzIGNhbiBiZSBkb25lIGluIGEgYGBzaXRlY3VzdG9taXplYGAKbW9kdWxlLCBvciBhdCBhbnkgb3RoZXIgdGltZSBiZWZvcmUgeW91ciBhcHBsaWNhdGlvbiBiZWdpbnMgdXNpbmcgYGB1cmxsaWIzYGAsCmxpa2UgdGhpczo6CgogICAgdHJ5OgogICAgICAgIGltcG9ydCB1cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsCiAgICAgICAgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzKCkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgpOb3cgeW91IGNhbiB1c2UgOm1vZDpgdXJsbGliM2AgYXMgeW91IG5vcm1hbGx5IHdvdWxkLCBhbmQgaXQgd2lsbCBzdXBwb3J0IFNOSQp3aGVuIHRoZSByZXF1aXJlZCBtb2R1bGVzIGFyZSBpbnN0YWxsZWQuCgpBY3RpdmF0aW5nIHRoaXMgbW9kdWxlIGFsc28gaGFzIHRoZSBwb3NpdGl2ZSBzaWRlIGVmZmVjdCBvZiBkaXNhYmxpbmcgU1NML1RMUwpjb21wcmVzc2lvbiBpbiBQeXRob24gMiAoc2VlIGBDUklNRSBhdHRhY2tgXykuCgpJZiB5b3Ugd2FudCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgbGlzdCBvZiBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcywgeW91IGNhbgpzZXQgdGhlIGBgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5ERUZBVUxUX1NTTF9DSVBIRVJfTElTVGBgIHZhcmlhYmxlLgoKLi4gX3NuaTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2VydmVyX05hbWVfSW5kaWNhdGlvbgouLiBfY3JpbWUgYXR0YWNrOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DUklNRV8oc2VjdXJpdHlfZXhwbG9pdCkKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgT3BlblNTTC5TU0wKZnJvbSBjcnlwdG9ncmFwaHkgaW1wb3J0IHg1MDkKZnJvbSBjcnlwdG9ncmFwaHkuaGF6bWF0LmJhY2tlbmRzLm9wZW5zc2wgaW1wb3J0IGJhY2tlbmQgYXMgb3BlbnNzbF9iYWNrZW5kCmZyb20gY3J5cHRvZ3JhcGh5Lmhhem1hdC5iYWNrZW5kcy5vcGVuc3NsLng1MDkgaW1wb3J0IF9DZXJ0aWZpY2F0ZQoKZnJvbSBzb2NrZXQgaW1wb3J0IHRpbWVvdXQsIGVycm9yIGFzIFNvY2tldEVycm9yCmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KCnRyeTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBmcm9tIHNvY2tldCBpbXBvcnQgX2ZpbGVvYmplY3QKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIF9maWxlb2JqZWN0ID0gTm9uZQogICAgZnJvbSAuLnBhY2thZ2VzLmJhY2twb3J0cy5tYWtlZmlsZSBpbXBvcnQgYmFja3BvcnRfbWFrZWZpbGUKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzc2wKZnJvbSAuLnBhY2thZ2VzIGltcG9ydCBzaXgKaW1wb3J0IHN5cwoKZnJvbSAuLiBpbXBvcnQgdXRpbAoKX19hbGxfXyA9IFsnaW5qZWN0X2ludG9fdXJsbGliMycsICdleHRyYWN0X2Zyb21fdXJsbGliMyddCgojIFNOSSBhbHdheXMgd29ya3MuCkhBU19TTkkgPSBUcnVlCgojIE1hcCBmcm9tIHVybGxpYjMgdG8gUHlPcGVuU1NMIGNvbXBhdGlibGUgcGFyYW1ldGVyLXZhbHVlcy4KX29wZW5zc2xfdmVyc2lvbnMgPSB7CiAgICBzc2wuUFJPVE9DT0xfU1NMdjIzOiBPcGVuU1NMLlNTTC5TU0x2MjNfTUVUSE9ELAogICAgc3NsLlBST1RPQ09MX1RMU3YxOiBPcGVuU1NMLlNTTC5UTFN2MV9NRVRIT0QsCn0KCmlmIGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpIGFuZCBoYXNhdHRyKE9wZW5TU0wuU1NMLCAnVExTdjFfMV9NRVRIT0QnKToKICAgIF9vcGVuc3NsX3ZlcnNpb25zW3NzbC5QUk9UT0NPTF9UTFN2MV8xXSA9IE9wZW5TU0wuU1NMLlRMU3YxXzFfTUVUSE9ECgppZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKSBhbmQgaGFzYXR0cihPcGVuU1NMLlNTTCwgJ1RMU3YxXzJfTUVUSE9EJyk6CiAgICBfb3BlbnNzbF92ZXJzaW9uc1tzc2wuUFJPVE9DT0xfVExTdjFfMl0gPSBPcGVuU1NMLlNTTC5UTFN2MV8yX01FVEhPRAoKdHJ5OgogICAgX29wZW5zc2xfdmVyc2lvbnMudXBkYXRlKHtzc2wuUFJPVE9DT0xfU1NMdjM6IE9wZW5TU0wuU1NMLlNTTHYzX01FVEhPRH0pCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIHBhc3MKCl9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnkgPSB7CiAgICBzc2wuQ0VSVF9OT05FOiBPcGVuU1NMLlNTTC5WRVJJRllfTk9ORSwKICAgIHNzbC5DRVJUX09QVElPTkFMOiBPcGVuU1NMLlNTTC5WRVJJRllfUEVFUiwKICAgIHNzbC5DRVJUX1JFUVVJUkVEOgogICAgICAgIE9wZW5TU0wuU1NMLlZFUklGWV9QRUVSICsgT3BlblNTTC5TU0wuVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJULAp9Cl9vcGVuc3NsX3RvX3N0ZGxpYl92ZXJpZnkgPSBkaWN0KAogICAgKHYsIGspIGZvciBrLCB2IGluIF9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnkuaXRlbXMoKQopCgojIE9wZW5TU0wgd2lsbCBvbmx5IHdyaXRlIDE2SyBhdCBhIHRpbWUKU1NMX1dSSVRFX0JMT0NLU0laRSA9IDE2Mzg0CgpvcmlnX3V0aWxfSEFTX1NOSSA9IHV0aWwuSEFTX1NOSQpvcmlnX3V0aWxfU1NMQ29udGV4dCA9IHV0aWwuc3NsXy5TU0xDb250ZXh0CgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIGluamVjdF9pbnRvX3VybGxpYjMoKToKICAgICdNb25rZXktcGF0Y2ggdXJsbGliMyB3aXRoIFB5T3BlblNTTC1iYWNrZWQgU1NMLXN1cHBvcnQuJwoKICAgIF92YWxpZGF0ZV9kZXBlbmRlbmNpZXNfbWV0KCkKCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IFB5T3BlblNTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5JU19QWU9QRU5TU0wgPSBUcnVlCiAgICB1dGlsLnNzbF8uSVNfUFlPUEVOU1NMID0gVHJ1ZQoKCmRlZiBleHRyYWN0X2Zyb21fdXJsbGliMygpOgogICAgJ1VuZG8gbW9ua2V5LXBhdGNoaW5nIGJ5IDpmdW5jOmBpbmplY3RfaW50b191cmxsaWIzYC4nCgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBvcmlnX3V0aWxfU1NMQ29udGV4dAogICAgdXRpbC5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuSVNfUFlPUEVOU1NMID0gRmFsc2UKICAgIHV0aWwuc3NsXy5JU19QWU9QRU5TU0wgPSBGYWxzZQoKCmRlZiBfdmFsaWRhdGVfZGVwZW5kZW5jaWVzX21ldCgpOgogICAgIiIiCiAgICBWZXJpZmllcyB0aGF0IFB5T3BlblNTTCdzIHBhY2thZ2UtbGV2ZWwgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBtZXQuCiAgICBUaHJvd3MgYEltcG9ydEVycm9yYCBpZiB0aGV5IGFyZSBub3QgbWV0LgogICAgIiIiCiAgICAjIE1ldGhvZCBhZGRlZCBpbiBgY3J5cHRvZ3JhcGh5PT0xLjFgOyBub3QgYXZhaWxhYmxlIGluIG9sZGVyIHZlcnNpb25zCiAgICBmcm9tIGNyeXB0b2dyYXBoeS54NTA5LmV4dGVuc2lvbnMgaW1wb3J0IEV4dGVuc2lvbnMKICAgIGlmIGdldGF0dHIoRXh0ZW5zaW9ucywgImdldF9leHRlbnNpb25fZm9yX2NsYXNzIiwgTm9uZSkgaXMgTm9uZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiJ2NyeXB0b2dyYXBoeScgbW9kdWxlIG1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5IHVwZ3JhZGluZyB0byB2MS4zLjQgb3IgbmV3ZXIuIikKCiAgICAjIHB5T3BlblNTTCAwLjE0IGFuZCBhYm92ZSB1c2UgY3J5cHRvZ3JhcGh5IGZvciBPcGVuU1NMIGJpbmRpbmdzLiBUaGUgX3g1MDkKICAgICMgYXR0cmlidXRlIGlzIG9ubHkgcHJlc2VudCBvbiB0aG9zZSB2ZXJzaW9ucy4KICAgIGZyb20gT3BlblNTTC5jcnlwdG8gaW1wb3J0IFg1MDkKICAgIHg1MDkgPSBYNTA5KCkKICAgIGlmIGdldGF0dHIoeDUwOSwgIl94NTA5IiwgTm9uZSkgaXMgTm9uZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiJ3B5T3BlblNTTCcgbW9kdWxlIG1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJUcnkgdXBncmFkaW5nIHRvIHYwLjE0IG9yIG5ld2VyLiIpCgoKZGVmIF9kbnNuYW1lX3RvX3N0ZGxpYihuYW1lKToKICAgICIiIgogICAgQ29udmVydHMgYSBkTlNOYW1lIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUgZmllbGQgdG8gdGhlIGZvcm0gdXNlZCBieSB0aGUKICAgIHN0YW5kYXJkIGxpYnJhcnkgb24gdGhlIGdpdmVuIFB5dGhvbiB2ZXJzaW9uLgoKICAgIENyeXB0b2dyYXBoeSBwcm9kdWNlcyBhIGROU05hbWUgYXMgYSB1bmljb2RlIHN0cmluZyB0aGF0IHdhcyBpZG5hLWRlY29kZWQKICAgIGZyb20gQVNDSUkgYnl0ZXMuIFdlIG5lZWQgdG8gaWRuYS1lbmNvZGUgdGhhdCBzdHJpbmcgdG8gZ2V0IGl0IGJhY2ssIGFuZAogICAgdGhlbiBvbiBQeXRob24gMyB3ZSBhbHNvIG5lZWQgdG8gY29udmVydCB0byB1bmljb2RlIHZpYSBVVEYtOCAodGhlIHN0ZGxpYgogICAgdXNlcyBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUgb24gaXQsIHdoaWNoIGRlY29kZXMgdmlhIFVURi04KS4KICAgICIiIgogICAgZGVmIGlkbmFfZW5jb2RlKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEJvcnJvd2VkIHdob2xlc2FsZSBmcm9tIHRoZSBQeXRob24gQ3J5cHRvZ3JhcGh5IFByb2plY3QuIEl0IHR1cm5zIG91dAogICAgICAgIHRoYXQgd2UgY2FuJ3QganVzdCBzYWZlbHkgY2FsbCBgaWRuYS5lbmNvZGVgOiBpdCBjYW4gZXhwbG9kZSBmb3IKICAgICAgICB3aWxkY2FyZCBuYW1lcy4gVGhpcyBhdm9pZHMgdGhhdCBwcm9ibGVtLgogICAgICAgICIiIgogICAgICAgIGltcG9ydCBpZG5hCgogICAgICAgIGZvciBwcmVmaXggaW4gW3UnKi4nLCB1Jy4nXToKICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgnYXNjaWknKSArIGlkbmEuZW5jb2RlKG5hbWUpCiAgICAgICAgcmV0dXJuIGlkbmEuZW5jb2RlKG5hbWUpCgogICAgbmFtZSA9IGlkbmFfZW5jb2RlKG5hbWUpCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKToKICAgICAgICBuYW1lID0gbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBuYW1lCgoKZGVmIGdldF9zdWJqX2FsdF9uYW1lKHBlZXJfY2VydCk6CiAgICAiIiIKICAgIEdpdmVuIGFuIFB5T3BlblNTTCBjZXJ0aWZpY2F0ZSwgcHJvdmlkZXMgYWxsIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzLgogICAgIiIiCiAgICAjIFBhc3MgdGhlIGNlcnQgdG8gY3J5cHRvZ3JhcGh5LCB3aGljaCBoYXMgbXVjaCBiZXR0ZXIgQVBJcyBmb3IgdGhpcy4KICAgIGlmIGhhc2F0dHIocGVlcl9jZXJ0LCAidG9fY3J5cHRvZ3JhcGh5Iik6CiAgICAgICAgY2VydCA9IHBlZXJfY2VydC50b19jcnlwdG9ncmFwaHkoKQogICAgZWxzZToKICAgICAgICAjIFRoaXMgaXMgdGVjaG5pY2FsbHkgdXNpbmcgcHJpdmF0ZSBBUElzLCBidXQgc2hvdWxkIHdvcmsgYWNyb3NzIGFsbAogICAgICAgICMgcmVsZXZhbnQgdmVyc2lvbnMgYmVmb3JlIFB5T3BlblNTTCBnb3QgYSBwcm9wZXIgQVBJIGZvciB0aGlzLgogICAgICAgIGNlcnQgPSBfQ2VydGlmaWNhdGUob3BlbnNzbF9iYWNrZW5kLCBwZWVyX2NlcnQuX3g1MDkpCgogICAgIyBXZSB3YW50IHRvIGZpbmQgdGhlIFNBTiBleHRlbnNpb24uIEFzayBDcnlwdG9ncmFwaHkgdG8gbG9jYXRlIGl0IChpdCdzCiAgICAjIGZhc3RlciB0aGFuIGxvb3BpbmcgaW4gUHl0aG9uKQogICAgdHJ5OgogICAgICAgIGV4dCA9IGNlcnQuZXh0ZW5zaW9ucy5nZXRfZXh0ZW5zaW9uX2Zvcl9jbGFzcygKICAgICAgICAgICAgeDUwOS5TdWJqZWN0QWx0ZXJuYXRpdmVOYW1lCiAgICAgICAgKS52YWx1ZQogICAgZXhjZXB0IHg1MDkuRXh0ZW5zaW9uTm90Rm91bmQ6CiAgICAgICAgIyBObyBzdWNoIGV4dGVuc2lvbiwgcmV0dXJuIHRoZSBlbXB0eSBsaXN0LgogICAgICAgIHJldHVybiBbXQogICAgZXhjZXB0ICh4NTA5LkR1cGxpY2F0ZUV4dGVuc2lvbiwgeDUwOS5VbnN1cHBvcnRlZEV4dGVuc2lvbiwKICAgICAgICAgICAgeDUwOS5VbnN1cHBvcnRlZEdlbmVyYWxOYW1lVHlwZSwgVW5pY29kZUVycm9yKSBhcyBlOgogICAgICAgICMgQSBwcm9ibGVtIGhhcyBiZWVuIGZvdW5kIHdpdGggdGhlIHF1YWxpdHkgb2YgdGhlIGNlcnRpZmljYXRlLiBBc3N1bWUKICAgICAgICAjIG5vIFNBTiBmaWVsZCBpcyBwcmVzZW50LgogICAgICAgIGxvZy53YXJuaW5nKAogICAgICAgICAgICAiQSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZCB3aXRoIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IHByZXZlbnRlZCAiCiAgICAgICAgICAgICJ1cmxsaWIzIGZyb20gZmluZGluZyB0aGUgU3ViamVjdEFsdGVybmF0aXZlTmFtZSBmaWVsZC4gVGhpcyBjYW4gIgogICAgICAgICAgICAiYWZmZWN0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uIFRoZSBlcnJvciB3YXMgJXMiLAogICAgICAgICAgICBlLAogICAgICAgICkKICAgICAgICByZXR1cm4gW10KCiAgICAjIFdlIHdhbnQgdG8gcmV0dXJuIGROU05hbWUgYW5kIGlQQWRkcmVzcyBmaWVsZHMuIFdlIG5lZWQgdG8gY2FzdCB0aGUgSVBzCiAgICAjIGJhY2sgdG8gc3RyaW5ncyBiZWNhdXNlIHRoZSBtYXRjaF9ob3N0bmFtZSBmdW5jdGlvbiB3YW50cyB0aGVtIGFzCiAgICAjIHN0cmluZ3MuCiAgICAjIFNhZGx5IHRoZSBETlMgbmFtZXMgbmVlZCB0byBiZSBpZG5hIGVuY29kZWQgYW5kIHRoZW4sIG9uIFB5dGhvbiAzLCBVVEYtOAogICAgIyBkZWNvZGVkLiBUaGlzIGlzIHByZXR0eSBmcnVzdHJhdGluZywgYnV0IHRoYXQncyB3aGF0IHRoZSBzdGFuZGFyZCBsaWJyYXJ5CiAgICAjIGRvZXMgd2l0aCBjZXJ0aWZpY2F0ZXMsIGFuZCBzbyB3ZSBuZWVkIHRvIGF0dGVtcHQgdG8gZG8gdGhlIHNhbWUuCiAgICBuYW1lcyA9IFsKICAgICAgICAoJ0ROUycsIF9kbnNuYW1lX3RvX3N0ZGxpYihuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBleHQuZ2V0X3ZhbHVlc19mb3JfdHlwZSh4NTA5LkROU05hbWUpCiAgICBdCiAgICBuYW1lcy5leHRlbmQoCiAgICAgICAgKCdJUCBBZGRyZXNzJywgc3RyKG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGV4dC5nZXRfdmFsdWVzX2Zvcl90eXBlKHg1MDkuSVBBZGRyZXNzKQogICAgKQoKICAgIHJldHVybiBuYW1lcwoKCmNsYXNzIFdyYXBwZWRTb2NrZXQob2JqZWN0KToKICAgICcnJ0FQSS1jb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIFB5dGhvbiBPcGVuU1NMJ3MgQ29ubmVjdGlvbi1jbGFzcy4KCiAgICBOb3RlOiBfbWFrZWZpbGVfcmVmcywgX2Ryb3AoKSBhbmQgX3JldXNlKCkgYXJlIG5lZWRlZCBmb3IgdGhlIGdhcmJhZ2UKICAgIGNvbGxlY3RvciBvZiBweXB5LgogICAgJycnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm5lY3Rpb24sIHNvY2tldCwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSk6CiAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgogICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CiAgICAgICAgc2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyA9IHN1cHByZXNzX3JhZ2dlZF9lb2ZzCiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyA9IDAKICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmZpbGVubygpCgogICAgIyBDb3B5LXBhc3RlZCBmcm9tIFB5dGhvbiAzLjUgc291cmNlIGNvZGUKICAgIGRlZiBfZGVjcmVmX3NvY2tldGlvcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzID4gMDoKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgcmVjdihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29ubmVjdGlvbi5yZWN2KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgYW5kIGUuYXJncyA9PSAoLTEsICdVbmV4cGVjdGVkIEVPRicpOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgU29ja2V0RXJyb3Ioc3RyKGUpKQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5aZXJvUmV0dXJuRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uLmdldF9zaHV0ZG93bigpID09IE9wZW5TU0wuU1NMLlJFQ0VJVkVEX1NIVVRET1dOOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFJlYWRFcnJvcjoKICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc2VsZi5zb2NrZXQsIHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgaWYgbm90IHJkOgogICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWN2KCphcmdzLCAqKmt3YXJncykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiByZWN2X2ludG8oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24ucmVjdl9pbnRvKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgYW5kIGUuYXJncyA9PSAoLTEsICdVbmV4cGVjdGVkIEVPRicpOgogICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFNvY2tldEVycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuWmVyb1JldHVybkVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5nZXRfc2h1dGRvd24oKSA9PSBPcGVuU1NMLlNTTC5SRUNFSVZFRF9TSFVURE9XTjoKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50UmVhZEVycm9yOgogICAgICAgICAgICByZCA9IHV0aWwud2FpdF9mb3JfcmVhZChzZWxmLnNvY2tldCwgc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpKQogICAgICAgICAgICBpZiBub3QgcmQ6CiAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCdUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0JykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlY3ZfaW50bygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIHNldHRpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LnNldHRpbWVvdXQodGltZW91dCkKCiAgICBkZWYgX3NlbmRfdW50aWxfZG9uZShzZWxmLCBkYXRhKToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnNlbmQoZGF0YSkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRXcml0ZUVycm9yOgogICAgICAgICAgICAgICAgd3IgPSB1dGlsLndhaXRfZm9yX3dyaXRlKHNlbGYuc29ja2V0LCBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgICAgICBpZiBub3Qgd3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBTb2NrZXRFcnJvcihzdHIoZSkpCgogICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CiAgICAgICAgdG90YWxfc2VudCA9IDAKICAgICAgICB3aGlsZSB0b3RhbF9zZW50IDwgbGVuKGRhdGEpOgogICAgICAgICAgICBzZW50ID0gc2VsZi5fc2VuZF91bnRpbF9kb25lKGRhdGFbdG90YWxfc2VudDp0b3RhbF9zZW50ICsgU1NMX1dSSVRFX0JMT0NLU0laRV0pCiAgICAgICAgICAgIHRvdGFsX3NlbnQgKz0gc2VudAoKICAgIGRlZiBzaHV0ZG93bihzZWxmKToKICAgICAgICAjIEZJWE1FIHJldGhyb3cgY29tcGF0aWJsZSBleGNlcHRpb25zIHNob3VsZCB3ZSBldmVyIHVzZSB0aGlzCiAgICAgICAgc2VsZi5jb25uZWN0aW9uLnNodXRkb3duKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCiAgICBkZWYgZ2V0cGVlcmNlcnQoc2VsZiwgYmluYXJ5X2Zvcm09RmFsc2UpOgogICAgICAgIHg1MDkgPSBzZWxmLmNvbm5lY3Rpb24uZ2V0X3BlZXJfY2VydGlmaWNhdGUoKQoKICAgICAgICBpZiBub3QgeDUwOToKICAgICAgICAgICAgcmV0dXJuIHg1MDkKCiAgICAgICAgaWYgYmluYXJ5X2Zvcm06CiAgICAgICAgICAgIHJldHVybiBPcGVuU1NMLmNyeXB0by5kdW1wX2NlcnRpZmljYXRlKAogICAgICAgICAgICAgICAgT3BlblNTTC5jcnlwdG8uRklMRVRZUEVfQVNOMSwKICAgICAgICAgICAgICAgIHg1MDkpCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdzdWJqZWN0JzogKAogICAgICAgICAgICAgICAgKCgnY29tbW9uTmFtZScsIHg1MDkuZ2V0X3N1YmplY3QoKS5DTiksKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3N1YmplY3RBbHROYW1lJzogZ2V0X3N1YmpfYWx0X25hbWUoeDUwOSkKICAgICAgICB9CgogICAgZGVmIF9yZXVzZShzZWxmKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKCiAgICBkZWYgX2Ryb3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKCmlmIF9maWxlb2JqZWN0OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPS0xKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZiwgbW9kZSwgYnVmc2l6ZSwgY2xvc2U9VHJ1ZSkKZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBtYWtlZmlsZSA9IGJhY2twb3J0X21ha2VmaWxlCgpXcmFwcGVkU29ja2V0Lm1ha2VmaWxlID0gbWFrZWZpbGUKCgpjbGFzcyBQeU9wZW5TU0xDb250ZXh0KG9iamVjdCk6CiAgICAiIiIKICAgIEkgYW0gYSB3cmFwcGVyIGNsYXNzIGZvciB0aGUgUHlPcGVuU1NMIGBgQ29udGV4dGBgIG9iamVjdC4gSSBhbSByZXNwb25zaWJsZQogICAgZm9yIHRyYW5zbGF0aW5nIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYGBTU0xDb250ZXh0YGAgb2JqZWN0CiAgICB0byBjYWxscyBpbnRvIFB5T3BlblNTTC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKICAgICAgICBzZWxmLnByb3RvY29sID0gX29wZW5zc2xfdmVyc2lvbnNbcHJvdG9jb2xdCiAgICAgICAgc2VsZi5fY3R4ID0gT3BlblNTTC5TU0wuQ29udGV4dChzZWxmLnByb3RvY29sKQogICAgICAgIHNlbGYuX29wdGlvbnMgPSAwCiAgICAgICAgc2VsZi5jaGVja19ob3N0bmFtZSA9IEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3B0aW9ucyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucwoKICAgIEBvcHRpb25zLnNldHRlcgogICAgZGVmIG9wdGlvbnMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX29wdGlvbnMgPSB2YWx1ZQogICAgICAgIHNlbGYuX2N0eC5zZXRfb3B0aW9ucyh2YWx1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmKToKICAgICAgICByZXR1cm4gX29wZW5zc2xfdG9fc3RkbGliX3ZlcmlmeVtzZWxmLl9jdHguZ2V0X3ZlcmlmeV9tb2RlKCldCgogICAgQHZlcmlmeV9tb2RlLnNldHRlcgogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9jdHguc2V0X3ZlcmlmeSgKICAgICAgICAgICAgX3N0ZGxpYl90b19vcGVuc3NsX3ZlcmlmeVt2YWx1ZV0sCiAgICAgICAgICAgIF92ZXJpZnlfY2FsbGJhY2sKICAgICAgICApCgogICAgZGVmIHNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzZWxmKToKICAgICAgICBzZWxmLl9jdHguc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKCiAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVycyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShjaXBoZXJzLCBzaXgudGV4dF90eXBlKToKICAgICAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgc2VsZi5fY3R4LnNldF9jaXBoZXJfbGlzdChjaXBoZXJzKQoKICAgIGRlZiBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lLCBjYWRhdGE9Tm9uZSk6CiAgICAgICAgaWYgY2FmaWxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYWZpbGUgPSBjYWZpbGUuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgY2FwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYXBhdGggPSBjYXBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgc2VsZi5fY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWZpbGUsIGNhcGF0aCkKICAgICAgICBpZiBjYWRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2N0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoQnl0ZXNJTyhjYWRhdGEpKQoKICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CiAgICAgICAgc2VsZi5fY3R4LnVzZV9jZXJ0aWZpY2F0ZV9maWxlKGNlcnRmaWxlKQogICAgICAgIGlmIHBhc3N3b3JkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9jdHguc2V0X3Bhc3N3ZF9jYihsYW1iZGEgbWF4X2xlbmd0aCwgcHJvbXB0X3R3aWNlLCB1c2VyZGF0YTogcGFzc3dvcmQpCiAgICAgICAgc2VsZi5fY3R4LnVzZV9wcml2YXRla2V5X2ZpbGUoa2V5ZmlsZSBvciBjZXJ0ZmlsZSkKCiAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29jaywgc2VydmVyX3NpZGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSk6CiAgICAgICAgY254ID0gT3BlblNTTC5TU0wuQ29ubmVjdGlvbihzZWxmLl9jdHgsIHNvY2spCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VydmVyX2hvc3RuYW1lLCBzaXgudGV4dF90eXBlKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZSA9IHNlcnZlcl9ob3N0bmFtZS5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgaWYgc2VydmVyX2hvc3RuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjbnguc2V0X3Rsc2V4dF9ob3N0X25hbWUoc2VydmVyX2hvc3RuYW1lKQoKICAgICAgICBjbnguc2V0X2Nvbm5lY3Rfc3RhdGUoKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjbnguZG9faGFuZHNoYWtlKCkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRSZWFkRXJyb3I6CiAgICAgICAgICAgICAgICByZCA9IHV0aWwud2FpdF9mb3JfcmVhZChzb2NrLCBzb2NrLmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCByZDoKICAgICAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCdzZWxlY3QgdGltZWQgb3V0JykKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCdiYWQgaGFuZHNoYWtlOiAlcicgJSBlKQogICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gV3JhcHBlZFNvY2tldChjbngsIHNvY2spCgoKZGVmIF92ZXJpZnlfY2FsbGJhY2soY254LCB4NTA5LCBlcnJfbm8sIGVycl9kZXB0aCwgcmV0dXJuX2NvZGUpOgogICAgcmV0dXJuIGVycl9ubyA9PSAwClBLAwQUAAAAAAAAACEA51PA8yV3AAAldwAAPgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc2VjdXJldHJhbnNwb3J0LnB5IiIiClNlY3VyZVRyYW5wb3J0IHN1cHBvcnQgZm9yIHVybGxpYjMgdmlhIGN0eXBlcy4KClRoaXMgbWFrZXMgcGxhdGZvcm0tbmF0aXZlIFRMUyBhdmFpbGFibGUgdG8gdXJsbGliMyB1c2VycyBvbiBtYWNPUyB3aXRob3V0IHRoZQp1c2Ugb2YgYSBjb21waWxlci4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgZmVhdHVyZSBiZWNhdXNlIHRoZSBQeXRob24gUGFja2FnZQpJbmRleCBpcyBtb3ZpbmcgdG8gYmVjb21lIGEgVExTdjEuMi1vci1oaWdoZXIgc2VydmVyLCBhbmQgdGhlIGRlZmF1bHQgT3BlblNTTAp0aGF0IHNoaXBzIHdpdGggbWFjT1MgaXMgbm90IGNhcGFibGUgb2YgZG9pbmcgVExTdjEuMi4gVGhlIG9ubHkgd2F5IHRvIHJlc29sdmUKdGhpcyBpcyB0byBnaXZlIG1hY09TIHVzZXJzIGFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLCBhbmQgdGhhdApzb2x1dGlvbiBpcyB0byB1c2UgU2VjdXJlVHJhbnNwb3J0LgoKV2UgdXNlIGN0eXBlcyBoZXJlIGJlY2F1c2UgdGhpcyBzb2x1dGlvbiBtdXN0IG5vdCByZXF1aXJlIGEgY29tcGlsZXIuIFRoYXQncwpiZWNhdXNlIHBpcCBpcyBub3QgYWxsb3dlZCB0byByZXF1aXJlIGEgY29tcGlsZXIgZWl0aGVyLgoKVGhpcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBzZXJpb3VzbHkgbG9uZy10ZXJtIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4KVGhlIGhvcGUgaXMgdGhhdCBQRVAgNTQzIHdpbGwgZXZlbnR1YWxseSBzb2x2ZSB0aGlzIGlzc3VlIGZvciB1cywgYXQgd2hpY2gKcG9pbnQgd2UgY2FuIHJldGlyZSB0aGlzIGNvbnRyaWIgbW9kdWxlLiBCdXQgaW4gdGhlIHNob3J0IHRlcm0sIHdlIG5lZWQgdG8Kc29sdmUgdGhlIGltcGVuZGluZyB0aXJlIGZpcmUgdGhhdCBpcyBQeXRob24gb24gTWFjIHdpdGhvdXQgdGhpcyBraW5kIG9mCmNvbnRyaWIgbW9kdWxlLiBTby4uLmhlcmUgd2UgYXJlLgoKVG8gdXNlIHRoaXMgbW9kdWxlLCBzaW1wbHkgaW1wb3J0IGFuZCBpbmplY3QgaXQ6OgoKICAgIGltcG9ydCB1cmxsaWIzLmNvbnRyaWIuc2VjdXJldHJhbnNwb3J0CiAgICB1cmxsaWIzLmNvbnRyaWIuc2VjdXJldHJhbnNwb3J0LmluamVjdF9pbnRvX3VybGxpYjMoKQoKSGFwcHkgVExTaW5nIQoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBjdHlwZXMKaW1wb3J0IGVycm5vCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHNvY2tldAppbXBvcnQgc3NsCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdlYWtyZWYKCmZyb20gLi4gaW1wb3J0IHV0aWwKZnJvbSAuX3NlY3VyZXRyYW5zcG9ydC5iaW5kaW5ncyBpbXBvcnQgKAogICAgU2VjdXJpdHksIFNlY3VyaXR5Q29uc3QsIENvcmVGb3VuZGF0aW9uCikKZnJvbSAuX3NlY3VyZXRyYW5zcG9ydC5sb3dfbGV2ZWwgaW1wb3J0ICgKICAgIF9hc3NlcnRfbm9fZXJyb3IsIF9jZXJ0X2FycmF5X2Zyb21fcGVtLCBfdGVtcG9yYXJ5X2tleWNoYWluLAogICAgX2xvYWRfY2xpZW50X2NlcnRfY2hhaW4KKQoKdHJ5OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGZyb20gc29ja2V0IGltcG9ydCBfZmlsZW9iamVjdApleGNlcHQgSW1wb3J0RXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgX2ZpbGVvYmplY3QgPSBOb25lCiAgICBmcm9tIC4ucGFja2FnZXMuYmFja3BvcnRzLm1ha2VmaWxlIGltcG9ydCBiYWNrcG9ydF9tYWtlZmlsZQoKdHJ5OgogICAgbWVtb3J5dmlldyhiJycpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICByYWlzZSBJbXBvcnRFcnJvcigiU2VjdXJlVHJhbnNwb3J0IG9ubHkgd29ya3Mgb24gUHl0aG9ucyB3aXRoIG1lbW9yeXZpZXciKQoKX19hbGxfXyA9IFsnaW5qZWN0X2ludG9fdXJsbGliMycsICdleHRyYWN0X2Zyb21fdXJsbGliMyddCgojIFNOSSBhbHdheXMgd29ya3MKSEFTX1NOSSA9IFRydWUKCm9yaWdfdXRpbF9IQVNfU05JID0gdXRpbC5IQVNfU05JCm9yaWdfdXRpbF9TU0xDb250ZXh0ID0gdXRpbC5zc2xfLlNTTENvbnRleHQKCiMgVGhpcyBkaWN0aW9uYXJ5IGlzIHVzZWQgYnkgdGhlIHJlYWQgY2FsbGJhY2sgdG8gb2J0YWluIGEgaGFuZGxlIHRvIHRoZQojIGNhbGxpbmcgd3JhcHBlZCBzb2NrZXQuIFRoaXMgaXMgYSBwcmV0dHkgc2lsbHkgYXBwcm9hY2gsIGJ1dCBmb3Igbm93IGl0J2xsCiMgZG8uIEkgZmVlbCBsaWtlIEkgc2hvdWxkIGJlIGFibGUgdG8gc211Z2dsZSBhIGhhbmRsZSB0byB0aGUgd3JhcHBlZCBzb2NrZXQKIyBkaXJlY3RseSBpbiB0aGUgU1NMQ29ubmVjdGlvblJlZiwgYnV0IGZvciBub3cgdGhpcyBhcHByb2FjaCB3aWxsIHdvcmsgSQojIGd1ZXNzLgojCiMgV2UgbmVlZCB0byBsb2NrIGFyb3VuZCB0aGlzIHN0cnVjdHVyZSBmb3IgaW5zZXJ0cywgYnV0IHdlIGRvbid0IGRvIGl0IGZvcgojIHJlYWRzL3dyaXRlcyBpbiB0aGUgY2FsbGJhY2tzLiBUaGUgcmVhc29uaW5nIGhlcmUgZ29lcyBhcyBmb2xsb3dzOgojCiMgICAgMS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbGwgaW50byB0aGUgY2FsbGJhY2tzIGJlZm9yZSB0aGUgZGljdGlvbmFyeSBpcwojICAgICAgIHBvcHVsYXRlZCwgc28gb25jZSBpbiB0aGUgY2FsbGJhY2sgdGhlIGlkIG11c3QgYmUgaW4gdGhlIGRpY3Rpb25hcnkuCiMgICAgMi4gVGhlIGNhbGxiYWNrcyBkb24ndCBtdXRhdGUgdGhlIGRpY3Rpb25hcnksIHRoZXkgb25seSByZWFkIGZyb20gaXQsIGFuZAojICAgICAgIHNvIGNhbm5vdCBjb25mbGljdCB3aXRoIGFueSBvZiB0aGUgaW5zZXJ0aW9ucy4KIwojIFRoaXMgaXMgZ29vZDogaWYgd2UgaGFkIHRvIGxvY2sgaW4gdGhlIGNhbGxiYWNrcyB3ZSdkIGRyYXN0aWNhbGx5IHNsb3cgZG93bgojIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGlzIGNvZGUuCl9jb25uZWN0aW9uX3JlZnMgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQpfY29ubmVjdGlvbl9yZWZfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKCiMgTGltaXQgd3JpdGVzIHRvIDE2a0IuIFRoaXMgaXMgT3BlblNTTCdzIGxpbWl0LCBidXQgd2UnbGwgY2FyZ28tY3VsdCBpdCBvdmVyCiMgZm9yIG5vIGJldHRlciByZWFzb24gdGhhbiB3ZSBuZWVkICphKiBsaW1pdCwgYW5kIHRoaXMgb25lIGlzIHJpZ2h0IHRoZXJlLgpTU0xfV1JJVEVfQkxPQ0tTSVpFID0gMTYzODQKCiMgVGhpcyBpcyBvdXIgZXF1aXZhbGVudCBvZiB1dGlsLnNzbF8uREVGQVVMVF9DSVBIRVJTLCBidXQgZXhwYW5kZWQgb3V0IHRvCiMgaW5kaXZpZHVhbCBjaXBoZXIgc3VpdGVzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjdWFzZSB0aGlzIGlzIGhvdwojIFNlY3VyZVRyYW5zcG9ydCB3YW50cyB0aGVtLgpDSVBIRVJfU1VJVEVTID0gWwogICAgU2VjdXJpdHlDb25zdC5UTFNfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfQ0hBQ0hBMjBfUE9MWTEzMDVfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLApdCgojIEJhc2ljYWxseSB0aGlzIGlzIHNpbXBsZTogZm9yIFBST1RPQ09MX1NTTHYyMyB3ZSB0dXJuIGl0IGludG8gYSBsb3cgb2YKIyBUTFN2MSBhbmQgYSBoaWdoIG9mIFRMU3YxLjIuIEZvciBldmVyeXRoaW5nIGVsc2UsIHdlIHBpbiB0byB0aGF0IHZlcnNpb24uCl9wcm90b2NvbF90b19taW5fbWF4ID0gewogICAgc3NsLlBST1RPQ09MX1NTTHYyMzogKFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMSwgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMiksCn0KCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfU1NMdjIiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9TU0x2Ml0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wyLCBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDIKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9TU0x2MyIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1NTTHYzXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDMsIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMwogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMU3YxIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTdjFdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMSwgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTdjFfMSIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU3YxXzFdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTEsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTEKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFN2MV8yIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTdjFfMl0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMiwgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMgogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMUyIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU10gPSBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfU1NMdjIzXQoKCmRlZiBpbmplY3RfaW50b191cmxsaWIzKCk6CiAgICAiIiIKICAgIE1vbmtleS1wYXRjaCB1cmxsaWIzIHdpdGggU2VjdXJlVHJhbnNwb3J0LWJhY2tlZCBTU0wtc3VwcG9ydC4KICAgICIiIgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBTZWN1cmVUcmFuc3BvcnRDb250ZXh0CiAgICB1dGlsLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuSVNfU0VDVVJFVFJBTlNQT1JUID0gVHJ1ZQogICAgdXRpbC5zc2xfLklTX1NFQ1VSRVRSQU5TUE9SVCA9IFRydWUKCgpkZWYgZXh0cmFjdF9mcm9tX3VybGxpYjMoKToKICAgICIiIgogICAgVW5kbyBtb25rZXktcGF0Y2hpbmcgYnkgOmZ1bmM6YGluamVjdF9pbnRvX3VybGxpYjNgLgogICAgIiIiCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IG9yaWdfdXRpbF9TU0xDb250ZXh0CiAgICB1dGlsLkhBU19TTkkgPSBvcmlnX3V0aWxfSEFTX1NOSQogICAgdXRpbC5zc2xfLkhBU19TTkkgPSBvcmlnX3V0aWxfSEFTX1NOSQogICAgdXRpbC5JU19TRUNVUkVUUkFOU1BPUlQgPSBGYWxzZQogICAgdXRpbC5zc2xfLklTX1NFQ1VSRVRSQU5TUE9SVCA9IEZhbHNlCgoKZGVmIF9yZWFkX2NhbGxiYWNrKGNvbm5lY3Rpb25faWQsIGRhdGFfYnVmZmVyLCBkYXRhX2xlbmd0aF9wb2ludGVyKToKICAgICIiIgogICAgU2VjdXJlVHJhbnNwb3J0IHJlYWQgY2FsbGJhY2suIFRoaXMgaXMgY2FsbGVkIGJ5IFNUIHRvIHJlcXVlc3QgdGhhdCBkYXRhCiAgICBiZSByZXR1cm5lZCBmcm9tIHRoZSBzb2NrZXQuCiAgICAiIiIKICAgIHdyYXBwZWRfc29ja2V0ID0gTm9uZQogICAgdHJ5OgogICAgICAgIHdyYXBwZWRfc29ja2V0ID0gX2Nvbm5lY3Rpb25fcmVmcy5nZXQoY29ubmVjdGlvbl9pZCkKICAgICAgICBpZiB3cmFwcGVkX3NvY2tldCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xJbnRlcm5hbAogICAgICAgIGJhc2Vfc29ja2V0ID0gd3JhcHBlZF9zb2NrZXQuc29ja2V0CgogICAgICAgIHJlcXVlc3RlZF9sZW5ndGggPSBkYXRhX2xlbmd0aF9wb2ludGVyWzBdCgogICAgICAgIHRpbWVvdXQgPSB3cmFwcGVkX3NvY2tldC5nZXR0aW1lb3V0KCkKICAgICAgICBlcnJvciA9IE5vbmUKICAgICAgICByZWFkX2NvdW50ID0gMAogICAgICAgIGJ1ZmZlciA9IChjdHlwZXMuY19jaGFyICogcmVxdWVzdGVkX2xlbmd0aCkuZnJvbV9hZGRyZXNzKGRhdGFfYnVmZmVyKQogICAgICAgIGJ1ZmZlcl92aWV3ID0gbWVtb3J5dmlldyhidWZmZXIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgcmVhZF9jb3VudCA8IHJlcXVlc3RlZF9sZW5ndGg6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmUgb3IgdGltZW91dCA+PSAwOgogICAgICAgICAgICAgICAgICAgIHJlYWRhYmxlcyA9IHV0aWwud2FpdF9mb3JfcmVhZChbYmFzZV9zb2NrZXRdLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkYWJsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJuby5FQUdBSU4sICd0aW1lZCBvdXQnKQoKICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byB0ZWxsIGN0eXBlcyB0aGF0IHdlIGhhdmUgYSBidWZmZXIgdGhhdCBjYW4gYmUKICAgICAgICAgICAgICAgICMgd3JpdHRlbiB0by4gVXBzZXR0aW5nbHksIHdlIGRvIHRoYXQgbGlrZSB0aGlzOgogICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IGJhc2Vfc29ja2V0LnJlY3ZfaW50bygKICAgICAgICAgICAgICAgICAgICBidWZmZXJfdmlld1tyZWFkX2NvdW50OnJlcXVlc3RlZF9sZW5ndGhdCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZWFkX2NvdW50ICs9IGNodW5rX3NpemUKICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVua19zaXplOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2NvdW50OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRHcmFjZWZ1bAogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGVycm9yID0gZS5lcnJubwoKICAgICAgICAgICAgaWYgZXJyb3IgaXMgbm90IE5vbmUgYW5kIGVycm9yICE9IGVycm5vLkVBR0FJTjoKICAgICAgICAgICAgICAgIGlmIGVycm9yID09IGVycm5vLkVDT05OUkVTRVQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkQWJvcnQKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0gPSByZWFkX2NvdW50CgogICAgICAgIGlmIHJlYWRfY291bnQgIT0gcmVxdWVzdGVkX2xlbmd0aDoKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jawoKICAgICAgICByZXR1cm4gMAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3cmFwcGVkX3NvY2tldC5fZXhjZXB0aW9uID0gZQogICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCgoKZGVmIF93cml0ZV9jYWxsYmFjayhjb25uZWN0aW9uX2lkLCBkYXRhX2J1ZmZlciwgZGF0YV9sZW5ndGhfcG9pbnRlcik6CiAgICAiIiIKICAgIFNlY3VyZVRyYW5zcG9ydCB3cml0ZSBjYWxsYmFjay4gVGhpcyBpcyBjYWxsZWQgYnkgU1QgdG8gcmVxdWVzdCB0aGF0IGRhdGEKICAgIGFjdHVhbGx5IGJlIHNlbnQgb24gdGhlIG5ldHdvcmsuCiAgICAiIiIKICAgIHdyYXBwZWRfc29ja2V0ID0gTm9uZQogICAgdHJ5OgogICAgICAgIHdyYXBwZWRfc29ja2V0ID0gX2Nvbm5lY3Rpb25fcmVmcy5nZXQoY29ubmVjdGlvbl9pZCkKICAgICAgICBpZiB3cmFwcGVkX3NvY2tldCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xJbnRlcm5hbAogICAgICAgIGJhc2Vfc29ja2V0ID0gd3JhcHBlZF9zb2NrZXQuc29ja2V0CgogICAgICAgIGJ5dGVzX3RvX3dyaXRlID0gZGF0YV9sZW5ndGhfcG9pbnRlclswXQogICAgICAgIGRhdGEgPSBjdHlwZXMuc3RyaW5nX2F0KGRhdGFfYnVmZmVyLCBieXRlc190b193cml0ZSkKCiAgICAgICAgdGltZW91dCA9IHdyYXBwZWRfc29ja2V0LmdldHRpbWVvdXQoKQogICAgICAgIGVycm9yID0gTm9uZQogICAgICAgIHNlbnQgPSAwCgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgc2VudCA8IGJ5dGVzX3RvX3dyaXRlOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBOb25lIG9yIHRpbWVvdXQgPj0gMDoKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZXMgPSB1dGlsLndhaXRfZm9yX3dyaXRlKFtiYXNlX3NvY2tldF0sIHRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHdyaXRhYmxlczoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVycm5vLkVBR0FJTiwgJ3RpbWVkIG91dCcpCiAgICAgICAgICAgICAgICBjaHVua19zZW50ID0gYmFzZV9zb2NrZXQuc2VuZChkYXRhKQogICAgICAgICAgICAgICAgc2VudCArPSBjaHVua19zZW50CgogICAgICAgICAgICAgICAgIyBUaGlzIGhhcyBzb21lIG5lZWRsZXNzIGNvcHlpbmcgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSB0aGVyZSdzCiAgICAgICAgICAgICAgICAjIG11Y2ggdmFsdWUgaW4gb3B0aW1pc2luZyB0aGlzIGRhdGEgcGF0aC4KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhW2NodW5rX3NlbnQ6XQogICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yKSBhcyBlOgogICAgICAgICAgICBlcnJvciA9IGUuZXJybm8KCiAgICAgICAgICAgIGlmIGVycm9yIGlzIG5vdCBOb25lIGFuZCBlcnJvciAhPSBlcnJuby5FQUdBSU46CiAgICAgICAgICAgICAgICBpZiBlcnJvciA9PSBlcnJuby5FQ09OTlJFU0VUOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEFib3J0CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBkYXRhX2xlbmd0aF9wb2ludGVyWzBdID0gc2VudAogICAgICAgIGlmIHNlbnQgIT0gYnl0ZXNfdG9fd3JpdGU6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2sKCiAgICAgICAgcmV0dXJuIDAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpZiB3cmFwcGVkX3NvY2tldCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd3JhcHBlZF9zb2NrZXQuX2V4Y2VwdGlvbiA9IGUKICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xJbnRlcm5hbAoKCiMgV2UgbmVlZCB0byBrZWVwIHRoZXNlIHR3byBvYmplY3RzIHJlZmVyZW5jZXMgYWxpdmU6IGlmIHRoZXkgZ2V0IEdDJ2Qgd2hpbGUKIyBpbiB1c2UgdGhlbiBTZWN1cmVUcmFuc3BvcnQgY291bGQgYXR0ZW1wdCB0byBjYWxsIGEgZnVuY3Rpb24gdGhhdCBpcyBpbiBmcmVlZAojIG1lbW9yeS4gVGhhdCB3b3VsZCBiZS4uLnVoLi4uYmFkLiBZZWFoLCB0aGF0J3MgdGhlIHdvcmQuIEJhZC4KX3JlYWRfY2FsbGJhY2tfcG9pbnRlciA9IFNlY3VyaXR5LlNTTFJlYWRGdW5jKF9yZWFkX2NhbGxiYWNrKQpfd3JpdGVfY2FsbGJhY2tfcG9pbnRlciA9IFNlY3VyaXR5LlNTTFdyaXRlRnVuYyhfd3JpdGVfY2FsbGJhY2spCgoKY2xhc3MgV3JhcHBlZFNvY2tldChvYmplY3QpOgogICAgIiIiCiAgICBBUEktY29tcGF0aWJpbGl0eSB3cmFwcGVyIGZvciBQeXRob24ncyBPcGVuU1NMIHdyYXBwZWQgc29ja2V0IG9iamVjdC4KCiAgICBOb3RlOiBfbWFrZWZpbGVfcmVmcywgX2Ryb3AoKSwgYW5kIF9yZXVzZSgpIGFyZSBuZWVkZWQgZm9yIHRoZSBnYXJiYWdlCiAgICBjb2xsZWN0b3Igb2YgUHlQeS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tldCk6CiAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQKICAgICAgICBzZWxmLmNvbnRleHQgPSBOb25lCiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyA9IDAKICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQogICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBzZWxmLl9rZXljaGFpbiA9IE5vbmUKICAgICAgICBzZWxmLl9rZXljaGFpbl9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4gPSBOb25lCgogICAgICAgICMgV2Ugc2F2ZSBvZmYgdGhlIHByZXZpb3VzbHktY29uZmlndXJlZCB0aW1lb3V0IGFuZCB0aGVuIHNldCBpdCB0bwogICAgICAgICMgemVyby4gVGhpcyBpcyBkb25lIGJlY2F1c2Ugd2UgdXNlIHNlbGVjdCBhbmQgZnJpZW5kcyB0byBoYW5kbGUgdGhlCiAgICAgICAgIyB0aW1lb3V0cywgYnV0IGlmIHdlIGxlYXZlIHRoZSB0aW1lb3V0IHNldCBvbiB0aGUgbG93ZXIgc29ja2V0IHRoZW4KICAgICAgICAjIFB5dGhvbiB3aWxsICJraW5kbHkiIGNhbGwgc2VsZWN0IG9uIHRoYXQgc29ja2V0IGFnYWluIGZvciB1cy4gQXZvaWQKICAgICAgICAjIHRoYXQgYnkgZm9yY2luZyB0aGUgdGltZW91dCB0byB6ZXJvLgogICAgICAgIHNlbGYuX3RpbWVvdXQgPSBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkKICAgICAgICBzZWxmLnNvY2tldC5zZXR0aW1lb3V0KDApCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBfcmFpc2Vfb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBjb250ZXh0IG1hbmFnZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB3cmFwIGNhbGxzIHRoYXQgZG8gSS9PIGZyb20KICAgICAgICBTZWN1cmVUcmFuc3BvcnQuIElmIGFueSBvZiB0aGUgSS9PIGNhbGxiYWNrcyBoaXQgYW4gZXhjZXB0aW9uLCB0aGlzCiAgICAgICAgY29udGV4dCBtYW5hZ2VyIHdpbGwgY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uIGFmdGVyIHRoZSBmYWN0LgogICAgICAgIFRoaXMgYXZvaWRzIHNpbGVudGx5IHN3YWxsb3dpbmcgdGhvc2UgZXhjZXB0aW9ucy4KCiAgICAgICAgSXQgYWxzbyBjb3JyZWN0bHkgZm9yY2VzIHRoZSBzb2NrZXQgY2xvc2VkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IE5vbmUKCiAgICAgICAgIyBXZSBleHBsaWNpdGx5IGRvbid0IGNhdGNoIGFyb3VuZCB0aGlzIHlpZWxkIGJlY2F1c2UgaW4gdGhlIHVubGlrZWx5CiAgICAgICAgIyBldmVudCB0aGF0IGFuIGV4Y2VwdGlvbiB3YXMgaGl0IGluIHRoZSBibG9jayB3ZSBkb24ndCB3YW50IHRvIHN3YWxsb3cKICAgICAgICAjIGl0LgogICAgICAgIHlpZWxkCiAgICAgICAgaWYgc2VsZi5fZXhjZXB0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBleGNlcHRpb24sIHNlbGYuX2V4Y2VwdGlvbiA9IHNlbGYuX2V4Y2VwdGlvbiwgTm9uZQogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9uCgogICAgZGVmIF9zZXRfY2lwaGVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHVwIHRoZSBhbGxvd2VkIGNpcGhlcnMuIEJ5IGRlZmF1bHQgdGhpcyBtYXRjaGVzIHRoZSBzZXQgaW4KICAgICAgICB1dGlsLnNzbF8uREVGQVVMVF9DSVBIRVJTLCBhdCBsZWFzdCBhcyBzdXBwb3J0ZWQgYnkgbWFjT1MuIFRoaXMgaXMgZG9uZQogICAgICAgIGN1c3RvbSBhbmQgZG9lc24ndCBhbGxvdyBjaGFuZ2luZyBhdCB0aGlzIHRpbWUsIG1vc3RseSBiZWNhdXNlIHBhcnNpbmcKICAgICAgICBPcGVuU1NMIGNpcGhlciBzdHJpbmdzIGlzIGdvaW5nIHRvIGJlIGEgZnJlYWtpbmcgbmlnaHRtYXJlLgogICAgICAgICIiIgogICAgICAgIGNpcGhlcnMgPSAoU2VjdXJpdHkuU1NMQ2lwaGVyU3VpdGUgKiBsZW4oQ0lQSEVSX1NVSVRFUykpKCpDSVBIRVJfU1VJVEVTKQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldEVuYWJsZWRDaXBoZXJzKAogICAgICAgICAgICBzZWxmLmNvbnRleHQsIGNpcGhlcnMsIGxlbihDSVBIRVJfU1VJVEVTKQogICAgICAgICkKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICBkZWYgX2N1c3RvbV92YWxpZGF0ZShzZWxmLCB2ZXJpZnksIHRydXN0X2J1bmRsZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHdoZW4gd2UgaGF2ZSBzZXQgY3VzdG9tIHZhbGlkYXRpb24uIFdlIGRvIHRoaXMgaW4gdHdvIGNhc2VzOgogICAgICAgIGZpcnN0LCB3aGVuIGNlcnQgdmFsaWRhdGlvbiBpcyBlbnRpcmVseSBkaXNhYmxlZDsgYW5kIHNlY29uZCwgd2hlbgogICAgICAgIHVzaW5nIGEgY3VzdG9tIHRydXN0IERCLgogICAgICAgICIiIgogICAgICAgICMgSWYgd2UgZGlzYWJsZWQgY2VydCB2YWxpZGF0aW9uLCBqdXN0IHNheTogY29vbC4KICAgICAgICBpZiBub3QgdmVyaWZ5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXZSB3YW50IGRhdGEgaW4gbWVtb3J5LCBzbyBsb2FkIGl0IHVwLgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHRydXN0X2J1bmRsZSk6CiAgICAgICAgICAgIHdpdGggb3Blbih0cnVzdF9idW5kbGUsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICB0cnVzdF9idW5kbGUgPSBmLnJlYWQoKQoKICAgICAgICBjZXJ0X2FycmF5ID0gTm9uZQogICAgICAgIHRydXN0ID0gU2VjdXJpdHkuU2VjVHJ1c3RSZWYoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgR2V0IGEgQ0ZBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBjZXJ0cyB3ZSB3YW50LgogICAgICAgICAgICBjZXJ0X2FycmF5ID0gX2NlcnRfYXJyYXlfZnJvbV9wZW0odHJ1c3RfYnVuZGxlKQoKICAgICAgICAgICAgIyBPaywgbm93IHRoZSBoYXJkIHBhcnQuIFdlIHdhbnQgdG8gZ2V0IHRoZSBTZWNUcnVzdFJlZiB0aGF0IFNUIGhhcwogICAgICAgICAgICAjIGNyZWF0ZWQgZm9yIHRoaXMgY29ubmVjdGlvbiwgc2hvdmUgb3VyIENBcyBpbnRvIGl0LCB0ZWxsIFNUIHRvCiAgICAgICAgICAgICMgaWdub3JlIGV2ZXJ5dGhpbmcgZWxzZSBpdCBrbm93cywgYW5kIHRoZW4gYXNrIGlmIGl0IGNhbiBidWlsZCBhCiAgICAgICAgICAgICMgY2hhaW4uIFRoaXMgaXMgYSBidXV1dW5jaCBvZiBjb2RlLgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xDb3B5UGVlclRydXN0KAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBjdHlwZXMuYnlyZWYodHJ1c3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgICAgIGlmIG5vdCB0cnVzdDoKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiRmFpbGVkIHRvIGNvcHkgdHJ1c3QgcmVmZXJlbmNlIikKCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzKHRydXN0LCBjZXJ0X2FycmF5KQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzT25seSh0cnVzdCwgVHJ1ZSkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICAgICB0cnVzdF9yZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdFJlc3VsdFR5cGUoKQogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdEV2YWx1YXRlKAogICAgICAgICAgICAgICAgdHJ1c3QsIGN0eXBlcy5ieXJlZih0cnVzdF9yZXN1bHQpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgdHJ1c3Q6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UodHJ1c3QpCgogICAgICAgICAgICBpZiBjZXJ0X2FycmF5IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydF9hcnJheSkKCiAgICAgICAgIyBPaywgbm93IHdlIGNhbiBsb29rIGF0IHdoYXQgdGhlIHJlc3VsdCB3YXMuCiAgICAgICAgc3VjY2Vzc2VzID0gKAogICAgICAgICAgICBTZWN1cml0eUNvbnN0LmtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkLAogICAgICAgICAgICBTZWN1cml0eUNvbnN0LmtTZWNUcnVzdFJlc3VsdFByb2NlZWQKICAgICAgICApCiAgICAgICAgaWYgdHJ1c3RfcmVzdWx0LnZhbHVlIG5vdCBpbiBzdWNjZXNzZXM6CiAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigKICAgICAgICAgICAgICAgICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkLCBlcnJvciBjb2RlOiAlZCIgJQogICAgICAgICAgICAgICAgdHJ1c3RfcmVzdWx0LnZhbHVlCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFuZHNoYWtlKHNlbGYsCiAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgdmVyaWZ5LAogICAgICAgICAgICAgICAgICB0cnVzdF9idW5kbGUsCiAgICAgICAgICAgICAgICAgIG1pbl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICBtYXhfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgY2xpZW50X2NlcnQsCiAgICAgICAgICAgICAgICAgIGNsaWVudF9rZXksCiAgICAgICAgICAgICAgICAgIGNsaWVudF9rZXlfcGFzc3BocmFzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWN0dWFsbHkgcGVyZm9ybXMgdGhlIFRMUyBoYW5kc2hha2UuIFRoaXMgaXMgcnVuIGF1dG9tYXRpY2FsbHkgYnkKICAgICAgICB3cmFwcGVkIHNvY2tldCwgYW5kIHNob3VsZG4ndCBiZSBuZWVkZWQgaW4gdXNlciBjb2RlLgogICAgICAgICIiIgogICAgICAgICMgRmlyc3QsIHdlIGRvIHRoZSBpbml0aWFsIGJpdHMgb2YgY29ubmVjdGlvbiBzZXR1cC4gV2UgbmVlZCB0byBjcmVhdGUKICAgICAgICAjIGEgY29udGV4dCwgc2V0IGl0cyBJL08gZnVuY3MsIGFuZCBzZXQgdGhlIGNvbm5lY3Rpb24gcmVmZXJlbmNlLgogICAgICAgIHNlbGYuY29udGV4dCA9IFNlY3VyaXR5LlNTTENyZWF0ZUNvbnRleHQoCiAgICAgICAgICAgIE5vbmUsIFNlY3VyaXR5Q29uc3Qua1NTTENsaWVudFNpZGUsIFNlY3VyaXR5Q29uc3Qua1NTTFN0cmVhbVR5cGUKICAgICAgICApCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0SU9GdW5jcygKICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBfcmVhZF9jYWxsYmFja19wb2ludGVyLCBfd3JpdGVfY2FsbGJhY2tfcG9pbnRlcgogICAgICAgICkKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBIZXJlIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgaGFuZGxlIHRvIHVzZS4gV2UgZG8gdGhpcyBieSB0YWtpbmcgdGhlCiAgICAgICAgIyBpZCBvZiBzZWxmIG1vZHVsbyAyKiozMSAtIDEuIElmIHRoaXMgaXMgYWxyZWFkeSBpbiB0aGUgZGljdGlvbmFyeSwgd2UKICAgICAgICAjIGp1c3Qga2VlcCBpbmNyZW1lbnRpbmcgYnkgb25lIHVudGlsIHdlIGZpbmQgYSBmcmVlIHNwYWNlLgogICAgICAgIHdpdGggX2Nvbm5lY3Rpb25fcmVmX2xvY2s6CiAgICAgICAgICAgIGhhbmRsZSA9IGlkKHNlbGYpICUgMjE0NzQ4MzY0NwogICAgICAgICAgICB3aGlsZSBoYW5kbGUgaW4gX2Nvbm5lY3Rpb25fcmVmczoKICAgICAgICAgICAgICAgIGhhbmRsZSA9IChoYW5kbGUgKyAxKSAlIDIxNDc0ODM2NDcKICAgICAgICAgICAgX2Nvbm5lY3Rpb25fcmVmc1toYW5kbGVdID0gc2VsZgoKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRDb25uZWN0aW9uKHNlbGYuY29udGV4dCwgaGFuZGxlKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIElmIHdlIGhhdmUgYSBzZXJ2ZXIgaG9zdG5hbWUsIHdlIHNob3VsZCBzZXQgdGhhdCB0b28uCiAgICAgICAgaWYgc2VydmVyX2hvc3RuYW1lOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZXJ2ZXJfaG9zdG5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZSA9IHNlcnZlcl9ob3N0bmFtZS5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFBlZXJEb21haW5OYW1lKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBzZXJ2ZXJfaG9zdG5hbWUsIGxlbihzZXJ2ZXJfaG9zdG5hbWUpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgU2V0dXAgdGhlIGNpcGhlcnMuCiAgICAgICAgc2VsZi5fc2V0X2NpcGhlcnMoKQoKICAgICAgICAjIFNldCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBUTFMgdmVyc2lvbnMuCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluKHNlbGYuY29udGV4dCwgbWluX3ZlcnNpb24pCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KHNlbGYuY29udGV4dCwgbWF4X3ZlcnNpb24pCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSWYgdGhlcmUncyBhIHRydXN0IERCLCB3ZSBuZWVkIHRvIHVzZSBpdC4gV2UgZG8gdGhhdCBieSB0ZWxsaW5nCiAgICAgICAgIyBTZWN1cmVUcmFuc3BvcnQgdG8gYnJlYWsgb24gc2VydmVyIGF1dGguIFdlIGFsc28gZG8gdGhhdCBpZiB3ZSBkb24ndAogICAgICAgICMgd2FudCB0byB2YWxpZGF0ZSB0aGUgY2VydHMgYXQgYWxsOiB3ZSBqdXN0IHdvbid0IGFjdHVhbGx5IGRvIGFueQogICAgICAgICMgYXV0aGluZyBpbiB0aGF0IGNhc2UuCiAgICAgICAgaWYgbm90IHZlcmlmeSBvciB0cnVzdF9idW5kbGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFNlc3Npb25PcHRpb24oCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsCiAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnN0LmtTU0xTZXNzaW9uT3B0aW9uQnJlYWtPblNlcnZlckF1dGgsCiAgICAgICAgICAgICAgICBUcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSWYgdGhlcmUncyBhIGNsaWVudCBjZXJ0LCB3ZSBuZWVkIHRvIHVzZSBpdC4KICAgICAgICBpZiBjbGllbnRfY2VydDoKICAgICAgICAgICAgc2VsZi5fa2V5Y2hhaW4sIHNlbGYuX2tleWNoYWluX2RpciA9IF90ZW1wb3Jhcnlfa2V5Y2hhaW4oKQogICAgICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9jaGFpbiA9IF9sb2FkX2NsaWVudF9jZXJ0X2NoYWluKAogICAgICAgICAgICAgICAgc2VsZi5fa2V5Y2hhaW4sIGNsaWVudF9jZXJ0LCBjbGllbnRfa2V5CiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTEhhbmRzaGFrZShzZWxmLmNvbnRleHQpCgogICAgICAgICAgICAgICAgaWYgcmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jazoKICAgICAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQudGltZW91dCgiaGFuZHNoYWtlIHRpbWVkIG91dCIpCiAgICAgICAgICAgICAgICBlbGlmIHJlc3VsdCA9PSBTZWN1cml0eUNvbnN0LmVyclNTTFNlcnZlckF1dGhDb21wbGV0ZWQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VzdG9tX3ZhbGlkYXRlKHZlcmlmeSwgdHJ1c3RfYnVuZGxlKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZmlsZW5vKCkKCiAgICAjIENvcHktcGFzdGVkIGZyb20gUHl0aG9uIDMuNSBzb3VyY2UgY29kZQogICAgZGVmIF9kZWNyZWZfc29ja2V0aW9zKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPiAwOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiByZWN2KHNlbGYsIGJ1ZnNpeik6CiAgICAgICAgYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKGJ1ZnNpeikKICAgICAgICBieXRlc19yZWFkID0gc2VsZi5yZWN2X2ludG8oYnVmZmVyLCBidWZzaXopCiAgICAgICAgZGF0YSA9IGJ1ZmZlcls6Ynl0ZXNfcmVhZF0KICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiByZWN2X2ludG8oc2VsZiwgYnVmZmVyLCBuYnl0ZXM9Tm9uZSk6CiAgICAgICAgIyBSZWFkIHNob3J0IG9uIEVPRi4KICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6CiAgICAgICAgICAgIHJldHVybiAwCgogICAgICAgIGlmIG5ieXRlcyBpcyBOb25lOgogICAgICAgICAgICBuYnl0ZXMgPSBsZW4oYnVmZmVyKQoKICAgICAgICBidWZmZXIgPSAoY3R5cGVzLmNfY2hhciAqIG5ieXRlcykuZnJvbV9idWZmZXIoYnVmZmVyKQogICAgICAgIHByb2Nlc3NlZF9ieXRlcyA9IGN0eXBlcy5jX3NpemVfdCgwKQoKICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFJlYWQoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGJ1ZmZlciwgbmJ5dGVzLCBjdHlwZXMuYnlyZWYocHJvY2Vzc2VkX2J5dGVzKQogICAgICAgICAgICApCgogICAgICAgICMgVGhlcmUgYXJlIHNvbWUgcmVzdWx0IGNvZGVzIHRoYXQgd2Ugd2FudCB0byB0cmVhdCBhcyAibm90IGFsd2F5cwogICAgICAgICMgZXJyb3JzIi4gU3BlY2lmaWNhbGx5LCB0aG9zZSBhcmUgZXJyU1NMV291bGRCbG9jaywKICAgICAgICAjIGVyclNTTENsb3NlZEdyYWNlZnVsLCBhbmQgZXJyU1NMQ2xvc2VkTm9Ob3RpZnkuCiAgICAgICAgaWYgKHJlc3VsdCA9PSBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2spOgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBwcm9jZXNzIGFueSBieXRlcywgdGhlbiB0aGlzIHdhcyBqdXN0IGEgdGltZSBvdXQuCiAgICAgICAgICAgICMgSG93ZXZlciwgd2UgY2FuIGdldCBlcnJTU0xXb3VsZEJsb2NrIGluIHNpdHVhdGlvbnMgd2hlbiB3ZSAqZGlkKgogICAgICAgICAgICAjIHJlYWQgc29tZSBkYXRhLCBhbmQgaW4gdGhvc2UgY2FzZXMgd2Ugc2hvdWxkIGp1c3QgcmVhZCAic2hvcnQiCiAgICAgICAgICAgICMgYW5kIHJldHVybi4KICAgICAgICAgICAgaWYgcHJvY2Vzc2VkX2J5dGVzLnZhbHVlID09IDA6CiAgICAgICAgICAgICAgICAjIFRpbWVkIG91dCwgbm8gZGF0YSByZWFkLgogICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoInJlY3YgdGltZWQgb3V0IikKICAgICAgICBlbGlmIHJlc3VsdCBpbiAoU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRHcmFjZWZ1bCwgU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWROb05vdGlmeSk6CiAgICAgICAgICAgICMgVGhlIHJlbW90ZSBwZWVyIGhhcyBjbG9zZWQgdGhpcyBjb25uZWN0aW9uLiBXZSBzaG91bGQgZG8gc28gYXMKICAgICAgICAgICAgIyB3ZWxsLiBOb3RlIHRoYXQgd2UgZG9uJ3QgYWN0dWFsbHkgcmV0dXJuIGhlcmUgYmVjYXVzZSBpbgogICAgICAgICAgICAjIHByaW5jaXBsZSB0aGlzIGNvdWxkIGFjdHVhbGx5IGJlIGZpcmVkIGFsb25nIHdpdGggcmV0dXJuIGRhdGEuCiAgICAgICAgICAgICMgSXQncyB1bmxpa2VseSB0aG91Z2guCiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIE9rLCB3ZSByZWFkIGFuZCBwcm9iYWJseSBzdWNjZWVkZWQuIFdlIHNob3VsZCByZXR1cm4gd2hhdGV2ZXIgZGF0YQogICAgICAgICMgd2FzIGFjdHVhbGx5IHJlYWQuCiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZF9ieXRlcy52YWx1ZQoKICAgIGRlZiBzZXR0aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgIHNlbGYuX3RpbWVvdXQgPSB0aW1lb3V0CgogICAgZGVmIGdldHRpbWVvdXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RpbWVvdXQKCiAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKICAgICAgICBwcm9jZXNzZWRfYnl0ZXMgPSBjdHlwZXMuY19zaXplX3QoMCkKCiAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xXcml0ZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgZGF0YSwgbGVuKGRhdGEpLCBjdHlwZXMuYnlyZWYocHJvY2Vzc2VkX2J5dGVzKQogICAgICAgICAgICApCgogICAgICAgIGlmIHJlc3VsdCA9PSBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2sgYW5kIHByb2Nlc3NlZF9ieXRlcy52YWx1ZSA9PSAwOgogICAgICAgICAgICAjIFRpbWVkIG91dAogICAgICAgICAgICByYWlzZSBzb2NrZXQudGltZW91dCgic2VuZCB0aW1lZCBvdXQiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIFdlIHNlbnQsIGFuZCBwcm9iYWJseSBzdWNjZWVkZWQuIFRlbGwgdGhlbSBob3cgbXVjaCB3ZSBzZW50LgogICAgICAgIHJldHVybiBwcm9jZXNzZWRfYnl0ZXMudmFsdWUKCiAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhKToKICAgICAgICB0b3RhbF9zZW50ID0gMAogICAgICAgIHdoaWxlIHRvdGFsX3NlbnQgPCBsZW4oZGF0YSk6CiAgICAgICAgICAgIHNlbnQgPSBzZWxmLnNlbmQoZGF0YVt0b3RhbF9zZW50OnRvdGFsX3NlbnQgKyBTU0xfV1JJVEVfQkxPQ0tTSVpFXSkKICAgICAgICAgICAgdG90YWxfc2VudCArPSBzZW50CgogICAgZGVmIHNodXRkb3duKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgU2VjdXJpdHkuU1NMQ2xvc2Uoc2VsZi5jb250ZXh0KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAjIFRPRE86IHNob3VsZCBJIGRvIGNsZWFuIHNodXRkb3duIGhlcmU/IERvIEkgaGF2ZSB0bz8KICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKICAgICAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICBpZiBzZWxmLmNvbnRleHQ6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uoc2VsZi5jb250ZXh0KQogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gTm9uZQogICAgICAgICAgICBpZiBzZWxmLl9jbGllbnRfY2VydF9jaGFpbjoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShzZWxmLl9jbGllbnRfY2VydF9jaGFpbikKICAgICAgICAgICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluID0gTm9uZQogICAgICAgICAgICBpZiBzZWxmLl9rZXljaGFpbjoKICAgICAgICAgICAgICAgIFNlY3VyaXR5LlNlY0tleWNoYWluRGVsZXRlKHNlbGYuX2tleWNoYWluKQogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHNlbGYuX2tleWNoYWluKQogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLl9rZXljaGFpbl9kaXIpCiAgICAgICAgICAgICAgICBzZWxmLl9rZXljaGFpbiA9IHNlbGYuX2tleWNoYWluX2RpciA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCiAgICBkZWYgZ2V0cGVlcmNlcnQoc2VsZiwgYmluYXJ5X2Zvcm09RmFsc2UpOgogICAgICAgICMgVXJnaCwgYW5ub3lpbmcuCiAgICAgICAgIwogICAgICAgICMgSGVyZSdzIGhvdyB3ZSBkbyB0aGlzOgogICAgICAgICMKICAgICAgICAjIDEuIENhbGwgU1NMQ29weVBlZXJUcnVzdCB0byBnZXQgaG9sZCBvZiB0aGUgdHJ1c3Qgb2JqZWN0IGZvciB0aGlzCiAgICAgICAgIyAgICBjb25uZWN0aW9uLgogICAgICAgICMgMi4gQ2FsbCBTZWNUcnVzdEdldENlcnRpZmljYXRlQXRJbmRleCBmb3IgaW5kZXggMCB0byBnZXQgdGhlIGxlYWYuCiAgICAgICAgIyAzLiBUbyBnZXQgdGhlIENOLCBjYWxsIFNlY0NlcnRpZmljYXRlQ29weUNvbW1vbk5hbWUgYW5kIHByb2Nlc3MgdGhhdAogICAgICAgICMgICAgc3RyaW5nIHNvIHRoYXQgaXQncyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KICAgICAgICAjIDQuIFRvIGdldCB0aGUgU0FOLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGNvbXBsZXg6CiAgICAgICAgIyAgICBhLiBDYWxsIFNlY0NlcnRpZmljYXRlQ29weVZhbHVlcyB0byBnZXQgdGhlIGRhdGEsIHJlcXVlc3RpbmcKICAgICAgICAjICAgICAgIGtTZWNPSURTdWJqZWN0QWx0TmFtZS4KICAgICAgICAjICAgIGIuIE1lc3MgYWJvdXQgd2l0aCB0aGlzIGRpY3Rpb25hcnkgdG8gdHJ5IHRvIGdldCB0aGUgU0FOcyBvdXQuCiAgICAgICAgIwogICAgICAgICMgVGhpcyBpcyBncm9zcy4gUmVhbGx5IGdyb3NzLiBJdCdzIGdvaW5nIHRvIGJlIGEgZmV3IGh1bmRyZWQgTG9DIGV4dHJhCiAgICAgICAgIyBqdXN0IHRvIHJlcGVhdCBzb21ldGhpbmcgdGhhdCBTZWN1cmVUcmFuc3BvcnQgY2FuICphbHJlYWR5IGRvKi4gU28gbXkKICAgICAgICAjIG9wZXJhdGluZyBhc3N1bXB0aW9uIGF0IHRoaXMgdGltZSBpcyB0aGF0IHdoYXQgd2Ugd2FudCB0byBkbyBpcwogICAgICAgICMgaW5zdGVhZCB0byBqdXN0IGZsYWcgdG8gdXJsbGliMyB0aGF0IGl0IHNob3VsZG4ndCBkbyBpdHMgb3duIGhvc3RuYW1lCiAgICAgICAgIyB2YWxpZGF0aW9uIHdoZW4gdXNpbmcgU2VjdXJlVHJhbnNwb3J0LgogICAgICAgIGlmIG5vdCBiaW5hcnlfZm9ybToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJTZWN1cmVUcmFuc3BvcnQgb25seSBzdXBwb3J0cyBkdW1waW5nIGJpbmFyeSBjZXJ0cyIKICAgICAgICAgICAgKQogICAgICAgIHRydXN0ID0gU2VjdXJpdHkuU2VjVHJ1c3RSZWYoKQogICAgICAgIGNlcnRkYXRhID0gTm9uZQogICAgICAgIGRlcl9ieXRlcyA9IE5vbmUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEdyYWIgdGhlIHRydXN0IHN0b3JlLgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xDb3B5UGVlclRydXN0KAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBjdHlwZXMuYnlyZWYodHJ1c3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgICAgIGlmIG5vdCB0cnVzdDoKICAgICAgICAgICAgICAgICMgUHJvYmFibHkgd2UgaGF2ZW4ndCBkb25lIHRoZSBoYW5kc2hha2UgeWV0LiBObyBiaWdnaWUuCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgY2VydF9jb3VudCA9IFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudCh0cnVzdCkKICAgICAgICAgICAgaWYgbm90IGNlcnRfY291bnQ6CiAgICAgICAgICAgICAgICAjIEFsc28gYSBjYXNlIHRoYXQgbWlnaHQgaGFwcGVuIGlmIHdlIGhhdmVuJ3QgaGFuZHNoYWtlZC4KICAgICAgICAgICAgICAgICMgSGFuZHNob29rPyBIYW5kc2hha2VuPwogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGxlYWYgPSBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQXRJbmRleCh0cnVzdCwgMCkKICAgICAgICAgICAgYXNzZXJ0IGxlYWYKCiAgICAgICAgICAgICMgT2ssIG5vdyB3ZSB3YW50IHRoZSBERVIgYnl0ZXMuCiAgICAgICAgICAgIGNlcnRkYXRhID0gU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDb3B5RGF0YShsZWFmKQogICAgICAgICAgICBhc3NlcnQgY2VydGRhdGEKCiAgICAgICAgICAgIGRhdGFfbGVuZ3RoID0gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0TGVuZ3RoKGNlcnRkYXRhKQogICAgICAgICAgICBkYXRhX2J1ZmZlciA9IENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldEJ5dGVQdHIoY2VydGRhdGEpCiAgICAgICAgICAgIGRlcl9ieXRlcyA9IGN0eXBlcy5zdHJpbmdfYXQoZGF0YV9idWZmZXIsIGRhdGFfbGVuZ3RoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIGNlcnRkYXRhOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRkYXRhKQogICAgICAgICAgICBpZiB0cnVzdDoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZSh0cnVzdCkKCiAgICAgICAgcmV0dXJuIGRlcl9ieXRlcwoKICAgIGRlZiBfcmV1c2Uoc2VsZik6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCgogICAgZGVmIF9kcm9wKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCgppZiBfZmlsZW9iamVjdDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmc2l6ZT0tMSk6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCiAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYsIG1vZGUsIGJ1ZnNpemUsIGNsb3NlPVRydWUpCmVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGU9InIiLCBidWZmZXJpbmc9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIFdlIGRpc2FibGUgYnVmZmVyaW5nIHdpdGggU2VjdXJlVHJhbnNwb3J0IGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKICAgICAgICAjIHRoZSBidWZmZXJpbmcgdGhhdCBTVCBkb2VzIGludGVybmFsbHkgKHNlZSBpc3N1ZSAjMTE1MyBmb3IgbW9yZSkuCiAgICAgICAgYnVmZmVyaW5nID0gMAogICAgICAgIHJldHVybiBiYWNrcG9ydF9tYWtlZmlsZShzZWxmLCBtb2RlLCBidWZmZXJpbmcsICphcmdzLCAqKmt3YXJncykKCldyYXBwZWRTb2NrZXQubWFrZWZpbGUgPSBtYWtlZmlsZQoKCmNsYXNzIFNlY3VyZVRyYW5zcG9ydENvbnRleHQob2JqZWN0KToKICAgICIiIgogICAgSSBhbSBhIHdyYXBwZXIgY2xhc3MgZm9yIHRoZSBTZWN1cmVUcmFuc3BvcnQgbGlicmFyeSwgdG8gdHJhbnNsYXRlIHRoZQogICAgaW50ZXJmYWNlIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGBgU1NMQ29udGV4dGBgIG9iamVjdCB0byBjYWxscyBpbnRvCiAgICBTZWN1cmVUcmFuc3BvcnQuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CiAgICAgICAgc2VsZi5fbWluX3ZlcnNpb24sIHNlbGYuX21heF92ZXJzaW9uID0gX3Byb3RvY29sX3RvX21pbl9tYXhbcHJvdG9jb2xdCiAgICAgICAgc2VsZi5fb3B0aW9ucyA9IDAKICAgICAgICBzZWxmLl92ZXJpZnkgPSBGYWxzZQogICAgICAgIHNlbGYuX3RydXN0X2J1bmRsZSA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfY2VydCA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfa2V5ID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9rZXlfcGFzc3BocmFzZSA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGVja19ob3N0bmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZWN1cmVUcmFuc3BvcnQgY2Fubm90IGhhdmUgaXRzIGhvc3RuYW1lIGNoZWNraW5nIGRpc2FibGVkLiBGb3IgbW9yZSwKICAgICAgICBzZWUgdGhlIGNvbW1lbnQgb24gZ2V0cGVlcmNlcnQoKSBpbiB0aGlzIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAY2hlY2tfaG9zdG5hbWUuc2V0dGVyCiAgICBkZWYgY2hlY2tfaG9zdG5hbWUoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNlY3VyZVRyYW5zcG9ydCBjYW5ub3QgaGF2ZSBpdHMgaG9zdG5hbWUgY2hlY2tpbmcgZGlzYWJsZWQuIEZvciBtb3JlLAogICAgICAgIHNlZSB0aGUgY29tbWVudCBvbiBnZXRwZWVyY2VydCgpIGluIHRoaXMgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3B0aW9ucyhzZWxmKToKICAgICAgICAjIFRPRE86IFdlbGwsIGNyYXAuCiAgICAgICAgIwogICAgICAgICMgU28gdGhpcyBpcyB0aGUgYml0IG9mIHRoZSBjb2RlIHRoYXQgaXMgdGhlIG1vc3QgbGlrZWx5IHRvIGNhdXNlIHVzCiAgICAgICAgIyB0cm91YmxlLiBFc3NlbnRpYWxseSB3ZSBuZWVkIHRvIGVudW1lcmF0ZSBhbGwgb2YgdGhlIFNTTCBvcHRpb25zIHRoYXQKICAgICAgICAjIHVzZXJzIG1pZ2h0IHdhbnQgdG8gdXNlIGFuZCB0cnkgdG8gc2VlIGlmIHdlIGNhbiBzZW5zaWJseSB0cmFuc2xhdGUKICAgICAgICAjIHRoZW0sIG9yIHdoZXRoZXIgd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZW0uCiAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKCiAgICBAb3B0aW9ucy5zZXR0ZXIKICAgIGRlZiBvcHRpb25zKHNlbGYsIHZhbHVlKToKICAgICAgICAjIFRPRE86IFVwZGF0ZSBpbiBsaW5lIHdpdGggYWJvdmUuCiAgICAgICAgc2VsZi5fb3B0aW9ucyA9IHZhbHVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyaWZ5X21vZGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNzbC5DRVJUX1JFUVVJUkVEIGlmIHNlbGYuX3ZlcmlmeSBlbHNlIHNzbC5DRVJUX05PTkUKCiAgICBAdmVyaWZ5X21vZGUuc2V0dGVyCiAgICBkZWYgdmVyaWZ5X21vZGUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ZlcmlmeSA9IFRydWUgaWYgdmFsdWUgPT0gc3NsLkNFUlRfUkVRVUlSRUQgZWxzZSBGYWxzZQoKICAgIGRlZiBzZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc2VsZik6CiAgICAgICAgIyBTbywgdGhpcyBoYXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IHdlaXJkLiBTcGVjaWZpY2FsbHksIHdoYXQgaXQgZG9lcwogICAgICAgICMgaXMgbm90aGluZy4KICAgICAgICAjCiAgICAgICAgIyBUaGlzIG1lYW5zIHRoYXQsIGlmIHdlIGhhZCBwcmV2aW91c2x5IGhhZCBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMKICAgICAgICAjIGNhbGxlZCwgdGhpcyBkb2VzIG5vdCB1bmRvIHRoYXQuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIGl0IHR1cm5zCiAgICAgICAgIyBvdXQgdGhhdCB0aGUgcmVzdCBvZiB0aGUgdXJsbGliMyBjb2RlIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZQogICAgICAgICMgZGVmYXVsdCB2ZXJpZnkgcGF0aHMgaWYgaXQgaGFzbid0IGJlZW4gdG9sZCBhYm91dCBhbnkgcGF0aHMsIGV2ZW4gaWYKICAgICAgICAjIHRoZSBjb250ZXh0IGl0c2VsZiB3YXMgc29tZXRpbWUgZWFybGllci4gV2UgcmVzb2x2ZSB0aGF0IGJ5IGp1c3QKICAgICAgICAjIGlnbm9yaW5nIGl0LgogICAgICAgIHBhc3MKCiAgICBkZWYgbG9hZF9kZWZhdWx0X2NlcnRzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocygpCgogICAgZGVmIHNldF9jaXBoZXJzKHNlbGYsIGNpcGhlcnMpOgogICAgICAgICMgRm9yIG5vdywgd2UganVzdCByZXF1aXJlIHRoZSBkZWZhdWx0IGNpcGhlciBzdHJpbmcuCiAgICAgICAgaWYgY2lwaGVycyAhPSB1dGlsLnNzbF8uREVGQVVMVF9DSVBIRVJTOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlNlY3VyZVRyYW5zcG9ydCBkb2Vzbid0IHN1cHBvcnQgY3VzdG9tIGNpcGhlciBzdHJpbmdzIgogICAgICAgICAgICApCgogICAgZGVmIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUsIGNhZGF0YT1Ob25lKToKICAgICAgICAjIE9LLCB3ZSBvbmx5IHJlYWxseSBzdXBwb3J0IGNhZGF0YSBhbmQgY2FmaWxlLgogICAgICAgIGlmIGNhcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJTZWN1cmVUcmFuc3BvcnQgZG9lcyBub3Qgc3VwcG9ydCBjZXJ0IGRpcmVjdG9yaWVzIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuX3RydXN0X2J1bmRsZSA9IGNhZmlsZSBvciBjYWRhdGEKCiAgICBkZWYgbG9hZF9jZXJ0X2NoYWluKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlPU5vbmUsIHBhc3N3b3JkPU5vbmUpOgogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0ID0gY2VydGZpbGUKICAgICAgICBzZWxmLl9jbGllbnRfa2V5ID0ga2V5ZmlsZQogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X3Bhc3NwaHJhc2UgPSBwYXNzd29yZAoKICAgIGRlZiB3cmFwX3NvY2tldChzZWxmLCBzb2NrLCBzZXJ2ZXJfc2lkZT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1UcnVlLCBzdXBwcmVzc19yYWdnZWRfZW9mcz1UcnVlLAogICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1Ob25lKToKICAgICAgICAjIFNvLCB3aGF0IGRvIHdlIGRvIGhlcmU/IEZpcnN0bHksIHdlIGFzc2VydCBzb21lIHByb3BlcnRpZXMuIFRoaXMgaXMgYQogICAgICAgICMgc3RyaXBwZWQgZG93biBzaGltLCBzbyB0aGVyZSBpcyBzb21lIGZ1bmN0aW9uYWxpdHkgd2UgZG9uJ3Qgc3VwcG9ydC4KICAgICAgICAjIFNlZSBQRVAgNTQzIGZvciB0aGUgcmVhbCBkZWFsLgogICAgICAgIGFzc2VydCBub3Qgc2VydmVyX3NpZGUKICAgICAgICBhc3NlcnQgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3QKICAgICAgICBhc3NlcnQgc3VwcHJlc3NfcmFnZ2VkX2VvZnMKCiAgICAgICAgIyBPaywgd2UncmUgZ29vZCB0byBnby4gTm93IHdlIHdhbnQgdG8gY3JlYXRlIHRoZSB3cmFwcGVkIHNvY2tldCBvYmplY3QKICAgICAgICAjIGFuZCBzdG9yZSBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuCiAgICAgICAgd3JhcHBlZF9zb2NrZXQgPSBXcmFwcGVkU29ja2V0KHNvY2spCgogICAgICAgICMgTm93IHdlIGNhbiBoYW5kc2hha2UKICAgICAgICB3cmFwcGVkX3NvY2tldC5oYW5kc2hha2UoCiAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZSwgc2VsZi5fdmVyaWZ5LCBzZWxmLl90cnVzdF9idW5kbGUsCiAgICAgICAgICAgIHNlbGYuX21pbl92ZXJzaW9uLCBzZWxmLl9tYXhfdmVyc2lvbiwgc2VsZi5fY2xpZW50X2NlcnQsCiAgICAgICAgICAgIHNlbGYuX2NsaWVudF9rZXksIHNlbGYuX2NsaWVudF9rZXlfcGFzc3BocmFzZQogICAgICAgICkKICAgICAgICByZXR1cm4gd3JhcHBlZF9zb2NrZXQKUEsDBBQAAAAAAAAAIQDQUymZMxgAADMYAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiIgpUaGlzIG1vZHVsZSBjb250YWlucyBwcm92aXNpb25hbCBzdXBwb3J0IGZvciBTT0NLUyBwcm94aWVzIGZyb20gd2l0aGluCnVybGxpYjMuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIFNPQ0tTNCAoc3BlY2lmaWNhbGx5IHRoZSBTT0NLUzRBIHZhcmlhbnQpIGFuZApTT0NLUzUuIFRvIGVuYWJsZSBpdHMgZnVuY3Rpb25hbGl0eSwgZWl0aGVyIGluc3RhbGwgUHlTb2NrcyBvciBpbnN0YWxsIHRoaXMKbW9kdWxlIHdpdGggdGhlIGBgc29ja3NgYCBleHRyYS4KClRoZSBTT0NLUyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZnVsbCByYW5nZSBvZiB1cmxsaWIzIGZlYXR1cmVzLiBJdCBhbHNvCnN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgU09DS1MgZmVhdHVyZXM6CgotIFNPQ0tTNAotIFNPQ0tTNGEKLSBTT0NLUzUKLSBVc2VybmFtZXMgYW5kIHBhc3N3b3JkcyBmb3IgdGhlIFNPQ0tTIHByb3h5CgpLbm93biBMaW1pdGF0aW9uczoKCi0gQ3VycmVudGx5IFB5U29ja3MgZG9lcyBub3Qgc3VwcG9ydCBjb250YWN0aW5nIHJlbW90ZSB3ZWJzaXRlcyB2aWEgbGl0ZXJhbAogIElQdjYgYWRkcmVzc2VzLiBBbnkgc3VjaCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLiBZb3UgbXVzdCB1c2UgYSBkb21haW4KICBuYW1lLgotIEN1cnJlbnRseSBQeVNvY2tzIGRvZXMgbm90IHN1cHBvcnQgSVB2NiBjb25uZWN0aW9ucyB0byB0aGUgU09DS1MgcHJveHkuIEFueQogIHN1Y2ggY29ubmVjdGlvbiBhdHRlbXB0IHdpbGwgZmFpbC4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgp0cnk6CiAgICBpbXBvcnQgc29ja3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHdhcm5pbmdzCiAgICBmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnU09DS1Mgc3VwcG9ydCBpbiB1cmxsaWIzIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2Ygb3B0aW9uYWwgJwogICAgICAgICdkZXBlbmRlbmNpZXM6IHNwZWNpZmljYWxseSwgUHlTb2Nrcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2NvbnRyaWIuaHRtbCNzb2Nrcy1wcm94aWVzJwogICAgICAgICksCiAgICAgICAgRGVwZW5kZW5jeVdhcm5pbmcKICAgICkKICAgIHJhaXNlCgpmcm9tIHNvY2tldCBpbXBvcnQgZXJyb3IgYXMgU29ja2V0RXJyb3IsIHRpbWVvdXQgYXMgU29ja2V0VGltZW91dAoKZnJvbSAuLmNvbm5lY3Rpb24gaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24KKQpmcm9tIC4uY29ubmVjdGlvbnBvb2wgaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uUG9vbCwgSFRUUFNDb25uZWN0aW9uUG9vbAopCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBDb25uZWN0VGltZW91dEVycm9yLCBOZXdDb25uZWN0aW9uRXJyb3IKZnJvbSAuLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlcgpmcm9tIC4udXRpbC51cmwgaW1wb3J0IHBhcnNlX3VybAoKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBzc2wgPSBOb25lCgoKY2xhc3MgU09DS1NDb25uZWN0aW9uKEhUVFBDb25uZWN0aW9uKToKICAgICIiIgogICAgQSBwbGFpbi10ZXh0IEhUVFAgY29ubmVjdGlvbiB0aGF0IGNvbm5lY3RzIHZpYSBhIFNPQ0tTIHByb3h5LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLl9zb2Nrc19vcHRpb25zID0ga3dhcmdzLnBvcCgnX3NvY2tzX29wdGlvbnMnKQogICAgICAgIHN1cGVyKFNPQ0tTQ29ubmVjdGlvbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb24gdmlhIHRoZSBTT0NLUyBwcm94eS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9rdyA9IHt9CiAgICAgICAgaWYgc2VsZi5zb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvdXJjZV9hZGRyZXNzJ10gPSBzZWxmLnNvdXJjZV9hZGRyZXNzCgogICAgICAgIGlmIHNlbGYuc29ja2V0X29wdGlvbnM6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb2NrZXRfb3B0aW9ucyddID0gc2VsZi5zb2NrZXRfb3B0aW9ucwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4gPSBzb2Nrcy5jcmVhdGVfY29ubmVjdGlvbigKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksCiAgICAgICAgICAgICAgICBwcm94eV90eXBlPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3NvY2tzX3ZlcnNpb24nXSwKICAgICAgICAgICAgICAgIHByb3h5X2FkZHI9c2VsZi5fc29ja3Nfb3B0aW9uc1sncHJveHlfaG9zdCddLAogICAgICAgICAgICAgICAgcHJveHlfcG9ydD1zZWxmLl9zb2Nrc19vcHRpb25zWydwcm94eV9wb3J0J10sCiAgICAgICAgICAgICAgICBwcm94eV91c2VybmFtZT1zZWxmLl9zb2Nrc19vcHRpb25zWyd1c2VybmFtZSddLAogICAgICAgICAgICAgICAgcHJveHlfcGFzc3dvcmQ9c2VsZi5fc29ja3Nfb3B0aW9uc1sncGFzc3dvcmQnXSwKICAgICAgICAgICAgICAgIHByb3h5X3JkbnM9c2VsZi5fc29ja3Nfb3B0aW9uc1sncmRucyddLAogICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLnRpbWVvdXQsCiAgICAgICAgICAgICAgICAqKmV4dHJhX2t3CiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFNvY2tldFRpbWVvdXQgYXMgZToKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJDb25uZWN0aW9uIHRvICVzIHRpbWVkIG91dC4gKGNvbm5lY3QgdGltZW91dD0lcykiICUKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYudGltZW91dCkpCgogICAgICAgIGV4Y2VwdCBzb2Nrcy5Qcm94eUVycm9yIGFzIGU6CiAgICAgICAgICAgICMgVGhpcyBpcyBmcmFnaWxlIGFzIGhlbGwsIGJ1dCBpdCBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gcmFpc2UKICAgICAgICAgICAgIyB1c2VmdWwgZXJyb3JzIGhlcmUuCiAgICAgICAgICAgIGlmIGUuc29ja2V0X2VycjoKICAgICAgICAgICAgICAgIGVycm9yID0gZS5zb2NrZXRfZXJyCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9yLCBTb2NrZXRUaW1lb3V0KToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiB0byAlcyB0aW1lZCBvdXQuIChjb25uZWN0IHRpbWVvdXQ9JXMpIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYudGltZW91dCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZXJyb3IKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlCiAgICAgICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBTb2NrZXRFcnJvciBhcyBlOiAgIyBEZWZlbnNpdmU6IFB5U29ja3Mgc2hvdWxkIGNhdGNoIGFsbCB0aGVzZS4KICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZSkKCiAgICAgICAgcmV0dXJuIGNvbm4KCgojIFdlIGRvbid0IG5lZWQgdG8gZHVwbGljYXRlIHRoZSBWZXJpZmllZC9VbnZlcmlmaWVkIGRpc3RpbmN0aW9uIGZyb20KIyB1cmxsaWIzL2Nvbm5lY3Rpb24ucHkgaGVyZSBiZWNhdXNlIHRoZSBIVFRQU0Nvbm5lY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgojIGNvcnJlY3RseSBzZXQgdG8gZWl0aGVyIHRoZSBWZXJpZmllZCBvciBVbnZlcmlmaWVkIGZvcm0gYnkgdGhhdCBtb2R1bGUuIFRoaXMKIyBtZWFucyB0aGUgU09DS1NIVFRQU0Nvbm5lY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHRoZSBjb3JyZWN0IHR5cGUuCmNsYXNzIFNPQ0tTSFRUUFNDb25uZWN0aW9uKFNPQ0tTQ29ubmVjdGlvbiwgSFRUUFNDb25uZWN0aW9uKToKICAgIHBhc3MKCgpjbGFzcyBTT0NLU0hUVFBDb25uZWN0aW9uUG9vbChIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgQ29ubmVjdGlvbkNscyA9IFNPQ0tTQ29ubmVjdGlvbgoKCmNsYXNzIFNPQ0tTSFRUUFNDb25uZWN0aW9uUG9vbChIVFRQU0Nvbm5lY3Rpb25Qb29sKToKICAgIENvbm5lY3Rpb25DbHMgPSBTT0NLU0hUVFBTQ29ubmVjdGlvbgoKCmNsYXNzIFNPQ0tTUHJveHlNYW5hZ2VyKFBvb2xNYW5hZ2VyKToKICAgICIiIgogICAgQSB2ZXJzaW9uIG9mIHRoZSB1cmxsaWIzIFByb3h5TWFuYWdlciB0aGF0IHJvdXRlcyBjb25uZWN0aW9ucyB2aWEgdGhlCiAgICBkZWZpbmVkIFNPQ0tTIHByb3h5LgogICAgIiIiCiAgICBwb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gewogICAgICAgICdodHRwJzogU09DS1NIVFRQQ29ubmVjdGlvblBvb2wsCiAgICAgICAgJ2h0dHBzJzogU09DS1NIVFRQU0Nvbm5lY3Rpb25Qb29sLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm94eV91cmwsIHVzZXJuYW1lPU5vbmUsIHBhc3N3b3JkPU5vbmUsCiAgICAgICAgICAgICAgICAgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsICoqY29ubmVjdGlvbl9wb29sX2t3KToKICAgICAgICBwYXJzZWQgPSBwYXJzZV91cmwocHJveHlfdXJsKQoKICAgICAgICBpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczUnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzUKICAgICAgICAgICAgcmRucyA9IEZhbHNlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczVoJzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M1CiAgICAgICAgICAgIHJkbnMgPSBUcnVlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczQnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzQKICAgICAgICAgICAgcmRucyA9IEZhbHNlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczRhJzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M0CiAgICAgICAgICAgIHJkbnMgPSBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIFNPQ0tTIHZlcnNpb24gZnJvbSAlcyIgJSBwcm94eV91cmwKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLnByb3h5X3VybCA9IHByb3h5X3VybAoKICAgICAgICBzb2Nrc19vcHRpb25zID0gewogICAgICAgICAgICAnc29ja3NfdmVyc2lvbic6IHNvY2tzX3ZlcnNpb24sCiAgICAgICAgICAgICdwcm94eV9ob3N0JzogcGFyc2VkLmhvc3QsCiAgICAgICAgICAgICdwcm94eV9wb3J0JzogcGFyc2VkLnBvcnQsCiAgICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLAogICAgICAgICAgICAncGFzc3dvcmQnOiBwYXNzd29yZCwKICAgICAgICAgICAgJ3JkbnMnOiByZG5zCiAgICAgICAgfQogICAgICAgIGNvbm5lY3Rpb25fcG9vbF9rd1snX3NvY2tzX29wdGlvbnMnXSA9IHNvY2tzX29wdGlvbnMKCiAgICAgICAgc3VwZXIoU09DS1NQcm94eU1hbmFnZXIsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICAgICBudW1fcG9vbHMsIGhlYWRlcnMsICoqY29ubmVjdGlvbl9wb29sX2t3CiAgICAgICAgKQoKICAgICAgICBzZWxmLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSBTT0NLU1Byb3h5TWFuYWdlci5wb29sX2NsYXNzZXNfYnlfc2NoZW1lClBLAwQUAAAAAAAAACEA8prJA8sZAADLGQAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2V4Y2VwdGlvbnMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0ICgKICAgIEluY29tcGxldGVSZWFkIGFzIGh0dHBsaWJfSW5jb21wbGV0ZVJlYWQKKQojIEJhc2UgRXhjZXB0aW9ucwoKCmNsYXNzIEhUVFBFcnJvcihFeGNlcHRpb24pOgogICAgIkJhc2UgZXhjZXB0aW9uIHVzZWQgYnkgdGhpcyBtb2R1bGUuIgogICAgcGFzcwoKCmNsYXNzIEhUVFBXYXJuaW5nKFdhcm5pbmcpOgogICAgIkJhc2Ugd2FybmluZyB1c2VkIGJ5IHRoaXMgbW9kdWxlLiIKICAgIHBhc3MKCgpjbGFzcyBQb29sRXJyb3IoSFRUUEVycm9yKToKICAgICJCYXNlIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIGNhdXNlZCB3aXRoaW4gYSBwb29sLiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCBtZXNzYWdlKToKICAgICAgICBzZWxmLnBvb2wgPSBwb29sCiAgICAgICAgSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsICIlczogJXMiICUgKHBvb2wsIG1lc3NhZ2UpKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICMgRm9yIHBpY2tsaW5nIHB1cnBvc2VzLgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKE5vbmUsIE5vbmUpCgoKY2xhc3MgUmVxdWVzdEVycm9yKFBvb2xFcnJvcik6CiAgICAiQmFzZSBleGNlcHRpb24gZm9yIFBvb2xFcnJvcnMgdGhhdCBoYXZlIGFzc29jaWF0ZWQgVVJMcy4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCBtZXNzYWdlKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIFBvb2xFcnJvci5fX2luaXRfXyhzZWxmLCBwb29sLCBtZXNzYWdlKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICMgRm9yIHBpY2tsaW5nIHB1cnBvc2VzLgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKE5vbmUsIHNlbGYudXJsLCBOb25lKQoKCmNsYXNzIFNTTEVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gU1NMIGNlcnRpZmljYXRlIGZhaWxzIGluIGFuIEhUVFBTIGNvbm5lY3Rpb24uIgogICAgcGFzcwoKCmNsYXNzIFByb3h5RXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiB0byBhIHByb3h5IGZhaWxzLiIKICAgIHBhc3MKCgpjbGFzcyBEZWNvZGVFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGF1dG9tYXRpYyBkZWNvZGluZyBiYXNlZCBvbiBDb250ZW50LVR5cGUgZmFpbHMuIgogICAgcGFzcwoKCmNsYXNzIFByb3RvY29sRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5zIG1pZC1yZXF1ZXN0L3Jlc3BvbnNlLiIKICAgIHBhc3MKCgojOiBSZW5hbWVkIHRvIFByb3RvY29sRXJyb3IgYnV0IGFsaWFzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgpDb25uZWN0aW9uRXJyb3IgPSBQcm90b2NvbEVycm9yCgoKIyBMZWFmIEV4Y2VwdGlvbnMKCmNsYXNzIE1heFJldHJ5RXJyb3IoUmVxdWVzdEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGlzIGV4Y2VlZGVkLgoKICAgIDpwYXJhbSBwb29sOiBUaGUgY29ubmVjdGlvbiBwb29sCiAgICA6dHlwZSBwb29sOiA6Y2xhc3M6YH51cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbGAKICAgIDpwYXJhbSBzdHJpbmcgdXJsOiBUaGUgcmVxdWVzdGVkIFVybAogICAgOnBhcmFtIGV4Y2VwdGlvbnMuRXhjZXB0aW9uIHJlYXNvbjogVGhlIHVuZGVybHlpbmcgZXJyb3IKCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCByZWFzb249Tm9uZSk6CiAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KCiAgICAgICAgbWVzc2FnZSA9ICJNYXggcmV0cmllcyBleGNlZWRlZCB3aXRoIHVybDogJXMgKENhdXNlZCBieSAlcikiICUgKAogICAgICAgICAgICB1cmwsIHJlYXNvbikKCiAgICAgICAgUmVxdWVzdEVycm9yLl9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSkKCgpjbGFzcyBIb3N0Q2hhbmdlZEVycm9yKFJlcXVlc3RFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYW4gZXhpc3RpbmcgcG9vbCBnZXRzIGEgcmVxdWVzdCBmb3IgYSBmb3JlaWduIGhvc3QuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIHJldHJpZXM9Myk6CiAgICAgICAgbWVzc2FnZSA9ICJUcmllZCB0byBvcGVuIGEgZm9yZWlnbiBob3N0IHdpdGggdXJsOiAlcyIgJSB1cmwKICAgICAgICBSZXF1ZXN0RXJyb3IuX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCBtZXNzYWdlKQogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKCgpjbGFzcyBUaW1lb3V0U3RhdGVFcnJvcihIVFRQRXJyb3IpOgogICAgIiIiIFJhaXNlZCB3aGVuIHBhc3NpbmcgYW4gaW52YWxpZCBzdGF0ZSB0byBhIHRpbWVvdXQgIiIiCiAgICBwYXNzCgoKY2xhc3MgVGltZW91dEVycm9yKEhUVFBFcnJvcik6CiAgICAiIiIgUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBlcnJvciBvY2N1cnMuCgogICAgQ2F0Y2hpbmcgdGhpcyBlcnJvciB3aWxsIGNhdGNoIGJvdGggOmV4YzpgUmVhZFRpbWVvdXRFcnJvcnMKICAgIDxSZWFkVGltZW91dEVycm9yPmAgYW5kIDpleGM6YENvbm5lY3RUaW1lb3V0RXJyb3JzIDxDb25uZWN0VGltZW91dEVycm9yPmAuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBSZWFkVGltZW91dEVycm9yKFRpbWVvdXRFcnJvciwgUmVxdWVzdEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHNvY2tldCB0aW1lb3V0IG9jY3VycyB3aGlsZSByZWNlaXZpbmcgZGF0YSBmcm9tIGEgc2VydmVyIgogICAgcGFzcwoKCiMgVGhpcyB0aW1lb3V0IGVycm9yIGRvZXMgbm90IGhhdmUgYSBVUkwgYXR0YWNoZWQgYW5kIG5lZWRzIHRvIGluaGVyaXQgZnJvbSB0aGUKIyBiYXNlIEhUVFBFcnJvcgpjbGFzcyBDb25uZWN0VGltZW91dEVycm9yKFRpbWVvdXRFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBvY2N1cnMgd2hpbGUgY29ubmVjdGluZyB0byBhIHNlcnZlciIKICAgIHBhc3MKCgpjbGFzcyBOZXdDb25uZWN0aW9uRXJyb3IoQ29ubmVjdFRpbWVvdXRFcnJvciwgUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiB3ZSBmYWlsIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uLiBVc3VhbGx5IEVDT05OUkVGVVNFRC4iCiAgICBwYXNzCgoKY2xhc3MgRW1wdHlQb29sRXJyb3IoUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHBvb2wgcnVucyBvdXQgb2YgY29ubmVjdGlvbnMgYW5kIG5vIG1vcmUgYXJlIGFsbG93ZWQuIgogICAgcGFzcwoKCmNsYXNzIENsb3NlZFBvb2xFcnJvcihQb29sRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgcmVxdWVzdCBlbnRlcnMgYSBwb29sIGFmdGVyIHRoZSBwb29sIGhhcyBiZWVuIGNsb3NlZC4iCiAgICBwYXNzCgoKY2xhc3MgTG9jYXRpb25WYWx1ZUVycm9yKFZhbHVlRXJyb3IsIEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIHdpdGggYSBnaXZlbiBVUkwgaW5wdXQuIgogICAgcGFzcwoKCmNsYXNzIExvY2F0aW9uUGFyc2VFcnJvcihMb2NhdGlvblZhbHVlRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGdldF9ob3N0IG9yIHNpbWlsYXIgZmFpbHMgdG8gcGFyc2UgdGhlIFVSTCBpbnB1dC4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byBwYXJzZTogJXMiICUgbG9jYXRpb24KICAgICAgICBIVFRQRXJyb3IuX19pbml0X18oc2VsZiwgbWVzc2FnZSkKCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCgoKY2xhc3MgUmVzcG9uc2VFcnJvcihIVFRQRXJyb3IpOgogICAgIlVzZWQgYXMgYSBjb250YWluZXIgZm9yIGFuIGVycm9yIHJlYXNvbiBzdXBwbGllZCBpbiBhIE1heFJldHJ5RXJyb3IuIgogICAgR0VORVJJQ19FUlJPUiA9ICd0b28gbWFueSBlcnJvciByZXNwb25zZXMnCiAgICBTUEVDSUZJQ19FUlJPUiA9ICd0b28gbWFueSB7c3RhdHVzX2NvZGV9IGVycm9yIHJlc3BvbnNlcycKCgpjbGFzcyBTZWN1cml0eVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIHBlcmZvbWluZyBzZWN1cml0eSByZWR1Y2luZyBhY3Rpb25zIgogICAgcGFzcwoKCmNsYXNzIFN1YmplY3RBbHROYW1lV2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHdpdGggYSBjZXJ0aWZpY2F0ZSBtaXNzaW5nIGEgU0FOLiIKICAgIHBhc3MKCgpjbGFzcyBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gbWFraW5nIGFuIHVudmVyaWZpZWQgSFRUUFMgcmVxdWVzdC4iCiAgICBwYXNzCgoKY2xhc3MgU3lzdGVtVGltZVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBzeXN0ZW0gdGltZSBpcyBzdXNwZWN0ZWQgdG8gYmUgd3JvbmciCiAgICBwYXNzCgoKY2xhc3MgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBjZXJ0YWluIFNTTCBjb25maWd1cmF0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYSBwbGF0Zm9ybS4iCiAgICBwYXNzCgoKY2xhc3MgU05JTWlzc2luZ1dhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIG1ha2luZyBhIEhUVFBTIHJlcXVlc3Qgd2l0aG91dCBTTkkgYXZhaWxhYmxlLiIKICAgIHBhc3MKCgpjbGFzcyBEZXBlbmRlbmN5V2FybmluZyhIVFRQV2FybmluZyk6CiAgICAiIiIKICAgIFdhcm5lZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBpbXBvcnQgYSBtb2R1bGUgd2l0aCBtaXNzaW5nIG9wdGlvbmFsCiAgICBkZXBlbmRlbmNpZXMuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBSZXNwb25zZU5vdENodW5rZWQoUHJvdG9jb2xFcnJvciwgVmFsdWVFcnJvcik6CiAgICAiUmVzcG9uc2UgbmVlZHMgdG8gYmUgY2h1bmtlZCBpbiBvcmRlciB0byByZWFkIGl0IGFzIGNodW5rcy4iCiAgICBwYXNzCgoKY2xhc3MgQm9keU5vdEh0dHBsaWJDb21wYXRpYmxlKEhUVFBFcnJvcik6CiAgICAiIiIKICAgIEJvZHkgc2hvdWxkIGJlIGh0dHBsaWIuSFRUUFJlc3BvbnNlIGxpa2UgKGhhdmUgYW4gZnAgYXR0cmlidXRlIHdoaWNoCiAgICByZXR1cm5zIHJhdyBjaHVua3MpIGZvciByZWFkX2NodW5rZWQoKS4KICAgICIiIgogICAgcGFzcwoKCmNsYXNzIEluY29tcGxldGVSZWFkKEhUVFBFcnJvciwgaHR0cGxpYl9JbmNvbXBsZXRlUmVhZCk6CiAgICAiIiIKICAgIFJlc3BvbnNlIGxlbmd0aCBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIENvbnRlbnQtTGVuZ3RoCgogICAgU3ViY2xhc3Mgb2YgaHR0cF9jbGllbnQuSW5jb21wbGV0ZVJlYWQgdG8gYWxsb3cgaW50IHZhbHVlCiAgICBmb3IgYHBhcnRpYWxgIHRvIGF2b2lkIGNyZWF0aW5nIGxhcmdlIG9iamVjdHMgb24gc3RyZWFtZWQKICAgIHJlYWRzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFydGlhbCwgZXhwZWN0ZWQpOgogICAgICAgIHN1cGVyKEluY29tcGxldGVSZWFkLCBzZWxmKS5fX2luaXRfXyhwYXJ0aWFsLCBleHBlY3RlZCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgnSW5jb21wbGV0ZVJlYWQoJWkgYnl0ZXMgcmVhZCwgJwogICAgICAgICAgICAgICAgJyVpIG1vcmUgZXhwZWN0ZWQpJyAlIChzZWxmLnBhcnRpYWwsIHNlbGYuZXhwZWN0ZWQpKQoKCmNsYXNzIEludmFsaWRIZWFkZXIoSFRUUEVycm9yKToKICAgICJUaGUgaGVhZGVyIHByb3ZpZGVkIHdhcyBzb21laG93IGludmFsaWQuIgogICAgcGFzcwoKCmNsYXNzIFByb3h5U2NoZW1lVW5rbm93bihBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcik6CiAgICAiUHJveHlNYW5hZ2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN1cHBsaWVkIHNjaGVtZSIKICAgICMgVE9ETyh0LThjaCk6IFN0b3AgaW5oZXJpdGluZyBmcm9tIEFzc2VydGlvbkVycm9yIGluIHYyLjAuCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjaGVtZSk6CiAgICAgICAgbWVzc2FnZSA9ICJOb3Qgc3VwcG9ydGVkIHByb3h5IHNjaGVtZSAlcyIgJSBzY2hlbWUKICAgICAgICBzdXBlcihQcm94eVNjaGVtZVVua25vd24sIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2UpCgoKY2xhc3MgSGVhZGVyUGFyc2luZ0Vycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIGJ5IGFzc2VydF9oZWFkZXJfcGFyc2luZywgYnV0IHdlIGNvbnZlcnQgaXQgdG8gYSBsb2cud2FybmluZyBzdGF0ZW1lbnQuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmVjdHMsIHVucGFyc2VkX2RhdGEpOgogICAgICAgIG1lc3NhZ2UgPSAnJXMsIHVucGFyc2VkIGRhdGE6ICVyJyAlIChkZWZlY3RzIG9yICdVbmtub3duJywgdW5wYXJzZWRfZGF0YSkKICAgICAgICBzdXBlcihIZWFkZXJQYXJzaW5nRXJyb3IsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2UpCgoKY2xhc3MgVW5yZXdpbmRhYmxlQm9keUVycm9yKEhUVFBFcnJvcik6CiAgICAidXJsbGliMyBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byByZXdpbmQgYSBib2R5IgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAAE5jLI3FwAANxcAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWVsZHMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgZW1haWwudXRpbHMKaW1wb3J0IG1pbWV0eXBlcwoKZnJvbSAucGFja2FnZXMgaW1wb3J0IHNpeAoKCmRlZiBndWVzc19jb250ZW50X3R5cGUoZmlsZW5hbWUsIGRlZmF1bHQ9J2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOgogICAgIiIiCiAgICBHdWVzcyB0aGUgIkNvbnRlbnQtVHlwZSIgb2YgYSBmaWxlLgoKICAgIDpwYXJhbSBmaWxlbmFtZToKICAgICAgICBUaGUgZmlsZW5hbWUgdG8gZ3Vlc3MgdGhlICJDb250ZW50LVR5cGUiIG9mIHVzaW5nIDptb2Q6YG1pbWV0eXBlc2AuCiAgICA6cGFyYW0gZGVmYXVsdDoKICAgICAgICBJZiBubyAiQ29udGVudC1UeXBlIiBjYW4gYmUgZ3Vlc3NlZCwgZGVmYXVsdCB0byBgZGVmYXVsdGAuCiAgICAiIiIKICAgIGlmIGZpbGVuYW1lOgogICAgICAgIHJldHVybiBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0gb3IgZGVmYXVsdAogICAgcmV0dXJuIGRlZmF1bHQKCgpkZWYgZm9ybWF0X2hlYWRlcl9wYXJhbShuYW1lLCB2YWx1ZSk6CiAgICAiIiIKICAgIEhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgYW5kIHF1b3RlIGEgc2luZ2xlIGhlYWRlciBwYXJhbWV0ZXIuCgogICAgUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaGVhZGVyIHBhcmFtZXRlcnMgd2hpY2ggbWlnaHQgY29udGFpbgogICAgbm9uLUFTQ0lJIHZhbHVlcywgbGlrZSBmaWxlIG5hbWVzLiBUaGlzIGZvbGxvd3MgUkZDIDIyMzEsIGFzCiAgICBzdWdnZXN0ZWQgYnkgUkZDIDIzODggU2VjdGlvbiA0LjQuCgogICAgOnBhcmFtIG5hbWU6CiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciwgYSBzdHJpbmcgZXhwZWN0ZWQgdG8gYmUgQVNDSUkgb25seS4KICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciwgcHJvdmlkZWQgYXMgYSB1bmljb2RlIHN0cmluZy4KICAgICIiIgogICAgaWYgbm90IGFueShjaCBpbiB2YWx1ZSBmb3IgY2ggaW4gJyJcXFxyXG4nKToKICAgICAgICByZXN1bHQgPSAnJXM9IiVzIicgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgZXhjZXB0IChVbmljb2RlRW5jb2RlRXJyb3IsIFVuaWNvZGVEZWNvZGVFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBpZiBub3Qgc2l4LlBZMyBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnRleHRfdHlwZSk6ICAjIFB5dGhvbiAyOgogICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCd1dGYtOCcpCiAgICB2YWx1ZSA9IGVtYWlsLnV0aWxzLmVuY29kZV9yZmMyMjMxKHZhbHVlLCAndXRmLTgnKQogICAgdmFsdWUgPSAnJXMqPSVzJyAlIChuYW1lLCB2YWx1ZSkKICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIFJlcXVlc3RGaWVsZChvYmplY3QpOgogICAgIiIiCiAgICBBIGRhdGEgY29udGFpbmVyIGZvciByZXF1ZXN0IGJvZHkgcGFyYW1ldGVycy4KCiAgICA6cGFyYW0gbmFtZToKICAgICAgICBUaGUgbmFtZSBvZiB0aGlzIHJlcXVlc3QgZmllbGQuCiAgICA6cGFyYW0gZGF0YToKICAgICAgICBUaGUgZGF0YS92YWx1ZSBib2R5LgogICAgOnBhcmFtIGZpbGVuYW1lOgogICAgICAgIEFuIG9wdGlvbmFsIGZpbGVuYW1lIG9mIHRoZSByZXF1ZXN0IGZpZWxkLgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgQW4gb3B0aW9uYWwgZGljdC1saWtlIG9iamVjdCBvZiBoZWFkZXJzIHRvIGluaXRpYWxseSB1c2UgZm9yIHRoZSBmaWVsZC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGRhdGEsIGZpbGVuYW1lPU5vbmUsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuaGVhZGVycyA9IHt9CiAgICAgICAgaWYgaGVhZGVyczoKICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gZGljdChoZWFkZXJzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fdHVwbGVzKGNscywgZmllbGRuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQSA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIGZhY3RvcnkgZnJvbSBvbGQtc3R5bGUgdHVwbGUgcGFyYW1ldGVycy4KCiAgICAgICAgU3VwcG9ydHMgY29uc3RydWN0aW5nIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgZnJvbQogICAgICAgIHBhcmFtZXRlciBvZiBrZXkvdmFsdWUgc3RyaW5ncyBBTkQga2V5L2ZpbGV0dXBsZS4gQSBmaWxldHVwbGUgaXMgYQogICAgICAgIChmaWxlbmFtZSwgZGF0YSwgTUlNRSB0eXBlKSB0dXBsZSB3aGVyZSB0aGUgTUlNRSB0eXBlIGlzIG9wdGlvbmFsLgogICAgICAgIEZvciBleGFtcGxlOjoKCiAgICAgICAgICAgICdmb28nOiAnYmFyJywKICAgICAgICAgICAgJ2Zha2VmaWxlJzogKCdmb29maWxlLnR4dCcsICdjb250ZW50cyBvZiBmb29maWxlJyksCiAgICAgICAgICAgICdyZWFsZmlsZSc6ICgnYmFyZmlsZS50eHQnLCBvcGVuKCdyZWFsZmlsZScpLnJlYWQoKSksCiAgICAgICAgICAgICd0eXBlZGZpbGUnOiAoJ2JhemZpbGUuYmluJywgb3BlbignYmF6ZmlsZScpLnJlYWQoKSwgJ2ltYWdlL2pwZWcnKSwKICAgICAgICAgICAgJ25vbmFtZWZpbGUnOiAnY29udGVudHMgb2Ygbm9uYW1lZmlsZSBmaWVsZCcsCgogICAgICAgIEZpZWxkIG5hbWVzIGFuZCBmaWxlbmFtZXMgbXVzdCBiZSB1bmljb2RlLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAzOgogICAgICAgICAgICAgICAgZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRfdHlwZSA9IHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZGF0YSA9IHZhbHVlCiAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBndWVzc19jb250ZW50X3R5cGUoZmlsZW5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IE5vbmUKICAgICAgICAgICAgZGF0YSA9IHZhbHVlCgogICAgICAgIHJlcXVlc3RfcGFyYW0gPSBjbHMoZmllbGRuYW1lLCBkYXRhLCBmaWxlbmFtZT1maWxlbmFtZSkKICAgICAgICByZXF1ZXN0X3BhcmFtLm1ha2VfbXVsdGlwYXJ0KGNvbnRlbnRfdHlwZT1jb250ZW50X3R5cGUpCgogICAgICAgIHJldHVybiByZXF1ZXN0X3BhcmFtCgogICAgZGVmIF9yZW5kZXJfcGFydChzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGFibGUgaGVscGVyIGZ1bmN0aW9uIHRvIGZvcm1hdCBhIHNpbmdsZSBoZWFkZXIgcGFyYW1ldGVyLgoKICAgICAgICA6cGFyYW0gbmFtZToKICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciwgYSBzdHJpbmcgZXhwZWN0ZWQgdG8gYmUgQVNDSUkgb25seS4KICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLCBwcm92aWRlZCBhcyBhIHVuaWNvZGUgc3RyaW5nLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBmb3JtYXRfaGVhZGVyX3BhcmFtKG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfcmVuZGVyX3BhcnRzKHNlbGYsIGhlYWRlcl9wYXJ0cyk6CiAgICAgICAgIiIiCiAgICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGZvcm1hdCBhbmQgcXVvdGUgYSBzaW5nbGUgaGVhZGVyLgoKICAgICAgICBVc2VmdWwgZm9yIHNpbmdsZSBoZWFkZXJzIHRoYXQgYXJlIGNvbXBvc2VkIG9mIG11bHRpcGxlIGl0ZW1zLiBFLmcuLAogICAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uJyBmaWVsZHMuCgogICAgICAgIDpwYXJhbSBoZWFkZXJfcGFydHM6CiAgICAgICAgICAgIEEgc2VxdWVuY2Ugb2YgKGssIHYpIHR5cGxlcyBvciBhIDpjbGFzczpgZGljdGAgb2YgKGssIHYpIHRvIGZvcm1hdAogICAgICAgICAgICBhcyBgazE9InYxIjsgazI9InYyIjsgLi4uYC4KICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgaXRlcmFibGUgPSBoZWFkZXJfcGFydHMKICAgICAgICBpZiBpc2luc3RhbmNlKGhlYWRlcl9wYXJ0cywgZGljdCk6CiAgICAgICAgICAgIGl0ZXJhYmxlID0gaGVhZGVyX3BhcnRzLml0ZW1zKCkKCiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGl0ZXJhYmxlOgogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzZWxmLl9yZW5kZXJfcGFydChuYW1lLCB2YWx1ZSkpCgogICAgICAgIHJldHVybiAnOyAnLmpvaW4ocGFydHMpCgogICAgZGVmIHJlbmRlcl9oZWFkZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbmRlcnMgdGhlIGhlYWRlcnMgZm9yIHRoaXMgcmVxdWVzdCBmaWVsZC4KICAgICAgICAiIiIKICAgICAgICBsaW5lcyA9IFtdCgogICAgICAgIHNvcnRfa2V5cyA9IFsnQ29udGVudC1EaXNwb3NpdGlvbicsICdDb250ZW50LVR5cGUnLCAnQ29udGVudC1Mb2NhdGlvbiddCiAgICAgICAgZm9yIHNvcnRfa2V5IGluIHNvcnRfa2V5czoKICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJzLmdldChzb3J0X2tleSwgRmFsc2UpOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCclczogJXMnICUgKHNvcnRfa2V5LCBzZWxmLmhlYWRlcnNbc29ydF9rZXldKSkKCiAgICAgICAgZm9yIGhlYWRlcl9uYW1lLCBoZWFkZXJfdmFsdWUgaW4gc2VsZi5oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGhlYWRlcl9uYW1lIG5vdCBpbiBzb3J0X2tleXM6CiAgICAgICAgICAgICAgICBpZiBoZWFkZXJfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCclczogJXMnICUgKGhlYWRlcl9uYW1lLCBoZWFkZXJfdmFsdWUpKQoKICAgICAgICBsaW5lcy5hcHBlbmQoJ1xyXG4nKQogICAgICAgIHJldHVybiAnXHJcbicuam9pbihsaW5lcykKCiAgICBkZWYgbWFrZV9tdWx0aXBhcnQoc2VsZiwgY29udGVudF9kaXNwb3NpdGlvbj1Ob25lLCBjb250ZW50X3R5cGU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xvY2F0aW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIE1ha2VzIHRoaXMgcmVxdWVzdCBmaWVsZCBpbnRvIGEgbXVsdGlwYXJ0IHJlcXVlc3QgZmllbGQuCgogICAgICAgIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyAiQ29udGVudC1EaXNwb3NpdGlvbiIsICJDb250ZW50LVR5cGUiIGFuZAogICAgICAgICJDb250ZW50LUxvY2F0aW9uIiBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0IHBhcmFtZXRlci4KCiAgICAgICAgOnBhcmFtIGNvbnRlbnRfdHlwZToKICAgICAgICAgICAgVGhlICdDb250ZW50LVR5cGUnIG9mIHRoZSByZXF1ZXN0IGJvZHkuCiAgICAgICAgOnBhcmFtIGNvbnRlbnRfbG9jYXRpb246CiAgICAgICAgICAgIFRoZSAnQ29udGVudC1Mb2NhdGlvbicgb2YgdGhlIHJlcXVlc3QgYm9keS4KCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPSBjb250ZW50X2Rpc3Bvc2l0aW9uIG9yICdmb3JtLWRhdGEnCiAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gKz0gJzsgJy5qb2luKFsKICAgICAgICAgICAgJycsIHNlbGYuX3JlbmRlcl9wYXJ0cygKICAgICAgICAgICAgICAgICgoJ25hbWUnLCBzZWxmLl9uYW1lKSwgKCdmaWxlbmFtZScsIHNlbGYuX2ZpbGVuYW1lKSkKICAgICAgICAgICAgKQogICAgICAgIF0pCiAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRfdHlwZQogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1Mb2NhdGlvbiddID0gY29udGVudF9sb2NhdGlvbgpQSwMEFAAAAAAAAAAhANdd0BcRCQAAEQkAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBjb2RlY3MKCmZyb20gdXVpZCBpbXBvcnQgdXVpZDQKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwoKZnJvbSAucGFja2FnZXMgaW1wb3J0IHNpeApmcm9tIC5wYWNrYWdlcy5zaXggaW1wb3J0IGIKZnJvbSAuZmllbGRzIGltcG9ydCBSZXF1ZXN0RmllbGQKCndyaXRlciA9IGNvZGVjcy5sb29rdXAoJ3V0Zi04JylbM10KCgpkZWYgY2hvb3NlX2JvdW5kYXJ5KCk6CiAgICAiIiIKICAgIE91ciBlbWJhcnJhc3NpbmdseS1zaW1wbGUgcmVwbGFjZW1lbnQgZm9yIG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkuCiAgICAiIiIKICAgIHJldHVybiB1dWlkNCgpLmhleAoKCmRlZiBpdGVyX2ZpZWxkX29iamVjdHMoZmllbGRzKToKICAgICIiIgogICAgSXRlcmF0ZSBvdmVyIGZpZWxkcy4KCiAgICBTdXBwb3J0cyBsaXN0IG9mIChrLCB2KSB0dXBsZXMgYW5kIGRpY3RzLCBhbmQgbGlzdHMgb2YKICAgIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAuCgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpZWxkcywgZGljdCk6CiAgICAgICAgaSA9IHNpeC5pdGVyaXRlbXMoZmllbGRzKQogICAgZWxzZToKICAgICAgICBpID0gaXRlcihmaWVsZHMpCgogICAgZm9yIGZpZWxkIGluIGk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWVsZCwgUmVxdWVzdEZpZWxkKToKICAgICAgICAgICAgeWllbGQgZmllbGQKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCBSZXF1ZXN0RmllbGQuZnJvbV90dXBsZXMoKmZpZWxkKQoKCmRlZiBpdGVyX2ZpZWxkcyhmaWVsZHMpOgogICAgIiIiCiAgICAuLiBkZXByZWNhdGVkOjogMS42CgogICAgSXRlcmF0ZSBvdmVyIGZpZWxkcy4KCiAgICBUaGUgYWRkaXRpb24gb2YgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBtYWtlcyB0aGlzIGZ1bmN0aW9uCiAgICBvYnNvbGV0ZS4gSW5zdGVhZCwgdXNlIDpmdW5jOmBpdGVyX2ZpZWxkX29iamVjdHNgLCB3aGljaCByZXR1cm5zCiAgICA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIG9iamVjdHMuCgogICAgU3VwcG9ydHMgbGlzdCBvZiAoaywgdikgdHVwbGVzIGFuZCBkaWN0cy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaWVsZHMsIGRpY3QpOgogICAgICAgIHJldHVybiAoKGssIHYpIGZvciBrLCB2IGluIHNpeC5pdGVyaXRlbXMoZmllbGRzKSkKCiAgICByZXR1cm4gKChrLCB2KSBmb3IgaywgdiBpbiBmaWVsZHMpCgoKZGVmIGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEoZmllbGRzLCBib3VuZGFyeT1Ob25lKToKICAgICIiIgogICAgRW5jb2RlIGEgZGljdGlvbmFyeSBvZiBgYGZpZWxkc2BgIHVzaW5nIHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhIE1JTUUgZm9ybWF0LgoKICAgIDpwYXJhbSBmaWVsZHM6CiAgICAgICAgRGljdGlvbmFyeSBvZiBmaWVsZHMgb3IgbGlzdCBvZiAoa2V5LCA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgKS4KCiAgICA6cGFyYW0gYm91bmRhcnk6CiAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiBhIHJhbmRvbSBib3VuZGFyeSB3aWxsIGJlIGdlbmVyYXRlZCB1c2luZwogICAgICAgIDpmdW5jOmBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5YC4KICAgICIiIgogICAgYm9keSA9IEJ5dGVzSU8oKQogICAgaWYgYm91bmRhcnkgaXMgTm9uZToKICAgICAgICBib3VuZGFyeSA9IGNob29zZV9ib3VuZGFyeSgpCgogICAgZm9yIGZpZWxkIGluIGl0ZXJfZmllbGRfb2JqZWN0cyhmaWVsZHMpOgogICAgICAgIGJvZHkud3JpdGUoYignLS0lc1xyXG4nICUgKGJvdW5kYXJ5KSkpCgogICAgICAgIHdyaXRlcihib2R5KS53cml0ZShmaWVsZC5yZW5kZXJfaGVhZGVycygpKQogICAgICAgIGRhdGEgPSBmaWVsZC5kYXRhCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgaW50KToKICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKSAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgICAgICB3cml0ZXIoYm9keSkud3JpdGUoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBib2R5LndyaXRlKGRhdGEpCgogICAgICAgIGJvZHkud3JpdGUoYidcclxuJykKCiAgICBib2R5LndyaXRlKGIoJy0tJXMtLVxyXG4nICUgKGJvdW5kYXJ5KSkpCgogICAgY29udGVudF90eXBlID0gc3RyKCdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBib3VuZGFyeSkKCiAgICByZXR1cm4gYm9keS5nZXR2YWx1ZSgpLCBjb250ZW50X3R5cGUKUEsDBBQAAAAAAAAAIQCPXaB8bQAAAG0AAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAuIGltcG9ydCBzc2xfbWF0Y2hfaG9zdG5hbWUKCl9fYWxsX18gPSAoJ3NzbF9tYXRjaF9ob3N0bmFtZScsICkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABCAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBSVxy5tQUAALUFAABCAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiCmJhY2twb3J0cy5tYWtlZmlsZQp+fn5+fn5+fn5+fn5+fn5+fn4KCkJhY2twb3J0cyB0aGUgUHl0aG9uIDMgYGBzb2NrZXQubWFrZWZpbGVgYCBtZXRob2QgZm9yIHVzZSB3aXRoIGFueXRoaW5nIHRoYXQKd2FudHMgdG8gY3JlYXRlIGEgImZha2UiIHNvY2tldCBvYmplY3QuCiIiIgppbXBvcnQgaW8KCmZyb20gc29ja2V0IGltcG9ydCBTb2NrZXRJTwoKCmRlZiBiYWNrcG9ydF9tYWtlZmlsZShzZWxmLCBtb2RlPSJyIiwgYnVmZmVyaW5nPU5vbmUsIGVuY29kaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9Tm9uZSwgbmV3bGluZT1Ob25lKToKICAgICIiIgogICAgQmFja3BvcnQgb2YgYGBzb2NrZXQubWFrZWZpbGVgYCBmcm9tIFB5dGhvbiAzLjUuCiAgICAiIiIKICAgIGlmIG5vdCBzZXQobW9kZSkgPD0gc2V0KFsiciIsICJ3IiwgImIiXSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgImludmFsaWQgbW9kZSAlciAob25seSByLCB3LCBiIGFsbG93ZWQpIiAlIChtb2RlLCkKICAgICAgICApCiAgICB3cml0aW5nID0gInciIGluIG1vZGUKICAgIHJlYWRpbmcgPSAiciIgaW4gbW9kZSBvciBub3Qgd3JpdGluZwogICAgYXNzZXJ0IHJlYWRpbmcgb3Igd3JpdGluZwogICAgYmluYXJ5ID0gImIiIGluIG1vZGUKICAgIHJhd21vZGUgPSAiIgogICAgaWYgcmVhZGluZzoKICAgICAgICByYXdtb2RlICs9ICJyIgogICAgaWYgd3JpdGluZzoKICAgICAgICByYXdtb2RlICs9ICJ3IgogICAgcmF3ID0gU29ja2V0SU8oc2VsZiwgcmF3bW9kZSkKICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQogICAgaWYgYnVmZmVyaW5nIGlzIE5vbmU6CiAgICAgICAgYnVmZmVyaW5nID0gLTEKICAgIGlmIGJ1ZmZlcmluZyA8IDA6CiAgICAgICAgYnVmZmVyaW5nID0gaW8uREVGQVVMVF9CVUZGRVJfU0laRQogICAgaWYgYnVmZmVyaW5nID09IDA6CiAgICAgICAgaWYgbm90IGJpbmFyeToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5idWZmZXJlZCBzdHJlYW1zIG11c3QgYmUgYmluYXJ5IikKICAgICAgICByZXR1cm4gcmF3CiAgICBpZiByZWFkaW5nIGFuZCB3cml0aW5nOgogICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkUldQYWlyKHJhdywgcmF3LCBidWZmZXJpbmcpCiAgICBlbGlmIHJlYWRpbmc6CiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRSZWFkZXIocmF3LCBidWZmZXJpbmcpCiAgICBlbHNlOgogICAgICAgIGFzc2VydCB3cml0aW5nCiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRXcml0ZXIocmF3LCBidWZmZXJpbmcpCiAgICBpZiBiaW5hcnk6CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgdGV4dCA9IGlvLlRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lKQogICAgdGV4dC5tb2RlID0gbW9kZQogICAgcmV0dXJuIHRleHQKUEsDBBQAAAAAAAAAIQBGwaZn5yIAAOciAAA8AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvb3JkZXJlZF9kaWN0LnB5IyBCYWNrcG9ydCBvZiBPcmRlcmVkRGljdCgpIGNsYXNzIHRoYXQgcnVucyBvbiBQeXRob24gMi40LCAyLjUsIDIuNiwgMi43IGFuZCBweXB5LgojIFBhc3NlcyBQeXRob24yLjcncyB0ZXN0IHN1aXRlIGFuZCBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBsYXRlc3QgdXBkYXRlcy4KIyBDb3B5cmlnaHQgMjAwOSBSYXltb25kIEhldHRpbmdlciwgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgojIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NjY5My8KdHJ5OgogICAgZnJvbSB0aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZHVtbXlfdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudAoKdHJ5OgogICAgZnJvbSBfYWJjb2xsIGltcG9ydCBLZXlzVmlldywgVmFsdWVzVmlldywgSXRlbXNWaWV3CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCgpjbGFzcyBPcmRlcmVkRGljdChkaWN0KToKICAgICdEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlcicKICAgICMgQW4gaW5oZXJpdGVkIGRpY3QgbWFwcyBrZXlzIHRvIHZhbHVlcy4KICAgICMgVGhlIGluaGVyaXRlZCBkaWN0IHByb3ZpZGVzIF9fZ2V0aXRlbV9fLCBfX2xlbl9fLCBfX2NvbnRhaW5zX18sIGFuZCBnZXQuCiAgICAjIFRoZSByZW1haW5pbmcgbWV0aG9kcyBhcmUgb3JkZXItYXdhcmUuCiAgICAjIEJpZy1PIHJ1bm5pbmcgdGltZXMgZm9yIGFsbCBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyBmb3IgcmVndWxhciBkaWN0aW9uYXJpZXMuCgogICAgIyBUaGUgaW50ZXJuYWwgc2VsZi5fX21hcCBkaWN0aW9uYXJ5IG1hcHMga2V5cyB0byBsaW5rcyBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4KICAgICMgVGhlIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBzdGFydHMgYW5kIGVuZHMgd2l0aCBhIHNlbnRpbmVsIGVsZW1lbnQuCiAgICAjIFRoZSBzZW50aW5lbCBlbGVtZW50IG5ldmVyIGdldHMgZGVsZXRlZCAodGhpcyBzaW1wbGlmaWVzIHRoZSBhbGdvcml0aG0pLgogICAgIyBFYWNoIGxpbmsgaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiBsZW5ndGggdGhyZWU6ICBbUFJFViwgTkVYVCwgS0VZXS4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgJycnSW5pdGlhbGl6ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkuICBTaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yCiAgICAgICAgcmVndWxhciBkaWN0aW9uYXJpZXMsIGJ1dCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHJlY29tbWVuZGVkCiAgICAgICAgYmVjYXVzZSB0aGVpciBpbnNlcnRpb24gb3JkZXIgaXMgYXJiaXRyYXJ5LgoKICAgICAgICAnJycKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9fcm9vdAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX3Jvb3QgPSByb290ID0gW10gICAgICAgICAgICAgICAgICAgICAjIHNlbnRpbmVsIG5vZGUKICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICBzZWxmLl9fbWFwID0ge30KICAgICAgICBzZWxmLl9fdXBkYXRlKCphcmdzLCAqKmt3ZHMpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUsIGRpY3Rfc2V0aXRlbT1kaWN0Ll9fc2V0aXRlbV9fKToKICAgICAgICAnb2QuX19zZXRpdGVtX18oaSwgeSkgPD09PiBvZFtpXT15JwogICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayB3aGljaCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZAogICAgICAgICMgbGlzdCwgYW5kIHRoZSBpbmhlcml0ZWQgZGljdGlvbmFyeSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBrZXkvdmFsdWUgcGFpci4KICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBsYXN0ID0gcm9vdFswXQogICAgICAgICAgICBsYXN0WzFdID0gcm9vdFswXSA9IHNlbGYuX19tYXBba2V5XSA9IFtsYXN0LCByb290LCBrZXldCiAgICAgICAgZGljdF9zZXRpdGVtKHNlbGYsIGtleSwgdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgZGljdF9kZWxpdGVtPWRpY3QuX19kZWxpdGVtX18pOgogICAgICAgICdvZC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCBvZFt5XScKICAgICAgICAjIERlbGV0aW5nIGFuIGV4aXN0aW5nIGl0ZW0gdXNlcyBzZWxmLl9fbWFwIHRvIGZpbmQgdGhlIGxpbmsgd2hpY2ggaXMKICAgICAgICAjIHRoZW4gcmVtb3ZlZCBieSB1cGRhdGluZyB0aGUgbGlua3MgaW4gdGhlIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3Igbm9kZXMuCiAgICAgICAgZGljdF9kZWxpdGVtKHNlbGYsIGtleSkKICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwga2V5ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQogICAgICAgIGxpbmtfcHJldlsxXSA9IGxpbmtfbmV4dAogICAgICAgIGxpbmtfbmV4dFswXSA9IGxpbmtfcHJldgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJwogICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgIGN1cnIgPSByb290WzFdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgJ29kLl9fcmV2ZXJzZWRfXygpIDw9PT4gcmV2ZXJzZWQob2QpJwogICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgIGN1cnIgPSByb290WzBdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICBjdXJyID0gY3VyclswXQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAnb2QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIG9kLicKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYuX19tYXAuaXRlcnZhbHVlcygpOgogICAgICAgICAgICAgICAgZGVsIG5vZGVbOl0KICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgc2VsZi5fX21hcC5jbGVhcigpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgJycnb2QucG9waXRlbSgpIC0+IChrLCB2KSwgcmV0dXJuIGFuZCByZW1vdmUgYSAoa2V5LCB2YWx1ZSkgcGFpci4KICAgICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiBsYXN0IGlzIHRydWUgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBpZiBsYXN0OgogICAgICAgICAgICBsaW5rID0gcm9vdFswXQogICAgICAgICAgICBsaW5rX3ByZXYgPSBsaW5rWzBdCiAgICAgICAgICAgIGxpbmtfcHJldlsxXSA9IHJvb3QKICAgICAgICAgICAgcm9vdFswXSA9IGxpbmtfcHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxpbmsgPSByb290WzFdCiAgICAgICAgICAgIGxpbmtfbmV4dCA9IGxpbmtbMV0KICAgICAgICAgICAgcm9vdFsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICBsaW5rX25leHRbMF0gPSByb290CiAgICAgICAga2V5ID0gbGlua1syXQogICAgICAgIGRlbCBzZWxmLl9fbWFwW2tleV0KICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSkKICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGRvIG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSAtLQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgICdvZC5rZXlzKCkgLT4gbGlzdCBvZiBrZXlzIGluIG9kJwogICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAnb2QudmFsdWVzKCkgLT4gbGlzdCBvZiB2YWx1ZXMgaW4gb2QnCiAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAnb2QuaXRlbXMoKSAtPiBsaXN0IG9mIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQoKICAgIGRlZiBpdGVya2V5cyhzZWxmKToKICAgICAgICAnb2QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIG9kJwogICAgICAgIHJldHVybiBpdGVyKHNlbGYpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CiAgICAgICAgJ29kLml0ZXJ2YWx1ZXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIGluIG9kJwogICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgIHlpZWxkIHNlbGZba10KCiAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICdvZC5pdGVyaXRlbXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIGluIG9kJwogICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQoKICAgIGRlZiB1cGRhdGUoKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgJycnb2QudXBkYXRlKEUsICoqRikgLT4gTm9uZS4gIFVwZGF0ZSBvZCBmcm9tIGRpY3QvaXRlcmFibGUgRSBhbmQgRi4KCiAgICAgICAgSWYgRSBpcyBhIGRpY3QgaW5zdGFuY2UsIGRvZXM6ICAgICAgICAgICBmb3IgayBpbiBFOiBvZFtrXSA9IEVba10KICAgICAgICBJZiBFIGhhcyBhIC5rZXlzKCkgbWV0aG9kLCBkb2VzOiAgICAgICAgIGZvciBrIGluIEUua2V5cygpOiBvZFtrXSA9IEVba10KICAgICAgICBPciBpZiBFIGlzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zLCBkb2VzOiAgIGZvciBrLCB2IGluIEU6IG9kW2tdID0gdgogICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiAgICAgZm9yIGssIHYgaW4gRi5pdGVtcygpOiBvZFtrXSA9IHYKCiAgICAgICAgJycnCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICglZCBnaXZlbiknICUgKGxlbihhcmdzKSwpKQogICAgICAgIGVsaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbiknKQogICAgICAgIHNlbGYgPSBhcmdzWzBdCiAgICAgICAgIyBNYWtlIHByb2dyZXNzaXZlbHkgd2Vha2VyIGFzc3VtcHRpb25zIGFib3V0ICJvdGhlciIKICAgICAgICBvdGhlciA9ICgpCiAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CiAgICAgICAgICAgIG90aGVyID0gYXJnc1sxXQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3ZHMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKCiAgICBfX3VwZGF0ZSA9IHVwZGF0ZSAgIyBsZXQgc3ViY2xhc3NlcyBvdmVycmlkZSB1cGRhdGUgd2l0aG91dCBicmVha2luZyBfX2luaXRfXwoKICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgJycnb2QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCgogICAgICAgICcnJwogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgJ29kLnNldGRlZmF1bHQoa1ssZF0pIC0+IG9kLmdldChrLGQpLCBhbHNvIHNldCBvZFtrXT1kIGlmIGsgbm90IGluIG9kJwogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAogICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIF9fcmVwcl9fKHNlbGYsIF9yZXByX3J1bm5pbmc9e30pOgogICAgICAgICdvZC5fX3JlcHJfXygpIDw9PT4gcmVwcihvZCknCiAgICAgICAgY2FsbF9rZXkgPSBpZChzZWxmKSwgX2dldF9pZGVudCgpCiAgICAgICAgaWYgY2FsbF9rZXkgaW4gX3JlcHJfcnVubmluZzoKICAgICAgICAgICAgcmV0dXJuICcuLi4nCiAgICAgICAgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0gPSAxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkZWwgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0KCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAnUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZycKICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KICAgICAgICBpbnN0X2RpY3QgPSB2YXJzKHNlbGYpLmNvcHkoKQogICAgICAgIGZvciBrIGluIHZhcnMoT3JkZXJlZERpY3QoKSk6CiAgICAgICAgICAgIGluc3RfZGljdC5wb3AoaywgTm9uZSkKICAgICAgICBpZiBpbnN0X2RpY3Q6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChpdGVtcywpLCBpbnN0X2RpY3QpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICdvZC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2Ygb2QnCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSk6CiAgICAgICAgJycnT0QuZnJvbWtleXMoU1ssIHZdKSAtPiBOZXcgb3JkZXJlZCBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFMKICAgICAgICBhbmQgdmFsdWVzIGVxdWFsIHRvIHYgKHdoaWNoIGRlZmF1bHRzIHRvIE5vbmUpLgoKICAgICAgICAnJycKICAgICAgICBkID0gY2xzKCkKICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgJycnb2QuX19lcV9fKHkpIDw9PT4gb2Q9PXkuICBDb21wYXJpc29uIHRvIGFub3RoZXIgT0QgaXMgb3JkZXItc2Vuc2l0aXZlCiAgICAgICAgd2hpbGUgY29tcGFyaXNvbiB0byBhIHJlZ3VsYXIgbWFwcGluZyBpcyBvcmRlci1pbnNlbnNpdGl2ZS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYpPT1sZW4ob3RoZXIpIGFuZCBzZWxmLml0ZW1zKCkgPT0gb3RoZXIuaXRlbXMoKQogICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgb25seSB1c2VkIGluIFB5dGhvbiAyLjcgLS0KCiAgICBkZWYgdmlld2tleXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXdrZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGtleXMiCiAgICAgICAgcmV0dXJuIEtleXNWaWV3KHNlbGYpCgogICAgZGVmIHZpZXd2YWx1ZXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIHZhbHVlcyIKICAgICAgICByZXR1cm4gVmFsdWVzVmlldyhzZWxmKQoKICAgIGRlZiB2aWV3aXRlbXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBpdGVtcyIKICAgICAgICByZXR1cm4gSXRlbXNWaWV3KHNlbGYpClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQD7bcrlsAIAALACAABLAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5aW1wb3J0IHN5cwoKdHJ5OgogICAgIyBPdXIgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgMy41J3MsIHNvIHdlIG9ubHkgd2FudCB0bwogICAgIyBpbXBvcnQgdGhlIG1hdGNoX2hvc3RuYW1lIGZ1bmN0aW9uIGlmIGl0J3MgYXQgbGVhc3QgdGhhdCBnb29kLgogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA1KToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRmFsbGJhY2sgdG8gdmVuZG9yZWQgY29kZSIpCgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICAjIEJhY2twb3J0IG9mIHRoZSBmdW5jdGlvbiBmcm9tIGEgcHlwaSBtb2R1bGUKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBPdXIgdmVuZG9yZWQgY29weQogICAgICAgIGZyb20gLl9pbXBsZW1lbnRhdGlvbiBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKCiMgTm90IG5lZWRlZCwgYnV0IGRvY3VtZW50aW5nIHdoYXQgd2UgcHJvdmlkZS4KX19hbGxfXyA9ICgnQ2VydGlmaWNhdGVFcnJvcicsICdtYXRjaF9ob3N0bmFtZScpClBLAwQUAAAAAAAAACEAtTqPK0YWAABGFgAAUgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHkiIiJUaGUgbWF0Y2hfaG9zdG5hbWUoKSBmdW5jdGlvbiBmcm9tIFB5dGhvbiAzLjMuMywgZXNzZW50aWFsIHdoZW4gdXNpbmcgU1NMLiIiIgoKIyBOb3RlOiBUaGlzIGZpbGUgaXMgdW5kZXIgdGhlIFBTRiBsaWNlbnNlIGFzIHRoZSBjb2RlIGNvbWVzIGZyb20gdGhlIHB5dGhvbgojIHN0ZGxpYi4gICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGljZW5zZS5odG1sCgppbXBvcnQgcmUKaW1wb3J0IHN5cwoKIyBpcGFkZHJlc3MgaGFzIGJlZW4gYmFja3BvcnRlZCB0byAyLjYrIGluIHB5cGkuICBJZiBpdCBpcyBpbnN0YWxsZWQgb24gdGhlCiMgc3lzdGVtLCB1c2UgaXQgdG8gaGFuZGxlIElQQWRkcmVzcyBTZXJ2ZXJBbHRuYW1lcyAodGhpcyB3YXMgYWRkZWQgaW4KIyBweXRob24tMy41KSBvdGhlcndpc2Ugb25seSBkbyBETlMgbWF0Y2hpbmcuICBUaGlzIGFsbG93cwojIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG8gY29udGludWUgdG8gYmUgdXNlZCBhbGwgdGhlIHdheSBiYWNrIHRvCiMgcHl0aG9uLTIuNC4KdHJ5OgogICAgaW1wb3J0IGlwYWRkcmVzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpcGFkZHJlc3MgPSBOb25lCgpfX3ZlcnNpb25fXyA9ICczLjUuMC4xJwoKCmNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBwYXNzCgoKZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxMjUjc2VjdGlvbi02LjQuMwogICAgIiIiCiAgICBwYXRzID0gW10KICAgIGlmIG5vdCBkbjoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgIyBsZWZ0bW9zdCwgKnJlbWFpbmRlciA9IGRuLnNwbGl0KHInLicpCiAgICBwYXJ0cyA9IGRuLnNwbGl0KHInLicpCiAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICByZW1haW5kZXIgPSBwYXJ0c1sxOl0KCiAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgIGVsc2U6CiAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgoKZGVmIF90b191bmljb2RlKG9iaik6CiAgICBpZiBpc2luc3RhbmNlKG9iaiwgc3RyKSBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6CiAgICAgICAgb2JqID0gdW5pY29kZShvYmosIGVuY29kaW5nPSdhc2NpaScsIGVycm9ycz0nc3RyaWN0JykKICAgIHJldHVybiBvYmoKCmRlZiBfaXBhZGRyZXNzX21hdGNoKGlwbmFtZSwgaG9zdF9pcCk6CiAgICAiIiJFeGFjdCBtYXRjaGluZyBvZiBJUCBhZGRyZXNzZXMuCgogICAgUkZDIDYxMjUgZXhwbGljaXRseSBkb2Vzbid0IGRlZmluZSBhbiBhbGdvcml0aG0gZm9yIHRoaXMKICAgIChzZWN0aW9uIDEuNy4yIC0gIk91dCBvZiBTY29wZSIpLgogICAgIiIiCiAgICAjIE9wZW5TU0wgbWF5IGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgdG8gYSBzdWJqZWN0QWx0TmFtZSdzIElQIGFkZHJlc3MKICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBpcGFkZHJlc3MgY2FuJ3QgaGFuZGxlIGJ5dGUgc3RyCiAgICBpcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKF90b191bmljb2RlKGlwbmFtZSkucnN0cmlwKCkpCiAgICByZXR1cm4gaXAgPT0gaG9zdF9pcAoKCmRlZiBtYXRjaF9ob3N0bmFtZShjZXJ0LCBob3N0bmFtZSk6CiAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgcnVsZXMgYXJlIGZvbGxvd2VkLCBidXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgYWNjZXB0ZWQgZm9yICpob3N0bmFtZSouCgogICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAiIiIKICAgIGlmIG5vdCBjZXJ0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlLCBtYXRjaF9ob3N0bmFtZSBuZWVkcyBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgc29ja2V0IG9yIFNTTCBjb250ZXh0IHdpdGggZWl0aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICJDRVJUX09QVElPTkFMIG9yIENFUlRfUkVRVUlSRUQiKQogICAgdHJ5OgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBpcGFkZHJlc3MgY2FuJ3QgaGFuZGxlIGJ5dGUgc3RyCiAgICAgICAgaG9zdF9pcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKF90b191bmljb2RlKGhvc3RuYW1lKSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICMgTm90IGFuIElQIGFkZHJlc3MgKGNvbW1vbiBjYXNlKQogICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBIYXZlIHRvIGRlYWwgd2l0aCBpcGFkZHJlc3Mgbm90IHRha2luZwogICAgICAgICMgYnl0ZSBzdHJpbmdzLiAgYWRkcmVzc2VzIHNob3VsZCBiZSBhbGwgYXNjaWksIHNvIHdlIGNvbnNpZGVyIGl0IG5vdAogICAgICAgICMgYW4gaXBhZGRyZXNzIGluIHRoaXMgY2FzZQogICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgIyBEaXZlcmdlbmNlIGZyb20gdXBzdHJlYW06IE1ha2UgaXBhZGRyZXNzIGxpYnJhcnkgb3B0aW9uYWwKICAgICAgICBpZiBpcGFkZHJlc3MgaXMgTm9uZToKICAgICAgICAgICAgaG9zdF9pcCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZQogICAgZG5zbmFtZXMgPSBbXQogICAgc2FuID0gY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICBpZiBob3N0X2lwIGlzIE5vbmUgYW5kIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGVsaWYga2V5ID09ICdJUCBBZGRyZXNzJzoKICAgICAgICAgICAgaWYgaG9zdF9pcCBpcyBub3QgTm9uZSBhbmQgX2lwYWRkcmVzc19tYXRjaCh2YWx1ZSwgaG9zdF9pcCk6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICMgaW4gc3ViamVjdEFsdE5hbWUKICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAjIFhYWCBhY2NvcmRpbmcgdG8gUkZDIDI4MTgsIHRoZSBtb3N0IHNwZWNpZmljIENvbW1vbiBOYW1lCiAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgaWYgbGVuKGRuc25hbWVzKSA+IDE6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICUgKGhvc3RuYW1lLCAnLCAnLmpvaW4obWFwKHJlcHIsIGRuc25hbWVzKSkpKQogICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAiZG9lc24ndCBtYXRjaCAlciIKICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigibm8gYXBwcm9wcmlhdGUgY29tbW9uTmFtZSBvciAiCiAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpClBLAwQUAAAAAAAAACEA8K4Yktk/AADZPwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3Bvb2xtYW5hZ2VyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGxvZ2dpbmcKCmZyb20gLl9jb2xsZWN0aW9ucyBpbXBvcnQgUmVjZW50bHlVc2VkQ29udGFpbmVyCmZyb20gLmNvbm5lY3Rpb25wb29sIGltcG9ydCBIVFRQQ29ubmVjdGlvblBvb2wsIEhUVFBTQ29ubmVjdGlvblBvb2wKZnJvbSAuY29ubmVjdGlvbnBvb2wgaW1wb3J0IHBvcnRfYnlfc2NoZW1lCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0IExvY2F0aW9uVmFsdWVFcnJvciwgTWF4UmV0cnlFcnJvciwgUHJveHlTY2hlbWVVbmtub3duCmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy51cmxsaWIucGFyc2UgaW1wb3J0IHVybGpvaW4KZnJvbSAucmVxdWVzdCBpbXBvcnQgUmVxdWVzdE1ldGhvZHMKZnJvbSAudXRpbC51cmwgaW1wb3J0IHBhcnNlX3VybApmcm9tIC51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQoKCl9fYWxsX18gPSBbJ1Bvb2xNYW5hZ2VyJywgJ1Byb3h5TWFuYWdlcicsICdwcm94eV9mcm9tX3VybCddCgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpTU0xfS0VZV09SRFMgPSAoJ2tleV9maWxlJywgJ2NlcnRfZmlsZScsICdjZXJ0X3JlcXMnLCAnY2FfY2VydHMnLAogICAgICAgICAgICAgICAgJ3NzbF92ZXJzaW9uJywgJ2NhX2NlcnRfZGlyJywgJ3NzbF9jb250ZXh0JykKCiMgQWxsIGtub3duIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgY291bGQgYmUgcHJvdmlkZWQgdG8gdGhlIHBvb2wgbWFuYWdlciwgaXRzCiMgcG9vbHMsIG9yIHRoZSB1bmRlcmx5aW5nIGNvbm5lY3Rpb25zLiBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IGEgcG9vbCBrZXkuCl9rZXlfZmllbGRzID0gKAogICAgJ2tleV9zY2hlbWUnLCAgIyBzdHIKICAgICdrZXlfaG9zdCcsICAjIHN0cgogICAgJ2tleV9wb3J0JywgICMgaW50CiAgICAna2V5X3RpbWVvdXQnLCAgIyBpbnQgb3IgZmxvYXQgb3IgVGltZW91dAogICAgJ2tleV9yZXRyaWVzJywgICMgaW50IG9yIFJldHJ5CiAgICAna2V5X3N0cmljdCcsICAjIGJvb2wKICAgICdrZXlfYmxvY2snLCAgIyBib29sCiAgICAna2V5X3NvdXJjZV9hZGRyZXNzJywgICMgc3RyCiAgICAna2V5X2tleV9maWxlJywgICMgc3RyCiAgICAna2V5X2NlcnRfZmlsZScsICAjIHN0cgogICAgJ2tleV9jZXJ0X3JlcXMnLCAgIyBzdHIKICAgICdrZXlfY2FfY2VydHMnLCAgIyBzdHIKICAgICdrZXlfc3NsX3ZlcnNpb24nLCAgIyBzdHIKICAgICdrZXlfY2FfY2VydF9kaXInLCAgIyBzdHIKICAgICdrZXlfc3NsX2NvbnRleHQnLCAgIyBpbnN0YW5jZSBvZiBzc2wuU1NMQ29udGV4dCBvciB1cmxsaWIzLnV0aWwuc3NsXy5TU0xDb250ZXh0CiAgICAna2V5X21heHNpemUnLCAgIyBpbnQKICAgICdrZXlfaGVhZGVycycsICAjIGRpY3QKICAgICdrZXlfX3Byb3h5JywgICMgcGFyc2VkIHByb3h5IHVybAogICAgJ2tleV9fcHJveHlfaGVhZGVycycsICAjIGRpY3QKICAgICdrZXlfc29ja2V0X29wdGlvbnMnLCAgIyBsaXN0IG9mIChsZXZlbCAoaW50KSwgb3B0bmFtZSAoaW50KSwgdmFsdWUgKGludCBvciBzdHIpKSB0dXBsZXMKICAgICdrZXlfX3NvY2tzX29wdGlvbnMnLCAgIyBkaWN0CiAgICAna2V5X2Fzc2VydF9ob3N0bmFtZScsICAjIGJvb2wgb3Igc3RyaW5nCiAgICAna2V5X2Fzc2VydF9maW5nZXJwcmludCcsICAjIHN0cgopCgojOiBUaGUgbmFtZWR0dXBsZSBjbGFzcyB1c2VkIHRvIGNvbnN0cnVjdCBrZXlzIGZvciB0aGUgY29ubmVjdGlvbiBwb29sLgojOiBBbGwgY3VzdG9tIGtleSBzY2hlbWVzIHNob3VsZCBpbmNsdWRlIHRoZSBmaWVsZHMgaW4gdGhpcyBrZXkgYXQgYSBtaW5pbXVtLgpQb29sS2V5ID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnUG9vbEtleScsIF9rZXlfZmllbGRzKQoKCmRlZiBfZGVmYXVsdF9rZXlfbm9ybWFsaXplcihrZXlfY2xhc3MsIHJlcXVlc3RfY29udGV4dCk6CiAgICAiIiIKICAgIENyZWF0ZSBhIHBvb2wga2V5IG91dCBvZiBhIHJlcXVlc3QgY29udGV4dCBkaWN0aW9uYXJ5LgoKICAgIEFjY29yZGluZyB0byBSRkMgMzk4NiwgYm90aCB0aGUgc2NoZW1lIGFuZCBob3N0IGFyZSBjYXNlLWluc2Vuc2l0aXZlLgogICAgVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIG5vcm1hbGl6ZXMgYm90aCBiZWZvcmUgY29uc3RydWN0aW5nIHRoZSBwb29sCiAgICBrZXkgZm9yIGFuIEhUVFBTIHJlcXVlc3QuIElmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW91ciwgcHJvdmlkZQogICAgYWx0ZXJuYXRlIGNhbGxhYmxlcyB0byBgYGtleV9mbl9ieV9zY2hlbWVgYC4KCiAgICA6cGFyYW0ga2V5X2NsYXNzOgogICAgICAgIFRoZSBjbGFzcyB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGtleS4gVGhpcyBzaG91bGQgYmUgYSBuYW1lZHR1cGxlCiAgICAgICAgd2l0aCB0aGUgYGBzY2hlbWVgYCBhbmQgYGBob3N0YGAga2V5cyBhdCBhIG1pbmltdW0uCiAgICA6dHlwZSAga2V5X2NsYXNzOiBuYW1lZHR1cGxlCiAgICA6cGFyYW0gcmVxdWVzdF9jb250ZXh0OgogICAgICAgIEEgZGljdGlvbmFyeS1saWtlIG9iamVjdCB0aGF0IGNvbnRhaW4gdGhlIGNvbnRleHQgZm9yIGEgcmVxdWVzdC4KICAgIDp0eXBlICByZXF1ZXN0X2NvbnRleHQ6IGRpY3QKCiAgICA6cmV0dXJuOiBBIG5hbWVkdHVwbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGNvbm5lY3Rpb24gcG9vbCBrZXkuCiAgICA6cnR5cGU6ICBQb29sS2V5CiAgICAiIiIKICAgICMgU2luY2Ugd2UgbXV0YXRlIHRoZSBkaWN0aW9uYXJ5LCBtYWtlIGEgY29weSBmaXJzdAogICAgY29udGV4dCA9IHJlcXVlc3RfY29udGV4dC5jb3B5KCkKICAgIGNvbnRleHRbJ3NjaGVtZSddID0gY29udGV4dFsnc2NoZW1lJ10ubG93ZXIoKQogICAgY29udGV4dFsnaG9zdCddID0gY29udGV4dFsnaG9zdCddLmxvd2VyKCkKCiAgICAjIFRoZXNlIGFyZSBib3RoIGRpY3Rpb25hcmllcyBhbmQgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGZyb3plbnNldHMKICAgIGZvciBrZXkgaW4gKCdoZWFkZXJzJywgJ19wcm94eV9oZWFkZXJzJywgJ19zb2Nrc19vcHRpb25zJyk6CiAgICAgICAgaWYga2V5IGluIGNvbnRleHQgYW5kIGNvbnRleHRba2V5XSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29udGV4dFtrZXldID0gZnJvemVuc2V0KGNvbnRleHRba2V5XS5pdGVtcygpKQoKICAgICMgVGhlIHNvY2tldF9vcHRpb25zIGtleSBtYXkgYmUgYSBsaXN0IGFuZCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGEKICAgICMgdHVwbGUuCiAgICBzb2NrZXRfb3B0cyA9IGNvbnRleHQuZ2V0KCdzb2NrZXRfb3B0aW9ucycpCiAgICBpZiBzb2NrZXRfb3B0cyBpcyBub3QgTm9uZToKICAgICAgICBjb250ZXh0Wydzb2NrZXRfb3B0aW9ucyddID0gdHVwbGUoc29ja2V0X29wdHMpCgogICAgIyBNYXAgdGhlIGt3YXJncyB0byB0aGUgbmFtZXMgaW4gdGhlIG5hbWVkdHVwbGUgLSB0aGlzIGlzIG5lY2Vzc2FyeSBzaW5jZQogICAgIyBuYW1lZHR1cGxlcyBjYW4ndCBoYXZlIGZpZWxkcyBzdGFydGluZyB3aXRoICdfJy4KICAgIGZvciBrZXkgaW4gbGlzdChjb250ZXh0LmtleXMoKSk6CiAgICAgICAgY29udGV4dFsna2V5XycgKyBrZXldID0gY29udGV4dC5wb3Aoa2V5KQoKICAgICMgRGVmYXVsdCB0byBgYE5vbmVgYCBmb3Iga2V5cyBtaXNzaW5nIGZyb20gdGhlIGNvbnRleHQKICAgIGZvciBmaWVsZCBpbiBrZXlfY2xhc3MuX2ZpZWxkczoKICAgICAgICBpZiBmaWVsZCBub3QgaW4gY29udGV4dDoKICAgICAgICAgICAgY29udGV4dFtmaWVsZF0gPSBOb25lCgogICAgcmV0dXJuIGtleV9jbGFzcygqKmNvbnRleHQpCgoKIzogQSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBhIHNjaGVtZSB0byBhIGNhbGxhYmxlIHRoYXQgY3JlYXRlcyBhIHBvb2wga2V5LgojOiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFsdGVyIHRoZSB3YXkgcG9vbCBrZXlzIGFyZSBjb25zdHJ1Y3RlZCwgaWYgZGVzaXJlZC4KIzogRWFjaCBQb29sTWFuYWdlciBtYWtlcyBhIGNvcHkgb2YgdGhpcyBkaWN0aW9uYXJ5IHNvIHRoZXkgY2FuIGJlIGNvbmZpZ3VyZWQKIzogZ2xvYmFsbHkgaGVyZSwgb3IgaW5kaXZpZHVhbGx5IG9uIHRoZSBpbnN0YW5jZS4Ka2V5X2ZuX2J5X3NjaGVtZSA9IHsKICAgICdodHRwJzogZnVuY3Rvb2xzLnBhcnRpYWwoX2RlZmF1bHRfa2V5X25vcm1hbGl6ZXIsIFBvb2xLZXkpLAogICAgJ2h0dHBzJzogZnVuY3Rvb2xzLnBhcnRpYWwoX2RlZmF1bHRfa2V5X25vcm1hbGl6ZXIsIFBvb2xLZXkpLAp9Cgpwb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gewogICAgJ2h0dHAnOiBIVFRQQ29ubmVjdGlvblBvb2wsCiAgICAnaHR0cHMnOiBIVFRQU0Nvbm5lY3Rpb25Qb29sLAp9CgoKY2xhc3MgUG9vbE1hbmFnZXIoUmVxdWVzdE1ldGhvZHMpOgogICAgIiIiCiAgICBBbGxvd3MgZm9yIGFyYml0cmFyeSByZXF1ZXN0cyB3aGlsZSB0cmFuc3BhcmVudGx5IGtlZXBpbmcgdHJhY2sgb2YKICAgIG5lY2Vzc2FyeSBjb25uZWN0aW9uIHBvb2xzIGZvciB5b3UuCgogICAgOnBhcmFtIG51bV9wb29sczoKICAgICAgICBOdW1iZXIgb2YgY29ubmVjdGlvbiBwb29scyB0byBjYWNoZSBiZWZvcmUgZGlzY2FyZGluZyB0aGUgbGVhc3QKICAgICAgICByZWNlbnRseSB1c2VkIHBvb2wuCgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgSGVhZGVycyB0byBpbmNsdWRlIHdpdGggYWxsIHJlcXVlc3RzLCB1bmxlc3Mgb3RoZXIgaGVhZGVycyBhcmUgZ2l2ZW4KICAgICAgICBleHBsaWNpdGx5LgoKICAgIDpwYXJhbSBcXCoqY29ubmVjdGlvbl9wb29sX2t3OgogICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjcmVhdGUgZnJlc2gKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuQ29ubmVjdGlvblBvb2xgIGluc3RhbmNlcy4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IG1hbmFnZXIgPSBQb29sTWFuYWdlcihudW1fcG9vbHM9MikKICAgICAgICA+Pj4gciA9IG1hbmFnZXIucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9nb29nbGUuY29tLycpCiAgICAgICAgPj4+IHIgPSBtYW5hZ2VyLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsJykKICAgICAgICA+Pj4gciA9IG1hbmFnZXIucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly95YWhvby5jb20vJykKICAgICAgICA+Pj4gbGVuKG1hbmFnZXIucG9vbHMpCiAgICAgICAgMgoKICAgICIiIgoKICAgIHByb3h5ID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1fcG9vbHM9MTAsIGhlYWRlcnM9Tm9uZSwgKipjb25uZWN0aW9uX3Bvb2xfa3cpOgogICAgICAgIFJlcXVlc3RNZXRob2RzLl9faW5pdF9fKHNlbGYsIGhlYWRlcnMpCiAgICAgICAgc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cgPSBjb25uZWN0aW9uX3Bvb2xfa3cKICAgICAgICBzZWxmLnBvb2xzID0gUmVjZW50bHlVc2VkQ29udGFpbmVyKG51bV9wb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VfZnVuYz1sYW1iZGEgcDogcC5jbG9zZSgpKQoKICAgICAgICAjIExvY2FsbHkgc2V0IHRoZSBwb29sIGNsYXNzZXMgYW5kIGtleXMgc28gb3RoZXIgUG9vbE1hbmFnZXJzIGNhbgogICAgICAgICMgb3ZlcnJpZGUgdGhlbS4KICAgICAgICBzZWxmLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSBwb29sX2NsYXNzZXNfYnlfc2NoZW1lCiAgICAgICAgc2VsZi5rZXlfZm5fYnlfc2NoZW1lID0ga2V5X2ZuX2J5X3NjaGVtZS5jb3B5KCkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgogICAgICAgIHNlbGYuY2xlYXIoKQogICAgICAgICMgUmV0dXJuIEZhbHNlIHRvIHJlLXJhaXNlIGFueSBwb3RlbnRpYWwgZXhjZXB0aW9ucwogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfbmV3X3Bvb2woc2VsZiwgc2NoZW1lLCBob3N0LCBwb3J0LCByZXF1ZXN0X2NvbnRleHQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGEgbmV3IDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIGhvc3QsIHBvcnQsIHNjaGVtZSwgYW5kCiAgICAgICAgYW55IGFkZGl0aW9uYWwgcG9vbCBrZXl3b3JkIGFyZ3VtZW50cy4KCiAgICAgICAgSWYgYGByZXF1ZXN0X2NvbnRleHRgYCBpcyBwcm92aWRlZCwgaXQgaXMgcHJvdmlkZWQgYXMga2V5d29yZCBhcmd1bWVudHMKICAgICAgICB0byB0aGUgcG9vbCBjbGFzcyB1c2VkLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGFjdHVhbGx5IGNyZWF0ZSB0aGUKICAgICAgICBjb25uZWN0aW9uIHBvb2xzIGhhbmRlZCBvdXQgYnkgOm1ldGg6YGNvbm5lY3Rpb25fZnJvbV91cmxgIGFuZAogICAgICAgIGNvbXBhbmlvbiBtZXRob2RzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGZvciBjdXN0b21pemF0aW9uLgogICAgICAgICIiIgogICAgICAgIHBvb2xfY2xzID0gc2VsZi5wb29sX2NsYXNzZXNfYnlfc2NoZW1lW3NjaGVtZV0KICAgICAgICBpZiByZXF1ZXN0X2NvbnRleHQgaXMgTm9uZToKICAgICAgICAgICAgcmVxdWVzdF9jb250ZXh0ID0gc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cuY29weSgpCgogICAgICAgICMgQWx0aG91Z2ggdGhlIGNvbnRleHQgaGFzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUgcG9vbCwKICAgICAgICAjIHRoaXMgZnVuY3Rpb24gaGFzIGhpc3RvcmljYWxseSBvbmx5IHVzZWQgdGhlIHNjaGVtZSwgaG9zdCwgYW5kIHBvcnQKICAgICAgICAjIGluIHRoZSBwb3NpdGlvbmFsIGFyZ3MuIFdoZW4gYW4gQVBJIGNoYW5nZSBpcyBhY2NlcHRhYmxlIHRoZXNlIGNhbgogICAgICAgICMgYmUgcmVtb3ZlZC4KICAgICAgICBmb3Iga2V5IGluICgnc2NoZW1lJywgJ2hvc3QnLCAncG9ydCcpOgogICAgICAgICAgICByZXF1ZXN0X2NvbnRleHQucG9wKGtleSwgTm9uZSkKCiAgICAgICAgaWYgc2NoZW1lID09ICdodHRwJzoKICAgICAgICAgICAgZm9yIGt3IGluIFNTTF9LRVlXT1JEUzoKICAgICAgICAgICAgICAgIHJlcXVlc3RfY29udGV4dC5wb3Aoa3csIE5vbmUpCgogICAgICAgIHJldHVybiBwb29sX2Nscyhob3N0LCBwb3J0LCAqKnJlcXVlc3RfY29udGV4dCkKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRW1wdHkgb3VyIHN0b3JlIG9mIHBvb2xzIGFuZCBkaXJlY3QgdGhlbSBhbGwgdG8gY2xvc2UuCgogICAgICAgIFRoaXMgd2lsbCBub3QgYWZmZWN0IGluLWZsaWdodCBjb25uZWN0aW9ucywgYnV0IHRoZXkgd2lsbCBub3QgYmUKICAgICAgICByZS11c2VkIGFmdGVyIGNvbXBsZXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wb29scy5jbGVhcigpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9ob3N0KHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgc2NoZW1lPSdodHRwJywgcG9vbF9rd2FyZ3M9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gdGhlIGhvc3QsIHBvcnQsIGFuZCBzY2hlbWUuCgogICAgICAgIElmIGBgcG9ydGBgIGlzbid0IGdpdmVuLCBpdCB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgYGBzY2hlbWVgYCB1c2luZwogICAgICAgIGBgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5wb3J0X2J5X3NjaGVtZWBgLiBJZiBgYHBvb2xfa3dhcmdzYGAgaXMKICAgICAgICBwcm92aWRlZCwgaXQgaXMgbWVyZ2VkIHdpdGggdGhlIGluc3RhbmNlJ3MgYGBjb25uZWN0aW9uX3Bvb2xfa3dgYAogICAgICAgIHZhcmlhYmxlIGFuZCB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IGNvbm5lY3Rpb24gcG9vbCwgaWYgb25lIGlzCiAgICAgICAgbmVlZGVkLgogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgcmFpc2UgTG9jYXRpb25WYWx1ZUVycm9yKCJObyBob3N0IHNwZWNpZmllZC4iKQoKICAgICAgICByZXF1ZXN0X2NvbnRleHQgPSBzZWxmLl9tZXJnZV9wb29sX2t3YXJncyhwb29sX2t3YXJncykKICAgICAgICByZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddID0gc2NoZW1lIG9yICdodHRwJwogICAgICAgIGlmIG5vdCBwb3J0OgogICAgICAgICAgICBwb3J0ID0gcG9ydF9ieV9zY2hlbWUuZ2V0KHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10ubG93ZXIoKSwgODApCiAgICAgICAgcmVxdWVzdF9jb250ZXh0Wydwb3J0J10gPSBwb3J0CiAgICAgICAgcmVxdWVzdF9jb250ZXh0Wydob3N0J10gPSBob3N0CgogICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb25fZnJvbV9jb250ZXh0KHJlcXVlc3RfY29udGV4dCkKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX2NvbnRleHQoc2VsZiwgcmVxdWVzdF9jb250ZXh0KToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiB0aGUgcmVxdWVzdCBjb250ZXh0LgoKICAgICAgICBgYHJlcXVlc3RfY29udGV4dGBgIG11c3QgYXQgbGVhc3QgY29udGFpbiB0aGUgYGBzY2hlbWVgYCBrZXkgYW5kIGl0cwogICAgICAgIHZhbHVlIG11c3QgYmUgYSBrZXkgaW4gYGBrZXlfZm5fYnlfc2NoZW1lYGAgaW5zdGFuY2UgdmFyaWFibGUuCiAgICAgICAgIiIiCiAgICAgICAgc2NoZW1lID0gcmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXS5sb3dlcigpCiAgICAgICAgcG9vbF9rZXlfY29uc3RydWN0b3IgPSBzZWxmLmtleV9mbl9ieV9zY2hlbWVbc2NoZW1lXQogICAgICAgIHBvb2xfa2V5ID0gcG9vbF9rZXlfY29uc3RydWN0b3IocmVxdWVzdF9jb250ZXh0KQoKICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uX2Zyb21fcG9vbF9rZXkocG9vbF9rZXksIHJlcXVlc3RfY29udGV4dD1yZXF1ZXN0X2NvbnRleHQpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9wb29sX2tleShzZWxmLCBwb29sX2tleSwgcmVxdWVzdF9jb250ZXh0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwb29sIGtleS4KCiAgICAgICAgYGBwb29sX2tleWBgIHNob3VsZCBiZSBhIG5hbWVkdHVwbGUgdGhhdCBvbmx5IGNvbnRhaW5zIGltbXV0YWJsZQogICAgICAgIG9iamVjdHMuIEF0IGEgbWluaW11bSBpdCBtdXN0IGhhdmUgdGhlIGBgc2NoZW1lYGAsIGBgaG9zdGBgLCBhbmQKICAgICAgICBgYHBvcnRgYCBmaWVsZHMuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLnBvb2xzLmxvY2s6CiAgICAgICAgICAgICMgSWYgdGhlIHNjaGVtZSwgaG9zdCwgb3IgcG9ydCBkb2Vzbid0IG1hdGNoIGV4aXN0aW5nIG9wZW4KICAgICAgICAgICAgIyBjb25uZWN0aW9ucywgb3BlbiBhIG5ldyBDb25uZWN0aW9uUG9vbC4KICAgICAgICAgICAgcG9vbCA9IHNlbGYucG9vbHMuZ2V0KHBvb2xfa2V5KQogICAgICAgICAgICBpZiBwb29sOgogICAgICAgICAgICAgICAgcmV0dXJuIHBvb2wKCiAgICAgICAgICAgICMgTWFrZSBhIGZyZXNoIENvbm5lY3Rpb25Qb29sIG9mIHRoZSBkZXNpcmVkIHR5cGUKICAgICAgICAgICAgc2NoZW1lID0gcmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXQogICAgICAgICAgICBob3N0ID0gcmVxdWVzdF9jb250ZXh0Wydob3N0J10KICAgICAgICAgICAgcG9ydCA9IHJlcXVlc3RfY29udGV4dFsncG9ydCddCiAgICAgICAgICAgIHBvb2wgPSBzZWxmLl9uZXdfcG9vbChzY2hlbWUsIGhvc3QsIHBvcnQsIHJlcXVlc3RfY29udGV4dD1yZXF1ZXN0X2NvbnRleHQpCiAgICAgICAgICAgIHNlbGYucG9vbHNbcG9vbF9rZXldID0gcG9vbAoKICAgICAgICByZXR1cm4gcG9vbAoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21fdXJsKHNlbGYsIHVybCwgcG9vbF9rd2FyZ3M9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2ltaWxhciB0byA6ZnVuYzpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5jb25uZWN0aW9uX2Zyb21fdXJsYC4KCiAgICAgICAgSWYgYGBwb29sX2t3YXJnc2BgIGlzIG5vdCBwcm92aWRlZCBhbmQgYSBuZXcgcG9vbCBuZWVkcyB0byBiZQogICAgICAgIGNvbnN0cnVjdGVkLCBgYHNlbGYuY29ubmVjdGlvbl9wb29sX2t3YGAgaXMgdXNlZCB0byBpbml0aWFsaXplCiAgICAgICAgdGhlIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Db25uZWN0aW9uUG9vbGAuIElmIGBgcG9vbF9rd2FyZ3NgYAogICAgICAgIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIGluc3RlYWQuIE5vdGUgdGhhdCBpZiBhIG5ldyBwb29sIGRvZXMgbm90CiAgICAgICAgbmVlZCB0byBiZSBjcmVhdGVkIGZvciB0aGUgcmVxdWVzdCwgdGhlIHByb3ZpZGVkIGBgcG9vbF9rd2FyZ3NgYCBhcmUKICAgICAgICBub3QgdXNlZC4KICAgICAgICAiIiIKICAgICAgICB1ID0gcGFyc2VfdXJsKHVybCkKICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uX2Zyb21faG9zdCh1Lmhvc3QsIHBvcnQ9dS5wb3J0LCBzY2hlbWU9dS5zY2hlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbF9rd2FyZ3M9cG9vbF9rd2FyZ3MpCgogICAgZGVmIF9tZXJnZV9wb29sX2t3YXJncyhzZWxmLCBvdmVycmlkZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWVyZ2UgYSBkaWN0aW9uYXJ5IG9mIG92ZXJyaWRlIHZhbHVlcyBmb3Igc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cuCgogICAgICAgIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHNlbGYuY29ubmVjdGlvbl9wb29sX2t3IGFuZCByZXR1cm5zIGEgbmV3IGRpY3QuCiAgICAgICAgQW55IGtleXMgaW4gdGhlIG92ZXJyaWRlIGRpY3Rpb25hcnkgd2l0aCBhIHZhbHVlIG9mIGBgTm9uZWBgIGFyZQogICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgbWVyZ2VkIGRpY3Rpb25hcnkuCiAgICAgICAgIiIiCiAgICAgICAgYmFzZV9wb29sX2t3YXJncyA9IHNlbGYuY29ubmVjdGlvbl9wb29sX2t3LmNvcHkoKQogICAgICAgIGlmIG92ZXJyaWRlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdmVycmlkZS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBiYXNlX3Bvb2xfa3dhcmdzW2tleV0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYmFzZV9wb29sX2t3YXJnc1trZXldID0gdmFsdWUKICAgICAgICByZXR1cm4gYmFzZV9wb29sX2t3YXJncwoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCByZWRpcmVjdD1UcnVlLCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBTYW1lIGFzIDptZXRoOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbC51cmxvcGVuYAogICAgICAgIHdpdGggY3VzdG9tIGNyb3NzLWhvc3QgcmVkaXJlY3QgbG9naWMgYW5kIG9ubHkgc2VuZHMgdGhlIHJlcXVlc3QtdXJpCiAgICAgICAgcG9ydGlvbiBvZiB0aGUgYGB1cmxgYC4KCiAgICAgICAgVGhlIGdpdmVuIGBgdXJsYGAgcGFyYW1ldGVyIG11c3QgYmUgYWJzb2x1dGUsIHN1Y2ggdGhhdCBhbiBhcHByb3ByaWF0ZQogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Db25uZWN0aW9uUG9vbGAgY2FuIGJlIGNob3NlbiBmb3IgaXQuCiAgICAgICAgIiIiCiAgICAgICAgdSA9IHBhcnNlX3VybCh1cmwpCiAgICAgICAgY29ubiA9IHNlbGYuY29ubmVjdGlvbl9mcm9tX2hvc3QodS5ob3N0LCBwb3J0PXUucG9ydCwgc2NoZW1lPXUuc2NoZW1lKQoKICAgICAgICBrd1snYXNzZXJ0X3NhbWVfaG9zdCddID0gRmFsc2UKICAgICAgICBrd1sncmVkaXJlY3QnXSA9IEZhbHNlCiAgICAgICAgaWYgJ2hlYWRlcnMnIG5vdCBpbiBrdzoKICAgICAgICAgICAga3dbJ2hlYWRlcnMnXSA9IHNlbGYuaGVhZGVycwoKICAgICAgICBpZiBzZWxmLnByb3h5IGlzIG5vdCBOb25lIGFuZCB1LnNjaGVtZSA9PSAiaHR0cCI6CiAgICAgICAgICAgIHJlc3BvbnNlID0gY29ubi51cmxvcGVuKG1ldGhvZCwgdXJsLCAqKmt3KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3BvbnNlID0gY29ubi51cmxvcGVuKG1ldGhvZCwgdS5yZXF1ZXN0X3VyaSwgKiprdykKCiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZWRpcmVjdCBhbmQgcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICBpZiBub3QgcmVkaXJlY3RfbG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICAjIFN1cHBvcnQgcmVsYXRpdmUgVVJMcyBmb3IgcmVkaXJlY3RpbmcuCiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSB1cmxqb2luKHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCgogICAgICAgICMgUkZDIDcyMzEsIFNlY3Rpb24gNi40LjQKICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAzOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICByZXRyaWVzID0ga3cuZ2V0KCdyZXRyaWVzJykKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5mcm9tX2ludChyZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIHJlc3BvbnNlPXJlc3BvbnNlLCBfcG9vbD1jb25uKQogICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICBpZiByZXRyaWVzLnJhaXNlX29uX3JlZGlyZWN0OgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgIGt3WydyZXRyaWVzJ10gPSByZXRyaWVzCiAgICAgICAga3dbJ3JlZGlyZWN0J10gPSByZWRpcmVjdAoKICAgICAgICBsb2cuaW5mbygiUmVkaXJlY3RpbmcgJXMgLT4gJXMiLCB1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCByZWRpcmVjdF9sb2NhdGlvbiwgKiprdykKCgpjbGFzcyBQcm94eU1hbmFnZXIoUG9vbE1hbmFnZXIpOgogICAgIiIiCiAgICBCZWhhdmVzIGp1c3QgbGlrZSA6Y2xhc3M6YFBvb2xNYW5hZ2VyYCwgYnV0IHNlbmRzIGFsbCByZXF1ZXN0cyB0aHJvdWdoCiAgICB0aGUgZGVmaW5lZCBwcm94eSwgdXNpbmcgdGhlIENPTk5FQ1QgbWV0aG9kIGZvciBIVFRQUyBVUkxzLgoKICAgIDpwYXJhbSBwcm94eV91cmw6CiAgICAgICAgVGhlIFVSTCBvZiB0aGUgcHJveHkgdG8gYmUgdXNlZC4KCiAgICA6cGFyYW0gcHJveHlfaGVhZGVyczoKICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFuaW5nIGhlYWRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHByb3h5LiBJbiBjYXNlCiAgICAgICAgb2YgSFRUUCB0aGV5IGFyZSBiZWluZyBzZW50IHdpdGggZWFjaCByZXF1ZXN0LCB3aGlsZSBpbiB0aGUKICAgICAgICBIVFRQUy9DT05ORUNUIGNhc2UgdGhleSBhcmUgc2VudCBvbmx5IG9uY2UuIENvdWxkIGJlIHVzZWQgZm9yIHByb3h5CiAgICAgICAgYXV0aGVudGljYXRpb24uCgogICAgRXhhbXBsZToKICAgICAgICA+Pj4gcHJveHkgPSB1cmxsaWIzLlByb3h5TWFuYWdlcignaHR0cDovL2xvY2FsaG9zdDozMTI4LycpCiAgICAgICAgPj4+IHIxID0gcHJveHkucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9nb29nbGUuY29tLycpCiAgICAgICAgPj4+IHIyID0gcHJveHkucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy8nKQogICAgICAgID4+PiBsZW4ocHJveHkucG9vbHMpCiAgICAgICAgMQogICAgICAgID4+PiByMyA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwczovL2h0dHBiaW4ub3JnLycpCiAgICAgICAgPj4+IHI0ID0gcHJveHkucmVxdWVzdCgnR0VUJywgJ2h0dHBzOi8vdHdpdHRlci5jb20vJykKICAgICAgICA+Pj4gbGVuKHByb3h5LnBvb2xzKQogICAgICAgIDMKCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJveHlfdXJsLCBudW1fcG9vbHM9MTAsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICBwcm94eV9oZWFkZXJzPU5vbmUsICoqY29ubmVjdGlvbl9wb29sX2t3KToKCiAgICAgICAgaWYgaXNpbnN0YW5jZShwcm94eV91cmwsIEhUVFBDb25uZWN0aW9uUG9vbCk6CiAgICAgICAgICAgIHByb3h5X3VybCA9ICclczovLyVzOiVpJyAlIChwcm94eV91cmwuc2NoZW1lLCBwcm94eV91cmwuaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X3VybC5wb3J0KQogICAgICAgIHByb3h5ID0gcGFyc2VfdXJsKHByb3h5X3VybCkKICAgICAgICBpZiBub3QgcHJveHkucG9ydDoKICAgICAgICAgICAgcG9ydCA9IHBvcnRfYnlfc2NoZW1lLmdldChwcm94eS5zY2hlbWUsIDgwKQogICAgICAgICAgICBwcm94eSA9IHByb3h5Ll9yZXBsYWNlKHBvcnQ9cG9ydCkKCiAgICAgICAgaWYgcHJveHkuc2NoZW1lIG5vdCBpbiAoImh0dHAiLCAiaHR0cHMiKToKICAgICAgICAgICAgcmFpc2UgUHJveHlTY2hlbWVVbmtub3duKHByb3h5LnNjaGVtZSkKCiAgICAgICAgc2VsZi5wcm94eSA9IHByb3h5CiAgICAgICAgc2VsZi5wcm94eV9oZWFkZXJzID0gcHJveHlfaGVhZGVycyBvciB7fQoKICAgICAgICBjb25uZWN0aW9uX3Bvb2xfa3dbJ19wcm94eSddID0gc2VsZi5wcm94eQogICAgICAgIGNvbm5lY3Rpb25fcG9vbF9rd1snX3Byb3h5X2hlYWRlcnMnXSA9IHNlbGYucHJveHlfaGVhZGVycwoKICAgICAgICBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICAgICBudW1fcG9vbHMsIGhlYWRlcnMsICoqY29ubmVjdGlvbl9wb29sX2t3KQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21faG9zdChzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHNjaGVtZT0naHR0cCcsIHBvb2xfa3dhcmdzPU5vbmUpOgogICAgICAgIGlmIHNjaGVtZSA9PSAiaHR0cHMiOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS5jb25uZWN0aW9uX2Zyb21faG9zdCgKICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIHNjaGVtZSwgcG9vbF9rd2FyZ3M9cG9vbF9rd2FyZ3MpCgogICAgICAgIHJldHVybiBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLmNvbm5lY3Rpb25fZnJvbV9ob3N0KAogICAgICAgICAgICBzZWxmLnByb3h5Lmhvc3QsIHNlbGYucHJveHkucG9ydCwgc2VsZi5wcm94eS5zY2hlbWUsIHBvb2xfa3dhcmdzPXBvb2xfa3dhcmdzKQoKICAgIGRlZiBfc2V0X3Byb3h5X2hlYWRlcnMoc2VsZiwgdXJsLCBoZWFkZXJzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgaGVhZGVycyBuZWVkZWQgYnkgcHJveGllczogc3BlY2lmaWNhbGx5LCB0aGUgQWNjZXB0IGFuZCBIb3N0CiAgICAgICAgaGVhZGVycy4gT25seSBzZXRzIGhlYWRlcnMgbm90IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgogICAgICAgICIiIgogICAgICAgIGhlYWRlcnNfID0geydBY2NlcHQnOiAnKi8qJ30KCiAgICAgICAgbmV0bG9jID0gcGFyc2VfdXJsKHVybCkubmV0bG9jCiAgICAgICAgaWYgbmV0bG9jOgogICAgICAgICAgICBoZWFkZXJzX1snSG9zdCddID0gbmV0bG9jCgogICAgICAgIGlmIGhlYWRlcnM6CiAgICAgICAgICAgIGhlYWRlcnNfLnVwZGF0ZShoZWFkZXJzKQogICAgICAgIHJldHVybiBoZWFkZXJzXwoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCByZWRpcmVjdD1UcnVlLCAqKmt3KToKICAgICAgICAiU2FtZSBhcyBIVFRQKFMpQ29ubmVjdGlvblBvb2wudXJsb3BlbiwgYGB1cmxgYCBtdXN0IGJlIGFic29sdXRlLiIKICAgICAgICB1ID0gcGFyc2VfdXJsKHVybCkKCiAgICAgICAgaWYgdS5zY2hlbWUgPT0gImh0dHAiOgogICAgICAgICAgICAjIEZvciBwcm94aWVkIEhUVFBTIHJlcXVlc3RzLCBodHRwbGliIHNldHMgdGhlIG5lY2Vzc2FyeSBoZWFkZXJzCiAgICAgICAgICAgICMgb24gdGhlIENPTk5FQ1QgdG8gdGhlIHByb3h5LiBGb3IgSFRUUCwgd2UnbGwgZGVmaW5pdGVseQogICAgICAgICAgICAjIG5lZWQgdG8gc2V0ICdIb3N0JyBhdCB0aGUgdmVyeSBsZWFzdC4KICAgICAgICAgICAgaGVhZGVycyA9IGt3LmdldCgnaGVhZGVycycsIHNlbGYuaGVhZGVycykKICAgICAgICAgICAga3dbJ2hlYWRlcnMnXSA9IHNlbGYuX3NldF9wcm94eV9oZWFkZXJzKHVybCwgaGVhZGVycykKCiAgICAgICAgcmV0dXJuIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikudXJsb3BlbihtZXRob2QsIHVybCwgcmVkaXJlY3Q9cmVkaXJlY3QsICoqa3cpCgoKZGVmIHByb3h5X2Zyb21fdXJsKHVybCwgKiprdyk6CiAgICByZXR1cm4gUHJveHlNYW5hZ2VyKHByb3h5X3VybD11cmwsICoqa3cpClBLAwQUAAAAAAAAACEAyjHkxDoXAAA6FwAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3JlcXVlc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAuZmlsZXBvc3QgaW1wb3J0IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsZW5jb2RlCgoKX19hbGxfXyA9IFsnUmVxdWVzdE1ldGhvZHMnXQoKCmNsYXNzIFJlcXVlc3RNZXRob2RzKG9iamVjdCk6CiAgICAiIiIKICAgIENvbnZlbmllbmNlIG1peGluIGZvciBjbGFzc2VzIHdobyBpbXBsZW1lbnQgYSA6bWV0aDpgdXJsb3BlbmAgbWV0aG9kLCBzdWNoCiAgICBhcyA6Y2xhc3M6YH51cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbGAgYW5kCiAgICA6Y2xhc3M6YH51cmxsaWIzLnBvb2xtYW5hZ2VyLlBvb2xNYW5hZ2VyYC4KCiAgICBQcm92aWRlcyBiZWhhdmlvciBmb3IgbWFraW5nIGNvbW1vbiB0eXBlcyBvZiBIVFRQIHJlcXVlc3QgbWV0aG9kcyBhbmQKICAgIGRlY2lkZXMgd2hpY2ggdHlwZSBvZiByZXF1ZXN0IGZpZWxkIGVuY29kaW5nIHRvIHVzZS4KCiAgICBTcGVjaWZpY2FsbHksCgogICAgOm1ldGg6YC5yZXF1ZXN0X2VuY29kZV91cmxgIGlzIGZvciBzZW5kaW5nIHJlcXVlc3RzIHdob3NlIGZpZWxkcyBhcmUKICAgIGVuY29kZWQgaW4gdGhlIFVSTCAoc3VjaCBhcyBHRVQsIEhFQUQsIERFTEVURSkuCgogICAgOm1ldGg6YC5yZXF1ZXN0X2VuY29kZV9ib2R5YCBpcyBmb3Igc2VuZGluZyByZXF1ZXN0cyB3aG9zZSBmaWVsZHMgYXJlCiAgICBlbmNvZGVkIGluIHRoZSAqYm9keSogb2YgdGhlIHJlcXVlc3QgdXNpbmcgbXVsdGlwYXJ0IG9yIHd3dy1mb3JtLXVybGVuY29kZWQKICAgIChzdWNoIGFzIGZvciBQT1NULCBQVVQsIFBBVENIKS4KCiAgICA6bWV0aDpgLnJlcXVlc3RgIGlzIGZvciBtYWtpbmcgYW55IGtpbmQgb2YgcmVxdWVzdCwgaXQgd2lsbCBsb29rIHVwIHRoZQogICAgYXBwcm9wcmlhdGUgZW5jb2RpbmcgZm9ybWF0IGFuZCB1c2Ugb25lIG9mIHRoZSBhYm92ZSB0d28gbWV0aG9kcyB0byBtYWtlCiAgICB0aGUgcmVxdWVzdC4KCiAgICBJbml0aWFsaXplciBwYXJhbWV0ZXJzOgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KICAgICIiIgoKICAgIF9lbmNvZGVfdXJsX21ldGhvZHMgPSBzZXQoWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUyddKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUpOgogICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMgb3Ige30KCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICBlbmNvZGVfbXVsdGlwYXJ0PVRydWUsIG11bHRpcGFydF9ib3VuZGFyeT1Ob25lLAogICAgICAgICAgICAgICAgKiprdyk6ICAjIEFic3RyYWN0CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoIkNsYXNzZXMgZXh0ZW5kaW5nIFJlcXVlc3RNZXRob2RzIG11c3QgaW1wbGVtZW50ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlaXIgb3duIGBgdXJsb3BlbmBgIG1ldGhvZC4iKQoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBmaWVsZHM9Tm9uZSwgaGVhZGVycz1Ob25lLCAqKnVybG9wZW5fa3cpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSByZXF1ZXN0IHVzaW5nIDptZXRoOmB1cmxvcGVuYCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbmNvZGluZyBvZgogICAgICAgIGBgZmllbGRzYGAgYmFzZWQgb24gdGhlIGBgbWV0aG9kYGAgdXNlZC4KCiAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJlcXVpcmVzIHRoZSBsZWFzdCBhbW91bnQgb2YgbWFudWFsCiAgICAgICAgZWZmb3J0LiBJdCBjYW4gYmUgdXNlZCBpbiBtb3N0IHNpdHVhdGlvbnMsIHdoaWxlIHN0aWxsIGhhdmluZyB0aGUKICAgICAgICBvcHRpb24gdG8gZHJvcCBkb3duIHRvIG1vcmUgc3BlY2lmaWMgbWV0aG9kcyB3aGVuIG5lY2Vzc2FyeSwgc3VjaCBhcwogICAgICAgIDptZXRoOmByZXF1ZXN0X2VuY29kZV91cmxgLCA6bWV0aDpgcmVxdWVzdF9lbmNvZGVfYm9keWAsCiAgICAgICAgb3IgZXZlbiB0aGUgbG93ZXN0IGxldmVsIDptZXRoOmB1cmxvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBtZXRob2QgPSBtZXRob2QudXBwZXIoKQoKICAgICAgICBpZiBtZXRob2QgaW4gc2VsZi5fZW5jb2RlX3VybF9tZXRob2RzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0X2VuY29kZV91cmwobWV0aG9kLCB1cmwsIGZpZWxkcz1maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdF9lbmNvZGVfYm9keShtZXRob2QsIHVybCwgZmllbGRzPWZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KQoKICAgIGRlZiByZXF1ZXN0X2VuY29kZV91cmwoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHJlcXVlc3QgdXNpbmcgOm1ldGg6YHVybG9wZW5gIHdpdGggdGhlIGBgZmllbGRzYGAgZW5jb2RlZCBpbgogICAgICAgIHRoZSB1cmwuIFRoaXMgaXMgdXNlZnVsIGZvciByZXF1ZXN0IG1ldGhvZHMgbGlrZSBHRVQsIEhFQUQsIERFTEVURSwgZXRjLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBleHRyYV9rdyA9IHsnaGVhZGVycyc6IGhlYWRlcnN9CiAgICAgICAgZXh0cmFfa3cudXBkYXRlKHVybG9wZW5fa3cpCgogICAgICAgIGlmIGZpZWxkczoKICAgICAgICAgICAgdXJsICs9ICc/JyArIHVybGVuY29kZShmaWVsZHMpCgogICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCB1cmwsICoqZXh0cmFfa3cpCgogICAgZGVmIHJlcXVlc3RfZW5jb2RlX2JvZHkoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfbXVsdGlwYXJ0PVRydWUsIG11bHRpcGFydF9ib3VuZGFyeT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgcmVxdWVzdCB1c2luZyA6bWV0aDpgdXJsb3BlbmAgd2l0aCB0aGUgYGBmaWVsZHNgYCBlbmNvZGVkIGluCiAgICAgICAgdGhlIGJvZHkuIFRoaXMgaXMgdXNlZnVsIGZvciByZXF1ZXN0IG1ldGhvZHMgbGlrZSBQT1NULCBQVVQsIFBBVENILCBldGMuCgogICAgICAgIFdoZW4gYGBlbmNvZGVfbXVsdGlwYXJ0PVRydWVgYCAoZGVmYXVsdCksIHRoZW4KICAgICAgICA6bWV0aDpgdXJsbGliMy5maWxlcG9zdC5lbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhYCBpcyB1c2VkIHRvIGVuY29kZQogICAgICAgIHRoZSBwYXlsb2FkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgdHlwZS4gT3RoZXJ3aXNlCiAgICAgICAgOm1ldGg6YHVybGxpYi51cmxlbmNvZGVgIGlzIHVzZWQgd2l0aCB0aGUKICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyBjb250ZW50IHR5cGUuCgogICAgICAgIE11bHRpcGFydCBlbmNvZGluZyBtdXN0IGJlIHVzZWQgd2hlbiBwb3N0aW5nIGZpbGVzLCBhbmQgaXQncyByZWFzb25hYmx5CiAgICAgICAgc2FmZSB0byB1c2UgaXQgaW4gb3RoZXIgdGltZXMgdG9vLiBIb3dldmVyLCBpdCBtYXkgYnJlYWsgcmVxdWVzdAogICAgICAgIHNpZ25pbmcsIHN1Y2ggYXMgd2l0aCBPQXV0aC4KCiAgICAgICAgU3VwcG9ydHMgYW4gb3B0aW9uYWwgYGBmaWVsZHNgYCBwYXJhbWV0ZXIgb2Yga2V5L3ZhbHVlIHN0cmluZ3MgQU5ECiAgICAgICAga2V5L2ZpbGV0dXBsZS4gQSBmaWxldHVwbGUgaXMgYSAoZmlsZW5hbWUsIGRhdGEsIE1JTUUgdHlwZSkgdHVwbGUgd2hlcmUKICAgICAgICB0aGUgTUlNRSB0eXBlIGlzIG9wdGlvbmFsLiBGb3IgZXhhbXBsZTo6CgogICAgICAgICAgICBmaWVsZHMgPSB7CiAgICAgICAgICAgICAgICAnZm9vJzogJ2JhcicsCiAgICAgICAgICAgICAgICAnZmFrZWZpbGUnOiAoJ2Zvb2ZpbGUudHh0JywgJ2NvbnRlbnRzIG9mIGZvb2ZpbGUnKSwKICAgICAgICAgICAgICAgICdyZWFsZmlsZSc6ICgnYmFyZmlsZS50eHQnLCBvcGVuKCdyZWFsZmlsZScpLnJlYWQoKSksCiAgICAgICAgICAgICAgICAndHlwZWRmaWxlJzogKCdiYXpmaWxlLmJpbicsIG9wZW4oJ2JhemZpbGUnKS5yZWFkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZS9qcGVnJyksCiAgICAgICAgICAgICAgICAnbm9uYW1lZmlsZSc6ICdjb250ZW50cyBvZiBub25hbWVmaWxlIGZpZWxkJywKICAgICAgICAgICAgfQoKICAgICAgICBXaGVuIHVwbG9hZGluZyBhIGZpbGUsIHByb3ZpZGluZyBhIGZpbGVuYW1lICh0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoZQogICAgICAgIHR1cGxlKSBpcyBvcHRpb25hbCBidXQgcmVjb21tZW5kZWQgdG8gYmVzdCBtaW1pY2sgYmVoYXZpb3Igb2YgYnJvd3NlcnMuCgogICAgICAgIE5vdGUgdGhhdCBpZiBgYGhlYWRlcnNgYCBhcmUgc3VwcGxpZWQsIHRoZSAnQ29udGVudC1UeXBlJyBoZWFkZXIgd2lsbAogICAgICAgIGJlIG92ZXJ3cml0dGVuIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZHluYW1pYyByYW5kb20gYm91bmRhcnkgc3RyaW5nCiAgICAgICAgd2hpY2ggaXMgdXNlZCB0byBjb21wb3NlIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LiBUaGUgcmFuZG9tIGJvdW5kYXJ5CiAgICAgICAgc3RyaW5nIGNhbiBiZSBleHBsaWNpdGx5IHNldCB3aXRoIHRoZSBgYG11bHRpcGFydF9ib3VuZGFyeWBgIHBhcmFtZXRlci4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgZXh0cmFfa3cgPSB7J2hlYWRlcnMnOiB7fX0KCiAgICAgICAgaWYgZmllbGRzOgogICAgICAgICAgICBpZiAnYm9keScgaW4gdXJsb3Blbl9rdzoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBnb3QgdmFsdWVzIGZvciBib3RoICdmaWVsZHMnIGFuZCAnYm9keScsIGNhbiBvbmx5IHNwZWNpZnkgb25lLiIpCgogICAgICAgICAgICBpZiBlbmNvZGVfbXVsdGlwYXJ0OgogICAgICAgICAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShmaWVsZHMsIGJvdW5kYXJ5PW11bHRpcGFydF9ib3VuZGFyeSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJvZHksIGNvbnRlbnRfdHlwZSA9IHVybGVuY29kZShmaWVsZHMpLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwoKICAgICAgICAgICAgZXh0cmFfa3dbJ2JvZHknXSA9IGJvZHkKICAgICAgICAgICAgZXh0cmFfa3dbJ2hlYWRlcnMnXSA9IHsnQ29udGVudC1UeXBlJzogY29udGVudF90eXBlfQoKICAgICAgICBleHRyYV9rd1snaGVhZGVycyddLnVwZGF0ZShoZWFkZXJzKQogICAgICAgIGV4dHJhX2t3LnVwZGF0ZSh1cmxvcGVuX2t3KQoKICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgdXJsLCAqKmV4dHJhX2t3KQpQSwMEFAAAAAAAAAAhAD9KgmF3WQAAd1kAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKaW1wb3J0IHpsaWIKaW1wb3J0IGlvCmltcG9ydCBsb2dnaW5nCmZyb20gc29ja2V0IGltcG9ydCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IEhUVFBIZWFkZXJEaWN0CmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZSwgUHJvdG9jb2xFcnJvciwgRGVjb2RlRXJyb3IsIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBSZXNwb25zZU5vdENodW5rZWQsIEluY29tcGxldGVSZWFkLCBJbnZhbGlkSGVhZGVyCikKZnJvbSAucGFja2FnZXMuc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMgYXMgYmFzZXN0cmluZywgYmluYXJ5X3R5cGUsIFBZMwpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50IGFzIGh0dHBsaWIKZnJvbSAuY29ubmVjdGlvbiBpbXBvcnQgSFRUUEV4Y2VwdGlvbiwgQmFzZVNTTEVycm9yCmZyb20gLnV0aWwucmVzcG9uc2UgaW1wb3J0IGlzX2ZwX2Nsb3NlZCwgaXNfcmVzcG9uc2VfdG9faGVhZAoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgRGVmbGF0ZURlY29kZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gVHJ1ZQogICAgICAgIHNlbGYuX2RhdGEgPSBiaW5hcnlfdHlwZSgpCiAgICAgICAgc2VsZi5fb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb2JqLCBuYW1lKQoKICAgIGRlZiBkZWNvbXByZXNzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgICAgICBpZiBub3Qgc2VsZi5fZmlyc3RfdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2JqLmRlY29tcHJlc3MoZGF0YSkKCiAgICAgICAgc2VsZi5fZGF0YSArPSBkYXRhCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWNvbXByZXNzZWQgPSBzZWxmLl9vYmouZGVjb21wcmVzcyhkYXRhKQogICAgICAgICAgICBpZiBkZWNvbXByZXNzZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9maXJzdF90cnkgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NlZAogICAgICAgIGV4Y2VwdCB6bGliLmVycm9yOgogICAgICAgICAgICBzZWxmLl9maXJzdF90cnkgPSBGYWxzZQogICAgICAgICAgICBzZWxmLl9vYmogPSB6bGliLmRlY29tcHJlc3NvYmooLXpsaWIuTUFYX1dCSVRTKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWNvbXByZXNzKHNlbGYuX2RhdGEpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0gTm9uZQoKCmNsYXNzIEd6aXBEZWNvZGVyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigxNiArIHpsaWIuTUFYX1dCSVRTKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9vYmosIG5hbWUpCgogICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgcmV0dXJuIHNlbGYuX29iai5kZWNvbXByZXNzKGRhdGEpCgoKZGVmIF9nZXRfZGVjb2Rlcihtb2RlKToKICAgIGlmIG1vZGUgPT0gJ2d6aXAnOgogICAgICAgIHJldHVybiBHemlwRGVjb2RlcigpCgogICAgcmV0dXJuIERlZmxhdGVEZWNvZGVyKCkKCgpjbGFzcyBIVFRQUmVzcG9uc2UoaW8uSU9CYXNlKToKICAgICIiIgogICAgSFRUUCBSZXNwb25zZSBjb250YWluZXIuCgogICAgQmFja3dhcmRzLWNvbXBhdGlibGUgdG8gaHR0cGxpYidzIEhUVFBSZXNwb25zZSBidXQgdGhlIHJlc3BvbnNlIGBgYm9keWBgIGlzCiAgICBsb2FkZWQgYW5kIGRlY29kZWQgb24tZGVtYW5kIHdoZW4gdGhlIGBgZGF0YWBgIHByb3BlcnR5IGlzIGFjY2Vzc2VkLiAgVGhpcwogICAgY2xhc3MgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5J3MgOm1vZDpgaW9gCiAgICBtb2R1bGUsIGFuZCBjYW4gaGVuY2UgYmUgdHJlYXRlZCBhcyBhIHJlYWRhYmxlIG9iamVjdCBpbiB0aGUgY29udGV4dCBvZiB0aGF0CiAgICBmcmFtZXdvcmsuCgogICAgRXh0cmEgcGFyYW1ldGVycyBmb3IgYmVoYXZpb3VyIG5vdCBwcmVzZW50IGluIGh0dHBsaWIuSFRUUFJlc3BvbnNlOgoKICAgIDpwYXJhbSBwcmVsb2FkX2NvbnRlbnQ6CiAgICAgICAgSWYgVHJ1ZSwgdGhlIHJlc3BvbnNlJ3MgYm9keSB3aWxsIGJlIHByZWxvYWRlZCBkdXJpbmcgY29uc3RydWN0aW9uLgoKICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICBJZiBUcnVlLCBhdHRlbXB0cyB0byBkZWNvZGUgc3BlY2lmaWMgY29udGVudC1lbmNvZGluZydzIGJhc2VkIG9uIGhlYWRlcnMKICAgICAgICAobGlrZSAnZ3ppcCcgYW5kICdkZWZsYXRlJykgd2lsbCBiZSBza2lwcGVkIGFuZCByYXcgZGF0YSB3aWxsIGJlIHVzZWQKICAgICAgICBpbnN0ZWFkLgoKICAgIDpwYXJhbSBvcmlnaW5hbF9yZXNwb25zZToKICAgICAgICBXaGVuIHRoaXMgSFRUUFJlc3BvbnNlIHdyYXBwZXIgaXMgZ2VuZXJhdGVkIGZyb20gYW4gaHR0cGxpYi5IVFRQUmVzcG9uc2UKICAgICAgICBvYmplY3QsIGl0J3MgY29udmVuaWVudCB0byBpbmNsdWRlIHRoZSBvcmlnaW5hbCBmb3IgZGVidWcgcHVycG9zZXMuIEl0J3MKICAgICAgICBvdGhlcndpc2UgdW51c2VkLgoKICAgIDpwYXJhbSByZXRyaWVzOgogICAgICAgIFRoZSByZXRyaWVzIGNvbnRhaW5zIHRoZSBsYXN0IDpjbGFzczpgfnVybGxpYjMudXRpbC5yZXRyeS5SZXRyeWAgdGhhdAogICAgICAgIHdhcyB1c2VkIGR1cmluZyB0aGUgcmVxdWVzdC4KCiAgICA6cGFyYW0gZW5mb3JjZV9jb250ZW50X2xlbmd0aDoKICAgICAgICBFbmZvcmNlIGNvbnRlbnQgbGVuZ3RoIGNoZWNraW5nLiBCb2R5IHJldHVybmVkIGJ5IHNlcnZlciBtdXN0IG1hdGNoCiAgICAgICAgdmFsdWUgb2YgQ29udGVudC1MZW5ndGggaGVhZGVyLCBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHJhaXNlIGVycm9yLgogICAgIiIiCgogICAgQ09OVEVOVF9ERUNPREVSUyA9IFsnZ3ppcCcsICdkZWZsYXRlJ10KICAgIFJFRElSRUNUX1NUQVRVU0VTID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib2R5PScnLCBoZWFkZXJzPU5vbmUsIHN0YXR1cz0wLCB2ZXJzaW9uPTAsIHJlYXNvbj1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD0wLCBwcmVsb2FkX2NvbnRlbnQ9VHJ1ZSwgZGVjb2RlX2NvbnRlbnQ9VHJ1ZSwKICAgICAgICAgICAgICAgICBvcmlnaW5hbF9yZXNwb25zZT1Ob25lLCBwb29sPU5vbmUsIGNvbm5lY3Rpb249Tm9uZSwKICAgICAgICAgICAgICAgICByZXRyaWVzPU5vbmUsIGVuZm9yY2VfY29udGVudF9sZW5ndGg9RmFsc2UsIHJlcXVlc3RfbWV0aG9kPU5vbmUpOgoKICAgICAgICBpZiBpc2luc3RhbmNlKGhlYWRlcnMsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGhlYWRlcnMpCiAgICAgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAogICAgICAgIHNlbGYuZGVjb2RlX2NvbnRlbnQgPSBkZWNvZGVfY29udGVudAogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKICAgICAgICBzZWxmLmVuZm9yY2VfY29udGVudF9sZW5ndGggPSBlbmZvcmNlX2NvbnRlbnRfbGVuZ3RoCgogICAgICAgIHNlbGYuX2RlY29kZXIgPSBOb25lCiAgICAgICAgc2VsZi5fYm9keSA9IE5vbmUKICAgICAgICBzZWxmLl9mcCA9IE5vbmUKICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSA9IG9yaWdpbmFsX3Jlc3BvbnNlCiAgICAgICAgc2VsZi5fZnBfYnl0ZXNfcmVhZCA9IDAKCiAgICAgICAgaWYgYm9keSBhbmQgaXNpbnN0YW5jZShib2R5LCAoYmFzZXN0cmluZywgYmluYXJ5X3R5cGUpKToKICAgICAgICAgICAgc2VsZi5fYm9keSA9IGJvZHkKCiAgICAgICAgc2VsZi5fcG9vbCA9IHBvb2wKICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gY29ubmVjdGlvbgoKICAgICAgICBpZiBoYXNhdHRyKGJvZHksICdyZWFkJyk6CiAgICAgICAgICAgIHNlbGYuX2ZwID0gYm9keQoKICAgICAgICAjIEFyZSB3ZSB1c2luZyB0aGUgY2h1bmtlZC1zdHlsZSBvZiB0cmFuc2ZlciBlbmNvZGluZz8KICAgICAgICBzZWxmLmNodW5rZWQgPSBGYWxzZQogICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICB0cl9lbmMgPSBzZWxmLmhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgIyBEb24ndCBpbmN1ciB0aGUgcGVuYWx0eSBvZiBjcmVhdGluZyBhIGxpc3QgYW5kIHRoZW4gZGlzY2FyZGluZyBpdAogICAgICAgIGVuY29kaW5ncyA9IChlbmMuc3RyaXAoKSBmb3IgZW5jIGluIHRyX2VuYy5zcGxpdCgiLCIpKQogICAgICAgIGlmICJjaHVua2VkIiBpbiBlbmNvZGluZ3M6CiAgICAgICAgICAgIHNlbGYuY2h1bmtlZCA9IFRydWUKCiAgICAgICAgIyBEZXRlcm1pbmUgbGVuZ3RoIG9mIHJlc3BvbnNlCiAgICAgICAgc2VsZi5sZW5ndGhfcmVtYWluaW5nID0gc2VsZi5faW5pdF9sZW5ndGgocmVxdWVzdF9tZXRob2QpCgogICAgICAgICMgSWYgcmVxdWVzdGVkLCBwcmVsb2FkIHRoZSBib2R5LgogICAgICAgIGlmIHByZWxvYWRfY29udGVudCBhbmQgbm90IHNlbGYuX2JvZHk6CiAgICAgICAgICAgIHNlbGYuX2JvZHkgPSBzZWxmLnJlYWQoZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQpCgogICAgZGVmIGdldF9yZWRpcmVjdF9sb2NhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgd2UgcmVkaXJlY3QgYW5kIHdoZXJlIHRvPwoKICAgICAgICA6cmV0dXJuczogVHJ1dGh5IHJlZGlyZWN0IGxvY2F0aW9uIHN0cmluZyBpZiB3ZSBnb3QgYSByZWRpcmVjdCBzdGF0dXMKICAgICAgICAgICAgY29kZSBhbmQgdmFsaWQgbG9jYXRpb24uIGBgTm9uZWBgIGlmIHJlZGlyZWN0IHN0YXR1cyBhbmQgbm8KICAgICAgICAgICAgbG9jYXRpb24uIGBgRmFsc2VgYCBpZiBub3QgYSByZWRpcmVjdCBzdGF0dXMgY29kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnN0YXR1cyBpbiBzZWxmLlJFRElSRUNUX1NUQVRVU0VTOgogICAgICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzLmdldCgnbG9jYXRpb24nKQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgcmVsZWFzZV9jb25uKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLl9wb29sIG9yIG5vdCBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fcG9vbC5fcHV0X2Nvbm4oc2VsZi5fY29ubmVjdGlvbikKICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRhdGEoc2VsZik6CiAgICAgICAgIyBGb3IgYmFja3dvcmRzLWNvbXBhdCB3aXRoIGVhcmxpZXIgdXJsbGliMyAwLjQgYW5kIGVhcmxpZXIuCiAgICAgICAgaWYgc2VsZi5fYm9keToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2JvZHkKCiAgICAgICAgaWYgc2VsZi5fZnA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlYWQoY2FjaGVfY29udGVudD1UcnVlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbm5lY3Rpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3Rpb24KCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBPYnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyBwdWxsZWQgb3ZlciB0aGUgd2lyZSBzbyBmYXIuIE1heSBkaWZmZXIgZnJvbQogICAgICAgIHRoZSBhbW91bnQgb2YgY29udGVudCByZXR1cm5lZCBieSA6bWV0aDpgYEhUVFBSZXNwb25zZS5yZWFkYGAgaWYgYnl0ZXMKICAgICAgICBhcmUgZW5jb2RlZCBvbiB0aGUgd2lyZSAoZS5nLCBjb21wcmVzc2VkKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZnBfYnl0ZXNfcmVhZAoKICAgIGRlZiBfaW5pdF9sZW5ndGgoc2VsZiwgcmVxdWVzdF9tZXRob2QpOgogICAgICAgICIiIgogICAgICAgIFNldCBpbml0aWFsIGxlbmd0aCB2YWx1ZSBmb3IgUmVzcG9uc2UgY29udGVudCBpZiBhdmFpbGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgbGVuZ3RoID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKQoKICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIHNlbGYuY2h1bmtlZDoKICAgICAgICAgICAgIyBUaGlzIFJlc3BvbnNlIHdpbGwgZmFpbCB3aXRoIGFuIEluY29tcGxldGVSZWFkIGlmIGl0IGNhbid0IGJlCiAgICAgICAgICAgICMgcmVjZWl2ZWQgYXMgY2h1bmtlZC4gVGhpcyBtZXRob2QgZmFsbHMgYmFjayB0byBhdHRlbXB0IHJlYWRpbmcKICAgICAgICAgICAgIyB0aGUgcmVzcG9uc2UgYmVmb3JlIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgogICAgICAgICAgICBsb2cud2FybmluZygiUmVjZWl2ZWQgcmVzcG9uc2Ugd2l0aCBib3RoIENvbnRlbnQtTGVuZ3RoIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc2Zlci1FbmNvZGluZyBzZXQuIFRoaXMgaXMgZXhwcmVzc2x5IGZvcmJpZGRlbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJieSBSRkMgNzIzMCBzZWMgMy4zLjIuIElnbm9yaW5nIENvbnRlbnQtTGVuZ3RoIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHByb2Nlc3MgcmVzcG9uc2UgYXMgVHJhbnNmZXItRW5jb2Rpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgICAgImNodW5rZWQuIikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZWxpZiBsZW5ndGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgUkZDIDcyMzAgc2VjdGlvbiAzLjMuMiBzcGVjaWZpZXMgbXVsdGlwbGUgY29udGVudCBsZW5ndGhzIGNhbgogICAgICAgICAgICAgICAgIyBiZSBzZW50IGluIGEgc2luZ2xlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcgogICAgICAgICAgICAgICAgIyAoZS5nLiBDb250ZW50LUxlbmd0aDogNDIsIDQyKS4gVGhpcyBsaW5lIGVuc3VyZXMgdGhlIHZhbHVlcwogICAgICAgICAgICAgICAgIyBhcmUgYWxsIHZhbGlkIGludHMgYW5kIHRoYXQgYXMgbG9uZyBhcyB0aGUgYHNldGAgbGVuZ3RoIGlzIDEsCiAgICAgICAgICAgICAgICAjIGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLiBPdGhlcndpc2UsIHRoZSBoZWFkZXIgaXMgaW52YWxpZC4KICAgICAgICAgICAgICAgIGxlbmd0aHMgPSBzZXQoW2ludCh2YWwpIGZvciB2YWwgaW4gbGVuZ3RoLnNwbGl0KCcsJyldKQogICAgICAgICAgICAgICAgaWYgbGVuKGxlbmd0aHMpID4gMToKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJDb250ZW50LUxlbmd0aCBjb250YWluZWQgbXVsdGlwbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVubWF0Y2hpbmcgdmFsdWVzICglcykiICUgbGVuZ3RoKQogICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3Rocy5wb3AoKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA8IDA6CiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gTm9uZQoKICAgICAgICAjIENvbnZlcnQgc3RhdHVzIHRvIGludCBmb3IgY29tcGFyaXNvbgogICAgICAgICMgSW4gc29tZSBjYXNlcywgaHR0cGxpYiByZXR1cm5zIGEgc3RhdHVzIG9mICJfVU5LTk9XTiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXR1cyA9IGludChzZWxmLnN0YXR1cykKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgc3RhdHVzID0gMAoKICAgICAgICAjIENoZWNrIGZvciByZXNwb25zZXMgdGhhdCBzaG91bGRuJ3QgaW5jbHVkZSBhIGJvZHkKICAgICAgICBpZiBzdGF0dXMgaW4gKDIwNCwgMzA0KSBvciAxMDAgPD0gc3RhdHVzIDwgMjAwIG9yIHJlcXVlc3RfbWV0aG9kID09ICdIRUFEJzoKICAgICAgICAgICAgbGVuZ3RoID0gMAoKICAgICAgICByZXR1cm4gbGVuZ3RoCgogICAgZGVmIF9pbml0X2RlY29kZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0LXVwIHRoZSBfZGVjb2RlciBhdHRyaWJ1dGUgaWYgbmVjZXNzYXJ5LgogICAgICAgICIiIgogICAgICAgICMgTm90ZTogY29udGVudC1lbmNvZGluZyB2YWx1ZSBzaG91bGQgYmUgY2FzZS1pbnNlbnNpdGl2ZSwgcGVyIFJGQyA3MjMwCiAgICAgICAgIyBTZWN0aW9uIDMuMgogICAgICAgIGNvbnRlbnRfZW5jb2RpbmcgPSBzZWxmLmhlYWRlcnMuZ2V0KCdjb250ZW50LWVuY29kaW5nJywgJycpLmxvd2VyKCkKICAgICAgICBpZiBzZWxmLl9kZWNvZGVyIGlzIE5vbmUgYW5kIGNvbnRlbnRfZW5jb2RpbmcgaW4gc2VsZi5DT05URU5UX0RFQ09ERVJTOgogICAgICAgICAgICBzZWxmLl9kZWNvZGVyID0gX2dldF9kZWNvZGVyKGNvbnRlbnRfZW5jb2RpbmcpCgogICAgZGVmIF9kZWNvZGUoc2VsZiwgZGF0YSwgZGVjb2RlX2NvbnRlbnQsIGZsdXNoX2RlY29kZXIpOgogICAgICAgICIiIgogICAgICAgIERlY29kZSB0aGUgZGF0YSBwYXNzZWQgaW4gYW5kIHBvdGVudGlhbGx5IGZsdXNoIHRoZSBkZWNvZGVyLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgZGVjb2RlX2NvbnRlbnQgYW5kIHNlbGYuX2RlY29kZXI6CiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZGVjb2Rlci5kZWNvbXByZXNzKGRhdGEpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCB6bGliLmVycm9yKSBhcyBlOgogICAgICAgICAgICBjb250ZW50X2VuY29kaW5nID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgICAgIHJhaXNlIERlY29kZUVycm9yKAogICAgICAgICAgICAgICAgIlJlY2VpdmVkIHJlc3BvbnNlIHdpdGggY29udGVudC1lbmNvZGluZzogJXMsIGJ1dCAiCiAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRlY29kZSBpdC4iICUgY29udGVudF9lbmNvZGluZywgZSkKCiAgICAgICAgaWYgZmx1c2hfZGVjb2RlciBhbmQgZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIGRhdGEgKz0gc2VsZi5fZmx1c2hfZGVjb2RlcigpCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIF9mbHVzaF9kZWNvZGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZsdXNoZXMgdGhlIGRlY29kZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZGVjb2RlciBpcyBhY3R1YWxseQogICAgICAgIGJlaW5nIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fZGVjb2RlcjoKICAgICAgICAgICAgYnVmID0gc2VsZi5fZGVjb2Rlci5kZWNvbXByZXNzKGInJykKICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2RlY29kZXIuZmx1c2goKQoKICAgICAgICByZXR1cm4gYicnCgogICAgQGNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX2Vycm9yX2NhdGNoZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2F0Y2ggbG93LWxldmVsIHB5dGhvbiBleGNlcHRpb25zLCBpbnN0ZWFkIHJlLXJhaXNpbmcgdXJsbGliMwogICAgICAgIHZhcmlhbnRzLCBzbyB0aGF0IGxvdy1sZXZlbCBleGNlcHRpb25zIGFyZSBub3QgbGVha2VkIGluIHRoZQogICAgICAgIGhpZ2gtbGV2ZWwgYXBpLgoKICAgICAgICBPbiBleGl0LCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgY2xlYW5fZXhpdCA9IEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgeWllbGQKCiAgICAgICAgICAgIGV4Y2VwdCBTb2NrZXRUaW1lb3V0OgogICAgICAgICAgICAgICAgIyBGSVhNRTogSWRlYWxseSB3ZSdkIGxpa2UgdG8gaW5jbHVkZSB0aGUgdXJsIGluIHRoZSBSZWFkVGltZW91dEVycm9yIGJ1dAogICAgICAgICAgICAgICAgIyB0aGVyZSBpcyB5ZXQgbm8gY2xlYW4gd2F5IHRvIGdldCBhdCBpdCBmcm9tIHRoaXMgY29udGV4dC4KICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZi5fcG9vbCwgTm9uZSwgJ1JlYWQgdGltZWQgb3V0LicpCgogICAgICAgICAgICBleGNlcHQgQmFzZVNTTEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIFNTTEVycm9ycz8KICAgICAgICAgICAgICAgIGlmICdyZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQnIG5vdCBpbiBzdHIoZSk6ICAjIERlZmVuc2l2ZToKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBidXQganVzdCBpbiBjYXNlIHdlJ3JlIG1pc3NpbmcgYW4gZWRnZQogICAgICAgICAgICAgICAgICAgICMgY2FzZSwgbGV0J3MgYXZvaWQgc3dhbGxvd2luZyBTU0wgZXJyb3JzLgogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLl9wb29sLCBOb25lLCAnUmVhZCB0aW1lZCBvdXQuJykKCiAgICAgICAgICAgIGV4Y2VwdCAoSFRUUEV4Y2VwdGlvbiwgU29ja2V0RXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAjIFRoaXMgaW5jbHVkZXMgSW5jb21wbGV0ZVJlYWQuCiAgICAgICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKCdDb25uZWN0aW9uIGJyb2tlbjogJXInICUgZSwgZSkKCiAgICAgICAgICAgICMgSWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgd2Ugc2hvdWxkIGF2b2lkIGNsZWFuaW5nIHVwCiAgICAgICAgICAgICMgdW5uZWNlc3NhcmlseS4KICAgICAgICAgICAgY2xlYW5fZXhpdCA9IFRydWUKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCB0ZXJtaW5hdGUgY2xlYW5seSwgd2UgbmVlZCB0byB0aHJvdyBhd2F5IG91cgogICAgICAgICAgICAjIGNvbm5lY3Rpb24uCiAgICAgICAgICAgIGlmIG5vdCBjbGVhbl9leGl0OgogICAgICAgICAgICAgICAgIyBUaGUgcmVzcG9uc2UgbWF5IG5vdCBiZSBjbG9zZWQgYnV0IHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQKICAgICAgICAgICAgICAgICMgYW55bW9yZSBzbyBjbG9zZSBpdCBub3cgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMKICAgICAgICAgICAgICAgICMgcmVsZWFzZWQgYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAgICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKCiAgICAgICAgICAgICAgICAjIENsb3NpbmcgdGhlIHJlc3BvbnNlIG1heSBub3QgYWN0dWFsbHkgYmUgc3VmZmljaWVudCB0byBjbG9zZQogICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nLCBzbyBpZiB3ZSBoYXZlIGEgaG9sZCBvZiB0aGUgY29ubmVjdGlvbiBjbG9zZSB0aGF0CiAgICAgICAgICAgICAgICAjIHRvby4KICAgICAgICAgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb246CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbi5jbG9zZSgpCgogICAgICAgICAgICAjIElmIHdlIGhvbGQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJ1dCBpdCdzIGNsb3NlZCBub3csIHdlIHNob3VsZAogICAgICAgICAgICAjIHJldHVybiB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSBhbmQgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuaXNjbG9zZWQoKToKICAgICAgICAgICAgICAgIHNlbGYucmVsZWFzZV9jb25uKCkKCiAgICBkZWYgcmVhZChzZWxmLCBhbXQ9Tm9uZSwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSwgY2FjaGVfY29udGVudD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2ltaWxhciB0byA6bWV0aDpgaHR0cGxpYi5IVFRQUmVzcG9uc2UucmVhZGAsIGJ1dCB3aXRoIHR3byBhZGRpdGlvbmFsCiAgICAgICAgcGFyYW1ldGVyczogYGBkZWNvZGVfY29udGVudGBgIGFuZCBgYGNhY2hlX2NvbnRlbnRgYC4KCiAgICAgICAgOnBhcmFtIGFtdDoKICAgICAgICAgICAgSG93IG11Y2ggb2YgdGhlIGNvbnRlbnQgdG8gcmVhZC4gSWYgc3BlY2lmaWVkLCBjYWNoaW5nIGlzIHNraXBwZWQKICAgICAgICAgICAgYmVjYXVzZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2FjaGUgcGFydGlhbCBjb250ZW50IGFzIHRoZSBmdWxsCiAgICAgICAgICAgIHJlc3BvbnNlLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCgogICAgICAgIDpwYXJhbSBjYWNoZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIHNhdmUgdGhlIHJldHVybmVkIGRhdGEgc3VjaCB0aGF0IHRoZSBzYW1lIHJlc3VsdCBpcwogICAgICAgICAgICByZXR1cm5lZCBkZXNwaXRlIG9mIHRoZSBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdC4gVGhpcwogICAgICAgICAgICBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGBgLmRhdGFgYCBwcm9wZXJ0eSB0byBjb250aW51ZSB3b3JraW5nCiAgICAgICAgICAgIGFmdGVyIGhhdmluZyBgYC5yZWFkKClgYCB0aGUgZmlsZSBvYmplY3QuIChPdmVycmlkZGVuIGlmIGBgYW10YGAgaXMKICAgICAgICAgICAgc2V0LikKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9pbml0X2RlY29kZXIoKQogICAgICAgIGlmIGRlY29kZV9jb250ZW50IGlzIE5vbmU6CiAgICAgICAgICAgIGRlY29kZV9jb250ZW50ID0gc2VsZi5kZWNvZGVfY29udGVudAoKICAgICAgICBpZiBzZWxmLl9mcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZmx1c2hfZGVjb2RlciA9IEZhbHNlCiAgICAgICAgZGF0YSA9IE5vbmUKCiAgICAgICAgd2l0aCBzZWxmLl9lcnJvcl9jYXRjaGVyKCk6CiAgICAgICAgICAgIGlmIGFtdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBjU3RyaW5nSU8gZG9lc24ndCBsaWtlIGFtdD1Ob25lCiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZnAucmVhZCgpCiAgICAgICAgICAgICAgICBmbHVzaF9kZWNvZGVyID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2FjaGVfY29udGVudCA9IEZhbHNlCiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZnAucmVhZChhbXQpCiAgICAgICAgICAgICAgICBpZiBhbXQgIT0gMCBhbmQgbm90IGRhdGE6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBCdWdneSB2ZXJzaW9ucyBvZiBQeXRob24uCiAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbiB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQKICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHJlZHVuZGFudCB0byB3aGF0IGh0dHBsaWIvaHR0cC5jbGllbnQgX3Nob3VsZF8KICAgICAgICAgICAgICAgICAgICAjIGFscmVhZHkgZG8uICBIb3dldmVyLCB2ZXJzaW9ucyBvZiBweXRob24gcmVsZWFzZWQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgIyBEZWNlbWJlciAxNSwgMjAxMiAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE2Mjk4KSBkbwogICAgICAgICAgICAgICAgICAgICMgbm90IHByb3Blcmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIGFsbCBjYXNlcy4gVGhlcmUgaXMKICAgICAgICAgICAgICAgICAgICAjIG5vIGhhcm0gaW4gcmVkdW5kYW50bHkgY2FsbGluZyBjbG9zZS4KICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgZmx1c2hfZGVjb2RlciA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuZm9yY2VfY29udGVudF9sZW5ndGggYW5kIHNlbGYubGVuZ3RoX3JlbWFpbmluZyBub3QgaW4gKDAsIE5vbmUpOgogICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gZWRnZSBjYXNlIHRoYXQgaHR0cGxpYiBmYWlsZWQgdG8gY292ZXIgZHVlCiAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gY29uY2VybnMgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gV2UncmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGRyZXNzaW5nIGl0IGhlcmUgdG8gbWFrZSBzdXJlIEluY29tcGxldGVSZWFkIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmFpc2VkIGR1cmluZyBzdHJlYW1pbmcsIHNvIGFsbCBjYWxscyB3aXRoIGluY29ycmVjdAogICAgICAgICAgICAgICAgICAgICAgICAjIENvbnRlbnQtTGVuZ3RoIGFyZSBjYXVnaHQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluY29tcGxldGVSZWFkKHNlbGYuX2ZwX2J5dGVzX3JlYWQsIHNlbGYubGVuZ3RoX3JlbWFpbmluZykKCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi5fZnBfYnl0ZXNfcmVhZCArPSBsZW4oZGF0YSkKICAgICAgICAgICAgaWYgc2VsZi5sZW5ndGhfcmVtYWluaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sZW5ndGhfcmVtYWluaW5nIC09IGxlbihkYXRhKQoKICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RlY29kZShkYXRhLCBkZWNvZGVfY29udGVudCwgZmx1c2hfZGVjb2RlcikKCiAgICAgICAgICAgIGlmIGNhY2hlX2NvbnRlbnQ6CiAgICAgICAgICAgICAgICBzZWxmLl9ib2R5ID0gZGF0YQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBzdHJlYW0oc2VsZiwgYW10PTIqKjE2LCBkZWNvZGVfY29udGVudD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBIGdlbmVyYXRvciB3cmFwcGVyIGZvciB0aGUgcmVhZCgpIG1ldGhvZC4gQSBjYWxsIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICBgYGFtdGBgIGJ5dGVzIGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24gb3IgdW50aWwgdGhlCiAgICAgICAgY29ubmVjdGlvbiBpcyBjbG9zZWQuCgogICAgICAgIDpwYXJhbSBhbXQ6CiAgICAgICAgICAgIEhvdyBtdWNoIG9mIHRoZSBjb250ZW50IHRvIHJlYWQuIFRoZSBnZW5lcmF0b3Igd2lsbCByZXR1cm4gdXAgdG8KICAgICAgICAgICAgbXVjaCBkYXRhIHBlciBpdGVyYXRpb24sIGJ1dCBtYXkgcmV0dXJuIGxlc3MuIFRoaXMgaXMgcGFydGljdWxhcmx5CiAgICAgICAgICAgIGxpa2VseSB3aGVuIHVzaW5nIGNvbXByZXNzZWQgZGF0YS4gSG93ZXZlciwgdGhlIGVtcHR5IHN0cmluZyB3aWxsCiAgICAgICAgICAgIG5ldmVyIGJlIHJldHVybmVkLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jaHVua2VkIGFuZCBzZWxmLnN1cHBvcnRzX2NodW5rZWRfcmVhZHMoKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5yZWFkX2NodW5rZWQoYW10LCBkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2hpbGUgbm90IGlzX2ZwX2Nsb3NlZChzZWxmLl9mcCk6CiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkKGFtdD1hbXQsIGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50KQoKICAgICAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZGF0YQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21faHR0cGxpYihSZXNwb25zZUNscywgciwgKipyZXNwb25zZV9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYW4gOmNsYXNzOmBodHRwbGliLkhUVFBSZXNwb25zZWAgaW5zdGFuY2UgYGByYGAsIHJldHVybiBhCiAgICAgICAgY29ycmVzcG9uZGluZyA6Y2xhc3M6YHVybGxpYjMucmVzcG9uc2UuSFRUUFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIFJlbWFpbmluZyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIEhUVFBSZXNwb25zZSBjb25zdHJ1Y3RvciwgYWxvbmcKICAgICAgICB3aXRoIGBgb3JpZ2luYWxfcmVzcG9uc2U9cmBgLgogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSByLm1zZwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShoZWFkZXJzLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgIGlmIFBZMzogICMgUHl0aG9uIDMKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChoZWFkZXJzLml0ZW1zKCkpCiAgICAgICAgICAgIGVsc2U6ICAjIFB5dGhvbiAyCiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QuZnJvbV9odHRwbGliKGhlYWRlcnMpCgogICAgICAgICMgSFRUUFJlc3BvbnNlIG9iamVjdHMgaW4gUHl0aG9uIDMgZG9uJ3QgaGF2ZSBhIC5zdHJpY3QgYXR0cmlidXRlCiAgICAgICAgc3RyaWN0ID0gZ2V0YXR0cihyLCAnc3RyaWN0JywgMCkKICAgICAgICByZXNwID0gUmVzcG9uc2VDbHMoYm9keT1yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1yLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1yLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbj1yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PXN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfcmVzcG9uc2U9ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKICAgICAgICByZXR1cm4gcmVzcAoKICAgICMgQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbWV0aG9kcyBmb3IgaHR0cGxpYi5IVFRQUmVzcG9uc2UKICAgIGRlZiBnZXRoZWFkZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKCiAgICBkZWYgZ2V0aGVhZGVyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQobmFtZSwgZGVmYXVsdCkKCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwLmNvb2tpZWphcgogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycwoKICAgICMgT3ZlcnJpZGVzIGZyb20gaW8uSU9CYXNlCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICBzZWxmLl9mcC5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb246CiAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNsb3NlZChzZWxmKToKICAgICAgICBpZiBzZWxmLl9mcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLl9mcCwgJ2lzY2xvc2VkJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5pc2Nsb3NlZCgpCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuX2ZwLCAnY2xvc2VkJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5jbG9zZWQKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiSFRUUFJlc3BvbnNlIGhhcyBubyBmaWxlIHRvIGdldCBhIGZpbGVubyBmcm9tIikKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5fZnAsICJmaWxlbm8iKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmZpbGVubygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiVGhlIGZpbGUtbGlrZSBvYmplY3QgdGhpcyBIVFRQUmVzcG9uc2UgaXMgd3JhcHBlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFyb3VuZCBoYXMgbm8gZmlsZSBkZXNjcmlwdG9yIikKCiAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoc2VsZi5fZnAsICdmbHVzaCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuZmx1c2goKQoKICAgIGRlZiByZWFkYWJsZShzZWxmKToKICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBgaW9gIG1vZHVsZSBjb21wYXRpYmlsaXR5LgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgogICAgICAgICMgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGBpb2AgbW9kdWxlIGNvbXBhdGliaWxpdHkuCiAgICAgICAgdGVtcCA9IHNlbGYucmVhZChsZW4oYikpCiAgICAgICAgaWYgbGVuKHRlbXApID09IDA6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYls6bGVuKHRlbXApXSA9IHRlbXAKICAgICAgICAgICAgcmV0dXJuIGxlbih0ZW1wKQoKICAgIGRlZiBzdXBwb3J0c19jaHVua2VkX3JlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyBpZiB0aGUgdW5kZXJseWluZyBmaWxlLWxpa2Ugb2JqZWN0IGxvb2tzIGxpa2UgYQogICAgICAgIGh0dHBsaWIuSFRUUFJlc3BvbnNlIG9iamVjdC4gV2UgZG8gdGhpcyBieSB0ZXN0aW5nIGZvciB0aGUgZnAKICAgICAgICBhdHRyaWJ1dGUuIElmIGl0IGlzIHByZXNlbnQgd2UgYXNzdW1lIGl0IHJldHVybnMgcmF3IGNodW5rcyBhcwogICAgICAgIHByb2Nlc3NlZCBieSByZWFkX2NodW5rZWQoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9mcCwgJ2ZwJykKCiAgICBkZWYgX3VwZGF0ZV9jaHVua19sZW5ndGgoc2VsZik6CiAgICAgICAgIyBGaXJzdCwgd2UnbGwgZmlndXJlIG91dCBsZW5ndGggb2YgYSBjaHVuayBhbmQgdGhlbgogICAgICAgICMgd2UnbGwgdHJ5IHRvIHJlYWQgaXQgZnJvbSBzb2NrZXQuCiAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsaW5lID0gc2VsZi5fZnAuZnAucmVhZGxpbmUoKQogICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0KGInOycsIDEpWzBdCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBpbnQobGluZSwgMTYpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgSW52YWxpZCBjaHVua2VkIHByb3RvY29sIHJlc3BvbnNlLCBhYm9ydC4KICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIGh0dHBsaWIuSW5jb21wbGV0ZVJlYWQobGluZSkKCiAgICBkZWYgX2hhbmRsZV9jaHVuayhzZWxmLCBhbXQpOgogICAgICAgIHJldHVybmVkX2NodW5rID0gTm9uZQogICAgICAgIGlmIGFtdCBpcyBOb25lOgogICAgICAgICAgICBjaHVuayA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoc2VsZi5jaHVua19sZWZ0KQogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IGNodW5rCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgIGVsaWYgYW10IDwgc2VsZi5jaHVua19sZWZ0OgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoYW10KQogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBzZWxmLmNodW5rX2xlZnQgLSBhbXQKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSB2YWx1ZQogICAgICAgIGVsaWYgYW10ID09IHNlbGYuY2h1bmtfbGVmdDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICAgICAgc2VsZi5fZnAuX3NhZmVfcmVhZCgyKSAgIyBUb3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rLgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gdmFsdWUKICAgICAgICBlbHNlOiAgIyBhbXQgPiBzZWxmLmNodW5rX2xlZnQKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKHNlbGYuY2h1bmtfbGVmdCkKICAgICAgICAgICAgc2VsZi5fZnAuX3NhZmVfcmVhZCgyKSAgIyBUb3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rLgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgcmV0dXJuIHJldHVybmVkX2NodW5rCgogICAgZGVmIHJlYWRfY2h1bmtlZChzZWxmLCBhbXQ9Tm9uZSwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2ltaWxhciB0byA6bWV0aDpgSFRUUFJlc3BvbnNlLnJlYWRgLCBidXQgd2l0aCBhbiBhZGRpdGlvbmFsCiAgICAgICAgcGFyYW1ldGVyOiBgYGRlY29kZV9jb250ZW50YGAuCgogICAgICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBhdHRlbXB0IHRvIGRlY29kZSB0aGUgYm9keSBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgJ2NvbnRlbnQtZW5jb2RpbmcnIGhlYWRlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9pbml0X2RlY29kZXIoKQogICAgICAgICMgRklYTUU6IFJld3JpdGUgdGhpcyBtZXRob2QgYW5kIG1ha2UgaXQgYSBjbGFzcyB3aXRoIGEgYmV0dGVyIHN0cnVjdHVyZWQgbG9naWMuCiAgICAgICAgaWYgbm90IHNlbGYuY2h1bmtlZDoKICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RDaHVua2VkKAogICAgICAgICAgICAgICAgIlJlc3BvbnNlIGlzIG5vdCBjaHVua2VkLiAiCiAgICAgICAgICAgICAgICAiSGVhZGVyICd0cmFuc2Zlci1lbmNvZGluZzogY2h1bmtlZCcgaXMgbWlzc2luZy4iKQogICAgICAgIGlmIG5vdCBzZWxmLnN1cHBvcnRzX2NodW5rZWRfcmVhZHMoKToKICAgICAgICAgICAgcmFpc2UgQm9keU5vdEh0dHBsaWJDb21wYXRpYmxlKAogICAgICAgICAgICAgICAgIkJvZHkgc2hvdWxkIGJlIGh0dHBsaWIuSFRUUFJlc3BvbnNlIGxpa2UuICIKICAgICAgICAgICAgICAgICJJdCBzaG91bGQgaGF2ZSBoYXZlIGFuIGZwIGF0dHJpYnV0ZSB3aGljaCByZXR1cm5zIHJhdyBjaHVua3MuIikKCiAgICAgICAgIyBEb24ndCBib3RoZXIgcmVhZGluZyB0aGUgYm9keSBvZiBhIEhFQUQgcmVxdWVzdC4KICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSBhbmQgaXNfcmVzcG9uc2VfdG9faGVhZChzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSk6CiAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdpdGggc2VsZi5fZXJyb3JfY2F0Y2hlcigpOgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2NodW5rX2xlbmd0aCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rX2xlZnQgPT0gMDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLl9oYW5kbGVfY2h1bmsoYW10KQogICAgICAgICAgICAgICAgZGVjb2RlZCA9IHNlbGYuX2RlY29kZShjaHVuaywgZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX2RlY29kZXI9RmFsc2UpCiAgICAgICAgICAgICAgICBpZiBkZWNvZGVkOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRlY29kZWQKCiAgICAgICAgICAgIGlmIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICAgICAgIyBPbiBDUHl0aG9uIGFuZCBQeVB5LCB3ZSBzaG91bGQgbmV2ZXIgbmVlZCB0byBmbHVzaCB0aGUKICAgICAgICAgICAgICAgICMgZGVjb2Rlci4gSG93ZXZlciwgb24gSnl0aG9uIHdlICptaWdodCogbmVlZCB0bywgc28KICAgICAgICAgICAgICAgICMgbGV0cyBkZWZlbnNpdmVseSBkbyBpdCBhbnl3YXkuCiAgICAgICAgICAgICAgICBkZWNvZGVkID0gc2VsZi5fZmx1c2hfZGVjb2RlcigpCiAgICAgICAgICAgICAgICBpZiBkZWNvZGVkOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogSnl0aG9uLgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRlY29kZWQKCiAgICAgICAgICAgICMgQ2h1bmsgY29udGVudCBlbmRzIHdpdGggXHJcbjogZGlzY2FyZCBpdC4KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9mcC5mcC5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc2l0ZXMgbWF5IG5vdCBlbmQgd2l0aCAnXHJcbicuCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gYidcclxuJzoKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgIyBXZSByZWFkIGV2ZXJ5dGhpbmc7IGNsb3NlIHRoZSAiZmlsZSIuCiAgICAgICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlOgogICAgICAgICAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuY2xvc2UoKQpQSwMEFAAAAAAAAAAhAFJ14b8UBAAAFAQAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHByb3ZpZGUgaW1wb3J0cyB0aGF0IHVzZWQgdG8gYmUgaGVyZS4KZnJvbSAuY29ubmVjdGlvbiBpbXBvcnQgaXNfY29ubmVjdGlvbl9kcm9wcGVkCmZyb20gLnJlcXVlc3QgaW1wb3J0IG1ha2VfaGVhZGVycwpmcm9tIC5yZXNwb25zZSBpbXBvcnQgaXNfZnBfY2xvc2VkCmZyb20gLnNzbF8gaW1wb3J0ICgKICAgIFNTTENvbnRleHQsCiAgICBIQVNfU05JLAogICAgSVNfUFlPUEVOU1NMLAogICAgSVNfU0VDVVJFVFJBTlNQT1JULAogICAgYXNzZXJ0X2ZpbmdlcnByaW50LAogICAgcmVzb2x2ZV9jZXJ0X3JlcXMsCiAgICByZXNvbHZlX3NzbF92ZXJzaW9uLAogICAgc3NsX3dyYXBfc29ja2V0LAopCmZyb20gLnRpbWVvdXQgaW1wb3J0ICgKICAgIGN1cnJlbnRfdGltZSwKICAgIFRpbWVvdXQsCikKCmZyb20gLnJldHJ5IGltcG9ydCBSZXRyeQpmcm9tIC51cmwgaW1wb3J0ICgKICAgIGdldF9ob3N0LAogICAgcGFyc2VfdXJsLAogICAgc3BsaXRfZmlyc3QsCiAgICBVcmwsCikKZnJvbSAud2FpdCBpbXBvcnQgKAogICAgd2FpdF9mb3JfcmVhZCwKICAgIHdhaXRfZm9yX3dyaXRlCikKCl9fYWxsX18gPSAoCiAgICAnSEFTX1NOSScsCiAgICAnSVNfUFlPUEVOU1NMJywKICAgICdJU19TRUNVUkVUUkFOU1BPUlQnLAogICAgJ1NTTENvbnRleHQnLAogICAgJ1JldHJ5JywKICAgICdUaW1lb3V0JywKICAgICdVcmwnLAogICAgJ2Fzc2VydF9maW5nZXJwcmludCcsCiAgICAnY3VycmVudF90aW1lJywKICAgICdpc19jb25uZWN0aW9uX2Ryb3BwZWQnLAogICAgJ2lzX2ZwX2Nsb3NlZCcsCiAgICAnZ2V0X2hvc3QnLAogICAgJ3BhcnNlX3VybCcsCiAgICAnbWFrZV9oZWFkZXJzJywKICAgICdyZXNvbHZlX2NlcnRfcmVxcycsCiAgICAncmVzb2x2ZV9zc2xfdmVyc2lvbicsCiAgICAnc3BsaXRfZmlyc3QnLAogICAgJ3NzbF93cmFwX3NvY2tldCcsCiAgICAnd2FpdF9mb3JfcmVhZCcsCiAgICAnd2FpdF9mb3Jfd3JpdGUnCikKUEsDBBQAAAAAAAAAIQCrn189jRAAAI0QAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9jb25uZWN0aW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHNvY2tldApmcm9tIC53YWl0IGltcG9ydCB3YWl0X2Zvcl9yZWFkCmZyb20gLnNlbGVjdG9ycyBpbXBvcnQgSEFTX1NFTEVDVCwgU2VsZWN0b3JFcnJvcgoKCmRlZiBpc19jb25uZWN0aW9uX2Ryb3BwZWQoY29ubik6ICAjIFBsYXRmb3JtLXNwZWNpZmljCiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkIGFuZCBzaG91bGQgYmUgY2xvc2VkLgoKICAgIDpwYXJhbSBjb25uOgogICAgICAgIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAgb2JqZWN0LgoKICAgIE5vdGU6IEZvciBwbGF0Zm9ybXMgbGlrZSBBcHBFbmdpbmUsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGBgRmFsc2VgYCB0bwogICAgbGV0IHRoZSBwbGF0Zm9ybSBoYW5kbGUgY29ubmVjdGlvbiByZWN5Y2xpbmcgdHJhbnNwYXJlbnRseSBmb3IgdXMuCiAgICAiIiIKICAgIHNvY2sgPSBnZXRhdHRyKGNvbm4sICdzb2NrJywgRmFsc2UpCiAgICBpZiBzb2NrIGlzIEZhbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzb2NrIGlzIE5vbmU6ICAjIENvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQgKHN1Y2ggYXMgYnkgaHR0cGxpYikuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiBub3QgSEFTX1NFTEVDVDoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGJvb2wod2FpdF9mb3JfcmVhZChzb2NrLCB0aW1lb3V0PTAuMCkpCiAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICByZXR1cm4gVHJ1ZQoKCiMgVGhpcyBmdW5jdGlvbiBpcyBjb3BpZWQgZnJvbSBzb2NrZXQucHkgaW4gdGhlIFB5dGhvbiAyLjcgc3RhbmRhcmQKIyBsaWJyYXJ5IHRlc3Qgc3VpdGUuIEFkZGVkIHRvIGl0cyBzaWduYXR1cmUgaXMgb25seSBgc29ja2V0X29wdGlvbnNgLgojIE9uZSBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbiBpcyB0aGF0IHdlIGF2b2lkIGJpbmRpbmcgdG8gSVB2NiBzZXJ2ZXJzCiMgZGlzY292ZXJlZCBpbiBETlMgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGhhdmUgSVB2NiBmdW5jdGlvbmFsaXR5LgpkZWYgY3JlYXRlX2Nvbm5lY3Rpb24oYWRkcmVzcywgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lLCBzb2NrZXRfb3B0aW9ucz1Ob25lKToKICAgICIiIkNvbm5lY3QgdG8gKmFkZHJlc3MqIGFuZCByZXR1cm4gdGhlIHNvY2tldCBvYmplY3QuCgogICAgQ29udmVuaWVuY2UgZnVuY3Rpb24uICBDb25uZWN0IHRvICphZGRyZXNzKiAoYSAyLXR1cGxlIGBgKGhvc3QsCiAgICBwb3J0KWBgKSBhbmQgcmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0LiAgUGFzc2luZyB0aGUgb3B0aW9uYWwKICAgICp0aW1lb3V0KiBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIHRpbWVvdXQgb24gdGhlIHNvY2tldCBpbnN0YW5jZQogICAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4gIElmIG5vICp0aW1lb3V0KiBpcyBzdXBwbGllZCwgdGhlCiAgICBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgcmV0dXJuZWQgYnkgOmZ1bmM6YGdldGRlZmF1bHR0aW1lb3V0YAogICAgaXMgdXNlZC4gIElmICpzb3VyY2VfYWRkcmVzcyogaXMgc2V0IGl0IG11c3QgYmUgYSB0dXBsZSBvZiAoaG9zdCwgcG9ydCkKICAgIGZvciB0aGUgc29ja2V0IHRvIGJpbmQgYXMgYSBzb3VyY2UgYWRkcmVzcyBiZWZvcmUgbWFraW5nIHRoZSBjb25uZWN0aW9uLgogICAgQW4gaG9zdCBvZiAnJyBvciBwb3J0IDAgdGVsbHMgdGhlIE9TIHRvIHVzZSB0aGUgZGVmYXVsdC4KICAgICIiIgoKICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzCiAgICBpZiBob3N0LnN0YXJ0c3dpdGgoJ1snKToKICAgICAgICBob3N0ID0gaG9zdC5zdHJpcCgnW10nKQogICAgZXJyID0gTm9uZQoKICAgICMgVXNpbmcgdGhlIHZhbHVlIGZyb20gYWxsb3dlZF9nYWlfZmFtaWx5KCkgaW4gdGhlIGNvbnRleHQgb2YgZ2V0YWRkcmluZm8gbGV0cwogICAgIyB1cyBzZWxlY3Qgd2hldGhlciB0byB3b3JrIHdpdGggSVB2NCBETlMgcmVjb3JkcywgSVB2NiByZWNvcmRzLCBvciBib3RoLgogICAgIyBUaGUgb3JpZ2luYWwgY3JlYXRlX2Nvbm5lY3Rpb24gZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYWxsIHJlY29yZHMuCiAgICBmYW1pbHkgPSBhbGxvd2VkX2dhaV9mYW1pbHkoKQoKICAgIGZvciByZXMgaW4gc29ja2V0LmdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIGZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNKToKICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCiAgICAgICAgc29jayA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCgogICAgICAgICAgICAjIElmIHByb3ZpZGVkLCBzZXQgc29ja2V0IGxldmVsIG9wdGlvbnMgYmVmb3JlIGNvbm5lY3RpbmcuCiAgICAgICAgICAgIF9zZXRfc29ja2V0X29wdGlvbnMoc29jaywgc29ja2V0X29wdGlvbnMpCgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBzb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgaWYgc291cmNlX2FkZHJlc3M6CiAgICAgICAgICAgICAgICBzb2NrLmJpbmQoc291cmNlX2FkZHJlc3MpCiAgICAgICAgICAgIHNvY2suY29ubmVjdChzYSkKICAgICAgICAgICAgcmV0dXJuIHNvY2sKCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgogICAgICAgICAgICBlcnIgPSBlCiAgICAgICAgICAgIGlmIHNvY2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgICAgICAgIHNvY2sgPSBOb25lCgogICAgaWYgZXJyIGlzIG5vdCBOb25lOgogICAgICAgIHJhaXNlIGVycgoKICAgIHJhaXNlIHNvY2tldC5lcnJvcigiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IikKCgpkZWYgX3NldF9zb2NrZXRfb3B0aW9ucyhzb2NrLCBvcHRpb25zKToKICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICByZXR1cm4KCiAgICBmb3Igb3B0IGluIG9wdGlvbnM6CiAgICAgICAgc29jay5zZXRzb2Nrb3B0KCpvcHQpCgoKZGVmIGFsbG93ZWRfZ2FpX2ZhbWlseSgpOgogICAgIiIiVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byB3b3JrIGluIHRoZSBjb250ZXh0IG9mCiAgICBnZXRhZGRyaW5mbywgd2hlcmUgZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMgaXMgdGhlIGRlZmF1bHQgYW5kCiAgICB3aWxsIHBlcmZvcm0gYSBETlMgc2VhcmNoIGZvciBib3RoIElQdjYgYW5kIElQdjQgcmVjb3Jkcy4iIiIKCiAgICBmYW1pbHkgPSBzb2NrZXQuQUZfSU5FVAogICAgaWYgSEFTX0lQVjY6CiAgICAgICAgZmFtaWx5ID0gc29ja2V0LkFGX1VOU1BFQwogICAgcmV0dXJuIGZhbWlseQoKCmRlZiBfaGFzX2lwdjYoaG9zdCk6CiAgICAiIiIgUmV0dXJucyBUcnVlIGlmIHRoZSBzeXN0ZW0gY2FuIGJpbmQgYW4gSVB2NiBhZGRyZXNzLiAiIiIKICAgIHNvY2sgPSBOb25lCiAgICBoYXNfaXB2NiA9IEZhbHNlCgogICAgaWYgc29ja2V0Lmhhc19pcHY2OgogICAgICAgICMgaGFzX2lwdjYgcmV0dXJucyB0cnVlIGlmIGNQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0LgogICAgICAgICMgSXQgZG9lcyBub3QgdGVsbCB1cyBpZiB0aGUgc3lzdGVtIGhhcyBJUHY2IHN1cHBvcnQgZW5hYmxlZC4gVG8KICAgICAgICAjIGRldGVybWluZSB0aGF0IHdlIG11c3QgYmluZCB0byBhbiBJUHY2IGFkZHJlc3MuCiAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vc2hhem93L3VybGxpYjMvcHVsbC82MTEKICAgICAgICAjIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjU4MzI3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVDYpCiAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgMCkpCiAgICAgICAgICAgIGhhc19pcHY2ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBpZiBzb2NrOgogICAgICAgIHNvY2suY2xvc2UoKQogICAgcmV0dXJuIGhhc19pcHY2CgoKSEFTX0lQVjYgPSBfaGFzX2lwdjYoJzo6MScpClBLAwQUAAAAAAAAACEAQWGQ13kOAAB5DgAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVxdWVzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gYmFzZTY0IGltcG9ydCBiNjRlbmNvZGUKCmZyb20gLi5wYWNrYWdlcy5zaXggaW1wb3J0IGIsIGludGVnZXJfdHlwZXMKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IFVucmV3aW5kYWJsZUJvZHlFcnJvcgoKQUNDRVBUX0VOQ09ESU5HID0gJ2d6aXAsZGVmbGF0ZScKX0ZBSUxFRFRFTEwgPSBvYmplY3QoKQoKCmRlZiBtYWtlX2hlYWRlcnMoa2VlcF9hbGl2ZT1Ob25lLCBhY2NlcHRfZW5jb2Rpbmc9Tm9uZSwgdXNlcl9hZ2VudD1Ob25lLAogICAgICAgICAgICAgICAgIGJhc2ljX2F1dGg9Tm9uZSwgcHJveHlfYmFzaWNfYXV0aD1Ob25lLCBkaXNhYmxlX2NhY2hlPU5vbmUpOgogICAgIiIiCiAgICBTaG9ydGN1dHMgZm9yIGdlbmVyYXRpbmcgcmVxdWVzdCBoZWFkZXJzLgoKICAgIDpwYXJhbSBrZWVwX2FsaXZlOgogICAgICAgIElmIGBgVHJ1ZWBgLCBhZGRzICdjb25uZWN0aW9uOiBrZWVwLWFsaXZlJyBoZWFkZXIuCgogICAgOnBhcmFtIGFjY2VwdF9lbmNvZGluZzoKICAgICAgICBDYW4gYmUgYSBib29sZWFuLCBsaXN0LCBvciBzdHJpbmcuCiAgICAgICAgYGBUcnVlYGAgdHJhbnNsYXRlcyB0byAnZ3ppcCxkZWZsYXRlJy4KICAgICAgICBMaXN0IHdpbGwgZ2V0IGpvaW5lZCBieSBjb21tYS4KICAgICAgICBTdHJpbmcgd2lsbCBiZSB1c2VkIGFzIHByb3ZpZGVkLgoKICAgIDpwYXJhbSB1c2VyX2FnZW50OgogICAgICAgIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXItYWdlbnQgeW91IHdhbnQsIHN1Y2ggYXMKICAgICAgICAicHl0aG9uLXVybGxpYjMvMC42IgoKICAgIDpwYXJhbSBiYXNpY19hdXRoOgogICAgICAgIENvbG9uLXNlcGFyYXRlZCB1c2VybmFtZTpwYXNzd29yZCBzdHJpbmcgZm9yICdhdXRob3JpemF0aW9uOiBiYXNpYyAuLi4nCiAgICAgICAgYXV0aCBoZWFkZXIuCgogICAgOnBhcmFtIHByb3h5X2Jhc2ljX2F1dGg6CiAgICAgICAgQ29sb24tc2VwYXJhdGVkIHVzZXJuYW1lOnBhc3N3b3JkIHN0cmluZyBmb3IgJ3Byb3h5LWF1dGhvcml6YXRpb246IGJhc2ljIC4uLicKICAgICAgICBhdXRoIGhlYWRlci4KCiAgICA6cGFyYW0gZGlzYWJsZV9jYWNoZToKICAgICAgICBJZiBgYFRydWVgYCwgYWRkcyAnY2FjaGUtY29udHJvbDogbm8tY2FjaGUnIGhlYWRlci4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IG1ha2VfaGVhZGVycyhrZWVwX2FsaXZlPVRydWUsIHVzZXJfYWdlbnQ9IkJhdG1hbi8xLjAiKQogICAgICAgIHsnY29ubmVjdGlvbic6ICdrZWVwLWFsaXZlJywgJ3VzZXItYWdlbnQnOiAnQmF0bWFuLzEuMCd9CiAgICAgICAgPj4+IG1ha2VfaGVhZGVycyhhY2NlcHRfZW5jb2Rpbmc9VHJ1ZSkKICAgICAgICB7J2FjY2VwdC1lbmNvZGluZyc6ICdnemlwLGRlZmxhdGUnfQogICAgIiIiCiAgICBoZWFkZXJzID0ge30KICAgIGlmIGFjY2VwdF9lbmNvZGluZzoKICAgICAgICBpZiBpc2luc3RhbmNlKGFjY2VwdF9lbmNvZGluZywgc3RyKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgaXNpbnN0YW5jZShhY2NlcHRfZW5jb2RpbmcsIGxpc3QpOgogICAgICAgICAgICBhY2NlcHRfZW5jb2RpbmcgPSAnLCcuam9pbihhY2NlcHRfZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWNjZXB0X2VuY29kaW5nID0gQUNDRVBUX0VOQ09ESU5HCiAgICAgICAgaGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10gPSBhY2NlcHRfZW5jb2RpbmcKCiAgICBpZiB1c2VyX2FnZW50OgogICAgICAgIGhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9IHVzZXJfYWdlbnQKCiAgICBpZiBrZWVwX2FsaXZlOgogICAgICAgIGhlYWRlcnNbJ2Nvbm5lY3Rpb24nXSA9ICdrZWVwLWFsaXZlJwoKICAgIGlmIGJhc2ljX2F1dGg6CiAgICAgICAgaGVhZGVyc1snYXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBcCiAgICAgICAgICAgIGI2NGVuY29kZShiKGJhc2ljX2F1dGgpKS5kZWNvZGUoJ3V0Zi04JykKCiAgICBpZiBwcm94eV9iYXNpY19hdXRoOgogICAgICAgIGhlYWRlcnNbJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgXAogICAgICAgICAgICBiNjRlbmNvZGUoYihwcm94eV9iYXNpY19hdXRoKSkuZGVjb2RlKCd1dGYtOCcpCgogICAgaWYgZGlzYWJsZV9jYWNoZToKICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSAnbm8tY2FjaGUnCgogICAgcmV0dXJuIGhlYWRlcnMKCgpkZWYgc2V0X2ZpbGVfcG9zaXRpb24oYm9keSwgcG9zKToKICAgICIiIgogICAgSWYgYSBwb3NpdGlvbiBpcyBwcm92aWRlZCwgbW92ZSBmaWxlIHRvIHRoYXQgcG9pbnQuCiAgICBPdGhlcndpc2UsIHdlJ2xsIGF0dGVtcHQgdG8gcmVjb3JkIGEgcG9zaXRpb24gZm9yIGZ1dHVyZSB1c2UuCiAgICAiIiIKICAgIGlmIHBvcyBpcyBub3QgTm9uZToKICAgICAgICByZXdpbmRfYm9keShib2R5LCBwb3MpCiAgICBlbGlmIGdldGF0dHIoYm9keSwgJ3RlbGwnLCBOb25lKSBpcyBub3QgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBvcyA9IGJvZHkudGVsbCgpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgIyBUaGlzIGRpZmZlcmVudGlhdGVzIGZyb20gTm9uZSwgYWxsb3dpbmcgdXMgdG8gY2F0Y2gKICAgICAgICAgICAgIyBhIGZhaWxlZCBgdGVsbCgpYCBsYXRlciB3aGVuIHRyeWluZyB0byByZXdpbmQgdGhlIGJvZHkuCiAgICAgICAgICAgIHBvcyA9IF9GQUlMRURURUxMCgogICAgcmV0dXJuIHBvcwoKCmRlZiByZXdpbmRfYm9keShib2R5LCBib2R5X3Bvcyk6CiAgICAiIiIKICAgIEF0dGVtcHQgdG8gcmV3aW5kIGJvZHkgdG8gYSBjZXJ0YWluIHBvc2l0aW9uLgogICAgUHJpbWFyaWx5IHVzZWQgZm9yIHJlcXVlc3QgcmVkaXJlY3RzIGFuZCByZXRyaWVzLgoKICAgIDpwYXJhbSBib2R5OgogICAgICAgIEZpbGUtbGlrZSBvYmplY3QgdGhhdCBzdXBwb3J0cyBzZWVrLgoKICAgIDpwYXJhbSBpbnQgcG9zOgogICAgICAgIFBvc2l0aW9uIHRvIHNlZWsgdG8gaW4gZmlsZS4KICAgICIiIgogICAgYm9keV9zZWVrID0gZ2V0YXR0cihib2R5LCAnc2VlaycsIE5vbmUpCiAgICBpZiBib2R5X3NlZWsgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UoYm9keV9wb3MsIGludGVnZXJfdHlwZXMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgYm9keV9zZWVrKGJvZHlfcG9zKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiByZXdpbmRpbmcgcmVxdWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBmb3IgcmVkaXJlY3QvcmV0cnkuIikKICAgIGVsaWYgYm9keV9wb3MgaXMgX0ZBSUxFRFRFTEw6CiAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJVbmFibGUgdG8gcmVjb3JkIGZpbGUgcG9zaXRpb24gZm9yIHJld2luZGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGJvZHkgZHVyaW5nIGEgcmVkaXJlY3QvcmV0cnkuIikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYm9keV9wb3MgbXVzdCBiZSBvZiB0eXBlIGludGVnZXIsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkIGl0IHdhcyAlcy4iICUgdHlwZShib2R5X3BvcykpClBLAwQUAAAAAAAAACEA9DkcnycJAAAnCQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVzcG9uc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIC4ucGFja2FnZXMuc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCBhcyBodHRwbGliCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgSGVhZGVyUGFyc2luZ0Vycm9yCgoKZGVmIGlzX2ZwX2Nsb3NlZChvYmopOgogICAgIiIiCiAgICBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGZpbGUtbGlrZSBvYmplY3QgaXMgY2xvc2VkLgoKICAgIDpwYXJhbSBvYmo6CiAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgdG8gY2hlY2suCiAgICAiIiIKCiAgICB0cnk6CiAgICAgICAgIyBDaGVjayBgaXNjbG9zZWQoKWAgZmlyc3QsIGluIGNhc2UgUHl0aG9uMyBkb2Vzbid0IHNldCBgY2xvc2VkYC4KICAgICAgICAjIEdIIElzc3VlICM5MjgKICAgICAgICByZXR1cm4gb2JqLmlzY2xvc2VkKCkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgdmlhIHRoZSBvZmZpY2lhbCBmaWxlLWxpa2Utb2JqZWN0IHdheS4KICAgICAgICByZXR1cm4gb2JqLmNsb3NlZAogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBDaGVjayBpZiB0aGUgb2JqZWN0IGlzIGEgY29udGFpbmVyIGZvciBhbm90aGVyIGZpbGUtbGlrZSBvYmplY3QgdGhhdAogICAgICAgICMgZ2V0cyByZWxlYXNlZCBvbiBleGhhdXN0aW9uIChlLmcuIEhUVFBSZXNwb25zZSkuCiAgICAgICAgcmV0dXJuIG9iai5mcCBpcyBOb25lCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBmcCBpcyBjbG9zZWQuIikKCgpkZWYgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nKGhlYWRlcnMpOgogICAgIiIiCiAgICBBc3NlcnRzIHdoZXRoZXIgYWxsIGhlYWRlcnMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBwYXJzZWQuCiAgICBFeHRyYWN0cyBlbmNvdW50ZXJlZCBlcnJvcnMgZnJvbSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgaGVhZGVycy4KCiAgICBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLgoKICAgIDpwYXJhbSBoZWFkZXJzOiBIZWFkZXJzIHRvIHZlcmlmeS4KICAgIDp0eXBlIGhlYWRlcnM6IGBodHRwbGliLkhUVFBNZXNzYWdlYC4KCiAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5IZWFkZXJQYXJzaW5nRXJyb3I6CiAgICAgICAgSWYgcGFyc2luZyBlcnJvcnMgYXJlIGZvdW5kLgogICAgIiIiCgogICAgIyBUaGlzIHdpbGwgZmFpbCBzaWxlbnRseSBpZiB3ZSBwYXNzIGluIHRoZSB3cm9uZyBraW5kIG9mIHBhcmFtZXRlci4KICAgICMgVG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyIGFkZCBhbiBleHBsaWNpdCBjaGVjay4KICAgIGlmIG5vdCBpc2luc3RhbmNlKGhlYWRlcnMsIGh0dHBsaWIuSFRUUE1lc3NhZ2UpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhwZWN0ZWQgaHR0cGxpYi5NZXNzYWdlLCBnb3QgezB9LicuZm9ybWF0KAogICAgICAgICAgICB0eXBlKGhlYWRlcnMpKSkKCiAgICBkZWZlY3RzID0gZ2V0YXR0cihoZWFkZXJzLCAnZGVmZWN0cycsIE5vbmUpCiAgICBnZXRfcGF5bG9hZCA9IGdldGF0dHIoaGVhZGVycywgJ2dldF9wYXlsb2FkJywgTm9uZSkKCiAgICB1bnBhcnNlZF9kYXRhID0gTm9uZQogICAgaWYgZ2V0X3BheWxvYWQ6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMy4KICAgICAgICB1bnBhcnNlZF9kYXRhID0gZ2V0X3BheWxvYWQoKQoKICAgIGlmIGRlZmVjdHMgb3IgdW5wYXJzZWRfZGF0YToKICAgICAgICByYWlzZSBIZWFkZXJQYXJzaW5nRXJyb3IoZGVmZWN0cz1kZWZlY3RzLCB1bnBhcnNlZF9kYXRhPXVucGFyc2VkX2RhdGEpCgoKZGVmIGlzX3Jlc3BvbnNlX3RvX2hlYWQocmVzcG9uc2UpOgogICAgIiIiCiAgICBDaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdCBvZiBhIHJlc3BvbnNlIGhhcyBiZWVuIGEgSEVBRC1yZXF1ZXN0LgogICAgSGFuZGxlcyB0aGUgcXVpcmtzIG9mIEFwcEVuZ2luZS4KCiAgICA6cGFyYW0gY29ubjoKICAgIDp0eXBlIGNvbm46IDpjbGFzczpgaHR0cGxpYi5IVFRQUmVzcG9uc2VgCiAgICAiIiIKICAgICMgRklYTUU6IENhbiB3ZSBkbyB0aGlzIHNvbWVob3cgd2l0aG91dCBhY2Nlc3NpbmcgcHJpdmF0ZSBodHRwbGliIF9tZXRob2Q/CiAgICBtZXRob2QgPSByZXNwb25zZS5fbWV0aG9kCiAgICBpZiBpc2luc3RhbmNlKG1ldGhvZCwgaW50KTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcGVuZ2luZQogICAgICAgIHJldHVybiBtZXRob2QgPT0gMwogICAgcmV0dXJuIG1ldGhvZC51cHBlcigpID09ICdIRUFEJwpQSwMEFAAAAAAAAAAhAD1h79sJOQAACTkAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHRpbWUKaW1wb3J0IGxvZ2dpbmcKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgdGFrZXdoaWxlCmltcG9ydCBlbWFpbAppbXBvcnQgcmUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCAoCiAgICBDb25uZWN0VGltZW91dEVycm9yLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBSZWFkVGltZW91dEVycm9yLAogICAgUmVzcG9uc2VFcnJvciwKICAgIEludmFsaWRIZWFkZXIsCikKZnJvbSAuLnBhY2thZ2VzIGltcG9ydCBzaXgKCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgRGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyB0aGUgbWV0YWRhdGEgb2YgcmVxdWVzdHMgdGhhdCByZXN1bHQgaW4gYSByZXRyeS4KUmVxdWVzdEhpc3RvcnkgPSBuYW1lZHR1cGxlKCdSZXF1ZXN0SGlzdG9yeScsIFsibWV0aG9kIiwgInVybCIsICJlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIsICJyZWRpcmVjdF9sb2NhdGlvbiJdKQoKCmNsYXNzIFJldHJ5KG9iamVjdCk6CiAgICAiIiIgUmV0cnkgY29uZmlndXJhdGlvbi4KCiAgICBFYWNoIHJldHJ5IGF0dGVtcHQgd2lsbCBjcmVhdGUgYSBuZXcgUmV0cnkgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIHNvCiAgICB0aGV5IGNhbiBiZSBzYWZlbHkgcmV1c2VkLgoKICAgIFJldHJpZXMgY2FuIGJlIGRlZmluZWQgYXMgYSBkZWZhdWx0IGZvciBhIHBvb2w6OgoKICAgICAgICByZXRyaWVzID0gUmV0cnkoY29ubmVjdD01LCByZWFkPTIsIHJlZGlyZWN0PTUpCiAgICAgICAgaHR0cCA9IFBvb2xNYW5hZ2VyKHJldHJpZXM9cmV0cmllcykKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQoKICAgIE9yIHBlci1yZXF1ZXN0ICh3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBwb29sKTo6CgogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsIHJldHJpZXM9UmV0cnkoMTApKQoKICAgIFJldHJpZXMgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgYGBGYWxzZWBgOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgcmV0cmllcz1GYWxzZSkKCiAgICBFcnJvcnMgd2lsbCBiZSB3cmFwcGVkIGluIDpjbGFzczpgfnVybGxpYjMuZXhjZXB0aW9ucy5NYXhSZXRyeUVycm9yYCB1bmxlc3MKICAgIHJldHJpZXMgYXJlIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjYXVzaW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KCiAgICA6cGFyYW0gaW50IHRvdGFsOgogICAgICAgIFRvdGFsIG51bWJlciBvZiByZXRyaWVzIHRvIGFsbG93LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgb3RoZXIgY291bnRzLgoKICAgICAgICBTZXQgdG8gYGBOb25lYGAgdG8gcmVtb3ZlIHRoaXMgY29uc3RyYWludCBhbmQgZmFsbCBiYWNrIG9uIG90aGVyCiAgICAgICAgY291bnRzLiBJdCdzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGlzIHRvIHNvbWUgc2Vuc2libHktaGlnaCB2YWx1ZSB0bwogICAgICAgIGFjY291bnQgZm9yIHVuZXhwZWN0ZWQgZWRnZSBjYXNlcyBhbmQgYXZvaWQgaW5maW5pdGUgcmV0cnkgbG9vcHMuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeS4KCiAgICAgICAgU2V0IHRvIGBgRmFsc2VgYCB0byBkaXNhYmxlIGFuZCBpbXBseSBgYHJhaXNlX29uX3JlZGlyZWN0PUZhbHNlYGAuCgogICAgOnBhcmFtIGludCBjb25uZWN0OgogICAgICAgIEhvdyBtYW55IGNvbm5lY3Rpb24tcmVsYXRlZCBlcnJvcnMgdG8gcmV0cnkgb24uCgogICAgICAgIFRoZXNlIGFyZSBlcnJvcnMgcmFpc2VkIGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSByZW1vdGUgc2VydmVyLAogICAgICAgIHdoaWNoIHdlIGFzc3VtZSBoYXMgbm90IHRyaWdnZXJlZCB0aGUgc2VydmVyIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgOnBhcmFtIGludCByZWFkOgogICAgICAgIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IG9uIHJlYWQgZXJyb3JzLgoKICAgICAgICBUaGVzZSBlcnJvcnMgYXJlIHJhaXNlZCBhZnRlciB0aGUgcmVxdWVzdCB3YXMgc2VudCB0byB0aGUgc2VydmVyLCBzbyB0aGUKICAgICAgICByZXF1ZXN0IG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaW50IHJlZGlyZWN0OgogICAgICAgIEhvdyBtYW55IHJlZGlyZWN0cyB0byBwZXJmb3JtLiBMaW1pdCB0aGlzIHRvIGF2b2lkIGluZmluaXRlIHJlZGlyZWN0CiAgICAgICAgbG9vcHMuCgogICAgICAgIEEgcmVkaXJlY3QgaXMgYSBIVFRQIHJlc3BvbnNlIHdpdGggYSBzdGF0dXMgY29kZSAzMDEsIDMwMiwgMzAzLCAzMDcgb3IKICAgICAgICAzMDguCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgICAgIFNldCB0byBgYEZhbHNlYGAgdG8gZGlzYWJsZSBhbmQgaW1wbHkgYGByYWlzZV9vbl9yZWRpcmVjdD1GYWxzZWBgLgoKICAgIDpwYXJhbSBpbnQgc3RhdHVzOgogICAgICAgIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IG9uIGJhZCBzdGF0dXMgY29kZXMuCgogICAgICAgIFRoZXNlIGFyZSByZXRyaWVzIG1hZGUgb24gcmVzcG9uc2VzLCB3aGVyZSBzdGF0dXMgY29kZSBtYXRjaGVzCiAgICAgICAgYGBzdGF0dXNfZm9yY2VsaXN0YGAuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgOnBhcmFtIGl0ZXJhYmxlIG1ldGhvZF93aGl0ZWxpc3Q6CiAgICAgICAgU2V0IG9mIHVwcGVyY2FzZWQgSFRUUCBtZXRob2QgdmVyYnMgdGhhdCB3ZSBzaG91bGQgcmV0cnkgb24uCgogICAgICAgIEJ5IGRlZmF1bHQsIHdlIG9ubHkgcmV0cnkgb24gbWV0aG9kcyB3aGljaCBhcmUgY29uc2lkZXJlZCB0byBiZQogICAgICAgIGlkZW1wb3RlbnQgKG11bHRpcGxlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBlbmQgd2l0aCB0aGUKICAgICAgICBzYW1lIHN0YXRlKS4gU2VlIDphdHRyOmBSZXRyeS5ERUZBVUxUX01FVEhPRF9XSElURUxJU1RgLgoKICAgICAgICBTZXQgdG8gYSBgYEZhbHNlYGAgdmFsdWUgdG8gcmV0cnkgb24gYW55IHZlcmIuCgogICAgOnBhcmFtIGl0ZXJhYmxlIHN0YXR1c19mb3JjZWxpc3Q6CiAgICAgICAgQSBzZXQgb2YgaW50ZWdlciBIVFRQIHN0YXR1cyBjb2RlcyB0aGF0IHdlIHNob3VsZCBmb3JjZSBhIHJldHJ5IG9uLgogICAgICAgIEEgcmV0cnkgaXMgaW5pdGlhdGVkIGlmIHRoZSByZXF1ZXN0IG1ldGhvZCBpcyBpbiBgYG1ldGhvZF93aGl0ZWxpc3RgYAogICAgICAgIGFuZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgaW4gYGBzdGF0dXNfZm9yY2VsaXN0YGAuCgogICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgaXMgZGlzYWJsZWQgd2l0aCBgYE5vbmVgYC4KCiAgICA6cGFyYW0gZmxvYXQgYmFja29mZl9mYWN0b3I6CiAgICAgICAgQSBiYWNrb2ZmIGZhY3RvciB0byBhcHBseSBiZXR3ZWVuIGF0dGVtcHRzIGFmdGVyIHRoZSBzZWNvbmQgdHJ5CiAgICAgICAgKG1vc3QgZXJyb3JzIGFyZSByZXNvbHZlZCBpbW1lZGlhdGVseSBieSBhIHNlY29uZCB0cnkgd2l0aG91dCBhCiAgICAgICAgZGVsYXkpLiB1cmxsaWIzIHdpbGwgc2xlZXAgZm9yOjoKCiAgICAgICAgICAgIHtiYWNrb2ZmIGZhY3Rvcn0gKiAoMiBeICh7bnVtYmVyIG9mIHRvdGFsIHJldHJpZXN9IC0gMSkpCgogICAgICAgIHNlY29uZHMuIElmIHRoZSBiYWNrb2ZmX2ZhY3RvciBpcyAwLjEsIHRoZW4gOmZ1bmM6YC5zbGVlcGAgd2lsbCBzbGVlcAogICAgICAgIGZvciBbMC4wcywgMC4ycywgMC40cywgLi4uXSBiZXR3ZWVuIHJldHJpZXMuIEl0IHdpbGwgbmV2ZXIgYmUgbG9uZ2VyCiAgICAgICAgdGhhbiA6YXR0cjpgUmV0cnkuQkFDS09GRl9NQVhgLgoKICAgICAgICBCeSBkZWZhdWx0LCBiYWNrb2ZmIGlzIGRpc2FibGVkIChzZXQgdG8gMCkuCgogICAgOnBhcmFtIGJvb2wgcmFpc2Vfb25fcmVkaXJlY3Q6IFdoZXRoZXIsIGlmIHRoZSBudW1iZXIgb2YgcmVkaXJlY3RzIGlzCiAgICAgICAgZXhoYXVzdGVkLCB0byByYWlzZSBhIE1heFJldHJ5RXJyb3IsIG9yIHRvIHJldHVybiBhIHJlc3BvbnNlIHdpdGggYQogICAgICAgIHJlc3BvbnNlIGNvZGUgaW4gdGhlIDN4eCByYW5nZS4KCiAgICA6cGFyYW0gYm9vbCByYWlzZV9vbl9zdGF0dXM6IFNpbWlsYXIgbWVhbmluZyB0byBgYHJhaXNlX29uX3JlZGlyZWN0YGA6CiAgICAgICAgd2hldGhlciB3ZSBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLCBvciByZXR1cm4gYSByZXNwb25zZSwKICAgICAgICBpZiBzdGF0dXMgZmFsbHMgaW4gYGBzdGF0dXNfZm9yY2VsaXN0YGAgcmFuZ2UgYW5kIHJldHJpZXMgaGF2ZQogICAgICAgIGJlZW4gZXhoYXVzdGVkLgoKICAgIDpwYXJhbSB0dXBsZSBoaXN0b3J5OiBUaGUgaGlzdG9yeSBvZiB0aGUgcmVxdWVzdCBlbmNvdW50ZXJlZCBkdXJpbmcKICAgICAgICBlYWNoIGNhbGwgdG8gOm1ldGg6YH5SZXRyeS5pbmNyZW1lbnRgLiBUaGUgbGlzdCBpcyBpbiB0aGUgb3JkZXIKICAgICAgICB0aGUgcmVxdWVzdHMgb2NjdXJyZWQuIEVhY2ggbGlzdCBpdGVtIGlzIG9mIGNsYXNzIDpjbGFzczpgUmVxdWVzdEhpc3RvcnlgLgoKICAgIDpwYXJhbSBib29sIHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyOgogICAgICAgIFdoZXRoZXIgdG8gcmVzcGVjdCBSZXRyeS1BZnRlciBoZWFkZXIgb24gc3RhdHVzIGNvZGVzIGRlZmluZWQgYXMKICAgICAgICA6YXR0cjpgUmV0cnkuUkVUUllfQUZURVJfU1RBVFVTX0NPREVTYCBvciBub3QuCgogICAgIiIiCgogICAgREVGQVVMVF9NRVRIT0RfV0hJVEVMSVNUID0gZnJvemVuc2V0KFsKICAgICAgICAnSEVBRCcsICdHRVQnLCAnUFVUJywgJ0RFTEVURScsICdPUFRJT05TJywgJ1RSQUNFJ10pCgogICAgUkVUUllfQUZURVJfU1RBVFVTX0NPREVTID0gZnJvemVuc2V0KFs0MTMsIDQyOSwgNTAzXSkKCiAgICAjOiBNYXhpbXVtIGJhY2tvZmYgdGltZS4KICAgIEJBQ0tPRkZfTUFYID0gMTIwCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsPTEwLCBjb25uZWN0PU5vbmUsIHJlYWQ9Tm9uZSwgcmVkaXJlY3Q9Tm9uZSwgc3RhdHVzPU5vbmUsCiAgICAgICAgICAgICAgICAgbWV0aG9kX3doaXRlbGlzdD1ERUZBVUxUX01FVEhPRF9XSElURUxJU1QsIHN0YXR1c19mb3JjZWxpc3Q9Tm9uZSwKICAgICAgICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj0wLCByYWlzZV9vbl9yZWRpcmVjdD1UcnVlLCByYWlzZV9vbl9zdGF0dXM9VHJ1ZSwKICAgICAgICAgICAgICAgICBoaXN0b3J5PU5vbmUsIHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyPVRydWUpOgoKICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKICAgICAgICBzZWxmLmNvbm5lY3QgPSBjb25uZWN0CiAgICAgICAgc2VsZi5yZWFkID0gcmVhZAogICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCgogICAgICAgIGlmIHJlZGlyZWN0IGlzIEZhbHNlIG9yIHRvdGFsIGlzIEZhbHNlOgogICAgICAgICAgICByZWRpcmVjdCA9IDAKICAgICAgICAgICAgcmFpc2Vfb25fcmVkaXJlY3QgPSBGYWxzZQoKICAgICAgICBzZWxmLnJlZGlyZWN0ID0gcmVkaXJlY3QKICAgICAgICBzZWxmLnN0YXR1c19mb3JjZWxpc3QgPSBzdGF0dXNfZm9yY2VsaXN0IG9yIHNldCgpCiAgICAgICAgc2VsZi5tZXRob2Rfd2hpdGVsaXN0ID0gbWV0aG9kX3doaXRlbGlzdAogICAgICAgIHNlbGYuYmFja29mZl9mYWN0b3IgPSBiYWNrb2ZmX2ZhY3RvcgogICAgICAgIHNlbGYucmFpc2Vfb25fcmVkaXJlY3QgPSByYWlzZV9vbl9yZWRpcmVjdAogICAgICAgIHNlbGYucmFpc2Vfb25fc3RhdHVzID0gcmFpc2Vfb25fc3RhdHVzCiAgICAgICAgc2VsZi5oaXN0b3J5ID0gaGlzdG9yeSBvciB0dXBsZSgpCiAgICAgICAgc2VsZi5yZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlciA9IHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyCgogICAgZGVmIG5ldyhzZWxmLCAqKmt3KToKICAgICAgICBwYXJhbXMgPSBkaWN0KAogICAgICAgICAgICB0b3RhbD1zZWxmLnRvdGFsLAogICAgICAgICAgICBjb25uZWN0PXNlbGYuY29ubmVjdCwgcmVhZD1zZWxmLnJlYWQsIHJlZGlyZWN0PXNlbGYucmVkaXJlY3QsIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgICAgICAgICAgbWV0aG9kX3doaXRlbGlzdD1zZWxmLm1ldGhvZF93aGl0ZWxpc3QsCiAgICAgICAgICAgIHN0YXR1c19mb3JjZWxpc3Q9c2VsZi5zdGF0dXNfZm9yY2VsaXN0LAogICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj1zZWxmLmJhY2tvZmZfZmFjdG9yLAogICAgICAgICAgICByYWlzZV9vbl9yZWRpcmVjdD1zZWxmLnJhaXNlX29uX3JlZGlyZWN0LAogICAgICAgICAgICByYWlzZV9vbl9zdGF0dXM9c2VsZi5yYWlzZV9vbl9zdGF0dXMsCiAgICAgICAgICAgIGhpc3Rvcnk9c2VsZi5oaXN0b3J5LAogICAgICAgICkKICAgICAgICBwYXJhbXMudXBkYXRlKGt3KQogICAgICAgIHJldHVybiB0eXBlKHNlbGYpKCoqcGFyYW1zKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21faW50KGNscywgcmV0cmllcywgcmVkaXJlY3Q9VHJ1ZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAiIiIgQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgcmV0cmllcyBmb3JtYXQuIiIiCiAgICAgICAgaWYgcmV0cmllcyBpcyBOb25lOgogICAgICAgICAgICByZXRyaWVzID0gZGVmYXVsdCBpZiBkZWZhdWx0IGlzIG5vdCBOb25lIGVsc2UgY2xzLkRFRkFVTFQKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHVybiByZXRyaWVzCgogICAgICAgIHJlZGlyZWN0ID0gYm9vbChyZWRpcmVjdCkgYW5kIE5vbmUKICAgICAgICBuZXdfcmV0cmllcyA9IGNscyhyZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCkKICAgICAgICBsb2cuZGVidWcoIkNvbnZlcnRlZCByZXRyaWVzIHZhbHVlOiAlciAtPiAlciIsIHJldHJpZXMsIG5ld19yZXRyaWVzKQogICAgICAgIHJldHVybiBuZXdfcmV0cmllcwoKICAgIGRlZiBnZXRfYmFja29mZl90aW1lKHNlbGYpOgogICAgICAgICIiIiBGb3JtdWxhIGZvciBjb21wdXRpbmcgdGhlIGN1cnJlbnQgYmFja29mZgoKICAgICAgICA6cnR5cGU6IGZsb2F0CiAgICAgICAgIiIiCiAgICAgICAgIyBXZSB3YW50IHRvIGNvbnNpZGVyIG9ubHkgdGhlIGxhc3QgY29uc2VjdXRpdmUgZXJyb3JzIHNlcXVlbmNlIChJZ25vcmUgcmVkaXJlY3RzKS4KICAgICAgICBjb25zZWN1dGl2ZV9lcnJvcnNfbGVuID0gbGVuKGxpc3QodGFrZXdoaWxlKGxhbWJkYSB4OiB4LnJlZGlyZWN0X2xvY2F0aW9uIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZChzZWxmLmhpc3RvcnkpKSkpCiAgICAgICAgaWYgY29uc2VjdXRpdmVfZXJyb3JzX2xlbiA8PSAxOgogICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICBiYWNrb2ZmX3ZhbHVlID0gc2VsZi5iYWNrb2ZmX2ZhY3RvciAqICgyICoqIChjb25zZWN1dGl2ZV9lcnJvcnNfbGVuIC0gMSkpCiAgICAgICAgcmV0dXJuIG1pbihzZWxmLkJBQ0tPRkZfTUFYLCBiYWNrb2ZmX3ZhbHVlKQoKICAgIGRlZiBwYXJzZV9yZXRyeV9hZnRlcihzZWxmLCByZXRyeV9hZnRlcik6CiAgICAgICAgIyBXaGl0ZXNwYWNlOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi40CiAgICAgICAgaWYgcmUubWF0Y2gociJeXHMqWzAtOV0rXHMqJCIsIHJldHJ5X2FmdGVyKToKICAgICAgICAgICAgc2Vjb25kcyA9IGludChyZXRyeV9hZnRlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXRyeV9kYXRlX3R1cGxlID0gZW1haWwudXRpbHMucGFyc2VkYXRlKHJldHJ5X2FmdGVyKQogICAgICAgICAgICBpZiByZXRyeV9kYXRlX3R1cGxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJJbnZhbGlkIFJldHJ5LUFmdGVyIGhlYWRlcjogJXMiICUgcmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIHJldHJ5X2RhdGUgPSB0aW1lLm1rdGltZShyZXRyeV9kYXRlX3R1cGxlKQogICAgICAgICAgICBzZWNvbmRzID0gcmV0cnlfZGF0ZSAtIHRpbWUudGltZSgpCgogICAgICAgIGlmIHNlY29uZHMgPCAwOgogICAgICAgICAgICBzZWNvbmRzID0gMAoKICAgICAgICByZXR1cm4gc2Vjb25kcwoKICAgIGRlZiBnZXRfcmV0cnlfYWZ0ZXIoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIG9mIFJldHJ5LUFmdGVyIGluIHNlY29uZHMuICIiIgoKICAgICAgICByZXRyeV9hZnRlciA9IHJlc3BvbnNlLmdldGhlYWRlcigiUmV0cnktQWZ0ZXIiKQoKICAgICAgICBpZiByZXRyeV9hZnRlciBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9yZXRyeV9hZnRlcihyZXRyeV9hZnRlcikKCiAgICBkZWYgc2xlZXBfZm9yX3JldHJ5KHNlbGYsIHJlc3BvbnNlPU5vbmUpOgogICAgICAgIHJldHJ5X2FmdGVyID0gc2VsZi5nZXRfcmV0cnlfYWZ0ZXIocmVzcG9uc2UpCiAgICAgICAgaWYgcmV0cnlfYWZ0ZXI6CiAgICAgICAgICAgIHRpbWUuc2xlZXAocmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfc2xlZXBfYmFja29mZihzZWxmKToKICAgICAgICBiYWNrb2ZmID0gc2VsZi5nZXRfYmFja29mZl90aW1lKCkKICAgICAgICBpZiBiYWNrb2ZmIDw9IDA6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRpbWUuc2xlZXAoYmFja29mZikKCiAgICBkZWYgc2xlZXAoc2VsZiwgcmVzcG9uc2U9Tm9uZSk6CiAgICAgICAgIiIiIFNsZWVwIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuCgogICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcmVzcGVjdCBhIHNlcnZlcidzIGBgUmV0cnktQWZ0ZXJgYCByZXNwb25zZSBoZWFkZXIKICAgICAgICBhbmQgc2xlZXAgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lIHJlcXVlc3RlZC4gSWYgdGhhdCBpcyBub3QgcHJlc2VudCwgaXQKICAgICAgICB3aWxsIHVzZSBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLiBCeSBkZWZhdWx0LCB0aGUgYmFja29mZiBmYWN0b3IgaXMgMCBhbmQKICAgICAgICB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KICAgICAgICAiIiIKCiAgICAgICAgaWYgcmVzcG9uc2U6CiAgICAgICAgICAgIHNsZXB0ID0gc2VsZi5zbGVlcF9mb3JfcmV0cnkocmVzcG9uc2UpCiAgICAgICAgICAgIGlmIHNsZXB0OgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX3NsZWVwX2JhY2tvZmYoKQoKICAgIGRlZiBfaXNfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlcnIpOgogICAgICAgICIiIiBFcnJvcnMgd2hlbiB3ZSdyZSBmYWlybHkgc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgZGlkIG5vdCByZWNlaXZlIHRoZQogICAgICAgIHJlcXVlc3QsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIHJldHJ5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKGVyciwgQ29ubmVjdFRpbWVvdXRFcnJvcikKCiAgICBkZWYgX2lzX3JlYWRfZXJyb3Ioc2VsZiwgZXJyKToKICAgICAgICAiIiIgRXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3RhcnRlZCwgc28gd2Ugc2hvdWxkCiAgICAgICAgYXNzdW1lIHRoYXQgdGhlIHNlcnZlciBiZWdhbiBwcm9jZXNzaW5nIGl0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKGVyciwgKFJlYWRUaW1lb3V0RXJyb3IsIFByb3RvY29sRXJyb3IpKQoKICAgIGRlZiBfaXNfbWV0aG9kX3JldHJ5YWJsZShzZWxmLCBtZXRob2QpOgogICAgICAgICIiIiBDaGVja3MgaWYgYSBnaXZlbiBIVFRQIG1ldGhvZCBzaG91bGQgYmUgcmV0cmllZCB1cG9uLCBkZXBlbmRpbmcgaWYKICAgICAgICBpdCBpcyBpbmNsdWRlZCBvbiB0aGUgbWV0aG9kIHdoaXRlbGlzdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLm1ldGhvZF93aGl0ZWxpc3QgYW5kIG1ldGhvZC51cHBlcigpIG5vdCBpbiBzZWxmLm1ldGhvZF93aGl0ZWxpc3Q6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBpc19yZXRyeShzZWxmLCBtZXRob2QsIHN0YXR1c19jb2RlLCBoYXNfcmV0cnlfYWZ0ZXI9RmFsc2UpOgogICAgICAgICIiIiBJcyB0aGlzIG1ldGhvZC9zdGF0dXMgY29kZSByZXRyeWFibGU/IChCYXNlZCBvbiB3aGl0ZWxpc3RzIGFuZCBjb250cm9sCiAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiB0b3RhbCByZXRyaWVzIHRvIGFsbG93LCB3aGV0aGVyIHRvCiAgICAgICAgcmVzcGVjdCB0aGUgUmV0cnktQWZ0ZXIgaGVhZGVyLCB3aGV0aGVyIHRoaXMgaGVhZGVyIGlzIHByZXNlbnQsIGFuZAogICAgICAgIHdoZXRoZXIgdGhlIHJldHVybmVkIHN0YXR1cyBjb2RlIGlzIG9uIHRoZSBsaXN0IG9mIHN0YXR1cyBjb2RlcyB0bwogICAgICAgIGJlIHJldHJpZWQgdXBvbiBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGFmb3JlbWVudGlvbmVkIGhlYWRlcikKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5faXNfbWV0aG9kX3JldHJ5YWJsZShtZXRob2QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgc2VsZi5zdGF0dXNfZm9yY2VsaXN0IGFuZCBzdGF0dXNfY29kZSBpbiBzZWxmLnN0YXR1c19mb3JjZWxpc3Q6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiAoc2VsZi50b3RhbCBhbmQgc2VsZi5yZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlciBhbmQKICAgICAgICAgICAgICAgIGhhc19yZXRyeV9hZnRlciBhbmQgKHN0YXR1c19jb2RlIGluIHNlbGYuUkVUUllfQUZURVJfU1RBVFVTX0NPREVTKSkKCiAgICBkZWYgaXNfZXhoYXVzdGVkKHNlbGYpOgogICAgICAgICIiIiBBcmUgd2Ugb3V0IG9mIHJldHJpZXM/ICIiIgogICAgICAgIHJldHJ5X2NvdW50cyA9IChzZWxmLnRvdGFsLCBzZWxmLmNvbm5lY3QsIHNlbGYucmVhZCwgc2VsZi5yZWRpcmVjdCwgc2VsZi5zdGF0dXMpCiAgICAgICAgcmV0cnlfY291bnRzID0gbGlzdChmaWx0ZXIoTm9uZSwgcmV0cnlfY291bnRzKSkKICAgICAgICBpZiBub3QgcmV0cnlfY291bnRzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIG1pbihyZXRyeV9jb3VudHMpIDwgMAoKICAgIGRlZiBpbmNyZW1lbnQoc2VsZiwgbWV0aG9kPU5vbmUsIHVybD1Ob25lLCByZXNwb25zZT1Ob25lLCBlcnJvcj1Ob25lLAogICAgICAgICAgICAgICAgICBfcG9vbD1Ob25lLCBfc3RhY2t0cmFjZT1Ob25lKToKICAgICAgICAiIiIgUmV0dXJuIGEgbmV3IFJldHJ5IG9iamVjdCB3aXRoIGluY3JlbWVudGVkIHJldHJ5IGNvdW50ZXJzLgoKICAgICAgICA6cGFyYW0gcmVzcG9uc2U6IEEgcmVzcG9uc2Ugb2JqZWN0LCBvciBOb25lLCBpZiB0aGUgc2VydmVyIGRpZCBub3QKICAgICAgICAgICAgcmV0dXJuIGEgcmVzcG9uc2UuCiAgICAgICAgOnR5cGUgcmVzcG9uc2U6IDpjbGFzczpgfnVybGxpYjMucmVzcG9uc2UuSFRUUFJlc3BvbnNlYAogICAgICAgIDpwYXJhbSBFeGNlcHRpb24gZXJyb3I6IEFuIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB0aGUgcmVxdWVzdCwgb3IKICAgICAgICAgICAgTm9uZSBpZiB0aGUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KCiAgICAgICAgOnJldHVybjogQSBuZXcgYGBSZXRyeWBgIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnRvdGFsIGlzIEZhbHNlIGFuZCBlcnJvcjoKICAgICAgICAgICAgIyBEaXNhYmxlZCwgaW5kaWNhdGUgdG8gcmUtcmFpc2UgdGhlIGVycm9yLgogICAgICAgICAgICByYWlzZSBzaXgucmVyYWlzZSh0eXBlKGVycm9yKSwgZXJyb3IsIF9zdGFja3RyYWNlKQoKICAgICAgICB0b3RhbCA9IHNlbGYudG90YWwKICAgICAgICBpZiB0b3RhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdG90YWwgLT0gMQoKICAgICAgICBjb25uZWN0ID0gc2VsZi5jb25uZWN0CiAgICAgICAgcmVhZCA9IHNlbGYucmVhZAogICAgICAgIHJlZGlyZWN0ID0gc2VsZi5yZWRpcmVjdAogICAgICAgIHN0YXR1c19jb3VudCA9IHNlbGYuc3RhdHVzCiAgICAgICAgY2F1c2UgPSAndW5rbm93bicKICAgICAgICBzdGF0dXMgPSBOb25lCiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSBOb25lCgogICAgICAgIGlmIGVycm9yIGFuZCBzZWxmLl9pc19jb25uZWN0aW9uX2Vycm9yKGVycm9yKToKICAgICAgICAgICAgIyBDb25uZWN0IHJldHJ5PwogICAgICAgICAgICBpZiBjb25uZWN0IGlzIEZhbHNlOgogICAgICAgICAgICAgICAgcmFpc2Ugc2l4LnJlcmFpc2UodHlwZShlcnJvciksIGVycm9yLCBfc3RhY2t0cmFjZSkKICAgICAgICAgICAgZWxpZiBjb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY29ubmVjdCAtPSAxCgogICAgICAgIGVsaWYgZXJyb3IgYW5kIHNlbGYuX2lzX3JlYWRfZXJyb3IoZXJyb3IpOgogICAgICAgICAgICAjIFJlYWQgcmV0cnk/CiAgICAgICAgICAgIGlmIHJlYWQgaXMgRmFsc2Ugb3Igbm90IHNlbGYuX2lzX21ldGhvZF9yZXRyeWFibGUobWV0aG9kKToKICAgICAgICAgICAgICAgIHJhaXNlIHNpeC5yZXJhaXNlKHR5cGUoZXJyb3IpLCBlcnJvciwgX3N0YWNrdHJhY2UpCiAgICAgICAgICAgIGVsaWYgcmVhZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlYWQgLT0gMQoKICAgICAgICBlbGlmIHJlc3BvbnNlIGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKToKICAgICAgICAgICAgIyBSZWRpcmVjdCByZXRyeT8KICAgICAgICAgICAgaWYgcmVkaXJlY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZWRpcmVjdCAtPSAxCiAgICAgICAgICAgIGNhdXNlID0gJ3RvbyBtYW55IHJlZGlyZWN0cycKICAgICAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXMKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJbmNyZW1lbnRpbmcgYmVjYXVzZSBvZiBhIHNlcnZlciBlcnJvciBsaWtlIGEgNTAwIGluCiAgICAgICAgICAgICMgc3RhdHVzX2ZvcmNlbGlzdCBhbmQgYSB0aGUgZ2l2ZW4gbWV0aG9kIGlzIGluIHRoZSB3aGl0ZWxpc3QKICAgICAgICAgICAgY2F1c2UgPSBSZXNwb25zZUVycm9yLkdFTkVSSUNfRVJST1IKICAgICAgICAgICAgaWYgcmVzcG9uc2UgYW5kIHJlc3BvbnNlLnN0YXR1czoKICAgICAgICAgICAgICAgIGlmIHN0YXR1c19jb3VudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY291bnQgLT0gMQogICAgICAgICAgICAgICAgY2F1c2UgPSBSZXNwb25zZUVycm9yLlNQRUNJRklDX0VSUk9SLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY29kZT1yZXNwb25zZS5zdGF0dXMpCiAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXMKCiAgICAgICAgaGlzdG9yeSA9IHNlbGYuaGlzdG9yeSArIChSZXF1ZXN0SGlzdG9yeShtZXRob2QsIHVybCwgZXJyb3IsIHN0YXR1cywgcmVkaXJlY3RfbG9jYXRpb24pLCkKCiAgICAgICAgbmV3X3JldHJ5ID0gc2VsZi5uZXcoCiAgICAgICAgICAgIHRvdGFsPXRvdGFsLAogICAgICAgICAgICBjb25uZWN0PWNvbm5lY3QsIHJlYWQ9cmVhZCwgcmVkaXJlY3Q9cmVkaXJlY3QsIHN0YXR1cz1zdGF0dXNfY291bnQsCiAgICAgICAgICAgIGhpc3Rvcnk9aGlzdG9yeSkKCiAgICAgICAgaWYgbmV3X3JldHJ5LmlzX2V4aGF1c3RlZCgpOgogICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKF9wb29sLCB1cmwsIGVycm9yIG9yIFJlc3BvbnNlRXJyb3IoY2F1c2UpKQoKICAgICAgICBsb2cuZGVidWcoIkluY3JlbWVudGVkIFJldHJ5IGZvciAodXJsPSclcycpOiAlciIsIHVybCwgbmV3X3JldHJ5KQoKICAgICAgICByZXR1cm4gbmV3X3JldHJ5CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoJ3tjbHMuX19uYW1lX199KHRvdGFsPXtzZWxmLnRvdGFsfSwgY29ubmVjdD17c2VsZi5jb25uZWN0fSwgJwogICAgICAgICAgICAgICAgJ3JlYWQ9e3NlbGYucmVhZH0sIHJlZGlyZWN0PXtzZWxmLnJlZGlyZWN0fSwgc3RhdHVzPXtzZWxmLnN0YXR1c30pJykuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIGNscz10eXBlKHNlbGYpLCBzZWxmPXNlbGYpCgoKIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGVxdWl2YWxlbnQgdG8gcHJlLXYxLjkpOgpSZXRyeS5ERUZBVUxUID0gUmV0cnkoMykKUEsDBBQAAAAAAAAAIQB9zzs9m1IAAJtSAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zZWxlY3RvcnMucHkjIEJhY2twb3J0IG9mIHNlbGVjdG9ycy5weSBmcm9tIFB5dGhvbiAzLjUrIHRvIHN1cHBvcnQgUHl0aG9uIDwgMy40CiMgQWxzbyBoYXMgdGhlIGJlaGF2aW9yIHNwZWNpZmllZCBpbiBQRVAgNDc1IHdoaWNoIGlzIHRvIHJldHJ5IHN5c2NhbGxzCiMgaW4gdGhlIGNhc2Ugb2YgYW4gRUlOVFIgZXJyb3IuIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGJlY2F1c2Ugc2VsZWN0b3JzMzQKIyBkb2VzIG5vdCBmb2xsb3cgdGhpcyBiZWhhdmlvciBhbmQgaW5zdGVhZCByZXR1cm5zIHRoYXQgbm8gZGlsZSBkZXNjcmlwdG9yCiMgZXZlbnRzIGhhdmUgb2NjdXJyZWQgcmF0aGVyIHRoYW4gcmV0cnkgdGhlIHN5c2NhbGwuIFRoZSBkZWNpc2lvbiB0byBkcm9wCiMgc3VwcG9ydCBmb3Igc2VsZWN0LmRldnBvbGwgaXMgbWFkZSB0byBtYWludGFpbiAxMDAlIHRlc3QgY292ZXJhZ2UuCgppbXBvcnQgZXJybm8KaW1wb3J0IG1hdGgKaW1wb3J0IHNlbGVjdAppbXBvcnQgc29ja2V0CmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSwgTWFwcGluZwoKdHJ5OgogICAgbW9ub3RvbmljID0gdGltZS5tb25vdG9uaWMKZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOiAgIyBQeXRob24gMy4zPAogICAgbW9ub3RvbmljID0gdGltZS50aW1lCgpFVkVOVF9SRUFEID0gKDEgPDwgMCkKRVZFTlRfV1JJVEUgPSAoMSA8PCAxKQoKSEFTX1NFTEVDVCA9IFRydWUgICMgVmFyaWFibGUgdGhhdCBzaG93cyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBoYXMgYSBzZWxlY3Rvci4KX1NZU0NBTExfU0VOVElORUwgPSBvYmplY3QoKSAgIyBTZW50aW5lbCBpbiBjYXNlIGEgc3lzdGVtIGNhbGwgcmV0dXJucyBOb25lLgpfREVGQVVMVF9TRUxFQ1RPUiA9IE5vbmUKCgpjbGFzcyBTZWxlY3RvckVycm9yKEV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyY29kZSk6CiAgICAgICAgc3VwZXIoU2VsZWN0b3JFcnJvciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybm8gPSBlcnJjb2RlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFNlbGVjdG9yRXJyb3IgZXJybm89ezB9PiIuZm9ybWF0KHNlbGYuZXJybm8pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19yZXByX18oKQoKCmRlZiBfZmlsZW9ial90b19mZChmaWxlb2JqKToKICAgICIiIiBSZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIGZpbGUgb2JqZWN0LiBJZgogICAgZ2l2ZW4gYW4gaW50ZWdlciB3aWxsIHNpbXBseSByZXR1cm4gdGhhdCBpbnRlZ2VyIGJhY2suICIiIgogICAgaWYgaXNpbnN0YW5jZShmaWxlb2JqLCBpbnQpOgogICAgICAgIGZkID0gZmlsZW9iagogICAgZWxzZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZkID0gaW50KGZpbGVvYmouZmlsZW5vKCkpCiAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlIG9iamVjdDogezAhcn0iLmZvcm1hdChmaWxlb2JqKSkKICAgIGlmIGZkIDwgMDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogezB9Ii5mb3JtYXQoZmQpKQogICAgcmV0dXJuIGZkCgoKIyBEZXRlcm1pbmUgd2hpY2ggZnVuY3Rpb24gdG8gdXNlIHRvIHdyYXAgc3lzdGVtIGNhbGxzIGJlY2F1c2UgUHl0aG9uIDMuNSsKIyBhbHJlYWR5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBzeXN0ZW0gY2FsbHMgYXJlIGludGVycnVwdGVkLgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA1KToKICAgIGRlZiBfc3lzY2FsbF93cmFwcGVyKGZ1bmMsIF8sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiIFRoaXMgaXMgdGhlIHNob3J0LWNpcmN1aXQgdmVyc2lvbiBvZiB0aGUgYmVsb3cgbG9naWMKICAgICAgICBiZWNhdXNlIGluIFB5dGhvbiAzLjUrIGFsbCBzeXN0ZW0gY2FsbHMgYXV0b21hdGljYWxseSByZXN0YXJ0CiAgICAgICAgYW5kIHJlY2FsY3VsYXRlIHRoZWlyIHRpbWVvdXRzLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyY29kZSA9IE5vbmUKICAgICAgICAgICAgaWYgaGFzYXR0cihlLCAiZXJybm8iKToKICAgICAgICAgICAgICAgIGVycmNvZGUgPSBlLmVycm5vCiAgICAgICAgICAgIHJhaXNlIFNlbGVjdG9yRXJyb3IoZXJyY29kZSkKZWxzZToKICAgIGRlZiBfc3lzY2FsbF93cmFwcGVyKGZ1bmMsIHJlY2FsY190aW1lb3V0LCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzeXNjYWxscyB0aGF0IGNvdWxkIGZhaWwgZHVlIHRvIEVJTlRSLgogICAgICAgIEFsbCBmdW5jdGlvbnMgc2hvdWxkIGJlIHJldHJpZWQgaWYgdGhlcmUgaXMgdGltZSBsZWZ0IGluIHRoZSB0aW1lb3V0CiAgICAgICAgaW4gYWNjb3JkYW5jZSB3aXRoIFBFUCA0NzUuICIiIgogICAgICAgIHRpbWVvdXQgPSBrd2FyZ3MuZ2V0KCJ0aW1lb3V0IiwgTm9uZSkKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIGV4cGlyZXMgPSBOb25lCiAgICAgICAgICAgIHJlY2FsY190aW1lb3V0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICB0aW1lb3V0ID0gZmxvYXQodGltZW91dCkKICAgICAgICAgICAgaWYgdGltZW91dCA8IDAuMDogICMgVGltZW91dCBsZXNzIHRoYW4gMCB0cmVhdGVkIGFzIG5vIHRpbWVvdXQuCiAgICAgICAgICAgICAgICBleHBpcmVzID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXhwaXJlcyA9IG1vbm90b25pYygpICsgdGltZW91dAoKICAgICAgICBhcmdzID0gbGlzdChhcmdzKQogICAgICAgIGlmIHJlY2FsY190aW1lb3V0IGFuZCAidGltZW91dCIgbm90IGluIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJUaW1lb3V0IG11c3QgYmUgaW4gYXJncyBvciBrd2FyZ3MgdG8gYmUgcmVjYWxjdWxhdGVkIikKCiAgICAgICAgcmVzdWx0ID0gX1NZU0NBTExfU0VOVElORUwKICAgICAgICB3aGlsZSByZXN1bHQgaXMgX1NZU0NBTExfU0VOVElORUw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICAjIE9TRXJyb3IgaXMgdGhyb3duIGJ5IHNlbGVjdC5zZWxlY3QKICAgICAgICAgICAgIyBJT0Vycm9yIGlzIHRocm93biBieSBzZWxlY3QuZXBvbGwucG9sbAogICAgICAgICAgICAjIHNlbGVjdC5lcnJvciBpcyB0aHJvd24gYnkgc2VsZWN0LnBvbGwucG9sbAogICAgICAgICAgICAjIEFyZW4ndCB3ZSB0aGFua2Z1bCBmb3IgUHl0aG9uIDMueCByZXdvcmsgZm9yIGV4Y2VwdGlvbnM/CiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgc2VsZWN0LmVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgIyBzZWxlY3QuZXJyb3Igd2Fzbid0IGEgc3ViY2xhc3Mgb2YgT1NFcnJvciBpbiB0aGUgcGFzdC4KICAgICAgICAgICAgICAgIGVycmNvZGUgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGUsICJlcnJubyIpOgogICAgICAgICAgICAgICAgICAgIGVycmNvZGUgPSBlLmVycm5vCiAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoZSwgImFyZ3MiKToKICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5hcmdzWzBdCgogICAgICAgICAgICAgICAgIyBBbHNvIHRlc3QgZm9yIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgRUlOVFIuCiAgICAgICAgICAgICAgICBpc19pbnRlcnJ1cHQgPSAoZXJyY29kZSA9PSBlcnJuby5FSU5UUiBvciAoaGFzYXR0cihlcnJubywgIldTQUVJTlRSIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9PSBlcnJuby5XU0FFSU5UUikpCgogICAgICAgICAgICAgICAgaWYgaXNfaW50ZXJydXB0OgogICAgICAgICAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IG1vbm90b25pYygpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfdGltZSA+IGV4cGlyZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKGVycm5vPWVycm5vLkVUSU1FRE9VVCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVjYWxjX3RpbWVvdXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAidGltZW91dCIgaW4ga3dhcmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJnc1sidGltZW91dCJdID0gZXhwaXJlcyAtIGN1cnJlbnRfdGltZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBlcnJjb2RlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFNlbGVjdG9yRXJyb3IoZXJyY29kZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgoKU2VsZWN0b3JLZXkgPSBuYW1lZHR1cGxlKCdTZWxlY3RvcktleScsIFsnZmlsZW9iaicsICdmZCcsICdldmVudHMnLCAnZGF0YSddKQoKCmNsYXNzIF9TZWxlY3Rvck1hcHBpbmcoTWFwcGluZyk6CiAgICAiIiIgTWFwcGluZyBvZiBmaWxlIG9iamVjdHMgdG8gc2VsZWN0b3Iga2V5cyAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2VsZWN0b3IpOgogICAgICAgIHNlbGYuX3NlbGVjdG9yID0gc2VsZWN0b3IKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXkpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGZpbGVvYmopOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBzZWxmLl9zZWxlY3Rvci5fZmlsZW9ial9sb29rdXAoZmlsZW9iaikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXlbZmRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQuIi5mb3JtYXQoZmlsZW9iaikpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXkpCgoKY2xhc3MgQmFzZVNlbGVjdG9yKG9iamVjdCk6CiAgICAiIiIgQWJzdHJhY3QgU2VsZWN0b3IgY2xhc3MKCiAgICBBIHNlbGVjdG9yIHN1cHBvcnRzIHJlZ2lzdGVyaW5nIGZpbGUgb2JqZWN0cyB0byBiZSBtb25pdG9yZWQKICAgIGZvciBzcGVjaWZpYyBJL08gZXZlbnRzLgoKICAgIEEgZmlsZSBvYmplY3QgaXMgYSBmaWxlIGRlc2NyaXB0b3Igb3IgYW55IG9iamVjdCB3aXRoIGEKICAgIGBmaWxlbm8oKWAgbWV0aG9kLiBBbiBhcmJpdHJhcnkgb2JqZWN0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUKICAgIGZpbGUgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIHN0b3JlIGNvbnRleHQgaW5mbywKICAgIGEgY2FsbGJhY2ssIGV0Yy4KCiAgICBBIHNlbGVjdG9yIGNhbiB1c2UgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgKHNlbGVjdCgpLCBwb2xsKCksIGVwb2xsKCksCiAgICBhbmQga3F1ZXVlKCkpIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uIFRoZSAnRGVmYXVsdFNlbGVjdG9yJyBjbGFzcyB1c2VzCiAgICB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBNYXBzIGZpbGUgZGVzY3JpcHRvcnMgdG8ga2V5cy4KICAgICAgICBzZWxmLl9mZF90b19rZXkgPSB7fQoKICAgICAgICAjIFJlYWQtb25seSBtYXBwaW5nIHJldHVybmVkIGJ5IGdldF9tYXAoKQogICAgICAgIHNlbGYuX21hcCA9IF9TZWxlY3Rvck1hcHBpbmcoc2VsZikKCiAgICBkZWYgX2ZpbGVvYmpfbG9va3VwKHNlbGYsIGZpbGVvYmopOgogICAgICAgICIiIiBSZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIGZpbGUgb2JqZWN0LgogICAgICAgIFRoaXMgd3JhcHMgX2ZpbGVvYmpfdG9fZmQoKSB0byBkbyBhbiBleGhhdXN0aXZlCiAgICAgICAgc2VhcmNoIGluIGNhc2UgdGhlIG9iamVjdCBpcyBpbnZhbGlkIGJ1dCB3ZSBzdGlsbAogICAgICAgIGhhdmUgaXQgaW4gb3VyIG1hcC4gVXNlZCBieSB1bnJlZ2lzdGVyKCkgc28gd2UgY2FuCiAgICAgICAgdW5yZWdpc3RlciBhbiBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkCiAgICAgICAgZXZlbiBpZiBpdCBpcyBjbG9zZWQuIEl0IGlzIGFsc28gdXNlZCBieSBfU2VsZWN0b3JNYXBwaW5nCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX2ZpbGVvYmpfdG9fZmQoZmlsZW9iaikKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKCiAgICAgICAgICAgICMgU2VhcmNoIHRocm91Z2ggYWxsIG91ciBtYXBwZWQga2V5cy4KICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9mZF90b19rZXkudmFsdWVzKCk6CiAgICAgICAgICAgICAgICBpZiBrZXkuZmlsZW9iaiBpcyBmaWxlb2JqOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZmQKCiAgICAgICAgICAgICMgUmFpc2UgVmFsdWVFcnJvciBhZnRlciBhbGwuCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAiIiIgUmVnaXN0ZXIgYSBmaWxlIG9iamVjdCBmb3IgYSBzZXQgb2YgZXZlbnRzIHRvIG1vbml0b3IuICIiIgogICAgICAgIGlmIChub3QgZXZlbnRzKSBvciAoZXZlbnRzICYgfihFVkVOVF9SRUFEIHwgRVZFTlRfV1JJVEUpKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBldmVudHM6IHswIXJ9Ii5mb3JtYXQoZXZlbnRzKSkKCiAgICAgICAga2V5ID0gU2VsZWN0b3JLZXkoZmlsZW9iaiwgc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaiksIGV2ZW50cywgZGF0YSkKCiAgICAgICAgaWYga2V5LmZkIGluIHNlbGYuX2ZkX3RvX2tleToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IChGRCB7MX0pIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChmaWxlb2JqLCBrZXkuZmQpKQoKICAgICAgICBzZWxmLl9mZF90b19rZXlba2V5LmZkXSA9IGtleQogICAgICAgIHJldHVybiBrZXkKCiAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgVW5yZWdpc3RlciBhIGZpbGUgb2JqZWN0IGZyb20gYmVpbmcgbW9uaXRvcmVkLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGtleSA9IHNlbGYuX2ZkX3RvX2tleS5wb3Aoc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaikpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICAgICAgIyBHZXR0aW5nIHRoZSBmaWxlbm8gb2YgYSBjbG9zZWQgc29ja2V0IG9uIFdpbmRvd3MgZXJyb3JzIHdpdGggRUJBREYuCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogV2luZG93cy4KICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2ZkX3RvX2tleS52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICBpZiBrZXkuZmlsZW9iaiBpcyBmaWxlb2JqOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mZF90b19rZXkucG9wKGtleS5mZCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCiAgICAgICAgcmV0dXJuIGtleQoKICAgIGRlZiBtb2RpZnkoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICIiIiBDaGFuZ2UgYSByZWdpc3RlcmVkIGZpbGUgb2JqZWN0IG1vbml0b3JlZCBldmVudHMgYW5kIGRhdGEuICIiIgogICAgICAgICMgTk9URTogU29tZSBzdWJjbGFzc2VzIG9wdGltaXplIHRoaXMgb3BlcmF0aW9uIGV2ZW4gZnVydGhlci4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGtleSA9IHNlbGYuX2ZkX3RvX2tleVtzZWxmLl9maWxlb2JqX2xvb2t1cChmaWxlb2JqKV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQoKICAgICAgICBpZiBldmVudHMgIT0ga2V5LmV2ZW50czoKICAgICAgICAgICAgc2VsZi51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIGtleSA9IHNlbGYucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQoKICAgICAgICBlbGlmIGRhdGEgIT0ga2V5LmRhdGE6CiAgICAgICAgICAgICMgVXNlIGEgc2hvcnRjdXQgdG8gdXBkYXRlIHRoZSBkYXRhLgogICAgICAgICAgICBrZXkgPSBrZXkuX3JlcGxhY2UoZGF0YT1kYXRhKQogICAgICAgICAgICBzZWxmLl9mZF90b19rZXlba2V5LmZkXSA9IGtleQoKICAgICAgICByZXR1cm4ga2V5CgogICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIiBQZXJmb3JtIHRoZSBhY3R1YWwgc2VsZWN0aW9uIHVudGlsIHNvbWUgbW9uaXRvcmVkIGZpbGUgb2JqZWN0cwogICAgICAgIGFyZSByZWFkeSBvciB0aGUgdGltZW91dCBleHBpcmVzLiAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiIENsb3NlIHRoZSBzZWxlY3Rvci4gVGhpcyBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBhbGwKICAgICAgICB1bmRlcmx5aW5nIHJlc291cmNlcyBhcmUgZnJlZWQuICIiIgogICAgICAgIHNlbGYuX2ZkX3RvX2tleS5jbGVhcigpCiAgICAgICAgc2VsZi5fbWFwID0gTm9uZQoKICAgIGRlZiBnZXRfa2V5KHNlbGYsIGZpbGVvYmopOgogICAgICAgICIiIiBSZXR1cm4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggYSByZWdpc3RlcmVkIGZpbGUgb2JqZWN0LiAiIiIKICAgICAgICBtYXBwaW5nID0gc2VsZi5nZXRfbWFwKCkKICAgICAgICBpZiBtYXBwaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU2VsZWN0b3IgaXMgY2xvc2VkIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW2ZpbGVvYmpdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICBkZWYgZ2V0X21hcChzZWxmKToKICAgICAgICAiIiIgUmV0dXJuIGEgbWFwcGluZyBvZiBmaWxlIG9iamVjdHMgdG8gc2VsZWN0b3Iga2V5cyAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fbWFwCgogICAgZGVmIF9rZXlfZnJvbV9mZChzZWxmLCBmZCk6CiAgICAgICAgIiIiIFJldHVybiB0aGUga2V5IGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgUmV0dXJuIE5vbmUgaWYgaXQgaXMgbm90IGZvdW5kLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mZF90b19rZXlbZmRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKCiMgQWxtb3N0IGFsbCBwbGF0Zm9ybXMgaGF2ZSBzZWxlY3Quc2VsZWN0KCkKaWYgaGFzYXR0cihzZWxlY3QsICJzZWxlY3QiKToKICAgIGNsYXNzIFNlbGVjdFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIFNlbGVjdC1iYXNlZCBzZWxlY3Rvci4gIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9yZWFkZXJzID0gc2V0KCkKICAgICAgICAgICAgc2VsZi5fd3JpdGVycyA9IHNldCgpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFNlbGVjdFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBzZWxmLl9yZWFkZXJzLmFkZChrZXkuZmQpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVycy5hZGQoa2V5LmZkKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBzZWxmLl9yZWFkZXJzLmRpc2NhcmQoa2V5LmZkKQogICAgICAgICAgICBzZWxmLl93cml0ZXJzLmRpc2NhcmQoa2V5LmZkKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBfc2VsZWN0KHNlbGYsIHIsIHcsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgICIiIiBXcmFwcGVyIGZvciBzZWxlY3Quc2VsZWN0IGJlY2F1c2UgdGltZW91dCBpcyBhIHBvc2l0aW9uYWwgYXJnICIiIgogICAgICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyLCB3LCBbXSwgdGltZW91dCkKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAjIFNlbGVjdGluZyBvbiBlbXB0eSBsaXN0cyBvbiBXaW5kb3dzIGVycm9ycyBvdXQuCiAgICAgICAgICAgIGlmIG5vdCBsZW4oc2VsZi5fcmVhZGVycykgYW5kIG5vdCBsZW4oc2VsZi5fd3JpdGVycyk6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgICAgIHRpbWVvdXQgPSBOb25lIGlmIHRpbWVvdXQgaXMgTm9uZSBlbHNlIG1heCh0aW1lb3V0LCAwLjApCiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgciwgdywgXyA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fc2VsZWN0LCBUcnVlLCBzZWxmLl9yZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZXJzLCB0aW1lb3V0KQogICAgICAgICAgICByID0gc2V0KHIpCiAgICAgICAgICAgIHcgPSBzZXQodykKICAgICAgICAgICAgZm9yIGZkIGluIHIgfCB3OgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZmQgaW4gcjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAogICAgICAgICAgICAgICAgaWYgZmQgaW4gdzoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICByZWFkeS5hcHBlbmQoKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykpCiAgICAgICAgICAgIHJldHVybiByZWFkeQoKCmlmIGhhc2F0dHIoc2VsZWN0LCAicG9sbCIpOgogICAgY2xhc3MgUG9sbFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIFBvbGwtYmFzZWQgc2VsZWN0b3IgIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihQb2xsU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fcG9sbCA9IHNlbGVjdC5wb2xsKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGV2ZW50X21hc2sgPSAwCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBldmVudF9tYXNrIHw9IHNlbGVjdC5QT0xMSU4KICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBldmVudF9tYXNrIHw9IHNlbGVjdC5QT0xMT1VUCiAgICAgICAgICAgIHNlbGYuX3BvbGwucmVnaXN0ZXIoa2V5LmZkLCBldmVudF9tYXNrKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihQb2xsU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5fcG9sbC51bnJlZ2lzdGVyKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgX3dyYXBfcG9sbChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAiIiIgV3JhcHBlciBmdW5jdGlvbiBmb3Igc2VsZWN0LnBvbGwucG9sbCgpIHNvIHRoYXQKICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlciBjYW4gd29yayB3aXRoIG9ubHkgc2Vjb25kcy4gIiIiCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IDAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzZWxlY3QucG9sbC5wb2xsKCkgaGFzIGEgcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICMgcm91bmQgYXdheSBmcm9tIHplcm8gdG8gd2FpdCAqYXQgbGVhc3QqIHRpbWVvdXQgc2Vjb25kcy4KICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF0aC5jZWlsKHRpbWVvdXQgKiAxZTMpCgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wb2xsLnBvbGwodGltZW91dCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgZmRfZXZlbnRzID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl93cmFwX3BvbGwsIFRydWUsIHRpbWVvdXQ9dGltZW91dCkKICAgICAgICAgICAgZm9yIGZkLCBldmVudF9tYXNrIGluIGZkX2V2ZW50czoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LlBPTExJTjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LlBPTExPVVQ6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICByZWFkeS5hcHBlbmQoKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykpCgogICAgICAgICAgICByZXR1cm4gcmVhZHkKCgppZiBoYXNhdHRyKHNlbGVjdCwgImVwb2xsIik6CiAgICBjbGFzcyBFcG9sbFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIEVwb2xsLWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9lcG9sbCA9IHNlbGVjdC5lcG9sbCgpCgogICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lcG9sbC5maWxlbm8oKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGV2ZW50c19tYXNrID0gMAogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgZXZlbnRzX21hc2sgfD0gc2VsZWN0LkVQT0xMSU4KICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBldmVudHNfbWFzayB8PSBzZWxlY3QuRVBPTExPVVQKICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC5yZWdpc3RlciwgRmFsc2UsIGtleS5mZCwgZXZlbnRzX21hc2spCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC51bnJlZ2lzdGVyLCBGYWxzZSwga2V5LmZkKQogICAgICAgICAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gb2NjdXIgd2hlbiB0aGUgZmQgd2FzIGNsb3NlZCBzaW5jZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IDAuMAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIHNlbGVjdC5lcG9sbC5wb2xsKCkgaGFzIGEgcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kCiAgICAgICAgICAgICAgICAgICAgIyBidXQgbHVja2lseSB0YWtlcyBzZWNvbmRzIHNvIHdlIGRvbid0IG5lZWQgYSB3cmFwcGVyCiAgICAgICAgICAgICAgICAgICAgIyBsaWtlIFBvbGxTZWxlY3Rvci4gSnVzdCBmb3IgYmV0dGVyIHJvdW5kaW5nLgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtYXRoLmNlaWwodGltZW91dCAqIDFlMykgKiAxZS0zCiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZmxvYXQodGltZW91dCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAtMS4wICAjIGVwb2xsLnBvbGwoKSBtdXN0IGhhdmUgYSBmbG9hdC4KCiAgICAgICAgICAgICMgV2UgYWx3YXlzIHdhbnQgYXQgbGVhc3QgMSB0byBlbnN1cmUgdGhhdCBzZWxlY3QgY2FuIGJlIGNhbGxlZAogICAgICAgICAgICAjIHdpdGggbm8gZmlsZSBkZXNjcmlwdG9ycyByZWdpc3RlcmVkLiBPdGhlcndpc2Ugd2lsbCBmYWlsLgogICAgICAgICAgICBtYXhfZXZlbnRzID0gbWF4KGxlbihzZWxmLl9mZF90b19rZXkpLCAxKQoKICAgICAgICAgICAgcmVhZHkgPSBbXQogICAgICAgICAgICBmZF9ldmVudHMgPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2Vwb2xsLnBvbGwsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGV2ZW50cz1tYXhfZXZlbnRzKQogICAgICAgICAgICBmb3IgZmQsIGV2ZW50X21hc2sgaW4gZmRfZXZlbnRzOgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayAmIH5zZWxlY3QuRVBPTExJTjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LkVQT0xMT1VUOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQogICAgICAgICAgICByZXR1cm4gcmVhZHkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICBzZWxmLl9lcG9sbC5jbG9zZSgpCiAgICAgICAgICAgIHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLmNsb3NlKCkKCgppZiBoYXNhdHRyKHNlbGVjdCwgImtxdWV1ZSIpOgogICAgY2xhc3MgS3F1ZXVlU2VsZWN0b3IoQmFzZVNlbGVjdG9yKToKICAgICAgICAiIiIgS3F1ZXVlIC8gS2V2ZW50LWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fa3F1ZXVlID0gc2VsZWN0LmtxdWV1ZSgpCgogICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rcXVldWUuZmlsZW5vKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQpCgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQoKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCkKCiAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCgogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBpZiBrZXkuZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQogICAgICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiBrZXkuZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCiAgICAgICAgICAgICAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtYXgodGltZW91dCwgMCkKCiAgICAgICAgICAgIG1heF9ldmVudHMgPSBsZW4oc2VsZi5fZmRfdG9fa2V5KSAqIDIKICAgICAgICAgICAgcmVhZHlfZmRzID0ge30KCiAgICAgICAgICAgIGtldmVudF9saXN0ID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIG1heF9ldmVudHMsIHRpbWVvdXQpCgogICAgICAgICAgICBmb3Iga2V2ZW50IGluIGtldmVudF9saXN0OgogICAgICAgICAgICAgICAgZmQgPSBrZXZlbnQuaWRlbnQKICAgICAgICAgICAgICAgIGV2ZW50X21hc2sgPSBrZXZlbnQuZmlsdGVyCiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrID09IHNlbGVjdC5LUV9GSUxURVJfUkVBRDoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayA9PSBzZWxlY3QuS1FfRklMVEVSX1dSSVRFOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9XUklURQoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIGlmIGtleS5mZCBub3QgaW4gcmVhZHlfZmRzOgogICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9mZHNba2V5LmZkXSA9IChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2V2ZW50cyA9IHJlYWR5X2Zkc1trZXkuZmRdWzFdCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5X2Zkc1trZXkuZmRdID0gKGtleSwgKGV2ZW50cyB8IG9sZF9ldmVudHMpICYga2V5LmV2ZW50cykKCiAgICAgICAgICAgIHJldHVybiBsaXN0KHJlYWR5X2Zkcy52YWx1ZXMoKSkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICBzZWxmLl9rcXVldWUuY2xvc2UoKQogICAgICAgICAgICBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikuY2xvc2UoKQoKCmlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgJ3NlbGVjdCcpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICBIQVNfU0VMRUNUID0gRmFsc2UKCgpkZWYgX2Nhbl9hbGxvY2F0ZShzdHJ1Y3QpOgogICAgIiIiIENoZWNrcyB0aGF0IHNlbGVjdCBzdHJ1Y3RzIGNhbiBiZSBhbGxvY2F0ZWQgYnkgdGhlIHVuZGVybHlpbmcKICAgIG9wZXJhdGluZyBzeXN0ZW0sIG5vdCBqdXN0IGFkdmVydGlzZWQgYnkgdGhlIHNlbGVjdCBtb2R1bGUuIFdlIGRvbid0CiAgICBjaGVjayBzZWxlY3QoKSBiZWNhdXNlIHdlJ2xsIGJlIGhvcGVmdWwgdGhhdCBtb3N0IHBsYXRmb3JtcyB0aGF0CiAgICBkb24ndCBoYXZlIGl0IGF2YWlsYWJsZSB3aWxsIG5vdCBhZHZlcnRpc2UgaXQuIChpZTogR0FFKSAiIiIKICAgIHRyeToKICAgICAgICAjIHNlbGVjdC5wb2xsKCkgb2JqZWN0cyB3b24ndCBmYWlsIHVudGlsIHVzZWQuCiAgICAgICAgaWYgc3RydWN0ID09ICdwb2xsJzoKICAgICAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKICAgICAgICAgICAgcC5wb2xsKDApCgogICAgICAgICMgQWxsIG90aGVycyB3aWxsIGZhaWwgb24gYWxsb2NhdGlvbi4KICAgICAgICBlbHNlOgogICAgICAgICAgICBnZXRhdHRyKHNlbGVjdCwgc3RydWN0KSgpLmNsb3NlKCkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IChPU0Vycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKICAgICAgICByZXR1cm4gRmFsc2UKCgojIENob29zZSB0aGUgYmVzdCBpbXBsZW1lbnRhdGlvbiwgcm91Z2hseToKIyBrcXVldWUgPT0gZXBvbGwgPiBwb2xsID4gc2VsZWN0LiBEZXZwb2xsIG5vdCBzdXBwb3J0ZWQuIChTZWUgYWJvdmUpCiMgc2VsZWN0KCkgYWxzbyBjYW4ndCBhY2NlcHQgYSBGRCA+IEZEX1NFVFNJWkUgKHVzdWFsbHkgYXJvdW5kIDEwMjQpCmRlZiBEZWZhdWx0U2VsZWN0b3IoKToKICAgICIiIiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGZpcnN0IGNhbGwgZm9yIERlZmF1bHRTZWxlY3RvciB0bwogICAgZGV0ZWN0IGlmIHRoZSBzZWxlY3QgbW9kdWxlIGlzIGJlaW5nIG1vbmtleS1wYXRjaGVkIGluY29ycmVjdGx5CiAgICBieSBldmVudGxldCwgZ3JlZW5sZXQsIGFuZCBwcmVzZXJ2ZSBwcm9wZXIgYmVoYXZpb3IuICIiIgogICAgZ2xvYmFsIF9ERUZBVUxUX1NFTEVDVE9SCiAgICBpZiBfREVGQVVMVF9TRUxFQ1RPUiBpcyBOb25lOgogICAgICAgIGlmIF9jYW5fYWxsb2NhdGUoJ2txdWV1ZScpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IEtxdWV1ZVNlbGVjdG9yCiAgICAgICAgZWxpZiBfY2FuX2FsbG9jYXRlKCdlcG9sbCcpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IEVwb2xsU2VsZWN0b3IKICAgICAgICBlbGlmIF9jYW5fYWxsb2NhdGUoJ3BvbGwnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBQb2xsU2VsZWN0b3IKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZWN0LCAnc2VsZWN0Jyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gU2VsZWN0U2VsZWN0b3IKICAgICAgICBlbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IGhhdmUgYSBzZWxlY3RvcicpCiAgICByZXR1cm4gX0RFRkFVTFRfU0VMRUNUT1IoKQpQSwMEFAAAAAAAAAAhANXvyKKwLwAAsC8AADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NzbF8ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgZXJybm8KaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBobWFjCgpmcm9tIGJpbmFzY2lpIGltcG9ydCBoZXhsaWZ5LCB1bmhleGxpZnkKZnJvbSBoYXNobGliIGltcG9ydCBtZDUsIHNoYTEsIHNoYTI1NgoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IFNTTEVycm9yLCBJbnNlY3VyZVBsYXRmb3JtV2FybmluZywgU05JTWlzc2luZ1dhcm5pbmcKCgpTU0xDb250ZXh0ID0gTm9uZQpIQVNfU05JID0gRmFsc2UKSVNfUFlPUEVOU1NMID0gRmFsc2UKSVNfU0VDVVJFVFJBTlNQT1JUID0gRmFsc2UKCiMgTWFwcyB0aGUgbGVuZ3RoIG9mIGEgZGlnZXN0IHRvIGEgcG9zc2libGUgaGFzaCBmdW5jdGlvbiBwcm9kdWNpbmcgdGhpcyBkaWdlc3QKSEFTSEZVTkNfTUFQID0gewogICAgMzI6IG1kNSwKICAgIDQwOiBzaGExLAogICAgNjQ6IHNoYTI1NiwKfQoKCmRlZiBfY29uc3RfY29tcGFyZV9kaWdlc3RfYmFja3BvcnQoYSwgYik6CiAgICAiIiIKICAgIENvbXBhcmUgdHdvIGRpZ2VzdHMgb2YgZXF1YWwgbGVuZ3RoIGluIGNvbnN0YW50IHRpbWUuCgogICAgVGhlIGRpZ2VzdHMgbXVzdCBiZSBvZiB0eXBlIHN0ci9ieXRlcy4KICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgZGlnZXN0cyBtYXRjaCwgYW5kIEZhbHNlIG90aGVyd2lzZS4KICAgICIiIgogICAgcmVzdWx0ID0gYWJzKGxlbihhKSAtIGxlbihiKSkKICAgIGZvciBsLCByIGluIHppcChieXRlYXJyYXkoYSksIGJ5dGVhcnJheShiKSk6CiAgICAgICAgcmVzdWx0IHw9IGwgXiByCiAgICByZXR1cm4gcmVzdWx0ID09IDAKCgpfY29uc3RfY29tcGFyZV9kaWdlc3QgPSBnZXRhdHRyKGhtYWMsICdjb21wYXJlX2RpZ2VzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnN0X2NvbXBhcmVfZGlnZXN0X2JhY2twb3J0KQoKCnRyeTogICMgVGVzdCBmb3IgU1NMIGZlYXR1cmVzCiAgICBpbXBvcnQgc3NsCiAgICBmcm9tIHNzbCBpbXBvcnQgd3JhcF9zb2NrZXQsIENFUlRfTk9ORSwgUFJPVE9DT0xfU1NMdjIzCiAgICBmcm9tIHNzbCBpbXBvcnQgSEFTX1NOSSAgIyBIYXMgU05JPwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IE9QX05PX1NTTHYyLCBPUF9OT19TU0x2MywgT1BfTk9fQ09NUFJFU1NJT04KZXhjZXB0IEltcG9ydEVycm9yOgogICAgT1BfTk9fU1NMdjIsIE9QX05PX1NTTHYzID0gMHgxMDAwMDAwLCAweDIwMDAwMDAKICAgIE9QX05PX0NPTVBSRVNTSU9OID0gMHgyMDAwMAoKIyBBIHNlY3VyZSBkZWZhdWx0LgojIFNvdXJjZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVExTIGNpcGhlcnM6CiMKIyAtIGh0dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9TZWN1cml0eS9TZXJ2ZXJfU2lkZV9UTFMKIyAtIGh0dHBzOi8vd3d3LnNzbGxhYnMuY29tL3Byb2plY3RzL2Jlc3QtcHJhY3RpY2VzL2luZGV4Lmh0bWwKIyAtIGh0dHBzOi8vaHluZWsubWUvYXJ0aWNsZXMvaGFyZGVuaW5nLXlvdXItd2ViLXNlcnZlcnMtc3NsLWNpcGhlcnMvCiMKIyBUaGUgZ2VuZXJhbCBpbnRlbnQgaXM6CiMgLSBQcmVmZXIgVExTIDEuMyBjaXBoZXIgc3VpdGVzCiMgLSBwcmVmZXIgY2lwaGVyIHN1aXRlcyB0aGF0IG9mZmVyIHBlcmZlY3QgZm9yd2FyZCBzZWNyZWN5IChESEUvRUNESEUpLAojIC0gcHJlZmVyIEVDREhFIG92ZXIgREhFIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsCiMgLSBwcmVmZXIgYW55IEFFUy1HQ00gYW5kIENoYUNoYTIwIG92ZXIgYW55IEFFUy1DQkMgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQKIyAgIHNlY3VyaXR5LAojIC0gcHJlZmVyIEFFUy1HQ00gb3ZlciBDaGFDaGEyMCBiZWNhdXNlIGhhcmR3YXJlLWFjY2VsZXJhdGVkIEFFUyBpcyBjb21tb24sCiMgLSBkaXNhYmxlIE5VTEwgYXV0aGVudGljYXRpb24sIE1ENSBNQUNzIGFuZCBEU1MgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCkRFRkFVTFRfQ0lQSEVSUyA9ICc6Jy5qb2luKFsKICAgICdUTFMxMy1BRVMtMjU2LUdDTS1TSEEzODQnLAogICAgJ1RMUzEzLUNIQUNIQTIwLVBPTFkxMzA1LVNIQTI1NicsCiAgICAnVExTMTMtQUVTLTEyOC1HQ00tU0hBMjU2JywKICAgICdFQ0RIK0FFU0dDTScsCiAgICAnRUNESCtDSEFDSEEyMCcsCiAgICAnREgrQUVTR0NNJywKICAgICdESCtDSEFDSEEyMCcsCiAgICAnRUNESCtBRVMyNTYnLAogICAgJ0RIK0FFUzI1NicsCiAgICAnRUNESCtBRVMxMjgnLAogICAgJ0RIK0FFUycsCiAgICAnUlNBK0FFU0dDTScsCiAgICAnUlNBK0FFUycsCiAgICAnIWFOVUxMJywKICAgICchZU5VTEwnLAogICAgJyFNRDUnLApdKQoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IFNTTENvbnRleHQgICMgTW9kZXJuIFNTTD8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHN5cwoKICAgIGNsYXNzIFNTTENvbnRleHQob2JqZWN0KTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyICYgMy4xCiAgICAgICAgc3VwcG9ydHNfc2V0X2NpcGhlcnMgPSAoKDIsIDcpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsIDIpIDw9IHN5cy52ZXJzaW9uX2luZm8pCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbF92ZXJzaW9uKToKICAgICAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sX3ZlcnNpb24KICAgICAgICAgICAgIyBVc2UgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhIHJlYWwgU1NMQ29udGV4dAogICAgICAgICAgICBzZWxmLmNoZWNrX2hvc3RuYW1lID0gRmFsc2UKICAgICAgICAgICAgc2VsZi52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX05PTkUKICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IE5vbmUKICAgICAgICAgICAgc2VsZi5vcHRpb25zID0gMAogICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gTm9uZQogICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IE5vbmUKCiAgICAgICAgZGVmIGxvYWRfY2VydF9jaGFpbihzZWxmLCBjZXJ0ZmlsZSwga2V5ZmlsZSk6CiAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQogICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCgogICAgICAgIGRlZiBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lKToKICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhZmlsZQoKICAgICAgICAgICAgaWYgY2FwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoIkNBIGRpcmVjdG9yaWVzIG5vdCBzdXBwb3J0ZWQgaW4gb2xkZXIgUHl0aG9ucyIpCgogICAgICAgIGRlZiBzZXRfY2lwaGVycyhzZWxmLCBjaXBoZXJfc3VpdGUpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zdXBwb3J0c19zZXRfY2lwaGVyczoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAgICAnWW91ciB2ZXJzaW9uIG9mIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgJwogICAgICAgICAgICAgICAgICAgICdhIGN1c3RvbSBjaXBoZXIgc3VpdGUuIFBsZWFzZSB1cGdyYWRlIHRvIFB5dGhvbiAnCiAgICAgICAgICAgICAgICAgICAgJzIuNywgMy4yLCBvciBsYXRlciBpZiB5b3UgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBjaXBoZXJfc3VpdGUKCiAgICAgICAgZGVmIHdyYXBfc29ja2V0KHNlbGYsIHNvY2tldCwgc2VydmVyX2hvc3RuYW1lPU5vbmUsIHNlcnZlcl9zaWRlPUZhbHNlKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICdBIHRydWUgU1NMQ29udGV4dCBvYmplY3QgaXMgbm90IGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyAnCiAgICAgICAgICAgICAgICAndXJsbGliMyBmcm9tIGNvbmZpZ3VyaW5nIFNTTCBhcHByb3ByaWF0ZWx5IGFuZCBtYXkgY2F1c2UgJwogICAgICAgICAgICAgICAgJ2NlcnRhaW4gU1NMIGNvbm5lY3Rpb25zIHRvIGZhaWwuIFlvdSBjYW4gdXBncmFkZSB0byBhIG5ld2VyICcKICAgICAgICAgICAgICAgICd2ZXJzaW9uIG9mIFB5dGhvbiB0byBzb2x2ZSB0aGlzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcKICAgICAgICAgICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2FkdmFuY2VkLXVzYWdlLmh0bWwnCiAgICAgICAgICAgICAgICAnI3NzbC13YXJuaW5ncycsCiAgICAgICAgICAgICAgICBJbnNlY3VyZVBsYXRmb3JtV2FybmluZwogICAgICAgICAgICApCiAgICAgICAgICAgIGt3YXJncyA9IHsKICAgICAgICAgICAgICAgICdrZXlmaWxlJzogc2VsZi5rZXlmaWxlLAogICAgICAgICAgICAgICAgJ2NlcnRmaWxlJzogc2VsZi5jZXJ0ZmlsZSwKICAgICAgICAgICAgICAgICdjYV9jZXJ0cyc6IHNlbGYuY2FfY2VydHMsCiAgICAgICAgICAgICAgICAnY2VydF9yZXFzJzogc2VsZi52ZXJpZnlfbW9kZSwKICAgICAgICAgICAgICAgICdzc2xfdmVyc2lvbic6IHNlbGYucHJvdG9jb2wsCiAgICAgICAgICAgICAgICAnc2VydmVyX3NpZGUnOiBzZXJ2ZXJfc2lkZSwKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiBzZWxmLnN1cHBvcnRzX3NldF9jaXBoZXJzOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNysKICAgICAgICAgICAgICAgIHJldHVybiB3cmFwX3NvY2tldChzb2NrZXQsIGNpcGhlcnM9c2VsZi5jaXBoZXJzLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYKICAgICAgICAgICAgICAgIHJldHVybiB3cmFwX3NvY2tldChzb2NrZXQsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRfZmluZ2VycHJpbnQoY2VydCwgZmluZ2VycHJpbnQpOgogICAgIiIiCiAgICBDaGVja3MgaWYgZ2l2ZW4gZmluZ2VycHJpbnQgbWF0Y2hlcyB0aGUgc3VwcGxpZWQgY2VydGlmaWNhdGUuCgogICAgOnBhcmFtIGNlcnQ6CiAgICAgICAgQ2VydGlmaWNhdGUgYXMgYnl0ZXMgb2JqZWN0LgogICAgOnBhcmFtIGZpbmdlcnByaW50OgogICAgICAgIEZpbmdlcnByaW50IGFzIHN0cmluZyBvZiBoZXhkaWdpdHMsIGNhbiBiZSBpbnRlcnNwZXJzZWQgYnkgY29sb25zLgogICAgIiIiCgogICAgZmluZ2VycHJpbnQgPSBmaW5nZXJwcmludC5yZXBsYWNlKCc6JywgJycpLmxvd2VyKCkKICAgIGRpZ2VzdF9sZW5ndGggPSBsZW4oZmluZ2VycHJpbnQpCiAgICBoYXNoZnVuYyA9IEhBU0hGVU5DX01BUC5nZXQoZGlnZXN0X2xlbmd0aCkKICAgIGlmIG5vdCBoYXNoZnVuYzoKICAgICAgICByYWlzZSBTU0xFcnJvcigKICAgICAgICAgICAgJ0ZpbmdlcnByaW50IG9mIGludmFsaWQgbGVuZ3RoOiB7MH0nLmZvcm1hdChmaW5nZXJwcmludCkpCgogICAgIyBXZSBuZWVkIGVuY29kZSgpIGhlcmUgZm9yIHB5MzI7IHdvcmtzIG9uIHB5MiBhbmQgcDMzLgogICAgZmluZ2VycHJpbnRfYnl0ZXMgPSB1bmhleGxpZnkoZmluZ2VycHJpbnQuZW5jb2RlKCkpCgogICAgY2VydF9kaWdlc3QgPSBoYXNoZnVuYyhjZXJ0KS5kaWdlc3QoKQoKICAgIGlmIG5vdCBfY29uc3RfY29tcGFyZV9kaWdlc3QoY2VydF9kaWdlc3QsIGZpbmdlcnByaW50X2J5dGVzKToKICAgICAgICByYWlzZSBTU0xFcnJvcignRmluZ2VycHJpbnRzIGRpZCBub3QgbWF0Y2guIEV4cGVjdGVkICJ7MH0iLCBnb3QgInsxfSIuJwogICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoZmluZ2VycHJpbnQsIGhleGxpZnkoY2VydF9kaWdlc3QpKSkKCgpkZWYgcmVzb2x2ZV9jZXJ0X3JlcXMoY2FuZGlkYXRlKToKICAgICIiIgogICAgUmVzb2x2ZXMgdGhlIGFyZ3VtZW50IHRvIGEgbnVtZXJpYyBjb25zdGFudCwgd2hpY2ggY2FuIGJlIHBhc3NlZCB0bwogICAgdGhlIHdyYXBfc29ja2V0IGZ1bmN0aW9uL21ldGhvZCBmcm9tIHRoZSBzc2wgbW9kdWxlLgogICAgRGVmYXVsdHMgdG8gOmRhdGE6YHNzbC5DRVJUX05PTkVgLgogICAgSWYgZ2l2ZW4gYSBzdHJpbmcgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgaW4gdGhlCiAgICA6bW9kOmBzc2xgIG1vZHVsZSBvciBpdHMgYWJicmV2YXRpb24uCiAgICAoU28geW91IGNhbiBzcGVjaWZ5IGBSRVFVSVJFRGAgaW5zdGVhZCBvZiBgQ0VSVF9SRVFVSVJFRGAuCiAgICBJZiBpdCdzIG5laXRoZXIgYE5vbmVgIG5vciBhIHN0cmluZyB3ZSBhc3N1bWUgaXQgaXMgYWxyZWFkeSB0aGUgbnVtZXJpYwogICAgY29uc3RhbnQgd2hpY2ggY2FuIGRpcmVjdGx5IGJlIHBhc3NlZCB0byB3cmFwX3NvY2tldC4KICAgICIiIgogICAgaWYgY2FuZGlkYXRlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIENFUlRfTk9ORQoKICAgIGlmIGlzaW5zdGFuY2UoY2FuZGlkYXRlLCBzdHIpOgogICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCBjYW5kaWRhdGUsIE5vbmUpCiAgICAgICAgaWYgcmVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCAnQ0VSVF8nICsgY2FuZGlkYXRlKQogICAgICAgIHJldHVybiByZXMKCiAgICByZXR1cm4gY2FuZGlkYXRlCgoKZGVmIHJlc29sdmVfc3NsX3ZlcnNpb24oY2FuZGlkYXRlKToKICAgICIiIgogICAgbGlrZSByZXNvbHZlX2NlcnRfcmVxcwogICAgIiIiCiAgICBpZiBjYW5kaWRhdGUgaXMgTm9uZToKICAgICAgICByZXR1cm4gUFJPVE9DT0xfU1NMdjIzCgogICAgaWYgaXNpbnN0YW5jZShjYW5kaWRhdGUsIHN0cik6CiAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsIGNhbmRpZGF0ZSwgTm9uZSkKICAgICAgICBpZiByZXMgaXMgTm9uZToKICAgICAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsICdQUk9UT0NPTF8nICsgY2FuZGlkYXRlKQogICAgICAgIHJldHVybiByZXMKCiAgICByZXR1cm4gY2FuZGlkYXRlCgoKZGVmIGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoc3NsX3ZlcnNpb249Tm9uZSwgY2VydF9yZXFzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSwgY2lwaGVycz1Ob25lKToKICAgICIiIkFsbCBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIGBgc3NsX3dyYXBfc29ja2V0YGAuCgogICAgQnkgZGVmYXVsdCwgdGhpcyBmdW5jdGlvbiBkb2VzIGEgbG90IG9mIHRoZSBzYW1lIHdvcmsgdGhhdAogICAgYGBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dGBgIGRvZXMgb24gUHl0aG9uIDMuNCsuIEl0OgoKICAgIC0gRGlzYWJsZXMgU1NMdjIsIFNTTHYzLCBhbmQgY29tcHJlc3Npb24KICAgIC0gU2V0cyBhIHJlc3RyaWN0ZWQgc2V0IG9mIHNlcnZlciBjaXBoZXJzCgogICAgSWYgeW91IHdpc2ggdG8gZW5hYmxlIFNTTHYzLCB5b3UgY2FuIGRvOjoKCiAgICAgICAgZnJvbSB1cmxsaWIzLnV0aWwgaW1wb3J0IHNzbF8KICAgICAgICBjb250ZXh0ID0gc3NsXy5jcmVhdGVfdXJsbGliM19jb250ZXh0KCkKICAgICAgICBjb250ZXh0Lm9wdGlvbnMgJj0gfnNzbF8uT1BfTk9fU1NMdjMKCiAgICBZb3UgY2FuIGRvIHRoZSBzYW1lIHRvIGVuYWJsZSBjb21wcmVzc2lvbiAoc3Vic3RpdHV0aW5nIGBgQ09NUFJFU1NJT05gYAogICAgZm9yIGBgU1NMdjNgYCBpbiB0aGUgbGFzdCBsaW5lIGFib3ZlKS4KCiAgICA6cGFyYW0gc3NsX3ZlcnNpb246CiAgICAgICAgVGhlIGRlc2lyZWQgcHJvdG9jb2wgdmVyc2lvbiB0byB1c2UuIFRoaXMgd2lsbCBkZWZhdWx0IHRvCiAgICAgICAgUFJPVE9DT0xfU1NMdjIzIHdoaWNoIHdpbGwgbmVnb3RpYXRlIHRoZSBoaWdoZXN0IHByb3RvY29sIHRoYXQgYm90aAogICAgICAgIHRoZSBzZXJ2ZXIgYW5kIHlvdXIgaW5zdGFsbGF0aW9uIG9mIE9wZW5TU0wgc3VwcG9ydC4KICAgIDpwYXJhbSBjZXJ0X3JlcXM6CiAgICAgICAgV2hldGhlciB0byByZXF1aXJlIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uIFRoaXMgZGVmYXVsdHMgdG8KICAgICAgICBgYHNzbC5DRVJUX1JFUVVJUkVEYGAuCiAgICA6cGFyYW0gb3B0aW9uczoKICAgICAgICBTcGVjaWZpYyBPcGVuU1NMIG9wdGlvbnMuIFRoZXNlIGRlZmF1bHQgdG8gYGBzc2wuT1BfTk9fU1NMdjJgYCwKICAgICAgICBgYHNzbC5PUF9OT19TU0x2M2BgLCBgYHNzbC5PUF9OT19DT01QUkVTU0lPTmBgLgogICAgOnBhcmFtIGNpcGhlcnM6CiAgICAgICAgV2hpY2ggY2lwaGVyIHN1aXRlcyB0byBhbGxvdyB0aGUgc2VydmVyIHRvIHNlbGVjdC4KICAgIDpyZXR1cm5zOgogICAgICAgIENvbnN0cnVjdGVkIFNTTENvbnRleHQgb2JqZWN0IHdpdGggc3BlY2lmaWVkIG9wdGlvbnMKICAgIDpydHlwZTogU1NMQ29udGV4dAogICAgIiIiCiAgICBjb250ZXh0ID0gU1NMQ29udGV4dChzc2xfdmVyc2lvbiBvciBzc2wuUFJPVE9DT0xfU1NMdjIzKQoKICAgICMgU2V0dGluZyB0aGUgZGVmYXVsdCBoZXJlLCBhcyB3ZSBtYXkgaGF2ZSBubyBzc2wgbW9kdWxlIG9uIGltcG9ydAogICAgY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgY2VydF9yZXFzIGlzIE5vbmUgZWxzZSBjZXJ0X3JlcXMKCiAgICBpZiBvcHRpb25zIGlzIE5vbmU6CiAgICAgICAgb3B0aW9ucyA9IDAKICAgICAgICAjIFNTTHYyIGlzIGVhc2lseSBicm9rZW4gYW5kIGlzIGNvbnNpZGVyZWQgaGFybWZ1bCBhbmQgZGFuZ2Vyb3VzCiAgICAgICAgb3B0aW9ucyB8PSBPUF9OT19TU0x2MgogICAgICAgICMgU1NMdjMgaGFzIHNldmVyYWwgcHJvYmxlbXMgYW5kIGlzIG5vdyBkYW5nZXJvdXMKICAgICAgICBvcHRpb25zIHw9IE9QX05PX1NTTHYzCiAgICAgICAgIyBEaXNhYmxlIGNvbXByZXNzaW9uIHRvIHByZXZlbnQgQ1JJTUUgYXR0YWNrcyBmb3IgT3BlblNTTCAxLjArCiAgICAgICAgIyAoaXNzdWUgIzMwOSkKICAgICAgICBvcHRpb25zIHw9IE9QX05PX0NPTVBSRVNTSU9OCgogICAgY29udGV4dC5vcHRpb25zIHw9IG9wdGlvbnMKCiAgICBpZiBnZXRhdHRyKGNvbnRleHQsICdzdXBwb3J0c19zZXRfY2lwaGVycycsIFRydWUpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNgogICAgICAgIGNvbnRleHQuc2V0X2NpcGhlcnMoY2lwaGVycyBvciBERUZBVUxUX0NJUEhFUlMpCgogICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IGNlcnRfcmVxcwogICAgaWYgZ2V0YXR0cihjb250ZXh0LCAnY2hlY2tfaG9zdG5hbWUnLCBOb25lKSBpcyBub3QgTm9uZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzLjIKICAgICAgICAjIFdlIGRvIG91ciBvd24gdmVyaWZpY2F0aW9uLCBpbmNsdWRpbmcgZmluZ2VycHJpbnRzIGFuZCBhbHRlcm5hdGl2ZQogICAgICAgICMgaG9zdG5hbWVzLiBTbyBkaXNhYmxlIGl0IGhlcmUKICAgICAgICBjb250ZXh0LmNoZWNrX2hvc3RuYW1lID0gRmFsc2UKICAgIHJldHVybiBjb250ZXh0CgoKZGVmIHNzbF93cmFwX3NvY2tldChzb2NrLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsIGNlcnRfcmVxcz1Ob25lLAogICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsIHNlcnZlcl9ob3N0bmFtZT1Ob25lLAogICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPU5vbmUsIGNpcGhlcnM9Tm9uZSwgc3NsX2NvbnRleHQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1Ob25lKToKICAgICIiIgogICAgQWxsIGFyZ3VtZW50cyBleGNlcHQgZm9yIHNlcnZlcl9ob3N0bmFtZSwgc3NsX2NvbnRleHQsIGFuZCBjYV9jZXJ0X2RpciBoYXZlCiAgICB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZXkgZG8gd2hlbiB1c2luZyA6ZnVuYzpgc3NsLndyYXBfc29ja2V0YC4KCiAgICA6cGFyYW0gc2VydmVyX2hvc3RuYW1lOgogICAgICAgIFdoZW4gU05JIGlzIHN1cHBvcnRlZCwgdGhlIGV4cGVjdGVkIGhvc3RuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZQogICAgOnBhcmFtIHNzbF9jb250ZXh0OgogICAgICAgIEEgcHJlLW1hZGUgOmNsYXNzOmBTU0xDb250ZXh0YCBvYmplY3QuIElmIG5vbmUgaXMgcHJvdmlkZWQsIG9uZSB3aWxsCiAgICAgICAgYmUgY3JlYXRlZCB1c2luZyA6ZnVuYzpgY3JlYXRlX3VybGxpYjNfY29udGV4dGAuCiAgICA6cGFyYW0gY2lwaGVyczoKICAgICAgICBBIHN0cmluZyBvZiBjaXBoZXJzIHdlIHdpc2ggdGhlIGNsaWVudCB0byBzdXBwb3J0LiBUaGlzIGlzIG5vdAogICAgICAgIHN1cHBvcnRlZCBvbiBQeXRob24gMi42IGFzIHRoZSBzc2wgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgaXQuCiAgICA6cGFyYW0gY2FfY2VydF9kaXI6CiAgICAgICAgQSBkaXJlY3RvcnkgY29udGFpbmluZyBDQSBjZXJ0aWZpY2F0ZXMgaW4gbXVsdGlwbGUgc2VwYXJhdGUgZmlsZXMsIGFzCiAgICAgICAgc3VwcG9ydGVkIGJ5IE9wZW5TU0wncyAtQ0FwYXRoIGZsYWcgb3IgdGhlIGNhcGF0aCBhcmd1bWVudCB0bwogICAgICAgIFNTTENvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKCkuCiAgICAiIiIKICAgIGNvbnRleHQgPSBzc2xfY29udGV4dAogICAgaWYgY29udGV4dCBpcyBOb25lOgogICAgICAgICMgTm90ZTogVGhpcyBicmFuY2ggb2YgY29kZSBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgaW4gaXQgYXJlIG5vIGxvbmdlcgogICAgICAgICMgdXNlZCBieSB1cmxsaWIzIGl0c2VsZi4gV2Ugc2hvdWxkIGNvbnNpZGVyIGRlcHJlY2F0aW5nIGFuZCByZW1vdmluZwogICAgICAgICMgdGhpcyBjb2RlLgogICAgICAgIGNvbnRleHQgPSBjcmVhdGVfdXJsbGliM19jb250ZXh0KHNzbF92ZXJzaW9uLCBjZXJ0X3JlcXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1jaXBoZXJzKQoKICAgIGlmIGNhX2NlcnRzIG9yIGNhX2NlcnRfZGlyOgogICAgICAgIHRyeToKICAgICAgICAgICAgY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FfY2VydHMsIGNhX2NlcnRfZGlyKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42LCAyLjcsIDMuMgogICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlKQogICAgICAgICMgUHkzMyByYWlzZXMgRmlsZU5vdEZvdW5kRXJyb3Igd2hpY2ggc3ViY2xhc3NlcyBPU0Vycm9yCiAgICAgICAgIyBUaGVzZSBhcmUgbm90IGVxdWl2YWxlbnQgdW5sZXNzIHdlIGNoZWNrIHRoZSBlcnJubyBhdHRyaWJ1dGUKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMuMyBhbmQgYmV5b25kCiAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSkKICAgICAgICAgICAgcmFpc2UKICAgIGVsaWYgZ2V0YXR0cihjb250ZXh0LCAnbG9hZF9kZWZhdWx0X2NlcnRzJywgTm9uZSkgaXMgbm90IE5vbmU6CiAgICAgICAgIyB0cnkgdG8gbG9hZCBPUyBkZWZhdWx0IGNlcnRzOyB3b3JrcyB3ZWxsIG9uIFdpbmRvd3MgKHJlcXVpcmUgUHl0aG9uMy40KykKICAgICAgICBjb250ZXh0LmxvYWRfZGVmYXVsdF9jZXJ0cygpCgogICAgaWYgY2VydGZpbGU6CiAgICAgICAgY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oY2VydGZpbGUsIGtleWZpbGUpCiAgICBpZiBIQVNfU05JOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogT3BlblNTTCB3aXRoIGVuYWJsZWQgU05JCiAgICAgICAgcmV0dXJuIGNvbnRleHQud3JhcF9zb2NrZXQoc29jaywgc2VydmVyX2hvc3RuYW1lPXNlcnZlcl9ob3N0bmFtZSkKCiAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICdBbiBIVFRQUyByZXF1ZXN0IGhhcyBiZWVuIG1hZGUsIGJ1dCB0aGUgU05JIChTdWJqZWN0IE5hbWUgJwogICAgICAgICdJbmRpY2F0aW9uKSBleHRlbnNpb24gdG8gVExTIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gJwogICAgICAgICdUaGlzIG1heSBjYXVzZSB0aGUgc2VydmVyIHRvIHByZXNlbnQgYW4gaW5jb3JyZWN0IFRMUyAnCiAgICAgICAgJ2NlcnRpZmljYXRlLCB3aGljaCBjYW4gY2F1c2UgdmFsaWRhdGlvbiBmYWlsdXJlcy4gWW91IGNhbiB1cGdyYWRlIHRvICcKICAgICAgICAnYSBuZXdlciB2ZXJzaW9uIG9mIFB5dGhvbiB0byBzb2x2ZSB0aGlzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcKICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9hZHZhbmNlZC11c2FnZS5odG1sJwogICAgICAgICcjc3NsLXdhcm5pbmdzJywKICAgICAgICBTTklNaXNzaW5nV2FybmluZwogICAgKQogICAgcmV0dXJuIGNvbnRleHQud3JhcF9zb2NrZXQoc29jaykKUEsDBBQAAAAAAAAAIQBVUs4gHSYAAB0mAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC90aW1lb3V0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKIyBUaGUgZGVmYXVsdCBzb2NrZXQgdGltZW91dCwgdXNlZCBieSBodHRwbGliIHRvIGluZGljYXRlIHRoYXQgbm8gdGltZW91dCB3YXMKIyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKZnJvbSBzb2NrZXQgaW1wb3J0IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCmltcG9ydCB0aW1lCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgVGltZW91dFN0YXRlRXJyb3IKCiMgQSBzZW50aW5lbCB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHRpbWVvdXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbgojIHVybGxpYjMKX0RlZmF1bHQgPSBvYmplY3QoKQoKCiMgVXNlIHRpbWUubW9ub3RvbmljIGlmIGF2YWlsYWJsZS4KY3VycmVudF90aW1lID0gZ2V0YXR0cih0aW1lLCAibW9ub3RvbmljIiwgdGltZS50aW1lKQoKCmNsYXNzIFRpbWVvdXQob2JqZWN0KToKICAgICIiIiBUaW1lb3V0IGNvbmZpZ3VyYXRpb24uCgogICAgVGltZW91dHMgY2FuIGJlIGRlZmluZWQgYXMgYSBkZWZhdWx0IGZvciBhIHBvb2w6OgoKICAgICAgICB0aW1lb3V0ID0gVGltZW91dChjb25uZWN0PTIuMCwgcmVhZD03LjApCiAgICAgICAgaHR0cCA9IFBvb2xNYW5hZ2VyKHRpbWVvdXQ9dGltZW91dCkKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQoKICAgIE9yIHBlci1yZXF1ZXN0ICh3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBwb29sKTo6CgogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsIHRpbWVvdXQ9VGltZW91dCgxMCkpCgogICAgVGltZW91dHMgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgYWxsIHRoZSBwYXJhbWV0ZXJzIHRvIGBgTm9uZWBgOjoKCiAgICAgICAgbm9fdGltZW91dCA9IFRpbWVvdXQoY29ubmVjdD1Ob25lLCByZWFkPU5vbmUpCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vLCB0aW1lb3V0PW5vX3RpbWVvdXQpCgoKICAgIDpwYXJhbSB0b3RhbDoKICAgICAgICBUaGlzIGNvbWJpbmVzIHRoZSBjb25uZWN0IGFuZCByZWFkIHRpbWVvdXRzIGludG8gb25lOyB0aGUgcmVhZCB0aW1lb3V0CiAgICAgICAgd2lsbCBiZSBzZXQgdG8gdGhlIHRpbWUgbGVmdG92ZXIgZnJvbSB0aGUgY29ubmVjdCBhdHRlbXB0LiBJbiB0aGUKICAgICAgICBldmVudCB0aGF0IGJvdGggYSBjb25uZWN0IHRpbWVvdXQgYW5kIGEgdG90YWwgYXJlIHNwZWNpZmllZCwgb3IgYSByZWFkCiAgICAgICAgdGltZW91dCBhbmQgYSB0b3RhbCBhcmUgc3BlY2lmaWVkLCB0aGUgc2hvcnRlciB0aW1lb3V0IHdpbGwgYmUgYXBwbGllZC4KCiAgICAgICAgRGVmYXVsdHMgdG8gTm9uZS4KCiAgICA6dHlwZSB0b3RhbDogaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUKCiAgICA6cGFyYW0gY29ubmVjdDoKICAgICAgICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gYXR0ZW1wdCB0byBhIHNlcnZlcgogICAgICAgIHRvIHN1Y2NlZWQuIE9taXR0aW5nIHRoZSBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0IHRoZSBjb25uZWN0IHRpbWVvdXQgdG8KICAgICAgICB0aGUgc3lzdGVtIGRlZmF1bHQsIHByb2JhYmx5IGB0aGUgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpbiBzb2NrZXQucHkKICAgICAgICA8aHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzYwM2I0ZDU5Mzc1OC9MaWIvc29ja2V0LnB5I2w1MzU+YF8uCiAgICAgICAgTm9uZSB3aWxsIHNldCBhbiBpbmZpbml0ZSB0aW1lb3V0IGZvciBjb25uZWN0aW9uIGF0dGVtcHRzLgoKICAgIDp0eXBlIGNvbm5lY3Q6IGludGVnZXIsIGZsb2F0LCBvciBOb25lCgogICAgOnBhcmFtIHJlYWQ6CiAgICAgICAgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGNvbnNlY3V0aXZlCiAgICAgICAgcmVhZCBvcGVyYXRpb25zIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gT21pdHRpbmcKICAgICAgICB0aGUgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0aGUgcmVhZCB0aW1lb3V0IHRvIHRoZSBzeXN0ZW0KICAgICAgICBkZWZhdWx0LCBwcm9iYWJseSBgdGhlIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgaW4gc29ja2V0LnB5CiAgICAgICAgPGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS82MDNiNGQ1OTM3NTgvTGliL3NvY2tldC5weSNsNTM1PmBfLgogICAgICAgIE5vbmUgd2lsbCBzZXQgYW4gaW5maW5pdGUgdGltZW91dC4KCiAgICA6dHlwZSByZWFkOiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZQoKICAgIC4uIG5vdGU6OgoKICAgICAgICBNYW55IGZhY3RvcnMgY2FuIGFmZmVjdCB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgZm9yIHVybGxpYjMgdG8gcmV0dXJuCiAgICAgICAgYW4gSFRUUCByZXNwb25zZS4KCiAgICAgICAgRm9yIGV4YW1wbGUsIFB5dGhvbidzIEROUyByZXNvbHZlciBkb2VzIG5vdCBvYmV5IHRoZSB0aW1lb3V0IHNwZWNpZmllZAogICAgICAgIG9uIHRoZSBzb2NrZXQuIE90aGVyIGZhY3RvcnMgdGhhdCBjYW4gYWZmZWN0IHRvdGFsIHJlcXVlc3QgdGltZSBpbmNsdWRlCiAgICAgICAgaGlnaCBDUFUgbG9hZCwgaGlnaCBzd2FwLCB0aGUgcHJvZ3JhbSBydW5uaW5nIGF0IGEgbG93IHByaW9yaXR5IGxldmVsLAogICAgICAgIG9yIG90aGVyIGJlaGF2aW9ycy4KCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSByZWFkIGFuZCB0b3RhbCB0aW1lb3V0cyBvbmx5IG1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbgogICAgICAgIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgc29ja2V0IGNvbm5lY3RpbmcgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciwKICAgICAgICBub3QgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIGZvciB0aGUgcmVxdWVzdCB0byByZXR1cm4gYSBjb21wbGV0ZQogICAgICAgIHJlc3BvbnNlLiBGb3IgbW9zdCByZXF1ZXN0cywgdGhlIHRpbWVvdXQgaXMgcmFpc2VkIGJlY2F1c2UgdGhlIHNlcnZlcgogICAgICAgIGhhcyBub3Qgc2VudCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgc3BlY2lmaWVkIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cwogICAgICAgIHRoZSBjYXNlOyBpZiBhIHNlcnZlciBzdHJlYW1zIG9uZSBieXRlIGV2ZXJ5IGZpZnRlZW4gc2Vjb25kcywgYSB0aW1lb3V0CiAgICAgICAgb2YgMjAgc2Vjb25kcyB3aWxsIG5vdCB0cmlnZ2VyLCBldmVuIHRob3VnaCB0aGUgcmVxdWVzdCB3aWxsIHRha2UKICAgICAgICBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUuCgogICAgICAgIElmIHlvdXIgZ29hbCBpcyB0byBjdXQgb2ZmIGFueSByZXF1ZXN0IGFmdGVyIGEgc2V0IGFtb3VudCBvZiB3YWxsIGNsb2NrCiAgICAgICAgdGltZSwgY29uc2lkZXIgaGF2aW5nIGEgc2Vjb25kICJ3YXRjaGVyIiB0aHJlYWQgdG8gY3V0IG9mZiBhIHNsb3cKICAgICAgICByZXF1ZXN0LgogICAgIiIiCgogICAgIzogQSBzZW50aW5lbCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUKICAgIERFRkFVTFRfVElNRU9VVCA9IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsPU5vbmUsIGNvbm5lY3Q9X0RlZmF1bHQsIHJlYWQ9X0RlZmF1bHQpOgogICAgICAgIHNlbGYuX2Nvbm5lY3QgPSBzZWxmLl92YWxpZGF0ZV90aW1lb3V0KGNvbm5lY3QsICdjb25uZWN0JykKICAgICAgICBzZWxmLl9yZWFkID0gc2VsZi5fdmFsaWRhdGVfdGltZW91dChyZWFkLCAncmVhZCcpCiAgICAgICAgc2VsZi50b3RhbCA9IHNlbGYuX3ZhbGlkYXRlX3RpbWVvdXQodG90YWwsICd0b3RhbCcpCiAgICAgICAgc2VsZi5fc3RhcnRfY29ubmVjdCA9IE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKGNvbm5lY3Q9JXIsIHJlYWQ9JXIsIHRvdGFsPSVyKScgJSAoCiAgICAgICAgICAgIHR5cGUoc2VsZikuX19uYW1lX18sIHNlbGYuX2Nvbm5lY3QsIHNlbGYuX3JlYWQsIHNlbGYudG90YWwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3ZhbGlkYXRlX3RpbWVvdXQoY2xzLCB2YWx1ZSwgbmFtZSk6CiAgICAgICAgIiIiIENoZWNrIHRoYXQgYSB0aW1lb3V0IGF0dHJpYnV0ZSBpcyB2YWxpZC4KCiAgICAgICAgOnBhcmFtIHZhbHVlOiBUaGUgdGltZW91dCB2YWx1ZSB0byB2YWxpZGF0ZQogICAgICAgIDpwYXJhbSBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgdGltZW91dCBhdHRyaWJ1dGUgdG8gdmFsaWRhdGUuIFRoaXMgaXMKICAgICAgICAgICAgdXNlZCB0byBzcGVjaWZ5IGluIGVycm9yIG1lc3NhZ2VzLgogICAgICAgIDpyZXR1cm46IFRoZSB2YWxpZGF0ZWQgYW5kIGNhc3RlZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAgICA6cmFpc2VzIFZhbHVlRXJyb3I6IElmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAgICAgICAgICAgemVybywgb3IgdGhlIHR5cGUgaXMgbm90IGFuIGludGVnZXIsIGZsb2F0LCBvciBOb25lLgogICAgICAgICIiIgogICAgICAgIGlmIHZhbHVlIGlzIF9EZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gY2xzLkRFRkFVTFRfVElNRU9VVAoKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lIG9yIHZhbHVlIGlzIGNscy5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCBjYW5ub3QgYmUgYSBib29sZWFuIHZhbHVlLiBJdCBtdXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgYW4gaW50LCBmbG9hdCBvciBOb25lLiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmbG9hdCh2YWx1ZSkKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRpbWVvdXQgdmFsdWUgJXMgd2FzICVzLCBidXQgaXQgbXVzdCBiZSBhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgZmxvYXQgb3IgTm9uZS4iICUgKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiB2YWx1ZSA8PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQXR0ZW1wdGVkIHRvIHNldCAlcyB0aW1lb3V0IHRvICVzLCBidXQgdGhlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgY2Fubm90IGJlIHNldCB0byBhIHZhbHVlIGxlc3MgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiBvciBlcXVhbCB0byAwLiIgJSAobmFtZSwgdmFsdWUpKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRpbWVvdXQgdmFsdWUgJXMgd2FzICVzLCBidXQgaXQgbXVzdCBiZSBhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgZmxvYXQgb3IgTm9uZS4iICUgKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9mbG9hdChjbHMsIHRpbWVvdXQpOgogICAgICAgICIiIiBDcmVhdGUgYSBuZXcgVGltZW91dCBmcm9tIGEgbGVnYWN5IHRpbWVvdXQgdmFsdWUuCgogICAgICAgIFRoZSB0aW1lb3V0IHZhbHVlIHVzZWQgYnkgaHR0cGxpYi5weSBzZXRzIHRoZSBzYW1lIHRpbWVvdXQgb24gdGhlCiAgICAgICAgY29ubmVjdCgpLCBhbmQgcmVjdigpIHNvY2tldCByZXF1ZXN0cy4gVGhpcyBjcmVhdGVzIGEgOmNsYXNzOmBUaW1lb3V0YAogICAgICAgIG9iamVjdCB0aGF0IHNldHMgdGhlIGluZGl2aWR1YWwgdGltZW91dHMgdG8gdGhlIGBgdGltZW91dGBgIHZhbHVlCiAgICAgICAgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiBUaGUgbGVnYWN5IHRpbWVvdXQgdmFsdWUuCiAgICAgICAgOnR5cGUgdGltZW91dDogaW50ZWdlciwgZmxvYXQsIHNlbnRpbmVsIGRlZmF1bHQgb2JqZWN0LCBvciBOb25lCiAgICAgICAgOnJldHVybjogVGltZW91dCBvYmplY3QKICAgICAgICA6cnR5cGU6IDpjbGFzczpgVGltZW91dGAKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVGltZW91dChyZWFkPXRpbWVvdXQsIGNvbm5lY3Q9dGltZW91dCkKCiAgICBkZWYgY2xvbmUoc2VsZik6CiAgICAgICAgIiIiIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHRpbWVvdXQgb2JqZWN0CgogICAgICAgIFRpbWVvdXQgcHJvcGVydGllcyBhcmUgc3RvcmVkIHBlci1wb29sIGJ1dCBlYWNoIHJlcXVlc3QgbmVlZHMgYSBmcmVzaAogICAgICAgIFRpbWVvdXQgb2JqZWN0IHRvIGVuc3VyZSBlYWNoIG9uZSBoYXMgaXRzIG93biBzdGFydC9zdG9wIGNvbmZpZ3VyZWQuCgogICAgICAgIDpyZXR1cm46IGEgY29weSBvZiB0aGUgdGltZW91dCBvYmplY3QKICAgICAgICA6cnR5cGU6IDpjbGFzczpgVGltZW91dGAKICAgICAgICAiIiIKICAgICAgICAjIFdlIGNhbid0IHVzZSBjb3B5LmRlZXBjb3B5IGJlY2F1c2UgdGhhdCB3aWxsIGFsc28gY3JlYXRlIGEgbmV3IG9iamVjdAogICAgICAgICMgZm9yIF9HTE9CQUxfREVGQVVMVF9USU1FT1VULCB3aGljaCBzb2NrZXQucHkgdXNlcyBhcyBhIHNlbnRpbmVsIHRvCiAgICAgICAgIyBkZXRlY3QgdGhlIHVzZXIgZGVmYXVsdC4KICAgICAgICByZXR1cm4gVGltZW91dChjb25uZWN0PXNlbGYuX2Nvbm5lY3QsIHJlYWQ9c2VsZi5fcmVhZCwKICAgICAgICAgICAgICAgICAgICAgICB0b3RhbD1zZWxmLnRvdGFsKQoKICAgIGRlZiBzdGFydF9jb25uZWN0KHNlbGYpOgogICAgICAgICIiIiBTdGFydCB0aGUgdGltZW91dCBjbG9jaywgdXNlZCBkdXJpbmcgYSBjb25uZWN0KCkgYXR0ZW1wdAoKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogaWYgeW91IGF0dGVtcHQKICAgICAgICAgICAgdG8gc3RhcnQgYSB0aW1lciB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBUaW1lb3V0U3RhdGVFcnJvcigiVGltZW91dCB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuIikKICAgICAgICBzZWxmLl9zdGFydF9jb25uZWN0ID0gY3VycmVudF90aW1lKCkKICAgICAgICByZXR1cm4gc2VsZi5fc3RhcnRfY29ubmVjdAoKICAgIGRlZiBnZXRfY29ubmVjdF9kdXJhdGlvbihzZWxmKToKICAgICAgICAiIiIgR2V0cyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBjYWxsIHRvIDptZXRoOmBzdGFydF9jb25uZWN0YC4KCiAgICAgICAgOnJldHVybjogRWxhcHNlZCB0aW1lLgogICAgICAgIDpydHlwZTogZmxvYXQKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogaWYgeW91IGF0dGVtcHQKICAgICAgICAgICAgdG8gZ2V0IGR1cmF0aW9uIGZvciBhIHRpbWVyIHRoYXQgaGFzbid0IGJlZW4gc3RhcnRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRTdGF0ZUVycm9yKCJDYW4ndCBnZXQgY29ubmVjdCBkdXJhdGlvbiBmb3IgdGltZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBoYXMgbm90IHN0YXJ0ZWQuIikKICAgICAgICByZXR1cm4gY3VycmVudF90aW1lKCkgLSBzZWxmLl9zdGFydF9jb25uZWN0CgogICAgQHByb3BlcnR5CiAgICBkZWYgY29ubmVjdF90aW1lb3V0KHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIHRvIHVzZSB3aGVuIHNldHRpbmcgYSBjb25uZWN0aW9uIHRpbWVvdXQuCgogICAgICAgIFRoaXMgd2lsbCBiZSBhIHBvc2l0aXZlIGZsb2F0IG9yIGludGVnZXIsIHRoZSB2YWx1ZSBOb25lCiAgICAgICAgKG5ldmVyIHRpbWVvdXQpLCBvciB0aGUgZGVmYXVsdCBzeXN0ZW0gdGltZW91dC4KCiAgICAgICAgOnJldHVybjogQ29ubmVjdCB0aW1lb3V0LgogICAgICAgIDpydHlwZTogaW50LCBmbG9hdCwgOmF0dHI6YFRpbWVvdXQuREVGQVVMVF9USU1FT1VUYCBvciBOb25lCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi50b3RhbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdAoKICAgICAgICBpZiBzZWxmLl9jb25uZWN0IGlzIE5vbmUgb3Igc2VsZi5fY29ubmVjdCBpcyBzZWxmLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYudG90YWwKCiAgICAgICAgcmV0dXJuIG1pbihzZWxmLl9jb25uZWN0LCBzZWxmLnRvdGFsKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlYWRfdGltZW91dChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHJlYWQgdGltZW91dC4KCiAgICAgICAgVGhpcyBhc3N1bWVzIHNvbWUgdGltZSBoYXMgZWxhcHNlZCBpbiB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGFuZAogICAgICAgIGNvbXB1dGVzIHRoZSByZWFkIHRpbWVvdXQgYXBwcm9wcmlhdGVseS4KCiAgICAgICAgSWYgc2VsZi50b3RhbCBpcyBzZXQsIHRoZSByZWFkIHRpbWVvdXQgaXMgZGVwZW5kZW50IG9uIHRoZSBhbW91bnQgb2YKICAgICAgICB0aW1lIHRha2VuIGJ5IHRoZSBjb25uZWN0IHRpbWVvdXQuIElmIHRoZSBjb25uZWN0aW9uIHRpbWUgaGFzIG5vdCBiZWVuCiAgICAgICAgZXN0YWJsaXNoZWQsIGEgOmV4YzpgfnVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcmAgd2lsbCBiZQogICAgICAgIHJhaXNlZC4KCiAgICAgICAgOnJldHVybjogVmFsdWUgdG8gdXNlIGZvciB0aGUgcmVhZCB0aW1lb3V0LgogICAgICAgIDpydHlwZTogaW50LCBmbG9hdCwgOmF0dHI6YFRpbWVvdXQuREVGQVVMVF9USU1FT1VUYCBvciBOb25lCiAgICAgICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuVGltZW91dFN0YXRlRXJyb3I6IElmIDptZXRoOmBzdGFydF9jb25uZWN0YAogICAgICAgICAgICBoYXMgbm90IHlldCBiZWVuIGNhbGxlZCBvbiB0aGlzIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiAoc2VsZi50b3RhbCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgIHNlbGYudG90YWwgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fcmVhZCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUKToKICAgICAgICAgICAgIyBJbiBjYXNlIHRoZSBjb25uZWN0IHRpbWVvdXQgaGFzIG5vdCB5ZXQgYmVlbiBlc3RhYmxpc2hlZC4KICAgICAgICAgICAgaWYgc2VsZi5fc3RhcnRfY29ubmVjdCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWQKICAgICAgICAgICAgcmV0dXJuIG1heCgwLCBtaW4oc2VsZi50b3RhbCAtIHNlbGYuZ2V0X2Nvbm5lY3RfZHVyYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZCkpCiAgICAgICAgZWxpZiBzZWxmLnRvdGFsIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRvdGFsIGlzIG5vdCBzZWxmLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIG1heCgwLCBzZWxmLnRvdGFsIC0gc2VsZi5nZXRfY29ubmVjdF9kdXJhdGlvbigpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkClBLAwQUAAAAAAAAACEAwx5tEVcZAABXGQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IExvY2F0aW9uUGFyc2VFcnJvcgoKCnVybF9hdHRycyA9IFsnc2NoZW1lJywgJ2F1dGgnLCAnaG9zdCcsICdwb3J0JywgJ3BhdGgnLCAncXVlcnknLCAnZnJhZ21lbnQnXQoKIyBXZSBvbmx5IHdhbnQgdG8gbm9ybWFsaXplIHVybHMgd2l0aCBhbiBIVFRQKFMpIHNjaGVtZS4KIyB1cmxsaWIzIGluZmVycyBVUkxzIHdpdGhvdXQgYSBzY2hlbWUgKE5vbmUpIHRvIGJlIGh0dHAuCk5PUk1BTElaQUJMRV9TQ0hFTUVTID0gKCdodHRwJywgJ2h0dHBzJywgTm9uZSkKCgpjbGFzcyBVcmwobmFtZWR0dXBsZSgnVXJsJywgdXJsX2F0dHJzKSk6CiAgICAiIiIKICAgIERhdGFzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBhbiBIVFRQIFVSTC4gVXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IKICAgIDpmdW5jOmBwYXJzZV91cmxgLiBCb3RoIHRoZSBzY2hlbWUgYW5kIGhvc3QgYXJlIG5vcm1hbGl6ZWQgYXMgdGhleSBhcmUKICAgIGJvdGggY2FzZS1pbnNlbnNpdGl2ZSBhY2NvcmRpbmcgdG8gUkZDIDM5ODYuCiAgICAiIiIKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgZGVmIF9fbmV3X18oY2xzLCBzY2hlbWU9Tm9uZSwgYXV0aD1Ob25lLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lLAogICAgICAgICAgICAgICAgcXVlcnk9Tm9uZSwgZnJhZ21lbnQ9Tm9uZSk6CiAgICAgICAgaWYgcGF0aCBhbmQgbm90IHBhdGguc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aAogICAgICAgIGlmIHNjaGVtZToKICAgICAgICAgICAgc2NoZW1lID0gc2NoZW1lLmxvd2VyKCkKICAgICAgICBpZiBob3N0IGFuZCBzY2hlbWUgaW4gTk9STUFMSVpBQkxFX1NDSEVNRVM6CiAgICAgICAgICAgIGhvc3QgPSBob3N0Lmxvd2VyKCkKICAgICAgICByZXR1cm4gc3VwZXIoVXJsLCBjbHMpLl9fbmV3X18oY2xzLCBzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0bmFtZShzZWxmKToKICAgICAgICAiIiJGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCB1cmxwYXJzZS4gV2UncmUgbmljZSBsaWtlIHRoYXQuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaG9zdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVlc3RfdXJpKHNlbGYpOgogICAgICAgICIiIkFic29sdXRlIHBhdGggaW5jbHVkaW5nIHRoZSBxdWVyeSBzdHJpbmcuIiIiCiAgICAgICAgdXJpID0gc2VsZi5wYXRoIG9yICcvJwoKICAgICAgICBpZiBzZWxmLnF1ZXJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmkgKz0gJz8nICsgc2VsZi5xdWVyeQoKICAgICAgICByZXR1cm4gdXJpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0bG9jKHNlbGYpOgogICAgICAgICIiIk5ldHdvcmsgbG9jYXRpb24gaW5jbHVkaW5nIGhvc3QgYW5kIHBvcnQiIiIKICAgICAgICBpZiBzZWxmLnBvcnQ6CiAgICAgICAgICAgIHJldHVybiAnJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQogICAgICAgIHJldHVybiBzZWxmLmhvc3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1cmwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCBzZWxmIGludG8gYSB1cmwKCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbW9yZSBvciBsZXNzIHJvdW5kLXRyaXAgd2l0aCA6ZnVuYzpgLnBhcnNlX3VybGAuIFRoZQogICAgICAgIHJldHVybmVkIHVybCBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHVybCBpbnB1dHRlZCB0bwogICAgICAgIDpmdW5jOmAucGFyc2VfdXJsYCwgYnV0IGl0IHNob3VsZCBiZSBlcXVpdmFsZW50IGJ5IHRoZSBSRkMgKGUuZy4sIHVybHMKICAgICAgICB3aXRoIGEgYmxhbmsgcG9ydCB3aWxsIGhhdmUgOiByZW1vdmVkKS4KCiAgICAgICAgRXhhbXBsZTogOjoKCiAgICAgICAgICAgID4+PiBVID0gcGFyc2VfdXJsKCdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsLycpCiAgICAgICAgICAgID4+PiBVLnVybAogICAgICAgICAgICAnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nCiAgICAgICAgICAgID4+PiBVcmwoJ2h0dHAnLCAndXNlcm5hbWU6cGFzc3dvcmQnLCAnaG9zdC5jb20nLCA4MCwKICAgICAgICAgICAgLi4uICcvcGF0aCcsICdxdWVyeScsICdmcmFnbWVudCcpLnVybAogICAgICAgICAgICAnaHR0cDovL3VzZXJuYW1lOnBhc3N3b3JkQGhvc3QuY29tOjgwL3BhdGg/cXVlcnkjZnJhZ21lbnQnCiAgICAgICAgIiIiCiAgICAgICAgc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSBzZWxmCiAgICAgICAgdXJsID0gJycKCiAgICAgICAgIyBXZSB1c2UgImlzIG5vdCBOb25lIiB3ZSB3YW50IHRoaW5ncyB0byBoYXBwZW4gd2l0aCBlbXB0eSBzdHJpbmdzIChvciAwIHBvcnQpCiAgICAgICAgaWYgc2NoZW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gc2NoZW1lICsgJzovLycKICAgICAgICBpZiBhdXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gYXV0aCArICdAJwogICAgICAgIGlmIGhvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBob3N0CiAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9ICc6JyArIHN0cihwb3J0KQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBwYXRoCiAgICAgICAgaWYgcXVlcnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSAnPycgKyBxdWVyeQogICAgICAgIGlmIGZyYWdtZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gJyMnICsgZnJhZ21lbnQKCiAgICAgICAgcmV0dXJuIHVybAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnVybAoKCmRlZiBzcGxpdF9maXJzdChzLCBkZWxpbXMpOgogICAgIiIiCiAgICBHaXZlbiBhIHN0cmluZyBhbmQgYW4gaXRlcmFibGUgb2YgZGVsaW1pdGVycywgc3BsaXQgb24gdGhlIGZpcnN0IGZvdW5kCiAgICBkZWxpbWl0ZXIuIFJldHVybiB0d28gc3BsaXQgcGFydHMgYW5kIHRoZSBtYXRjaGVkIGRlbGltaXRlci4KCiAgICBJZiBub3QgZm91bmQsIHRoZW4gdGhlIGZpcnN0IHBhcnQgaXMgdGhlIGZ1bGwgaW5wdXQgc3RyaW5nLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gc3BsaXRfZmlyc3QoJ2Zvby9iYXI/YmF6JywgJz8vPScpCiAgICAgICAgKCdmb28nLCAnYmFyP2JheicsICcvJykKICAgICAgICA+Pj4gc3BsaXRfZmlyc3QoJ2Zvby9iYXI/YmF6JywgJzEyMycpCiAgICAgICAgKCdmb28vYmFyP2JheicsICcnLCBOb25lKQoKICAgIFNjYWxlcyBsaW5lYXJseSB3aXRoIG51bWJlciBvZiBkZWxpbXMuIE5vdCBpZGVhbCBmb3IgbGFyZ2UgbnVtYmVyIG9mIGRlbGltcy4KICAgICIiIgogICAgbWluX2lkeCA9IE5vbmUKICAgIG1pbl9kZWxpbSA9IE5vbmUKICAgIGZvciBkIGluIGRlbGltczoKICAgICAgICBpZHggPSBzLmZpbmQoZCkKICAgICAgICBpZiBpZHggPCAwOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBtaW5faWR4IGlzIE5vbmUgb3IgaWR4IDwgbWluX2lkeDoKICAgICAgICAgICAgbWluX2lkeCA9IGlkeAogICAgICAgICAgICBtaW5fZGVsaW0gPSBkCgogICAgaWYgbWluX2lkeCBpcyBOb25lIG9yIG1pbl9pZHggPCAwOgogICAgICAgIHJldHVybiBzLCAnJywgTm9uZQoKICAgIHJldHVybiBzWzptaW5faWR4XSwgc1ttaW5faWR4ICsgMTpdLCBtaW5fZGVsaW0KCgpkZWYgcGFyc2VfdXJsKHVybCk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsLCByZXR1cm4gYSBwYXJzZWQgOmNsYXNzOmAuVXJsYCBuYW1lZHR1cGxlLiBCZXN0LWVmZm9ydCBpcwogICAgcGVyZm9ybWVkIHRvIHBhcnNlIGluY29tcGxldGUgdXJscy4gRmllbGRzIG5vdCBwcm92aWRlZCB3aWxsIGJlIE5vbmUuCgogICAgUGFydGx5IGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggOm1vZDpgdXJscGFyc2VgLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gcGFyc2VfdXJsKCdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsLycpCiAgICAgICAgVXJsKHNjaGVtZT0naHR0cCcsIGhvc3Q9J2dvb2dsZS5jb20nLCBwb3J0PU5vbmUsIHBhdGg9Jy9tYWlsLycsIC4uLikKICAgICAgICA+Pj4gcGFyc2VfdXJsKCdnb29nbGUuY29tOjgwJykKICAgICAgICBVcmwoc2NoZW1lPU5vbmUsIGhvc3Q9J2dvb2dsZS5jb20nLCBwb3J0PTgwLCBwYXRoPU5vbmUsIC4uLikKICAgICAgICA+Pj4gcGFyc2VfdXJsKCcvZm9vP2JhcicpCiAgICAgICAgVXJsKHNjaGVtZT1Ob25lLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgcGF0aD0nL2ZvbycsIHF1ZXJ5PSdiYXInLCAuLi4pCiAgICAiIiIKCiAgICAjIFdoaWxlIHRoaXMgY29kZSBoYXMgb3ZlcmxhcCB3aXRoIHN0ZGxpYidzIHVybHBhcnNlLCBpdCBpcyBtdWNoCiAgICAjIHNpbXBsaWZpZWQgZm9yIG91ciBuZWVkcyBhbmQgbGVzcyBhbm5veWluZy4KICAgICMgQWRkaXRpb25hbGx5LCB0aGlzIGltcGxlbWVudGF0aW9ucyBkb2VzIHNpbGx5IHRoaW5ncyB0byBiZSBvcHRpbWFsCiAgICAjIG9uIENQeXRob24uCgogICAgaWYgbm90IHVybDoKICAgICAgICAjIEVtcHR5CiAgICAgICAgcmV0dXJuIFVybCgpCgogICAgc2NoZW1lID0gTm9uZQogICAgYXV0aCA9IE5vbmUKICAgIGhvc3QgPSBOb25lCiAgICBwb3J0ID0gTm9uZQogICAgcGF0aCA9IE5vbmUKICAgIGZyYWdtZW50ID0gTm9uZQogICAgcXVlcnkgPSBOb25lCgogICAgIyBTY2hlbWUKICAgIGlmICc6Ly8nIGluIHVybDoKICAgICAgICBzY2hlbWUsIHVybCA9IHVybC5zcGxpdCgnOi8vJywgMSkKCiAgICAjIEZpbmQgdGhlIGVhcmxpZXN0IEF1dGhvcml0eSBUZXJtaW5hdG9yCiAgICAjIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yKQogICAgdXJsLCBwYXRoXywgZGVsaW0gPSBzcGxpdF9maXJzdCh1cmwsIFsnLycsICc/JywgJyMnXSkKCiAgICBpZiBkZWxpbToKICAgICAgICAjIFJlYXNzZW1ibGUgdGhlIHBhdGgKICAgICAgICBwYXRoID0gZGVsaW0gKyBwYXRoXwoKICAgICMgQXV0aAogICAgaWYgJ0AnIGluIHVybDoKICAgICAgICAjIExhc3QgJ0AnIGRlbm90ZXMgZW5kIG9mIGF1dGggcGFydAogICAgICAgIGF1dGgsIHVybCA9IHVybC5yc3BsaXQoJ0AnLCAxKQoKICAgICMgSVB2NgogICAgaWYgdXJsIGFuZCB1cmxbMF0gPT0gJ1snOgogICAgICAgIGhvc3QsIHVybCA9IHVybC5zcGxpdCgnXScsIDEpCiAgICAgICAgaG9zdCArPSAnXScKCiAgICAjIFBvcnQKICAgIGlmICc6JyBpbiB1cmw6CiAgICAgICAgX2hvc3QsIHBvcnQgPSB1cmwuc3BsaXQoJzonLCAxKQoKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgaG9zdCA9IF9ob3N0CgogICAgICAgIGlmIHBvcnQ6CiAgICAgICAgICAgICMgSWYgZ2l2ZW4sIHBvcnRzIG11c3QgYmUgaW50ZWdlcnMuIE5vIHdoaXRlc3BhY2UsIG5vIHBsdXMgb3IKICAgICAgICAgICAgIyBtaW51cyBwcmVmaXhlcywgbm8gbm9uLWludGVnZXIgZGlnaXRzIHN1Y2ggYXMgXjIgKHN1cGVyc2NyaXB0KS4KICAgICAgICAgICAgaWYgbm90IHBvcnQuaXNkaWdpdCgpOgogICAgICAgICAgICAgICAgcmFpc2UgTG9jYXRpb25QYXJzZUVycm9yKHVybCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcG9ydCA9IGludChwb3J0KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uUGFyc2VFcnJvcih1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBCbGFuayBwb3J0cyBhcmUgY29vbCwgdG9vLiAocmZjMzk4NiNzZWN0aW9uLTMuMi4zKQogICAgICAgICAgICBwb3J0ID0gTm9uZQoKICAgIGVsaWYgbm90IGhvc3QgYW5kIHVybDoKICAgICAgICBob3N0ID0gdXJsCgogICAgaWYgbm90IHBhdGg6CiAgICAgICAgcmV0dXJuIFVybChzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKCiAgICAjIEZyYWdtZW50CiAgICBpZiAnIycgaW4gcGF0aDoKICAgICAgICBwYXRoLCBmcmFnbWVudCA9IHBhdGguc3BsaXQoJyMnLCAxKQoKICAgICMgUXVlcnkKICAgIGlmICc/JyBpbiBwYXRoOgogICAgICAgIHBhdGgsIHF1ZXJ5ID0gcGF0aC5zcGxpdCgnPycsIDEpCgogICAgcmV0dXJuIFVybChzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKCgpkZWYgZ2V0X2hvc3QodXJsKToKICAgICIiIgogICAgRGVwcmVjYXRlZC4gVXNlIDpmdW5jOmBwYXJzZV91cmxgIGluc3RlYWQuCiAgICAiIiIKICAgIHAgPSBwYXJzZV91cmwodXJsKQogICAgcmV0dXJuIHAuc2NoZW1lIG9yICdodHRwJywgcC5ob3N0bmFtZSwgcC5wb3J0ClBLAwQUAAAAAAAAACEAtjwj/KsFAACrBQAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvd2FpdC5weWZyb20gLnNlbGVjdG9ycyBpbXBvcnQgKAogICAgSEFTX1NFTEVDVCwKICAgIERlZmF1bHRTZWxlY3RvciwKICAgIEVWRU5UX1JFQUQsCiAgICBFVkVOVF9XUklURQopCgoKZGVmIF93YWl0X2Zvcl9pb19ldmVudHMoc29ja3MsIGV2ZW50cywgdGltZW91dD1Ob25lKToKICAgICIiIiBXYWl0cyBmb3IgSU8gZXZlbnRzIHRvIGJlIGF2YWlsYWJsZSBmcm9tIGEgbGlzdCBvZiBzb2NrZXRzCiAgICBvciBvcHRpb25hbGx5IGEgc2luZ2xlIHNvY2tldCBpZiBwYXNzZWQgaW4uIFJldHVybnMgYSBsaXN0IG9mCiAgICBzb2NrZXRzIHRoYXQgY2FuIGJlIGludGVyYWN0ZWQgd2l0aCBpbW1lZGlhdGVseS4gIiIiCiAgICBpZiBub3QgSEFTX1NFTEVDVDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIGEgc2VsZWN0b3InKQogICAgaWYgbm90IGlzaW5zdGFuY2Uoc29ja3MsIGxpc3QpOgogICAgICAgICMgUHJvYmFibHkganVzdCBhIHNpbmdsZSBzb2NrZXQuCiAgICAgICAgaWYgaGFzYXR0cihzb2NrcywgImZpbGVubyIpOgogICAgICAgICAgICBzb2NrcyA9IFtzb2Nrc10KICAgICAgICAjIE90aGVyd2lzZSBpdCBtaWdodCBiZSBhIG5vbi1saXN0IGl0ZXJhYmxlLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNvY2tzID0gbGlzdChzb2NrcykKICAgIHdpdGggRGVmYXVsdFNlbGVjdG9yKCkgYXMgc2VsZWN0b3I6CiAgICAgICAgZm9yIHNvY2sgaW4gc29ja3M6CiAgICAgICAgICAgIHNlbGVjdG9yLnJlZ2lzdGVyKHNvY2ssIGV2ZW50cykKICAgICAgICByZXR1cm4gW2tleVswXS5maWxlb2JqIGZvciBrZXkgaW4KICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdCh0aW1lb3V0KSBpZiBrZXlbMV0gJiBldmVudHNdCgoKZGVmIHdhaXRfZm9yX3JlYWQoc29ja3MsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiIgV2FpdHMgZm9yIHJlYWRpbmcgdG8gYmUgYXZhaWxhYmxlIGZyb20gYSBsaXN0IG9mIHNvY2tldHMKICAgIG9yIG9wdGlvbmFsbHkgYSBzaW5nbGUgc29ja2V0IGlmIHBhc3NlZCBpbi4gUmV0dXJucyBhIGxpc3Qgb2YKICAgIHNvY2tldHMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIGltbWVkaWF0ZWx5LiAiIiIKICAgIHJldHVybiBfd2FpdF9mb3JfaW9fZXZlbnRzKHNvY2tzLCBFVkVOVF9SRUFELCB0aW1lb3V0KQoKCmRlZiB3YWl0X2Zvcl93cml0ZShzb2NrcywgdGltZW91dD1Ob25lKToKICAgICIiIiBXYWl0cyBmb3Igd3JpdGluZyB0byBiZSBhdmFpbGFibGUgZnJvbSBhIGxpc3Qgb2Ygc29ja2V0cwogICAgb3Igb3B0aW9uYWxseSBhIHNpbmdsZSBzb2NrZXQgaWYgcGFzc2VkIGluLiBSZXR1cm5zIGEgbGlzdCBvZgogICAgc29ja2V0cyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGltbWVkaWF0ZWx5LiAiIiIKICAgIHJldHVybiBfd2FpdF9mb3JfaW9fZXZlbnRzKHNvY2tzLCBFVkVOVF9XUklURSwgdGltZW91dCkKUEsDBBQAAAAAAAAAIQBvwaE4UCkAAFApAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGY4CiIiIgoKICAgIHdlYmVuY29kaW5ncwogICAgfn5+fn5+fn5+fn5+CgogICAgVGhpcyBpcyBhIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYFdIQVRXRyBFbmNvZGluZyBzdGFuZGFyZAogICAgPGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvPmAuIFNlZSBSRUFETUUgZm9yIGRldGFpbHMuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBjb2RlY3MKCmZyb20gLmxhYmVscyBpbXBvcnQgTEFCRUxTCgoKVkVSU0lPTiA9ICcwLjUnCgoKIyBTb21lIG5hbWVzIGluIEVuY29kaW5nIGFyZSBub3QgdmFsaWQgUHl0aG9uIGFsaWFzZXMuIFJlbWFwIHRoZXNlLgpQWVRIT05fTkFNRVMgPSB7CiAgICAnaXNvLTg4NTktOC1pJzogJ2lzby04ODU5LTgnLAogICAgJ3gtbWFjLWN5cmlsbGljJzogJ21hYy1jeXJpbGxpYycsCiAgICAnbWFjaW50b3NoJzogJ21hYy1yb21hbicsCiAgICAnd2luZG93cy04NzQnOiAnY3A4NzQnfQoKQ0FDSEUgPSB7fQoKCmRlZiBhc2NpaV9sb3dlcihzdHJpbmcpOgogICAgciIiIlRyYW5zZm9ybSAob25seSkgQVNDSUkgbGV0dGVycyB0byBsb3dlciBjYXNlOiBBLVogaXMgbWFwcGVkIHRvIGEtei4KCiAgICA6cGFyYW0gc3RyaW5nOiBBbiBVbmljb2RlIHN0cmluZy4KICAgIDpyZXR1cm5zOiBBIG5ldyBVbmljb2RlIHN0cmluZy4KCiAgICBUaGlzIGlzIHVzZWQgZm9yIGBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktY2FzZS1pbnNlbnNpdGl2ZT5gXwogICAgbWF0Y2hpbmcgb2YgZW5jb2RpbmcgbGFiZWxzLgogICAgVGhlIHNhbWUgbWF0Y2hpbmcgaXMgYWxzbyB1c2VkLCBhbW9uZyBvdGhlciB0aGluZ3MsCiAgICBmb3IgYENTUyBrZXl3b3JkcyA8aHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLXZhbHVlcy8ja2V5d29yZHM+YF8uCgogICAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgOm1ldGg6YH5weTpzdHIubG93ZXJgIG1ldGhvZCBvZiBVbmljb2RlIHN0cmluZ3MKICAgIHdoaWNoIGFsc28gYWZmZWN0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLAogICAgc29tZXRpbWVzIG1hcHBpbmcgdGhlbSBpbnRvIHRoZSBBU0NJSSByYW5nZToKCiAgICAgICAgPj4+IGtleXdvcmQgPSB1J0JhY1xOe0tFTFZJTiBTSUdOfWdyb3VuZCcKICAgICAgICA+Pj4gYXNzZXJ0IGtleXdvcmQubG93ZXIoKSA9PSB1J2JhY2tncm91bmQnCiAgICAgICAgPj4+IGFzc2VydCBhc2NpaV9sb3dlcihrZXl3b3JkKSAhPSBrZXl3b3JkLmxvd2VyKCkKICAgICAgICA+Pj4gYXNzZXJ0IGFzY2lpX2xvd2VyKGtleXdvcmQpID09IHUnYmFjXE57S0VMVklOIFNJR059Z3JvdW5kJwoKICAgICIiIgogICAgIyBUaGlzIHR1cm5zIG91dCB0byBiZSBmYXN0ZXIgdGhhbiB1bmljb2RlLnRyYW5zbGF0ZSgpCiAgICByZXR1cm4gc3RyaW5nLmVuY29kZSgndXRmOCcpLmxvd2VyKCkuZGVjb2RlKCd1dGY4JykKCgpkZWYgbG9va3VwKGxhYmVsKToKICAgICIiIgogICAgTG9vayBmb3IgYW4gZW5jb2RpbmcgYnkgaXRzIGxhYmVsLgogICAgVGhpcyBpcyB0aGUgc3BlY+KAmXMgYGdldCBhbiBlbmNvZGluZwogICAgPGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0PmBfIGFsZ29yaXRobS4KICAgIFN1cHBvcnRlZCBsYWJlbHMgYXJlIGxpc3RlZCB0aGVyZS4KCiAgICA6cGFyYW0gbGFiZWw6IEEgc3RyaW5nLgogICAgOnJldHVybnM6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0LCBvciA6b2JqOmBOb25lYCBmb3IgYW4gdW5rbm93biBsYWJlbC4KCiAgICAiIiIKICAgICMgT25seSBzdHJpcCBBU0NJSSB3aGl0ZXNwYWNlOiBVKzAwMDksIFUrMDAwQSwgVSswMDBDLCBVKzAwMEQsIGFuZCBVKzAwMjAuCiAgICBsYWJlbCA9IGFzY2lpX2xvd2VyKGxhYmVsLnN0cmlwKCdcdFxuXGZcciAnKSkKICAgIG5hbWUgPSBMQUJFTFMuZ2V0KGxhYmVsKQogICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBlbmNvZGluZyA9IENBQ0hFLmdldChuYW1lKQogICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICBpZiBuYW1lID09ICd4LXVzZXItZGVmaW5lZCc6CiAgICAgICAgICAgIGZyb20gLnhfdXNlcl9kZWZpbmVkIGltcG9ydCBjb2RlY19pbmZvCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHl0aG9uX25hbWUgPSBQWVRIT05fTkFNRVMuZ2V0KG5hbWUsIG5hbWUpCiAgICAgICAgICAgICMgQW55IHB5dGhvbl9uYW1lIHZhbHVlIHRoYXQgZ2V0cyB0byBoZXJlIHNob3VsZCBiZSB2YWxpZC4KICAgICAgICAgICAgY29kZWNfaW5mbyA9IGNvZGVjcy5sb29rdXAocHl0aG9uX25hbWUpCiAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZyhuYW1lLCBjb2RlY19pbmZvKQogICAgICAgIENBQ0hFW25hbWVdID0gZW5jb2RpbmcKICAgIHJldHVybiBlbmNvZGluZwoKCmRlZiBfZ2V0X2VuY29kaW5nKGVuY29kaW5nX29yX2xhYmVsKToKICAgICIiIgogICAgQWNjZXB0IGVpdGhlciBhbiBlbmNvZGluZyBvYmplY3Qgb3IgbGFiZWwuCgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cmV0dXJuczogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0LgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGxhYmVsLgoKICAgICIiIgogICAgaWYgaGFzYXR0cihlbmNvZGluZ19vcl9sYWJlbCwgJ2NvZGVjX2luZm8nKToKICAgICAgICByZXR1cm4gZW5jb2Rpbmdfb3JfbGFiZWwKCiAgICBlbmNvZGluZyA9IGxvb2t1cChlbmNvZGluZ19vcl9sYWJlbCkKICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcgbGFiZWw6ICVyJyAlIGVuY29kaW5nX29yX2xhYmVsKQogICAgcmV0dXJuIGVuY29kaW5nCgoKY2xhc3MgRW5jb2Rpbmcob2JqZWN0KToKICAgICIiIlJlcmVzZW50cyBhIGNoYXJhY3RlciBlbmNvZGluZyBzdWNoIGFzIFVURi04LAogICAgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVjb2Rpbmcgb3IgZW5jb2RpbmcuCgogICAgLi4gYXR0cmlidXRlOjogbmFtZQoKICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiB0aGUgZW5jb2RpbmcKCiAgICAuLiBhdHRyaWJ1dGU6OiBjb2RlY19pbmZvCgogICAgICAgIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVuY29kaW5nLAogICAgICAgIGEgc3RkbGliIDpjbGFzczpgfmNvZGVjcy5Db2RlY0luZm9gIG9iamVjdC4KICAgICAgICBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgY29kZWNfaW5mbyk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuY29kZWNfaW5mbyA9IGNvZGVjX2luZm8KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8RW5jb2RpbmcgJXM+JyAlIHNlbGYubmFtZQoKCiM6IFRoZSBVVEYtOCBlbmNvZGluZy4gU2hvdWxkIGJlIHVzZWQgZm9yIG5ldyBjb250ZW50IGFuZCBmb3JtYXRzLgpVVEY4ID0gbG9va3VwKCd1dGYtOCcpCgpfVVRGMTZMRSA9IGxvb2t1cCgndXRmLTE2bGUnKQpfVVRGMTZCRSA9IGxvb2t1cCgndXRmLTE2YmUnKQoKCmRlZiBkZWNvZGUoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICIiIgogICAgRGVjb2RlIGEgc2luZ2xlIHN0cmluZy4KCiAgICA6cGFyYW0gaW5wdXQ6IEEgYnl0ZSBzdHJpbmcKICAgIDpwYXJhbSBmYWxsYmFja19lbmNvZGluZzoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSBpZiA6b2JqOmBpbnB1dGAgZG9lcyBub3RlIGhhdmUgYSBCT00uCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuOgogICAgICAgIEEgYGAob3V0cHV0LCBlbmNvZGluZylgYCB0dXBsZSBvZiBhbiBVbmljb2RlIHN0cmluZwogICAgICAgIGFuZCBhbiA6b2JqOmBFbmNvZGluZ2AuCgogICAgIiIiCiAgICAjIEZhaWwgZWFybHkgaWYgYGVuY29kaW5nYCBpcyBhbiBpbnZhbGlkIGxhYmVsLgogICAgZmFsbGJhY2tfZW5jb2RpbmcgPSBfZ2V0X2VuY29kaW5nKGZhbGxiYWNrX2VuY29kaW5nKQogICAgYm9tX2VuY29kaW5nLCBpbnB1dCA9IF9kZXRlY3RfYm9tKGlucHV0KQogICAgZW5jb2RpbmcgPSBib21fZW5jb2Rpbmcgb3IgZmFsbGJhY2tfZW5jb2RpbmcKICAgIHJldHVybiBlbmNvZGluZy5jb2RlY19pbmZvLmRlY29kZShpbnB1dCwgZXJyb3JzKVswXSwgZW5jb2RpbmcKCgpkZWYgX2RldGVjdF9ib20oaW5wdXQpOgogICAgIiIiUmV0dXJuIChib21fZW5jb2RpbmcsIGlucHV0KSwgd2l0aCBhbnkgQk9NIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQuIiIiCiAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGInXHhGRlx4RkUnKToKICAgICAgICByZXR1cm4gX1VURjE2TEUsIGlucHV0WzI6XQogICAgaWYgaW5wdXQuc3RhcnRzd2l0aChiJ1x4RkVceEZGJyk6CiAgICAgICAgcmV0dXJuIF9VVEYxNkJFLCBpbnB1dFsyOl0KICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoYidceEVGXHhCQlx4QkYnKToKICAgICAgICByZXR1cm4gVVRGOCwgaW5wdXRbMzpdCiAgICByZXR1cm4gTm9uZSwgaW5wdXQKCgpkZWYgZW5jb2RlKGlucHV0LCBlbmNvZGluZz1VVEY4LCBlcnJvcnM9J3N0cmljdCcpOgogICAgIiIiCiAgICBFbmNvZGUgYSBzaW5nbGUgc3RyaW5nLgoKICAgIDpwYXJhbSBpbnB1dDogQW4gVW5pY29kZSBzdHJpbmcuCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm46IEEgYnl0ZSBzdHJpbmcuCgogICAgIiIiCiAgICByZXR1cm4gX2dldF9lbmNvZGluZyhlbmNvZGluZykuY29kZWNfaW5mby5lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0KCgpkZWYgaXRlcl9kZWNvZGUoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICIiIgogICAgIlB1bGwiLWJhc2VkIGRlY29kZXIuCgogICAgOnBhcmFtIGlucHV0OgogICAgICAgIEFuIGl0ZXJhYmxlIG9mIGJ5dGUgc3RyaW5ncy4KCiAgICAgICAgVGhlIGlucHV0IGlzIGZpcnN0IGNvbnN1bWVkIGp1c3QgZW5vdWdoIHRvIGRldGVybWluZSB0aGUgZW5jb2RpbmcKICAgICAgICBiYXNlZCBvbiB0aGUgcHJlY2Vuc2Ugb2YgYSBCT00sCiAgICAgICAgdGhlbiBjb25zdW1lZCBvbiBkZW1hbmQgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzLgogICAgOnBhcmFtIGZhbGxiYWNrX2VuY29kaW5nOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIGlmIDpvYmo6YGlucHV0YCBkb2VzIG5vdGUgaGF2ZSBhIEJPTS4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm5zOgogICAgICAgIEFuIGBgKG91dHB1dCwgZW5jb2RpbmcpYGAgdHVwbGUuCiAgICAgICAgOm9iajpgb3V0cHV0YCBpcyBhbiBpdGVyYWJsZSBvZiBVbmljb2RlIHN0cmluZ3MsCiAgICAgICAgOm9iajpgZW5jb2RpbmdgIGlzIHRoZSA6b2JqOmBFbmNvZGluZ2AgdGhhdCBpcyBiZWluZyB1c2VkLgoKICAgICIiIgoKICAgIGRlY29kZXIgPSBJbmNyZW1lbnRhbERlY29kZXIoZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycykKICAgIGdlbmVyYXRvciA9IF9pdGVyX2RlY29kZV9nZW5lcmF0b3IoaW5wdXQsIGRlY29kZXIpCiAgICBlbmNvZGluZyA9IG5leHQoZ2VuZXJhdG9yKQogICAgcmV0dXJuIGdlbmVyYXRvciwgZW5jb2RpbmcKCgpkZWYgX2l0ZXJfZGVjb2RlX2dlbmVyYXRvcihpbnB1dCwgZGVjb2Rlcik6CiAgICAiIiJSZXR1cm4gYSBnZW5lcmF0b3IgdGhhdCBmaXJzdCB5aWVsZHMgdGhlIDpvYmo6YEVuY29kaW5nYCwKICAgIHRoZW4geWllbGRzIG91dHB1dCBjaHVrbnMgYXMgVW5pY29kZSBzdHJpbmdzLgoKICAgICIiIgogICAgZGVjb2RlID0gZGVjb2Rlci5kZWNvZGUKICAgIGlucHV0ID0gaXRlcihpbnB1dCkKICAgIGZvciBjaHVuY2sgaW4gaW5wdXQ6CiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGNodW5jaykKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIGFzc2VydCBkZWNvZGVyLmVuY29kaW5nIGlzIG5vdCBOb25lCiAgICAgICAgICAgIHlpZWxkIGRlY29kZXIuZW5jb2RpbmcKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgSW5wdXQgZXhoYXVzdGVkIHdpdGhvdXQgZGV0ZXJtaW5pbmcgdGhlIGVuY29kaW5nCiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkKICAgICAgICBhc3NlcnQgZGVjb2Rlci5lbmNvZGluZyBpcyBub3QgTm9uZQogICAgICAgIHlpZWxkIGRlY29kZXIuZW5jb2RpbmcKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgICAgIHJldHVybgoKICAgIGZvciBjaHVuY2sgaW4gaW5wdXQ6CiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGNodW5jaykKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgb3V0cHV0ID0gZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkKICAgIGlmIG91dHB1dDoKICAgICAgICB5aWVsZCBvdXRwdXQKCgpkZWYgaXRlcl9lbmNvZGUoaW5wdXQsIGVuY29kaW5nPVVURjgsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAiIiIKICAgIOKAnFB1bGzigJ0tYmFzZWQgZW5jb2Rlci4KCiAgICA6cGFyYW0gaW5wdXQ6IEFuIGl0ZXJhYmxlIG9mIFVuaWNvZGUgc3RyaW5ncy4KICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybnM6IEFuIGl0ZXJhYmxlIG9mIGJ5dGUgc3RyaW5ncy4KCiAgICAiIiIKICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICBlbmNvZGUgPSBJbmNyZW1lbnRhbEVuY29kZXIoZW5jb2RpbmcsIGVycm9ycykuZW5jb2RlCiAgICByZXR1cm4gX2l0ZXJfZW5jb2RlX2dlbmVyYXRvcihpbnB1dCwgZW5jb2RlKQoKCmRlZiBfaXRlcl9lbmNvZGVfZ2VuZXJhdG9yKGlucHV0LCBlbmNvZGUpOgogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBlbmNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICBvdXRwdXQgPSBlbmNvZGUoJycsIGZpbmFsPVRydWUpCiAgICBpZiBvdXRwdXQ6CiAgICAgICAgeWllbGQgb3V0cHV0CgoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIOKAnFB1c2jigJ0tYmFzZWQgZGVjb2Rlci4KCiAgICA6cGFyYW0gZmFsbGJhY2tfZW5jb2Rpbmc6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgaWYgOm9iajpgaW5wdXRgIGRvZXMgbm90ZSBoYXZlIGEgQk9NLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICAgICAjIEZhaWwgZWFybHkgaWYgYGVuY29kaW5nYCBpcyBhbiBpbnZhbGlkIGxhYmVsLgogICAgICAgIHNlbGYuX2ZhbGxiYWNrX2VuY29kaW5nID0gX2dldF9lbmNvZGluZyhmYWxsYmFja19lbmNvZGluZykKICAgICAgICBzZWxmLl9lcnJvcnMgPSBlcnJvcnMKICAgICAgICBzZWxmLl9idWZmZXIgPSBiJycKICAgICAgICBzZWxmLl9kZWNvZGVyID0gTm9uZQogICAgICAgICM6IFRoZSBhY3R1YWwgOmNsYXNzOmBFbmNvZGluZ2AgdGhhdCBpcyBiZWluZyB1c2VkLAogICAgICAgICM6IG9yIDpvYmo6YE5vbmVgIGlmIHRoYXQgaXMgbm90IGRldGVybWluZWQgeWV0LgogICAgICAgICM6IChJZS4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCB5ZXQgdG8gZGV0ZXJtaW5lCiAgICAgICAgIzogaWYgdGhlcmUgaXMgYSBCT00uKQogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBOb25lICAjIE5vdCBrbm93biB5ZXQuCgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgICIiIkRlY29kZSBvbmUgY2h1bmsgb2YgdGhlIGlucHV0LgoKICAgICAgICA6cGFyYW0gaW5wdXQ6IEEgYnl0ZSBzdHJpbmcuCiAgICAgICAgOnBhcmFtIGZpbmFsOgogICAgICAgICAgICBJbmRpY2F0ZSB0aGF0IG5vIG1vcmUgaW5wdXQgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICBNdXN0IGJlIDpvYmo6YFRydWVgIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbC4KICAgICAgICA6cmV0dXJuczogQW4gVW5pY29kZSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgIGRlY29kZXIgPSBzZWxmLl9kZWNvZGVyCiAgICAgICAgaWYgZGVjb2RlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRlY29kZXIoaW5wdXQsIGZpbmFsKQoKICAgICAgICBpbnB1dCA9IHNlbGYuX2J1ZmZlciArIGlucHV0CiAgICAgICAgZW5jb2RpbmcsIGlucHV0ID0gX2RldGVjdF9ib20oaW5wdXQpCiAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgaWYgbGVuKGlucHV0KSA8IDMgYW5kIG5vdCBmaW5hbDogICMgTm90IGVub3VnaCBkYXRhIHlldC4KICAgICAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IGlucHV0CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgZWxzZTogICMgTm8gQk9NCiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHNlbGYuX2ZhbGxiYWNrX2VuY29kaW5nCiAgICAgICAgZGVjb2RlciA9IGVuY29kaW5nLmNvZGVjX2luZm8uaW5jcmVtZW50YWxkZWNvZGVyKHNlbGYuX2Vycm9ycykuZGVjb2RlCiAgICAgICAgc2VsZi5fZGVjb2RlciA9IGRlY29kZXIKICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICByZXR1cm4gZGVjb2RlcihpbnB1dCwgZmluYWwpCgoKY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIOKAnFB1c2jigJ0tYmFzZWQgZW5jb2Rlci4KCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KCiAgICAuLiBtZXRob2Q6OiBlbmNvZGUoaW5wdXQsIGZpbmFsPUZhbHNlKQoKICAgICAgICA6cGFyYW0gaW5wdXQ6IEFuIFVuaWNvZGUgc3RyaW5nLgogICAgICAgIDpwYXJhbSBmaW5hbDoKICAgICAgICAgICAgSW5kaWNhdGUgdGhhdCBubyBtb3JlIGlucHV0IGlzIGF2YWlsYWJsZS4KICAgICAgICAgICAgTXVzdCBiZSA6b2JqOmBUcnVlYCBpZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwuCiAgICAgICAgOnJldHVybnM6IEEgYnl0ZSBzdHJpbmcuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9VVRGOCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICBlbmNvZGluZyA9IF9nZXRfZW5jb2RpbmcoZW5jb2RpbmcpCiAgICAgICAgc2VsZi5lbmNvZGUgPSBlbmNvZGluZy5jb2RlY19pbmZvLmluY3JlbWVudGFsZW5jb2RlcihlcnJvcnMpLmVuY29kZQpQSwMEFAAAAAAAAAAhAMetCIsTIwAAEyMAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL2xhYmVscy5weSIiIgoKICAgIHdlYmVuY29kaW5ncy5sYWJlbHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBNYXAgZW5jb2RpbmcgbGFiZWxzIHRvIHRoZWlyIG5hbWUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgojIFhYWCBEbyBub3QgZWRpdCEKIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWtsYWJlbHMucHkKCkxBQkVMUyA9IHsKICAgICd1bmljb2RlLTEtMS11dGYtOCc6ICAgJ3V0Zi04JywKICAgICd1dGYtOCc6ICAgICAgICAgICAgICAgJ3V0Zi04JywKICAgICd1dGY4JzogICAgICAgICAgICAgICAgJ3V0Zi04JywKICAgICc4NjYnOiAgICAgICAgICAgICAgICAgJ2libTg2NicsCiAgICAnY3A4NjYnOiAgICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NzaWJtODY2JzogICAgICAgICAgICAnaWJtODY2JywKICAgICdpYm04NjYnOiAgICAgICAgICAgICAgJ2libTg2NicsCiAgICAnY3Npc29sYXRpbjInOiAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc28tODg1OS0yJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzby1pci0xMDEnOiAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvODg1OS0yJzogICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc284ODU5Mic6ICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzb184ODU5LTInOiAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvXzg4NTktMjoxOTg3JzogICAgICdpc28tODg1OS0yJywKICAgICdsMic6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2xhdGluMic6ICAgICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnY3Npc29sYXRpbjMnOiAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc28tODg1OS0zJzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzby1pci0xMDknOiAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvODg1OS0zJzogICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc284ODU5Myc6ICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzb184ODU5LTMnOiAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvXzg4NTktMzoxOTg4JzogICAgICdpc28tODg1OS0zJywKICAgICdsMyc6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2xhdGluMyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnY3Npc29sYXRpbjQnOiAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc28tODg1OS00JzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzby1pci0xMTAnOiAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvODg1OS00JzogICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc284ODU5NCc6ICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzb184ODU5LTQnOiAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvXzg4NTktNDoxOTg4JzogICAgICdpc28tODg1OS00JywKICAgICdsNCc6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2xhdGluNCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnY3Npc29sYXRpbmN5cmlsbGljJzogICdpc28tODg1OS01JywKICAgICdjeXJpbGxpYyc6ICAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzby04ODU5LTUnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvLWlyLTE0NCc6ICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc284ODU5LTUnOiAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzbzg4NTk1JzogICAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvXzg4NTktNSc6ICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc29fODg1OS01OjE5ODgnOiAgICAgJ2lzby04ODU5LTUnLAogICAgJ2FyYWJpYyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnYXNtby03MDgnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdjc2lzbzg4NTk2ZSc6ICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvODg1OTZpJzogICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc29sYXRpbmFyYWJpYyc6ICAgICdpc28tODg1OS02JywKICAgICdlY21hLTExNCc6ICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby04ODU5LTYnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLTg4NTktNi1lJzogICAgICAgICdpc28tODg1OS02JywKICAgICdpc28tODg1OS02LWknOiAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby1pci0xMjcnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvODg1OS02JzogICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc284ODU5Nic6ICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzb184ODU5LTYnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvXzg4NTktNjoxOTg3JzogICAgICdpc28tODg1OS02JywKICAgICdjc2lzb2xhdGluZ3JlZWsnOiAgICAgJ2lzby04ODU5LTcnLAogICAgJ2VjbWEtMTE4JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnZWxvdF85MjgnOiAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdncmVlayc6ICAgICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2dyZWVrOCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvLTg4NTktNyc6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc28taXItMTI2JzogICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzbzg4NTktNyc6ICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvODg1OTcnOiAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc29fODg1OS03JzogICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzb184ODU5LTc6MTk4Nyc6ICAgICAnaXNvLTg4NTktNycsCiAgICAnc3VuX2V1X2dyZWVrJzogICAgICAgICdpc28tODg1OS03JywKICAgICdjc2lzbzg4NTk4ZSc6ICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2NzaXNvbGF0aW5oZWJyZXcnOiAgICAnaXNvLTg4NTktOCcsCiAgICAnaGVicmV3JzogICAgICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc28tODg1OS04JzogICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzby04ODU5LTgtZSc6ICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvLWlyLTEzOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc284ODU5LTgnOiAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzbzg4NTk4JzogICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvXzg4NTktOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc29fODg1OS04OjE5ODgnOiAgICAgJ2lzby04ODU5LTgnLAogICAgJ3Zpc3VhbCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnY3Npc284ODU5OGknOiAgICAgICAgICdpc28tODg1OS04LWknLAogICAgJ2lzby04ODU5LTgtaSc6ICAgICAgICAnaXNvLTg4NTktOC1pJywKICAgICdsb2dpY2FsJzogICAgICAgICAgICAgJ2lzby04ODU5LTgtaScsCiAgICAnY3Npc29sYXRpbjYnOiAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLTg4NTktMTAnOiAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLWlyLTE1Nyc6ICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvODg1OS0xMCc6ICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvODg1OTEwJzogICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnbDYnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnbGF0aW42JzogICAgICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLTg4NTktMTMnOiAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvODg1OS0xMyc6ICAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvODg1OTEzJzogICAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvLTg4NTktMTQnOiAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnaXNvODg1OS0xNCc6ICAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnaXNvODg1OTE0JzogICAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnY3Npc29sYXRpbjknOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvLTg4NTktMTUnOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvODg1OS0xNSc6ICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvODg1OTE1JzogICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvXzg4NTktMTUnOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnbDknOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvLTg4NTktMTYnOiAgICAgICAgICdpc28tODg1OS0xNicsCiAgICAnY3Nrb2k4cic6ICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaSc6ICAgICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4JzogICAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOC1yJzogICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaThfcic6ICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4LXUnOiAgICAgICAgICAgICAgJ2tvaTgtdScsCiAgICAnY3NtYWNpbnRvc2gnOiAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ21hYyc6ICAgICAgICAgICAgICAgICAnbWFjaW50b3NoJywKICAgICdtYWNpbnRvc2gnOiAgICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAneC1tYWMtcm9tYW4nOiAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ2Rvcy04NzQnOiAgICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzby04ODU5LTExJzogICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzbzg4NTktMTEnOiAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzbzg4NTkxMSc6ICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ3Rpcy02MjAnOiAgICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ3dpbmRvd3MtODc0JzogICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2NwMTI1MCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUwJywKICAgICd3aW5kb3dzLTEyNTAnOiAgICAgICAgJ3dpbmRvd3MtMTI1MCcsCiAgICAneC1jcDEyNTAnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTAnLAogICAgJ2NwMTI1MSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUxJywKICAgICd3aW5kb3dzLTEyNTEnOiAgICAgICAgJ3dpbmRvd3MtMTI1MScsCiAgICAneC1jcDEyNTEnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTEnLAogICAgJ2Fuc2lfeDMuNC0xOTY4JzogICAgICAnd2luZG93cy0xMjUyJywKICAgICdhc2NpaSc6ICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3AxMjUyJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwODE5JzogICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjc2lzb2xhdGluMSc6ICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaWJtODE5JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzby04ODU5LTEnOiAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc28taXItMTAwJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvODg1OS0xJzogICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzbzg4NTkxJzogICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc29fODg1OS0xJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvXzg4NTktMToxOTg3JzogICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2wxJzogICAgICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdsYXRpbjEnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAndXMtYXNjaWknOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ3dpbmRvd3MtMTI1Mic6ICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICd4LWNwMTI1Mic6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3AxMjUzJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTMnLAogICAgJ3dpbmRvd3MtMTI1Myc6ICAgICAgICAnd2luZG93cy0xMjUzJywKICAgICd4LWNwMTI1Myc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MycsCiAgICAnY3AxMjU0JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2NzaXNvbGF0aW41JzogICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc28tODg1OS05JzogICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvLWlyLTE0OCc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzbzg4NTktOSc6ICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc284ODU5OSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvXzg4NTktOSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzb184ODU5LTk6MTk4OSc6ICAgICAnd2luZG93cy0xMjU0JywKICAgICdsNSc6ICAgICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnbGF0aW41JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ3dpbmRvd3MtMTI1NCc6ICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICd4LWNwMTI1NCc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnY3AxMjU1JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTUnLAogICAgJ3dpbmRvd3MtMTI1NSc6ICAgICAgICAnd2luZG93cy0xMjU1JywKICAgICd4LWNwMTI1NSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NScsCiAgICAnY3AxMjU2JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTYnLAogICAgJ3dpbmRvd3MtMTI1Nic6ICAgICAgICAnd2luZG93cy0xMjU2JywKICAgICd4LWNwMTI1Nic6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NicsCiAgICAnY3AxMjU3JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTcnLAogICAgJ3dpbmRvd3MtMTI1Nyc6ICAgICAgICAnd2luZG93cy0xMjU3JywKICAgICd4LWNwMTI1Nyc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NycsCiAgICAnY3AxMjU4JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTgnLAogICAgJ3dpbmRvd3MtMTI1OCc6ICAgICAgICAnd2luZG93cy0xMjU4JywKICAgICd4LWNwMTI1OCc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1OCcsCiAgICAneC1tYWMtY3lyaWxsaWMnOiAgICAgICd4LW1hYy1jeXJpbGxpYycsCiAgICAneC1tYWMtdWtyYWluaWFuJzogICAgICd4LW1hYy1jeXJpbGxpYycsCiAgICAnY2hpbmVzZSc6ICAgICAgICAgICAgICdnYmsnLAogICAgJ2NzZ2IyMzEyJzogICAgICAgICAgICAnZ2JrJywKICAgICdjc2lzbzU4Z2IyMzEyODAnOiAgICAgJ2diaycsCiAgICAnZ2IyMzEyJzogICAgICAgICAgICAgICdnYmsnLAogICAgJ2diXzIzMTInOiAgICAgICAgICAgICAnZ2JrJywKICAgICdnYl8yMzEyLTgwJzogICAgICAgICAgJ2diaycsCiAgICAnZ2JrJzogICAgICAgICAgICAgICAgICdnYmsnLAogICAgJ2lzby1pci01OCc6ICAgICAgICAgICAnZ2JrJywKICAgICd4LWdiayc6ICAgICAgICAgICAgICAgJ2diaycsCiAgICAnZ2IxODAzMCc6ICAgICAgICAgICAgICdnYjE4MDMwJywKICAgICdoei1nYi0yMzEyJzogICAgICAgICAgJ2h6LWdiLTIzMTInLAogICAgJ2JpZzUnOiAgICAgICAgICAgICAgICAnYmlnNScsCiAgICAnYmlnNS1oa3Njcyc6ICAgICAgICAgICdiaWc1JywKICAgICdjbi1iaWc1JzogICAgICAgICAgICAgJ2JpZzUnLAogICAgJ2NzYmlnNSc6ICAgICAgICAgICAgICAnYmlnNScsCiAgICAneC14LWJpZzUnOiAgICAgICAgICAgICdiaWc1JywKICAgICdjc2V1Y3BrZGZtdGphcGFuZXNlJzogJ2V1Yy1qcCcsCiAgICAnZXVjLWpwJzogICAgICAgICAgICAgICdldWMtanAnLAogICAgJ3gtZXVjLWpwJzogICAgICAgICAgICAnZXVjLWpwJywKICAgICdjc2lzbzIwMjJqcCc6ICAgICAgICAgJ2lzby0yMDIyLWpwJywKICAgICdpc28tMjAyMi1qcCc6ICAgICAgICAgJ2lzby0yMDIyLWpwJywKICAgICdjc3NoaWZ0amlzJzogICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnbXNfa2FuamknOiAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3NoaWZ0LWppcyc6ICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdzaGlmdF9qaXMnOiAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnc2ppcyc6ICAgICAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3dpbmRvd3MtMzFqJzogICAgICAgICAnc2hpZnRfamlzJywKICAgICd4LXNqaXMnOiAgICAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnY3NldWNrcic6ICAgICAgICAgICAgICdldWMta3InLAogICAgJ2Nza3NjNTYwMTE5ODcnOiAgICAgICAnZXVjLWtyJywKICAgICdldWMta3InOiAgICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAnaXNvLWlyLTE0OSc6ICAgICAgICAgICdldWMta3InLAogICAgJ2tvcmVhbic6ICAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdrc19jXzU2MDEtMTk4Nyc6ICAgICAgJ2V1Yy1rcicsCiAgICAna3NfY181NjAxLTE5ODknOiAgICAgICdldWMta3InLAogICAgJ2tzYzU2MDEnOiAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdrc2NfNTYwMSc6ICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAnd2luZG93cy05NDknOiAgICAgICAgICdldWMta3InLAogICAgJ2NzaXNvMjAyMmtyJzogICAgICAgICAnaXNvLTIwMjIta3InLAogICAgJ2lzby0yMDIyLWtyJzogICAgICAgICAnaXNvLTIwMjIta3InLAogICAgJ3V0Zi0xNmJlJzogICAgICAgICAgICAndXRmLTE2YmUnLAogICAgJ3V0Zi0xNic6ICAgICAgICAgICAgICAndXRmLTE2bGUnLAogICAgJ3V0Zi0xNmxlJzogICAgICAgICAgICAndXRmLTE2bGUnLAogICAgJ3gtdXNlci1kZWZpbmVkJzogICAgICAneC11c2VyLWRlZmluZWQnLAp9ClBLAwQUAAAAAAAAACEAUH8xHxkFAAAZBQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbWtsYWJlbHMucHkiIiIKCiAgICB3ZWJlbmNvZGluZ3MubWtsYWJlbHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIFJlZ2VuYXJhdGUgdGhlIHdlYmVuY29kaW5ncy5sYWJlbHMgbW9kdWxlLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKaW1wb3J0IGpzb24KdHJ5OgogICAgZnJvbSB1cmxsaWIgaW1wb3J0IHVybG9wZW4KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgoKCmRlZiBhc3NlcnRfbG93ZXIoc3RyaW5nKToKICAgIGFzc2VydCBzdHJpbmcgPT0gc3RyaW5nLmxvd2VyKCkKICAgIHJldHVybiBzdHJpbmcKCgpkZWYgZ2VuZXJhdGUodXJsKToKICAgIHBhcnRzID0gWycnJ1wKIiIiCgogICAgd2ViZW5jb2RpbmdzLmxhYmVscwogICAgfn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIE1hcCBlbmNvZGluZyBsYWJlbHMgdG8gdGhlaXIgbmFtZS4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCiMgWFhYIERvIG5vdCBlZGl0IQojIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBta2xhYmVscy5weQoKTEFCRUxTID0gewonJyddCiAgICBsYWJlbHMgPSBbCiAgICAgICAgKHJlcHIoYXNzZXJ0X2xvd2VyKGxhYmVsKSkubHN0cmlwKCd1JyksCiAgICAgICAgIHJlcHIoZW5jb2RpbmdbJ25hbWUnXSkubHN0cmlwKCd1JykpCiAgICAgICAgZm9yIGNhdGVnb3J5IGluIGpzb24ubG9hZHModXJsb3Blbih1cmwpLnJlYWQoKS5kZWNvZGUoJ2FzY2lpJykpCiAgICAgICAgZm9yIGVuY29kaW5nIGluIGNhdGVnb3J5WydlbmNvZGluZ3MnXQogICAgICAgIGZvciBsYWJlbCBpbiBlbmNvZGluZ1snbGFiZWxzJ11dCiAgICBtYXhfbGVuID0gbWF4KGxlbihsYWJlbCkgZm9yIGxhYmVsLCBuYW1lIGluIGxhYmVscykKICAgIHBhcnRzLmV4dGVuZCgKICAgICAgICAnICAgICVzOiVzICVzLFxuJyAlIChsYWJlbCwgJyAnICogKG1heF9sZW4gLSBsZW4obGFiZWwpKSwgbmFtZSkKICAgICAgICBmb3IgbGFiZWwsIG5hbWUgaW4gbGFiZWxzKQogICAgcGFydHMuYXBwZW5kKCd9JykKICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBwcmludChnZW5lcmF0ZSgnaHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy9lbmNvZGluZ3MuanNvbicpKQpQSwMEFAAAAAAAAAAhABabPh2iGQAAohkAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzLnRlc3RzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBBIGJhc2ljIHRlc3Qgc3VpdGUgZm9yIEVuY29kaW5nLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IChsb29rdXAsIExBQkVMUywgZGVjb2RlLCBlbmNvZGUsIGl0ZXJfZGVjb2RlLCBpdGVyX2VuY29kZSwKICAgICAgICAgICAgICAgSW5jcmVtZW50YWxEZWNvZGVyLCBJbmNyZW1lbnRhbEVuY29kZXIsIFVURjgpCgoKZGVmIGFzc2VydF9yYWlzZXMoZXhjZXB0aW9uLCBmdW5jdGlvbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHRyeToKICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCiAgICBleGNlcHQgZXhjZXB0aW9uOgogICAgICAgIHJldHVybgogICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdEaWQgbm90IHJhaXNlICVzLicgJSBleGNlcHRpb24pCgoKZGVmIHRlc3RfbGFiZWxzKCk6CiAgICBhc3NlcnQgbG9va3VwKCd1dGYtOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnVXRmLTgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ1VURi04JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4ICcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnIFxyXG51dGY4XHQnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3U4JykgaXMgTm9uZSAgIyBQeXRob24gbGFiZWwuCiAgICBhc3NlcnQgbG9va3VwKCd1dGYtOMKgJykgaXMgTm9uZSAgIyBOb24tQVNDSUkgd2hpdGUgc3BhY2UuCgogICAgYXNzZXJ0IGxvb2t1cCgnVVMtQVNDSUknKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdpc28tODg1OS0xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnbGF0aW4xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnTEFUSU4xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnbGF0aW4tMScpIGlzIE5vbmUKICAgIGFzc2VydCBsb29rdXAoJ0xBVMSwTjEnKSBpcyBOb25lICAjIEFTQ0lJLW9ubHkgY2FzZSBpbnNlbnNpdGl2aXR5LgoKCmRlZiB0ZXN0X2FsbF9sYWJlbHMoKToKICAgIGZvciBsYWJlbCBpbiBMQUJFTFM6CiAgICAgICAgYXNzZXJ0IGRlY29kZShiJycsIGxhYmVsKSA9PSAoJycsIGxvb2t1cChsYWJlbCkpCiAgICAgICAgYXNzZXJ0IGVuY29kZSgnJywgbGFiZWwpID09IGInJwogICAgICAgIGZvciByZXBlYXQgaW4gWzAsIDEsIDEyXToKICAgICAgICAgICAgb3V0cHV0LCBfID0gaXRlcl9kZWNvZGUoW2InJ10gKiByZXBlYXQsIGxhYmVsKQogICAgICAgICAgICBhc3NlcnQgbGlzdChvdXRwdXQpID09IFtdCiAgICAgICAgICAgIGFzc2VydCBsaXN0KGl0ZXJfZW5jb2RlKFsnJ10gKiByZXBlYXQsIGxhYmVsKSkgPT0gW10KICAgICAgICBkZWNvZGVyID0gSW5jcmVtZW50YWxEZWNvZGVyKGxhYmVsKQogICAgICAgIGFzc2VydCBkZWNvZGVyLmRlY29kZShiJycpID09ICcnCiAgICAgICAgYXNzZXJ0IGRlY29kZXIuZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkgPT0gJycKICAgICAgICBlbmNvZGVyID0gSW5jcmVtZW50YWxFbmNvZGVyKGxhYmVsKQogICAgICAgIGFzc2VydCBlbmNvZGVyLmVuY29kZSgnJykgPT0gYicnCiAgICAgICAgYXNzZXJ0IGVuY29kZXIuZW5jb2RlKCcnLCBmaW5hbD1UcnVlKSA9PSBiJycKICAgICMgQWxsIGVuY29kaW5nIG5hbWVzIGFyZSB2YWxpZCBsYWJlbHMgdG9vOgogICAgZm9yIG5hbWUgaW4gc2V0KExBQkVMUy52YWx1ZXMoKSk6CiAgICAgICAgYXNzZXJ0IGxvb2t1cChuYW1lKS5uYW1lID09IG5hbWUKCgpkZWYgdGVzdF9pbnZhbGlkX2xhYmVsKCk6CiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBkZWNvZGUsIGInXHhFRlx4QkJceEJGXHhjM1x4YTknLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBlbmNvZGUsICfDqScsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGl0ZXJfZGVjb2RlLCBbXSwgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgaXRlcl9lbmNvZGUsIFtdLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBJbmNyZW1lbnRhbERlY29kZXIsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIEluY3JlbWVudGFsRW5jb2RlciwgJ2ludmFsaWQnKQoKCmRlZiB0ZXN0X2RlY29kZSgpOgogICAgYXNzZXJ0IGRlY29kZShiJ1x4ODAnLCAnbGF0aW4xJykgPT0gKCfigqwnLCBsb29rdXAoJ2xhdGluMScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4ODAnLCBsb29rdXAoJ2xhdGluMScpKSA9PSAoJ+KCrCcsIGxvb2t1cCgnbGF0aW4xJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhjM1x4YTknLCAndXRmOCcpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsIFVURjgpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsICdhc2NpaScpID09ICgnw4PCqScsIGxvb2t1cCgnYXNjaWknKSkKICAgIGFzc2VydCBkZWNvZGUoYidceEVGXHhCQlx4QkZceGMzXHhhOScsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkgICMgVVRGLTggd2l0aCBCT00KCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRVx4RkZceDAwXHhlOScsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmJlJykpICAjIFVURi0xNi1CRSB3aXRoIEJPTQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkZceEZFXHhlOVx4MDAnLCAnYXNjaWknKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZsZScpKSAgIyBVVEYtMTYtTEUgd2l0aCBCT00KICAgIGFzc2VydCBkZWNvZGUoYidceEZFXHhGRlx4ZTlceDAwJywgJ2FzY2lpJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRlx4RkVceDAwXHhlOScsICdhc2NpaScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQoKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTZCRScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2TEUnKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZsZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4ZTlceDAwJywgJ1VURi0xNicpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpCgogICAgYXNzZXJ0IGRlY29kZShiJ1x4ZTlceDAwJywgJ1VURi0xNkJFJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHgwMFx4ZTknLCAnVVRGLTE2TEUnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2bGUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTYnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2bGUnKSkKCgpkZWYgdGVzdF9lbmNvZGUoKToKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ2xhdGluMScpID09IGInXHhlOScKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0ZjgnKSA9PSBiJ1x4YzNceGE5JwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmOCcpID09IGInXHhjM1x4YTknCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTYnKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmLTE2bGUnKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmLTE2YmUnKSA9PSBiJ1x4MDBceGU5JwoKCmRlZiB0ZXN0X2l0ZXJfZGVjb2RlKCk6CiAgICBkZWYgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKGlucHV0LCBmYWxsYmFja19lbmNvZGluZyk6CiAgICAgICAgb3V0cHV0LCBfZW5jb2RpbmcgPSBpdGVyX2RlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcpCiAgICAgICAgcmV0dXJuICcnLmpvaW4ob3V0cHV0KQogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbXSwgJ2xhdGluMScpID09ICcnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJyddLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhlOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidoZWxsbyddLCAnbGF0aW4xJykgPT0gJ2hlbGxvJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidoZScsIGInbGxvJ10sICdsYXRpbjEnKSA9PSAnaGVsbG8nCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlbGwnLCBiJ28nXSwgJ2xhdGluMScpID09ICdoZWxsbycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhjM1x4YTknXSwgJ2xhdGluMScpID09ICfDg8KpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEVGXHhCQlx4QkZceGMzXHhhOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYidceEVGXHhCQlx4QkYnLCBiJ1x4YzMnLCBiJ1x4YTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInXHhFRlx4QkJceEJGJywgYidhJywgYidceGMzJ10sICdsYXRpbjEnKSA9PSAnYVx1RkZGRCcKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidceEVGJywgYicnLCBiJycsIGInXHhCQlx4QkZceGMzJywgYidceGE5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RUZceEJCXHhCRiddLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhFRlx4QkInXSwgJ2xhdGluMScpID09ICfDr8K7JwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEZFXHhGRlx4MDBceGU5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RkZceEZFXHhlOVx4MDAnXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidceEZGJywgYicnLCBiJycsIGInXHhGRVx4ZTknLCBiJ1x4MDAnXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidoXHhlOScsIGInbGxvJ10sICd4LXVzZXItZGVmaW5lZCcpID09ICdoXHVGN0U5bGxvJwoKCmRlZiB0ZXN0X2l0ZXJfZW5jb2RlKCk6CiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoW10sICdsYXRpbjEnKSkgPT0gYicnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnXSwgJ2xhdGluMScpKSA9PSBiJycKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJ8OpJ10sICdsYXRpbjEnKSkgPT0gYidceGU5JwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ2xhdGluMScpKSA9PSBiJ1x4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAndXRmLTE2JykpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAndXRmLTE2bGUnKSkgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTZiZScpKSA9PSBiJ1x4MDBceGU5JwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsKICAgICAgICAnJywgJ2hcdUY3RTknLCAnJywgJ2xsbyddLCAneC11c2VyLWRlZmluZWQnKSkgPT0gYidoXHhlOWxsbycKCgpkZWYgdGVzdF94X3VzZXJfZGVmaW5lZCgpOgogICAgZW5jb2RlZCA9IGInMixceDBjXHgwYlx4MWFPXHhkOSNceGNiXHgwZlx4YzlceGJidFx4Y2ZceGE4XHhjYScKICAgIGRlY29kZWQgPSAnMixceDBjXHgwYlx4MWFPXHVmN2Q5I1x1ZjdjYlx4MGZcdWY3YzlcdWY3YmJ0XHVmN2NmXHVmN2E4XHVmN2NhJwogICAgZW5jb2RlZCA9IGInYWEnCiAgICBkZWNvZGVkID0gJ2FhJwogICAgYXNzZXJ0IGRlY29kZShlbmNvZGVkLCAneC11c2VyLWRlZmluZWQnKSA9PSAoZGVjb2RlZCwgbG9va3VwKCd4LXVzZXItZGVmaW5lZCcpKQogICAgYXNzZXJ0IGVuY29kZShkZWNvZGVkLCAneC11c2VyLWRlZmluZWQnKSA9PSBlbmNvZGVkClBLAwQUAAAAAAAAACEASG9FvtIQAADSEAAAOgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MveF91c2VyX2RlZmluZWQucHkjIGNvZGluZzogdXRmOAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MueF91c2VyX2RlZmluZWQKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4LXVzZXItZGVmaW5lZCBlbmNvZGluZy4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwoKCiMjIyBDb2RlYyBBUElzCgpjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgoKICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCwgZXJyb3JzLCBlbmNvZGluZ190YWJsZSkKCiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsIGVycm9ycywgZGVjb2RpbmdfdGFibGUpCgoKY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgogICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBlbmNvZGluZ190YWJsZSlbMF0KCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMsIGRlY29kaW5nX3RhYmxlKVswXQoKCmNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICBwYXNzCgoKY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKICAgIHBhc3MKCgojIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKCmNvZGVjX2luZm8gPSBjb2RlY3MuQ29kZWNJbmZvKAogICAgbmFtZT0neC11c2VyLWRlZmluZWQnLAogICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAogICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAogICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKQoKCiMjIyBEZWNvZGluZyBUYWJsZQoKIyBQeXRob24gMzoKIyBmb3IgYyBpbiByYW5nZSgyNTYpOiBwcmludCgnICAgICVyJyAlIGNocihjIGlmIGMgPCAxMjggZWxzZSBjICsgMHhGNzAwKSkKZGVjb2RpbmdfdGFibGUgPSAoCiAgICAnXHgwMCcKICAgICdceDAxJwogICAgJ1x4MDInCiAgICAnXHgwMycKICAgICdceDA0JwogICAgJ1x4MDUnCiAgICAnXHgwNicKICAgICdceDA3JwogICAgJ1x4MDgnCiAgICAnXHQnCiAgICAnXG4nCiAgICAnXHgwYicKICAgICdceDBjJwogICAgJ1xyJwogICAgJ1x4MGUnCiAgICAnXHgwZicKICAgICdceDEwJwogICAgJ1x4MTEnCiAgICAnXHgxMicKICAgICdceDEzJwogICAgJ1x4MTQnCiAgICAnXHgxNScKICAgICdceDE2JwogICAgJ1x4MTcnCiAgICAnXHgxOCcKICAgICdceDE5JwogICAgJ1x4MWEnCiAgICAnXHgxYicKICAgICdceDFjJwogICAgJ1x4MWQnCiAgICAnXHgxZScKICAgICdceDFmJwogICAgJyAnCiAgICAnIScKICAgICciJwogICAgJyMnCiAgICAnJCcKICAgICclJwogICAgJyYnCiAgICAiJyIKICAgICcoJwogICAgJyknCiAgICAnKicKICAgICcrJwogICAgJywnCiAgICAnLScKICAgICcuJwogICAgJy8nCiAgICAnMCcKICAgICcxJwogICAgJzInCiAgICAnMycKICAgICc0JwogICAgJzUnCiAgICAnNicKICAgICc3JwogICAgJzgnCiAgICAnOScKICAgICc6JwogICAgJzsnCiAgICAnPCcKICAgICc9JwogICAgJz4nCiAgICAnPycKICAgICdAJwogICAgJ0EnCiAgICAnQicKICAgICdDJwogICAgJ0QnCiAgICAnRScKICAgICdGJwogICAgJ0cnCiAgICAnSCcKICAgICdJJwogICAgJ0onCiAgICAnSycKICAgICdMJwogICAgJ00nCiAgICAnTicKICAgICdPJwogICAgJ1AnCiAgICAnUScKICAgICdSJwogICAgJ1MnCiAgICAnVCcKICAgICdVJwogICAgJ1YnCiAgICAnVycKICAgICdYJwogICAgJ1knCiAgICAnWicKICAgICdbJwogICAgJ1xcJwogICAgJ10nCiAgICAnXicKICAgICdfJwogICAgJ2AnCiAgICAnYScKICAgICdiJwogICAgJ2MnCiAgICAnZCcKICAgICdlJwogICAgJ2YnCiAgICAnZycKICAgICdoJwogICAgJ2knCiAgICAnaicKICAgICdrJwogICAgJ2wnCiAgICAnbScKICAgICduJwogICAgJ28nCiAgICAncCcKICAgICdxJwogICAgJ3InCiAgICAncycKICAgICd0JwogICAgJ3UnCiAgICAndicKICAgICd3JwogICAgJ3gnCiAgICAneScKICAgICd6JwogICAgJ3snCiAgICAnfCcKICAgICd9JwogICAgJ34nCiAgICAnXHg3ZicKICAgICdcdWY3ODAnCiAgICAnXHVmNzgxJwogICAgJ1x1Zjc4MicKICAgICdcdWY3ODMnCiAgICAnXHVmNzg0JwogICAgJ1x1Zjc4NScKICAgICdcdWY3ODYnCiAgICAnXHVmNzg3JwogICAgJ1x1Zjc4OCcKICAgICdcdWY3ODknCiAgICAnXHVmNzhhJwogICAgJ1x1Zjc4YicKICAgICdcdWY3OGMnCiAgICAnXHVmNzhkJwogICAgJ1x1Zjc4ZScKICAgICdcdWY3OGYnCiAgICAnXHVmNzkwJwogICAgJ1x1Zjc5MScKICAgICdcdWY3OTInCiAgICAnXHVmNzkzJwogICAgJ1x1Zjc5NCcKICAgICdcdWY3OTUnCiAgICAnXHVmNzk2JwogICAgJ1x1Zjc5NycKICAgICdcdWY3OTgnCiAgICAnXHVmNzk5JwogICAgJ1x1Zjc5YScKICAgICdcdWY3OWInCiAgICAnXHVmNzljJwogICAgJ1x1Zjc5ZCcKICAgICdcdWY3OWUnCiAgICAnXHVmNzlmJwogICAgJ1x1ZjdhMCcKICAgICdcdWY3YTEnCiAgICAnXHVmN2EyJwogICAgJ1x1ZjdhMycKICAgICdcdWY3YTQnCiAgICAnXHVmN2E1JwogICAgJ1x1ZjdhNicKICAgICdcdWY3YTcnCiAgICAnXHVmN2E4JwogICAgJ1x1ZjdhOScKICAgICdcdWY3YWEnCiAgICAnXHVmN2FiJwogICAgJ1x1ZjdhYycKICAgICdcdWY3YWQnCiAgICAnXHVmN2FlJwogICAgJ1x1ZjdhZicKICAgICdcdWY3YjAnCiAgICAnXHVmN2IxJwogICAgJ1x1ZjdiMicKICAgICdcdWY3YjMnCiAgICAnXHVmN2I0JwogICAgJ1x1ZjdiNScKICAgICdcdWY3YjYnCiAgICAnXHVmN2I3JwogICAgJ1x1ZjdiOCcKICAgICdcdWY3YjknCiAgICAnXHVmN2JhJwogICAgJ1x1ZjdiYicKICAgICdcdWY3YmMnCiAgICAnXHVmN2JkJwogICAgJ1x1ZjdiZScKICAgICdcdWY3YmYnCiAgICAnXHVmN2MwJwogICAgJ1x1ZjdjMScKICAgICdcdWY3YzInCiAgICAnXHVmN2MzJwogICAgJ1x1ZjdjNCcKICAgICdcdWY3YzUnCiAgICAnXHVmN2M2JwogICAgJ1x1ZjdjNycKICAgICdcdWY3YzgnCiAgICAnXHVmN2M5JwogICAgJ1x1ZjdjYScKICAgICdcdWY3Y2InCiAgICAnXHVmN2NjJwogICAgJ1x1ZjdjZCcKICAgICdcdWY3Y2UnCiAgICAnXHVmN2NmJwogICAgJ1x1ZjdkMCcKICAgICdcdWY3ZDEnCiAgICAnXHVmN2QyJwogICAgJ1x1ZjdkMycKICAgICdcdWY3ZDQnCiAgICAnXHVmN2Q1JwogICAgJ1x1ZjdkNicKICAgICdcdWY3ZDcnCiAgICAnXHVmN2Q4JwogICAgJ1x1ZjdkOScKICAgICdcdWY3ZGEnCiAgICAnXHVmN2RiJwogICAgJ1x1ZjdkYycKICAgICdcdWY3ZGQnCiAgICAnXHVmN2RlJwogICAgJ1x1ZjdkZicKICAgICdcdWY3ZTAnCiAgICAnXHVmN2UxJwogICAgJ1x1ZjdlMicKICAgICdcdWY3ZTMnCiAgICAnXHVmN2U0JwogICAgJ1x1ZjdlNScKICAgICdcdWY3ZTYnCiAgICAnXHVmN2U3JwogICAgJ1x1ZjdlOCcKICAgICdcdWY3ZTknCiAgICAnXHVmN2VhJwogICAgJ1x1ZjdlYicKICAgICdcdWY3ZWMnCiAgICAnXHVmN2VkJwogICAgJ1x1ZjdlZScKICAgICdcdWY3ZWYnCiAgICAnXHVmN2YwJwogICAgJ1x1ZjdmMScKICAgICdcdWY3ZjInCiAgICAnXHVmN2YzJwogICAgJ1x1ZjdmNCcKICAgICdcdWY3ZjUnCiAgICAnXHVmN2Y2JwogICAgJ1x1ZjdmNycKICAgICdcdWY3ZjgnCiAgICAnXHVmN2Y5JwogICAgJ1x1ZjdmYScKICAgICdcdWY3ZmInCiAgICAnXHVmN2ZjJwogICAgJ1x1ZjdmZCcKICAgICdcdWY3ZmUnCiAgICAnXHVmN2ZmJwopCgojIyMgRW5jb2RpbmcgdGFibGUKZW5jb2RpbmdfdGFibGUgPSBjb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKUEsDBBQAAAAAAAAAIQCCGIv1hi4AAIYuAAAiAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9iYXNlY29tbWFuZC5weSIiIkJhc2UgQ29tbWFuZCBjbGFzcywgYW5kIHJlbGF0ZWQgcm91dGluZXMiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCmZyb20gcGlwLmluZGV4IGltcG9ydCBQYWNrYWdlRmluZGVyCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgcnVubmluZ191bmRlcl92aXJ0dWFsZW52CmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBQaXBTZXNzaW9uCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IChCYWRDb21tYW5kLCBJbnN0YWxsYXRpb25FcnJvciwgVW5pbnN0YWxsYXRpb25FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRFcnJvciwgUHJldmlvdXNCdWlsZERpckVycm9yKQoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBsb2dnaW5nX2RpY3RDb25maWcKZnJvbSBwaXAuYmFzZXBhcnNlciBpbXBvcnQgQ29uZmlnT3B0aW9uUGFyc2VyLCBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcgpmcm9tIHBpcC5yZXEgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudCwgcGFyc2VfcmVxdWlyZW1lbnRzCmZyb20gcGlwLnN0YXR1c19jb2RlcyBpbXBvcnQgKAogICAgU1VDQ0VTUywgRVJST1IsIFVOS05PV05fRVJST1IsIFZJUlRVQUxFTlZfTk9UX0ZPVU5ELAogICAgUFJFVklPVVNfQlVJTERfRElSX0VSUk9SLAopCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkZXByZWNhdGlvbiwgZ2V0X3Byb2csIG5vcm1hbGl6ZV9wYXRoCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IEluZGVudGluZ0Zvcm1hdHRlcgpmcm9tIHBpcC51dGlscy5vdXRkYXRlZCBpbXBvcnQgcGlwX3ZlcnNpb25fY2hlY2sKCgpfX2FsbF9fID0gWydDb21tYW5kJ10KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDb21tYW5kKG9iamVjdCk6CiAgICBuYW1lID0gTm9uZQogICAgdXNhZ2UgPSBOb25lCiAgICBoaWRkZW4gPSBGYWxzZQogICAgbG9nX3N0cmVhbXMgPSAoImV4dDovL3N5cy5zdGRvdXQiLCAiZXh0Oi8vc3lzLnN0ZGVyciIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGlzb2xhdGVkPUZhbHNlKToKICAgICAgICBwYXJzZXJfa3cgPSB7CiAgICAgICAgICAgICd1c2FnZSc6IHNlbGYudXNhZ2UsCiAgICAgICAgICAgICdwcm9nJzogJyVzICVzJyAlIChnZXRfcHJvZygpLCBzZWxmLm5hbWUpLAogICAgICAgICAgICAnZm9ybWF0dGVyJzogVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIoKSwKICAgICAgICAgICAgJ2FkZF9oZWxwX29wdGlvbic6IEZhbHNlLAogICAgICAgICAgICAnbmFtZSc6IHNlbGYubmFtZSwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogc2VsZi5fX2RvY19fLAogICAgICAgICAgICAnaXNvbGF0ZWQnOiBpc29sYXRlZCwKICAgICAgICB9CgogICAgICAgIHNlbGYucGFyc2VyID0gQ29uZmlnT3B0aW9uUGFyc2VyKCoqcGFyc2VyX2t3KQoKICAgICAgICAjIENvbW1hbmRzIHNob3VsZCBhZGQgb3B0aW9ucyB0byB0aGlzIG9wdGlvbiBncm91cAogICAgICAgIG9wdGdyb3VwX25hbWUgPSAnJXMgT3B0aW9ucycgJSBzZWxmLm5hbWUuY2FwaXRhbGl6ZSgpCiAgICAgICAgc2VsZi5jbWRfb3B0cyA9IG9wdHBhcnNlLk9wdGlvbkdyb3VwKHNlbGYucGFyc2VyLCBvcHRncm91cF9uYW1lKQoKICAgICAgICAjIEFkZCB0aGUgZ2VuZXJhbCBvcHRpb25zCiAgICAgICAgZ2VuX29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKAogICAgICAgICAgICBjbWRvcHRpb25zLmdlbmVyYWxfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKGdlbl9vcHRzKQoKICAgIGRlZiBfYnVpbGRfc2Vzc2lvbihzZWxmLCBvcHRpb25zLCByZXRyaWVzPU5vbmUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgc2Vzc2lvbiA9IFBpcFNlc3Npb24oCiAgICAgICAgICAgIGNhY2hlPSgKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguam9pbihvcHRpb25zLmNhY2hlX2RpciwgImh0dHAiKSkKICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMuY2FjaGVfZGlyIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICAgICByZXRyaWVzPXJldHJpZXMgaWYgcmV0cmllcyBpcyBub3QgTm9uZSBlbHNlIG9wdGlvbnMucmV0cmllcywKICAgICAgICAgICAgaW5zZWN1cmVfaG9zdHM9b3B0aW9ucy50cnVzdGVkX2hvc3RzLAogICAgICAgICkKCiAgICAgICAgIyBIYW5kbGUgY3VzdG9tIGNhLWJ1bmRsZXMgZnJvbSB0aGUgdXNlcgogICAgICAgIGlmIG9wdGlvbnMuY2VydDoKICAgICAgICAgICAgc2Vzc2lvbi52ZXJpZnkgPSBvcHRpb25zLmNlcnQKCiAgICAgICAgIyBIYW5kbGUgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgICAgIGlmIG9wdGlvbnMuY2xpZW50X2NlcnQ6CiAgICAgICAgICAgIHNlc3Npb24uY2VydCA9IG9wdGlvbnMuY2xpZW50X2NlcnQKCiAgICAgICAgIyBIYW5kbGUgdGltZW91dHMKICAgICAgICBpZiBvcHRpb25zLnRpbWVvdXQgb3IgdGltZW91dDoKICAgICAgICAgICAgc2Vzc2lvbi50aW1lb3V0ID0gKAogICAgICAgICAgICAgICAgdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugb3B0aW9ucy50aW1lb3V0CiAgICAgICAgICAgICkKCiAgICAgICAgIyBIYW5kbGUgY29uZmlndXJlZCBwcm94aWVzCiAgICAgICAgaWYgb3B0aW9ucy5wcm94eToKICAgICAgICAgICAgc2Vzc2lvbi5wcm94aWVzID0gewogICAgICAgICAgICAgICAgImh0dHAiOiBvcHRpb25zLnByb3h5LAogICAgICAgICAgICAgICAgImh0dHBzIjogb3B0aW9ucy5wcm94eSwKICAgICAgICAgICAgfQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBjYW4gcHJvbXB0IHRoZSB1c2VyIGZvciBhdXRoZW50aWNhdGlvbiBvciBub3QKICAgICAgICBzZXNzaW9uLmF1dGgucHJvbXB0aW5nID0gbm90IG9wdGlvbnMubm9faW5wdXQKCiAgICAgICAgcmV0dXJuIHNlc3Npb24KCiAgICBkZWYgcGFyc2VfYXJncyhzZWxmLCBhcmdzKToKICAgICAgICAjIGZhY3RvcmVkIG91dCBmb3IgdGVzdGFiaWxpdHkKICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGFyc2VfYXJncyhhcmdzKQoKICAgIGRlZiBtYWluKHNlbGYsIGFyZ3MpOgogICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBzZWxmLnBhcnNlX2FyZ3MoYXJncykKCiAgICAgICAgaWYgb3B0aW9ucy5xdWlldDoKICAgICAgICAgICAgaWYgb3B0aW9ucy5xdWlldCA9PSAxOgogICAgICAgICAgICAgICAgbGV2ZWwgPSAiV0FSTklORyIKICAgICAgICAgICAgaWYgb3B0aW9ucy5xdWlldCA9PSAyOgogICAgICAgICAgICAgICAgbGV2ZWwgPSAiRVJST1IiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsZXZlbCA9ICJDUklUSUNBTCIKICAgICAgICBlbGlmIG9wdGlvbnMudmVyYm9zZToKICAgICAgICAgICAgbGV2ZWwgPSAiREVCVUciCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGV2ZWwgPSAiSU5GTyIKCiAgICAgICAgIyBUaGUgcm9vdCBsb2dnZXIgc2hvdWxkIG1hdGNoIHRoZSAiY29uc29sZSIgbGV2ZWwgKnVubGVzcyogd2UKICAgICAgICAjIHNwZWNpZmllZCAiLS1sb2ciIHRvIHNlbmQgZGVidWcgbG9ncyB0byBhIGZpbGUuCiAgICAgICAgcm9vdF9sZXZlbCA9IGxldmVsCiAgICAgICAgaWYgb3B0aW9ucy5sb2c6CiAgICAgICAgICAgIHJvb3RfbGV2ZWwgPSAiREVCVUciCgogICAgICAgIGxvZ2dpbmdfZGljdENvbmZpZyh7CiAgICAgICAgICAgICJ2ZXJzaW9uIjogMSwKICAgICAgICAgICAgImRpc2FibGVfZXhpc3RpbmdfbG9nZ2VycyI6IEZhbHNlLAogICAgICAgICAgICAiZmlsdGVycyI6IHsKICAgICAgICAgICAgICAgICJleGNsdWRlX3dhcm5pbmdzIjogewogICAgICAgICAgICAgICAgICAgICIoKSI6ICJwaXAudXRpbHMubG9nZ2luZy5NYXhMZXZlbEZpbHRlciIsCiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogbG9nZ2luZy5XQVJOSU5HLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZvcm1hdHRlcnMiOiB7CiAgICAgICAgICAgICAgICAiaW5kZW50IjogewogICAgICAgICAgICAgICAgICAgICIoKSI6IEluZGVudGluZ0Zvcm1hdHRlciwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogIiUobWVzc2FnZSlzIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJoYW5kbGVycyI6IHsKICAgICAgICAgICAgICAgICJjb25zb2xlIjogewogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IGxldmVsLAogICAgICAgICAgICAgICAgICAgICJjbGFzcyI6ICJwaXAudXRpbHMubG9nZ2luZy5Db2xvcml6ZWRTdHJlYW1IYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAic3RyZWFtIjogc2VsZi5sb2dfc3RyZWFtc1swXSwKICAgICAgICAgICAgICAgICAgICAiZmlsdGVycyI6IFsiZXhjbHVkZV93YXJuaW5ncyJdLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAiaW5kZW50IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY29uc29sZV9lcnJvcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogIldBUk5JTkciLAogICAgICAgICAgICAgICAgICAgICJjbGFzcyI6ICJwaXAudXRpbHMubG9nZ2luZy5Db2xvcml6ZWRTdHJlYW1IYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAic3RyZWFtIjogc2VsZi5sb2dfc3RyZWFtc1sxXSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogImluZGVudCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInVzZXJfbG9nIjogewogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6ICJERUJVRyIsCiAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogInBpcC51dGlscy5sb2dnaW5nLkJldHRlclJvdGF0aW5nRmlsZUhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZSI6IG9wdGlvbnMubG9nIG9yICIvZGV2L251bGwiLAogICAgICAgICAgICAgICAgICAgICJkZWxheSI6IFRydWUsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdHRlciI6ICJpbmRlbnQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJvb3QiOiB7CiAgICAgICAgICAgICAgICAibGV2ZWwiOiByb290X2xldmVsLAogICAgICAgICAgICAgICAgImhhbmRsZXJzIjogbGlzdChmaWx0ZXIoTm9uZSwgWwogICAgICAgICAgICAgICAgICAgICJjb25zb2xlIiwKICAgICAgICAgICAgICAgICAgICAiY29uc29sZV9lcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICJ1c2VyX2xvZyIgaWYgb3B0aW9ucy5sb2cgZWxzZSBOb25lLAogICAgICAgICAgICAgICAgXSkpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAjIERpc2FibGUgYW55IGxvZ2dpbmcgYmVzaWRlcyBXQVJOSU5HIHVubGVzcyB3ZSBoYXZlIERFQlVHIGxldmVsCiAgICAgICAgICAgICMgbG9nZ2luZyBlbmFibGVkLiBUaGVzZSB1c2UgYm90aCBwaXAuX3ZlbmRvciBhbmQgdGhlIGJhcmUgbmFtZXMKICAgICAgICAgICAgIyBmb3IgdGhlIGNhc2Ugd2hlcmUgc29tZW9uZSB1bmJ1bmRsZXMgb3VyIGxpYnJhcmllcy4KICAgICAgICAgICAgImxvZ2dlcnMiOiBkaWN0KAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FSTklORyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsIGluIFsiSU5GTyIsICJFUlJPUiJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICJERUJVRyIKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gWyJwaXAuX3ZlbmRvciIsICJkaXN0bGliIiwgInJlcXVlc3RzIiwgInVybGxpYjMiXQogICAgICAgICAgICApLAogICAgICAgIH0pCgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgyLCA2KToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJQeXRob24gMi42IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIFB5dGhvbiBjb3JlIHRlYW0sICIKICAgICAgICAgICAgICAgICJwbGVhc2UgdXBncmFkZSB5b3VyIFB5dGhvbi4gQSBmdXR1cmUgdmVyc2lvbiBvZiBwaXAgd2lsbCAiCiAgICAgICAgICAgICAgICAiZHJvcCBzdXBwb3J0IGZvciBQeXRob24gMi42IiwKICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uLlB5dGhvbjI2RGVwcmVjYXRpb25XYXJuaW5nCiAgICAgICAgICAgICkKCiAgICAgICAgIyBUT0RPOiB0cnkgdG8gZ2V0IHRoZXNlIHBhc3NpbmcgZG93biBmcm9tIHRoZSBjb21tYW5kPwogICAgICAgICMgICAgICB3aXRob3V0IHJlc29ydGluZyB0byBvcy5lbnZpcm9uIHRvIGhvbGQgdGhlc2UuCgogICAgICAgIGlmIG9wdGlvbnMubm9faW5wdXQ6CiAgICAgICAgICAgIG9zLmVudmlyb25bJ1BJUF9OT19JTlBVVCddID0gJzEnCgogICAgICAgIGlmIG9wdGlvbnMuZXhpc3RzX2FjdGlvbjoKICAgICAgICAgICAgb3MuZW52aXJvblsnUElQX0VYSVNUU19BQ1RJT04nXSA9ICcgJy5qb2luKG9wdGlvbnMuZXhpc3RzX2FjdGlvbikKCiAgICAgICAgaWYgb3B0aW9ucy5yZXF1aXJlX3ZlbnY6CiAgICAgICAgICAgICMgSWYgYSB2ZW52IGlzIHJlcXVpcmVkIGNoZWNrIGlmIGl0IGNhbiByZWFsbHkgYmUgZm91bmQKICAgICAgICAgICAgaWYgbm90IHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZmluZCBhbiBhY3RpdmF0ZWQgdmlydHVhbGVudiAocmVxdWlyZWQpLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHN5cy5leGl0KFZJUlRVQUxFTlZfTk9UX0ZPVU5EKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYucnVuKG9wdGlvbnMsIGFyZ3MpCiAgICAgICAgICAgICMgRklYTUU6IGFsbCBjb21tYW5kcyBzaG91bGQgcmV0dXJuIGFuIGV4aXQgc3RhdHVzCiAgICAgICAgICAgICMgYW5kIHdoZW4gaXQgaXMgZG9uZSwgaXNpbnN0YW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGF0dXMsIGludCk6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzCiAgICAgICAgZXhjZXB0IFByZXZpb3VzQnVpbGREaXJFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbChzdHIoZXhjKSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW5mb3JtYXRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBQUkVWSU9VU19CVUlMRF9ESVJfRVJST1IKICAgICAgICBleGNlcHQgKEluc3RhbGxhdGlvbkVycm9yLCBVbmluc3RhbGxhdGlvbkVycm9yLCBCYWRDb21tYW5kKSBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbChzdHIoZXhjKSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW5mb3JtYXRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIGV4Y2VwdCBDb21tYW5kRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ0VSUk9SOiAlcycsIGV4YykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW5mb3JtYXRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdPcGVyYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXInKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ0V4Y2VwdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1IKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAjIENoZWNrIGlmIHdlJ3JlIHVzaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBwaXAgYXZhaWxhYmxlCiAgICAgICAgICAgIGlmIChub3Qgb3B0aW9ucy5kaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKG9wdGlvbnMsICJub19pbmRleCIsIEZhbHNlKSk6CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXM9MCwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1taW4oNSwgb3B0aW9ucy50aW1lb3V0KSkgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgICAgICAgICBwaXBfdmVyc2lvbl9jaGVjayhzZXNzaW9uKQoKICAgICAgICByZXR1cm4gU1VDQ0VTUwoKCmNsYXNzIFJlcXVpcmVtZW50Q29tbWFuZChDb21tYW5kKToKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KHJlcXVpcmVtZW50X3NldCwgYXJncywgb3B0aW9ucywgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLCBuYW1lLCB3aGVlbF9jYWNoZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWFyc2hhbCBjbWQgbGluZSBhcmdzIGludG8gYSByZXF1aXJlbWVudCBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMuY29uc3RyYWludHM6CiAgICAgICAgICAgIGZvciByZXEgaW4gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9VHJ1ZSwgZmluZGVyPWZpbmRlciwgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudChyZXEpCgogICAgICAgIGZvciByZXEgaW4gYXJnczoKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgICAgICAgICAgcmVxLCBOb25lLCBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICBmb3IgcmVxIGluIG9wdGlvbnMuZWRpdGFibGVzOgogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fZWRpdGFibGUoCiAgICAgICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmNzPW9wdGlvbnMuZGVmYXVsdF92Y3MsCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgZm91bmRfcmVxX2luX2ZpbGUgPSBGYWxzZQogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcHRpb25zLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgZm9yIHJlcSBpbiBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgZmluZGVyPWZpbmRlciwgb3B0aW9ucz1vcHRpb25zLCBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpOgogICAgICAgICAgICAgICAgZm91bmRfcmVxX2luX2ZpbGUgPSBUcnVlCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KHJlcSkKICAgICAgICAjIElmIC0tcmVxdWlyZS1oYXNoZXMgd2FzIGEgbGluZSBpbiBhIHJlcXVpcmVtZW50cyBmaWxlLCB0ZWxsCiAgICAgICAgIyBSZXF1aXJlbWVudFNldCBhYm91dCBpdDoKICAgICAgICByZXF1aXJlbWVudF9zZXQucmVxdWlyZV9oYXNoZXMgPSBvcHRpb25zLnJlcXVpcmVfaGFzaGVzCgogICAgICAgIGlmIG5vdCAoYXJncyBvciBvcHRpb25zLmVkaXRhYmxlcyBvciBmb3VuZF9yZXFfaW5fZmlsZSk6CiAgICAgICAgICAgIG9wdHMgPSB7J25hbWUnOiBuYW1lfQogICAgICAgICAgICBpZiBvcHRpb25zLmZpbmRfbGlua3M6CiAgICAgICAgICAgICAgICBtc2cgPSAoJ1lvdSBtdXN0IGdpdmUgYXQgbGVhc3Qgb25lIHJlcXVpcmVtZW50IHRvICcKICAgICAgICAgICAgICAgICAgICAgICAnJShuYW1lKXMgKG1heWJlIHlvdSBtZWFudCAicGlwICUobmFtZSlzICcKICAgICAgICAgICAgICAgICAgICAgICAnJShsaW5rcylzIj8pJyAlCiAgICAgICAgICAgICAgICAgICAgICAgZGljdChvcHRzLCBsaW5rcz0nICcuam9pbihvcHRpb25zLmZpbmRfbGlua3MpKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1zZyA9ICgnWW91IG11c3QgZ2l2ZSBhdCBsZWFzdCBvbmUgcmVxdWlyZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICd0byAlKG5hbWUpcyAoc2VlICJwaXAgaGVscCAlKG5hbWUpcyIpJyAlIG9wdHMpCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKG1zZykKCiAgICBkZWYgX2J1aWxkX3BhY2thZ2VfZmluZGVyKHNlbGYsIG9wdGlvbnMsIHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtPU5vbmUsIHB5dGhvbl92ZXJzaW9ucz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmk9Tm9uZSwgaW1wbGVtZW50YXRpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGEgcGFja2FnZSBmaW5kZXIgYXBwcm9wcmlhdGUgdG8gdGhpcyByZXF1aXJlbWVudCBjb21tYW5kLgogICAgICAgICIiIgogICAgICAgIGluZGV4X3VybHMgPSBbb3B0aW9ucy5pbmRleF91cmxdICsgb3B0aW9ucy5leHRyYV9pbmRleF91cmxzCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbmRleDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBpbmRleGVzOiAlcycsICcsJy5qb2luKGluZGV4X3VybHMpKQogICAgICAgICAgICBpbmRleF91cmxzID0gW10KCiAgICAgICAgcmV0dXJuIFBhY2thZ2VGaW5kZXIoCiAgICAgICAgICAgIGZpbmRfbGlua3M9b3B0aW9ucy5maW5kX2xpbmtzLAogICAgICAgICAgICBmb3JtYXRfY29udHJvbD1vcHRpb25zLmZvcm1hdF9jb250cm9sLAogICAgICAgICAgICBpbmRleF91cmxzPWluZGV4X3VybHMsCiAgICAgICAgICAgIHRydXN0ZWRfaG9zdHM9b3B0aW9ucy50cnVzdGVkX2hvc3RzLAogICAgICAgICAgICBhbGxvd19hbGxfcHJlcmVsZWFzZXM9b3B0aW9ucy5wcmUsCiAgICAgICAgICAgIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcz1vcHRpb25zLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcywKICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICBwbGF0Zm9ybT1wbGF0Zm9ybSwKICAgICAgICAgICAgdmVyc2lvbnM9cHl0aG9uX3ZlcnNpb25zLAogICAgICAgICAgICBhYmk9YWJpLAogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbj1pbXBsZW1lbnRhdGlvbiwKICAgICAgICApClBLAwQUAAAAAAAAACEAq6v+O+EoAADhKAAAIQAAAHB5cGlfX3BpcF85XzBfMy9waXAvYmFzZXBhcnNlci5weSIiIkJhc2Ugb3B0aW9uIHBhcnNlciBzZXR1cCIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGV4dHdyYXAKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3RydG9ib29sCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCAoCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUsIGNvbmZpZ19iYXNlbmFtZSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LAogICAgc2l0ZV9jb25maWdfZmlsZXMKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgYXBwZGlycywgZ2V0X3Rlcm1pbmFsX3NpemUKCgpfZW52aXJvbl9wcmVmaXhfcmUgPSByZS5jb21waWxlKHIiXlBJUF8iLCByZS5JKQoKCmNsYXNzIFByZXR0eUhlbHBGb3JtYXR0ZXIob3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyKToKICAgICIiIkEgcHJldHRpZXIvbGVzcyB2ZXJib3NlIGhlbHAgZm9ybWF0dGVyIGZvciBvcHRwYXJzZS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIGhlbHAgcG9zaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggX19pbml0X18ucGFyc2VvcHRzLmRlc2NyaXB0aW9uCiAgICAgICAga3dhcmdzWydtYXhfaGVscF9wb3NpdGlvbiddID0gMzAKICAgICAgICBrd2FyZ3NbJ2luZGVudF9pbmNyZW1lbnQnXSA9IDEKICAgICAgICBrd2FyZ3NbJ3dpZHRoJ10gPSBnZXRfdGVybWluYWxfc2l6ZSgpWzBdIC0gMgogICAgICAgIG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGZvcm1hdF9vcHRpb25fc3RyaW5ncyhzZWxmLCBvcHRpb24pOgogICAgICAgIHJldHVybiBzZWxmLl9mb3JtYXRfb3B0aW9uX3N0cmluZ3Mob3B0aW9uLCAnIDwlcz4nLCAnLCAnKQoKICAgIGRlZiBfZm9ybWF0X29wdGlvbl9zdHJpbmdzKHNlbGYsIG9wdGlvbiwgbXZhcmZtdD0nIDwlcz4nLCBvcHRzZXA9JywgJyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9uIHN0cmluZ3MgYW5kIG1ldGF2YXJzLgoKICAgICAgICA6cGFyYW0gb3B0aW9uOiAgdHVwbGUgb2YgKHNob3J0IG9wdCwgbG9uZyBvcHQpLCBlLmc6ICgnLWYnLCAnLS1mb3JtYXQnKQogICAgICAgIDpwYXJhbSBtdmFyZm10OiBtZXRhdmFyIGZvcm1hdCBzdHJpbmcgLSBldmFsdWF0ZWQgYXMgbXZhcmZtdCAlIG1ldGF2YXIKICAgICAgICA6cGFyYW0gb3B0c2VwOiAgc2VwYXJhdG9yCiAgICAgICAgIiIiCiAgICAgICAgb3B0cyA9IFtdCgogICAgICAgIGlmIG9wdGlvbi5fc2hvcnRfb3B0czoKICAgICAgICAgICAgb3B0cy5hcHBlbmQob3B0aW9uLl9zaG9ydF9vcHRzWzBdKQogICAgICAgIGlmIG9wdGlvbi5fbG9uZ19vcHRzOgogICAgICAgICAgICBvcHRzLmFwcGVuZChvcHRpb24uX2xvbmdfb3B0c1swXSkKICAgICAgICBpZiBsZW4ob3B0cykgPiAxOgogICAgICAgICAgICBvcHRzLmluc2VydCgxLCBvcHRzZXApCgogICAgICAgIGlmIG9wdGlvbi50YWtlc192YWx1ZSgpOgogICAgICAgICAgICBtZXRhdmFyID0gb3B0aW9uLm1ldGF2YXIgb3Igb3B0aW9uLmRlc3QubG93ZXIoKQogICAgICAgICAgICBvcHRzLmFwcGVuZChtdmFyZm10ICUgbWV0YXZhci5sb3dlcigpKQoKICAgICAgICByZXR1cm4gJycuam9pbihvcHRzKQoKICAgIGRlZiBmb3JtYXRfaGVhZGluZyhzZWxmLCBoZWFkaW5nKToKICAgICAgICBpZiBoZWFkaW5nID09ICdPcHRpb25zJzoKICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgcmV0dXJuIGhlYWRpbmcgKyAnOlxuJwoKICAgIGRlZiBmb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgogICAgICAgICIiIgogICAgICAgIEVuc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBuZXdsaW5lIGJldHdlZW4gdXNhZ2UgYW5kIHRoZSBmaXJzdCBoZWFkaW5nCiAgICAgICAgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbXNnID0gJ1xuVXNhZ2U6ICVzXG4nICUgc2VsZi5pbmRlbnRfbGluZXModGV4dHdyYXAuZGVkZW50KHVzYWdlKSwgIiAgIikKICAgICAgICByZXR1cm4gbXNnCgogICAgZGVmIGZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLCBkZXNjcmlwdGlvbik6CiAgICAgICAgIyBsZWF2ZSBmdWxsIGNvbnRyb2wgb3ZlciBkZXNjcmlwdGlvbiB0byB1cwogICAgICAgIGlmIGRlc2NyaXB0aW9uOgogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucGFyc2VyLCAnbWFpbicpOgogICAgICAgICAgICAgICAgbGFiZWwgPSAnQ29tbWFuZHMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsYWJlbCA9ICdEZXNjcmlwdGlvbicKICAgICAgICAgICAgIyBzb21lIGRvYyBzdHJpbmdzIGhhdmUgaW5pdGlhbCBuZXdsaW5lcywgc29tZSBkb24ndAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmxzdHJpcCgnXG4nKQogICAgICAgICAgICAjIHNvbWUgZG9jIHN0cmluZ3MgaGF2ZSBmaW5hbCBuZXdsaW5lcyBhbmQgc3BhY2VzLCBzb21lIGRvbid0CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucnN0cmlwKCkKICAgICAgICAgICAgIyBkZWRlbnQsIHRoZW4gcmVpbmRlbnQKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBzZWxmLmluZGVudF9saW5lcyh0ZXh0d3JhcC5kZWRlbnQoZGVzY3JpcHRpb24pLCAiICAiKQogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICclczpcbiVzXG4nICUgKGxhYmVsLCBkZXNjcmlwdGlvbikKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZXBpbG9nKToKICAgICAgICAjIGxlYXZlIGZ1bGwgY29udHJvbCBvdmVyIGVwaWxvZyB0byB1cwogICAgICAgIGlmIGVwaWxvZzoKICAgICAgICAgICAgcmV0dXJuIGVwaWxvZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBpbmRlbnRfbGluZXMoc2VsZiwgdGV4dCwgaW5kZW50KToKICAgICAgICBuZXdfbGluZXMgPSBbaW5kZW50ICsgbGluZSBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCdcbicpXQogICAgICAgIHJldHVybiAiXG4iLmpvaW4obmV3X2xpbmVzKQoKCmNsYXNzIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKFByZXR0eUhlbHBGb3JtYXR0ZXIpOgogICAgIiIiQ3VzdG9tIGhlbHAgZm9ybWF0dGVyIGZvciB1c2UgaW4gQ29uZmlnT3B0aW9uUGFyc2VyLgoKICAgIFRoaXMgaXMgdXBkYXRlcyB0aGUgZGVmYXVsdHMgYmVmb3JlIGV4cGFuZGluZyB0aGVtLCBhbGxvd2luZwogICAgdGhlbSB0byBzaG93IHVwIGNvcnJlY3RseSBpbiB0aGUgaGVscCBsaXN0aW5nLgogICAgIiIiCgogICAgZGVmIGV4cGFuZF9kZWZhdWx0KHNlbGYsIG9wdGlvbik6CiAgICAgICAgaWYgc2VsZi5wYXJzZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLl91cGRhdGVfZGVmYXVsdHMoc2VsZi5wYXJzZXIuZGVmYXVsdHMpCiAgICAgICAgcmV0dXJuIG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlci5leHBhbmRfZGVmYXVsdChzZWxmLCBvcHRpb24pCgoKY2xhc3MgQ3VzdG9tT3B0aW9uUGFyc2VyKG9wdHBhcnNlLk9wdGlvblBhcnNlcik6CgogICAgZGVmIGluc2VydF9vcHRpb25fZ3JvdXAoc2VsZiwgaWR4LCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkluc2VydCBhbiBPcHRpb25Hcm91cCBhdCBhIGdpdmVuIHBvc2l0aW9uLiIiIgogICAgICAgIGdyb3VwID0gc2VsZi5hZGRfb3B0aW9uX2dyb3VwKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgc2VsZi5vcHRpb25fZ3JvdXBzLnBvcCgpCiAgICAgICAgc2VsZi5vcHRpb25fZ3JvdXBzLmluc2VydChpZHgsIGdyb3VwKQoKICAgICAgICByZXR1cm4gZ3JvdXAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcHRpb25fbGlzdF9hbGwoc2VsZik6CiAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiBhbGwgb3B0aW9ucywgaW5jbHVkaW5nIHRob3NlIGluIG9wdGlvbiBncm91cHMuIiIiCiAgICAgICAgcmVzID0gc2VsZi5vcHRpb25fbGlzdFs6XQogICAgICAgIGZvciBpIGluIHNlbGYub3B0aW9uX2dyb3VwczoKICAgICAgICAgICAgcmVzLmV4dGVuZChpLm9wdGlvbl9saXN0KQoKICAgICAgICByZXR1cm4gcmVzCgoKY2xhc3MgQ29uZmlnT3B0aW9uUGFyc2VyKEN1c3RvbU9wdGlvblBhcnNlcik6CiAgICAiIiJDdXN0b20gb3B0aW9uIHBhcnNlciB3aGljaCB1cGRhdGVzIGl0cyBkZWZhdWx0cyBieSBjaGVja2luZyB0aGUKICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGVudmlyb25tZW50YWwgdmFyaWFibGVzIiIiCgogICAgaXNvbGF0ZWQgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCiAgICAgICAgc2VsZi5uYW1lID0ga3dhcmdzLnBvcCgnbmFtZScpCiAgICAgICAgc2VsZi5pc29sYXRlZCA9IGt3YXJncy5wb3AoImlzb2xhdGVkIiwgRmFsc2UpCiAgICAgICAgc2VsZi5maWxlcyA9IHNlbGYuZ2V0X2NvbmZpZ19maWxlcygpCiAgICAgICAgaWYgc2VsZi5maWxlczoKICAgICAgICAgICAgc2VsZi5jb25maWcucmVhZChzZWxmLmZpbGVzKQogICAgICAgIGFzc2VydCBzZWxmLm5hbWUKICAgICAgICBvcHRwYXJzZS5PcHRpb25QYXJzZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBnZXRfY29uZmlnX2ZpbGVzKHNlbGYpOgogICAgICAgICMgdGhlIGZpbGVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYmUgcGFyc2VkIGluIG9yZGVyIHdpdGggdGhlCiAgICAgICAgIyBmaXJzdCBmaWxlcyBsaXN0ZWQgYmVpbmcgb3ZlcnJpZGRlbiBieSBsYXRlciBmaWxlcyBpbiBzdGFuZGFyZAogICAgICAgICMgQ29uZmlnUGFyc2VyIGZhc2hpb24KICAgICAgICBjb25maWdfZmlsZSA9IG9zLmVudmlyb24uZ2V0KCdQSVBfQ09ORklHX0ZJTEUnLCBGYWxzZSkKICAgICAgICBpZiBjb25maWdfZmlsZSA9PSBvcy5kZXZudWxsOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgIyBhdCB0aGUgYmFzZSB3ZSBoYXZlIGFueSBzaXRlLXdpZGUgY29uZmlndXJhdGlvbgogICAgICAgIGZpbGVzID0gbGlzdChzaXRlX2NvbmZpZ19maWxlcykKCiAgICAgICAgIyBwZXItdXNlciBjb25maWd1cmF0aW9uIG5leHQKICAgICAgICBpZiBub3Qgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgaWYgY29uZmlnX2ZpbGUgYW5kIG9zLnBhdGguZXhpc3RzKGNvbmZpZ19maWxlKToKICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZChjb25maWdfZmlsZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbGVnYWN5IGNvbmZpZyBmaWxlLCB3ZSBjb25zaWRlciBpdCB0byBiZSBhIGxvd2VyCiAgICAgICAgICAgICAgICAjIHByaW9yaXR5IHRoYW4gdGhlIG5ldyBmaWxlIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGxlZ2FjeV9jb25maWdfZmlsZSkKCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIG5ldyBjb25maWcgZmlsZSwgd2UgY29uc2lkZXIgaXQgdG8gYmUgYSBoaWdoZXIKICAgICAgICAgICAgICAgICMgcHJpb3JpdHkgdGhhbiB0aGUgbGVnYWN5IGZpbGUuCiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBhcHBkaXJzLnVzZXJfY29uZmlnX2RpcigicGlwIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICMgZmluYWxseSB2aXJ0dWFsZW52IGNvbmZpZ3VyYXRpb24gZmlyc3QgdHJ1bXBpbmcgb3RoZXJzCiAgICAgICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgIHZlbnZfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHZlbnZfY29uZmlnX2ZpbGUpOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHZlbnZfY29uZmlnX2ZpbGUpCgogICAgICAgIHJldHVybiBmaWxlcwoKICAgIGRlZiBjaGVja19kZWZhdWx0KHNlbGYsIG9wdGlvbiwga2V5LCB2YWwpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5jaGVja192YWx1ZShrZXksIHZhbCkKICAgICAgICBleGNlcHQgb3B0cGFyc2UuT3B0aW9uVmFsdWVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHByaW50KCJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY29uZmlndXJhdGlvbjogJXMiICUgZXhjKQogICAgICAgICAgICBzeXMuZXhpdCgzKQoKICAgIGRlZiBfdXBkYXRlX2RlZmF1bHRzKHNlbGYsIGRlZmF1bHRzKToKICAgICAgICAiIiJVcGRhdGVzIHRoZSBnaXZlbiBkZWZhdWx0cyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBjb25maWcgZmlsZXMgYW5kCiAgICAgICAgdGhlIGVudmlyb24uIERvZXMgYSBsaXR0bGUgc3BlY2lhbCBoYW5kbGluZyBmb3IgY2VydGFpbiB0eXBlcyBvZgogICAgICAgIG9wdGlvbnMgKGxpc3RzKS4iIiIKICAgICAgICAjIFRoZW4gZ28gYW5kIGxvb2sgZm9yIHRoZSBvdGhlciBzb3VyY2VzIG9mIGNvbmZpZ3VyYXRpb246CiAgICAgICAgY29uZmlnID0ge30KICAgICAgICAjIDEuIGNvbmZpZyBmaWxlcwogICAgICAgIGZvciBzZWN0aW9uIGluICgnZ2xvYmFsJywgc2VsZi5uYW1lKToKICAgICAgICAgICAgY29uZmlnLnVwZGF0ZSgKICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2tleXMoc2VsZi5nZXRfY29uZmlnX3NlY3Rpb24oc2VjdGlvbikpCiAgICAgICAgICAgICkKICAgICAgICAjIDIuIGVudmlyb25tZW50YWwgdmFyaWFibGVzCiAgICAgICAgaWYgbm90IHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGNvbmZpZy51cGRhdGUoc2VsZi5ub3JtYWxpemVfa2V5cyhzZWxmLmdldF9lbnZpcm9uX3ZhcnMoKSkpCiAgICAgICAgIyBBY2N1bXVsYXRlIGNvbXBsZXggZGVmYXVsdCBzdGF0ZS4KICAgICAgICBzZWxmLnZhbHVlcyA9IG9wdHBhcnNlLlZhbHVlcyhzZWxmLmRlZmF1bHRzKQogICAgICAgIGxhdGVfZXZhbCA9IHNldCgpCiAgICAgICAgIyBUaGVuIHNldCB0aGUgb3B0aW9ucyB3aXRoIHRob3NlIHZhbHVlcwogICAgICAgIGZvciBrZXksIHZhbCBpbiBjb25maWcuaXRlbXMoKToKICAgICAgICAgICAgIyBpZ25vcmUgZW1wdHkgdmFsdWVzCiAgICAgICAgICAgIGlmIG5vdCB2YWw6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5nZXRfb3B0aW9uKGtleSkKICAgICAgICAgICAgIyBJZ25vcmUgb3B0aW9ucyBub3QgcHJlc2VudCBpbiB0aGlzIHBhcnNlci4gRS5nLiBub24tZ2xvYmFscyBwdXQKICAgICAgICAgICAgIyBpbiBbZ2xvYmFsXSBieSB1c2VycyB0aGF0IHdhbnQgdGhlbSB0byBhcHBseSB0byBhbGwgYXBwbGljYWJsZQogICAgICAgICAgICAjIGNvbW1hbmRzLgogICAgICAgICAgICBpZiBvcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBvcHRpb24uYWN0aW9uIGluICgnc3RvcmVfdHJ1ZScsICdzdG9yZV9mYWxzZScsICdjb3VudCcpOgogICAgICAgICAgICAgICAgdmFsID0gc3RydG9ib29sKHZhbCkKICAgICAgICAgICAgZWxpZiBvcHRpb24uYWN0aW9uID09ICdhcHBlbmQnOgogICAgICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCkKICAgICAgICAgICAgICAgIHZhbCA9IFtzZWxmLmNoZWNrX2RlZmF1bHQob3B0aW9uLCBrZXksIHYpIGZvciB2IGluIHZhbF0KICAgICAgICAgICAgZWxpZiBvcHRpb24uYWN0aW9uID09ICdjYWxsYmFjayc6CiAgICAgICAgICAgICAgICBsYXRlX2V2YWwuYWRkKG9wdGlvbi5kZXN0KQogICAgICAgICAgICAgICAgb3B0X3N0ciA9IG9wdGlvbi5nZXRfb3B0X3N0cmluZygpCiAgICAgICAgICAgICAgICB2YWwgPSBvcHRpb24uY29udmVydF92YWx1ZShvcHRfc3RyLCB2YWwpCiAgICAgICAgICAgICAgICAjIEZyb20gdGFrZV9hY3Rpb24KICAgICAgICAgICAgICAgIGFyZ3MgPSBvcHRpb24uY2FsbGJhY2tfYXJncyBvciAoKQogICAgICAgICAgICAgICAga3dhcmdzID0gb3B0aW9uLmNhbGxiYWNrX2t3YXJncyBvciB7fQogICAgICAgICAgICAgICAgb3B0aW9uLmNhbGxiYWNrKG9wdGlvbiwgb3B0X3N0ciwgdmFsLCBzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmNoZWNrX2RlZmF1bHQob3B0aW9uLCBrZXksIHZhbCkKCiAgICAgICAgICAgIGRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IHZhbAoKICAgICAgICBmb3Iga2V5IGluIGxhdGVfZXZhbDoKICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IGdldGF0dHIoc2VsZi52YWx1ZXMsIGtleSkKICAgICAgICBzZWxmLnZhbHVlcyA9IE5vbmUKICAgICAgICByZXR1cm4gZGVmYXVsdHMKCiAgICBkZWYgbm9ybWFsaXplX2tleXMoc2VsZiwgaXRlbXMpOgogICAgICAgICIiIlJldHVybiBhIGNvbmZpZyBkaWN0aW9uYXJ5IHdpdGggbm9ybWFsaXplZCBrZXlzIHJlZ2FyZGxlc3Mgb2YKICAgICAgICB3aGV0aGVyIHRoZSBrZXlzIHdlcmUgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBpbiBjb25maWcKICAgICAgICBmaWxlcyIiIgogICAgICAgIG5vcm1hbGl6ZWQgPSB7fQogICAgICAgIGZvciBrZXksIHZhbCBpbiBpdGVtczoKICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgICAgIGlmIG5vdCBrZXkuc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgICAgIGtleSA9ICctLSVzJyAlIGtleSAgIyBvbmx5IHByZWZlciBsb25nIG9wdHMKICAgICAgICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsCiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQKCiAgICBkZWYgZ2V0X2NvbmZpZ19zZWN0aW9uKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkdldCBhIHNlY3Rpb24gb2YgYSBjb25maWd1cmF0aW9uIiIiCiAgICAgICAgaWYgc2VsZi5jb25maWcuaGFzX3NlY3Rpb24obmFtZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5pdGVtcyhuYW1lKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBnZXRfZW52aXJvbl92YXJzKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgYSBnZW5lcmF0b3Igd2l0aCBhbGwgZW52aXJvbm1lbnRhbCB2YXJzIHdpdGggcHJlZml4IFBJUF8iIiIKICAgICAgICBmb3Iga2V5LCB2YWwgaW4gb3MuZW52aXJvbi5pdGVtcygpOgogICAgICAgICAgICBpZiBfZW52aXJvbl9wcmVmaXhfcmUuc2VhcmNoKGtleSk6CiAgICAgICAgICAgICAgICB5aWVsZCAoX2Vudmlyb25fcHJlZml4X3JlLnN1YigiIiwga2V5KS5sb3dlcigpLCB2YWwpCgogICAgZGVmIGdldF9kZWZhdWx0X3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiJPdmVycmlkaW5nIHRvIG1ha2UgdXBkYXRpbmcgdGhlIGRlZmF1bHRzIGFmdGVyIGluc3RhbnRpYXRpb24gb2YKICAgICAgICB0aGUgb3B0aW9uIHBhcnNlciBwb3NzaWJsZSwgX3VwZGF0ZV9kZWZhdWx0cygpIGRvZXMgdGhlIGRpcnR5IHdvcmsuIiIiCiAgICAgICAgaWYgbm90IHNlbGYucHJvY2Vzc19kZWZhdWx0X3ZhbHVlczoKICAgICAgICAgICAgIyBPbGQsIHByZS1PcHRpayAxLjUgYmVoYXZpb3VyLgogICAgICAgICAgICByZXR1cm4gb3B0cGFyc2UuVmFsdWVzKHNlbGYuZGVmYXVsdHMpCgogICAgICAgIGRlZmF1bHRzID0gc2VsZi5fdXBkYXRlX2RlZmF1bHRzKHNlbGYuZGVmYXVsdHMuY29weSgpKSAgIyBvdXJzCiAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLl9nZXRfYWxsX29wdGlvbnMoKToKICAgICAgICAgICAgZGVmYXVsdCA9IGRlZmF1bHRzLmdldChvcHRpb24uZGVzdCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZWZhdWx0LCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgb3B0X3N0ciA9IG9wdGlvbi5nZXRfb3B0X3N0cmluZygpCiAgICAgICAgICAgICAgICBkZWZhdWx0c1tvcHRpb24uZGVzdF0gPSBvcHRpb24uY2hlY2tfdmFsdWUob3B0X3N0ciwgZGVmYXVsdCkKICAgICAgICByZXR1cm4gb3B0cGFyc2UuVmFsdWVzKGRlZmF1bHRzKQoKICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgogICAgICAgIHNlbGYucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKICAgICAgICBzZWxmLmV4aXQoMiwgIiVzXG4iICUgbXNnKQpQSwMEFAAAAAAAAAAhAEuZMiFaQAAAWkAAACEAAABweXBpX19waXBfOV8wXzMvcGlwL2NtZG9wdGlvbnMucHkiIiIKc2hhcmVkIG9wdGlvbnMgYW5kIGdyb3VwcwoKVGhlIHByaW5jaXBsZSBoZXJlIGlzIHRvIGRlZmluZSBvcHRpb25zIG9uY2UsIGJ1dCAqbm90KiBpbnN0YW50aWF0ZSB0aGVtCmdsb2JhbGx5LiBPbmUgcmVhc29uIGJlaW5nIHRoYXQgb3B0aW9ucyB3aXRoIGFjdGlvbj0nYXBwZW5kJyBjYW4gY2Fycnkgc3RhdGUKYmV0d2VlbiBwYXJzZXMuIHBpcCBwYXJzZXMgZ2VuZXJhbCBvcHRpb25zIHR3aWNlIGludGVybmFsbHksIGFuZCBzaG91bGRuJ3QKcGFzcyBvbiBzdGF0ZS4gVG8gYmUgY29uc2lzdGVudCwgYWxsIG9wdGlvbnMgd2lsbCBmb2xsb3cgdGhpcyBkZXNpZ24uCgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCmZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvbkdyb3VwLCBTVVBQUkVTU19IRUxQLCBPcHRpb24KaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgKAogICAgRm9ybWF0Q29udHJvbCwgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUsIGZtdF9jdGxfbm9fYmluYXJ5LAogICAgZm10X2N0bF9ub191c2Vfd2hlZWwpCmZyb20gcGlwLm1vZGVscyBpbXBvcnQgUHlQSQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IFVTRVJfQ0FDSEVfRElSLCBzcmNfcHJlZml4CmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgU1RST05HX0hBU0hFUwoKCmRlZiBtYWtlX29wdGlvbl9ncm91cChncm91cCwgcGFyc2VyKToKICAgICIiIgogICAgUmV0dXJuIGFuIE9wdGlvbkdyb3VwIG9iamVjdAogICAgZ3JvdXAgIC0tIGFzc3VtZWQgdG8gYmUgZGljdCB3aXRoICduYW1lJyBhbmQgJ29wdGlvbnMnIGtleXMKICAgIHBhcnNlciAtLSBhbiBvcHRwYXJzZSBQYXJzZXIKICAgICIiIgogICAgb3B0aW9uX2dyb3VwID0gT3B0aW9uR3JvdXAocGFyc2VyLCBncm91cFsnbmFtZSddKQogICAgZm9yIG9wdGlvbiBpbiBncm91cFsnb3B0aW9ucyddOgogICAgICAgIG9wdGlvbl9ncm91cC5hZGRfb3B0aW9uKG9wdGlvbigpKQogICAgcmV0dXJuIG9wdGlvbl9ncm91cAoKCmRlZiByZXNvbHZlX3doZWVsX25vX3VzZV9iaW5hcnkob3B0aW9ucyk6CiAgICBpZiBub3Qgb3B0aW9ucy51c2Vfd2hlZWw6CiAgICAgICAgY29udHJvbCA9IG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wKICAgICAgICBmbXRfY3RsX25vX3VzZV93aGVlbChjb250cm9sKQoKCmRlZiBjaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zLCBjaGVja19vcHRpb25zPU5vbmUpOgogICAgIiIiRGlzYWJsZSB3aGVlbHMgaWYgcGVyLXNldHVwLnB5IGNhbGwgb3B0aW9ucyBhcmUgc2V0LgoKICAgIDpwYXJhbSBvcHRpb25zOiBUaGUgT3B0aW9uUGFyc2VyIG9wdGlvbnMgdG8gdXBkYXRlLgogICAgOnBhcmFtIGNoZWNrX29wdGlvbnM6IFRoZSBvcHRpb25zIHRvIGNoZWNrLCBpZiBub3Qgc3VwcGxpZWQgZGVmYXVsdHMgdG8KICAgICAgICBvcHRpb25zLgogICAgIiIiCiAgICBpZiBjaGVja19vcHRpb25zIGlzIE5vbmU6CiAgICAgICAgY2hlY2tfb3B0aW9ucyA9IG9wdGlvbnMKCiAgICBkZWYgZ2V0bmFtZShuKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihjaGVja19vcHRpb25zLCBuLCBOb25lKQogICAgbmFtZXMgPSBbImJ1aWxkX29wdGlvbnMiLCAiZ2xvYmFsX29wdGlvbnMiLCAiaW5zdGFsbF9vcHRpb25zIl0KICAgIGlmIGFueShtYXAoZ2V0bmFtZSwgbmFtZXMpKToKICAgICAgICBjb250cm9sID0gb3B0aW9ucy5mb3JtYXRfY29udHJvbAogICAgICAgIGZtdF9jdGxfbm9fYmluYXJ5KGNvbnRyb2wpCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgJ0Rpc2FibGluZyBhbGwgdXNlIG9mIHdoZWVscyBkdWUgdG8gdGhlIHVzZSBvZiAtLWJ1aWxkLW9wdGlvbnMgJwogICAgICAgICAgICAnLyAtLWdsb2JhbC1vcHRpb25zIC8gLS1pbnN0YWxsLW9wdGlvbnMuJywgc3RhY2tsZXZlbD0yKQoKCiMjIyMjIyMjIyMjCiMgb3B0aW9ucyAjCiMjIyMjIyMjIyMjCgpoZWxwXyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWgnLCAnLS1oZWxwJywKICAgIGRlc3Q9J2hlbHAnLAogICAgYWN0aW9uPSdoZWxwJywKICAgIGhlbHA9J1Nob3cgaGVscC4nKQoKaXNvbGF0ZWRfbW9kZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1pc29sYXRlZCIsCiAgICBkZXN0PSJpc29sYXRlZF9tb2RlIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0oCiAgICAgICAgIlJ1biBwaXAgaW4gYW4gaXNvbGF0ZWQgbW9kZSwgaWdub3JpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB1c2VyICIKICAgICAgICAiY29uZmlndXJhdGlvbi4iCiAgICApLAopCgpyZXF1aXJlX3ZpcnR1YWxlbnYgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBSdW4gb25seSBpZiBpbnNpZGUgYSB2aXJ0dWFsZW52LCBiYWlsIGlmIG5vdC4KICAgICctLXJlcXVpcmUtdmlydHVhbGVudicsICctLXJlcXVpcmUtdmVudicsCiAgICBkZXN0PSdyZXF1aXJlX3ZlbnYnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgp2ZXJib3NlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctdicsICctLXZlcmJvc2UnLAogICAgZGVzdD0ndmVyYm9zZScsCiAgICBhY3Rpb249J2NvdW50JywKICAgIGRlZmF1bHQ9MCwKICAgIGhlbHA9J0dpdmUgbW9yZSBvdXRwdXQuIE9wdGlvbiBpcyBhZGRpdGl2ZSwgYW5kIGNhbiBiZSB1c2VkIHVwIHRvIDMgdGltZXMuJwopCgp2ZXJzaW9uID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctVicsICctLXZlcnNpb24nLAogICAgZGVzdD0ndmVyc2lvbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgaGVscD0nU2hvdyB2ZXJzaW9uIGFuZCBleGl0LicpCgpxdWlldCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLXEnLCAnLS1xdWlldCcsCiAgICBkZXN0PSdxdWlldCcsCiAgICBhY3Rpb249J2NvdW50JywKICAgIGRlZmF1bHQ9MCwKICAgIGhlbHA9KCdHaXZlIGxlc3Mgb3V0cHV0LiBPcHRpb24gaXMgYWRkaXRpdmUsIGFuZCBjYW4gYmUgdXNlZCB1cCB0byAzJwogICAgICAgICAgJyB0aW1lcyAoY29ycmVzcG9uZGluZyB0byBXQVJOSU5HLCBFUlJPUiwgYW5kIENSSVRJQ0FMIGxvZ2dpbmcnCiAgICAgICAgICAnIGxldmVscykuJykKKQoKbG9nID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWxvZyIsICItLWxvZy1maWxlIiwgIi0tbG9jYWwtbG9nIiwKICAgIGRlc3Q9ImxvZyIsCiAgICBtZXRhdmFyPSJwYXRoIiwKICAgIGhlbHA9IlBhdGggdG8gYSB2ZXJib3NlIGFwcGVuZGluZyBsb2cuIgopCgpub19pbnB1dCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIERvbid0IGFzayBmb3IgaW5wdXQKICAgICctLW5vLWlucHV0JywKICAgIGRlc3Q9J25vX2lucHV0JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKcHJveHkgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcHJveHknLAogICAgZGVzdD0ncHJveHknLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPSJTcGVjaWZ5IGEgcHJveHkgaW4gdGhlIGZvcm0gW3VzZXI6cGFzc3dkQF1wcm94eS5zZXJ2ZXI6cG9ydC4iKQoKcmV0cmllcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1yZXRyaWVzJywKICAgIGRlc3Q9J3JldHJpZXMnLAogICAgdHlwZT0naW50JywKICAgIGRlZmF1bHQ9NSwKICAgIGhlbHA9Ik1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZWFjaCBjb25uZWN0aW9uIHNob3VsZCBhdHRlbXB0ICIKICAgICAgICAgIihkZWZhdWx0ICVkZWZhdWx0IHRpbWVzKS4iKQoKdGltZW91dCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS10aW1lb3V0JywgJy0tZGVmYXVsdC10aW1lb3V0JywKICAgIG1ldGF2YXI9J3NlYycsCiAgICBkZXN0PSd0aW1lb3V0JywKICAgIHR5cGU9J2Zsb2F0JywKICAgIGRlZmF1bHQ9MTUsCiAgICBoZWxwPSdTZXQgdGhlIHNvY2tldCB0aW1lb3V0IChkZWZhdWx0ICVkZWZhdWx0IHNlY29uZHMpLicpCgpkZWZhdWx0X3ZjcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIFRoZSBkZWZhdWx0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0gZm9yIGVkaXRhYmxlcywgZS5nLiAnc3ZuJwogICAgJy0tZGVmYXVsdC12Y3MnLAogICAgZGVzdD0nZGVmYXVsdF92Y3MnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgpza2lwX3JlcXVpcmVtZW50c19yZWdleCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIEEgcmVnZXggdG8gYmUgdXNlZCB0byBza2lwIHJlcXVpcmVtZW50cwogICAgJy0tc2tpcC1yZXF1aXJlbWVudHMtcmVnZXgnLAogICAgZGVzdD0nc2tpcF9yZXF1aXJlbWVudHNfcmVnZXgnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgoKZGVmIGV4aXN0c19hY3Rpb24oKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIyBPcHRpb24gd2hlbiBwYXRoIGFscmVhZHkgZXhpc3QKICAgICAgICAnLS1leGlzdHMtYWN0aW9uJywKICAgICAgICBkZXN0PSdleGlzdHNfYWN0aW9uJywKICAgICAgICB0eXBlPSdjaG9pY2UnLAogICAgICAgIGNob2ljZXM9WydzJywgJ2knLCAndycsICdiJywgJ2EnXSwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBtZXRhdmFyPSdhY3Rpb24nLAogICAgICAgIGhlbHA9IkRlZmF1bHQgYWN0aW9uIHdoZW4gYSBwYXRoIGFscmVhZHkgZXhpc3RzOiAiCiAgICAgICAgIihzKXdpdGNoLCAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCwgKGEpYm9ydC4iKQoKCmNlcnQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tY2VydCcsCiAgICBkZXN0PSdjZXJ0JywKICAgIHR5cGU9J3N0cicsCiAgICBtZXRhdmFyPSdwYXRoJywKICAgIGhlbHA9IlBhdGggdG8gYWx0ZXJuYXRlIENBIGJ1bmRsZS4iKQoKY2xpZW50X2NlcnQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tY2xpZW50LWNlcnQnLAogICAgZGVzdD0nY2xpZW50X2NlcnQnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9Tm9uZSwKICAgIG1ldGF2YXI9J3BhdGgnLAogICAgaGVscD0iUGF0aCB0byBTU0wgY2xpZW50IGNlcnRpZmljYXRlLCBhIHNpbmdsZSBmaWxlIGNvbnRhaW5pbmcgdGhlICIKICAgICAgICAgInByaXZhdGUga2V5IGFuZCB0aGUgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdC4iKQoKaW5kZXhfdXJsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctaScsICctLWluZGV4LXVybCcsICctLXB5cGktdXJsJywKICAgIGRlc3Q9J2luZGV4X3VybCcsCiAgICBtZXRhdmFyPSdVUkwnLAogICAgZGVmYXVsdD1QeVBJLnNpbXBsZV91cmwsCiAgICBoZWxwPSJCYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCAoZGVmYXVsdCAlZGVmYXVsdCkuICIKICAgICAgICAgIlRoaXMgc2hvdWxkIHBvaW50IHRvIGEgcmVwb3NpdG9yeSBjb21wbGlhbnQgd2l0aCBQRVAgNTAzICIKICAgICAgICAgIih0aGUgc2ltcGxlIHJlcG9zaXRvcnkgQVBJKSBvciBhIGxvY2FsIGRpcmVjdG9yeSBsYWlkIG91dCAiCiAgICAgICAgICJpbiB0aGUgc2FtZSBmb3JtYXQuIikKCgpkZWYgZXh0cmFfaW5kZXhfdXJsKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctLWV4dHJhLWluZGV4LXVybCcsCiAgICAgICAgZGVzdD0nZXh0cmFfaW5kZXhfdXJscycsCiAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBoZWxwPSJFeHRyYSBVUkxzIG9mIHBhY2thZ2UgaW5kZXhlcyB0byB1c2UgaW4gYWRkaXRpb24gdG8gIgogICAgICAgICAgICAgIi0taW5kZXgtdXJsLiBTaG91bGQgZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzICIKICAgICAgICAgICAgICItLWluZGV4LXVybC4iCiAgICApCgoKbm9faW5kZXggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8taW5kZXgnLAogICAgZGVzdD0nbm9faW5kZXgnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSdJZ25vcmUgcGFja2FnZSBpbmRleCAob25seSBsb29raW5nIGF0IC0tZmluZC1saW5rcyBVUkxzIGluc3RlYWQpLicpCgoKZGVmIGZpbmRfbGlua3MoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1mJywgJy0tZmluZC1saW5rcycsCiAgICAgICAgZGVzdD0nZmluZF9saW5rcycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0ndXJsJywKICAgICAgICBoZWxwPSJJZiBhIHVybCBvciBwYXRoIHRvIGFuIGh0bWwgZmlsZSwgdGhlbiBwYXJzZSBmb3IgbGlua3MgdG8gIgogICAgICAgICAgICAgImFyY2hpdmVzLiBJZiBhIGxvY2FsIHBhdGggb3IgZmlsZTovLyB1cmwgdGhhdCdzIGEgZGlyZWN0b3J5LCAiCiAgICAgICAgICAgICAidGhlbiBsb29rIGZvciBhcmNoaXZlcyBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcuIikKCgpkZWYgYWxsb3dfZXh0ZXJuYWwoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwiLAogICAgICAgIGRlc3Q9ImFsbG93X2V4dGVybmFsIiwKICAgICAgICBhY3Rpb249ImFwcGVuZCIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSJQQUNLQUdFIiwKICAgICAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCiAgICApCgoKYWxsb3dfYWxsX2V4dGVybmFsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWFsbG93LWFsbC1leHRlcm5hbCIsCiAgICBkZXN0PSJhbGxvd19hbGxfZXh0ZXJuYWwiLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCgpkZWYgdHJ1c3RlZF9ob3N0KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLXRydXN0ZWQtaG9zdCIsCiAgICAgICAgZGVzdD0idHJ1c3RlZF9ob3N0cyIsCiAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAogICAgICAgIG1ldGF2YXI9IkhPU1ROQU1FIiwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIGhlbHA9Ik1hcmsgdGhpcyBob3N0IGFzIHRydXN0ZWQsIGV2ZW4gdGhvdWdoIGl0IGRvZXMgbm90IGhhdmUgdmFsaWQgIgogICAgICAgICAgICAgIm9yIGFueSBIVFRQUy4iLAogICAgKQoKCiMgUmVtb3ZlIGFmdGVyIDcuMApub19hbGxvd19leHRlcm5hbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1uby1hbGxvdy1leHRlcm5hbCIsCiAgICBkZXN0PSJhbGxvd19hbGxfZXh0ZXJuYWwiLAogICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgoKIyBSZW1vdmUgLS1hbGxvdy1pbnNlY3VyZSBhZnRlciA3LjAKZGVmIGFsbG93X3Vuc2FmZSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIiwgIi0tYWxsb3ctaW5zZWN1cmUiLAogICAgICAgIGRlc3Q9ImFsbG93X3VudmVyaWZpZWQiLAogICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9IlBBQ0tBR0UiLAogICAgICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKICAgICkKCiMgUmVtb3ZlIGFmdGVyIDcuMApub19hbGxvd191bnNhZmUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tYWxsb3ctaW5zZWN1cmUiLAogICAgZGVzdD0iYWxsb3dfYWxsX2luc2VjdXJlIiwKICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUAopCgojIFJlbW92ZSBhZnRlciAxLjUKcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLXByb2Nlc3MtZGVwZW5kZW5jeS1saW5rcyIsCiAgICBkZXN0PSJwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MiLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJFbmFibGUgdGhlIHByb2Nlc3Npbmcgb2YgZGVwZW5kZW5jeSBsaW5rcy4iLAopCgoKZGVmIGNvbnN0cmFpbnRzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctYycsICctLWNvbnN0cmFpbnQnLAogICAgICAgIGRlc3Q9J2NvbnN0cmFpbnRzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICBoZWxwPSdDb25zdHJhaW4gdmVyc2lvbnMgdXNpbmcgdGhlIGdpdmVuIGNvbnN0cmFpbnRzIGZpbGUuICcKICAgICAgICAnVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJykKCgpkZWYgcmVxdWlyZW1lbnRzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICBkZXN0PSdyZXF1aXJlbWVudHMnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J2ZpbGUnLAogICAgICAgIGhlbHA9J0luc3RhbGwgZnJvbSB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGZpbGUuICcKICAgICAgICAnVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJykKCgpkZWYgZWRpdGFibGUoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1lJywgJy0tZWRpdGFibGUnLAogICAgICAgIGRlc3Q9J2VkaXRhYmxlcycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0ncGF0aC91cmwnLAogICAgICAgIGhlbHA9KCdJbnN0YWxsIGEgcHJvamVjdCBpbiBlZGl0YWJsZSBtb2RlIChpLmUuIHNldHVwdG9vbHMgJwogICAgICAgICAgICAgICciZGV2ZWxvcCBtb2RlIikgZnJvbSBhIGxvY2FsIHByb2plY3QgcGF0aCBvciBhIFZDUyB1cmwuJyksCiAgICApCgpzcmMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tc3JjJywgJy0tc291cmNlJywgJy0tc291cmNlLWRpcicsICctLXNvdXJjZS1kaXJlY3RvcnknLAogICAgZGVzdD0nc3JjX2RpcicsCiAgICBtZXRhdmFyPSdkaXInLAogICAgZGVmYXVsdD1zcmNfcHJlZml4LAogICAgaGVscD0nRGlyZWN0b3J5IHRvIGNoZWNrIG91dCBlZGl0YWJsZSBwcm9qZWN0cyBpbnRvLiAnCiAgICAnVGhlIGRlZmF1bHQgaW4gYSB2aXJ0dWFsZW52IGlzICI8dmVudiBwYXRoPi9zcmMiLiAnCiAgICAnVGhlIGRlZmF1bHQgZm9yIGdsb2JhbCBpbnN0YWxscyBpcyAiPGN1cnJlbnQgZGlyPi9zcmMiLicKKQoKIyBYWFg6IGRlcHJlY2F0ZWQsIHJlbW92ZSBpbiA5LjAKdXNlX3doZWVsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXVzZS13aGVlbCcsCiAgICBkZXN0PSd1c2Vfd2hlZWwnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9VHJ1ZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKIyBYWFg6IGRlcHJlY2F0ZWQsIHJlbW92ZSBpbiA5LjAKbm9fdXNlX3doZWVsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLXVzZS13aGVlbCcsCiAgICBkZXN0PSd1c2Vfd2hlZWwnLAogICAgYWN0aW9uPSdzdG9yZV9mYWxzZScsCiAgICBkZWZhdWx0PVRydWUsCiAgICBoZWxwPSgnRG8gbm90IEZpbmQgYW5kIHByZWZlciB3aGVlbCBhcmNoaXZlcyB3aGVuIHNlYXJjaGluZyBpbmRleGVzIGFuZCAnCiAgICAgICAgICAnZmluZC1saW5rcyBsb2NhdGlvbnMuIERFUFJFQ0FURUQgaW4gZmF2b3VyIG9mIC0tbm8tYmluYXJ5LicpLAopCgoKZGVmIF9nZXRfZm9ybWF0X2NvbnRyb2wodmFsdWVzLCBvcHRpb24pOgogICAgIiIiR2V0IGEgZm9ybWF0X2NvbnRyb2wgb2JqZWN0LiIiIgogICAgcmV0dXJuIGdldGF0dHIodmFsdWVzLCBvcHRpb24uZGVzdCkKCgpkZWYgX2hhbmRsZV9ub19iaW5hcnkob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKICAgIGV4aXN0aW5nID0gZ2V0YXR0cihwYXJzZXIudmFsdWVzLCBvcHRpb24uZGVzdCkKICAgIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKAogICAgICAgIHZhbHVlLCBleGlzdGluZy5ub19iaW5hcnksIGV4aXN0aW5nLm9ubHlfYmluYXJ5KQoKCmRlZiBfaGFuZGxlX29ubHlfYmluYXJ5KG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6CiAgICBleGlzdGluZyA9IGdldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QpCiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICB2YWx1ZSwgZXhpc3Rpbmcub25seV9iaW5hcnksIGV4aXN0aW5nLm5vX2JpbmFyeSkKCgpkZWYgbm9fYmluYXJ5KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLW5vLWJpbmFyeSIsIGRlc3Q9ImZvcm1hdF9jb250cm9sIiwgYWN0aW9uPSJjYWxsYmFjayIsCiAgICAgICAgY2FsbGJhY2s9X2hhbmRsZV9ub19iaW5hcnksIHR5cGU9InN0ciIsCiAgICAgICAgZGVmYXVsdD1Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSksCiAgICAgICAgaGVscD0iRG8gbm90IHVzZSBiaW5hcnkgcGFja2FnZXMuIENhbiBiZSBzdXBwbGllZCBtdWx0aXBsZSB0aW1lcywgYW5kICIKICAgICAgICAgICAgICJlYWNoIHRpbWUgYWRkcyB0byB0aGUgZXhpc3RpbmcgdmFsdWUuIEFjY2VwdHMgZWl0aGVyIDphbGw6IHRvICIKICAgICAgICAgICAgICJkaXNhYmxlIGFsbCBiaW5hcnkgcGFja2FnZXMsIDpub25lOiB0byBlbXB0eSB0aGUgc2V0LCBvciBvbmUgb3IgIgogICAgICAgICAgICAgIm1vcmUgcGFja2FnZSBuYW1lcyB3aXRoIGNvbW1hcyBiZXR3ZWVuIHRoZW0uIE5vdGUgdGhhdCBzb21lICIKICAgICAgICAgICAgICJwYWNrYWdlcyBhcmUgdHJpY2t5IHRvIGNvbXBpbGUgYW5kIG1heSBmYWlsIHRvIGluc3RhbGwgd2hlbiAiCiAgICAgICAgICAgICAidGhpcyBvcHRpb24gaXMgdXNlZCBvbiB0aGVtLiIpCgoKZGVmIG9ubHlfYmluYXJ5KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLW9ubHktYmluYXJ5IiwgZGVzdD0iZm9ybWF0X2NvbnRyb2wiLCBhY3Rpb249ImNhbGxiYWNrIiwKICAgICAgICBjYWxsYmFjaz1faGFuZGxlX29ubHlfYmluYXJ5LCB0eXBlPSJzdHIiLAogICAgICAgIGRlZmF1bHQ9Rm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpLAogICAgICAgIGhlbHA9IkRvIG5vdCB1c2Ugc291cmNlIHBhY2thZ2VzLiBDYW4gYmUgc3VwcGxpZWQgbXVsdGlwbGUgdGltZXMsIGFuZCAiCiAgICAgICAgICAgICAiZWFjaCB0aW1lIGFkZHMgdG8gdGhlIGV4aXN0aW5nIHZhbHVlLiBBY2NlcHRzIGVpdGhlciA6YWxsOiB0byAiCiAgICAgICAgICAgICAiZGlzYWJsZSBhbGwgc291cmNlIHBhY2thZ2VzLCA6bm9uZTogdG8gZW1wdHkgdGhlIHNldCwgb3Igb25lIG9yICIKICAgICAgICAgICAgICJtb3JlIHBhY2thZ2UgbmFtZXMgd2l0aCBjb21tYXMgYmV0d2VlbiB0aGVtLiBQYWNrYWdlcyB3aXRob3V0ICIKICAgICAgICAgICAgICJiaW5hcnkgZGlzdHJpYnV0aW9ucyB3aWxsIGZhaWwgdG8gaW5zdGFsbCB3aGVuIHRoaXMgb3B0aW9uIGlzICIKICAgICAgICAgICAgICJ1c2VkIG9uIHRoZW0uIikKCgpjYWNoZV9kaXIgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tY2FjaGUtZGlyIiwKICAgIGRlc3Q9ImNhY2hlX2RpciIsCiAgICBkZWZhdWx0PVVTRVJfQ0FDSEVfRElSLAogICAgbWV0YXZhcj0iZGlyIiwKICAgIGhlbHA9IlN0b3JlIHRoZSBjYWNoZSBkYXRhIGluIDxkaXI+LiIKKQoKbm9fY2FjaGUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tY2FjaGUtZGlyIiwKICAgIGRlc3Q9ImNhY2hlX2RpciIsCiAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgIGhlbHA9IkRpc2FibGUgdGhlIGNhY2hlLiIsCikKCm5vX2RlcHMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8tZGVwcycsICctLW5vLWRlcGVuZGVuY2llcycsCiAgICBkZXN0PSdpZ25vcmVfZGVwZW5kZW5jaWVzJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRG9uJ3QgaW5zdGFsbCBwYWNrYWdlIGRlcGVuZGVuY2llcy4iKQoKYnVpbGRfZGlyID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctYicsICctLWJ1aWxkJywgJy0tYnVpbGQtZGlyJywgJy0tYnVpbGQtZGlyZWN0b3J5JywKICAgIGRlc3Q9J2J1aWxkX2RpcicsCiAgICBtZXRhdmFyPSdkaXInLAogICAgaGVscD0nRGlyZWN0b3J5IHRvIHVucGFjayBwYWNrYWdlcyBpbnRvIGFuZCBidWlsZCBpbi4nCikKCmlnbm9yZV9yZXF1aXJlc19weXRob24gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0taWdub3JlLXJlcXVpcmVzLXB5dGhvbicsCiAgICBkZXN0PSdpZ25vcmVfcmVxdWlyZXNfcHl0aG9uJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBoZWxwPSdJZ25vcmUgdGhlIFJlcXVpcmVzLVB5dGhvbiBpbmZvcm1hdGlvbi4nKQoKaW5zdGFsbF9vcHRpb25zID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWluc3RhbGwtb3B0aW9uJywKICAgIGRlc3Q9J2luc3RhbGxfb3B0aW9ucycsCiAgICBhY3Rpb249J2FwcGVuZCcsCiAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgIGhlbHA9IkV4dHJhIGFyZ3VtZW50cyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgaW5zdGFsbCAiCiAgICAgICAgICJjb21tYW5kICh1c2UgbGlrZSAtLWluc3RhbGwtb3B0aW9uPVwiLS1pbnN0YWxsLXNjcmlwdHM9L3Vzci9sb2NhbC8iCiAgICAgICAgICJiaW5cIikuIFVzZSBtdWx0aXBsZSAtLWluc3RhbGwtb3B0aW9uIG9wdGlvbnMgdG8gcGFzcyBtdWx0aXBsZSAiCiAgICAgICAgICJvcHRpb25zIHRvIHNldHVwLnB5IGluc3RhbGwuIElmIHlvdSBhcmUgdXNpbmcgYW4gb3B0aW9uIHdpdGggYSAiCiAgICAgICAgICJkaXJlY3RvcnkgcGF0aCwgYmUgc3VyZSB0byB1c2UgYWJzb2x1dGUgcGF0aC4iKQoKZ2xvYmFsX29wdGlvbnMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tZ2xvYmFsLW9wdGlvbicsCiAgICBkZXN0PSdnbG9iYWxfb3B0aW9ucycsCiAgICBhY3Rpb249J2FwcGVuZCcsCiAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgIGhlbHA9IkV4dHJhIGdsb2JhbCBvcHRpb25zIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzZXR1cC5weSAiCiAgICAgICAgICJjYWxsIGJlZm9yZSB0aGUgaW5zdGFsbCBjb21tYW5kLiIpCgpub19jbGVhbiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby1jbGVhbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkRvbid0IGNsZWFuIHVwIGJ1aWxkIGRpcmVjdG9yaWVzLiIpCgpwcmUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcHJlJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iSW5jbHVkZSBwcmUtcmVsZWFzZSBhbmQgZGV2ZWxvcG1lbnQgdmVyc2lvbnMuIEJ5IGRlZmF1bHQsICIKICAgICAgICAgInBpcCBvbmx5IGZpbmRzIHN0YWJsZSB2ZXJzaW9ucy4iKQoKZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjayA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1kaXNhYmxlLXBpcC12ZXJzaW9uLWNoZWNrIiwKICAgIGRlc3Q9ImRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2siLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJEb24ndCBwZXJpb2RpY2FsbHkgY2hlY2sgUHlQSSB0byBkZXRlcm1pbmUgd2hldGhlciBhIG5ldyB2ZXJzaW9uICIKICAgICAgICAgIm9mIHBpcCBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkLiBJbXBsaWVkIHdpdGggLS1uby1pbmRleC4iKQoKIyBEZXByZWNhdGVkLCBSZW1vdmUgbGF0ZXIKYWx3YXlzX3VuemlwID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctWicsICctLWFsd2F5cy11bnppcCcsCiAgICBkZXN0PSdhbHdheXNfdW56aXAnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKCmRlZiBfbWVyZ2VfaGFzaChvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgogICAgIiIiR2l2ZW4gYSB2YWx1ZSBzcGVsbGVkICJhbGdvOmRpZ2VzdCIsIGFwcGVuZCB0aGUgZGlnZXN0IHRvIGEgbGlzdAogICAgcG9pbnRlZCB0byBpbiBhIGRpY3QgYnkgdGhlIGFsZ28gbmFtZS4iIiIKICAgIGlmIG5vdCBwYXJzZXIudmFsdWVzLmhhc2hlczoKICAgICAgICBwYXJzZXIudmFsdWVzLmhhc2hlcyA9IHt9CiAgICB0cnk6CiAgICAgICAgYWxnbywgZGlnZXN0ID0gdmFsdWUuc3BsaXQoJzonLCAxKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFyc2VyLmVycm9yKCdBcmd1bWVudHMgdG8gJXMgbXVzdCBiZSBhIGhhc2ggbmFtZSAnCiAgICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieSBhIHZhbHVlLCBsaWtlIC0taGFzaD1zaGEyNTY6YWJjZGUuLi4nICUKICAgICAgICAgICAgICAgICAgICAgb3B0X3N0cikKICAgIGlmIGFsZ28gbm90IGluIFNUUk9OR19IQVNIRVM6CiAgICAgICAgcGFyc2VyLmVycm9yKCdBbGxvd2VkIGhhc2ggYWxnb3JpdGhtcyBmb3IgJXMgYXJlICVzLicgJQogICAgICAgICAgICAgICAgICAgICAob3B0X3N0ciwgJywgJy5qb2luKFNUUk9OR19IQVNIRVMpKSkKICAgIHBhcnNlci52YWx1ZXMuaGFzaGVzLnNldGRlZmF1bHQoYWxnbywgW10pLmFwcGVuZChkaWdlc3QpCgoKaGFzaCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1oYXNoJywKICAgICMgSGFzaCB2YWx1ZXMgZXZlbnR1YWxseSBlbmQgdXAgaW4gSW5zdGFsbFJlcXVpcmVtZW50Lmhhc2hlcyBkdWUgdG8KICAgICMgX19kaWN0X18gY29weWluZyBpbiBwcm9jZXNzX2xpbmUoKS4KICAgIGRlc3Q9J2hhc2hlcycsCiAgICBhY3Rpb249J2NhbGxiYWNrJywKICAgIGNhbGxiYWNrPV9tZXJnZV9oYXNoLAogICAgdHlwZT0nc3RyaW5nJywKICAgIGhlbHA9IlZlcmlmeSB0aGF0IHRoZSBwYWNrYWdlJ3MgYXJjaGl2ZSBtYXRjaGVzIHRoaXMgIgogICAgICAgICAnaGFzaCBiZWZvcmUgaW5zdGFsbGluZy4gRXhhbXBsZTogLS1oYXNoPXNoYTI1NjphYmNkZWYuLi4nKQoKCnJlcXVpcmVfaGFzaGVzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXJlcXVpcmUtaGFzaGVzJywKICAgIGRlc3Q9J3JlcXVpcmVfaGFzaGVzJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0nUmVxdWlyZSBhIGhhc2ggdG8gY2hlY2sgZWFjaCByZXF1aXJlbWVudCBhZ2FpbnN0LCBmb3IgJwogICAgICAgICAncmVwZWF0YWJsZSBpbnN0YWxscy4gVGhpcyBvcHRpb24gaXMgaW1wbGllZCB3aGVuIGFueSBwYWNrYWdlIGluIGEgJwogICAgICAgICAncmVxdWlyZW1lbnRzIGZpbGUgaGFzIGEgLS1oYXNoIG9wdGlvbi4nKQoKCiMjIyMjIyMjIyMKIyBncm91cHMgIwojIyMjIyMjIyMjCgpnZW5lcmFsX2dyb3VwID0gewogICAgJ25hbWUnOiAnR2VuZXJhbCBPcHRpb25zJywKICAgICdvcHRpb25zJzogWwogICAgICAgIGhlbHBfLAogICAgICAgIGlzb2xhdGVkX21vZGUsCiAgICAgICAgcmVxdWlyZV92aXJ0dWFsZW52LAogICAgICAgIHZlcmJvc2UsCiAgICAgICAgdmVyc2lvbiwKICAgICAgICBxdWlldCwKICAgICAgICBsb2csCiAgICAgICAgbm9faW5wdXQsCiAgICAgICAgcHJveHksCiAgICAgICAgcmV0cmllcywKICAgICAgICB0aW1lb3V0LAogICAgICAgIGRlZmF1bHRfdmNzLAogICAgICAgIHNraXBfcmVxdWlyZW1lbnRzX3JlZ2V4LAogICAgICAgIGV4aXN0c19hY3Rpb24sCiAgICAgICAgdHJ1c3RlZF9ob3N0LAogICAgICAgIGNlcnQsCiAgICAgICAgY2xpZW50X2NlcnQsCiAgICAgICAgY2FjaGVfZGlyLAogICAgICAgIG5vX2NhY2hlLAogICAgICAgIGRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2ssCiAgICBdCn0KCm5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwID0gewogICAgJ25hbWUnOiAnUGFja2FnZSBJbmRleCBPcHRpb25zJywKICAgICdvcHRpb25zJzogWwogICAgICAgIGluZGV4X3VybCwKICAgICAgICBleHRyYV9pbmRleF91cmwsCiAgICAgICAgbm9faW5kZXgsCiAgICAgICAgZmluZF9saW5rcywKICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICBdCn0KCmluZGV4X2dyb3VwID0gewogICAgJ25hbWUnOiAnUGFja2FnZSBJbmRleCBPcHRpb25zIChpbmNsdWRpbmcgZGVwcmVjYXRlZCBvcHRpb25zKScsCiAgICAnb3B0aW9ucyc6IG5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwWydvcHRpb25zJ10gKyBbCiAgICAgICAgYWxsb3dfZXh0ZXJuYWwsCiAgICAgICAgYWxsb3dfYWxsX2V4dGVybmFsLAogICAgICAgIG5vX2FsbG93X2V4dGVybmFsLAogICAgICAgIGFsbG93X3Vuc2FmZSwKICAgICAgICBub19hbGxvd191bnNhZmUsCiAgICBdCn0KUEsDBBQAAAAAAAAAIQCQDYdDxAgAAMQIAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9fX2luaXRfXy5weSIiIgpQYWNrYWdlIGNvbnRhaW5pbmcgYWxsIHBpcCBjb21tYW5kcwoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gcGlwLmNvbW1hbmRzLmNvbXBsZXRpb24gaW1wb3J0IENvbXBsZXRpb25Db21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmRvd25sb2FkIGltcG9ydCBEb3dubG9hZENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuZnJlZXplIGltcG9ydCBGcmVlemVDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmhhc2ggaW1wb3J0IEhhc2hDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmhlbHAgaW1wb3J0IEhlbHBDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmxpc3QgaW1wb3J0IExpc3RDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmNoZWNrIGltcG9ydCBDaGVja0NvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuc2VhcmNoIGltcG9ydCBTZWFyY2hDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLnNob3cgaW1wb3J0IFNob3dDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmluc3RhbGwgaW1wb3J0IEluc3RhbGxDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLnVuaW5zdGFsbCBpbXBvcnQgVW5pbnN0YWxsQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy53aGVlbCBpbXBvcnQgV2hlZWxDb21tYW5kCgoKY29tbWFuZHNfZGljdCA9IHsKICAgIENvbXBsZXRpb25Db21tYW5kLm5hbWU6IENvbXBsZXRpb25Db21tYW5kLAogICAgRnJlZXplQ29tbWFuZC5uYW1lOiBGcmVlemVDb21tYW5kLAogICAgSGFzaENvbW1hbmQubmFtZTogSGFzaENvbW1hbmQsCiAgICBIZWxwQ29tbWFuZC5uYW1lOiBIZWxwQ29tbWFuZCwKICAgIFNlYXJjaENvbW1hbmQubmFtZTogU2VhcmNoQ29tbWFuZCwKICAgIFNob3dDb21tYW5kLm5hbWU6IFNob3dDb21tYW5kLAogICAgSW5zdGFsbENvbW1hbmQubmFtZTogSW5zdGFsbENvbW1hbmQsCiAgICBVbmluc3RhbGxDb21tYW5kLm5hbWU6IFVuaW5zdGFsbENvbW1hbmQsCiAgICBEb3dubG9hZENvbW1hbmQubmFtZTogRG93bmxvYWRDb21tYW5kLAogICAgTGlzdENvbW1hbmQubmFtZTogTGlzdENvbW1hbmQsCiAgICBDaGVja0NvbW1hbmQubmFtZTogQ2hlY2tDb21tYW5kLAogICAgV2hlZWxDb21tYW5kLm5hbWU6IFdoZWVsQ29tbWFuZCwKfQoKCmNvbW1hbmRzX29yZGVyID0gWwogICAgSW5zdGFsbENvbW1hbmQsCiAgICBEb3dubG9hZENvbW1hbmQsCiAgICBVbmluc3RhbGxDb21tYW5kLAogICAgRnJlZXplQ29tbWFuZCwKICAgIExpc3RDb21tYW5kLAogICAgU2hvd0NvbW1hbmQsCiAgICBDaGVja0NvbW1hbmQsCiAgICBTZWFyY2hDb21tYW5kLAogICAgV2hlZWxDb21tYW5kLAogICAgSGFzaENvbW1hbmQsCiAgICBDb21wbGV0aW9uQ29tbWFuZCwKICAgIEhlbHBDb21tYW5kLApdCgoKZGVmIGdldF9zdW1tYXJpZXMob3JkZXJlZD1UcnVlKToKICAgICIiIllpZWxkcyBzb3J0ZWQgKGNvbW1hbmQgbmFtZSwgY29tbWFuZCBzdW1tYXJ5KSB0dXBsZXMuIiIiCgogICAgaWYgb3JkZXJlZDoKICAgICAgICBjbWRpdGVtcyA9IF9zb3J0X2NvbW1hbmRzKGNvbW1hbmRzX2RpY3QsIGNvbW1hbmRzX29yZGVyKQogICAgZWxzZToKICAgICAgICBjbWRpdGVtcyA9IGNvbW1hbmRzX2RpY3QuaXRlbXMoKQoKICAgIGZvciBuYW1lLCBjb21tYW5kX2NsYXNzIGluIGNtZGl0ZW1zOgogICAgICAgIHlpZWxkIChuYW1lLCBjb21tYW5kX2NsYXNzLnN1bW1hcnkpCgoKZGVmIGdldF9zaW1pbGFyX2NvbW1hbmRzKG5hbWUpOgogICAgIiIiQ29tbWFuZCBuYW1lIGF1dG8tY29ycmVjdC4iIiIKICAgIGZyb20gZGlmZmxpYiBpbXBvcnQgZ2V0X2Nsb3NlX21hdGNoZXMKCiAgICBuYW1lID0gbmFtZS5sb3dlcigpCgogICAgY2xvc2VfY29tbWFuZHMgPSBnZXRfY2xvc2VfbWF0Y2hlcyhuYW1lLCBjb21tYW5kc19kaWN0LmtleXMoKSkKCiAgICBpZiBjbG9zZV9jb21tYW5kczoKICAgICAgICByZXR1cm4gY2xvc2VfY29tbWFuZHNbMF0KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIF9zb3J0X2NvbW1hbmRzKGNtZGRpY3QsIG9yZGVyKToKICAgIGRlZiBrZXlmbihrZXkpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9yZGVyLmluZGV4KGtleVsxXSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyB1bm9yZGVyZWQgaXRlbXMgc2hvdWxkIGNvbWUgbGFzdAogICAgICAgICAgICByZXR1cm4gMHhmZgoKICAgIHJldHVybiBzb3J0ZWQoY21kZGljdC5pdGVtcygpLCBrZXk9a2V5Zm4pClBLAwQUAAAAAAAAACEAHWE7X2YFAABmBQAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvY2hlY2sucHlpbXBvcnQgbG9nZ2luZwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAub3BlcmF0aW9ucy5jaGVjayBpbXBvcnQgY2hlY2tfcmVxdWlyZW1lbnRzCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDaGVja0NvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJWZXJpZnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmUgY29tcGF0aWJsZSBkZXBlbmRlbmNpZXMuIiIiCiAgICBuYW1lID0gJ2NoZWNrJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIiIiCiAgICBzdW1tYXJ5ID0gJ1ZlcmlmeSBpbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBjb21wYXRpYmxlIGRlcGVuZGVuY2llcy4nCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBkaXN0cyA9IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PUZhbHNlLCBza2lwPSgpKQogICAgICAgIG1pc3NpbmdfcmVxc19kaWN0LCBpbmNvbXBhdGlibGVfcmVxc19kaWN0ID0gY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3RzKQoKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAga2V5ID0gJyVzPT0lcycgJSAoZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKCiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCBpbiBtaXNzaW5nX3JlcXNfZGljdC5nZXQoa2V5LCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgJXMgcmVxdWlyZXMgJXMsIHdoaWNoIGlzIG5vdCBpbnN0YWxsZWQuIiwKICAgICAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uLCByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUpCgogICAgICAgICAgICBmb3IgcmVxdWlyZW1lbnQsIGFjdHVhbCBpbiBpbmNvbXBhdGlibGVfcmVxc19kaWN0LmdldChrZXksIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyAlcyBoYXMgcmVxdWlyZW1lbnQgJXMsIGJ1dCB5b3UgaGF2ZSAlcyAlcy4iLAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24sIHJlcXVpcmVtZW50LAogICAgICAgICAgICAgICAgICAgIGFjdHVhbC5wcm9qZWN0X25hbWUsIGFjdHVhbC52ZXJzaW9uKQoKICAgICAgICBpZiBtaXNzaW5nX3JlcXNfZGljdCBvciBpbmNvbXBhdGlibGVfcmVxc19kaWN0OgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJObyBicm9rZW4gcmVxdWlyZW1lbnRzIGZvdW5kLiIpClBLAwQUAAAAAAAAACEAMMHMs5UJAACVCQAAKgAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvY29tcGxldGlvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCgpCQVNFX0NPTVBMRVRJT04gPSAiIiIKIyBwaXAgJShzaGVsbClzIGNvbXBsZXRpb24gc3RhcnQlKHNjcmlwdClzIyBwaXAgJShzaGVsbClzIGNvbXBsZXRpb24gZW5kCiIiIgoKQ09NUExFVElPTl9TQ1JJUFRTID0gewogICAgJ2Jhc2gnOiAiIiIKX3BpcF9jb21wbGV0aW9uKCkKewogICAgQ09NUFJFUExZPSggJCggQ09NUF9XT1JEUz0iJHtDT01QX1dPUkRTWypdfSIgXFwKICAgICAgICAgICAgICAgICAgIENPTVBfQ1dPUkQ9JENPTVBfQ1dPUkQgXFwKICAgICAgICAgICAgICAgICAgIFBJUF9BVVRPX0NPTVBMRVRFPTEgJDEgKSApCn0KY29tcGxldGUgLW8gZGVmYXVsdCAtRiBfcGlwX2NvbXBsZXRpb24gcGlwCiIiIiwgJ3pzaCc6ICIiIgpmdW5jdGlvbiBfcGlwX2NvbXBsZXRpb24gewogIGxvY2FsIHdvcmRzIGN3b3JkCiAgcmVhZCAtQWMgd29yZHMKICByZWFkIC1jbiBjd29yZAogIHJlcGx5PSggJCggQ09NUF9XT1JEUz0iJHdvcmRzWypdIiBcXAogICAgICAgICAgICAgQ09NUF9DV09SRD0kKCggY3dvcmQtMSApKSBcXAogICAgICAgICAgICAgUElQX0FVVE9fQ09NUExFVEU9MSAkd29yZHNbMV0gKSApCn0KY29tcGN0bCAtSyBfcGlwX2NvbXBsZXRpb24gcGlwCiIiIiwgJ2Zpc2gnOiAiIiIKZnVuY3Rpb24gX19maXNoX2NvbXBsZXRlX3BpcAogICAgc2V0IC1seCBDT01QX1dPUkRTIChjb21tYW5kbGluZSAtbykgIiIKICAgIHNldCAtbHggQ09NUF9DV09SRCAobWF0aCAoY29udGFpbnMgLWkgLS0gKGNvbW1hbmRsaW5lIC10KSAkQ09NUF9XT1JEUyktMSkKICAgIHNldCAtbHggUElQX0FVVE9fQ09NUExFVEUgMQogICAgc3RyaW5nIHNwbGl0IFwgIC0tIChldmFsICRDT01QX1dPUkRTWzFdKQplbmQKY29tcGxldGUgLWZhICIoX19maXNoX2NvbXBsZXRlX3BpcCkiIC1jIHBpcAoiIiJ9CgoKY2xhc3MgQ29tcGxldGlvbkNvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJBIGhlbHBlciBjb21tYW5kIHRvIGJlIHVzZWQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4iIiIKICAgIG5hbWUgPSAnY29tcGxldGlvbicKICAgIHN1bW1hcnkgPSAnQSBoZWxwZXIgY29tbWFuZCB1c2VkIGZvciBjb21tYW5kIGNvbXBsZXRpb24uJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoQ29tcGxldGlvbkNvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYmFzaCcsICctYicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nYmFzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIGJhc2gnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXpzaCcsICcteicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nenNoJywKICAgICAgICAgICAgZGVzdD0nc2hlbGwnLAogICAgICAgICAgICBoZWxwPSdFbWl0IGNvbXBsZXRpb24gY29kZSBmb3IgenNoJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1maXNoJywgJy1mJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsCiAgICAgICAgICAgIGNvbnN0PSdmaXNoJywKICAgICAgICAgICAgZGVzdD0nc2hlbGwnLAogICAgICAgICAgICBoZWxwPSdFbWl0IGNvbXBsZXRpb24gY29kZSBmb3IgZmlzaCcpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICAiIiJQcmludHMgdGhlIGNvbXBsZXRpb24gY29kZSBvZiB0aGUgZ2l2ZW4gc2hlbGwiIiIKICAgICAgICBzaGVsbHMgPSBDT01QTEVUSU9OX1NDUklQVFMua2V5cygpCiAgICAgICAgc2hlbGxfb3B0aW9ucyA9IFsnLS0nICsgc2hlbGwgZm9yIHNoZWxsIGluIHNvcnRlZChzaGVsbHMpXQogICAgICAgIGlmIG9wdGlvbnMuc2hlbGwgaW4gc2hlbGxzOgogICAgICAgICAgICBzY3JpcHQgPSBDT01QTEVUSU9OX1NDUklQVFMuZ2V0KG9wdGlvbnMuc2hlbGwsICcnKQogICAgICAgICAgICBwcmludChCQVNFX0NPTVBMRVRJT04gJSB7J3NjcmlwdCc6IHNjcmlwdCwgJ3NoZWxsJzogb3B0aW9ucy5zaGVsbH0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgICAgICdFUlJPUjogWW91IG11c3QgcGFzcyAlc1xuJyAlICcgb3IgJy5qb2luKHNoZWxsX29wdGlvbnMpCiAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQDZHpmmgh4AAIIeAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9kb3dubG9hZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgRm9ybWF0Q29udHJvbApmcm9tIHBpcC5yZXEgaW1wb3J0IFJlcXVpcmVtZW50U2V0CmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBSZXF1aXJlbWVudENvbW1hbmQKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGVuc3VyZV9kaXIsIG5vcm1hbGl6ZV9wYXRoCmZyb20gcGlwLnV0aWxzLmJ1aWxkIGltcG9ydCBCdWlsZERpcmVjdG9yeQpmcm9tIHBpcC51dGlscy5maWxlc3lzdGVtIGltcG9ydCBjaGVja19wYXRoX293bmVyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgRG93bmxvYWRDb21tYW5kKFJlcXVpcmVtZW50Q29tbWFuZCk6CiAgICAiIiIKICAgIERvd25sb2FkIHBhY2thZ2VzIGZyb206CgogICAgLSBQeVBJIChhbmQgb3RoZXIgaW5kZXhlcykgdXNpbmcgcmVxdWlyZW1lbnQgc3BlY2lmaWVycy4KICAgIC0gVkNTIHByb2plY3QgdXJscy4KICAgIC0gTG9jYWwgcHJvamVjdCBkaXJlY3Rvcmllcy4KICAgIC0gTG9jYWwgb3IgcmVtb3RlIHNvdXJjZSBhcmNoaXZlcy4KCiAgICBwaXAgYWxzbyBzdXBwb3J0cyBkb3dubG9hZGluZyBmcm9tICJyZXF1aXJlbWVudHMgZmlsZXMiLCB3aGljaCBwcm92aWRlCiAgICBhbiBlYXN5IHdheSB0byBzcGVjaWZ5IGEgd2hvbGUgZW52aXJvbm1lbnQgdG8gYmUgZG93bmxvYWRlZC4KICAgICIiIgogICAgbmFtZSA9ICdkb3dubG9hZCcKCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHJlcXVpcmVtZW50IHNwZWNpZmllcj4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8dmNzIHByb2plY3QgdXJsPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPGxvY2FsIHByb2plY3QgcGF0aD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSA8YXJjaGl2ZSB1cmwvcGF0aD4gLi4uIiIiCgogICAgc3VtbWFyeSA9ICdEb3dubG9hZCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihEb3dubG9hZENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmNvbnN0cmFpbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmVkaXRhYmxlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVtZW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5idWlsZF9kaXIoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fZGVwcygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5nbG9iYWxfb3B0aW9ucygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMub25seV9iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuc3JjKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnByZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19jbGVhbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWQnLCAnLS1kZXN0JywgJy0tZGVzdGluYXRpb24tZGlyJywgJy0tZGVzdGluYXRpb24tZGlyZWN0b3J5JywKICAgICAgICAgICAgZGVzdD0nZG93bmxvYWRfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1vcy5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9KCJEb3dubG9hZCBwYWNrYWdlcyBpbnRvIDxkaXI+LiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcGxhdGZvcm0nLAogICAgICAgICAgICBkZXN0PSdwbGF0Zm9ybScsCiAgICAgICAgICAgIG1ldGF2YXI9J3BsYXRmb3JtJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIDxwbGF0Zm9ybT4uICIKICAgICAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSBvZiB0aGUgcnVubmluZyBzeXN0ZW0uIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1weXRob24tdmVyc2lvbicsCiAgICAgICAgICAgIGRlc3Q9J3B5dGhvbl92ZXJzaW9uJywKICAgICAgICAgICAgbWV0YXZhcj0ncHl0aG9uX3ZlcnNpb24nLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggUHl0aG9uICIKICAgICAgICAgICAgICAgICAgImludGVycHJldGVyIHZlcnNpb24gPHZlcnNpb24+LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSAiCiAgICAgICAgICAgICAgICAgICJjdXJyZW50IHN5c3RlbSBpbnRlcnByZXRlciBtaW5vciB2ZXJzaW9uIGlzIHVzZWQuIEEgbWFqb3IgIgogICAgICAgICAgICAgICAgICAidmVyc2lvbiAoZS5nLiAnMicpIGNhbiBiZSBzcGVjaWZpZWQgdG8gbWF0Y2ggYWxsICIKICAgICAgICAgICAgICAgICAgIm1pbm9yIHJldnMgb2YgdGhhdCBtYWpvciB2ZXJzaW9uLiAgQSBtaW5vciB2ZXJzaW9uICIKICAgICAgICAgICAgICAgICAgIihlLmcuICczNCcpIGNhbiBhbHNvIGJlIHNwZWNpZmllZC4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWltcGxlbWVudGF0aW9uJywKICAgICAgICAgICAgZGVzdD0naW1wbGVtZW50YXRpb24nLAogICAgICAgICAgICBtZXRhdmFyPSdpbXBsZW1lbnRhdGlvbicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gIgogICAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb24gPGltcGxlbWVudGF0aW9uPiwgZS5nLiAncHAnLCAnanknLCAnY3AnLCAiCiAgICAgICAgICAgICAgICAgICIgb3IgJ2lwJy4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgY3VycmVudCAiCiAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLiAgVXNlICdweScgdG8gZm9yY2UgIgogICAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb24tYWdub3N0aWMgd2hlZWxzLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYWJpJywKICAgICAgICAgICAgZGVzdD0nYWJpJywKICAgICAgICAgICAgbWV0YXZhcj0nYWJpJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAiCiAgICAgICAgICAgICAgICAgICJhYmkgPGFiaT4sIGUuZy4gJ3B5cHlfNDEnLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgIgogICAgICAgICAgICAgICAgICAiY3VycmVudCBpbnRlcnByZXRlciBhYmkgdGFnIGlzIHVzZWQuICBHZW5lcmFsbHkgIgogICAgICAgICAgICAgICAgICAieW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IC0taW1wbGVtZW50YXRpb24sICIKICAgICAgICAgICAgICAgICAgIi0tcGxhdGZvcm0sIGFuZCAtLXB5dGhvbi12ZXJzaW9uIHdoZW4gdXNpbmcgIgogICAgICAgICAgICAgICAgICAidGhpcyBvcHRpb24uIiksCiAgICAgICAgKQoKICAgICAgICBpbmRleF9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5ub25fZGVwcmVjYXRlZF9pbmRleF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIG9wdGlvbnMuaWdub3JlX2luc3RhbGxlZCA9IFRydWUKCiAgICAgICAgaWYgb3B0aW9ucy5weXRob25fdmVyc2lvbjoKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb25zID0gW29wdGlvbnMucHl0aG9uX3ZlcnNpb25dCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb25zID0gTm9uZQoKICAgICAgICBkaXN0X3Jlc3RyaWN0aW9uX3NldCA9IGFueShbCiAgICAgICAgICAgIG9wdGlvbnMucHl0aG9uX3ZlcnNpb24sCiAgICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0sCiAgICAgICAgICAgIG9wdGlvbnMuYWJpLAogICAgICAgICAgICBvcHRpb25zLmltcGxlbWVudGF0aW9uLAogICAgICAgIF0pCiAgICAgICAgYmluYXJ5X29ubHkgPSBGb3JtYXRDb250cm9sKHNldCgpLCBzZXQoWyc6YWxsOiddKSkKICAgICAgICBpZiBkaXN0X3Jlc3RyaWN0aW9uX3NldCBhbmQgb3B0aW9ucy5mb3JtYXRfY29udHJvbCAhPSBiaW5hcnlfb25seToKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgIi0tb25seS1iaW5hcnk9OmFsbDogbXVzdCBiZSBzZXQgYW5kIC0tbm8tYmluYXJ5IG11c3Qgbm90ICIKICAgICAgICAgICAgICAgICJiZSBzZXQgKG9yIG11c3QgYmUgc2V0IHRvIDpub25lOikgd2hlbiByZXN0cmljdGluZyBwbGF0Zm9ybSAiCiAgICAgICAgICAgICAgICAiYW5kIGludGVycHJldGVyIGNvbnN0cmFpbnRzIHVzaW5nIC0tcHl0aG9uLXZlcnNpb24sICIKICAgICAgICAgICAgICAgICItLXBsYXRmb3JtLCAtLWFiaSwgb3IgLS1pbXBsZW1lbnRhdGlvbi4iCiAgICAgICAgICAgICkKCiAgICAgICAgb3B0aW9ucy5zcmNfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuc3JjX2RpcikKICAgICAgICBvcHRpb25zLmRvd25sb2FkX2RpciA9IG5vcm1hbGl6ZV9wYXRoKG9wdGlvbnMuZG93bmxvYWRfZGlyKQoKICAgICAgICBlbnN1cmVfZGlyKG9wdGlvbnMuZG93bmxvYWRfZGlyKQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIoCiAgICAgICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICBwbGF0Zm9ybT1vcHRpb25zLnBsYXRmb3JtLAogICAgICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb25zPXB5dGhvbl92ZXJzaW9ucywKICAgICAgICAgICAgICAgIGFiaT1vcHRpb25zLmFiaSwKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uPW9wdGlvbnMuaW1wbGVtZW50YXRpb24sCiAgICAgICAgICAgICkKICAgICAgICAgICAgYnVpbGRfZGVsZXRlID0gKG5vdCAob3B0aW9ucy5ub19jbGVhbiBvciBvcHRpb25zLmJ1aWxkX2RpcikpCiAgICAgICAgICAgIGlmIG9wdGlvbnMuY2FjaGVfZGlyIGFuZCBub3QgY2hlY2tfcGF0aF9vd25lcihvcHRpb25zLmNhY2hlX2Rpcik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiVGhlIGRpcmVjdG9yeSAnJXMnIG9yIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvd25lZCAiCiAgICAgICAgICAgICAgICAgICAgImJ5IHRoZSBjdXJyZW50IHVzZXIgYW5kIGNhY2hpbmcgd2hlZWxzIGhhcyBiZWVuICIKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIGNoZWNrIHRoZSBwZXJtaXNzaW9ucyBhbmQgb3duZXIgb2YgdGhhdCAiCiAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeS4gSWYgZXhlY3V0aW5nIHBpcCB3aXRoIHN1ZG8sIHlvdSBtYXkgd2FudCAiCiAgICAgICAgICAgICAgICAgICAgInN1ZG8ncyAtSCBmbGFnLiIsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciA9IE5vbmUKCiAgICAgICAgICAgIHdpdGggQnVpbGREaXJlY3Rvcnkob3B0aW9ucy5idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlPWJ1aWxkX2RlbGV0ZSkgYXMgYnVpbGRfZGlyOgoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCA9IFJlcXVpcmVtZW50U2V0KAogICAgICAgICAgICAgICAgICAgIGJ1aWxkX2Rpcj1idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgc3JjX2Rpcj1vcHRpb25zLnNyY19kaXIsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyPW9wdGlvbnMuZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9pbnN0YWxsZWQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPW9wdGlvbnMuaWdub3JlX2RlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPW9wdGlvbnMucmVxdWlyZV9oYXNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwKICAgICAgICAgICAgICAgICAgICBhcmdzLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIE5vbmUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnByZXBhcmVfZmlsZXMoZmluZGVyKQoKICAgICAgICAgICAgICAgIGRvd25sb2FkZWQgPSAnICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgcmVxLm5hbWUgZm9yIHJlcSBpbiByZXF1aXJlbWVudF9zZXQuc3VjY2Vzc2Z1bGx5X2Rvd25sb2FkZWQKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICBpZiBkb3dubG9hZGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgJXMnLCBkb3dubG9hZGVkCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICMgQ2xlYW4gdXAKICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLm5vX2NsZWFuOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5jbGVhbnVwX2ZpbGVzKCkKCiAgICAgICAgcmV0dXJuIHJlcXVpcmVtZW50X3NldApQSwMEFAAAAAAAAAAhAMP282ATCwAAEwsAACYAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2ZyZWV6ZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCgppbXBvcnQgcGlwCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgc3RkbGliX3BrZ3MKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAub3BlcmF0aW9ucy5mcmVlemUgaW1wb3J0IGZyZWV6ZQpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZQoKCkRFVl9QS0dTID0gKCdwaXAnLCAnc2V0dXB0b29scycsICdkaXN0cmlidXRlJywgJ3doZWVsJykKCgpjbGFzcyBGcmVlemVDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBPdXRwdXQgaW5zdGFsbGVkIHBhY2thZ2VzIGluIHJlcXVpcmVtZW50cyBmb3JtYXQuCgogICAgcGFja2FnZXMgYXJlIGxpc3RlZCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgc29ydGVkIG9yZGVyLgogICAgIiIiCiAgICBuYW1lID0gJ2ZyZWV6ZScKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSIiIgogICAgc3VtbWFyeSA9ICdPdXRwdXQgaW5zdGFsbGVkIHBhY2thZ2VzIGluIHJlcXVpcmVtZW50cyBmb3JtYXQuJwogICAgbG9nX3N0cmVhbXMgPSAoImV4dDovL3N5cy5zdGRlcnIiLCAiZXh0Oi8vc3lzLnN0ZGVyciIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihGcmVlemVDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgIGRlc3Q9J3JlcXVpcmVtZW50cycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgb3JkZXIgaW4gdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBmaWxlIGFuZCBpdHMgIgogICAgICAgICAgICAgICAgICJjb21tZW50cyB3aGVuIGdlbmVyYXRpbmcgb3V0cHV0LiBUaGlzIG9wdGlvbiBjYW4gYmUgIgogICAgICAgICAgICAgICAgICJ1c2VkIG11bHRpcGxlIHRpbWVzLiIpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWYnLCAnLS1maW5kLWxpbmtzJywKICAgICAgICAgICAgZGVzdD0nZmluZF9saW5rcycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICAgICAgaGVscD0nVVJMIGZvciBmaW5kaW5nIHBhY2thZ2VzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSAnCiAgICAgICAgICAgICAgICAgJ291dHB1dC4nKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1sJywgJy0tbG9jYWwnLAogICAgICAgICAgICBkZXN0PSdsb2NhbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0lmIGluIGEgdmlydHVhbGVudiB0aGF0IGhhcyBnbG9iYWwgYWNjZXNzLCBkbyBub3Qgb3V0cHV0ICcKICAgICAgICAgICAgICAgICAnZ2xvYmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzLicpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlcicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J09ubHkgb3V0cHV0IHBhY2thZ2VzIGluc3RhbGxlZCBpbiB1c2VyLXNpdGUuJykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWFsbCcsCiAgICAgICAgICAgIGRlc3Q9J2ZyZWV6ZV9hbGwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdEbyBub3Qgc2tpcCB0aGVzZSBwYWNrYWdlcyBpbiB0aGUgb3V0cHV0OicKICAgICAgICAgICAgICAgICAnICVzJyAlICcsICcuam9pbihERVZfUEtHUykpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGZvcm1hdF9jb250cm9sID0gcGlwLmluZGV4LkZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKQogICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2RpciwgZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgc2tpcCA9IHNldChzdGRsaWJfcGtncykKICAgICAgICBpZiBub3Qgb3B0aW9ucy5mcmVlemVfYWxsOgogICAgICAgICAgICBza2lwLnVwZGF0ZShERVZfUEtHUykKCiAgICAgICAgZnJlZXplX2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIHJlcXVpcmVtZW50PW9wdGlvbnMucmVxdWlyZW1lbnRzLAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgbG9jYWxfb25seT1vcHRpb25zLmxvY2FsLAogICAgICAgICAgICB1c2VyX29ubHk9b3B0aW9ucy51c2VyLAogICAgICAgICAgICBza2lwX3JlZ2V4PW9wdGlvbnMuc2tpcF9yZXF1aXJlbWVudHNfcmVnZXgsCiAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgIHNraXA9c2tpcCkKCiAgICAgICAgZm9yIGxpbmUgaW4gZnJlZXplKCoqZnJlZXplX2t3YXJncyk6CiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUobGluZSArICdcbicpClBLAwQUAAAAAAAAACEA+InspD0GAAA9BgAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaGFzaC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IEVSUk9SCmZyb20gcGlwLnV0aWxzIGltcG9ydCByZWFkX2NodW5rcwpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IEZBVk9SSVRFX0hBU0gsIFNUUk9OR19IQVNIRVMKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBIYXNoQ29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgQ29tcHV0ZSBhIGhhc2ggb2YgYSBsb2NhbCBwYWNrYWdlIGFyY2hpdmUuCgogICAgVGhlc2UgY2FuIGJlIHVzZWQgd2l0aCAtLWhhc2ggaW4gYSByZXF1aXJlbWVudHMgZmlsZSB0byBkbyByZXBlYXRhYmxlCiAgICBpbnN0YWxscy4KCiAgICAiIiIKICAgIG5hbWUgPSAnaGFzaCcKICAgIHVzYWdlID0gJyVwcm9nIFtvcHRpb25zXSA8ZmlsZT4gLi4uJwogICAgc3VtbWFyeSA9ICdDb21wdXRlIGhhc2hlcyBvZiBwYWNrYWdlIGFyY2hpdmVzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKEhhc2hDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctYScsICctLWFsZ29yaXRobScsCiAgICAgICAgICAgIGRlc3Q9J2FsZ29yaXRobScsCiAgICAgICAgICAgIGNob2ljZXM9U1RST05HX0hBU0hFUywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RkFWT1JJVEVfSEFTSCwKICAgICAgICAgICAgaGVscD0nVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZTogb25lIG9mICVzJyAlCiAgICAgICAgICAgICAgICAgJywgJy5qb2luKFNUUk9OR19IQVNIRVMpKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wcmludF91c2FnZShzeXMuc3RkZXJyKQogICAgICAgICAgICByZXR1cm4gRVJST1IKCiAgICAgICAgYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG0KICAgICAgICBmb3IgcGF0aCBpbiBhcmdzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6XG4tLWhhc2g9JXM6JXMnLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBhbGdvcml0aG0sIF9oYXNoX29mX2ZpbGUocGF0aCwgYWxnb3JpdGhtKSkKCgpkZWYgX2hhc2hfb2ZfZmlsZShwYXRoLCBhbGdvcml0aG0pOgogICAgIiIiUmV0dXJuIHRoZSBoYXNoIGRpZ2VzdCBvZiBhIGZpbGUuIiIiCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgYXJjaGl2ZToKICAgICAgICBoYXNoID0gaGFzaGxpYi5uZXcoYWxnb3JpdGhtKQogICAgICAgIGZvciBjaHVuayBpbiByZWFkX2NodW5rcyhhcmNoaXZlKToKICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspCiAgICByZXR1cm4gaGFzaC5oZXhkaWdlc3QoKQpQSwMEFAAAAAAAAAAhAB4W0J3WAwAA1gMAACQAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2hlbHAucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQsIFNVQ0NFU1MKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCgoKY2xhc3MgSGVscENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJTaG93IGhlbHAgZm9yIGNvbW1hbmRzIiIiCiAgICBuYW1lID0gJ2hlbHAnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyA8Y29tbWFuZD4iIiIKICAgIHN1bW1hcnkgPSAnU2hvdyBoZWxwIGZvciBjb21tYW5kcy4nCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBmcm9tIHBpcC5jb21tYW5kcyBpbXBvcnQgY29tbWFuZHNfZGljdCwgZ2V0X3NpbWlsYXJfY29tbWFuZHMKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjICdwaXAgaGVscCcgd2l0aCBubyBhcmdzIGlzIGhhbmRsZWQgYnkgcGlwLl9faW5pdF9fLnBhcnNlb3B0KCkKICAgICAgICAgICAgY21kX25hbWUgPSBhcmdzWzBdICAjIHRoZSBjb21tYW5kIHdlIG5lZWQgaGVscCBmb3IKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1MKCiAgICAgICAgaWYgY21kX25hbWUgbm90IGluIGNvbW1hbmRzX2RpY3Q6CiAgICAgICAgICAgIGd1ZXNzID0gZ2V0X3NpbWlsYXJfY29tbWFuZHMoY21kX25hbWUpCgogICAgICAgICAgICBtc2cgPSBbJ3Vua25vd24gY29tbWFuZCAiJXMiJyAlIGNtZF9uYW1lXQogICAgICAgICAgICBpZiBndWVzczoKICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoJ21heWJlIHlvdSBtZWFudCAiJXMiJyAlIGd1ZXNzKQoKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCcgLSAnLmpvaW4obXNnKSkKCiAgICAgICAgY29tbWFuZCA9IGNvbW1hbmRzX2RpY3RbY21kX25hbWVdKCkKICAgICAgICBjb21tYW5kLnBhcnNlci5wcmludF9oZWxwKCkKCiAgICAgICAgcmV0dXJuIFNVQ0NFU1MKUEsDBBQAAAAAAAAAIQBLJYYWBEQAAAREAAAnAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHdhcm5pbmdzCnRyeToKICAgIGltcG9ydCB3aGVlbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB3aGVlbCA9IE5vbmUKCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IHZpcnR1YWxlbnZfbm9fZ2xvYmFsLCBkaXN0dXRpbHNfc2NoZW1lCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvciwKKQpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2RpciwgZ2V0X2luc3RhbGxlZF92ZXJzaW9uCmZyb20gcGlwLnV0aWxzLmJ1aWxkIGltcG9ydCBCdWlsZERpcmVjdG9yeQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUsIFdoZWVsQnVpbGRlcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEluc3RhbGxDb21tYW5kKFJlcXVpcmVtZW50Q29tbWFuZCk6CiAgICAiIiIKICAgIEluc3RhbGwgcGFja2FnZXMgZnJvbToKCiAgICAtIFB5UEkgKGFuZCBvdGhlciBpbmRleGVzKSB1c2luZyByZXF1aXJlbWVudCBzcGVjaWZpZXJzLgogICAgLSBWQ1MgcHJvamVjdCB1cmxzLgogICAgLSBMb2NhbCBwcm9qZWN0IGRpcmVjdG9yaWVzLgogICAgLSBMb2NhbCBvciByZW1vdGUgc291cmNlIGFyY2hpdmVzLgoKICAgIHBpcCBhbHNvIHN1cHBvcnRzIGluc3RhbGxpbmcgZnJvbSAicmVxdWlyZW1lbnRzIGZpbGVzIiwgd2hpY2ggcHJvdmlkZQogICAgYW4gZWFzeSB3YXkgdG8gc3BlY2lmeSBhIHdob2xlIGVudmlyb25tZW50IHRvIGJlIGluc3RhbGxlZC4KICAgICIiIgogICAgbmFtZSA9ICdpbnN0YWxsJwoKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0luc3RhbGwgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoSW5zdGFsbENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmNvbnN0cmFpbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmVkaXRhYmxlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVtZW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5idWlsZF9kaXIoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy10JywgJy0tdGFyZ2V0JywKICAgICAgICAgICAgZGVzdD0ndGFyZ2V0X2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0nSW5zdGFsbCBwYWNrYWdlcyBpbnRvIDxkaXI+LiAnCiAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQgdGhpcyB3aWxsIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzL2ZvbGRlcnMgaW4gJwogICAgICAgICAgICAgICAgICc8ZGlyPi4gVXNlIC0tdXBncmFkZSB0byByZXBsYWNlIGV4aXN0aW5nIHBhY2thZ2VzIGluIDxkaXI+ICcKICAgICAgICAgICAgICAgICAnd2l0aCBuZXcgdmVyc2lvbnMuJwogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1kJywgJy0tZG93bmxvYWQnLCAnLS1kb3dubG9hZC1kaXInLCAnLS1kb3dubG9hZC1kaXJlY3RvcnknLAogICAgICAgICAgICBkZXN0PSdkb3dubG9hZF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJEb3dubG9hZCBwYWNrYWdlcyBpbnRvIDxkaXI+IGluc3RlYWQgb2YgaW5zdGFsbGluZyB0aGVtLCAiCiAgICAgICAgICAgICAgICAgICJyZWdhcmRsZXNzIG9mIHdoYXQncyBhbHJlYWR5IGluc3RhbGxlZC4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1VJywgJy0tdXBncmFkZScsCiAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdVcGdyYWRlIGFsbCBzcGVjaWZpZWQgcGFja2FnZXMgdG8gdGhlIG5ld2VzdCBhdmFpbGFibGUgJwogICAgICAgICAgICAgICAgICd2ZXJzaW9uLiBUaGUgaGFuZGxpbmcgb2YgZGVwZW5kZW5jaWVzIGRlcGVuZHMgb24gdGhlICcKICAgICAgICAgICAgICAgICAndXBncmFkZS1zdHJhdGVneSB1c2VkLicKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVwZ3JhZGUtc3RyYXRlZ3knLAogICAgICAgICAgICBkZXN0PSd1cGdyYWRlX3N0cmF0ZWd5JywKICAgICAgICAgICAgZGVmYXVsdD0nZWFnZXInLAogICAgICAgICAgICBjaG9pY2VzPVsnb25seS1pZi1uZWVkZWQnLCAnZWFnZXInXSwKICAgICAgICAgICAgaGVscD0nRGV0ZXJtaW5lcyBob3cgZGVwZW5kZW5jeSB1cGdyYWRpbmcgc2hvdWxkIGJlIGhhbmRsZWQuICcKICAgICAgICAgICAgICAgICAnImVhZ2VyIiAtIGRlcGVuZGVuY2llcyBhcmUgdXBncmFkZWQgcmVnYXJkbGVzcyBvZiAnCiAgICAgICAgICAgICAgICAgJ3doZXRoZXIgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmVyc2lvbiBzYXRpc2ZpZXMgdGhlICcKICAgICAgICAgICAgICAgICAncmVxdWlyZW1lbnRzIG9mIHRoZSB1cGdyYWRlZCBwYWNrYWdlKHMpLiAnCiAgICAgICAgICAgICAgICAgJyJvbmx5LWlmLW5lZWRlZCIgLSAgYXJlIHVwZ3JhZGVkIG9ubHkgd2hlbiB0aGV5IGRvIG5vdCAnCiAgICAgICAgICAgICAgICAgJ3NhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgdXBncmFkZWQgcGFja2FnZShzKS4nCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1mb3JjZS1yZWluc3RhbGwnLAogICAgICAgICAgICBkZXN0PSdmb3JjZV9yZWluc3RhbGwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdXaGVuIHVwZ3JhZGluZywgcmVpbnN0YWxsIGFsbCBwYWNrYWdlcyBldmVuIGlmIHRoZXkgYXJlICcKICAgICAgICAgICAgICAgICAnYWxyZWFkeSB1cC10by1kYXRlLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctSScsICctLWlnbm9yZS1pbnN0YWxsZWQnLAogICAgICAgICAgICBkZXN0PSdpZ25vcmVfaW5zdGFsbGVkJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMgKHJlaW5zdGFsbGluZyBpbnN0ZWFkKS4nKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5pbnN0YWxsX29wdGlvbnMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXNlcicsCiAgICAgICAgICAgIGRlc3Q9J3VzZV91c2VyX3NpdGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsIHRvIHRoZSBQeXRob24gdXNlciBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgeW91ciAiCiAgICAgICAgICAgICAgICAgInBsYXRmb3JtLiBUeXBpY2FsbHkgfi8ubG9jYWwvLCBvciAlQVBQREFUQSVcUHl0aG9uIG9uICIKICAgICAgICAgICAgICAgICAiV2luZG93cy4gKFNlZSB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9yIHNpdGUuVVNFUl9CQVNFICIKICAgICAgICAgICAgICAgICAiZm9yIGZ1bGwgZGV0YWlscy4pIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZWdnJywKICAgICAgICAgICAgZGVzdD0nYXNfZWdnJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0iSW5zdGFsbCBwYWNrYWdlcyBhcyBlZ2dzLCBub3QgJ2ZsYXQnLCBsaWtlIHBpcCBub3JtYWxseSAiCiAgICAgICAgICAgICAgICAgImRvZXMuIFRoaXMgb3B0aW9uIGlzIG5vdCBhYm91dCBpbnN0YWxsaW5nICpmcm9tKiBlZ2dzLiAiCiAgICAgICAgICAgICAgICAgIihXQVJOSU5HOiBCZWNhdXNlIHRoaXMgb3B0aW9uIG92ZXJyaWRlcyBwaXAncyBub3JtYWwgaW5zdGFsbCIKICAgICAgICAgICAgICAgICAiIGxvZ2ljLCByZXF1aXJlbWVudHMgZmlsZXMgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQuKSIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXJvb3QnLAogICAgICAgICAgICBkZXN0PSdyb290X3BhdGgnLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290ICIKICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXByZWZpeCcsCiAgICAgICAgICAgIGRlc3Q9J3ByZWZpeF9wYXRoJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsYXRpb24gcHJlZml4IHdoZXJlIGxpYiwgYmluIGFuZCBvdGhlciB0b3AtbGV2ZWwgIgogICAgICAgICAgICAgICAgICJmb2xkZXJzIGFyZSBwbGFjZWQiKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAiLS1jb21waWxlIiwKICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgZGVzdD0iY29tcGlsZSIsCiAgICAgICAgICAgIGRlZmF1bHQ9VHJ1ZSwKICAgICAgICAgICAgaGVscD0iQ29tcGlsZSBweSBmaWxlcyB0byBweWMiLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgIi0tbm8tY29tcGlsZSIsCiAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgICAgICAgICBkZXN0PSJjb21waWxlIiwKICAgICAgICAgICAgaGVscD0iRG8gbm90IGNvbXBpbGUgcHkgZmlsZXMgdG8gcHljIiwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy51c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fdXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5wcmUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBjbWRvcHRpb25zLnJlc29sdmVfd2hlZWxfbm9fdXNlX2JpbmFyeShvcHRpb25zKQogICAgICAgIGNtZG9wdGlvbnMuY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucykKCiAgICAgICAgaWYgb3B0aW9ucy5hc19lZ2c6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1lZ2cgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICIKICAgICAgICAgICAgICAgICJUaGlzIGZsYWcgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbGFyZ2UgcGFydHMgb2YgcGlwLCBhbmQgIgogICAgICAgICAgICAgICAgImFjdHVhbGx5IHVzaW5nIGl0IGludmFsaWRhdGVzIHBpcCdzIGFiaWxpdHkgdG8gbWFuYWdlIHRoZSAiCiAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIHByb2Nlc3MuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmRvd25sb2FkX2RpcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJwaXAgaW5zdGFsbCAtLWRvd25sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgIgogICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gUGlwIG5vdyBoYXMgYSBkb3dubG9hZCBjb21tYW5kIHRoYXQgIgogICAgICAgICAgICAgICAgInNob3VsZCBiZSB1c2VkIGluc3RlYWQuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCgogICAgICAgIGlmIG9wdGlvbnMuYnVpbGRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmJ1aWxkX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmJ1aWxkX2RpcikKCiAgICAgICAgb3B0aW9ucy5zcmNfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuc3JjX2RpcikKICAgICAgICBpbnN0YWxsX29wdGlvbnMgPSBvcHRpb25zLmluc3RhbGxfb3B0aW9ucyBvciBbXQogICAgICAgIGlmIG9wdGlvbnMudXNlX3VzZXJfc2l0ZToKICAgICAgICAgICAgaWYgb3B0aW9ucy5wcmVmaXhfcGF0aDoKICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBjb21iaW5lICctLXVzZXInIGFuZCAnLS1wcmVmaXgnIGFzIHRoZXkgaW1wbHkgIgogICAgICAgICAgICAgICAgICAgICJkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHBlcmZvcm0gYSAnLS11c2VyJyBpbnN0YWxsLiBVc2VyIHNpdGUtcGFja2FnZXMgIgogICAgICAgICAgICAgICAgICAgICJhcmUgbm90IHZpc2libGUgaW4gdGhpcyB2aXJ0dWFsZW52LiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS11c2VyJykKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS1wcmVmaXg9JykKCiAgICAgICAgdGVtcF90YXJnZXRfZGlyID0gTm9uZQogICAgICAgIGlmIG9wdGlvbnMudGFyZ2V0X2RpcjoKICAgICAgICAgICAgb3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgICAgICB0ZW1wX3RhcmdldF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMudGFyZ2V0X2RpcikKICAgICAgICAgICAgaWYgKG9zLnBhdGguZXhpc3RzKG9wdGlvbnMudGFyZ2V0X2RpcikgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNkaXIob3B0aW9ucy50YXJnZXRfZGlyKSk6CiAgICAgICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBwYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5LCB3aWxsIG5vdCAiCiAgICAgICAgICAgICAgICAgICAgImNvbnRpbnVlLiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS1ob21lPScgKyB0ZW1wX3RhcmdldF9kaXIpCgogICAgICAgIGdsb2JhbF9vcHRpb25zID0gb3B0aW9ucy5nbG9iYWxfb3B0aW9ucyBvciBbXQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKCiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIHNlc3Npb24pCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIGlmIG9wdGlvbnMuY2FjaGVfZGlyIGFuZCBub3QgY2hlY2tfcGF0aF9vd25lcihvcHRpb25zLmNhY2hlX2Rpcik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiVGhlIGRpcmVjdG9yeSAnJXMnIG9yIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvd25lZCAiCiAgICAgICAgICAgICAgICAgICAgImJ5IHRoZSBjdXJyZW50IHVzZXIgYW5kIGNhY2hpbmcgd2hlZWxzIGhhcyBiZWVuICIKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIGNoZWNrIHRoZSBwZXJtaXNzaW9ucyBhbmQgb3duZXIgb2YgdGhhdCAiCiAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeS4gSWYgZXhlY3V0aW5nIHBpcCB3aXRoIHN1ZG8sIHlvdSBtYXkgd2FudCAiCiAgICAgICAgICAgICAgICAgICAgInN1ZG8ncyAtSCBmbGFnLiIsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciA9IE5vbmUKCiAgICAgICAgICAgIHdpdGggQnVpbGREaXJlY3Rvcnkob3B0aW9ucy5idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlPWJ1aWxkX2RlbGV0ZSkgYXMgYnVpbGRfZGlyOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9b3B0aW9ucy5kb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgdXBncmFkZT1vcHRpb25zLnVwZ3JhZGUsCiAgICAgICAgICAgICAgICAgICAgdXBncmFkZV9zdHJhdGVneT1vcHRpb25zLnVwZ3JhZGVfc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgYXNfZWdnPW9wdGlvbnMuYXNfZWdnLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9pbnN0YWxsZWQ9b3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9yZXF1aXJlc19weXRob249b3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uLAogICAgICAgICAgICAgICAgICAgIGZvcmNlX3JlaW5zdGFsbD1vcHRpb25zLmZvcmNlX3JlaW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICB1c2VfdXNlcl9zaXRlPW9wdGlvbnMudXNlX3VzZXJfc2l0ZSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGlyPXRlbXBfdGFyZ2V0X2RpciwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgcHljb21waWxlPW9wdGlvbnMuY29tcGlsZSwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcywKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBzZWxmLnBvcHVsYXRlX3JlcXVpcmVtZW50X3NldCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsIGFyZ3MsIG9wdGlvbnMsIGZpbmRlciwgc2Vzc2lvbiwgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kb3dubG9hZF9kaXIgb3Igbm90IHdoZWVsIG9yIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAjIG9uIC1kIGRvbid0IGRvIGNvbXBsZXggdGhpbmdzIGxpa2UgYnVpbGRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVlbHMsIGFuZCBkb24ndCB0cnkgdG8gYnVpbGQgd2hlZWxzIHdoZW4gd2hlZWwgaXMKICAgICAgICAgICAgICAgICAgICAgICAgIyBub3QgaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhmaW5kZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBidWlsZCB3aGVlbHMgYmVmb3JlIGluc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIHdiID0gV2hlZWxCdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3B0aW9ucz1bXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPVtdLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIHRoZSByZXN1bHQ6IGEgZmFpbGVkIHdoZWVsIHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnN0YWxsZWQgZnJvbSB0aGUgc2Rpc3QvdmNzIHdoYXRldmVyLgogICAgICAgICAgICAgICAgICAgICAgICB3Yi5idWlsZChhdXRvYnVpbGRpbmc9VHJ1ZSkKCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuaW5zdGFsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdD1vcHRpb25zLnJvb3RfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1vcHRpb25zLnByZWZpeF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZV9saWJfbG9jYXRpb25zID0gZ2V0X2xpYl9sb2NhdGlvbl9ndWVzc2VzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcj1vcHRpb25zLnVzZV91c2VyX3NpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lPXRlbXBfdGFyZ2V0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q9b3B0aW9ucy5yb290X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9b3B0aW9ucy5wcmVmaXhfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gc29ydGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnN1Y2Nlc3NmdWxseV9pbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZXEubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uID0gZ2V0X2luc3RhbGxlZF92ZXJzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubmFtZSwgcG9zc2libGVfbGliX2xvY2F0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSArPSAnLScgKyBpbnN0YWxsZWRfdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkID0gJyAnLmpvaW4oaXRlbXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdWNjZXNzZnVsbHkgaW5zdGFsbGVkICVzJywgaW5zdGFsbGVkKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWQgPSAnICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudF9zZXQuc3VjY2Vzc2Z1bGx5X2Rvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG93bmxvYWRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub19jbGVhbiA9IFRydWUKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAjIENsZWFuIHVwCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5jbGVhbnVwX2ZpbGVzKCkKCiAgICAgICAgaWYgb3B0aW9ucy50YXJnZXRfZGlyOgogICAgICAgICAgICBlbnN1cmVfZGlyKG9wdGlvbnMudGFyZ2V0X2RpcikKCiAgICAgICAgICAgICMgQ2hlY2tpbmcgYm90aCBwdXJlbGliIGFuZCBwbGF0bGliIGRpcmVjdG9yaWVzIGZvciBpbnN0YWxsZWQKICAgICAgICAgICAgIyBwYWNrYWdlcyB0byBiZSBtb3ZlZCB0byB0YXJnZXQgZGlyZWN0b3J5CiAgICAgICAgICAgIGxpYl9kaXJfbGlzdCA9IFtdCgogICAgICAgICAgICBwdXJlbGliX2RpciA9IGRpc3R1dGlsc19zY2hlbWUoJycsIGhvbWU9dGVtcF90YXJnZXRfZGlyKVsncHVyZWxpYiddCiAgICAgICAgICAgIHBsYXRsaWJfZGlyID0gZGlzdHV0aWxzX3NjaGVtZSgnJywgaG9tZT10ZW1wX3RhcmdldF9kaXIpWydwbGF0bGliJ10KCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB1cmVsaWJfZGlyKToKICAgICAgICAgICAgICAgIGxpYl9kaXJfbGlzdC5hcHBlbmQocHVyZWxpYl9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsYXRsaWJfZGlyKSBhbmQgcGxhdGxpYl9kaXIgIT0gcHVyZWxpYl9kaXI6CiAgICAgICAgICAgICAgICBsaWJfZGlyX2xpc3QuYXBwZW5kKHBsYXRsaWJfZGlyKQoKICAgICAgICAgICAgZm9yIGxpYl9kaXIgaW4gbGliX2Rpcl9saXN0OgogICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihsaWJfZGlyKToKICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIgPSBvcy5wYXRoLmpvaW4ob3B0aW9ucy50YXJnZXRfZGlyLCBpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldF9pdGVtX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLnVwZ3JhZGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFyZ2V0IGRpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cy4gU3BlY2lmeSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdXBncmFkZSB0byBmb3JjZSByZXBsYWNlbWVudC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsodGFyZ2V0X2l0ZW1fZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYXJnZXQgZGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzIGFuZCBpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgbGluay4gUGlwIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcmVwbGFjZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtzLCBwbGVhc2UgcmVtb3ZlIGlmIHJlcGxhY2VtZW50IGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzaXJlZC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXRfaXRlbV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0YXJnZXRfaXRlbV9kaXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGFyZ2V0X2l0ZW1fZGlyKQoKICAgICAgICAgICAgICAgICAgICBzaHV0aWwubW92ZSgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGxpYl9kaXIsIGl0ZW0pLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF90YXJnZXRfZGlyKQogICAgICAgIHJldHVybiByZXF1aXJlbWVudF9zZXQKCgpkZWYgZ2V0X2xpYl9sb2NhdGlvbl9ndWVzc2VzKCphcmdzLCAqKmt3YXJncyk6CiAgICBzY2hlbWUgPSBkaXN0dXRpbHNfc2NoZW1lKCcnLCAqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gW3NjaGVtZVsncHVyZWxpYiddLCBzY2hlbWVbJ3BsYXRsaWInXV0KUEsDBBQAAAAAAAAAIQAPS8c4aSwAAGksAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9saXN0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCB3YXJuaW5ncwp0cnk6CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgemlwX2xvbmdlc3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXBfbG9uZ2VzdCBhcyB6aXBfbG9uZ2VzdAoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4Cgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKZnJvbSBwaXAuaW5kZXggaW1wb3J0IFBhY2thZ2VGaW5kZXIKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucywgZGlzdF9pc19lZGl0YWJsZSkKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC5jbWRvcHRpb25zIGltcG9ydCBtYWtlX29wdGlvbl9ncm91cCwgaW5kZXhfZ3JvdXAKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIExpc3RDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBMaXN0IGluc3RhbGxlZCBwYWNrYWdlcywgaW5jbHVkaW5nIGVkaXRhYmxlcy4KCiAgICBQYWNrYWdlcyBhcmUgbGlzdGVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBzb3J0ZWQgb3JkZXIuCiAgICAiIiIKICAgIG5hbWUgPSAnbGlzdCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSIiIgogICAgc3VtbWFyeSA9ICdMaXN0IGluc3RhbGxlZCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihMaXN0Q29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLW8nLCAnLS1vdXRkYXRlZCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0xpc3Qgb3V0ZGF0ZWQgcGFja2FnZXMnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctdScsICctLXVwdG9kYXRlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nTGlzdCB1cHRvZGF0ZSBwYWNrYWdlcycpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1lJywgJy0tZWRpdGFibGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdMaXN0IGVkaXRhYmxlIHByb2plY3RzLicpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1sJywgJy0tbG9jYWwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSgnSWYgaW4gYSB2aXJ0dWFsZW52IHRoYXQgaGFzIGdsb2JhbCBhY2Nlc3MsIGRvIG5vdCBsaXN0ICcKICAgICAgICAgICAgICAgICAgJ2dsb2JhbGx5LWluc3RhbGxlZCBwYWNrYWdlcy4nKSwKICAgICAgICApCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlcicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J09ubHkgb3V0cHV0IHBhY2thZ2VzIGluc3RhbGxlZCBpbiB1c2VyLXNpdGUuJykKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oIkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1mb3JtYXQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgZGVzdD0nbGlzdF9mb3JtYXQnLAogICAgICAgICAgICBjaG9pY2VzPSgnbGVnYWN5JywgJ2NvbHVtbnMnLCAnZnJlZXplJywgJ2pzb24nKSwKICAgICAgICAgICAgaGVscD0iU2VsZWN0IHRoZSBvdXRwdXQgZm9ybWF0IGFtb25nOiBsZWdhY3kgKGRlZmF1bHQpLCBjb2x1bW5zLCAiCiAgICAgICAgICAgICAgICAgImZyZWV6ZSBvciBqc29uLiIsCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1ub3QtcmVxdWlyZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZXN0PSdub3RfcmVxdWlyZWQnLAogICAgICAgICAgICBoZWxwPSJMaXN0IHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBkZXBlbmRlbmNpZXMgb2YgIgogICAgICAgICAgICAgICAgICJpbnN0YWxsZWQgcGFja2FnZXMuIiwKICAgICAgICApCgogICAgICAgIGluZGV4X29wdHMgPSBtYWtlX29wdGlvbl9ncm91cChpbmRleF9ncm91cCwgc2VsZi5wYXJzZXIpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBfYnVpbGRfcGFja2FnZV9maW5kZXIoc2VsZiwgb3B0aW9ucywgaW5kZXhfdXJscywgc2Vzc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGEgcGFja2FnZSBmaW5kZXIgYXBwcm9wcmlhdGUgdG8gdGhpcyBsaXN0IGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFBhY2thZ2VGaW5kZXIoCiAgICAgICAgICAgIGZpbmRfbGlua3M9b3B0aW9ucy5maW5kX2xpbmtzLAogICAgICAgICAgICBpbmRleF91cmxzPWluZGV4X3VybHMsCiAgICAgICAgICAgIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1vcHRpb25zLnByZSwKICAgICAgICAgICAgdHJ1c3RlZF9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgICAgIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcz1vcHRpb25zLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcywKICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgaXMgTm9uZToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJUaGUgZGVmYXVsdCBmb3JtYXQgd2lsbCBzd2l0Y2ggdG8gY29sdW1ucyBpbiB0aGUgZnV0dXJlLiAiCiAgICAgICAgICAgICAgICAiWW91IGNhbiB1c2UgLS1mb3JtYXQ9KGxlZ2FjeXxjb2x1bW5zKSAob3IgZGVmaW5lIGEgIgogICAgICAgICAgICAgICAgImZvcm1hdD0obGVnYWN5fGNvbHVtbnMpIGluIHlvdXIgcGlwLmNvbmYgdW5kZXIgdGhlIFtsaXN0XSAiCiAgICAgICAgICAgICAgICAic2VjdGlvbikgdG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkIGFuZCBvcHRpb25zLnVwdG9kYXRlOgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAiT3B0aW9ucyAtLW91dGRhdGVkIGFuZCAtLXVwdG9kYXRlIGNhbm5vdCBiZSBjb21iaW5lZC4iKQoKICAgICAgICBwYWNrYWdlcyA9IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucygKICAgICAgICAgICAgbG9jYWxfb25seT1vcHRpb25zLmxvY2FsLAogICAgICAgICAgICB1c2VyX29ubHk9b3B0aW9ucy51c2VyLAogICAgICAgICAgICBlZGl0YWJsZXNfb25seT1vcHRpb25zLmVkaXRhYmxlLAogICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZDoKICAgICAgICAgICAgcGFja2FnZXMgPSBzZWxmLmdldF9vdXRkYXRlZChwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICBlbGlmIG9wdGlvbnMudXB0b2RhdGU6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5nZXRfdXB0b2RhdGUocGFja2FnZXMsIG9wdGlvbnMpCgogICAgICAgIGlmIG9wdGlvbnMubm90X3JlcXVpcmVkOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYuZ2V0X25vdF9yZXF1aXJlZChwYWNrYWdlcywgb3B0aW9ucykKCiAgICAgICAgc2VsZi5vdXRwdXRfcGFja2FnZV9saXN0aW5nKHBhY2thZ2VzLCBvcHRpb25zKQoKICAgIGRlZiBnZXRfb3V0ZGF0ZWQoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRpc3QgZm9yIGRpc3QgaW4gc2VsZi5pdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgaWYgZGlzdC5sYXRlc3RfdmVyc2lvbiA+IGRpc3QucGFyc2VkX3ZlcnNpb24KICAgICAgICBdCgogICAgZGVmIGdldF91cHRvZGF0ZShzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgZGlzdCBmb3IgZGlzdCBpbiBzZWxmLml0ZXJfcGFja2FnZXNfbGF0ZXN0X2luZm9zKHBhY2thZ2VzLCBvcHRpb25zKQogICAgICAgICAgICBpZiBkaXN0LmxhdGVzdF92ZXJzaW9uID09IGRpc3QucGFyc2VkX3ZlcnNpb24KICAgICAgICBdCgogICAgZGVmIGdldF9ub3RfcmVxdWlyZWQoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIGRlcF9rZXlzID0gc2V0KCkKICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgZGVwX2tleXMudXBkYXRlKHJlcXVpcmVtZW50LmtleSBmb3IgcmVxdWlyZW1lbnQgaW4gZGlzdC5yZXF1aXJlcygpKQogICAgICAgIHJldHVybiBzZXQocGtnIGZvciBwa2cgaW4gcGFja2FnZXMgaWYgcGtnLmtleSBub3QgaW4gZGVwX2tleXMpCgogICAgZGVmIGl0ZXJfcGFja2FnZXNfbGF0ZXN0X2luZm9zKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIGRlcGVuZGVuY3lfbGlua3MgPSBbXQogICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKAogICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpLAogICAgICAgICAgICAgICAgKQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgaW5kZXhfdXJscywgc2Vzc2lvbikKICAgICAgICAgICAgZmluZGVyLmFkZF9kZXBlbmRlbmN5X2xpbmtzKGRlcGVuZGVuY3lfbGlua3MpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgICAgIHR5cCA9ICd1bmtub3duJwogICAgICAgICAgICAgICAgYWxsX2NhbmRpZGF0ZXMgPSBmaW5kZXIuZmluZF9hbGxfY2FuZGlkYXRlcyhkaXN0LmtleSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLnByZToKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgICAgIGFsbF9jYW5kaWRhdGVzID0gW2NhbmRpZGF0ZSBmb3IgY2FuZGlkYXRlIGluIGFsbF9jYW5kaWRhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNhbmRpZGF0ZS52ZXJzaW9uLmlzX3ByZXJlbGVhc2VdCgogICAgICAgICAgICAgICAgaWYgbm90IGFsbF9jYW5kaWRhdGVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IG1heChhbGxfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1maW5kZXIuX2NhbmRpZGF0ZV9zb3J0X2tleSkKICAgICAgICAgICAgICAgIHJlbW90ZV92ZXJzaW9uID0gYmVzdF9jYW5kaWRhdGUudmVyc2lvbgogICAgICAgICAgICAgICAgaWYgYmVzdF9jYW5kaWRhdGUubG9jYXRpb24uaXNfd2hlZWw6CiAgICAgICAgICAgICAgICAgICAgdHlwID0gJ3doZWVsJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0eXAgPSAnc2Rpc3QnCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgZGlydHkgYnV0IG1ha2VzIHRoZSByZXN0IG9mIHRoZSBjb2RlIG11Y2ggY2xlYW5lcgogICAgICAgICAgICAgICAgZGlzdC5sYXRlc3RfdmVyc2lvbiA9IHJlbW90ZV92ZXJzaW9uCiAgICAgICAgICAgICAgICBkaXN0LmxhdGVzdF9maWxldHlwZSA9IHR5cAogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgIGRlZiBvdXRwdXRfbGVnYWN5KHNlbGYsIGRpc3QpOgogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCk6CiAgICAgICAgICAgIHJldHVybiAnJXMgKCVzLCAlcyknICUgKAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICAgICBkaXN0LnZlcnNpb24sCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICclcyAoJXMpJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgIGRlZiBvdXRwdXRfbGVnYWN5X2xhdGVzdChzZWxmLCBkaXN0KToKICAgICAgICByZXR1cm4gJyVzIC0gTGF0ZXN0OiAlcyBbJXNdJyAlICgKICAgICAgICAgICAgc2VsZi5vdXRwdXRfbGVnYWN5KGRpc3QpLAogICAgICAgICAgICBkaXN0LmxhdGVzdF92ZXJzaW9uLAogICAgICAgICAgICBkaXN0LmxhdGVzdF9maWxldHlwZSwKICAgICAgICApCgogICAgZGVmIG91dHB1dF9wYWNrYWdlX2xpc3Rpbmcoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHBhY2thZ2VzID0gc29ydGVkKAogICAgICAgICAgICBwYWNrYWdlcywKICAgICAgICAgICAga2V5PWxhbWJkYSBkaXN0OiBkaXN0LnByb2plY3RfbmFtZS5sb3dlcigpLAogICAgICAgICkKICAgICAgICBpZiBvcHRpb25zLmxpc3RfZm9ybWF0ID09ICdjb2x1bW5zJyBhbmQgcGFja2FnZXM6CiAgICAgICAgICAgIGRhdGEsIGhlYWRlciA9IGZvcm1hdF9mb3JfY29sdW1ucyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgc2VsZi5vdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMoZGF0YSwgaGVhZGVyKQogICAgICAgIGVsaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCA9PSAnZnJlZXplJzoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiJXM9PSVzIiwgZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKICAgICAgICBlbGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgPT0gJ2pzb24nOgogICAgICAgICAgICBsb2dnZXIuaW5mbyhmb3JtYXRfZm9yX2pzb24ocGFja2FnZXMsIG9wdGlvbnMpKQogICAgICAgIGVsc2U6ICAjIGxlZ2FjeQogICAgICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5vdXRwdXRfbGVnYWN5X2xhdGVzdChkaXN0KSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5vdXRwdXRfbGVnYWN5KGRpc3QpKQoKICAgIGRlZiBvdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMoc2VsZiwgZGF0YSwgaGVhZGVyKToKICAgICAgICAjIGluc2VydCB0aGUgaGVhZGVyIGZpcnN0OiB3ZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgY29sdW1uIG5hbWVzCiAgICAgICAgaWYgbGVuKGRhdGEpID4gMDoKICAgICAgICAgICAgZGF0YS5pbnNlcnQoMCwgaGVhZGVyKQoKICAgICAgICBwa2dfc3RyaW5ncywgc2l6ZXMgPSB0YWJ1bGF0ZShkYXRhKQoKICAgICAgICAjIENyZWF0ZSBhbmQgYWRkIGEgc2VwYXJhdG9yLgogICAgICAgIGlmIGxlbihkYXRhKSA+IDA6CiAgICAgICAgICAgIHBrZ19zdHJpbmdzLmluc2VydCgxLCAiICIuam9pbihtYXAobGFtYmRhIHg6ICctJyAqIHgsIHNpemVzKSkpCgogICAgICAgIGZvciB2YWwgaW4gcGtnX3N0cmluZ3M6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKHZhbCkKCgpkZWYgdGFidWxhdGUodmFscyk6CiAgICAjIEZyb20gcGZtb29yZSBvbiBHaXRIdWI6CiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzY1MSNpc3N1ZWNvbW1lbnQtMjE2OTMyNTY0CiAgICBhc3NlcnQgbGVuKHZhbHMpID4gMAoKICAgIHNpemVzID0gWzBdICogbWF4KGxlbih4KSBmb3IgeCBpbiB2YWxzKQogICAgZm9yIHJvdyBpbiB2YWxzOgogICAgICAgIHNpemVzID0gW21heChzLCBsZW4oc3RyKGMpKSkgZm9yIHMsIGMgaW4gemlwX2xvbmdlc3Qoc2l6ZXMsIHJvdyldCgogICAgcmVzdWx0ID0gW10KICAgIGZvciByb3cgaW4gdmFsczoKICAgICAgICBkaXNwbGF5ID0gIiAiLmpvaW4oW3N0cihjKS5sanVzdChzKSBpZiBjIGlzIG5vdCBOb25lIGVsc2UgJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzLCBjIGluIHppcF9sb25nZXN0KHNpemVzLCByb3cpXSkKICAgICAgICByZXN1bHQuYXBwZW5kKGRpc3BsYXkpCgogICAgcmV0dXJuIHJlc3VsdCwgc2l6ZXMKCgpkZWYgZm9ybWF0X2Zvcl9jb2x1bW5zKHBrZ3MsIG9wdGlvbnMpOgogICAgIiIiCiAgICBDb252ZXJ0IHRoZSBwYWNrYWdlIGRhdGEgaW50byBzb21ldGhpbmcgdXNhYmxlCiAgICBieSBvdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMuCiAgICAiIiIKICAgIHJ1bm5pbmdfb3V0ZGF0ZWQgPSBvcHRpb25zLm91dGRhdGVkCiAgICAjIEFkanVzdCB0aGUgaGVhZGVyIGZvciB0aGUgYHBpcCBsaXN0IC0tb3V0ZGF0ZWRgIGNhc2UuCiAgICBpZiBydW5uaW5nX291dGRhdGVkOgogICAgICAgIGhlYWRlciA9IFsiUGFja2FnZSIsICJWZXJzaW9uIiwgIkxhdGVzdCIsICJUeXBlIl0KICAgIGVsc2U6CiAgICAgICAgaGVhZGVyID0gWyJQYWNrYWdlIiwgIlZlcnNpb24iXQoKICAgIGRhdGEgPSBbXQogICAgaWYgYW55KGRpc3RfaXNfZWRpdGFibGUoeCkgZm9yIHggaW4gcGtncyk6CiAgICAgICAgaGVhZGVyLmFwcGVuZCgiTG9jYXRpb24iKQoKICAgIGZvciBwcm9qIGluIHBrZ3M6CiAgICAgICAgIyBpZiB3ZSdyZSB3b3JraW5nIG9uIHRoZSAnb3V0ZGF0ZWQnIGxpc3QsIHNlcGFyYXRlIG91dCB0aGUKICAgICAgICAjIGxhdGVzdF92ZXJzaW9uIGFuZCB0eXBlCiAgICAgICAgcm93ID0gW3Byb2oucHJvamVjdF9uYW1lLCBwcm9qLnZlcnNpb25dCgogICAgICAgIGlmIHJ1bm5pbmdfb3V0ZGF0ZWQ6CiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sYXRlc3RfdmVyc2lvbikKICAgICAgICAgICAgcm93LmFwcGVuZChwcm9qLmxhdGVzdF9maWxldHlwZSkKCiAgICAgICAgaWYgZGlzdF9pc19lZGl0YWJsZShwcm9qKToKICAgICAgICAgICAgcm93LmFwcGVuZChwcm9qLmxvY2F0aW9uKQoKICAgICAgICBkYXRhLmFwcGVuZChyb3cpCgogICAgcmV0dXJuIGRhdGEsIGhlYWRlcgoKCmRlZiBmb3JtYXRfZm9yX2pzb24ocGFja2FnZXMsIG9wdGlvbnMpOgogICAgZGF0YSA9IFtdCiAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICBpbmZvID0gewogICAgICAgICAgICAnbmFtZSc6IGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAndmVyc2lvbic6IHNpeC50ZXh0X3R5cGUoZGlzdC52ZXJzaW9uKSwKICAgICAgICB9CiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZDoKICAgICAgICAgICAgaW5mb1snbGF0ZXN0X3ZlcnNpb24nXSA9IHNpeC50ZXh0X3R5cGUoZGlzdC5sYXRlc3RfdmVyc2lvbikKICAgICAgICAgICAgaW5mb1snbGF0ZXN0X2ZpbGV0eXBlJ10gPSBkaXN0LmxhdGVzdF9maWxldHlwZQogICAgICAgIGRhdGEuYXBwZW5kKGluZm8pCiAgICByZXR1cm4ganNvbi5kdW1wcyhkYXRhKQpQSwMEFAAAAAAAAAAhAK5ChNyWEQAAlhEAACYAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3NlYXJjaC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCmltcG9ydCB0ZXh0d3JhcAoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQsIFNVQ0NFU1MKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBPcmRlcmVkRGljdApmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgUGlwWG1scnBjVHJhbnNwb3J0CmZyb20gcGlwLm1vZGVscyBpbXBvcnQgUHlQSQpmcm9tIHBpcC51dGlscyBpbXBvcnQgZ2V0X3Rlcm1pbmFsX3NpemUKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCBOT19NQVRDSEVTX0ZPVU5ECmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgeG1scnBjX2NsaWVudAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFNlYXJjaENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJTZWFyY2ggZm9yIFB5UEkgcGFja2FnZXMgd2hvc2UgbmFtZSBvciBzdW1tYXJ5IGNvbnRhaW5zIDxxdWVyeT4uIiIiCiAgICBuYW1lID0gJ3NlYXJjaCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cXVlcnk+IiIiCiAgICBzdW1tYXJ5ID0gJ1NlYXJjaCBQeVBJIGZvciBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihTZWFyY2hDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctaScsICctLWluZGV4JywKICAgICAgICAgICAgZGVzdD0naW5kZXgnLAogICAgICAgICAgICBtZXRhdmFyPSdVUkwnLAogICAgICAgICAgICBkZWZhdWx0PVB5UEkucHlwaV91cmwsCiAgICAgICAgICAgIGhlbHA9J0Jhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IChkZWZhdWx0ICVkZWZhdWx0KScpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgKHNlYXJjaCBxdWVyeSkuJykKICAgICAgICBxdWVyeSA9IGFyZ3MKICAgICAgICBweXBpX2hpdHMgPSBzZWxmLnNlYXJjaChxdWVyeSwgb3B0aW9ucykKICAgICAgICBoaXRzID0gdHJhbnNmb3JtX2hpdHMocHlwaV9oaXRzKQoKICAgICAgICB0ZXJtaW5hbF93aWR0aCA9IE5vbmUKICAgICAgICBpZiBzeXMuc3Rkb3V0LmlzYXR0eSgpOgogICAgICAgICAgICB0ZXJtaW5hbF93aWR0aCA9IGdldF90ZXJtaW5hbF9zaXplKClbMF0KCiAgICAgICAgcHJpbnRfcmVzdWx0cyhoaXRzLCB0ZXJtaW5hbF93aWR0aD10ZXJtaW5hbF93aWR0aCkKICAgICAgICBpZiBweXBpX2hpdHM6CiAgICAgICAgICAgIHJldHVybiBTVUNDRVNTCiAgICAgICAgcmV0dXJuIE5PX01BVENIRVNfRk9VTkQKCiAgICBkZWYgc2VhcmNoKHNlbGYsIHF1ZXJ5LCBvcHRpb25zKToKICAgICAgICBpbmRleF91cmwgPSBvcHRpb25zLmluZGV4CiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIHRyYW5zcG9ydCA9IFBpcFhtbHJwY1RyYW5zcG9ydChpbmRleF91cmwsIHNlc3Npb24pCiAgICAgICAgICAgIHB5cGkgPSB4bWxycGNfY2xpZW50LlNlcnZlclByb3h5KGluZGV4X3VybCwgdHJhbnNwb3J0KQogICAgICAgICAgICBoaXRzID0gcHlwaS5zZWFyY2goeyduYW1lJzogcXVlcnksICdzdW1tYXJ5JzogcXVlcnl9LCAnb3InKQogICAgICAgICAgICByZXR1cm4gaGl0cwoKCmRlZiB0cmFuc2Zvcm1faGl0cyhoaXRzKToKICAgICIiIgogICAgVGhlIGxpc3QgZnJvbSBweXBpIGlzIHJlYWxseSBhIGxpc3Qgb2YgdmVyc2lvbnMuIFdlIHdhbnQgYSBsaXN0IG9mCiAgICBwYWNrYWdlcyB3aXRoIHRoZSBsaXN0IG9mIHZlcnNpb25zIHN0b3JlZCBpbmxpbmUuIFRoaXMgY29udmVydHMgdGhlCiAgICBsaXN0IGZyb20gcHlwaSBpbnRvIG9uZSB3ZSBjYW4gdXNlLgogICAgIiIiCiAgICBwYWNrYWdlcyA9IE9yZGVyZWREaWN0KCkKICAgIGZvciBoaXQgaW4gaGl0czoKICAgICAgICBuYW1lID0gaGl0WyduYW1lJ10KICAgICAgICBzdW1tYXJ5ID0gaGl0WydzdW1tYXJ5J10KICAgICAgICB2ZXJzaW9uID0gaGl0Wyd2ZXJzaW9uJ10KCiAgICAgICAgaWYgbmFtZSBub3QgaW4gcGFja2FnZXMua2V5cygpOgogICAgICAgICAgICBwYWNrYWdlc1tuYW1lXSA9IHsKICAgICAgICAgICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAgICAgICAgICdzdW1tYXJ5Jzogc3VtbWFyeSwKICAgICAgICAgICAgICAgICd2ZXJzaW9ucyc6IFt2ZXJzaW9uXSwKICAgICAgICAgICAgfQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhY2thZ2VzW25hbWVdWyd2ZXJzaW9ucyddLmFwcGVuZCh2ZXJzaW9uKQoKICAgICAgICAgICAgIyBpZiB0aGlzIGlzIHRoZSBoaWdoZXN0IHZlcnNpb24sIHJlcGxhY2Ugc3VtbWFyeSBhbmQgc2NvcmUKICAgICAgICAgICAgaWYgdmVyc2lvbiA9PSBoaWdoZXN0X3ZlcnNpb24ocGFja2FnZXNbbmFtZV1bJ3ZlcnNpb25zJ10pOgogICAgICAgICAgICAgICAgcGFja2FnZXNbbmFtZV1bJ3N1bW1hcnknXSA9IHN1bW1hcnkKCiAgICByZXR1cm4gbGlzdChwYWNrYWdlcy52YWx1ZXMoKSkKCgpkZWYgcHJpbnRfcmVzdWx0cyhoaXRzLCBuYW1lX2NvbHVtbl93aWR0aD1Ob25lLCB0ZXJtaW5hbF93aWR0aD1Ob25lKToKICAgIGlmIG5vdCBoaXRzOgogICAgICAgIHJldHVybgogICAgaWYgbmFtZV9jb2x1bW5fd2lkdGggaXMgTm9uZToKICAgICAgICBuYW1lX2NvbHVtbl93aWR0aCA9IG1heChbCiAgICAgICAgICAgIGxlbihoaXRbJ25hbWUnXSkgKyBsZW4oaGl0LmdldCgndmVyc2lvbnMnLCBbJy0nXSlbLTFdKQogICAgICAgICAgICBmb3IgaGl0IGluIGhpdHMKICAgICAgICBdKSArIDQKCiAgICBpbnN0YWxsZWRfcGFja2FnZXMgPSBbcC5wcm9qZWN0X25hbWUgZm9yIHAgaW4gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldF0KICAgIGZvciBoaXQgaW4gaGl0czoKICAgICAgICBuYW1lID0gaGl0WyduYW1lJ10KICAgICAgICBzdW1tYXJ5ID0gaGl0WydzdW1tYXJ5J10gb3IgJycKICAgICAgICB2ZXJzaW9uID0gaGl0LmdldCgndmVyc2lvbnMnLCBbJy0nXSlbLTFdCiAgICAgICAgaWYgdGVybWluYWxfd2lkdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRhcmdldF93aWR0aCA9IHRlcm1pbmFsX3dpZHRoIC0gbmFtZV9jb2x1bW5fd2lkdGggLSA1CiAgICAgICAgICAgIGlmIHRhcmdldF93aWR0aCA+IDEwOgogICAgICAgICAgICAgICAgIyB3cmFwIGFuZCBpbmRlbnQgc3VtbWFyeSB0byBmaXQgdGVybWluYWwKICAgICAgICAgICAgICAgIHN1bW1hcnkgPSB0ZXh0d3JhcC53cmFwKHN1bW1hcnksIHRhcmdldF93aWR0aCkKICAgICAgICAgICAgICAgIHN1bW1hcnkgPSAoJ1xuJyArICcgJyAqIChuYW1lX2NvbHVtbl93aWR0aCArIDMpKS5qb2luKHN1bW1hcnkpCgogICAgICAgIGxpbmUgPSAnJS0qcyAtICVzJyAlIChuYW1lX2NvbHVtbl93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzICglcyknICUgKG5hbWUsIHZlcnNpb24pLCBzdW1tYXJ5KQogICAgICAgIHRyeToKICAgICAgICAgICAgbG9nZ2VyLmluZm8obGluZSkKICAgICAgICAgICAgaWYgbmFtZSBpbiBpbnN0YWxsZWRfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKG5hbWUpCiAgICAgICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgICAgICBsYXRlc3QgPSBoaWdoZXN0X3ZlcnNpb24oaGl0Wyd2ZXJzaW9ucyddKQogICAgICAgICAgICAgICAgICAgIGlmIGRpc3QudmVyc2lvbiA9PSBsYXRlc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdJTlNUQUxMRUQ6ICVzIChsYXRlc3QpJywgZGlzdC52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdJTlNUQUxMRUQ6ICVzJywgZGlzdC52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnTEFURVNUOiAgICAlcycsIGxhdGVzdCkKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBwYXNzCgoKZGVmIGhpZ2hlc3RfdmVyc2lvbih2ZXJzaW9ucyk6CiAgICByZXR1cm4gbWF4KHZlcnNpb25zLCBrZXk9cGFyc2VfdmVyc2lvbikKUEsDBBQAAAAAAAAAIQAMUx8kAxcAAAMXAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zaG93LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCBTVUNDRVNTLCBFUlJPUgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFNob3dDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBpbnN0YWxsZWQgcGFja2FnZXMuIiIiCiAgICBuYW1lID0gJ3Nob3cnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHBhY2thZ2U+IC4uLiIiIgogICAgc3VtbWFyeSA9ICdTaG93IGluZm9ybWF0aW9uIGFib3V0IGluc3RhbGxlZCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihTaG93Q29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWYnLCAnLS1maWxlcycsCiAgICAgICAgICAgIGRlc3Q9J2ZpbGVzJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nU2hvdyB0aGUgZnVsbCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgZWFjaCBwYWNrYWdlLicpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRVJST1I6IFBsZWFzZSBwcm92aWRlIGEgcGFja2FnZSBuYW1lIG9yIG5hbWVzLicpCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIHF1ZXJ5ID0gYXJncwoKICAgICAgICByZXN1bHRzID0gc2VhcmNoX3BhY2thZ2VzX2luZm8ocXVlcnkpCiAgICAgICAgaWYgbm90IHByaW50X3Jlc3VsdHMoCiAgICAgICAgICAgICAgICByZXN1bHRzLCBsaXN0X2ZpbGVzPW9wdGlvbnMuZmlsZXMsIHZlcmJvc2U9b3B0aW9ucy52ZXJib3NlKToKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgcmV0dXJuIFNVQ0NFU1MKCgpkZWYgc2VhcmNoX3BhY2thZ2VzX2luZm8ocXVlcnkpOgogICAgIiIiCiAgICBHYXRoZXIgZGV0YWlscyBmcm9tIGluc3RhbGxlZCBkaXN0cmlidXRpb25zLiBQcmludCBkaXN0cmlidXRpb24gbmFtZSwKICAgIHZlcnNpb24sIGxvY2F0aW9uLCBhbmQgaW5zdGFsbGVkIGZpbGVzLiBJbnN0YWxsZWQgZmlsZXMgcmVxdWlyZXMgYQogICAgcGlwIGdlbmVyYXRlZCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcgaW4gdGhlIGRpc3RyaWJ1dGlvbnMgJy5lZ2ctaW5mbycKICAgIGRpcmVjdG9yeS4KICAgICIiIgogICAgaW5zdGFsbGVkID0ge30KICAgIGZvciBwIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQ6CiAgICAgICAgaW5zdGFsbGVkW2Nhbm9uaWNhbGl6ZV9uYW1lKHAucHJvamVjdF9uYW1lKV0gPSBwCgogICAgcXVlcnlfbmFtZXMgPSBbY2Fub25pY2FsaXplX25hbWUobmFtZSkgZm9yIG5hbWUgaW4gcXVlcnldCgogICAgZm9yIGRpc3QgaW4gW2luc3RhbGxlZFtwa2ddIGZvciBwa2cgaW4gcXVlcnlfbmFtZXMgaWYgcGtnIGluIGluc3RhbGxlZF06CiAgICAgICAgcGFja2FnZSA9IHsKICAgICAgICAgICAgJ25hbWUnOiBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBkaXN0LnZlcnNpb24sCiAgICAgICAgICAgICdsb2NhdGlvbic6IGRpc3QubG9jYXRpb24sCiAgICAgICAgICAgICdyZXF1aXJlcyc6IFtkZXAucHJvamVjdF9uYW1lIGZvciBkZXAgaW4gZGlzdC5yZXF1aXJlcygpXSwKICAgICAgICB9CiAgICAgICAgZmlsZV9saXN0ID0gTm9uZQogICAgICAgIG1ldGFkYXRhID0gTm9uZQogICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgcGtnX3Jlc291cmNlcy5EaXN0SW5mb0Rpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgICMgUkVDT1JEcyBzaG91bGQgYmUgcGFydCBvZiAuZGlzdC1pbmZvIG1ldGFkYXRhcwogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUkVDT1JEJyk6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdSRUNPUkQnKQogICAgICAgICAgICAgICAgcGF0aHMgPSBbbC5zcGxpdCgnLCcpWzBdIGZvciBsIGluIGxpbmVzXQogICAgICAgICAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHApIGZvciBwIGluIHBhdGhzXQogICAgICAgICAgICAgICAgZmlsZV9saXN0ID0gW29zLnBhdGgucmVscGF0aChwLCBkaXN0LmxvY2F0aW9uKSBmb3IgcCBpbiBwYXRoc10KCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdNRVRBREFUQScpOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnTUVUQURBVEEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlIHVzZSBwaXAncyBsb2cgZm9yIC5lZ2ctaW5mbydzCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdpbnN0YWxsZWQtZmlsZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBwYXRocyA9IGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICAgICAgICAgIHBhdGhzID0gW29zLnBhdGguam9pbihkaXN0LmVnZ19pbmZvLCBwKSBmb3IgcCBpbiBwYXRoc10KICAgICAgICAgICAgICAgIGZpbGVfbGlzdCA9IFtvcy5wYXRoLnJlbHBhdGgocCwgZGlzdC5sb2NhdGlvbikgZm9yIHAgaW4gcGF0aHNdCgogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gZGlzdC5nZXRfbWV0YWRhdGEoJ1BLRy1JTkZPJykKCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKToKICAgICAgICAgICAgZW50cnlfcG9pbnRzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2VudHJ5X3BvaW50cy50eHQnKQogICAgICAgICAgICBwYWNrYWdlWydlbnRyeV9wb2ludHMnXSA9IGVudHJ5X3BvaW50cwoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnSU5TVEFMTEVSJyk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdJTlNUQUxMRVInKToKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICAgICBwYWNrYWdlWydpbnN0YWxsZXInXSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgQHRvZG86IFNob3VsZCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBoYXZlIGEKICAgICAgICAjIGBnZXRfcGtnX2luZm9gIG1ldGhvZD8KICAgICAgICBmZWVkX3BhcnNlciA9IEZlZWRQYXJzZXIoKQogICAgICAgIGZlZWRfcGFyc2VyLmZlZWQobWV0YWRhdGEpCiAgICAgICAgcGtnX2luZm9fZGljdCA9IGZlZWRfcGFyc2VyLmNsb3NlKCkKICAgICAgICBmb3Iga2V5IGluICgnbWV0YWRhdGEtdmVyc2lvbicsICdzdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICAnaG9tZS1wYWdlJywgJ2F1dGhvcicsICdhdXRob3ItZW1haWwnLCAnbGljZW5zZScpOgogICAgICAgICAgICBwYWNrYWdlW2tleV0gPSBwa2dfaW5mb19kaWN0LmdldChrZXkpCgogICAgICAgICMgSXQgbG9va3MgbGlrZSBGZWVkUGFyc2VyIGNhbm5vdCBkZWFsIHdpdGggcmVwZWF0ZWQgaGVhZGVycwogICAgICAgIGNsYXNzaWZpZXJzID0gW10KICAgICAgICBmb3IgbGluZSBpbiBtZXRhZGF0YS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnQ2xhc3NpZmllcjogJyk6CiAgICAgICAgICAgICAgICBjbGFzc2lmaWVycy5hcHBlbmQobGluZVtsZW4oJ0NsYXNzaWZpZXI6ICcpOl0pCiAgICAgICAgcGFja2FnZVsnY2xhc3NpZmllcnMnXSA9IGNsYXNzaWZpZXJzCgogICAgICAgIGlmIGZpbGVfbGlzdDoKICAgICAgICAgICAgcGFja2FnZVsnZmlsZXMnXSA9IHNvcnRlZChmaWxlX2xpc3QpCiAgICAgICAgeWllbGQgcGFja2FnZQoKCmRlZiBwcmludF9yZXN1bHRzKGRpc3RyaWJ1dGlvbnMsIGxpc3RfZmlsZXM9RmFsc2UsIHZlcmJvc2U9RmFsc2UpOgogICAgIiIiCiAgICBQcmludCB0aGUgaW5mb3JtYXRpb25zIGZyb20gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMgZm91bmQuCiAgICAiIiIKICAgIHJlc3VsdHNfcHJpbnRlZCA9IEZhbHNlCiAgICBmb3IgaSwgZGlzdCBpbiBlbnVtZXJhdGUoZGlzdHJpYnV0aW9ucyk6CiAgICAgICAgcmVzdWx0c19wcmludGVkID0gVHJ1ZQogICAgICAgIGlmIGkgPiAwOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiLS0tIikKICAgICAgICBsb2dnZXIuaW5mbygiTmFtZTogJXMiLCBkaXN0LmdldCgnbmFtZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiVmVyc2lvbjogJXMiLCBkaXN0LmdldCgndmVyc2lvbicsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiU3VtbWFyeTogJXMiLCBkaXN0LmdldCgnc3VtbWFyeScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiSG9tZS1wYWdlOiAlcyIsIGRpc3QuZ2V0KCdob21lLXBhZ2UnLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkF1dGhvcjogJXMiLCBkaXN0LmdldCgnYXV0aG9yJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJBdXRob3ItZW1haWw6ICVzIiwgZGlzdC5nZXQoJ2F1dGhvci1lbWFpbCcsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiTGljZW5zZTogJXMiLCBkaXN0LmdldCgnbGljZW5zZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiTG9jYXRpb246ICVzIiwgZGlzdC5nZXQoJ2xvY2F0aW9uJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJSZXF1aXJlczogJXMiLCAnLCAnLmpvaW4oZGlzdC5nZXQoJ3JlcXVpcmVzJywgW10pKSkKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiTWV0YWRhdGEtVmVyc2lvbjogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0LmdldCgnbWV0YWRhdGEtdmVyc2lvbicsICcnKSkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkluc3RhbGxlcjogJXMiLCBkaXN0LmdldCgnaW5zdGFsbGVyJywgJycpKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiQ2xhc3NpZmllcnM6IikKICAgICAgICAgICAgZm9yIGNsYXNzaWZpZXIgaW4gZGlzdC5nZXQoJ2NsYXNzaWZpZXJzJywgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiAgJXMiLCBjbGFzc2lmaWVyKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiRW50cnktcG9pbnRzOiIpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBkaXN0LmdldCgnZW50cnlfcG9pbnRzJywgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiAgJXMiLCBlbnRyeS5zdHJpcCgpKQogICAgICAgIGlmIGxpc3RfZmlsZXM6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGaWxlczoiKQogICAgICAgICAgICBmb3IgbGluZSBpbiBkaXN0LmdldCgnZmlsZXMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGxpbmUuc3RyaXAoKSkKICAgICAgICAgICAgaWYgImZpbGVzIiBub3QgaW4gZGlzdDoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDYW5ub3QgbG9jYXRlIGluc3RhbGxlZC1maWxlcy50eHQiKQogICAgcmV0dXJuIHJlc3VsdHNfcHJpbnRlZApQSwMEFAAAAAAAAAAhAKuJGT9ECwAARAsAACkAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcGlwCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlCmZyb20gcGlwLnJlcSBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50LCBSZXF1aXJlbWVudFNldCwgcGFyc2VfcmVxdWlyZW1lbnRzCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yCgoKY2xhc3MgVW5pbnN0YWxsQ29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgVW5pbnN0YWxsIHBhY2thZ2VzLgoKICAgIHBpcCBpcyBhYmxlIHRvIHVuaW5zdGFsbCBtb3N0IGluc3RhbGxlZCBwYWNrYWdlcy4gS25vd24gZXhjZXB0aW9ucyBhcmU6CgogICAgLSBQdXJlIGRpc3R1dGlscyBwYWNrYWdlcyBpbnN0YWxsZWQgd2l0aCBgYHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsYGAsIHdoaWNoCiAgICAgIGxlYXZlIGJlaGluZCBubyBtZXRhZGF0YSB0byBkZXRlcm1pbmUgd2hhdCBmaWxlcyB3ZXJlIGluc3RhbGxlZC4KICAgIC0gU2NyaXB0IHdyYXBwZXJzIGluc3RhbGxlZCBieSBgYHB5dGhvbiBzZXR1cC5weSBkZXZlbG9wYGAuCiAgICAiIiIKICAgIG5hbWUgPSAndW5pbnN0YWxsJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxwYWNrYWdlPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gLi4uIiIiCiAgICBzdW1tYXJ5ID0gJ1VuaW5zdGFsbCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihVbmluc3RhbGxDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICAgICAgaGVscD0nVW5pbnN0YWxsIGFsbCB0aGUgcGFja2FnZXMgbGlzdGVkIGluIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgJwogICAgICAgICAgICAgICAgICdmaWxlLiAgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJywKICAgICAgICApCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXknLCAnLS15ZXMnLAogICAgICAgICAgICBkZXN0PSd5ZXMnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJEb24ndCBhc2sgZm9yIGNvbmZpcm1hdGlvbiBvZiB1bmluc3RhbGwgZGVsZXRpb25zLiIpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmb3JtYXRfY29udHJvbCA9IHBpcC5pbmRleC5Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSkKICAgICAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICBidWlsZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIHNyY19kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgZm9yIHJlcSBpbiBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQogICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnWW91IG11c3QgZ2l2ZSBhdCBsZWFzdCBvbmUgcmVxdWlyZW1lbnQgdG8gJShuYW1lKXMgKHNlZSAnCiAgICAgICAgICAgICAgICAgICAgJyJwaXAgaGVscCAlKG5hbWUpcyIpJyAlIGRpY3QobmFtZT1zZWxmLm5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC51bmluc3RhbGwoYXV0b19jb25maXJtPW9wdGlvbnMueWVzKQpQSwMEFAAAAAAAAAAhAJc3c+YxHgAAMR4AACUAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3doZWVsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBSZXF1aXJlbWVudENvbW1hbmQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yLCBQcmV2aW91c0J1aWxkRGlyRXJyb3IKZnJvbSBwaXAucmVxIGltcG9ydCBSZXF1aXJlbWVudFNldApmcm9tIHBpcC51dGlscyBpbXBvcnQgaW1wb3J0X29yX3JhaXNlCmZyb20gcGlwLnV0aWxzLmJ1aWxkIGltcG9ydCBCdWlsZERpcmVjdG9yeQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlLCBXaGVlbEJ1aWxkZXIKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBXaGVlbENvbW1hbmQoUmVxdWlyZW1lbnRDb21tYW5kKToKICAgICIiIgogICAgQnVpbGQgV2hlZWwgYXJjaGl2ZXMgZm9yIHlvdXIgcmVxdWlyZW1lbnRzIGFuZCBkZXBlbmRlbmNpZXMuCgogICAgV2hlZWwgaXMgYSBidWlsdC1wYWNrYWdlIGZvcm1hdCwgYW5kIG9mZmVycyB0aGUgYWR2YW50YWdlIG9mIG5vdAogICAgcmVjb21waWxpbmcgeW91ciBzb2Z0d2FyZSBkdXJpbmcgZXZlcnkgaW5zdGFsbC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZQogICAgd2hlZWwgZG9jczogaHR0cHM6Ly93aGVlbC5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvCgogICAgUmVxdWlyZW1lbnRzOiBzZXR1cHRvb2xzPj0wLjgsIGFuZCB3aGVlbC4KCiAgICAncGlwIHdoZWVsJyB1c2VzIHRoZSBiZGlzdF93aGVlbCBzZXR1cHRvb2xzIGV4dGVuc2lvbiBmcm9tIHRoZSB3aGVlbAogICAgcGFja2FnZSB0byBidWlsZCBpbmRpdmlkdWFsIHdoZWVscy4KCiAgICAiIiIKCiAgICBuYW1lID0gJ3doZWVsJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxyZXF1aXJlbWVudCBzcGVjaWZpZXI+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPHZjcyBwcm9qZWN0IHVybD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDxsb2NhbCBwcm9qZWN0IHBhdGg+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gPGFyY2hpdmUgdXJsL3BhdGg+IC4uLiIiIgoKICAgIHN1bW1hcnkgPSAnQnVpbGQgd2hlZWxzIGZyb20geW91ciByZXF1aXJlbWVudHMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoV2hlZWxDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctdycsICctLXdoZWVsLWRpcicsCiAgICAgICAgICAgIGRlc3Q9J3doZWVsX2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9b3MuY3VyZGlyLAogICAgICAgICAgICBoZWxwPSgiQnVpbGQgd2hlZWxzIGludG8gPGRpcj4sIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSAiCiAgICAgICAgICAgICAgICAgICJjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiIpLAogICAgICAgICkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMudXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX3VzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMub25seV9iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1idWlsZC1vcHRpb24nLAogICAgICAgICAgICBkZXN0PSdidWlsZF9vcHRpb25zJywKICAgICAgICAgICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgaGVscD0iRXh0cmEgYXJndW1lbnRzIHRvIGJlIHN1cHBsaWVkIHRvICdzZXR1cC5weSBiZGlzdF93aGVlbCcuIikKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuY29uc3RyYWludHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZWRpdGFibGUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnNyYygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2RlcHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuYnVpbGRfZGlyKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWdsb2JhbC1vcHRpb24nLAogICAgICAgICAgICBkZXN0PSdnbG9iYWxfb3B0aW9ucycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICAgICAgICAgIGhlbHA9IkV4dHJhIGdsb2JhbCBvcHRpb25zIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzZXR1cC5weSAiCiAgICAgICAgICAgICJjYWxsIGJlZm9yZSB0aGUgJ2JkaXN0X3doZWVsJyBjb21tYW5kLiIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXByZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9KCJJbmNsdWRlIHByZS1yZWxlYXNlIGFuZCBkZXZlbG9wbWVudCB2ZXJzaW9ucy4gQnkgZGVmYXVsdCwgIgogICAgICAgICAgICAgICAgICAicGlwIG9ubHkgZmluZHMgc3RhYmxlIHZlcnNpb25zLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2NsZWFuKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzKCkpCgogICAgICAgIGluZGV4X29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKAogICAgICAgICAgICBjbWRvcHRpb25zLmluZGV4X2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBjaGVja19yZXF1aXJlZF9wYWNrYWdlcyhzZWxmKToKICAgICAgICBpbXBvcnRfb3JfcmFpc2UoCiAgICAgICAgICAgICd3aGVlbC5iZGlzdF93aGVlbCcsCiAgICAgICAgICAgIENvbW1hbmRFcnJvciwKICAgICAgICAgICAgIidwaXAgd2hlZWwnIHJlcXVpcmVzIHRoZSAnd2hlZWwnIHBhY2thZ2UuIFRvIGZpeCB0aGlzLCBydW46ICIKICAgICAgICAgICAgInBpcCBpbnN0YWxsIHdoZWVsIgogICAgICAgICkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gaW1wb3J0X29yX3JhaXNlKAogICAgICAgICAgICAncGtnX3Jlc291cmNlcycsCiAgICAgICAgICAgIENvbW1hbmRFcnJvciwKICAgICAgICAgICAgIidwaXAgd2hlZWwnIHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44IGZvciBkaXN0LWluZm8gc3VwcG9ydC4iCiAgICAgICAgICAgICIgVG8gZml4IHRoaXMsIHJ1bjogcGlwIGluc3RhbGwgLS11cGdyYWRlIHNldHVwdG9vbHMiCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKHBrZ19yZXNvdXJjZXMsICdEaXN0SW5mb0Rpc3RyaWJ1dGlvbicpOgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAiJ3BpcCB3aGVlbCcgcmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjggZm9yIGRpc3QtaW5mbyAiCiAgICAgICAgICAgICAgICAic3VwcG9ydC4gVG8gZml4IHRoaXMsIHJ1bjogcGlwIGluc3RhbGwgLS11cGdyYWRlICIKICAgICAgICAgICAgICAgICJzZXR1cHRvb2xzIgogICAgICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBzZWxmLmNoZWNrX3JlcXVpcmVkX3BhY2thZ2VzKCkKICAgICAgICBjbWRvcHRpb25zLnJlc29sdmVfd2hlZWxfbm9fdXNlX2JpbmFyeShvcHRpb25zKQogICAgICAgIGNtZG9wdGlvbnMuY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucykKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0IG5vICIKICAgICAgICAgICAgICAgICJsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2FsbF9leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWFsbC1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd191bnZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaW5kZXhfdXJscyA9IFtvcHRpb25zLmluZGV4X3VybF0gKyBvcHRpb25zLmV4dHJhX2luZGV4X3VybHMKICAgICAgICBpZiBvcHRpb25zLm5vX2luZGV4OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGluZGV4ZXM6ICVzJywgJywnLmpvaW4oaW5kZXhfdXJscykpCiAgICAgICAgICAgIGluZGV4X3VybHMgPSBbXQoKICAgICAgICBpZiBvcHRpb25zLmJ1aWxkX2RpcjoKICAgICAgICAgICAgb3B0aW9ucy5idWlsZF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5idWlsZF9kaXIpCgogICAgICAgIG9wdGlvbnMuc3JjX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnNyY19kaXIpCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmaW5kZXIgPSBzZWxmLl9idWlsZF9wYWNrYWdlX2ZpbmRlcihvcHRpb25zLCBzZXNzaW9uKQogICAgICAgICAgICBidWlsZF9kZWxldGUgPSAobm90IChvcHRpb25zLm5vX2NsZWFuIG9yIG9wdGlvbnMuYnVpbGRfZGlyKSkKICAgICAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBvcHRpb25zLmZvcm1hdF9jb250cm9sKQogICAgICAgICAgICB3aXRoIEJ1aWxkRGlyZWN0b3J5KG9wdGlvbnMuYnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZT1idWlsZF9kZWxldGUpIGFzIGJ1aWxkX2RpcjoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCA9IFJlcXVpcmVtZW50U2V0KAogICAgICAgICAgICAgICAgICAgIGJ1aWxkX2Rpcj1idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgc3JjX2Rpcj1vcHRpb25zLnNyY19kaXIsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1vcHRpb25zLmlnbm9yZV9kZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2luc3RhbGxlZD1UcnVlLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9yZXF1aXJlc19weXRob249b3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfZG93bmxvYWRfZGlyPW9wdGlvbnMud2hlZWxfZGlyLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPW9wdGlvbnMucmVxdWlyZV9oYXNoZXMKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBzZWxmLnBvcHVsYXRlX3JlcXVpcmVtZW50X3NldCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsIGFyZ3MsIG9wdGlvbnMsIGZpbmRlciwgc2Vzc2lvbiwgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIHdoZWVscwogICAgICAgICAgICAgICAgICAgIHdiID0gV2hlZWxCdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3B0aW9ucz1vcHRpb25zLmJ1aWxkX29wdGlvbnMgb3IgW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPW9wdGlvbnMuZ2xvYmFsX29wdGlvbnMgb3IgW10sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCB3Yi5idWlsZCgpOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJ1aWxkIG9uZSBvciBtb3JlIHdoZWVscyIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IFByZXZpb3VzQnVpbGREaXJFcnJvcjoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vX2NsZWFuID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLm5vX2NsZWFuOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuY2xlYW51cF9maWxlcygpClBLAwQUAAAAAAAAACEAmSepcUASAABAEgAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L19faW5pdF9fLnB5IiIiU3R1ZmYgdGhhdCBkaWZmZXJzIGluIGRpZmZlcmVudCBQeXRob24gdmVyc2lvbnMgYW5kIHBsYXRmb3JtCmRpc3RyaWJ1dGlvbnMuIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCnRyeToKICAgIGZyb20gbG9nZ2luZy5jb25maWcgaW1wb3J0IGRpY3RDb25maWcgYXMgbG9nZ2luZ19kaWN0Q29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlwLmNvbXBhdC5kaWN0Y29uZmlnIGltcG9ydCBkaWN0Q29uZmlnIGFzIGxvZ2dpbmdfZGljdENvbmZpZwoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuX3ZlbmRvci5vcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCnRyeToKICAgIGltcG9ydCBpcGFkZHJlc3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGlwYWRkcmVzcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGltcG9ydCBpcGFkZHIgYXMgaXBhZGRyZXNzCiAgICAgICAgaXBhZGRyZXNzLmlwX2FkZHJlc3MgPSBpcGFkZHJlc3MuSVBBZGRyZXNzCiAgICAgICAgaXBhZGRyZXNzLmlwX25ldHdvcmsgPSBpcGFkZHJlc3MuSVBOZXR3b3JrCgoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwoKICAgIGRlZiBnZXRfc3RkbGliKCk6CiAgICAgICAgcGF0aHMgPSBbCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcGF0aCgic3RkbGliIiksCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcGF0aCgicGxhdHN0ZGxpYiIpLAogICAgICAgIF0KICAgICAgICByZXR1cm4gc2V0KGZpbHRlcihib29sLCBwYXRocykpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKCiAgICBkZWYgZ2V0X3N0ZGxpYigpOgogICAgICAgIHBhdGhzID0gWwogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPVRydWUpLAogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPVRydWUsIHBsYXRfc3BlY2lmaWM9VHJ1ZSksCiAgICAgICAgXQogICAgICAgIHJldHVybiBzZXQoZmlsdGVyKGJvb2wsIHBhdGhzKSkKCgpfX2FsbF9fID0gWwogICAgImxvZ2dpbmdfZGljdENvbmZpZyIsICJpcGFkZHJlc3MiLCAidXNlc19weWNhY2hlIiwgImNvbnNvbGVfdG9fc3RyIiwKICAgICJuYXRpdmVfc3RyIiwgImdldF9wYXRoX3VpZCIsICJzdGRsaWJfcGtncyIsICJXSU5ET1dTIiwgInNhbWVmaWxlIiwKICAgICJPcmRlcmVkRGljdCIsCl0KCgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA0KToKICAgIHVzZXNfcHljYWNoZSA9IFRydWUKICAgIGZyb20gaW1wb3J0bGliLnV0aWwgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmVsc2U6CiAgICBpbXBvcnQgaW1wCiAgICB1c2VzX3B5Y2FjaGUgPSBoYXNhdHRyKGltcCwgJ2NhY2hlX2Zyb21fc291cmNlJykKICAgIGlmIHVzZXNfcHljYWNoZToKICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSA9IGltcC5jYWNoZV9mcm9tX3NvdXJjZQogICAgZWxzZToKICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSA9IE5vbmUKCgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCk6CiAgICBkZWYgY29uc29sZV90b19zdHIocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoc3lzLl9fc3Rkb3V0X18uZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1dGZfOCcpCgogICAgZGVmIG5hdGl2ZV9zdHIocywgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndXRmLTgnLCAncmVwbGFjZScgaWYgcmVwbGFjZSBlbHNlICdzdHJpY3QnKQogICAgICAgIHJldHVybiBzCgplbHNlOgogICAgZGVmIGNvbnNvbGVfdG9fc3RyKHMpOgogICAgICAgIHJldHVybiBzCgogICAgZGVmIG5hdGl2ZV9zdHIocywgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIyBSZXBsYWNlIGlzIGlnbm9yZWQgLS0gdW5pY29kZSB0byBVVEYtOCBjYW4ndCBmYWlsCiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gcwoKCmRlZiB0b3RhbF9zZWNvbmRzKHRkKToKICAgIGlmIGhhc2F0dHIodGQsICJ0b3RhbF9zZWNvbmRzIik6CiAgICAgICAgcmV0dXJuIHRkLnRvdGFsX3NlY29uZHMoKQogICAgZWxzZToKICAgICAgICB2YWwgPSB0ZC5taWNyb3NlY29uZHMgKyAodGQuc2Vjb25kcyArIHRkLmRheXMgKiAyNCAqIDM2MDApICogMTAgKiogNgogICAgICAgIHJldHVybiB2YWwgLyAxMCAqKiA2CgoKZGVmIGdldF9wYXRoX3VpZChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIHBhdGgncyB1aWQuCgogICAgRG9lcyBub3QgZm9sbG93IHN5bWxpbmtzOgogICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9wdWxsLzkzNSNkaXNjdXNzaW9uX3I1MzA3MDAzCgogICAgUGxhY2VkIHRoaXMgZnVuY3Rpb24gaW4gY29tcGF0IGR1ZSB0byBkaWZmZXJlbmNlcyBvbiBBSVggYW5kCiAgICBKeXRob24sIHRoYXQgc2hvdWxkIGV2ZW50dWFsbHkgZ28gYXdheS4KCiAgICA6cmFpc2VzIE9TRXJyb3I6IFdoZW4gcGF0aCBpcyBhIHN5bWxpbmsgb3IgY2FuJ3QgYmUgcmVhZC4KICAgICIiIgogICAgaWYgaGFzYXR0cihvcywgJ09fTk9GT0xMT1cnKToKICAgICAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19SRE9OTFkgfCBvcy5PX05PRk9MTE9XKQogICAgICAgIGZpbGVfdWlkID0gb3MuZnN0YXQoZmQpLnN0X3VpZAogICAgICAgIG9zLmNsb3NlKGZkKQogICAgZWxzZTogICMgQUlYIGFuZCBKeXRob24KICAgICAgICAjIFdBUk5JTkc6IHRpbWUgb2YgY2hlY2sgdnVsbmVyYWJpbGl0eSwgYnV0IGJlc3Qgd2UgY2FuIGRvIHcvbyBOT0ZPTExPVwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgIyBvbGRlciB2ZXJzaW9ucyBvZiBKeXRob24gZG9uJ3QgaGF2ZSBgb3MuZnN0YXRgCiAgICAgICAgICAgIGZpbGVfdWlkID0gb3Muc3RhdChwYXRoKS5zdF91aWQKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHJhaXNlIE9TRXJyb3IgZm9yIHBhcml0eSB3aXRoIG9zLk9fTk9GT0xMT1cgYWJvdmUKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBhIHN5bWxpbms7IFdpbGwgbm90IHJldHVybiB1aWQgZm9yIHN5bWxpbmtzIiAlIHBhdGgKICAgICAgICAgICAgKQogICAgcmV0dXJuIGZpbGVfdWlkCgoKZGVmIGV4cGFuZHVzZXIocGF0aCk6CiAgICAiIiIKICAgIEV4cGFuZCB+IGFuZCB+dXNlciBjb25zdHJ1Y3Rpb25zLgoKICAgIEluY2x1ZGVzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NzY4CiAgICAiIiIKICAgIGV4cGFuZGVkID0gb3MucGF0aC5leHBhbmR1c2VyKHBhdGgpCiAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJ34vJykgYW5kIGV4cGFuZGVkLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAgICAgZXhwYW5kZWQgPSBleHBhbmRlZFsxOl0KICAgIHJldHVybiBleHBhbmRlZAoKCiMgcGFja2FnZXMgaW4gdGhlIHN0ZGxpYiB0aGF0IG1heSBoYXZlIGluc3RhbGxhdGlvbiBtZXRhZGF0YSwgYnV0IHNob3VsZCBub3QgYmUKIyBjb25zaWRlcmVkICdpbnN0YWxsZWQnLiAgdGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGJlIGRldGVybWluZWQgYmFzZWQgb24KIyBkaXN0LmxvY2F0aW9uIChweTI3OmBzeXNjb25maWcuZ2V0X3BhdGhzKClbJ3N0ZGxpYiddYCwKIyBweTI2OnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ0xJQkRFU1QnKSksIGJ1dCBmZWFyIHBsYXRmb3JtIHZhcmlhdGlvbiBtYXkKIyBtYWtlIHRoaXMgaW5lZmZlY3RpdmUsIHNvIGhhcmQtY29kaW5nCnN0ZGxpYl9wa2dzID0gKCdweXRob24nLCAnd3NnaXJlZicpCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgogICAgc3RkbGliX3BrZ3MgKz0gKCdhcmdwYXJzZScsKQoKCiMgd2luZG93cyBkZXRlY3Rpb24sIGNvdmVycyBjcHl0aG9uIGFuZCBpcm9ucHl0aG9uCldJTkRPV1MgPSAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpIG9yCiAgICAgICAgICAgKHN5cy5wbGF0Zm9ybSA9PSAnY2xpJyBhbmQgb3MubmFtZSA9PSAnbnQnKSkKCgpkZWYgc2FtZWZpbGUoZmlsZTEsIGZpbGUyKToKICAgICIiIlByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgZm9yIG9zLnBhdGguc2FtZWZpbGUgb24gV2luZG93cy9QeXRob24yIiIiCiAgICBpZiBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpOgogICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKGZpbGUxLCBmaWxlMikKICAgIGVsc2U6CiAgICAgICAgcGF0aDEgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChmaWxlMSkpCiAgICAgICAgcGF0aDIgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChmaWxlMikpCiAgICAgICAgcmV0dXJuIHBhdGgxID09IHBhdGgyClBLAwQUAAAAAAAAACEAgqKllzhaAAA4WgAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L2RpY3Rjb25maWcucHkjIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQeXRob24gbG9nZ2luZy5jb25maWcuZGljdGNvbmZpZyBtb2R1bGUsCiMgcmVwcm9kdWNlZCB3aXRoIHBlcm1pc3Npb24uIEl0IGlzIHByb3ZpZGVkIGhlcmUgZm9yIGJhY2t3YXJkcwojIGNvbXBhdGliaWxpdHkgZm9yIFB5dGhvbiB2ZXJzaW9ucyBwcmlvciB0byAyLjcuCiMKIyBDb3B5cmlnaHQgMjAwOS0yMDEwIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAojIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKIyBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFZpbmF5IFNhamlwCiMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCiMgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KIyBWSU5BWSBTQUpJUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCiMgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCiMgVklOQVkgU0FKSVAgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCiMgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCiMgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKCiMgZmxha2U4OiBub3FhCgpJREVOVElGSUVSID0gcmUuY29tcGlsZSgnXlthLXpfXVthLXowLTlfXSokJywgcmUuSSkKCgpkZWYgdmFsaWRfaWRlbnQocyk6CiAgICBtID0gSURFTlRJRklFUi5tYXRjaChzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXI6ICVyJyAlIHMpCiAgICByZXR1cm4gVHJ1ZQoKIwojIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBsb2dnaW5nIG9ubHkgaW4gcmVjZW50IHZlcnNpb25zIG9mIFB5dGhvbgojCnRyeToKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgX2NoZWNrTGV2ZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZGVmIF9jaGVja0xldmVsKGxldmVsKToKICAgICAgICBpZiBpc2luc3RhbmNlKGxldmVsLCBpbnQpOgogICAgICAgICAgICBydiA9IGxldmVsCiAgICAgICAgZWxpZiBzdHIobGV2ZWwpID09IGxldmVsOgogICAgICAgICAgICBpZiBsZXZlbCBub3QgaW4gbG9nZ2luZy5fbGV2ZWxOYW1lczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gbGV2ZWw6ICVyJyAlIGxldmVsKQogICAgICAgICAgICBydiA9IGxvZ2dpbmcuX2xldmVsTmFtZXNbbGV2ZWxdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdMZXZlbCBub3QgYW4gaW50ZWdlciBvciBhICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZCBzdHJpbmc6ICVyJyAlIGxldmVsKQogICAgICAgIHJldHVybiBydgoKIyBUaGUgQ29udmVydGluZ1hYWCBjbGFzc2VzIGFyZSB3cmFwcGVycyBhcm91bmQgc3RhbmRhcmQgUHl0aG9uIGNvbnRhaW5lcnMsCiMgYW5kIHRoZXkgc2VydmUgdG8gY29udmVydCBhbnkgc3VpdGFibGUgdmFsdWVzIGluIHRoZSBjb250YWluZXIuIFRoZQojIGNvbnZlcnNpb24gY29udmVydHMgYmFzZSBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyB0byB0aGVpciB3cmFwcGVkCiMgZXF1aXZhbGVudHMsIHdoZXJlYXMgc3RyaW5ncyB3aGljaCBtYXRjaCBhIGNvbnZlcnNpb24gZm9ybWF0IGFyZSBjb252ZXJ0ZWQKIyBhcHByb3ByaWF0ZWx5LgojCiMgRWFjaCB3cmFwcGVyIHNob3VsZCBoYXZlIGEgY29uZmlndXJhdG9yIGF0dHJpYnV0ZSBob2xkaW5nIHRoZSBhY3R1YWwKIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgoKCmNsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QpOgogICAgIiIiQSBjb252ZXJ0aW5nIGRpY3Rpb25hcnkgd3JhcHBlci4iIiIKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWx1ZSA9IGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgIyBJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICB2YWx1ZSA9IGRpY3QuZ2V0KHNlbGYsIGtleSwgZGVmYXVsdCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQ29udmVydGluZ0xpc3QobGlzdCk6CiAgICAiIiJBIGNvbnZlcnRpbmcgbGlzdCB3cmFwcGVyLiIiIgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsdWUgPSBsaXN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBpZHg9LTEpOgogICAgICAgIHZhbHVlID0gbGlzdC5wb3Aoc2VsZiwgaWR4KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIENvbnZlcnRpbmdUdXBsZSh0dXBsZSk6CiAgICAiIiJBIGNvbnZlcnRpbmcgdHVwbGUgd3JhcHBlci4iIiIKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbHVlID0gdHVwbGUuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIEJhc2VDb25maWd1cmF0b3Iob2JqZWN0KToKICAgICIiIgogICAgVGhlIGNvbmZpZ3VyYXRvciBiYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgc29tZSB1c2VmdWwgZGVmYXVsdHMuCiAgICAiIiIKCiAgICBDT05WRVJUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXig/UDxwcmVmaXg+W2Etel0rKTovLyg/UDxzdWZmaXg+LiopJCcpCgogICAgV09SRF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15ccyooXHcrKVxzKicpCiAgICBET1RfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXC5ccyooXHcrKVxzKicpCiAgICBJTkRFWF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cW1xzKihcdyspXHMqXF1ccyonKQogICAgRElHSVRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXGQrJCcpCgogICAgdmFsdWVfY29udmVydGVycyA9IHsKICAgICAgICAnZXh0JyA6ICdleHRfY29udmVydCcsCiAgICAgICAgJ2NmZycgOiAnY2ZnX2NvbnZlcnQnLAogICAgfQoKICAgICMgV2UgbWlnaHQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgb25lLCBlLmcuIGltcG9ydGxpYgogICAgaW1wb3J0ZXIgPSBfX2ltcG9ydF9fCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgc2VsZi5jb25maWcgPSBDb252ZXJ0aW5nRGljdChjb25maWcpCiAgICAgICAgc2VsZi5jb25maWcuY29uZmlndXJhdG9yID0gc2VsZgoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHMpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgc3RyaW5ncyB0byBvYmplY3RzIHVzaW5nIHN0YW5kYXJkIGltcG9ydCBhbmQgYXR0cmlidXRlCiAgICAgICAgc3ludGF4LgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzLnNwbGl0KCcuJykKICAgICAgICB1c2VkID0gbmFtZS5wb3AoMCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvdW5kID0gc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICBmb3IgZnJhZyBpbiBuYW1lOgogICAgICAgICAgICAgICAgdXNlZCArPSAnLicgKyBmcmFnCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgZSwgdGIgPSBzeXMuZXhjX2luZm8oKVsxOl0KICAgICAgICAgICAgdiA9IFZhbHVlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlICVyOiAlcycgJSAocywgZSkpCiAgICAgICAgICAgIHYuX19jYXVzZV9fLCB2Ll9fdHJhY2ViYWNrX18gPSBlLCB0YgogICAgICAgICAgICByYWlzZSB2CgogICAgZGVmIGV4dF9jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGV4dDovLyBwcm90b2NvbC4iIiIKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKHZhbHVlKQoKICAgIGRlZiBjZmdfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBjZmc6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgcmVzdCA9IHZhbHVlCiAgICAgICAgbSA9IHNlbGYuV09SRF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlciIgJSB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgZCA9IHNlbGYuY29uZmlnW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICMgcHJpbnQgZCwgcmVzdAogICAgICAgICAgICB3aGlsZSByZXN0OgogICAgICAgICAgICAgICAgbSA9IHNlbGYuRE9UX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgZCA9IGRbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYuSU5ERVhfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IG0uZ3JvdXBzKClbMF0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuRElHSVRfUEFUVEVSTi5tYXRjaChpZHgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnQoaWR4KSAgIyB0cnkgYXMgbnVtYmVyIGZpcnN0IChtb3N0IGxpa2VseSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHZhbHVlLCByZXN0KSkKICAgICAgICAjIHJlc3Qgc2hvdWxkIGJlIGVtcHR5CiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCB2YWx1ZXMgdG8gYW4gYXBwcm9wcmlhdGUgdHlwZS4gZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgYXJlCiAgICAgICAgcmVwbGFjZWQgYnkgdGhlaXIgY29udmVydGluZyBhbHRlcm5hdGl2ZXMuIFN0cmluZ3MgYXJlIGNoZWNrZWQgdG8KICAgICAgICBzZWUgaWYgdGhleSBoYXZlIGEgY29udmVyc2lvbiBmb3JtYXQgYW5kIGFyZSBjb252ZXJ0ZWQgaWYgdGhleSBkby4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0RpY3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nRGljdCh2YWx1ZSkKICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdMaXN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0xpc3QodmFsdWUpCiAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nVHVwbGUpIGFuZFwKICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ1R1cGxlKHZhbHVlKQogICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKTogICMgc3RyIGZvciBweTNrCiAgICAgICAgICAgIG0gPSBzZWxmLkNPTlZFUlRfUEFUVEVSTi5tYXRjaCh2YWx1ZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgICAgICAgICBwcmVmaXggPSBkWydwcmVmaXgnXQogICAgICAgICAgICAgICAgY29udmVydGVyID0gc2VsZi52YWx1ZV9jb252ZXJ0ZXJzLmdldChwcmVmaXgsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBjb252ZXJ0ZXI6CiAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gZFsnc3VmZml4J10KICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnZlcnRlcikKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcihzdWZmaXgpCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYW4gb2JqZWN0IHdpdGggYSB1c2VyLXN1cHBsaWVkIGZhY3RvcnkuIiIiCiAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKICAgICAgICBrd2FyZ3MgPSBkaWN0KChrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKSkKICAgICAgICByZXN1bHQgPSBjKCoqa3dhcmdzKQogICAgICAgIGlmIHByb3BzOgogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcHJvcHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuYW1lLCB2YWx1ZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFzX3R1cGxlKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGxpc3RzIHRvIHR1cGxlcy4iIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgdmFsdWUgPSB0dXBsZSh2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBEaWN0Q29uZmlndXJhdG9yKEJhc2VDb25maWd1cmF0b3IpOgogICAgIiIiCiAgICBDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdG8gZGVzY3JpYmUgdGhlCiAgICBjb25maWd1cmF0aW9uLgogICAgIiIiCgogICAgZGVmIGNvbmZpZ3VyZShzZWxmKToKICAgICAgICAiIiJEbyB0aGUgY29uZmlndXJhdGlvbi4iIiIKCiAgICAgICAgY29uZmlnID0gc2VsZi5jb25maWcKICAgICAgICBpZiAndmVyc2lvbicgbm90IGluIGNvbmZpZzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGljdGlvbmFyeSBkb2Vzbid0IHNwZWNpZnkgYSB2ZXJzaW9uIikKICAgICAgICBpZiBjb25maWdbJ3ZlcnNpb24nXSAhPSAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbnN1cHBvcnRlZCB2ZXJzaW9uOiAlcyIgJSBjb25maWdbJ3ZlcnNpb24nXSkKICAgICAgICBpbmNyZW1lbnRhbCA9IGNvbmZpZy5wb3AoJ2luY3JlbWVudGFsJywgRmFsc2UpCiAgICAgICAgRU1QVFlfRElDVCA9IHt9CiAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgaW5jcmVtZW50YWw6CiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50YWwgaGFuZGxlciBjb25maWcgb25seSBpZiBoYW5kbGVyIG5hbWUKICAgICAgICAgICAgICAgICMgdGllcyBpbiB0byBsb2dnaW5nLl9oYW5kbGVycyAoUHl0aG9uIDIuNykKICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgyLCA3KToKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBoYW5kbGVyczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gbG9nZ2luZy5faGFuZGxlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdObyBoYW5kbGVyIGZvdW5kIHdpdGggJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSAlcicgICUgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5faGFuZGxlcnNbbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX2NvbmZpZyA9IGhhbmRsZXJzW25hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBoYW5kbGVyX2NvbmZpZy5nZXQoJ2xldmVsJywgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zZXRMZXZlbChfY2hlY2tMZXZlbChsZXZlbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgaGFuZGxlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSwgVHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICByb290ID0gY29uZmlnLmdldCgncm9vdCcsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiByb290OgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcm9vdChyb290LCBUcnVlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRpc2FibGVfZXhpc3RpbmcgPSBjb25maWcucG9wKCdkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMnLCBUcnVlKQoKICAgICAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLmNsZWFyKCkKICAgICAgICAgICAgICAgIGRlbCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQoKICAgICAgICAgICAgICAgICMgRG8gZm9ybWF0dGVycyBmaXJzdCAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZQogICAgICAgICAgICAgICAgZm9ybWF0dGVycyA9IGNvbmZpZy5nZXQoJ2Zvcm1hdHRlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZm9ybWF0dGVyczoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0gPSBzZWxmLmNvbmZpZ3VyZV9mb3JtYXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBmaWx0ZXJzIC0gdGhleSBkb24ndCByZWZlciB0byBhbnl0aGluZyBlbHNlLCBlaXRoZXIKICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjb25maWcuZ2V0KCdmaWx0ZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbHRlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZmlsdGVyKGZpbHRlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQoKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gaGFuZGxlcnMgLSB0aGV5IHJlZmVyIHRvIGZvcm1hdHRlcnMgYW5kIGZpbHRlcnMKICAgICAgICAgICAgICAgICMgQXMgaGFuZGxlcnMgY2FuIHJlZmVyIHRvIG90aGVyIGhhbmRsZXJzLCBzb3J0IHRoZSBrZXlzCiAgICAgICAgICAgICAgICAjIHRvIGFsbG93IGEgZGV0ZXJtaW5pc3RpYyBvcmRlciBvZiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChoYW5kbGVycyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5jb25maWd1cmVfaGFuZGxlcihoYW5kbGVyc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBsb2dnZXJzIC0gdGhleSByZWZlciB0byBoYW5kbGVycyBhbmQgZmlsdGVycwoKICAgICAgICAgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBleGlzdGluZyBsb2dnZXJzLAogICAgICAgICAgICAgICAgIyBzaW5jZSBvdGhlciB0aHJlYWRzIG1heSBoYXZlIHBvaW50ZXJzIHRvIHRoZW0uCiAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGlzIHNldCB0byBjb250YWluIGFsbCBleGlzdGluZyBsb2dnZXJzLAogICAgICAgICAgICAgICAgIyBhbmQgYXMgd2UgZ28gdGhyb3VnaCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2UKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFueSB3aGljaCBhcmUgY29uZmlndXJlZC4gQXQgdGhlIGVuZCwKICAgICAgICAgICAgICAgICMgd2hhdCdzIGxlZnQgaW4gZXhpc3RpbmcgaXMgdGhlIHNldCBvZiBsb2dnZXJzCiAgICAgICAgICAgICAgICAjIHdoaWNoIHdlcmUgaW4gdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gYnV0CiAgICAgICAgICAgICAgICAjIHdoaWNoIGFyZSBub3QgaW4gdGhlIG5ldyBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgcm9vdCA9IGxvZ2dpbmcucm9vdAogICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBsaXN0KHJvb3QubWFuYWdlci5sb2dnZXJEaWN0KQogICAgICAgICAgICAgICAgIyBUaGUgbGlzdCBuZWVkcyB0byBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgICAgICAgICMgYXZvaWQgZGlzYWJsaW5nIGNoaWxkIGxvZ2dlcnMgb2YgZXhwbGljaXRseQogICAgICAgICAgICAgICAgIyBuYW1lZCBsb2dnZXJzLiBXaXRoIGEgc29ydGVkIGxpc3QgaXQgaXMgZWFzaWVyCiAgICAgICAgICAgICAgICAjIHRvIGZpbmQgdGhlIGNoaWxkIGxvZ2dlcnMuCiAgICAgICAgICAgICAgICBleGlzdGluZy5zb3J0KCkKICAgICAgICAgICAgICAgICMgV2UnbGwga2VlcCB0aGUgbGlzdCBvZiBleGlzdGluZyBsb2dnZXJzCiAgICAgICAgICAgICAgICAjIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzIGhlcmUuLi4KICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMgPSBbXQogICAgICAgICAgICAgICAgIyBub3cgc2V0IHVwIHRoZSBuZXcgb25lcy4uLgogICAgICAgICAgICAgICAgbG9nZ2VycyA9IGNvbmZpZy5nZXQoJ2xvZ2dlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbG9nZ2VyczoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIGV4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgICAgICBpID0gZXhpc3RpbmcuaW5kZXgobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZWQgPSBuYW1lICsgIi4iCiAgICAgICAgICAgICAgICAgICAgICAgIHBmbGVuID0gbGVuKHByZWZpeGVkKQogICAgICAgICAgICAgICAgICAgICAgICBudW1fZXhpc3RpbmcgPSBsZW4oZXhpc3RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMSAgIyBsb29rIGF0IHRoZSBlbnRyeSBhZnRlciBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbnVtX2V4aXN0aW5nKSBhbmRcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGlzdGluZ1tpXVs6cGZsZW5dID09IHByZWZpeGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMuYXBwZW5kKGV4aXN0aW5nW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlbW92ZShuYW1lKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfbG9nZ2VyKG5hbWUsIGxvZ2dlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBsb2dnZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQoKICAgICAgICAgICAgICAgICMgRGlzYWJsZSBhbnkgb2xkIGxvZ2dlcnMuIFRoZXJlJ3Mgbm8gcG9pbnQgZGVsZXRpbmcKICAgICAgICAgICAgICAgICMgdGhlbSBhcyBvdGhlciB0aHJlYWRzIG1heSBjb250aW51ZSB0byBob2xkIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICMgYW5kIGJ5IGRpc2FibGluZyB0aGVtLCB5b3Ugc3RvcCB0aGVtIGRvaW5nIGFueSBsb2dnaW5nLgogICAgICAgICAgICAgICAgIyBIb3dldmVyLCBkb24ndCBkaXNhYmxlIGNoaWxkcmVuIG9mIG5hbWVkIGxvZ2dlcnMsIGFzIHRoYXQncwogICAgICAgICAgICAgICAgIyBwcm9iYWJseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgICAgICAgICBmb3IgbG9nIGluIGV4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlciA9IHJvb3QubWFuYWdlci5sb2dnZXJEaWN0W2xvZ10KICAgICAgICAgICAgICAgICAgICBpZiBsb2cgaW4gY2hpbGRfbG9nZ2VyczoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxldmVsID0gbG9nZ2luZy5OT1RTRVQKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZXJzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnByb3BhZ2F0ZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbGlmIGRpc2FibGVfZXhpc3Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IFRydWUKCiAgICAgICAgICAgICAgICAjIEFuZCBmaW5hbGx5LCBkbyB0aGUgcm9vdCBsb2dnZXIKICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nZ2VyOiAlcycgJSBlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKCiAgICBkZWYgY29uZmlndXJlX2Zvcm1hdHRlcihzZWxmLCBjb25maWcpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIGZvcm1hdHRlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKICAgICAgICAgICAgZmFjdG9yeSA9IGNvbmZpZ1snKCknXSAgIyBmb3IgdXNlIGluIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgdGU6CiAgICAgICAgICAgICAgICBpZiAiJ2Zvcm1hdCciIG5vdCBpbiBzdHIodGUpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICAjIE5hbWUgb2YgcGFyYW1ldGVyIGNoYW5nZWQgZnJvbSBmbXQgdG8gZm9ybWF0LgogICAgICAgICAgICAgICAgIyBSZXRyeSB3aXRoIG9sZCBuYW1lLgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucwogICAgICAgICAgICAgICAgIyhlLmcuIGJ5IERqYW5nbykKICAgICAgICAgICAgICAgIGNvbmZpZ1snZm10J10gPSBjb25maWcucG9wKCdmb3JtYXQnKQogICAgICAgICAgICAgICAgY29uZmlnWycoKSddID0gZmFjdG9yeQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBmbXQgPSBjb25maWcuZ2V0KCdmb3JtYXQnLCBOb25lKQogICAgICAgICAgICBkZm10ID0gY29uZmlnLmdldCgnZGF0ZWZtdCcsIE5vbmUpCiAgICAgICAgICAgIHJlc3VsdCA9IGxvZ2dpbmcuRm9ybWF0dGVyKGZtdCwgZGZtdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNvbmZpZ3VyZV9maWx0ZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBmaWx0ZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IGNvbmZpZy5nZXQoJ25hbWUnLCAnJykKICAgICAgICAgICAgcmVzdWx0ID0gbG9nZ2luZy5GaWx0ZXIobmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFkZF9maWx0ZXJzKHNlbGYsIGZpbHRlcmVyLCBmaWx0ZXJzKToKICAgICAgICAiIiJBZGQgZmlsdGVycyB0byBhIGZpbHRlcmVyIGZyb20gYSBsaXN0IG9mIG5hbWVzLiIiIgogICAgICAgIGZvciBmIGluIGZpbHRlcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZpbHRlcmVyLmFkZEZpbHRlcihzZWxmLmNvbmZpZ1snZmlsdGVycyddW2ZdKQogICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBmaWx0ZXIgJXI6ICVzJyAlIChmLCBlKSkKCiAgICBkZWYgY29uZmlndXJlX2hhbmRsZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBoYW5kbGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGZvcm1hdHRlciA9IGNvbmZpZy5wb3AoJ2Zvcm1hdHRlcicsIE5vbmUpCiAgICAgICAgaWYgZm9ybWF0dGVyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLmNvbmZpZ1snZm9ybWF0dGVycyddW2Zvcm1hdHRlcl0KICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBzZXQgZm9ybWF0dGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoZm9ybWF0dGVyLCBlKSkKICAgICAgICBsZXZlbCA9IGNvbmZpZy5wb3AoJ2xldmVsJywgTm9uZSkKICAgICAgICBmaWx0ZXJzID0gY29uZmlnLnBvcCgnZmlsdGVycycsIE5vbmUpCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGMsICdfX2NhbGxfXycpIGFuZCBoYXNhdHRyKHR5cGVzLCAnQ2xhc3NUeXBlJykgYW5kIHR5cGUoYykgIT0gdHlwZXMuQ2xhc3NUeXBlOgogICAgICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgICAgICBmYWN0b3J5ID0gYwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGtsYXNzID0gc2VsZi5yZXNvbHZlKGNvbmZpZy5wb3AoJ2NsYXNzJykpCiAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBoYW5kbGVyIHdoaWNoIHJlZmVycyB0byBhbm90aGVyIGhhbmRsZXIKICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAndGFyZ2V0JyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgY29uZmlnWyd0YXJnZXQnXSA9IHNlbGYuY29uZmlnWydoYW5kbGVycyddW2NvbmZpZ1sndGFyZ2V0J11dCiAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBzZXQgdGFyZ2V0IGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoY29uZmlnWyd0YXJnZXQnXSwgZSkpCiAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TTVRQSGFuZGxlcikgYW5kXAogICAgICAgICAgICAgICAgJ21haWxob3N0JyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICBjb25maWdbJ21haWxob3N0J10gPSBzZWxmLmFzX3R1cGxlKGNvbmZpZ1snbWFpbGhvc3QnXSkKICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIpIGFuZFwKICAgICAgICAgICAgICAgICdhZGRyZXNzJyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICBjb25maWdbJ2FkZHJlc3MnXSA9IHNlbGYuYXNfdHVwbGUoY29uZmlnWydhZGRyZXNzJ10pCiAgICAgICAgICAgIGZhY3RvcnkgPSBrbGFzcwogICAgICAgIGt3YXJncyA9IGRpY3QoKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIHRlOgogICAgICAgICAgICBpZiAiJ3N0cmVhbSciIG5vdCBpbiBzdHIodGUpOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBUaGUgYXJndW1lbnQgbmFtZSBjaGFuZ2VkIGZyb20gc3RybSB0byBzdHJlYW0KICAgICAgICAgICAgIyBSZXRyeSB3aXRoIG9sZCBuYW1lLgogICAgICAgICAgICAjIFRoaXMgaXMgc28gdGhhdCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggb2xkZXIgUHl0aG9uIHZlcnNpb25zCiAgICAgICAgICAgICMoZS5nLiBieSBEamFuZ28pCiAgICAgICAgICAgIGt3YXJnc1snc3RybSddID0ga3dhcmdzLnBvcCgnc3RyZWFtJykKICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKICAgICAgICBpZiBmb3JtYXR0ZXI6CiAgICAgICAgICAgIHJlc3VsdC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQogICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXN1bHQuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgIGlmIGZpbHRlcnM6CiAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMocmVzdWx0LCBmaWx0ZXJzKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgYWRkX2hhbmRsZXJzKHNlbGYsIGxvZ2dlciwgaGFuZGxlcnMpOgogICAgICAgICIiIkFkZCBoYW5kbGVycyB0byBhIGxvZ2dlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKICAgICAgICBmb3IgaCBpbiBoYW5kbGVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11baF0pCiAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gYWRkIGhhbmRsZXIgJXI6ICVzJyAlIChoLCBlKSkKCiAgICBkZWYgY29tbW9uX2xvZ2dlcl9jb25maWcoc2VsZiwgbG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgY29tbW9uIHRvIHJvb3QgYW5kIG5vbi1yb290IGxvZ2dlcnMuCiAgICAgICAgIiIiCiAgICAgICAgbGV2ZWwgPSBjb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCiAgICAgICAgaWYgbGV2ZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5zZXRMZXZlbChfY2hlY2tMZXZlbChsZXZlbCkpCiAgICAgICAgaWYgbm90IGluY3JlbWVudGFsOgogICAgICAgICAgICAjIFJlbW92ZSBhbnkgZXhpc3RpbmcgaGFuZGxlcnMKICAgICAgICAgICAgZm9yIGggaW4gbG9nZ2VyLmhhbmRsZXJzWzpdOgogICAgICAgICAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaCkKICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIE5vbmUpCiAgICAgICAgICAgIGlmIGhhbmRsZXJzOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfaGFuZGxlcnMobG9nZ2VyLCBoYW5kbGVycykKICAgICAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5nZXQoJ2ZpbHRlcnMnLCBOb25lKQogICAgICAgICAgICBpZiBmaWx0ZXJzOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfZmlsdGVycyhsb2dnZXIsIGZpbHRlcnMpCgogICAgZGVmIGNvbmZpZ3VyZV9sb2dnZXIoc2VsZiwgbmFtZSwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgbm9uLXJvb3QgbG9nZ2VyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCiAgICAgICAgc2VsZi5jb21tb25fbG9nZ2VyX2NvbmZpZyhsb2dnZXIsIGNvbmZpZywgaW5jcmVtZW50YWwpCiAgICAgICAgcHJvcGFnYXRlID0gY29uZmlnLmdldCgncHJvcGFnYXRlJywgTm9uZSkKICAgICAgICBpZiBwcm9wYWdhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBwcm9wYWdhdGUKCiAgICBkZWYgY29uZmlndXJlX3Jvb3Qoc2VsZiwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgcm9vdCBsb2dnZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgcm9vdCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKICAgICAgICBzZWxmLmNvbW1vbl9sb2dnZXJfY29uZmlnKHJvb3QsIGNvbmZpZywgaW5jcmVtZW50YWwpCgpkaWN0Q29uZmlnQ2xhc3MgPSBEaWN0Q29uZmlndXJhdG9yCgoKZGVmIGRpY3RDb25maWcoY29uZmlnKToKICAgICIiIkNvbmZpZ3VyZSBsb2dnaW5nIHVzaW5nIGEgZGljdGlvbmFyeS4iIiIKICAgIGRpY3RDb25maWdDbGFzcyhjb25maWcpLmNvbmZpZ3VyZSgpClBLAwQUAAAAAAAAACEA/T8pUZl9AACZfQAAHwAAAHB5cGlfX3BpcF85XzBfMy9waXAvZG93bmxvYWQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNnaQppbXBvcnQgZW1haWwudXRpbHMKaW1wb3J0IGdldHBhc3MKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG1pbWV0eXBlcwppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCgp0cnk6CiAgICBpbXBvcnQgc3NsICAjIG5vcWEKICAgIEhBU19UTFMgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIEhBU19UTFMgPSBGYWxzZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCByZXF1ZXN0IGFzIHVybGxpYl9yZXF1ZXN0CgppbXBvcnQgcGlwCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvciwgSGFzaE1pc21hdGNoCmZyb20gcGlwLm1vZGVscyBpbXBvcnQgUHlQSQpmcm9tIHBpcC51dGlscyBpbXBvcnQgKHNwbGl0ZXh0LCBybXRyZWUsIGZvcm1hdF9zaXplLCBkaXNwbGF5X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwX2RpciwgYXNrX3BhdGhfZXhpc3RzLCB1bnBhY2tfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBBUkNISVZFX0VYVEVOU0lPTlMsIGNvbnN1bWUsIGNhbGxfc3VicHJvY2VzcykKZnJvbSBwaXAudXRpbHMuZW5jb2RpbmcgaW1wb3J0IGF1dG9fZGVjb2RlCmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5zZXR1cHRvb2xzX2J1aWxkIGltcG9ydCBTRVRVUFRPT0xTX1NISU0KZnJvbSBwaXAudXRpbHMuZ2xpYmMgaW1wb3J0IGxpYmNfdmVyCmZyb20gcGlwLnV0aWxzLnVpIGltcG9ydCBEb3dubG9hZFByb2dyZXNzQmFyLCBEb3dubG9hZFByb2dyZXNzU3Bpbm5lcgpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZQpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCByZXF1ZXN0cywgc2l4CmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuYWRhcHRlcnMgaW1wb3J0IEJhc2VBZGFwdGVyLCBIVFRQQWRhcHRlcgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmF1dGggaW1wb3J0IEF1dGhCYXNlLCBIVFRQQmFzaWNBdXRoCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMubW9kZWxzIGltcG9ydCBDT05URU5UX0NIVU5LX1NJWkUsIFJlc3BvbnNlCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMudXRpbHMgaW1wb3J0IGdldF9uZXRyY19hdXRoCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdApmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB1cmxsaWIzCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmNhY2hlcyBpbXBvcnQgRmlsZUNhY2hlCmZyb20gcGlwLl92ZW5kb3IubG9ja2ZpbGUgaW1wb3J0IExvY2tFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgeG1scnBjX2NsaWVudAoKCl9fYWxsX18gPSBbJ2dldF9maWxlX2NvbnRlbnQnLAogICAgICAgICAgICdpc191cmwnLCAndXJsX3RvX3BhdGgnLCAncGF0aF90b191cmwnLAogICAgICAgICAgICdpc19hcmNoaXZlX2ZpbGUnLCAndW5wYWNrX3Zjc19saW5rJywKICAgICAgICAgICAndW5wYWNrX2ZpbGVfdXJsJywgJ2lzX3Zjc191cmwnLCAnaXNfZmlsZV91cmwnLAogICAgICAgICAgICd1bnBhY2tfaHR0cF91cmwnLCAndW5wYWNrX3VybCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIHVzZXJfYWdlbnQoKToKICAgICIiIgogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdXNlciBhZ2VudC4KICAgICIiIgogICAgZGF0YSA9IHsKICAgICAgICAiaW5zdGFsbGVyIjogeyJuYW1lIjogInBpcCIsICJ2ZXJzaW9uIjogcGlwLl9fdmVyc2lvbl9ffSwKICAgICAgICAicHl0aG9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAiaW1wbGVtZW50YXRpb24iOiB7CiAgICAgICAgICAgICJuYW1lIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgfSwKICAgIH0KCiAgICBpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ0NQeXRob24nOgogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKICAgIGVsaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdQeVB5JzoKICAgICAgICBpZiBzeXMucHlweV92ZXJzaW9uX2luZm8ucmVsZWFzZWxldmVsID09ICdmaW5hbCc6CiAgICAgICAgICAgIHB5cHlfdmVyc2lvbl9pbmZvID0gc3lzLnB5cHlfdmVyc2lvbl9pbmZvWzozXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHB5cHlfdmVyc2lvbl9pbmZvID0gc3lzLnB5cHlfdmVyc2lvbl9pbmZvCiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gIi4iLmpvaW4oCiAgICAgICAgICAgIFtzdHIoeCkgZm9yIHggaW4gcHlweV92ZXJzaW9uX2luZm9dCiAgICAgICAgKQogICAgZWxpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ0p5dGhvbic6CiAgICAgICAgIyBDb21wbGV0ZSBHdWVzcwogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKICAgIGVsaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdJcm9uUHl0aG9uJzoKICAgICAgICAjIENvbXBsZXRlIEd1ZXNzCiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJsaW51eCIpOgogICAgICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGRpc3RybwogICAgICAgIGRpc3Ryb19pbmZvcyA9IGRpY3QoZmlsdGVyKAogICAgICAgICAgICBsYW1iZGEgeDogeFsxXSwKICAgICAgICAgICAgemlwKFsibmFtZSIsICJ2ZXJzaW9uIiwgImlkIl0sIGRpc3Ryby5saW51eF9kaXN0cmlidXRpb24oKSksCiAgICAgICAgKSkKICAgICAgICBsaWJjID0gZGljdChmaWx0ZXIoCiAgICAgICAgICAgIGxhbWJkYSB4OiB4WzFdLAogICAgICAgICAgICB6aXAoWyJsaWIiLCAidmVyc2lvbiJdLCBsaWJjX3ZlcigpKSwKICAgICAgICApKQogICAgICAgIGlmIGxpYmM6CiAgICAgICAgICAgIGRpc3Ryb19pbmZvc1sibGliYyJdID0gbGliYwogICAgICAgIGlmIGRpc3Ryb19pbmZvczoKICAgICAgICAgICAgZGF0YVsiZGlzdHJvIl0gPSBkaXN0cm9faW5mb3MKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiZGFyd2luIikgYW5kIHBsYXRmb3JtLm1hY192ZXIoKVswXToKICAgICAgICBkYXRhWyJkaXN0cm8iXSA9IHsibmFtZSI6ICJtYWNPUyIsICJ2ZXJzaW9uIjogcGxhdGZvcm0ubWFjX3ZlcigpWzBdfQoKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpOgogICAgICAgIGRhdGEuc2V0ZGVmYXVsdCgic3lzdGVtIiwge30pWyJuYW1lIl0gPSBwbGF0Zm9ybS5zeXN0ZW0oKQoKICAgIGlmIHBsYXRmb3JtLnJlbGVhc2UoKToKICAgICAgICBkYXRhLnNldGRlZmF1bHQoInN5c3RlbSIsIHt9KVsicmVsZWFzZSJdID0gcGxhdGZvcm0ucmVsZWFzZSgpCgogICAgaWYgcGxhdGZvcm0ubWFjaGluZSgpOgogICAgICAgIGRhdGFbImNwdSJdID0gcGxhdGZvcm0ubWFjaGluZSgpCgogICAgIyBQeXRob24gMi42IGRvZXNuJ3QgaGF2ZSBzc2wuT1BFTlNTTF9WRVJTSU9OLgogICAgaWYgSEFTX1RMUyBhbmQgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMiwgNik6CiAgICAgICAgZGF0YVsib3BlbnNzbF92ZXJzaW9uIl0gPSBzc2wuT1BFTlNTTF9WRVJTSU9OCgogICAgcmV0dXJuICJ7ZGF0YVtpbnN0YWxsZXJdW25hbWVdfS97ZGF0YVtpbnN0YWxsZXJdW3ZlcnNpb25dfSB7anNvbn0iLmZvcm1hdCgKICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAganNvbj1qc29uLmR1bXBzKGRhdGEsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwgc29ydF9rZXlzPVRydWUpLAogICAgKQoKCmNsYXNzIE11bHRpRG9tYWluQmFzaWNBdXRoKEF1dGhCYXNlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvbXB0aW5nPVRydWUpOgogICAgICAgIHNlbGYucHJvbXB0aW5nID0gcHJvbXB0aW5nCiAgICAgICAgc2VsZi5wYXNzd29yZHMgPSB7fQoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByZXEpOgogICAgICAgIHBhcnNlZCA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShyZXEudXJsKQoKICAgICAgICAjIEdldCB0aGUgbmV0bG9jIHdpdGhvdXQgYW55IGVtYmVkZGVkIGNyZWRlbnRpYWxzCiAgICAgICAgbmV0bG9jID0gcGFyc2VkLm5ldGxvYy5yc3BsaXQoIkAiLCAxKVstMV0KCiAgICAgICAgIyBTZXQgdGhlIHVybCBvZiB0aGUgcmVxdWVzdCB0byB0aGUgdXJsIHdpdGhvdXQgYW55IGNyZWRlbnRpYWxzCiAgICAgICAgcmVxLnVybCA9IHVybGxpYl9wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6MV0gKyAobmV0bG9jLCkgKyBwYXJzZWRbMjpdKQoKICAgICAgICAjIFVzZSBhbnkgc3RvcmVkIGNyZWRlbnRpYWxzIHRoYXQgd2UgaGF2ZSBmb3IgdGhpcyBuZXRsb2MKICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBzZWxmLnBhc3N3b3Jkcy5nZXQobmV0bG9jLCAoTm9uZSwgTm9uZSkpCgogICAgICAgICMgRXh0cmFjdCBjcmVkZW50aWFscyBlbWJlZGRlZCBpbiB0aGUgdXJsIGlmIHdlIGhhdmUgbm9uZSBzdG9yZWQKICAgICAgICBpZiB1c2VybmFtZSBpcyBOb25lOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBzZWxmLnBhcnNlX2NyZWRlbnRpYWxzKHBhcnNlZC5uZXRsb2MpCgogICAgICAgICMgR2V0IGNyZWRzIGZyb20gbmV0cmMgaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSB0aGVtCiAgICAgICAgaWYgdXNlcm5hbWUgaXMgTm9uZSBhbmQgcGFzc3dvcmQgaXMgTm9uZToKICAgICAgICAgICAgbmV0cmNfYXV0aCA9IGdldF9uZXRyY19hdXRoKHJlcS51cmwpCiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IG5ldHJjX2F1dGggaWYgbmV0cmNfYXV0aCBlbHNlIChOb25lLCBOb25lKQoKICAgICAgICBpZiB1c2VybmFtZSBvciBwYXNzd29yZDoKICAgICAgICAgICAgIyBTdG9yZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmRzW25ldGxvY10gPSAodXNlcm5hbWUsIHBhc3N3b3JkKQoKICAgICAgICAgICAgIyBTZW5kIHRoZSBiYXNpYyBhdXRoIHdpdGggdGhpcyByZXF1ZXN0CiAgICAgICAgICAgIHJlcSA9IEhUVFBCYXNpY0F1dGgodXNlcm5hbWUgb3IgIiIsIHBhc3N3b3JkIG9yICIiKShyZXEpCgogICAgICAgICMgQXR0YWNoIGEgaG9vayB0byBoYW5kbGUgNDAxIHJlc3BvbnNlcwogICAgICAgIHJlcS5yZWdpc3Rlcl9ob29rKCJyZXNwb25zZSIsIHNlbGYuaGFuZGxlXzQwMSkKCiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBoYW5kbGVfNDAxKHNlbGYsIHJlc3AsICoqa3dhcmdzKToKICAgICAgICAjIFdlIG9ubHkgY2FyZSBhYm91dCA0MDEgcmVzcG9uc2VzLCBhbnl0aGluZyBlbHNlIHdlIHdhbnQgdG8ganVzdAogICAgICAgICMgICBwYXNzIHRocm91Z2ggdGhlIGFjdHVhbCByZXNwb25zZQogICAgICAgIGlmIHJlc3Auc3RhdHVzX2NvZGUgIT0gNDAxOgogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICAjIFdlIGFyZSBub3QgYWJsZSB0byBwcm9tcHQgdGhlIHVzZXIgc28gc2ltcGx5IHJldHVybiB0aGUgcmVzcG9uc2UKICAgICAgICBpZiBub3Qgc2VsZi5wcm9tcHRpbmc6CiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgIHBhcnNlZCA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShyZXNwLnVybCkKCiAgICAgICAgIyBQcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHVzZXJuYW1lIGFuZCBwYXNzd29yZAogICAgICAgIHVzZXJuYW1lID0gc2l4Lm1vdmVzLmlucHV0KCJVc2VyIGZvciAlczogIiAlIHBhcnNlZC5uZXRsb2MpCiAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIlBhc3N3b3JkOiAiKQoKICAgICAgICAjIFN0b3JlIHRoZSBuZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIHVzZSBmb3IgZnV0dXJlIHJlcXVlc3RzCiAgICAgICAgaWYgdXNlcm5hbWUgb3IgcGFzc3dvcmQ6CiAgICAgICAgICAgIHNlbGYucGFzc3dvcmRzW3BhcnNlZC5uZXRsb2NdID0gKHVzZXJuYW1lLCBwYXNzd29yZCkKCiAgICAgICAgIyBDb25zdW1lIGNvbnRlbnQgYW5kIHJlbGVhc2UgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gdG8gYWxsb3cgb3VyIG5ldwogICAgICAgICMgICByZXF1ZXN0IHRvIHJldXNlIHRoZSBzYW1lIG9uZS4KICAgICAgICByZXNwLmNvbnRlbnQKICAgICAgICByZXNwLnJhdy5yZWxlYXNlX2Nvbm4oKQoKICAgICAgICAjIEFkZCBvdXIgbmV3IHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgcmVxdWVzdAogICAgICAgIHJlcSA9IEhUVFBCYXNpY0F1dGgodXNlcm5hbWUgb3IgIiIsIHBhc3N3b3JkIG9yICIiKShyZXNwLnJlcXVlc3QpCgogICAgICAgICMgU2VuZCBvdXIgbmV3IHJlcXVlc3QKICAgICAgICBuZXdfcmVzcCA9IHJlc3AuY29ubmVjdGlvbi5zZW5kKHJlcSwgKiprd2FyZ3MpCiAgICAgICAgbmV3X3Jlc3AuaGlzdG9yeS5hcHBlbmQocmVzcCkKCiAgICAgICAgcmV0dXJuIG5ld19yZXNwCgogICAgZGVmIHBhcnNlX2NyZWRlbnRpYWxzKHNlbGYsIG5ldGxvYyk6CiAgICAgICAgaWYgIkAiIGluIG5ldGxvYzoKICAgICAgICAgICAgdXNlcmluZm8gPSBuZXRsb2MucnNwbGl0KCJAIiwgMSlbMF0KICAgICAgICAgICAgaWYgIjoiIGluIHVzZXJpbmZvOgogICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJpbmZvLnNwbGl0KCI6IiwgMSkKICAgICAgICAgICAgcmV0dXJuIHVzZXJpbmZvLCBOb25lCiAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKCgpjbGFzcyBMb2NhbEZTQWRhcHRlcihCYXNlQWRhcHRlcik6CgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgc3RyZWFtPU5vbmUsIHRpbWVvdXQ9Tm9uZSwgdmVyaWZ5PU5vbmUsIGNlcnQ9Tm9uZSwKICAgICAgICAgICAgIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgcGF0aG5hbWUgPSB1cmxfdG9fcGF0aChyZXF1ZXN0LnVybCkKCiAgICAgICAgcmVzcCA9IFJlc3BvbnNlKCkKICAgICAgICByZXNwLnN0YXR1c19jb2RlID0gMjAwCiAgICAgICAgcmVzcC51cmwgPSByZXF1ZXN0LnVybAoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXRzID0gb3Muc3RhdChwYXRobmFtZSkKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJlc3Auc3RhdHVzX2NvZGUgPSA0MDQKICAgICAgICAgICAgcmVzcC5yYXcgPSBleGMKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RpZmllZCA9IGVtYWlsLnV0aWxzLmZvcm1hdGRhdGUoc3RhdHMuc3RfbXRpbWUsIHVzZWdtdD1UcnVlKQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShwYXRobmFtZSlbMF0gb3IgInRleHQvcGxhaW4iCiAgICAgICAgICAgIHJlc3AuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoewogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6IGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aCI6IHN0YXRzLnN0X3NpemUsCiAgICAgICAgICAgICAgICAiTGFzdC1Nb2RpZmllZCI6IG1vZGlmaWVkLAogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcmVzcC5yYXcgPSBvcGVuKHBhdGhuYW1lLCAicmIiKQogICAgICAgICAgICByZXNwLmNsb3NlID0gcmVzcC5yYXcuY2xvc2UKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgcGFzcwoKCmNsYXNzIFNhZmVGaWxlQ2FjaGUoRmlsZUNhY2hlKToKICAgICIiIgogICAgQSBmaWxlIGJhc2VkIGNhY2hlIHdoaWNoIGlzIHNhZmUgdG8gdXNlIGV2ZW4gd2hlbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBtYXkKICAgIG5vdCBiZSBhY2Nlc3NpYmxlIG9yIHdyaXRhYmxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICAjIENoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBvdXIgY2FjaGUgZGlyZWN0b3J5CiAgICAgICAgIyBpcyBvd25lZCBieSB0aGUgdXNlciBjdXJyZW50IGV4ZWN1dGluZyBwaXAuIElmIGl0IGRvZXMgbm90IGV4aXN0CiAgICAgICAgIyB3ZSB3aWxsIGNoZWNrIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHVudGlsIHdlIGZpbmQgb25lIHRoYXQgZG9lcyBleGlzdC4KICAgICAgICAjIElmIGl0IGlzIG5vdCBvd25lZCBieSB0aGUgdXNlciBleGVjdXRpbmcgcGlwIHRoZW4gd2Ugd2lsbCBkaXNhYmxlCiAgICAgICAgIyB0aGUgY2FjaGUgYW5kIGxvZyBhIHdhcm5pbmcuCiAgICAgICAgaWYgbm90IGNoZWNrX3BhdGhfb3duZXIoc2VsZi5kaXJlY3RvcnkpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJUaGUgZGlyZWN0b3J5ICclcycgb3IgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IG93bmVkIGJ5ICIKICAgICAgICAgICAgICAgICJ0aGUgY3VycmVudCB1c2VyIGFuZCB0aGUgY2FjaGUgaGFzIGJlZW4gZGlzYWJsZWQuIFBsZWFzZSAiCiAgICAgICAgICAgICAgICAiY2hlY2sgdGhlIHBlcm1pc3Npb25zIGFuZCBvd25lciBvZiB0aGF0IGRpcmVjdG9yeS4gSWYgIgogICAgICAgICAgICAgICAgImV4ZWN1dGluZyBwaXAgd2l0aCBzdWRvLCB5b3UgbWF5IHdhbnQgc3VkbydzIC1IIGZsYWcuIiwKICAgICAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5LAogICAgICAgICAgICApCgogICAgICAgICAgICAjIFNldCBvdXIgZGlyZWN0b3J5IHRvIE5vbmUgdG8gZGlzYWJsZSB0aGUgQ2FjaGUKICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBOb25lCgogICAgZGVmIGdldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIGRpcmVjdG9yeSwgdGhlbiB0aGUgY2FjaGUgc2hvdWxkIGJlIGEgbm8tb3AuCiAgICAgICAgaWYgc2VsZi5kaXJlY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFNhZmVGaWxlQ2FjaGUsIHNlbGYpLmdldCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChMb2NrRXJyb3IsIE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIFdlIGludGVudGlvbmFsbHkgc2lsZW5jZSB0aGlzIGVycm9yLCBpZiB3ZSBjYW4ndCBhY2Nlc3MgdGhlIGNhY2hlCiAgICAgICAgICAgICMgdGhlbiB3ZSBjYW4ganVzdCBza2lwIGNhY2hpbmcgYW5kIHByb2Nlc3MgdGhlIHJlcXVlc3QgYXMgaWYKICAgICAgICAgICAgIyBjYWNoaW5nIHdhc24ndCBlbmFibGVkLgogICAgICAgICAgICBwYXNzCgogICAgZGVmIHNldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIGRpcmVjdG9yeSwgdGhlbiB0aGUgY2FjaGUgc2hvdWxkIGJlIGEgbm8tb3AuCiAgICAgICAgaWYgc2VsZi5kaXJlY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFNhZmVGaWxlQ2FjaGUsIHNlbGYpLnNldCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChMb2NrRXJyb3IsIE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIFdlIGludGVudGlvbmFsbHkgc2lsZW5jZSB0aGlzIGVycm9yLCBpZiB3ZSBjYW4ndCBhY2Nlc3MgdGhlIGNhY2hlCiAgICAgICAgICAgICMgdGhlbiB3ZSBjYW4ganVzdCBza2lwIGNhY2hpbmcgYW5kIHByb2Nlc3MgdGhlIHJlcXVlc3QgYXMgaWYKICAgICAgICAgICAgIyBjYWNoaW5nIHdhc24ndCBlbmFibGVkLgogICAgICAgICAgICBwYXNzCgogICAgZGVmIGRlbGV0ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIGRpcmVjdG9yeSwgdGhlbiB0aGUgY2FjaGUgc2hvdWxkIGJlIGEgbm8tb3AuCiAgICAgICAgaWYgc2VsZi5kaXJlY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFNhZmVGaWxlQ2FjaGUsIHNlbGYpLmRlbGV0ZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChMb2NrRXJyb3IsIE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIFdlIGludGVudGlvbmFsbHkgc2lsZW5jZSB0aGlzIGVycm9yLCBpZiB3ZSBjYW4ndCBhY2Nlc3MgdGhlIGNhY2hlCiAgICAgICAgICAgICMgdGhlbiB3ZSBjYW4ganVzdCBza2lwIGNhY2hpbmcgYW5kIHByb2Nlc3MgdGhlIHJlcXVlc3QgYXMgaWYKICAgICAgICAgICAgIyBjYWNoaW5nIHdhc24ndCBlbmFibGVkLgogICAgICAgICAgICBwYXNzCgoKY2xhc3MgSW5zZWN1cmVIVFRQQWRhcHRlcihIVFRQQWRhcHRlcik6CgogICAgZGVmIGNlcnRfdmVyaWZ5KHNlbGYsIGNvbm4sIHVybCwgdmVyaWZ5LCBjZXJ0KToKICAgICAgICBjb25uLmNlcnRfcmVxcyA9ICdDRVJUX05PTkUnCiAgICAgICAgY29ubi5jYV9jZXJ0cyA9IE5vbmUKCgpjbGFzcyBQaXBTZXNzaW9uKHJlcXVlc3RzLlNlc3Npb24pOgoKICAgIHRpbWVvdXQgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmV0cmllcyA9IGt3YXJncy5wb3AoInJldHJpZXMiLCAwKQogICAgICAgIGNhY2hlID0ga3dhcmdzLnBvcCgiY2FjaGUiLCBOb25lKQogICAgICAgIGluc2VjdXJlX2hvc3RzID0ga3dhcmdzLnBvcCgiaW5zZWN1cmVfaG9zdHMiLCBbXSkKCiAgICAgICAgc3VwZXIoUGlwU2Vzc2lvbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICAjIEF0dGFjaCBvdXIgVXNlciBBZ2VudCB0byB0aGUgcmVxdWVzdAogICAgICAgIHNlbGYuaGVhZGVyc1siVXNlci1BZ2VudCJdID0gdXNlcl9hZ2VudCgpCgogICAgICAgICMgQXR0YWNoIG91ciBBdXRoZW50aWNhdGlvbiBoYW5kbGVyIHRvIHRoZSBzZXNzaW9uCiAgICAgICAgc2VsZi5hdXRoID0gTXVsdGlEb21haW5CYXNpY0F1dGgoKQoKICAgICAgICAjIENyZWF0ZSBvdXIgdXJsbGliMy5SZXRyeSBpbnN0YW5jZSB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGN1c3RvbWl6ZQogICAgICAgICMgaG93IHdlIGhhbmRsZSByZXRyaWVzLgogICAgICAgIHJldHJpZXMgPSB1cmxsaWIzLlJldHJ5KAogICAgICAgICAgICAjIFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdGhhdCBhIHBhcnRpY3VsYXIgcmVxdWVzdCBjYW4KICAgICAgICAgICAgIyBoYXZlLgogICAgICAgICAgICB0b3RhbD1yZXRyaWVzLAoKICAgICAgICAgICAgIyBBIDUwMyBlcnJvciBmcm9tIFB5UEkgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIEZhc3RseSAtPiBPcmlnaW4KICAgICAgICAgICAgIyBjb25uZWN0aW9uIGdvdCBpbnRlcnJ1cHRlZCBpbiBzb21lIHdheS4gQSA1MDMgZXJyb3IgaW4gZ2VuZXJhbAogICAgICAgICAgICAjIGlzIHR5cGljYWxseSBjb25zaWRlcmVkIGEgdHJhbnNpZW50IGVycm9yIHNvIHdlJ2xsIGdvIGFoZWFkIGFuZAogICAgICAgICAgICAjIHJldHJ5IGl0LgogICAgICAgICAgICBzdGF0dXNfZm9yY2VsaXN0PVs1MDNdLAoKICAgICAgICAgICAgIyBBZGQgYSBzbWFsbCBhbW91bnQgb2YgYmFjayBvZmYgYmV0d2VlbiBmYWlsZWQgcmVxdWVzdHMgaW4KICAgICAgICAgICAgIyBvcmRlciB0byBwcmV2ZW50IGhhbW1lcmluZyB0aGUgc2VydmljZS4KICAgICAgICAgICAgYmFja29mZl9mYWN0b3I9MC4yNSwKICAgICAgICApCgogICAgICAgICMgV2Ugd2FudCB0byBfb25seV8gY2FjaGUgcmVzcG9uc2VzIG9uIHNlY3VyZWx5IGZldGNoZWQgb3JpZ2lucy4gV2UgZG8KICAgICAgICAjIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCB2YWxpZGF0ZSB0aGUgcmVzcG9uc2Ugb2YgYW4gaW5zZWN1cmVseSBmZXRjaGVkCiAgICAgICAgIyBvcmlnaW4sIGFuZCB3ZSBkb24ndCB3YW50IHNvbWVvbmUgdG8gYmUgYWJsZSB0byBwb2lzb24gdGhlIGNhY2hlIGFuZAogICAgICAgICMgcmVxdWlyZSBtYW51YWwgZXZpY3Rpb24gZnJvbSB0aGUgY2FjaGUgdG8gZml4IGl0LgogICAgICAgIGlmIGNhY2hlOgogICAgICAgICAgICBzZWN1cmVfYWRhcHRlciA9IENhY2hlQ29udHJvbEFkYXB0ZXIoCiAgICAgICAgICAgICAgICBjYWNoZT1TYWZlRmlsZUNhY2hlKGNhY2hlLCB1c2VfZGlyX2xvY2s9VHJ1ZSksCiAgICAgICAgICAgICAgICBtYXhfcmV0cmllcz1yZXRyaWVzLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VjdXJlX2FkYXB0ZXIgPSBIVFRQQWRhcHRlcihtYXhfcmV0cmllcz1yZXRyaWVzKQoKICAgICAgICAjIE91ciBJbnNlY3VyZSBIVFRQQWRhcHRlciBkaXNhYmxlcyBIVFRQUyB2YWxpZGF0aW9uLiBJdCBkb2VzIG5vdAogICAgICAgICMgc3VwcG9ydCBjYWNoaW5nIChzZWUgYWJvdmUpIHNvIHdlJ2xsIHVzZSBpdCBmb3IgYWxsIGh0dHA6Ly8gVVJMcyBhcwogICAgICAgICMgd2VsbCBhcyBhbnkgaHR0cHM6Ly8gaG9zdCB0aGF0IHdlJ3ZlIG1hcmtlZCBhcyBpZ25vcmluZyBUTFMgZXJyb3JzCiAgICAgICAgIyBmb3IuCiAgICAgICAgaW5zZWN1cmVfYWRhcHRlciA9IEluc2VjdXJlSFRUUEFkYXB0ZXIobWF4X3JldHJpZXM9cmV0cmllcykKCiAgICAgICAgc2VsZi5tb3VudCgiaHR0cHM6Ly8iLCBzZWN1cmVfYWRhcHRlcikKICAgICAgICBzZWxmLm1vdW50KCJodHRwOi8vIiwgaW5zZWN1cmVfYWRhcHRlcikKCiAgICAgICAgIyBFbmFibGUgZmlsZTovLyB1cmxzCiAgICAgICAgc2VsZi5tb3VudCgiZmlsZTovLyIsIExvY2FsRlNBZGFwdGVyKCkpCgogICAgICAgICMgV2Ugd2FudCB0byB1c2UgYSBub24tdmFsaWRhdGluZyBhZGFwdGVyIGZvciBhbnkgcmVxdWVzdHMgd2hpY2ggYXJlCiAgICAgICAgIyBkZWVtZWQgaW5zZWN1cmUuCiAgICAgICAgZm9yIGhvc3QgaW4gaW5zZWN1cmVfaG9zdHM6CiAgICAgICAgICAgIHNlbGYubW91bnQoImh0dHBzOi8vezB9LyIuZm9ybWF0KGhvc3QpLCBpbnNlY3VyZV9hZGFwdGVyKQoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgQWxsb3cgc2V0dGluZyBhIGRlZmF1bHQgdGltZW91dCBvbiBhIHNlc3Npb24KICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgidGltZW91dCIsIHNlbGYudGltZW91dCkKCiAgICAgICAgIyBEaXNwYXRjaCB0aGUgYWN0dWFsIHJlcXVlc3QKICAgICAgICByZXR1cm4gc3VwZXIoUGlwU2Vzc2lvbiwgc2VsZikucmVxdWVzdChtZXRob2QsIHVybCwgKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBnZXRfZmlsZV9jb250ZW50KHVybCwgY29tZXNfZnJvbT1Ob25lLCBzZXNzaW9uPU5vbmUpOgogICAgIiIiR2V0cyB0aGUgY29udGVudCBvZiBhIGZpbGU7IGl0IG1heSBiZSBhIGZpbGVuYW1lLCBmaWxlOiBVUkwsIG9yCiAgICBodHRwOiBVUkwuICBSZXR1cm5zIChsb2NhdGlvbiwgY29udGVudCkuICBDb250ZW50IGlzIHVuaWNvZGUuIiIiCiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAiZ2V0X2ZpbGVfY29udGVudCgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAnc2Vzc2lvbiciCiAgICAgICAgKQoKICAgIG1hdGNoID0gX3NjaGVtZV9yZS5zZWFyY2godXJsKQogICAgaWYgbWF0Y2g6CiAgICAgICAgc2NoZW1lID0gbWF0Y2guZ3JvdXAoMSkubG93ZXIoKQogICAgICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIGFuZCBjb21lc19mcm9tIGFuZAogICAgICAgICAgICAgICAgY29tZXNfZnJvbS5zdGFydHN3aXRoKCdodHRwJykpOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudHMgZmlsZSAlcyByZWZlcmVuY2VzIFVSTCAlcywgd2hpY2ggaXMgbG9jYWwnCiAgICAgICAgICAgICAgICAlIChjb21lc19mcm9tLCB1cmwpKQogICAgICAgIGlmIHNjaGVtZSA9PSAnZmlsZSc6CiAgICAgICAgICAgIHBhdGggPSB1cmwuc3BsaXQoJzonLCAxKVsxXQogICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJykKICAgICAgICAgICAgbWF0Y2ggPSBfdXJsX3NsYXNoX2RyaXZlX3JlLm1hdGNoKHBhdGgpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgcGF0aCA9IG1hdGNoLmdyb3VwKDEpICsgJzonICsgcGF0aC5zcGxpdCgnfCcsIDEpWzFdCiAgICAgICAgICAgIHBhdGggPSB1cmxsaWJfcGFyc2UudW5xdW90ZShwYXRoKQogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoLmxzdHJpcCgnLycpCiAgICAgICAgICAgIHVybCA9IHBhdGgKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEZJWE1FOiBjYXRjaCBzb21lIGVycm9ycwogICAgICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQodXJsKQogICAgICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgICAgICByZXR1cm4gcmVzcC51cmwsIHJlc3AudGV4dAogICAgdHJ5OgogICAgICAgIHdpdGggb3Blbih1cmwsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBhdXRvX2RlY29kZShmLnJlYWQoKSkKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGV4YzoKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgJ0NvdWxkIG5vdCBvcGVuIHJlcXVpcmVtZW50cyBmaWxlOiAlcycgJSBzdHIoZXhjKQogICAgICAgICkKICAgIHJldHVybiB1cmwsIGNvbnRlbnQKCgpfc2NoZW1lX3JlID0gcmUuY29tcGlsZShyJ14oaHR0cHxodHRwc3xmaWxlKTonLCByZS5JKQpfdXJsX3NsYXNoX2RyaXZlX3JlID0gcmUuY29tcGlsZShyJy8qKFthLXpdKVx8JywgcmUuSSkKCgpkZWYgaXNfdXJsKG5hbWUpOgogICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UgYSBVUkwiIiIKICAgIGlmICc6JyBub3QgaW4gbmFtZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHNjaGVtZSA9IG5hbWUuc3BsaXQoJzonLCAxKVswXS5sb3dlcigpCiAgICByZXR1cm4gc2NoZW1lIGluIFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Z0cCddICsgdmNzLmFsbF9zY2hlbWVzCgoKZGVmIHVybF90b19wYXRoKHVybCk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBmaWxlOiBVUkwgdG8gYSBwYXRoLgogICAgIiIiCiAgICBhc3NlcnQgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6JyksICgKICAgICAgICAiWW91IGNhbiBvbmx5IHR1cm4gZmlsZTogdXJscyBpbnRvIGZpbGVuYW1lcyAobm90ICVyKSIgJSB1cmwpCgogICAgXywgbmV0bG9jLCBwYXRoLCBfLCBfID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKCiAgICAjIGlmIHdlIGhhdmUgYSBVTkMgcGF0aCwgcHJlcGVuZCBVTkMgc2hhcmUgbm90YXRpb24KICAgIGlmIG5ldGxvYzoKICAgICAgICBuZXRsb2MgPSAnXFxcXCcgKyBuZXRsb2MKCiAgICBwYXRoID0gdXJsbGliX3JlcXVlc3QudXJsMnBhdGhuYW1lKG5ldGxvYyArIHBhdGgpCiAgICByZXR1cm4gcGF0aAoKCmRlZiBwYXRoX3RvX3VybChwYXRoKToKICAgICIiIgogICAgQ29udmVydCBhIHBhdGggdG8gYSBmaWxlOiBVUkwuICBUaGUgcGF0aCB3aWxsIGJlIG1hZGUgYWJzb2x1dGUgYW5kIGhhdmUKICAgIHF1b3RlZCBwYXRoIHBhcnRzLgogICAgIiIiCiAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmFic3BhdGgocGF0aCkpCiAgICB1cmwgPSB1cmxsaWJfcGFyc2UudXJsam9pbignZmlsZTonLCB1cmxsaWJfcmVxdWVzdC5wYXRobmFtZTJ1cmwocGF0aCkpCiAgICByZXR1cm4gdXJsCgoKZGVmIGlzX2FyY2hpdmVfZmlsZShuYW1lKToKICAgICIiIlJldHVybiBUcnVlIGlmIGBuYW1lYCBpcyBhIGNvbnNpZGVyZWQgYXMgYW4gYXJjaGl2ZSBmaWxlLiIiIgogICAgZXh0ID0gc3BsaXRleHQobmFtZSlbMV0ubG93ZXIoKQogICAgaWYgZXh0IGluIEFSQ0hJVkVfRVhURU5TSU9OUzoKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHVucGFja192Y3NfbGluayhsaW5rLCBsb2NhdGlvbik6CiAgICB2Y3NfYmFja2VuZCA9IF9nZXRfdXNlZF92Y3NfYmFja2VuZChsaW5rKQogICAgdmNzX2JhY2tlbmQudW5wYWNrKGxvY2F0aW9uKQoKCmRlZiBfZ2V0X3VzZWRfdmNzX2JhY2tlbmQobGluayk6CiAgICBmb3IgYmFja2VuZCBpbiB2Y3MuYmFja2VuZHM6CiAgICAgICAgaWYgbGluay5zY2hlbWUgaW4gYmFja2VuZC5zY2hlbWVzOgogICAgICAgICAgICB2Y3NfYmFja2VuZCA9IGJhY2tlbmQobGluay51cmwpCiAgICAgICAgICAgIHJldHVybiB2Y3NfYmFja2VuZAoKCmRlZiBpc192Y3NfdXJsKGxpbmspOgogICAgcmV0dXJuIGJvb2woX2dldF91c2VkX3Zjc19iYWNrZW5kKGxpbmspKQoKCmRlZiBpc19maWxlX3VybChsaW5rKToKICAgIHJldHVybiBsaW5rLnVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKCgpkZWYgaXNfZGlyX3VybChsaW5rKToKICAgICIiIlJldHVybiB3aGV0aGVyIGEgZmlsZTovLyBMaW5rIHBvaW50cyB0byBhIGRpcmVjdG9yeS4KCiAgICBgYGxpbmtgYCBtdXN0IG5vdCBoYXZlIGFueSBvdGhlciBzY2hlbWUgYnV0IGZpbGU6Ly8uIENhbGwgaXNfZmlsZV91cmwoKQogICAgZmlyc3QuCgogICAgIiIiCiAgICBsaW5rX3BhdGggPSB1cmxfdG9fcGF0aChsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50KQogICAgcmV0dXJuIG9zLnBhdGguaXNkaXIobGlua19wYXRoKQoKCmRlZiBfcHJvZ3Jlc3NfaW5kaWNhdG9yKGl0ZXJhYmxlLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGl0ZXJhYmxlCgoKZGVmIF9kb3dubG9hZF91cmwocmVzcCwgbGluaywgY29udGVudF9maWxlLCBoYXNoZXMpOgogICAgdHJ5OgogICAgICAgIHRvdGFsX2xlbmd0aCA9IGludChyZXNwLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pCiAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEtleUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IDAKCiAgICBjYWNoZWRfcmVzcCA9IGdldGF0dHIocmVzcCwgImZyb21fY2FjaGUiLCBGYWxzZSkKCiAgICBpZiBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA+IGxvZ2dpbmcuSU5GTzoKICAgICAgICBzaG93X3Byb2dyZXNzID0gRmFsc2UKICAgIGVsaWYgY2FjaGVkX3Jlc3A6CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IEZhbHNlCiAgICBlbGlmIHRvdGFsX2xlbmd0aCA+ICg0MCAqIDEwMDApOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBUcnVlCiAgICBlbGlmIG5vdCB0b3RhbF9sZW5ndGg6CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IFRydWUKICAgIGVsc2U6CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IEZhbHNlCgogICAgc2hvd191cmwgPSBsaW5rLnNob3dfdXJsCgogICAgZGVmIHJlc3BfcmVhZChjaHVua19zaXplKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB1cmxsaWIzLgogICAgICAgICAgICBmb3IgY2h1bmsgaW4gcmVzcC5yYXcuc3RyZWFtKAogICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUsCiAgICAgICAgICAgICAgICAgICAgIyBXZSB1c2UgZGVjb2RlX2NvbnRlbnQ9RmFsc2UgaGVyZSBiZWNhdXNlIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgICAgIyB3YW50IHVybGxpYjMgdG8gbWVzcyB3aXRoIHRoZSByYXcgYnl0ZXMgd2UgZ2V0CiAgICAgICAgICAgICAgICAgICAgIyBmcm9tIHRoZSBzZXJ2ZXIuIElmIHdlIGRlY29tcHJlc3MgaW5zaWRlIG9mCiAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIzIHRoZW4gd2UgY2Fubm90IHZlcmlmeSB0aGUgY2hlY2tzdW0KICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGNoZWNrc3VtIHdpbGwgYmUgb2YgdGhlIGNvbXByZXNzZWQKICAgICAgICAgICAgICAgICAgICAjIGZpbGUuIFRoaXMgYnJlYWthZ2Ugd2lsbCBvbmx5IG9jY3VyIGlmIHRoZQogICAgICAgICAgICAgICAgICAgICMgc2VydmVyIGFkZHMgYSBDb250ZW50LUVuY29kaW5nIGhlYWRlciwgd2hpY2gKICAgICAgICAgICAgICAgICAgICAjIGRlcGVuZHMgb24gaG93IHRoZSBzZXJ2ZXIgd2FzIGNvbmZpZ3VyZWQ6CiAgICAgICAgICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzbid0IGEKICAgICAgICAgICAgICAgICAgICAjICAgY29tcHJlc3NpYmxlIGZpbGUgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUgYWxvbmUKICAgICAgICAgICAgICAgICAgICAjICAgYW5kIHdpdGggYW4gZW1wdHkgQ29udGVudC1FbmNvZGluZwogICAgICAgICAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpcwogICAgICAgICAgICAgICAgICAgICMgICBhbHJlYWR5IGNvbXByZXNzZWQgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUKICAgICAgICAgICAgICAgICAgICAjICAgYWxvbmUgYW5kIHdpbGwgYWRkIGEgQ29udGVudC1FbmNvZGluZzogZ3ppcAogICAgICAgICAgICAgICAgICAgICMgICBoZWFkZXIKICAgICAgICAgICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdvbid0IG5vdGljZSBhbnl0aGluZyBhdCBhbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgIyAgIHdpbGwgdGFrZSBhIGZpbGUgdGhhdCdzIGFscmVhZHkgYmVlbiBjb21wcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgIyAgIGFuZCBjb21wcmVzcyBpdCBhZ2FpbiBhbmQgc2V0IHRoZQogICAgICAgICAgICAgICAgICAgICMgICBDb250ZW50LUVuY29kaW5nOiBnemlwIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAjIEJ5IHNldHRpbmcgdGhpcyBub3QgdG8gZGVjb2RlIGF1dG9tYXRpY2FsbHkgd2UKICAgICAgICAgICAgICAgICAgICAjIGhvcGUgdG8gZWxpbWluYXRlIHByb2JsZW1zIHdpdGggdGhlIHNlY29uZCBjYXNlLgogICAgICAgICAgICAgICAgICAgIGRlY29kZV9jb250ZW50PUZhbHNlKToKICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIFN0YW5kYXJkIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBjaHVuayA9IHJlc3AucmF3LnJlYWQoY2h1bmtfc2l6ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKCiAgICBkZWYgd3JpdHRlbl9jaHVua3MoY2h1bmtzKToKICAgICAgICBmb3IgY2h1bmsgaW4gY2h1bmtzOgogICAgICAgICAgICBjb250ZW50X2ZpbGUud3JpdGUoY2h1bmspCiAgICAgICAgICAgIHlpZWxkIGNodW5rCgogICAgcHJvZ3Jlc3NfaW5kaWNhdG9yID0gX3Byb2dyZXNzX2luZGljYXRvcgoKICAgIGlmIGxpbmsubmV0bG9jID09IFB5UEkubmV0bG9jOgogICAgICAgIHVybCA9IHNob3dfdXJsCiAgICBlbHNlOgogICAgICAgIHVybCA9IGxpbmsudXJsX3dpdGhvdXRfZnJhZ21lbnQKCiAgICBpZiBzaG93X3Byb2dyZXNzOiAgIyBXZSBkb24ndCBzaG93IHByb2dyZXNzIG9uIGNhY2hlZCByZXNwb25zZXMKICAgICAgICBpZiB0b3RhbF9sZW5ndGg6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGluZyAlcyAoJXMpIiwgdXJsLCBmb3JtYXRfc2l6ZSh0b3RhbF9sZW5ndGgpKQogICAgICAgICAgICBwcm9ncmVzc19pbmRpY2F0b3IgPSBEb3dubG9hZFByb2dyZXNzQmFyKG1heD10b3RhbF9sZW5ndGgpLml0ZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRpbmcgJXMiLCB1cmwpCiAgICAgICAgICAgIHByb2dyZXNzX2luZGljYXRvciA9IERvd25sb2FkUHJvZ3Jlc3NTcGlubmVyKCkuaXRlcgogICAgZWxpZiBjYWNoZWRfcmVzcDoKICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgY2FjaGVkICVzIiwgdXJsKQogICAgZWxzZToKICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRpbmcgJXMiLCB1cmwpCgogICAgbG9nZ2VyLmRlYnVnKCdEb3dubG9hZGluZyBmcm9tIFVSTCAlcycsIGxpbmspCgogICAgZG93bmxvYWRlZF9jaHVua3MgPSB3cml0dGVuX2NodW5rcygKICAgICAgICBwcm9ncmVzc19pbmRpY2F0b3IoCiAgICAgICAgICAgIHJlc3BfcmVhZChDT05URU5UX0NIVU5LX1NJWkUpLAogICAgICAgICAgICBDT05URU5UX0NIVU5LX1NJWkUKICAgICAgICApCiAgICApCiAgICBpZiBoYXNoZXM6CiAgICAgICAgaGFzaGVzLmNoZWNrX2FnYWluc3RfY2h1bmtzKGRvd25sb2FkZWRfY2h1bmtzKQogICAgZWxzZToKICAgICAgICBjb25zdW1lKGRvd25sb2FkZWRfY2h1bmtzKQoKCmRlZiBfY29weV9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbiwgbGluayk6CiAgICBjb3B5ID0gVHJ1ZQogICAgZG93bmxvYWRfbG9jYXRpb24gPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGxpbmsuZmlsZW5hbWUpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhkb3dubG9hZF9sb2NhdGlvbik6CiAgICAgICAgcmVzcG9uc2UgPSBhc2tfcGF0aF9leGlzdHMoCiAgICAgICAgICAgICdUaGUgZmlsZSAlcyBleGlzdHMuIChpKWdub3JlLCAodylpcGUsIChiKWFja3VwLCAoYSlhYm9ydCcgJQogICAgICAgICAgICBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pLCAoJ2knLCAndycsICdiJywgJ2EnKSkKICAgICAgICBpZiByZXNwb25zZSA9PSAnaSc6CiAgICAgICAgICAgIGNvcHkgPSBGYWxzZQogICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ3cnOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGVsZXRpbmcgJXMnLCBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pKQogICAgICAgICAgICBvcy5yZW1vdmUoZG93bmxvYWRfbG9jYXRpb24pCiAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYic6CiAgICAgICAgICAgIGRlc3RfZmlsZSA9IGJhY2t1cF9kaXIoZG93bmxvYWRfbG9jYXRpb24pCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0JhY2tpbmcgdXAgJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSwKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0X2ZpbGUpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNodXRpbC5tb3ZlKGRvd25sb2FkX2xvY2F0aW9uLCBkZXN0X2ZpbGUpCiAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYSc6CiAgICAgICAgICAgIHN5cy5leGl0KC0xKQogICAgaWYgY29weToKICAgICAgICBzaHV0aWwuY29weShmaWxlbmFtZSwgZG93bmxvYWRfbG9jYXRpb24pCiAgICAgICAgbG9nZ2VyLmluZm8oJ1NhdmVkICVzJywgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSkKCgpkZWYgdW5wYWNrX2h0dHBfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPU5vbmUsIGhhc2hlcz1Ob25lKToKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICJ1bnBhY2tfaHR0cF91cmwoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogJ3Nlc3Npb24nIgogICAgICAgICkKCiAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy11bnBhY2snLCAncGlwLScpCgogICAgIyBJZiBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQsIGlzIHRoZSBmaWxlIGFscmVhZHkgZG93bmxvYWRlZCB0aGVyZT8KICAgIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoID0gTm9uZQogICAgaWYgZG93bmxvYWRfZGlyOgogICAgICAgIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoID0gX2NoZWNrX2Rvd25sb2FkX2RpcihsaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcykKCiAgICBpZiBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBmcm9tX3BhdGggPSBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aAogICAgICAgIGNvbnRlbnRfdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKGZyb21fcGF0aClbMF0KICAgIGVsc2U6CiAgICAgICAgIyBsZXQncyBkb3dubG9hZCB0byBhIHRtcCBkaXIKICAgICAgICBmcm9tX3BhdGgsIGNvbnRlbnRfdHlwZSA9IF9kb3dubG9hZF9odHRwX3VybChsaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzKQoKICAgICMgdW5wYWNrIHRoZSBhcmNoaXZlIHRvIHRoZSBidWlsZCBkaXIgbG9jYXRpb24uIGV2ZW4gd2hlbiBvbmx5IGRvd25sb2FkaW5nCiAgICAjIGFyY2hpdmVzLCB0aGV5IGhhdmUgdG8gYmUgdW5wYWNrZWQgdG8gcGFyc2UgZGVwZW5kZW5jaWVzCiAgICB1bnBhY2tfZmlsZShmcm9tX3BhdGgsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsIGxpbmspCgogICAgIyBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQ7IGxldCdzIGNvcHkgdGhlIGFyY2hpdmUgdGhlcmUKICAgIGlmIGRvd25sb2FkX2RpciBhbmQgbm90IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIF9jb3B5X2ZpbGUoZnJvbV9wYXRoLCBkb3dubG9hZF9kaXIsIGxpbmspCgogICAgaWYgbm90IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIG9zLnVubGluayhmcm9tX3BhdGgpCiAgICBybXRyZWUodGVtcF9kaXIpCgoKZGVmIHVucGFja19maWxlX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyPU5vbmUsIGhhc2hlcz1Ob25lKToKICAgICIiIlVucGFjayBsaW5rIGludG8gbG9jYXRpb24uCgogICAgSWYgZG93bmxvYWRfZGlyIGlzIHByb3ZpZGVkIGFuZCBsaW5rIHBvaW50cyB0byBhIGZpbGUsIG1ha2UgYSBjb3B5CiAgICBvZiB0aGUgbGluayBmaWxlIGluc2lkZSBkb3dubG9hZF9kaXIuCiAgICAiIiIKICAgIGxpbmtfcGF0aCA9IHVybF90b19wYXRoKGxpbmsudXJsX3dpdGhvdXRfZnJhZ21lbnQpCgogICAgIyBJZiBpdCdzIGEgdXJsIHRvIGEgbG9jYWwgZGlyZWN0b3J5CiAgICBpZiBpc19kaXJfdXJsKGxpbmspOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIobG9jYXRpb24pOgogICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGxpbmtfcGF0aCwgbG9jYXRpb24sIHN5bWxpbmtzPVRydWUpCiAgICAgICAgaWYgZG93bmxvYWRfZGlyOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnTGluayBpcyBhIGRpcmVjdG9yeSwgaWdub3JpbmcgZG93bmxvYWRfZGlyJykKICAgICAgICByZXR1cm4KCiAgICAjIElmIC0tcmVxdWlyZS1oYXNoZXMgaXMgb2ZmLCBgaGFzaGVzYCBpcyBlaXRoZXIgZW1wdHksIHRoZQogICAgIyBsaW5rJ3MgZW1iZWRkZWQgaGFzaCwgb3IgTWlzc2luZ0hhc2hlczsgaXQgaXMgcmVxdWlyZWQgdG8KICAgICMgbWF0Y2guIElmIC0tcmVxdWlyZS1oYXNoZXMgaXMgb24sIHdlIGFyZSBzYXRpc2ZpZWQgYnkgYW55CiAgICAjIGhhc2ggaW4gYGhhc2hlc2AgbWF0Y2hpbmc6IGEgVVJMLWJhc2VkIG9yIGFuIG9wdGlvbi1iYXNlZAogICAgIyBvbmU7IG5vIGludGVybmV0LXNvdXJjZWQgaGFzaCB3aWxsIGJlIGluIGBoYXNoZXNgLgogICAgaWYgaGFzaGVzOgogICAgICAgIGhhc2hlcy5jaGVja19hZ2FpbnN0X3BhdGgobGlua19wYXRoKQoKICAgICMgSWYgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkLCBpcyB0aGUgZmlsZSBhbHJlYWR5IHRoZXJlIGFuZCB2YWxpZD8KICAgIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoID0gTm9uZQogICAgaWYgZG93bmxvYWRfZGlyOgogICAgICAgIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoID0gX2NoZWNrX2Rvd25sb2FkX2RpcihsaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcykKCiAgICBpZiBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBmcm9tX3BhdGggPSBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aAogICAgZWxzZToKICAgICAgICBmcm9tX3BhdGggPSBsaW5rX3BhdGgKCiAgICBjb250ZW50X3R5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmcm9tX3BhdGgpWzBdCgogICAgIyB1bnBhY2sgdGhlIGFyY2hpdmUgdG8gdGhlIGJ1aWxkIGRpciBsb2NhdGlvbi4gZXZlbiB3aGVuIG9ubHkgZG93bmxvYWRpbmcKICAgICMgYXJjaGl2ZXMsIHRoZXkgaGF2ZSB0byBiZSB1bnBhY2tlZCB0byBwYXJzZSBkZXBlbmRlbmNpZXMKICAgIHVucGFja19maWxlKGZyb21fcGF0aCwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwgbGluaykKCiAgICAjIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZCBhbmQgbm90IGFscmVhZHkgZG93bmxvYWRlZAogICAgaWYgZG93bmxvYWRfZGlyIGFuZCBub3QgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgX2NvcHlfZmlsZShmcm9tX3BhdGgsIGRvd25sb2FkX2RpciwgbGluaykKCgpkZWYgX2NvcHlfZGlzdF9mcm9tX2RpcihsaW5rX3BhdGgsIGxvY2F0aW9uKToKICAgICIiIkNvcHkgZGlzdHJpYnV0aW9uIGZpbGVzIGluIGBsaW5rX3BhdGhgIHRvIGBsb2NhdGlvbmAuCgogICAgSW52b2tlZCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gaW5zdGFsbCBhIGxvY2FsIGRpcmVjdG9yeS4gRS5nLjoKCiAgICAgICAgcGlwIGluc3RhbGwgLgogICAgICAgIHBpcCBpbnN0YWxsIH4vZGV2L2dpdC1yZXBvcy9weXRob24tcHJvbXB0LXRvb2xraXQKCiAgICAiIiIKCiAgICAjIE5vdGU6IFRoaXMgaXMgY3VycmVudGx5IFZFUlkgU0xPVyBpZiB5b3UgaGF2ZSBhIGxvdCBvZiBkYXRhIGluIHRoZQogICAgIyBkaXJlY3RvcnksIGJlY2F1c2UgaXQgY29waWVzIGV2ZXJ5dGhpbmcgd2l0aCBgc2h1dGlsLmNvcHl0cmVlYC4KICAgICMgV2hhdCBpdCBzaG91bGQgcmVhbGx5IGRvIGlzIGJ1aWxkIGFuIHNkaXN0IGFuZCBpbnN0YWxsIHRoYXQuCiAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzIxOTUKCiAgICBpZiBvcy5wYXRoLmlzZGlyKGxvY2F0aW9uKToKICAgICAgICBybXRyZWUobG9jYXRpb24pCgogICAgIyBidWlsZCBhbiBzZGlzdAogICAgc2V0dXBfcHkgPSAnc2V0dXAucHknCiAgICBzZGlzdF9hcmdzID0gW3N5cy5leGVjdXRhYmxlXQogICAgc2Rpc3RfYXJncy5hcHBlbmQoJy1jJykKICAgIHNkaXN0X2FyZ3MuYXBwZW5kKFNFVFVQVE9PTFNfU0hJTSAlIHNldHVwX3B5KQogICAgc2Rpc3RfYXJncy5hcHBlbmQoJ3NkaXN0JykKICAgIHNkaXN0X2FyZ3MgKz0gWyctLWRpc3QtZGlyJywgbG9jYXRpb25dCiAgICBsb2dnZXIuaW5mbygnUnVubmluZyBzZXR1cC5weSBzZGlzdCBmb3IgJXMnLCBsaW5rX3BhdGgpCgogICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgY2FsbF9zdWJwcm9jZXNzKHNkaXN0X2FyZ3MsIGN3ZD1saW5rX3BhdGgsIHNob3dfc3Rkb3V0PUZhbHNlKQoKICAgICMgdW5wYWNrIHNkaXN0IGludG8gYGxvY2F0aW9uYAogICAgc2Rpc3QgPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIG9zLmxpc3RkaXIobG9jYXRpb24pWzBdKQogICAgbG9nZ2VyLmluZm8oJ1VucGFja2luZyBzZGlzdCAlcyBpbnRvICVzJywgc2Rpc3QsIGxvY2F0aW9uKQogICAgdW5wYWNrX2ZpbGUoc2Rpc3QsIGxvY2F0aW9uLCBjb250ZW50X3R5cGU9Tm9uZSwgbGluaz1Ob25lKQoKCmNsYXNzIFBpcFhtbHJwY1RyYW5zcG9ydCh4bWxycGNfY2xpZW50LlRyYW5zcG9ydCk6CiAgICAiIiJQcm92aWRlIGEgYHhtbHJwY2xpYi5UcmFuc3BvcnRgIGltcGxlbWVudGF0aW9uIHZpYSBhIGBQaXBTZXNzaW9uYAogICAgb2JqZWN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4X3VybCwgc2Vzc2lvbiwgdXNlX2RhdGV0aW1lPUZhbHNlKToKICAgICAgICB4bWxycGNfY2xpZW50LlRyYW5zcG9ydC5fX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWUpCiAgICAgICAgaW5kZXhfcGFydHMgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UoaW5kZXhfdXJsKQogICAgICAgIHNlbGYuX3NjaGVtZSA9IGluZGV4X3BhcnRzLnNjaGVtZQogICAgICAgIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgaG9zdCwgaGFuZGxlciwgcmVxdWVzdF9ib2R5LCB2ZXJib3NlPUZhbHNlKToKICAgICAgICBwYXJ0cyA9IChzZWxmLl9zY2hlbWUsIGhvc3QsIGhhbmRsZXIsIE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgdXJsID0gdXJsbGliX3BhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoZWFkZXJzID0geydDb250ZW50LVR5cGUnOiAndGV4dC94bWwnfQogICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX3Nlc3Npb24ucG9zdCh1cmwsIGRhdGE9cmVxdWVzdF9ib2R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsIHN0cmVhbT1UcnVlKQogICAgICAgICAgICByZXNwb25zZS5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9yZXNwb25zZShyZXNwb25zZS5yYXcpCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICJIVFRQIGVycm9yICVzIHdoaWxlIGdldHRpbmcgJXMiLAogICAgICAgICAgICAgICAgZXhjLnJlc3BvbnNlLnN0YXR1c19jb2RlLCB1cmwsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmFpc2UKCgpkZWYgdW5wYWNrX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgIG9ubHlfZG93bmxvYWQ9RmFsc2UsIHNlc3Npb249Tm9uZSwgaGFzaGVzPU5vbmUpOgogICAgIiIiVW5wYWNrIGxpbmsuCiAgICAgICBJZiBsaW5rIGlzIGEgVkNTIGxpbms6CiAgICAgICAgIGlmIG9ubHlfZG93bmxvYWQsIGV4cG9ydCBpbnRvIGRvd25sb2FkX2RpciBhbmQgaWdub3JlIGxvY2F0aW9uCiAgICAgICAgICBlbHNlIHVucGFjayBpbnRvIGxvY2F0aW9uCiAgICAgICBmb3Igb3RoZXIgdHlwZXMgb2YgbGluazoKICAgICAgICAgLSB1bnBhY2sgaW50byBsb2NhdGlvbgogICAgICAgICAtIGlmIGRvd25sb2FkX2RpciwgY29weSB0aGUgZmlsZSBpbnRvIGRvd25sb2FkX2RpcgogICAgICAgICAtIGlmIG9ubHlfZG93bmxvYWQsIG1hcmsgbG9jYXRpb24gZm9yIGRlbGV0aW9uCgogICAgOnBhcmFtIGhhc2hlczogQSBIYXNoZXMgb2JqZWN0LCBvbmUgb2Ygd2hvc2UgZW1iZWRkZWQgaGFzaGVzIG11c3QgbWF0Y2gsCiAgICAgICAgb3IgSGFzaE1pc21hdGNoIHdpbGwgYmUgcmFpc2VkLiBJZiB0aGUgSGFzaGVzIGlzIGVtcHR5LCBubyBtYXRjaGVzIGFyZQogICAgICAgIHJlcXVpcmVkLCBhbmQgdW5oYXNoYWJsZSB0eXBlcyBvZiByZXF1aXJlbWVudHMgKGxpa2UgVkNTIG9uZXMsIHdoaWNoCiAgICAgICAgd291bGQgb3JkaW5hcmlseSByYWlzZSBIYXNoVW5zdXBwb3J0ZWQpIGFyZSBhbGxvd2VkLgogICAgIiIiCiAgICAjIG5vbi1lZGl0YWJsZSB2Y3MgdXJscwogICAgaWYgaXNfdmNzX3VybChsaW5rKToKICAgICAgICB1bnBhY2tfdmNzX2xpbmsobGluaywgbG9jYXRpb24pCgogICAgIyBmaWxlIHVybHMKICAgIGVsaWYgaXNfZmlsZV91cmwobGluayk6CiAgICAgICAgdW5wYWNrX2ZpbGVfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXIsIGhhc2hlcz1oYXNoZXMpCgogICAgIyBodHRwIHVybHMKICAgIGVsc2U6CiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICBzZXNzaW9uID0gUGlwU2Vzc2lvbigpCgogICAgICAgIHVucGFja19odHRwX3VybCgKICAgICAgICAgICAgbGluaywKICAgICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICAgIGRvd25sb2FkX2RpciwKICAgICAgICAgICAgc2Vzc2lvbiwKICAgICAgICAgICAgaGFzaGVzPWhhc2hlcwogICAgICAgICkKICAgIGlmIG9ubHlfZG93bmxvYWQ6CiAgICAgICAgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlKGxvY2F0aW9uKQoKCmRlZiBfZG93bmxvYWRfaHR0cF91cmwobGluaywgc2Vzc2lvbiwgdGVtcF9kaXIsIGhhc2hlcyk6CiAgICAiIiJEb3dubG9hZCBsaW5rIHVybCBpbnRvIHRlbXBfZGlyIHVzaW5nIHByb3ZpZGVkIHNlc3Npb24iIiIKICAgIHRhcmdldF91cmwgPSBsaW5rLnVybC5zcGxpdCgnIycsIDEpWzBdCiAgICB0cnk6CiAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KAogICAgICAgICAgICB0YXJnZXRfdXJsLAogICAgICAgICAgICAjIFdlIHVzZSBBY2NlcHQtRW5jb2Rpbmc6IGlkZW50aXR5IGhlcmUgYmVjYXVzZSByZXF1ZXN0cwogICAgICAgICAgICAjIGRlZmF1bHRzIHRvIGFjY2VwdGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcy4gVGhpcyBicmVha3MgaW4KICAgICAgICAgICAgIyBhIHZhcmlldHkgb2Ygd2F5cyBkZXBlbmRpbmcgb24gaG93IHRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZC4KICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzbid0IGEgY29tcHJlc3NpYmxlCiAgICAgICAgICAgICMgICBmaWxlIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlIGFsb25lIGFuZCB3aXRoIGFuIGVtcHR5CiAgICAgICAgICAgICMgICBDb250ZW50LUVuY29kaW5nCiAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpcyBhbHJlYWR5CiAgICAgICAgICAgICMgICBjb21wcmVzc2VkIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlIGFsb25lIGFuZCB3aWxsIGFkZCBhCiAgICAgICAgICAgICMgICBDb250ZW50LUVuY29kaW5nOiBnemlwIGhlYWRlcgogICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdvbid0IG5vdGljZSBhbnl0aGluZyBhdCBhbGwgYW5kIHdpbGwgdGFrZQogICAgICAgICAgICAjICAgYSBmaWxlIHRoYXQncyBhbHJlYWR5IGJlZW4gY29tcHJlc3NlZCBhbmQgY29tcHJlc3MgaXQgYWdhaW4KICAgICAgICAgICAgIyAgIGFuZCBzZXQgdGhlIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAgaGVhZGVyCiAgICAgICAgICAgICMgQnkgc2V0dGluZyB0aGlzIHRvIHJlcXVlc3Qgb25seSB0aGUgaWRlbnRpdHkgZW5jb2RpbmcgV2UncmUKICAgICAgICAgICAgIyBob3BpbmcgdG8gZWxpbWluYXRlIHRoZSB0aGlyZCBjYXNlLiBIb3BlZnVsbHkgdGhlcmUgZG9lcyBub3QKICAgICAgICAgICAgIyBleGlzdCBhIHNlcnZlciB3aGljaCB3aGVuIGdpdmVuIGEgZmlsZSB3aWxsIG5vdGljZSBpdCBpcwogICAgICAgICAgICAjIGFscmVhZHkgY29tcHJlc3NlZCBhbmQgdGhhdCB5b3UncmUgbm90IGFza2luZyBmb3IgYQogICAgICAgICAgICAjIGNvbXByZXNzZWQgZmlsZSBhbmQgd2lsbCB0aGVuIGRlY29tcHJlc3MgaXQgYmVmb3JlIHNlbmRpbmcKICAgICAgICAgICAgIyBiZWNhdXNlIGlmIHRoYXQncyB0aGUgY2FzZSBJIGRvbid0IHRoaW5rIGl0J2xsIGV2ZXIgYmUKICAgICAgICAgICAgIyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgd29yay4KICAgICAgICAgICAgaGVhZGVycz17IkFjY2VwdC1FbmNvZGluZyI6ICJpZGVudGl0eSJ9LAogICAgICAgICAgICBzdHJlYW09VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgIGV4Y2VwdCByZXF1ZXN0cy5IVFRQRXJyb3IgYXMgZXhjOgogICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgIkhUVFAgZXJyb3IgJXMgd2hpbGUgZ2V0dGluZyAlcyIsIGV4Yy5yZXNwb25zZS5zdGF0dXNfY29kZSwgbGluaywKICAgICAgICApCiAgICAgICAgcmFpc2UKCiAgICBjb250ZW50X3R5cGUgPSByZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykKICAgIGZpbGVuYW1lID0gbGluay5maWxlbmFtZSAgIyBmYWxsYmFjawogICAgIyBIYXZlIGEgbG9vayBhdCB0aGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgZm9yIGEgYmV0dGVyIGd1ZXNzCiAgICBjb250ZW50X2Rpc3Bvc2l0aW9uID0gcmVzcC5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpCiAgICBpZiBjb250ZW50X2Rpc3Bvc2l0aW9uOgogICAgICAgIHR5cGUsIHBhcmFtcyA9IGNnaS5wYXJzZV9oZWFkZXIoY29udGVudF9kaXNwb3NpdGlvbikKICAgICAgICAjIFdlIHVzZSBgYG9yYGAgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIGFuICJlbXB0eSIgdmFsdWUKICAgICAgICAjIGZyb20gdGhlIGZpbGVuYW1lIHBhcmFtLgogICAgICAgIGZpbGVuYW1lID0gcGFyYW1zLmdldCgnZmlsZW5hbWUnKSBvciBmaWxlbmFtZQogICAgZXh0ID0gc3BsaXRleHQoZmlsZW5hbWUpWzFdCiAgICBpZiBub3QgZXh0OgogICAgICAgIGV4dCA9IG1pbWV0eXBlcy5ndWVzc19leHRlbnNpb24oY29udGVudF90eXBlKQogICAgICAgIGlmIGV4dDoKICAgICAgICAgICAgZmlsZW5hbWUgKz0gZXh0CiAgICBpZiBub3QgZXh0IGFuZCBsaW5rLnVybCAhPSByZXNwLnVybDoKICAgICAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHJlc3AudXJsKVsxXQogICAgICAgIGlmIGV4dDoKICAgICAgICAgICAgZmlsZW5hbWUgKz0gZXh0CiAgICBmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIGZpbGVuYW1lKQogICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3diJykgYXMgY29udGVudF9maWxlOgogICAgICAgIF9kb3dubG9hZF91cmwocmVzcCwgbGluaywgY29udGVudF9maWxlLCBoYXNoZXMpCiAgICByZXR1cm4gZmlsZV9wYXRoLCBjb250ZW50X3R5cGUKCgpkZWYgX2NoZWNrX2Rvd25sb2FkX2RpcihsaW5rLCBkb3dubG9hZF9kaXIsIGhhc2hlcyk6CiAgICAiIiIgQ2hlY2sgZG93bmxvYWRfZGlyIGZvciBwcmV2aW91c2x5IGRvd25sb2FkZWQgZmlsZSB3aXRoIGNvcnJlY3QgaGFzaAogICAgICAgIElmIGEgY29ycmVjdCBmaWxlIGlzIGZvdW5kIHJldHVybiBpdHMgcGF0aCBlbHNlIE5vbmUKICAgICIiIgogICAgZG93bmxvYWRfcGF0aCA9IG9zLnBhdGguam9pbihkb3dubG9hZF9kaXIsIGxpbmsuZmlsZW5hbWUpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhkb3dubG9hZF9wYXRoKToKICAgICAgICAjIElmIGFscmVhZHkgZG93bmxvYWRlZCwgZG9lcyBpdHMgaGFzaCBtYXRjaD8KICAgICAgICBsb2dnZXIuaW5mbygnRmlsZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkICVzJywgZG93bmxvYWRfcGF0aCkKICAgICAgICBpZiBoYXNoZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGhhc2hlcy5jaGVja19hZ2FpbnN0X3BhdGgoZG93bmxvYWRfcGF0aCkKICAgICAgICAgICAgZXhjZXB0IEhhc2hNaXNtYXRjaDoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdQcmV2aW91c2x5LWRvd25sb2FkZWQgZmlsZSAlcyBoYXMgYmFkIGhhc2guICcKICAgICAgICAgICAgICAgICAgICAnUmUtZG93bmxvYWRpbmcuJywKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9wYXRoCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvcy51bmxpbmsoZG93bmxvYWRfcGF0aCkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGRvd25sb2FkX3BhdGgKICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEAvnqWmLkfAAC5HwAAIQAAAHB5cGlfX3BpcF85XzBfMy9waXAvZXhjZXB0aW9ucy5weSIiIkV4Y2VwdGlvbnMgdXNlZCB0aHJvdWdob3V0IHBhY2thZ2UiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgZ3JvdXBieSwgcmVwZWF0Cgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgaXRlcml0ZW1zCgoKY2xhc3MgUGlwRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkJhc2UgcGlwIGV4Y2VwdGlvbiIiIgoKCmNsYXNzIEluc3RhbGxhdGlvbkVycm9yKFBpcEVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGR1cmluZyBpbnN0YWxsYXRpb24iIiIKCgpjbGFzcyBVbmluc3RhbGxhdGlvbkVycm9yKFBpcEVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGR1cmluZyB1bmluc3RhbGxhdGlvbiIiIgoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGEgZGlzdHJpYnV0aW9uIGNhbm5vdCBiZSBmb3VuZCB0byBzYXRpc2Z5IGEgcmVxdWlyZW1lbnQiIiIKCgpjbGFzcyBSZXF1aXJlbWVudHNGaWxlUGFyc2VFcnJvcihJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIGdlbmVyYWwgZXJyb3Igb2NjdXJzIHBhcnNpbmcgYSByZXF1aXJlbWVudHMgZmlsZSBsaW5lLiIiIgoKCmNsYXNzIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZChQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGUgbW9zdCB1cC10by1kYXRlIHZlcnNpb24gb2YgYSBwYWNrYWdlIGlzIGFscmVhZHkKICAgIGluc3RhbGxlZC4iIiIKCgpjbGFzcyBCYWRDb21tYW5kKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHZpcnR1YWxlbnYgb3IgYSBjb21tYW5kIGlzIG5vdCBmb3VuZCIiIgoKCmNsYXNzIENvbW1hbmRFcnJvcihQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIiIiCgoKY2xhc3MgUHJldmlvdXNCdWlsZERpckVycm9yKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZXJlJ3MgYSBwcmV2aW91cyBjb25mbGljdGluZyBidWlsZCBkaXJlY3RvcnkiIiIKCgpjbGFzcyBJbnZhbGlkV2hlZWxGaWxlbmFtZShJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJJbnZhbGlkIHdoZWVsIGZpbGVuYW1lLiIiIgoKCmNsYXNzIFVuc3VwcG9ydGVkV2hlZWwoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiVW5zdXBwb3J0ZWQgd2hlZWwuIiIiCgoKY2xhc3MgSGFzaEVycm9ycyhJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJNdWx0aXBsZSBIYXNoRXJyb3IgaW5zdGFuY2VzIHJvbGxlZCBpbnRvIG9uZSBmb3IgcmVwb3J0aW5nIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICBkZWYgYXBwZW5kKHNlbGYsIGVycm9yKToKICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoZXJyb3IpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIHNlbGYuZXJyb3JzLnNvcnQoa2V5PWxhbWJkYSBlOiBlLm9yZGVyKQogICAgICAgIGZvciBjbHMsIGVycm9yc19vZl9jbHMgaW4gZ3JvdXBieShzZWxmLmVycm9ycywgbGFtYmRhIGU6IGUuX19jbGFzc19fKToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGNscy5oZWFkKQogICAgICAgICAgICBsaW5lcy5leHRlbmQoZS5ib2R5KCkgZm9yIGUgaW4gZXJyb3JzX29mX2NscykKICAgICAgICBpZiBsaW5lczoKICAgICAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKCiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5lcnJvcnMpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fbm9uemVyb19fKCkKCgpjbGFzcyBIYXNoRXJyb3IoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBIGZhaWx1cmUgdG8gdmVyaWZ5IGEgcGFja2FnZSBhZ2FpbnN0IGtub3duLWdvb2QgaGFzaGVzCgogICAgOmN2YXIgb3JkZXI6IEFuIGludCBzb3J0aW5nIGhhc2ggZXhjZXB0aW9uIGNsYXNzZXMgYnkgZGlmZmljdWx0eSBvZgogICAgICAgIHJlY292ZXJ5IChsb3dlciBiZWluZyBoYXJkZXIpLCBzbyB0aGUgdXNlciBkb2Vzbid0IGJvdGhlciBmcmV0dGluZwogICAgICAgIGFib3V0IHVucGlubmVkIHBhY2thZ2VzIHdoZW4gaGUgaGFzIGRlZXBlciBpc3N1ZXMsIGxpa2UgVkNTCiAgICAgICAgZGVwZW5kZW5jaWVzLCB0byBkZWFsIHdpdGguIEFsc28ga2VlcHMgZXJyb3IgcmVwb3J0cyBpbiBhCiAgICAgICAgZGV0ZXJtaW5pc3RpYyBvcmRlci4KICAgIDpjdmFyIGhlYWQ6IEEgc2VjdGlvbiBoZWFkaW5nIGZvciBkaXNwbGF5IGFib3ZlIHBvdGVudGlhbGx5IG1hbnkKICAgICAgICBleGNlcHRpb25zIG9mIHRoaXMga2luZAogICAgOml2YXIgcmVxOiBUaGUgSW5zdGFsbFJlcXVpcmVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXJyb3IuIFRoaXMgaXMKICAgICAgICBwYXN0ZWQgb24gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBpbnN0YW50aWF0ZWQsIGJlY2F1c2UgaXQncyBub3QKICAgICAgICB0eXBpY2FsbHkgYXZhaWxhYmxlIGVhcmxpZXIuCgogICAgIiIiCiAgICByZXEgPSBOb25lCiAgICBoZWFkID0gJycKCiAgICBkZWYgYm9keShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBzdW1tYXJ5IG9mIG1lIGZvciBkaXNwbGF5IHVuZGVyIHRoZSBoZWFkaW5nLgoKICAgICAgICBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHByaW50cyBhIGRlc2NyaXB0aW9uIG9mIHRoZQogICAgICAgIHRyaWdnZXJpbmcgcmVxdWlyZW1lbnQuCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSBJbnN0YWxsUmVxdWlyZW1lbnQgdGhhdCBwcm92b2tlZCB0aGlzIGVycm9yLCB3aXRoCiAgICAgICAgICAgIHBvcHVsYXRlX2xpbmsoKSBoYXZpbmcgYWxyZWFkeSBiZWVuIGNhbGxlZAoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJyAgICAlcycgJSBzZWxmLl9yZXF1aXJlbWVudF9uYW1lKCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzXG4lcycgJSAoc2VsZi5oZWFkLCBzZWxmLmJvZHkoKSkKCiAgICBkZWYgX3JlcXVpcmVtZW50X25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgdHJpZ2dlcmVkIG1lLgoKICAgICAgICBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSByZXEsIHdpdGgKICAgICAgICBsaW5lIG51bWJlcnMKCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnJlcSkgaWYgc2VsZi5yZXEgZWxzZSAndW5rbm93biBwYWNrYWdlJwoKCmNsYXNzIFZjc0hhc2hVbnN1cHBvcnRlZChIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBwcm92aWRlZCBmb3IgYSB2ZXJzaW9uLWNvbnRyb2wtc3lzdGVtLWJhc2VkIHJlcXVpcmVtZW50LCBidXQKICAgIHdlIGRvbid0IGhhdmUgYSBtZXRob2QgZm9yIGhhc2hpbmcgdGhvc2UuIiIiCgogICAgb3JkZXIgPSAwCiAgICBoZWFkID0gKCJDYW4ndCB2ZXJpZnkgaGFzaGVzIGZvciB0aGVzZSByZXF1aXJlbWVudHMgYmVjYXVzZSB3ZSBkb24ndCAiCiAgICAgICAgICAgICJoYXZlIGEgd2F5IHRvIGhhc2ggdmVyc2lvbiBjb250cm9sIHJlcG9zaXRvcmllczoiKQoKCmNsYXNzIERpcmVjdG9yeVVybEhhc2hVbnN1cHBvcnRlZChIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBwcm92aWRlZCBmb3IgYSB2ZXJzaW9uLWNvbnRyb2wtc3lzdGVtLWJhc2VkIHJlcXVpcmVtZW50LCBidXQKICAgIHdlIGRvbid0IGhhdmUgYSBtZXRob2QgZm9yIGhhc2hpbmcgdGhvc2UuIiIiCgogICAgb3JkZXIgPSAxCiAgICBoZWFkID0gKCJDYW4ndCB2ZXJpZnkgaGFzaGVzIGZvciB0aGVzZSBmaWxlOi8vIHJlcXVpcmVtZW50cyBiZWNhdXNlIHRoZXkgIgogICAgICAgICAgICAicG9pbnQgdG8gZGlyZWN0b3JpZXM6IikKCgpjbGFzcyBIYXNoTWlzc2luZyhIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBuZWVkZWQgZm9yIGEgcmVxdWlyZW1lbnQgYnV0IGlzIGFic2VudC4iIiIKCiAgICBvcmRlciA9IDIKICAgIGhlYWQgPSAoJ0hhc2hlcyBhcmUgcmVxdWlyZWQgaW4gLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBidXQgdGhleSBhcmUgJwogICAgICAgICAgICAnbWlzc2luZyBmcm9tIHNvbWUgcmVxdWlyZW1lbnRzLiBIZXJlIGlzIGEgbGlzdCBvZiB0aG9zZSAnCiAgICAgICAgICAgICdyZXF1aXJlbWVudHMgYWxvbmcgd2l0aCB0aGUgaGFzaGVzIHRoZWlyIGRvd25sb2FkZWQgYXJjaGl2ZXMgJwogICAgICAgICAgICAnYWN0dWFsbHkgaGFkLiBBZGQgbGluZXMgbGlrZSB0aGVzZSB0byB5b3VyIHJlcXVpcmVtZW50cyBmaWxlcyB0byAnCiAgICAgICAgICAgICdwcmV2ZW50IHRhbXBlcmluZy4gKElmIHlvdSBkaWQgbm90IGVuYWJsZSAtLXJlcXVpcmUtaGFzaGVzICcKICAgICAgICAgICAgJ21hbnVhbGx5LCBub3RlIHRoYXQgaXQgdHVybnMgb24gYXV0b21hdGljYWxseSB3aGVuIGFueSBwYWNrYWdlICcKICAgICAgICAgICAgJ2hhcyBhIGhhc2guKScpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGdvdHRlbl9oYXNoKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gZ290dGVuX2hhc2g6IFRoZSBoYXNoIG9mIHRoZSAocG9zc2libHkgbWFsaWNpb3VzKSBhcmNoaXZlIHdlCiAgICAgICAgICAgIGp1c3QgZG93bmxvYWRlZAogICAgICAgICIiIgogICAgICAgIHNlbGYuZ290dGVuX2hhc2ggPSBnb3R0ZW5faGFzaAoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgIGZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgRkFWT1JJVEVfSEFTSCAgIyBEb2RnZSBjaXJjdWxhciBpbXBvcnQuCgogICAgICAgIHBhY2thZ2UgPSBOb25lCiAgICAgICAgaWYgc2VsZi5yZXE6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgVVJMLWJhc2VkIHJlcXVpcmVtZW50cywgZGlzcGxheSB0aGUgb3JpZ2luYWwgVVJMCiAgICAgICAgICAgICMgc2VlbiBpbiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUgcmF0aGVyIHRoYW4gdGhlIHBhY2thZ2UgbmFtZSwKICAgICAgICAgICAgIyBzbyB0aGUgb3V0cHV0IGNhbiBiZSBkaXJlY3RseSBjb3BpZWQgaW50byB0aGUgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICAgICAgICAgIHBhY2thZ2UgPSAoc2VsZi5yZXEub3JpZ2luYWxfbGluayBpZiBzZWxmLnJlcS5vcmlnaW5hbF9saW5rCiAgICAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIHNvbWVvbmUgZmVlZHMgc29tZXRoaW5nIGRvd25yaWdodCBzdHVwaWQKICAgICAgICAgICAgICAgICAgICAgICAjIHRvIEluc3RhbGxSZXF1aXJlbWVudCdzIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZ2V0YXR0cihzZWxmLnJlcSwgJ3JlcScsIE5vbmUpKQogICAgICAgIHJldHVybiAnICAgICVzIC0taGFzaD0lczolcycgJSAocGFja2FnZSBvciAndW5rbm93biBwYWNrYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVk9SSVRFX0hBU0gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdvdHRlbl9oYXNoKQoKCmNsYXNzIEhhc2hVbnBpbm5lZChIYXNoRXJyb3IpOgogICAgIiIiQSByZXF1aXJlbWVudCBoYWQgYSBoYXNoIHNwZWNpZmllZCBidXQgd2FzIG5vdCBwaW5uZWQgdG8gYSBzcGVjaWZpYwogICAgdmVyc2lvbi4iIiIKCiAgICBvcmRlciA9IDMKICAgIGhlYWQgPSAoJ0luIC0tcmVxdWlyZS1oYXNoZXMgbW9kZSwgYWxsIHJlcXVpcmVtZW50cyBtdXN0IGhhdmUgdGhlaXIgJwogICAgICAgICAgICAndmVyc2lvbnMgcGlubmVkIHdpdGggPT0uIFRoZXNlIGRvIG5vdDonKQoKCmNsYXNzIEhhc2hNaXNtYXRjaChIYXNoRXJyb3IpOgogICAgIiIiCiAgICBEaXN0cmlidXRpb24gZmlsZSBoYXNoIHZhbHVlcyBkb24ndCBtYXRjaC4KCiAgICA6aXZhciBwYWNrYWdlX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYXNoCiAgICAgICAgbWlzbWF0Y2guIEZlZWwgZnJlZSB0byB3cml0ZSB0byB0aGlzIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgcmFpc2UgdG8KICAgICAgICBpbXByb3ZlIGl0cyBlcnJvciBtZXNzYWdlLgoKICAgICIiIgogICAgb3JkZXIgPSA0CiAgICBoZWFkID0gKCdUSEVTRSBQQUNLQUdFUyBETyBOT1QgTUFUQ0ggVEhFIEhBU0hFUyBGUk9NIFRIRSBSRVFVSVJFTUVOVFMgJwogICAgICAgICAgICAnRklMRS4gSWYgeW91IGhhdmUgdXBkYXRlZCB0aGUgcGFja2FnZSB2ZXJzaW9ucywgcGxlYXNlIHVwZGF0ZSAnCiAgICAgICAgICAgICd0aGUgaGFzaGVzLiBPdGhlcndpc2UsIGV4YW1pbmUgdGhlIHBhY2thZ2UgY29udGVudHMgY2FyZWZ1bGx5OyAnCiAgICAgICAgICAgICdzb21lb25lIG1heSBoYXZlIHRhbXBlcmVkIHdpdGggdGhlbS4nKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd2VkLCBnb3RzKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gYWxsb3dlZDogQSBkaWN0IG9mIGFsZ29yaXRobSBuYW1lcyBwb2ludGluZyB0byBsaXN0cyBvZiBhbGxvd2VkCiAgICAgICAgICAgIGhleCBkaWdlc3RzCiAgICAgICAgOnBhcmFtIGdvdHM6IEEgZGljdCBvZiBhbGdvcml0aG0gbmFtZXMgcG9pbnRpbmcgdG8gaGFzaGVzIHdlCiAgICAgICAgICAgIGFjdHVhbGx5IGdvdCBmcm9tIHRoZSBmaWxlcyB1bmRlciBzdXNwaWNpb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLmFsbG93ZWQgPSBhbGxvd2VkCiAgICAgICAgc2VsZi5nb3RzID0gZ290cwoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgIHJldHVybiAnICAgICVzOlxuJXMnICUgKHNlbGYuX3JlcXVpcmVtZW50X25hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoX2NvbXBhcmlzb24oKSkKCiAgICBkZWYgX2hhc2hfY29tcGFyaXNvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb21wYXJpc29uIG9mIGFjdHVhbCBhbmQgZXhwZWN0ZWQgaGFzaCB2YWx1ZXMuCgogICAgICAgIEV4YW1wbGU6OgoKICAgICAgICAgICAgICAgRXhwZWN0ZWQgc2hhMjU2IGFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgMTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1CiAgICAgICAgICAgICAgICAgICAgR290ICAgICAgICBiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWYKCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGhhc2hfdGhlbl9vcihoYXNoX25hbWUpOgogICAgICAgICAgICAjIEZvciBub3csIGFsbCB0aGUgZGVjZW50IGhhc2hlcyBoYXZlIDYtY2hhciBuYW1lcywgc28gd2UgY2FuIGdldAogICAgICAgICAgICAjIGF3YXkgd2l0aCBoYXJkLWNvZGluZyBzcGFjZSBsaXRlcmFscy4KICAgICAgICAgICAgcmV0dXJuIGNoYWluKFtoYXNoX25hbWVdLCByZXBlYXQoJyAgICBvcicpKQoKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGhhc2hfbmFtZSwgZXhwZWN0ZWRzIGluIGl0ZXJpdGVtcyhzZWxmLmFsbG93ZWQpOgogICAgICAgICAgICBwcmVmaXggPSBoYXNoX3RoZW5fb3IoaGFzaF9uYW1lKQogICAgICAgICAgICBsaW5lcy5leHRlbmQoKCcgICAgICAgIEV4cGVjdGVkICVzICVzJyAlIChuZXh0KHByZWZpeCksIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGUgaW4gZXhwZWN0ZWRzKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAgICAgICAgICBHb3QgICAgICAgICVzXG4nICUKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ290c1toYXNoX25hbWVdLmhleGRpZ2VzdCgpKQogICAgICAgICAgICBwcmVmaXggPSAnICAgIG9yJwogICAgICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCgoKY2xhc3MgVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlVuc3VwcG9ydGVkIHB5dGhvbiB2ZXJzaW9uIGFjY29yZGluZyB0byBSZXF1aXJlcy1QeXRob24gcGFja2FnZQogICAgbWV0YWRhdGEuIiIiClBLAwQUAAAAAAAAACEANvgl/w6cAAAOnAAAHAAAAHB5cGlfX3BpcF85XzBfMy9waXAvaW5kZXgucHkiIiJSb3V0aW5lcyByZWxhdGVkIHRvIFB5UEksIGluZGV4ZXMiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBjZ2kKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgbWltZXR5cGVzCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgaXBhZGRyZXNzCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBjYWNoZWRfcHJvcGVydHksIHNwbGl0ZXh0LCBub3JtYWxpemVfcGF0aCwKICAgIEFSQ0hJVkVfRVhURU5TSU9OUywgU1VQUE9SVEVEX0VYVEVOU0lPTlMsCikKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnBhY2thZ2luZyBpbXBvcnQgY2hlY2tfcmVxdWlyZXNfcHl0aG9uCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQsIEludmFsaWRXaGVlbEZpbGVuYW1lLAogICAgVW5zdXBwb3J0ZWRXaGVlbCwKKQpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgSEFTX1RMUywgaXNfdXJsLCBwYXRoX3RvX3VybCwgdXJsX3RvX3BhdGgKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsLCB3aGVlbF9leHQKZnJvbSBwaXAucGVwNDI1dGFncyBpbXBvcnQgZ2V0X3N1cHBvcnRlZApmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBodG1sNWxpYiwgcmVxdWVzdHMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmV4Y2VwdGlvbnMgaW1wb3J0IFNTTEVycm9yCmZyb20gcGlwLl92ZW5kb3IuZGlzdGxpYi5jb21wYXQgaW1wb3J0IHVuZXNjYXBlCgoKX19hbGxfXyA9IFsnRm9ybWF0Q29udHJvbCcsICdmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZScsICdQYWNrYWdlRmluZGVyJ10KCgpTRUNVUkVfT1JJR0lOUyA9IFsKICAgICMgcHJvdG9jb2wsIGhvc3RuYW1lLCBwb3J0CiAgICAjIFRha2VuIGZyb20gQ2hyb21lJ3MgbGlzdCBvZiBzZWN1cmUgb3JpZ2lucyAoU2VlOiBodHRwOi8vYml0Lmx5LzFxcnlTS0MpCiAgICAoImh0dHBzIiwgIioiLCAiKiIpLAogICAgKCIqIiwgImxvY2FsaG9zdCIsICIqIiksCiAgICAoIioiLCAiMTI3LjAuMC4wLzgiLCAiKiIpLAogICAgKCIqIiwgIjo6MS8xMjgiLCAiKiIpLAogICAgKCJmaWxlIiwgIioiLCBOb25lKSwKICAgICMgc3NoIGlzIGFsd2F5cyBzZWN1cmUuCiAgICAoInNzaCIsICIqIiwgIioiKSwKXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEluc3RhbGxhdGlvbkNhbmRpZGF0ZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0LCB2ZXJzaW9uLCBsb2NhdGlvbik6CiAgICAgICAgc2VsZi5wcm9qZWN0ID0gcHJvamVjdAogICAgICAgIHNlbGYudmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLl9rZXkgPSAoc2VsZi5wcm9qZWN0LCBzZWxmLnZlcnNpb24sIHNlbGYubG9jYXRpb24pCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPEluc3RhbGxhdGlvbkNhbmRpZGF0ZSh7MCFyfSwgezEhcn0sIHsyIXJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5wcm9qZWN0LCBzZWxmLnZlcnNpb24sIHNlbGYubG9jYXRpb24sCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSW5zdGFsbGF0aW9uQ2FuZGlkYXRlKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIFBhY2thZ2VGaW5kZXIob2JqZWN0KToKICAgICIiIlRoaXMgZmluZHMgcGFja2FnZXMuCgogICAgVGhpcyBpcyBtZWFudCB0byBtYXRjaCBlYXN5X2luc3RhbGwncyB0ZWNobmlxdWUgZm9yIGxvb2tpbmcgZm9yCiAgICBwYWNrYWdlcywgYnkgcmVhZGluZyBwYWdlcyBhbmQgbG9va2luZyBmb3IgYXBwcm9wcmlhdGUgbGlua3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmluZF9saW5rcywgaW5kZXhfdXJscywgYWxsb3dfYWxsX3ByZXJlbGVhc2VzPUZhbHNlLAogICAgICAgICAgICAgICAgIHRydXN0ZWRfaG9zdHM9Tm9uZSwgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzPUZhbHNlLAogICAgICAgICAgICAgICAgIHNlc3Npb249Tm9uZSwgZm9ybWF0X2NvbnRyb2w9Tm9uZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICB2ZXJzaW9ucz1Ob25lLCBhYmk9Tm9uZSwgaW1wbGVtZW50YXRpb249Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgUGFja2FnZUZpbmRlci4KCiAgICAgICAgOnBhcmFtIGZvcm1hdF9jb250cm9sOiBBIEZvcm1hdENvbnRyb2wgb2JqZWN0IG9yIE5vbmUuIFVzZWQgdG8gY29udHJvbAogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIG9mIHNvdXJjZSBwYWNrYWdlcyAvIGJpbmFyeSBwYWNrYWdlcyB3aGVuIGNvbnN1bHRpbmcKICAgICAgICAgICAgdGhlIGluZGV4IGFuZCBsaW5rcy4KICAgICAgICA6cGFyYW0gcGxhdGZvcm06IEEgc3RyaW5nIG9yIE5vbmUuIElmIE5vbmUsIHNlYXJjaGVzIGZvciBwYWNrYWdlcwogICAgICAgICAgICB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3lzdGVtLiBPdGhlcndpc2UsIHdpbGwgZmluZAogICAgICAgICAgICBwYWNrYWdlcyB0aGF0IGNhbiBiZSBidWlsdCBvbiB0aGUgcGxhdGZvcm0gcGFzc2VkIGluLiBUaGVzZQogICAgICAgICAgICBwYWNrYWdlcyB3aWxsIG9ubHkgYmUgZG93bmxvYWRlZCBmb3IgZGlzdHJpYnV0aW9uOiB0aGV5IHdpbGwKICAgICAgICAgICAgbm90IGJlIGJ1aWx0IGxvY2FsbHkuCiAgICAgICAgOnBhcmFtIHZlcnNpb25zOiBBIGxpc3Qgb2Ygc3RyaW5ncyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgIDpwYXJhbSBhYmk6IEEgc3RyaW5nIG9yIE5vbmUuIFRoaXMgaXMgcGFzc2VkIGRpcmVjdGx5CiAgICAgICAgICAgIHRvIHBlcDQyNXRhZ3MucHkgaW4gdGhlIGdldF9zdXBwb3J0ZWQoKSBtZXRob2QuCiAgICAgICAgOnBhcmFtIGltcGxlbWVudGF0aW9uOiBBIHN0cmluZyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgICIiIgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgIlBhY2thZ2VGaW5kZXIoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICAgICAgKQoKICAgICAgICAjIEJ1aWxkIGZpbmRfbGlua3MuIElmIGFuIGFyZ3VtZW50IHN0YXJ0cyB3aXRoIH4sIGl0IG1heSBiZQogICAgICAgICMgYSBsb2NhbCBmaWxlIHJlbGF0aXZlIHRvIGEgaG9tZSBkaXJlY3RvcnkuIFNvIHRyeSBub3JtYWxpemluZwogICAgICAgICMgaXQgYW5kIGlmIGl0IGV4aXN0cywgdXNlIHRoZSBub3JtYWxpemVkIHZlcnNpb24uCiAgICAgICAgIyBUaGlzIGlzIGRlbGliZXJhdGVseSBjb25zZXJ2YXRpdmUgLSBpdCBtaWdodCBiZSBmaW5lIGp1c3QgdG8KICAgICAgICAjIGJsaW5kbHkgbm9ybWFsaXplIGFueXRoaW5nIHN0YXJ0aW5nIHdpdGggYSB+Li4uCiAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KICAgICAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgICAgICBpZiBsaW5rLnN0YXJ0c3dpdGgoJ34nKToKICAgICAgICAgICAgICAgIG5ld19saW5rID0gbm9ybWFsaXplX3BhdGgobGluaykKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld19saW5rKToKICAgICAgICAgICAgICAgICAgICBsaW5rID0gbmV3X2xpbmsKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzLmFwcGVuZChsaW5rKQoKICAgICAgICBzZWxmLmluZGV4X3VybHMgPSBpbmRleF91cmxzCiAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gW10KCiAgICAgICAgIyBUaGVzZSBhcmUgYm9yaW5nIGxpbmtzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9nZ2VkIHNvbWVob3c6CiAgICAgICAgc2VsZi5sb2dnZWRfbGlua3MgPSBzZXQoKQoKICAgICAgICBzZWxmLmZvcm1hdF9jb250cm9sID0gZm9ybWF0X2NvbnRyb2wgb3IgRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCgogICAgICAgICMgRG9tYWlucyB0aGF0IHdlIHdvbid0IGVtaXQgd2FybmluZ3MgZm9yIHdoZW4gbm90IHVzaW5nIEhUVFBTCiAgICAgICAgc2VsZi5zZWN1cmVfb3JpZ2lucyA9IFsKICAgICAgICAgICAgKCIqIiwgaG9zdCwgIioiKQogICAgICAgICAgICBmb3IgaG9zdCBpbiAodHJ1c3RlZF9ob3N0cyBpZiB0cnVzdGVkX2hvc3RzIGVsc2UgW10pCiAgICAgICAgXQoKICAgICAgICAjIERvIHdlIHdhbnQgdG8gYWxsb3cgX2FsbF8gcHJlLXJlbGVhc2VzPwogICAgICAgIHNlbGYuYWxsb3dfYWxsX3ByZXJlbGVhc2VzID0gYWxsb3dfYWxsX3ByZXJlbGVhc2VzCgogICAgICAgICMgRG8gd2UgcHJvY2VzcyBkZXBlbmRlbmN5IGxpbmtzPwogICAgICAgIHNlbGYucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzID0gcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzCgogICAgICAgICMgVGhlIFNlc3Npb24gd2UnbGwgdXNlIHRvIG1ha2UgcmVxdWVzdHMKICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCgogICAgICAgICMgVGhlIHZhbGlkIHRhZ3MgdG8gY2hlY2sgcG90ZW50aWFsIGZvdW5kIHdoZWVsIGNhbmRpZGF0ZXMgYWdhaW5zdAogICAgICAgIHNlbGYudmFsaWRfdGFncyA9IGdldF9zdXBwb3J0ZWQoCiAgICAgICAgICAgIHZlcnNpb25zPXZlcnNpb25zLAogICAgICAgICAgICBwbGF0Zm9ybT1wbGF0Zm9ybSwKICAgICAgICAgICAgYWJpPWFiaSwKICAgICAgICAgICAgaW1wbD1pbXBsZW1lbnRhdGlvbiwKICAgICAgICApCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBUTFMgZW5hYmxlZCwgdGhlbiBXQVJOIGlmIGFueXBsYWNlIHdlJ3JlIGxvb2tpbmcKICAgICAgICAjIHJlbGllcyBvbiBUTFMuCiAgICAgICAgaWYgbm90IEhBU19UTFM6CiAgICAgICAgICAgIGZvciBsaW5rIGluIGl0ZXJ0b29scy5jaGFpbihzZWxmLmluZGV4X3VybHMsIHNlbGYuZmluZF9saW5rcyk6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UobGluaykKICAgICAgICAgICAgICAgIGlmIHBhcnNlZC5zY2hlbWUgPT0gImh0dHBzIjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgInBpcCBpcyBjb25maWd1cmVkIHdpdGggbG9jYXRpb25zIHRoYXQgcmVxdWlyZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUTFMvU1NMLCBob3dldmVyIHRoZSBzc2wgbW9kdWxlIGluIFB5dGhvbiBpcyBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAiYXZhaWxhYmxlLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgYWRkX2RlcGVuZGVuY3lfbGlua3Moc2VsZiwgbGlua3MpOgogICAgICAgICMgIyBGSVhNRTogdGhpcyBzaG91bGRuJ3QgYmUgZ2xvYmFsIGxpc3QgdGhpcywgaXQgc2hvdWxkIG9ubHkKICAgICAgICAjICMgYXBwbHkgdG8gcmVxdWlyZW1lbnRzIG9mIHRoZSBwYWNrYWdlIHRoYXQgc3BlY2lmaWVzIHRoZQogICAgICAgICMgIyBkZXBlbmRlbmN5X2xpbmtzIHZhbHVlCiAgICAgICAgIyAjIEZJWE1FOiBhbHNvLCB3ZSBzaG91bGQgdHJhY2sgY29tZXNfZnJvbSAoaS5lLiwgdXNlIExpbmspCiAgICAgICAgaWYgc2VsZi5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSBMaW5rcyBwcm9jZXNzaW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgIgogICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcy5leHRlbmQobGlua3MpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zb3J0X2xvY2F0aW9ucyhsb2NhdGlvbnMsIGV4cGFuZF9kaXI9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFNvcnQgbG9jYXRpb25zIGludG8gImZpbGVzIiAoYXJjaGl2ZXMpIGFuZCAidXJscyIsIGFuZCByZXR1cm4KICAgICAgICBhIHBhaXIgb2YgbGlzdHMgKGZpbGVzLHVybHMpCiAgICAgICAgIiIiCiAgICAgICAgZmlsZXMgPSBbXQogICAgICAgIHVybHMgPSBbXQoKICAgICAgICAjIHB1dHMgdGhlIHVybCBmb3IgdGhlIGdpdmVuIGZpbGUgcGF0aCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0CiAgICAgICAgZGVmIHNvcnRfcGF0aChwYXRoKToKICAgICAgICAgICAgdXJsID0gcGF0aF90b191cmwocGF0aCkKICAgICAgICAgICAgaWYgbWltZXR5cGVzLmd1ZXNzX3R5cGUodXJsLCBzdHJpY3Q9RmFsc2UpWzBdID09ICd0ZXh0L2h0bWwnOgogICAgICAgICAgICAgICAgdXJscy5hcHBlbmQodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHVybCkKCiAgICAgICAgZm9yIHVybCBpbiBsb2NhdGlvbnM6CgogICAgICAgICAgICBpc19sb2NhbF9wYXRoID0gb3MucGF0aC5leGlzdHModXJsKQogICAgICAgICAgICBpc19maWxlX3VybCA9IHVybC5zdGFydHN3aXRoKCdmaWxlOicpCgogICAgICAgICAgICBpZiBpc19sb2NhbF9wYXRoIG9yIGlzX2ZpbGVfdXJsOgogICAgICAgICAgICAgICAgaWYgaXNfbG9jYWxfcGF0aDoKICAgICAgICAgICAgICAgICAgICBwYXRoID0gdXJsCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxfdG9fcGF0aCh1cmwpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIGV4cGFuZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X3BhdGgob3MucGF0aC5qb2luKHBhdGgsIGl0ZW0pKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZmlsZV91cmw6CiAgICAgICAgICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHVybCkKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgc29ydF9wYXRoKHBhdGgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAiVXJsICclcycgaXMgaWdub3JlZDogaXQgaXMgbmVpdGhlciBhIGZpbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAibm9yIGEgZGlyZWN0b3J5LiIsIHVybCkKICAgICAgICAgICAgZWxpZiBpc191cmwodXJsKToKICAgICAgICAgICAgICAgICMgT25seSBhZGQgdXJsIHdpdGggY2xlYXIgc2NoZW1lCiAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiVXJsICclcycgaXMgaWdub3JlZC4gSXQgaXMgZWl0aGVyIGEgbm9uLWV4aXN0aW5nICIKICAgICAgICAgICAgICAgICAgICAicGF0aCBvciBsYWNrcyBhIHNwZWNpZmljIHNjaGVtZS4iLCB1cmwpCgogICAgICAgIHJldHVybiBmaWxlcywgdXJscwoKICAgIGRlZiBfY2FuZGlkYXRlX3NvcnRfa2V5KHNlbGYsIGNhbmRpZGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgRnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSBsaW5rIHNvcnQga2V5IGZvciBsaW5rIHR1cGxlcy4KICAgICAgICBUaGUgZ3JlYXRlciB0aGUgcmV0dXJuIHZhbHVlLCB0aGUgbW9yZSBwcmVmZXJyZWQgaXQgaXMuCiAgICAgICAgSWYgbm90IGZpbmRpbmcgd2hlZWxzLCB0aGVuIHNvcnRlZCBieSB2ZXJzaW9uIG9ubHkuCiAgICAgICAgSWYgZmluZGluZyB3aGVlbHMsIHRoZW4gdGhlIHNvcnQgb3JkZXIgaXMgYnkgdmVyc2lvbiwgdGhlbjoKICAgICAgICAgIDEuIGV4aXN0aW5nIGluc3RhbGxzCiAgICAgICAgICAyLiB3aGVlbHMgb3JkZXJlZCB2aWEgV2hlZWwuc3VwcG9ydF9pbmRleF9taW4oc2VsZi52YWxpZF90YWdzKQogICAgICAgICAgMy4gc291cmNlIGFyY2hpdmVzCiAgICAgICAgTm90ZTogaXQgd2FzIGNvbnNpZGVyZWQgdG8gZW1iZWQgdGhpcyBsb2dpYyBpbnRvIHRoZSBMaW5rCiAgICAgICAgICAgICAgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGJ1dCB0aGVuIGRpZmZlcmVudCBzZGlzdCBsaW5rcwogICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgdmVyc2lvbiwgd291bGQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGVxdWFsCiAgICAgICAgIiIiCiAgICAgICAgc3VwcG9ydF9udW0gPSBsZW4oc2VsZi52YWxpZF90YWdzKQogICAgICAgIGlmIGNhbmRpZGF0ZS5sb2NhdGlvbi5pc193aGVlbDoKICAgICAgICAgICAgIyBjYW4gcmFpc2UgSW52YWxpZFdoZWVsRmlsZW5hbWUKICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChjYW5kaWRhdGUubG9jYXRpb24uZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoc2VsZi52YWxpZF90YWdzKToKICAgICAgICAgICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkV2hlZWwoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB3aGVlbCBmb3IgdGhpcyBwbGF0Zm9ybS4gSXQgIgogICAgICAgICAgICAgICAgICAgICJjYW4ndCBiZSBzb3J0ZWQuIiAlIHdoZWVsLmZpbGVuYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHByaSA9IC0od2hlZWwuc3VwcG9ydF9pbmRleF9taW4oc2VsZi52YWxpZF90YWdzKSkKICAgICAgICBlbHNlOiAgIyBzZGlzdAogICAgICAgICAgICBwcmkgPSAtKHN1cHBvcnRfbnVtKQogICAgICAgIHJldHVybiAoY2FuZGlkYXRlLnZlcnNpb24sIHByaSkKCiAgICBkZWYgX3ZhbGlkYXRlX3NlY3VyZV9vcmlnaW4oc2VsZiwgbG9nZ2VyLCBsb2NhdGlvbik6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgdGhpcyB1cmwgdXNlZCBhIHNlY3VyZSB0cmFuc3BvcnQgbWVjaGFuaXNtCiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHN0cihsb2NhdGlvbikpCiAgICAgICAgb3JpZ2luID0gKHBhcnNlZC5zY2hlbWUsIHBhcnNlZC5ob3N0bmFtZSwgcGFyc2VkLnBvcnQpCgogICAgICAgICMgVGhlIHByb3RvY29sIHRvIHVzZSB0byBzZWUgaWYgdGhlIHByb3RvY29sIG1hdGNoZXMuCiAgICAgICAgIyBEb24ndCBjb3VudCB0aGUgcmVwb3NpdG9yeSB0eXBlIGFzIHBhcnQgb2YgdGhlIHByb3RvY29sOiBpbgogICAgICAgICMgY2FzZXMgc3VjaCBhcyAiZ2l0K3NzaCIsIG9ubHkgdXNlICJzc2giLiAoSS5lLiwgT25seSB2ZXJpZnkgYWdhaW5zdAogICAgICAgICMgdGhlIGxhc3Qgc2NoZW1lLikKICAgICAgICBwcm90b2NvbCA9IG9yaWdpblswXS5yc3BsaXQoJysnLCAxKVstMV0KCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgb3VyIG9yaWdpbiBpcyBhIHNlY3VyZSBvcmlnaW4gYnkgbG9va2luZyB0aHJvdWdoIG91cgogICAgICAgICMgaGFyZGNvZGVkIGxpc3Qgb2Ygc2VjdXJlIG9yaWdpbnMsIGFzIHdlbGwgYXMgYW55IGFkZGl0aW9uYWwgb25lcwogICAgICAgICMgY29uZmlndXJlZCBvbiB0aGlzIFBhY2thZ2VGaW5kZXIgaW5zdGFuY2UuCiAgICAgICAgZm9yIHNlY3VyZV9vcmlnaW4gaW4gKFNFQ1VSRV9PUklHSU5TICsgc2VsZi5zZWN1cmVfb3JpZ2lucyk6CiAgICAgICAgICAgIGlmIHByb3RvY29sICE9IHNlY3VyZV9vcmlnaW5bMF0gYW5kIHNlY3VyZV9vcmlnaW5bMF0gIT0gIioiOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byBkbyB0aGlzIGRlY29kZSBkYW5jZSB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGEKICAgICAgICAgICAgICAgICMgdW5pY29kZSBvYmplY3QsIGV2ZW4gb24gUHl0aG9uIDIueC4KICAgICAgICAgICAgICAgIGFkZHIgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uob3JpZ2luWzFdLCBzaXgudGV4dF90eXBlKSBvcgogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0gaXMgTm9uZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbHNlIG9yaWdpblsxXS5kZWNvZGUoInV0ZjgiKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbmV0d29yayA9IGlwYWRkcmVzcy5pcF9uZXR3b3JrKAogICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMV0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlY3VyZV9vcmlnaW5bMV0sIHNpeC50ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgZWxzZSBzZWN1cmVfb3JpZ2luWzFdLmRlY29kZSgidXRmOCIpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIyBXZSBkb24ndCBoYXZlIGJvdGggYSB2YWxpZCBhZGRyZXNzIG9yIGEgdmFsaWQgbmV0d29yaywgc28KICAgICAgICAgICAgICAgICMgd2UnbGwgY2hlY2sgdGhpcyBvcmlnaW4gYWdhaW5zdCBob3N0bmFtZXMuCiAgICAgICAgICAgICAgICBpZiAob3JpZ2luWzFdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0ubG93ZXIoKSAhPSBzZWN1cmVfb3JpZ2luWzFdLmxvd2VyKCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMV0gIT0gIioiKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXZSBoYXZlIGEgdmFsaWQgYWRkcmVzcyBhbmQgbmV0d29yaywgc28gc2VlIGlmIHRoZSBhZGRyZXNzCiAgICAgICAgICAgICAgICAjIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG5ldHdvcmsuCiAgICAgICAgICAgICAgICBpZiBhZGRyIG5vdCBpbiBuZXR3b3JrOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcG9ydCBwYXRjaGVzCiAgICAgICAgICAgIGlmIChvcmlnaW5bMl0gIT0gc2VjdXJlX29yaWdpblsyXSBhbmQKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzJdICE9ICIqIiBhbmQKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzJdIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiBoZXJlLCB0aGVuIHRoaXMgb3JpZ2luIG1hdGNoZXMgdGhlIGN1cnJlbnQKICAgICAgICAgICAgIyBzZWN1cmUgb3JpZ2luIGFuZCB3ZSBzaG91bGQgcmV0dXJuIFRydWUKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgdGhlbiB0aGUgb3JpZ2luIGlzbid0IHNlY3VyZSBhbmQgd2UKICAgICAgICAjIHdpbGwgbm90IGFjY2VwdCBpdCBhcyBhIHZhbGlkIGxvY2F0aW9uIHRvIHNlYXJjaC4gV2Ugd2lsbCBob3dldmVyCiAgICAgICAgIyBsb2cgYSB3YXJuaW5nIHRoYXQgd2UgYXJlIGlnbm9yaW5nIGl0LgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAiVGhlIHJlcG9zaXRvcnkgbG9jYXRlZCBhdCAlcyBpcyBub3QgYSB0cnVzdGVkIG9yIHNlY3VyZSBob3N0IGFuZCAiCiAgICAgICAgICAgICJpcyBiZWluZyBpZ25vcmVkLiBJZiB0aGlzIHJlcG9zaXRvcnkgaXMgYXZhaWxhYmxlIHZpYSBIVFRQUyBpdCAiCiAgICAgICAgICAgICJpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRUUFMgaW5zdGVhZCwgb3RoZXJ3aXNlIHlvdSBtYXkgc2lsZW5jZSAiCiAgICAgICAgICAgICJ0aGlzIHdhcm5pbmcgYW5kIGFsbG93IGl0IGFueXdheXMgd2l0aCAnLS10cnVzdGVkLWhvc3QgJXMnLiIsCiAgICAgICAgICAgIHBhcnNlZC5ob3N0bmFtZSwKICAgICAgICAgICAgcGFyc2VkLmhvc3RuYW1lLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9nZXRfaW5kZXhfdXJsc19sb2NhdGlvbnMoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm5zIHRoZSBsb2NhdGlvbnMgZm91bmQgdmlhIHNlbGYuaW5kZXhfdXJscwoKICAgICAgICBDaGVja3MgdGhlIHVybF9uYW1lIG9uIHRoZSBtYWluIChmaXJzdCBpbiB0aGUgbGlzdCkgaW5kZXggYW5kCiAgICAgICAgdXNlIHRoaXMgdXJsX25hbWUgdG8gcHJvZHVjZSBhbGwgbG9jYXRpb25zCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBta3VybF9weXBpX3VybCh1cmwpOgogICAgICAgICAgICBsb2MgPSBwb3NpeHBhdGguam9pbigKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHVybGxpYl9wYXJzZS5xdW90ZShjYW5vbmljYWxpemVfbmFtZShwcm9qZWN0X25hbWUpKSkKICAgICAgICAgICAgIyBGb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggZWFzeV9pbnN0YWxsLCBlbnN1cmUgdGhlIHBhdGgKICAgICAgICAgICAgIyBlbmRzIGluIGEgdHJhaWxpbmcgc2xhc2guICBBbHRob3VnaCB0aGlzIGlzbid0IGluIHRoZSBzcGVjCiAgICAgICAgICAgICMgKGFuZCBQeVBJIGNhbiBoYW5kbGUgaXQgd2l0aG91dCB0aGUgc2xhc2gpIHNvbWUgb3RoZXIgaW5kZXgKICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYnJlYWsgaWYgdGhleSByZWxpZWQgb24gZWFzeV9pbnN0YWxsJ3MKICAgICAgICAgICAgIyBiZWhhdmlvci4KICAgICAgICAgICAgaWYgbm90IGxvYy5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgbG9jID0gbG9jICsgJy8nCiAgICAgICAgICAgIHJldHVybiBsb2MKCiAgICAgICAgcmV0dXJuIFtta3VybF9weXBpX3VybCh1cmwpIGZvciB1cmwgaW4gc2VsZi5pbmRleF91cmxzXQoKICAgIGRlZiBmaW5kX2FsbF9jYW5kaWRhdGVzKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiRmluZCBhbGwgYXZhaWxhYmxlIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSBmb3IgcHJvamVjdF9uYW1lCgogICAgICAgIFRoaXMgY2hlY2tzIGluZGV4X3VybHMsIGZpbmRfbGlua3MgYW5kIGRlcGVuZGVuY3lfbGlua3MuCiAgICAgICAgQWxsIHZlcnNpb25zIGZvdW5kIGFyZSByZXR1cm5lZCBhcyBhbiBJbnN0YWxsYXRpb25DYW5kaWRhdGUgbGlzdC4KCiAgICAgICAgU2VlIF9saW5rX3BhY2thZ2VfdmVyc2lvbnMgZm9yIGRldGFpbHMgb24gd2hpY2ggZmlsZXMgYXJlIGFjY2VwdGVkCiAgICAgICAgIiIiCiAgICAgICAgaW5kZXhfbG9jYXRpb25zID0gc2VsZi5fZ2V0X2luZGV4X3VybHNfbG9jYXRpb25zKHByb2plY3RfbmFtZSkKICAgICAgICBpbmRleF9maWxlX2xvYywgaW5kZXhfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKGluZGV4X2xvY2F0aW9ucykKICAgICAgICBmbF9maWxlX2xvYywgZmxfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKAogICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MsIGV4cGFuZF9kaXI9VHJ1ZSkKICAgICAgICBkZXBfZmlsZV9sb2MsIGRlcF91cmxfbG9jID0gc2VsZi5fc29ydF9sb2NhdGlvbnMoc2VsZi5kZXBlbmRlbmN5X2xpbmtzKQoKICAgICAgICBmaWxlX2xvY2F0aW9ucyA9ICgKICAgICAgICAgICAgTGluayh1cmwpIGZvciB1cmwgaW4gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICAgICAgaW5kZXhfZmlsZV9sb2MsIGZsX2ZpbGVfbG9jLCBkZXBfZmlsZV9sb2MpCiAgICAgICAgKQoKICAgICAgICAjIFdlIHRydXN0IGV2ZXJ5IHVybCB0aGF0IHRoZSB1c2VyIGhhcyBnaXZlbiB1cyB3aGV0aGVyIGl0IHdhcyBnaXZlbgogICAgICAgICMgICB2aWEgLS1pbmRleC11cmwgb3IgLS1maW5kLWxpbmtzCiAgICAgICAgIyBXZSBleHBsaWNpdGx5IGRvIG5vdCB0cnVzdCBsaW5rcyB0aGF0IGNhbWUgZnJvbSBkZXBlbmRlbmN5X2xpbmtzCiAgICAgICAgIyBXZSB3YW50IHRvIGZpbHRlciBvdXQgYW55IHRoaW5nIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBzZWN1cmUgb3JpZ2luLgogICAgICAgIHVybF9sb2NhdGlvbnMgPSBbCiAgICAgICAgICAgIGxpbmsgZm9yIGxpbmsgaW4gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGluZGV4X3VybF9sb2MpLAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGZsX3VybF9sb2MpLAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGRlcF91cmxfbG9jKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBzZWxmLl92YWxpZGF0ZV9zZWN1cmVfb3JpZ2luKGxvZ2dlciwgbGluaykKICAgICAgICBdCgogICAgICAgIGxvZ2dlci5kZWJ1ZygnJWQgbG9jYXRpb24ocykgdG8gc2VhcmNoIGZvciB2ZXJzaW9ucyBvZiAlczonLAogICAgICAgICAgICAgICAgICAgICBsZW4odXJsX2xvY2F0aW9ucyksIHByb2plY3RfbmFtZSkKCiAgICAgICAgZm9yIGxvY2F0aW9uIGluIHVybF9sb2NhdGlvbnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnKiAlcycsIGxvY2F0aW9uKQoKICAgICAgICBjYW5vbmljYWxfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHByb2plY3RfbmFtZSkKICAgICAgICBmb3JtYXRzID0gZm10X2N0bF9mb3JtYXRzKHNlbGYuZm9ybWF0X2NvbnRyb2wsIGNhbm9uaWNhbF9uYW1lKQogICAgICAgIHNlYXJjaCA9IFNlYXJjaChwcm9qZWN0X25hbWUsIGNhbm9uaWNhbF9uYW1lLCBmb3JtYXRzKQogICAgICAgIGZpbmRfbGlua3NfdmVyc2lvbnMgPSBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKAogICAgICAgICAgICAjIFdlIHRydXN0IGV2ZXJ5IGRpcmVjdGx5IGxpbmtlZCBhcmNoaXZlIGluIGZpbmRfbGlua3MKICAgICAgICAgICAgKExpbmsodXJsLCAnLWYnKSBmb3IgdXJsIGluIHNlbGYuZmluZF9saW5rcyksCiAgICAgICAgICAgIHNlYXJjaAogICAgICAgICkKCiAgICAgICAgcGFnZV92ZXJzaW9ucyA9IFtdCiAgICAgICAgZm9yIHBhZ2UgaW4gc2VsZi5fZ2V0X3BhZ2VzKHVybF9sb2NhdGlvbnMsIHByb2plY3RfbmFtZSk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQW5hbHl6aW5nIGxpbmtzIGZyb20gcGFnZSAlcycsIHBhZ2UudXJsKQogICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgIHBhZ2VfdmVyc2lvbnMuZXh0ZW5kKAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMocGFnZS5saW5rcywgc2VhcmNoKQogICAgICAgICAgICAgICAgKQoKICAgICAgICBkZXBlbmRlbmN5X3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucygKICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIHNlbGYuZGVwZW5kZW5jeV9saW5rcyksIHNlYXJjaAogICAgICAgICkKICAgICAgICBpZiBkZXBlbmRlbmN5X3ZlcnNpb25zOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnZGVwZW5kZW5jeV9saW5rcyBmb3VuZDogJXMnLAogICAgICAgICAgICAgICAgJywgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLmxvY2F0aW9uLnVybCBmb3IgdmVyc2lvbiBpbiBkZXBlbmRlbmN5X3ZlcnNpb25zCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCgogICAgICAgIGZpbGVfdmVyc2lvbnMgPSBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKGZpbGVfbG9jYXRpb25zLCBzZWFyY2gpCiAgICAgICAgaWYgZmlsZV92ZXJzaW9uczoKICAgICAgICAgICAgZmlsZV92ZXJzaW9ucy5zb3J0KHJldmVyc2U9VHJ1ZSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ0xvY2FsIGZpbGVzIGZvdW5kOiAlcycsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHVybF90b19wYXRoKGNhbmRpZGF0ZS5sb2NhdGlvbi51cmwpCiAgICAgICAgICAgICAgICAgICAgZm9yIGNhbmRpZGF0ZSBpbiBmaWxlX3ZlcnNpb25zCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCgogICAgICAgICMgVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBwcmlvcml0eSBvcmRlcmluZwogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbnMgKyBmaW5kX2xpbmtzX3ZlcnNpb25zICsgcGFnZV92ZXJzaW9ucyArCiAgICAgICAgICAgIGRlcGVuZGVuY3lfdmVyc2lvbnMKICAgICAgICApCgogICAgZGVmIGZpbmRfcmVxdWlyZW1lbnQoc2VsZiwgcmVxLCB1cGdyYWRlKToKICAgICAgICAiIiJUcnkgdG8gZmluZCBhIExpbmsgbWF0Y2hpbmcgcmVxCgogICAgICAgIEV4cGVjdHMgcmVxLCBhbiBJbnN0YWxsUmVxdWlyZW1lbnQgYW5kIHVwZ3JhZGUsIGEgYm9vbGVhbgogICAgICAgIFJldHVybnMgYSBMaW5rIGlmIGZvdW5kLAogICAgICAgIFJhaXNlcyBEaXN0cmlidXRpb25Ob3RGb3VuZCBvciBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQgb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgYWxsX2NhbmRpZGF0ZXMgPSBzZWxmLmZpbmRfYWxsX2NhbmRpZGF0ZXMocmVxLm5hbWUpCgogICAgICAgICMgRmlsdGVyIG91dCBhbnl0aGluZyB3aGljaCBkb2Vzbid0IG1hdGNoIG91ciBzcGVjaWZpZXIKICAgICAgICBjb21wYXRpYmxlX3ZlcnNpb25zID0gc2V0KAogICAgICAgICAgICByZXEuc3BlY2lmaWVyLmZpbHRlcigKICAgICAgICAgICAgICAgICMgV2UgdHVybiB0aGUgdmVyc2lvbiBvYmplY3QgaW50byBhIHN0ciBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAjIHdoZW4gd2UncmUgZGVidW5kbGVkIGJ1dCBzZXR1cHRvb2xzIGlzbid0LCBQeXRob24gd2lsbCBzZWUKICAgICAgICAgICAgICAgICMgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbiBhbmQKICAgICAgICAgICAgICAgICMgcGtnX3Jlc291cmNlcy5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24gYXMgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAjIHR5cGVzLiBUaGlzIHdheSB3ZSdsbCB1c2UgYSBzdHIgYXMgYSBjb21tb24gZGF0YSBpbnRlcmNoYW5nZQogICAgICAgICAgICAgICAgIyBmb3JtYXQuIElmIHdlIHN0b3AgdXNpbmcgdGhlIHBrZ19yZXNvdXJjZXMgcHJvdmlkZWQgc3BlY2lmaWVyCiAgICAgICAgICAgICAgICAjIGFuZCBzdGFydCB1c2luZyBvdXIgb3duLCB3ZSBjYW4gZHJvcCB0aGUgY2FzdCB0byBzdHIoKS4KICAgICAgICAgICAgICAgIFtzdHIoYy52ZXJzaW9uKSBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlc10sCiAgICAgICAgICAgICAgICBwcmVyZWxlYXNlcz0oCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19hbGxfcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFsbG93X2FsbF9wcmVyZWxlYXNlcyBlbHNlIE5vbmUKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgYXBwbGljYWJsZV9jYW5kaWRhdGVzID0gWwogICAgICAgICAgICAjIEFnYWluLCBjb252ZXJ0aW5nIHRvIHN0ciB0byBkZWFsIHdpdGggZGVidW5kbGluZy4KICAgICAgICAgICAgYyBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlcyBpZiBzdHIoYy52ZXJzaW9uKSBpbiBjb21wYXRpYmxlX3ZlcnNpb25zCiAgICAgICAgXQoKICAgICAgICBpZiBhcHBsaWNhYmxlX2NhbmRpZGF0ZXM6CiAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlID0gbWF4KGFwcGxpY2FibGVfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXNlbGYuX2NhbmRpZGF0ZV9zb3J0X2tleSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IE5vbmUKCiAgICAgICAgaWYgcmVxLnNhdGlzZmllZF9ieSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHJlcS5zYXRpc2ZpZWRfYnkudmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IE5vbmUKCiAgICAgICAgaWYgaW5zdGFsbGVkX3ZlcnNpb24gaXMgTm9uZSBhbmQgYmVzdF9jYW5kaWRhdGUgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGEgdmVyc2lvbiB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgJXMgJwogICAgICAgICAgICAgICAgJyhmcm9tIHZlcnNpb25zOiAlcyknLAogICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgJywgJy5qb2luKAogICAgICAgICAgICAgICAgICAgIHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHN0cihjLnZlcnNpb24pIGZvciBjIGluIGFsbF9jYW5kaWRhdGVzKSwKICAgICAgICAgICAgICAgICAgICAgICAga2V5PXBhcnNlX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZCgKICAgICAgICAgICAgICAgICdObyBtYXRjaGluZyBkaXN0cmlidXRpb24gZm91bmQgZm9yICVzJyAlIHJlcQogICAgICAgICAgICApCgogICAgICAgIGJlc3RfaW5zdGFsbGVkID0gRmFsc2UKICAgICAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbiBhbmQgKAogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgaXMgTm9uZSBvcgogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUudmVyc2lvbiA8PSBpbnN0YWxsZWRfdmVyc2lvbik6CiAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gVHJ1ZQoKICAgICAgICBpZiBub3QgdXBncmFkZSBhbmQgaW5zdGFsbGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICdFeGlzdGluZyBpbnN0YWxsZWQgdmVyc2lvbiAoJXMpIGlzIG1vc3QgdXAtdG8tZGF0ZSBhbmQgJwogICAgICAgICAgICAgICAgICAgICdzYXRpc2ZpZXMgcmVxdWlyZW1lbnQnLAogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICdFeGlzdGluZyBpbnN0YWxsZWQgdmVyc2lvbiAoJXMpIHNhdGlzZmllcyByZXF1aXJlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgJyhtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbiBpcyAlcyknLAogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAjIFdlIGhhdmUgYW4gZXhpc3RpbmcgdmVyc2lvbiwgYW5kIGl0cyB0aGUgYmVzdCB2ZXJzaW9uCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdJbnN0YWxsZWQgdmVyc2lvbiAoJXMpIGlzIG1vc3QgdXAtdG8tZGF0ZSAocGFzdCB2ZXJzaW9uczogJwogICAgICAgICAgICAgICAgJyVzKScsCiAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICcsICcuam9pbihzb3J0ZWQoY29tcGF0aWJsZV92ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pKSBvcgogICAgICAgICAgICAgICAgIm5vbmUiLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZAoKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICdVc2luZyB2ZXJzaW9uICVzIChuZXdlc3Qgb2YgdmVyc2lvbnM6ICVzKScsCiAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24sCiAgICAgICAgICAgICcsICcuam9pbihzb3J0ZWQoY29tcGF0aWJsZV92ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pKQogICAgICAgICkKICAgICAgICByZXR1cm4gYmVzdF9jYW5kaWRhdGUubG9jYXRpb24KCiAgICBkZWYgX2dldF9wYWdlcyhzZWxmLCBsb2NhdGlvbnMsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGRzIChwYWdlLCBwYWdlX3VybCkgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb25zLCBza2lwcGluZwogICAgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgZXJyb3JzLgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBsb2NhdGlvbiBpbiBsb2NhdGlvbnM6CiAgICAgICAgICAgIGlmIGxvY2F0aW9uIGluIHNlZW46CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWVuLmFkZChsb2NhdGlvbikKCiAgICAgICAgICAgIHBhZ2UgPSBzZWxmLl9nZXRfcGFnZShsb2NhdGlvbikKICAgICAgICAgICAgaWYgcGFnZSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHlpZWxkIHBhZ2UKCiAgICBfcHlfdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocictcHkoWzEyM11cLj9bMC05XT8pJCcpCgogICAgZGVmIF9zb3J0X2xpbmtzKHNlbGYsIGxpbmtzKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGVsZW1lbnRzIG9mIGxpbmtzIGluIG9yZGVyLCBub24tZWdnIGxpbmtzIGZpcnN0LCBlZ2cgbGlua3MKICAgICAgICBzZWNvbmQsIHdoaWxlIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMKICAgICAgICAiIiIKICAgICAgICBlZ2dzLCBub19lZ2dzID0gW10sIFtdCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua3M6CiAgICAgICAgICAgIGlmIGxpbmsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuLmFkZChsaW5rKQogICAgICAgICAgICAgICAgaWYgbGluay5lZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQobGluaykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbm9fZWdncy5hcHBlbmQobGluaykKICAgICAgICByZXR1cm4gbm9fZWdncyArIGVnZ3MKCiAgICBkZWYgX3BhY2thZ2VfdmVyc2lvbnMoc2VsZiwgbGlua3MsIHNlYXJjaCk6CiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3IgbGluayBpbiBzZWxmLl9zb3J0X2xpbmtzKGxpbmtzKToKICAgICAgICAgICAgdiA9IHNlbGYuX2xpbmtfcGFja2FnZV92ZXJzaW9ucyhsaW5rLCBzZWFyY2gpCiAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfbG9nX3NraXBwZWRfbGluayhzZWxmLCBsaW5rLCByZWFzb24pOgogICAgICAgIGlmIGxpbmsgbm90IGluIHNlbGYubG9nZ2VkX2xpbmtzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGxpbmsgJXM7ICVzJywgbGluaywgcmVhc29uKQogICAgICAgICAgICBzZWxmLmxvZ2dlZF9saW5rcy5hZGQobGluaykKCiAgICBkZWYgX2xpbmtfcGFja2FnZV92ZXJzaW9ucyhzZWxmLCBsaW5rLCBzZWFyY2gpOgogICAgICAgICIiIlJldHVybiBhbiBJbnN0YWxsYXRpb25DYW5kaWRhdGUgb3IgTm9uZSIiIgogICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgaWYgbGluay5lZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgIGVnZ19pbmZvID0gbGluay5lZ2dfZnJhZ21lbnQKICAgICAgICAgICAgZXh0ID0gbGluay5leHQKICAgICAgICBlbHNlOgogICAgICAgICAgICBlZ2dfaW5mbywgZXh0ID0gbGluay5zcGxpdGV4dCgpCiAgICAgICAgICAgIGlmIG5vdCBleHQ6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKGxpbmssICdub3QgYSBmaWxlJykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBleHQgbm90IGluIFNVUFBPUlRFRF9FWFRFTlNJT05TOgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAndW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICVzJyAlIGV4dCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAiYmluYXJ5IiBub3QgaW4gc2VhcmNoLmZvcm1hdHMgYW5kIGV4dCA9PSB3aGVlbF9leHQ6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgIGxpbmssICdObyBiaW5hcmllcyBwZXJtaXR0ZWQgZm9yICVzJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAibWFjb3N4MTAiIGluIGxpbmsucGF0aCBhbmQgZXh0ID09ICcuemlwJzoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsobGluaywgJ21hY29zeDEwIG9uZScpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgZXh0ID09IHdoZWVsX2V4dDoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGxpbmsuZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgSW52YWxpZFdoZWVsRmlsZW5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluayhsaW5rLCAnaW52YWxpZCB3aGVlbCBmaWxlbmFtZScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZSh3aGVlbC5uYW1lKSAhPSBzZWFyY2guY2Fub25pY2FsOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssICd3cm9uZyBwcm9qZWN0IG5hbWUgKG5vdCAlcyknICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoc2VsZi52YWxpZF90YWdzKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLCAnaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbicpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHdoZWVsLnZlcnNpb24KCiAgICAgICAgIyBUaGlzIHNob3VsZCBiZSB1cCBieSB0aGUgc2VhcmNoLm9rX2JpbmFyeSBjaGVjaywgYnV0IHNlZSBpc3N1ZSAyNzAwLgogICAgICAgIGlmICJzb3VyY2UiIG5vdCBpbiBzZWFyY2guZm9ybWF0cyBhbmQgZXh0ICE9IHdoZWVsX2V4dDoKICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgIGxpbmssICdObyBzb3VyY2VzIHBlcm1pdHRlZCBmb3IgJXMnICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgICAgIHZlcnNpb24gPSBlZ2dfaW5mb19tYXRjaGVzKGVnZ19pbmZvLCBzZWFyY2guc3VwcGxpZWQsIGxpbmspCiAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgbGluaywgJ3dyb25nIHByb2plY3QgbmFtZSAobm90ICVzKScgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBtYXRjaCA9IHNlbGYuX3B5X3ZlcnNpb25fcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzptYXRjaC5zdGFydCgpXQogICAgICAgICAgICBweV92ZXJzaW9uID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgaWYgcHlfdmVyc2lvbiAhPSBzeXMudmVyc2lvbls6M106CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgIGxpbmssICdQeXRob24gdmVyc2lvbiBpcyBpbmNvcnJlY3QnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBwb3J0X3RoaXNfcHl0aG9uID0gY2hlY2tfcmVxdWlyZXNfcHl0aG9uKGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgIGV4Y2VwdCBzcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUGFja2FnZSAlcyBoYXMgYW4gaW52YWxpZCBSZXF1aXJlcy1QeXRob24gZW50cnk6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuZmlsZW5hbWUsIGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgICAgICBzdXBwb3J0X3RoaXNfcHl0aG9uID0gVHJ1ZQoKICAgICAgICBpZiBub3Qgc3VwcG9ydF90aGlzX3B5dGhvbjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJUaGUgcGFja2FnZSAlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHl0aG9uIgogICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gaW4gdXNlLiBBY2NlcHRhYmxlIHB5dGhvbiB2ZXJzaW9ucyBhcmU6JXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbGluaywgbGluay5yZXF1aXJlc19weXRob24pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbGluayAlcywgdmVyc2lvbjogJXMnLCBsaW5rLCB2ZXJzaW9uKQoKICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlKHNlYXJjaC5zdXBwbGllZCwgdmVyc2lvbiwgbGluaykKCiAgICBkZWYgX2dldF9wYWdlKHNlbGYsIGxpbmspOgogICAgICAgIHJldHVybiBIVE1MUGFnZS5nZXRfcGFnZShsaW5rLCBzZXNzaW9uPXNlbGYuc2Vzc2lvbikKCgpkZWYgZWdnX2luZm9fbWF0Y2hlcygKICAgICAgICBlZ2dfaW5mbywgc2VhcmNoX25hbWUsIGxpbmssCiAgICAgICAgX2VnZ19pbmZvX3JlPXJlLmNvbXBpbGUocicoW2EtejAtOV8uXSspLShbYS16MC05Xy4hKy1dKyknLCByZS5JKSk6CiAgICAiIiJQdWxsIHRoZSB2ZXJzaW9uIHBhcnQgb3V0IG9mIGEgc3RyaW5nLgoKICAgIDpwYXJhbSBlZ2dfaW5mbzogVGhlIHN0cmluZyB0byBwYXJzZS4gRS5nLiBmb28tMi4xCiAgICA6cGFyYW0gc2VhcmNoX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoaXMgYmVsb25ncyB0by4gTm9uZSB0bwogICAgICAgIGluZmVyIHRoZSBuYW1lLiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdW5hbWJpZ3VvdXNseSBwYXJzZSBzdHJpbmdzCiAgICAgICAgbGlrZSBmb28tMi0yIHdoaWNoIG1pZ2h0IGJlIGZvbywgMi0yIG9yIGZvby0yLCAyLgogICAgOnBhcmFtIGxpbms6IFRoZSBsaW5rIHRoZSBzdHJpbmcgY2FtZSBmcm9tLCBmb3IgbG9nZ2luZyBvbiBmYWlsdXJlLgogICAgIiIiCiAgICBtYXRjaCA9IF9lZ2dfaW5mb19yZS5zZWFyY2goZWdnX2luZm8pCiAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiBmcm9tIGxpbms6ICVzJywgbGluaykKICAgICAgICByZXR1cm4gTm9uZQogICAgaWYgc2VhcmNoX25hbWUgaXMgTm9uZToKICAgICAgICBmdWxsX21hdGNoID0gbWF0Y2guZ3JvdXAoMCkKICAgICAgICByZXR1cm4gZnVsbF9tYXRjaFtmdWxsX21hdGNoLmluZGV4KCctJyk6XQogICAgbmFtZSA9IG1hdGNoLmdyb3VwKDApLmxvd2VyKCkKICAgICMgVG8gbWF0Y2ggdGhlICJzYWZlIiBuYW1lIHRoYXQgcGtnX3Jlc291cmNlcyBjcmVhdGVzOgogICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXycsICctJykKICAgICMgcHJvamVjdCBuYW1lIGFuZCB2ZXJzaW9uIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgZGFzaAogICAgbG9va19mb3IgPSBzZWFyY2hfbmFtZS5sb3dlcigpICsgIi0iCiAgICBpZiBuYW1lLnN0YXJ0c3dpdGgobG9va19mb3IpOgogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgwKVtsZW4obG9va19mb3IpOl0KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBIVE1MUGFnZShvYmplY3QpOgogICAgIiIiUmVwcmVzZW50cyBvbmUgcGFnZSwgYWxvbmcgd2l0aCBpdHMgVVJMIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRlbnQsIHVybCwgaGVhZGVycz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBoYXZlIGFueSBlbmNvZGluZyBpbmZvcm1hdGlvbiBpbiBvdXIgaGVhZGVycwogICAgICAgIGVuY29kaW5nID0gTm9uZQogICAgICAgIGlmIGhlYWRlcnMgYW5kICJDb250ZW50LVR5cGUiIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihoZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKCiAgICAgICAgICAgIGlmICJjaGFyc2V0IiBpbiBwYXJhbXM6CiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHBhcmFtc1snY2hhcnNldCddCgogICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKICAgICAgICBzZWxmLnBhcnNlZCA9IGh0bWw1bGliLnBhcnNlKAogICAgICAgICAgICBzZWxmLmNvbnRlbnQsCiAgICAgICAgICAgIHRyYW5zcG9ydF9lbmNvZGluZz1lbmNvZGluZywKICAgICAgICAgICAgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPUZhbHNlLAogICAgICAgICkKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi51cmwKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfcGFnZShjbHMsIGxpbmssIHNraXBfYXJjaGl2ZXM9VHJ1ZSwgc2Vzc2lvbj1Ob25lKToKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICJnZXRfcGFnZSgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAnc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgdXJsID0gbGluay51cmwKICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLCAxKVswXQoKICAgICAgICAjIENoZWNrIGZvciBWQ1Mgc2NoZW1lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGxvb2t1cCBhcyB3ZWIgcGFnZXMuCiAgICAgICAgZnJvbSBwaXAudmNzIGltcG9ydCBWY3NTdXBwb3J0CiAgICAgICAgZm9yIHNjaGVtZSBpbiBWY3NTdXBwb3J0LnNjaGVtZXM6CiAgICAgICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoc2NoZW1lKSBhbmQgdXJsW2xlbihzY2hlbWUpXSBpbiAnKzonOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3QgbG9vayBhdCAlcyBVUkwgJXMnLCBzY2hlbWUsIGxpbmspCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNraXBfYXJjaGl2ZXM6CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpbmsuZmlsZW5hbWUKICAgICAgICAgICAgICAgIGZvciBiYWRfZXh0IGluIEFSQ0hJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aChiYWRfZXh0KToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gY2xzLl9nZXRfY29udGVudF90eXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLCBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudF90eXBlLmxvd2VyKCkuc3RhcnRzd2l0aCgndGV4dC9odG1sJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBwYWdlICVzIGJlY2F1c2Ugb2YgQ29udGVudC1UeXBlOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBwYWdlICVzJywgdXJsKQoKICAgICAgICAgICAgIyBUYWNrIGluZGV4Lmh0bWwgb250byBmaWxlOi8vIFVSTHMgdGhhdCBwb2ludCB0byBkaXJlY3RvcmllcwogICAgICAgICAgICAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSA9IFwKICAgICAgICAgICAgICAgIHVybGxpYl9wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIGFuZAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNkaXIodXJsbGliX3JlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpKSk6CiAgICAgICAgICAgICAgICAjIGFkZCB0cmFpbGluZyBzbGFzaCBpZiBub3QgcHJlc2VudCBzbyB1cmxqb2luIGRvZXNuJ3QgdHJpbQogICAgICAgICAgICAgICAgIyBmaW5hbCBzZWdtZW50CiAgICAgICAgICAgICAgICBpZiBub3QgdXJsLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcvJwogICAgICAgICAgICAgICAgdXJsID0gdXJsbGliX3BhcnNlLnVybGpvaW4odXJsLCAnaW5kZXguaHRtbCcpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyBmaWxlOiBVUkwgaXMgZGlyZWN0b3J5LCBnZXR0aW5nICVzJywgdXJsKQoKICAgICAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgaGVhZGVycz17CiAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6ICJ0ZXh0L2h0bWwiLAogICAgICAgICAgICAgICAgICAgICJDYWNoZS1Db250cm9sIjogIm1heC1hZ2U9NjAwIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKCiAgICAgICAgICAgICMgVGhlIGNoZWNrIGZvciBhcmNoaXZlcyBhYm92ZSBvbmx5IHdvcmtzIGlmIHRoZSB1cmwgZW5kcyB3aXRoCiAgICAgICAgICAgICMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhbiBhcmNoaXZlLiBIb3dldmVyIHRoYXQgaXMgbm90IGEKICAgICAgICAgICAgIyByZXF1aXJlbWVudCBvZiBhbiB1cmwuIFVubGVzcyB3ZSBpc3N1ZSBhIEhFQUQgcmVxdWVzdCBvbiBldmVyeQogICAgICAgICAgICAjIHVybCB3ZSBjYW5ub3Qga25vdyBhaGVhZCBvZiB0aW1lIGZvciBzdXJlIGlmIHNvbWV0aGluZyBpcyBIVE1MCiAgICAgICAgICAgICMgb3Igbm90LiBIb3dldmVyIHdlIGNhbiBjaGVjayBhZnRlciB3ZSd2ZSBkb3dubG9hZGVkIGl0LgogICAgICAgICAgICBjb250ZW50X3R5cGUgPSByZXNwLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnLCAndW5rbm93bicpCiAgICAgICAgICAgIGlmIG5vdCBjb250ZW50X3R5cGUubG93ZXIoKS5zdGFydHN3aXRoKCJ0ZXh0L2h0bWwiKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgcGFnZSAlcyBiZWNhdXNlIG9mIENvbnRlbnQtVHlwZTogJXMnLAogICAgICAgICAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBpbnN0ID0gY2xzKHJlc3AuY29udGVudCwgcmVzcC51cmwsIHJlc3AuaGVhZGVycykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCBleGMsIHVybCkKICAgICAgICBleGNlcHQgU1NMRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByZWFzb24gPSAoIlRoZXJlIHdhcyBhIHByb2JsZW0gY29uZmlybWluZyB0aGUgc3NsIGNlcnRpZmljYXRlOiAiCiAgICAgICAgICAgICAgICAgICAgICAiJXMiICUgZXhjKQogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssIHJlYXNvbiwgdXJsLCBtZXRoPWxvZ2dlci5pbmZvKQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5Db25uZWN0aW9uRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssICJjb25uZWN0aW9uIGVycm9yOiAlcyIgJSBleGMsIHVybCkKICAgICAgICBleGNlcHQgcmVxdWVzdHMuVGltZW91dDoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCAidGltZWQgb3V0IiwgdXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbnN0CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9oYW5kbGVfZmFpbChsaW5rLCByZWFzb24sIHVybCwgbWV0aD1Ob25lKToKICAgICAgICBpZiBtZXRoIGlzIE5vbmU6CiAgICAgICAgICAgIG1ldGggPSBsb2dnZXIuZGVidWcKCiAgICAgICAgbWV0aCgiQ291bGQgbm90IGZldGNoIFVSTCAlczogJXMgLSBza2lwcGluZyIsIGxpbmssIHJlYXNvbikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9jb250ZW50X3R5cGUodXJsLCBzZXNzaW9uKToKICAgICAgICAiIiJHZXQgdGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgZ2l2ZW4gdXJsLCB1c2luZyBhIEhFQUQgcmVxdWVzdCIiIgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIGlmIHNjaGVtZSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJyk6CiAgICAgICAgICAgICMgRklYTUU6IHNvbWUgd2FybmluZyBvciBzb21ldGhpbmc/CiAgICAgICAgICAgICMgYXNzZXJ0aW9uIGVycm9yPwogICAgICAgICAgICByZXR1cm4gJycKCiAgICAgICAgcmVzcCA9IHNlc3Npb24uaGVhZCh1cmwsIGFsbG93X3JlZGlyZWN0cz1UcnVlKQogICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCgogICAgICAgIHJldHVybiByZXNwLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiLCAiIikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgYmFzZV91cmwoc2VsZik6CiAgICAgICAgYmFzZXMgPSBbCiAgICAgICAgICAgIHggZm9yIHggaW4gc2VsZi5wYXJzZWQuZmluZGFsbCgiLi8vYmFzZSIpCiAgICAgICAgICAgIGlmIHguZ2V0KCJocmVmIikgaXMgbm90IE5vbmUKICAgICAgICBdCiAgICAgICAgaWYgYmFzZXMgYW5kIGJhc2VzWzBdLmdldCgiaHJlZiIpOgogICAgICAgICAgICByZXR1cm4gYmFzZXNbMF0uZ2V0KCJocmVmIikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi51cmwKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsaW5rcyhzZWxmKToKICAgICAgICAiIiJZaWVsZHMgYWxsIGxpbmtzIGluIHRoZSBwYWdlIiIiCiAgICAgICAgZm9yIGFuY2hvciBpbiBzZWxmLnBhcnNlZC5maW5kYWxsKCIuLy9hIik6CiAgICAgICAgICAgIGlmIGFuY2hvci5nZXQoImhyZWYiKToKICAgICAgICAgICAgICAgIGhyZWYgPSBhbmNob3IuZ2V0KCJocmVmIikKICAgICAgICAgICAgICAgIHVybCA9IHNlbGYuY2xlYW5fbGluaygKICAgICAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UudXJsam9pbihzZWxmLmJhc2VfdXJsLCBocmVmKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHlyZXF1aXJlID0gYW5jaG9yLmdldCgnZGF0YS1yZXF1aXJlcy1weXRob24nKQogICAgICAgICAgICAgICAgcHlyZXF1aXJlID0gdW5lc2NhcGUocHlyZXF1aXJlKSBpZiBweXJlcXVpcmUgZWxzZSBOb25lCiAgICAgICAgICAgICAgICB5aWVsZCBMaW5rKHVybCwgc2VsZiwgcmVxdWlyZXNfcHl0aG9uPXB5cmVxdWlyZSkKCiAgICBfY2xlYW5fcmUgPSByZS5jb21waWxlKHInW15hLXowLTkkJissLzo7PT9ALiMlX1xcfC1dJywgcmUuSSkKCiAgICBkZWYgY2xlYW5fbGluayhzZWxmLCB1cmwpOgogICAgICAgICIiIk1ha2VzIHN1cmUgYSBsaW5rIGlzIGZ1bGx5IGVuY29kZWQuICBUaGF0IGlzLCBpZiBhICcgJyBzaG93cyB1cCBpbgogICAgICAgIHRoZSBsaW5rLCBpdCB3aWxsIGJlIHJld3JpdHRlbiB0byAlMjAgKHdoaWxlIG5vdCBvdmVyLXF1b3RpbmcKICAgICAgICAlIG9yIG90aGVyIGNoYXJhY3RlcnMpLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9jbGVhbl9yZS5zdWIoCiAgICAgICAgICAgIGxhbWJkYSBtYXRjaDogJyUlJTJ4JyAlIG9yZChtYXRjaC5ncm91cCgwKSksIHVybCkKCgpjbGFzcyBMaW5rKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY29tZXNfZnJvbT1Ob25lLCByZXF1aXJlc19weXRob249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgT2JqZWN0IHJlcHJlc2VudGluZyBhIHBhcnNlZCBsaW5rIGZyb20gaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlLyoKCiAgICAgICAgdXJsOgogICAgICAgICAgICB1cmwgb2YgdGhlIHJlc291cmNlIHBvaW50ZWQgdG8gKGhyZWYgb2YgdGhlIGxpbmspCiAgICAgICAgY29tZXNfZnJvbToKICAgICAgICAgICAgaW5zdGFuY2Ugb2YgSFRNTFBhZ2Ugd2hlcmUgdGhlIGxpbmsgd2FzIGZvdW5kLCBvciBzdHJpbmcuCiAgICAgICAgcmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICBTdHJpbmcgY29udGFpbmluZyB0aGUgYFJlcXVpcmVzLVB5dGhvbmAgbWV0YWRhdGEgZmllbGQsIHNwZWNpZmllZAogICAgICAgICAgICBpbiBQRVAgMzQ1LiBUaGlzIG1heSBiZSBzcGVjaWZpZWQgYnkgYSBkYXRhLXJlcXVpcmVzLXB5dGhvbgogICAgICAgICAgICBhdHRyaWJ1dGUgaW4gdGhlIEhUTUwgbGluayB0YWcsIGFzIGRlc2NyaWJlZCBpbiBQRVAgNTAzLgogICAgICAgICIiIgoKICAgICAgICAjIHVybCBjYW4gYmUgYSBVTkMgd2luZG93cyBzaGFyZQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdcXFxcJyk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHVybCkKCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmNvbWVzX2Zyb20gPSBjb21lc19mcm9tCiAgICAgICAgc2VsZi5yZXF1aXJlc19weXRob24gPSByZXF1aXJlc19weXRob24gaWYgcmVxdWlyZXNfcHl0aG9uIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICBycCA9ICcgKHJlcXVpcmVzLXB5dGhvbjolcyknICUgc2VsZi5yZXF1aXJlc19weXRob24KICAgICAgICBlbHNlOgogICAgICAgICAgICBycCA9ICcnCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICByZXR1cm4gJyVzIChmcm9tICVzKSVzJyAlIChzZWxmLnVybCwgc2VsZi5jb21lc19mcm9tLCBycCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYudXJsKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxMaW5rICVzPicgJSBzZWxmCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPT0gb3RoZXIudXJsCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgIT0gb3RoZXIudXJsCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPCBvdGhlci51cmwKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA8PSBvdGhlci51cmwKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA+IG90aGVyLnVybAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsID49IG90aGVyLnVybAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLnVybCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBmaWxlbmFtZShzZWxmKToKICAgICAgICBfLCBuZXRsb2MsIHBhdGgsIF8sIF8gPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpCiAgICAgICAgbmFtZSA9IHBvc2l4cGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcCgnLycpKSBvciBuZXRsb2MKICAgICAgICBuYW1lID0gdXJsbGliX3BhcnNlLnVucXVvdGUobmFtZSkKICAgICAgICBhc3NlcnQgbmFtZSwgKCdVUkwgJXIgcHJvZHVjZWQgbm8gZmlsZW5hbWUnICUgc2VsZi51cmwpCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzY2hlbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybClbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXRsb2Moc2VsZik6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybClbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudW5xdW90ZSh1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzJdKQoKICAgIGRlZiBzcGxpdGV4dChzZWxmKToKICAgICAgICByZXR1cm4gc3BsaXRleHQocG9zaXhwYXRoLmJhc2VuYW1lKHNlbGYucGF0aC5yc3RyaXAoJy8nKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNwbGl0ZXh0KClbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB1cmxfd2l0aG91dF9mcmFnbWVudChzZWxmKToKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKQogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBOb25lKSkKCiAgICBfZWdnX2ZyYWdtZW50X3JlID0gcmUuY29tcGlsZShyJ1sjJl1lZ2c9KFteJl0qKScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWdnX2ZyYWdtZW50KHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5fZWdnX2ZyYWdtZW50X3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCgogICAgX3N1YmRpcmVjdG9yeV9mcmFnbWVudF9yZSA9IHJlLmNvbXBpbGUocidbIyZdc3ViZGlyZWN0b3J5PShbXiZdKiknKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN1YmRpcmVjdG9yeV9mcmFnbWVudChzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3N1YmRpcmVjdG9yeV9mcmFnbWVudF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQoKICAgIF9oYXNoX3JlID0gcmUuY29tcGlsZSgKICAgICAgICByJyhzaGExfHNoYTIyNHxzaGEzODR8c2hhMjU2fHNoYTUxMnxtZDUpPShbYS1mMC05XSspJwogICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2goc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9oYXNoX3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDIpCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoX25hbWUoc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9oYXNoX3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaG93X3VybChzZWxmKToKICAgICAgICByZXR1cm4gcG9zaXhwYXRoLmJhc2VuYW1lKHNlbGYudXJsLnNwbGl0KCcjJywgMSlbMF0uc3BsaXQoJz8nLCAxKVswXSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc193aGVlbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5leHQgPT0gd2hlZWxfZXh0CgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfYXJ0aWZhY3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGlzIHBvaW50cyB0byBhbiBhY3R1YWwgYXJ0aWZhY3QgKGUuZy4gYSB0YXJiYWxsKSBvciBpZgogICAgICAgIGl0IHBvaW50cyB0byBhbiAiYWJzdHJhY3QiIHRoaW5nIGxpa2UgYSBwYXRoIG9yIGEgVkNTIGxvY2F0aW9uLgogICAgICAgICIiIgogICAgICAgIGZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCgogICAgICAgIGlmIHNlbGYuc2NoZW1lIGluIHZjcy5hbGxfc2NoZW1lczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgoKRm9ybWF0Q29udHJvbCA9IG5hbWVkdHVwbGUoJ0Zvcm1hdENvbnRyb2wnLCAnbm9fYmluYXJ5IG9ubHlfYmluYXJ5JykKIiIiVGhpcyBvYmplY3QgaGFzIHR3byBmaWVsZHMsIG5vX2JpbmFyeSBhbmQgb25seV9iaW5hcnkuCgpJZiBhIGZpZWxkIGlzIGZhbHN5LCBpdCBpc24ndCBzZXQuIElmIGl0IGlzIHsnOmFsbDonfSwgaXQgc2hvdWxkIG1hdGNoIGFsbApwYWNrYWdlcyBleGNlcHQgdGhvc2UgbGlzdGVkIGluIHRoZSBvdGhlciBmaWVsZC4gT25seSBvbmUgZmllbGQgY2FuIGJlIHNldAp0byB7JzphbGw6J30gYXQgYSB0aW1lLiBUaGUgcmVzdCBvZiB0aGUgdGltZSBleGFjdCBwYWNrYWdlIG5hbWUgbWF0Y2hlcwphcmUgbGlzdGVkLCB3aXRoIGFueSBnaXZlbiBwYWNrYWdlIG9ubHkgc2hvd2luZyB1cCBpbiBvbmUgZmllbGQgYXQgYSB0aW1lLgoiIiIKCgpkZWYgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUodmFsdWUsIHRhcmdldCwgb3RoZXIpOgogICAgbmV3ID0gdmFsdWUuc3BsaXQoJywnKQogICAgd2hpbGUgJzphbGw6JyBpbiBuZXc6CiAgICAgICAgb3RoZXIuY2xlYXIoKQogICAgICAgIHRhcmdldC5jbGVhcigpCiAgICAgICAgdGFyZ2V0LmFkZCgnOmFsbDonKQogICAgICAgIGRlbCBuZXdbOm5ldy5pbmRleCgnOmFsbDonKSArIDFdCiAgICAgICAgaWYgJzpub25lOicgbm90IGluIG5ldzoKICAgICAgICAgICAgIyBXaXRob3V0IGEgbm9uZSwgd2Ugd2FudCB0byBkaXNjYXJkIGV2ZXJ5dGhpbmcgYXMgOmFsbDogY292ZXJzIGl0CiAgICAgICAgICAgIHJldHVybgogICAgZm9yIG5hbWUgaW4gbmV3OgogICAgICAgIGlmIG5hbWUgPT0gJzpub25lOic6CiAgICAgICAgICAgIHRhcmdldC5jbGVhcigpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpCiAgICAgICAgb3RoZXIuZGlzY2FyZChuYW1lKQogICAgICAgIHRhcmdldC5hZGQobmFtZSkKCgpkZWYgZm10X2N0bF9mb3JtYXRzKGZtdF9jdGwsIGNhbm9uaWNhbF9uYW1lKToKICAgIHJlc3VsdCA9IHNldChbImJpbmFyeSIsICJzb3VyY2UiXSkKICAgIGlmIGNhbm9uaWNhbF9uYW1lIGluIGZtdF9jdGwub25seV9iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ3NvdXJjZScpCiAgICBlbGlmIGNhbm9uaWNhbF9uYW1lIGluIGZtdF9jdGwubm9fYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdiaW5hcnknKQogICAgZWxpZiAnOmFsbDonIGluIGZtdF9jdGwub25seV9iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ3NvdXJjZScpCiAgICBlbGlmICc6YWxsOicgaW4gZm10X2N0bC5ub19iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ2JpbmFyeScpCiAgICByZXR1cm4gZnJvemVuc2V0KHJlc3VsdCkKCgpkZWYgZm10X2N0bF9ub19iaW5hcnkoZm10X2N0bCk6CiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICAnOmFsbDonLCBmbXRfY3RsLm5vX2JpbmFyeSwgZm10X2N0bC5vbmx5X2JpbmFyeSkKCgpkZWYgZm10X2N0bF9ub191c2Vfd2hlZWwoZm10X2N0bCk6CiAgICBmbXRfY3RsX25vX2JpbmFyeShmbXRfY3RsKQogICAgd2FybmluZ3Mud2FybigKICAgICAgICAnLS1uby11c2Utd2hlZWwgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICcKICAgICAgICAnIFBsZWFzZSB1c2UgLS1uby1iaW5hcnkgOmFsbDogaW5zdGVhZC4nLCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgc3RhY2tsZXZlbD0yKQoKClNlYXJjaCA9IG5hbWVkdHVwbGUoJ1NlYXJjaCcsICdzdXBwbGllZCBjYW5vbmljYWwgZm9ybWF0cycpCiIiIkNhcHR1cmUga2V5IGFzcGVjdHMgb2YgYSBzZWFyY2guCgo6YXR0cmlidXRlIHN1cHBsaWVkOiBUaGUgdXNlciBzdXBwbGllZCBwYWNrYWdlLgo6YXR0cmlidXRlIGNhbm9uaWNhbDogVGhlIGNhbm9uaWNhbCBwYWNrYWdlIG5hbWUuCjphdHRyaWJ1dGUgZm9ybWF0czogVGhlIGZvcm1hdHMgYWxsb3dlZCBmb3IgdGhpcyBwYWNrYWdlLiBTaG91bGQgYmUgYSBzZXQKICAgIHdpdGggJ2JpbmFyeScgb3IgJ3NvdXJjZScgb3IgYm90aCBpbiBpdC4KIiIiClBLAwQUAAAAAAAAACEAtw93mfoVAAD6FQAAIAAAAHB5cGlfX3BpcF85XzBfMy9waXAvbG9jYXRpb25zLnB5IiIiTG9jYXRpb25zIHdoZXJlIHdlIGxvb2sgZm9yIGNvbmZpZ3MsIGluc3RhbGwgc3R1ZmYsIGV0YyIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzaXRlCmltcG9ydCBzeXMKCmZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsLCBTQ0hFTUVfS0VZUyAgIyBub3FhCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MsIGV4cGFuZHVzZXIKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGFwcGRpcnMKCgojIEFwcGxpY2F0aW9uIERpcmVjdG9yaWVzClVTRVJfQ0FDSEVfRElSID0gYXBwZGlycy51c2VyX2NhY2hlX2RpcigicGlwIikKCgpERUxFVEVfTUFSS0VSX01FU1NBR0UgPSAnJydcClRoaXMgZmlsZSBpcyBwbGFjZWQgaGVyZSBieSBwaXAgdG8gaW5kaWNhdGUgdGhlIHNvdXJjZSB3YXMgcHV0CmhlcmUgYnkgcGlwLgoKT25jZSB0aGlzIHBhY2thZ2UgaXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCB0aGlzIHNvdXJjZSBjb2RlIHdpbGwgYmUKZGVsZXRlZCAodW5sZXNzIHlvdSByZW1vdmUgdGhpcyBmaWxlKS4KJycnClBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FID0gJ3BpcC1kZWxldGUtdGhpcy1kaXJlY3RvcnkudHh0JwoKCmRlZiB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUoZGlyZWN0b3J5KToKICAgICIiIgogICAgV3JpdGUgdGhlIHBpcCBkZWxldGUgbWFya2VyIGZpbGUgaW50byB0aGlzIGRpcmVjdG9yeS4KICAgICIiIgogICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSkKICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3cnKSBhcyBtYXJrZXJfZnA6CiAgICAgICAgbWFya2VyX2ZwLndyaXRlKERFTEVURV9NQVJLRVJfTUVTU0FHRSkKCgpkZWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIHdlJ3JlIHJ1bm5pbmcgaW5zaWRlIGEgdmlydHVhbGVudiwgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICIiIgogICAgaWYgaGFzYXR0cihzeXMsICdyZWFsX3ByZWZpeCcpOgogICAgICAgIHJldHVybiBUcnVlCiAgICBlbGlmIHN5cy5wcmVmaXggIT0gZ2V0YXR0cihzeXMsICJiYXNlX3ByZWZpeCIsIHN5cy5wcmVmaXgpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHZpcnR1YWxlbnZfbm9fZ2xvYmFsKCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGluIGEgdmVudiBhbmQgbm8gc3lzdGVtIHNpdGUgcGFja2FnZXMuCiAgICAiIiIKICAgICMgdGhpcyBtaXJyb3JzIHRoZSBsb2dpYyBpbiB2aXJ0dWFsZW52LnB5IGZvciBsb2NhdGluZyB0aGUKICAgICMgbm8tZ2xvYmFsLXNpdGUtcGFja2FnZXMudHh0IGZpbGUKICAgIHNpdGVfbW9kX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc2l0ZS5fX2ZpbGVfXykpCiAgICBub19nbG9iYWxfZmlsZSA9IG9zLnBhdGguam9pbihzaXRlX21vZF9kaXIsICduby1nbG9iYWwtc2l0ZS1wYWNrYWdlcy50eHQnKQogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCkgYW5kIG9zLnBhdGguaXNmaWxlKG5vX2dsb2JhbF9maWxlKToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgc3JjX3ByZWZpeCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnc3JjJykKZWxzZToKICAgICMgRklYTUU6IGtlZXAgc3JjIGluIGN3ZCBmb3Igbm93IChpdCBpcyBub3QgYSB0ZW1wb3JhcnkgZm9sZGVyKQogICAgdHJ5OgogICAgICAgIHNyY19wcmVmaXggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICdzcmMnKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgIyBJbiBjYXNlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGhhcyBiZWVuIHJlbmFtZWQgb3IgZGVsZXRlZAogICAgICAgIHN5cy5leGl0KAogICAgICAgICAgICAiVGhlIGZvbGRlciB5b3UgYXJlIGV4ZWN1dGluZyBwaXAgZnJvbSBjYW4gbm8gbG9uZ2VyIGJlIGZvdW5kLiIKICAgICAgICApCgojIHVuZGVyIG1hY09TICsgdmlydHVhbGVudiBzeXMucHJlZml4IGlzIG5vdCBwcm9wZXJseSByZXNvbHZlZAojIGl0IGlzIHNvbWV0aGluZyBsaWtlIC9wYXRoL3RvL3B5dGhvbi9iaW4vLi4KIyBOb3RlOiB1c2luZyByZWFscGF0aCBkdWUgdG8gdG1wIGRpcnMgb24gT1NYIGJlaW5nIHN5bWxpbmtzCnNyY19wcmVmaXggPSBvcy5wYXRoLmFic3BhdGgoc3JjX3ByZWZpeCkKCiMgRklYTUUgZG9lc24ndCBhY2NvdW50IGZvciB2ZW52IGxpbmtlZCB0byBnbG9iYWwgc2l0ZS1wYWNrYWdlcwoKc2l0ZV9wYWNrYWdlcyA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpCnVzZXJfc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCnVzZXJfZGlyID0gZXhwYW5kdXNlcignficpCmlmIFdJTkRPV1M6CiAgICBiaW5fcHkgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ1NjcmlwdHMnKQogICAgYmluX3VzZXIgPSBvcy5wYXRoLmpvaW4odXNlcl9zaXRlLCAnU2NyaXB0cycpCiAgICAjIGJ1aWxkb3V0IHVzZXMgJ2Jpbicgb24gV2luZG93cyB0b28/CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYmluX3B5KToKICAgICAgICBiaW5fcHkgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ2JpbicpCiAgICAgICAgYmluX3VzZXIgPSBvcy5wYXRoLmpvaW4odXNlcl9zaXRlLCAnYmluJykKCiAgICBjb25maWdfYmFzZW5hbWUgPSAncGlwLmluaScKCiAgICBsZWdhY3lfc3RvcmFnZV9kaXIgPSBvcy5wYXRoLmpvaW4odXNlcl9kaXIsICdwaXAnKQogICAgbGVnYWN5X2NvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKAogICAgICAgIGxlZ2FjeV9zdG9yYWdlX2RpciwKICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICApCmVsc2U6CiAgICBiaW5fcHkgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ2JpbicpCiAgICBiaW5fdXNlciA9IG9zLnBhdGguam9pbih1c2VyX3NpdGUsICdiaW4nKQoKICAgIGNvbmZpZ19iYXNlbmFtZSA9ICdwaXAuY29uZicKCiAgICBsZWdhY3lfc3RvcmFnZV9kaXIgPSBvcy5wYXRoLmpvaW4odXNlcl9kaXIsICcucGlwJykKICAgIGxlZ2FjeV9jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKICAgICAgICBsZWdhY3lfc3RvcmFnZV9kaXIsCiAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgKQoKICAgICMgRm9yY2luZyB0byB1c2UgL3Vzci9sb2NhbC9iaW4gZm9yIHN0YW5kYXJkIG1hY09TIGZyYW1ld29yayBpbnN0YWxscwogICAgIyBBbHNvIGxvZyB0byB+L0xpYnJhcnkvTG9ncy8gZm9yIHVzZSB3aXRoIHRoZSBDb25zb2xlLmFwcCBsb2cgdmlld2VyCiAgICBpZiBzeXMucGxhdGZvcm1bOjZdID09ICdkYXJ3aW4nIGFuZCBzeXMucHJlZml4WzoxNl0gPT0gJy9TeXN0ZW0vTGlicmFyeS8nOgogICAgICAgIGJpbl9weSA9ICcvdXNyL2xvY2FsL2JpbicKCnNpdGVfY29uZmlnX2ZpbGVzID0gWwogICAgb3MucGF0aC5qb2luKHBhdGgsIGNvbmZpZ19iYXNlbmFtZSkKICAgIGZvciBwYXRoIGluIGFwcGRpcnMuc2l0ZV9jb25maWdfZGlycygncGlwJykKXQoKCmRlZiBkaXN0dXRpbHNfc2NoZW1lKGRpc3RfbmFtZSwgdXNlcj1GYWxzZSwgaG9tZT1Ob25lLCByb290PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPUZhbHNlLCBwcmVmaXg9Tm9uZSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpc3R1dGlscyBpbnN0YWxsIHNjaGVtZQogICAgIiIiCiAgICBmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KCiAgICBzY2hlbWUgPSB7fQoKICAgIGlmIGlzb2xhdGVkOgogICAgICAgIGV4dHJhX2Rpc3RfYXJncyA9IHsic2NyaXB0X2FyZ3MiOiBbIi0tbm8tdXNlci1jZmciXX0KICAgIGVsc2U6CiAgICAgICAgZXh0cmFfZGlzdF9hcmdzID0ge30KICAgIGRpc3RfYXJncyA9IHsnbmFtZSc6IGRpc3RfbmFtZX0KICAgIGRpc3RfYXJncy51cGRhdGUoZXh0cmFfZGlzdF9hcmdzKQoKICAgIGQgPSBEaXN0cmlidXRpb24oZGlzdF9hcmdzKQogICAgZC5wYXJzZV9jb25maWdfZmlsZXMoKQogICAgaSA9IGQuZ2V0X2NvbW1hbmRfb2JqKCdpbnN0YWxsJywgY3JlYXRlPVRydWUpCiAgICAjIE5PVEU6IHNldHRpbmcgdXNlciBvciBob21lIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgdGhlIGhvbWUgZGlyCiAgICAjIG9yIHVzZXIgYmFzZSBmb3IgaW5zdGFsbGF0aW9ucyBkdXJpbmcgZmluYWxpemVfb3B0aW9ucygpCiAgICAjIGlkZWFsbHksIHdlJ2QgcHJlZmVyIGEgc2NoZW1lIGNsYXNzIHRoYXQgaGFzIG5vIHNpZGUtZWZmZWN0cy4KICAgIGFzc2VydCBub3QgKHVzZXIgYW5kIHByZWZpeCksICJ1c2VyPXswfSBwcmVmaXg9ezF9Ii5mb3JtYXQodXNlciwgcHJlZml4KQogICAgaS51c2VyID0gdXNlciBvciBpLnVzZXIKICAgIGlmIHVzZXI6CiAgICAgICAgaS5wcmVmaXggPSAiIgogICAgaS5wcmVmaXggPSBwcmVmaXggb3IgaS5wcmVmaXgKICAgIGkuaG9tZSA9IGhvbWUgb3IgaS5ob21lCiAgICBpLnJvb3QgPSByb290IG9yIGkucm9vdAogICAgaS5maW5hbGl6ZV9vcHRpb25zKCkKICAgIGZvciBrZXkgaW4gU0NIRU1FX0tFWVM6CiAgICAgICAgc2NoZW1lW2tleV0gPSBnZXRhdHRyKGksICdpbnN0YWxsXycgKyBrZXkpCgogICAgIyBpbnN0YWxsX2xpYiBzcGVjaWZpZWQgaW4gc2V0dXAuY2ZnIHNob3VsZCBpbnN0YWxsICpldmVyeXRoaW5nKgogICAgIyBpbnRvIHRoZXJlIChpLmUuIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBib3RoIHB1cmVsaWIgYW5kCiAgICAjIHBsYXRsaWIpLiAgTm90ZSwgaS5pbnN0YWxsX2xpYiBpcyAqYWx3YXlzKiBzZXQgYWZ0ZXIKICAgICMgZmluYWxpemVfb3B0aW9ucygpOyB3ZSBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgaGVyZSBpZiB0aGUgdXNlcgogICAgIyBoYXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgaXQgaGVuY2UgZ29pbmcgYmFjayB0byB0aGUgY29uZmlnCiAgICBpZiAnaW5zdGFsbF9saWInIGluIGQuZ2V0X29wdGlvbl9kaWN0KCdpbnN0YWxsJyk6CiAgICAgICAgc2NoZW1lLnVwZGF0ZShkaWN0KHB1cmVsaWI9aS5pbnN0YWxsX2xpYiwgcGxhdGxpYj1pLmluc3RhbGxfbGliKSkKCiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICBzY2hlbWVbJ2hlYWRlcnMnXSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgc3lzLnByZWZpeCwKICAgICAgICAgICAgJ2luY2x1ZGUnLAogICAgICAgICAgICAnc2l0ZScsCiAgICAgICAgICAgICdweXRob24nICsgc3lzLnZlcnNpb25bOjNdLAogICAgICAgICAgICBkaXN0X25hbWUsCiAgICAgICAgKQoKICAgICAgICBpZiByb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXRoX25vX2RyaXZlID0gb3MucGF0aC5zcGxpdGRyaXZlKAogICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKHNjaGVtZVsiaGVhZGVycyJdKSlbMV0KICAgICAgICAgICAgc2NoZW1lWyJoZWFkZXJzIl0gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICByb290LAogICAgICAgICAgICAgICAgcGF0aF9ub19kcml2ZVsxOl0sCiAgICAgICAgICAgICkKCiAgICByZXR1cm4gc2NoZW1lClBLAwQUAAAAAAAAACEAqhpnvEcAAABHAAAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvbW9kZWxzL19faW5pdF9fLnB5ZnJvbSBwaXAubW9kZWxzLmluZGV4IGltcG9ydCBJbmRleCwgUHlQSQoKCl9fYWxsX18gPSBbIkluZGV4IiwgIlB5UEkiXQpQSwMEFAAAAAAAAAAhAGhOMm3nAQAA5wEAACMAAABweXBpX19waXBfOV8wXzMvcGlwL21vZGVscy9pbmRleC5weWZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgoKY2xhc3MgSW5kZXgob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwpOgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5uZXRsb2MgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKS5uZXRsb2MKICAgICAgICBzZWxmLnNpbXBsZV91cmwgPSBzZWxmLnVybF90b19wYXRoKCdzaW1wbGUnKQogICAgICAgIHNlbGYucHlwaV91cmwgPSBzZWxmLnVybF90b19wYXRoKCdweXBpJykKICAgICAgICBzZWxmLnBpcF9qc29uX3VybCA9IHNlbGYudXJsX3RvX3BhdGgoJ3B5cGkvcGlwL2pzb24nKQoKICAgIGRlZiB1cmxfdG9fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybGpvaW4oc2VsZi51cmwsIHBhdGgpCgoKUHlQSSA9IEluZGV4KCdodHRwczovL3B5cGkucHl0aG9uLm9yZy8nKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACoAAABweXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAM9lYqg2BgAANgYAACcAAABweXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvY2hlY2sucHkKCmRlZiBjaGVja19yZXF1aXJlbWVudHMoaW5zdGFsbGVkX2Rpc3RzKToKICAgIG1pc3NpbmdfcmVxc19kaWN0ID0ge30KICAgIGluY29tcGF0aWJsZV9yZXFzX2RpY3QgPSB7fQoKICAgIGZvciBkaXN0IGluIGluc3RhbGxlZF9kaXN0czoKICAgICAgICBrZXkgPSAnJXM9PSVzJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgICAgICBtaXNzaW5nX3JlcXMgPSBsaXN0KGdldF9taXNzaW5nX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKSkKICAgICAgICBpZiBtaXNzaW5nX3JlcXM6CiAgICAgICAgICAgIG1pc3NpbmdfcmVxc19kaWN0W2tleV0gPSBtaXNzaW5nX3JlcXMKCiAgICAgICAgaW5jb21wYXRpYmxlX3JlcXMgPSBsaXN0KGdldF9pbmNvbXBhdGlibGVfcmVxcygKICAgICAgICAgICAgZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKSkKICAgICAgICBpZiBpbmNvbXBhdGlibGVfcmVxczoKICAgICAgICAgICAgaW5jb21wYXRpYmxlX3JlcXNfZGljdFtrZXldID0gaW5jb21wYXRpYmxlX3JlcXMKCiAgICByZXR1cm4gKG1pc3NpbmdfcmVxc19kaWN0LCBpbmNvbXBhdGlibGVfcmVxc19kaWN0KQoKCmRlZiBnZXRfbWlzc2luZ19yZXFzKGRpc3QsIGluc3RhbGxlZF9kaXN0cyk6CiAgICAiIiJSZXR1cm4gYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYGRpc3RgIHRoYXQgYXJlbid0IHByZXNlbnQgaW4KICAgIGBpbnN0YWxsZWRfZGlzdHNgLgoKICAgICIiIgogICAgaW5zdGFsbGVkX25hbWVzID0gc2V0KGQucHJvamVjdF9uYW1lLmxvd2VyKCkgZm9yIGQgaW4gaW5zdGFsbGVkX2Rpc3RzKQogICAgbWlzc2luZ19yZXF1aXJlbWVudHMgPSBzZXQoKQoKICAgIGZvciByZXF1aXJlbWVudCBpbiBkaXN0LnJlcXVpcmVzKCk6CiAgICAgICAgaWYgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lLmxvd2VyKCkgbm90IGluIGluc3RhbGxlZF9uYW1lczoKICAgICAgICAgICAgbWlzc2luZ19yZXF1aXJlbWVudHMuYWRkKHJlcXVpcmVtZW50KQogICAgICAgICAgICB5aWVsZCByZXF1aXJlbWVudAoKCmRlZiBnZXRfaW5jb21wYXRpYmxlX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKToKICAgICIiIlJldHVybiBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiBgZGlzdGAgdGhhdCBhcmUgcHJlc2VudCBpbgogICAgYGluc3RhbGxlZF9kaXN0c2AsIGJ1dCBoYXZlIGluY29tcGF0aWJsZSB2ZXJzaW9ucy4KCiAgICAiIiIKICAgIGluc3RhbGxlZF9kaXN0c19ieV9uYW1lID0ge30KICAgIGZvciBpbnN0YWxsZWRfZGlzdCBpbiBpbnN0YWxsZWRfZGlzdHM6CiAgICAgICAgaW5zdGFsbGVkX2Rpc3RzX2J5X25hbWVbaW5zdGFsbGVkX2Rpc3QucHJvamVjdF9uYW1lXSA9IGluc3RhbGxlZF9kaXN0CgogICAgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKToKICAgICAgICBwcmVzZW50X2Rpc3QgPSBpbnN0YWxsZWRfZGlzdHNfYnlfbmFtZS5nZXQocmVxdWlyZW1lbnQucHJvamVjdF9uYW1lKQoKICAgICAgICBpZiBwcmVzZW50X2Rpc3QgYW5kIHByZXNlbnRfZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgIHlpZWxkIChyZXF1aXJlbWVudCwgcHJlc2VudF9kaXN0KQpQSwMEFAAAAAAAAAAhAPkiMzNKFAAAShQAACgAAABweXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvZnJlZXplLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKaW1wb3J0IHBpcApmcm9tIHBpcC5yZXEgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIHBpcC5yZXEucmVxX2ZpbGUgaW1wb3J0IENPTU1FTlRfUkUKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBrZ19yZXNvdXJjZXMgaW1wb3J0IFJlcXVpcmVtZW50UGFyc2VFcnJvcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBmcmVlemUoCiAgICAgICAgcmVxdWlyZW1lbnQ9Tm9uZSwKICAgICAgICBmaW5kX2xpbmtzPU5vbmUsIGxvY2FsX29ubHk9Tm9uZSwgdXNlcl9vbmx5PU5vbmUsIHNraXBfcmVnZXg9Tm9uZSwKICAgICAgICBkZWZhdWx0X3Zjcz1Ob25lLAogICAgICAgIGlzb2xhdGVkPUZhbHNlLAogICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsCiAgICAgICAgc2tpcD0oKSk6CiAgICBmaW5kX2xpbmtzID0gZmluZF9saW5rcyBvciBbXQogICAgc2tpcF9tYXRjaCA9IE5vbmUKCiAgICBpZiBza2lwX3JlZ2V4OgogICAgICAgIHNraXBfbWF0Y2ggPSByZS5jb21waWxlKHNraXBfcmVnZXgpLnNlYXJjaAoKICAgIGRlcGVuZGVuY3lfbGlua3MgPSBbXQoKICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQ6CiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICBpZiAnI2VnZz0nIGluIGxpbms6CiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuYXBwZW5kKGxpbmspCiAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgIHlpZWxkICctZiAlcycgJSBsaW5rCiAgICBpbnN0YWxsYXRpb25zID0ge30KICAgIGZvciBkaXN0IGluIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PWxvY2FsX29ubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX29ubHk9dXNlcl9vbmx5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IHBpcC5Gcm96ZW5SZXF1aXJlbWVudC5mcm9tX2Rpc3QoCiAgICAgICAgICAgICAgICBkaXN0LAogICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcwogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFJlcXVpcmVtZW50UGFyc2VFcnJvcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIHJlcXVpcmVtZW50OiAlcyIsCiAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaW5zdGFsbGF0aW9uc1tyZXEubmFtZV0gPSByZXEKCiAgICBpZiByZXF1aXJlbWVudDoKICAgICAgICAjIHRoZSBvcHRpb25zIHRoYXQgZG9uJ3QgZ2V0IHR1cm5lZCBpbnRvIGFuIEluc3RhbGxSZXF1aXJlbWVudAogICAgICAgICMgc2hvdWxkIG9ubHkgYmUgZW1pdHRlZCBvbmNlLCBldmVuIGlmIHRoZSBzYW1lIG9wdGlvbiBpcyBpbiBtdWx0aXBsZQogICAgICAgICMgcmVxdWlyZW1lbnRzIGZpbGVzLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBoYXMgYmVlbiBlbWl0dGVkCiAgICAgICAgIyBzbyB0aGF0IHdlIGRvbid0IGVtaXQgaXQgYWdhaW4gaWYgaXQncyBzZWVuIGFnYWluCiAgICAgICAgZW1pdHRlZF9vcHRpb25zID0gc2V0KCkKICAgICAgICBmb3IgcmVxX2ZpbGVfcGF0aCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgd2l0aCBvcGVuKHJlcV9maWxlX3BhdGgpIGFzIHJlcV9maWxlOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gcmVxX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBsaW5lLnN0cmlwKCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCcjJykgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2lwX21hdGNoIGFuZCBza2lwX21hdGNoKGxpbmUpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdGFydHN3aXRoKCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1aJywgJy0tYWx3YXlzLXVuemlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWYnLCAnLS1maW5kLWxpbmtzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWknLCAnLS1pbmRleC11cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXByZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdHJ1c3RlZC1ob3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1wcm9jZXNzLWRlcGVuZGVuY3ktbGlua3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLWV4dHJhLWluZGV4LXVybCcpKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIGVtaXR0ZWRfb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWRfb3B0aW9ucy5hZGQobGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctZScpIG9yIGxpbmUuc3RhcnRzd2l0aCgnLS1lZGl0YWJsZScpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy1lJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsyOl0uc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbGVuKCctLWVkaXRhYmxlJyk6XS5zdHJpcCgpLmxzdHJpcCgnPScpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fZWRpdGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92Y3M9ZGVmYXVsdF92Y3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9yZXEgPSBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lX3JlcS5uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBsaW5lIGluIHJlcXVpcmVtZW50IGZpbGUgWyVzXSBiZWNhdXNlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdCdzIG5vdCBjbGVhciB3aGF0IGl0IHdvdWxkIGluc3RhbGw6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWxlX3BhdGgsIGxpbmUuc3RyaXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIChhZGQgI2VnZz1QYWNrYWdlTmFtZSB0byB0aGUgVVJMIHRvIGF2b2lkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGlzIHdhcm5pbmcpIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxpZiBsaW5lX3JlcS5uYW1lIG5vdCBpbiBpbnN0YWxsYXRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlbWVudCBmaWxlIFslc10gY29udGFpbnMgJXMsIGJ1dCB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpbGVfcGF0aCwgQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzdHIoaW5zdGFsbGF0aW9uc1tsaW5lX3JlcS5uYW1lXSkucnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGluc3RhbGxhdGlvbnNbbGluZV9yZXEubmFtZV0KCiAgICAgICAgeWllbGQoCiAgICAgICAgICAgICcjIyBUaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyB3ZXJlIGFkZGVkIGJ5ICcKICAgICAgICAgICAgJ3BpcCBmcmVlemU6JwogICAgICAgICkKICAgIGZvciBpbnN0YWxsYXRpb24gaW4gc29ydGVkKAogICAgICAgICAgICBpbnN0YWxsYXRpb25zLnZhbHVlcygpLCBrZXk9bGFtYmRhIHg6IHgubmFtZS5sb3dlcigpKToKICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZShpbnN0YWxsYXRpb24ubmFtZSkgbm90IGluIHNraXA6CiAgICAgICAgICAgIHlpZWxkIHN0cihpbnN0YWxsYXRpb24pLnJzdHJpcCgpClBLAwQUAAAAAAAAACEA+iiEteQqAADkKgAAIQAAAHB5cGlfX3BpcF85XzBfMy9waXAvcGVwNDI1dGFncy5weSIiIkdlbmVyYXRlIGFuZCB3b3JrIHdpdGggUEVQIDQyNSBDb21wYXRpYmlsaXR5IFRhZ3MuIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBsb2dnaW5nCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hIG5vY292ZXIKICAgICMgUHl0aG9uIDwgMi43CiAgICBpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZyBhcyBzeXNjb25maWcKaW1wb3J0IGRpc3R1dGlscy51dGlsCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IE9yZGVyZWREaWN0CmltcG9ydCBwaXAudXRpbHMuZ2xpYmMKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKX29zeF9hcmNoX3BhdCA9IHJlLmNvbXBpbGUocicoLispXyhcZCspXyhcZCspXyguKyknKQoKCmRlZiBnZXRfY29uZmlnX3Zhcih2YXIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIodmFyKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgSXNzdWUgIzEwNzQKICAgICAgICB3YXJuaW5ncy53YXJuKCJ7MH0iLmZvcm1hdChlKSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2FiYnJfaW1wbCgpOgogICAgIiIiUmV0dXJuIGFiYnJldmlhdGVkIGltcGxlbWVudGF0aW9uIG5hbWUuIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICAgICAgcHlpbXBsID0gJ3BwJwogICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHB5aW1wbCA9ICdqeScKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgICAgIHB5aW1wbCA9ICdpcCcKICAgIGVsc2U6CiAgICAgICAgcHlpbXBsID0gJ2NwJwogICAgcmV0dXJuIHB5aW1wbAoKCmRlZiBnZXRfaW1wbF92ZXIoKToKICAgICIiIlJldHVybiBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLiIiIgogICAgaW1wbF92ZXIgPSBnZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgaW1wbF92ZXIgb3IgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgaW1wbF92ZXIgPSAnJy5qb2luKG1hcChzdHIsIGdldF9pbXBsX3ZlcnNpb25faW5mbygpKSkKICAgIHJldHVybiBpbXBsX3ZlcgoKCmRlZiBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKToKICAgICIiIlJldHVybiBzeXMudmVyc2lvbl9pbmZvLWxpa2UgdHVwbGUgZm9yIHVzZSBpbiBkZWNyZW1lbnRpbmcgdGhlIG1pbm9yCiAgICB2ZXJzaW9uLiIiIgogICAgaWYgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgIyBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yODgyCiAgICAgICAgcmV0dXJuIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdCgoKZGVmIGdldF9pbXBsX3RhZygpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBUYWcgZm9yIHRoaXMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCiAgICAiIiIKICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoZ2V0X2FiYnJfaW1wbCgpLCBnZXRfaW1wbF92ZXIoKSkKCgpkZWYgZ2V0X2ZsYWcodmFyLCBmYWxsYmFjaywgZXhwZWN0ZWQ9VHJ1ZSwgd2Fybj1UcnVlKToKICAgICIiIlVzZSBhIGZhbGxiYWNrIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgU09BQkkgZmxhZ3MgaWYgdGhlIG5lZWRlZCBjb25maWcKICAgIHZhciBpcyB1bnNldCBvciB1bmF2YWlsYWJsZS4iIiIKICAgIHZhbCA9IGdldF9jb25maWdfdmFyKHZhcikKICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgIGlmIHdhcm46CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiQ29uZmlnIHZhcmlhYmxlICclcycgaXMgdW5zZXQsIFB5dGhvbiBBQkkgdGFnIG1heSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgaW5jb3JyZWN0IiwgdmFyKQogICAgICAgIHJldHVybiBmYWxsYmFjaygpCiAgICByZXR1cm4gdmFsID09IGV4cGVjdGVkCgoKZGVmIGdldF9hYmlfdGFnKCk6CiAgICAiIiJSZXR1cm4gdGhlIEFCSSB0YWcgYmFzZWQgb24gU09BQkkgKGlmIGF2YWlsYWJsZSkgb3IgZW11bGF0ZSBTT0FCSQogICAgKENQeXRob24gMiwgUHlQeSkuIiIiCiAgICBzb2FiaSA9IGdldF9jb25maWdfdmFyKCdTT0FCSScpCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICBpZiBub3Qgc29hYmkgYW5kIGltcGwgaW4gKCdjcCcsICdwcCcpIGFuZCBoYXNhdHRyKHN5cywgJ21heHVuaWNvZGUnKToKICAgICAgICBkID0gJycKICAgICAgICBtID0gJycKICAgICAgICB1ID0gJycKICAgICAgICBpZiBnZXRfZmxhZygnUHlfREVCVUcnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JyksCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIGQgPSAnZCcKICAgICAgICBpZiBnZXRfZmxhZygnV0lUSF9QWU1BTExPQycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpbXBsID09ICdjcCcsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIG0gPSAnbScKICAgICAgICBpZiBnZXRfZmxhZygnUHlfVU5JQ09ERV9TSVpFJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN5cy5tYXh1bmljb2RlID09IDB4MTBmZmZmLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPTQsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMykpKSBcCiAgICAgICAgICAgICAgICBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICAgICAgdSA9ICd1JwogICAgICAgIGFiaSA9ICclcyVzJXMlcyVzJyAlIChpbXBsLCBnZXRfaW1wbF92ZXIoKSwgZCwgbSwgdSkKICAgIGVsaWYgc29hYmkgYW5kIHNvYWJpLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICAgICAgYWJpID0gJ2NwJyArIHNvYWJpLnNwbGl0KCctJylbMV0KICAgIGVsaWYgc29hYmk6CiAgICAgICAgYWJpID0gc29hYmkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGVsc2U6CiAgICAgICAgYWJpID0gTm9uZQogICAgcmV0dXJuIGFiaQoKCmRlZiBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgcmV0dXJuIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDcKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gb3VyIHBsYXRmb3JtIG5hbWUgJ3dpbjMyJywgJ2xpbnV4X3g4Nl82NCciIiIKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAjIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIHJldHVybnMgdGhlIHJlbGVhc2UgYmFzZWQgb24gdGhlIHZhbHVlCiAgICAgICAgIyBvZiBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgb24gd2hpY2ggUHl0aG9uIHdhcyBidWlsdCwgd2hpY2ggbWF5CiAgICAgICAgIyBiZSBzaWduaWZpY2FudGx5IG9sZGVyIHRoYW4gdGhlIHVzZXIncyBjdXJyZW50IG1hY2hpbmUuCiAgICAgICAgcmVsZWFzZSwgXywgbWFjaGluZSA9IHBsYXRmb3JtLm1hY192ZXIoKQogICAgICAgIHNwbGl0X3ZlciA9IHJlbGVhc2Uuc3BsaXQoJy4nKQoKICAgICAgICBpZiBtYWNoaW5lID09ICJ4ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gImkzODYiCiAgICAgICAgZWxpZiBtYWNoaW5lID09ICJwcGM2NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAicHBjIgoKICAgICAgICByZXR1cm4gJ21hY29zeF97MH1fezF9X3syfScuZm9ybWF0KHNwbGl0X3ZlclswXSwgc3BsaXRfdmVyWzFdLCBtYWNoaW5lKQoKICAgICMgWFhYIHJlbW92ZSBkaXN0dXRpbHMgZGVwZW5kZW5jeQogICAgcmVzdWx0ID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIHJlc3VsdCA9PSAibGludXhfeDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAjIDMyIGJpdCBQeXRob24gcHJvZ3JhbSAocnVubmluZyBvbiBhIDY0IGJpdCBMaW51eCk6IHBpcCBzaG91bGQgb25seQogICAgICAgICMgaW5zdGFsbCBhbmQgcnVuIDMyIGJpdCBjb21waWxlZCBleHRlbnNpb25zIGluIHRoYXQgY2FzZS4KICAgICAgICByZXN1bHQgPSAibGludXhfaTY4NiIKCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgIyBPbmx5IExpbnV4LCBhbmQgb25seSB4ODYtNjQgLyBpNjg2CiAgICBpZiBnZXRfcGxhdGZvcm0oKSBub3QgaW4gKCJsaW51eF94ODZfNjQiLCAibGludXhfaTY4NiIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIF9tYW55bGludXggbW9kdWxlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9tYW55bGludXgKICAgICAgICByZXR1cm4gYm9vbChfbWFueWxpbnV4Lm1hbnlsaW51eDFfY29tcGF0aWJsZSkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAjIEZhbGwgdGhyb3VnaCB0byBoZXVyaXN0aWMgY2hlY2sgYmVsb3cKICAgICAgICBwYXNzCgogICAgIyBDaGVjayBnbGliYyB2ZXJzaW9uLiBDZW50T1MgNSB1c2VzIGdsaWJjIDIuNS4KICAgIHJldHVybiBwaXAudXRpbHMuZ2xpYmMuaGF2ZV9jb21wYXRpYmxlX2dsaWJjKDIsIDUpCgoKZGVmIGdldF9kYXJ3aW5fYXJjaGVzKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCBhcmNoZXMgKGluY2x1ZGluZyBncm91cCBhcmNoZXMpIGZvcgogICAgdGhlIGdpdmVuIG1ham9yLCBtaW5vciBhbmQgbWFjaGluZSBhcmNoaXRlY3R1cmUgb2YgYW4gbWFjT1MgbWFjaGluZS4KICAgICIiIgogICAgYXJjaGVzID0gW10KCiAgICBkZWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBhcmNoKToKICAgICAgICAjIExvb2tpbmcgYXQgdGhlIGFwcGxpY2F0aW9uIHN1cHBvcnQgZm9yIG1hY09TIHZlcnNpb25zIGluIHRoZSBjaGFydAogICAgICAgICMgcHJvdmlkZWQgYnkgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT1NfWCNWZXJzaW9ucyBpdCBhcHBlYXJzCiAgICAgICAgIyBvdXIgdGltZWxpbmUgbG9va3Mgcm91Z2hseSBsaWtlOgogICAgICAgICMKICAgICAgICAjIDEwLjAgLSBJbnRyb2R1Y2VzIHBwYyBzdXBwb3J0LgogICAgICAgICMgMTAuNCAtIEludHJvZHVjZXMgcHBjNjQsIGkzODYsIGFuZCB4ODZfNjQgc3VwcG9ydCwgaG93ZXZlciB0aGUgcHBjNjQKICAgICAgICAjICAgICAgICBhbmQgeDg2XzY0IHN1cHBvcnQgaXMgQ0xJIG9ubHksIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgR1VJCiAgICAgICAgIyAgICAgICAgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNSAtIEV4dGVuZHMgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IHRvIGNvdmVyIEdVSSBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC42IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjNjQKICAgICAgICAjIDEwLjcgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGMKICAgICAgICAjCiAgICAgICAgIyBHaXZlbiB0aGF0IHdlIGRvIG5vdCBrbm93IGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBDTEkgb3IgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uLCB3ZSBtdXN0IGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIGl0IG1pZ2h0IGJlIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCBkaWQgbm90IG9jY3VyCiAgICAgICAgIyB1bnRpbCAxMC41LgogICAgICAgICMKICAgICAgICAjIE5vdGU6IFRoZSBhYm92ZSBpbmZvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSAiQXBwbGljYXRpb24gc3VwcG9ydCIKICAgICAgICAjICAgICAgIGNvbHVtbiBpbiB0aGUgY2hhcnQgbm90IHRoZSAiUHJvY2Vzc29yIHN1cHBvcnQiIHNpbmNlIEkgYmVsaWV2ZQogICAgICAgICMgICAgICAgdGhhdCB3ZSBjYXJlIGFib3V0IHdoYXQgaW5zdHJ1Y3Rpb24gc2V0cyBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlCiAgICAgICAgIyAgICAgICBub3Qgd2hpY2ggcHJvY2Vzc29ycyB0aGUgT1Mgc3VwcG9ydHMuCiAgICAgICAgaWYgYXJjaCA9PSAncHBjJzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpIDw9ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdwcGM2NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA9PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAnaTM4Nic6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDQpCiAgICAgICAgaWYgYXJjaCA9PSAneDg2XzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNSkKICAgICAgICBpZiBhcmNoIGluIGdyb3VwczoKICAgICAgICAgICAgZm9yIGdhcmNoIGluIGdyb3Vwc1thcmNoXToKICAgICAgICAgICAgICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZ3JvdXBzID0gT3JkZXJlZERpY3QoWwogICAgICAgICgiZmF0IiwgKCJpMzg2IiwgInBwYyIpKSwKICAgICAgICAoImludGVsIiwgKCJ4ODZfNjQiLCAiaTM4NiIpKSwKICAgICAgICAoImZhdDY0IiwgKCJ4ODZfNjQiLCAicHBjNjQiKSksCiAgICAgICAgKCJmYXQzMiIsICgieDg2XzY0IiwgImkzODYiLCAicHBjIikpLAogICAgXSkKCiAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgICAgIGFyY2hlcy5hcHBlbmQobWFjaGluZSkKCiAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzOgogICAgICAgIGlmIG1hY2hpbmUgaW4gZ3JvdXBzW2dhcmNoXSBhbmQgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQoZ2FyY2gpCgogICAgYXJjaGVzLmFwcGVuZCgndW5pdmVyc2FsJykKCiAgICByZXR1cm4gYXJjaGVzCgoKZGVmIGdldF9zdXBwb3J0ZWQodmVyc2lvbnM9Tm9uZSwgbm9hcmNoPUZhbHNlLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICAgICAgICBpbXBsPU5vbmUsIGFiaT1Ob25lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MgZm9yIGVhY2ggdmVyc2lvbiBzcGVjaWZpZWQgaW4KICAgIGB2ZXJzaW9uc2AuCgogICAgOnBhcmFtIHZlcnNpb25zOiBhIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb25zLCBvZiB0aGUgZm9ybSBbIjMzIiwgIjMyIl0sCiAgICAgICAgb3IgTm9uZS4gVGhlIGZpcnN0IHZlcnNpb24gd2lsbCBiZSBhc3N1bWVkIHRvIHN1cHBvcnQgb3VyIEFCSS4KICAgIDpwYXJhbSBwbGF0Zm9ybTogc3BlY2lmeSB0aGUgZXhhY3QgcGxhdGZvcm0geW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBzeXN0ZW0gcGxhdGZvcm0uCiAgICA6cGFyYW0gaW1wbDogc3BlY2lmeSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24geW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBpbXBsLgogICAgOnBhcmFtIGFiaTogc3BlY2lmeSB0aGUgZXhhY3QgYWJpIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgYWJpLgogICAgIiIiCiAgICBzdXBwb3J0ZWQgPSBbXQoKICAgICMgVmVyc2lvbnMgbXVzdCBiZSBnaXZlbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHByZWZlcmVuY2UKICAgIGlmIHZlcnNpb25zIGlzIE5vbmU6CiAgICAgICAgdmVyc2lvbnMgPSBbXQogICAgICAgIHZlcnNpb25faW5mbyA9IGdldF9pbXBsX3ZlcnNpb25faW5mbygpCiAgICAgICAgbWFqb3IgPSB2ZXJzaW9uX2luZm9bOi0xXQogICAgICAgICMgU3VwcG9ydCBhbGwgcHJldmlvdXMgbWlub3IgUHl0aG9uIHZlcnNpb25zLgogICAgICAgIGZvciBtaW5vciBpbiByYW5nZSh2ZXJzaW9uX2luZm9bLTFdLCAtMSwgLTEpOgogICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihtYXAoc3RyLCBtYWpvciArIChtaW5vciwpKSkpCgogICAgaW1wbCA9IGltcGwgb3IgZ2V0X2FiYnJfaW1wbCgpCgogICAgYWJpcyA9IFtdCgogICAgYWJpID0gYWJpIG9yIGdldF9hYmlfdGFnKCkKICAgIGlmIGFiaToKICAgICAgICBhYmlzWzA6MF0gPSBbYWJpXQoKICAgIGFiaTNzID0gc2V0KCkKICAgIGltcG9ydCBpbXAKICAgIGZvciBzdWZmaXggaW4gaW1wLmdldF9zdWZmaXhlcygpOgogICAgICAgIGlmIHN1ZmZpeFswXS5zdGFydHN3aXRoKCcuYWJpJyk6CiAgICAgICAgICAgIGFiaTNzLmFkZChzdWZmaXhbMF0uc3BsaXQoJy4nLCAyKVsxXSkKCiAgICBhYmlzLmV4dGVuZChzb3J0ZWQobGlzdChhYmkzcykpKQoKICAgIGFiaXMuYXBwZW5kKCdub25lJykKCiAgICBpZiBub3Qgbm9hcmNoOgogICAgICAgIGFyY2ggPSBwbGF0Zm9ybSBvciBnZXRfcGxhdGZvcm0oKQogICAgICAgIGlmIGFyY2guc3RhcnRzd2l0aCgnbWFjb3N4Jyk6CiAgICAgICAgICAgICMgc3VwcG9ydCBtYWNvc3gtMTAuNi1pbnRlbCBvbiBtYWNvc3gtMTAuOS14ODZfNjQKICAgICAgICAgICAgbWF0Y2ggPSBfb3N4X2FyY2hfcGF0Lm1hdGNoKGFyY2gpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgbmFtZSwgbWFqb3IsIG1pbm9yLCBhY3R1YWxfYXJjaCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICB0cGwgPSAnezB9X3sxfV8laV8lcycuZm9ybWF0KG5hbWUsIG1ham9yKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW10KICAgICAgICAgICAgICAgIGZvciBtIGluIHJldmVyc2VkKHJhbmdlKGludChtaW5vcikgKyAxKSk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gZ2V0X2Rhcndpbl9hcmNoZXMoaW50KG1ham9yKSwgbSwgYWN0dWFsX2FyY2gpOgogICAgICAgICAgICAgICAgICAgICAgICBhcmNoZXMuYXBwZW5kKHRwbCAlIChtLCBhKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgYXJjaCBwYXR0ZXJuIGRpZG4ndCBtYXRjaCAoPyEpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KICAgICAgICBlbGlmIHBsYXRmb3JtIGlzIE5vbmUgYW5kIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaC5yZXBsYWNlKCdsaW51eCcsICdtYW55bGludXgxJyksIGFyY2hdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCgogICAgICAgICMgQ3VycmVudCB2ZXJzaW9uLCBjdXJyZW50IEFQSSAoYnVpbHQgc3BlY2lmaWNhbGx5IGZvciBvdXIgUHl0aG9uKToKICAgICAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksIGFiaSwgYXJjaCkpCgogICAgICAgICMgYWJpMyBtb2R1bGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbgogICAgICAgIGZvciB2ZXJzaW9uIGluIHZlcnNpb25zWzE6XToKICAgICAgICAgICAgIyBhYmkzIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjIKICAgICAgICAgICAgaWYgdmVyc2lvbiBpbiAoJzMxJywgJzMwJyk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBmb3IgYWJpIGluIGFiaTNzOiAgICMgZW1wdHkgc2V0IGlmIG5vdCBQeXRob24gMwogICAgICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCIlcyVzIiAlIChpbXBsLCB2ZXJzaW9uKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBIYXMgYmluYXJpZXMsIGRvZXMgbm90IHVzZSB0aGUgUHl0aG9uIEFQSToKICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uc1swXVswXSksICdub25lJywgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBidXQgcmVxdWlyZXMgb3VyIGltcGxlbWVudGF0aW9uOgogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgJ25vbmUnLCAnYW55JykpCiAgICAjIFRhZ2dlZCBzcGVjaWZpY2FsbHkgYXMgYmVpbmcgY3Jvc3MtdmVyc2lvbiBjb21wYXRpYmxlCiAgICAjICh3aXRoIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gc3BlY2lmaWVkKQogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgIyBObyBhYmkgLyBhcmNoLCBnZW5lcmljIFB5dGhvbgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbiwpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgcmV0dXJuIHN1cHBvcnRlZAoKc3VwcG9ydGVkX3RhZ3MgPSBnZXRfc3VwcG9ydGVkKCkKc3VwcG9ydGVkX3RhZ3Nfbm9hcmNoID0gZ2V0X3N1cHBvcnRlZChub2FyY2g9VHJ1ZSkKCmltcGxlbWVudGF0aW9uX3RhZyA9IGdldF9pbXBsX3RhZygpClBLAwQUAAAAAAAAACEAXGnSGRQBAAAUAQAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvcmVxL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSAucmVxX3NldCBpbXBvcnQgUmVxdWlyZW1lbnRTZXQsIFJlcXVpcmVtZW50cwpmcm9tIC5yZXFfZmlsZSBpbXBvcnQgcGFyc2VfcmVxdWlyZW1lbnRzCgpfX2FsbF9fID0gWwogICAgIlJlcXVpcmVtZW50U2V0IiwgIlJlcXVpcmVtZW50cyIsICJJbnN0YWxsUmVxdWlyZW1lbnQiLAogICAgInBhcnNlX3JlcXVpcmVtZW50cyIsCl0KUEsDBBQAAAAAAAAAIQAc4IwKli4AAJYuAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX2ZpbGUucHkiIiIKUmVxdWlyZW1lbnRzIGZpbGUgcGFyc2luZwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaGxleAppbXBvcnQgc3lzCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXJmYWxzZQoKaW1wb3J0IHBpcApmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgZ2V0X2ZpbGVfY29udGVudApmcm9tIHBpcC5yZXEucmVxX2luc3RhbGwgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoUmVxdWlyZW1lbnRzRmlsZVBhcnNlRXJyb3IpCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKCl9fYWxsX18gPSBbJ3BhcnNlX3JlcXVpcmVtZW50cyddCgpTQ0hFTUVfUkUgPSByZS5jb21waWxlKHInXihodHRwfGh0dHBzfGZpbGUpOicsIHJlLkkpCkNPTU1FTlRfUkUgPSByZS5jb21waWxlKHInKF58XHMpKyMuKiQnKQoKU1VQUE9SVEVEX09QVElPTlMgPSBbCiAgICBjbWRvcHRpb25zLmNvbnN0cmFpbnRzLAogICAgY21kb3B0aW9ucy5lZGl0YWJsZSwKICAgIGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzLAogICAgY21kb3B0aW9ucy5ub19pbmRleCwKICAgIGNtZG9wdGlvbnMuaW5kZXhfdXJsLAogICAgY21kb3B0aW9ucy5maW5kX2xpbmtzLAogICAgY21kb3B0aW9ucy5leHRyYV9pbmRleF91cmwsCiAgICBjbWRvcHRpb25zLmFsbG93X2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWwsCiAgICBjbWRvcHRpb25zLm5vX2FsbG93X2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5hbGxvd191bnNhZmUsCiAgICBjbWRvcHRpb25zLm5vX2FsbG93X3Vuc2FmZSwKICAgIGNtZG9wdGlvbnMudXNlX3doZWVsLAogICAgY21kb3B0aW9ucy5ub191c2Vfd2hlZWwsCiAgICBjbWRvcHRpb25zLmFsd2F5c191bnppcCwKICAgIGNtZG9wdGlvbnMubm9fYmluYXJ5LAogICAgY21kb3B0aW9ucy5vbmx5X2JpbmFyeSwKICAgIGNtZG9wdGlvbnMucHJlLAogICAgY21kb3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICBjbWRvcHRpb25zLnRydXN0ZWRfaG9zdCwKICAgIGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMsCl0KCiMgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gcmVxdWlyZW1lbnRzClNVUFBPUlRFRF9PUFRJT05TX1JFUSA9IFsKICAgIGNtZG9wdGlvbnMuaW5zdGFsbF9vcHRpb25zLAogICAgY21kb3B0aW9ucy5nbG9iYWxfb3B0aW9ucywKICAgIGNtZG9wdGlvbnMuaGFzaCwKXQoKIyB0aGUgJ2Rlc3QnIHN0cmluZyB2YWx1ZXMKU1VQUE9SVEVEX09QVElPTlNfUkVRX0RFU1QgPSBbbygpLmRlc3QgZm9yIG8gaW4gU1VQUE9SVEVEX09QVElPTlNfUkVRXQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoZmlsZW5hbWUsIGZpbmRlcj1Ob25lLCBjb21lc19mcm9tPU5vbmUsIG9wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPU5vbmUsIGNvbnN0cmFpbnQ9RmFsc2UsIHdoZWVsX2NhY2hlPU5vbmUpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudHMgZmlsZSBhbmQgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50IGluc3RhbmNlcy4KCiAgICA6cGFyYW0gZmlsZW5hbWU6ICAgIFBhdGggb3IgdXJsIG9mIHJlcXVpcmVtZW50cyBmaWxlLgogICAgOnBhcmFtIGZpbmRlcjogICAgICBJbnN0YW5jZSBvZiBwaXAuaW5kZXguUGFja2FnZUZpbmRlci4KICAgIDpwYXJhbSBjb21lc19mcm9tOiAgT3JpZ2luIGRlc2NyaXB0aW9uIG9mIHJlcXVpcmVtZW50cy4KICAgIDpwYXJhbSBvcHRpb25zOiAgICAgY2xpIG9wdGlvbnMuCiAgICA6cGFyYW0gc2Vzc2lvbjogICAgIEluc3RhbmNlIG9mIHBpcC5kb3dubG9hZC5QaXBTZXNzaW9uLgogICAgOnBhcmFtIGNvbnN0cmFpbnQ6ICBJZiB0cnVlLCBwYXJzaW5nIGEgY29uc3RyYWludCBmaWxlIHJhdGhlciB0aGFuCiAgICAgICAgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICA6cGFyYW0gd2hlZWxfY2FjaGU6IEluc3RhbmNlIG9mIHBpcC53aGVlbC5XaGVlbENhY2hlCiAgICAiIiIKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICJwYXJzZV9yZXF1aXJlbWVudHMoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAiJ3Nlc3Npb24nIgogICAgICAgICkKCiAgICBfLCBjb250ZW50ID0gZ2V0X2ZpbGVfY29udGVudCgKICAgICAgICBmaWxlbmFtZSwgY29tZXNfZnJvbT1jb21lc19mcm9tLCBzZXNzaW9uPXNlc3Npb24KICAgICkKCiAgICBsaW5lc19lbnVtID0gcHJlcHJvY2Vzcyhjb250ZW50LCBvcHRpb25zKQoKICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBsaW5lc19lbnVtOgogICAgICAgIHJlcV9pdGVyID0gcHJvY2Vzc19saW5lKGxpbmUsIGZpbGVuYW1lLCBsaW5lX251bWJlciwgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20sIG9wdGlvbnMsIHNlc3Npb24sIHdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9Y29uc3RyYWludCkKICAgICAgICBmb3IgcmVxIGluIHJlcV9pdGVyOgogICAgICAgICAgICB5aWVsZCByZXEKCgpkZWYgcHJlcHJvY2Vzcyhjb250ZW50LCBvcHRpb25zKToKICAgICIiIlNwbGl0LCBmaWx0ZXIsIGFuZCBqb2luIGxpbmVzLCBhbmQgcmV0dXJuIGEgbGluZSBpdGVyYXRvcgoKICAgIDpwYXJhbSBjb250ZW50OiB0aGUgY29udGVudCBvZiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUKICAgIDpwYXJhbSBvcHRpb25zOiBjbGkgb3B0aW9ucwogICAgIiIiCiAgICBsaW5lc19lbnVtID0gZW51bWVyYXRlKGNvbnRlbnQuc3BsaXRsaW5lcygpLCBzdGFydD0xKQogICAgbGluZXNfZW51bSA9IGpvaW5fbGluZXMobGluZXNfZW51bSkKICAgIGxpbmVzX2VudW0gPSBpZ25vcmVfY29tbWVudHMobGluZXNfZW51bSkKICAgIGxpbmVzX2VudW0gPSBza2lwX3JlZ2V4KGxpbmVzX2VudW0sIG9wdGlvbnMpCiAgICByZXR1cm4gbGluZXNfZW51bQoKCmRlZiBwcm9jZXNzX2xpbmUobGluZSwgZmlsZW5hbWUsIGxpbmVfbnVtYmVyLCBmaW5kZXI9Tm9uZSwgY29tZXNfZnJvbT1Ob25lLAogICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSwgc2Vzc2lvbj1Ob25lLCB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgIiIiUHJvY2VzcyBhIHNpbmdsZSByZXF1aXJlbWVudHMgbGluZTsgVGhpcyBjYW4gcmVzdWx0IGluIGNyZWF0aW5nL3lpZWxkaW5nCiAgICByZXF1aXJlbWVudHMsIG9yIHVwZGF0aW5nIHRoZSBmaW5kZXIuCgogICAgRm9yIGxpbmVzIHRoYXQgY29udGFpbiByZXF1aXJlbWVudHMsIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBoYXZlIGFuIGVmZmVjdAogICAgYXJlIGZyb20gU1VQUE9SVEVEX09QVElPTlNfUkVRLCBhbmQgdGhleSBhcmUgc2NvcGVkIHRvIHRoZQogICAgcmVxdWlyZW1lbnQuIE90aGVyIG9wdGlvbnMgZnJvbSBTVVBQT1JURURfT1BUSU9OUyBtYXkgYmUgcHJlc2VudCwgYnV0IGFyZQogICAgaWdub3JlZC4KCiAgICBGb3IgbGluZXMgdGhhdCBkbyBub3QgY29udGFpbiByZXF1aXJlbWVudHMsIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBoYXZlIGFuCiAgICBlZmZlY3QgYXJlIGZyb20gU1VQUE9SVEVEX09QVElPTlMuIE9wdGlvbnMgZnJvbSBTVVBQT1JURURfT1BUSU9OU19SRVEgbWF5CiAgICBiZSBwcmVzZW50LCBidXQgYXJlIGlnbm9yZWQuIFRoZXNlIGxpbmVzIG1heSBjb250YWluIG11bHRpcGxlIG9wdGlvbnMKICAgIChhbHRob3VnaCBvdXIgZG9jcyBpbXBseSBvbmx5IG9uZSBpcyBzdXBwb3J0ZWQpLCBhbmQgYWxsIG91ciBwYXJzZWQgYW5kCiAgICBhZmZlY3QgdGhlIGZpbmRlci4KCiAgICA6cGFyYW0gY29uc3RyYWludDogSWYgVHJ1ZSwgcGFyc2luZyBhIGNvbnN0cmFpbnRzIGZpbGUuCiAgICA6cGFyYW0gb3B0aW9uczogT3B0aW9uUGFyc2VyIG9wdGlvbnMgdGhhdCB3ZSBtYXkgdXBkYXRlCiAgICAiIiIKICAgIHBhcnNlciA9IGJ1aWxkX3BhcnNlcigpCiAgICBkZWZhdWx0cyA9IHBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKQogICAgZGVmYXVsdHMuaW5kZXhfdXJsID0gTm9uZQogICAgaWYgZmluZGVyOgogICAgICAgICMgYGZpbmRlci5mb3JtYXRfY29udHJvbGAgd2lsbCBiZSB1cGRhdGVkIGR1cmluZyBwYXJzaW5nCiAgICAgICAgZGVmYXVsdHMuZm9ybWF0X2NvbnRyb2wgPSBmaW5kZXIuZm9ybWF0X2NvbnRyb2wKICAgIGFyZ3Nfc3RyLCBvcHRpb25zX3N0ciA9IGJyZWFrX2FyZ3Nfb3B0aW9ucyhsaW5lKQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAzKToKICAgICAgICAjIFByaW9yIHRvIDIuNy4zLCBzaGxleCBjYW5ub3QgZGVhbCB3aXRoIHVuaWNvZGUgZW50cmllcwogICAgICAgIG9wdGlvbnNfc3RyID0gb3B0aW9uc19zdHIuZW5jb2RlKCd1dGY4JykKICAgIG9wdHMsIF8gPSBwYXJzZXIucGFyc2VfYXJncyhzaGxleC5zcGxpdChvcHRpb25zX3N0ciksIGRlZmF1bHRzKQoKICAgICMgcHJlc2VydmUgZm9yIHRoZSBuZXN0ZWQgY29kZSBwYXRoCiAgICBsaW5lX2NvbWVzX2Zyb20gPSAnJXMgJXMgKGxpbmUgJXMpJyAlICgKICAgICAgICAnLWMnIGlmIGNvbnN0cmFpbnQgZWxzZSAnLXInLCBmaWxlbmFtZSwgbGluZV9udW1iZXIpCgogICAgIyB5aWVsZCBhIGxpbmUgcmVxdWlyZW1lbnQKICAgIGlmIGFyZ3Nfc3RyOgogICAgICAgIGlzb2xhdGVkID0gb3B0aW9ucy5pc29sYXRlZF9tb2RlIGlmIG9wdGlvbnMgZWxzZSBGYWxzZQogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGNtZG9wdGlvbnMuY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucywgb3B0cykKICAgICAgICAjIGdldCB0aGUgb3B0aW9ucyB0aGF0IGFwcGx5IHRvIHJlcXVpcmVtZW50cwogICAgICAgIHJlcV9vcHRpb25zID0ge30KICAgICAgICBmb3IgZGVzdCBpbiBTVVBQT1JURURfT1BUSU9OU19SRVFfREVTVDoKICAgICAgICAgICAgaWYgZGVzdCBpbiBvcHRzLl9fZGljdF9fIGFuZCBvcHRzLl9fZGljdF9fW2Rlc3RdOgogICAgICAgICAgICAgICAgcmVxX29wdGlvbnNbZGVzdF0gPSBvcHRzLl9fZGljdF9fW2Rlc3RdCiAgICAgICAgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgYXJnc19zdHIsIGxpbmVfY29tZXNfZnJvbSwgY29uc3RyYWludD1jb25zdHJhaW50LAogICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwgb3B0aW9ucz1yZXFfb3B0aW9ucywgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICApCgogICAgIyB5aWVsZCBhbiBlZGl0YWJsZSByZXF1aXJlbWVudAogICAgZWxpZiBvcHRzLmVkaXRhYmxlczoKICAgICAgICBpc29sYXRlZCA9IG9wdGlvbnMuaXNvbGF0ZWRfbW9kZSBpZiBvcHRpb25zIGVsc2UgRmFsc2UKICAgICAgICBkZWZhdWx0X3ZjcyA9IG9wdGlvbnMuZGVmYXVsdF92Y3MgaWYgb3B0aW9ucyBlbHNlIE5vbmUKICAgICAgICB5aWVsZCBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9lZGl0YWJsZSgKICAgICAgICAgICAgb3B0cy5lZGl0YWJsZXNbMF0sIGNvbWVzX2Zyb209bGluZV9jb21lc19mcm9tLAogICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQsIGRlZmF1bHRfdmNzPWRlZmF1bHRfdmNzLCBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICApCgogICAgIyBwYXJzZSBhIG5lc3RlZCByZXF1aXJlbWVudHMgZmlsZQogICAgZWxpZiBvcHRzLnJlcXVpcmVtZW50cyBvciBvcHRzLmNvbnN0cmFpbnRzOgogICAgICAgIGlmIG9wdHMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICByZXFfcGF0aCA9IG9wdHMucmVxdWlyZW1lbnRzWzBdCiAgICAgICAgICAgIG5lc3RlZF9jb25zdHJhaW50ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXFfcGF0aCA9IG9wdHMuY29uc3RyYWludHNbMF0KICAgICAgICAgICAgbmVzdGVkX2NvbnN0cmFpbnQgPSBUcnVlCiAgICAgICAgIyBvcmlnaW5hbCBmaWxlIGlzIG92ZXIgaHR0cAogICAgICAgIGlmIFNDSEVNRV9SRS5zZWFyY2goZmlsZW5hbWUpOgogICAgICAgICAgICAjIGRvIGEgdXJsIGpvaW4gc28gcmVsYXRpdmUgcGF0aHMgd29yawogICAgICAgICAgICByZXFfcGF0aCA9IHVybGxpYl9wYXJzZS51cmxqb2luKGZpbGVuYW1lLCByZXFfcGF0aCkKICAgICAgICAjIG9yaWdpbmFsIGZpbGUgYW5kIG5lc3RlZCBmaWxlIGFyZSBwYXRocwogICAgICAgIGVsaWYgbm90IFNDSEVNRV9SRS5zZWFyY2gocmVxX3BhdGgpOgogICAgICAgICAgICAjIGRvIGEgam9pbiBzbyByZWxhdGl2ZSBwYXRocyB3b3JrCiAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSksIHJlcV9wYXRoKQogICAgICAgICMgVE9ETzogV2h5IG5vdCB1c2UgYGNvbWVzX2Zyb209Jy1yIHt9IChsaW5lIHt9KSdgIGhlcmUgYXMgd2VsbD8KICAgICAgICBwYXJzZXIgPSBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgIHJlcV9wYXRoLCBmaW5kZXIsIGNvbWVzX2Zyb20sIG9wdGlvbnMsIHNlc3Npb24sCiAgICAgICAgICAgIGNvbnN0cmFpbnQ9bmVzdGVkX2NvbnN0cmFpbnQsIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQogICAgICAgIGZvciByZXEgaW4gcGFyc2VyOgogICAgICAgICAgICB5aWVsZCByZXEKCiAgICAjIHBlcmNvbGF0ZSBoYXNoLWNoZWNraW5nIG9wdGlvbiB1cHdhcmQKICAgIGVsaWYgb3B0cy5yZXF1aXJlX2hhc2hlczoKICAgICAgICBvcHRpb25zLnJlcXVpcmVfaGFzaGVzID0gb3B0cy5yZXF1aXJlX2hhc2hlcwoKICAgICMgc2V0IGZpbmRlciBvcHRpb25zCiAgICBlbGlmIGZpbmRlcjoKICAgICAgICBpZiBvcHRzLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdHMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmluZGV4X3VybDoKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMgPSBbb3B0cy5pbmRleF91cmxdCiAgICAgICAgaWYgb3B0cy51c2Vfd2hlZWwgaXMgRmFsc2U6CiAgICAgICAgICAgIGZpbmRlci51c2Vfd2hlZWwgPSBGYWxzZQogICAgICAgICAgICBwaXAuaW5kZXguZm10X2N0bF9ub191c2Vfd2hlZWwoZmluZGVyLmZvcm1hdF9jb250cm9sKQogICAgICAgIGlmIG9wdHMubm9faW5kZXggaXMgVHJ1ZToKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMgPSBbXQogICAgICAgIGlmIG9wdHMuZXh0cmFfaW5kZXhfdXJsczoKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMuZXh0ZW5kKG9wdHMuZXh0cmFfaW5kZXhfdXJscykKICAgICAgICBpZiBvcHRzLmZpbmRfbGlua3M6CiAgICAgICAgICAgICMgRklYTUU6IGl0IHdvdWxkIGJlIG5pY2UgdG8ga2VlcCB0cmFjayBvZiB0aGUgc291cmNlCiAgICAgICAgICAgICMgb2YgdGhlIGZpbmRfbGlua3M6IHN1cHBvcnQgYSBmaW5kLWxpbmtzIGxvY2FsIHBhdGgKICAgICAgICAgICAgIyByZWxhdGl2ZSB0byBhIHJlcXVpcmVtZW50cyBmaWxlLgogICAgICAgICAgICB2YWx1ZSA9IG9wdHMuZmluZF9saW5rc1swXQogICAgICAgICAgICByZXFfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpCiAgICAgICAgICAgIHJlbGF0aXZlX3RvX3JlcXNfZmlsZSA9IG9zLnBhdGguam9pbihyZXFfZGlyLCB2YWx1ZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVsYXRpdmVfdG9fcmVxc19maWxlKToKICAgICAgICAgICAgICAgIHZhbHVlID0gcmVsYXRpdmVfdG9fcmVxc19maWxlCiAgICAgICAgICAgIGZpbmRlci5maW5kX2xpbmtzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBvcHRzLnByZToKICAgICAgICAgICAgZmluZGVyLmFsbG93X2FsbF9wcmVyZWxlYXNlcyA9IFRydWUKICAgICAgICBpZiBvcHRzLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgZmluZGVyLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IFRydWUKICAgICAgICBpZiBvcHRzLnRydXN0ZWRfaG9zdHM6CiAgICAgICAgICAgIGZpbmRlci5zZWN1cmVfb3JpZ2lucy5leHRlbmQoCiAgICAgICAgICAgICAgICAoIioiLCBob3N0LCAiKiIpIGZvciBob3N0IGluIG9wdHMudHJ1c3RlZF9ob3N0cykKCgpkZWYgYnJlYWtfYXJnc19vcHRpb25zKGxpbmUpOgogICAgIiIiQnJlYWsgdXAgdGhlIGxpbmUgaW50byBhbiBhcmdzIGFuZCBvcHRpb25zIHN0cmluZy4gIFdlIG9ubHkgd2FudCB0byBzaGxleAogICAgKGFuZCB0aGVuIG9wdHBhcnNlKSB0aGUgb3B0aW9ucywgbm90IHRoZSBhcmdzLiAgYXJncyBjYW4gY29udGFpbiBtYXJrZXJzCiAgICB3aGljaCBhcmUgY29ycnVwdGVkIGJ5IHNobGV4LgogICAgIiIiCiAgICB0b2tlbnMgPSBsaW5lLnNwbGl0KCcgJykKICAgIGFyZ3MgPSBbXQogICAgb3B0aW9ucyA9IHRva2Vuc1s6XQogICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICBpZiB0b2tlbi5zdGFydHN3aXRoKCctJykgb3IgdG9rZW4uc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmdzLmFwcGVuZCh0b2tlbikKICAgICAgICAgICAgb3B0aW9ucy5wb3AoMCkKICAgIHJldHVybiAnICcuam9pbihhcmdzKSwgJyAnLmpvaW4ob3B0aW9ucykKCgpkZWYgYnVpbGRfcGFyc2VyKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHBhcnNlciBmb3IgcGFyc2luZyByZXF1aXJlbWVudCBsaW5lcwogICAgIiIiCiAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoYWRkX2hlbHBfb3B0aW9uPUZhbHNlKQoKICAgIG9wdGlvbl9mYWN0b3JpZXMgPSBTVVBQT1JURURfT1BUSU9OUyArIFNVUFBPUlRFRF9PUFRJT05TX1JFUQogICAgZm9yIG9wdGlvbl9mYWN0b3J5IGluIG9wdGlvbl9mYWN0b3JpZXM6CiAgICAgICAgb3B0aW9uID0gb3B0aW9uX2ZhY3RvcnkoKQogICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKG9wdGlvbikKCiAgICAjIEJ5IGRlZmF1bHQgb3B0cGFyc2Ugc3lzLmV4aXRzIG9uIHBhcnNpbmcgZXJyb3JzLiBXZSB3YW50IHRvIHdyYXAKICAgICMgdGhhdCBpbiBvdXIgb3duIGV4Y2VwdGlvbi4KICAgIGRlZiBwYXJzZXJfZXhpdChzZWxmLCBtc2cpOgogICAgICAgIHJhaXNlIFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKG1zZykKICAgIHBhcnNlci5leGl0ID0gcGFyc2VyX2V4aXQKCiAgICByZXR1cm4gcGFyc2VyCgoKZGVmIGpvaW5fbGluZXMobGluZXNfZW51bSk6CiAgICAiIiJKb2lucyBhIGxpbmUgZW5kaW5nIGluICdcJyB3aXRoIHRoZSBwcmV2aW91cyBsaW5lIChleGNlcHQgd2hlbiBmb2xsb3dpbmcKICAgIGNvbW1lbnRzKS4gIFRoZSBqb2luZWQgbGluZSB0YWtlcyBvbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGxpbmUuCiAgICAiIiIKICAgIHByaW1hcnlfbGluZV9udW1iZXIgPSBOb25lCiAgICBuZXdfbGluZSA9IFtdCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICBpZiBub3QgbGluZS5lbmRzd2l0aCgnXFwnKSBvciBDT01NRU5UX1JFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICBpZiBDT01NRU5UX1JFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAgIyB0aGlzIGVuc3VyZXMgY29tbWVudHMgYXJlIGFsd2F5cyBtYXRjaGVkIGxhdGVyCiAgICAgICAgICAgICAgICBsaW5lID0gJyAnICsgbGluZQogICAgICAgICAgICBpZiBuZXdfbGluZToKICAgICAgICAgICAgICAgIG5ld19saW5lLmFwcGVuZChsaW5lKQogICAgICAgICAgICAgICAgeWllbGQgcHJpbWFyeV9saW5lX251bWJlciwgJycuam9pbihuZXdfbGluZSkKICAgICAgICAgICAgICAgIG5ld19saW5lID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmVfbnVtYmVyLCBsaW5lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IG5ld19saW5lOgogICAgICAgICAgICAgICAgcHJpbWFyeV9saW5lX251bWJlciA9IGxpbmVfbnVtYmVyCiAgICAgICAgICAgIG5ld19saW5lLmFwcGVuZChsaW5lLnN0cmlwKCdcXCcpKQoKICAgICMgbGFzdCBsaW5lIGNvbnRhaW5zIFwKICAgIGlmIG5ld19saW5lOgogICAgICAgIHlpZWxkIHByaW1hcnlfbGluZV9udW1iZXIsICcnLmpvaW4obmV3X2xpbmUpCgogICAgIyBUT0RPOiBoYW5kbGUgc3BhY2UgYWZ0ZXIgJ1wnLgoKCmRlZiBpZ25vcmVfY29tbWVudHMobGluZXNfZW51bSk6CiAgICAiIiIKICAgIFN0cmlwcyBjb21tZW50cyBhbmQgZmlsdGVyIGVtcHR5IGxpbmVzLgogICAgIiIiCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICBsaW5lID0gQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpCiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgIHlpZWxkIGxpbmVfbnVtYmVyLCBsaW5lCgoKZGVmIHNraXBfcmVnZXgobGluZXNfZW51bSwgb3B0aW9ucyk6CiAgICAiIiIKICAgIFNraXAgbGluZXMgdGhhdCBtYXRjaCAnLS1za2lwLXJlcXVpcmVtZW50cy1yZWdleCcgcGF0dGVybgoKICAgIE5vdGU6IHRoZSByZWdleCBwYXR0ZXJuIGlzIG9ubHkgYnVpbHQgb25jZQogICAgIiIiCiAgICBza2lwX3JlZ2V4ID0gb3B0aW9ucy5za2lwX3JlcXVpcmVtZW50c19yZWdleCBpZiBvcHRpb25zIGVsc2UgTm9uZQogICAgaWYgc2tpcF9yZWdleDoKICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShza2lwX3JlZ2V4KQogICAgICAgIGxpbmVzX2VudW0gPSBmaWx0ZXJmYWxzZSgKICAgICAgICAgICAgbGFtYmRhIGU6IHBhdHRlcm4uc2VhcmNoKGVbMV0pLAogICAgICAgICAgICBsaW5lc19lbnVtKQogICAgcmV0dXJuIGxpbmVzX2VudW0KUEsDBBQAAAAAAAAAIQCBbVXDl7UAAJe1AAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX2luc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0cmFjZWJhY2sKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNoYW5nZV9yb290CmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzLCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHNwZWNpZmllcnMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcubWFya2VycyBpbXBvcnQgTWFya2VyCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnJlcXVpcmVtZW50cyBpbXBvcnQgSW52YWxpZFJlcXVpcmVtZW50LCBSZXF1aXJlbWVudApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgppbXBvcnQgcGlwLndoZWVsCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IG5hdGl2ZV9zdHIsIGdldF9zdGRsaWIsIFdJTkRPV1MKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IGlzX3VybCwgdXJsX3RvX3BhdGgsIHBhdGhfdG9fdXJsLCBpc19hcmNoaXZlX2ZpbGUKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW5zdGFsbGF0aW9uRXJyb3IsIFVuaW5zdGFsbGF0aW9uRXJyb3IsCikKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCAoCiAgICBiaW5fcHksIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudiwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUsIGJpbl91c2VyLAopCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBkaXNwbGF5X3BhdGgsIHJtdHJlZSwgYXNrX3BhdGhfZXhpc3RzLCBiYWNrdXBfZGlyLCBpc19pbnN0YWxsYWJsZV9kaXIsCiAgICBkaXN0X2luX3VzZXJzaXRlLCBkaXN0X2luX3NpdGVfcGFja2FnZXMsIGVnZ19saW5rX3BhdGgsCiAgICBjYWxsX3N1YnByb2Nlc3MsIHJlYWRfdGV4dF9maWxlLCBGYWtlRmlsZSwgX21ha2VfYnVpbGRfZGlyLCBlbnN1cmVfZGlyLAogICAgZ2V0X2luc3RhbGxlZF92ZXJzaW9uLCBub3JtYWxpemVfcGF0aCwgZGlzdF9pc19sb2NhbCwKKQoKZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBIYXNoZXMKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnNldHVwdG9vbHNfYnVpbGQgaW1wb3J0IFNFVFVQVE9PTFNfU0hJTQpmcm9tIHBpcC51dGlscy51aSBpbXBvcnQgb3Blbl9zcGlubmVyCmZyb20gcGlwLnJlcS5yZXFfdW5pbnN0YWxsIGltcG9ydCBVbmluc3RhbGxQYXRoU2V0CmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCmZyb20gcGlwLndoZWVsIGltcG9ydCBtb3ZlX3doZWVsX2ZpbGVzLCBXaGVlbAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKb3BlcmF0b3JzID0gc3BlY2lmaWVycy5TcGVjaWZpZXIuX29wZXJhdG9ycy5rZXlzKCkKCgpkZWYgX3N0cmlwX2V4dHJhcyhwYXRoKToKICAgIG0gPSByZS5tYXRjaChyJ14oLispKFxbW15cXV0rXF0pJCcsIHBhdGgpCiAgICBleHRyYXMgPSBOb25lCiAgICBpZiBtOgogICAgICAgIHBhdGhfbm9fZXh0cmFzID0gbS5ncm91cCgxKQogICAgICAgIGV4dHJhcyA9IG0uZ3JvdXAoMikKICAgIGVsc2U6CiAgICAgICAgcGF0aF9ub19leHRyYXMgPSBwYXRoCgogICAgcmV0dXJuIHBhdGhfbm9fZXh0cmFzLCBleHRyYXMKCgpkZWYgX3NhZmVfZXh0cmFzKGV4dHJhcyk6CiAgICByZXR1cm4gc2V0KHBrZ19yZXNvdXJjZXMuc2FmZV9leHRyYShleHRyYSkgZm9yIGV4dHJhIGluIGV4dHJhcykKCgpjbGFzcyBJbnN0YWxsUmVxdWlyZW1lbnQob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxLCBjb21lc19mcm9tLCBzb3VyY2VfZGlyPU5vbmUsIGVkaXRhYmxlPUZhbHNlLAogICAgICAgICAgICAgICAgIGxpbms9Tm9uZSwgYXNfZWdnPUZhbHNlLCB1cGRhdGU9VHJ1ZSwKICAgICAgICAgICAgICAgICBweWNvbXBpbGU9VHJ1ZSwgbWFya2Vycz1Ob25lLCBpc29sYXRlZD1GYWxzZSwgb3B0aW9ucz1Ob25lLAogICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgICAgIHNlbGYuZXh0cmFzID0gKCkKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVpcmVtZW50KHJlcSkKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRSZXF1aXJlbWVudDoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc2VwIGluIHJlcToKICAgICAgICAgICAgICAgICAgICBhZGRfbXNnID0gIkl0IGxvb2tzIGxpa2UgYSBwYXRoLiBEb2VzIGl0IGV4aXN0ID8iCiAgICAgICAgICAgICAgICBlbGlmICc9JyBpbiByZXEgYW5kIG5vdCBhbnkob3AgaW4gcmVxIGZvciBvcCBpbiBvcGVyYXRvcnMpOgogICAgICAgICAgICAgICAgICAgIGFkZF9tc2cgPSAiPSBpcyBub3QgYSB2YWxpZCBvcGVyYXRvci4gRGlkIHlvdSBtZWFuID09ID8iCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFkZF9tc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudDogJyVzJ1xuJXMiICUgKHJlcSwgYWRkX21zZykpCiAgICAgICAgICAgIHNlbGYuZXh0cmFzID0gX3NhZmVfZXh0cmFzKHJlcS5leHRyYXMpCgogICAgICAgIHNlbGYucmVxID0gcmVxCiAgICAgICAgc2VsZi5jb21lc19mcm9tID0gY29tZXNfZnJvbQogICAgICAgIHNlbGYuY29uc3RyYWludCA9IGNvbnN0cmFpbnQKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBzb3VyY2VfZGlyCiAgICAgICAgc2VsZi5lZGl0YWJsZSA9IGVkaXRhYmxlCgogICAgICAgIHNlbGYuX3doZWVsX2NhY2hlID0gd2hlZWxfY2FjaGUKICAgICAgICBzZWxmLmxpbmsgPSBzZWxmLm9yaWdpbmFsX2xpbmsgPSBsaW5rCiAgICAgICAgc2VsZi5hc19lZ2cgPSBhc19lZ2cKICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1hcmtlcnMgPSBtYXJrZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXJrZXJzID0gcmVxIGFuZCByZXEubWFya2VyCiAgICAgICAgc2VsZi5fZWdnX2luZm9fcGF0aCA9IE5vbmUKICAgICAgICAjIFRoaXMgaG9sZHMgdGhlIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdCBpZiB0aGlzIHJlcXVpcmVtZW50CiAgICAgICAgIyBpcyBhbHJlYWR5IGF2YWlsYWJsZToKICAgICAgICBzZWxmLnNhdGlzZmllZF9ieSA9IE5vbmUKICAgICAgICAjIFRoaXMgaG9sZCB0aGUgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gb2JqZWN0IGlmIHRoaXMgcmVxdWlyZW1lbnQKICAgICAgICAjIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbjoKICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gTm9uZQogICAgICAgICMgVGVtcG9yYXJ5IGJ1aWxkIGxvY2F0aW9uCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgIyBVc2VkIHRvIHN0b3JlIHRoZSBnbG9iYWwgZGlyZWN0b3J5IHdoZXJlIHRoZSBfdGVtcF9idWlsZF9kaXIgc2hvdWxkCiAgICAgICAgIyBoYXZlIGJlZW4gY3JlYXRlZC4gQ2YgX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24gbWV0aG9kLgogICAgICAgIHNlbGYuX2lkZWFsX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICAjIFRydWUgaWYgdGhlIGVkaXRhYmxlIHNob3VsZCBiZSB1cGRhdGVkOgogICAgICAgIHNlbGYudXBkYXRlID0gdXBkYXRlCiAgICAgICAgIyBTZXQgdG8gVHJ1ZSBhZnRlciBzdWNjZXNzZnVsIGluc3RhbGxhdGlvbgogICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBOb25lCiAgICAgICAgIyBVbmluc3RhbGxQYXRoU2V0IG9mIHVuaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiAoZm9yIHBvc3NpYmxlIHJvbGxiYWNrKQogICAgICAgIHNlbGYudW5pbnN0YWxsZWQgPSBOb25lCiAgICAgICAgIyBTZXQgVHJ1ZSBpZiBhIGxlZ2l0aW1hdGUgZG8tbm90aGluZy1vbi11bmluc3RhbGwgaGFzIGhhcHBlbmVkIC0gZS5nLgogICAgICAgICMgc3lzdGVtIHNpdGUgcGFja2FnZXMsIHN0ZGxpYiBwYWNrYWdlcy4KICAgICAgICBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsID0gRmFsc2UKICAgICAgICBzZWxmLnVzZV91c2VyX3NpdGUgPSBGYWxzZQogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIGlmIG9wdGlvbnMgZWxzZSB7fQogICAgICAgIHNlbGYucHljb21waWxlID0gcHljb21waWxlCiAgICAgICAgIyBTZXQgdG8gVHJ1ZSBhZnRlciBzdWNjZXNzZnVsIHByZXBhcmF0aW9uIG9mIHRoaXMgcmVxdWlyZW1lbnQKICAgICAgICBzZWxmLnByZXBhcmVkID0gRmFsc2UKCiAgICAgICAgc2VsZi5pc29sYXRlZCA9IGlzb2xhdGVkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9lZGl0YWJsZShjbHMsIGVkaXRhYmxlX3JlcSwgY29tZXNfZnJvbT1Ob25lLCBkZWZhdWx0X3Zjcz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9RmFsc2UsIG9wdGlvbnM9Tm9uZSwgd2hlZWxfY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgICAgIGZyb20gcGlwLmluZGV4IGltcG9ydCBMaW5rCgogICAgICAgIG5hbWUsIHVybCwgZXh0cmFzX292ZXJyaWRlID0gcGFyc2VfZWRpdGFibGUoCiAgICAgICAgICAgIGVkaXRhYmxlX3JlcSwgZGVmYXVsdF92Y3MpCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6Jyk6CiAgICAgICAgICAgIHNvdXJjZV9kaXIgPSB1cmxfdG9fcGF0aCh1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc291cmNlX2RpciA9IE5vbmUKCiAgICAgICAgcmVzID0gY2xzKG5hbWUsIGNvbWVzX2Zyb20sIHNvdXJjZV9kaXI9c291cmNlX2RpciwKICAgICAgICAgICAgICAgICAgZWRpdGFibGU9VHJ1ZSwKICAgICAgICAgICAgICAgICAgbGluaz1MaW5rKHVybCksCiAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9Y29uc3RyYWludCwKICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgIG9wdGlvbnM9b3B0aW9ucyBpZiBvcHRpb25zIGVsc2Uge30sCiAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKQoKICAgICAgICBpZiBleHRyYXNfb3ZlcnJpZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlcy5leHRyYXMgPSBfc2FmZV9leHRyYXMoZXh0cmFzX292ZXJyaWRlKQoKICAgICAgICByZXR1cm4gcmVzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9saW5lKAogICAgICAgICAgICBjbHMsIG5hbWUsIGNvbWVzX2Zyb209Tm9uZSwgaXNvbGF0ZWQ9RmFsc2UsIG9wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgd2hlZWxfY2FjaGU9Tm9uZSwgY29uc3RyYWludD1GYWxzZSk6CiAgICAgICAgIiIiQ3JlYXRlcyBhbiBJbnN0YWxsUmVxdWlyZW1lbnQgZnJvbSBhIG5hbWUsIHdoaWNoIG1pZ2h0IGJlIGEKICAgICAgICByZXF1aXJlbWVudCwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgJ3NldHVwLnB5JywgZmlsZW5hbWUsIG9yIFVSTC4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawoKICAgICAgICBpZiBpc191cmwobmFtZSk6CiAgICAgICAgICAgIG1hcmtlcl9zZXAgPSAnOyAnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFya2VyX3NlcCA9ICc7JwogICAgICAgIGlmIG1hcmtlcl9zZXAgaW4gbmFtZToKICAgICAgICAgICAgbmFtZSwgbWFya2VycyA9IG5hbWUuc3BsaXQobWFya2VyX3NlcCwgMSkKICAgICAgICAgICAgbWFya2VycyA9IG1hcmtlcnMuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgbWFya2VyczoKICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtYXJrZXJzID0gTWFya2VyKG1hcmtlcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFya2VycyA9IE5vbmUKICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCiAgICAgICAgcmVxID0gTm9uZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aChuYW1lKSkKICAgICAgICBsaW5rID0gTm9uZQogICAgICAgIGV4dHJhcyA9IE5vbmUKCiAgICAgICAgaWYgaXNfdXJsKG5hbWUpOgogICAgICAgICAgICBsaW5rID0gTGluayhuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHAsIGV4dHJhcyA9IF9zdHJpcF9leHRyYXMocGF0aCkKICAgICAgICAgICAgaWYgKG9zLnBhdGguaXNkaXIocCkgYW5kCiAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguc2VwIGluIG5hbWUgb3IgbmFtZS5zdGFydHN3aXRoKCcuJykpKToKCiAgICAgICAgICAgICAgICBpZiBub3QgaXNfaW5zdGFsbGFibGVfZGlyKHApOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0b3J5ICVyIGlzIG5vdCBpbnN0YWxsYWJsZS4gRmlsZSAnc2V0dXAucHknICIKICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBmb3VuZC4iICUgbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxpbmsgPSBMaW5rKHBhdGhfdG9fdXJsKHApKQogICAgICAgICAgICBlbGlmIGlzX2FyY2hpdmVfZmlsZShwKToKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShwKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50ICVyIGxvb2tzIGxpa2UgYSBmaWxlbmFtZSwgYnV0IHRoZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGRvZXMgbm90IGV4aXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxpbmsgPSBMaW5rKHBhdGhfdG9fdXJsKHApKQoKICAgICAgICAjIGl0J3MgYSBsb2NhbCBmaWxlLCBkaXIsIG9yIHVybAogICAgICAgIGlmIGxpbms6CiAgICAgICAgICAgICMgSGFuZGxlIHJlbGF0aXZlIGZpbGUgVVJMcwogICAgICAgICAgICBpZiBsaW5rLnNjaGVtZSA9PSAnZmlsZScgYW5kIHJlLnNlYXJjaChyJ1wuXC4vJywgbGluay51cmwpOgogICAgICAgICAgICAgICAgbGluayA9IExpbmsoCiAgICAgICAgICAgICAgICAgICAgcGF0aF90b191cmwob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmFic3BhdGgobGluay5wYXRoKSkpKQogICAgICAgICAgICAjIHdoZWVsIGZpbGUKICAgICAgICAgICAgaWYgbGluay5pc193aGVlbDoKICAgICAgICAgICAgICAgIHdoZWVsID0gV2hlZWwobGluay5maWxlbmFtZSkgICMgY2FuIHJhaXNlIEludmFsaWRXaGVlbEZpbGVuYW1lCiAgICAgICAgICAgICAgICByZXEgPSAiJXM9PSVzIiAlICh3aGVlbC5uYW1lLCB3aGVlbC52ZXJzaW9uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIHJlcSB0byB0aGUgZWdnIGZyYWdtZW50LiAgd2hlbiBpdCdzIG5vdCB0aGVyZSwgdGhpcwogICAgICAgICAgICAgICAgIyB3aWxsIGJlY29tZSBhbiAndW5uYW1lZCcgcmVxdWlyZW1lbnQKICAgICAgICAgICAgICAgIHJlcSA9IGxpbmsuZWdnX2ZyYWdtZW50CgogICAgICAgICMgYSByZXF1aXJlbWVudCBzcGVjaWZpZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXEgPSBuYW1lCgogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIGlmIG9wdGlvbnMgZWxzZSB7fQogICAgICAgIHJlcyA9IGNscyhyZXEsIGNvbWVzX2Zyb20sIGxpbms9bGluaywgbWFya2Vycz1tYXJrZXJzLAogICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwgY29uc3RyYWludD1jb25zdHJhaW50KQoKICAgICAgICBpZiBleHRyYXM6CiAgICAgICAgICAgIHJlcy5leHRyYXMgPSBfc2FmZV9leHRyYXMoCiAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCgncGxhY2Vob2xkZXInICsgZXh0cmFzKS5leHRyYXMpCgogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcToKICAgICAgICAgICAgcyA9IHN0cihzZWxmLnJlcSkKICAgICAgICAgICAgaWYgc2VsZi5saW5rOgogICAgICAgICAgICAgICAgcyArPSAnIGZyb20gJXMnICUgc2VsZi5saW5rLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHMgPSBzZWxmLmxpbmsudXJsIGlmIHNlbGYubGluayBlbHNlIE5vbmUKICAgICAgICBpZiBzZWxmLnNhdGlzZmllZF9ieSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcyArPSAnIGluICVzJyAlIGRpc3BsYXlfcGF0aChzZWxmLnNhdGlzZmllZF9ieS5sb2NhdGlvbikKICAgICAgICBpZiBzZWxmLmNvbWVzX2Zyb206CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jb21lc19mcm9tLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20uZnJvbV9wYXRoKCkKICAgICAgICAgICAgaWYgY29tZXNfZnJvbToKICAgICAgICAgICAgICAgIHMgKz0gJyAoZnJvbSAlcyknICUgY29tZXNfZnJvbQogICAgICAgIHJldHVybiBzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPCVzIG9iamVjdDogJXMgZWRpdGFibGU9JXI+JyAlICgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSwgc2VsZi5lZGl0YWJsZSkKCiAgICBkZWYgcG9wdWxhdGVfbGluayhzZWxmLCBmaW5kZXIsIHVwZ3JhZGUsIHJlcXVpcmVfaGFzaGVzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBpZiBhIGxpbmsgY2FuIGJlIGZvdW5kIGZvciB0aGlzLCB0aGF0IGl0IGlzIGZvdW5kLgoKICAgICAgICBOb3RlIHRoYXQgc2VsZi5saW5rIG1heSBzdGlsbCBiZSBOb25lIC0gaWYgVXBncmFkZSBpcyBGYWxzZSBhbmQgdGhlCiAgICAgICAgcmVxdWlyZW1lbnQgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCgogICAgICAgIElmIHJlcXVpcmVfaGFzaGVzIGlzIFRydWUsIGRvbid0IHVzZSB0aGUgd2hlZWwgY2FjaGUsIGJlY2F1c2UgY2FjaGVkCiAgICAgICAgd2hlZWxzLCBhbHdheXMgYnVpbHQgbG9jYWxseSwgaGF2ZSBkaWZmZXJlbnQgaGFzaGVzIHRoYW4gdGhlIGZpbGVzCiAgICAgICAgZG93bmxvYWRlZCBmcm9tIHRoZSBpbmRleCBzZXJ2ZXIgYW5kIHRodXMgdGhyb3cgZmFsc2UgaGFzaCBtaXNtYXRjaGVzLgogICAgICAgIEZ1cnRoZXJtb3JlLCBjYWNoZWQgd2hlZWxzIGF0IHByZXNlbnQgaGF2ZSB1bmRldGVybWluaXN0aWMgY29udGVudHMgZHVlCiAgICAgICAgdG8gZmlsZSBtb2RpZmljYXRpb24gdGltZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5saW5rIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubGluayA9IGZpbmRlci5maW5kX3JlcXVpcmVtZW50KHNlbGYsIHVwZ3JhZGUpCiAgICAgICAgaWYgc2VsZi5fd2hlZWxfY2FjaGUgaXMgbm90IE5vbmUgYW5kIG5vdCByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgb2xkX2xpbmsgPSBzZWxmLmxpbmsKICAgICAgICAgICAgc2VsZi5saW5rID0gc2VsZi5fd2hlZWxfY2FjaGUuY2FjaGVkX3doZWVsKHNlbGYubGluaywgc2VsZi5uYW1lKQogICAgICAgICAgICBpZiBvbGRfbGluayAhPSBzZWxmLmxpbms6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIGNhY2hlZCB3aGVlbCBsaW5rOiAlcycsIHNlbGYubGluaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzcGVjaWZpZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVxLnNwZWNpZmllcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bpbm5lZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBJIGFtIHBpbm5lZCB0byBhbiBleGFjdCB2ZXJzaW9uLgoKICAgICAgICBGb3IgZXhhbXBsZSwgc29tZS1wYWNrYWdlPT0xLjIgaXMgcGlubmVkOyBzb21lLXBhY2thZ2U+MS4yIGlzIG5vdC4KICAgICAgICAiIiIKICAgICAgICBzcGVjaWZpZXJzID0gc2VsZi5zcGVjaWZpZXIKICAgICAgICByZXR1cm4gKGxlbihzcGVjaWZpZXJzKSA9PSAxIGFuZAogICAgICAgICAgICAgICAgbmV4dChpdGVyKHNwZWNpZmllcnMpKS5vcGVyYXRvciBpbiAoJz09JywgJz09PScpKQoKICAgIGRlZiBmcm9tX3BhdGgoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBzID0gc3RyKHNlbGYucmVxKQogICAgICAgIGlmIHNlbGYuY29tZXNfZnJvbToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmNvbWVzX2Zyb20sIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbS5mcm9tX3BhdGgoKQogICAgICAgICAgICBpZiBjb21lc19mcm9tOgogICAgICAgICAgICAgICAgcyArPSAnLT4nICsgY29tZXNfZnJvbQogICAgICAgIHJldHVybiBzCgogICAgZGVmIGJ1aWxkX2xvY2F0aW9uKHNlbGYsIGJ1aWxkX2Rpcik6CiAgICAgICAgaWYgc2VsZi5fdGVtcF9idWlsZF9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl90ZW1wX2J1aWxkX2RpcgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgICMgZm9yIHJlcXVpcmVtZW50IHZpYSBhIHBhdGggdG8gYSBkaXJlY3Rvcnk6IHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICAjIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSB5ZXQgc28gd2UgY3JlYXRlIGEgdGVtcCBkaXJlY3RvcnkKICAgICAgICAgICAgIyBPbmNlIHJ1bl9lZ2dfaW5mbyB3aWxsIGhhdmUgcnVuLCB3ZSdsbCBiZSBhYmxlCiAgICAgICAgICAgICMgdG8gZml4IGl0IHZpYSBfY29ycmVjdF9idWlsZF9sb2NhdGlvbgogICAgICAgICAgICAjIFNvbWUgc3lzdGVtcyBoYXZlIC90bXAgYXMgYSBzeW1saW5rIHdoaWNoIGNvbmZ1c2VzIGN1c3RvbQogICAgICAgICAgICAjIGJ1aWxkcyAoc3VjaCBhcyBudW1weSkuIFRodXMsIHdlIGVuc3VyZSB0aGF0IHRoZSByZWFsIHBhdGgKICAgICAgICAgICAgIyBpcyByZXR1cm5lZC4KICAgICAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBvcy5wYXRoLnJlYWxwYXRoKAogICAgICAgICAgICAgICAgdGVtcGZpbGUubWtkdGVtcCgnLWJ1aWxkJywgJ3BpcC0nKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2lkZWFsX2J1aWxkX2RpciA9IGJ1aWxkX2RpcgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBuYW1lID0gc2VsZi5uYW1lLmxvd2VyKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gc2VsZi5uYW1lCiAgICAgICAgIyBGSVhNRTogSXMgdGhlcmUgYSBiZXR0ZXIgcGxhY2UgdG8gY3JlYXRlIHRoZSBidWlsZF9kaXI/IChoZyBhbmQgYnpyCiAgICAgICAgIyBuZWVkIHRoaXMpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJ1aWxkX2Rpcik6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgZGlyZWN0b3J5ICVzJywgYnVpbGRfZGlyKQogICAgICAgICAgICBfbWFrZV9idWlsZF9kaXIoYnVpbGRfZGlyKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBuYW1lKQoKICAgIGRlZiBfY29ycmVjdF9idWlsZF9sb2NhdGlvbihzZWxmKToKICAgICAgICAiIiJNb3ZlIHNlbGYuX3RlbXBfYnVpbGRfZGlyIHRvIHNlbGYuX2lkZWFsX2J1aWxkX2Rpci9zZWxmLnJlcS5uYW1lCgogICAgICAgIEZvciBzb21lIHJlcXVpcmVtZW50cyAoZS5nLiBhIHBhdGggdG8gYSBkaXJlY3RvcnkpLCB0aGUgbmFtZSBvZiB0aGUKICAgICAgICBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgdW50aWwgd2UgcnVuIGVnZ19pbmZvLCBzbyB0aGUgYnVpbGRfbG9jYXRpb24KICAgICAgICB3aWxsIHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIHN0b3JlIHRoZSBfaWRlYWxfYnVpbGRfZGlyLgoKICAgICAgICBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHNlbGYuZWdnX2luZm9fcGF0aCB0byBmaXggdGhlIHRlbXBvcmFyeSBidWlsZAogICAgICAgIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnNvdXJjZV9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFzc2VydCBzZWxmLnJlcSBpcyBub3QgTm9uZQogICAgICAgIGFzc2VydCBzZWxmLl90ZW1wX2J1aWxkX2RpcgogICAgICAgIGFzc2VydCBzZWxmLl9pZGVhbF9idWlsZF9kaXIKICAgICAgICBvbGRfbG9jYXRpb24gPSBzZWxmLl90ZW1wX2J1aWxkX2RpcgogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gTm9uZQogICAgICAgIG5ld19sb2NhdGlvbiA9IHNlbGYuYnVpbGRfbG9jYXRpb24oc2VsZi5faWRlYWxfYnVpbGRfZGlyKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld19sb2NhdGlvbik6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ0EgcGFja2FnZSBhbHJlYWR5IGV4aXN0cyBpbiAlczsgcGxlYXNlIHJlbW92ZSBpdCB0byBjb250aW51ZScKICAgICAgICAgICAgICAgICUgZGlzcGxheV9wYXRoKG5ld19sb2NhdGlvbikpCiAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAnTW92aW5nIHBhY2thZ2UgJXMgZnJvbSAlcyB0byBuZXcgbG9jYXRpb24gJXMnLAogICAgICAgICAgICBzZWxmLCBkaXNwbGF5X3BhdGgob2xkX2xvY2F0aW9uKSwgZGlzcGxheV9wYXRoKG5ld19sb2NhdGlvbiksCiAgICAgICAgKQogICAgICAgIHNodXRpbC5tb3ZlKG9sZF9sb2NhdGlvbiwgbmV3X2xvY2F0aW9uKQogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gbmV3X2xvY2F0aW9uCiAgICAgICAgc2VsZi5faWRlYWxfYnVpbGRfZGlyID0gTm9uZQogICAgICAgIHNlbGYuc291cmNlX2RpciA9IG5ld19sb2NhdGlvbgogICAgICAgIHNlbGYuX2VnZ19pbmZvX3BhdGggPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmFtZShzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBuYXRpdmVfc3RyKHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lKHNlbGYucmVxLm5hbWUpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNldHVwX3B5X2RpcihzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLnNvdXJjZV9kaXIsCiAgICAgICAgICAgIHNlbGYubGluayBhbmQgc2VsZi5saW5rLnN1YmRpcmVjdG9yeV9mcmFnbWVudCBvciAnJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZXR1cF9weShzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyLCAiTm8gc291cmNlIGRpciBmb3IgJXMiICUgc2VsZgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IHNldHVwdG9vbHMgICMgbm9xYQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgaWYgZ2V0X2luc3RhbGxlZF92ZXJzaW9uKCdzZXR1cHRvb2xzJykgaXMgTm9uZToKICAgICAgICAgICAgICAgIGFkZF9tc2cgPSAiUGxlYXNlIGluc3RhbGwgc2V0dXB0b29scy4iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhZGRfbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQogICAgICAgICAgICAjIFNldHVwdG9vbHMgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgaW1wb3J0IHNldHVwdG9vbHMgd2hpY2ggaXMgcmVxdWlyZWQgdG8gIgogICAgICAgICAgICAgICAgImluc3RhbGwgZnJvbSBhIHNvdXJjZSBkaXN0cmlidXRpb24uXG4lcyIgJSBhZGRfbXNnCiAgICAgICAgICAgICkKCiAgICAgICAgc2V0dXBfcHkgPSBvcy5wYXRoLmpvaW4oc2VsZi5zZXR1cF9weV9kaXIsICdzZXR1cC5weScpCgogICAgICAgICMgUHl0aG9uMiBfX2ZpbGVfXyBzaG91bGQgbm90IGJlIHVuaWNvZGUKICAgICAgICBpZiBzaXguUFkyIGFuZCBpc2luc3RhbmNlKHNldHVwX3B5LCBzaXgudGV4dF90eXBlKToKICAgICAgICAgICAgc2V0dXBfcHkgPSBzZXR1cF9weS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQoKICAgICAgICByZXR1cm4gc2V0dXBfcHkKCiAgICBkZWYgcnVuX2VnZ19pbmZvKHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBpZiBzZWxmLm5hbWU6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdSdW5uaW5nIHNldHVwLnB5IChwYXRoOiVzKSBlZ2dfaW5mbyBmb3IgcGFja2FnZSAlcycsCiAgICAgICAgICAgICAgICBzZWxmLnNldHVwX3B5LCBzZWxmLm5hbWUsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnUnVubmluZyBzZXR1cC5weSAocGF0aDolcykgZWdnX2luZm8gZm9yIHBhY2thZ2UgZnJvbSAlcycsCiAgICAgICAgICAgICAgICBzZWxmLnNldHVwX3B5LCBzZWxmLmxpbmssCiAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIHNjcmlwdCA9IFNFVFVQVE9PTFNfU0hJTSAlIHNlbGYuc2V0dXBfcHkKICAgICAgICAgICAgYmFzZV9jbWQgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsIHNjcmlwdF0KICAgICAgICAgICAgaWYgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgICAgIGJhc2VfY21kICs9IFsiLS1uby11c2VyLWNmZyJdCiAgICAgICAgICAgIGVnZ19pbmZvX2NtZCA9IGJhc2VfY21kICsgWydlZ2dfaW5mbyddCiAgICAgICAgICAgICMgV2UgY2FuJ3QgcHV0IHRoZSAuZWdnLWluZm8gZmlsZXMgYXQgdGhlIHJvb3QsIGJlY2F1c2UgdGhlbiB0aGUKICAgICAgICAgICAgIyBzb3VyY2UgY29kZSB3aWxsIGJlIG1pc3Rha2VuIGZvciBhbiBpbnN0YWxsZWQgZWdnLCBjYXVzaW5nCiAgICAgICAgICAgICMgcHJvYmxlbXMKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgICAgIGVnZ19iYXNlX29wdGlvbiA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlZ2dfaW5mb19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5zZXR1cF9weV9kaXIsICdwaXAtZWdnLWluZm8nKQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihlZ2dfaW5mb19kaXIpCiAgICAgICAgICAgICAgICBlZ2dfYmFzZV9vcHRpb24gPSBbJy0tZWdnLWJhc2UnLCAncGlwLWVnZy1pbmZvJ10KICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKAogICAgICAgICAgICAgICAgZWdnX2luZm9fY21kICsgZWdnX2Jhc2Vfb3B0aW9uLAogICAgICAgICAgICAgICAgY3dkPXNlbGYuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2M9J3B5dGhvbiBzZXR1cC5weSBlZ2dfaW5mbycpCgogICAgICAgIGlmIG5vdCBzZWxmLnJlcToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZV92ZXJzaW9uKHNlbGYucGtnX2luZm8oKVsiVmVyc2lvbiJdKSwgVmVyc2lvbik6CiAgICAgICAgICAgICAgICBvcCA9ICI9PSIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9wID0gIj09PSIKICAgICAgICAgICAgc2VsZi5yZXEgPSBSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICIiLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHNlbGYucGtnX2luZm8oKVsiTmFtZSJdLAogICAgICAgICAgICAgICAgICAgIG9wLAogICAgICAgICAgICAgICAgICAgIHNlbGYucGtnX2luZm8oKVsiVmVyc2lvbiJdLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YV9uYW1lID0gY2Fub25pY2FsaXplX25hbWUoc2VsZi5wa2dfaW5mbygpWyJOYW1lIl0pCiAgICAgICAgICAgIGlmIGNhbm9uaWNhbGl6ZV9uYW1lKHNlbGYucmVxLm5hbWUpICE9IG1ldGFkYXRhX25hbWU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnUnVubmluZyBzZXR1cC5weSAocGF0aDolcykgZWdnX2luZm8gZm9yIHBhY2thZ2UgJXMgJwogICAgICAgICAgICAgICAgICAgICdwcm9kdWNlZCBtZXRhZGF0YSBmb3IgcHJvamVjdCBuYW1lICVzLiBGaXggeW91ciAnCiAgICAgICAgICAgICAgICAgICAgJyNlZ2c9JXMgZnJhZ21lbnRzLicsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXR1cF9weSwgc2VsZi5uYW1lLCBtZXRhZGF0YV9uYW1lLCBzZWxmLm5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNlbGYucmVxID0gUmVxdWlyZW1lbnQobWV0YWRhdGFfbmFtZSkKCiAgICBkZWYgZWdnX2luZm9fZGF0YShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgaWYgc2VsZi5zYXRpc2ZpZWRfYnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhdGlzZmllZF9ieS5oYXNfbWV0YWRhdGEoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2F0aXNmaWVkX2J5LmdldF9tZXRhZGF0YShmaWxlbmFtZSkKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmVnZ19pbmZvX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBkYXRhID0gcmVhZF90ZXh0X2ZpbGUoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgZWdnX2luZm9fcGF0aChzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgaWYgc2VsZi5fZWdnX2luZm9fcGF0aCBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgYmFzZSA9IHNlbGYuc291cmNlX2RpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihzZWxmLnNldHVwX3B5X2RpciwgJ3BpcC1lZ2ctaW5mbycpCiAgICAgICAgICAgIGZpbGVuYW1lcyA9IG9zLmxpc3RkaXIoYmFzZSkKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhiYXNlKToKICAgICAgICAgICAgICAgICAgICBmb3IgZGlyIGluIHZjcy5kaXJuYW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlyIGluIGRpcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZShkaXIpCiAgICAgICAgICAgICAgICAgICAgIyBJdGVyYXRlIG92ZXIgYSBjb3B5IG9mIGBgZGlyc2BgLCBzaW5jZSBtdXRhdGluZwogICAgICAgICAgICAgICAgICAgICMgYSBsaXN0IHdoaWxlIGl0ZXJhdGluZyBvdmVyIGl0IGNhbiBjYXVzZSB0cm91YmxlLgogICAgICAgICAgICAgICAgICAgICMgKFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvcHVsbC80NjIuKQogICAgICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gbGlzdChkaXJzKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBzZWFyY2ggaW4gYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgdmlydHVhbGVudgogICAgICAgICAgICAgICAgICAgICAgICAjIGVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmxleGlzdHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyb290LCBkaXIsICdiaW4nLCAncHl0aG9uJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QsIGRpciwgJ1NjcmlwdHMnLCAnUHl0aG9uLmV4ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoZGlyKQogICAgICAgICAgICAgICAgICAgICAgICAjIEFsc28gZG9uJ3Qgc2VhcmNoIHRocm91Z2ggdGVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBkaXIgPT0gJ3Rlc3QnIG9yIGRpciA9PSAndGVzdHMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoZGlyKQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5leHRlbmQoW29zLnBhdGguam9pbihyb290LCBkaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGlyIGluIGRpcnNdKQogICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gW2YgZm9yIGYgaW4gZmlsZW5hbWVzIGlmIGYuZW5kc3dpdGgoJy5lZ2ctaW5mbycpXQoKICAgICAgICAgICAgaWYgbm90IGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdObyBmaWxlcy9kaXJlY3RvcmllcyBpbiAlcyAoZnJvbSAlcyknICUgKGJhc2UsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBhc3NlcnQgZmlsZW5hbWVzLCBcCiAgICAgICAgICAgICAgICAiTm8gZmlsZXMvZGlyZWN0b3JpZXMgaW4gJXMgKGZyb20gJXMpIiAlIChiYXNlLCBmaWxlbmFtZSkKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIG1hdGNoLCB3ZSBwaWNrIHRoZSB0b3BsZXZlbCBvbmUuICBUaGlzCiAgICAgICAgICAgICMgY2FuIGVhc2lseSBiZSB0aGUgY2FzZSBpZiB0aGVyZSBpcyBhIGRpc3QgZm9sZGVyIHdoaWNoIGNvbnRhaW5zCiAgICAgICAgICAgICMgYW4gZXh0cmFjdGVkIHRhcmJhbGwgZm9yIHRlc3RpbmcgcHVycG9zZXMuCiAgICAgICAgICAgIGlmIGxlbihmaWxlbmFtZXMpID4gMToKICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5zb3J0KAogICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeC5jb3VudChvcy5wYXRoLnNlcCkgKwogICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLmFsdHNlcCBhbmQgeC5jb3VudChvcy5wYXRoLmFsdHNlcCkgb3IgMCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5fZWdnX2luZm9fcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZXNbMF0pCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLl9lZ2dfaW5mb19wYXRoLCBmaWxlbmFtZSkKCiAgICBkZWYgcGtnX2luZm8oc2VsZik6CiAgICAgICAgcCA9IEZlZWRQYXJzZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLmVnZ19pbmZvX2RhdGEoJ1BLRy1JTkZPJykKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnTm8gUEtHLUlORk8gZmlsZSBmb3VuZCBpbiAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoc2VsZi5lZ2dfaW5mb19wYXRoKCdQS0ctSU5GTycpKSwKICAgICAgICAgICAgKQogICAgICAgIHAuZmVlZChkYXRhIG9yICcnKQogICAgICAgIHJldHVybiBwLmNsb3NlKCkKCiAgICBfcmVxdWlyZW1lbnRzX3NlY3Rpb25fcmUgPSByZS5jb21waWxlKHInXFsoLio/KVxdJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpbnN0YWxsZWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gZ2V0X2luc3RhbGxlZF92ZXJzaW9uKHNlbGYubmFtZSkKCiAgICBkZWYgYXNzZXJ0X3NvdXJjZV9tYXRjaGVzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIHZlcnNpb24gPSBzZWxmLnBrZ19pbmZvKClbJ3ZlcnNpb24nXQogICAgICAgIGlmIHNlbGYucmVxLnNwZWNpZmllciBhbmQgdmVyc2lvbiBub3QgaW4gc2VsZi5yZXEuc3BlY2lmaWVyOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdSZXF1ZXN0ZWQgJXMsIGJ1dCBpbnN0YWxsaW5nIHZlcnNpb24gJXMnLAogICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbGVkX3ZlcnNpb24sCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnU291cmNlIGluICVzIGhhcyB2ZXJzaW9uICVzLCB3aGljaCBzYXRpc2ZpZXMgcmVxdWlyZW1lbnQgJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKHNlbGYuc291cmNlX2RpciksCiAgICAgICAgICAgICAgICB2ZXJzaW9uLAogICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgKQoKICAgIGRlZiB1cGRhdGVfZWRpdGFibGUoc2VsZiwgb2J0YWluPVRydWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmxpbms6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICJDYW5ub3QgdXBkYXRlIHJlcG9zaXRvcnkgYXQgJXM7IHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgIgogICAgICAgICAgICAgICAgInVua25vd24iLAogICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VfZGlyLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFzc2VydCBzZWxmLmVkaXRhYmxlCiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGlmIHNlbGYubGluay5zY2hlbWUgPT0gJ2ZpbGUnOgogICAgICAgICAgICAjIFN0YXRpYyBwYXRocyBkb24ndCBnZXQgdXBkYXRlZAogICAgICAgICAgICByZXR1cm4KICAgICAgICBhc3NlcnQgJysnIGluIHNlbGYubGluay51cmwsICJiYWQgdXJsOiAlciIgJSBzZWxmLmxpbmsudXJsCiAgICAgICAgaWYgbm90IHNlbGYudXBkYXRlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICB2Y190eXBlLCB1cmwgPSBzZWxmLmxpbmsudXJsLnNwbGl0KCcrJywgMSkKICAgICAgICBiYWNrZW5kID0gdmNzLmdldF9iYWNrZW5kKHZjX3R5cGUpCiAgICAgICAgaWYgYmFja2VuZDoKICAgICAgICAgICAgdmNzX2JhY2tlbmQgPSBiYWNrZW5kKHNlbGYubGluay51cmwpCiAgICAgICAgICAgIGlmIG9idGFpbjoKICAgICAgICAgICAgICAgIHZjc19iYWNrZW5kLm9idGFpbihzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2Y3NfYmFja2VuZC5leHBvcnQoc2VsZi5zb3VyY2VfZGlyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCAwLCAoCiAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCB2ZXJzaW9uIGNvbnRyb2wgdHlwZSAoaW4gJXMpOiAlcycKICAgICAgICAgICAgICAgICUgKHNlbGYubGluaywgdmNfdHlwZSkpCgogICAgZGVmIHVuaW5zdGFsbChzZWxmLCBhdXRvX2NvbmZpcm09RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFVuaW5zdGFsbCB0aGUgZGlzdHJpYnV0aW9uIGN1cnJlbnRseSBzYXRpc2Z5aW5nIHRoaXMgcmVxdWlyZW1lbnQuCgogICAgICAgIFByb21wdHMgYmVmb3JlIHJlbW92aW5nIG9yIG1vZGlmeWluZyBmaWxlcyB1bmxlc3MKICAgICAgICBgYGF1dG9fY29uZmlybWBgIGlzIFRydWUuCgogICAgICAgIFJlZnVzZXMgdG8gZGVsZXRlIG9yIG1vZGlmeSBmaWxlcyBvdXRzaWRlIG9mIGBgc3lzLnByZWZpeGBgIC0KICAgICAgICB0aHVzIHVuaW5zdGFsbGF0aW9uIHdpdGhpbiBhIHZpcnR1YWwgZW52aXJvbm1lbnQgY2FuIG9ubHkKICAgICAgICBtb2RpZnkgdGhhdCB2aXJ0dWFsIGVudmlyb25tZW50LCBldmVuIGlmIHRoZSB2aXJ0dWFsZW52IGlzCiAgICAgICAgbGlua2VkIHRvIGdsb2JhbCBzaXRlLXBhY2thZ2VzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19pZl9leGlzdHMoKToKICAgICAgICAgICAgcmFpc2UgVW5pbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgdW5pbnN0YWxsIHJlcXVpcmVtZW50ICVzLCBub3QgaW5zdGFsbGVkIiAlIChzZWxmLm5hbWUsKQogICAgICAgICAgICApCiAgICAgICAgZGlzdCA9IHNlbGYuc2F0aXNmaWVkX2J5IG9yIHNlbGYuY29uZmxpY3RzX3dpdGgKCiAgICAgICAgZGlzdF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZGlzdC5sb2NhdGlvbikKICAgICAgICBpZiBub3QgZGlzdF9pc19sb2NhbChkaXN0KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiTm90IHVuaW5zdGFsbGluZyAlcyBhdCAlcywgb3V0c2lkZSBlbnZpcm9ubWVudCAlcyIsCiAgICAgICAgICAgICAgICBkaXN0LmtleSwKICAgICAgICAgICAgICAgIGRpc3RfcGF0aCwKICAgICAgICAgICAgICAgIHN5cy5wcmVmaXgsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGRpc3RfcGF0aCBpbiBnZXRfc3RkbGliKCk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIk5vdCB1bmluc3RhbGxpbmcgJXMgYXQgJXMsIGFzIGl0IGlzIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiIsCiAgICAgICAgICAgICAgICBkaXN0LmtleSwKICAgICAgICAgICAgICAgIGRpc3RfcGF0aCwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGF0aHNfdG9fcmVtb3ZlID0gVW5pbnN0YWxsUGF0aFNldChkaXN0KQogICAgICAgIGRldmVsb3BfZWdnX2xpbmsgPSBlZ2dfbGlua19wYXRoKGRpc3QpCiAgICAgICAgZGV2ZWxvcF9lZ2dfbGlua19lZ2dfaW5mbyA9ICd7MH0uZWdnLWluZm8nLmZvcm1hdCgKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy50b19maWxlbmFtZShkaXN0LnByb2plY3RfbmFtZSkpCiAgICAgICAgZWdnX2luZm9fZXhpc3RzID0gZGlzdC5lZ2dfaW5mbyBhbmQgb3MucGF0aC5leGlzdHMoZGlzdC5lZ2dfaW5mbykKICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgZGlzdHV0aWxzIGluc3RhbGxlZCBwYWNrYWdlCiAgICAgICAgZGlzdHV0aWxzX2VnZ19pbmZvID0gZ2V0YXR0cihkaXN0Ll9wcm92aWRlciwgJ3BhdGgnLCBOb25lKQoKICAgICAgICAjIFVuaW5zdGFsbCBjYXNlcyBvcmRlciBkbyBtYXR0ZXIgYXMgaW4gdGhlIGNhc2Ugb2YgMiBpbnN0YWxscyBvZiB0aGUKICAgICAgICAjIHNhbWUgcGFja2FnZSwgcGlwIG5lZWRzIHRvIHVuaW5zdGFsbCB0aGUgY3VycmVudGx5IGRldGVjdGVkIHZlcnNpb24KICAgICAgICBpZiAoZWdnX2luZm9fZXhpc3RzIGFuZCBkaXN0LmVnZ19pbmZvLmVuZHN3aXRoKCcuZWdnLWluZm8nKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBkaXN0LmVnZ19pbmZvLmVuZHN3aXRoKGRldmVsb3BfZWdnX2xpbmtfZWdnX2luZm8pKToKICAgICAgICAgICAgIyBpZiBkaXN0LmVnZ19pbmZvLmVuZHN3aXRoKGRldmVsb3BfZWdnX2xpbmtfZWdnX2luZm8pLCB3ZQogICAgICAgICAgICAjIGFyZSBpbiBmYWN0IGluIHRoZSBkZXZlbG9wX2VnZ19saW5rIGNhc2UKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChkaXN0LmVnZ19pbmZvKQogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnaW5zdGFsbGVkLWZpbGVzLnR4dCcpOgogICAgICAgICAgICAgICAgZm9yIGluc3RhbGxlZF9maWxlIGluIGRpc3QuZ2V0X21ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aCgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3QuZWdnX2luZm8sIGluc3RhbGxlZF9maWxlKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGgpCiAgICAgICAgICAgICMgRklYTUU6IG5lZWQgYSB0ZXN0IGZvciB0aGlzIGVsaWYgYmxvY2sKICAgICAgICAgICAgIyBvY2N1cnMgd2l0aCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZC8tLXJlY29yZCBvdXRzaWRlCiAgICAgICAgICAgICMgb2YgcGlwCiAgICAgICAgICAgIGVsaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKICAgICAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcyA9IGRpc3QuZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgdG9wX2xldmVsX3BrZyBpbiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHAgZm9yIHAKICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGlzdC5nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKS5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcCBhbmQgcCBub3QgaW4gbmFtZXNwYWNlc106CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXN0LmxvY2F0aW9uLCB0b3BfbGV2ZWxfcGtnKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCkKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGggKyAnLnB5JykKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGggKyAnLnB5YycpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoICsgJy5weW8nKQoKICAgICAgICBlbGlmIGRpc3R1dGlsc19lZ2dfaW5mbzoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJVbmluc3RhbGxpbmcgYSBkaXN0dXRpbHMgaW5zdGFsbGVkIHByb2plY3QgKHswfSkgaGFzIGJlZW4gIgogICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBUaGlzIGlzICIKICAgICAgICAgICAgICAgICJkdWUgdG8gdGhlIGZhY3QgdGhhdCB1bmluc3RhbGxpbmcgYSBkaXN0dXRpbHMgcHJvamVjdCB3aWxsICIKICAgICAgICAgICAgICAgICJvbmx5IHBhcnRpYWxseSB1bmluc3RhbGwgdGhlIHByb2plY3QuIi5mb3JtYXQoc2VsZi5uYW1lKSwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRpc3R1dGlsc19lZ2dfaW5mbykKCiAgICAgICAgZWxpZiBkaXN0LmxvY2F0aW9uLmVuZHN3aXRoKCcuZWdnJyk6CiAgICAgICAgICAgICMgcGFja2FnZSBpbnN0YWxsZWQgYnkgZWFzeV9pbnN0YWxsCiAgICAgICAgICAgICMgV2UgY2Fubm90IG1hdGNoIG9uIGRpc3QuZWdnX25hbWUgYmVjYXVzZSBpdCBjYW4gc2xpZ2h0bHkgdmFyeQogICAgICAgICAgICAjIGkuZS4gc2V0dXB0b29scy0wLjZjMTEtcHkyLjYuZWdnIHZzIHNldHVwdG9vbHMtMC42cmMxMS1weTIuNi5lZ2cKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICBlYXN5X2luc3RhbGxfZWdnID0gb3MucGF0aC5zcGxpdChkaXN0LmxvY2F0aW9uKVsxXQogICAgICAgICAgICBlYXN5X2luc3RhbGxfcHRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShkaXN0LmxvY2F0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWFzeS1pbnN0YWxsLnB0aCcpCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGRfcHRoKGVhc3lfaW5zdGFsbF9wdGgsICcuLycgKyBlYXN5X2luc3RhbGxfZWdnKQoKICAgICAgICBlbGlmIGVnZ19pbmZvX2V4aXN0cyBhbmQgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICBmb3IgcGF0aCBpbiBwaXAud2hlZWwudW5pbnN0YWxsYXRpb25fcGF0aHMoZGlzdCk6CiAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGgpCgogICAgICAgIGVsaWYgZGV2ZWxvcF9lZ2dfbGluazoKICAgICAgICAgICAgIyBkZXZlbG9wIGVnZwogICAgICAgICAgICB3aXRoIG9wZW4oZGV2ZWxvcF9lZ2dfbGluaywgJ3InKSBhcyBmaDoKICAgICAgICAgICAgICAgIGxpbmtfcG9pbnRlciA9IG9zLnBhdGgubm9ybWNhc2UoZmgucmVhZGxpbmUoKS5zdHJpcCgpKQogICAgICAgICAgICBhc3NlcnQgKGxpbmtfcG9pbnRlciA9PSBkaXN0LmxvY2F0aW9uKSwgKAogICAgICAgICAgICAgICAgJ0VnZy1saW5rICVzIGRvZXMgbm90IG1hdGNoIGluc3RhbGxlZCBsb2NhdGlvbiBvZiAlcyAnCiAgICAgICAgICAgICAgICAnKGF0ICVzKScgJSAobGlua19wb2ludGVyLCBzZWxmLm5hbWUsIGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChkZXZlbG9wX2VnZ19saW5rKQogICAgICAgICAgICBlYXN5X2luc3RhbGxfcHRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShkZXZlbG9wX2VnZ19saW5rKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWFzeS1pbnN0YWxsLnB0aCcpCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGRfcHRoKGVhc3lfaW5zdGFsbF9wdGgsIGRpc3QubG9jYXRpb24pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdOb3Qgc3VyZSBob3cgdG8gdW5pbnN0YWxsOiAlcyAtIENoZWNrOiAlcycsCiAgICAgICAgICAgICAgICBkaXN0LCBkaXN0LmxvY2F0aW9uKQoKICAgICAgICAjIGZpbmQgZGlzdHV0aWxzIHNjcmlwdHM9IHNjcmlwdHMKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnc2NyaXB0cycpIGFuZCBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgIGZvciBzY3JpcHQgaW4gZGlzdC5tZXRhZGF0YV9saXN0ZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0X2luX3VzZXJzaXRlKGRpc3QpOgogICAgICAgICAgICAgICAgICAgIGJpbl9kaXIgPSBiaW5fdXNlcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3B5CiAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKG9zLnBhdGguam9pbihiaW5fZGlyLCBzY3JpcHQpKQogICAgICAgICAgICAgICAgaWYgV0lORE9XUzoKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKG9zLnBhdGguam9pbihiaW5fZGlyLCBzY3JpcHQpICsgJy5iYXQnKQoKICAgICAgICAjIGZpbmQgY29uc29sZV9zY3JpcHRzCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKToKICAgICAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsiZGVsaW1pdGVycyI6ICgnPScsICl9CiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ3BhcnNlci5TYWZlQ29uZmlnUGFyc2VyKCoqb3B0aW9ucykKICAgICAgICAgICAgY29uZmlnLnJlYWRmcCgKICAgICAgICAgICAgICAgIEZha2VGaWxlKGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdlbnRyeV9wb2ludHMudHh0JykpCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgY29uZmlnLmhhc19zZWN0aW9uKCdjb25zb2xlX3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBjb25maWcuaXRlbXMoJ2NvbnNvbGVfc2NyaXB0cycpOgogICAgICAgICAgICAgICAgICAgIGlmIGRpc3RfaW5fdXNlcnNpdGUoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJpbl9kaXIgPSBiaW5fdXNlcgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGJpbl9kaXIgPSBiaW5fcHkKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSkKICAgICAgICAgICAgICAgICAgICBpZiBXSU5ET1dTOgogICAgICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpICsgJy5leGUnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSArICcuZXhlLm1hbmlmZXN0JwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkgKyAnLXNjcmlwdC5weScKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICBwYXRoc190b19yZW1vdmUucmVtb3ZlKGF1dG9fY29uZmlybSkKICAgICAgICBzZWxmLnVuaW5zdGFsbGVkID0gcGF0aHNfdG9fcmVtb3ZlCgogICAgZGVmIHJvbGxiYWNrX3VuaW5zdGFsbChzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbGVkOgogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbGVkLnJvbGxiYWNrKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3Qgcm9sbGJhY2sgJXMsIG5vdGhpbmcgdW5pbnN0YWxsZWQuIiwgc2VsZi5uYW1lLAogICAgICAgICAgICApCgogICAgZGVmIGNvbW1pdF91bmluc3RhbGwoc2VsZik6CiAgICAgICAgaWYgc2VsZi51bmluc3RhbGxlZDoKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxlZC5jb21taXQoKQogICAgICAgIGVsaWYgbm90IHNlbGYubm90aGluZ190b191bmluc3RhbGw6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBjb21taXQgJXMsIG5vdGhpbmcgdW5pbnN0YWxsZWQuIiwgc2VsZi5uYW1lLAogICAgICAgICAgICApCgogICAgZGVmIGFyY2hpdmUoc2VsZiwgYnVpbGRfZGlyKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgY3JlYXRlX2FyY2hpdmUgPSBUcnVlCiAgICAgICAgYXJjaGl2ZV9uYW1lID0gJyVzLSVzLnppcCcgJSAoc2VsZi5uYW1lLCBzZWxmLnBrZ19pbmZvKClbInZlcnNpb24iXSkKICAgICAgICBhcmNoaXZlX3BhdGggPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBhcmNoaXZlX25hbWUpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9wYXRoKToKICAgICAgICAgICAgcmVzcG9uc2UgPSBhc2tfcGF0aF9leGlzdHMoCiAgICAgICAgICAgICAgICAnVGhlIGZpbGUgJXMgZXhpc3RzLiAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCwgKGEpYm9ydCAnICUKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpLCAoJ2knLCAndycsICdiJywgJ2EnKSkKICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ2knOgogICAgICAgICAgICAgICAgY3JlYXRlX2FyY2hpdmUgPSBGYWxzZQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICd3JzoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWxldGluZyAlcycsIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpKQogICAgICAgICAgICAgICAgb3MucmVtb3ZlKGFyY2hpdmVfcGF0aCkKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYic6CiAgICAgICAgICAgICAgICBkZXN0X2ZpbGUgPSBiYWNrdXBfZGlyKGFyY2hpdmVfcGF0aCkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdCYWNraW5nIHVwICVzIHRvICVzJywKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdF9maWxlKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKGFyY2hpdmVfcGF0aCwgZGVzdF9maWxlKQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdhJzoKICAgICAgICAgICAgICAgIHN5cy5leGl0KC0xKQogICAgICAgIGlmIGNyZWF0ZV9hcmNoaXZlOgogICAgICAgICAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoCiAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGgsICd3JywgemlwZmlsZS5aSVBfREVGTEFURUQsCiAgICAgICAgICAgICAgICBhbGxvd1ppcDY0PVRydWUKICAgICAgICAgICAgKQogICAgICAgICAgICBkaXIgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChzZWxmLnNldHVwX3B5X2RpcikpCiAgICAgICAgICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgICAgICAgICAgIGlmICdwaXAtZWdnLWluZm8nIGluIGRpcm5hbWVzOgogICAgICAgICAgICAgICAgICAgIGRpcm5hbWVzLnJlbW92ZSgncGlwLWVnZy1pbmZvJykKICAgICAgICAgICAgICAgIGZvciBkaXJuYW1lIGluIGRpcm5hbWVzOgogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZGlybmFtZSkKICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5fY2xlYW5femlwX25hbWUoZGlybmFtZSwgZGlyKQogICAgICAgICAgICAgICAgICAgIHppcGRpciA9IHppcGZpbGUuWmlwSW5mbyhzZWxmLm5hbWUgKyAnLycgKyBuYW1lICsgJy8nKQogICAgICAgICAgICAgICAgICAgIHppcGRpci5leHRlcm5hbF9hdHRyID0gMHgxRUQgPDwgMTYgICMgMG83NTUKICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGVzdHIoemlwZGlyLCAnJykKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2NsZWFuX3ppcF9uYW1lKGZpbGVuYW1lLCBkaXIpCiAgICAgICAgICAgICAgICAgICAgemlwLndyaXRlKGZpbGVuYW1lLCBzZWxmLm5hbWUgKyAnLycgKyBuYW1lKQogICAgICAgICAgICB6aXAuY2xvc2UoKQogICAgICAgICAgICBsb2dnZXIuaW5mbygnU2F2ZWQgJXMnLCBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSkKCiAgICBkZWYgX2NsZWFuX3ppcF9uYW1lKHNlbGYsIG5hbWUsIHByZWZpeCk6CiAgICAgICAgYXNzZXJ0IG5hbWUuc3RhcnRzd2l0aChwcmVmaXggKyBvcy5wYXRoLnNlcCksICgKICAgICAgICAgICAgIm5hbWUgJXIgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCAlciIgJSAobmFtZSwgcHJlZml4KQogICAgICAgICkKICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KSArIDE6XQogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKICAgICAgICByZXR1cm4gbmFtZQoKICAgIGRlZiBtYXRjaF9tYXJrZXJzKHNlbGYsIGV4dHJhc19yZXF1ZXN0ZWQ9Tm9uZSk6CiAgICAgICAgaWYgbm90IGV4dHJhc19yZXF1ZXN0ZWQ6CiAgICAgICAgICAgICMgUHJvdmlkZSBhbiBleHRyYSB0byBzYWZlbHkgZXZhbHVhdGUgdGhlIG1hcmtlcnMKICAgICAgICAgICAgIyB3aXRob3V0IG1hdGNoaW5nIGFueSBleHRyYQogICAgICAgICAgICBleHRyYXNfcmVxdWVzdGVkID0gKCcnLCkKICAgICAgICBpZiBzZWxmLm1hcmtlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBhbnkoCiAgICAgICAgICAgICAgICBzZWxmLm1hcmtlcnMuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSkKICAgICAgICAgICAgICAgIGZvciBleHRyYSBpbiBleHRyYXNfcmVxdWVzdGVkKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGluc3RhbGwoc2VsZiwgaW5zdGFsbF9vcHRpb25zLCBnbG9iYWxfb3B0aW9ucz1bXSwgcm9vdD1Ob25lLAogICAgICAgICAgICAgICAgcHJlZml4PU5vbmUpOgogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9lZGl0YWJsZSgKICAgICAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucywgZ2xvYmFsX29wdGlvbnMsIHByZWZpeD1wcmVmaXgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHNlbGYuaXNfd2hlZWw6CiAgICAgICAgICAgIHZlcnNpb24gPSBwaXAud2hlZWwud2hlZWxfdmVyc2lvbihzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgICAgIHBpcC53aGVlbC5jaGVja19jb21wYXRpYmlsaXR5KHZlcnNpb24sIHNlbGYubmFtZSkKCiAgICAgICAgICAgIHNlbGYubW92ZV93aGVlbF9maWxlcyhzZWxmLnNvdXJjZV9kaXIsIHJvb3Q9cm9vdCwgcHJlZml4PXByZWZpeCkKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgRXh0ZW5kIHRoZSBsaXN0IG9mIGdsb2JhbCBhbmQgaW5zdGFsbCBvcHRpb25zIHBhc3NlZCBvbiB0bwogICAgICAgICMgdGhlIHNldHVwLnB5IGNhbGwgd2l0aCB0aGUgb25lcyBmcm9tIHRoZSByZXF1aXJlbWVudHMgZmlsZS4KICAgICAgICAjIE9wdGlvbnMgc3BlY2lmaWVkIGluIHJlcXVpcmVtZW50cyBmaWxlIG92ZXJyaWRlIHRob3NlCiAgICAgICAgIyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgc2luY2UgdGhlIGxhc3Qgb3B0aW9uIGdpdmVuCiAgICAgICAgIyB0byBzZXR1cC5weSBpcyB0aGUgb25lIHRoYXQgaXMgdXNlZC4KICAgICAgICBnbG9iYWxfb3B0aW9ucyArPSBzZWxmLm9wdGlvbnMuZ2V0KCdnbG9iYWxfb3B0aW9ucycsIFtdKQogICAgICAgIGluc3RhbGxfb3B0aW9ucyArPSBzZWxmLm9wdGlvbnMuZ2V0KCdpbnN0YWxsX29wdGlvbnMnLCBbXSkKCiAgICAgICAgaWYgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMgPSBsaXN0KGdsb2JhbF9vcHRpb25zKSArIFsiLS1uby11c2VyLWNmZyJdCgogICAgICAgIHRlbXBfbG9jYXRpb24gPSB0ZW1wZmlsZS5ta2R0ZW1wKCctcmVjb3JkJywgJ3BpcC0nKQogICAgICAgIHJlY29yZF9maWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wX2xvY2F0aW9uLCAnaW5zdGFsbC1yZWNvcmQudHh0JykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyA9IHNlbGYuZ2V0X2luc3RhbGxfYXJncygKICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zLCByZWNvcmRfZmlsZW5hbWUsIHJvb3QsIHByZWZpeCkKICAgICAgICAgICAgbXNnID0gJ1J1bm5pbmcgc2V0dXAucHkgaW5zdGFsbCBmb3IgJXMnICUgKHNlbGYubmFtZSwpCiAgICAgICAgICAgIHdpdGggb3Blbl9zcGlubmVyKG1zZykgYXMgc3Bpbm5lcjoKICAgICAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcygKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9hcmdzICsgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2VsZi5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzcGlubmVyPXNwaW5uZXIsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJlY29yZF9maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlY29yZCBmaWxlICVzIG5vdCBmb3VuZCcsIHJlY29yZF9maWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gVHJ1ZQogICAgICAgICAgICBpZiBzZWxmLmFzX2VnZzoKICAgICAgICAgICAgICAgICMgdGhlcmUncyBubyAtLWFsd2F5cy11bnppcCBvcHRpb24gd2UgY2FuIHBhc3MgdG8gaW5zdGFsbAogICAgICAgICAgICAgICAgIyBjb21tYW5kIHNvIHdlIHVuYWJsZSB0byBzYXZlIHRoZSBpbnN0YWxsZWQtZmlsZXMudHh0CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGRlZiBwcmVwZW5kX3Jvb3QocGF0aCk6CiAgICAgICAgICAgICAgICBpZiByb290IGlzIE5vbmUgb3Igbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZV9yb290KHJvb3QsIHBhdGgpCgogICAgICAgICAgICB3aXRoIG9wZW4ocmVjb3JkX2ZpbGVuYW1lKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSBvcy5wYXRoLmRpcm5hbWUobGluZSkKICAgICAgICAgICAgICAgICAgICBpZiBkaXJlY3RvcnkuZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgICAgICAgICBlZ2dfaW5mb19kaXIgPSBwcmVwZW5kX3Jvb3QoZGlyZWN0b3J5KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIC5lZ2ctaW5mbyBkaXJlY3RvcnkgaW4gaW5zdGFsbCByZWNvcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICcgZm9yICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgIyBGSVhNRTogcHV0IHRoZSByZWNvcmQgc29tZXdoZXJlCiAgICAgICAgICAgICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYW4gZXJyb3I/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIG5ld19saW5lcyA9IFtdCiAgICAgICAgICAgIHdpdGggb3BlbihyZWNvcmRfZmlsZW5hbWUpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICs9IG9zLnBhdGguc2VwCiAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZF9yb290KGZpbGVuYW1lKSwgZWdnX2luZm9fZGlyKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaW5zdF9maWxlc19wYXRoID0gb3MucGF0aC5qb2luKGVnZ19pbmZvX2RpciwgJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4oaW5zdF9maWxlc19wYXRoLCAndycpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihuZXdfbGluZXMpICsgJ1xuJykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHJlY29yZF9maWxlbmFtZSkKICAgICAgICAgICAgcm10cmVlKHRlbXBfbG9jYXRpb24pCgogICAgZGVmIGVuc3VyZV9oYXNfc291cmNlX2RpcihzZWxmLCBwYXJlbnRfZGlyKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBhIHNvdXJjZV9kaXIgaXMgc2V0LgoKICAgICAgICBUaGlzIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpciBpZiB0aGUgbmFtZSBvZiB0aGUgcmVxdWlyZW1lbnQKICAgICAgICBpc24ndCBrbm93biB5ZXQuCgogICAgICAgIDpwYXJhbSBwYXJlbnRfZGlyOiBUaGUgaWRlYWwgcGlwIHBhcmVudF9kaXIgZm9yIHRoZSBzb3VyY2VfZGlyLgogICAgICAgICAgICBHZW5lcmFsbHkgc3JjX2RpciBmb3IgZWRpdGFibGVzIGFuZCBidWlsZF9kaXIgZm9yIHNkaXN0cy4KICAgICAgICA6cmV0dXJuOiBzZWxmLnNvdXJjZV9kaXIKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnNvdXJjZV9kaXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gc2VsZi5idWlsZF9sb2NhdGlvbihwYXJlbnRfZGlyKQogICAgICAgIHJldHVybiBzZWxmLnNvdXJjZV9kaXIKCiAgICBkZWYgZ2V0X2luc3RhbGxfYXJncyhzZWxmLCBnbG9iYWxfb3B0aW9ucywgcmVjb3JkX2ZpbGVuYW1lLCByb290LCBwcmVmaXgpOgogICAgICAgIGluc3RhbGxfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgIi11Il0KICAgICAgICBpbnN0YWxsX2FyZ3MuYXBwZW5kKCctYycpCiAgICAgICAgaW5zdGFsbF9hcmdzLmFwcGVuZChTRVRVUFRPT0xTX1NISU0gJSBzZWxmLnNldHVwX3B5KQogICAgICAgIGluc3RhbGxfYXJncyArPSBsaXN0KGdsb2JhbF9vcHRpb25zKSArIFwKICAgICAgICAgICAgWydpbnN0YWxsJywgJy0tcmVjb3JkJywgcmVjb3JkX2ZpbGVuYW1lXQoKICAgICAgICBpZiBub3Qgc2VsZi5hc19lZ2c6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbJy0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJ10KCiAgICAgICAgaWYgcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1yb290Jywgcm9vdF0KICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbJy0tcHJlZml4JywgcHJlZml4XQoKICAgICAgICBpZiBzZWxmLnB5Y29tcGlsZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsiLS1jb21waWxlIl0KICAgICAgICBlbHNlOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyItLW5vLWNvbXBpbGUiXQoKICAgICAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICAgICAgcHlfdmVyX3N0ciA9ICdweXRob24nICsgc3lzY29uZmlnLmdldF9weXRob25fdmVyc2lvbigpCiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbJy0taW5zdGFsbC1oZWFkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ2luY2x1ZGUnLCAnc2l0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3Zlcl9zdHIsIHNlbGYubmFtZSldCgogICAgICAgIHJldHVybiBpbnN0YWxsX2FyZ3MKCiAgICBkZWYgcmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2Uoc2VsZik6CiAgICAgICAgIiIiUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZXMgZnJvbSB0aGlzIHJlcXVpcmVtZW50LCBpZiB0aGV5IGFyZSBtYXJrZWQKICAgICAgICBmb3IgZGVsZXRpb24iIiIKICAgICAgICBpZiBzZWxmLnNvdXJjZV9kaXIgYW5kIG9zLnBhdGguZXhpc3RzKAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc291cmNlX2RpciwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUpKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBzb3VyY2UgaW4gJXMnLCBzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgICAgIHJtdHJlZShzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gTm9uZQogICAgICAgIGlmIHNlbGYuX3RlbXBfYnVpbGRfZGlyIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLl90ZW1wX2J1aWxkX2Rpcik6CiAgICAgICAgICAgIHJtdHJlZShzZWxmLl90ZW1wX2J1aWxkX2RpcikKICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IE5vbmUKCiAgICBkZWYgaW5zdGFsbF9lZGl0YWJsZShzZWxmLCBpbnN0YWxsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz0oKSwgcHJlZml4PU5vbmUpOgogICAgICAgIGxvZ2dlci5pbmZvKCdSdW5uaW5nIHNldHVwLnB5IGRldmVsb3AgZm9yICVzJywgc2VsZi5uYW1lKQoKICAgICAgICBpZiBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBnbG9iYWxfb3B0aW9ucyA9IGxpc3QoZ2xvYmFsX29wdGlvbnMpICsgWyItLW5vLXVzZXItY2ZnIl0KCiAgICAgICAgaWYgcHJlZml4OgogICAgICAgICAgICBwcmVmaXhfcGFyYW0gPSBbJy0tcHJlZml4PXswfScuZm9ybWF0KHByZWZpeCldCiAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucyA9IGxpc3QoaW5zdGFsbF9vcHRpb25zKSArIHByZWZpeF9wYXJhbQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHdlIGRvIC0taW5zdGFsbC1oZWFkZXJzIGhlcmUgdG9vPwogICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsCiAgICAgICAgICAgICAgICAgICAgJy1jJywKICAgICAgICAgICAgICAgICAgICBTRVRVUFRPT0xTX1NISU0gJSBzZWxmLnNldHVwX3B5CiAgICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICAgIGxpc3QoZ2xvYmFsX29wdGlvbnMpICsKICAgICAgICAgICAgICAgIFsnZGV2ZWxvcCcsICctLW5vLWRlcHMnXSArCiAgICAgICAgICAgICAgICBsaXN0KGluc3RhbGxfb3B0aW9ucyksCgogICAgICAgICAgICAgICAgY3dkPXNlbGYuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UpCgogICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBUcnVlCgogICAgZGVmIGNoZWNrX2lmX2V4aXN0cyhzZWxmKToKICAgICAgICAiIiJGaW5kIGFuIGluc3RhbGxlZCBkaXN0cmlidXRpb24gdGhhdCBzYXRpc2ZpZXMgb3IgY29uZmxpY3RzCiAgICAgICAgd2l0aCB0aGlzIHJlcXVpcmVtZW50LCBhbmQgc2V0IHNlbGYuc2F0aXNmaWVkX2J5IG9yCiAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCBhcHByb3ByaWF0ZWx5LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBnZXRfZGlzdHJpYnV0aW9uKCkgd2lsbCByZXNvbHZlIHRoZSBlbnRpcmUgbGlzdCBvZiByZXF1aXJlbWVudHMKICAgICAgICAgICAgIyBhbnl3YXksIGFuZCB3ZSd2ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdCB3ZSBuZWVkIHRoZSByZXF1aXJlbWVudAogICAgICAgICAgICAjIGluIHF1ZXN0aW9uLCBzbyBzdHJpcCB0aGUgbWFya2VyIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvCiAgICAgICAgICAgICMgZXZhbHVhdGUgaXQuCiAgICAgICAgICAgIG5vX21hcmtlciA9IFJlcXVpcmVtZW50KHN0cihzZWxmLnJlcSkpCiAgICAgICAgICAgIG5vX21hcmtlci5tYXJrZXIgPSBOb25lCiAgICAgICAgICAgIHNlbGYuc2F0aXNmaWVkX2J5ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKHN0cihub19tYXJrZXIpKQogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlIGFuZCBzZWxmLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBzZWxmLnNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgIyB3aGVuIGluc3RhbGxpbmcgZWRpdGFibGVzLCBub3RoaW5nIHByZS1leGlzdGluZyBzaG91bGQgZXZlcgogICAgICAgICAgICAgICAgIyBzYXRpc2Z5CiAgICAgICAgICAgICAgICBzZWxmLnNhdGlzZmllZF9ieSA9IE5vbmUKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGV4Y2VwdCBwa2dfcmVzb3VyY2VzLlZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgZXhpc3RpbmdfZGlzdCA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIHNlbGYucmVxLm5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBzZWxmLnVzZV91c2VyX3NpdGU6CiAgICAgICAgICAgICAgICBpZiBkaXN0X2luX3VzZXJzaXRlKGV4aXN0aW5nX2Rpc3QpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBleGlzdGluZ19kaXN0CiAgICAgICAgICAgICAgICBlbGlmIChydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbl9zaXRlX3BhY2thZ2VzKGV4aXN0aW5nX2Rpc3QpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgIldpbGwgbm90IGluc3RhbGwgdG8gdGhlIHVzZXIgc2l0ZSBiZWNhdXNlIGl0IHdpbGwgIgogICAgICAgICAgICAgICAgICAgICAgICAibGFjayBzeXMucGF0aCBwcmVjZWRlbmNlIHRvICVzIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIChleGlzdGluZ19kaXN0LnByb2plY3RfbmFtZSwgZXhpc3RpbmdfZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gZXhpc3RpbmdfZGlzdAogICAgICAgIHJldHVybiBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfd2hlZWwoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubGluayBhbmQgc2VsZi5saW5rLmlzX3doZWVsCgogICAgZGVmIG1vdmVfd2hlZWxfZmlsZXMoc2VsZiwgd2hlZWxkaXIsIHJvb3Q9Tm9uZSwgcHJlZml4PU5vbmUpOgogICAgICAgIG1vdmVfd2hlZWxfZmlsZXMoCiAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5yZXEsIHdoZWVsZGlyLAogICAgICAgICAgICB1c2VyPXNlbGYudXNlX3VzZXJfc2l0ZSwKICAgICAgICAgICAgaG9tZT1zZWxmLnRhcmdldF9kaXIsCiAgICAgICAgICAgIHJvb3Q9cm9vdCwKICAgICAgICAgICAgcHJlZml4PXByZWZpeCwKICAgICAgICAgICAgcHljb21waWxlPXNlbGYucHljb21waWxlLAogICAgICAgICAgICBpc29sYXRlZD1zZWxmLmlzb2xhdGVkLAogICAgICAgICkKCiAgICBkZWYgZ2V0X2Rpc3Qoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gYnVpbHQgZnJvbSBzZWxmLmVnZ19pbmZvX3BhdGgiIiIKICAgICAgICBlZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm9fcGF0aCgnJykucnN0cmlwKCcvJykKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IHBrZ19yZXNvdXJjZXMuUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIHJldHVybiBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwKICAgICAgICAgICAgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzX2hhc2hfb3B0aW9ucyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBhbnkga25vd24tZ29vZCBoYXNoZXMgYXJlIHNwZWNpZmllZCBhcyBvcHRpb25zLgoKICAgICAgICBUaGVzZSBhY3RpdmF0ZSAtLXJlcXVpcmUtaGFzaGVzIG1vZGU7IGhhc2hlcyBzcGVjaWZpZWQgYXMgcGFydCBvZiBhCiAgICAgICAgVVJMIGRvIG5vdC4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5vcHRpb25zLmdldCgnaGFzaGVzJywge30pKQoKICAgIGRlZiBoYXNoZXMoc2VsZiwgdHJ1c3RfaW50ZXJuZXQ9VHJ1ZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgaGFzaC1jb21wYXJlciB0aGF0IGNvbnNpZGVycyBteSBvcHRpb24tIGFuZCBVUkwtYmFzZWQKICAgICAgICBoYXNoZXMgdG8gYmUga25vd24tZ29vZC4KCiAgICAgICAgSGFzaGVzIGluIFVSTHMtLW9uZXMgZW1iZWRkZWQgaW4gdGhlIHJlcXVpcmVtZW50cyBmaWxlLCBub3Qgb25lcwogICAgICAgIGRvd25sb2FkZWQgZnJvbSBhbiBpbmRleCBzZXJ2ZXItLWFyZSBhbG1vc3QgcGVlcnMgd2l0aCBvbmVzIGZyb20KICAgICAgICBmbGFncy4gVGhleSBzYXRpc2Z5IC0tcmVxdWlyZS1oYXNoZXMgKHdoZXRoZXIgaXQgd2FzIGltcGxpY2l0bHkgb3IKICAgICAgICBleHBsaWNpdGx5IGFjdGl2YXRlZCkgYnV0IGRvIG5vdCBhY3RpdmF0ZSBpdC4gbWQ1IGFuZCBzaGEyMjQgYXJlIG5vdAogICAgICAgIGFsbG93ZWQgaW4gZmxhZ3MsIHdoaWNoIHNob3VsZCBudWRnZSBwZW9wbGUgdG93YXJkIGdvb2QgYWxnb3MuIFdlCiAgICAgICAgYWx3YXlzIE9SIGFsbCBoYXNoZXMgdG9nZXRoZXIsIGV2ZW4gb25lcyBmcm9tIFVSTHMuCgogICAgICAgIDpwYXJhbSB0cnVzdF9pbnRlcm5ldDogV2hldGhlciB0byB0cnVzdCBVUkwtYmFzZWQgKCNtZDU9Li4uKSBoYXNoZXMKICAgICAgICAgICAgZG93bmxvYWRlZCBmcm9tIHRoZSBpbnRlcm5ldCwgYXMgYnkgcG9wdWxhdGVfbGluaygpCgogICAgICAgICIiIgogICAgICAgIGdvb2RfaGFzaGVzID0gc2VsZi5vcHRpb25zLmdldCgnaGFzaGVzJywge30pLmNvcHkoKQogICAgICAgIGxpbmsgPSBzZWxmLmxpbmsgaWYgdHJ1c3RfaW50ZXJuZXQgZWxzZSBzZWxmLm9yaWdpbmFsX2xpbmsKICAgICAgICBpZiBsaW5rIGFuZCBsaW5rLmhhc2g6CiAgICAgICAgICAgIGdvb2RfaGFzaGVzLnNldGRlZmF1bHQobGluay5oYXNoX25hbWUsIFtdKS5hcHBlbmQobGluay5oYXNoKQogICAgICAgIHJldHVybiBIYXNoZXMoZ29vZF9oYXNoZXMpCgoKZGVmIF9zdHJpcF9wb3N0Zml4KHJlcSk6CiAgICAiIiIKICAgICAgICBTdHJpcCByZXEgcG9zdGZpeCAoIC1kZXYsIDAuMiwgZXRjICkKICAgICIiIgogICAgIyBGSVhNRTogdXNlIHBhY2thZ2VfdG9fcmVxdWlyZW1lbnQ/CiAgICBtYXRjaCA9IHJlLnNlYXJjaChyJ14oLio/KSg/Oi1kZXZ8LVxkLiopJCcsIHJlcSkKICAgIGlmIG1hdGNoOgogICAgICAgICMgU3RyaXAgb2ZmIC1kZXYsIC0wLjIsIGV0Yy4KICAgICAgICByZXEgPSBtYXRjaC5ncm91cCgxKQogICAgcmV0dXJuIHJlcQoKCmRlZiBwYXJzZV9lZGl0YWJsZShlZGl0YWJsZV9yZXEsIGRlZmF1bHRfdmNzPU5vbmUpOgogICAgIiIiUGFyc2VzIGFuIGVkaXRhYmxlIHJlcXVpcmVtZW50IGludG86CiAgICAgICAgLSBhIHJlcXVpcmVtZW50IG5hbWUKICAgICAgICAtIGFuIFVSTAogICAgICAgIC0gZXh0cmFzCiAgICAgICAgLSBlZGl0YWJsZSBvcHRpb25zCiAgICBBY2NlcHRlZCByZXF1aXJlbWVudHM6CiAgICAgICAgc3ZuK2h0dHA6Ly9ibGFoYmxhaEByZXYjZWdnPUZvb2JhcltiYXpdJnN1YmRpcmVjdG9yeT12ZXJzaW9uX3N1YmRpcgogICAgICAgIC5bc29tZV9leHRyYV0KICAgICIiIgoKICAgIGZyb20gcGlwLmluZGV4IGltcG9ydCBMaW5rCgogICAgdXJsID0gZWRpdGFibGVfcmVxCiAgICBleHRyYXMgPSBOb25lCgogICAgIyBJZiBhIGZpbGUgcGF0aCBpcyBzcGVjaWZpZWQgd2l0aCBleHRyYXMsIHN0cmlwIG9mZiB0aGUgZXh0cmFzLgogICAgbSA9IHJlLm1hdGNoKHInXiguKykoXFtbXlxdXStcXSkkJywgdXJsKQogICAgaWYgbToKICAgICAgICB1cmxfbm9fZXh0cmFzID0gbS5ncm91cCgxKQogICAgICAgIGV4dHJhcyA9IG0uZ3JvdXAoMikKICAgIGVsc2U6CiAgICAgICAgdXJsX25vX2V4dHJhcyA9IHVybAoKICAgIGlmIG9zLnBhdGguaXNkaXIodXJsX25vX2V4dHJhcyk6CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbih1cmxfbm9fZXh0cmFzLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkRpcmVjdG9yeSAlciBpcyBub3QgaW5zdGFsbGFibGUuIEZpbGUgJ3NldHVwLnB5JyBub3QgZm91bmQuIiAlCiAgICAgICAgICAgICAgICB1cmxfbm9fZXh0cmFzCiAgICAgICAgICAgICkKICAgICAgICAjIFRyZWF0aW5nIGl0IGFzIGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgb3V0CiAgICAgICAgdXJsX25vX2V4dHJhcyA9IHBhdGhfdG9fdXJsKHVybF9ub19leHRyYXMpCgogICAgaWYgdXJsX25vX2V4dHJhcy5sb3dlcigpLnN0YXJ0c3dpdGgoJ2ZpbGU6Jyk6CiAgICAgICAgcGFja2FnZV9uYW1lID0gTGluayh1cmxfbm9fZXh0cmFzKS5lZ2dfZnJhZ21lbnQKICAgICAgICBpZiBleHRyYXM6CiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWUsCiAgICAgICAgICAgICAgICB1cmxfbm9fZXh0cmFzLAogICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQoInBsYWNlaG9sZGVyIiArIGV4dHJhcy5sb3dlcigpKS5leHRyYXMsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcGFja2FnZV9uYW1lLCB1cmxfbm9fZXh0cmFzLCBOb25lCgogICAgZm9yIHZlcnNpb25fY29udHJvbCBpbiB2Y3M6CiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnJXM6JyAlIHZlcnNpb25fY29udHJvbCk6CiAgICAgICAgICAgIHVybCA9ICclcyslcycgJSAodmVyc2lvbl9jb250cm9sLCB1cmwpCiAgICAgICAgICAgIGJyZWFrCgogICAgaWYgJysnIG5vdCBpbiB1cmw6CiAgICAgICAgaWYgZGVmYXVsdF92Y3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1kZWZhdWx0LXZjcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICB1cmwgPSBkZWZhdWx0X3ZjcyArICcrJyArIHVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJyVzIHNob3VsZCBlaXRoZXIgYmUgYSBwYXRoIHRvIGEgbG9jYWwgcHJvamVjdCBvciBhIFZDUyB1cmwgJwogICAgICAgICAgICAgICAgJ2JlZ2lubmluZyB3aXRoIHN2bissIGdpdCssIGhnKywgb3IgYnpyKycgJQogICAgICAgICAgICAgICAgZWRpdGFibGVfcmVxCiAgICAgICAgICAgICkKCiAgICB2Y190eXBlID0gdXJsLnNwbGl0KCcrJywgMSlbMF0ubG93ZXIoKQoKICAgIGlmIG5vdCB2Y3MuZ2V0X2JhY2tlbmQodmNfdHlwZSk6CiAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICdGb3IgLS1lZGl0YWJsZT0lcyBvbmx5ICcgJSBlZGl0YWJsZV9yZXEgKyBcCiAgICAgICAgICAgICcsICcuam9pbihbYmFja2VuZC5uYW1lICsgJytVUkwnIGZvciBiYWNrZW5kIGluIHZjcy5iYWNrZW5kc10pICsgXAogICAgICAgICAgICAnIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQnCiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoZXJyb3JfbWVzc2FnZSkKCiAgICBwYWNrYWdlX25hbWUgPSBMaW5rKHVybCkuZWdnX2ZyYWdtZW50CiAgICBpZiBub3QgcGFja2FnZV9uYW1lOgogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCByZXF1aXJlbWVudCBuYW1lLCBwbGVhc2Ugc3BlY2lmeSBvbmUgd2l0aCAjZWdnPSIKICAgICAgICApCiAgICBpZiBub3QgcGFja2FnZV9uYW1lOgogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAnLS1lZGl0YWJsZT0lcyBpcyBub3QgdGhlIHJpZ2h0IGZvcm1hdDsgaXQgbXVzdCBoYXZlICcKICAgICAgICAgICAgJyNlZ2c9UGFja2FnZScgJSBlZGl0YWJsZV9yZXEKICAgICAgICApCiAgICByZXR1cm4gX3N0cmlwX3Bvc3RmaXgocGFja2FnZV9uYW1lKSwgdXJsLCBOb25lClBLAwQUAAAAAAAAACEAEt2Sdp6GAACehgAAIgAAAHB5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9zZXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCByZXF1ZXN0cwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBleHBhbmR1c2VyCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCAoaXNfZmlsZV91cmwsIGlzX2Rpcl91cmwsIGlzX3Zjc191cmwsIHVybF90b19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja191cmwpCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IChJbnN0YWxsYXRpb25FcnJvciwgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uTm90Rm91bmQsIFByZXZpb3VzQnVpbGREaXJFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hFcnJvciwgSGFzaEVycm9ycywgSGFzaFVucGlubmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkLCBWY3NIYXNoVW5zdXBwb3J0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb24pCmZyb20gcGlwLnJlcS5yZXFfaW5zdGFsbCBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50CmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBkaXNwbGF5X3BhdGgsIGRpc3RfaW5fdXNlcnNpdGUsIGVuc3VyZV9kaXIsIG5vcm1hbGl6ZV9wYXRoKQpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IE1pc3NpbmdIYXNoZXMKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5wYWNrYWdpbmcgaW1wb3J0IGNoZWNrX2Rpc3RfcmVxdWlyZXNfcHl0aG9uCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbAoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgUmVxdWlyZW1lbnRzKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2tleXMgPSBbXQogICAgICAgIHNlbGYuX2RpY3QgPSB7fQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9rZXlzCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGYuX2RpY3Rba2V5XSBmb3Iga2V5IGluIHNlbGYuX2tleXNdCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9rZXlzCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5fa2V5czoKICAgICAgICAgICAgc2VsZi5fa2V5cy5hcHBlbmQoa2V5KQogICAgICAgIHNlbGYuX2RpY3Rba2V5XSA9IHZhbHVlCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3Rba2V5XQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICB2YWx1ZXMgPSBbJyVzOiAlcycgJSAocmVwcihrKSwgcmVwcihzZWxmW2tdKSkgZm9yIGsgaW4gc2VsZi5rZXlzKCldCiAgICAgICAgcmV0dXJuICdSZXF1aXJlbWVudHMoeyVzfSknICUgJywgJy5qb2luKHZhbHVlcykKCgpjbGFzcyBEaXN0QWJzdHJhY3Rpb24ob2JqZWN0KToKICAgICIiIkFic3RyYWN0cyBvdXQgdGhlIHdoZWVsIHZzIG5vbi13aGVlbCBwcmVwYXJlX2ZpbGVzIGxvZ2ljLgoKICAgIFRoZSByZXF1aXJlbWVudHMgZm9yIGFueXRoaW5nIGluc3RhbGxhYmxlIGFyZSBhcyBmb2xsb3dzOgogICAgIC0gd2UgbXVzdCBiZSBhYmxlIHRvIGRldGVybWluZSB0aGUgcmVxdWlyZW1lbnQgbmFtZQogICAgICAgKG9yIHdlIGNhbid0IGNvcnJlY3RseSBoYW5kbGUgdGhlIG5vbi11cGdyYWRlIGNhc2UpLgogICAgIC0gd2UgbXVzdCBiZSBhYmxlIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBydW4tdGltZSBkZXBlbmRlbmNpZXMKICAgICAgIHdpdGhvdXQgaW5zdGFsbGluZyBhbnkgYWRkaXRpb25hbCBwYWNrYWdlcyAob3Igd2Ugd291bGQKICAgICAgIGhhdmUgdG8gZWl0aGVyIGJ1cm4gdGltZSBieSBkb2luZyB0ZW1wb3JhcnkgaXNvbGF0ZWQgaW5zdGFsbHMKICAgICAgIG9yIGFsdGVybmF0aXZlbHkgdmlvbGF0ZSBwaXBzICdkb24ndCBzdGFydCBpbnN0YWxsaW5nIHVubGVzcwogICAgICAgYWxsIHJlcXVpcmVtZW50cyBhcmUgYXZhaWxhYmxlJyBydWxlIC0gbmVpdGhlciBvZiB3aGljaCBhcmUKICAgICAgIGRlc2lyYWJsZSkuCiAgICAgLSBmb3IgcGFja2FnZXMgd2l0aCBzZXR1cCByZXF1aXJlbWVudHMsIHdlIG11c3QgYWxzbyBiZSBhYmxlCiAgICAgICB0byBkZXRlcm1pbmUgdGhlaXIgcmVxdWlyZW1lbnRzIHdpdGhvdXQgaW5zdGFsbGluZyBhZGRpdGlvbmFsCiAgICAgICBwYWNrYWdlcyAoZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBydW4tdGltZSBkZXBlbmRlbmNpZXMpCiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIGEgRGlzdHJpYnV0aW9uIG9iamVjdCBleHBvc2luZyB0aGUKICAgICAgIGFib3ZlIG1ldGFkYXRhLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcV90b19pbnN0YWxsKToKICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsID0gcmVxX3RvX2luc3RhbGwKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgICIiIlJldHVybiBhIHNldHVwdG9vbHMgRGlzdCBvYmplY3QuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihzZWxmLmRpc3QpCgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgd2UgY2FuIGdldCBhIERpc3QgZm9yIHRoaXMgcmVxdWlyZW1lbnQuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihzZWxmLmRpc3QpCgoKZGVmIG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCk6CiAgICAiIiJGYWN0b3J5IHRvIG1ha2UgYW4gYWJzdHJhY3QgZGlzdCBvYmplY3QuCgogICAgUHJlY29uZGl0aW9uczogRWl0aGVyIGFuIGVkaXRhYmxlIHJlcSB3aXRoIGEgc291cmNlX2Rpciwgb3Igc2F0aXNmaWVkX2J5IG9yCiAgICBhIHdoZWVsIGxpbmssIG9yIGEgbm9uLWVkaXRhYmxlIHJlcSB3aXRoIGEgc291cmNlX2Rpci4KCiAgICA6cmV0dXJuOiBBIGNvbmNyZXRlIERpc3RBYnN0cmFjdGlvbi4KICAgICIiIgogICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgcmV0dXJuIElzU0Rpc3QocmVxX3RvX2luc3RhbGwpCiAgICBlbGlmIHJlcV90b19pbnN0YWxsLmxpbmsgYW5kIHJlcV90b19pbnN0YWxsLmxpbmsuaXNfd2hlZWw6CiAgICAgICAgcmV0dXJuIElzV2hlZWwocmVxX3RvX2luc3RhbGwpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBJc1NEaXN0KHJlcV90b19pbnN0YWxsKQoKCmNsYXNzIElzV2hlZWwoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIHJldHVybiBsaXN0KHBrZ19yZXNvdXJjZXMuZmluZF9kaXN0cmlidXRpb25zKAogICAgICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIpKVswXQoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgICMgRklYTUU6aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xMTEyCiAgICAgICAgcGFzcwoKCmNsYXNzIElzU0Rpc3QoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIGRpc3QgPSBzZWxmLnJlcV90b19pbnN0YWxsLmdldF9kaXN0KCkKICAgICAgICAjIEZJWE1FOiBzaG91bGRuJ3QgYmUgZ2xvYmFsbHkgYWRkZWQ6CiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgIGZpbmRlci5hZGRfZGVwZW5kZW5jeV9saW5rcygKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwucnVuX2VnZ19pbmZvKCkKICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsLmFzc2VydF9zb3VyY2VfbWF0Y2hlc192ZXJzaW9uKCkKCgpjbGFzcyBJbnN0YWxsZWQoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIHJldHVybiBzZWxmLnJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieQoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBSZXF1aXJlbWVudFNldChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZF9kaXIsIHNyY19kaXIsIGRvd25sb2FkX2RpciwgdXBncmFkZT1GYWxzZSwKICAgICAgICAgICAgICAgICB1cGdyYWRlX3N0cmF0ZWd5PU5vbmUsIGlnbm9yZV9pbnN0YWxsZWQ9RmFsc2UsIGFzX2VnZz1GYWxzZSwKICAgICAgICAgICAgICAgICB0YXJnZXRfZGlyPU5vbmUsIGlnbm9yZV9kZXBlbmRlbmNpZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgZm9yY2VfcmVpbnN0YWxsPUZhbHNlLCB1c2VfdXNlcl9zaXRlPUZhbHNlLCBzZXNzaW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIGlzb2xhdGVkPUZhbHNlLCB3aGVlbF9kb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCByZXF1aXJlX2hhc2hlcz1GYWxzZSwKICAgICAgICAgICAgICAgICBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uPUZhbHNlKToKICAgICAgICAiIiJDcmVhdGUgYSBSZXF1aXJlbWVudFNldC4KCiAgICAgICAgOnBhcmFtIHdoZWVsX2Rvd25sb2FkX2RpcjogV2hlcmUgc3RpbGwtcGFja2VkIC53aGwgZmlsZXMgc2hvdWxkIGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdG8uIElmIE5vbmUgdGhleSBhcmUgd3JpdHRlbiB0byB0aGUgZG93bmxvYWRfZGlyIHBhcmFtZXRlci4KICAgICAgICAgICAgU2VwYXJhdGUgdG8gZG93bmxvYWRfZGlyIHRvIHBlcm1pdCBvbmx5IGtlZXBpbmcgd2hlZWwgYXJjaGl2ZXMgZm9yCiAgICAgICAgICAgIHBpcCB3aGVlbC4KICAgICAgICA6cGFyYW0gZG93bmxvYWRfZGlyOiBXaGVyZSBzdGlsbCBwYWNrZWQgYXJjaGl2ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCiAgICAgICAgICAgIElmIE5vbmUgdGhleSBhcmUgbm90IHNhdmVkLCBhbmQgYXJlIGRlbGV0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKICAgICAgICAgICAgdW5wYWNraW5nLgogICAgICAgIDpwYXJhbSB3aGVlbF9jYWNoZTogVGhlIHBpcCB3aGVlbCBjYWNoZSwgZm9yIHBhc3NpbmcgdG8KICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgIlJlcXVpcmVtZW50U2V0KCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgICAgICInc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBidWlsZF9kaXIKICAgICAgICBzZWxmLnNyY19kaXIgPSBzcmNfZGlyCiAgICAgICAgIyBYWFg6IGRvd25sb2FkX2RpciBhbmQgd2hlZWxfZG93bmxvYWRfZGlyIG92ZXJsYXAgc2VtYW50aWNhbGx5IGFuZCBtYXkKICAgICAgICAjIGJlIGNvbWJpbmVkIGlmIHdlJ3JlIHdpbGxpbmcgdG8gaGF2ZSBub24td2hlZWwgYXJjaGl2ZXMgcHJlc2VudCBpbgogICAgICAgICMgdGhlIHdoZWVsaG91c2Ugb3V0cHV0IGJ5ICdwaXAgd2hlZWwnLgogICAgICAgIHNlbGYuZG93bmxvYWRfZGlyID0gZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi51cGdyYWRlID0gdXBncmFkZQogICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9IHVwZ3JhZGVfc3RyYXRlZ3kKICAgICAgICBzZWxmLmlnbm9yZV9pbnN0YWxsZWQgPSBpZ25vcmVfaW5zdGFsbGVkCiAgICAgICAgc2VsZi5mb3JjZV9yZWluc3RhbGwgPSBmb3JjZV9yZWluc3RhbGwKICAgICAgICBzZWxmLnJlcXVpcmVtZW50cyA9IFJlcXVpcmVtZW50cygpCiAgICAgICAgIyBNYXBwaW5nIG9mIGFsaWFzOiByZWFsX25hbWUKICAgICAgICBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXMgPSB7fQogICAgICAgIHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMgPSBbXQogICAgICAgIHNlbGYuaWdub3JlX2RlcGVuZGVuY2llcyA9IGlnbm9yZV9kZXBlbmRlbmNpZXMKICAgICAgICBzZWxmLmlnbm9yZV9yZXF1aXJlc19weXRob24gPSBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZCA9IFtdCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfaW5zdGFsbGVkID0gW10KICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cCA9IFtdCiAgICAgICAgc2VsZi5hc19lZ2cgPSBhc19lZ2cKICAgICAgICBzZWxmLnVzZV91c2VyX3NpdGUgPSB1c2VfdXNlcl9zaXRlCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gdGFyZ2V0X2RpciAgIyBzZXQgZnJvbSAtLXRhcmdldCBvcHRpb24KICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCiAgICAgICAgc2VsZi5weWNvbXBpbGUgPSBweWNvbXBpbGUKICAgICAgICBzZWxmLmlzb2xhdGVkID0gaXNvbGF0ZWQKICAgICAgICBpZiB3aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIHdoZWVsX2Rvd25sb2FkX2RpciA9IG5vcm1hbGl6ZV9wYXRoKHdoZWVsX2Rvd25sb2FkX2RpcikKICAgICAgICBzZWxmLndoZWVsX2Rvd25sb2FkX2RpciA9IHdoZWVsX2Rvd25sb2FkX2RpcgogICAgICAgIHNlbGYuX3doZWVsX2NhY2hlID0gd2hlZWxfY2FjaGUKICAgICAgICBzZWxmLnJlcXVpcmVfaGFzaGVzID0gcmVxdWlyZV9oYXNoZXMKICAgICAgICAjIE1hcHMgZnJvbSBpbnN0YWxsX3JlcSAtPiBkZXBlbmRlbmNpZXNfb2ZfaW5zdGFsbF9yZXEKICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXMgPSBkZWZhdWx0ZGljdChsaXN0KQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJlcXMgPSBbcmVxIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCkKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEuY29tZXNfZnJvbV0KICAgICAgICByZXFzLnNvcnQoa2V5PWxhbWJkYSByZXE6IHJlcS5uYW1lLmxvd2VyKCkpCiAgICAgICAgcmV0dXJuICcgJy5qb2luKFtzdHIocmVxLnJlcSkgZm9yIHJlcSBpbiByZXFzXSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmVxcyA9IFtyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKV0KICAgICAgICByZXFzLnNvcnQoa2V5PWxhbWJkYSByZXE6IHJlcS5uYW1lLmxvd2VyKCkpCiAgICAgICAgcmVxc19zdHIgPSAnLCAnLmpvaW4oW3N0cihyZXEucmVxKSBmb3IgcmVxIGluIHJlcXNdKQogICAgICAgIHJldHVybiAoJzwlcyBvYmplY3Q7ICVkIHJlcXVpcmVtZW50KHMpOiAlcz4nCiAgICAgICAgICAgICAgICAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbGVuKHJlcXMpLCByZXFzX3N0cikpCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudChzZWxmLCBpbnN0YWxsX3JlcSwgcGFyZW50X3JlcV9uYW1lPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQ9Tm9uZSk6CiAgICAgICAgIiIiQWRkIGluc3RhbGxfcmVxIGFzIGEgcmVxdWlyZW1lbnQgdG8gaW5zdGFsbC4KCiAgICAgICAgOnBhcmFtIHBhcmVudF9yZXFfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgbmVlZGVkIHRoaXMKICAgICAgICAgICAgYWRkZWQuIFRoZSBuYW1lIGlzIHVzZWQgYmVjYXVzZSB3aGVuIG11bHRpcGxlIHVubmFtZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIHJlc29sdmUgdG8gdGhlIHNhbWUgbmFtZSwgd2UgY291bGQgb3RoZXJ3aXNlIGVuZCB1cCB3aXRoIGRlcGVuZGVuY3kKICAgICAgICAgICAgbGlua3MgdGhhdCBwb2ludCBvdXRzaWRlIHRoZSBSZXF1aXJlbWVudHMgc2V0LiBwYXJlbnRfcmVxIG11c3QKICAgICAgICAgICAgYWxyZWFkeSBiZSBhZGRlZC4gTm90ZSB0aGF0IE5vbmUgaW1wbGllcyB0aGF0IHRoaXMgaXMgYSB1c2VyCiAgICAgICAgICAgIHN1cHBsaWVkIHJlcXVpcmVtZW50LCB2cyBhbiBpbmZlcnJlZCBvbmUuCiAgICAgICAgOnBhcmFtIGV4dHJhc19yZXF1ZXN0ZWQ6IGFuIGl0ZXJhYmxlIG9mIGV4dHJhcyB1c2VkIHRvIGV2YWx1YXRlIHRoZQogICAgICAgICAgICBlbnZpcm9uZW1lbnQgbWFya2Vycy4KICAgICAgICA6cmV0dXJuOiBBZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB0byBzY2FuLiBUaGF0IGlzIGVpdGhlciBbXSBpZgogICAgICAgICAgICB0aGUgcmVxdWlyZW1lbnQgaXMgbm90IGFwcGxpY2FibGUsIG9yIFtpbnN0YWxsX3JlcV0gaWYgdGhlCiAgICAgICAgICAgIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUgYW5kIGhhcyBqdXN0IGJlZW4gYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IGluc3RhbGxfcmVxLm5hbWUKICAgICAgICBpZiBub3QgaW5zdGFsbF9yZXEubWF0Y2hfbWFya2VycyhleHRyYXNfcmVxdWVzdGVkKToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIklnbm9yaW5nICVzOiBtYXJrZXJzICclcycgZG9uJ3QgbWF0Y2ggeW91ciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudCIsIGluc3RhbGxfcmVxLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxLm1hcmtlcnMpCiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAjIFRoaXMgY2hlY2sgaGFzIHRvIGNvbWUgYWZ0ZXIgd2UgZmlsdGVyIHJlcXVpcmVtZW50cyB3aXRoIHRoZQogICAgICAgICMgZW52aXJvbm1lbnQgbWFya2Vycy4KICAgICAgICBpZiBpbnN0YWxsX3JlcS5saW5rIGFuZCBpbnN0YWxsX3JlcS5saW5rLmlzX3doZWVsOgogICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGluc3RhbGxfcmVxLmxpbmsuZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdXBwb3J0ZWQgd2hlZWwgb24gdGhpcyBwbGF0Zm9ybS4iICUKICAgICAgICAgICAgICAgICAgICB3aGVlbC5maWxlbmFtZQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpbnN0YWxsX3JlcS5hc19lZ2cgPSBzZWxmLmFzX2VnZwogICAgICAgIGluc3RhbGxfcmVxLnVzZV91c2VyX3NpdGUgPSBzZWxmLnVzZV91c2VyX3NpdGUKICAgICAgICBpbnN0YWxsX3JlcS50YXJnZXRfZGlyID0gc2VsZi50YXJnZXRfZGlyCiAgICAgICAgaW5zdGFsbF9yZXEucHljb21waWxlID0gc2VsZi5weWNvbXBpbGUKICAgICAgICBpbnN0YWxsX3JlcS5pc19kaXJlY3QgPSAocGFyZW50X3JlcV9uYW1lIGlzIE5vbmUpCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAjIHVybCBvciBwYXRoIHJlcXVpcmVtZW50IHcvbyBhbiBlZ2cgZnJhZ21lbnQKICAgICAgICAgICAgc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cy5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgIHJldHVybiBbaW5zdGFsbF9yZXFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxID0gc2VsZi5nZXRfcmVxdWlyZW1lbnQobmFtZSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxID0gTm9uZQogICAgICAgICAgICBpZiAocGFyZW50X3JlcV9uYW1lIGlzIE5vbmUgYW5kIGV4aXN0aW5nX3JlcSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQgYW5kCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmV4dHJhcyA9PSBpbnN0YWxsX3JlcS5leHRyYXMgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5yZXEuc3BlY2lmaWVyID09IGluc3RhbGxfcmVxLnJlcS5zcGVjaWZpZXIpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ0RvdWJsZSByZXF1aXJlbWVudCBnaXZlbjogJXMgKGFscmVhZHkgaW4gJXMsIG5hbWU9JXIpJwogICAgICAgICAgICAgICAgICAgICUgKGluc3RhbGxfcmVxLCBleGlzdGluZ19yZXEsIG5hbWUpKQogICAgICAgICAgICBpZiBub3QgZXhpc3RpbmdfcmVxOgogICAgICAgICAgICAgICAgIyBBZGQgcmVxdWlyZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZW1lbnRzW25hbWVdID0gaW5zdGFsbF9yZXEKICAgICAgICAgICAgICAgICMgRklYTUU6IHdoYXQgYWJvdXQgb3RoZXIgbm9ybWFsaXphdGlvbnM/ICBFLmcuLCBfIHZzLiAtPwogICAgICAgICAgICAgICAgaWYgbmFtZS5sb3dlcigpICE9IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzW25hbWUubG93ZXIoKV0gPSBuYW1lCiAgICAgICAgICAgICAgICByZXN1bHQgPSBbaW5zdGFsbF9yZXFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGVyZSdzIG5vIG5lZWQgdG8gc2NhbiwgYW5kIHRoYXQgd2UndmUgYWxyZWFkeQogICAgICAgICAgICAgICAgIyBlbmNvdW50ZXJlZCB0aGlzIGZvciBzY2FubmluZy4KICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgICAgICBpZiBub3QgaW5zdGFsbF9yZXEuY29uc3RyYWludCBhbmQgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxfcmVxLmxpbmsgYW5kIG5vdCAoZXhpc3RpbmdfcmVxLmxpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEubGluay5wYXRoID09IGV4aXN0aW5nX3JlcS5saW5rLnBhdGgpKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXFzX3RvX2NsZWFudXAuYXBwZW5kKGluc3RhbGxfcmVxKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2F0aXNmeSBjb25zdHJhaW50cyBmb3IgJyVzJzogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxhdGlvbiBmcm9tIHBhdGggb3IgdXJsIGNhbm5vdCBiZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWluZWQgdG8gYSB2ZXJzaW9uIiAlIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBub3cgaW5zdGFsbGluZyBhIGNvbnN0cmFpbnQsIG1hcmsgdGhlIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAgICAgIyBvYmplY3QgZm9yIHJlYWwgaW5zdGFsbGF0aW9uLgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5jb25zdHJhaW50ID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuZXh0cmFzID0gdHVwbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChzZXQoZXhpc3RpbmdfcmVxLmV4dHJhcykudW5pb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoaW5zdGFsbF9yZXEuZXh0cmFzKSkpKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2V0dGluZyAlcyBleHRyYXMgdG86ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLCBleGlzdGluZ19yZXEuZXh0cmFzKQogICAgICAgICAgICAgICAgICAgICMgQW5kIG5vdyB3ZSBuZWVkIHRvIHNjYW4gdGhpcy4KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbZXhpc3RpbmdfcmVxXQogICAgICAgICAgICAgICAgIyBDYW5vbmljYWxpc2UgdG8gdGhlIGFscmVhZHktYWRkZWQgb2JqZWN0IGZvciB0aGUgYmFja3JlZgogICAgICAgICAgICAgICAgIyBjaGVjayBiZWxvdy4KICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxID0gZXhpc3RpbmdfcmVxCiAgICAgICAgICAgIGlmIHBhcmVudF9yZXFfbmFtZToKICAgICAgICAgICAgICAgIHBhcmVudF9yZXEgPSBzZWxmLmdldF9yZXF1aXJlbWVudChwYXJlbnRfcmVxX25hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXNbcGFyZW50X3JlcV0uYXBwZW5kKGluc3RhbGxfcmVxKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGhhc19yZXF1aXJlbWVudChzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgIG5hbWUgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIGlmIChuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRzIGFuZAogICAgICAgICAgIG5vdCBzZWxmLnJlcXVpcmVtZW50c1tuYW1lXS5jb25zdHJhaW50IG9yCiAgICAgICAgICAgbmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXMgYW5kCiAgICAgICAgICAgbm90IHNlbGYucmVxdWlyZW1lbnRzW3NlbGYucmVxdWlyZW1lbnRfYWxpYXNlc1tuYW1lXV0uY29uc3RyYWludCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKSBpZiBub3QKICAgICAgICAgICAgICAgICAgICByZXEuY29uc3RyYWludCkgb3Igc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2Rvd25sb2FkKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZG93bmxvYWRfZGlyOgogICAgICAgICAgICBzZWxmLmRvd25sb2FkX2RpciA9IGV4cGFuZHVzZXIoc2VsZi5kb3dubG9hZF9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZG93bmxvYWRfZGlyKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ0NvdWxkIG5vdCBmaW5kIGRvd25sb2FkIGRpcmVjdG9yeScpCiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgb3IgYWNjZXNzIGRvd25sb2FkIGRpcmVjdG9yeSAnJXMnIgogICAgICAgICAgICAgICAgICAgICUgZGlzcGxheV9wYXRoKHNlbGYuZG93bmxvYWRfZGlyKSkKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgZ2V0X3JlcXVpcmVtZW50KHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKToKICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVpcmVtZW50c1tuYW1lXQogICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVpcmVtZW50c1tzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXNbbmFtZV1dCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIHByb2plY3Qgd2l0aCB0aGUgbmFtZSAlciIgJSBwcm9qZWN0X25hbWUpCgogICAgZGVmIHVuaW5zdGFsbChzZWxmLCBhdXRvX2NvbmZpcm09RmFsc2UpOgogICAgICAgIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmVxLnVuaW5zdGFsbChhdXRvX2NvbmZpcm09YXV0b19jb25maXJtKQogICAgICAgICAgICByZXEuY29tbWl0X3VuaW5zdGFsbCgpCgogICAgZGVmIHByZXBhcmVfZmlsZXMoc2VsZiwgZmluZGVyKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHByb2Nlc3MuIENyZWF0ZSB0ZW1wIGRpcmVjdG9yaWVzLCBkb3dubG9hZCBhbmQvb3IgdW5wYWNrIGZpbGVzLgogICAgICAgICIiIgogICAgICAgICMgbWFrZSB0aGUgd2hlZWxob3VzZQogICAgICAgIGlmIHNlbGYud2hlZWxfZG93bmxvYWRfZGlyOgogICAgICAgICAgICBlbnN1cmVfZGlyKHNlbGYud2hlZWxfZG93bmxvYWRfZGlyKQoKICAgICAgICAjIElmIGFueSB0b3AtbGV2ZWwgcmVxdWlyZW1lbnQgaGFzIGEgaGFzaCBzcGVjaWZpZWQsIGVudGVyCiAgICAgICAgIyBoYXNoLWNoZWNraW5nIG1vZGUsIHdoaWNoIHJlcXVpcmVzIGhhc2hlcyBmcm9tIGFsbC4KICAgICAgICByb290X3JlcXMgPSBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzICsgc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCkKICAgICAgICByZXF1aXJlX2hhc2hlcyA9IChzZWxmLnJlcXVpcmVfaGFzaGVzIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KHJlcS5oYXNfaGFzaF9vcHRpb25zIGZvciByZXEgaW4gcm9vdF9yZXFzKSkKICAgICAgICBpZiByZXF1aXJlX2hhc2hlcyBhbmQgc2VsZi5hc19lZ2c6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJy0tZWdnIGlzIG5vdCBhbGxvd2VkIHdpdGggLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBzaW5jZSBpdCAnCiAgICAgICAgICAgICAgICAnZGVsZWdhdGVzIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiB0byBzZXR1cHRvb2xzIGFuZCBjb3VsZCB0aHVzICcKICAgICAgICAgICAgICAgICdyZXN1bHQgaW4gaW5zdGFsbGF0aW9uIG9mIHVuaGFzaGVkIHBhY2thZ2VzLicpCgogICAgICAgICMgQWN0dWFsbHkgcHJlcGFyZSB0aGUgZmlsZXMsIGFuZCBjb2xsZWN0IGFueSBleGNlcHRpb25zLiBNb3N0IGhhc2gKICAgICAgICAjIGV4Y2VwdGlvbnMgY2Fubm90IGJlIGNoZWNrZWQgYWhlYWQgb2YgdGltZSwgYmVjYXVzZQogICAgICAgICMgcmVxLnBvcHVsYXRlX2xpbmsoKSBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHdlIGNhbiBtYWtlIGRlY2lzaW9ucwogICAgICAgICMgYmFzZWQgb24gbGluayB0eXBlLgogICAgICAgIGRpc2NvdmVyZWRfcmVxcyA9IFtdCiAgICAgICAgaGFzaF9lcnJvcnMgPSBIYXNoRXJyb3JzKCkKICAgICAgICBmb3IgcmVxIGluIGNoYWluKHJvb3RfcmVxcywgZGlzY292ZXJlZF9yZXFzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGlzY292ZXJlZF9yZXFzLmV4dGVuZChzZWxmLl9wcmVwYXJlX2ZpbGUoCiAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1yZXF1aXJlX2hhc2hlcywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPXNlbGYuaWdub3JlX2RlcGVuZGVuY2llcykpCiAgICAgICAgICAgIGV4Y2VwdCBIYXNoRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgZXhjLnJlcSA9IHJlcQogICAgICAgICAgICAgICAgaGFzaF9lcnJvcnMuYXBwZW5kKGV4YykKCiAgICAgICAgaWYgaGFzaF9lcnJvcnM6CiAgICAgICAgICAgIHJhaXNlIGhhc2hfZXJyb3JzCgogICAgZGVmIF9pc191cGdyYWRlX2FsbG93ZWQoc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gc2VsZi51cGdyYWRlIGFuZCAoCiAgICAgICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAiZWFnZXIiIG9yICgKICAgICAgICAgICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAib25seS1pZi1uZWVkZWQiIGFuZCByZXEuaXNfZGlyZWN0CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZGVmIF9jaGVja19za2lwX2luc3RhbGxlZChzZWxmLCByZXFfdG9faW5zdGFsbCwgZmluZGVyKToKICAgICAgICAiIiJDaGVjayBpZiByZXFfdG9faW5zdGFsbCBzaG91bGQgYmUgc2tpcHBlZC4KCiAgICAgICAgVGhpcyB3aWxsIGNoZWNrIGlmIHRoZSByZXEgaXMgaW5zdGFsbGVkLCBhbmQgd2hldGhlciB3ZSBzaG91bGQgdXBncmFkZQogICAgICAgIG9yIHJlaW5zdGFsbCBpdCwgdGFraW5nIGludG8gYWNjb3VudCBhbGwgdGhlIHJlbGV2YW50IHVzZXIgb3B0aW9ucy4KCiAgICAgICAgQWZ0ZXIgY2FsbGluZyB0aGlzIHJlcV90b19pbnN0YWxsIHdpbGwgb25seSBoYXZlIHNhdGlzZmllZF9ieSBzZXQgdG8KICAgICAgICBOb25lIGlmIHRoZSByZXFfdG9faW5zdGFsbCBpcyB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZCBldGMuIEFueQogICAgICAgIG90aGVyIHZhbHVlIHdpbGwgYmUgYSBkaXN0IHJlY29yZGluZyB0aGUgY3VycmVudCB0aGluZyBpbnN0YWxsZWQgdGhhdAogICAgICAgIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQuCgogICAgICAgIE5vdGUgdGhhdCBmb3IgdmNzIHVybHMgYW5kIHRoZSBsaWtlIHdlIGNhbid0IGFzc2VzcyBza2lwcGluZyBpbiB0aGlzCiAgICAgICAgcm91dGluZSAtIHdlIHNpbXBseSBpZGVudGlmeSB0aGF0IHdlIG5lZWQgdG8gcHVsbCB0aGUgdGhpbmcgZG93biwKICAgICAgICB0aGVuIGxhdGVyIG9uIGl0IGlzIHB1bGxlZCBkb3duIGFuZCBpbnRyb3NwZWN0ZWQgdG8gYXNzZXNzIHVwZ3JhZGUvCiAgICAgICAgcmVpbnN0YWxscyBldGMuCgogICAgICAgIDpyZXR1cm46IEEgdGV4dCByZWFzb24gZm9yIHdoeSBpdCB3YXMgc2tpcHBlZCwgb3IgTm9uZS4KICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIHdoZXRoZXIgdG8gdXBncmFkZS9yZWluc3RhbGwgdGhpcyByZXEgb3Igbm90LgogICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICB1cGdyYWRlX2FsbG93ZWQgPSBzZWxmLl9pc191cGdyYWRlX2FsbG93ZWQocmVxX3RvX2luc3RhbGwpCgogICAgICAgICAgICAjIElzIHRoZSBiZXN0IHZlcnNpb24gaXMgaW5zdGFsbGVkLgogICAgICAgICAgICBiZXN0X2luc3RhbGxlZCA9IEZhbHNlCgogICAgICAgICAgICBpZiB1cGdyYWRlX2FsbG93ZWQ6CiAgICAgICAgICAgICAgICAjIEZvciBsaW5rIGJhc2VkIHJlcXVpcmVtZW50cyB3ZSBoYXZlIHRvIHB1bGwgdGhlCiAgICAgICAgICAgICAgICAjIHRyZWUgZG93biBhbmQgaW5zcGVjdCB0byBhc3Nlc3MgdGhlIHZlcnNpb24gIywgc28KICAgICAgICAgICAgICAgICMgaXRzIGhhbmRsZWQgd2F5IGRvd24uCiAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYuZm9yY2VfcmVpbnN0YWxsIG9yIHJlcV90b19pbnN0YWxsLmxpbmspOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLmZpbmRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwgdXBncmFkZV9hbGxvd2VkKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBkaXN0cmlidXRpb24gZm91bmQsIHNvIHdlIHNxdWFzaCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciAtIGl0IHdpbGwgYmUgcmFpc2VkIGxhdGVyIHdoZW4gd2UKICAgICAgICAgICAgICAgICAgICAgICAgIyByZS10cnkgbGF0ZXIgdG8gZG8gdGhlIGluc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICMgV2h5IGRvbid0IHdlIGp1c3QgcmFpc2UgaGVyZT8KICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgICAgIGlmIG5vdCBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IHVuaW5zdGFsbCBjb25mbGljdCBpZiB1c2VyIGluc3RhbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgIyBjb25mbGljdCBpcyBub3QgdXNlciBpbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IChzZWxmLnVzZV91c2VyX3NpdGUgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbl91c2Vyc2l0ZShyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkpKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY29uZmxpY3RzX3dpdGggPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgPSBOb25lCgogICAgICAgICAgICAjIEZpZ3VyZSBvdXQgYSBuaWNlIG1lc3NhZ2UgdG8gc2F5IHdoeSB3ZSdyZSBza2lwcGluZyB0aGlzLgogICAgICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ2FscmVhZHkgdXAtdG8tZGF0ZScKICAgICAgICAgICAgZWxpZiBzZWxmLnVwZ3JhZGVfc3RyYXRlZ3kgPT0gIm9ubHktaWYtbmVlZGVkIjoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ25vdCB1cGdyYWRlZCBhcyBub3QgZGlyZWN0bHkgcmVxdWlyZWQnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9ICdhbHJlYWR5IHNhdGlzZmllZCcKCiAgICAgICAgICAgIHJldHVybiBza2lwX3JlYXNvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9wcmVwYXJlX2ZpbGUoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPUZhbHNlKToKICAgICAgICAiIiJQcmVwYXJlIGEgc2luZ2xlIHJlcXVpcmVtZW50cyBmaWxlLgoKICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWRkaXRpb25hbCBJbnN0YWxsUmVxdWlyZW1lbnRzIHRvIGFsc28gaW5zdGFsbC4KICAgICAgICAiIiIKICAgICAgICAjIFRlbGwgdXNlciB3aGF0IHdlIGFyZSBkb2luZyBmb3IgdGhpcyByZXF1aXJlbWVudDoKICAgICAgICAjIG9idGFpbiAoZWRpdGFibGUpLCBza2lwcGluZywgcHJvY2Vzc2luZyAobG9jYWwgdXJsKSwgY29sbGVjdGluZwogICAgICAgICMgKHJlbW90ZSB1cmwgb3IgcGFja2FnZSBuYW1lKQogICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmNvbnN0cmFpbnQgb3IgcmVxX3RvX2luc3RhbGwucHJlcGFyZWQ6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXFfdG9faW5zdGFsbC5wcmVwYXJlZCA9IFRydWUKCiAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAjICMgcHJpbnQgbG9nIG1lc3NhZ2VzICMgIwogICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdPYnRhaW5pbmcgJXMnLCByZXFfdG9faW5zdGFsbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHNhdGlzZmllZF9ieSBpcyBvbmx5IGV2YWx1YXRlZCBieSBjYWxsaW5nIF9jaGVja19za2lwX2luc3RhbGxlZCwKICAgICAgICAgICAgIyBzbyBpdCBtdXN0IGJlIE5vbmUgaGVyZS4KICAgICAgICAgICAgYXNzZXJ0IHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSBpcyBOb25lCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9IHNlbGYuX2NoZWNrX3NraXBfaW5zdGFsbGVkKAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLCBmaW5kZXIpCgogICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2tpcF9yZWFzb24gaXMgbm90IE5vbmUsICgKICAgICAgICAgICAgICAgICAgICAnX2NoZWNrX3NraXBfaW5zdGFsbGVkIHJldHVybmVkIE5vbmUgYnV0ICcKICAgICAgICAgICAgICAgICAgICAncmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIHNldCB0byAlcicKICAgICAgICAgICAgICAgICAgICAlIChyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnksKSkKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCAlczogJXMnLCBza2lwX3JlYXNvbiwKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIChyZXFfdG9faW5zdGFsbC5saW5rIGFuZAogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5saW5rLnNjaGVtZSA9PSAnZmlsZScpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxfdG9fcGF0aChyZXFfdG9faW5zdGFsbC5saW5rLnVybCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyAlcycsIGRpc3BsYXlfcGF0aChwYXRoKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3RpbmcgJXMnLCByZXFfdG9faW5zdGFsbCkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICAjICMgdmNzIHVwZGF0ZSBvciB1bnBhY2sgYXJjaGl2ZSAjICMKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgZWRpdGFibGUgcmVxdWlyZW1lbnQgJXMgY2Fubm90IGJlIGluc3RhbGxlZCB3aGVuICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmluZyBoYXNoZXMsIGJlY2F1c2UgdGhlcmUgaXMgbm8gc2luZ2xlIGZpbGUgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICAnaGFzaC4nICUgcmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5lbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZi5zcmNfZGlyKQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwudXBkYXRlX2VkaXRhYmxlKG5vdCBzZWxmLmlzX2Rvd25sb2FkKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QucHJlcF9mb3JfZGlzdCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2Rvd25sb2FkOgogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmFyY2hpdmUoc2VsZi5kb3dubG9hZF9kaXIpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jaGVja19pZl9leGlzdHMoKQogICAgICAgICAgICBlbGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgJ1NpbmNlIGl0IGlzIGFscmVhZHkgaW5zdGFsbGVkLCB3ZSBhcmUgdHJ1c3RpbmcgdGhpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIHdpdGhvdXQgY2hlY2tpbmcgaXRzIGhhc2guIFRvIGVuc3VyZSBhICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXRlbHkgcmVwZWF0YWJsZSBlbnZpcm9ubWVudCwgaW5zdGFsbCBpbnRvIGFuICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2VtcHR5IHZpcnR1YWxlbnYuJykKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QgPSBJbnN0YWxsZWQocmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEBAIGlmIGZpbGVzeXN0ZW0gcGFja2FnZXMgYXJlIG5vdCBtYXJrZWQKICAgICAgICAgICAgICAgICMgZWRpdGFibGUgaW4gYSByZXEsIGEgbm9uIGRldGVybWluaXN0aWMgZXJyb3IKICAgICAgICAgICAgICAgICMgb2NjdXJzIHdoZW4gdGhlIHNjcmlwdCBhdHRlbXB0cyB0byB1bnBhY2sgdGhlCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuZW5zdXJlX2hhc19zb3VyY2VfZGlyKHNlbGYuYnVpbGRfZGlyKQogICAgICAgICAgICAgICAgIyBJZiBhIGNoZWNrb3V0IGV4aXN0cywgaXQncyB1bndpc2UgdG8ga2VlcCBnb2luZy4gIHZlcnNpb24KICAgICAgICAgICAgICAgICMgaW5jb25zaXN0ZW5jaWVzIGFyZSBsb2dnZWQgbGF0ZXIsIGJ1dCBkbyBub3QgZmFpbCB0aGUKICAgICAgICAgICAgICAgICMgaW5zdGFsbGF0aW9uLgogICAgICAgICAgICAgICAgIyBGSVhNRTogdGhpcyB3b24ndCB1cGdyYWRlIHdoZW4gdGhlcmUncyBhbiBleGlzdGluZwogICAgICAgICAgICAgICAgIyBwYWNrYWdlIHVucGFja2VkIGluIGByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyYAogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUHJldmlvdXNCdWlsZERpckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAicGlwIGNhbid0IHByb2NlZWQgd2l0aCByZXF1aXJlbWVudHMgJyVzJyBkdWUgdG8gYSIKICAgICAgICAgICAgICAgICAgICAgICAgIiBwcmUtZXhpc3RpbmcgYnVpbGQgZGlyZWN0b3J5ICglcykuIFRoaXMgaXMgIgogICAgICAgICAgICAgICAgICAgICAgICAibGlrZWx5IGR1ZSB0byBhIHByZXZpb3VzIGluc3RhbGxhdGlvbiB0aGF0IGZhaWxlZCIKICAgICAgICAgICAgICAgICAgICAgICAgIi4gcGlwIGlzIGJlaW5nIHJlc3BvbnNpYmxlIGFuZCBub3QgYXNzdW1pbmcgaXQgIgogICAgICAgICAgICAgICAgICAgICAgICAiY2FuIGRlbGV0ZSB0aGlzLiBQbGVhc2UgZGVsZXRlIGl0IGFuZCB0cnkgYWdhaW4uIgogICAgICAgICAgICAgICAgICAgICAgICAlIChyZXFfdG9faW5zdGFsbCwgcmVxX3RvX2luc3RhbGwuc291cmNlX2RpcikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5wb3B1bGF0ZV9saW5rKAogICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pc191cGdyYWRlX2FsbG93ZWQocmVxX3RvX2luc3RhbGwpLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAjIFdlIGNhbid0IGhpdCB0aGlzIHNwb3QgYW5kIGhhdmUgcG9wdWxhdGVfbGluayByZXR1cm4gTm9uZS4KICAgICAgICAgICAgICAgICMgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIE5vbmUgaGVyZSAoYmVjYXVzZSB3ZSdyZQogICAgICAgICAgICAgICAgIyBndWFyZGVkKSBhbmQgdXBncmFkZSBoYXMgbm8gaW1wYWN0IGV4Y2VwdCB3aGVuIHNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgIyBpcyBub3QgTm9uZS4KICAgICAgICAgICAgICAgICMgVGhlbiBpbnNpZGUgZmluZF9yZXF1aXJlbWVudCBleGlzdGluZ19hcHBsaWNhYmxlIC0+IEZhbHNlCiAgICAgICAgICAgICAgICAjIElmIG5vIG5ldyB2ZXJzaW9ucyBhcmUgZm91bmQsIERpc3RyaWJ1dGlvbk5vdEZvdW5kIGlzIHJhaXNlZCwKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGEgcmVzdWx0IGlzIGd1YXJhbnRlZWQuCiAgICAgICAgICAgICAgICBhc3NlcnQgcmVxX3RvX2luc3RhbGwubGluawogICAgICAgICAgICAgICAgbGluayA9IHJlcV90b19pbnN0YWxsLmxpbmsKCiAgICAgICAgICAgICAgICAjIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlYWwgbGluaywgd2UgY2FuIHRlbGwgd2hhdCBraW5kIG9mCiAgICAgICAgICAgICAgICAjIHJlcXVpcmVtZW50cyB3ZSBoYXZlIGFuZCByYWlzZSBzb21lIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3JzCiAgICAgICAgICAgICAgICAjIHRoYW4gb3RoZXJ3aXNlLiAoRm9yIGV4YW1wbGUsIHdlIGNhbiByYWlzZSBWY3NIYXNoVW5zdXBwb3J0ZWQKICAgICAgICAgICAgICAgICMgZm9yIGEgVkNTIFVSTCByYXRoZXIgdGhhbiBIYXNoTWlzc2luZy4pCiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgICAgICAgICAjIFdlIGNvdWxkIGNoZWNrIHRoZXNlIGZpcnN0IDIgY29uZGl0aW9ucyBpbnNpZGUKICAgICAgICAgICAgICAgICAgICAjIHVucGFja191cmwgYW5kIHNhdmUgcmVwZXRpdGlvbiBvZiBjb25kaXRpb25zLCBidXQgdGhlbgogICAgICAgICAgICAgICAgICAgICMgd2Ugd291bGQgcmVwb3J0IGxlc3MtdXNlZnVsIGVycm9yIG1lc3NhZ2VzIGZvcgogICAgICAgICAgICAgICAgICAgICMgdW5oYXNoYWJsZSByZXF1aXJlbWVudHMsIGNvbXBsYWluaW5nIHRoYXQgdGhlcmUncyBubwogICAgICAgICAgICAgICAgICAgICMgaGFzaCBwcm92aWRlZC4KICAgICAgICAgICAgICAgICAgICBpZiBpc192Y3NfdXJsKGxpbmspOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWY3NIYXNoVW5zdXBwb3J0ZWQoKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZmlsZV91cmwobGluaykgYW5kIGlzX2Rpcl91cmwobGluayk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpcmVjdG9yeVVybEhhc2hVbnN1cHBvcnRlZCgpCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCByZXFfdG9faW5zdGFsbC5vcmlnaW5hbF9saW5rIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlcV90b19pbnN0YWxsLmlzX3Bpbm5lZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgVW5waW5uZWQgcGFja2FnZXMgYXJlIGFza2luZyBmb3IgdHJvdWJsZSB3aGVuIGEgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyc2lvbiBpcyB1cGxvYWRlZC4gVGhpcyBpc24ndCBhIHNlY3VyaXR5IGNoZWNrLCBidXQKICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCBzYXZlcyB1c2VycyBhIHN1cnByaXNpbmcgaGFzaCBtaXNtYXRjaCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBmdXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWxlOi8vLyBVUkxzIGFyZW4ndCBwaW5uYWJsZSwgc28gZG9uJ3QgY29tcGxhaW4KICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm91dCB0aGVtIG5vdCBiZWluZyBwaW5uZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEhhc2hVbnBpbm5lZCgpCiAgICAgICAgICAgICAgICBoYXNoZXMgPSByZXFfdG9faW5zdGFsbC5oYXNoZXMoCiAgICAgICAgICAgICAgICAgICAgdHJ1c3RfaW50ZXJuZXQ9bm90IHJlcXVpcmVfaGFzaGVzKQogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXMgYW5kIG5vdCBoYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgIyBLbm93bi1nb29kIGhhc2hlcyBhcmUgbWlzc2luZyBmb3IgdGhpcyByZXF1aXJlbWVudCwgc28KICAgICAgICAgICAgICAgICAgICAjIHNoaW0gaXQgd2l0aCBhIGZhY2FkZSBvYmplY3QgdGhhdCB3aWxsIHByb3Zva2UgaGFzaAogICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gYW5kIHRoZW4gcmFpc2UgYSBIYXNoTWlzc2luZyBleGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAjIHNob3dpbmcgdGhlIHVzZXIgd2hhdCB0aGUgaGFzaCBzaG91bGQgYmUuCiAgICAgICAgICAgICAgICAgICAgaGFzaGVzID0gTWlzc2luZ0hhc2hlcygpCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciA9IHNlbGYuZG93bmxvYWRfZGlyCiAgICAgICAgICAgICAgICAgICAgIyBXZSBhbHdheXMgZGVsZXRlIHVucGFja2VkIHNkaXN0cyBhZnRlciBwaXAgcmFuLgogICAgICAgICAgICAgICAgICAgIGF1dG9kZWxldGVfdW5wYWNrZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi53aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbiBkb2luZyAncGlwIHdoZWVsYCB3ZSBkb3dubG9hZCB3aGVlbHMgdG8gYQogICAgICAgICAgICAgICAgICAgICAgICAjIGRlZGljYXRlZCBkaXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciA9IHNlbGYud2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG93bmxvYWRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXaGVuIGRvd25sb2FkaW5nLCB3ZSBvbmx5IHVucGFjayB3aGVlbHMgdG8gZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGFkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RlbGV0ZV91bnBhY2tlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hlbiBpbnN0YWxsaW5nIGEgd2hlZWwsIHdlIHVzZSB0aGUgdW5wYWNrZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZGVsZXRlX3VucGFja2VkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICB1bnBhY2tfdXJsKAogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5saW5rLCByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIsIGF1dG9kZWxldGVfdW5wYWNrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2VsZi5zZXNzaW9uLCBoYXNoZXM9aGFzaGVzKQogICAgICAgICAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGluc3RhbGwgcmVxdWlyZW1lbnQgJXMgYmVjYXVzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdvZiBlcnJvciAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgICBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGluc3RhbGwgcmVxdWlyZW1lbnQgJXMgYmVjYXVzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdvZiBIVFRQIGVycm9yICVzIGZvciBVUkwgJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgKHJlcV90b19pbnN0YWxsLCBleGMsIHJlcV90b19pbnN0YWxsLmxpbmspCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QucHJlcF9mb3JfZGlzdCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2Rvd25sb2FkOgogICAgICAgICAgICAgICAgICAgICMgTWFrZSBhIC56aXAgb2YgdGhlIHNvdXJjZV9kaXIgd2UgYWxyZWFkeSBjcmVhdGVkLgogICAgICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmxpbmsuc2NoZW1lIGluIHZjcy5hbGxfc2NoZW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuYXJjaGl2ZShzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgICAgICMgcmVxX3RvX2luc3RhbGwucmVxIGlzIG9ubHkgYXZhaWwgYWZ0ZXIgdW5wYWNrIGZvciBVUkwKICAgICAgICAgICAgICAgICMgcGtncyByZXBlYXQgY2hlY2tfaWZfZXhpc3RzIHRvIHVuaW5zdGFsbC1vbi11cGdyYWRlCiAgICAgICAgICAgICAgICAjICgjMTQpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51cGdyYWRlIG9yIHNlbGYuaWdub3JlX2luc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCB1bmluc3RhbGwgY29uZmxpY3QgaWYgdXNlciBpbnN0YWxsIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbmZsaWN0IGlzIG5vdCB1c2VyIGluc3RhbGwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IChzZWxmLnVzZV91c2VyX3NpdGUgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5fdXNlcnNpdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY29uZmxpY3RzX3dpdGggPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCBhbHJlYWR5IHNhdGlzZmllZCAodXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXVwZ3JhZGUgdG8gdXBncmFkZSk6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICAjICMgcGFyc2UgZGVwZW5kZW5jaWVzICMgIwogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICBkaXN0ID0gYWJzdHJhY3RfZGlzdC5kaXN0KGZpbmRlcikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24oZGlzdCkKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbiBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGUuYXJnc1swXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIG1vcmVfcmVxcyA9IFtdCgogICAgICAgICAgICBkZWYgYWRkX3JlcShzdWJyZXEsIGV4dHJhc19yZXF1ZXN0ZWQpOgogICAgICAgICAgICAgICAgc3ViX2luc3RhbGxfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIHN0cihzdWJyZXEpLAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPXNlbGYuaXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9c2VsZi5fd2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBtb3JlX3JlcXMuZXh0ZW5kKHNlbGYuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIHN1Yl9pbnN0YWxsX3JlcSwgcmVxX3RvX2luc3RhbGwubmFtZSwKICAgICAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWVzdGVkPWV4dHJhc19yZXF1ZXN0ZWQpKQoKICAgICAgICAgICAgIyBXZSBhZGQgcmVxX3RvX2luc3RhbGwgYmVmb3JlIGl0cyBkZXBlbmRlbmNpZXMsIHNvIHRoYXQgd2UKICAgICAgICAgICAgIyBjYW4gcmVmZXIgdG8gaXQgd2hlbiBhZGRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXNfcmVxdWlyZW1lbnQocmVxX3RvX2luc3RhbGwubmFtZSk6CiAgICAgICAgICAgICAgICAjICd1bm5hbWVkJyByZXF1aXJlbWVudHMgd2lsbCBnZXQgYWRkZWQgaGVyZQogICAgICAgICAgICAgICAgc2VsZi5hZGRfcmVxdWlyZW1lbnQocmVxX3RvX2luc3RhbGwsIE5vbmUpCgogICAgICAgICAgICBpZiBub3QgaWdub3JlX2RlcGVuZGVuY2llczoKICAgICAgICAgICAgICAgIGlmIChyZXFfdG9faW5zdGFsbC5leHRyYXMpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxpbmcgZXh0cmEgcmVxdWlyZW1lbnRzOiAlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICcsJy5qb2luKHJlcV90b19pbnN0YWxsLmV4dHJhcyksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbWlzc2luZ19yZXF1ZXN0ZWQgPSBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgc2V0KHJlcV90b19pbnN0YWxsLmV4dHJhcykgLSBzZXQoZGlzdC5leHRyYXMpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbWlzc2luZyBpbiBtaXNzaW5nX3JlcXVlc3RlZDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzIGRvZXMgbm90IHByb3ZpZGUgdGhlIGV4dHJhIFwnJXNcJycsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsIG1pc3NpbmcKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgYXZhaWxhYmxlX3JlcXVlc3RlZCA9IHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICBzZXQoZGlzdC5leHRyYXMpICYgc2V0KHJlcV90b19pbnN0YWxsLmV4dHJhcykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBzdWJyZXEgaW4gZGlzdC5yZXF1aXJlcyhhdmFpbGFibGVfcmVxdWVzdGVkKToKICAgICAgICAgICAgICAgICAgICBhZGRfcmVxKHN1YnJlcSwgZXh0cmFzX3JlcXVlc3RlZD1hdmFpbGFibGVfcmVxdWVzdGVkKQoKICAgICAgICAgICAgIyBjbGVhbnVwIHRtcCBzcmMKICAgICAgICAgICAgc2VsZi5yZXFzX3RvX2NsZWFudXAuYXBwZW5kKHJlcV90b19pbnN0YWxsKQoKICAgICAgICAgICAgaWYgbm90IHJlcV90b19pbnN0YWxsLmVkaXRhYmxlIGFuZCBub3QgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgIyBYWFg6IC0tbm8taW5zdGFsbCBsZWFkcyB0aGlzIHRvIHJlcG9ydCAnU3VjY2Vzc2Z1bGx5CiAgICAgICAgICAgICAgICAjIGRvd25sb2FkZWQnIGZvciBvbmx5IG5vbi1lZGl0YWJsZSByZXFzLCBldmVuIHRob3VnaCB3ZSB0b29rCiAgICAgICAgICAgICAgICAjIGFjdGlvbiBvbiB0aGVtLgogICAgICAgICAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZC5hcHBlbmQocmVxX3RvX2luc3RhbGwpCgogICAgICAgIHJldHVybiBtb3JlX3JlcXMKCiAgICBkZWYgY2xlYW51cF9maWxlcyhzZWxmKToKICAgICAgICAiIiJDbGVhbiB1cCBmaWxlcywgcmVtb3ZlIGJ1aWxkcy4iIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ0NsZWFuaW5nIHVwLi4uJykKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgZm9yIHJlcSBpbiBzZWxmLnJlcXNfdG9fY2xlYW51cDoKICAgICAgICAgICAgICAgIHJlcS5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCgogICAgZGVmIF90b19pbnN0YWxsKHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSB0aGUgaW5zdGFsbGF0aW9uIG9yZGVyLgoKICAgICAgICBUaGUgaW5zdGFsbGF0aW9uIG9yZGVyIGlzIHRvcG9sb2dpY2FsIC0gcmVxdWlyZW1lbnRzIGFyZSBpbnN0YWxsZWQKICAgICAgICBiZWZvcmUgdGhlIHJlcXVpcmluZyB0aGluZy4gV2UgYnJlYWsgY3ljbGVzIGF0IGFuIGFyYml0cmFyeSBwb2ludCwKICAgICAgICBhbmQgbWFrZSBubyBvdGhlciBndWFyYW50ZWVzLgogICAgICAgICIiIgogICAgICAgICMgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdoaWNoIHdlIG1heSBjaGFuZ2UgYXQgYW55IHBvaW50CiAgICAgICAgIyBpbnN0YWxscyB0aGUgdXNlciBzcGVjaWZpZWQgdGhpbmdzIGluIHRoZSBvcmRlciBnaXZlbiwgZXhjZXB0IHdoZW4KICAgICAgICAjIGRlcGVuZGVuY2llcyBtdXN0IGNvbWUgZWFybGllciB0byBhY2hpZXZlIHRvcG9sb2dpY2FsIG9yZGVyLgogICAgICAgIG9yZGVyID0gW10KICAgICAgICBvcmRlcmVkX3JlcXMgPSBzZXQoKQoKICAgICAgICBkZWYgc2NoZWR1bGUocmVxKToKICAgICAgICAgICAgaWYgcmVxLnNhdGlzZmllZF9ieSBvciByZXEgaW4gb3JkZXJlZF9yZXFzOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIG9yZGVyZWRfcmVxcy5hZGQocmVxKQogICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYuX2RlcGVuZGVuY2llc1tyZXFdOgogICAgICAgICAgICAgICAgc2NoZWR1bGUoZGVwKQogICAgICAgICAgICBvcmRlci5hcHBlbmQocmVxKQogICAgICAgIGZvciBpbnN0YWxsX3JlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKToKICAgICAgICAgICAgc2NoZWR1bGUoaW5zdGFsbF9yZXEpCiAgICAgICAgcmV0dXJuIG9yZGVyCgogICAgZGVmIGluc3RhbGwoc2VsZiwgaW5zdGFsbF9vcHRpb25zLCBnbG9iYWxfb3B0aW9ucz0oKSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIGV2ZXJ5dGhpbmcgaW4gdGhpcyBzZXQgKGFmdGVyIGhhdmluZyBkb3dubG9hZGVkIGFuZCB1bnBhY2tlZAogICAgICAgIHRoZSBwYWNrYWdlcykKICAgICAgICAiIiIKICAgICAgICB0b19pbnN0YWxsID0gc2VsZi5fdG9faW5zdGFsbCgpCgogICAgICAgIGlmIHRvX2luc3RhbGw6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0luc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiAlcycsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gdG9faW5zdGFsbF0pLAogICAgICAgICAgICApCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBmb3IgcmVxdWlyZW1lbnQgaW4gdG9faW5zdGFsbDoKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAnRm91bmQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQudW5pbnN0YWxsKGF1dG9fY29uZmlybT1UcnVlKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Lmluc3RhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICAjIGlmIGluc3RhbGwgZGlkIG5vdCBzdWNjZWVkLCByb2xsYmFjayBwcmV2aW91cyB1bmluc3RhbGwKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGggYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbF9zdWNjZWVkZWQpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5yb2xsYmFja191bmluc3RhbGwoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Lmluc3RhbGxfc3VjY2VlZGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuY29tbWl0X3VuaW5zdGFsbCgpCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCgogICAgICAgIHNlbGYuc3VjY2Vzc2Z1bGx5X2luc3RhbGxlZCA9IHRvX2luc3RhbGwKUEsDBBQAAAAAAAAAIQAFRsRw8RoAAPEaAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3VuaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHVzZXNfcHljYWNoZSwgV0lORE9XUywgY2FjaGVfZnJvbV9zb3VyY2UKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgVW5pbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBhc2ssIGlzX2xvY2FsLCByZW5hbWVzLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVW5pbnN0YWxsUGF0aFNldChvYmplY3QpOgogICAgIiIiQSBzZXQgb2YgZmlsZSBwYXRocyB0byBiZSByZW1vdmVkIGluIHRoZSB1bmluc3RhbGxhdGlvbiBvZiBhCiAgICByZXF1aXJlbWVudC4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0KToKICAgICAgICBzZWxmLnBhdGhzID0gc2V0KCkKICAgICAgICBzZWxmLl9yZWZ1c2UgPSBzZXQoKQogICAgICAgIHNlbGYucHRoID0ge30KICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CiAgICAgICAgc2VsZi5zYXZlX2RpciA9IE5vbmUKICAgICAgICBzZWxmLl9tb3ZlZF9wYXRocyA9IFtdCgogICAgZGVmIF9wZXJtaXR0ZWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIHBhdGggaXMgb25lIHdlIGFyZSBwZXJtaXR0ZWQgdG8KICAgICAgICByZW1vdmUvbW9kaWZ5LCBGYWxzZSBvdGhlcndpc2UuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc19sb2NhbChwYXRoKQoKICAgIGRlZiBhZGQoc2VsZiwgcGF0aCk6CiAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQocGF0aCkKCiAgICAgICAgIyB3ZSBub3JtYWxpemUgdGhlIGhlYWQgdG8gcmVzb2x2ZSBwYXJlbnQgZGlyZWN0b3J5IHN5bWxpbmtzLCBidXQgbm90CiAgICAgICAgIyB0aGUgdGFpbCwgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVuaW5zdGFsbCBzeW1saW5rcywgbm90IHRoZWlyIHRhcmdldHMKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG5vcm1hbGl6ZV9wYXRoKGhlYWQpLCBvcy5wYXRoLm5vcm1jYXNlKHRhaWwpKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHNlbGYuX3Blcm1pdHRlZChwYXRoKToKICAgICAgICAgICAgc2VsZi5wYXRocy5hZGQocGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZWZ1c2UuYWRkKHBhdGgpCgogICAgICAgICMgX19weWNhY2hlX18gZmlsZXMgY2FuIHNob3cgdXAgYWZ0ZXIgJ2luc3RhbGxlZC1maWxlcy50eHQnIGlzIGNyZWF0ZWQsCiAgICAgICAgIyBkdWUgdG8gaW1wb3J0cwogICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQocGF0aClbMV0gPT0gJy5weScgYW5kIHVzZXNfcHljYWNoZToKICAgICAgICAgICAgc2VsZi5hZGQoY2FjaGVfZnJvbV9zb3VyY2UocGF0aCkpCgogICAgZGVmIGFkZF9wdGgoc2VsZiwgcHRoX2ZpbGUsIGVudHJ5KToKICAgICAgICBwdGhfZmlsZSA9IG5vcm1hbGl6ZV9wYXRoKHB0aF9maWxlKQogICAgICAgIGlmIHNlbGYuX3Blcm1pdHRlZChwdGhfZmlsZSk6CiAgICAgICAgICAgIGlmIHB0aF9maWxlIG5vdCBpbiBzZWxmLnB0aDoKICAgICAgICAgICAgICAgIHNlbGYucHRoW3B0aF9maWxlXSA9IFVuaW5zdGFsbFB0aEVudHJpZXMocHRoX2ZpbGUpCiAgICAgICAgICAgIHNlbGYucHRoW3B0aF9maWxlXS5hZGQoZW50cnkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmVmdXNlLmFkZChwdGhfZmlsZSkKCiAgICBkZWYgY29tcGFjdChzZWxmLCBwYXRocyk6CiAgICAgICAgIiIiQ29tcGFjdCBhIHBhdGggc2V0IHRvIGNvbnRhaW4gdGhlIG1pbmltYWwgbnVtYmVyIG9mIHBhdGhzCiAgICAgICAgbmVjZXNzYXJ5IHRvIGNvbnRhaW4gYWxsIHBhdGhzIGluIHRoZSBzZXQuIElmIC9hL3BhdGgvIGFuZAogICAgICAgIC9hL3BhdGgvdG8vYS9maWxlLnR4dCBhcmUgYm90aCBpbiB0aGUgc2V0LCBsZWF2ZSBvbmx5IHRoZQogICAgICAgIHNob3J0ZXIgcGF0aC4iIiIKICAgICAgICBzaG9ydF9wYXRocyA9IHNldCgpCiAgICAgICAgZm9yIHBhdGggaW4gc29ydGVkKHBhdGhzLCBrZXk9bGVuKToKICAgICAgICAgICAgaWYgbm90IGFueShbCiAgICAgICAgICAgICAgICAgICAgKHBhdGguc3RhcnRzd2l0aChzaG9ydHBhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICBwYXRoW2xlbihzaG9ydHBhdGgucnN0cmlwKG9zLnBhdGguc2VwKSldID09IG9zLnBhdGguc2VwKQogICAgICAgICAgICAgICAgICAgIGZvciBzaG9ydHBhdGggaW4gc2hvcnRfcGF0aHNdKToKICAgICAgICAgICAgICAgIHNob3J0X3BhdGhzLmFkZChwYXRoKQogICAgICAgIHJldHVybiBzaG9ydF9wYXRocwoKICAgIGRlZiBfc3Rhc2goc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5zYXZlX2Rpciwgb3MucGF0aC5zcGxpdGRyaXZlKHBhdGgpWzFdLmxzdHJpcChvcy5wYXRoLnNlcCkpCgogICAgZGVmIHJlbW92ZShzZWxmLCBhdXRvX2NvbmZpcm09RmFsc2UpOgogICAgICAgICIiIlJlbW92ZSBwYXRocyBpbiBgYHNlbGYucGF0aHNgYCB3aXRoIGNvbmZpcm1hdGlvbiAodW5sZXNzCiAgICAgICAgYGBhdXRvX2NvbmZpcm1gYCBpcyBUcnVlKS4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5wYXRoczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiQ2FuJ3QgdW5pbnN0YWxsICclcycuIE5vIGZpbGVzIHdlcmUgZm91bmQgdG8gdW5pbnN0YWxsLiIsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAnVW5pbnN0YWxsaW5nICVzLSVzOicsCiAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsIHNlbGYuZGlzdC52ZXJzaW9uCiAgICAgICAgKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgcGF0aHMgPSBzb3J0ZWQoc2VsZi5jb21wYWN0KHNlbGYucGF0aHMpKQoKICAgICAgICAgICAgaWYgYXV0b19jb25maXJtOgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAneScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHBhdGgpCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGFzaygnUHJvY2VlZCAoeS9uKT8gJywgKCd5JywgJ24nKSkKICAgICAgICAgICAgaWYgc2VsZi5fcmVmdXNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ05vdCByZW1vdmluZyBvciBtb2RpZnlpbmcgKG91dHNpZGUgb2YgcHJlZml4KTonKQogICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5jb21wYWN0KHNlbGYuX3JlZnVzZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8ocGF0aCkKICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ3knOgogICAgICAgICAgICAgICAgc2VsZi5zYXZlX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSctdW5pbnN0YWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0ncGlwLScpCiAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgICAgICBuZXdfcGF0aCA9IHNlbGYuX3N0YXNoKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBmaWxlIG9yIGRpcmVjdG9yeSAlcycsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW92ZWRfcGF0aHMuYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcmVuYW1lcyhwYXRoLCBuZXdfcGF0aCkKICAgICAgICAgICAgICAgIGZvciBwdGggaW4gc2VsZi5wdGgudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgcHRoLnJlbW92ZSgpCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkICVzLSVzJywKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLCBzZWxmLmRpc3QudmVyc2lvbgogICAgICAgICAgICAgICAgKQoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICAiIiJSb2xsYmFjayB0aGUgY2hhbmdlcyBwcmV2aW91c2x5IG1hZGUgYnkgcmVtb3ZlKCkuIiIiCiAgICAgICAgaWYgc2VsZi5zYXZlX2RpciBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3Qgcm9sbCBiYWNrICVzOyB3YXMgbm90IHVuaW5zdGFsbGVkIiwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbG9nZ2VyLmluZm8oJ1JvbGxpbmcgYmFjayB1bmluc3RhbGwgb2YgJXMnLCBzZWxmLmRpc3QucHJvamVjdF9uYW1lKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYuX21vdmVkX3BhdGhzOgogICAgICAgICAgICB0bXBfcGF0aCA9IHNlbGYuX3N0YXNoKHBhdGgpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVwbGFjaW5nICVzJywgcGF0aCkKICAgICAgICAgICAgcmVuYW1lcyh0bXBfcGF0aCwgcGF0aCkKICAgICAgICBmb3IgcHRoIGluIHNlbGYucHRoLnZhbHVlcygpOgogICAgICAgICAgICBwdGgucm9sbGJhY2soKQoKICAgIGRlZiBjb21taXQoc2VsZik6CiAgICAgICAgIiIiUmVtb3ZlIHRlbXBvcmFyeSBzYXZlIGRpcjogcm9sbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgcG9zc2libGUuIiIiCiAgICAgICAgaWYgc2VsZi5zYXZlX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcm10cmVlKHNlbGYuc2F2ZV9kaXIpCiAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX21vdmVkX3BhdGhzID0gW10KCgpjbGFzcyBVbmluc3RhbGxQdGhFbnRyaWVzKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcHRoX2ZpbGUpOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShwdGhfZmlsZSk6CiAgICAgICAgICAgIHJhaXNlIFVuaW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHJlbW92ZSBlbnRyaWVzIGZyb20gbm9uZXhpc3RlbnQgZmlsZSAlcyIgJSBwdGhfZmlsZQogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlID0gcHRoX2ZpbGUKICAgICAgICBzZWxmLmVudHJpZXMgPSBzZXQoKQogICAgICAgIHNlbGYuX3NhdmVkX2xpbmVzID0gTm9uZQoKICAgIGRlZiBhZGQoc2VsZiwgZW50cnkpOgogICAgICAgIGVudHJ5ID0gb3MucGF0aC5ub3JtY2FzZShlbnRyeSkKICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLnBhdGgubm9ybWNhc2UgY29udmVydHMgdGhlIGVudHJ5IHRvIHVzZQogICAgICAgICMgYmFja3NsYXNoZXMuICBUaGlzIGlzIGNvcnJlY3QgZm9yIGVudHJpZXMgdGhhdCBkZXNjcmliZSBhYnNvbHV0ZQogICAgICAgICMgcGF0aHMgb3V0c2lkZSBvZiBzaXRlLXBhY2thZ2VzLCBidXQgYWxsIHRoZSBvdGhlcnMgdXNlIGZvcndhcmQKICAgICAgICAjIHNsYXNoZXMuCiAgICAgICAgaWYgV0lORE9XUyBhbmQgbm90IG9zLnBhdGguc3BsaXRkcml2ZShlbnRyeSlbMF06CiAgICAgICAgICAgIGVudHJ5ID0gZW50cnkucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgc2VsZi5lbnRyaWVzLmFkZChlbnRyeSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYpOgogICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgcHRoIGVudHJpZXMgZnJvbSAlczonLCBzZWxmLmZpbGUpCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZSwgJ3JiJykgYXMgZmg6CiAgICAgICAgICAgICMgd2luZG93cyB1c2VzICdcclxuJyB3aXRoIHB5M2ssIGJ1dCB1c2VzICdcbicgd2l0aCBweTIueAogICAgICAgICAgICBsaW5lcyA9IGZoLnJlYWRsaW5lcygpCiAgICAgICAgICAgIHNlbGYuX3NhdmVkX2xpbmVzID0gbGluZXMKICAgICAgICBpZiBhbnkoYidcclxuJyBpbiBsaW5lIGZvciBsaW5lIGluIGxpbmVzKToKICAgICAgICAgICAgZW5kbGluZSA9ICdcclxuJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVuZGxpbmUgPSAnXG4nCiAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBlbnRyeTogJXMnLCBlbnRyeSkKICAgICAgICAgICAgICAgIGxpbmVzLnJlbW92ZSgoZW50cnkgKyBlbmRsaW5lKS5lbmNvZGUoInV0Zi04IikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICd3YicpIGFzIGZoOgogICAgICAgICAgICBmaC53cml0ZWxpbmVzKGxpbmVzKQoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICBpZiBzZWxmLl9zYXZlZF9saW5lcyBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAnQ2Fubm90IHJvbGwgYmFjayBjaGFuZ2VzIHRvICVzLCBub25lIHdlcmUgbWFkZScsIHNlbGYuZmlsZQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGxvZ2dlci5kZWJ1ZygnUm9sbGluZyAlcyBiYWNrIHRvIHByZXZpb3VzIHN0YXRlJywgc2VsZi5maWxlKQogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICd3YicpIGFzIGZoOgogICAgICAgICAgICBmaC53cml0ZWxpbmVzKHNlbGYuX3NhdmVkX2xpbmVzKQogICAgICAgIHJldHVybiBUcnVlClBLAwQUAAAAAAAAACEA26x39pwAAACcAAAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvc3RhdHVzX2NvZGVzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKClNVQ0NFU1MgPSAwCkVSUk9SID0gMQpVTktOT1dOX0VSUk9SID0gMgpWSVJUVUFMRU5WX05PVF9GT1VORCA9IDMKUFJFVklPVVNfQlVJTERfRElSX0VSUk9SID0gNApOT19NQVRDSEVTX0ZPVU5EID0gMjMKUEsDBBQAAAAAAAAAIQDgWrS+M2oAADNqAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgZXJybm8KaW1wb3J0IGlvCmltcG9ydCBsb2NhbGUKIyB3ZSBoYXZlIGEgc3VibW9kdWxlIG5hbWVkICdsb2dnaW5nJyB3aGljaCB3b3VsZCBzaGFkb3cgdGhpcyBpZiB3ZSB1c2VkIHRoZQojIHJlZ3VsYXIgbmFtZToKaW1wb3J0IGxvZ2dpbmcgYXMgc3RkX2xvZ2dpbmcKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN0YXQKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGFyZmlsZQppbXBvcnQgemlwZmlsZQoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBjb25zb2xlX3RvX3N0ciwgZXhwYW5kdXNlciwgc3RkbGliX3BrZ3MKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCAoCiAgICBzaXRlX3BhY2thZ2VzLCB1c2VyX3NpdGUsIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudiwgdmlydHVhbGVudl9ub19nbG9iYWwsCiAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUsCikKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgaW5wdXQKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IFBZMgpmcm9tIHBpcC5fdmVuZG9yLnJldHJ5aW5nIGltcG9ydCByZXRyeQoKaWYgUFkyOgogICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBTdHJpbmdJTwplbHNlOgogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KCl9fYWxsX18gPSBbJ3JtdHJlZScsICdkaXNwbGF5X3BhdGgnLCAnYmFja3VwX2RpcicsCiAgICAgICAgICAgJ2FzaycsICdzcGxpdGV4dCcsCiAgICAgICAgICAgJ2Zvcm1hdF9zaXplJywgJ2lzX2luc3RhbGxhYmxlX2RpcicsCiAgICAgICAgICAgJ2lzX3N2bl9wYWdlJywgJ2ZpbGVfY29udGVudHMnLAogICAgICAgICAgICdzcGxpdF9sZWFkaW5nX2RpcicsICdoYXNfbGVhZGluZ19kaXInLAogICAgICAgICAgICdub3JtYWxpemVfcGF0aCcsCiAgICAgICAgICAgJ3JlbmFtZXMnLCAnZ2V0X3Rlcm1pbmFsX3NpemUnLCAnZ2V0X3Byb2cnLAogICAgICAgICAgICd1bnppcF9maWxlJywgJ3VudGFyX2ZpbGUnLCAndW5wYWNrX2ZpbGUnLCAnY2FsbF9zdWJwcm9jZXNzJywKICAgICAgICAgICAnY2FwdHVyZWRfc3Rkb3V0JywgJ2Vuc3VyZV9kaXInLAogICAgICAgICAgICdBUkNISVZFX0VYVEVOU0lPTlMnLCAnU1VQUE9SVEVEX0VYVEVOU0lPTlMnLAogICAgICAgICAgICdnZXRfaW5zdGFsbGVkX3ZlcnNpb24nXQoKCmxvZ2dlciA9IHN0ZF9sb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkJaMl9FWFRFTlNJT05TID0gKCcudGFyLmJ6MicsICcudGJ6JykKWFpfRVhURU5TSU9OUyA9ICgnLnRhci54eicsICcudHh6JywgJy50bHonLCAnLnRhci5seicsICcudGFyLmx6bWEnKQpaSVBfRVhURU5TSU9OUyA9ICgnLnppcCcsICcud2hsJykKVEFSX0VYVEVOU0lPTlMgPSAoJy50YXIuZ3onLCAnLnRneicsICcudGFyJykKQVJDSElWRV9FWFRFTlNJT05TID0gKAogICAgWklQX0VYVEVOU0lPTlMgKyBCWjJfRVhURU5TSU9OUyArIFRBUl9FWFRFTlNJT05TICsgWFpfRVhURU5TSU9OUykKU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBaSVBfRVhURU5TSU9OUyArIFRBUl9FWFRFTlNJT05TCnRyeToKICAgIGltcG9ydCBiejIgICMgbm9xYQogICAgU1VQUE9SVEVEX0VYVEVOU0lPTlMgKz0gQloyX0VYVEVOU0lPTlMKZXhjZXB0IEltcG9ydEVycm9yOgogICAgbG9nZ2VyLmRlYnVnKCdiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUnKQoKdHJ5OgogICAgIyBPbmx5IGZvciBQeXRob24gMy4zKwogICAgaW1wb3J0IGx6bWEgICMgbm9xYQogICAgU1VQUE9SVEVEX0VYVEVOU0lPTlMgKz0gWFpfRVhURU5TSU9OUwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBsb2dnZXIuZGVidWcoJ2x6bWEgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUnKQoKCmRlZiBpbXBvcnRfb3JfcmFpc2UocGtnX29yX21vZHVsZV9zdHJpbmcsIEV4Y2VwdGlvblR5cGUsICphcmdzLCAqKmt3YXJncyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9faW1wb3J0X18ocGtnX29yX21vZHVsZV9zdHJpbmcpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uVHlwZSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGVuc3VyZV9kaXIocGF0aCk6CiAgICAiIiJvcy5wYXRoLm1ha2VkaXJzIHdpdGhvdXQgRUVYSVNULiIiIgogICAgdHJ5OgogICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICByYWlzZQoKCmRlZiBnZXRfcHJvZygpOgogICAgdHJ5OgogICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pIGluICgnX19tYWluX18ucHknLCAnLWMnKToKICAgICAgICAgICAgcmV0dXJuICIlcyAtbSBwaXAiICUgc3lzLmV4ZWN1dGFibGUKICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgcGFzcwogICAgcmV0dXJuICdwaXAnCgoKIyBSZXRyeSBldmVyeSBoYWxmIHNlY29uZCBmb3IgdXAgdG8gMyBzZWNvbmRzCkByZXRyeShzdG9wX21heF9kZWxheT0zMDAwLCB3YWl0X2ZpeGVkPTUwMCkKZGVmIHJtdHJlZShkaXIsIGlnbm9yZV9lcnJvcnM9RmFsc2UpOgogICAgc2h1dGlsLnJtdHJlZShkaXIsIGlnbm9yZV9lcnJvcnM9aWdub3JlX2Vycm9ycywKICAgICAgICAgICAgICAgICAgb25lcnJvcj1ybXRyZWVfZXJyb3JoYW5kbGVyKQoKCmRlZiBybXRyZWVfZXJyb3JoYW5kbGVyKGZ1bmMsIHBhdGgsIGV4Y19pbmZvKToKICAgICIiIk9uIFdpbmRvd3MsIHRoZSBmaWxlcyBpbiAuc3ZuIGFyZSByZWFkLW9ubHksIHNvIHdoZW4gcm10cmVlKCkgdHJpZXMgdG8KICAgIHJlbW92ZSB0aGVtLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgV2UgY2F0Y2ggdGhhdCBoZXJlLCByZW1vdmUgdGhlCiAgICByZWFkLW9ubHkgYXR0cmlidXRlLCBhbmQgaG9wZWZ1bGx5IGNvbnRpbnVlIHdpdGhvdXQgcHJvYmxlbXMuIiIiCiAgICAjIGlmIGZpbGUgdHlwZSBjdXJyZW50bHkgcmVhZCBvbmx5CiAgICBpZiBvcy5zdGF0KHBhdGgpLnN0X21vZGUgJiBzdGF0LlNfSVJFQUQ6CiAgICAgICAgIyBjb252ZXJ0IHRvIHJlYWQvd3JpdGUKICAgICAgICBvcy5jaG1vZChwYXRoLCBzdGF0LlNfSVdSSVRFKQogICAgICAgICMgdXNlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0byByZXBlYXQgdGhlIG9wZXJhdGlvbgogICAgICAgIGZ1bmMocGF0aCkKICAgICAgICByZXR1cm4KICAgIGVsc2U6CiAgICAgICAgcmFpc2UKCgpkZWYgZGlzcGxheV9wYXRoKHBhdGgpOgogICAgIiIiR2l2ZXMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGEgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlbGF0aXZlIHRvIGN3ZAogICAgaWYgcG9zc2libGUuIiIiCiAgICBwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgocGF0aCkpCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CiAgICAgICAgcGF0aCA9IHBhdGguZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSwgJ3JlcGxhY2UnKQogICAgICAgIHBhdGggPSBwYXRoLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICdyZXBsYWNlJykKICAgIGlmIHBhdGguc3RhcnRzd2l0aChvcy5nZXRjd2QoKSArIG9zLnBhdGguc2VwKToKICAgICAgICBwYXRoID0gJy4nICsgcGF0aFtsZW4ob3MuZ2V0Y3dkKCkpOl0KICAgIHJldHVybiBwYXRoCgoKZGVmIGJhY2t1cF9kaXIoZGlyLCBleHQ9Jy5iYWsnKToKICAgICIiIkZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8gYmFjayB1cCB0aGUgZ2l2ZW4gZGlyIHRvCiAgICAoYWRkaW5nIC5iYWssIC5iYWsyLCBldGMpIiIiCiAgICBuID0gMQogICAgZXh0ZW5zaW9uID0gZXh0CiAgICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhkaXIgKyBleHRlbnNpb24pOgogICAgICAgIG4gKz0gMQogICAgICAgIGV4dGVuc2lvbiA9IGV4dCArIHN0cihuKQogICAgcmV0dXJuIGRpciArIGV4dGVuc2lvbgoKCmRlZiBhc2tfcGF0aF9leGlzdHMobWVzc2FnZSwgb3B0aW9ucyk6CiAgICBmb3IgYWN0aW9uIGluIG9zLmVudmlyb24uZ2V0KCdQSVBfRVhJU1RTX0FDVElPTicsICcnKS5zcGxpdCgpOgogICAgICAgIGlmIGFjdGlvbiBpbiBvcHRpb25zOgogICAgICAgICAgICByZXR1cm4gYWN0aW9uCiAgICByZXR1cm4gYXNrKG1lc3NhZ2UsIG9wdGlvbnMpCgoKZGVmIGFzayhtZXNzYWdlLCBvcHRpb25zKToKICAgICIiIkFzayB0aGUgbWVzc2FnZSBpbnRlcmFjdGl2ZWx5LCB3aXRoIHRoZSBnaXZlbiBwb3NzaWJsZSByZXNwb25zZXMiIiIKICAgIHdoaWxlIDE6CiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1BJUF9OT19JTlBVVCcpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAnTm8gaW5wdXQgd2FzIGV4cGVjdGVkICgkUElQX05PX0lOUFVUIHNldCk7IHF1ZXN0aW9uOiAlcycgJQogICAgICAgICAgICAgICAgbWVzc2FnZQogICAgICAgICAgICApCiAgICAgICAgcmVzcG9uc2UgPSBpbnB1dChtZXNzYWdlKQogICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2Uuc3RyaXAoKS5sb3dlcigpCiAgICAgICAgaWYgcmVzcG9uc2Ugbm90IGluIG9wdGlvbnM6CiAgICAgICAgICAgIHByaW50KAogICAgICAgICAgICAgICAgJ1lvdXIgcmVzcG9uc2UgKCVyKSB3YXMgbm90IG9uZSBvZiB0aGUgZXhwZWN0ZWQgcmVzcG9uc2VzOiAnCiAgICAgICAgICAgICAgICAnJXMnICUgKHJlc3BvbnNlLCAnLCAnLmpvaW4ob3B0aW9ucykpCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCgpkZWYgZm9ybWF0X3NpemUoYnl0ZXMpOgogICAgaWYgYnl0ZXMgPiAxMDAwICogMTAwMDoKICAgICAgICByZXR1cm4gJyUuMWZNQicgJSAoYnl0ZXMgLyAxMDAwLjAgLyAxMDAwKQogICAgZWxpZiBieXRlcyA+IDEwICogMTAwMDoKICAgICAgICByZXR1cm4gJyVpa0InICUgKGJ5dGVzIC8gMTAwMCkKICAgIGVsaWYgYnl0ZXMgPiAxMDAwOgogICAgICAgIHJldHVybiAnJS4xZmtCJyAlIChieXRlcyAvIDEwMDAuMCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICclaWJ5dGVzJyAlIGJ5dGVzCgoKZGVmIGlzX2luc3RhbGxhYmxlX2RpcihwYXRoKToKICAgICIiIlJldHVybiBUcnVlIGlmIGBwYXRoYCBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgc2V0dXAucHkgZmlsZS4iIiIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2V0dXBfcHkgPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3NldHVwLnB5JykKICAgIGlmIG9zLnBhdGguaXNmaWxlKHNldHVwX3B5KToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGlzX3N2bl9wYWdlKGh0bWwpOgogICAgIiIiCiAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhZ2UgYXBwZWFycyB0byBiZSB0aGUgaW5kZXggcGFnZSBvZiBhbiBzdm4gcmVwb3NpdG9yeQogICAgIiIiCiAgICByZXR1cm4gKHJlLnNlYXJjaChyJzx0aXRsZT5bXjxdKlJldmlzaW9uIFxkKzonLCBodG1sKSBhbmQKICAgICAgICAgICAgcmUuc2VhcmNoKHInUG93ZXJlZCBieSAoPzo8YVtePl0qPz4pP1N1YnZlcnNpb24nLCBodG1sLCByZS5JKSkKCgpkZWYgZmlsZV9jb250ZW50cyhmaWxlbmFtZSk6CiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGZwOgogICAgICAgIHJldHVybiBmcC5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCgoKZGVmIHJlYWRfY2h1bmtzKGZpbGUsIHNpemU9aW8uREVGQVVMVF9CVUZGRVJfU0laRSk6CiAgICAiIiJZaWVsZCBwaWVjZXMgb2YgZGF0YSBmcm9tIGEgZmlsZS1saWtlIG9iamVjdCB1bnRpbCBFT0YuIiIiCiAgICB3aGlsZSBUcnVlOgogICAgICAgIGNodW5rID0gZmlsZS5yZWFkKHNpemUpCiAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICBicmVhawogICAgICAgIHlpZWxkIGNodW5rCgoKZGVmIHNwbGl0X2xlYWRpbmdfZGlyKHBhdGgpOgogICAgcGF0aCA9IHBhdGgubHN0cmlwKCcvJykubHN0cmlwKCdcXCcpCiAgICBpZiAnLycgaW4gcGF0aCBhbmQgKCgnXFwnIGluIHBhdGggYW5kIHBhdGguZmluZCgnLycpIDwgcGF0aC5maW5kKCdcXCcpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAnXFwnIG5vdCBpbiBwYXRoKToKICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnLycsIDEpCiAgICBlbGlmICdcXCcgaW4gcGF0aDoKICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnXFwnLCAxKQogICAgZWxzZToKICAgICAgICByZXR1cm4gcGF0aCwgJycKCgpkZWYgaGFzX2xlYWRpbmdfZGlyKHBhdGhzKToKICAgICIiIlJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHBhdGhzIGhhdmUgdGhlIHNhbWUgbGVhZGluZyBwYXRoIG5hbWUKICAgIChpLmUuLCBldmVyeXRoaW5nIGlzIGluIG9uZSBzdWJkaXJlY3RvcnkgaW4gYW4gYXJjaGl2ZSkiIiIKICAgIGNvbW1vbl9wcmVmaXggPSBOb25lCiAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICBwcmVmaXgsIHJlc3QgPSBzcGxpdF9sZWFkaW5nX2RpcihwYXRoKQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgY29tbW9uX3ByZWZpeCBpcyBOb25lOgogICAgICAgICAgICBjb21tb25fcHJlZml4ID0gcHJlZml4CiAgICAgICAgZWxpZiBwcmVmaXggIT0gY29tbW9uX3ByZWZpeDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBub3JtYWxpemVfcGF0aChwYXRoLCByZXNvbHZlX3N5bWxpbmtzPVRydWUpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgcGF0aCB0byBpdHMgY2Fub25pY2FsLCBjYXNlLW5vcm1hbGl6ZWQsIGFic29sdXRlIHZlcnNpb24uCgogICAgIiIiCiAgICBwYXRoID0gZXhwYW5kdXNlcihwYXRoKQogICAgaWYgcmVzb2x2ZV9zeW1saW5rczoKICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShwYXRoKQoKCmRlZiBzcGxpdGV4dChwYXRoKToKICAgICIiIkxpa2Ugb3MucGF0aC5zcGxpdGV4dCwgYnV0IHRha2Ugb2ZmIC50YXIgdG9vIiIiCiAgICBiYXNlLCBleHQgPSBwb3NpeHBhdGguc3BsaXRleHQocGF0aCkKICAgIGlmIGJhc2UubG93ZXIoKS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgIGV4dCA9IGJhc2VbLTQ6XSArIGV4dAogICAgICAgIGJhc2UgPSBiYXNlWzotNF0KICAgIHJldHVybiBiYXNlLCBleHQKCgpkZWYgcmVuYW1lcyhvbGQsIG5ldyk6CiAgICAiIiJMaWtlIG9zLnJlbmFtZXMoKSwgYnV0IGhhbmRsZXMgcmVuYW1pbmcgYWNyb3NzIGRldmljZXMuIiIiCiAgICAjIEltcGxlbWVudGF0aW9uIGJvcnJvd2VkIGZyb20gb3MucmVuYW1lcygpLgogICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQobmV3KQogICAgaWYgaGVhZCBhbmQgdGFpbCBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGhlYWQpOgogICAgICAgIG9zLm1ha2VkaXJzKGhlYWQpCgogICAgc2h1dGlsLm1vdmUob2xkLCBuZXcpCgogICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQob2xkKQogICAgaWYgaGVhZCBhbmQgdGFpbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMoaGVhZCkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBpc19sb2NhbChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgcGF0aCBpcyB3aXRoaW4gc3lzLnByZWZpeCwgaWYgd2UncmUgcnVubmluZyBpbiBhIHZpcnR1YWxlbnYuCgogICAgSWYgd2UncmUgbm90IGluIGEgdmlydHVhbGVudiwgYWxsIHBhdGhzIGFyZSBjb25zaWRlcmVkICJsb2NhbC4iCgogICAgIiIiCiAgICBpZiBub3QgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBub3JtYWxpemVfcGF0aChwYXRoKS5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHN5cy5wcmVmaXgpKQoKCmRlZiBkaXN0X2lzX2xvY2FsKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBnaXZlbiBEaXN0cmlidXRpb24gb2JqZWN0IGlzIGluc3RhbGxlZCBsb2NhbGx5CiAgICAoaS5lLiB3aXRoaW4gY3VycmVudCB2aXJ0dWFsZW52KS4KCiAgICBBbHdheXMgVHJ1ZSBpZiB3ZSdyZSBub3QgaW4gYSB2aXJ0dWFsZW52LgoKICAgICIiIgogICAgcmV0dXJuIGlzX2xvY2FsKGRpc3RfbG9jYXRpb24oZGlzdCkpCgoKZGVmIGRpc3RfaW5fdXNlcnNpdGUoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGdpdmVuIERpc3RyaWJ1dGlvbiBpcyBpbnN0YWxsZWQgaW4gdXNlciBzaXRlLgogICAgIiIiCiAgICBub3JtX3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0X2xvY2F0aW9uKGRpc3QpKQogICAgcmV0dXJuIG5vcm1fcGF0aC5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHVzZXJfc2l0ZSkpCgoKZGVmIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcyhkaXN0KToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgZ2l2ZW4gRGlzdHJpYnV0aW9uIGlzIGluc3RhbGxlZCBpbgogICAgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpLgogICAgIiIiCiAgICByZXR1cm4gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgZGlzdF9sb2NhdGlvbihkaXN0KQogICAgKS5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHNpdGVfcGFja2FnZXMpKQoKCmRlZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpOgogICAgIiIiSXMgZGlzdHJpYnV0aW9uIGFuIGVkaXRhYmxlIGluc3RhbGw/IiIiCiAgICBmb3IgcGF0aF9pdGVtIGluIHN5cy5wYXRoOgogICAgICAgIGVnZ19saW5rID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZGlzdC5wcm9qZWN0X25hbWUgKyAnLmVnZy1saW5rJykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dfbGluayk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPXN0ZGxpYl9wa2dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZWRpdGFibGVzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVzX29ubHk9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9vbmx5PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGEgbGlzdCBvZiBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIG9iamVjdHMuCgogICAgSWYgYGBsb2NhbF9vbmx5YGAgaXMgVHJ1ZSAoZGVmYXVsdCksIG9ubHkgcmV0dXJuIGluc3RhbGxhdGlvbnMKICAgIGxvY2FsIHRvIHRoZSBjdXJyZW50IHZpcnR1YWxlbnYsIGlmIGluIGEgdmlydHVhbGVudi4KCiAgICBgYHNraXBgYCBhcmd1bWVudCBpcyBhbiBpdGVyYWJsZSBvZiBsb3dlci1jYXNlIHByb2plY3QgbmFtZXMgdG8KICAgIGlnbm9yZTsgZGVmYXVsdHMgdG8gc3RkbGliX3BrZ3MKCiAgICBJZiBgYGVkaXRhYmxlc2BgIGlzIEZhbHNlLCBkb24ndCByZXBvcnQgZWRpdGFibGVzLgoKICAgIElmIGBgZWRpdGFibGVzX29ubHlgYCBpcyBUcnVlICwgb25seSByZXBvcnQgZWRpdGFibGVzLgoKICAgIElmIGBgdXNlcl9vbmx5YGAgaXMgVHJ1ZSAsIG9ubHkgcmVwb3J0IGluc3RhbGxhdGlvbnMgaW4gdGhlIHVzZXIKICAgIHNpdGUgZGlyZWN0b3J5LgoKICAgICIiIgogICAgaWYgbG9jYWxfb25seToKICAgICAgICBsb2NhbF90ZXN0ID0gZGlzdF9pc19sb2NhbAogICAgZWxzZToKICAgICAgICBkZWYgbG9jYWxfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiBpbmNsdWRlX2VkaXRhYmxlczoKICAgICAgICBkZWYgZWRpdGFibGVfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIGVsc2U6CiAgICAgICAgZGVmIGVkaXRhYmxlX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBub3QgZGlzdF9pc19lZGl0YWJsZShkKQoKICAgIGlmIGVkaXRhYmxlc19vbmx5OgogICAgICAgIGRlZiBlZGl0YWJsZXNfb25seV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gZGlzdF9pc19lZGl0YWJsZShkKQogICAgZWxzZToKICAgICAgICBkZWYgZWRpdGFibGVzX29ubHlfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiB1c2VyX29ubHk6CiAgICAgICAgdXNlcl90ZXN0ID0gZGlzdF9pbl91c2Vyc2l0ZQogICAgZWxzZToKICAgICAgICBkZWYgdXNlcl90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBbZCBmb3IgZCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0CiAgICAgICAgICAgIGlmIGxvY2FsX3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIGQua2V5IG5vdCBpbiBza2lwIGFuZAogICAgICAgICAgICBlZGl0YWJsZV90ZXN0KGQpIGFuZAogICAgICAgICAgICBlZGl0YWJsZXNfb25seV90ZXN0KGQpIGFuZAogICAgICAgICAgICB1c2VyX3Rlc3QoZCkKICAgICAgICAgICAgXQoKCmRlZiBlZ2dfbGlua19wYXRoKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHBhdGggZm9yIHRoZSAuZWdnLWxpbmsgZmlsZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSwgTm9uZS4KCiAgICBUaGVyZSdzIDMgc2NlbmFyaW9zOgogICAgMSkgbm90IGluIGEgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZS5VU0VSX1NJVEUsIHRoZW4gc2l0ZV9wYWNrYWdlcwogICAgMikgaW4gYSBuby1nbG9iYWwgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZV9wYWNrYWdlcwogICAgMykgaW4gYSB5ZXMtZ2xvYmFsIHZpcnR1YWxlbnYKICAgICAgIHRyeSB0byBmaW5kIGluIHNpdGVfcGFja2FnZXMsIHRoZW4gc2l0ZS5VU0VSX1NJVEUKICAgICAgIChkb24ndCBsb29rIGluIGdsb2JhbCBsb2NhdGlvbikKCiAgICBGb3IgIzEgYW5kICMzLCB0aGVyZSBjb3VsZCBiZSBvZGQgY2FzZXMsIHdoZXJlIHRoZXJlJ3MgYW4gZWdnLWxpbmsgaW4gMgogICAgbG9jYXRpb25zLgoKICAgIFRoaXMgbWV0aG9kIHdpbGwganVzdCByZXR1cm4gdGhlIGZpcnN0IG9uZSBmb3VuZC4KICAgICIiIgogICAgc2l0ZXMgPSBbXQogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgaWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVfcGFja2FnZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVfcGFja2FnZXMpCiAgICAgICAgICAgIGlmIHVzZXJfc2l0ZToKICAgICAgICAgICAgICAgIHNpdGVzLmFwcGVuZCh1c2VyX3NpdGUpCiAgICBlbHNlOgogICAgICAgIGlmIHVzZXJfc2l0ZToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHVzZXJfc2l0ZSkKICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKCiAgICBmb3Igc2l0ZSBpbiBzaXRlczoKICAgICAgICBlZ2dsaW5rID0gb3MucGF0aC5qb2luKHNpdGUsIGRpc3QucHJvamVjdF9uYW1lKSArICcuZWdnLWxpbmsnCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnbGluayk6CiAgICAgICAgICAgIHJldHVybiBlZ2dsaW5rCgoKZGVmIGRpc3RfbG9jYXRpb24oZGlzdCk6CiAgICAiIiIKICAgIEdldCB0aGUgc2l0ZS1wYWNrYWdlcyBsb2NhdGlvbiBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gR2VuZXJhbGx5CiAgICB0aGlzIGlzIGRpc3QubG9jYXRpb24sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBkZXZlbG9wLWluc3RhbGxlZAogICAgcGFja2FnZXMsIHdoZXJlIGRpc3QubG9jYXRpb24gaXMgdGhlIHNvdXJjZSBjb2RlIGxvY2F0aW9uLCBhbmQgd2UKICAgIHdhbnQgdG8ga25vdyB3aGVyZSB0aGUgZWdnLWxpbmsgZmlsZSBpcy4KCiAgICAiIiIKICAgIGVnZ19saW5rID0gZWdnX2xpbmtfcGF0aChkaXN0KQogICAgaWYgZWdnX2xpbms6CiAgICAgICAgcmV0dXJuIGVnZ19saW5rCiAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgoKCmRlZiBnZXRfdGVybWluYWxfc2l6ZSgpOgogICAgIiIiUmV0dXJucyBhIHR1cGxlICh4LCB5KSByZXByZXNlbnRpbmcgdGhlIHdpZHRoKHgpIGFuZCB0aGUgaGVpZ2h0KHgpCiAgICBpbiBjaGFyYWN0ZXJzIG9mIHRoZSB0ZXJtaW5hbCB3aW5kb3cuIiIiCiAgICBkZWYgaW9jdGxfR1dJTlNaKGZkKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBmY250bAogICAgICAgICAgICBpbXBvcnQgdGVybWlvcwogICAgICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgICAgIGNyID0gc3RydWN0LnVucGFjaygKICAgICAgICAgICAgICAgICdoaCcsCiAgICAgICAgICAgICAgICBmY250bC5pb2N0bChmZCwgdGVybWlvcy5USU9DR1dJTlNaLCAnMTIzNCcpCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgY3IgPT0gKDAsIDApOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBjcgogICAgY3IgPSBpb2N0bF9HV0lOU1ooMCkgb3IgaW9jdGxfR1dJTlNaKDEpIG9yIGlvY3RsX0dXSU5TWigyKQogICAgaWYgbm90IGNyOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBvcy5vcGVuKG9zLmN0ZXJtaWQoKSwgb3MuT19SRE9OTFkpCiAgICAgICAgICAgIGNyID0gaW9jdGxfR1dJTlNaKGZkKQogICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHBhc3MKICAgIGlmIG5vdCBjcjoKICAgICAgICBjciA9IChvcy5lbnZpcm9uLmdldCgnTElORVMnLCAyNSksIG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJywgODApKQogICAgcmV0dXJuIGludChjclsxXSksIGludChjclswXSkKCgpkZWYgY3VycmVudF91bWFzaygpOgogICAgIiIiR2V0IHRoZSBjdXJyZW50IHVtYXNrIHdoaWNoIGludm9sdmVzIGhhdmluZyB0byBzZXQgaXQgdGVtcG9yYXJpbHkuIiIiCiAgICBtYXNrID0gb3MudW1hc2soMCkKICAgIG9zLnVtYXNrKG1hc2spCiAgICByZXR1cm4gbWFzawoKCmRlZiB1bnppcF9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbiwgZmxhdHRlbj1UcnVlKToKICAgICIiIgogICAgVW56aXAgdGhlIGZpbGUgKHdpdGggcGF0aCBgZmlsZW5hbWVgKSB0byB0aGUgZGVzdGluYXRpb24gYGxvY2F0aW9uYC4gIEFsbAogICAgZmlsZXMgYXJlIHdyaXR0ZW4gYmFzZWQgb24gc3lzdGVtIGRlZmF1bHRzIGFuZCB1bWFzayAoaS5lLiBwZXJtaXNzaW9ucyBhcmUKICAgIG5vdCBwcmVzZXJ2ZWQpLCBleGNlcHQgdGhhdCByZWd1bGFyIGZpbGUgbWVtYmVycyB3aXRoIGFueSBleGVjdXRlCiAgICBwZXJtaXNzaW9ucyAodXNlciwgZ3JvdXAsIG9yIHdvcmxkKSBoYXZlICJjaG1vZCAreCIgYXBwbGllZCBhZnRlciBiZWluZwogICAgd3JpdHRlbi4gTm90ZSB0aGF0IGZvciB3aW5kb3dzLCBhbnkgZXhlY3V0ZSBjaGFuZ2VzIHVzaW5nIG9zLmNobW9kIGFyZQogICAgbm8tb3BzIHBlciB0aGUgcHl0aG9uIGRvY3MuCiAgICAiIiIKICAgIGVuc3VyZV9kaXIobG9jYXRpb24pCiAgICB6aXBmcCA9IG9wZW4oZmlsZW5hbWUsICdyYicpCiAgICB0cnk6CiAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcGZwLCBhbGxvd1ppcDY0PVRydWUpCiAgICAgICAgbGVhZGluZyA9IGhhc19sZWFkaW5nX2Rpcih6aXAubmFtZWxpc3QoKSkgYW5kIGZsYXR0ZW4KICAgICAgICBmb3IgaW5mbyBpbiB6aXAuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgZGF0YSA9IHppcC5yZWFkKG5hbWUpCiAgICAgICAgICAgIGZuID0gbmFtZQogICAgICAgICAgICBpZiBsZWFkaW5nOgogICAgICAgICAgICAgICAgZm4gPSBzcGxpdF9sZWFkaW5nX2RpcihuYW1lKVsxXQogICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZm4pCiAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShmbikKICAgICAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy8nKSBvciBmbi5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgICAgICMgQSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZm4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGRpcikKICAgICAgICAgICAgICAgIGZwID0gb3BlbihmbiwgJ3diJykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICAgICAgICAgICMgaWYgbW9kZSBhbmQgcmVndWxhciBmaWxlIGFuZCBhbnkgZXhlY3V0ZSBwZXJtaXNzaW9ucyBmb3IKICAgICAgICAgICAgICAgICAgICAjIHVzZXIvZ3JvdXAvd29ybGQ/CiAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSBhbmQgc3RhdC5TX0lTUkVHKG1vZGUpIGFuZCBtb2RlICYgMG8xMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFrZSBkZXN0IGZpbGUgaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAgICAgICAgICAgICAgICAgICAgICMgKGNobW9kICt4KSBuby1vcCBvbiB3aW5kb3dzIHBlciBweXRob24gZG9jcwogICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmbiwgKDBvNzc3IC0gY3VycmVudF91bWFzaygpIHwgMG8xMTEpKQogICAgZmluYWxseToKICAgICAgICB6aXBmcC5jbG9zZSgpCgoKZGVmIHVudGFyX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uKToKICAgICIiIgogICAgVW50YXIgdGhlIGZpbGUgKHdpdGggcGF0aCBgZmlsZW5hbWVgKSB0byB0aGUgZGVzdGluYXRpb24gYGxvY2F0aW9uYC4KICAgIEFsbCBmaWxlcyBhcmUgd3JpdHRlbiBiYXNlZCBvbiBzeXN0ZW0gZGVmYXVsdHMgYW5kIHVtYXNrIChpLmUuIHBlcm1pc3Npb25zCiAgICBhcmUgbm90IHByZXNlcnZlZCksIGV4Y2VwdCB0aGF0IHJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggYW55IGV4ZWN1dGUKICAgIHBlcm1pc3Npb25zICh1c2VyLCBncm91cCwgb3Igd29ybGQpIGhhdmUgImNobW9kICt4IiBhcHBsaWVkIGFmdGVyIGJlaW5nCiAgICB3cml0dGVuLiAgTm90ZSB0aGF0IGZvciB3aW5kb3dzLCBhbnkgZXhlY3V0ZSBjaGFuZ2VzIHVzaW5nIG9zLmNobW9kIGFyZQogICAgbm8tb3BzIHBlciB0aGUgcHl0aG9uIGRvY3MuCiAgICAiIiIKICAgIGVuc3VyZV9kaXIobG9jYXRpb24pCiAgICBpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZ3onKSBvciBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcudGd6Jyk6CiAgICAgICAgbW9kZSA9ICdyOmd6JwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKEJaMl9FWFRFTlNJT05TKToKICAgICAgICBtb2RlID0gJ3I6YnoyJwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKFhaX0VYVEVOU0lPTlMpOgogICAgICAgIG1vZGUgPSAncjp4eicKICAgIGVsaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgIG1vZGUgPSAncicKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIGNvbXByZXNzaW9uIHR5cGUgZm9yIGZpbGUgJXMnLCBmaWxlbmFtZSwKICAgICAgICApCiAgICAgICAgbW9kZSA9ICdyOionCiAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUsIG1vZGUpCiAgICB0cnk6CiAgICAgICAgIyBub3RlOiBweXRob248PTIuNSBkb2Vzbid0IHNlZW0gdG8ga25vdyBhYm91dCBwYXggaGVhZGVycywgZmlsdGVyIHRoZW0KICAgICAgICBsZWFkaW5nID0gaGFzX2xlYWRpbmdfZGlyKFsKICAgICAgICAgICAgbWVtYmVyLm5hbWUgZm9yIG1lbWJlciBpbiB0YXIuZ2V0bWVtYmVycygpCiAgICAgICAgICAgIGlmIG1lbWJlci5uYW1lICE9ICdwYXhfZ2xvYmFsX2hlYWRlcicKICAgICAgICBdKQogICAgICAgIGZvciBtZW1iZXIgaW4gdGFyLmdldG1lbWJlcnMoKToKICAgICAgICAgICAgZm4gPSBtZW1iZXIubmFtZQogICAgICAgICAgICBpZiBmbiA9PSAncGF4X2dsb2JhbF9oZWFkZXInOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGVhZGluZzoKICAgICAgICAgICAgICAgIGZuID0gc3BsaXRfbGVhZGluZ19kaXIoZm4pWzFdCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGZuKQogICAgICAgICAgICBpZiBtZW1iZXIuaXNkaXIoKToKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIocGF0aCkKICAgICAgICAgICAgZWxpZiBtZW1iZXIuaXNzeW0oKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0YXIuX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgcGF0aCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgICAgICMgU29tZSBjb3JydXB0IHRhciBmaWxlcyBzZWVtIHRvIHByb2R1Y2UgdGhpcwogICAgICAgICAgICAgICAgICAgICMgKHNwZWNpZmljYWxseSBiYWQgc3ltbGlua3MpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdJbiB0aGUgdGFyIGZpbGUgJXMgdGhlIG1lbWJlciAlcyBpcyBpbnZhbGlkOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtZW1iZXIubmFtZSwgZXhjLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZwID0gdGFyLmV4dHJhY3RmaWxlKG1lbWJlcikKICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIGNvcnJ1cHQgdGFyIGZpbGVzIHNlZW0gdG8gcHJvZHVjZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgIyAoc3BlY2lmaWNhbGx5IGJhZCBzeW1saW5rcykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YXIgZmlsZSAlcyB0aGUgbWVtYmVyICVzIGlzIGludmFsaWQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1lbWJlci5uYW1lLCBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAnd2InKSBhcyBkZXN0ZnA6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGZwLCBkZXN0ZnApCiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgdGltZXN0YW1wICh1c2VmdWwgZm9yIGN5dGhvbiBjb21waWxlZCBmaWxlcykKICAgICAgICAgICAgICAgIHRhci51dGltZShtZW1iZXIsIHBhdGgpCiAgICAgICAgICAgICAgICAjIG1lbWJlciBoYXZlIGFueSBleGVjdXRlIHBlcm1pc3Npb25zIGZvciB1c2VyL2dyb3VwL3dvcmxkPwogICAgICAgICAgICAgICAgaWYgbWVtYmVyLm1vZGUgJiAwbzExMToKICAgICAgICAgICAgICAgICAgICAjIG1ha2UgZGVzdCBmaWxlIGhhdmUgZXhlY3V0ZSBmb3IgdXNlci9ncm91cC93b3JsZAogICAgICAgICAgICAgICAgICAgICMgbm8tb3Agb24gd2luZG93cyBwZXIgcHl0aG9uIGRvY3MKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChwYXRoLCAoMG83NzcgLSBjdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCiAgICBmaW5hbGx5OgogICAgICAgIHRhci5jbG9zZSgpCgoKZGVmIHVucGFja19maWxlKGZpbGVuYW1lLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKToKICAgIGZpbGVuYW1lID0gb3MucGF0aC5yZWFscGF0aChmaWxlbmFtZSkKICAgIGlmIChjb250ZW50X3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3ppcCcgb3IKICAgICAgICAgICAgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aChaSVBfRVhURU5TSU9OUykgb3IKICAgICAgICAgICAgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKSk6CiAgICAgICAgdW56aXBfZmlsZSgKICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgIGxvY2F0aW9uLAogICAgICAgICAgICBmbGF0dGVuPW5vdCBmaWxlbmFtZS5lbmRzd2l0aCgnLndobCcpCiAgICAgICAgKQogICAgZWxpZiAoY29udGVudF90eXBlID09ICdhcHBsaWNhdGlvbi94LWd6aXAnIG9yCiAgICAgICAgICAgIHRhcmZpbGUuaXNfdGFyZmlsZShmaWxlbmFtZSkgb3IKICAgICAgICAgICAgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgKICAgICAgICAgICAgICAgIFRBUl9FWFRFTlNJT05TICsgQloyX0VYVEVOU0lPTlMgKyBYWl9FWFRFTlNJT05TKSk6CiAgICAgICAgdW50YXJfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24pCiAgICBlbGlmIChjb250ZW50X3R5cGUgYW5kIGNvbnRlbnRfdHlwZS5zdGFydHN3aXRoKCd0ZXh0L2h0bWwnKSBhbmQKICAgICAgICAgICAgaXNfc3ZuX3BhZ2UoZmlsZV9jb250ZW50cyhmaWxlbmFtZSkpKToKICAgICAgICAjIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoaXMKICAgICAgICBmcm9tIHBpcC52Y3Muc3VidmVyc2lvbiBpbXBvcnQgU3VidmVyc2lvbgogICAgICAgIFN1YnZlcnNpb24oJ3N2bisnICsgbGluay51cmwpLnVucGFjayhsb2NhdGlvbikKICAgIGVsc2U6CiAgICAgICAgIyBGSVhNRTogaGFuZGxlPwogICAgICAgICMgRklYTUU6IG1hZ2ljIHNpZ25hdHVyZXM/CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAnQ2Fubm90IHVucGFjayBmaWxlICVzIChkb3dubG9hZGVkIGZyb20gJXMsIGNvbnRlbnQtdHlwZTogJXMpOyAnCiAgICAgICAgICAgICdjYW5ub3QgZGV0ZWN0IGFyY2hpdmUgZm9ybWF0JywKICAgICAgICAgICAgZmlsZW5hbWUsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsCiAgICAgICAgKQogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSBhcmNoaXZlIGZvcm1hdCBvZiAlcycgJSBsb2NhdGlvbgogICAgICAgICkKCgpkZWYgY2FsbF9zdWJwcm9jZXNzKGNtZCwgc2hvd19zdGRvdXQ9VHJ1ZSwgY3dkPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZT0ncmFpc2UnLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYz1Ob25lLAogICAgICAgICAgICAgICAgICAgIGV4dHJhX2Vudmlyb249Tm9uZSwgc3Bpbm5lcj1Ob25lKToKICAgICMgVGhpcyBmdW5jdGlvbidzIGhhbmRsaW5nIG9mIHN1YnByb2Nlc3Mgb3V0cHV0IGlzIGNvbmZ1c2luZyBhbmQgSQogICAgIyBwcmV2aW91c2x5IGJyb2tlIGl0IHRlcnJpYmx5LCBzbyBhcyBwZW5hbmNlIEkgd2lsbCB3cml0ZSBhIGxvbmcgY29tbWVudAogICAgIyBleHBsYWluaW5nIHRoaW5ncy4KICAgICMKICAgICMgVGhlIG9idmlvdXMgdGhpbmcgdGhhdCBhZmZlY3RzIG91dHB1dCBpcyB0aGUgc2hvd19zdGRvdXQ9CiAgICAjIGt3YXJnLiBzaG93X3N0ZG91dD1UcnVlIG1lYW5zLCBsZXQgdGhlIHN1YnByb2Nlc3Mgd3JpdGUgZGlyZWN0bHkgdG8gb3VyCiAgICAjIHN0ZG91dC4gRXZlbiB0aG91Z2ggaXQgaXMgbm9taW5hbGx5IHRoZSBkZWZhdWx0LCBpdCBpcyBhbG1vc3QgbmV2ZXIgdXNlZAogICAgIyBpbnNpZGUgcGlwIChhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlIHdpdGhvdXQgYSB2ZXJ5IGdvb2QKICAgICMgcmVhc29uKTsgYXMgb2YgMjAxNi0wMi0yMiBpdCBpcyBvbmx5IHVzZWQgaW4gYSBmZXcgcGxhY2VzIGluc2lkZSB0aGUgVkNTCiAgICAjIHdyYXBwZXIgY29kZS4gSWRlYWxseSB3ZSBzaG91bGQgZ2V0IHJpZCBvZiBpdCBlbnRpcmVseSwgYmVjYXVzZSBpdAogICAgIyBjcmVhdGVzIGEgbG90IG9mIGNvbXBsZXhpdHkgaGVyZSBmb3IgYSByYXJlbHkgdXNlZCBmZWF0dXJlLgogICAgIwogICAgIyBNb3N0IHBsYWNlcyBpbiBwaXAgc2V0IHNob3dfc3Rkb3V0PUZhbHNlLiBXaGF0IHRoaXMgbWVhbnMgaXM6CiAgICAjIC0gV2UgY29ubmVjdCB0aGUgY2hpbGQgc3Rkb3V0IHRvIGEgcGlwZSwgd2hpY2ggd2UgcmVhZC4KICAgICMgLSBCeSBkZWZhdWx0LCB3ZSBoaWRlIHRoZSBvdXRwdXQgYnV0IHNob3cgYSBzcGlubmVyIC0tIHVubGVzcyB0aGUKICAgICMgICBzdWJwcm9jZXNzIGV4aXRzIHdpdGggYW4gZXJyb3IsIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdyB0aGUgb3V0cHV0LgogICAgIyAtIElmIHRoZSAtLXZlcmJvc2Ugb3B0aW9uIHdhcyBwYXNzZWQgKD0gbG9nbGV2ZWwgaXMgREVCVUcpLCB0aGVuIHdlIHNob3cKICAgICMgICB0aGUgb3V0cHV0IHVuY29uZGl0aW9uYWxseS4gKEJ1dCBpbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBzaG93CiAgICAjICAgdGhlIG91dHB1dCBhIHNlY29uZCB0aW1lIGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIHdhcyBhbiBlcnJvci4pCiAgICAjCiAgICAjIHN0ZGVyciBpcyBhbHdheXMgbWVyZ2VkIHdpdGggc3Rkb3V0IChldmVuIGlmIHNob3dfc3Rkb3V0PVRydWUpLgogICAgaWYgc2hvd19zdGRvdXQ6CiAgICAgICAgc3Rkb3V0ID0gTm9uZQogICAgZWxzZToKICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLlBJUEUKICAgIGlmIGNvbW1hbmRfZGVzYyBpcyBOb25lOgogICAgICAgIGNtZF9wYXJ0cyA9IFtdCiAgICAgICAgZm9yIHBhcnQgaW4gY21kOgogICAgICAgICAgICBpZiAnICcgaW4gcGFydCBvciAnXG4nIGluIHBhcnQgb3IgJyInIGluIHBhcnQgb3IgIiciIGluIHBhcnQ6CiAgICAgICAgICAgICAgICBwYXJ0ID0gJyIlcyInICUgcGFydC5yZXBsYWNlKCciJywgJ1xcIicpCiAgICAgICAgICAgIGNtZF9wYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICBjb21tYW5kX2Rlc2MgPSAnICcuam9pbihjbWRfcGFydHMpCiAgICBsb2dnZXIuZGVidWcoIlJ1bm5pbmcgY29tbWFuZCAlcyIsIGNvbW1hbmRfZGVzYykKICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICBpZiBleHRyYV9lbnZpcm9uOgogICAgICAgIGVudi51cGRhdGUoZXh0cmFfZW52aXJvbikKICAgIHRyeToKICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKICAgICAgICAgICAgY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHN0ZGluPU5vbmUsIHN0ZG91dD1zdGRvdXQsCiAgICAgICAgICAgIGN3ZD1jd2QsIGVudj1lbnYpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICJFcnJvciAlcyB3aGlsZSBleGVjdXRpbmcgY29tbWFuZCAlcyIsIGV4YywgY29tbWFuZF9kZXNjLAogICAgICAgICkKICAgICAgICByYWlzZQogICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIGFsbF9vdXRwdXQgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBjb25zb2xlX3RvX3N0cihwcm9jLnN0ZG91dC5yZWFkbGluZSgpKQogICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgIGFsbF9vdXRwdXQuYXBwZW5kKGxpbmUgKyAnXG4nKQogICAgICAgICAgICBpZiBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA8PSBzdGRfbG9nZ2luZy5ERUJVRzoKICAgICAgICAgICAgICAgICMgU2hvdyB0aGUgbGluZSBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGxpbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgc3Bpbm5lcgogICAgICAgICAgICAgICAgaWYgc3Bpbm5lciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzcGlubmVyLnNwaW4oKQogICAgcHJvYy53YWl0KCkKICAgIGlmIHNwaW5uZXIgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlOgogICAgICAgICAgICBzcGlubmVyLmZpbmlzaCgiZXJyb3IiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwaW5uZXIuZmluaXNoKCJkb25lIikKICAgIGlmIHByb2MucmV0dXJuY29kZToKICAgICAgICBpZiBvbl9yZXR1cm5jb2RlID09ICdyYWlzZSc6CiAgICAgICAgICAgIGlmIChsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA+IHN0ZF9sb2dnaW5nLkRFQlVHIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCBzaG93X3N0ZG91dCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnQ29tcGxldGUgb3V0cHV0IGZyb20gY29tbWFuZCAlczonLCBjb21tYW5kX2Rlc2MsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnJy5qb2luKGFsbF9vdXRwdXQpICsKICAgICAgICAgICAgICAgICAgICAnXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICdDb21tYW5kICIlcyIgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcyBpbiAlcycKICAgICAgICAgICAgICAgICUgKGNvbW1hbmRfZGVzYywgcHJvYy5yZXR1cm5jb2RlLCBjd2QpKQogICAgICAgIGVsaWYgb25fcmV0dXJuY29kZSA9PSAnd2Fybic6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0NvbW1hbmQgIiVzIiBoYWQgZXJyb3IgY29kZSAlcyBpbiAlcycsCiAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2MsIHByb2MucmV0dXJuY29kZSwgY3dkLAogICAgICAgICAgICApCiAgICAgICAgZWxpZiBvbl9yZXR1cm5jb2RlID09ICdpZ25vcmUnOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCB2YWx1ZTogb25fcmV0dXJuY29kZT0lcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIob25fcmV0dXJuY29kZSkpCiAgICBpZiBub3Qgc2hvd19zdGRvdXQ6CiAgICAgICAgcmV0dXJuICcnLmpvaW4oYWxsX291dHB1dCkKCgpkZWYgcmVhZF90ZXh0X2ZpbGUoZmlsZW5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiAqZmlsZW5hbWUqLgoKICAgIFRyeSB0byBkZWNvZGUgdGhlIGZpbGUgY29udGVudHMgd2l0aCB1dGYtOCwgdGhlIHByZWZlcnJlZCBzeXN0ZW0gZW5jb2RpbmcKICAgIChlLmcuLCBjcDEyNTIgb24gc29tZSBXaW5kb3dzIG1hY2hpbmVzKSwgYW5kIGxhdGluMSwgaW4gdGhhdCBvcmRlci4KICAgIERlY29kaW5nIGEgYnl0ZSBzdHJpbmcgd2l0aCBsYXRpbjEgd2lsbCBuZXZlciByYWlzZSBhbiBlcnJvci4gSW4gdGhlIHdvcnN0CiAgICBjYXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgY29udGFpbiBzb21lIGdhcmJhZ2UgY2hhcmFjdGVycy4KCiAgICAiIiIKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQoKICAgIGVuY29kaW5ncyA9IFsndXRmLTgnLCBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpLCAnbGF0aW4xJ10KICAgIGZvciBlbmMgaW4gZW5jb2RpbmdzOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuYykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGJyZWFrCgogICAgYXNzZXJ0IHR5cGUoZGF0YSkgIT0gYnl0ZXMgICMgTGF0aW4xIHNob3VsZCBoYXZlIHdvcmtlZC4KICAgIHJldHVybiBkYXRhCgoKZGVmIF9tYWtlX2J1aWxkX2RpcihidWlsZF9kaXIpOgogICAgb3MubWFrZWRpcnMoYnVpbGRfZGlyKQogICAgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlKGJ1aWxkX2RpcikKCgpjbGFzcyBGYWtlRmlsZShvYmplY3QpOgogICAgIiIiV3JhcCBhIGxpc3Qgb2YgbGluZXMgaW4gYW4gb2JqZWN0IHdpdGggcmVhZGxpbmUoKSB0byBtYWtlCiAgICBDb25maWdQYXJzZXIgaGFwcHkuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZXMpOgogICAgICAgIHNlbGYuX2dlbiA9IChsIGZvciBsIGluIGxpbmVzKQoKICAgIGRlZiByZWFkbGluZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX2dlbikKICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZW4ubmV4dCgpCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2VuCgoKY2xhc3MgU3RyZWFtV3JhcHBlcihTdHJpbmdJTyk6CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9zdHJlYW0oY2xzLCBvcmlnX3N0cmVhbSk6CiAgICAgICAgY2xzLm9yaWdfc3RyZWFtID0gb3JpZ19zdHJlYW0KICAgICAgICByZXR1cm4gY2xzKCkKCiAgICAjIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoKSBuZWVkcyBzdGRvdXQuZW5jb2RpbmcgdG8gcHJpbnQgdG8gc3Rkb3V0CiAgICBAcHJvcGVydHkKICAgIGRlZiBlbmNvZGluZyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5vcmlnX3N0cmVhbS5lbmNvZGluZwoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjYXB0dXJlZF9vdXRwdXQoc3RyZWFtX25hbWUpOgogICAgIiIiUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHVzZWQgYnkgY2FwdHVyZWRfc3Rkb3V0L3N0ZGluL3N0ZGVycgogICAgdGhhdCB0ZW1wb3JhcmlseSByZXBsYWNlcyB0aGUgc3lzIHN0cmVhbSAqc3RyZWFtX25hbWUqIHdpdGggYSBTdHJpbmdJTy4KCiAgICBUYWtlbiBmcm9tIExpYi9zdXBwb3J0L19faW5pdF9fLnB5IGluIHRoZSBDUHl0aG9uIHJlcG8uCiAgICAiIiIKICAgIG9yaWdfc3Rkb3V0ID0gZ2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lKQogICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBTdHJlYW1XcmFwcGVyLmZyb21fc3RyZWFtKG9yaWdfc3Rkb3V0KSkKICAgIHRyeToKICAgICAgICB5aWVsZCBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCiAgICBmaW5hbGx5OgogICAgICAgIHNldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSwgb3JpZ19zdGRvdXQpCgoKZGVmIGNhcHR1cmVkX3N0ZG91dCgpOgogICAgIiIiQ2FwdHVyZSB0aGUgb3V0cHV0IG9mIHN5cy5zdGRvdXQ6CgogICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CiAgICAgICAgICAgcHJpbnQoJ2hlbGxvJykKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LmdldHZhbHVlKCksICdoZWxsb1xuJykKCiAgICBUYWtlbiBmcm9tIExpYi9zdXBwb3J0L19faW5pdF9fLnB5IGluIHRoZSBDUHl0aG9uIHJlcG8uCiAgICAiIiIKICAgIHJldHVybiBjYXB0dXJlZF9vdXRwdXQoJ3N0ZG91dCcpCgoKY2xhc3MgY2FjaGVkX3Byb3BlcnR5KG9iamVjdCk6CiAgICAiIiJBIHByb3BlcnR5IHRoYXQgaXMgb25seSBjb21wdXRlZCBvbmNlIHBlciBpbnN0YW5jZSBhbmQgdGhlbiByZXBsYWNlcwogICAgICAgaXRzZWxmIHdpdGggYW4gb3JkaW5hcnkgYXR0cmlidXRlLiBEZWxldGluZyB0aGUgYXR0cmlidXRlIHJlc2V0cyB0aGUKICAgICAgIHByb3BlcnR5LgoKICAgICAgIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JvdHRsZXB5L2JvdHRsZS9ibG9iLzAuMTEuNS9ib3R0bGUucHkjTDE3NQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgogICAgICAgIHNlbGYuX19kb2NfXyA9IGdldGF0dHIoZnVuYywgJ19fZG9jX18nKQogICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIGNscyk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UncmUgYmVpbmcgYWNjZXNzZWQgZnJvbSB0aGUgY2xhc3MgaXRzZWxmLCBub3QgZnJvbSBhbiBvYmplY3QKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWx1ZSA9IG9iai5fX2RpY3RfX1tzZWxmLmZ1bmMuX19uYW1lX19dID0gc2VsZi5mdW5jKG9iaikKICAgICAgICByZXR1cm4gdmFsdWUKCgpkZWYgZ2V0X2luc3RhbGxlZF92ZXJzaW9uKGRpc3RfbmFtZSwgbG9va3VwX2RpcnM9Tm9uZSk6CiAgICAiIiJHZXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGRpc3RfbmFtZSBhdm9pZGluZyBwa2dfcmVzb3VyY2VzIGNhY2hlIiIiCiAgICAjIENyZWF0ZSBhIHJlcXVpcmVtZW50IHRoYXQgd2UnbGwgbG9vayBmb3IgaW5zaWRlIG9mIHNldHVwdG9vbHMuCiAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKGRpc3RfbmFtZSkKCiAgICAjIFdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIHRoaXMgY2FjaGVkLCBzbyB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBhIG5ldwogICAgIyB3b3JraW5nIHNldCBlYWNoIHRpbWUuCiAgICBpZiBsb29rdXBfZGlycyBpcyBOb25lOgogICAgICAgIHdvcmtpbmdfc2V0ID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0KCkKICAgIGVsc2U6CiAgICAgICAgd29ya2luZ19zZXQgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQobG9va3VwX2RpcnMpCgogICAgIyBHZXQgdGhlIGluc3RhbGxlZCBkaXN0cmlidXRpb24gZnJvbSBvdXIgd29ya2luZyBzZXQKICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKCiAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYW4gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiBvciBub3QsIGlmIHdlIGRpZAogICAgIyB3ZSB3YW50IHRvIHJldHVybiBpdCdzIHZlcnNpb24uCiAgICByZXR1cm4gZGlzdC52ZXJzaW9uIGlmIGRpc3QgZWxzZSBOb25lCgoKZGVmIGNvbnN1bWUoaXRlcmF0b3IpOgogICAgIiIiQ29uc3VtZSBhbiBpdGVyYWJsZSBhdCBDIHNwZWVkLiIiIgogICAgZGVxdWUoaXRlcmF0b3IsIG1heGxlbj0wKQpQSwMEFAAAAAAAAAAhADUK3jtrIgAAayIAACQAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2FwcGRpcnMucHkiIiIKVGhpcyBjb2RlIHdhcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzIGFuZCBtb2RpZmllZAp0byBzdWl0IG91ciBwdXJwb3Nlcy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTLCBleHBhbmR1c2VyCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBQWTIsIHRleHRfdHlwZQoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lKToKICAgIHIiIiIKICAgIFJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luZG93czogICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28KICAgIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKICAgIG5vbi1yb2FtaW5nIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgKS4gQXBwcwogICAgdHlwaWNhbGx5IHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZQogICAgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICAjIEdldCB0aGUgYmFzZSBwYXRoCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCgogICAgICAgICMgV2hlbiB1c2luZyBQeXRob24gMiwgcmV0dXJuIHBhdGhzIGFzIGJ5dGVzIG9uIFdpbmRvd3MgbGlrZSB3ZSBkbyBvbgogICAgICAgICMgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIFNlZSBoZWxwZXIgZnVuY3Rpb24gZG9jcyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIGlmIFBZMiBhbmQgaXNpbnN0YW5jZShwYXRoLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICBwYXRoID0gX3dpbl9wYXRoX3RvX2J5dGVzKHBhdGgpCgogICAgICAgICMgQWRkIG91ciBhcHAgbmFtZSBhbmQgQ2FjaGUgZGlyZWN0b3J5IHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lLCAiQ2FjaGUiKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBleHBhbmR1c2VyKCJ+L0xpYnJhcnkvQ2FjaGVzIikKCiAgICAgICAgIyBBZGQgb3VyIGFwcCBuYW1lIHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIEdldCB0aGUgYmFzZSBwYXRoCiAgICAgICAgcGF0aCA9IG9zLmdldGVudigiWERHX0NBQ0hFX0hPTUUiLCBleHBhbmR1c2VyKCJ+Ly5jYWNoZSIpKQoKICAgICAgICAjIEFkZCBvdXIgYXBwIG5hbWUgdG8gaXQKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCgogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lLCByb2FtaW5nPUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XCAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BcHBsaWNhdGlvbiBEYXRhXDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5TZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcXFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSksIGFwcG5hbWUpCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBleHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKSwKICAgICAgICAgICAgYXBwbmFtZSwKICAgICAgICApCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIGV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpLAogICAgICAgICAgICBhcHBuYW1lLAogICAgICAgICkKCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZSwgcm9hbWluZz1UcnVlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBUcnVlKSBjYW4gYmUgc2V0IEZhbHNlIHRvIG5vdCB1c2UgdGhlCiAgICAgICAgICAgIFdpbmRvd3Mgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhCiAgICAgICAgICAgIFdpbmRvd3MgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPgogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCByb2FtaW5nPXJvYW1pbmcpCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBleHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCgogICAgcmV0dXJuIHBhdGgKCgojIGZvciB0aGUgZGlzY3Vzc2lvbiByZWdhcmRpbmcgc2l0ZV9jb25maWdfZGlycyBsb2NhdGlvbnMKIyBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTczMz4KZGVmIHNpdGVfY29uZmlnX2RpcnMoYXBwbmFtZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBvdGVudGlhbCB1c2VyLXNoYXJlZCBjb25maWcgZGlycyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgoKICAgIFR5cGljYWwgdXNlciBjb25maWcgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+LwogICAgICAgIFVuaXg6ICAgICAgIC9ldGMgb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4vIGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIC4uLgogICAgICAgICAgICAgICAgICAgIC4uLkRhdGFcPEFwcE5hbWU+XAogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgICAgIG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDc6CiAgICAgICAgICAgICAgICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcE5hbWU+XAogICAgIiIiCiAgICBpZiBXSU5ET1dTOgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSldCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmpvaW4oJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnLCBhcHBuYW1lKV0KICAgIGVsc2U6CiAgICAgICAgIyB0cnkgbG9va2luZyBpbiAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgeGRnX2NvbmZpZ19kaXJzID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIGlmIHhkZ19jb25maWdfZGlyczoKICAgICAgICAgICAgcGF0aGxpc3QgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZXhwYW5kdXNlcih4KSwgYXBwbmFtZSkKICAgICAgICAgICAgICAgIGZvciB4IGluIHhkZ19jb25maWdfZGlycy5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgICAgICBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aGxpc3QgPSBbXQoKICAgICAgICAjIGFsd2F5cyBsb29rIGluIC9ldGMgZGlyZWN0bHkgYXMgd2VsbAogICAgICAgIHBhdGhsaXN0LmFwcGVuZCgnL2V0YycpCgogICAgcmV0dXJuIHBhdGhsaXN0CgoKIyAtLSBXaW5kb3dzIHN1cHBvcnQgZnVuY3Rpb25zIC0tCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiIKICAgIFRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpcmVjdG9yeSwgX3R5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcmVjdG9yeQoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmlmIFdJTkRPV1M6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGN0eXBlcwogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKZGVmIF93aW5fcGF0aF90b19ieXRlcyhwYXRoKToKICAgICIiIkVuY29kZSBXaW5kb3dzIHBhdGhzIHRvIGJ5dGVzLiBPbmx5IHVzZWQgb24gUHl0aG9uIDIuCgogICAgTW90aXZhdGlvbiBpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgd2hlcmUgcGF0aHMKICAgIGFyZSBhbHNvIHJldHVybmVkIGFzIGJ5dGVzLiBUaGlzIGF2b2lkcyBwcm9ibGVtcyBtaXhpbmcgYnl0ZXMgYW5kIFVuaWNvZGUKICAgIGVsc2V3aGVyZSBpbiB0aGUgY29kZWJhc2UuIEZvciBtb3JlIGRldGFpbHMgYW5kIGRpc2N1c3Npb24gc2VlCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8zNDYzPi4KCiAgICBJZiBlbmNvZGluZyB1c2luZyBBU0NJSSBhbmQgTUJDUyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbCBVbmljb2RlIHBhdGguCiAgICAiIiIKICAgIGZvciBlbmNvZGluZyBpbiAoJ0FTQ0lJJywgJ01CQ1MnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwYXRoLmVuY29kZShlbmNvZGluZykKICAgICAgICBleGNlcHQgKFVuaWNvZGVFbmNvZGVFcnJvciwgTG9va3VwRXJyb3IpOgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGF0aApQSwMEFAAAAAAAAAAhAM0MTS4gBQAAIAUAACIAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2J1aWxkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcy5wYXRoCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZQoKCmNsYXNzIEJ1aWxkRGlyZWN0b3J5KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgZGVsZXRlPU5vbmUpOgogICAgICAgICMgSWYgd2Ugd2VyZSBub3QgZ2l2ZW4gYW4gZXhwbGljaXQgZGlyZWN0b3J5LCBhbmQgd2Ugd2VyZSBub3QgZ2l2ZW4gYW4KICAgICAgICAjIGV4cGxpY2l0IGRlbGV0ZSBvcHRpb24sIHRoZW4gd2UnbGwgZGVmYXVsdCB0byBkZWxldGluZy4KICAgICAgICBpZiBuYW1lIGlzIE5vbmUgYW5kIGRlbGV0ZSBpcyBOb25lOgogICAgICAgICAgICBkZWxldGUgPSBUcnVlCgogICAgICAgIGlmIG5hbWUgaXMgTm9uZToKICAgICAgICAgICAgIyBXZSByZWFscGF0aCBoZXJlIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGhhdmUgdGhlaXIgZGVmYXVsdCB0bXBkaXIKICAgICAgICAgICAgIyBzeW1saW5rZWQgdG8gYW5vdGhlciBkaXJlY3RvcnkuICBUaGlzIHRlbmRzIHRvIGNvbmZ1c2UgYnVpbGQKICAgICAgICAgICAgIyBzY3JpcHRzLCBzbyB3ZSBjYW5vbmljYWxpemUgdGhlIHBhdGggYnkgdHJhdmVyc2luZyBwb3RlbnRpYWwKICAgICAgICAgICAgIyBzeW1saW5rcyBoZXJlLgogICAgICAgICAgICBuYW1lID0gb3MucGF0aC5yZWFscGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0icGlwLWJ1aWxkLSIpKQogICAgICAgICAgICAjIElmIHdlIHdlcmUgbm90IGdpdmVuIGFuIGV4cGxpY2l0IGRpcmVjdG9yeSwgYW5kIHdlIHdlcmUgbm90IGdpdmVuCiAgICAgICAgICAgICMgYW4gZXhwbGljaXQgZGVsZXRlIG9wdGlvbiwgdGhlbiB3ZSdsbCBkZWZhdWx0IHRvIGRlbGV0aW5nLgogICAgICAgICAgICBpZiBkZWxldGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGRlbGV0ZSA9IFRydWUKCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuZGVsZXRlID0gZGVsZXRlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHt9IHshcn0+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjLCB2YWx1ZSwgdGIpOgogICAgICAgIHNlbGYuY2xlYW51cCgpCgogICAgZGVmIGNsZWFudXAoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kZWxldGU6CiAgICAgICAgICAgIHJtdHJlZShzZWxmLm5hbWUpClBLAwQUAAAAAAAAACEAcR5qJLgIAAC4CAAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZGVwcmVjYXRpb24ucHkiIiIKQSBtb2R1bGUgdGhhdCBpbXBsZW1lbnRzIHRvb2xpbmcgdG8gZW5hYmxlIGVhc3kgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRpb25zLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCB3YXJuaW5ncwoKCmNsYXNzIFBpcERlcHJlY2F0aW9uV2FybmluZyhXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBQZW5kaW5nKG9iamVjdCk6CiAgICBwYXNzCgoKY2xhc3MgUmVtb3ZlZEluUGlwMTBXYXJuaW5nKFBpcERlcHJlY2F0aW9uV2FybmluZyk6CiAgICBwYXNzCgoKY2xhc3MgUmVtb3ZlZEluUGlwMTFXYXJuaW5nKFBpcERlcHJlY2F0aW9uV2FybmluZywgUGVuZGluZyk6CiAgICBwYXNzCgoKY2xhc3MgUHl0aG9uMjZEZXByZWNhdGlvbldhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nKToKICAgIHBhc3MKCgojIFdhcm5pbmdzIDwtPiBMb2dnaW5nIEludGVncmF0aW9uCgoKX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gTm9uZQoKCmRlZiBfc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcoCiAgICAgICAgICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSwKICAgICAgICAgICAgKQogICAgZWxzZToKICAgICAgICBpZiBpc3N1YmNsYXNzKGNhdGVnb3J5LCBQaXBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgICAgICAgICAjIFdlIHVzZSBhIHNwZWNpYWxseSBuYW1lZCBsb2dnZXIgd2hpY2ggd2lsbCBoYW5kbGUgYWxsIG9mIHRoZQogICAgICAgICAgICAjIGRlcHJlY2F0aW9uIG1lc3NhZ2VzIGZvciBwaXAuCiAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJwaXAuZGVwcmVjYXRpb25zIikKCiAgICAgICAgICAgICMgVGhpcyBpcyBwdXJwb3NlbHkgdXNpbmcgdGhlICUgZm9ybWF0dGVyIGhlcmUgaW5zdGVhZCBvZiBsZXR0aW5nCiAgICAgICAgICAgICMgdGhlIGxvZ2dpbmcgbW9kdWxlIGhhbmRsZSB0aGUgaW50ZXJwb2xhdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHdlCiAgICAgICAgICAgICMgd2FudCBpdCB0byBhcHBlYXIgYXMgaWYgc29tZW9uZSB0eXBlZCB0aGlzIGVudGlyZSBtZXNzYWdlIG91dC4KICAgICAgICAgICAgbG9nX21lc3NhZ2UgPSAiREVQUkVDQVRJT046ICVzIiAlIG1lc3NhZ2UKCiAgICAgICAgICAgICMgUGlwRGVwcmVjYXRpb25XYXJuaW5ncyB0aGF0IGFyZSBQZW5kaW5nIHN0aWxsIGhhdmUgYXQgbGVhc3QgMgogICAgICAgICAgICAjIHZlcnNpb25zIHRvIGdvIHVudGlsIHRoZXkgYXJlIHJlbW92ZWQgc28gdGhleSBjYW4ganVzdCBiZQogICAgICAgICAgICAjIHdhcm5pbmdzLiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgdmVyeSBuZXh0CiAgICAgICAgICAgICMgdmVyc2lvbiBvZiBwaXAuIFdlIHdhbnQgdGhlc2UgdG8gYmUgbW9yZSBvYnZpb3VzIHNvIHdlIHVzZSB0aGUKICAgICAgICAgICAgIyBFUlJPUiBsb2dnaW5nIGxldmVsLgogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKGNhdGVnb3J5LCBQZW5kaW5nKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGxvZ19tZXNzYWdlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGxvZ19tZXNzYWdlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZygKICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lLAogICAgICAgICAgICApCgoKZGVmIGluc3RhbGxfd2FybmluZ19sb2dnZXIoKToKICAgICMgRW5hYmxlIG91ciBEZXByZWNhdGlvbiBXYXJuaW5ncwogICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJkZWZhdWx0IiwgUGlwRGVwcmVjYXRpb25XYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCiAgICBnbG9iYWwgX3dhcm5pbmdzX3Nob3d3YXJuaW5nCgogICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIE5vbmU6CiAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gd2FybmluZ3Muc2hvd3dhcm5pbmcKICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IF9zaG93d2FybmluZwpQSwMEFAAAAAAAAAAhAL1aP7DLAwAAywMAACUAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2VuY29kaW5nLnB5aW1wb3J0IGNvZGVjcwppbXBvcnQgbG9jYWxlCmltcG9ydCByZQoKCkJPTVMgPSBbCiAgICAoY29kZWNzLkJPTV9VVEY4LCAndXRmOCcpLAogICAgKGNvZGVjcy5CT01fVVRGMTYsICd1dGYxNicpLAogICAgKGNvZGVjcy5CT01fVVRGMTZfQkUsICd1dGYxNi1iZScpLAogICAgKGNvZGVjcy5CT01fVVRGMTZfTEUsICd1dGYxNi1sZScpLAogICAgKGNvZGVjcy5CT01fVVRGMzIsICd1dGYzMicpLAogICAgKGNvZGVjcy5CT01fVVRGMzJfQkUsICd1dGYzMi1iZScpLAogICAgKGNvZGVjcy5CT01fVVRGMzJfTEUsICd1dGYzMi1sZScpLApdCgpFTkNPRElOR19SRSA9IHJlLmNvbXBpbGUoYidjb2RpbmdbOj1dXHMqKFstXHcuXSspJykKCgpkZWYgYXV0b19kZWNvZGUoZGF0YSk6CiAgICAiIiJDaGVjayBhIGJ5dGVzIHN0cmluZyBmb3IgYSBCT00gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgZW5jb2RpbmcKCiAgICBGYWxsYmFjayB0byBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpIGxpa2Ugb3BlbigpIG9uIFB5dGhvbjMiIiIKICAgIGZvciBib20sIGVuY29kaW5nIGluIEJPTVM6CiAgICAgICAgaWYgZGF0YS5zdGFydHN3aXRoKGJvbSk6CiAgICAgICAgICAgIHJldHVybiBkYXRhW2xlbihib20pOl0uZGVjb2RlKGVuY29kaW5nKQogICAgIyBMZXRzIGNoZWNrIHRoZSBmaXJzdCB0d28gbGluZXMgYXMgaW4gUEVQMjYzCiAgICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0KGInXG4nKVs6Ml06CiAgICAgICAgaWYgbGluZVswOjFdID09IGInIycgYW5kIEVOQ09ESU5HX1JFLnNlYXJjaChsaW5lKToKICAgICAgICAgICAgZW5jb2RpbmcgPSBFTkNPRElOR19SRS5zZWFyY2gobGluZSkuZ3JvdXBzKClbMF0uZGVjb2RlKCdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBkYXRhLmRlY29kZShlbmNvZGluZykKICAgIHJldHVybiBkYXRhLmRlY29kZShsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpKQpQSwMEFAAAAAAAAAAhAPJD7cCDAwAAgwMAACcAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2ZpbGVzeXN0ZW0ucHlpbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgZ2V0X3BhdGhfdWlkCgoKZGVmIGNoZWNrX3BhdGhfb3duZXIocGF0aCk6CiAgICAjIElmIHdlIGRvbid0IGhhdmUgYSB3YXkgdG8gY2hlY2sgdGhlIGVmZmVjdGl2ZSB1aWQgb2YgdGhpcyBwcm9jZXNzLCB0aGVuCiAgICAjIHdlJ2xsIGp1c3QgYXNzdW1lIHRoYXQgd2Ugb3duIHRoZSBkaXJlY3RvcnkuCiAgICBpZiBub3QgaGFzYXR0cihvcywgImdldGV1aWQiKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHByZXZpb3VzID0gTm9uZQogICAgd2hpbGUgcGF0aCAhPSBwcmV2aW91czoKICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMocGF0aCk6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgcGF0aCBpcyB3cml0YWJsZSBieSBjdXJyZW50IHVzZXIuCiAgICAgICAgICAgIGlmIG9zLmdldGV1aWQoKSA9PSAwOgogICAgICAgICAgICAgICAgIyBTcGVjaWFsIGhhbmRsaW5nIGZvciByb290IHVzZXIgaW4gb3JkZXIgdG8gaGFuZGxlIHByb3Blcmx5CiAgICAgICAgICAgICAgICAjIGNhc2VzIHdoZXJlIHVzZXJzIHVzZSBzdWRvIHdpdGhvdXQgLUggZmxhZy4KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwYXRoX3VpZCA9IGdldF9wYXRoX3VpZChwYXRoKQogICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF91aWQgPT0gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIG9zLmFjY2VzcyhwYXRoLCBvcy5XX09LKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZXZpb3VzLCBwYXRoID0gcGF0aCwgb3MucGF0aC5kaXJuYW1lKHBhdGgpClBLAwQUAAAAAAAAACEAIDcFdHsLAAB7CwAAIgAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZ2xpYmMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHJlCmltcG9ydCBjdHlwZXMKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB3YXJuaW5ncwoKCmRlZiBnbGliY192ZXJzaW9uX3N0cmluZygpOgogICAgIlJldHVybnMgZ2xpYmMgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUgaWYgbm90IHVzaW5nIGdsaWJjLiIKCiAgICAjIGN0eXBlcy5DRExMKE5vbmUpIGludGVybmFsbHkgY2FsbHMgZGxvcGVuKE5VTEwpLCBhbmQgYXMgdGhlIGRsb3BlbgogICAgIyBtYW5wYWdlIHNheXMsICJJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgZm9yIHRoZQogICAgIyBtYWluIHByb2dyYW0iLiBUaGlzIHdheSB3ZSBjYW4gbGV0IHRoZSBsaW5rZXIgZG8gdGhlIHdvcmsgdG8gZmlndXJlIG91dAogICAgIyB3aGljaCBsaWJjIG91ciBwcm9jZXNzIGlzIGFjdHVhbGx5IHVzaW5nLgogICAgcHJvY2Vzc19uYW1lc3BhY2UgPSBjdHlwZXMuQ0RMTChOb25lKQogICAgdHJ5OgogICAgICAgIGdudV9nZXRfbGliY192ZXJzaW9uID0gcHJvY2Vzc19uYW1lc3BhY2UuZ251X2dldF9saWJjX3ZlcnNpb24KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIFN5bWJvbCBkb2Vzbid0IGV4aXN0IC0+IHRoZXJlZm9yZSwgd2UgYXJlIG5vdCBsaW5rZWQgdG8KICAgICAgICAjIGdsaWJjLgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDYWxsIGdudV9nZXRfbGliY192ZXJzaW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGxpa2UgIjIuNSIKICAgIGdudV9nZXRfbGliY192ZXJzaW9uLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKICAgIHZlcnNpb25fc3RyID0gZ251X2dldF9saWJjX3ZlcnNpb24oKQogICAgIyBweTIgLyBweTMgY29tcGF0aWJpbGl0eToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb25fc3RyLCBzdHIpOgogICAgICAgIHZlcnNpb25fc3RyID0gdmVyc2lvbl9zdHIuZGVjb2RlKCJhc2NpaSIpCgogICAgcmV0dXJuIHZlcnNpb25fc3RyCgoKIyBTZXBhcmF0ZWQgb3V0IGZyb20gaGF2ZV9jb21wYXRpYmxlX2dsaWJjIGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nCmRlZiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICAjIFBhcnNlIHN0cmluZyBhbmQgY2hlY2sgYWdhaW5zdCByZXF1ZXN0ZWQgdmVyc2lvbi4KICAgICMKICAgICMgV2UgdXNlIGEgcmVnZXhwIGluc3RlYWQgb2Ygc3RyLnNwbGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBkaXNjYXJkIGFueQogICAgIyByYW5kb20ganVuayB0aGF0IG1pZ2h0IGNvbWUgYWZ0ZXIgdGhlIG1pbm9yIHZlcnNpb24gLS0gdGhpcyBtaWdodCBoYXBwZW4KICAgICMgaW4gcGF0Y2hlZC9mb3JrZWQgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gTGluYXJvJ3MgdmVyc2lvbiBvZiBnbGliYwogICAgIyB1c2VzIHZlcnNpb24gc3RyaW5ncyBsaWtlICIyLjIwLTIwMTQuMTEiKS4gU2VlIGdoLTM1ODguCiAgICBtID0gcmUubWF0Y2gociIoP1A8bWFqb3I+WzAtOV0rKVwuKD9QPG1pbm9yPlswLTldKykiLCB2ZXJzaW9uX3N0cikKICAgIGlmIG5vdCBtOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkV4cGVjdGVkIGdsaWJjIHZlcnNpb24gd2l0aCAyIGNvbXBvbmVudHMgbWFqb3IubWlub3IsIgogICAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICVzIiAlIHZlcnNpb25fc3RyLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiAoaW50KG0uZ3JvdXAoIm1ham9yIikpID09IHJlcXVpcmVkX21ham9yIGFuZAogICAgICAgICAgICBpbnQobS5ncm91cCgibWlub3IiKSkgPj0gbWluaW11bV9taW5vcikKCgpkZWYgaGF2ZV9jb21wYXRpYmxlX2dsaWJjKHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgIHZlcnNpb25fc3RyID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgdmVyc2lvbl9zdHIgaXMgTm9uZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcikKCgojIHBsYXRmb3JtLmxpYmNfdmVyIHJlZ3VsYXJseSByZXR1cm5zIGNvbXBsZXRlbHkgbm9uc2Vuc2ljYWwgZ2xpYmMKIyB2ZXJzaW9ucy4gRS5nLiBvbiBteSBjb21wdXRlciwgcGxhdGZvcm0gc2F5czoKIwojICAgfiQgcHl0aG9uMi43IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjcnKQojICAgfiQgcHl0aG9uMy41IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjknKQojCiMgQnV0IHRoZSB0cnV0aCBpczoKIwojICAgfiQgbGRkIC0tdmVyc2lvbgojICAgbGRkIChEZWJpYW4gR0xJQkMgMi4yMi0xMSkgMi4yMgojCiMgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IHRoZSBsaW5laGF1bCBkYXRhIG9uIGxpYmMKIyB2ZXJzaW9ucyB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgcGlwIDguMS4yIGFuZCBlYXJsaWVyIGlzIHVzZWxlc3MgYW5kCiMgbWlzbGVhZGluZy4gU29sdXRpb246IGluc3RlYWQgb2YgdXNpbmcgcGxhdGZvcm0sIHVzZSBvdXIgY29kZSB0aGF0IGFjdHVhbGx5CiMgd29ya3MuCmRlZiBsaWJjX3ZlcigpOgogICAgZ2xpYmNfdmVyc2lvbiA9IGdsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIGdsaWJjX3ZlcnNpb24gaXMgTm9uZToKICAgICAgICAjIEZvciBub24tZ2xpYmMgcGxhdGZvcm1zLCBmYWxsIGJhY2sgb24gcGxhdGZvcm0ubGliY192ZXIKICAgICAgICByZXR1cm4gcGxhdGZvcm0ubGliY192ZXIoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCJnbGliYyIsIGdsaWJjX3ZlcnNpb24pClBLAwQUAAAAAAAAACEAqTTpBDILAAAyCwAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvaGFzaGVzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBoYXNobGliCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBIYXNoTWlzbWF0Y2gsIEhhc2hNaXNzaW5nLCBJbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcmVhZF9jaHVua3MKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IGl0ZXJpdGVtcywgaXRlcmtleXMsIGl0ZXJ2YWx1ZXMKCgojIFRoZSByZWNvbW1lbmRlZCBoYXNoIGFsZ28gb2YgdGhlIG1vbWVudC4gQ2hhbmdlIHRoaXMgd2hlbmV2ZXIgdGhlIHN0YXRlIG9mCiMgdGhlIGFydCBjaGFuZ2VzOyBpdCB3b24ndCBodXJ0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCkZBVk9SSVRFX0hBU0ggPSAnc2hhMjU2JwoKCiMgTmFtZXMgb2YgaGFzaGxpYiBhbGdvcml0aG1zIGFsbG93ZWQgYnkgdGhlIC0taGFzaCBvcHRpb24gYW5kIGBgcGlwIGhhc2hgYAojIEN1cnJlbnRseSwgdGhvc2UgYXJlIHRoZSBvbmVzIGF0IGxlYXN0IGFzIGNvbGxpc2lvbi1yZXNpc3RhbnQgYXMgc2hhMjU2LgpTVFJPTkdfSEFTSEVTID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddCgoKY2xhc3MgSGFzaGVzKG9iamVjdCk6CiAgICAiIiJBIHdyYXBwZXIgdGhhdCBidWlsZHMgbXVsdGlwbGUgaGFzaGVzIGF0IG9uY2UgYW5kIGNoZWNrcyB0aGVtIGFnYWluc3QKICAgIGtub3duLWdvb2QgdmFsdWVzCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGFzaGVzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBoYXNoZXM6IEEgZGljdCBvZiBhbGdvcml0aG0gbmFtZXMgcG9pbnRpbmcgdG8gbGlzdHMgb2YgYWxsb3dlZAogICAgICAgICAgICBoZXggZGlnZXN0cwogICAgICAgICIiIgogICAgICAgIHNlbGYuX2FsbG93ZWQgPSB7fSBpZiBoYXNoZXMgaXMgTm9uZSBlbHNlIGhhc2hlcwoKICAgIGRlZiBjaGVja19hZ2FpbnN0X2NodW5rcyhzZWxmLCBjaHVua3MpOgogICAgICAgICIiIkNoZWNrIGdvb2QgaGFzaGVzIGFnYWluc3Qgb25lcyBidWlsdCBmcm9tIGl0ZXJhYmxlIG9mIGNodW5rcyBvZgogICAgICAgIGRhdGEuCgogICAgICAgIFJhaXNlIEhhc2hNaXNtYXRjaCBpZiBub25lIG1hdGNoLgoKICAgICAgICAiIiIKICAgICAgICBnb3RzID0ge30KICAgICAgICBmb3IgaGFzaF9uYW1lIGluIGl0ZXJrZXlzKHNlbGYuX2FsbG93ZWQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBnb3RzW2hhc2hfbmFtZV0gPSBoYXNobGliLm5ldyhoYXNoX25hbWUpCiAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKCdVbmtub3duIGhhc2ggbmFtZTogJXMnICUgaGFzaF9uYW1lKQoKICAgICAgICBmb3IgY2h1bmsgaW4gY2h1bmtzOgogICAgICAgICAgICBmb3IgaGFzaCBpbiBpdGVydmFsdWVzKGdvdHMpOgogICAgICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspCgogICAgICAgIGZvciBoYXNoX25hbWUsIGdvdCBpbiBpdGVyaXRlbXMoZ290cyk6CiAgICAgICAgICAgIGlmIGdvdC5oZXhkaWdlc3QoKSBpbiBzZWxmLl9hbGxvd2VkW2hhc2hfbmFtZV06CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl9yYWlzZShnb3RzKQoKICAgIGRlZiBfcmFpc2Uoc2VsZiwgZ290cyk6CiAgICAgICAgcmFpc2UgSGFzaE1pc21hdGNoKHNlbGYuX2FsbG93ZWQsIGdvdHMpCgogICAgZGVmIGNoZWNrX2FnYWluc3RfZmlsZShzZWxmLCBmaWxlKToKICAgICAgICAiIiJDaGVjayBnb29kIGhhc2hlcyBhZ2FpbnN0IGEgZmlsZS1saWtlIG9iamVjdAoKICAgICAgICBSYWlzZSBIYXNoTWlzbWF0Y2ggaWYgbm9uZSBtYXRjaC4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuY2hlY2tfYWdhaW5zdF9jaHVua3MocmVhZF9jaHVua3MoZmlsZSkpCgogICAgZGVmIGNoZWNrX2FnYWluc3RfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZmlsZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hlY2tfYWdhaW5zdF9maWxlKGZpbGUpCgogICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIEkga25vdyBhbnkga25vd24tZ29vZCBoYXNoZXMuIiIiCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fYWxsb3dlZCkKCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19ub256ZXJvX18oKQoKCmNsYXNzIE1pc3NpbmdIYXNoZXMoSGFzaGVzKToKICAgICIiIkEgd29ya2FsaWtlIGZvciBIYXNoZXMgdXNlZCB3aGVuIHdlJ3JlIG1pc3NpbmcgYSBoYXNoIGZvciBhIHJlcXVpcmVtZW50CgogICAgSXQgY29tcHV0ZXMgdGhlIGFjdHVhbCBoYXNoIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgcmFpc2VzIGEgSGFzaE1pc3NpbmcKICAgIGV4Y2VwdGlvbiBzaG93aW5nIGl0IHRvIHRoZSB1c2VyLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICIiIkRvbid0IG9mZmVyIHRoZSBgYGhhc2hlc2BgIGt3YXJnLiIiIgogICAgICAgICMgUGFzcyBvdXIgZmF2b3JpdGUgaGFzaCBpbiB0byBnZW5lcmF0ZSBhICJnb3R0ZW4gaGFzaCIuIFdpdGggdGhlCiAgICAgICAgIyBlbXB0eSBsaXN0LCBpdCB3aWxsIG5ldmVyIG1hdGNoLCBzbyBhbiBlcnJvciB3aWxsIGFsd2F5cyByYWlzZS4KICAgICAgICBzdXBlcihNaXNzaW5nSGFzaGVzLCBzZWxmKS5fX2luaXRfXyhoYXNoZXM9e0ZBVk9SSVRFX0hBU0g6IFtdfSkKCiAgICBkZWYgX3JhaXNlKHNlbGYsIGdvdHMpOgogICAgICAgIHJhaXNlIEhhc2hNaXNzaW5nKGdvdHNbRkFWT1JJVEVfSEFTSF0uaGV4ZGlnZXN0KCkpClBLAwQUAAAAAAAAACEAZybXeP8MAAD/DAAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvbG9nZ2luZy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgbG9nZ2luZy5oYW5kbGVycwppbXBvcnQgb3MKCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2RpcgoKdHJ5OgogICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY29sb3JhbWEKIyBMb3RzIG9mIGRpZmZlcmVudCBlcnJvcnMgY2FuIGNvbWUgZnJvbSB0aGlzLCBpbmNsdWRpbmcgU3lzdGVtRXJyb3IgYW5kCiMgSW1wb3J0RXJyb3IuCmV4Y2VwdCBFeGNlcHRpb246CiAgICBjb2xvcmFtYSA9IE5vbmUKCgpfbG9nX3N0YXRlID0gdGhyZWFkaW5nLmxvY2FsKCkKX2xvZ19zdGF0ZS5pbmRlbnRhdGlvbiA9IDAKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgaW5kZW50X2xvZyhudW09Mik6CiAgICAiIiIKICAgIEEgY29udGV4dCBtYW5hZ2VyIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGxvZyBvdXRwdXQgdG8gYmUgaW5kZW50ZWQgZm9yIGFueQogICAgbG9nIG1lc3NhZ2VzIGVtaXR0ZWQgaW5zaWRlIGl0LgogICAgIiIiCiAgICBfbG9nX3N0YXRlLmluZGVudGF0aW9uICs9IG51bQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIF9sb2dfc3RhdGUuaW5kZW50YXRpb24gLT0gbnVtCgoKZGVmIGdldF9pbmRlbnRhdGlvbigpOgogICAgcmV0dXJuIGdldGF0dHIoX2xvZ19zdGF0ZSwgJ2luZGVudGF0aW9uJywgMCkKCgpjbGFzcyBJbmRlbnRpbmdGb3JtYXR0ZXIobG9nZ2luZy5Gb3JtYXR0ZXIpOgoKICAgIGRlZiBmb3JtYXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAiIiIKICAgICAgICBDYWxscyB0aGUgc3RhbmRhcmQgZm9ybWF0dGVyLCBidXQgd2lsbCBpbmRlbnQgYWxsIG9mIHRoZSBsb2cgbWVzc2FnZXMKICAgICAgICBieSBvdXIgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KICAgICAgICAiIiIKICAgICAgICBmb3JtYXR0ZWQgPSBsb2dnaW5nLkZvcm1hdHRlci5mb3JtYXQoc2VsZiwgcmVjb3JkKQogICAgICAgIGZvcm1hdHRlZCA9ICIiLmpvaW4oWwogICAgICAgICAgICAoIiAiICogZ2V0X2luZGVudGF0aW9uKCkpICsgbGluZQogICAgICAgICAgICBmb3IgbGluZSBpbiBmb3JtYXR0ZWQuc3BsaXRsaW5lcyhUcnVlKQogICAgICAgIF0pCiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZAoKCmRlZiBfY29sb3Jfd3JhcCgqY29sb3JzKToKICAgIGRlZiB3cmFwcGVkKGlucCk6CiAgICAgICAgcmV0dXJuICIiLmpvaW4obGlzdChjb2xvcnMpICsgW2lucCwgY29sb3JhbWEuU3R5bGUuUkVTRVRfQUxMXSkKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgQ29sb3JpemVkU3RyZWFtSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIpOgoKICAgICMgRG9uJ3QgYnVpbGQgdXAgYSBsaXN0IG9mIGNvbG9ycyBpZiB3ZSBkb24ndCBoYXZlIGNvbG9yYW1hCiAgICBpZiBjb2xvcmFtYToKICAgICAgICBDT0xPUlMgPSBbCiAgICAgICAgICAgICMgVGhpcyBuZWVkcyB0byBiZSBpbiBvcmRlciBmcm9tIGhpZ2hlc3QgbG9nZ2luZyBsZXZlbCB0byBsb3dlc3QuCiAgICAgICAgICAgIChsb2dnaW5nLkVSUk9SLCBfY29sb3Jfd3JhcChjb2xvcmFtYS5Gb3JlLlJFRCkpLAogICAgICAgICAgICAobG9nZ2luZy5XQVJOSU5HLCBfY29sb3Jfd3JhcChjb2xvcmFtYS5Gb3JlLllFTExPVykpLAogICAgICAgIF0KICAgIGVsc2U6CiAgICAgICAgQ09MT1JTID0gW10KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtPU5vbmUpOgogICAgICAgIGxvZ2dpbmcuU3RyZWFtSGFuZGxlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCgogICAgICAgIGlmIFdJTkRPV1MgYW5kIGNvbG9yYW1hOgogICAgICAgICAgICBzZWxmLnN0cmVhbSA9IGNvbG9yYW1hLkFuc2lUb1dpbjMyKHNlbGYuc3RyZWFtKQoKICAgIGRlZiBzaG91bGRfY29sb3Ioc2VsZik6CiAgICAgICAgIyBEb24ndCBjb2xvcml6ZSB0aGluZ3MgaWYgd2UgZG8gbm90IGhhdmUgY29sb3JhbWEKICAgICAgICBpZiBub3QgY29sb3JhbWE6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZWFsX3N0cmVhbSA9ICgKICAgICAgICAgICAgc2VsZi5zdHJlYW0gaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5zdHJlYW0sIGNvbG9yYW1hLkFuc2lUb1dpbjMyKQogICAgICAgICAgICBlbHNlIHNlbGYuc3RyZWFtLndyYXBwZWQKICAgICAgICApCgogICAgICAgICMgSWYgdGhlIHN0cmVhbSBpcyBhIHR0eSB3ZSBzaG91bGQgY29sb3IgaXQKICAgICAgICBpZiBoYXNhdHRyKHJlYWxfc3RyZWFtLCAiaXNhdHR5IikgYW5kIHJlYWxfc3RyZWFtLmlzYXR0eSgpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIElmIHdlIGhhdmUgYW4gQVNOSSB0ZXJtIHdlIHNob3VsZCBjb2xvciBpdAogICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJURVJNIikgPT0gIkFOU0kiOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIElmIGFueXRoaW5nIGVsc2Ugd2Ugc2hvdWxkIG5vdCBjb2xvciBpdAogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBmb3JtYXQoc2VsZiwgcmVjb3JkKToKICAgICAgICBtc2cgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIuZm9ybWF0KHNlbGYsIHJlY29yZCkKCiAgICAgICAgaWYgc2VsZi5zaG91bGRfY29sb3IoKToKICAgICAgICAgICAgZm9yIGxldmVsLCBjb2xvciBpbiBzZWxmLkNPTE9SUzoKICAgICAgICAgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vID49IGxldmVsOgogICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbG9yKG1zZykKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gbXNnCgoKY2xhc3MgQmV0dGVyUm90YXRpbmdGaWxlSGFuZGxlcihsb2dnaW5nLmhhbmRsZXJzLlJvdGF0aW5nRmlsZUhhbmRsZXIpOgoKICAgIGRlZiBfb3BlbihzZWxmKToKICAgICAgICBlbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShzZWxmLmJhc2VGaWxlbmFtZSkpCiAgICAgICAgcmV0dXJuIGxvZ2dpbmcuaGFuZGxlcnMuUm90YXRpbmdGaWxlSGFuZGxlci5fb3BlbihzZWxmKQoKCmNsYXNzIE1heExldmVsRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGV2ZWwpOgogICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbAoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKICAgICAgICByZXR1cm4gcmVjb3JkLmxldmVsbm8gPCBzZWxmLmxldmVsClBLAwQUAAAAAAAAACEASFTY6k8VAABPFQAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvb3V0ZGF0ZWQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGxvY2tmaWxlCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCB2ZXJzaW9uIGFzIHBhY2thZ2luZ192ZXJzaW9uCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHRvdGFsX3NlY29uZHMsIFdJTkRPV1MKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgVVNFUl9DQUNIRV9ESVIsIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2RpciwgZ2V0X2luc3RhbGxlZF92ZXJzaW9uCmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKCgpTRUxGQ0hFQ0tfREFURV9GTVQgPSAiJVktJW0tJWRUJUg6JU06JVNaIgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFZpcnR1YWxlbnZTZWxmQ2hlY2tTdGF0ZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuc3RhdGVmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgInBpcC1zZWxmY2hlY2suanNvbiIpCgogICAgICAgICMgTG9hZCB0aGUgZXhpc3Rpbmcgc3RhdGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICBzZWxmLnN0YXRlID0ge30KCiAgICBkZWYgc2F2ZShzZWxmLCBweXBpX3ZlcnNpb24sIGN1cnJlbnRfdGltZSk6CiAgICAgICAgIyBBdHRlbXB0IHRvIHdyaXRlIG91dCBvdXIgdmVyc2lvbiBjaGVjayBmaWxlCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgsICJ3IikgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICBqc29uLmR1bXAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImxhc3RfY2hlY2siOiBjdXJyZW50X3RpbWUuc3RyZnRpbWUoU0VMRkNIRUNLX0RBVEVfRk1UKSwKICAgICAgICAgICAgICAgICAgICAicHlwaV92ZXJzaW9uIjogcHlwaV92ZXJzaW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHN0YXRlZmlsZSwKICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgc2VwYXJhdG9ycz0oIiwiLCAiOiIpCiAgICAgICAgICAgICkKCgpjbGFzcyBHbG9iYWxTZWxmQ2hlY2tTdGF0ZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuc3RhdGVmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oVVNFUl9DQUNIRV9ESVIsICJzZWxmY2hlY2suanNvbiIpCgogICAgICAgICMgTG9hZCB0aGUgZXhpc3Rpbmcgc3RhdGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSlbc3lzLnByZWZpeF0KICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IsIEtleUVycm9yKToKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHt9CgogICAgZGVmIHNhdmUoc2VsZiwgcHlwaV92ZXJzaW9uLCBjdXJyZW50X3RpbWUpOgogICAgICAgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugb3duIHRoZSBkaXJlY3RvcnkKICAgICAgICBpZiBub3QgY2hlY2tfcGF0aF9vd25lcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5zdGF0ZWZpbGVfcGF0aCkpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBlbnN1cmVkIHRoZSBkaXJlY3RvcnkgaXMgb3duZWQgYnkgdGhpcyB1c2VyLCB3ZSdsbCBnbwogICAgICAgICMgYWhlYWQgYW5kIG1ha2Ugc3VyZSB0aGF0IGFsbCBvdXIgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQuCiAgICAgICAgZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5zdGF0ZWZpbGVfcGF0aCkpCgogICAgICAgICMgQXR0ZW1wdCB0byB3cml0ZSBvdXQgb3VyIHZlcnNpb24gY2hlY2sgZmlsZQogICAgICAgIHdpdGggbG9ja2ZpbGUuTG9ja0ZpbGUoc2VsZi5zdGF0ZWZpbGVfcGF0aCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuc3RhdGVmaWxlX3BhdGgpOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGpzb24ubG9hZChzdGF0ZWZpbGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHt9CgogICAgICAgICAgICBzdGF0ZVtzeXMucHJlZml4XSA9IHsKICAgICAgICAgICAgICAgICJsYXN0X2NoZWNrIjogY3VycmVudF90aW1lLnN0cmZ0aW1lKFNFTEZDSEVDS19EQVRFX0ZNVCksCiAgICAgICAgICAgICAgICAicHlwaV92ZXJzaW9uIjogcHlwaV92ZXJzaW9uLAogICAgICAgICAgICB9CgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCwgInciKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAoc3RhdGUsIHN0YXRlZmlsZSwgc29ydF9rZXlzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKQoKCmRlZiBsb2FkX3NlbGZjaGVja19zdGF0ZWZpbGUoKToKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIHJldHVybiBWaXJ0dWFsZW52U2VsZkNoZWNrU3RhdGUoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gR2xvYmFsU2VsZkNoZWNrU3RhdGUoKQoKCmRlZiBwaXBfdmVyc2lvbl9jaGVjayhzZXNzaW9uKToKICAgICIiIkNoZWNrIGZvciBhbiB1cGRhdGUgZm9yIHBpcC4KCiAgICBMaW1pdCB0aGUgZnJlcXVlbmN5IG9mIGNoZWNrcyB0byBvbmNlIHBlciB3ZWVrLiBTdGF0ZSBpcyBzdG9yZWQgZWl0aGVyIGluCiAgICB0aGUgYWN0aXZlIHZpcnR1YWxlbnYgb3IgaW4gdGhlIHVzZXIncyBVU0VSX0NBQ0hFX0RJUiBrZXllZCBvZmYgdGhlIHByZWZpeAogICAgb2YgdGhlIHBpcCBzY3JpcHQgcGF0aC4KICAgICIiIgogICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oInBpcCIpCiAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbiBpcyBOb25lOgogICAgICAgIHJldHVybgoKICAgIHBpcF92ZXJzaW9uID0gcGFja2FnaW5nX3ZlcnNpb24ucGFyc2UoaW5zdGFsbGVkX3ZlcnNpb24pCiAgICBweXBpX3ZlcnNpb24gPSBOb25lCgogICAgdHJ5OgogICAgICAgIHN0YXRlID0gbG9hZF9zZWxmY2hlY2tfc3RhdGVmaWxlKCkKCiAgICAgICAgY3VycmVudF90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjbm93KCkKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIHN0YXRlCiAgICAgICAgaWYgImxhc3RfY2hlY2siIGluIHN0YXRlLnN0YXRlIGFuZCAicHlwaV92ZXJzaW9uIiBpbiBzdGF0ZS5zdGF0ZToKICAgICAgICAgICAgbGFzdF9jaGVjayA9IGRhdGV0aW1lLmRhdGV0aW1lLnN0cnB0aW1lKAogICAgICAgICAgICAgICAgc3RhdGUuc3RhdGVbImxhc3RfY2hlY2siXSwKICAgICAgICAgICAgICAgIFNFTEZDSEVDS19EQVRFX0ZNVAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHRvdGFsX3NlY29uZHMoY3VycmVudF90aW1lIC0gbGFzdF9jaGVjaykgPCA3ICogMjQgKiA2MCAqIDYwOgogICAgICAgICAgICAgICAgcHlwaV92ZXJzaW9uID0gc3RhdGUuc3RhdGVbInB5cGlfdmVyc2lvbiJdCgogICAgICAgICMgUmVmcmVzaCB0aGUgdmVyc2lvbiBpZiB3ZSBuZWVkIHRvIG9yIGp1c3Qgc2VlIGlmIHdlIG5lZWQgdG8gd2FybgogICAgICAgIGlmIHB5cGlfdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgICAgICBQeVBJLnBpcF9qc29uX3VybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJBY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHB5cGlfdmVyc2lvbiA9IFsKICAgICAgICAgICAgICAgIHYgZm9yIHYgaW4gc29ydGVkKAogICAgICAgICAgICAgICAgICAgIGxpc3QocmVzcC5qc29uKClbInJlbGVhc2VzIl0pLAogICAgICAgICAgICAgICAgICAgIGtleT1wYWNrYWdpbmdfdmVyc2lvbi5wYXJzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYWNrYWdpbmdfdmVyc2lvbi5wYXJzZSh2KS5pc19wcmVyZWxlYXNlCiAgICAgICAgICAgIF1bLTFdCgogICAgICAgICAgICAjIHNhdmUgdGhhdCB3ZSd2ZSBwZXJmb3JtZWQgYSBjaGVjawogICAgICAgICAgICBzdGF0ZS5zYXZlKHB5cGlfdmVyc2lvbiwgY3VycmVudF90aW1lKQoKICAgICAgICByZW1vdGVfdmVyc2lvbiA9IHBhY2thZ2luZ192ZXJzaW9uLnBhcnNlKHB5cGlfdmVyc2lvbikKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgb3VyIHB5cGlfdmVyc2lvbiBpcyBvbGRlcgogICAgICAgIGlmIChwaXBfdmVyc2lvbiA8IHJlbW90ZV92ZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgcGlwX3ZlcnNpb24uYmFzZV92ZXJzaW9uICE9IHJlbW90ZV92ZXJzaW9uLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICMgQWR2aXNlICJweXRob24gLW0gcGlwIiBvbiBXaW5kb3dzIHRvIGF2b2lkIGlzc3VlcwogICAgICAgICAgICAjIHdpdGggb3ZlcndyaXRpbmcgcGlwLmV4ZS4KICAgICAgICAgICAgaWYgV0lORE9XUzoKICAgICAgICAgICAgICAgIHBpcF9jbWQgPSAicHl0aG9uIC1tIHBpcCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBpcF9jbWQgPSAicGlwIgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJZb3UgYXJlIHVzaW5nIHBpcCB2ZXJzaW9uICVzLCBob3dldmVyIHZlcnNpb24gJXMgaXMgIgogICAgICAgICAgICAgICAgImF2YWlsYWJsZS5cbllvdSBzaG91bGQgY29uc2lkZXIgdXBncmFkaW5nIHZpYSB0aGUgIgogICAgICAgICAgICAgICAgIiclcyBpbnN0YWxsIC0tdXBncmFkZSBwaXAnIGNvbW1hbmQuIiwKICAgICAgICAgICAgICAgIHBpcF92ZXJzaW9uLCBweXBpX3ZlcnNpb24sIHBpcF9jbWQKICAgICAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAiVGhlcmUgd2FzIGFuIGVycm9yIGNoZWNraW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBwaXAiLAogICAgICAgICAgICBleGNfaW5mbz1UcnVlLAogICAgICAgICkKUEsDBBQAAAAAAAAAIQAN5pK4IAgAACAIAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9wYWNrYWdpbmcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCBzcGVjaWZpZXJzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCB2ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKCmZyb20gcGlwIGltcG9ydCBleGNlcHRpb25zCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgY2hlY2tfcmVxdWlyZXNfcHl0aG9uKHJlcXVpcmVzX3B5dGhvbik6CiAgICAiIiIKICAgIENoZWNrIGlmIHRoZSBweXRob24gdmVyc2lvbiBpbiB1c2UgbWF0Y2ggdGhlIGByZXF1aXJlc19weXRob25gIHNwZWNpZmllci4KCiAgICBSZXR1cm5zIGBUcnVlYCBpZiB0aGUgdmVyc2lvbiBvZiBweXRob24gaW4gdXNlIG1hdGNoZXMgdGhlIHJlcXVpcmVtZW50LgogICAgUmV0dXJucyBgRmFsc2VgIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbiB1c2UgZG9lcyBub3QgbWF0Y2hlcyB0aGUKICAgIHJlcXVpcmVtZW50LgoKICAgIFJhaXNlcyBhbiBJbnZhbGlkU3BlY2lmaWVyIGlmIGByZXF1aXJlc19weXRob25gIGhhdmUgYW4gaW52YWxpZCBmb3JtYXQuCiAgICAiIiIKICAgIGlmIHJlcXVpcmVzX3B5dGhvbiBpcyBOb25lOgogICAgICAgICMgVGhlIHBhY2thZ2UgcHJvdmlkZXMgbm8gaW5mb3JtYXRpb24KICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmVxdWlyZXNfcHl0aG9uX3NwZWNpZmllciA9IHNwZWNpZmllcnMuU3BlY2lmaWVyU2V0KHJlcXVpcmVzX3B5dGhvbikKCiAgICAjIFdlIG9ubHkgdXNlIG1ham9yLm1pbm9yLm1pY3JvCiAgICBweXRob25fdmVyc2lvbiA9IHZlcnNpb24ucGFyc2UoJy4nLmpvaW4obWFwKHN0ciwgc3lzLnZlcnNpb25faW5mb1s6M10pKSkKICAgIHJldHVybiBweXRob25fdmVyc2lvbiBpbiByZXF1aXJlc19weXRob25fc3BlY2lmaWVyCgoKZGVmIGdldF9tZXRhZGF0YShkaXN0KToKICAgIGlmIChpc2luc3RhbmNlKGRpc3QsIHBrZ19yZXNvdXJjZXMuRGlzdEluZm9EaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICBkaXN0Lmhhc19tZXRhZGF0YSgnTUVUQURBVEEnKSk6CiAgICAgICAgcmV0dXJuIGRpc3QuZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICBlbGlmIGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHJldHVybiBkaXN0LmdldF9tZXRhZGF0YSgnUEtHLUlORk8nKQoKCmRlZiBjaGVja19kaXN0X3JlcXVpcmVzX3B5dGhvbihkaXN0KToKICAgIG1ldGFkYXRhID0gZ2V0X21ldGFkYXRhKGRpc3QpCiAgICBmZWVkX3BhcnNlciA9IEZlZWRQYXJzZXIoKQogICAgZmVlZF9wYXJzZXIuZmVlZChtZXRhZGF0YSkKICAgIHBrZ19pbmZvX2RpY3QgPSBmZWVkX3BhcnNlci5jbG9zZSgpCiAgICByZXF1aXJlc19weXRob24gPSBwa2dfaW5mb19kaWN0LmdldCgnUmVxdWlyZXMtUHl0aG9uJykKICAgIHRyeToKICAgICAgICBpZiBub3QgY2hlY2tfcmVxdWlyZXNfcHl0aG9uKHJlcXVpcmVzX3B5dGhvbik6CiAgICAgICAgICAgIHJhaXNlIGV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uKAogICAgICAgICAgICAgICAgIiVzIHJlcXVpcmVzIFB5dGhvbiAnJXMnIGJ1dCB0aGUgcnVubmluZyBQeXRob24gaXMgJXMiICUgKAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICAnLicuam9pbihtYXAoc3RyLCBzeXMudmVyc2lvbl9pbmZvWzozXSkpLCkKICAgICAgICAgICAgKQogICAgZXhjZXB0IHNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllciBhcyBlOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAiUGFja2FnZSAlcyBoYXMgYW4gaW52YWxpZCBSZXF1aXJlcy1QeXRob24gZW50cnkgJXMgLSAlcyIgJSAoCiAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwgcmVxdWlyZXNfcHl0aG9uLCBlKSkKICAgICAgICByZXR1cm4KUEsDBBQAAAAAAAAAIQAWovJKFgEAABYBAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9zZXR1cHRvb2xzX2J1aWxkLnB5IyBTaGltIHRvIHdyYXAgc2V0dXAucHkgaW52b2NhdGlvbiB3aXRoIHNldHVwdG9vbHMKU0VUVVBUT09MU19TSElNID0gKAogICAgImltcG9ydCBzZXR1cHRvb2xzLCB0b2tlbml6ZTtfX2ZpbGVfXz0lcjsiCiAgICAiZj1nZXRhdHRyKHRva2VuaXplLCAnb3BlbicsIG9wZW4pKF9fZmlsZV9fKTsiCiAgICAiY29kZT1mLnJlYWQoKS5yZXBsYWNlKCdcXHJcXG4nLCAnXFxuJyk7IgogICAgImYuY2xvc2UoKTsiCiAgICAiZXhlYyhjb21waWxlKGNvZGUsIF9fZmlsZV9fLCAnZXhlYycpKSIKKQpQSwMEFAAAAAAAAAAhAOXikJVNLQAATS0AAB8AAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3VpLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3lzCmZyb20gc2lnbmFsIGltcG9ydCBzaWduYWwsIFNJR0lOVCwgZGVmYXVsdF9pbnRfaGFuZGxlcgppbXBvcnQgdGltZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgbG9nZ2luZwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTCmZyb20gcGlwLnV0aWxzIGltcG9ydCBmb3JtYXRfc2l6ZQpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBnZXRfaW5kZW50YXRpb24KZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3MuYmFyIGltcG9ydCBCYXIsIEluY3JlbWVudGFsQmFyCmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3MuaGVscGVycyBpbXBvcnQgKFdyaXRlbG5NaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElERV9DVVJTT1IsIFNIT1dfQ1VSU09SKQpmcm9tIHBpcC5fdmVuZG9yLnByb2dyZXNzLnNwaW5uZXIgaW1wb3J0IFNwaW5uZXIKCnRyeToKICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNvbG9yYW1hCiMgTG90cyBvZiBkaWZmZXJlbnQgZXJyb3JzIGNhbiBjb21lIGZyb20gdGhpcywgaW5jbHVkaW5nIFN5c3RlbUVycm9yIGFuZAojIEltcG9ydEVycm9yLgpleGNlcHQgRXhjZXB0aW9uOgogICAgY29sb3JhbWEgPSBOb25lCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgX3NlbGVjdF9wcm9ncmVzc19jbGFzcyhwcmVmZXJyZWQsIGZhbGxiYWNrKToKICAgIGVuY29kaW5nID0gZ2V0YXR0cihwcmVmZXJyZWQuZmlsZSwgImVuY29kaW5nIiwgTm9uZSkKCiAgICAjIElmIHdlIGRvbid0IGtub3cgd2hhdCBlbmNvZGluZyB0aGlzIGZpbGUgaXMgaW4sIHRoZW4gd2UnbGwganVzdCBhc3N1bWUKICAgICMgdGhhdCBpdCBkb2Vzbid0IHN1cHBvcnQgdW5pY29kZSBhbmQgdXNlIHRoZSBBU0NJSSBiYXIuCiAgICBpZiBub3QgZW5jb2Rpbmc6CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrCgogICAgIyBDb2xsZWN0IGFsbCBvZiB0aGUgcG9zc2libGUgY2hhcmFjdGVycyB3ZSB3YW50IHRvIHVzZSB3aXRoIHRoZSBwcmVmZXJyZWQKICAgICMgYmFyLgogICAgY2hhcmFjdGVycyA9IFsKICAgICAgICBnZXRhdHRyKHByZWZlcnJlZCwgImVtcHR5X2ZpbGwiLCBzaXgudGV4dF90eXBlKCkpLAogICAgICAgIGdldGF0dHIocHJlZmVycmVkLCAiZmlsbCIsIHNpeC50ZXh0X3R5cGUoKSksCiAgICBdCiAgICBjaGFyYWN0ZXJzICs9IGxpc3QoZ2V0YXR0cihwcmVmZXJyZWQsICJwaGFzZXMiLCBbXSkpCgogICAgIyBUcnkgdG8gZGVjb2RlIHRoZSBjaGFyYWN0ZXJzIHdlJ3JlIHVzaW5nIGZvciB0aGUgYmFyIHVzaW5nIHRoZSBlbmNvZGluZwogICAgIyBvZiB0aGUgZ2l2ZW4gZmlsZSwgaWYgdGhpcyB3b3JrcyB0aGVuIHdlJ2xsIGFzc3VtZSB0aGF0IHdlIGNhbiB1c2UgdGhlCiAgICAjIGZhbmNpZXIgYmFyIGFuZCBpZiBub3Qgd2UnbGwgZmFsbCBiYWNrIHRvIHRoZSBwbGFpbnRleHQgYmFyLgogICAgdHJ5OgogICAgICAgIHNpeC50ZXh0X3R5cGUoKS5qb2luKGNoYXJhY3RlcnMpLmVuY29kZShlbmNvZGluZykKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwcmVmZXJyZWQKCgpfQmFzZUJhciA9IF9zZWxlY3RfcHJvZ3Jlc3NfY2xhc3MoSW5jcmVtZW50YWxCYXIsIEJhcikKCgpjbGFzcyBJbnRlcnJ1cHRpYmxlTWl4aW4ob2JqZWN0KToKICAgICIiIgogICAgSGVscGVyIHRvIGVuc3VyZSB0aGF0IHNlbGYuZmluaXNoKCkgZ2V0cyBjYWxsZWQgb24ga2V5Ym9hcmQgaW50ZXJydXB0LgoKICAgIFRoaXMgYWxsb3dzIGRvd25sb2FkcyB0byBiZSBpbnRlcnJ1cHRlZCB3aXRob3V0IGxlYXZpbmcgdGVtcG9yYXJ5IHN0YXRlCiAgICAobGlrZSBoaWRkZW4gY3Vyc29ycykgYmVoaW5kLgoKICAgIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byB0aGUgcHJvZ3Jlc3MgbGlicmFyeSdzIGV4aXN0aW5nIFNpZ0ludE1peGluCiAgICBoZWxwZXIsIGJ1dCBhcyBvZiB2ZXJzaW9uIDEuMiwgdGhhdCBoZWxwZXIgaGFzIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6CgogICAgMS4gSXQgY2FsbHMgc3lzLmV4aXQoKS4KICAgIDIuIEl0IGRpc2NhcmRzIHRoZSBleGlzdGluZyBTSUdJTlQgaGFuZGxlciBjb21wbGV0ZWx5LgogICAgMy4gSXQgbGVhdmVzIGl0cyBvd24gaGFuZGxlciBpbiBwbGFjZSBldmVuIGFmdGVyIGFuIHVuaW50ZXJydXB0ZWQgZmluaXNoLAogICAgICAgd2hpY2ggd2lsbCBoYXZlIHVuZXhwZWN0ZWQgZGVsYXllZCBlZmZlY3RzIGlmIHRoZSB1c2VyIHRyaWdnZXJzIGFuCiAgICAgICB1bnJlbGF0ZWQga2V5Ym9hcmQgaW50ZXJydXB0IHNvbWUgdGltZSBhZnRlciBhIHByb2dyZXNzLWRpc3BsYXlpbmcKICAgICAgIGRvd25sb2FkIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgZm9yIGV4YW1wbGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBTYXZlIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlciBmb3IgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoSW50ZXJydXB0aWJsZU1peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlciA9IHNpZ25hbChTSUdJTlQsIHNlbGYuaGFuZGxlX3NpZ2ludCkKCiAgICAgICAgIyBJZiBzaWduYWwoKSByZXR1cm5zIE5vbmUsIHRoZSBwcmV2aW91cyBoYW5kbGVyIHdhcyBub3QgaW5zdGFsbGVkIGZyb20KICAgICAgICAjIFB5dGhvbiwgYW5kIHdlIGNhbm5vdCByZXN0b3JlIGl0LiBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgaGFwcGVuLAogICAgICAgICMgYnV0IGlmIGl0IGRvZXMsIHdlIG11c3QgcmVzdG9yZSBzb21ldGhpbmcgc2Vuc2libGUgaW5zdGVhZCwgYXQgbGVhc3QuCiAgICAgICAgIyBUaGUgbGVhc3QgYmFkIG9wdGlvbiBzaG91bGQgYmUgUHl0aG9uJ3MgZGVmYXVsdCBTSUdJTlQgaGFuZGxlciwgd2hpY2gKICAgICAgICAjIGp1c3QgcmFpc2VzIEtleWJvYXJkSW50ZXJydXB0LgogICAgICAgIGlmIHNlbGYub3JpZ2luYWxfaGFuZGxlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIgPSBkZWZhdWx0X2ludF9oYW5kbGVyCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXN0b3JlIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlciBhZnRlciBmaW5pc2hpbmcuCgogICAgICAgIFRoaXMgc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2dyZXNzIGRpc3BsYXkgZmluaXNoZXMKICAgICAgICBub3JtYWxseSwgb3IgZ2V0cyBpbnRlcnJ1cHRlZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihJbnRlcnJ1cHRpYmxlTWl4aW4sIHNlbGYpLmZpbmlzaCgpCiAgICAgICAgc2lnbmFsKFNJR0lOVCwgc2VsZi5vcmlnaW5hbF9oYW5kbGVyKQoKICAgIGRlZiBoYW5kbGVfc2lnaW50KHNlbGYsIHNpZ251bSwgZnJhbWUpOgogICAgICAgICIiIgogICAgICAgIENhbGwgc2VsZi5maW5pc2goKSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgb3JpZ2luYWwgU0lHSU5UIGhhbmRsZXIuCgogICAgICAgIFRoaXMgaGFuZGxlciBzaG91bGQgb25seSBiZSBpbiBwbGFjZSB3aGlsZSB0aGUgcHJvZ3Jlc3MgZGlzcGxheSBpcwogICAgICAgIGFjdGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbmlzaCgpCiAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpCgoKY2xhc3MgRG93bmxvYWRQcm9ncmVzc01peGluKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoRG93bmxvYWRQcm9ncmVzc01peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5tZXNzYWdlID0gKCIgIiAqIChnZXRfaW5kZW50YXRpb24oKSArIDIpKSArIHNlbGYubWVzc2FnZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRvd25sb2FkZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIGZvcm1hdF9zaXplKHNlbGYuaW5kZXgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG93bmxvYWRfc3BlZWQoc2VsZik6CiAgICAgICAgIyBBdm9pZCB6ZXJvIGRpdmlzaW9uIGVycm9ycy4uLgogICAgICAgIGlmIHNlbGYuYXZnID09IDAuMDoKICAgICAgICAgICAgcmV0dXJuICIuLi4iCiAgICAgICAgcmV0dXJuIGZvcm1hdF9zaXplKDEgLyBzZWxmLmF2ZykgKyAiL3MiCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJldHR5X2V0YShzZWxmKToKICAgICAgICBpZiBzZWxmLmV0YToKICAgICAgICAgICAgcmV0dXJuICJldGEgJXMiICUgc2VsZi5ldGFfdGQKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgaXRlcihzZWxmLCBpdCwgbj0xKToKICAgICAgICBmb3IgeCBpbiBpdDoKICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICBzZWxmLm5leHQobikKICAgICAgICBzZWxmLmZpbmlzaCgpCgoKY2xhc3MgV2luZG93c01peGluKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBUaGUgV2luZG93cyB0ZXJtaW5hbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBoaWRlL3Nob3cgY3Vyc29yIEFOU0kgY29kZXMKICAgICAgICAjIGV2ZW4gd2l0aCBjb2xvcmFtYS4gU28gd2UnbGwgZW5zdXJlIHRoYXQgaGlkZV9jdXJzb3IgaXMgRmFsc2Ugb24KICAgICAgICAjIFdpbmRvd3MuCiAgICAgICAgIyBUaGlzIGNhbGwgbmVkcyB0byBnbyBiZWZvcmUgdGhlIHN1cGVyKCkgY2FsbCwgc28gdGhhdCBoaWRlX2N1cnNvcgogICAgICAgICMgaXMgc2V0IGluIHRpbWUuIFRoZSBiYXNlIHByb2dyZXNzIGJhciBjbGFzcyB3cml0ZXMgdGhlICJoaWRlIGN1cnNvciIKICAgICAgICAjIGNvZGUgdG8gdGhlIHRlcm1pbmFsIGluIGl0cyBpbml0LCBzbyBpZiB3ZSBkb24ndCBzZXQgdGhpcyBzb29uCiAgICAgICAgIyBlbm91Z2gsIHdlIGdldCBhICJoaWRlIiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgInNob3ciLi4uCiAgICAgICAgaWYgV0lORE9XUyBhbmQgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgc2VsZi5oaWRlX2N1cnNvciA9IEZhbHNlCgogICAgICAgIHN1cGVyKFdpbmRvd3NNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICAjIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHdlIGhhdmUgdGhlIGNvbG9yYW1hIG1vZHVsZSwKICAgICAgICAjIGlmIHdlIGRvIHRoZW4gd3JhcCBvdXIgZmlsZSB3aXRoIGl0LgogICAgICAgIGlmIFdJTkRPV1MgYW5kIGNvbG9yYW1hOgogICAgICAgICAgICBzZWxmLmZpbGUgPSBjb2xvcmFtYS5BbnNpVG9XaW4zMihzZWxmLmZpbGUpCiAgICAgICAgICAgICMgVGhlIHByb2dyZXNzIGNvZGUgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNhbGwgc2VsZi5maWxlLmlzYXR0eSgpCiAgICAgICAgICAgICMgYnV0IHRoZSBjb2xvcmFtYS5BbnNpVG9XaW4zMigpIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhhdCwgc28gd2UnbGwKICAgICAgICAgICAgIyBhZGQgaXQuCiAgICAgICAgICAgIHNlbGYuZmlsZS5pc2F0dHkgPSBsYW1iZGE6IHNlbGYuZmlsZS53cmFwcGVkLmlzYXR0eSgpCiAgICAgICAgICAgICMgVGhlIHByb2dyZXNzIGNvZGUgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNhbGwgc2VsZi5maWxlLmZsdXNoKCkKICAgICAgICAgICAgIyBidXQgdGhlIGNvbG9yYW1hLkFuc2lUb1dpbjMyKCkgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGF0LCBzbyB3ZSdsbAogICAgICAgICAgICAjIGFkZCBpdC4KICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoID0gbGFtYmRhOiBzZWxmLmZpbGUud3JhcHBlZC5mbHVzaCgpCgoKY2xhc3MgRG93bmxvYWRQcm9ncmVzc0JhcihXaW5kb3dzTWl4aW4sIEludGVycnVwdGlibGVNaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFByb2dyZXNzTWl4aW4sIF9CYXNlQmFyKToKCiAgICBmaWxlID0gc3lzLnN0ZG91dAogICAgbWVzc2FnZSA9ICIlKHBlcmNlbnQpZCUlIgogICAgc3VmZml4ID0gIiUoZG93bmxvYWRlZClzICUoZG93bmxvYWRfc3BlZWQpcyAlKHByZXR0eV9ldGEpcyIKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzU3Bpbm5lcihXaW5kb3dzTWl4aW4sIEludGVycnVwdGlibGVNaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRQcm9ncmVzc01peGluLCBXcml0ZWxuTWl4aW4sIFNwaW5uZXIpOgoKICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICBzdWZmaXggPSAiJShkb3dubG9hZGVkKXMgJShkb3dubG9hZF9zcGVlZClzIgoKICAgIGRlZiBuZXh0X3BoYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGhhc2VyIik6CiAgICAgICAgICAgIHNlbGYuX3BoYXNlciA9IGl0ZXJ0b29scy5jeWNsZShzZWxmLnBoYXNlcykKICAgICAgICByZXR1cm4gbmV4dChzZWxmLl9waGFzZXIpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIHBoYXNlID0gc2VsZi5uZXh0X3BoYXNlKCkKICAgICAgICBzdWZmaXggPSBzZWxmLnN1ZmZpeCAlIHNlbGYKICAgICAgICBsaW5lID0gJycuam9pbihbCiAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICIgIiBpZiBtZXNzYWdlIGVsc2UgIiIsCiAgICAgICAgICAgIHBoYXNlLAogICAgICAgICAgICAiICIgaWYgc3VmZml4IGVsc2UgIiIsCiAgICAgICAgICAgIHN1ZmZpeCwKICAgICAgICBdKQoKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR2VuZXJpYyAic29tZXRoaW5nIGlzIGhhcHBlbmluZyIgc3Bpbm5lcnMKIwojIFdlIGRvbid0IGV2ZW4gdHJ5IHVzaW5nIHByb2dyZXNzLnNwaW5uZXIuU3Bpbm5lciBoZXJlIGJlY2F1c2UgaXQncyBhY3R1YWxseQojIHNpbXBsZXIgdG8gcmVpbXBsZW1lbnQgZnJvbSBzY3JhdGNoIHRoYW4gdG8gY29lcmNlIHRoZWlyIGNvZGUgaW50byBkb2luZwojIHdoYXQgd2UgbmVlZC4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGhpZGRlbl9jdXJzb3IoZmlsZSk6CiAgICAjIFRoZSBXaW5kb3dzIHRlcm1pbmFsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGhpZGUvc2hvdyBjdXJzb3IgQU5TSSBjb2RlcywKICAgICMgZXZlbiB2aWEgY29sb3JhbWEuIFNvIGRvbid0IGV2ZW4gdHJ5LgogICAgaWYgV0lORE9XUzoKICAgICAgICB5aWVsZAogICAgIyBXZSBkb24ndCB3YW50IHRvIGNsdXR0ZXIgdGhlIG91dHB1dCB3aXRoIGNvbnRyb2wgY2hhcmFjdGVycyBpZiB3ZSdyZQogICAgIyB3cml0aW5nIHRvIGEgZmlsZSwgb3IgaWYgdGhlIHVzZXIgaXMgcnVubmluZyB3aXRoIC0tcXVpZXQuCiAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzM0MTgKICAgIGVsaWYgbm90IGZpbGUuaXNhdHR5KCkgb3IgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPiBsb2dnaW5nLklORk86CiAgICAgICAgeWllbGQKICAgIGVsc2U6CiAgICAgICAgZmlsZS53cml0ZShISURFX0NVUlNPUikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZS53cml0ZShTSE9XX0NVUlNPUikKCgpjbGFzcyBSYXRlTGltaXRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcyk6CiAgICAgICAgc2VsZi5fbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzID0gbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzCiAgICAgICAgc2VsZi5fbGFzdF91cGRhdGUgPSAwCgogICAgZGVmIHJlYWR5KHNlbGYpOgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgZGVsdGEgPSBub3cgLSBzZWxmLl9sYXN0X3VwZGF0ZQogICAgICAgIHJldHVybiBkZWx0YSA+PSBzZWxmLl9taW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fbGFzdF91cGRhdGUgPSB0aW1lLnRpbWUoKQoKCmNsYXNzIEludGVyYWN0aXZlU3Bpbm5lcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIGZpbGU9Tm9uZSwgc3Bpbl9jaGFycz0iLVxcfC8iLAogICAgICAgICAgICAgICAgICMgRW1waXJpY2FsbHksIDggdXBkYXRlcy9zZWNvbmQgbG9va3MgbmljZQogICAgICAgICAgICAgICAgIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcz0wLjEyNSk6CiAgICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIgPSBSYXRlTGltaXRlcihtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMpCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBGYWxzZQoKICAgICAgICBzZWxmLl9zcGluX2N5Y2xlID0gaXRlcnRvb2xzLmN5Y2xlKHNwaW5fY2hhcnMpCgogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoIiAiICogZ2V0X2luZGVudGF0aW9uKCkgKyBzZWxmLl9tZXNzYWdlICsgIiAuLi4gIikKICAgICAgICBzZWxmLl93aWR0aCA9IDAKCiAgICBkZWYgX3dyaXRlKHNlbGYsIHN0YXR1cyk6CiAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9maW5pc2hlZAogICAgICAgICMgRXJhc2Ugd2hhdCB3ZSB3cm90ZSBiZWZvcmUgYnkgYmFja3NwYWNpbmcgdG8gdGhlIGJlZ2lubmluZywgd3JpdGluZwogICAgICAgICMgc3BhY2VzIHRvIG92ZXJ3cml0ZSB0aGUgb2xkIHRleHQsIGFuZCB0aGVuIGJhY2tzcGFjaW5nIGFnYWluCiAgICAgICAgYmFja3VwID0gIlxiIiAqIHNlbGYuX3dpZHRoCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZShiYWNrdXAgKyAiICIgKiBzZWxmLl93aWR0aCArIGJhY2t1cCkKICAgICAgICAjIE5vdyB3ZSBoYXZlIGEgYmxhbmsgc2xhdGUgdG8gYWRkIG91ciBzdGF0dXMKICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0YXR1cykKICAgICAgICBzZWxmLl93aWR0aCA9IGxlbihzdGF0dXMpCiAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyLnJlc2V0KCkKCiAgICBkZWYgc3BpbihzZWxmKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IHNlbGYuX3JhdGVfbGltaXRlci5yZWFkeSgpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl93cml0ZShuZXh0KHNlbGYuX3NwaW5fY3ljbGUpKQoKICAgIGRlZiBmaW5pc2goc2VsZiwgZmluYWxfc3RhdHVzKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fd3JpdGUoZmluYWxfc3RhdHVzKQogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoIlxuIikKICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IFRydWUKCgojIFVzZWQgZm9yIGR1bWIgdGVybWluYWxzLCBub24taW50ZXJhY3RpdmUgaW5zdGFsbHMgKG5vIHR0eSksIGV0Yy4KIyBXZSBzdGlsbCBwcmludCB1cGRhdGVzIG9jY2FzaW9uYWxseSAob25jZSBldmVyeSA2MCBzZWNvbmRzIGJ5IGRlZmF1bHQpIHRvCiMgYWN0IGFzIGEga2VlcC1hbGl2ZSBmb3Igc3lzdGVtcyBsaWtlIFRyYXZpcy1DSSB0aGF0IHRha2UgbGFjay1vZi1vdXRwdXQgYXMKIyBhbiBpbmRpY2F0aW9uIHRoYXQgYSB0YXNrIGhhcyBmcm96ZW4uCmNsYXNzIE5vbkludGVyYWN0aXZlU3Bpbm5lcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcz02MCk6CiAgICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyID0gUmF0ZUxpbWl0ZXIobWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzKQogICAgICAgIHNlbGYuX3VwZGF0ZSgic3RhcnRlZCIpCgogICAgZGVmIF91cGRhdGUoc2VsZiwgc3RhdHVzKToKICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2ZpbmlzaGVkCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyLnJlc2V0KCkKICAgICAgICBsb2dnZXIuaW5mbygiJXM6ICVzIiwgc2VsZi5fbWVzc2FnZSwgc3RhdHVzKQoKICAgIGRlZiBzcGluKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3Qgc2VsZi5fcmF0ZV9saW1pdGVyLnJlYWR5KCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3VwZGF0ZSgic3RpbGwgcnVubmluZy4uLiIpCgogICAgZGVmIGZpbmlzaChzZWxmLCBmaW5hbF9zdGF0dXMpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl91cGRhdGUoImZpbmlzaGVkIHdpdGggc3RhdHVzICclcyciICUgKGZpbmFsX3N0YXR1cywpKQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gVHJ1ZQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvcGVuX3NwaW5uZXIobWVzc2FnZSk6CiAgICAjIEludGVyYWN0aXZlIHNwaW5uZXIgZ29lcyBkaXJlY3RseSB0byBzeXMuc3Rkb3V0IHJhdGhlciB0aGFuIGJlaW5nIHJvdXRlZAogICAgIyB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbSwgYnV0IGl0IGFjdHMgbGlrZSBpdCBoYXMgbGV2ZWwgSU5GTywKICAgICMgaS5lLiBpdCdzIG9ubHkgZGlzcGxheWVkIGlmIHdlJ3JlIGF0IGxldmVsIElORk8gb3IgYmV0dGVyLgogICAgIyBOb24taW50ZXJhY3RpdmUgc3Bpbm5lciBnb2VzIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtLCBzbyBpdCBpcyBhbHdheXMKICAgICMgaW4gc3luYyB3aXRoIGxvZ2dpbmcgY29uZmlndXJhdGlvbi4KICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCkgYW5kIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpIDw9IGxvZ2dpbmcuSU5GTzoKICAgICAgICBzcGlubmVyID0gSW50ZXJhY3RpdmVTcGlubmVyKG1lc3NhZ2UpCiAgICBlbHNlOgogICAgICAgIHNwaW5uZXIgPSBOb25JbnRlcmFjdGl2ZVNwaW5uZXIobWVzc2FnZSkKICAgIHRyeToKICAgICAgICB3aXRoIGhpZGRlbl9jdXJzb3Ioc3lzLnN0ZG91dCk6CiAgICAgICAgICAgIHlpZWxkIHNwaW5uZXIKICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICBzcGlubmVyLmZpbmlzaCgiY2FuY2VsZWQiKQogICAgICAgIHJhaXNlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHNwaW5uZXIuZmluaXNoKCJlcnJvciIpCiAgICAgICAgcmFpc2UKICAgIGVsc2U6CiAgICAgICAgc3Bpbm5lci5maW5pc2goImRvbmUiKQpQSwMEFAAAAAAAAAAhAMhWxUtWMAAAVjAAACMAAABweXBpX19waXBfOV8wXzMvcGlwL3Zjcy9fX2luaXRfXy5weSIiIkhhbmRsZXMgYWxsIFZDUyAodmVyc2lvbiBjb250cm9sKSBzdXBwb3J0IiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZXJybm8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEJhZENvbW1hbmQKZnJvbSBwaXAudXRpbHMgaW1wb3J0IChkaXNwbGF5X3BhdGgsIGJhY2t1cF9kaXIsIGNhbGxfc3VicHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICBybXRyZWUsIGFza19wYXRoX2V4aXN0cykKCgpfX2FsbF9fID0gWyd2Y3MnLCAnZ2V0X3NyY19yZXF1aXJlbWVudCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVmNzU3VwcG9ydChvYmplY3QpOgogICAgX3JlZ2lzdHJ5ID0ge30KICAgIHNjaGVtZXMgPSBbJ3NzaCcsICdnaXQnLCAnaGcnLCAnYnpyJywgJ3NmdHAnLCAnc3ZuJ10KCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBSZWdpc3RlciBtb3JlIHNjaGVtZXMgd2l0aCB1cmxwYXJzZSBmb3IgdmFyaW91cyB2ZXJzaW9uIGNvbnRyb2wKICAgICAgICAjIHN5c3RlbXMKICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19uZXRsb2MuZXh0ZW5kKHNlbGYuc2NoZW1lcykKICAgICAgICAjIFB5dGhvbiA+PSAyLjcuNCwgMy4zIGRvZXNuJ3QgaGF2ZSB1c2VzX2ZyYWdtZW50CiAgICAgICAgaWYgZ2V0YXR0cih1cmxsaWJfcGFyc2UsICd1c2VzX2ZyYWdtZW50JywgTm9uZSk6CiAgICAgICAgICAgIHVybGxpYl9wYXJzZS51c2VzX2ZyYWdtZW50LmV4dGVuZChzZWxmLnNjaGVtZXMpCiAgICAgICAgc3VwZXIoVmNzU3VwcG9ydCwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcmVnaXN0cnkuX19pdGVyX18oKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhY2tlbmRzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3JlZ2lzdHJ5LnZhbHVlcygpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpcm5hbWVzKHNlbGYpOgogICAgICAgIHJldHVybiBbYmFja2VuZC5kaXJuYW1lIGZvciBiYWNrZW5kIGluIHNlbGYuYmFja2VuZHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYWxsX3NjaGVtZXMoc2VsZik6CiAgICAgICAgc2NoZW1lcyA9IFtdCiAgICAgICAgZm9yIGJhY2tlbmQgaW4gc2VsZi5iYWNrZW5kczoKICAgICAgICAgICAgc2NoZW1lcy5leHRlbmQoYmFja2VuZC5zY2hlbWVzKQogICAgICAgIHJldHVybiBzY2hlbWVzCgogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGNscyk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAnbmFtZScpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IHJlZ2lzdGVyIFZDUyAlcycsIGNscy5fX25hbWVfXykKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgY2xzLm5hbWUgbm90IGluIHNlbGYuX3JlZ2lzdHJ5OgogICAgICAgICAgICBzZWxmLl9yZWdpc3RyeVtjbHMubmFtZV0gPSBjbHMKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZWdpc3RlcmVkIFZDUyBiYWNrZW5kOiAlcycsIGNscy5uYW1lKQoKICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGNscz1Ob25lLCBuYW1lPU5vbmUpOgogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fcmVnaXN0cnk6CiAgICAgICAgICAgIGRlbCBzZWxmLl9yZWdpc3RyeVtuYW1lXQogICAgICAgIGVsaWYgY2xzIGluIHNlbGYuX3JlZ2lzdHJ5LnZhbHVlcygpOgogICAgICAgICAgICBkZWwgc2VsZi5fcmVnaXN0cnlbY2xzLm5hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCB1bnJlZ2lzdGVyIGJlY2F1c2Ugbm8gY2xhc3Mgb3IgbmFtZSBnaXZlbicpCgogICAgZGVmIGdldF9iYWNrZW5kX25hbWUoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmVyc2lvbiBjb250cm9sIGJhY2tlbmQgaWYgZm91bmQgYXQgZ2l2ZW4KICAgICAgICBsb2NhdGlvbiwgZS5nLiB2Y3MuZ2V0X2JhY2tlbmRfbmFtZSgnL3BhdGgvdG8vdmNzL2NoZWNrb3V0JykKICAgICAgICAiIiIKICAgICAgICBmb3IgdmNfdHlwZSBpbiBzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKToKICAgICAgICAgICAgaWYgdmNfdHlwZS5jb250cm9sc19sb2NhdGlvbihsb2NhdGlvbik6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RldGVybWluZSB0aGF0ICVzIHVzZXMgVkNTOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIHZjX3R5cGUubmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiB2Y190eXBlLm5hbWUKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfYmFja2VuZChzZWxmLCBuYW1lKToKICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9yZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlZ2lzdHJ5W25hbWVdCgogICAgZGVmIGdldF9iYWNrZW5kX2Zyb21fbG9jYXRpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHZjX3R5cGUgPSBzZWxmLmdldF9iYWNrZW5kX25hbWUobG9jYXRpb24pCiAgICAgICAgaWYgdmNfdHlwZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2JhY2tlbmQodmNfdHlwZSkKICAgICAgICByZXR1cm4gTm9uZQoKCnZjcyA9IFZjc1N1cHBvcnQoKQoKCmNsYXNzIFZlcnNpb25Db250cm9sKG9iamVjdCk6CiAgICBuYW1lID0gJycKICAgIGRpcm5hbWUgPSAnJwogICAgIyBMaXN0IG9mIHN1cHBvcnRlZCBzY2hlbWVzIGZvciB0aGlzIFZlcnNpb24gQ29udHJvbAogICAgc2NoZW1lcyA9ICgpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc3VwZXIoVmVyc2lvbkNvbnRyb2wsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgX2lzX2xvY2FsX3JlcG9zaXRvcnkoc2VsZiwgcmVwbyk6CiAgICAgICAgIiIiCiAgICAgICAgICAgcG9zaXggYWJzb2x1dGUgcGF0aHMgc3RhcnQgd2l0aCBvcy5wYXRoLnNlcCwKICAgICAgICAgICB3aW4zMiBvbmVzIHN0YXJ0IHdpdGggZHJpdmUgKGxpa2UgYzpcXGZvbGRlcikKICAgICAgICAiIiIKICAgICAgICBkcml2ZSwgdGFpbCA9IG9zLnBhdGguc3BsaXRkcml2ZShyZXBvKQogICAgICAgIHJldHVybiByZXBvLnN0YXJ0c3dpdGgob3MucGF0aC5zZXApIG9yIGRyaXZlCgogICAgIyBTZWUgaXNzdWUgIzEwODMgZm9yIHdoeSB0aGlzIG1ldGhvZCB3YXMgaW50cm9kdWNlZDoKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xMDgzCiAgICBkZWYgdHJhbnNsYXRlX2VnZ19zdXJuYW1lKHNlbGYsIHN1cm5hbWUpOgogICAgICAgICMgRm9yIGV4YW1wbGUsIERqYW5nbyBoYXMgYnJhbmNoZXMgb2YgdGhlIGZvcm0gInN0YWJsZS8xLjcueCIuCiAgICAgICAgcmV0dXJuIHN1cm5hbWUucmVwbGFjZSgnLycsICdfJykKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBFeHBvcnQgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KICAgICAgICBpLmUuIG9ubHkgZG93bmxvYWQgdGhlIGZpbGVzLCB3aXRob3V0IHZjcyBpbmZvcm1hdGlvbnMKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIGNvcnJlY3QgcmVwb3NpdG9yeSBVUkwgYW5kIHJldmlzaW9uIGJ5IHBhcnNpbmcgdGhlIGdpdmVuCiAgICAgICAgcmVwb3NpdG9yeSBVUkwKICAgICAgICAiIiIKICAgICAgICBlcnJvcl9tZXNzYWdlID0gKAogICAgICAgICAgICAiU29ycnksICclcycgaXMgYSBtYWxmb3JtZWQgVkNTIHVybC4gIgogICAgICAgICAgICAiVGhlIGZvcm1hdCBpcyA8dmNzPis8cHJvdG9jb2w+Oi8vPHVybD4sICIKICAgICAgICAgICAgImUuZy4gc3ZuK2h0dHA6Ly9teXJlcG8vc3ZuL015QXBwI2VnZz1NeUFwcCIKICAgICAgICApCiAgICAgICAgYXNzZXJ0ICcrJyBpbiBzZWxmLnVybCwgZXJyb3JfbWVzc2FnZSAlIHNlbGYudXJsCiAgICAgICAgdXJsID0gc2VsZi51cmwuc3BsaXQoJysnLCAxKVsxXQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgcmV2ID0gTm9uZQogICAgICAgIGlmICdAJyBpbiBwYXRoOgogICAgICAgICAgICBwYXRoLCByZXYgPSBwYXRoLnJzcGxpdCgnQCcsIDEpCiAgICAgICAgdXJsID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgJycpKQogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfaW5mbyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyAodXJsLCByZXZpc2lvbiksIHdoZXJlIGJvdGggYXJlIHN0cmluZ3MKICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgbm90IGxvY2F0aW9uLnJzdHJpcCgnLycpLmVuZHN3aXRoKHNlbGYuZGlybmFtZSksIFwKICAgICAgICAgICAgJ0JhZCBkaXJlY3Rvcnk6ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3VybChsb2NhdGlvbiksIHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQoKICAgIGRlZiBub3JtYWxpemVfdXJsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgTm9ybWFsaXplIGEgVVJMIGZvciBjb21wYXJpc29uIGJ5IHVucXVvdGluZyBpdCBhbmQgcmVtb3ZpbmcgYW55CiAgICAgICAgdHJhaWxpbmcgc2xhc2guCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51bnF1b3RlKHVybCkucnN0cmlwKCcvJykKCiAgICBkZWYgY29tcGFyZV91cmxzKHNlbGYsIHVybDEsIHVybDIpOgogICAgICAgICIiIgogICAgICAgIENvbXBhcmUgdHdvIHJlcG8gVVJMcyBmb3IgaWRlbnRpdHksIGlnbm9yaW5nIGluY2lkZW50YWwgZGlmZmVyZW5jZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5vcm1hbGl6ZV91cmwodXJsMSkgPT0gc2VsZi5ub3JtYWxpemVfdXJsKHVybDIpKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHdoZW4gaW5zdGFsbGluZyBvciB1cGRhdGluZyBhbiBlZGl0YWJsZSBwYWNrYWdlLCB0YWtlcyB0aGUKICAgICAgICBzb3VyY2UgcGF0aCBvZiB0aGUgY2hlY2tvdXQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgU3dpdGNoIHRoZSByZXBvIGF0IGBgZGVzdGBgIHRvIHBvaW50IHRvIGBgVVJMYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSBhbiBhbHJlYWR5LWV4aXN0aW5nIHJlcG8gdG8gdGhlIGdpdmVuIGBgcmV2X29wdGlvbnNgYC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSB2ZXJzaW9uIGlzIGlkZW50aWNhbCB0byB3aGF0IGV4aXN0cyBhbmQKICAgICAgICBkb2Vzbid0IG5lZWQgdG8gYmUgdXBkYXRlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNoZWNrX2Rlc3RpbmF0aW9uKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIGEgbG9jYXRpb24gdG8gcmVjZWl2ZSBhIGNoZWNrb3V0L2Nsb25lLgoKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgbG9jYXRpb24gaXMgcmVhZHkgZm9yIChhbmQgcmVxdWlyZXMpIGEKICAgICAgICBjaGVja291dC9jbG9uZSwgRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgIGNoZWNrb3V0ID0gVHJ1ZQogICAgICAgIHByb21wdCA9IEZhbHNlCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgIGNoZWNrb3V0ID0gRmFsc2UKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRlc3QsIHNlbGYuZGlybmFtZSkpOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfdXJsID0gc2VsZi5nZXRfdXJsKGRlc3QpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbXBhcmVfdXJscyhleGlzdGluZ191cmwsIHVybCk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgaW4gJXMgZXhpc3RzLCBhbmQgaGFzIGNvcnJlY3QgVVJMICglcyknLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZS50aXRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdmVyc2lvbihkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VwZGF0aW5nICVzICVzJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZShkZXN0LCByZXZfb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBiZWNhdXNlIGFscmVhZHkgdXAtdG8tZGF0ZS4nKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzICVzIGluICVzIGV4aXN0cyB3aXRoIFVSTCAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfdXJsLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBwcm9tcHQgPSAoJyhzKXdpdGNoLCAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3MnLCAnaScsICd3JywgJ2InKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdEaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMsIGFuZCBpcyBub3QgYSAlcyAlcy4nLAogICAgICAgICAgICAgICAgICAgIGRlc3QsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHJvbXB0ID0gKCcoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCAnLCAoJ2knLCAndycsICdiJykpCiAgICAgICAgaWYgcHJvbXB0OgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdUaGUgcGxhbiBpcyB0byBpbnN0YWxsIHRoZSAlcyByZXBvc2l0b3J5ICVzJywKICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygnV2hhdCB0byBkbz8gICVzJyAlIHByb21wdFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0WzFdKQoKICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ3MnOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1N3aXRjaGluZyAlcyAlcyB0byAlcyVzJywKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5zd2l0Y2goZGVzdCwgdXJsLCByZXZfb3B0aW9ucykKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnaSc6CiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGVsZXRpbmcgJXMnLCBkaXNwbGF5X3BhdGgoZGVzdCkpCiAgICAgICAgICAgICAgICBybXRyZWUoZGVzdCkKICAgICAgICAgICAgICAgIGNoZWNrb3V0ID0gVHJ1ZQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgICAgIGRlc3RfZGlyID0gYmFja3VwX2RpcihkZXN0KQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0JhY2tpbmcgdXAgJXMgdG8gJXMnLCBkaXNwbGF5X3BhdGgoZGVzdCksIGRlc3RfZGlyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoZGVzdCwgZGVzdF9kaXIpCiAgICAgICAgICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYSc6CiAgICAgICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgICAgICByZXR1cm4gY2hlY2tvdXQKCiAgICBkZWYgdW5wYWNrKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBDbGVhbiB1cCBjdXJyZW50IGxvY2F0aW9uIGFuZCBkb3dubG9hZCB0aGUgdXJsIHJlcG9zaXRvcnkKICAgICAgICAoYW5kIHZjcyBpbmZvcykgaW50byBsb2NhdGlvbgogICAgICAgICIiIgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2F0aW9uKToKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHNlbGYub2J0YWluKGxvY2F0aW9uKQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZXF1aXJlbWVudCBuZWVkZWQgdG8KICAgICAgICByZWRvd25sb2FkIHRoZSBmaWxlcyBjdXJyZW50bHkgcHJlc2VudCBpbiBsb2NhdGlvbiwgc29tZXRoaW5nCiAgICAgICAgbGlrZToKICAgICAgICAgIHtyZXBvc2l0b3J5X3VybH1Ae3JldmlzaW9ufSNlZ2c9e3Byb2plY3RfbmFtZX0te3ZlcnNpb25faWRlbnRpZmllcn0KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgdXJsIHVzZWQgYXQgbG9jYXRpb24KICAgICAgICBVc2VkIGluIGdldF9pbmZvIG9yIGNoZWNrX2Rlc3RpbmF0aW9uCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgY3VycmVudCByZXZpc2lvbiBvZiB0aGUgZmlsZXMgYXQgbG9jYXRpb24KICAgICAgICBVc2VkIGluIGdldF9pbmZvCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsIHNob3dfc3Rkb3V0PVRydWUsIGN3ZD1Ob25lLAogICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGU9J3JhaXNlJywKICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBleHRyYV9lbnZpcm9uPU5vbmUsIHNwaW5uZXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIGEgVkNTIHN1YmNvbW1hbmQKICAgICAgICBUaGlzIGlzIHNpbXBseSBhIHdyYXBwZXIgYXJvdW5kIGNhbGxfc3VicHJvY2VzcyB0aGF0IGFkZHMgdGhlIFZDUwogICAgICAgIGNvbW1hbmQgbmFtZSwgYW5kIGNoZWNrcyB0aGF0IHRoZSBWQ1MgaXMgYXZhaWxhYmxlCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYubmFtZV0gKyBjbWQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjYWxsX3N1YnByb2Nlc3MoY21kLCBzaG93X3N0ZG91dCwgY3dkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjLCBleHRyYV9lbnZpcm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXIpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgIyBlcnJuby5FTk9FTlQgPSBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAgICAgICAgICAgICMgSW4gb3RoZXIgd29yZHMsIHRoZSBWQ1MgZXhlY3V0YWJsZSBpc24ndCBhdmFpbGFibGUKICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgICAgICByYWlzZSBCYWRDb21tYW5kKCdDYW5ub3QgZmluZCBjb21tYW5kICVyJyAlIHNlbGYubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlICAjIHJlLXJhaXNlIGV4Y2VwdGlvbiBpZiBhIGRpZmZlcmVudCBlcnJvciBvY2N1cnJlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNvbnRyb2xzX2xvY2F0aW9uKGNscywgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIGEgbG9jYXRpb24gaXMgY29udHJvbGxlZCBieSB0aGUgdmNzLgogICAgICAgIEl0IGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gdG8gaW1wbGVtZW50IHNtYXJ0ZXIgZGV0ZWN0aW9uCiAgICAgICAgbWVjaGFuaXNtcyBmb3Igc3BlY2lmaWMgdmNzLgogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgaW4gJXMgZm9yICVzICglcykuLi4nLAogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgY2xzLmRpcm5hbWUsIGNscy5uYW1lKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGNscy5kaXJuYW1lKQogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKCmRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsIGxvY2F0aW9uKToKICAgIHZlcnNpb25fY29udHJvbCA9IHZjcy5nZXRfYmFja2VuZF9mcm9tX2xvY2F0aW9uKGxvY2F0aW9uKQogICAgaWYgdmVyc2lvbl9jb250cm9sOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25fY29udHJvbCgpLmdldF9zcmNfcmVxdWlyZW1lbnQoZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pCiAgICAgICAgZXhjZXB0IEJhZENvbW1hbmQ6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ2Nhbm5vdCBkZXRlcm1pbmUgdmVyc2lvbiBvZiBlZGl0YWJsZSBzb3VyY2UgaW4gJXMgJwogICAgICAgICAgICAgICAgJyglcyBjb21tYW5kIG5vdCBmb3VuZCBpbiBwYXRoKScsCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgICAgIHZlcnNpb25fY29udHJvbC5uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICdjYW5ub3QgZGV0ZXJtaW5lIHZlcnNpb24gb2YgZWRpdGFibGUgc291cmNlIGluICVzIChpcyBub3QgU1ZOICcKICAgICAgICAnY2hlY2tvdXQsIEdpdCBjbG9uZSwgTWVyY3VyaWFsIGNsb25lIG9yIEJhemFhciBicmFuY2gpJywKICAgICAgICBsb2NhdGlvbiwKICAgICkKICAgIHJldHVybiBkaXN0LmFzX3JlcXVpcmVtZW50KCkKUEsDBBQAAAAAAAAAIQD7wMzF2w4AANsOAAAhAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvYmF6YWFyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKCiMgVE9ETzogR2V0IHRoaXMgaW50byBzaXgubW92ZXMudXJsbGliLnBhcnNlCnRyeToKICAgIGZyb20gdXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHVybHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZSwgZGlzcGxheV9wYXRoCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBWZXJzaW9uQ29udHJvbApmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgcGF0aF90b191cmwKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBCYXphYXIoVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdienInCiAgICBkaXJuYW1lID0gJy5ienInCiAgICByZXBvX25hbWUgPSAnYnJhbmNoJwogICAgc2NoZW1lcyA9ICgKICAgICAgICAnYnpyJywgJ2J6citodHRwJywgJ2J6citodHRwcycsICdienIrc3NoJywgJ2J6citzZnRwJywgJ2J6citmdHAnLAogICAgICAgICdienIrbHAnLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihCYXphYXIsIHNlbGYpLl9faW5pdF9fKHVybCwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICMgUHl0aG9uID49IDIuNy40LCAzLjMgZG9lc24ndCBoYXZlIHVzZXNfZnJhZ21lbnQgb3Igbm9uX2hpZXJhcmNoaWNhbAogICAgICAgICMgUmVnaXN0ZXIgbHAgYnV0IGRvIG5vdCBleHBvc2UgYXMgYSBzY2hlbWUgdG8gc3VwcG9ydCBienIrbHAuCiAgICAgICAgaWYgZ2V0YXR0cih1cmxsaWJfcGFyc2UsICd1c2VzX2ZyYWdtZW50JywgTm9uZSk6CiAgICAgICAgICAgIHVybGxpYl9wYXJzZS51c2VzX2ZyYWdtZW50LmV4dGVuZChbJ2xwJ10pCiAgICAgICAgICAgIHVybGxpYl9wYXJzZS5ub25faGllcmFyY2hpY2FsLmV4dGVuZChbJ2xwJ10pCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgRXhwb3J0IHRoZSBCYXphYXIgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgogICAgICAgICIiIgogICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLWV4cG9ydCcsICdwaXAtJykKICAgICAgICBzZWxmLnVucGFjayh0ZW1wX2RpcikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhdGlvbik6CiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBsb2NhdGlvbiB0byBtYWtlIHN1cmUgQmF6YWFyIGNhbiBleHBvcnQgaXQgY29ycmVjdGx5CiAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydleHBvcnQnLCBsb2NhdGlvbl0sIGN3ZD10ZW1wX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUodGVtcF9kaXIpCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnc3dpdGNoJywgdXJsXSwgY3dkPWRlc3QpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3B1bGwnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFsnLXInLCByZXZdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gcmV2aXNpb24gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gW10KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDaGVja2luZyBvdXQgJXMlcyB0byAlcycsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnYnJhbmNoJywgJy1xJ10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGRlc3RdKQoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAjIGhvdGZpeCB0aGUgVVJMIHNjaGVtZSBhZnRlciByZW1vdmluZyBienIrIGZyb20gYnpyK3NzaDovLyByZWFkZCBpdAogICAgICAgIHVybCwgcmV2ID0gc3VwZXIoQmF6YWFyLCBzZWxmKS5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ3NzaDovLycpOgogICAgICAgICAgICB1cmwgPSAnYnpyKycgKyB1cmwKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgdXJscyA9IHNlbGYucnVuX2NvbW1hbmQoWydpbmZvJ10sIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgZm9yIGxpbmUgaW4gdXJscy5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgZm9yIHggaW4gKCdjaGVja291dCBvZiBicmFuY2g6ICcsCiAgICAgICAgICAgICAgICAgICAgICAncGFyZW50IGJyYW5jaDogJyk6CiAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoeCk6CiAgICAgICAgICAgICAgICAgICAgcmVwbyA9IGxpbmUuc3BsaXQoeClbMV0KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19sb2NhbF9yZXBvc2l0b3J5KHJlcG8pOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF90b191cmwocmVwbykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwbwogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgcmV2aXNpb24gPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3Jldm5vJ10sIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgcmV0dXJuIHJldmlzaW9uLnNwbGl0bGluZXMoKVstMV0KCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiBub3QgcmVwbzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3QgcmVwby5sb3dlcigpLnN0YXJ0c3dpdGgoJ2J6cjonKToKICAgICAgICAgICAgcmVwbyA9ICdienIrJyArIHJlcG8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICBjdXJyZW50X3JldiA9IHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQogICAgICAgIHJldHVybiAnJXNAJXMjZWdnPSVzJyAlIChyZXBvLCBjdXJyZW50X3JldiwgZWdnX3Byb2plY3RfbmFtZSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQWx3YXlzIGFzc3VtZSB0aGUgdmVyc2lvbnMgZG9uJ3QgbWF0Y2giIiIKICAgICAgICByZXR1cm4gRmFsc2UKCgp2Y3MucmVnaXN0ZXIoQmF6YWFyKQpQSwMEFAAAAAAAAAAhACi+3jC9KwAAvSsAAB4AAABweXBpX19waXBfOV8wXzMvcGlwL3Zjcy9naXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBvcy5wYXRoCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHNhbWVmaWxlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEJhZENvbW1hbmQKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCByZXF1ZXN0IGFzIHVybGxpYl9yZXF1ZXN0CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkaXNwbGF5X3BhdGgsIHJtdHJlZQpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKCgp1cmxzcGxpdCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdAp1cmx1bnNwbGl0ID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBHaXQoVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdnaXQnCiAgICBkaXJuYW1lID0gJy5naXQnCiAgICByZXBvX25hbWUgPSAnY2xvbmUnCiAgICBzY2hlbWVzID0gKAogICAgICAgICdnaXQnLCAnZ2l0K2h0dHAnLCAnZ2l0K2h0dHBzJywgJ2dpdCtzc2gnLCAnZ2l0K2dpdCcsICdnaXQrZmlsZScsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgoKICAgICAgICAjIFdvcmtzIGFyb3VuZCBhbiBhcHBhcmVudCBHaXQgYnVnCiAgICAgICAgIyAoc2VlIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQvMTQ2NTAwKQogICAgICAgIGlmIHVybDoKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHNwbGl0KHVybCkKICAgICAgICAgICAgaWYgc2NoZW1lLmVuZHN3aXRoKCdmaWxlJyk6CiAgICAgICAgICAgICAgICBpbml0aWFsX3NsYXNoZXMgPSBwYXRoWzotbGVuKHBhdGgubHN0cmlwKCcvJykpXQogICAgICAgICAgICAgICAgbmV3cGF0aCA9ICgKICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3NsYXNoZXMgKwogICAgICAgICAgICAgICAgICAgIHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsICcvJykubHN0cmlwKCcvJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVybCA9IHVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBuZXdwYXRoLCBxdWVyeSwgZnJhZ21lbnQpKQogICAgICAgICAgICAgICAgYWZ0ZXJfcGx1cyA9IHNjaGVtZS5maW5kKCcrJykgKyAxCiAgICAgICAgICAgICAgICB1cmwgPSBzY2hlbWVbOmFmdGVyX3BsdXNdICsgdXJsdW5zcGxpdCgKICAgICAgICAgICAgICAgICAgICAoc2NoZW1lW2FmdGVyX3BsdXM6XSwgbmV0bG9jLCBuZXdwYXRoLCBxdWVyeSwgZnJhZ21lbnQpLAogICAgICAgICAgICAgICAgKQoKICAgICAgICBzdXBlcihHaXQsIHNlbGYpLl9faW5pdF9fKHVybCwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBnZXRfZ2l0X3ZlcnNpb24oc2VsZik6CiAgICAgICAgVkVSU0lPTl9QRlggPSAnZ2l0IHZlcnNpb24gJwogICAgICAgIHZlcnNpb24gPSBzZWxmLnJ1bl9jb21tYW5kKFsndmVyc2lvbiddLCBzaG93X3N0ZG91dD1GYWxzZSkKICAgICAgICBpZiB2ZXJzaW9uLnN0YXJ0c3dpdGgoVkVSU0lPTl9QRlgpOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbltsZW4oVkVSU0lPTl9QRlgpOl0KICAgICAgICBlbHNlOgogICAgICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICAjIGdldCBmaXJzdCAzIHBvc2l0aW9ucyBvZiB0aGUgZ2l0IHZlcnNpb24gYmVjYXN1ZQogICAgICAgICMgb24gd2luZG93cyBpdCBpcyB4Lnkuei53aW5kb3dzLnQsIGFuZCB0aGlzIHBhcnNlcyBhcwogICAgICAgICMgTGVnYWN5VmVyc2lvbiB3aGljaCBhbHdheXMgc21hbGxlciB0aGFuIGEgVmVyc2lvbi4KICAgICAgICB2ZXJzaW9uID0gJy4nLmpvaW4odmVyc2lvbi5zcGxpdCgnLicpWzozXSkKICAgICAgICByZXR1cm4gcGFyc2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgR2l0IHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBub3QgbG9jYXRpb24uZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24gKyAnLycKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIFsnY2hlY2tvdXQtaW5kZXgnLCAnLWEnLCAnLWYnLCAnLS1wcmVmaXgnLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPXRlbXBfZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgY2hlY2tfcmV2X29wdGlvbnMoc2VsZiwgcmV2LCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQ2hlY2sgdGhlIHJldmlzaW9uIG9wdGlvbnMgYmVmb3JlIGNoZWNrb3V0IHRvIGNvbXBlbnNhdGUgdGhhdCB0YWdzCiAgICAgICAgYW5kIGJyYW5jaGVzIG1heSBuZWVkIG9yaWdpbi8gYXMgYSBwcmVmaXguCiAgICAgICAgUmV0dXJucyB0aGUgU0hBMSBvZiB0aGUgYnJhbmNoIG9yIHRhZyBpZiBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICByZXZpc2lvbnMgPSBzZWxmLmdldF9zaG9ydF9yZWZzKGRlc3QpCgogICAgICAgIG9yaWdpbl9yZXYgPSAnb3JpZ2luLyVzJyAlIHJldgogICAgICAgIGlmIG9yaWdpbl9yZXYgaW4gcmV2aXNpb25zOgogICAgICAgICAgICAjIHJlbW90ZSBicmFuY2gKICAgICAgICAgICAgcmV0dXJuIFtyZXZpc2lvbnNbb3JpZ2luX3Jldl1dCiAgICAgICAgZWxpZiByZXYgaW4gcmV2aXNpb25zOgogICAgICAgICAgICAjIGEgbG9jYWwgdGFnIG9yIGJyYW5jaCBuYW1lCiAgICAgICAgICAgIHJldHVybiBbcmV2aXNpb25zW3Jldl1dCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgYSB0YWcgb3IgYnJhbmNoICclcycsIGFzc3VtaW5nIGNvbW1pdC4iLCByZXYsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHJldl9vcHRpb25zCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIENvbXBhcmUgdGhlIGN1cnJlbnQgc2hhIHRvIHRoZSByZWYuIHJlZiBtYXkgYmUgYSBicmFuY2ggb3IgdGFnIG5hbWUsCiAgICAgICAgYnV0IGN1cnJlbnQgcmV2IHdpbGwgYWx3YXlzIHBvaW50IHRvIGEgc2hhLiBUaGlzIG1lYW5zIHRoYXQgYSBicmFuY2gKICAgICAgICBvciB0YWcgd2lsbCBuZXZlciBjb21wYXJlIGFzIFRydWUuIFNvIHRoaXMgdWx0aW1hdGVseSBvbmx5IG1hdGNoZXMKICAgICAgICBhZ2FpbnN0IGV4YWN0IHNoYXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3JldmlzaW9uKGRlc3QpLnN0YXJ0c3dpdGgocmV2X29wdGlvbnNbMF0pCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY29uZmlnJywgJ3JlbW90ZS5vcmlnaW4udXJsJywgdXJsXSwgY3dkPWRlc3QpCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXMoZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAjIEZpcnN0IGZldGNoIGNoYW5nZXMgZnJvbSB0aGUgZGVmYXVsdCByZW1vdGUKICAgICAgICBpZiBzZWxmLmdldF9naXRfdmVyc2lvbigpID49IHBhcnNlX3ZlcnNpb24oJzEuOS4wJyk6CiAgICAgICAgICAgICMgZmV0Y2ggdGFncyBpbiBhZGRpdGlvbiB0byBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2ZldGNoJywgJy1xJywgJy0tdGFncyddLCBjd2Q9ZGVzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZmV0Y2gnLCAnLXEnXSwgY3dkPWRlc3QpCiAgICAgICAgIyBUaGVuIHJlc2V0IHRvIHdhbnRlZCByZXZpc2lvbiAobWF5YmUgZXZlbiBvcmlnaW4vbWFzdGVyKQogICAgICAgIGlmIHJldl9vcHRpb25zOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IHNlbGYuY2hlY2tfcmV2X29wdGlvbnMoCiAgICAgICAgICAgICAgICByZXZfb3B0aW9uc1swXSwgZGVzdCwgcmV2X29wdGlvbnMsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncmVzZXQnLCAnLS1oYXJkJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCiAgICAgICAgIzogdXBkYXRlIHN1Ym1vZHVsZXMKICAgICAgICBzZWxmLnVwZGF0ZV9zdWJtb2R1bGVzKGRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFsnb3JpZ2luL21hc3RlciddCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2xvbmluZyAlcyVzIHRvICVzJywgdXJsLCByZXZfZGlzcGxheSwgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjbG9uZScsICctcScsIHVybCwgZGVzdF0pCgogICAgICAgICAgICBpZiByZXY6CiAgICAgICAgICAgICAgICByZXZfb3B0aW9ucyA9IHNlbGYuY2hlY2tfcmV2X29wdGlvbnMocmV2LCBkZXN0LCByZXZfb3B0aW9ucykKICAgICAgICAgICAgICAgICMgT25seSBkbyBhIGNoZWNrb3V0IGlmIHJldl9vcHRpb25zIGRpZmZlcnMgZnJvbSBIRUFECiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja192ZXJzaW9uKGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgICAgICAgICBbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWRlc3QsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjOiByZXBvIG1heSBjb250YWluIHN1Ym1vZHVsZXMKICAgICAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyhkZXN0KQoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gVVJMIG9mIHRoZSBmaXJzdCByZW1vdGUgZW5jb3VudGVyZWQuIiIiCiAgICAgICAgcmVtb3RlcyA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsICdyZW1vdGVcLi4qXC51cmwnXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZW1vdGVzID0gcmVtb3Rlcy5zcGxpdGxpbmVzKCkKICAgICAgICBmb3VuZF9yZW1vdGUgPSByZW1vdGVzWzBdCiAgICAgICAgZm9yIHJlbW90ZSBpbiByZW1vdGVzOgogICAgICAgICAgICBpZiByZW1vdGUuc3RhcnRzd2l0aCgncmVtb3RlLm9yaWdpbi51cmwgJyk6CiAgICAgICAgICAgICAgICBmb3VuZF9yZW1vdGUgPSByZW1vdGUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgdXJsID0gZm91bmRfcmVtb3RlLnNwbGl0KCcgJylbMV0KICAgICAgICByZXR1cm4gdXJsLnN0cmlwKCkKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3JldiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZXR1cm4gY3VycmVudF9yZXYuc3RyaXAoKQoKICAgIGRlZiBnZXRfZnVsbF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJZaWVsZHMgdHVwbGVzIG9mIChjb21taXQsIHJlZikgZm9yIGJyYW5jaGVzIGFuZCB0YWdzIiIiCiAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fY29tbWFuZChbJ3Nob3ctcmVmJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zdHJpcCgpLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgY29tbWl0LCByZWYgPSBsaW5lLnNwbGl0KCcgJywgMSkKICAgICAgICAgICAgeWllbGQgY29tbWl0LnN0cmlwKCksIHJlZi5zdHJpcCgpCgogICAgZGVmIGlzX3JlZl9yZW1vdGUoc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvcmVtb3Rlcy8nKQoKICAgIGRlZiBpc19yZWZfYnJhbmNoKHNlbGYsIHJlZik6CiAgICAgICAgcmV0dXJuIHJlZi5zdGFydHN3aXRoKCdyZWZzL2hlYWRzLycpCgogICAgZGVmIGlzX3JlZl90YWcoc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvdGFncy8nKQoKICAgIGRlZiBpc19yZWZfY29tbWl0KHNlbGYsIHJlZik6CiAgICAgICAgIiIiQSByZWYgaXMgYSBjb21taXQgc2hhIGlmIGl0IGlzIG5vdCBhbnl0aGluZyBlbHNlIiIiCiAgICAgICAgcmV0dXJuIG5vdCBhbnkoKAogICAgICAgICAgICBzZWxmLmlzX3JlZl9yZW1vdGUocmVmKSwKICAgICAgICAgICAgc2VsZi5pc19yZWZfYnJhbmNoKHJlZiksCiAgICAgICAgICAgIHNlbGYuaXNfcmVmX3RhZyhyZWYpLAogICAgICAgICkpCgogICAgIyBTaG91bGQgZGVwcmVjYXRlIGBnZXRfcmVmc2Agc2luY2UgaXQncyBhbWJpZ3VvdXMKICAgIGRlZiBnZXRfcmVmcyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3Nob3J0X3JlZnMobG9jYXRpb24pCgogICAgZGVmIGdldF9zaG9ydF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gbWFwIG9mIG5hbWVkIHJlZnMgKGJyYW5jaGVzIG9yIHRhZ3MpIHRvIGNvbW1pdCBoYXNoZXMuIiIiCiAgICAgICAgcnYgPSB7fQogICAgICAgIGZvciBjb21taXQsIHJlZiBpbiBzZWxmLmdldF9mdWxsX3JlZnMobG9jYXRpb24pOgogICAgICAgICAgICByZWZfbmFtZSA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5pc19yZWZfcmVtb3RlKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvcmVtb3Rlcy8nKTpdCiAgICAgICAgICAgIGVsaWYgc2VsZi5pc19yZWZfYnJhbmNoKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvaGVhZHMvJyk6XQogICAgICAgICAgICBlbGlmIHNlbGYuaXNfcmVmX3RhZyhyZWYpOgogICAgICAgICAgICAgICAgcmVmX25hbWUgPSByZWZbbGVuKCdyZWZzL3RhZ3MvJyk6XQogICAgICAgICAgICBpZiByZWZfbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJ2W3JlZl9uYW1lXSA9IGNvbW1pdAogICAgICAgIHJldHVybiBydgoKICAgIGRlZiBfZ2V0X3N1YmRpcmVjdG9yeShzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHNldHVwLnB5IHRvIHRoZSBnaXQgcmVwbyByb290LiIiIgogICAgICAgICMgZmluZCB0aGUgcmVwbyByb290CiAgICAgICAgZ2l0X2RpciA9IHNlbGYucnVuX2NvbW1hbmQoWydyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGdpdF9kaXIpOgogICAgICAgICAgICBnaXRfZGlyID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBnaXRfZGlyKQogICAgICAgIHJvb3RfZGlyID0gb3MucGF0aC5qb2luKGdpdF9kaXIsICcuLicpCiAgICAgICAgIyBmaW5kIHNldHVwLnB5CiAgICAgICAgb3JpZ19sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgd2hpbGUgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgJ3NldHVwLnB5JykpOgogICAgICAgICAgICBsYXN0X2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUobG9jYXRpb24pCiAgICAgICAgICAgIGlmIGxvY2F0aW9uID09IGxhc3RfbG9jYXRpb246CiAgICAgICAgICAgICAgICAjIFdlJ3ZlIHRyYXZlcnNlZCB1cCB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSB3aXRob3V0CiAgICAgICAgICAgICAgICAjIGZpbmRpbmcgc2V0dXAucHkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXR1cC5weSBmb3IgZGlyZWN0b3J5ICVzICh0cmllZCBhbGwgIgogICAgICAgICAgICAgICAgICAgICJwYXJlbnQgZGlyZWN0b3JpZXMpIiwKICAgICAgICAgICAgICAgICAgICBvcmlnX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIHJlbGF0aXZlIHBhdGggb2Ygc2V0dXAucHkgdG8gcmVwbyByb290CiAgICAgICAgaWYgc2FtZWZpbGUocm9vdF9kaXIsIGxvY2F0aW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3MucGF0aC5yZWxwYXRoKGxvY2F0aW9uLCByb290X2RpcikKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiBub3QgcmVwby5sb3dlcigpLnN0YXJ0c3dpdGgoJ2dpdDonKToKICAgICAgICAgICAgcmVwbyA9ICdnaXQrJyArIHJlcG8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICBpZiBub3QgcmVwbzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBjdXJyZW50X3JldiA9IHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQogICAgICAgIHJlcSA9ICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQogICAgICAgIHN1YmRpcmVjdG9yeSA9IHNlbGYuX2dldF9zdWJkaXJlY3RvcnkobG9jYXRpb24pCiAgICAgICAgaWYgc3ViZGlyZWN0b3J5OgogICAgICAgICAgICByZXEgKz0gJyZzdWJkaXJlY3Rvcnk9JyArIHN1YmRpcmVjdG9yeQogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJlZml4ZXMgc3R1YiBVUkxzIGxpa2UgJ3VzZXJAaG9zdG5hbWU6dXNlci9yZXBvLmdpdCcgd2l0aCAnc3NoOi8vJy4KICAgICAgICBUaGF0J3MgcmVxdWlyZWQgYmVjYXVzZSBhbHRob3VnaCB0aGV5IHVzZSBTU0ggdGhleSBzb21ldGltZXMgZG9lc24ndAogICAgICAgIHdvcmsgd2l0aCBhIHNzaDovLyBzY2hlbWUgKGUuZy4gR2l0aHViKS4gQnV0IHdlIG5lZWQgYSBzY2hlbWUgZm9yCiAgICAgICAgcGFyc2luZy4gSGVuY2Ugd2UgcmVtb3ZlIGl0IGFnYWluIGFmdGVyd2FyZHMgYW5kIHJldHVybiBpdCBhcyBhIHN0dWIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgJzovLycgbm90IGluIHNlbGYudXJsOgogICAgICAgICAgICBhc3NlcnQgJ2ZpbGU6JyBub3QgaW4gc2VsZi51cmwKICAgICAgICAgICAgc2VsZi51cmwgPSBzZWxmLnVybC5yZXBsYWNlKCdnaXQrJywgJ2dpdCtzc2g6Ly8nKQogICAgICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEdpdCwgc2VsZikuZ2V0X3VybF9yZXYoKQogICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnc3NoOi8vJywgJycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXJsLCByZXYgPSBzdXBlcihHaXQsIHNlbGYpLmdldF91cmxfcmV2KCkKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIHVwZGF0ZV9zdWJtb2R1bGVzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGxvY2F0aW9uLCAnLmdpdG1vZHVsZXMnKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnc3VibW9kdWxlJywgJ3VwZGF0ZScsICctLWluaXQnLCAnLS1yZWN1cnNpdmUnLCAnLXEnXSwKICAgICAgICAgICAgY3dkPWxvY2F0aW9uLAogICAgICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjb250cm9sc19sb2NhdGlvbihjbHMsIGxvY2F0aW9uKToKICAgICAgICBpZiBzdXBlcihHaXQsIGNscykuY29udHJvbHNfbG9jYXRpb24obG9jYXRpb24pOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgciA9IGNscygpLnJ1bl9jb21tYW5kKFsncmV2LXBhcnNlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9bG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGU9J2lnbm9yZScpCiAgICAgICAgICAgIHJldHVybiBub3QgcgogICAgICAgIGV4Y2VwdCBCYWRDb21tYW5kOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoImNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgJXMgaXMgdW5kZXIgZ2l0IGNvbnRyb2wgIgogICAgICAgICAgICAgICAgICAgICAgICAgImJlY2F1c2UgZ2l0IGlzIG5vdCBhdmFpbGFibGUiLCBsb2NhdGlvbikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKdmNzLnJlZ2lzdGVyKEdpdCkKUEsDBBQAAAAAAAAAIQB5YmodkA0AAJANAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvbWVyY3VyaWFsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkaXNwbGF5X3BhdGgsIHJtdHJlZQpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBNZXJjdXJpYWwoVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdoZycKICAgIGRpcm5hbWUgPSAnLmhnJwogICAgcmVwb19uYW1lID0gJ2Nsb25lJwogICAgc2NoZW1lcyA9ICgnaGcnLCAnaGcraHR0cCcsICdoZytodHRwcycsICdoZytzc2gnLCAnaGcrc3RhdGljLWh0dHAnKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgSGcgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiIiIgogICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLWV4cG9ydCcsICdwaXAtJykKICAgICAgICBzZWxmLnVucGFjayh0ZW1wX2RpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBbJ2FyY2hpdmUnLCBsb2NhdGlvbl0sIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9dGVtcF9kaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgcmVwb19jb25maWcgPSBvcy5wYXRoLmpvaW4oZGVzdCwgc2VsZi5kaXJuYW1lLCAnaGdyYycpCiAgICAgICAgY29uZmlnID0gY29uZmlncGFyc2VyLlNhZmVDb25maWdQYXJzZXIoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uZmlnLnJlYWQocmVwb19jb25maWcpCiAgICAgICAgICAgIGNvbmZpZy5zZXQoJ3BhdGhzJywgJ2RlZmF1bHQnLCB1cmwpCiAgICAgICAgICAgIHdpdGggb3BlbihyZXBvX2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKICAgICAgICAgICAgICAgIGNvbmZpZy53cml0ZShjb25maWdfZmlsZSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIGNvbmZpZ3BhcnNlci5Ob1NlY3Rpb25FcnJvcikgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc3dpdGNoIE1lcmN1cmlhbCByZXBvc2l0b3J5IHRvICVzOiAlcycsIHVybCwgZXhjLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZScsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydwdWxsJywgJy1xJ10sIGN3ZD1kZXN0KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtyZXZdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gcmV2aXNpb24gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gW10KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDbG9uaW5nIGhnICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2Nsb25lJywgJy0tbm91cGRhdGUnLCAnLXEnLCB1cmwsIGRlc3RdKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHVybCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnc2hvd2NvbmZpZycsICdwYXRocy5kZWZhdWx0J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICBpZiBzZWxmLl9pc19sb2NhbF9yZXBvc2l0b3J5KHVybCk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHVybCkKICAgICAgICByZXR1cm4gdXJsLnN0cmlwKCkKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3JldmlzaW9uID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydwYXJlbnRzJywgJy0tdGVtcGxhdGU9e3Jldn0nXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIHJldHVybiBjdXJyZW50X3JldmlzaW9uCgogICAgZGVmIGdldF9yZXZpc2lvbl9oYXNoKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3Jldl9oYXNoID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydwYXJlbnRzJywgJy0tdGVtcGxhdGU9e25vZGV9J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICByZXR1cm4gY3VycmVudF9yZXZfaGFzaAoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnaGc6Jyk6CiAgICAgICAgICAgIHJlcG8gPSAnaGcrJyArIHJlcG8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICBpZiBub3QgcmVwbzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBjdXJyZW50X3Jldl9oYXNoID0gc2VsZi5nZXRfcmV2aXNpb25faGFzaChsb2NhdGlvbikKICAgICAgICByZXR1cm4gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXZfaGFzaCwgZWdnX3Byb2plY3RfbmFtZSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQWx3YXlzIGFzc3VtZSB0aGUgdmVyc2lvbnMgZG9uJ3QgbWF0Y2giIiIKICAgICAgICByZXR1cm4gRmFsc2UKCnZjcy5yZWdpc3RlcihNZXJjdXJpYWwpClBLAwQUAAAAAAAAACEAbjSVQYYkAACGJAAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL3N1YnZlcnNpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCmZyb20gcGlwLmluZGV4IGltcG9ydCBMaW5rCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUsIGRpc3BsYXlfcGF0aApmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBWZXJzaW9uQ29udHJvbAoKX3N2bl94bWxfdXJsX3JlID0gcmUuY29tcGlsZSgndXJsPSIoW14iXSspIicpCl9zdm5fcmV2X3JlID0gcmUuY29tcGlsZSgnY29tbWl0dGVkLXJldj0iKFxkKykiJykKX3N2bl91cmxfcmUgPSByZS5jb21waWxlKHInVVJMOiAoLispJykKX3N2bl9yZXZpc2lvbl9yZSA9IHJlLmNvbXBpbGUocidSZXZpc2lvbjogKC4rKScpCl9zdm5faW5mb194bWxfcmV2X3JlID0gcmUuY29tcGlsZShyJ1xzKnJldmlzaW9uPSIoXGQrKSInKQpfc3ZuX2luZm9feG1sX3VybF9yZSA9IHJlLmNvbXBpbGUocic8dXJsPiguKik8L3VybD4nKQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFN1YnZlcnNpb24oVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdzdm4nCiAgICBkaXJuYW1lID0gJy5zdm4nCiAgICByZXBvX25hbWUgPSAnY2hlY2tvdXQnCiAgICBzY2hlbWVzID0gKCdzdm4nLCAnc3ZuK3NzaCcsICdzdm4raHR0cCcsICdzdm4raHR0cHMnLCAnc3ZuK3N2bicpCgogICAgZGVmIGdldF9pbmZvKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm5zICh1cmwsIHJldmlzaW9uKSwgd2hlcmUgYm90aCBhcmUgc3RyaW5ncyIiIgogICAgICAgIGFzc2VydCBub3QgbG9jYXRpb24ucnN0cmlwKCcvJykuZW5kc3dpdGgoc2VsZi5kaXJuYW1lKSwgXAogICAgICAgICAgICAnQmFkIGRpcmVjdG9yeTogJXMnICUgbG9jYXRpb24KICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ2luZm8nLCBsb2NhdGlvbl0sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICBleHRyYV9lbnZpcm9uPXsnTEFORyc6ICdDJ30sCiAgICAgICAgKQogICAgICAgIG1hdGNoID0gX3N2bl91cmxfcmUuc2VhcmNoKG91dHB1dCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgVVJMIG9mIHN2biBjaGVja291dCAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgobG9jYXRpb24pLAogICAgICAgICAgICApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT3V0cHV0IHRoYXQgY2Fubm90IGJlIHBhcnNlZDogXG4lcycsIG91dHB1dCkKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKICAgICAgICB1cmwgPSBtYXRjaC5ncm91cCgxKS5zdHJpcCgpCiAgICAgICAgbWF0Y2ggPSBfc3ZuX3JldmlzaW9uX3JlLnNlYXJjaChvdXRwdXQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIHJldmlzaW9uIG9mIHN2biBjaGVja291dCAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgobG9jYXRpb24pLAogICAgICAgICAgICApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT3V0cHV0IHRoYXQgY2Fubm90IGJlIHBhcnNlZDogXG4lcycsIG91dHB1dCkKICAgICAgICAgICAgcmV0dXJuIHVybCwgTm9uZQogICAgICAgIHJldHVybiB1cmwsIG1hdGNoLmdyb3VwKDEpCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiRXhwb3J0IHRoZSBzdm4gcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiIiIgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgcmV2X29wdGlvbnMgPSBnZXRfcmV2X29wdGlvbnModXJsLCByZXYpCiAgICAgICAgdXJsID0gc2VsZi5yZW1vdmVfYXV0aF9mcm9tX3VybCh1cmwpCiAgICAgICAgbG9nZ2VyLmluZm8oJ0V4cG9ydGluZyBzdm4gcmVwb3NpdG9yeSAlcyB0byAlcycsIHVybCwgbG9jYXRpb24pCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2F0aW9uKToKICAgICAgICAgICAgICAgICMgU3VidmVyc2lvbiBkb2Vzbid0IGxpa2UgdG8gY2hlY2sgb3V0IG92ZXIgYW4gZXhpc3RpbmcKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5IC0tZm9yY2UgZml4ZXMgdGhpcywgYnV0IHdhcyBvbmx5IGFkZGVkIGluIHN2biAxLjUKICAgICAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIFsnZXhwb3J0J10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGxvY2F0aW9uXSwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3N3aXRjaCddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBkZXN0XSkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJ10gKyByZXZfb3B0aW9ucyArIFtkZXN0XSkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgcmV2X29wdGlvbnMgPSBnZXRfcmV2X29wdGlvbnModXJsLCByZXYpCiAgICAgICAgdXJsID0gc2VsZi5yZW1vdmVfYXV0aF9mcm9tX3VybCh1cmwpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvIHJldmlzaW9uICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcnCiAgICAgICAgaWYgc2VsZi5jaGVja19kZXN0aW5hdGlvbihkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0NoZWNraW5nIG91dCAlcyVzIHRvICVzJywKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjaGVja291dCcsICctcSddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBkZXN0XSkKCiAgICBkZWYgZ2V0X2xvY2F0aW9uKHNlbGYsIGRpc3QsIGRlcGVuZGVuY3lfbGlua3MpOgogICAgICAgIGZvciB1cmwgaW4gZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgZWdnX2ZyYWdtZW50ID0gTGluayh1cmwpLmVnZ19mcmFnbWVudAogICAgICAgICAgICBpZiBub3QgZWdnX2ZyYWdtZW50OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgJy0nIGluIGVnZ19mcmFnbWVudDoKICAgICAgICAgICAgICAgICMgRklYTUU6IHdpbGwgdGhpcyB3b3JrIHdoZW4gYSBwYWNrYWdlIGhhcyAtIGluIHRoZSBuYW1lPwogICAgICAgICAgICAgICAga2V5ID0gJy0nLmpvaW4oZWdnX2ZyYWdtZW50LnNwbGl0KCctJylbOi0xXSkubG93ZXIoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAga2V5ID0gZWdnX2ZyYWdtZW50CiAgICAgICAgICAgIGlmIGtleSA9PSBkaXN0LmtleToKICAgICAgICAgICAgICAgIHJldHVybiB1cmwuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBtYXhpbXVtIHJldmlzaW9uIGZvciBhbGwgZmlsZXMgdW5kZXIgYSBnaXZlbiBsb2NhdGlvbgogICAgICAgICIiIgogICAgICAgICMgTm90ZTogdGFrZW4gZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KICAgICAgICByZXZpc2lvbiA9IDAKCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsobG9jYXRpb24pOgogICAgICAgICAgICBpZiBzZWxmLmRpcm5hbWUgbm90IGluIGRpcnM6CiAgICAgICAgICAgICAgICBkaXJzWzpdID0gW10KICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm8gc2Vuc2Ugd2Fsa2luZyB1bmNvbnRyb2xsZWQgc3ViZGlycwogICAgICAgICAgICBkaXJzLnJlbW92ZShzZWxmLmRpcm5hbWUpCiAgICAgICAgICAgIGVudHJpZXNfZm4gPSBvcy5wYXRoLmpvaW4oYmFzZSwgc2VsZi5kaXJuYW1lLCAnZW50cmllcycpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlbnRyaWVzX2ZuKToKICAgICAgICAgICAgICAgICMgRklYTUU6IHNob3VsZCB3ZSB3YXJuPwogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGRpcnVybCwgbG9jYWxyZXYgPSBzZWxmLl9nZXRfc3ZuX3VybF9yZXYoYmFzZSkKCiAgICAgICAgICAgIGlmIGJhc2UgPT0gbG9jYXRpb246CiAgICAgICAgICAgICAgICBiYXNlX3VybCA9IGRpcnVybCArICcvJyAgICMgc2F2ZSB0aGUgcm9vdCB1cmwKICAgICAgICAgICAgZWxpZiBub3QgZGlydXJsIG9yIG5vdCBkaXJ1cmwuc3RhcnRzd2l0aChiYXNlX3VybCk6CiAgICAgICAgICAgICAgICBkaXJzWzpdID0gW10KICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm90IHBhcnQgb2YgdGhlIHNhbWUgc3ZuIHRyZWUsIHNraXAgaXQKICAgICAgICAgICAgcmV2aXNpb24gPSBtYXgocmV2aXNpb24sIGxvY2FscmV2KQogICAgICAgIHJldHVybiByZXZpc2lvbgoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAjIGhvdGZpeCB0aGUgVVJMIHNjaGVtZSBhZnRlciByZW1vdmluZyBzdm4rIGZyb20gc3ZuK3NzaDovLyByZWFkZCBpdAogICAgICAgIHVybCwgcmV2ID0gc3VwZXIoU3VidmVyc2lvbiwgc2VsZikuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdzc2g6Ly8nKToKICAgICAgICAgICAgdXJsID0gJ3N2bisnICsgdXJsCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICMgSW4gY2FzZXMgd2hlcmUgdGhlIHNvdXJjZSBpcyBpbiBhIHN1YmRpcmVjdG9yeSwgbm90IGFsb25nc2lkZQogICAgICAgICMgc2V0dXAucHkgd2UgaGF2ZSB0byBsb29rIHVwIGluIHRoZSBsb2NhdGlvbiB1bnRpbCB3ZSBmaW5kIGEgcmVhbAogICAgICAgICMgc2V0dXAucHkKICAgICAgICBvcmlnX2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICB3aGlsZSBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGxvY2F0aW9uLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgIGxhc3RfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgICAgICBsb2NhdGlvbiA9IG9zLnBhdGguZGlybmFtZShsb2NhdGlvbikKICAgICAgICAgICAgaWYgbG9jYXRpb24gPT0gbGFzdF9sb2NhdGlvbjoKICAgICAgICAgICAgICAgICMgV2UndmUgdHJhdmVyc2VkIHVwIHRvIHRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtIHdpdGhvdXQKICAgICAgICAgICAgICAgICMgZmluZGluZyBzZXR1cC5weQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHNldHVwLnB5IGZvciBkaXJlY3RvcnkgJXMgKHRyaWVkIGFsbCAiCiAgICAgICAgICAgICAgICAgICAgInBhcmVudCBkaXJlY3RvcmllcykiLAogICAgICAgICAgICAgICAgICAgIG9yaWdfbG9jYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3N2bl91cmxfcmV2KGxvY2F0aW9uKVswXQoKICAgIGRlZiBfZ2V0X3N2bl91cmxfcmV2KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvcgoKICAgICAgICBlbnRyaWVzX3BhdGggPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIHNlbGYuZGlybmFtZSwgJ2VudHJpZXMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGVudHJpZXNfcGF0aCk6CiAgICAgICAgICAgIHdpdGggb3BlbihlbnRyaWVzX3BhdGgpIGFzIGY6CiAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICBlbHNlOiAgIyBzdWJ2ZXJzaW9uID49IDEuNyBkb2VzIG5vdCBoYXZlIHRoZSAnZW50cmllcycgZmlsZQogICAgICAgICAgICBkYXRhID0gJycKCiAgICAgICAgaWYgKGRhdGEuc3RhcnRzd2l0aCgnOCcpIG9yCiAgICAgICAgICAgICAgICBkYXRhLnN0YXJ0c3dpdGgoJzknKSBvcgogICAgICAgICAgICAgICAgZGF0YS5zdGFydHN3aXRoKCcxMCcpKToKICAgICAgICAgICAgZGF0YSA9IGxpc3QobWFwKHN0ci5zcGxpdGxpbmVzLCBkYXRhLnNwbGl0KCdcblx4MGNcbicpKSkKICAgICAgICAgICAgZGVsIGRhdGFbMF1bMF0gICMgZ2V0IHJpZCBvZiB0aGUgJzgnCiAgICAgICAgICAgIHVybCA9IGRhdGFbMF1bM10KICAgICAgICAgICAgcmV2cyA9IFtpbnQoZFs5XSkgZm9yIGQgaW4gZGF0YSBpZiBsZW4oZCkgPiA5IGFuZCBkWzldXSArIFswXQogICAgICAgIGVsaWYgZGF0YS5zdGFydHN3aXRoKCc8P3htbCcpOgogICAgICAgICAgICBtYXRjaCA9IF9zdm5feG1sX3VybF9yZS5zZWFyY2goZGF0YSkKICAgICAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQmFkbHkgZm9ybWF0dGVkIGRhdGE6ICVyJyAlIGRhdGEpCiAgICAgICAgICAgIHVybCA9IG1hdGNoLmdyb3VwKDEpICAgICMgZ2V0IHJlcG9zaXRvcnkgVVJMCiAgICAgICAgICAgIHJldnMgPSBbaW50KG0uZ3JvdXAoMSkpIGZvciBtIGluIF9zdm5fcmV2X3JlLmZpbmRpdGVyKGRhdGEpXSArIFswXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgc3VidmVyc2lvbiA+PSAxLjcKICAgICAgICAgICAgICAgIHhtbCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICAgICAgWydpbmZvJywgJy0teG1sJywgbG9jYXRpb25dLAogICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdXJsID0gX3N2bl9pbmZvX3htbF91cmxfcmUuc2VhcmNoKHhtbCkuZ3JvdXAoMSkKICAgICAgICAgICAgICAgIHJldnMgPSBbCiAgICAgICAgICAgICAgICAgICAgaW50KG0uZ3JvdXAoMSkpIGZvciBtIGluIF9zdm5faW5mb194bWxfcmV2X3JlLmZpbmRpdGVyKHhtbCkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgZXhjZXB0IEluc3RhbGxhdGlvbkVycm9yOgogICAgICAgICAgICAgICAgdXJsLCByZXZzID0gTm9uZSwgW10KCiAgICAgICAgaWYgcmV2czoKICAgICAgICAgICAgcmV2ID0gbWF4KHJldnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2ID0gMAoKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiByZXBvIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIyBGSVhNRTogd2h5IG5vdCBwcm9qZWN0IG5hbWU/CiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgcmV2ID0gc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCiAgICAgICAgcmV0dXJuICdzdm4rJXNAJXMjZWdnPSVzJyAlIChyZXBvLCByZXYsIGVnZ19wcm9qZWN0X25hbWUpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkFsd2F5cyBhc3N1bWUgdGhlIHZlcnNpb25zIGRvbid0IG1hdGNoIiIiCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHJlbW92ZV9hdXRoX2Zyb21fdXJsKHVybCk6CiAgICAgICAgIyBSZXR1cm4gYSBjb3B5IG9mIHVybCB3aXRoICd1c2VybmFtZTpwYXNzd29yZEAnIHJlbW92ZWQuCiAgICAgICAgIyB1c2VybmFtZS9wYXNzIHBhcmFtcyBhcmUgcGFzc2VkIHRvIHN1YnZlcnNpb24gdGhyb3VnaCBmbGFncwogICAgICAgICMgYW5kIGFyZSBub3QgcmVjb2duaXplZCBpbiB0aGUgdXJsLgoKICAgICAgICAjIHBhcnNlZCB1cmwKICAgICAgICBwdXJsID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgICAgICBzdHJpcHBlZF9uZXRsb2MgPSBcCiAgICAgICAgICAgIHB1cmwubmV0bG9jLnNwbGl0KCdAJylbLTFdCgogICAgICAgICMgc3RyaXBwZWQgdXJsCiAgICAgICAgdXJsX3BpZWNlcyA9ICgKICAgICAgICAgICAgcHVybC5zY2hlbWUsIHN0cmlwcGVkX25ldGxvYywgcHVybC5wYXRoLCBwdXJsLnF1ZXJ5LCBwdXJsLmZyYWdtZW50CiAgICAgICAgKQogICAgICAgIHN1cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdCh1cmxfcGllY2VzKQogICAgICAgIHJldHVybiBzdXJsCgoKZGVmIGdldF9yZXZfb3B0aW9ucyh1cmwsIHJldik6CiAgICBpZiByZXY6CiAgICAgICAgcmV2X29wdGlvbnMgPSBbJy1yJywgcmV2XQogICAgZWxzZToKICAgICAgICByZXZfb3B0aW9ucyA9IFtdCgogICAgciA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICBpZiBoYXNhdHRyKHIsICd1c2VybmFtZScpOgogICAgICAgICMgPj0gUHl0aG9uLTIuNQogICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHIudXNlcm5hbWUsIHIucGFzc3dvcmQKICAgIGVsc2U6CiAgICAgICAgbmV0bG9jID0gclsxXQogICAgICAgIGlmICdAJyBpbiBuZXRsb2M6CiAgICAgICAgICAgIGF1dGggPSBuZXRsb2Muc3BsaXQoJ0AnKVswXQogICAgICAgICAgICBpZiAnOicgaW4gYXV0aDoKICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGF1dGguc3BsaXQoJzonLCAxKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gYXV0aCwgTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IE5vbmUsIE5vbmUKCiAgICBpZiB1c2VybmFtZToKICAgICAgICByZXZfb3B0aW9ucyArPSBbJy0tdXNlcm5hbWUnLCB1c2VybmFtZV0KICAgIGlmIHBhc3N3b3JkOgogICAgICAgIHJldl9vcHRpb25zICs9IFsnLS1wYXNzd29yZCcsIHBhc3N3b3JkXQogICAgcmV0dXJuIHJldl9vcHRpb25zCgoKdmNzLnJlZ2lzdGVyKFN1YnZlcnNpb24pClBLAwQUAAAAAAAAACEAfZkgOwp9AAAKfQAAHAAAAHB5cGlfX3BpcF85XzBfMy9waXAvd2hlZWwucHkiIiIKU3VwcG9ydCBmb3IgaW5zdGFsbGluZyBhbmQgYnVpbGRpbmcgdGhlICJ3aGVlbCIgYmluYXJ5IHBhY2thZ2UgZm9ybWF0LgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjb21waWxlYWxsCmltcG9ydCBjc3YKaW1wb3J0IGVycm5vCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzdGF0CmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBiYXNlNjQgaW1wb3J0IHVybHNhZmVfYjY0ZW5jb2RlCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBTdHJpbmdJTwoKaW1wb3J0IHBpcApmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGV4cGFuZHVzZXIKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsLCB1bnBhY2tfdXJsCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBJbnZhbGlkV2hlZWxGaWxlbmFtZSwgVW5zdXBwb3J0ZWRXaGVlbCkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBkaXN0dXRpbHNfc2NoZW1lLCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRQpmcm9tIHBpcCBpbXBvcnQgcGVwNDI1dGFncwpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgY2FsbF9zdWJwcm9jZXNzLCBlbnN1cmVfZGlyLCBjYXB0dXJlZF9zdGRvdXQsIHJtdHJlZSwgcmVhZF9jaHVua3MsCikKZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IG9wZW5fc3Bpbm5lcgpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnNldHVwdG9vbHNfYnVpbGQgaW1wb3J0IFNFVFVQVE9PTFNfU0hJTQpmcm9tIHBpcC5fdmVuZG9yLmRpc3RsaWIuc2NyaXB0cyBpbXBvcnQgU2NyaXB0TWFrZXIKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKCndoZWVsX2V4dCA9ICcud2hsJwoKVkVSU0lPTl9DT01QQVRJQkxFID0gKDEsIDApCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgV2hlZWxDYWNoZShvYmplY3QpOgogICAgIiIiQSBjYWNoZSBvZiB3aGVlbHMgZm9yIGZ1dHVyZSBpbnN0YWxscy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCk6CiAgICAgICAgIiIiQ3JlYXRlIGEgd2hlZWwgY2FjaGUuCgogICAgICAgIDpwYXJhbSBjYWNoZV9kaXI6IFRoZSByb290IG9mIHRoZSBjYWNoZS4KICAgICAgICA6cGFyYW0gZm9ybWF0X2NvbnRyb2w6IEEgcGlwLmluZGV4LkZvcm1hdENvbnRyb2wgb2JqZWN0IHRvIGxpbWl0CiAgICAgICAgICAgIGJpbmFyaWVzIGJlaW5nIHJlYWQgZnJvbSB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGVfZGlyID0gZXhwYW5kdXNlcihjYWNoZV9kaXIpIGlmIGNhY2hlX2RpciBlbHNlIE5vbmUKICAgICAgICBzZWxmLl9mb3JtYXRfY29udHJvbCA9IGZvcm1hdF9jb250cm9sCgogICAgZGVmIGNhY2hlZF93aGVlbChzZWxmLCBsaW5rLCBwYWNrYWdlX25hbWUpOgogICAgICAgIHJldHVybiBjYWNoZWRfd2hlZWwoCiAgICAgICAgICAgIHNlbGYuX2NhY2hlX2RpciwgbGluaywgc2VsZi5fZm9ybWF0X2NvbnRyb2wsIHBhY2thZ2VfbmFtZSkKCgpkZWYgX2NhY2hlX2Zvcl9saW5rKGNhY2hlX2RpciwgbGluayk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpcmVjdG9yeSB0byBzdG9yZSBjYWNoZWQgd2hlZWxzIGluIGZvciBsaW5rLgoKICAgIEJlY2F1c2UgdGhlcmUgYXJlIE0gd2hlZWxzIGZvciBhbnkgb25lIHNkaXN0LCB3ZSBwcm92aWRlIGEgZGlyZWN0b3J5CiAgICB0byBjYWNoZSB0aGVtIGluLCBhbmQgdGhlbiBjb25zdWx0IHRoYXQgZGlyZWN0b3J5IHdoZW4gbG9va2luZyB1cAogICAgY2FjaGUgaGl0cy4KCiAgICBXZSBvbmx5IGluc2VydCB0aGluZ3MgaW50byB0aGUgY2FjaGUgaWYgdGhleSBoYXZlIHBsYXVzaWJsZSB2ZXJzaW9uCiAgICBudW1iZXJzLCBzbyB0aGF0IHdlIGRvbid0IGNvbnRhbWluYXRlIHRoZSBjYWNoZSB3aXRoIHRoaW5ncyB0aGF0IHdlcmUgbm90CiAgICB1bmlxdWUuIEUuZy4gLi9wYWNrYWdlIG1pZ2h0IGhhdmUgZG96ZW5zIG9mIGluc3RhbGxzIGRvbmUgZm9yIGl0IGFuZCBidWlsZAogICAgYSB2ZXJzaW9uIG9mIDAuMC4uLmFuZCBpZiB3ZSBidWlsdCBhbmQgY2FjaGVkIGEgd2hlZWwsIHdlJ2QgZW5kIHVwIHVzaW5nCiAgICB0aGUgc2FtZSB3aGVlbCBldmVuIGlmIHRoZSBzb3VyY2UgaGFzIGJlZW4gZWRpdGVkLgoKICAgIDpwYXJhbSBjYWNoZV9kaXI6IFRoZSBjYWNoZV9kaXIgYmVpbmcgdXNlZCBieSBwaXAuCiAgICA6cGFyYW0gbGluazogVGhlIGxpbmsgb2YgdGhlIHNkaXN0IGZvciB3aGljaCB0aGlzIHdpbGwgY2FjaGUgd2hlZWxzLgogICAgIiIiCgogICAgIyBXZSB3YW50IHRvIGdlbmVyYXRlIGFuIHVybCB0byB1c2UgYXMgb3VyIGNhY2hlIGtleSwgd2UgZG9uJ3Qgd2FudCB0byBqdXN0CiAgICAjIHJlLXVzZSB0aGUgVVJMIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBvdGhlciBpdGVtcyBpbiB0aGUgZnJhZ21lbnQgYW5kIHdlCiAgICAjIGRvbid0IGNhcmUgYWJvdXQgdGhvc2UuCiAgICBrZXlfcGFydHMgPSBbbGluay51cmxfd2l0aG91dF9mcmFnbWVudF0KICAgIGlmIGxpbmsuaGFzaF9uYW1lIGlzIG5vdCBOb25lIGFuZCBsaW5rLmhhc2ggaXMgbm90IE5vbmU6CiAgICAgICAga2V5X3BhcnRzLmFwcGVuZCgiPSIuam9pbihbbGluay5oYXNoX25hbWUsIGxpbmsuaGFzaF0pKQogICAga2V5X3VybCA9ICIjIi5qb2luKGtleV9wYXJ0cykKCiAgICAjIEVuY29kZSBvdXIga2V5IHVybCB3aXRoIHNoYTIyNCwgd2UnbGwgdXNlIHRoaXMgYmVjYXVzZSBpdCBoYXMgc2ltaWxhcgogICAgIyBzZWN1cml0eSBwcm9wZXJ0aWVzIHRvIHNoYTI1NiwgYnV0IHdpdGggYSBzaG9ydGVyIHRvdGFsIG91dHB1dCAoYW5kIHRodXMKICAgICMgbGVzcyBzZWN1cmUpLiBIb3dldmVyIHRoZSBkaWZmZXJlbmNlcyBkb24ndCBtYWtlIGEgbG90IG9mIGRpZmZlcmVuY2UgZm9yCiAgICAjIG91ciB1c2UgY2FzZSBoZXJlLgogICAgaGFzaGVkID0gaGFzaGxpYi5zaGEyMjQoa2V5X3VybC5lbmNvZGUoKSkuaGV4ZGlnZXN0KCkKCiAgICAjIFdlIHdhbnQgdG8gbmVzdCB0aGUgZGlyZWN0b3JpZXMgc29tZSB0byBwcmV2ZW50IGhhdmluZyBhIHRvbiBvZiB0b3AgbGV2ZWwKICAgICMgZGlyZWN0b3JpZXMgd2hlcmUgd2UgbWlnaHQgcnVuIG91dCBvZiBzdWIgZGlyZWN0b3JpZXMgb24gc29tZSBGUy4KICAgIHBhcnRzID0gW2hhc2hlZFs6Ml0sIGhhc2hlZFsyOjRdLCBoYXNoZWRbNDo2XSwgaGFzaGVkWzY6XV0KCiAgICAjIEluc2lkZSBvZiB0aGUgYmFzZSBsb2NhdGlvbiBmb3IgY2FjaGVkIHdoZWVscywgZXhwYW5kIG91ciBwYXJ0cyBhbmQgam9pbgogICAgIyB0aGVtIGFsbCB0b2dldGhlci4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4oY2FjaGVfZGlyLCAid2hlZWxzIiwgKnBhcnRzKQoKCmRlZiBjYWNoZWRfd2hlZWwoY2FjaGVfZGlyLCBsaW5rLCBmb3JtYXRfY29udHJvbCwgcGFja2FnZV9uYW1lKToKICAgIGlmIG5vdCBjYWNoZV9kaXI6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIG5vdCBsaW5rOgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBsaW5rLmlzX3doZWVsOgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBub3QgbGluay5pc19hcnRpZmFjdDoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByZXR1cm4gbGluawogICAgY2Fub25pY2FsX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShwYWNrYWdlX25hbWUpCiAgICBmb3JtYXRzID0gcGlwLmluZGV4LmZtdF9jdGxfZm9ybWF0cyhmb3JtYXRfY29udHJvbCwgY2Fub25pY2FsX25hbWUpCiAgICBpZiAiYmluYXJ5IiBub3QgaW4gZm9ybWF0czoKICAgICAgICByZXR1cm4gbGluawogICAgcm9vdCA9IF9jYWNoZV9mb3JfbGluayhjYWNoZV9kaXIsIGxpbmspCiAgICB0cnk6CiAgICAgICAgd2hlZWxfbmFtZXMgPSBvcy5saXN0ZGlyKHJvb3QpCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVOT0VOVCwgZXJybm8uRU5PVERJUik6CiAgICAgICAgICAgIHJldHVybiBsaW5rCiAgICAgICAgcmFpc2UKICAgIGNhbmRpZGF0ZXMgPSBbXQogICAgZm9yIHdoZWVsX25hbWUgaW4gd2hlZWxfbmFtZXM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsX25hbWUpCiAgICAgICAgZXhjZXB0IEludmFsaWRXaGVlbEZpbGVuYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoKToKICAgICAgICAgICAgIyBCdWlsdCBmb3IgYSBkaWZmZXJlbnQgcHl0aG9uL2FyY2gvZXRjCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoKHdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKCksIHdoZWVsX25hbWUpKQogICAgaWYgbm90IGNhbmRpZGF0ZXM6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGNhbmRpZGF0ZXMuc29ydCgpCiAgICBwYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGNhbmRpZGF0ZXNbMF1bMV0pCiAgICByZXR1cm4gcGlwLmluZGV4LkxpbmsocGF0aF90b191cmwocGF0aCkpCgoKZGVmIHJlaGFzaChwYXRoLCBhbGdvPSdzaGEyNTYnLCBibG9ja3NpemU9MSA8PCAyMCk6CiAgICAiIiJSZXR1cm4gKGhhc2gsIGxlbmd0aCkgZm9yIHBhdGggdXNpbmcgaGFzaGxpYi5uZXcoYWxnbykiIiIKICAgIGggPSBoYXNobGliLm5ldyhhbGdvKQogICAgbGVuZ3RoID0gMAogICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgZm9yIGJsb2NrIGluIHJlYWRfY2h1bmtzKGYsIHNpemU9YmxvY2tzaXplKToKICAgICAgICAgICAgbGVuZ3RoICs9IGxlbihibG9jaykKICAgICAgICAgICAgaC51cGRhdGUoYmxvY2spCiAgICBkaWdlc3QgPSAnc2hhMjU2PScgKyB1cmxzYWZlX2I2NGVuY29kZSgKICAgICAgICBoLmRpZ2VzdCgpCiAgICApLmRlY29kZSgnbGF0aW4xJykucnN0cmlwKCc9JykKICAgIHJldHVybiAoZGlnZXN0LCBsZW5ndGgpCgoKZGVmIG9wZW5fZm9yX2NzdihuYW1lLCBtb2RlKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG5sID0ge30KICAgICAgICBiaW4gPSAnYicKICAgIGVsc2U6CiAgICAgICAgbmwgPSB7J25ld2xpbmUnOiAnJ30KICAgICAgICBiaW4gPSAnJwogICAgcmV0dXJuIG9wZW4obmFtZSwgbW9kZSArIGJpbiwgKipubCkKCgpkZWYgZml4X3NjcmlwdChwYXRoKToKICAgICIiIlJlcGxhY2UgIyFweXRob24gd2l0aCAjIS9wYXRoL3RvL3B5dGhvbgogICAgUmV0dXJuIFRydWUgaWYgZmlsZSB3YXMgY2hhbmdlZC4iIiIKICAgICMgWFhYIFJFQ09SRCBoYXNoZXMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQKICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzY3JpcHQ6CiAgICAgICAgICAgIGZpcnN0bGluZSA9IHNjcmlwdC5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdGxpbmUuc3RhcnRzd2l0aChiJyMhcHl0aG9uJyk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZXhlbmFtZSA9IHN5cy5leGVjdXRhYmxlLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgIGZpcnN0bGluZSA9IGInIyEnICsgZXhlbmFtZSArIG9zLmxpbmVzZXAuZW5jb2RlKCJhc2NpaSIpCiAgICAgICAgICAgIHJlc3QgPSBzY3JpcHQucmVhZCgpCiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIHNjcmlwdDoKICAgICAgICAgICAgc2NyaXB0LndyaXRlKGZpcnN0bGluZSkKICAgICAgICAgICAgc2NyaXB0LndyaXRlKHJlc3QpCiAgICAgICAgcmV0dXJuIFRydWUKCmRpc3RfaW5mb19yZSA9IHJlLmNvbXBpbGUociIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pKC0oP1A8dmVyPlxkLis/KSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwuZGlzdC1pbmZvJCIiIiwgcmUuVkVSQk9TRSkKCgpkZWYgcm9vdF9pc19wdXJlbGliKG5hbWUsIHdoZWVsZGlyKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgdGhlIGV4dHJhY3RlZCB3aGVlbCBpbiB3aGVlbGRpciBzaG91bGQgZ28gaW50byBwdXJlbGliLgogICAgIiIiCiAgICBuYW1lX2ZvbGRlZCA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikKICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIod2hlZWxkaXIpOgogICAgICAgIG1hdGNoID0gZGlzdF9pbmZvX3JlLm1hdGNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2ggYW5kIG1hdGNoLmdyb3VwKCduYW1lJykgPT0gbmFtZV9mb2xkZWQ6CiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGl0ZW0sICdXSEVFTCcpKSBhcyB3aGVlbDoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHdoZWVsOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxvd2VyKCkucnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICJyb290LWlzLXB1cmVsaWI6IHRydWUiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGdldF9lbnRyeXBvaW50cyhmaWxlbmFtZSk6CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB7fSwge30KCiAgICAjIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHlvdSBjYW4gcGFzcyBhIHN0cmluZyB0byBlbnRyeV9wb2ludHMgd3JhcHBlcnMgd2hpY2gKICAgICMgbWVhbnMgdGhhdCB0aGV5IG1heSBvciBtYXkgbm90IGJlIHZhbGlkIElOSSBmaWxlcy4gVGhlIGF0dGVtcHQgaGVyZSBpcyB0bwogICAgIyBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIG9yZGVyIHRvIG1ha2UgdGhlbSB2YWxpZCBJTkkKICAgICMgZmlsZXMuCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZwOgogICAgICAgIGRhdGEgPSBTdHJpbmdJTygpCiAgICAgICAgZm9yIGxpbmUgaW4gZnA6CiAgICAgICAgICAgIGRhdGEud3JpdGUobGluZS5zdHJpcCgpKQogICAgICAgICAgICBkYXRhLndyaXRlKCJcbiIpCiAgICAgICAgZGF0YS5zZWVrKDApCgogICAgY3AgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgIGNwLm9wdGlvbnhmb3JtID0gbGFtYmRhIG9wdGlvbjogb3B0aW9uCiAgICBjcC5yZWFkZnAoZGF0YSkKCiAgICBjb25zb2xlID0ge30KICAgIGd1aSA9IHt9CiAgICBpZiBjcC5oYXNfc2VjdGlvbignY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgY29uc29sZSA9IGRpY3QoY3AuaXRlbXMoJ2NvbnNvbGVfc2NyaXB0cycpKQogICAgaWYgY3AuaGFzX3NlY3Rpb24oJ2d1aV9zY3JpcHRzJyk6CiAgICAgICAgZ3VpID0gZGljdChjcC5pdGVtcygnZ3VpX3NjcmlwdHMnKSkKICAgIHJldHVybiBjb25zb2xlLCBndWkKCgpkZWYgbW92ZV93aGVlbF9maWxlcyhuYW1lLCByZXEsIHdoZWVsZGlyLCB1c2VyPUZhbHNlLCBob21lPU5vbmUsIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIHNjaGVtZT1Ob25lLCBpc29sYXRlZD1GYWxzZSwgcHJlZml4PU5vbmUpOgogICAgIiIiSW5zdGFsbCBhIHdoZWVsIiIiCgogICAgaWYgbm90IHNjaGVtZToKICAgICAgICBzY2hlbWUgPSBkaXN0dXRpbHNfc2NoZW1lKAogICAgICAgICAgICBuYW1lLCB1c2VyPXVzZXIsIGhvbWU9aG9tZSwgcm9vdD1yb290LCBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgcHJlZml4PXByZWZpeCwKICAgICAgICApCgogICAgaWYgcm9vdF9pc19wdXJlbGliKG5hbWUsIHdoZWVsZGlyKToKICAgICAgICBsaWJfZGlyID0gc2NoZW1lWydwdXJlbGliJ10KICAgIGVsc2U6CiAgICAgICAgbGliX2RpciA9IHNjaGVtZVsncGxhdGxpYiddCgogICAgaW5mb19kaXIgPSBbXQogICAgZGF0YV9kaXJzID0gW10KICAgIHNvdXJjZSA9IHdoZWVsZGlyLnJzdHJpcChvcy5wYXRoLnNlcCkgKyBvcy5wYXRoLnNlcAoKICAgICMgUmVjb3JkIGRldGFpbHMgb2YgdGhlIGZpbGVzIG1vdmVkCiAgICAjICAgaW5zdGFsbGVkID0gZmlsZXMgY29waWVkIGZyb20gdGhlIHdoZWVsIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgIyAgIGNoYW5nZWQgPSBmaWxlcyBjaGFuZ2VkIHdoaWxlIGluc3RhbGxpbmcgKHNjcmlwdHMgIyEgbGluZSB0eXBpY2FsbHkpCiAgICAjICAgZ2VuZXJhdGVkID0gZmlsZXMgbmV3bHkgZ2VuZXJhdGVkIGR1cmluZyB0aGUgaW5zdGFsbCAoc2NyaXB0IHdyYXBwZXJzKQogICAgaW5zdGFsbGVkID0ge30KICAgIGNoYW5nZWQgPSBzZXQoKQogICAgZ2VuZXJhdGVkID0gW10KCiAgICAjIENvbXBpbGUgYWxsIG9mIHRoZSBweWMgZmlsZXMgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBpbnN0YWxsaW5nCiAgICBpZiBweWNvbXBpbGU6CiAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CiAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnKQogICAgICAgICAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2Rpcihzb3VyY2UsIGZvcmNlPVRydWUsIHF1aWV0PVRydWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKHN0ZG91dC5nZXR2YWx1ZSgpKQoKICAgIGRlZiBub3JtcGF0aChzcmMsIHApOgogICAgICAgIHJldHVybiBvcy5wYXRoLnJlbHBhdGgoc3JjLCBwKS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCgogICAgZGVmIHJlY29yZF9pbnN0YWxsZWQoc3JjZmlsZSwgZGVzdGZpbGUsIG1vZGlmaWVkPUZhbHNlKToKICAgICAgICAiIiJNYXAgYXJjaGl2ZSBSRUNPUkQgcGF0aHMgdG8gaW5zdGFsbGF0aW9uIFJFQ09SRCBwYXRocy4iIiIKICAgICAgICBvbGRwYXRoID0gbm9ybXBhdGgoc3JjZmlsZSwgd2hlZWxkaXIpCiAgICAgICAgbmV3cGF0aCA9IG5vcm1wYXRoKGRlc3RmaWxlLCBsaWJfZGlyKQogICAgICAgIGluc3RhbGxlZFtvbGRwYXRoXSA9IG5ld3BhdGgKICAgICAgICBpZiBtb2RpZmllZDoKICAgICAgICAgICAgY2hhbmdlZC5hZGQoZGVzdGZpbGUpCgogICAgZGVmIGNsb2JiZXIoc291cmNlLCBkZXN0LCBpc19iYXNlLCBmaXhlcj1Ob25lLCBmaWx0ZXI9Tm9uZSk6CiAgICAgICAgZW5zdXJlX2RpcihkZXN0KSAgIyBjb21tb24gZm9yIHRoZSAnaW5jbHVkZScgcGF0aAoKICAgICAgICBmb3IgZGlyLCBzdWJkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNvdXJjZSk6CiAgICAgICAgICAgIGJhc2VkaXIgPSBkaXJbbGVuKHNvdXJjZSk6XS5sc3RyaXAob3MucGF0aC5zZXApCiAgICAgICAgICAgIGRlc3RkaXIgPSBvcy5wYXRoLmpvaW4oZGVzdCwgYmFzZWRpcikKICAgICAgICAgICAgaWYgaXNfYmFzZSBhbmQgYmFzZWRpci5zcGxpdChvcy5wYXRoLnNlcCwgMSlbMF0uZW5kc3dpdGgoJy5kYXRhJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmb3IgcyBpbiBzdWJkaXJzOgogICAgICAgICAgICAgICAgZGVzdHN1YmRpciA9IG9zLnBhdGguam9pbihkZXN0LCBiYXNlZGlyLCBzKQogICAgICAgICAgICAgICAgaWYgaXNfYmFzZSBhbmQgYmFzZWRpciA9PSAnJyBhbmQgZGVzdHN1YmRpci5lbmRzd2l0aCgnLmRhdGEnKToKICAgICAgICAgICAgICAgICAgICBkYXRhX2RpcnMuYXBwZW5kKHMpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgKGlzX2Jhc2UgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHMuZW5kc3dpdGgoJy5kaXN0LWluZm8nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocykuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHJlcS5uYW1lKSkpOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBub3QgaW5mb19kaXIsICgnTXVsdGlwbGUgLmRpc3QtaW5mbyBkaXJlY3RvcmllczogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RzdWJkaXIgKyAnLCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKGluZm9fZGlyKSkKICAgICAgICAgICAgICAgICAgICBpbmZvX2Rpci5hcHBlbmQoZGVzdHN1YmRpcikKICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAjIFNraXAgdW53YW50ZWQgZmlsZXMKICAgICAgICAgICAgICAgIGlmIGZpbHRlciBhbmQgZmlsdGVyKGYpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5qb2luKGRpciwgZikKICAgICAgICAgICAgICAgIGRlc3RmaWxlID0gb3MucGF0aC5qb2luKGRlc3QsIGJhc2VkaXIsIGYpCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSBjcmVhdGlvbiBpcyBsYXp5IGFuZCBhZnRlciB0aGUgZmlsZSBmaWx0ZXJpbmcgYWJvdmUKICAgICAgICAgICAgICAgICMgdG8gZW5zdXJlIHdlIGRvbid0IGluc3RhbGwgZW1wdHkgZGlyczsgZW1wdHkgZGlycyBjYW4ndCBiZQogICAgICAgICAgICAgICAgIyB1bmluc3RhbGxlZC4KICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZGVzdGRpcikKCiAgICAgICAgICAgICAgICAjIFdlIHVzZSBjb3B5ZmlsZSAobm90IG1vdmUsIGNvcHksIG9yIGNvcHkyKSB0byBiZSBleHRyYSBzdXJlCiAgICAgICAgICAgICAgICAjIHRoYXQgd2UgYXJlIG5vdCBtb3ZpbmcgZGlyZWN0b3JpZXMgb3ZlciAoY29weWZpbGUgZmFpbHMgZm9yCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzKSBhcyB3ZWxsIGFzIHRvIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29weWluZwogICAgICAgICAgICAgICAgIyBvdmVyIGFueSBtZXRhZGF0YSBiZWNhdXNlIHdlIHdhbnQgbW9yZSBjb250cm9sIG92ZXIgd2hhdAogICAgICAgICAgICAgICAgIyBtZXRhZGF0YSB3ZSBhY3R1YWxseSBjb3B5IG92ZXIuCiAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjZmlsZSwgZGVzdGZpbGUpCgogICAgICAgICAgICAgICAgIyBDb3B5IG92ZXIgdGhlIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgY3VycmVudGx5IHRoaXMgb25seQogICAgICAgICAgICAgICAgIyBpbmNsdWRlcyB0aGUgYXRpbWUgYW5kIG10aW1lLgogICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KHNyY2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAidXRpbWUiKToKICAgICAgICAgICAgICAgICAgICBvcy51dGltZShkZXN0ZmlsZSwgKHN0LnN0X2F0aW1lLCBzdC5zdF9tdGltZSkpCgogICAgICAgICAgICAgICAgIyBJZiBvdXIgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuIG1ha2Ugb3VyIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgICAgICAgICMgZXhlY3V0YWJsZS4KICAgICAgICAgICAgICAgIGlmIG9zLmFjY2VzcyhzcmNmaWxlLCBvcy5YX09LKToKICAgICAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXQoc3JjZmlsZSkKICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbW9kZSB8IHN0YXQuU19JWFVTUiB8IHN0YXQuU19JWEdSUCB8IHN0YXQuU19JWE9USAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChkZXN0ZmlsZSwgcGVybWlzc2lvbnMpCgogICAgICAgICAgICAgICAgY2hhbmdlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBmaXhlcjoKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZml4ZXIoZGVzdGZpbGUpCiAgICAgICAgICAgICAgICByZWNvcmRfaW5zdGFsbGVkKHNyY2ZpbGUsIGRlc3RmaWxlLCBjaGFuZ2VkKQoKICAgIGNsb2JiZXIoc291cmNlLCBsaWJfZGlyLCBUcnVlKQoKICAgIGFzc2VydCBpbmZvX2RpciwgIiVzIC5kaXN0LWluZm8gZGlyZWN0b3J5IG5vdCBmb3VuZCIgJSByZXEKCiAgICAjIEdldCB0aGUgZGVmaW5lZCBlbnRyeSBwb2ludHMKICAgIGVwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdlbnRyeV9wb2ludHMudHh0JykKICAgIGNvbnNvbGUsIGd1aSA9IGdldF9lbnRyeXBvaW50cyhlcF9maWxlKQoKICAgIGRlZiBpc19lbnRyeXBvaW50X3dyYXBwZXIobmFtZSk6CiAgICAgICAgIyBFUCwgRVAuZXhlIGFuZCBFUC1zY3JpcHQucHkgYXJlIHNjcmlwdHMgZ2VuZXJhdGVkIGZvcgogICAgICAgICMgZW50cnkgcG9pbnQgRVAgYnkgc2V0dXB0b29scwogICAgICAgIGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotNF0KICAgICAgICBlbGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLXNjcmlwdC5weScpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotMTBdCiAgICAgICAgZWxpZiBuYW1lLmxvd2VyKCkuZW5kc3dpdGgoIi5weWEiKToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZVs6LTRdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZQogICAgICAgICMgSWdub3JlIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNjcmlwdHMKICAgICAgICByZXR1cm4gKG1hdGNobmFtZSBpbiBjb25zb2xlIG9yIG1hdGNobmFtZSBpbiBndWkpCgogICAgZm9yIGRhdGFkaXIgaW4gZGF0YV9kaXJzOgogICAgICAgIGZpeGVyID0gTm9uZQogICAgICAgIGZpbHRlciA9IE5vbmUKICAgICAgICBmb3Igc3ViZGlyIGluIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHdoZWVsZGlyLCBkYXRhZGlyKSk6CiAgICAgICAgICAgIGZpeGVyID0gTm9uZQogICAgICAgICAgICBpZiBzdWJkaXIgPT0gJ3NjcmlwdHMnOgogICAgICAgICAgICAgICAgZml4ZXIgPSBmaXhfc2NyaXB0CiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBpc19lbnRyeXBvaW50X3dyYXBwZXIKICAgICAgICAgICAgc291cmNlID0gb3MucGF0aC5qb2luKHdoZWVsZGlyLCBkYXRhZGlyLCBzdWJkaXIpCiAgICAgICAgICAgIGRlc3QgPSBzY2hlbWVbc3ViZGlyXQogICAgICAgICAgICBjbG9iYmVyKHNvdXJjZSwgZGVzdCwgRmFsc2UsIGZpeGVyPWZpeGVyLCBmaWx0ZXI9ZmlsdGVyKQoKICAgIG1ha2VyID0gU2NyaXB0TWFrZXIoTm9uZSwgc2NoZW1lWydzY3JpcHRzJ10pCgogICAgIyBFbnN1cmUgb2xkIHNjcmlwdHMgYXJlIG92ZXJ3cml0dGVuLgogICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xODAwCiAgICBtYWtlci5jbG9iYmVyID0gVHJ1ZQoKICAgICMgRW5zdXJlIHdlIGRvbid0IGdlbmVyYXRlIGFueSB2YXJpYW50cyBmb3Igc2NyaXB0cyBiZWNhdXNlIHRoaXMgaXMgYWxtb3N0CiAgICAjIG5ldmVyIHdoYXQgc29tZWJvZHkgd2FudHMuCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzM1LwogICAgbWFrZXIudmFyaWFudHMgPSBzZXQoKCcnLCApKQoKICAgICMgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBkaXN0bGliIGNyZWF0ZXMgc2NyaXB0cyB0aGF0IGFyZSBub3QKICAgICMgZXhlY3V0YWJsZS4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzIvCiAgICBtYWtlci5zZXRfbW9kZSA9IFRydWUKCiAgICAjIFNpbXBsaWZ5IHRoZSBzY3JpcHQgYW5kIGZpeCB0aGUgZmFjdCB0aGF0IHRoZSBkZWZhdWx0IHNjcmlwdCBzd2FsbG93cwogICAgIyBldmVyeSBzaW5nbGUgc3RhY2sgdHJhY2UuCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzM0LwogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zMy8KICAgIGRlZiBfZ2V0X3NjcmlwdF90ZXh0KGVudHJ5KToKICAgICAgICBpZiBlbnRyeS5zdWZmaXggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBzY3JpcHQgZW50cnkgcG9pbnQ6ICVzIGZvciByZXE6ICVzIC0gQSBjYWxsYWJsZSAiCiAgICAgICAgICAgICAgICAic3VmZml4IGlzIHJlcXVpcmVkLiBDZiBodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuLyIKICAgICAgICAgICAgICAgICJsYXRlc3QvZGlzdHJpYnV0aW5nLmh0bWwjY29uc29sZS1zY3JpcHRzIGZvciBtb3JlICIKICAgICAgICAgICAgICAgICJpbmZvcm1hdGlvbi4iICUgKGVudHJ5LCByZXEpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gbWFrZXIuc2NyaXB0X3RlbXBsYXRlICUgewogICAgICAgICAgICAibW9kdWxlIjogZW50cnkucHJlZml4LAogICAgICAgICAgICAiaW1wb3J0X25hbWUiOiBlbnRyeS5zdWZmaXguc3BsaXQoIi4iKVswXSwKICAgICAgICAgICAgImZ1bmMiOiBlbnRyeS5zdWZmaXgsCiAgICAgICAgfQoKICAgIG1ha2VyLl9nZXRfc2NyaXB0X3RleHQgPSBfZ2V0X3NjcmlwdF90ZXh0CiAgICBtYWtlci5zY3JpcHRfdGVtcGxhdGUgPSAiIiIjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQppbXBvcnQgcmUKaW1wb3J0IHN5cwoKZnJvbSAlKG1vZHVsZSlzIGltcG9ydCAlKGltcG9ydF9uYW1lKXMKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQogICAgc3lzLmV4aXQoJShmdW5jKXMoKSkKIiIiCgogICAgIyBTcGVjaWFsIGNhc2UgcGlwIGFuZCBzZXR1cHRvb2xzIHRvIGdlbmVyYXRlIHZlcnNpb25lZCB3cmFwcGVycwogICAgIwogICAgIyBUaGUgaXNzdWUgaXMgdGhhdCBzb21lIHByb2plY3RzIChzcGVjaWZpY2FsbHksIHBpcCBhbmQgc2V0dXB0b29scykgdXNlCiAgICAjIGNvZGUgaW4gc2V0dXAucHkgdG8gY3JlYXRlICJ2ZXJzaW9uZWQiIGVudHJ5IHBvaW50cyAtIHBpcDIuNyBvbiBQeXRob24KICAgICMgMi43LCBwaXAzLjMgb24gUHl0aG9uIDMuMywgZXRjLiBCdXQgdGhlc2UgZW50cnkgcG9pbnRzIGFyZSBiYWtlZCBpbnRvCiAgICAjIHRoZSB3aGVlbCBtZXRhZGF0YSBhdCBidWlsZCB0aW1lLCBhbmQgc28gaWYgdGhlIHdoZWVsIGlzIGluc3RhbGxlZCB3aXRoCiAgICAjIGEgKmRpZmZlcmVudCogdmVyc2lvbiBvZiBQeXRob24gdGhlIGVudHJ5IHBvaW50cyB3aWxsIGJlIHdyb25nLiBUaGUKICAgICMgY29ycmVjdCBmaXggZm9yIHRoaXMgaXMgdG8gZW5oYW5jZSB0aGUgbWV0YWRhdGEgdG8gYmUgYWJsZSB0byBkZXNjcmliZQogICAgIyBzdWNoIHZlcnNpb25lZCBlbnRyeSBwb2ludHMsIGJ1dCB0aGF0IHdvbid0IGhhcHBlbiB0aWxsIE1ldGFkYXRhIDIuMCBpcwogICAgIyBhdmFpbGFibGUuCiAgICAjIEluIHRoZSBtZWFudGltZSwgcHJvamVjdHMgdXNpbmcgdmVyc2lvbmVkIGVudHJ5IHBvaW50cyB3aWxsIGVpdGhlciBoYXZlCiAgICAjIGluY29ycmVjdCB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzLCBvciB0aGV5IHdpbGwgbm90IGJlIGFibGUgdG8gZGlzdHJpYnV0ZQogICAgIyAidW5pdmVyc2FsIiB3aGVlbHMgKGkuZS4sIHRoZXkgd2lsbCBuZWVkIGEgd2hlZWwgcGVyIFB5dGhvbiB2ZXJzaW9uKS4KICAgICMKICAgICMgQmVjYXVzZSBzZXR1cHRvb2xzIGFuZCBwaXAgYXJlIGJ1bmRsZWQgd2l0aCBfZW5zdXJlcGlwIGFuZCB2aXJ0dWFsZW52LAogICAgIyB3ZSBuZWVkIHRvIHVzZSB1bml2ZXJzYWwgd2hlZWxzLiBTbywgYXMgYSBzdG9wZ2FwIHVudGlsIE1ldGFkYXRhIDIuMCwgd2UKICAgICMgb3ZlcnJpZGUgdGhlIHZlcnNpb25lZCBlbnRyeSBwb2ludHMgaW4gdGhlIHdoZWVsIGFuZCBnZW5lcmF0ZSB0aGUKICAgICMgY29ycmVjdCBvbmVzLiBUaGlzIGNvZGUgaXMgcHVyZWx5IGEgc2hvcnQtdGVybSBtZWFzdXJlIHVudGlsIE1ldGFkYXRhIDIuMAogICAgIyBpcyBhdmFpbGFibGUuCiAgICAjCiAgICAjIFRvIGFkZCB0aGUgbGV2ZWwgb2YgaGFjayBpbiB0aGlzIHNlY3Rpb24gb2YgY29kZSwgaW4gb3JkZXIgdG8gc3VwcG9ydAogICAgIyBlbnN1cmVwaXAgdGhpcyBjb2RlIHdpbGwgbG9vayBmb3IgYW4gYGBFTlNVUkVQSVBfT1BUSU9OU2BgIGVudmlyb25tZW50CiAgICAjIHZhcmlhYmxlIHdoaWNoIHdpbGwgY29udHJvbCB3aGljaCB2ZXJzaW9uIHNjcmlwdHMgZ2V0IGluc3RhbGxlZC4KICAgICMKICAgICMgRU5TVVJFUElQX09QVElPTlM9YWx0aW5zdGFsbAogICAgIyAgIC0gT25seSBwaXBYLlkgYW5kIGVhc3lfaW5zdGFsbC1YLlkgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGluc3RhbGxlZAogICAgIyBFTlNVUkVQSVBfT1BUSU9OUz1pbnN0YWxsCiAgICAjICAgLSBwaXBYLlksIHBpcFgsIGVhc3lfaW5zdGFsbC1YLlkgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGluc3RhbGxlZC4gTm90ZQogICAgIyAgICAgdGhhdCB0aGlzIG9wdGlvbiBpcyB0ZWNobmljYWxseSBpZiBFTlNVUkVQSVBfT1BUSU9OUyBpcyBzZXQgYW5kIGlzCiAgICAjICAgICBub3QgYWx0aW5zdGFsbAogICAgIyBERUZBVUxUCiAgICAjICAgLSBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBpbnN0YWxsIHBpcCwgcGlwWCwgcGlwWC5ZLCBlYXN5X2luc3RhbGwKICAgICMgICAgIGFuZCBlYXN5X2luc3RhbGwtWC5ZLgogICAgcGlwX3NjcmlwdCA9IGNvbnNvbGUucG9wKCdwaXAnLCBOb25lKQogICAgaWYgcGlwX3NjcmlwdDoKICAgICAgICBpZiAiRU5TVVJFUElQX09QVElPTlMiIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzcGVjID0gJ3BpcCA9ICcgKyBwaXBfc2NyaXB0CiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIkVOU1VSRVBJUF9PUFRJT05TIiwgIiIpICE9ICJhbHRpbnN0YWxsIjoKICAgICAgICAgICAgc3BlYyA9ICdwaXAlcyA9ICVzJyAlIChzeXMudmVyc2lvbls6MV0sIHBpcF9zY3JpcHQpCiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgc3BlYyA9ICdwaXAlcyA9ICVzJyAlIChzeXMudmVyc2lvbls6M10sIHBpcF9zY3JpcHQpCiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQogICAgICAgICMgRGVsZXRlIGFueSBvdGhlciB2ZXJzaW9uZWQgcGlwIGVudHJ5IHBvaW50cwogICAgICAgIHBpcF9lcCA9IFtrIGZvciBrIGluIGNvbnNvbGUgaWYgcmUubWF0Y2gocidwaXAoXGQoXC5cZCk/KT8kJywgayldCiAgICAgICAgZm9yIGsgaW4gcGlwX2VwOgogICAgICAgICAgICBkZWwgY29uc29sZVtrXQogICAgZWFzeV9pbnN0YWxsX3NjcmlwdCA9IGNvbnNvbGUucG9wKCdlYXN5X2luc3RhbGwnLCBOb25lKQogICAgaWYgZWFzeV9pbnN0YWxsX3NjcmlwdDoKICAgICAgICBpZiAiRU5TVVJFUElQX09QVElPTlMiIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzcGVjID0gJ2Vhc3lfaW5zdGFsbCA9ICcgKyBlYXN5X2luc3RhbGxfc2NyaXB0CiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgc3BlYyA9ICdlYXN5X2luc3RhbGwtJXMgPSAlcycgJSAoc3lzLnZlcnNpb25bOjNdLCBlYXN5X2luc3RhbGxfc2NyaXB0KQogICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKICAgICAgICAjIERlbGV0ZSBhbnkgb3RoZXIgdmVyc2lvbmVkIGVhc3lfaW5zdGFsbCBlbnRyeSBwb2ludHMKICAgICAgICBlYXN5X2luc3RhbGxfZXAgPSBbCiAgICAgICAgICAgIGsgZm9yIGsgaW4gY29uc29sZSBpZiByZS5tYXRjaChyJ2Vhc3lfaW5zdGFsbCgtXGRcLlxkKT8kJywgaykKICAgICAgICBdCiAgICAgICAgZm9yIGsgaW4gZWFzeV9pbnN0YWxsX2VwOgogICAgICAgICAgICBkZWwgY29uc29sZVtrXQoKICAgICMgR2VuZXJhdGUgdGhlIGNvbnNvbGUgYW5kIEdVSSBlbnRyeSBwb2ludHMgc3BlY2lmaWVkIGluIHRoZSB3aGVlbAogICAgaWYgbGVuKGNvbnNvbGUpID4gMDoKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKAogICAgICAgICAgICBtYWtlci5tYWtlX211bHRpcGxlKFsnJXMgPSAlcycgJSBrdiBmb3Iga3YgaW4gY29uc29sZS5pdGVtcygpXSkKICAgICAgICApCiAgICBpZiBsZW4oZ3VpKSA+IDA6CiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZCgKICAgICAgICAgICAgbWFrZXIubWFrZV9tdWx0aXBsZSgKICAgICAgICAgICAgICAgIFsnJXMgPSAlcycgJSBrdiBmb3Iga3YgaW4gZ3VpLml0ZW1zKCldLAogICAgICAgICAgICAgICAgeydndWknOiBUcnVlfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICMgUmVjb3JkIHBpcCBhcyB0aGUgaW5zdGFsbGVyCiAgICBpbnN0YWxsZXIgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdJTlNUQUxMRVInKQogICAgdGVtcF9pbnN0YWxsZXIgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdJTlNUQUxMRVIucGlwJykKICAgIHdpdGggb3Blbih0ZW1wX2luc3RhbGxlciwgJ3diJykgYXMgaW5zdGFsbGVyX2ZpbGU6CiAgICAgICAgaW5zdGFsbGVyX2ZpbGUud3JpdGUoYidwaXBcbicpCiAgICBzaHV0aWwubW92ZSh0ZW1wX2luc3RhbGxlciwgaW5zdGFsbGVyKQogICAgZ2VuZXJhdGVkLmFwcGVuZChpbnN0YWxsZXIpCgogICAgIyBSZWNvcmQgZGV0YWlscyBvZiBhbGwgZmlsZXMgaW5zdGFsbGVkCiAgICByZWNvcmQgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdSRUNPUkQnKQogICAgdGVtcF9yZWNvcmQgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdSRUNPUkQucGlwJykKICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZCwgJ3InKSBhcyByZWNvcmRfaW46CiAgICAgICAgd2l0aCBvcGVuX2Zvcl9jc3YodGVtcF9yZWNvcmQsICd3KycpIGFzIHJlY29yZF9vdXQ6CiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIocmVjb3JkX2luKQogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHJlY29yZF9vdXQpCiAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgcm93WzBdID0gaW5zdGFsbGVkLnBvcChyb3dbMF0sIHJvd1swXSkKICAgICAgICAgICAgICAgIGlmIHJvd1swXSBpbiBjaGFuZ2VkOgogICAgICAgICAgICAgICAgICAgIHJvd1sxXSwgcm93WzJdID0gcmVoYXNoKHJvd1swXSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhyb3cpCiAgICAgICAgICAgIGZvciBmIGluIGdlbmVyYXRlZDoKICAgICAgICAgICAgICAgIGgsIGwgPSByZWhhc2goZikKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygobm9ybXBhdGgoZiwgbGliX2RpciksIGgsIGwpKQogICAgICAgICAgICBmb3IgZiBpbiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKGluc3RhbGxlZFtmXSwgJycsICcnKSkKICAgIHNodXRpbC5tb3ZlKHRlbXBfcmVjb3JkLCByZWNvcmQpCgoKZGVmIF91bmlxdWUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB1bmlxdWUoKmFyZ3MsICoqa3cpOgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBpdGVtIGluIGZuKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKGl0ZW0pCiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAgICByZXR1cm4gdW5pcXVlCgoKIyBUT0RPOiB0aGlzIGdvZXMgc29tZXdoZXJlIGJlc2lkZXMgdGhlIHdoZWVsIG1vZHVsZQpAX3VuaXF1ZQpkZWYgdW5pbnN0YWxsYXRpb25fcGF0aHMoZGlzdCk6CiAgICAiIiIKICAgIFlpZWxkIGFsbCB0aGUgdW5pbnN0YWxsYXRpb24gcGF0aHMgZm9yIGRpc3QgYmFzZWQgb24gUkVDT1JELXdpdGhvdXQtLnB5YwoKICAgIFlpZWxkIHBhdGhzIHRvIGFsbCB0aGUgZmlsZXMgaW4gUkVDT1JELiBGb3IgZWFjaCAucHkgZmlsZSBpbiBSRUNPUkQsIGFkZAogICAgdGhlIC5weWMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoKICAgIFVuaW5zdGFsbFBhdGhTZXQuYWRkKCkgdGFrZXMgY2FyZSBvZiB0aGUgX19weWNhY2hlX18gLnB5Yy4KICAgICIiIgogICAgZnJvbSBwaXAudXRpbHMgaW1wb3J0IEZha2VGaWxlICAjIGNpcmN1bGFyIGltcG9ydAogICAgciA9IGNzdi5yZWFkZXIoRmFrZUZpbGUoZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ1JFQ09SRCcpKSkKICAgIGZvciByb3cgaW4gcjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHJvd1swXSkKICAgICAgICB5aWVsZCBwYXRoCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgIGRuLCBmbiA9IG9zLnBhdGguc3BsaXQocGF0aCkKICAgICAgICAgICAgYmFzZSA9IGZuWzotM10KICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkbiwgYmFzZSArICcucHljJykKICAgICAgICAgICAgeWllbGQgcGF0aAoKCmRlZiB3aGVlbF92ZXJzaW9uKHNvdXJjZV9kaXIpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIFdoZWVsLVZlcnNpb24gb2YgYW4gZXh0cmFjdGVkIHdoZWVsLCBpZiBwb3NzaWJsZS4KCiAgICBPdGhlcndpc2UsIHJldHVybiBGYWxzZSBpZiB3ZSBjb3VsZG4ndCBwYXJzZSAvIGV4dHJhY3QgaXQuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBkaXN0ID0gW2QgZm9yIGQgaW4gcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGgoTm9uZSwgc291cmNlX2RpcildWzBdCgogICAgICAgIHdoZWVsX2RhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgIHdoZWVsX2RhdGEgPSBQYXJzZXIoKS5wYXJzZXN0cih3aGVlbF9kYXRhKQoKICAgICAgICB2ZXJzaW9uID0gd2hlZWxfZGF0YVsnV2hlZWwtVmVyc2lvbiddLnN0cmlwKCkKICAgICAgICB2ZXJzaW9uID0gdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgogICAgZXhjZXB0OgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBjaGVja19jb21wYXRpYmlsaXR5KHZlcnNpb24sIG5hbWUpOgogICAgIiIiCiAgICBSYWlzZXMgZXJyb3JzIG9yIHdhcm5zIGlmIGNhbGxlZCB3aXRoIGFuIGluY29tcGF0aWJsZSBXaGVlbC1WZXJzaW9uLgoKICAgIFBpcCBzaG91bGQgcmVmdXNlIHRvIGluc3RhbGwgYSBXaGVlbC1WZXJzaW9uIHRoYXQncyBhIG1ham9yIHNlcmllcwogICAgYWhlYWQgb2Ygd2hhdCBpdCdzIGNvbXBhdGlibGUgd2l0aCAoZS5nIDIuMCA+IDEuMSk7IGFuZCB3YXJuIHdoZW4KICAgIGluc3RhbGxpbmcgYSB2ZXJzaW9uIG9ubHkgbWlub3IgdmVyc2lvbiBhaGVhZCAoZS5nIDEuMiA+IDEuMSkuCgogICAgdmVyc2lvbjogYSAyLXR1cGxlIHJlcHJlc2VudGluZyBhIFdoZWVsLVZlcnNpb24gKE1ham9yLCBNaW5vcikKICAgIG5hbWU6IG5hbWUgb2Ygd2hlZWwgb3IgcGFja2FnZSB0byByYWlzZSBleGNlcHRpb24gYWJvdXQKCiAgICA6cmFpc2VzIFVuc3VwcG9ydGVkV2hlZWw6IHdoZW4gYW4gaW5jb21wYXRpYmxlIFdoZWVsLVZlcnNpb24gaXMgZ2l2ZW4KICAgICIiIgogICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRXaGVlbCgKICAgICAgICAgICAgIiVzIGlzIGluIGFuIHVuc3VwcG9ydGVkIG9yIGludmFsaWQgd2hlZWwiICUgbmFtZQogICAgICAgICkKICAgIGlmIHZlcnNpb25bMF0gPiBWRVJTSU9OX0NPTVBBVElCTEVbMF06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRXaGVlbCgKICAgICAgICAgICAgIiVzJ3MgV2hlZWwtVmVyc2lvbiAoJXMpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uICIKICAgICAgICAgICAgIm9mIHBpcCIgJSAobmFtZSwgJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpKQogICAgICAgICkKICAgIGVsaWYgdmVyc2lvbiA+IFZFUlNJT05fQ09NUEFUSUJMRToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgJ0luc3RhbGxpbmcgZnJvbSBhIG5ld2VyIFdoZWVsLVZlcnNpb24gKCVzKScsCiAgICAgICAgICAgICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKSwKICAgICAgICApCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKICAgICIiIkEgd2hlZWwgZmlsZSIiIgoKICAgICMgVE9ETzogbWF5YmUgbW92ZSB0aGUgaW5zdGFsbCBjb2RlIGludG8gdGhpcyBjbGFzcwoKICAgIHdoZWVsX2ZpbGVfcmUgPSByZS5jb21waWxlKAogICAgICAgIHIiIiJeKD9QPG5hbWV2ZXI+KD9QPG5hbWU+Lis/KS0oP1A8dmVyPlxkLio/KSkKICAgICAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5dmVyPi4rPyktKD9QPGFiaT4uKz8pLSg/UDxwbGF0Pi4rPykKICAgICAgICBcLndobHxcLmRpc3QtaW5mbykkIiIiLAogICAgICAgIHJlLlZFUkJPU0UKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIgogICAgICAgIDpyYWlzZXMgSW52YWxpZFdoZWVsRmlsZW5hbWU6IHdoZW4gdGhlIGZpbGVuYW1lIGlzIGludmFsaWQgZm9yIGEgd2hlZWwKICAgICAgICAiIiIKICAgICAgICB3aGVlbF9pbmZvID0gc2VsZi53aGVlbF9maWxlX3JlLm1hdGNoKGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCB3aGVlbF9pbmZvOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkV2hlZWxGaWxlbmFtZSgKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSB2YWxpZCB3aGVlbCBmaWxlbmFtZS4iICUgZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYubmFtZSA9IHdoZWVsX2luZm8uZ3JvdXAoJ25hbWUnKS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgICMgd2UnbGwgYXNzdW1lICJfIiBtZWFucyAiLSIgZHVlIHRvIHdoZWVsIG5hbWluZyBzY2hlbWUKICAgICAgICAjIChodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzExNTApCiAgICAgICAgc2VsZi52ZXJzaW9uID0gd2hlZWxfaW5mby5ncm91cCgndmVyJykucmVwbGFjZSgnXycsICctJykKICAgICAgICBzZWxmLnB5dmVyc2lvbnMgPSB3aGVlbF9pbmZvLmdyb3VwKCdweXZlcicpLnNwbGl0KCcuJykKICAgICAgICBzZWxmLmFiaXMgPSB3aGVlbF9pbmZvLmdyb3VwKCdhYmknKS5zcGxpdCgnLicpCiAgICAgICAgc2VsZi5wbGF0cyA9IHdoZWVsX2luZm8uZ3JvdXAoJ3BsYXQnKS5zcGxpdCgnLicpCgogICAgICAgICMgQWxsIHRoZSB0YWcgY29tYmluYXRpb25zIGZyb20gdGhpcyBmaWxlCiAgICAgICAgc2VsZi5maWxlX3RhZ3MgPSBzZXQoCiAgICAgICAgICAgICh4LCB5LCB6KSBmb3IgeCBpbiBzZWxmLnB5dmVyc2lvbnMKICAgICAgICAgICAgZm9yIHkgaW4gc2VsZi5hYmlzIGZvciB6IGluIHNlbGYucGxhdHMKICAgICAgICApCgogICAgZGVmIHN1cHBvcnRfaW5kZXhfbWluKHNlbGYsIHRhZ3M9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggdGhhdCBvbmUgb2YgdGhlIHdoZWVsJ3MgZmlsZV90YWcgY29tYmluYXRpb25zCiAgICAgICAgYWNoaWV2ZXMgaW4gdGhlIHN1cHBvcnRlZF90YWdzIGxpc3QgZS5nLiBpZiB0aGVyZSBhcmUgOCBzdXBwb3J0ZWQgdGFncywKICAgICAgICBhbmQgb25lIG9mIHRoZSBmaWxlIHRhZ3MgaXMgZmlyc3QgaW4gdGhlIGxpc3QsIHRoZW4gcmV0dXJuIDAuICBSZXR1cm5zCiAgICAgICAgTm9uZSBpcyB0aGUgd2hlZWwgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiB0YWdzIGlzIE5vbmU6ICAjIGZvciBtb2NrCiAgICAgICAgICAgIHRhZ3MgPSBwZXA0MjV0YWdzLnN1cHBvcnRlZF90YWdzCiAgICAgICAgaW5kZXhlcyA9IFt0YWdzLmluZGV4KGMpIGZvciBjIGluIHNlbGYuZmlsZV90YWdzIGlmIGMgaW4gdGFnc10KICAgICAgICByZXR1cm4gbWluKGluZGV4ZXMpIGlmIGluZGV4ZXMgZWxzZSBOb25lCgogICAgZGVmIHN1cHBvcnRlZChzZWxmLCB0YWdzPU5vbmUpOgogICAgICAgICIiIklzIHRoaXMgd2hlZWwgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtPyIiIgogICAgICAgIGlmIHRhZ3MgaXMgTm9uZTogICMgZm9yIG1vY2sKICAgICAgICAgICAgdGFncyA9IHBlcDQyNXRhZ3Muc3VwcG9ydGVkX3RhZ3MKICAgICAgICByZXR1cm4gYm9vbChzZXQodGFncykuaW50ZXJzZWN0aW9uKHNlbGYuZmlsZV90YWdzKSkKCgpjbGFzcyBXaGVlbEJ1aWxkZXIob2JqZWN0KToKICAgICIiIkJ1aWxkIHdoZWVscyBmcm9tIGEgUmVxdWlyZW1lbnRTZXQuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3NldCwgZmluZGVyLCBidWlsZF9vcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9Tm9uZSk6CiAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQgPSByZXF1aXJlbWVudF9zZXQKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlcgogICAgICAgIHNlbGYuX2NhY2hlX3Jvb3QgPSByZXF1aXJlbWVudF9zZXQuX3doZWVsX2NhY2hlLl9jYWNoZV9kaXIKICAgICAgICBzZWxmLl93aGVlbF9kaXIgPSByZXF1aXJlbWVudF9zZXQud2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi5idWlsZF9vcHRpb25zID0gYnVpbGRfb3B0aW9ucyBvciBbXQogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBnbG9iYWxfb3B0aW9ucyBvciBbXQoKICAgIGRlZiBfYnVpbGRfb25lKHNlbGYsIHJlcSwgb3V0cHV0X2RpciwgcHl0aG9uX3RhZz1Ob25lKToKICAgICAgICAiIiJCdWlsZCBvbmUgd2hlZWwuCgogICAgICAgIDpyZXR1cm46IFRoZSBmaWxlbmFtZSBvZiB0aGUgYnVpbHQgd2hlZWwsIG9yIE5vbmUgaWYgdGhlIGJ1aWxkIGZhaWxlZC4KICAgICAgICAiIiIKICAgICAgICB0ZW1wZCA9IHRlbXBmaWxlLm1rZHRlbXAoJ3BpcC13aGVlbC0nKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5fX2J1aWxkX29uZShyZXEsIHRlbXBkLCBweXRob25fdGFnPXB5dGhvbl90YWcpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdoZWVsX25hbWUgPSBvcy5saXN0ZGlyKHRlbXBkKVswXQogICAgICAgICAgICAgICAgICAgIHdoZWVsX3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2Rpciwgd2hlZWxfbmFtZSkKICAgICAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShvcy5wYXRoLmpvaW4odGVtcGQsIHdoZWVsX25hbWUpLCB3aGVlbF9wYXRoKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdG9yZWQgaW4gZGlyZWN0b3J5OiAlcycsIG91dHB1dF9kaXIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdoZWVsX3BhdGgKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICMgSWdub3JlIHJldHVybiwgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSB1c2VmdWwuCiAgICAgICAgICAgIHNlbGYuX2NsZWFuX29uZShyZXEpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBkKQoKICAgIGRlZiBfYmFzZV9zZXR1cF9hcmdzKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICItdSIsICctYycsCiAgICAgICAgICAgIFNFVFVQVE9PTFNfU0hJTSAlIHJlcS5zZXR1cF9weQogICAgICAgIF0gKyBsaXN0KHNlbGYuZ2xvYmFsX29wdGlvbnMpCgogICAgZGVmIF9fYnVpbGRfb25lKHNlbGYsIHJlcSwgdGVtcGQsIHB5dGhvbl90YWc9Tm9uZSk6CiAgICAgICAgYmFzZV9hcmdzID0gc2VsZi5fYmFzZV9zZXR1cF9hcmdzKHJlcSkKCiAgICAgICAgc3Bpbl9tZXNzYWdlID0gJ1J1bm5pbmcgc2V0dXAucHkgYmRpc3Rfd2hlZWwgZm9yICVzJyAlIChyZXEubmFtZSwpCiAgICAgICAgd2l0aCBvcGVuX3NwaW5uZXIoc3Bpbl9tZXNzYWdlKSBhcyBzcGlubmVyOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Rlc3RpbmF0aW9uIGRpcmVjdG9yeTogJXMnLCB0ZW1wZCkKICAgICAgICAgICAgd2hlZWxfYXJncyA9IGJhc2VfYXJncyArIFsnYmRpc3Rfd2hlZWwnLCAnLWQnLCB0ZW1wZF0gXAogICAgICAgICAgICAgICAgKyBzZWxmLmJ1aWxkX29wdGlvbnMKCiAgICAgICAgICAgIGlmIHB5dGhvbl90YWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3aGVlbF9hcmdzICs9IFsiLS1weXRob24tdGFnIiwgcHl0aG9uX3RhZ10KCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNhbGxfc3VicHJvY2Vzcyh3aGVlbF9hcmdzLCBjd2Q9cmVxLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgc3Bpbm5lcj1zcGlubmVyKQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgc3Bpbm5lci5maW5pc2goImVycm9yIikKICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIGJ1aWxkaW5nIHdoZWVsIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9jbGVhbl9vbmUoc2VsZiwgcmVxKToKICAgICAgICBiYXNlX2FyZ3MgPSBzZWxmLl9iYXNlX3NldHVwX2FyZ3MocmVxKQoKICAgICAgICBsb2dnZXIuaW5mbygnUnVubmluZyBzZXR1cC5weSBjbGVhbiBmb3IgJXMnLCByZXEubmFtZSkKICAgICAgICBjbGVhbl9hcmdzID0gYmFzZV9hcmdzICsgWydjbGVhbicsICctLWFsbCddCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoY2xlYW5fYXJncywgY3dkPXJlcS5zb3VyY2VfZGlyLCBzaG93X3N0ZG91dD1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIGNsZWFuaW5nIGJ1aWxkIGRpciBmb3IgJXMnLCByZXEubmFtZSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGJ1aWxkKHNlbGYsIGF1dG9idWlsZGluZz1GYWxzZSk6CiAgICAgICAgIiIiQnVpbGQgd2hlZWxzLgoKICAgICAgICA6cGFyYW0gdW5wYWNrOiBJZiBUcnVlLCByZXBsYWNlIHRoZSBzZGlzdCB3ZSBidWlsdCBmcm9tIHdpdGggdGhlCiAgICAgICAgICAgIG5ld2x5IGJ1aWx0IHdoZWVsLCBpbiBwcmVwYXJhdGlvbiBmb3IgaW5zdGFsbGF0aW9uLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgYWxsIHRoZSB3aGVlbHMgYnVpbHQgY29ycmVjdGx5LgogICAgICAgICIiIgogICAgICAgIGFzc2VydCBzZWxmLl93aGVlbF9kaXIgb3IgKGF1dG9idWlsZGluZyBhbmQgc2VsZi5fY2FjaGVfcm9vdCkKICAgICAgICAjIHVucGFjayBzZGlzdHMgYW5kIGNvbnN0cnVjdHMgcmVxIHNldAogICAgICAgIHNlbGYucmVxdWlyZW1lbnRfc2V0LnByZXBhcmVfZmlsZXMoc2VsZi5maW5kZXIpCgogICAgICAgIHJlcXNldCA9IHNlbGYucmVxdWlyZW1lbnRfc2V0LnJlcXVpcmVtZW50cy52YWx1ZXMoKQoKICAgICAgICBidWlsZHNldCA9IFtdCiAgICAgICAgZm9yIHJlcSBpbiByZXFzZXQ6CiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcmVxLmlzX3doZWVsOgogICAgICAgICAgICAgICAgaWYgbm90IGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nICVzLCBkdWUgdG8gYWxyZWFkeSBiZWluZyB3aGVlbC4nLCByZXEubmFtZSkKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIHJlcS5lZGl0YWJsZToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIHJlcS5saW5rIGFuZCBub3QgcmVxLmxpbmsuaXNfYXJ0aWZhY3Q6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsaWYgYXV0b2J1aWxkaW5nIGFuZCBub3QgcmVxLnNvdXJjZV9kaXI6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBhdXRvYnVpbGRpbmc6CiAgICAgICAgICAgICAgICAgICAgbGluayA9IHJlcS5saW5rCiAgICAgICAgICAgICAgICAgICAgYmFzZSwgZXh0ID0gbGluay5zcGxpdGV4dCgpCiAgICAgICAgICAgICAgICAgICAgaWYgcGlwLmluZGV4LmVnZ19pbmZvX21hdGNoZXMoYmFzZSwgTm9uZSwgbGluaykgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb2Vzbid0IGxvb2sgbGlrZSBhIHBhY2thZ2UgLSBkb24ndCBhdXRvYnVpbGQgYSB3aGVlbAogICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2Ugd2UnbGwgaGF2ZSBubyB3YXkgdG8gbG9va3VwIHRoZSByZXN1bHQgc2FuZWx5CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgImJpbmFyeSIgbm90IGluIHBpcC5pbmRleC5mbXRfY3RsX2Zvcm1hdHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbmRlci5mb3JtYXRfY29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHJlcS5uYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGJkaXN0X3doZWVsIGZvciAlcywgZHVlIHRvIGJpbmFyaWVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWluZyBkaXNhYmxlZCBmb3IgaXQuIiwgcmVxLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBidWlsZHNldC5hcHBlbmQocmVxKQoKICAgICAgICBpZiBub3QgYnVpbGRzZXQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgQnVpbGQgdGhlIHdoZWVscy4KICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgJ0J1aWxkaW5nIHdoZWVscyBmb3IgY29sbGVjdGVkIHBhY2thZ2VzOiAlcycsCiAgICAgICAgICAgICcsICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZHNldF0pLAogICAgICAgICkKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgYnVpbGRfc3VjY2VzcywgYnVpbGRfZmFpbHVyZSA9IFtdLCBbXQogICAgICAgICAgICBmb3IgcmVxIGluIGJ1aWxkc2V0OgogICAgICAgICAgICAgICAgcHl0aG9uX3RhZyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBweXRob25fdGFnID0gcGVwNDI1dGFncy5pbXBsZW1lbnRhdGlvbl90YWcKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyID0gX2NhY2hlX2Zvcl9saW5rKHNlbGYuX2NhY2hlX3Jvb3QsIHJlcS5saW5rKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX2RpcihvdXRwdXRfZGlyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJCdWlsZGluZyB3aGVlbCBmb3IgJXMgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lLCBlKQogICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9mYWlsdXJlLmFwcGVuZChyZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIgPSBzZWxmLl93aGVlbF9kaXIKICAgICAgICAgICAgICAgIHdoZWVsX2ZpbGUgPSBzZWxmLl9idWlsZF9vbmUoCiAgICAgICAgICAgICAgICAgICAgcmVxLCBvdXRwdXRfZGlyLAogICAgICAgICAgICAgICAgICAgIHB5dGhvbl90YWc9cHl0aG9uX3RhZywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHdoZWVsX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgYnVpbGRfc3VjY2Vzcy5hcHBlbmQocmVxKQogICAgICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFg6IFRoaXMgaXMgbWlsZGx5IGR1cGxpY2F0aXZlIHdpdGggcHJlcGFyZV9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgIyBidXQgbm90IGNsb3NlIGVub3VnaCB0byBwdWxsIG91dCB0byBhIHNpbmdsZSBjb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgYmVsb3cgYXNzdW1lcyB0ZW1wb3Jhcnkgc291cmNlIGRpcnMgLQogICAgICAgICAgICAgICAgICAgICAgICAjIHByZXZlbnQgaXQgZG9pbmcgYmFkIHRoaW5ncy4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVxLnNvdXJjZV9kaXIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNvdXJjZV9kaXIsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHNvdXJjZSBkaXIgLSBtaXNzaW5nIG1hcmtlciIpCiAgICAgICAgICAgICAgICAgICAgICAgICMgRGVsZXRlIHRoZSBzb3VyY2Ugd2UgYnVpbHQgdGhlIHdoZWVsIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhZ2FpbiAtIG5hbWUgaXMga25vd24gZnJvbQogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSB3b3JrIHByZXBhcmVfZmlsZXMgZGlkLgogICAgICAgICAgICAgICAgICAgICAgICByZXEuc291cmNlX2RpciA9IHJlcS5idWlsZF9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZW1lbnRfc2V0LmJ1aWxkX2RpcikKICAgICAgICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIGxpbmsgZm9yIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5saW5rID0gcGlwLmluZGV4LkxpbmsoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX3VybCh3aGVlbF9maWxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJlcS5saW5rLmlzX3doZWVsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgd2hlZWwgaW50byB0aGUgZGlyCiAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja191cmwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubGluaywgcmVxLnNvdXJjZV9kaXIsIE5vbmUsIEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZWxmLnJlcXVpcmVtZW50X3NldC5zZXNzaW9uKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBidWlsZF9mYWlsdXJlLmFwcGVuZChyZXEpCgogICAgICAgICMgbm90aWZ5IHN1Y2Nlc3MvZmFpbHVyZQogICAgICAgIGlmIGJ1aWxkX3N1Y2Nlc3M6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBidWlsdCAlcycsCiAgICAgICAgICAgICAgICAnICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZF9zdWNjZXNzXSksCiAgICAgICAgICAgICkKICAgICAgICBpZiBidWlsZF9mYWlsdXJlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gYnVpbGQgJXMnLAogICAgICAgICAgICAgICAgJyAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gYnVpbGRfZmFpbHVyZV0pLAogICAgICAgICAgICApCiAgICAgICAgIyBSZXR1cm4gVHJ1ZSBpZiBhbGwgYnVpbGRzIHdlcmUgc3VjY2Vzc2Z1bAogICAgICAgIHJldHVybiBsZW4oYnVpbGRfZmFpbHVyZSkgPT0gMApQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAXE+6RX4AAAB+AAAAJwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L2Vhc3lfaW5zdGFsbC5weSIiIlJ1biB0aGUgRWFzeUluc3RhbGwgY29tbWFuZCIiIgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAF0SeKQeeAQAHngEAMQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHkjIGNvZGluZzogdXRmLTgKIiIiClBhY2thZ2UgcmVzb3VyY2UgQVBJCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKc3ViZGlyZWN0b3J5IHRoZXJlb2YuICBUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgZXhwZWN0cyByZXNvdXJjZSBuYW1lcwp0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbApwYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKbmFtZXMgYmVpbmcgcGFzc2VkIGludG8gdGhlIEFQSS4KClRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCi5lZ2cgZmlsZXMsIGFuZCB1bnBhY2tlZCAuZWdnIGZpbGVzLiAgSXQgY2FuIGFsc28gd29yayBpbiBhIGxpbWl0ZWQgd2F5IHdpdGgKLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKbWV0aG9kLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgaW8KaW1wb3J0IHRpbWUKaW1wb3J0IHJlCmltcG9ydCB0eXBlcwppbXBvcnQgemlwZmlsZQppbXBvcnQgemlwaW1wb3J0CmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc3RhdAppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBwa2d1dGlsCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBwbGlzdGxpYgppbXBvcnQgZW1haWwucGFyc2VyCmltcG9ydCBlcnJubwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGluc3BlY3QKZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfaW1wb3J0ZXIKCnRyeToKICAgIGltcG9ydCBfaW1wCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDMuMiBjb21wYXRpYmlsaXR5CiAgICBpbXBvcnQgaW1wIGFzIF9pbXAKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBtYXAsIGZpbHRlcgoKIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCmZyb20gb3MgaW1wb3J0IHV0aW1lCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IG1rZGlyLCByZW5hbWUsIHVubGluawogICAgV1JJVEVfU1VQUE9SVCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBubyB3cml0ZSBzdXBwb3J0LCBwcm9iYWJseSB1bmRlciBHQUUKICAgIFdSSVRFX1NVUFBPUlQgPSBGYWxzZQoKZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCmZyb20gb3MucGF0aCBpbXBvcnQgaXNkaXIsIHNwbGl0Cgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeSBhcyBpbXBvcnRsaWJfbWFjaGluZXJ5CiAgICAjIGFjY2VzcyBhdHRyaWJ1dGUgdG8gZm9yY2UgaW1wb3J0IHVuZGVyIGRlbGF5ZWQgaW1wb3J0IG1lY2hhbmlzbXMuCiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5Ll9fbmFtZV9fCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydGxpYl9tYWNoaW5lcnkgPSBOb25lCgpmcm9tIC4gaW1wb3J0IHB5MzFjb21wYXQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgYXBwZGlycwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24nKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5yZXF1aXJlbWVudHMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcubWFya2VycycpCgoKaWYgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUHl0aG9uIDMuMyBvciBsYXRlciBpcyByZXF1aXJlZCIpCgppZiBzaXguUFkyOgogICAgIyBUaG9zZSBidWlsdGluIGV4Y2VwdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBpbiBQeXRob24gMwogICAgUGVybWlzc2lvbkVycm9yID0gTm9uZQogICAgTm90QURpcmVjdG9yeUVycm9yID0gTm9uZQoKIyBkZWNsYXJlIHNvbWUgZ2xvYmFscyB0aGF0IHdpbGwgYmUgZGVmaW5lZCBsYXRlciB0bwojIHNhdGlzZnkgdGhlIGxpbnRlcnMuCnJlcXVpcmUgPSBOb25lCndvcmtpbmdfc2V0ID0gTm9uZQoKCmNsYXNzIFBFUDQ0MFdhcm5pbmcoUnVudGltZVdhcm5pbmcpOgogICAgIiIiCiAgICBVc2VkIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBhIHZlcnNpb24gb3Igc3BlY2lmaWVyIG5vdCBjb21wbHlpbmcgd2l0aAogICAgUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9TZXR1cHRvb2xzVmVyc2lvbk1peGluKG9iamVjdCk6CiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2hhc2hfXygpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPCBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sdF9fKG90aGVyKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDw9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2xlX18ob3RoZXIpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19nZV9fKG90aGVyKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID4gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ3RfXyhvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSAhPSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19uZV9fKG90aGVyKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiB0dXBsZShzZWxmKVtrZXldCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGNvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUocicoXGQrIHwgW2Etel0rIHwgXC58IC0pJywgcmUuVkVSQk9TRSkKICAgICAgICByZXBsYWNlID0gewogICAgICAgICAgICAncHJlJzogJ2MnLAogICAgICAgICAgICAncHJldmlldyc6ICdjJywKICAgICAgICAgICAgJy0nOiAnZmluYWwtJywKICAgICAgICAgICAgJ3JjJzogJ2MnLAogICAgICAgICAgICAnZGV2JzogJ0AnLAogICAgICAgIH0uZ2V0CgogICAgICAgIGRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgICAgICAgICAgZm9yIHBhcnQgaW4gY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgICAgICAgICAgcGFydCA9IHJlcGxhY2UocGFydCwgcGFydCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gJy4nOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBwYXJ0WzoxXSBpbiAnMDEyMzQ1Njc4OSc6CiAgICAgICAgICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgJyonICsgcGFydAoKICAgICAgICAgICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICAgICAgICAgIHlpZWxkICcqZmluYWwnCgogICAgICAgIGRlZiBvbGRfcGFyc2VfdmVyc2lvbihzKToKICAgICAgICAgICAgcGFydHMgPSBbXQogICAgICAgICAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzLmxvd2VyKCkpOgogICAgICAgICAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCcqJyk6CiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgJy0nIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgICAgICAgICAgaWYgcGFydCA8ICcqZmluYWwnOgogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcqZmluYWwtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnMDAwMDAwMDAnOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgICAgIHJldHVybiB0dXBsZShwYXJ0cykKCiAgICAgICAgIyBXYXJuIGZvciB1c2Ugb2YgdGhpcyBmdW5jdGlvbgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJZb3UgaGF2ZSBpdGVyYXRlZCBvdmVyIHRoZSByZXN1bHQgb2YgIgogICAgICAgICAgICAicGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uLiBUaGlzIGlzIGEgbGVnYWN5IGJlaGF2aW9yIHdoaWNoIGlzICIKICAgICAgICAgICAgImluY29uc2lzdGVudCB3aXRoIHRoZSBuZXcgdmVyc2lvbiBjbGFzcyBpbnRyb2R1Y2VkIGluIHNldHVwdG9vbHMgIgogICAgICAgICAgICAiOC4wLiBJbiBtb3N0IGNhc2VzLCBjb252ZXJzaW9uIHRvIGEgdHVwbGUgaXMgdW5uZWNlc3NhcnkuIEZvciAiCiAgICAgICAgICAgICJjb21wYXJpc29uIG9mIHZlcnNpb25zLCBzb3J0IHRoZSBWZXJzaW9uIGluc3RhbmNlcyBkaXJlY3RseS4gSWYgIgogICAgICAgICAgICAieW91IGhhdmUgYW5vdGhlciB1c2UgY2FzZSByZXF1aXJpbmcgdGhlIHR1cGxlLCBwbGVhc2UgZmlsZSBhICIKICAgICAgICAgICAgImJ1ZyB3aXRoIHRoZSBzZXR1cHRvb2xzIHByb2plY3QgZGVzY3JpYmluZyB0aGF0IG5lZWQuIiwKICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsCiAgICAgICAgICAgIHN0YWNrbGV2ZWw9MSwKICAgICAgICApCgogICAgICAgIGZvciBwYXJ0IGluIG9sZF9wYXJzZV92ZXJzaW9uKHN0cihzZWxmKSk6CiAgICAgICAgICAgIHlpZWxkIHBhcnQKCgpjbGFzcyBTZXR1cHRvb2xzVmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICBwYXNzCgoKY2xhc3MgU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24pOgogICAgcGFzcwoKCmRlZiBwYXJzZV92ZXJzaW9uKHYpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzVmVyc2lvbih2KQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbih2KQoKCl9zdGF0ZV92YXJzID0ge30KCgpkZWYgX2RlY2xhcmVfc3RhdGUodmFydHlwZSwgKiprdyk6CiAgICBnbG9iYWxzKCkudXBkYXRlKGt3KQogICAgX3N0YXRlX3ZhcnMudXBkYXRlKGRpY3QuZnJvbWtleXMoa3csIHZhcnR5cGUpKQoKCmRlZiBfX2dldHN0YXRlX18oKToKICAgIHN0YXRlID0ge30KICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIF9zdGF0ZV92YXJzLml0ZW1zKCk6CiAgICAgICAgc3RhdGVba10gPSBnWydfc2dldF8nICsgdl0oZ1trXSkKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfX3NldHN0YXRlX18oc3RhdGUpOgogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICBnWydfc3NldF8nICsgX3N0YXRlX3ZhcnNba11dKGssIGdba10sIHYpCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX3NnZXRfZGljdCh2YWwpOgogICAgcmV0dXJuIHZhbC5jb3B5KCkKCgpkZWYgX3NzZXRfZGljdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5jbGVhcigpCiAgICBvYi51cGRhdGUoc3RhdGUpCgoKZGVmIF9zZ2V0X29iamVjdCh2YWwpOgogICAgcmV0dXJuIHZhbC5fX2dldHN0YXRlX18oKQoKCmRlZiBfc3NldF9vYmplY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuX19zZXRzdGF0ZV9fKHN0YXRlKQoKCl9zZ2V0X25vbmUgPSBfc3NldF9ub25lID0gbGFtYmRhICphcmdzOiBOb25lCgoKZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3MgbWF4aW11bSBjb21wYXRpYmxlIHZlcnNpb24uCgogICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCiAgICBvZiBNYWMgT1MgWCB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIHRvICp1c2UqIGV4dGVuc2lvbnMgcHJvZHVjZWQgYnkKICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCiAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKICAgIGV4cGxpY2l0bHkgcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgTWFjIE9TIFgsIHdlIG11c3QgYWxzbyBrbm93IHRoZQogICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KCiAgICBJZiB0aGlzIGNvbmRpdGlvbiBvY2N1cnMgZm9yIGFueSBvdGhlciBwbGF0Zm9ybSB3aXRoIGEgdmVyc2lvbiBpbiBpdHMKICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgogICAgIiIiCiAgICBwbGF0ID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKICAgIG0gPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocGxhdCkKICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBsYXQgPSAnbWFjb3N4LSVzLSVzJyAlICgnLicuam9pbihfbWFjb3N4X3ZlcnMoKVs6Ml0pLCBtLmdyb3VwKDMpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIG5vdCBNYWMgT1MgWAogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCl9fYWxsX18gPSBbCiAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQogICAgJ3JlcXVpcmUnLCAncnVuX3NjcmlwdCcsICdnZXRfcHJvdmlkZXInLCAnZ2V0X2Rpc3RyaWJ1dGlvbicsCiAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywKICAgICdpdGVyX2VudHJ5X3BvaW50cycsCiAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCiAgICAncmVzb3VyY2VfbGlzdGRpcicsICdyZXNvdXJjZV9leGlzdHMnLCAncmVzb3VyY2VfaXNkaXInLAoKICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCiAgICAnZGVjbGFyZV9uYW1lc3BhY2UnLCAnd29ya2luZ19zZXQnLCAnYWRkX2FjdGl2YXRpb25fbGlzdGVuZXInLAogICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCgogICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCiAgICAnRGlzdHJpYnV0aW9uJywgJ1JlcXVpcmVtZW50JywgJ0VudHJ5UG9pbnQnLAoKICAgICMgRXhjZXB0aW9ucwogICAgJ1Jlc29sdXRpb25FcnJvcicsICdWZXJzaW9uQ29uZmxpY3QnLCAnRGlzdHJpYnV0aW9uTm90Rm91bmQnLAogICAgJ1Vua25vd25FeHRyYScsICdFeHRyYWN0aW9uRXJyb3InLAoKICAgICMgV2FybmluZ3MKICAgICdQRVA0NDBXYXJuaW5nJywKCiAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCiAgICAncGFyc2VfcmVxdWlyZW1lbnRzJywgJ3BhcnNlX3ZlcnNpb24nLCAnc2FmZV9uYW1lJywgJ3NhZmVfdmVyc2lvbicsCiAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywgJ2ludmFsaWRfbWFya2VyJywgJ2V2YWx1YXRlX21hcmtlcicsCgogICAgIyBmaWxlc3lzdGVtIHV0aWxpdGllcwogICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAoKICAgICMgRGlzdHJpYnV0aW9uICJwcmVjZWRlbmNlIiBjb25zdGFudHMKICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCgogICAgIyAiUHJvdmlkZXIiIGludGVyZmFjZXMsIGltcGxlbWVudGF0aW9ucywgYW5kIHJlZ2lzdHJhdGlvbi9sb29rdXAgQVBJcwogICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCiAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAogICAgJ051bGxQcm92aWRlcicsICdFZ2dQcm92aWRlcicsICdEZWZhdWx0UHJvdmlkZXInLCAnWmlwUHJvdmlkZXInLAogICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCiAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCgogICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQogICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLApdCgoKY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3JzIiIiCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoc2VsZi5hcmdzKQoKCmNsYXNzIFZlcnNpb25Db25mbGljdChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbi4KCiAgICBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbiBhbmQgdGhlIHJlcXVlc3RlZAogICAgUmVxdWlyZW1lbnQuCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSAie3NlbGYuZGlzdH0gaXMgaW5zdGFsbGVkIGJ1dCB7c2VsZi5yZXF9IGlzIHJlcXVpcmVkIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIHdpdGhfY29udGV4dChzZWxmLCByZXF1aXJlZF9ieSk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgcmVxdWlyZWRfYnkgaXMgbm9uLWVtcHR5LCByZXR1cm4gYSB2ZXJzaW9uIG9mIHNlbGYgdGhhdCBpcyBhCiAgICAgICAgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZWRfYnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgYXJncyA9IHNlbGYuYXJncyArIChyZXF1aXJlZF9ieSwpCiAgICAgICAgcmV0dXJuIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoKmFyZ3MpCgoKY2xhc3MgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdChWZXJzaW9uQ29uZmxpY3QpOgogICAgIiIiCiAgICBBIFZlcnNpb25Db25mbGljdCB0aGF0IGFjY2VwdHMgYSB0aGlyZCBwYXJhbWV0ZXIsIHRoZSBzZXQgb2YgdGhlCiAgICByZXF1aXJlbWVudHMgdGhhdCByZXF1aXJlZCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbi4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9IFZlcnNpb25Db25mbGljdC5fdGVtcGxhdGUgKyAnIGJ5IHtzZWxmLnJlcXVpcmVkX2J5fScKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlZF9ieShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzJdCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCgogICAgX3RlbXBsYXRlID0gKCJUaGUgJ3tzZWxmLnJlcX0nIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICAgICAgICAiYW5kIGlzIHJlcXVpcmVkIGJ5IHtzZWxmLnJlcXVpcmVyc19zdHJ9IikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzX3N0cihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5yZXF1aXJlcnM6CiAgICAgICAgICAgIHJldHVybiAndGhlIGFwcGxpY2F0aW9uJwogICAgICAgIHJldHVybiAnLCAnLmpvaW4oc2VsZi5yZXF1aXJlcnMpCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVwb3J0KCkKCgpjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCgoKX3Byb3ZpZGVyX2ZhY3RvcmllcyA9IHt9CgpQWV9NQUpPUiA9IHN5cy52ZXJzaW9uWzozXQpFR0dfRElTVCA9IDMKQklOQVJZX0RJU1QgPSAyClNPVVJDRV9ESVNUID0gMQpDSEVDS09VVF9ESVNUID0gMApERVZFTE9QX0RJU1QgPSAtMQoKCmRlZiByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfdHlwZSwgcHJvdmlkZXJfZmFjdG9yeSk6CiAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKCiAgICBgbG9hZGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiBgYG1vZHVsZS5fX2xvYWRlcl9fYGAsCiAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAogICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgogICAgIiIiCiAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKCgpkZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKICAgICIiIlJldHVybiBhbiBJUmVzb3VyY2VQcm92aWRlciBmb3IgdGhlIG5hbWVkIG1vZHVsZSBvciByZXF1aXJlbWVudCIiIgogICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSwgUmVxdWlyZW1lbnQpOgogICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCiAgICB0cnk6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKCgpkZWYgX21hY29zeF92ZXJzKF9jYWNoZT1bXSk6CiAgICBpZiBub3QgX2NhY2hlOgogICAgICAgIHZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KICAgICAgICAjIGZhbGxiYWNrIGZvciBNYWNQb3J0cwogICAgICAgIGlmIHZlcnNpb24gPT0gJyc6CiAgICAgICAgICAgIHBsaXN0ID0gJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxpc3QpOgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwbGlzdGxpYiwgJ3JlYWRQbGlzdCcpOgogICAgICAgICAgICAgICAgICAgIHBsaXN0X2NvbnRlbnQgPSBwbGlzdGxpYi5yZWFkUGxpc3QocGxpc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgJ1Byb2R1Y3RWZXJzaW9uJyBpbiBwbGlzdF9jb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcGxpc3RfY29udGVudFsnUHJvZHVjdFZlcnNpb24nXQoKICAgICAgICBfY2FjaGUuYXBwZW5kKHZlcnNpb24uc3BsaXQoJy4nKSkKICAgIHJldHVybiBfY2FjaGVbMF0KCgpkZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgogICAgcmV0dXJuIHsnUG93ZXJQQyc6ICdwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzogJ3BwYyd9LmdldChtYWNoaW5lLCBtYWNoaW5lKQoKCmRlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCgogICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CiAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgICAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCgogICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kIG5vdCBwbGF0LnN0YXJ0c3dpdGgoJ21hY29zeC0nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQogICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XS5yZXBsYWNlKCIgIiwgIl8iKQogICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoCiAgICAgICAgICAgICAgICBpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKICAgICAgICAgICAgICAgIF9tYWNvc3hfYXJjaChtYWNoaW5lKSwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIGlmIHNvbWVvbmUgaXMgcnVubmluZyBhIG5vbi1NYWMgZGFyd2luIHN5c3RlbSwgdGhpcyB3aWxsIGZhbGwKICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCmRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCiMgWFhYIGJhY2t3YXJkIGNvbXBhdApnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0KCgpkZWYgY29tcGF0aWJsZV9wbGF0Zm9ybXMocHJvdmlkZWQsIHJlcXVpcmVkKToKICAgICIiIkNhbiBjb2RlIGZvciB0aGUgYHByb3ZpZGVkYCBwbGF0Zm9ybSBydW4gb24gdGhlIGByZXF1aXJlZGAgcGxhdGZvcm0/CgogICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCgogICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KICAgICIiIgogICAgaWYgcHJvdmlkZWQgaXMgTm9uZSBvciByZXF1aXJlZCBpcyBOb25lIG9yIHByb3ZpZGVkID09IHJlcXVpcmVkOgogICAgICAgICMgZWFzeSBjYXNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIE1hYyBPUyBYIHNwZWNpYWwgY2FzZXMKICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKICAgIGlmIHJlcU1hYzoKICAgICAgICBwcm92TWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQoKICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KICAgICAgICBpZiBub3QgcHJvdk1hYzoKICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAogICAgICAgICAgICAjIHVzZSB0aGUgbmV3IG1hY29zeCBkZXNpZ25hdGlvbi4KICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCiAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CiAgICAgICAgICAgICAgICBkdmVyc2lvbiA9IGludChwcm92RGFyd2luLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KICAgICAgICBpZiBwcm92TWFjLmdyb3VwKDEpICE9IHJlcU1hYy5ncm91cCgxKSBvciBcCiAgICAgICAgICAgICAgICBwcm92TWFjLmdyb3VwKDMpICE9IHJlcU1hYy5ncm91cCgzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPwogICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gYGRpc3Rfc3BlY2AgYW5kIHJ1biBpdHMgYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgbnMuY2xlYXIoKQogICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgoKIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CnJ1bl9tYWluID0gcnVuX3NjcmlwdAoKCmRlZiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpOgogICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgUmVxdWlyZW1lbnQpOgogICAgICAgIGRpc3QgPSBnZXRfcHJvdmlkZXIoZGlzdCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQogICAgcmV0dXJuIGRpc3QKCgpkZWYgbG9hZF9lbnRyeV9wb2ludChkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKCgpkZWYgZ2V0X2VudHJ5X21hcChkaXN0LCBncm91cD1Ob25lKToKICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCgoKZGVmIGdldF9lbnRyeV9pbmZvKGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCgoKY2xhc3MgSU1ldGFkYXRhUHJvdmlkZXI6CiAgICBkZWYgaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCgogICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCgogICAgICAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIGVhY2ggbGluZSwgYW5kIGxpbmVzCiAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihuYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKG5hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKICAgIGRlZiBydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKCgpjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CiAgICAiIiJBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlIGNvbnRhaW4gdGhlIG5hbWVkIHJlc291cmNlPyIiIgoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKCmNsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKICAgICIiIkEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBvbiBzeXMucGF0aCAob3IgYSBzaW1pbGFyIGxpc3QpIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIHdvcmtpbmcgc2V0IGZyb20gbGlzdCBvZiBwYXRoIGVudHJpZXMgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQogICAgICAgIHNlbGYuYnlfa2V5ID0ge30KICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCgogICAgICAgIGlmIGVudHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCgogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgogICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbWFzdGVyKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHdzID0gY2xzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBUaGUgbWFpbiBwcm9ncmFtIGRvZXMgbm90IGxpc3QgYW55IHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXR1cm4gd3MKCiAgICAgICAgIyBlbnN1cmUgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cy5yZXF1aXJlKF9fcmVxdWlyZXNfXykKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICByZXR1cm4gY2xzLl9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhfX3JlcXVpcmVzX18pCgogICAgICAgIHJldHVybiB3cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhjbHMsIHJlcV9zcGVjKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdvcmtpbmcgc2V0IGZyb20gYSByZXF1aXJlbWVudCBzcGVjLiBSZXdyaXRlcyBzeXMucGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKICAgICAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAogICAgICAgIHdzID0gY2xzKFtdKQogICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxX3NwZWMpCiAgICAgICAgZGlzdHMgPSB3cy5yZXNvbHZlKHJlcXMsIEVudmlyb25tZW50KCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIHdzLmFkZChkaXN0KQoKICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3cy5lbnRyaWVzOgogICAgICAgICAgICAgICAgd3MuYWRkX2VudHJ5KGVudHJ5KQoKICAgICAgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCiAgICAgICAgc3lzLnBhdGhbOl0gPSB3cy5lbnRyaWVzCiAgICAgICAgcmV0dXJuIHdzCgogICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CiAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAoKICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucwogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKICAgICAgICBhbHdheXMgYXBwZW5kZWQgdG8gYGAuZW50cmllc2BgLCBldmVuIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwogICAgICAgIGVxdWFsIGBgc3lzLnBhdGhgYC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIHNlbGYuZW50cmllcy5hcHBlbmQoZW50cnkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVHJ1ZSBpZiBgZGlzdGAgaXMgdGhlIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIGl0cyBwcm9qZWN0IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmluZCBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyByZXF1aXJlbWVudCBgcmVxYAoKICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKICAgICAgICByZXR1cm5zIGl0IGFzIGxvbmcgYXMgaXQgbWVldHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVkIGJ5CiAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAogICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgogICAgICAgIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgYGBOb25lYGAKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCiAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgaXRlcl9lbnRyeV9wb2ludHMoc2VsZiwgZ3JvdXAsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCgogICAgICAgIElmIGBuYW1lYCBpcyBOb25lLCB5aWVsZHMgYWxsIGVudHJ5IHBvaW50cyBpbiBgZ3JvdXBgIGZyb20gYWxsCiAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAogICAgICAgICAgICBlbGlmIG5hbWUgaW4gZW50cmllczoKICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCByZXF1aXJlcywgc2NyaXB0X25hbWUpOgogICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgICAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgICAgICBucy5jbGVhcigpCiAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlKHJlcXVpcmVzKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKCiAgICAgICAgVGhlIHlpZWxkIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgaXRlbXMnIHBhdGggZW50cmllcyB3ZXJlCiAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSB7fQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5lbnRyeV9rZXlzOgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGEgY2FjaGUgaXNzdWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZW50cnlfa2V5c1tpdGVtXToKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV0gPSAxCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCwgZW50cnk9Tm9uZSwgaW5zZXJ0PVRydWUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCgogICAgICAgIElmIGBlbnRyeWAgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBgYC5sb2NhdGlvbmBgIG9mIGBkaXN0YC4KICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgoKICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LCB1bmxlc3MgYHJlcGxhY2U9VHJ1ZWAuCiAgICAgICAgSWYgaXQncyBhZGRlZCwgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2QKICAgICAgICB3aWxsIGJlIGNhbGxlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpbnNlcnQ6CiAgICAgICAgICAgIGRpc3QuaW5zZXJ0X29uKHNlbGYuZW50cmllcywgZW50cnksIHJlcGxhY2U9cmVwbGFjZSkKCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBrZXlzMiA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGRpc3QubG9jYXRpb24sIFtdKQogICAgICAgIGlmIG5vdCByZXBsYWNlIGFuZCBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKICAgICAgICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnlfa2V5W2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXMyOgogICAgICAgICAgICBrZXlzMi5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcmVxdWlyZW1lbnRzLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAogICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKICAgICAgICBub3Qgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSB3aXRoaW4gYW55CiAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgogICAgICAgIGFscmVhZHktaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbjsgaXQgc2hvdWxkIHJldHVybiBhIGBgRGlzdHJpYnV0aW9uYGAgb3IKICAgICAgICBgYE5vbmVgYC4KCiAgICAgICAgVW5sZXNzIGByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWVgLCByYWlzZXMgYSBWZXJzaW9uQ29uZmxpY3QgZXhjZXB0aW9uCiAgICAgICAgaWYKICAgICAgICBhbnkgcmVxdWlyZW1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgcGF0aCB0aGF0IGhhdmUgdGhlIGNvcnJlY3QgbmFtZSBidXQKICAgICAgICB0aGUgd3JvbmcgdmVyc2lvbi4gIE90aGVyd2lzZSwgaWYgYW4gYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQgaXQgd2lsbCBiZQogICAgICAgIGludm9rZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIHJlcXVpcmVtZW50IGFuZCBhY3RpdmF0ZQogICAgICAgIGl0LgoKICAgICAgICBgZXh0cmFzYCBpcyBhIGxpc3Qgb2YgdGhlIGV4dHJhcyB0byBiZSB1c2VkIHdpdGggdGhlc2UgcmVxdWlyZW1lbnRzLgogICAgICAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZXh0cmEgcmVxdWlyZW1lbnRzIG1heSBsb29rIGxpa2UgYG15X3JlcTsKICAgICAgICBleHRyYSA9ICJteV9leHRyYSJgLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwdXJlbHkKICAgICAgICBvcHRpb25hbCByZXF1aXJlbWVudC4gIEluc3RlYWQsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhc3NlcnQgdGhhdCB0aGVzZQogICAgICAgIHJlcXVpcmVtZW50cyBhcmUgdHJ1bHkgcmVxdWlyZWQuCiAgICAgICAgIiIiCgogICAgICAgICMgc2V0IHVwIHRoZSBzdGFjawogICAgICAgIHJlcXVpcmVtZW50cyA9IGxpc3QocmVxdWlyZW1lbnRzKVs6Oi0xXQogICAgICAgICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKICAgICAgICBwcm9jZXNzZWQgPSB7fQogICAgICAgICMga2V5IC0+IGRpc3QKICAgICAgICBiZXN0ID0ge30KICAgICAgICB0b19hY3RpdmF0ZSA9IFtdCgogICAgICAgIHJlcV9leHRyYXMgPSBfUmVxRXh0cmFzKCkKCiAgICAgICAgIyBNYXBwaW5nIG9mIHJlcXVpcmVtZW50IHRvIHNldCBvZiBkaXN0cmlidXRpb25zIHRoYXQgcmVxdWlyZWQgaXQ7CiAgICAgICAgIyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvIGFib3V0IGNvbmZsaWN0cy4KICAgICAgICByZXF1aXJlZF9ieSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKCiAgICAgICAgd2hpbGUgcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKICAgICAgICAgICAgcmVxID0gcmVxdWlyZW1lbnRzLnBvcCgwKQogICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub3QgcmVxX2V4dHJhcy5tYXJrZXJzX3Bhc3MocmVxLCBleHRyYXMpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEZpbmQgdGhlIGJlc3QgZGlzdHJpYnV0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIG1hcAogICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lIG9yIChkaXN0IG5vdCBpbiByZXEgYW5kIHJlcGxhY2VfY29uZmxpY3RpbmcpOgogICAgICAgICAgICAgICAgICAgIHdzID0gc2VsZgogICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBhbiBlbXB0eSBlbnZpcm9ubWVudCBhbmQgd29ya2luZ3NldCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgZnVydGhlciBjb25mbGljdHMgd2l0aCB0aGUgY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChbXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gYmVzdFtyZXEua2V5XSA9IGVudi5iZXN0X21hdGNoKAogICAgICAgICAgICAgICAgICAgICAgICByZXEsIHdzLCBpbnN0YWxsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9cmVwbGFjZV9jb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVycyA9IHJlcXVpcmVkX2J5LmdldChyZXEsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSwgcmVxdWlyZXJzKQogICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBkZXBlbmRlbnRfcmVxID0gcmVxdWlyZWRfYnlbcmVxXQogICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkud2l0aF9jb250ZXh0KGRlcGVuZGVudF9yZXEpCgogICAgICAgICAgICAjIHB1c2ggdGhlIG5ldyByZXF1aXJlbWVudHMgb250byB0aGUgc3RhY2sKICAgICAgICAgICAgbmV3X3JlcXVpcmVtZW50cyA9IGRpc3QucmVxdWlyZXMocmVxLmV4dHJhcylbOjotMV0KICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChuZXdfcmVxdWlyZW1lbnRzKQoKICAgICAgICAgICAgIyBSZWdpc3RlciB0aGUgbmV3IHJlcXVpcmVtZW50cyBuZWVkZWQgYnkgcmVxCiAgICAgICAgICAgIGZvciBuZXdfcmVxdWlyZW1lbnQgaW4gbmV3X3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJlcXVpcmVkX2J5W25ld19yZXF1aXJlbWVudF0uYWRkKHJlcS5wcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICByZXFfZXh0cmFzW25ld19yZXF1aXJlbWVudF0gPSByZXEuZXh0cmFzCgogICAgICAgICAgICBwcm9jZXNzZWRbcmVxXSA9IFRydWUKCiAgICAgICAgIyByZXR1cm4gbGlzdCBvZiBkaXN0cm9zIHRvIGFjdGl2YXRlCiAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlCgogICAgZGVmIGZpbmRfcGx1Z2lucygKICAgICAgICAgICAgc2VsZiwgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsIGZhbGxiYWNrPVRydWUpOgogICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCgogICAgICAgIEV4YW1wbGUgdXNhZ2U6OgoKICAgICAgICAgICAgZGlzdHJpYnV0aW9ucywgZXJyb3JzID0gd29ya2luZ19zZXQuZmluZF9wbHVnaW5zKAogICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCiAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvcnMKICAgICAgICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkJywgZXJyb3JzKQoKICAgICAgICBUaGUgYHBsdWdpbl9lbnZgIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UgdGhhdCBjb250YWlucwogICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgogICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKICAgICAgICBjb250YWlucyBhbGwgY3VycmVudGx5LWF2YWlsYWJsZSBkaXN0cmlidXRpb25zLiAgSWYgYGZ1bGxfZW52YCBpcyBub3QKICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgogICAgICAgIGBgc3lzLnBhdGhgYCB3aWxsIGJlIHNjYW5uZWQgZm9yIGRpc3RyaWJ1dGlvbnMuCgogICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCiAgICAgICAgYGByZXNvbHZlKClgYCBtZXRob2QuIFRoZSBgZmFsbGJhY2tgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkCiAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCiAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKICAgICAgICB0aGF0IHdlcmUgbG9hZGFibGUsIGFsb25nIHdpdGggYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbmVlZGVkCiAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQogICAgICAgIGVycm9yIHRoYXQgb2NjdXJyZWQuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIGEgYGBEaXN0cmlidXRpb25Ob3RGb3VuZGBgIG9yCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KICAgICAgICAiIiIKCiAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQogICAgICAgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpCgogICAgICAgIGVycm9yX2luZm8gPSB7fQogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQoKICAgICAgICBpZiBmdWxsX2VudiBpcyBOb25lOgogICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CgogICAgICAgIHNoYWRvd19zZXQgPSBzZWxmLl9fY2xhc3NfXyhbXSkKICAgICAgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAogICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCBzZWxmKSkKCiAgICAgICAgZm9yIHByb2plY3RfbmFtZSBpbiBwbHVnaW5fcHJvamVjdHM6CgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CgogICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCgogICAgICAgICAgICAgICAgZXhjZXB0IFJlc29sdXRpb25FcnJvciBhcyB2OgogICAgICAgICAgICAgICAgICAgICMgc2F2ZSBlcnJvciBpbmZvCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYKICAgICAgICAgICAgICAgICAgICBpZiBmYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBnaXZlIHVwIG9uIHRoaXMgcHJvamVjdCwga2VlcCBnb2luZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQoKICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gdHJ5IGFueSBtb3JlIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSBsaXN0KGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKCiAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbnMsIGVycm9yX2luZm8KCiAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCiAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKICAgICAgICByZXR1cm4gdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9ucyB0aGF0IG5lZWRlZCB0byBiZQogICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQogICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIG5lZWRlZCA9IHNlbGYucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgICAgICByZXR1cm4gbmVlZGVkCgogICAgZGVmIHN1YnNjcmliZShzZWxmLCBjYWxsYmFjaywgZXhpc3Rpbmc9VHJ1ZSk6CiAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zCgogICAgICAgIElmIGBleGlzdGluZz1UcnVlYCAoZGVmYXVsdCksCiAgICAgICAgY2FsbCBvbiBhbGwgZXhpc3Rpbmcgb25lcywgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQogICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmVudHJpZXNbOl0sIHNlbGYuZW50cnlfa2V5cy5jb3B5KCksIHNlbGYuYnlfa2V5LmNvcHkoKSwKICAgICAgICAgICAgc2VsZi5jYWxsYmFja3NbOl0KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBlX2tfYl9jKToKICAgICAgICBlbnRyaWVzLCBrZXlzLCBieV9rZXksIGNhbGxiYWNrcyA9IGVfa19iX2MKICAgICAgICBzZWxmLmVudHJpZXMgPSBlbnRyaWVzWzpdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ga2V5cy5jb3B5KCkKICAgICAgICBzZWxmLmJ5X2tleSA9IGJ5X2tleS5jb3B5KCkKICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IGNhbGxiYWNrc1s6XQoKCmNsYXNzIF9SZXFFeHRyYXMoZGljdCk6CiAgICAiIiIKICAgIE1hcCBlYWNoIHJlcXVpcmVtZW50IHRvIHRoZSBleHRyYXMgdGhhdCBkZW1hbmRlZCBpdC4KICAgICIiIgoKICAgIGRlZiBtYXJrZXJzX3Bhc3Moc2VsZiwgcmVxLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgbWFya2VycyBmb3IgcmVxIGFnYWluc3QgZWFjaCBleHRyYSB0aGF0CiAgICAgICAgZGVtYW5kZWQgaXQuCgogICAgICAgIFJldHVybiBGYWxzZSBpZiB0aGUgcmVxIGhhcyBhIG1hcmtlciBhbmQgZmFpbHMKICAgICAgICBldmFsdWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBUcnVlLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2V2YWxzID0gKAogICAgICAgICAgICByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmdldChyZXEsICgpKSArIChleHRyYXMgb3IgKE5vbmUsKSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyIG9yIGFueShleHRyYV9ldmFscykKCgpjbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgogICAgIiIiU2VhcmNoYWJsZSBzbmFwc2hvdCBvZiBkaXN0cmlidXRpb25zIG9uIGEgc2VhcmNoIHBhdGgiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwKICAgICAgICAgICAgcHl0aG9uPVBZX01BSk9SKToKICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4KCiAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KICAgICAgICB0aGF0IHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGguICBJZgogICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCiAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCczLjMnYGApOwogICAgICAgIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCgogICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKICAgICAgICB3aXNoIHRvIG1hcCAqYWxsKiBkaXN0cmlidXRpb25zLCBub3QganVzdCB0aG9zZSBjb21wYXRpYmxlIHdpdGggdGhlCiAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwID0ge30KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgogICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKCiAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/CgogICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCiAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLnB5dGhvbiBpcyBOb25lIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCiAgICAgICAgICAgIG9yIGRpc3QucHlfdmVyc2lvbiA9PSBzZWxmLnB5dGhvbikgXAogICAgICAgICAgICBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSwgc2VsZi5wbGF0Zm9ybSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZW52aXJvbm1lbnQiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKCiAgICBkZWYgc2NhbihzZWxmLCBzZWFyY2hfcGF0aD1Ob25lKToKICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCiAgICAgICAgdGhlIHBsYXRmb3JtL3B5dGhvbiB2ZXJzaW9uIGRlZmluZWQgYXQgaW5pdGlhbGl6YXRpb24gYXJlIGFkZGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlYXJjaF9wYXRoID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhpdGVtKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbmV3ZXN0LXRvLW9sZGVzdCBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZm9yIGBwcm9qZWN0X25hbWVgCgogICAgICAgIFVzZXMgY2FzZS1pbnNlbnNpdGl2ZSBgcHJvamVjdF9uYW1lYCBjb21wYXJpc29uLCBhc3N1bWluZyBhbGwgdGhlCiAgICAgICAgcHJvamVjdCdzIGRpc3RyaWJ1dGlvbnMgdXNlIHRoZWlyIHByb2plY3QncyBuYW1lIGNvbnZlcnRlZCB0byBhbGwKICAgICAgICBsb3dlcmNhc2UgYXMgdGhlaXIga2V5LgoKICAgICAgICAiIiIKICAgICAgICBkaXN0cmlidXRpb25fa2V5ID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdG1hcC5nZXQoZGlzdHJpYnV0aW9uX2tleSwgW10pCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fZGlzdG1hcC5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgICAgIGRpc3RzLnNvcnQoa2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2hhc2hjbXAnKSwgcmV2ZXJzZT1UcnVlKQoKICAgIGRlZiBiZXN0X21hdGNoKAogICAgICAgICAgICBzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSwgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKCiAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGlmIGFuIHVuc3VpdGFibGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5CiAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgogICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAgICAgICBlbnZpcm9ubWVudCB0aGF0IG1lZXRzIHRoZSBgYFJlcXVpcmVtZW50YGAgaW4gYHJlcWAuICBJZiBubyBzdWl0YWJsZQogICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkaXN0ID0gd29ya2luZ19zZXQuZmluZChyZXEpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgaWYgbm90IHJlcGxhY2VfY29uZmxpY3Rpbmc6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBkaXN0ID0gTm9uZQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICMgdHJ5IHRvIGRvd25sb2FkL2luc3RhbGwKICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKCiAgICAgICAgT2J0YWluIGEgZGlzdHJvIHRoYXQgbWF0Y2hlcyByZXF1aXJlbWVudCAoZS5nLiB2aWEgZG93bmxvYWQpLiAgSW4gdGhlCiAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKICAgICAgICBOb25lIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIG1ldGhvZCBpcyBhIGhvb2sgdGhhdCBhbGxvd3Mgc3ViY2xhc3NlcwogICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjawogICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKICAgICAgICBpZiBpbnN0YWxsZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgogICAgICAgICAgICBpZiBzZWxmW2tleV06CiAgICAgICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgc2VsZi5hZGQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBFbnZpcm9ubWVudCk6CiAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJBZGQgYW4gZW52aXJvbm1lbnQgb3IgZGlzdHJpYnV0aW9uIHRvIGFuIGVudmlyb25tZW50IiIiCiAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQogICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CiAgICAgICAgICAgIG5ldyArPSBlbnYKICAgICAgICByZXR1cm4gbmV3CgoKIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQpBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQKCgpjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQoKICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgoKICAgIG1hbmFnZXIKICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgoKICAgIGNhY2hlX3BhdGgKICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KCiAgICBvcmlnaW5hbF9lcnJvcgogICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCiAgICAiIiIKCgpjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CiAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQoKICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5oYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeT8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gc3BlY2lmaWVkIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBkaXJlY3RvcnkiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtcyBleHRyYWN0aW5nIGZpbGUocykiIiIKCiAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgY2FjaGVfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgQ2FuJ3QgZXh0cmFjdCBmaWxlKHMpIHRvIGVnZyBjYWNoZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpCiAgICAgICAgICAgIHRvIHRoZSBQeXRob24gZWdnIGNhY2hlOgoKICAgICAgICAgICAgICB7b2xkX2V4Y30KCiAgICAgICAgICAgIFRoZSBQeXRob24gZWdnIGNhY2hlIGRpcmVjdG9yeSBpcyBjdXJyZW50bHkgc2V0IHRvOgoKICAgICAgICAgICAgICB7Y2FjaGVfcGF0aH0KCiAgICAgICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PwogICAgICAgICAgICBZb3UgY2FuIGNoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUKICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8gYW4gYWNjZXNzaWJsZSBkaXJlY3RvcnkuCiAgICAgICAgICAgICIiIikubHN0cmlwKCkKICAgICAgICBlcnIgPSBFeHRyYWN0aW9uRXJyb3IodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgZXJyLm1hbmFnZXIgPSBzZWxmCiAgICAgICAgZXJyLmNhY2hlX3BhdGggPSBjYWNoZV9wYXRoCiAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YwogICAgICAgIHJhaXNlIGVycgoKICAgIGRlZiBnZXRfY2FjaGVfcGF0aChzZWxmLCBhcmNoaXZlX25hbWUsIG5hbWVzPSgpKToKICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCgogICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRpbmcgcGF0aCB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcwogICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQogICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCiAgICAgICAgaW5jbHVkaW5nIGl0cyAiLmVnZyIgZXh0ZW5zaW9uLiAgYG5hbWVzYCwgaWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhCiAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSByZXNvdXJjZSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvCiAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bwogICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgogICAgICAgICIiIgogICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSArICctdG1wJywgKm5hbWVzKQogICAgICAgIHRyeToKICAgICAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHRhcmdldF9wYXRoKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgc2VsZi5fd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKGV4dHJhY3RfcGF0aCkKCiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQogICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gcGF0aCBpcyBvdmVycmlkZGVuIGFuZCBzZXQgdG8gYW4gaW5zZWN1cmUKICAgICAgICBsb2NhdGlvbiwgc3VjaCBhcyAvdG1wLCBpdCBvcGVucyB1cCBhbiBvcHBvcnR1bml0eSBmb3IgYW4gYXR0YWNrZXIgdG8KICAgICAgICByZXBsYWNlIGFuIGV4dHJhY3RlZCBmaWxlIHdpdGggYW4gdW5hdXRob3JpemVkIHBheWxvYWQuIFdhcm4gdGhlIHVzZXIKICAgICAgICBpZiBhIGtub3duIGluc2VjdXJlIGxvY2F0aW9uIGlzIHVzZWQuCgogICAgICAgIFNlZSBEaXN0cmlidXRlICMzNzUgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgob3MuZW52aXJvblsnd2luZGlyJ10pOgogICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHBlcm1pc3Npb25zIGFyZSBnZW5lcmFsbHkgcmVzdHJpY3RpdmUgYnkgZGVmYXVsdAogICAgICAgICAgICAjICBhbmQgdGVtcCBkaXJlY3RvcmllcyBhcmUgbm90IHdyaXRhYmxlIGJ5IG90aGVyIHVzZXJzLCBzbwogICAgICAgICAgICAjICBieXBhc3MgdGhlIHdhcm5pbmcuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKICAgICAgICBpZiBtb2RlICYgc3RhdC5TX0lXT1RIIG9yIG1vZGUgJiBzdGF0LlNfSVdHUlA6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlcyBpcyB3cml0YWJsZSBieSBncm91cC9vdGhlcnMgYW5kIHZ1bG5lcmFibGUgdG8gYXR0YWNrICIKICAgICAgICAgICAgICAgICJ3aGVuICIKICAgICAgICAgICAgICAgICJ1c2VkIHdpdGggZ2V0X3Jlc291cmNlX2ZpbGVuYW1lLiBDb25zaWRlciBhIG1vcmUgc2VjdXJlICIKICAgICAgICAgICAgICAgICJsb2NhdGlvbiAoc2V0IHdpdGggLnNldF9leHRyYWN0aW9uX3BhdGggb3IgdGhlICIKICAgICAgICAgICAgICAgICJQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50IHZhcmlhYmxlKS4iICUgcGF0aAogICAgICAgICAgICApCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKCiAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKICAgICAgICAiIiJQZXJmb3JtIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBvZiBgdGVtcG5hbWVgCgogICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0CiAgICAgICAgaGF2ZSBhbnl0aGluZyBzcGVjaWFsIHRoZXkgc2hvdWxkIGRvLgoKICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKICAgICAgICBleHRyYWN0aW5nIGEgY29tcHJlc3NlZCByZXNvdXJjZS4gIFRoZXkgbXVzdCBOT1QgY2FsbCBpdCBvbiByZXNvdXJjZXMKICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgoKICAgICAgICBgdGVtcG5hbWVgIGlzIHRoZSBjdXJyZW50ICh0ZW1wb3JhcnkpIG5hbWUgb2YgdGhlIGZpbGUsIGFuZCBgZmlsZW5hbWVgCiAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCiAgICAgICAgcmV0dXJucy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAjIE1ha2UgdGhlIHJlc291cmNlIGV4ZWN1dGFibGUKICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdCh0ZW1wbmFtZSkuc3RfbW9kZSkgfCAwbzU1NSkgJiAwbzc3NzcKICAgICAgICAgICAgb3MuY2htb2QodGVtcG5hbWUsIG1vZGUpCgogICAgZGVmIHNldF9leHRyYWN0aW9uX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCgogICAgICAgIElmIHlvdSBkbyBub3QgY2FsbCB0aGlzIHJvdXRpbmUgYmVmb3JlIGFueSBleHRyYWN0aW9ucyB0YWtlIHBsYWNlLCB0aGUKICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGZhbGxiYWNrcy4gIFNlZSB0aGF0IHJvdXRpbmUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlCiAgICAgICAgZGV0YWlscy4pCgogICAgICAgIFJlc291cmNlcyBhcmUgZXh0cmFjdGVkIHRvIHN1YmRpcmVjdG9yaWVzIG9mIHRoaXMgcGF0aCBiYXNlZCB1cG9uCiAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQogICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KICAgICAgICBkZWxldGUgdGhlIGV4dHJhY3RlZCBmaWxlcyB3aGVuIGRvbmUuICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KCiAgICAgICAgKE5vdGU6IHlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZXh0cmFjdGlvbiBwYXRoIGZvciBhIGdpdmVuIHJlc291cmNlCiAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2hhbmdlIGV4dHJhY3Rpb24gcGF0aCwgZmlsZXMgYWxyZWFkeSBleHRyYWN0ZWQiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5leHRyYWN0aW9uX3BhdGggPSBwYXRoCgogICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29uY3VycmVuY3kgcHJvdGVjdGlvbiwgc28gaXQgc2hvdWxkCiAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAogICAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbGVkOyB5b3UgbXVzdCBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgcmVnaXN0ZXIgaXQgYXMgYW4KICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgogICAgICAgICIiIgogICAgICAgICMgWFhYCgoKZGVmIGdldF9kZWZhdWx0X2NhY2hlKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIG9yIGEgcGxhdGZvcm0tcmVsZXZhbnQgdXNlciBjYWNoZSBkaXIgZm9yIGFuIGFwcAogICAgbmFtZWQgIlB5dGhvbi1FZ2dzIi4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBvcy5lbnZpcm9uLmdldCgnUFlUSE9OX0VHR19DQUNIRScpCiAgICAgICAgb3IgYXBwZGlycy51c2VyX2NhY2hlX2RpcihhcHBuYW1lPSdQeXRob24tRWdncycpCiAgICApCgoKZGVmIHNhZmVfbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKCgpkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZwogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBub3JtYWxpemUgdGhlIHZlcnNpb24KICAgICAgICByZXR1cm4gc3RyKHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24odmVyc2lvbikpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykKICAgICAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKCgpkZWYgc2FmZV9leHRyYShleHRyYSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCAnZXh0cmEnIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAogICAgYW5kIHRoZSByZXN1bHQgaXMgYWx3YXlzIGxvd2VyY2FzZWQuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Li1dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKCgpkZWYgdG9fZmlsZW5hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQoKICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgogICAgIiIiCiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKCmRlZiBpbnZhbGlkX21hcmtlcih0ZXh0KToKICAgICIiIgogICAgVmFsaWRhdGUgdGV4dCBhcyBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyOyByZXR1cm4gYW4gZXhjZXB0aW9uCiAgICBpZiBpbnZhbGlkIG9yIEZhbHNlIG90aGVyd2lzZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGV2YWx1YXRlX21hcmtlcih0ZXh0KQogICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgZS5maWxlbmFtZSA9IE5vbmUKICAgICAgICBlLmxpbmVubyA9IE5vbmUKICAgICAgICByZXR1cm4gZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGV2YWx1YXRlX21hcmtlcih0ZXh0LCBleHRyYT1Ob25lKToKICAgICIiIgogICAgRXZhbHVhdGUgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlci4KICAgIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbWFya2VyIHJlc3VsdCBpbiB0aGlzIGVudmlyb25tZW50LgogICAgUmFpc2UgU3ludGF4RXJyb3IgaWYgbWFya2VyIGlzIGludmFsaWQuCgogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAncHlwYXJzaW5nJyBtb2R1bGUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBtYXJrZXIgPSBwYWNrYWdpbmcubWFya2Vycy5NYXJrZXIodGV4dCkKICAgICAgICByZXR1cm4gbWFya2VyLmV2YWx1YXRlKCkKICAgIGV4Y2VwdCBwYWNrYWdpbmcubWFya2Vycy5JbnZhbGlkTWFya2VyIGFzIGU6CiAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZSkKCgpjbGFzcyBOdWxsUHJvdmlkZXI6CiAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKCiAgICBlZ2dfbmFtZSA9IE5vbmUKICAgIGVnZ19pbmZvID0gTm9uZQogICAgbG9hZGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gaW8uQnl0ZXNJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoJ3V0Zi04JykgaWYgc2l4LlBZMyBlbHNlIHZhbHVlCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgIHNjcmlwdCA9ICdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZQogICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgogICAgICAgICAgICByYWlzZSBSZXNvbHV0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiU2NyaXB0IHtzY3JpcHQhcn0gbm90IGZvdW5kIGluIG1ldGFkYXRhIGF0IHtzZWxmLmVnZ19pbmZvIXJ9IgogICAgICAgICAgICAgICAgLmZvcm1hdCgqKmxvY2FscygpKSwKICAgICAgICAgICAgKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykKICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywgJ1xuJykKICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBzY3JpcHQpCiAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2NyaXB0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc291cmNlID0gb3BlbihzY3JpcHRfZmlsZW5hbWUpLnJlYWQoKQogICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQogICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAogICAgICAgICAgICAgICAgbGVuKHNjcmlwdF90ZXh0KSwgMCwgc2NyaXB0X3RleHQuc3BsaXQoJ1xuJyksIHNjcmlwdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoc2NyaXB0X2NvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgcmVzb3VyY2VfbmFtZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQogICAgICAgIHJldHVybiBiYXNlCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ2dldF9kYXRhJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciBsb2FkZXJzIHdpdGhvdXQgJ2dldF9kYXRhKCknIgogICAgICAgICkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKCgpjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgYmFzZWQgb24gYSB2aXJ0dWFsIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgogICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CiAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCiAgICAgICAgIyBvZiBtdWx0aXBsZSBlZ2dzOyB0aGF0J3Mgd2h5IHdlIHVzZSBtb2R1bGVfcGF0aCBpbnN0ZWFkIG9mIC5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKICAgICAgICBvbGQgPSBOb25lCiAgICAgICAgd2hpbGUgcGF0aCAhPSBvbGQ6CiAgICAgICAgICAgIGlmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2xkID0gcGF0aAogICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQoKCmNsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSksICdyYicpCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHN0cmVhbToKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVnaXN0ZXIoY2xzKToKICAgICAgICBsb2FkZXJfY2xzID0gZ2V0YXR0cigKICAgICAgICAgICAgaW1wb3J0bGliX21hY2hpbmVyeSwKICAgICAgICAgICAgJ1NvdXJjZUZpbGVMb2FkZXInLAogICAgICAgICAgICB0eXBlKE5vbmUpLAogICAgICAgICkKICAgICAgICByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfY2xzLCBjbHMpCgoKRGVmYXVsdFByb3ZpZGVyLl9yZWdpc3RlcigpCgoKY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgoKICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZiwgcGF0aDogRmFsc2UKICAgIF9nZXQgPSBsYW1iZGEgc2VsZiwgcGF0aDogJycKICAgIF9saXN0ZGlyID0gbGFtYmRhIHNlbGYsIHBhdGg6IFtdCiAgICBtb2R1bGVfcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKCmVtcHR5X3Byb3ZpZGVyID0gRW1wdHlQcm92aWRlcigpCgoKY2xhc3MgWmlwTWFuaWZlc3RzKGRpY3QpOgogICAgIiIiCiAgICB6aXAgbWFuaWZlc3QgYnVpbGRlcgogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnVpbGQoY2xzLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIGRpY3Rpb25hcnkgc2ltaWxhciB0byB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgIGNhY2hlcywgZXhjZXB0IGluc3RlYWQgb2YgdHVwbGVzLCBzdG9yZSBaaXBJbmZvIG9iamVjdHMuCgogICAgICAgIFVzZSBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yIChvcy5zZXApIGZvciB0aGUgcGF0aCBrZXlzCiAgICAgICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBweXB5IG9uIFdpbmRvd3MuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUocGF0aCkgYXMgemZpbGU6CiAgICAgICAgICAgIGl0ZW1zID0gKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUucmVwbGFjZSgnLycsIG9zLnNlcCksCiAgICAgICAgICAgICAgICAgICAgemZpbGUuZ2V0aW5mbyhuYW1lKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHpmaWxlLm5hbWVsaXN0KCkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGljdChpdGVtcykKCiAgICBsb2FkID0gYnVpbGQKCgpjbGFzcyBNZW1vaXplZFppcE1hbmlmZXN0cyhaaXBNYW5pZmVzdHMpOgogICAgIiIiCiAgICBNZW1vaXplZCB6aXBmaWxlIG1hbmlmZXN0cy4KICAgICIiIgogICAgbWFuaWZlc3RfbW9kID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnbWFuaWZlc3RfbW9kJywgJ21hbmlmZXN0IG10aW1lJykKCiAgICBkZWYgbG9hZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGEgbWFuaWZlc3QgYXQgcGF0aCBvciByZXR1cm4gYSBzdWl0YWJsZSBtYW5pZmVzdCBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQoKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmIG9yIHNlbGZbcGF0aF0ubXRpbWUgIT0gbXRpbWU6CiAgICAgICAgICAgIG1hbmlmZXN0ID0gc2VsZi5idWlsZChwYXRoKQogICAgICAgICAgICBzZWxmW3BhdGhdID0gc2VsZi5tYW5pZmVzdF9tb2QobWFuaWZlc3QsIG10aW1lKQoKICAgICAgICByZXR1cm4gc2VsZltwYXRoXS5tYW5pZmVzdAoKCmNsYXNzIFppcFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKCiAgICBlYWdlcnMgPSBOb25lCiAgICBfemlwX21hbmlmZXN0cyA9IE1lbW9pemVkWmlwTWFuaWZlc3RzKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZSArIG9zLnNlcAoKICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYSB6aXBmaWxlIHN1YnBhdGgKICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICkKCiAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QuCiAgICAgICAgIyBwc2V1ZG8tZnMgcGF0aAogICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgemlwaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5femlwX21hbmlmZXN0cy5sb2FkKHNlbGYubG9hZGVyLmFyY2hpdmUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgICAgICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QgLnppcCIKICAgICAgICAgICAgKQogICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwogICAgICAgIHppcF9wYXRoID0gc2VsZi5fcmVzb3VyY2VfdG9femlwKHJlc291cmNlX25hbWUpCiAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCiAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGVhZ2VyczoKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQogICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2RhdGVfYW5kX3NpemUoemlwX3N0YXQpOgogICAgICAgIHNpemUgPSB6aXBfc3RhdC5maWxlX3NpemUKICAgICAgICAjIHltZGhtcyt3ZGF5LCB5ZGF5LCBkc3QKICAgICAgICBkYXRlX3RpbWUgPSB6aXBfc3RhdC5kYXRlX3RpbWUgKyAoMCwgMCwgLTEpCiAgICAgICAgIyAxOTgwIG9mZnNldCBhbHJlYWR5IGRvbmUKICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCwgc2l6ZQoKICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CgogICAgICAgIGlmIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgogICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgb3MucGF0aC5qb2luKHppcF9wYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUobGFzdCkKCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKCiAgICAgICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5yZW5hbWUiIGFuZCAib3MudW5saW5rIiBhcmUgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHRoaXMgcGxhdGZvcm0nKQogICAgICAgIHRyeToKCiAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKAogICAgICAgICAgICAgICAgIi4kZXh0cmFjdCIsCiAgICAgICAgICAgICAgICBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3Mud3JpdGUob3V0Ziwgc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpKQogICAgICAgICAgICBvcy5jbG9zZShvdXRmKQogICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsIHRpbWVzdGFtcCkpCiAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgYmVjYW1lIGN1cnJlbnQgc2luY2UgaXQgd2FzIGNoZWNrZWQgYWJvdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICMgIHNvIHByb2NlZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgogICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgZGVmIF9pc19jdXJyZW50KHNlbGYsIGZpbGVfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBmaWxlX3BhdGggaXMgY3VycmVudCBmb3IgdGhpcyB6aXBfcGF0aAogICAgICAgICIiIgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHN0YXQgPSBvcy5zdGF0KGZpbGVfcGF0aCkKICAgICAgICBpZiBzdGF0LnN0X3NpemUgIT0gc2l6ZSBvciBzdGF0LnN0X210aW1lICE9IHRpbWVzdGFtcDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBtYXRjaAogICAgICAgIHppcF9jb250ZW50cyA9IHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKQogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHJldHVybiB6aXBfY29udGVudHMgPT0gZmlsZV9jb250ZW50cwoKICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgogICAgICAgICAgICBlYWdlcnMgPSBbXQogICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgICAgICBlYWdlcnMuZXh0ZW5kKHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpKQogICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycwogICAgICAgIHJldHVybiBzZWxmLmVhZ2VycwoKICAgIGRlZiBfaW5kZXgoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZGlyaW5kZXgKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGluZCA9IHt9CiAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuemlwaW5mbzoKICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBvcy5zZXAuam9pbihwYXJ0c1s6LTFdKQogICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCiAgICAgICAgICAgIHNlbGYuX2RpcmluZGV4ID0gaW5kCiAgICAgICAgICAgIHJldHVybiBpbmQKCiAgICBkZWYgX2hhcyhzZWxmLCBmc3BhdGgpOgogICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9pbmRleCgpLmdldChzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSwgKCkpKQoKICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIF9yZXNvdXJjZV90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIFppcFByb3ZpZGVyKQoKCmNsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIGhhbmRsZXIgZm9yIHN0YW5kYWxvbmUgUEtHLUlORk8gZmlsZXMKCiAgICBVc2FnZTo6CgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCgogICAgVGhpcyBwcm92aWRlciByZWplY3RzIGFsbCBkYXRhIGFuZCBtZXRhZGF0YSByZXF1ZXN0cyBleGNlcHQgZm9yIFBLRy1JTkZPLAogICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CiAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJ1BLRy1JTkZPJyBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSAhPSAnUEtHLUlORk8nOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLnBhdGgsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0icmVwbGFjZSIpIGFzIGY6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZi5yZWFkKCkKICAgICAgICBzZWxmLl93YXJuX29uX3JlcGxhY2VtZW50KG1ldGFkYXRhKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfd2Fybl9vbl9yZXBsYWNlbWVudChzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIyBQeXRob24gMi43IGNvbXBhdCBmb3I6IHJlcGxhY2VtZW50X2NoYXIgPSAn77+9JwogICAgICAgIHJlcGxhY2VtZW50X2NoYXIgPSBiJ1x4ZWZceGJmXHhiZCcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcmVwbGFjZW1lbnRfY2hhciBpbiBtZXRhZGF0YToKICAgICAgICAgICAgdG1wbCA9ICJ7c2VsZi5wYXRofSBjb3VsZCBub3QgYmUgcHJvcGVybHkgZGVjb2RlZCBpbiBVVEYtOCIKICAgICAgICAgICAgbXNnID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgoKY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgZWdnIGRpcmVjdG9yaWVzCgogICAgVXNhZ2U6OgoKICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CgogICAgICAgIGVnZ19pbmZvID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLmVnZy1pbmZvIgogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpciwgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgoKICAgICAgICBlZ2dfcGF0aCA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS12ZXItcHl2ZXItZXRjLmVnZyIKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZWdnX2luZm8pOgogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCgoKY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIC5lZ2cgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgogICAgICAgICIiIkNyZWF0ZSBhIG1ldGFkYXRhIHByb3ZpZGVyIGZyb20gYSB6aXBpbXBvcnRlciIiIgoKICAgICAgICBzZWxmLnppcF9wcmUgPSBpbXBvcnRlci5hcmNoaXZlICsgb3Muc2VwCiAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgogICAgICAgIGlmIGltcG9ydGVyLnByZWZpeDoKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IGltcG9ydGVyLmFyY2hpdmUKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzPXt9KQoKCmRlZiByZWdpc3Rlcl9maW5kZXIoaW1wb3J0ZXJfdHlwZSwgZGlzdHJpYnV0aW9uX2ZpbmRlcik6CiAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCiAgICB0aGF0IHBhdGggaXRlbS4gIFNlZSBgYHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoYGAgZm9yIGFuIGV4YW1wbGUuIiIiCiAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCgoKZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQogICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQoKCmRlZiBmaW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiCiAgICBGaW5kIGVnZ3MgaW4gemlwIGZpbGVzOyBwb3NzaWJseSBtdWx0aXBsZSBuZXN0ZWQgZWdncy4KICAgICIiIgogICAgaWYgaW1wb3J0ZXIuYXJjaGl2ZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICMgd2hlZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaW5kZXIKICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSBQS0ctSU5GTyBtZXRhZGF0YSwgYW5kIHdvbid0IGV2ZXIgY29udGFpbiBlZ2dzCiAgICAgICAgcmV0dXJuCiAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKGltcG9ydGVyKQogICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICBpZiBvbmx5OgogICAgICAgICMgZG9uJ3QgeWllbGQgbmVzdGVkIGRpc3Ryb3MKICAgICAgICByZXR1cm4KICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKICAgICAgICBpZiBfaXNfZWdnX3BhdGgoc3ViaXRlbSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBkaXN0cyA9IGZpbmRfZWdnc19pbl96aXAoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpLCBzdWJwYXRoKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICBlbGlmIHN1Yml0ZW0ubG93ZXIoKS5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgc3VibWV0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSkKICAgICAgICAgICAgc3VibWV0YS5lZ2dfaW5mbyA9IHN1YnBhdGgKICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24ocGF0aF9pdGVtLCBzdWJpdGVtLCBzdWJtZXRhKQoKCnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbmRfZWdnc19pbl96aXApCgoKZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgIHJldHVybiAoKQoKCnJlZ2lzdGVyX2ZpbmRlcihvYmplY3QsIGZpbmRfbm90aGluZykKCgpkZWYgX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybiB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIKICAgIGJ5IHZlcnNpb24gbnVtYmVyLgoKICAgID4+PiBuYW1lcyA9ICdiYXInLCAnZm9vJywgJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycsICdmb28nLCAnYmFyJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICAiIiIKICAgIGRlZiBfYnlfdmVyc2lvbihuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAiIiIKICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4obmFtZS5zcGxpdCgnLScpLCBbZXh0XSkKICAgICAgICByZXR1cm4gW3BhY2thZ2luZy52ZXJzaW9uLnBhcnNlKHBhcnQpIGZvciBwYXJ0IGluIHBhcnRzXQoKICAgIHJldHVybiBzb3J0ZWQobmFtZXMsIGtleT1fYnlfdmVyc2lvbiwgcmV2ZXJzZT1UcnVlKQoKCmRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgb24gYSBzeXMucGF0aCBkaXJlY3RvcnkiIiIKICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKCiAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGhfaXRlbSk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAogICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCAnRUdHLUlORk8nKQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGVudHJpZXMgPSBzYWZlX2xpc3RkaXIocGF0aF9pdGVtKQoKICAgICMgZm9yIHBlcmZvcm1hbmNlLCBiZWZvcmUgc29ydGluZyBieSB2ZXJzaW9uLAogICAgIyBzY3JlZW4gZW50cmllcyBmb3Igb25seSB0aG9zZSB0aGF0IHdpbGwgeWllbGQKICAgICMgZGlzdHJpYnV0aW9ucwogICAgZmlsdGVyZWQgPSAoCiAgICAgICAgZW50cnkKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgICAgIGlmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgKQoKICAgICMgc2NhbiBmb3IgLmVnZyBhbmQgLmVnZy1pbmZvIGluIGRpcmVjdG9yeQogICAgcGF0aF9pdGVtX2VudHJpZXMgPSBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKGZpbHRlcmVkKQogICAgZm9yIGVudHJ5IGluIHBhdGhfaXRlbV9lbnRyaWVzOgogICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpCiAgICAgICAgZmFjdG9yeSA9IGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgICAgIGZvciBkaXN0IGluIGZhY3RvcnkoZnVsbHBhdGgpOgogICAgICAgICAgICB5aWVsZCBkaXN0CgoKZGVmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KToKICAgICIiIgogICAgUmV0dXJuIGEgZGlzdF9mYWN0b3J5IGZvciBhIHBhdGhfaXRlbSBhbmQgZW50cnkKICAgICIiIgogICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCiAgICBpc19tZXRhID0gYW55KG1hcChsb3dlci5lbmRzd2l0aCwgKCcuZWdnLWluZm8nLCAnLmRpc3QtaW5mbycpKSkKICAgIHJldHVybiAoCiAgICAgICAgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhCiAgICAgICAgaWYgaXNfbWV0YSBlbHNlCiAgICAgICAgZmluZF9kaXN0cmlidXRpb25zCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIF9pc19lZ2dfcGF0aChlbnRyeSkgZWxzZQogICAgICAgIHJlc29sdmVfZWdnX2xpbmsKICAgICAgICBpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpIGVsc2UKICAgICAgICBOb0Rpc3RzKCkKICAgICkKCgpjbGFzcyBOb0Rpc3RzOgogICAgIiIiCiAgICA+Pj4gYm9vbChOb0Rpc3RzKCkpCiAgICBGYWxzZQoKICAgID4+PiBsaXN0KE5vRGlzdHMoKSgnYW55dGhpbmcnKSkKICAgIFtdCiAgICAiIiIKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBmdWxscGF0aCk6CiAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCgoKZGVmIHNhZmVfbGlzdGRpcihwYXRoKToKICAgICIiIgogICAgQXR0ZW1wdCB0byBsaXN0IGNvbnRlbnRzIG9mIHBhdGgsIGJ1dCBzdXBwcmVzcyBzb21lIGV4Y2VwdGlvbnMuCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQogICAgZXhjZXB0IChQZXJtaXNzaW9uRXJyb3IsIE5vdEFEaXJlY3RvcnlFcnJvcik6CiAgICAgICAgcGFzcwogICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAjIElnbm9yZSB0aGUgZGlyZWN0b3J5IGlmIGRvZXMgbm90IGV4aXN0LCBub3QgYSBkaXJlY3Rvcnkgb3IKICAgICAgICAjIHBlcm1pc3Npb24gZGVuaWVkCiAgICAgICAgaWdub3JhYmxlID0gKAogICAgICAgICAgICBlLmVycm5vIGluIChlcnJuby5FTk9URElSLCBlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCkKICAgICAgICAgICAgIyBQeXRob24gMiBvbiBXaW5kb3dzIG5lZWRzIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkgOigKICAgICAgICAgICAgb3IgZ2V0YXR0cihlLCAid2luZXJyb3IiLCBOb25lKSA9PSAyNjcKICAgICAgICApCiAgICAgICAgaWYgbm90IGlnbm9yYWJsZToKICAgICAgICAgICAgcmFpc2UKICAgIHJldHVybiAoKQoKCmRlZiBkaXN0cmlidXRpb25zX2Zyb21fbWV0YWRhdGEocGF0aCk6CiAgICByb290ID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgIGlmIGxlbihvcy5saXN0ZGlyKHBhdGgpKSA9PSAwOgogICAgICAgICAgICAjIGVtcHR5IG1ldGFkYXRhIGRpcjsgc2tpcAogICAgICAgICAgICByZXR1cm4KICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShyb290LCBwYXRoKQogICAgZWxzZToKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YShwYXRoKQogICAgZW50cnkgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICByb290LCBlbnRyeSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9REVWRUxPUF9ESVNULAogICAgKQoKCmRlZiBub25fZW1wdHlfbGluZXMocGF0aCk6CiAgICAiIiIKICAgIFlpZWxkIG5vbi1lbXB0eSBsaW5lcyBmcm9tIGZpbGUgYXQgcGF0aAogICAgIiIiCiAgICB3aXRoIG9wZW4ocGF0aCkgYXMgZjoKICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgoKZGVmIHJlc29sdmVfZWdnX2xpbmsocGF0aCk6CiAgICAiIiIKICAgIEdpdmVuIGEgcGF0aCB0byBhbiAuZWdnLWxpbmssIHJlc29sdmUgZGlzdHJpYnV0aW9ucwogICAgcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlZCBwYXRoLgogICAgIiIiCiAgICByZWZlcmVuY2VkX3BhdGhzID0gbm9uX2VtcHR5X2xpbmVzKHBhdGgpCiAgICByZXNvbHZlZF9wYXRocyA9ICgKICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHBhdGgpLCByZWYpCiAgICAgICAgZm9yIHJlZiBpbiByZWZlcmVuY2VkX3BhdGhzCiAgICApCiAgICBkaXN0X2dyb3VwcyA9IG1hcChmaW5kX2Rpc3RyaWJ1dGlvbnMsIHJlc29sdmVkX3BhdGhzKQogICAgcmV0dXJuIG5leHQoZGlzdF9ncm91cHMsICgpKQoKCnJlZ2lzdGVyX2ZpbmRlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaW5kX29uX3BhdGgpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9maW5kZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaW5kX29uX3BhdGgpCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfaGFuZGxlcnM9e30pCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9wYWNrYWdlcz17fSkKCgpkZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgogICAgIiIiUmVnaXN0ZXIgYG5hbWVzcGFjZV9oYW5kbGVyYCB0byBkZWNsYXJlIG5hbWVzcGFjZSBwYWNrYWdlcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgbmFtZXNwYWNlX2hhbmRsZXJgIGlzIGEgY2FsbGFibGUgbGlrZSB0aGlzOjoKCiAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2VudHJ5LCBtb2R1bGVOYW1lLCBtb2R1bGUpOgogICAgICAgICAgICAjIHJldHVybiBhIHBhdGhfZW50cnkgdG8gdXNlIGZvciBjaGlsZCBwYWNrYWdlcwoKICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQogICAgYWdyZWVkIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgcmVsZXZhbnQgcGF0aCBpdGVtLCBhbmQgdGhleSBzaG91bGQgb25seQogICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgogICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQogICAgYGBwa2dfcmVzb3VyY2VzLmZpbGVfbnNfaGFuZGxlcmBgLgogICAgIiIiCiAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKCgpkZWYgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKToKICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgoKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgaWYgbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSA9IHR5cGVzLk1vZHVsZVR5cGUocGFja2FnZU5hbWUpCiAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW10KICAgICAgICBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSkKICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCiAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKICAgIHN1YnBhdGggPSBoYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX18KICAgICAgICBwYXRoLmFwcGVuZChzdWJwYXRoKQogICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSkKICAgICAgICBfcmVidWlsZF9tb2RfcGF0aChwYXRoLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgcmV0dXJuIHN1YnBhdGgKCgpkZWYgX3JlYnVpbGRfbW9kX3BhdGgob3JpZ19wYXRoLCBwYWNrYWdlX25hbWUsIG1vZHVsZSk6CiAgICAiIiIKICAgIFJlYnVpbGQgbW9kdWxlLl9fcGF0aF9fIGVuc3VyaW5nIHRoYXQgYWxsIGVudHJpZXMgYXJlIG9yZGVyZWQKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgc3lzLnBhdGggb3JkZXIKICAgICIiIgogICAgc3lzX3BhdGggPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gc3lzLnBhdGhdCgogICAgZGVmIHNhZmVfc3lzX3BhdGhfaW5kZXgoZW50cnkpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MjAgYW5kICM1MTMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3lzX3BhdGguaW5kZXgoZW50cnkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKCiAgICBkZWYgcG9zaXRpb25faW5fc3lzX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBvcmRpbmFsIG9mIHRoZSBwYXRoIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBpbiBzeXMucGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGhfcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICBtb2R1bGVfcGFydHMgPSBwYWNrYWdlX25hbWUuY291bnQoJy4nKSArIDEKICAgICAgICBwYXJ0cyA9IHBhdGhfcGFydHNbOi1tb2R1bGVfcGFydHNdCiAgICAgICAgcmV0dXJuIHNhZmVfc3lzX3BhdGhfaW5kZXgoX25vcm1hbGl6ZV9jYWNoZWQob3Muc2VwLmpvaW4ocGFydHMpKSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShvcmlnX3BhdGgsIGxpc3QpOgogICAgICAgICMgSXMgdGhpcyBiZWhhdmlvciB1c2VmdWwgd2hlbiBtb2R1bGUuX19wYXRoX18gaXMgbm90IGEgbGlzdD8KICAgICAgICByZXR1cm4KCiAgICBvcmlnX3BhdGguc29ydChrZXk9cG9zaXRpb25faW5fc3lzX3BhdGgpCiAgICBtb2R1bGUuX19wYXRoX19bOl0gPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gb3JpZ19wYXRoXQoKCmRlZiBkZWNsYXJlX25hbWVzcGFjZShwYWNrYWdlTmFtZSk6CiAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGgsIHBhcmVudCA9IHN5cy5wYXRoLCBOb25lCiAgICAgICAgaWYgJy4nIGluIHBhY2thZ2VOYW1lOgogICAgICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYWNrYWdlTmFtZS5zcGxpdCgnLicpWzotMV0pCiAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKICAgICAgICAgICAgaWYgcGFyZW50IG5vdCBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYXJlbnQpCgogICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCiAgICAgICAgIyB0aGV5IGNhbiBiZSB1cGRhdGVkCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCwgW10pLmFwcGVuZChwYWNrYWdlTmFtZSkKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsIFtdKQoKICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6CiAgICAgICAgICAgICMgRW5zdXJlIGFsbCB0aGUgcGFyZW50J3MgcGF0aCBpdGVtcyBhcmUgcmVmbGVjdGVkIGluIHRoZSBjaGlsZCwKICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CiAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgogICAgIiIiRW5zdXJlIHRoYXQgcHJldmlvdXNseS1kZWNsYXJlZCBuYW1lc3BhY2UgcGFja2FnZXMgaW5jbHVkZSBwYXRoX2l0ZW0iIiIKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsICgpKToKICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQogICAgICAgICAgICBpZiBzdWJwYXRoOgogICAgICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgsIHBhY2thZ2UpCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZmlsZV9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCgogICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbLTFdKQogICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCiAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186CiAgICAgICAgaWYgX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkgPT0gbm9ybWFsaXplZDoKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAgICAgcmV0dXJuIHN1YnBhdGgKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaWxlX25zX2hhbmRsZXIpCgoKZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgIHJldHVybiBOb25lCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LCBudWxsX25zX2hhbmRsZXIpCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpKQoKCmRlZiBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSwgX2NhY2hlPXt9KToKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9jYWNoZVtmaWxlbmFtZV0gPSByZXN1bHQgPSBub3JtYWxpemVfcGF0aChmaWxlbmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiBlZ2cuCiAgICAiIiIKICAgIHJldHVybiBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKQoKCmRlZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIHVucGFja2VkIGVnZy4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBfaXNfZWdnX3BhdGgocGF0aCkgYW5kCiAgICAgICAgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdQS0ctSU5GTycpKQogICAgKQoKCmRlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CiAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKICAgIG5hbWUgPSBwYXJ0cy5wb3AoKQogICAgaWYgcGFydHM6CiAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCiAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1twYXJlbnRdLCBuYW1lLCBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0pCgoKZGVmIHlpZWxkX2xpbmVzKHN0cnMpOgogICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgc3RyaW5nIG9yIHNlcXVlbmNlIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBzID0gcy5zdHJpcCgpCiAgICAgICAgICAgICMgc2tpcCBibGFuayBsaW5lcy9jb21tZW50cwogICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCiAgICBlbHNlOgogICAgICAgIGZvciBzcyBpbiBzdHJzOgogICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCgoKTU9EVUxFID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCkVHR19OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiIKICAgICg/UDxuYW1lPlteLV0rKSAoCiAgICAgICAgLSg/UDx2ZXI+W14tXSspICgKICAgICAgICAgICAgLXB5KD9QPHB5dmVyPlteLV0rKSAoCiAgICAgICAgICAgICAgICAtKD9QPHBsYXQ+LispCiAgICAgICAgICAgICk/CiAgICAgICAgKT8KICAgICk/CiAgICAiIiIsCiAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKKS5tYXRjaAoKCmNsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgYW4gYWR2ZXJ0aXNlZCBpbXBvcnRhYmxlIG9iamVjdCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKICAgICAgICBpZiBub3QgTU9EVUxFKG1vZHVsZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShleHRyYXMpCiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgIGlmIHNlbGYuYXR0cnM6CiAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcyArPSAnIFslc10nICUgJywnLmpvaW4oc2VsZi5leHRyYXMpCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBkZWYgbG9hZChzZWxmLCByZXF1aXJlPVRydWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVxdWlyZSBwYWNrYWdlcyBmb3IgdGhpcyBFbnRyeVBvaW50LCB0aGVuIHJlc29sdmUgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmUgb3IgYXJncyBvciBrd2FyZ3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUGFyYW1ldGVycyB0byBsb2FkIGFyZSBkZXByZWNhdGVkLiAgQ2FsbCAucmVzb2x2ZSBhbmQgIgogICAgICAgICAgICAgICAgIi5yZXF1aXJlIHNlcGFyYXRlbHkuIiwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHJlcXVpcmU6CiAgICAgICAgICAgIHNlbGYucmVxdWlyZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSgpCgogICAgZGVmIHJlc29sdmUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSBpdHMgbW9kdWxlIGFuZCBhdHRycy4KICAgICAgICAiIiIKICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIGZyb21saXN0PVsnX19uYW1lX18nXSwgbGV2ZWw9MCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jdG9vbHMucmVkdWNlKGdldGF0dHIsIHNlbGYuYXR0cnMsIG1vZHVsZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihzdHIoZXhjKSkKCiAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoIkNhbid0IHJlcXVpcmUoKSB3aXRob3V0IGEgZGlzdHJpYnV0aW9uIiwgc2VsZikKCiAgICAgICAgIyBHZXQgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBlbnRyeSBwb2ludCB3aXRoIGFsbCBpdHMgZXh0cmFzIGFuZAogICAgICAgICMgdGhlbiByZXNvbHZlIHRoZW0uIFdlIGhhdmUgdG8gcGFzcyBgZXh0cmFzYCBhbG9uZyB3aGVuIHJlc29sdmluZyBzbwogICAgICAgICMgdGhhdCB0aGUgd29ya2luZyBzZXQga25vd3Mgd2hhdCBleHRyYXMgd2Ugd2FudC4gT3RoZXJ3aXNlLCBmb3IKICAgICAgICAjIGRpc3QtaW5mbyBkaXN0cmlidXRpb25zLCB0aGUgd29ya2luZyBzZXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKICAgICAgICAjIHJlcXVpcmVtZW50cyBmb3IgdGhhdCBleHRyYSBhcmUgcHVyZWx5IG9wdGlvbmFsIGFuZCBza2lwIG92ZXIgdGhlbS4KICAgICAgICByZXFzID0gc2VsZi5kaXN0LnJlcXVpcmVzKHNlbGYuZXh0cmFzKQogICAgICAgIGl0ZW1zID0gd29ya2luZ19zZXQucmVzb2x2ZShyZXFzLCBlbnYsIGluc3RhbGxlciwgZXh0cmFzPXNlbGYuZXh0cmFzKQogICAgICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZCwgaXRlbXMpKQoKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInXHMqJwogICAgICAgIHInKD9QPG5hbWU+Lis/KVxzKicKICAgICAgICByJz1ccyonCiAgICAgICAgcicoP1A8bW9kdWxlPltcdy5dKylccyonCiAgICAgICAgcicoOlxzKig/UDxhdHRyPltcdy5dKykpP1xzKicKICAgICAgICByJyg/UDxleHRyYXM+XFsuKlxdKT9ccyokJwogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlKGNscywgc3JjLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCgogICAgICAgIEVudHJ5IHBvaW50IHN5bnRheCBmb2xsb3dzIHRoZSBmb3JtOjoKCiAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSwgZXh0cmEyXQoKICAgICAgICBUaGUgZW50cnkgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIHJlcXVpcmVkLCBidXQgdGhlIGBgOmF0dHJzYGAgYW5kCiAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAogICAgICAgICIiIgogICAgICAgIG0gPSBjbHMucGF0dGVybi5tYXRjaChzcmMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIG1zZyA9ICJFbnRyeVBvaW50IG11c3QgYmUgaW4gJ25hbWU9bW9kdWxlOmF0dHJzIFtleHRyYXNdJyBmb3JtYXQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzcmMpCiAgICAgICAgcmVzID0gbS5ncm91cGRpY3QoKQogICAgICAgIGV4dHJhcyA9IGNscy5fcGFyc2VfZXh0cmFzKHJlc1snZXh0cmFzJ10pCiAgICAgICAgYXR0cnMgPSByZXNbJ2F0dHInXS5zcGxpdCgnLicpIGlmIHJlc1snYXR0ciddIGVsc2UgKCkKICAgICAgICByZXR1cm4gY2xzKHJlc1snbmFtZSddLCByZXNbJ21vZHVsZSddLCBhdHRycywgZXh0cmFzLCBkaXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9leHRyYXMoY2xzLCBleHRyYXNfc3BlYyk6CiAgICAgICAgaWYgbm90IGV4dHJhc19zcGVjOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgneCcgKyBleHRyYXNfc3BlYykKICAgICAgICBpZiByZXEuc3BlY3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQogICAgICAgIHJldHVybiByZXEuZXh0cmFzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYW4gZW50cnkgcG9pbnQgZ3JvdXAiIiIKICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgdGhpcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgogICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQogICAgICAgICAgICBpZiBlcC5uYW1lIGluIHRoaXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKICAgICAgICAgICAgdGhpc1tlcC5uYW1lXSA9IGVwCiAgICAgICAgcmV0dXJuIHRoaXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9tYXAoY2xzLCBkYXRhLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKICAgICAgICBtYXBzID0ge30KICAgICAgICBmb3IgZ3JvdXAsIGxpbmVzIGluIGRhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQogICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKICAgICAgICAgICAgaWYgZ3JvdXAgaW4gbWFwczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKICAgICAgICByZXR1cm4gbWFwcwoKCmRlZiBfcmVtb3ZlX21kNV9mcmFnbWVudChsb2NhdGlvbik6CiAgICBpZiBub3QgbG9jYXRpb246CiAgICAgICAgcmV0dXJuICcnCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UobG9jYXRpb24pCiAgICBpZiBwYXJzZWRbLTFdLnN0YXJ0c3dpdGgoJ21kNT0nKToKICAgICAgICByZXR1cm4gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFyc2VkWzotMV0gKyAoJycsKSkKICAgIHJldHVybiBsb2NhdGlvbgoKCmRlZiBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpOgogICAgIiIiCiAgICBHaXZlbiBhbiBpdGVyYWJsZSBvZiBsaW5lcyBmcm9tIGEgTWV0YWRhdGEgZmlsZSwgcmV0dXJuCiAgICB0aGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gZmllbGQsIGlmIHByZXNlbnQsIG9yIE5vbmUgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBpc192ZXJzaW9uX2xpbmUgPSBsYW1iZGEgbGluZTogbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3ZlcnNpb246JykKICAgIHZlcnNpb25fbGluZXMgPSBmaWx0ZXIoaXNfdmVyc2lvbl9saW5lLCBsaW5lcykKICAgIGxpbmUgPSBuZXh0KGl0ZXIodmVyc2lvbl9saW5lcyksICcnKQogICAgXywgXywgdmFsdWUgPSBsaW5lLnBhcnRpdGlvbignOicpCiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZhbHVlLnN0cmlwKCkpIG9yIE5vbmUKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCiAgICBQS0dfSU5GTyA9ICdQS0ctSU5GTycKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLAogICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QpOgogICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCiAgICAgICAgc2VsZi5fcHJvdmlkZXIgPSBtZXRhZGF0YSBvciBlbXB0eV9wcm92aWRlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLCBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0gKiA0CiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpCiAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gX2Rpc3RyaWJ1dGlvbkltcGw6CiAgICAgICAgICAgIGNscyA9IF9kaXN0cmlidXRpb25JbXBsW2V4dC5sb3dlcigpXQoKICAgICAgICAgICAgbWF0Y2ggPSBFR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyJywgJ3B5dmVyJywgJ3BsYXQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9cHJvamVjdF9uYW1lLCB2ZXJzaW9uPXZlcnNpb24sCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKICAgICAgICApLl9yZWxvYWRfdmVyc2lvbigpCgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hjbXAoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5wYXJzZWRfdmVyc2lvbiwKICAgICAgICAgICAgc2VsZi5wcmVjZWRlbmNlLAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgX3JlbW92ZV9tZDVfZnJhZ21lbnQoc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciAnJywKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSBvciAnJywKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuaGFzaGNtcCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDwgb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPD0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPiBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIyBJdCdzIG5vdCBhIERpc3RyaWJ1dGlvbiwgc28gdGhleSBhcmUgbm90IGVxdWFsCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPT0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgVGhlc2UgcHJvcGVydGllcyBoYXZlIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGxvYWQgYW55CiAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYga2V5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9wYXJzZWRfdmVyc2lvbiIpOgogICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi52ZXJzaW9uKQoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VkX3ZlcnNpb24KCiAgICBkZWYgX3dhcm5fbGVnYWN5X3ZlcnNpb24oc2VsZik6CiAgICAgICAgTFYgPSBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uCiAgICAgICAgaXNfbGVnYWN5ID0gaXNpbnN0YW5jZShzZWxmLl9wYXJzZWRfdmVyc2lvbiwgTFYpCiAgICAgICAgaWYgbm90IGlzX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2hpbGUgYW4gZW1wdHkgdmVyc2lvbiBpcyB0ZWNobmljYWxseSBhIGxlZ2FjeSB2ZXJzaW9uIGFuZAogICAgICAgICMgaXMgbm90IGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uLCBpdCdzIGFsc28gdW5saWtlbHkgdG8KICAgICAgICAjIGFjdHVhbGx5IGNvbWUgZnJvbSBzb21lb25lIGFuZCBpbnN0ZWFkIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQKICAgICAgICAjIGl0IGNvbWVzIGZyb20gc2V0dXB0b29scyBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZW5hbWUgYW5kCiAgICAgICAgIyBpbmNsdWRpbmcgaXQgaW4gdGhlIGxpc3QuIFNvIGZvciB0aGF0IHdlJ2xsIGdhdGUgdGhpcyB3YXJuaW5nCiAgICAgICAgIyBvbiBpZiB0aGUgdmVyc2lvbiBpcyBhbnl0aGluZyBhdCBhbGwgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICAne3Byb2plY3RfbmFtZX0gKHt2ZXJzaW9ufSknIGlzIGJlaW5nIHBhcnNlZCBhcyBhIGxlZ2FjeSwKICAgICAgICAgICAgbm9uIFBFUCA0NDAsCiAgICAgICAgICAgIHZlcnNpb24uIFlvdSBtYXkgZmluZCBvZGQgYmVoYXZpb3IgYW5kIHNvcnQgb3JkZXIuCiAgICAgICAgICAgIEluIHBhcnRpY3VsYXIgaXQgd2lsbCBiZSBzb3J0ZWQgYXMgbGVzcyB0aGFuIDAuMC4gSXQKICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdG8gbWlncmF0ZSB0byBQRVAgNDQwIGNvbXBhdGlibGUKICAgICAgICAgICAgdmVyc2lvbnMuCiAgICAgICAgICAgICIiIikuc3RyaXAoKS5yZXBsYWNlKCdcbicsICcgJykKCiAgICAgICAgd2FybmluZ3Mud2Fybih0bXBsLmZvcm1hdCgqKnZhcnMoc2VsZikpLCBQRVA0NDBXYXJuaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHRtcGwgPSAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgJXMgZmlsZSIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IodG1wbCAlIHNlbGYuUEtHX0lORk8sIHNlbGYpCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CiAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgogICAgICAgICAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLCBtYXJrZXIgPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIHdhcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpIG9yIE5vbmUKICAgICAgICAgICAgICAgICAgICBkbS5zZXRkZWZhdWx0KGV4dHJhLCBbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKICAgICAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIHJlcXVpcmVzKHNlbGYsIGV4dHJhcz0oKSk6CiAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgogICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAogICAgICAgIGRlcHMgPSBbXQogICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCAoKSkpCiAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlcHMuZXh0ZW5kKGRtW3NhZmVfZXh0cmEoZXh0KV0pCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKICAgICAgICAgICAgICAgICAgICAiJXMgaGFzIG5vIHN1Y2ggZXh0cmEgZmVhdHVyZSAlciIgJSAoc2VsZiwgZXh0KQogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkZXBzCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwYXRoPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoLCByZXBsYWNlPXJlcGxhY2UpCiAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBwa2cgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGtnKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCiAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCiAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNlbGYucHJvamVjdF9uYW1lKSwgdG9fZmlsZW5hbWUoc2VsZi52ZXJzaW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgogICAgICAgICAgICBmaWxlbmFtZSArPSAnLScgKyBzZWxmLnBsYXRmb3JtCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYubG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZiwgc2VsZi5sb2NhdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gZ2V0YXR0cihzZWxmLCAndmVyc2lvbicsIE5vbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gb3IgIlt1bmtub3duIHZlcnNpb25dIgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgogICAgICAgIGlmIGF0dHIuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLCBmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKICAgICAgICAgICAgKiprdwogICAgICAgICkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgICAgICAgICAgc3BlYyA9ICIlcz09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQoKICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICAgICAgZXAgPSBzZWxmLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCwgbmFtZSksKSkKICAgICAgICByZXR1cm4gZXAubG9hZCgpCgogICAgZGVmIGdldF9lbnRyeV9tYXAoc2VsZiwgZ3JvdXA9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpLCBzZWxmCiAgICAgICAgICAgICkKICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGVwX21hcC5nZXQoZ3JvdXAsIHt9KQogICAgICAgIHJldHVybiBlcF9tYXAKCiAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQoKICAgIGRlZiBpbnNlcnRfb24oc2VsZiwgcGF0aCwgbG9jPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBzZWxmLmxvY2F0aW9uIGlzIG9uIHBhdGgKCiAgICAgICAgSWYgcmVwbGFjZT1GYWxzZSAoZGVmYXVsdCk6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBpbiBwYXRoIGFueXdoZXJlLCBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgdG8gdGhlIGVuZCBvZiBwYXRoLgogICAgICAgIElmIHJlcGxhY2U9VHJ1ZToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IG9uIHBhdGggYW55d2hlcmUgKG5vdCBlZ2dzKQogICAgICAgICAgICAgIG9yIGhpZ2hlciBwcmlvcml0eSB0aGFuIGl0cyBwYXJlbnQgKGVnZ3MpCiAgICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LAogICAgICAgICAgICAgICAgcmVtb3ZpbmcgYW55IGxvd2VyLXByaW9yaXR5IGVudHJpZXMuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgaXQgdG8gdGhlIGZyb250IG9mIHBhdGguCiAgICAgICAgIiIiCgogICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCiAgICAgICAgaWYgbm90IGxvYzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5sb2MgPSBfbm9ybWFsaXplX2NhY2hlZChsb2MpCiAgICAgICAgYmRpciA9IG9zLnBhdGguZGlybmFtZShubG9jKQogICAgICAgIG5wYXRoID0gWyhwIGFuZCBfbm9ybWFsaXplX2NhY2hlZChwKSBvciBwKSBmb3IgcCBpbiBwYXRoXQoKICAgICAgICBmb3IgcCwgaXRlbSBpbiBlbnVtZXJhdGUobnBhdGgpOgogICAgICAgICAgICBpZiBpdGVtID09IG5sb2M6CiAgICAgICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IHBhdGggKGV2ZW4gcmVtb3ZpbmcgZHVwbGljYXRlcykgaWYKICAgICAgICAgICAgICAgICAgICAjIGZvdW5kIGFuZCBub3QgcmVwbGFjZQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIGl0ZW0gPT0gYmRpciBhbmQgc2VsZi5wcmVjZWRlbmNlID09IEVHR19ESVNUOgogICAgICAgICAgICAgICAgIyBpZiBpdCdzIGFuIC5lZ2csIGdpdmUgaXQgcHJlY2VkZW5jZSBvdmVyIGl0cyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgVU5MRVNTIGl0J3MgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHN5cy5wYXRoIGFuZCByZXBsYWNlPUZhbHNlCiAgICAgICAgICAgICAgICBpZiAobm90IHJlcGxhY2UpIGFuZCBubG9jIGluIG5wYXRoW3A6XToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KHAsIGxvYykKICAgICAgICAgICAgICAgIG5wYXRoLmluc2VydChwLCBubG9jKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIGxvYykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKGxvYykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgcCBpcyB0aGUgc3BvdCB3aGVyZSB3ZSBmb3VuZCBvciBpbnNlcnRlZCBsb2M7IG5vdyByZW1vdmUgZHVwbGljYXRlcwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5wID0gbnBhdGguaW5kZXgobmxvYywgcCArIDEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBucGF0aFtucF0sIHBhdGhbbnBdCiAgICAgICAgICAgICAgICAjIGhhIQogICAgICAgICAgICAgICAgcCA9IG5wCgogICAgICAgIHJldHVybgoKICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCiAgICAgICAgbG9jID0gbm9ybWFsaXplX3BhdGgoc2VsZi5sb2NhdGlvbikKICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCiAgICAgICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gKCdwa2dfcmVzb3VyY2VzJywgJ3NldHVwdG9vbHMnLCAnc2l0ZScpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZm4gPSBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAnX19maWxlX18nLCBOb25lKQogICAgICAgICAgICBpZiBmbiBhbmQgKG5vcm1hbGl6ZV9wYXRoKGZuKS5zdGFydHN3aXRoKGxvYykgb3IKICAgICAgICAgICAgICAgICAgICAgICBmbi5zdGFydHN3aXRoKHNlbGYubG9jYXRpb24pKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoCiAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgKQoKICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudmVyc2lvbgogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKCJVbmJ1aWx0IGVnZyBmb3IgIiArIHJlcHIoc2VsZikpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNsb25lKHNlbGYsICoqa3cpOgogICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBuYW1lcyA9ICdwcm9qZWN0X25hbWUgdmVyc2lvbiBweV92ZXJzaW9uIHBsYXRmb3JtIGxvY2F0aW9uIHByZWNlZGVuY2UnCiAgICAgICAgZm9yIGF0dHIgaW4gbmFtZXMuc3BsaXQoKToKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ21ldGFkYXRhJywgc2VsZi5fcHJvdmlkZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0cmFzKHNlbGYpOgogICAgICAgIHJldHVybiBbZGVwIGZvciBkZXAgaW4gc2VsZi5fZGVwX21hcCBpZiBkZXBdCgoKY2xhc3MgRWdnSW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQYWNrYWdlcyBpbnN0YWxsZWQgYnkgZGlzdHV0aWxzIChlLmcuIG51bXB5IG9yIHNjaXB5KSwKICAgICAgICB3aGljaCB1c2VzIGFuIG9sZCBzYWZlX3ZlcnNpb24sIGFuZCBzbwogICAgICAgIHRoZWlyIHZlcnNpb24gbnVtYmVycyBjYW4gZ2V0IG1hbmdsZWQgd2hlbgogICAgICAgIGNvbnZlcnRlZCB0byBmaWxlbmFtZXMgKGUuZy4sIDEuMTEuMC5kZXYwKzIzMjllYWUgdG8KICAgICAgICAxLjExLjAuZGV2MF8yMzI5ZWFlKS4gVGhlc2UgZGlzdHJpYnV0aW9ucyB3aWxsIG5vdCBiZQogICAgICAgIHBhcnNlZCBwcm9wZXJseQogICAgICAgIGRvd25zdHJlYW0gYnkgRGlzdHJpYnV0aW9uIGFuZCBzYWZlX3ZlcnNpb24sIHNvCiAgICAgICAgdGFrZSBhbiBleHRyYSBzdGVwIGFuZCB0cnkgdG8gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tCiAgICAgICAgdGhlIG1ldGFkYXRhIGZpbGUgaXRzZWxmIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lLgogICAgICAgICIiIgogICAgICAgIG1kX3ZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgIGlmIG1kX3ZlcnNpb246CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBtZF92ZXJzaW9uCiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBEaXN0SW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkKICAgIHcvbWV0YWRhdGEsIC5kaXN0LWluZm8gc3R5bGUuCiAgICAiIiIKICAgIFBLR19JTkZPID0gJ01FVEFEQVRBJwogICAgRVFFUSA9IHJlLmNvbXBpbGUociIoW1woLF0pXHMqKFxkLio/KVxzKihbLFwpXSkiKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9wYXJzZWRfcGtnX2luZm8oc2VsZik6CiAgICAgICAgIiIiUGFyc2UgYW5kIGNhY2hlIG1ldGFkYXRhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykKICAgICAgICAgICAgc2VsZi5fcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIobWV0YWRhdGEpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fZGVwX21hcCA9IHNlbGYuX2NvbXB1dGVfZGVwZW5kZW5jaWVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCgogICAgZGVmIF9jb21wdXRlX2RlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICAiIiJSZWNvbXB1dGUgdGhpcyBkaXN0cmlidXRpb24ncyBkZXBlbmRlbmNpZXMuIiIiCiAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KCiAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgIyBJbmNsdWRpbmcgYW55IGNvbmRpdGlvbiBleHByZXNzaW9ucwogICAgICAgIGZvciByZXEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1JlcXVpcmVzLURpc3QnKSBvciBbXToKICAgICAgICAgICAgcmVxcy5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcSkpCgogICAgICAgIGRlZiByZXFzX2Zvcl9leHRyYShleHRyYSk6CiAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEubWFya2VyIG9yIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVxCgogICAgICAgIGNvbW1vbiA9IGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShOb25lKSkKICAgICAgICBkbVtOb25lXS5leHRlbmQoY29tbW9uKQoKICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1Byb3ZpZGVzLUV4dHJhJykgb3IgW106CiAgICAgICAgICAgIHNfZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhLnN0cmlwKCkpCiAgICAgICAgICAgIGRtW3NfZXh0cmFdID0gbGlzdChmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoZXh0cmEpKSAtIGNvbW1vbikKCiAgICAgICAgcmV0dXJuIGRtCgoKX2Rpc3RyaWJ1dGlvbkltcGwgPSB7CiAgICAnLmVnZyc6IERpc3RyaWJ1dGlvbiwKICAgICcuZWdnLWluZm8nOiBFZ2dJbmZvRGlzdHJpYnV0aW9uLAogICAgJy5kaXN0LWluZm8nOiBEaXN0SW5mb0Rpc3RyaWJ1dGlvbiwKfQoKCmRlZiBpc3N1ZV93YXJuaW5nKCphcmdzLCAqKmt3KToKICAgIGxldmVsID0gMQogICAgZyA9IGdsb2JhbHMoKQogICAgdHJ5OgogICAgICAgICMgZmluZCB0aGUgZmlyc3Qgc3RhY2sgZnJhbWUgdGhhdCBpcyAqbm90KiBjb2RlIGluCiAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgd2FybmluZ3Mud2FybihzdGFja2xldmVsPWxldmVsICsgMSwgKmFyZ3MsICoqa3cpCgoKY2xhc3MgUmVxdWlyZW1lbnRQYXJzZUVycm9yKFZhbHVlRXJyb3IpOgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuYXJncykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgogICAgIiIiWWllbGQgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMgZm9yIGVhY2ggc3BlY2lmaWNhdGlvbiBpbiBgc3Ryc2AKCiAgICBgc3Ryc2AgbXVzdCBiZSBhIHN0cmluZywgb3IgYSAocG9zc2libHktbmVzdGVkKSBpdGVyYWJsZSB0aGVyZW9mLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIHN0ZXBwYWJsZSBpdGVyYXRvciwgc28gd2UgY2FuIGhhbmRsZSBcLWNvbnRpbnVhdGlvbnMKICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAjIERyb3AgY29tbWVudHMgLS0gYSBoYXNoIHdpdGhvdXQgYSBzcGFjZSBtYXkgYmUgaW4gYSBVUkwuCiAgICAgICAgaWYgJyAjJyBpbiBsaW5lOgogICAgICAgICAgICBsaW5lID0gbGluZVs6bGluZS5maW5kKCcgIycpXQogICAgICAgICMgSWYgdGhlcmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgZHJvcCBpdCwgYW5kIGFwcGVuZCB0aGUgbmV4dCBsaW5lLgogICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0uc3RyaXAoKQogICAgICAgICAgICBsaW5lICs9IG5leHQobGluZXMpCiAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQobGluZSkKCgpjbGFzcyBSZXF1aXJlbWVudChwYWNrYWdpbmcucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihSZXF1aXJlbWVudCwgc2VsZikuX19pbml0X18ocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBwYWNrYWdpbmcucmVxdWlyZW1lbnRzLkludmFsaWRSZXF1aXJlbWVudCBhcyBlOgogICAgICAgICAgICByYWlzZSBSZXF1aXJlbWVudFBhcnNlRXJyb3Ioc3RyKGUpKQogICAgICAgIHNlbGYudW5zYWZlX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBwcm9qZWN0X25hbWUgPSBzYWZlX25hbWUoc2VsZi5uYW1lKQogICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBzZWxmLnNwZWNzID0gWwogICAgICAgICAgICAoc3BlYy5vcGVyYXRvciwgc3BlYy52ZXJzaW9uKSBmb3Igc3BlYyBpbiBzZWxmLnNwZWNpZmllcl0KICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKG1hcChzYWZlX2V4dHJhLCBzZWxmLmV4dHJhcykpCiAgICAgICAgc2VsZi5oYXNoQ21wID0gKAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgc2VsZi5zcGVjaWZpZXIsCiAgICAgICAgICAgIGZyb3plbnNldChzZWxmLmV4dHJhcyksCiAgICAgICAgICAgIHN0cihzZWxmLm1hcmtlcikgaWYgc2VsZi5tYXJrZXIgZWxzZSBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uob3RoZXIsIFJlcXVpcmVtZW50KSBhbmQKICAgICAgICAgICAgc2VsZi5oYXNoQ21wID09IG90aGVyLmhhc2hDbXAKICAgICAgICApCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGlmIGl0ZW0ua2V5ICE9IHNlbGYua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpdGVtID0gaXRlbS52ZXJzaW9uCgogICAgICAgICMgQWxsb3cgcHJlcmVsZWFzZXMgYWx3YXlzIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZgogICAgICAgICMgdGhpcyBtZXRob2QuIEluIHRoZSBmdXR1cmUgdGhpcyBzaG91bGQgYmUgc21hcnRlciBhbmQgZm9sbG93IFBFUCA0NDAKICAgICAgICAjIG1vcmUgYWNjdXJhdGVseS4KICAgICAgICByZXR1cm4gc2VsZi5zcGVjaWZpZXIuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9VHJ1ZSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwYXJzZShzKToKICAgICAgICByZXEsID0gcGFyc2VfcmVxdWlyZW1lbnRzKHMpCiAgICAgICAgcmV0dXJuIHJlcQoKCmRlZiBfYWx3YXlzX29iamVjdChjbGFzc2VzKToKICAgICIiIgogICAgRW5zdXJlIG9iamVjdCBhcHBlYXJzIGluIHRoZSBtcm8gZXZlbgogICAgZm9yIG9sZC1zdHlsZSBjbGFzc2VzLgogICAgIiIiCiAgICBpZiBvYmplY3Qgbm90IGluIGNsYXNzZXM6CiAgICAgICAgcmV0dXJuIGNsYXNzZXMgKyAob2JqZWN0LCkKICAgIHJldHVybiBjbGFzc2VzCgoKZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKICAgICIiIlJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIGBvYmAgZnJvbSBgcmVnaXN0cnlgIiIiCiAgICB0eXBlcyA9IF9hbHdheXNfb2JqZWN0KGluc3BlY3QuZ2V0bXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpKQogICAgZm9yIHQgaW4gdHlwZXM6CiAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCgoKZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBweTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCgoKZGVmIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIlNhbmRib3gtYnlwYXNzaW5nIHZlcnNpb24gb2YgZW5zdXJlX2RpcmVjdG9yeSgpIiIiCiAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MubWtkaXIiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4nKQogICAgZGlybmFtZSwgZmlsZW5hbWUgPSBzcGxpdChwYXRoKQogICAgaWYgZGlybmFtZSBhbmQgZmlsZW5hbWUgYW5kIG5vdCBpc2RpcihkaXJuYW1lKToKICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkoZGlybmFtZSkKICAgICAgICBta2RpcihkaXJuYW1lLCAwbzc1NSkKCgpkZWYgc3BsaXRfc2VjdGlvbnMocyk6CiAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sIGNvbnRlbnQpIHBhaXJzCgogICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKICAgIGFuZCBlYWNoIGBgY29udGVudGBgIGlzIGEgbGlzdCBvZiBzdHJpcHBlZCBsaW5lcyBleGNsdWRpbmcgYmxhbmsgbGluZXMgYW5kCiAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCiAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KICAgICIiIgogICAgc2VjdGlvbiA9IE5vbmUKICAgIGNvbnRlbnQgPSBbXQogICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMocyk6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CiAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gb3IgY29udGVudDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250ZW50ID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQoKICAgICMgd3JhcCB1cCBsYXN0IHNlZ21lbnQKICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKCgpkZWYgX21rc3RlbXAoKmFyZ3MsICoqa3cpOgogICAgb2xkX29wZW4gPSBvcy5vcGVuCiAgICB0cnk6CiAgICAgICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZwogICAgICAgIG9zLm9wZW4gPSBvc19vcGVuCiAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rc3RlbXAoKmFyZ3MsICoqa3cpCiAgICBmaW5hbGx5OgogICAgICAgICMgYW5kIHRoZW4gcHV0IGl0IGJhY2sKICAgICAgICBvcy5vcGVuID0gb2xkX29wZW4KCgojIFNpbGVuY2UgdGhlIFBFUDQ0MFdhcm5pbmcgYnkgZGVmYXVsdCwgc28gdGhhdCBlbmQgdXNlcnMgZG9uJ3QgZ2V0IGhpdCBieSBpdAojIHJhbmRvbWx5IGp1c3QgYmVjYXVzZSB0aGV5IHVzZSBwa2dfcmVzb3VyY2VzLiBXZSB3YW50IHRvIGFwcGVuZCB0aGUgcnVsZQojIGJlY2F1c2Ugd2Ugd2FudCBlYXJsaWVyIHVzZXMgb2YgZmlsdGVyd2FybmluZ3MgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcwojIG9uZS4Kd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBFUDQ0MFdhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzIDEuMwpkZWYgX2NhbGxfYXNpZGUoZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIGYoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGYKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplKGc9Z2xvYmFscygpKToKICAgICJTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgKGRlbGliZXJhdGVseSBub3Qgc3RhdGUtc2F2ZWQpIgogICAgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCiAgICBnWydfbWFuYWdlciddID0gbWFuYWdlcgogICAgZy51cGRhdGUoCiAgICAgICAgKG5hbWUsIGdldGF0dHIobWFuYWdlciwgbmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKG1hbmFnZXIpCiAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpCiAgICApCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZV9tYXN0ZXJfd29ya2luZ19zZXQoKToKICAgICIiIgogICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgCiAgICBBUEkgYXZhaWxhYmxlLgoKICAgIFRoaXMgZnVuY3Rpb24gaGFzIGV4cGxpY2l0IGVmZmVjdHMgb24gdGhlIGdsb2JhbCBzdGF0ZQogICAgb2YgcGtnX3Jlc291cmNlcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBvbmNlIGF0CiAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUuCgogICAgSW52b2NhdGlvbiBieSBvdGhlciBwYWNrYWdlcyBpcyB1bnN1cHBvcnRlZCBhbmQgZG9uZQogICAgYXQgdGhlaXIgb3duIHJpc2suCiAgICAiIiIKICAgIHdvcmtpbmdfc2V0ID0gV29ya2luZ1NldC5fYnVpbGRfbWFzdGVyKCkKICAgIF9kZWNsYXJlX3N0YXRlKCdvYmplY3QnLCB3b3JraW5nX3NldD13b3JraW5nX3NldCkKCiAgICByZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQogICAgaXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cwogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKICAgIHJ1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CiAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgIHJ1bl9tYWluID0gcnVuX3NjcmlwdAogICAgIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoIHdpdGggcmVwbGFjZT1GYWxzZSBhbmQKICAgICMgZW5zdXJlIHRoYXQgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUKICAgICMgKGUuZy4gYnkgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbCwKICAgICMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKHJlcGxhY2U9VHJ1ZSkuCiAgICB0dXBsZSgKICAgICAgICBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9RmFsc2UpCiAgICAgICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQKICAgICkKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKAogICAgICAgIGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9VHJ1ZSksCiAgICAgICAgZXhpc3Rpbmc9RmFsc2UsCiAgICApCiAgICB3b3JraW5nX3NldC5lbnRyaWVzID0gW10KICAgICMgbWF0Y2ggb3JkZXIKICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSwgc3lzLnBhdGgpKQogICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA5AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBDq7AmZlcAAGZXAAA4AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMuCiMgQ29weXJpZ2h0IChjKSAyMDEzIEVkZHkgUGV0cmnImW9yCgoiIiJVdGlsaXRpZXMgZm9yIGRldGVybWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRpcnMuCgpTZWUgPGh0dHA6Ly9naXRodWIuY29tL0FjdGl2ZVN0YXRlL2FwcGRpcnM+IGZvciBkZXRhaWxzIGFuZCB1c2FnZS4KIiIiCiMgRGV2IE5vdGVzOgojIC0gTVNETiBvbiB3aGVyZSB0byBzdG9yZSBhcHAgZGF0YSBmaWxlczoKIyAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7ZW4tdXM7MzEwMjk0I1hTTFRIMzE5NDEyMTEyMzEyMDEyMTEyMDEyMAojIC0gTWFjIE9TIFg6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vTWFjT1NYL0NvbmNlcHR1YWwvQlBGaWxlU3lzdGVtL2luZGV4Lmh0bWwKIyAtIFhERyBzcGVjIGZvciBVbip4OiBodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sCgpfX3ZlcnNpb25faW5mb19fID0gKDEsIDQsIDApCl9fdmVyc2lvbl9fID0gJy4nLmpvaW4obWFwKHN0ciwgX192ZXJzaW9uX2luZm9fXykpCgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKaWYgUFkzOgogICAgdW5pY29kZSA9IHN0cgoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBwbGF0Zm9ybQogICAgb3NfbmFtZSA9IHBsYXRmb3JtLmphdmFfdmVyKClbM11bMF0KICAgIGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnV2luZG93cycpOiAjICJXaW5kb3dzIFhQIiwgIldpbmRvd3MgNyIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnd2luMzInCiAgICBlbGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnTWFjJyk6ICMgIk1hYyBPUyBYIiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICdkYXJ3aW4nCiAgICBlbHNlOiAjICJMaW51eCIsICJTdW5PUyIsICJGcmVlQlNEIiwgZXRjLgogICAgICAgICMgU2V0dGluZyB0aGlzIHRvICJsaW51eDIiIGlzIG5vdCBpZGVhbCwgYnV0IG9ubHkgV2luZG93cyBvciBNYWMKICAgICAgICAjIGFyZSBhY3R1YWxseSBjaGVja2VkIGZvciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZSBleHBlY3RzCiAgICAgICAgIyAqc3lzLnBsYXRmb3JtKiBzdHlsZSBzdHJpbmdzLgogICAgICAgIHN5c3RlbSA9ICdsaW51eDInCmVsc2U6CiAgICBzeXN0ZW0gPSBzeXMucGxhdGZvcm0KCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbiAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKHJvYW1pbmcpOiAgICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwQXV0aG9yPlw8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8ubG9jYWwvc2hhcmUiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBkYXRhIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19EQVRBX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPicsCiAgICAgICAgICAgIGlmIFhER19EQVRBX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIC91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+IG9yIC91c3Ivc2hhcmUvPEFwcE5hbWU+CiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xBbGwgVXNlcnNcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQogICAgICAgIFdpbiA3OiAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPiAgICMgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3LgoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0RBVEFfRElSU1swXSBkZWZhdWx0LgoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfREFUQV9ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9ESVJTJywKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGhzZXAuam9pbihbJy91c3IvbG9jYWwvc2hhcmUnLCAnL3Vzci9zaGFyZSddKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPiAgICAgIyBvciBpbiAkWERHX0NPTkZJR19IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luICo6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19DT05GSUdfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlYWZ1bHQgIn4vLmNvbmZpZy88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIE5vbmUsIHJvYW1pbmcpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBjb25maWcgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0NPTkZJR19ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL2V0Yy94ZGcvPEFwcE5hbWU+JywgaWYgWERHX0NPTkZJR19ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgL2V0Yy94ZGcvPEFwcE5hbWU+IG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+IGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiAqOiAgICAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfQ09ORklHX0RJUlNbMF0gZGVmYXVsdCwgaWYgbXVsdGlwYXRoPUZhbHNlCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSBzaXRlX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgICAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfQ09ORklHX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfRElSUycsICcvZXRjL3hkZycpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiQ2FjaGUiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cy4gU2VlCiAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28gaW4KICAgIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbm9uLXJvYW1pbmcKICAgIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgIGFib3ZlKS4gQXBwcyB0eXBpY2FsbHkKICAgIHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZSBleGFtcGxlczoKICAgICAgICAuLi5cTW96aWxsYVxGaXJlZm94XFByb2ZpbGVzXDxQcm9maWxlTmFtZT5cQ2FjaGUKICAgICAgICAuLi5cQWNtZVxTdXBlckFwcFxDYWNoZVwxLjAKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgICAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkNhY2hlIikKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9DYWNoZXMnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NBQ0hFX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLmNhY2hlJykpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2xvZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgbG9nIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkxvZ3MiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cywgYW5kICJsb2ciIHRvIHRoZQogICAgICAgICAgICBiYXNlIGNhY2hlIGRpciBmb3IgVW5peC4gU2VlIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICB+L0xpYnJhcnkvTG9ncy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4vbG9nICAjIG9yIHVuZGVyICRYREdfQ0FDSEVfSE9NRSBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzCiAgICBnbyBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gKE5vdGU6IEknbSBpbnRlcmVzdGVkIGluCiAgICBleGFtcGxlcyBvZiB3aGF0IHNvbWUgd2luZG93cyBhcHBzIHVzZSBmb3IgYSBsb2dzIGRpci4pCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJMb2dzIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgCiAgICB2YWx1ZSBmb3IgV2luZG93cyBhbmQgYXBwZW5kcyAibG9nIiB0byB0aGUgdXNlciBjYWNoZSBkaXIgZm9yIFVuaXguCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvTG9ncycpLAogICAgICAgICAgICBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiTG9ncyIpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSB1c2VyX2NhY2hlX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAibG9nIikKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBBcHBEaXJzKG9iamVjdCk6CiAgICAiIiJDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBnZXR0aW5nIGFwcGxpY2F0aW9uIGRpcnMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXBwbmFtZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSwKICAgICAgICAgICAgICAgICBtdWx0aXBhdGg9RmFsc2UpOgogICAgICAgIHNlbGYuYXBwbmFtZSA9IGFwcG5hbWUKICAgICAgICBzZWxmLmFwcGF1dGhvciA9IGFwcGF1dGhvcgogICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICBzZWxmLnJvYW1pbmcgPSByb2FtaW5nCiAgICAgICAgc2VsZi5tdWx0aXBhdGggPSBtdWx0aXBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NhY2hlX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2xvZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfbG9nX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgoKIy0tLS0gaW50ZXJuYWwgc3VwcG9ydCBzdHVmZgoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiVGhpcyBpcyBhIGZhbGxiYWNrIHRlY2huaXF1ZSBhdCBiZXN0LiBJJ20gbm90IHN1cmUgaWYgdXNpbmcgdGhlCiAgICByZWdpc3RyeSBmb3IgdGhpcyBndWFyYW50ZWVzIHVzIHRoZSBjb3JyZWN0IGFuc3dlciBmb3IgYWxsIENTSURMXyoKICAgIG5hbWVzLgogICAgIiIiCiAgICBpbXBvcnQgX3dpbnJlZwoKICAgIHNoZWxsX2ZvbGRlcl9uYW1lID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogIkFwcERhdGEiLAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6ICJDb21tb24gQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAiTG9jYWwgQXBwRGF0YSIsCiAgICB9W2NzaWRsX25hbWVdCgogICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5KAogICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgciJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzIgogICAgKQogICAgZGlyLCB0eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMihjc2lkbF9uYW1lKToKICAgIGZyb20gd2luMzJjb20uc2hlbGwgaW1wb3J0IHNoZWxsY29uLCBzaGVsbAogICAgZGlyID0gc2hlbGwuU0hHZXRGb2xkZXJQYXRoKDAsIGdldGF0dHIoc2hlbGxjb24sIGNzaWRsX25hbWUpLCAwLCAwKQogICAgIyBUcnkgdG8gbWFrZSB0aGlzIGEgdW5pY29kZSBwYXRoIGJlY2F1c2UgU0hHZXRGb2xkZXJQYXRoIGRvZXMKICAgICMgbm90IHJldHVybiB1bmljb2RlIHN0cmluZ3Mgd2hlbiB0aGVyZSBpcyB1bmljb2RlIGRhdGEgaW4gdGhlCiAgICAjIHBhdGguCiAgICB0cnk6CiAgICAgICAgZGlyID0gdW5pY29kZShkaXIpCgogICAgICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBjIGluIGRpcjoKICAgICAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHdpbjMyYXBpCiAgICAgICAgICAgICAgICBkaXIgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKGRpcikKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcyhjc2lkbF9uYW1lKToKICAgIGltcG9ydCBjdHlwZXMKCiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgYXJyYXkKICAgIGZyb20gY29tLnN1biBpbXBvcnQgam5hCiAgICBmcm9tIGNvbS5zdW4uam5hLnBsYXRmb3JtIGltcG9ydCB3aW4zMgoKICAgIGJ1Zl9zaXplID0gd2luMzIuV2luRGVmLk1BWF9QQVRIICogMgogICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgIHNoZWxsID0gd2luMzIuU2hlbGwzMi5JTlNUQU5DRQogICAgc2hlbGwuU0hHZXRGb2xkZXJQYXRoKE5vbmUsIGdldGF0dHIod2luMzIuU2hsT2JqLCBjc2lkbF9uYW1lKSwgTm9uZSwgd2luMzIuU2hsT2JqLlNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gZGlyOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgICAgICBrZXJuZWwgPSB3aW4zMi5LZXJuZWwzMi5JTlNUQU5DRQogICAgICAgIGlmIGtlcm5hbC5HZXRTaG9ydFBhdGhOYW1lKGRpciwgYnVmLCBidWZfc2l6ZSk6CiAgICAgICAgICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgIHJldHVybiBkaXIKCmlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW4zMmNvbS5zaGVsbAogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgY29tLnN1bi5qbmEKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCiMtLS0tIHNlbGYgdGVzdCBjb2RlCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgYXBwbmFtZSA9ICJNeUFwcCIKICAgIGFwcGF1dGhvciA9ICJNeUNvbXBhbnkiCgogICAgcHJvcHMgPSAoInVzZXJfZGF0YV9kaXIiLCAic2l0ZV9kYXRhX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jb25maWdfZGlyIiwgInNpdGVfY29uZmlnX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jYWNoZV9kaXIiLCAidXNlcl9sb2dfZGlyIikKCiAgICBwcmludCgiLS0gYXBwIGRpcnMgKHdpdGggb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb249IjEuMCIpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGggZGlzYWJsZWQgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcj1GYWxzZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQpQSwMEFAAAAAAAAAAhADwpWMbQAgAA0AIAAEQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE2LjgiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxNiAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAgXaWygECAAABAgAAQwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpmcm9tIC5fX2Fib3V0X18gaW1wb3J0ICgKICAgIF9fYXV0aG9yX18sIF9fY29weXJpZ2h0X18sIF9fZW1haWxfXywgX19saWNlbnNlX18sIF9fc3VtbWFyeV9fLCBfX3RpdGxlX18sCiAgICBfX3VyaV9fLCBfX3ZlcnNpb25fXwopCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQpQSwMEFAAAAAAAAAAhAOZpSuNcAwAAXAMAAEIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3lzCgoKUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKIyBmbGFrZTg6IG5vcWEKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiIKICAgIENyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4KICAgICIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pClBLAwQUAAAAAAAAACEA+v2kEogFAACIBQAARgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhADD4E9w4IAAAOCAAAEIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgUGFyc2VFeGNlcHRpb24sIFBhcnNlUmVzdWx0cywgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgR3JvdXAsIEZvcndhcmQsIFF1b3RlZFN0cmluZwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBTcGVjaWZpZXIsIEludmFsaWRTcGVjaWZpZXIKCgpfX2FsbF9fID0gWwogICAgIkludmFsaWRNYXJrZXIiLCAiVW5kZWZpbmVkQ29tcGFyaXNvbiIsICJVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUiLAogICAgIk1hcmtlciIsICJkZWZhdWx0X2Vudmlyb25tZW50IiwKXQoKCmNsYXNzIEludmFsaWRNYXJrZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgbWFya2VyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRDb21wYXJpc29uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgdmFsdWUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEEgbmFtZSB3YXMgYXR0ZW1wdGVkIHRvIGJlIHVzZWQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbnNpZGUgb2YgdGhlCiAgICBlbnZpcm9ubWVudC4KICAgICIiIgoKCmNsYXNzIE5vZGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi52YWx1ZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9KT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpKQoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIFZhcmlhYmxlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKCmNsYXNzIFZhbHVlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuICciezB9IicuZm9ybWF0KHNlbGYpCgoKY2xhc3MgT3AoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKVkFSSUFCTEUgPSAoCiAgICBMKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfAogICAgTCgiaW1wbGVtZW50YXRpb25fbmFtZSIpIHwKICAgIEwoInB5dGhvbl9mdWxsX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9yZWxlYXNlIikgfAogICAgTCgicGxhdGZvcm1fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX21hY2hpbmUiKSB8CiAgICBMKCJwbGF0Zm9ybV9zeXN0ZW0iKSB8CiAgICBMKCJweXRob25fdmVyc2lvbiIpIHwKICAgIEwoInN5c19wbGF0Zm9ybSIpIHwKICAgIEwoIm9zX25hbWUiKSB8CiAgICBMKCJvcy5uYW1lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJzeXMucGxhdGZvcm0iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnZlcnNpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLm1hY2hpbmUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyB1bmRvY3VtZW50ZWQgc2V0dXB0b29scyBsZWdhY3kKICAgIEwoImV4dHJhIikKKQpBTElBU0VTID0gewogICAgJ29zLm5hbWUnOiAnb3NfbmFtZScsCiAgICAnc3lzLnBsYXRmb3JtJzogJ3N5c19wbGF0Zm9ybScsCiAgICAncGxhdGZvcm0udmVyc2lvbic6ICdwbGF0Zm9ybV92ZXJzaW9uJywKICAgICdwbGF0Zm9ybS5tYWNoaW5lJzogJ3BsYXRmb3JtX21hY2hpbmUnLAogICAgJ3BsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nLAogICAgJ3B5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nCn0KVkFSSUFCTEUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhcmlhYmxlKEFMSUFTRVMuZ2V0KHRbMF0sIHRbMF0pKSkKClZFUlNJT05fQ01QID0gKAogICAgTCgiPT09IikgfAogICAgTCgiPT0iKSB8CiAgICBMKCI+PSIpIHwKICAgIEwoIjw9IikgfAogICAgTCgiIT0iKSB8CiAgICBMKCJ+PSIpIHwKICAgIEwoIj4iKSB8CiAgICBMKCI8IikKKQoKTUFSS0VSX09QID0gVkVSU0lPTl9DTVAgfCBMKCJub3QgaW4iKSB8IEwoImluIikKTUFSS0VSX09QLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBPcCh0WzBdKSkKCk1BUktFUl9WQUxVRSA9IFF1b3RlZFN0cmluZygiJyIpIHwgUXVvdGVkU3RyaW5nKCciJykKTUFSS0VSX1ZBTFVFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYWx1ZSh0WzBdKSkKCkJPT0xPUCA9IEwoImFuZCIpIHwgTCgib3IiKQoKTUFSS0VSX1ZBUiA9IFZBUklBQkxFIHwgTUFSS0VSX1ZBTFVFCgpNQVJLRVJfSVRFTSA9IEdyb3VwKE1BUktFUl9WQVIgKyBNQVJLRVJfT1AgKyBNQVJLRVJfVkFSKQpNQVJLRVJfSVRFTS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdHVwbGUodFswXSkpCgpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQoKTUFSS0VSX0VYUFIgPSBGb3J3YXJkKCkKTUFSS0VSX0FUT00gPSBNQVJLRVJfSVRFTSB8IEdyb3VwKExQQVJFTiArIE1BUktFUl9FWFBSICsgUlBBUkVOKQpNQVJLRVJfRVhQUiA8PCBNQVJLRVJfQVRPTSArIFplcm9Pck1vcmUoQk9PTE9QICsgTUFSS0VSX0VYUFIpCgpNQVJLRVIgPSBzdHJpbmdTdGFydCArIE1BUktFUl9FWFBSICsgc3RyaW5nRW5kCgoKZGVmIF9jb2VyY2VfcGFyc2VfcmVzdWx0KHJlc3VsdHMpOgogICAgaWYgaXNpbnN0YW5jZShyZXN1bHRzLCBQYXJzZVJlc3VsdHMpOgogICAgICAgIHJldHVybiBbX2NvZXJjZV9wYXJzZV9yZXN1bHQoaSkgZm9yIGkgaW4gcmVzdWx0c10KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCgpkZWYgX2Zvcm1hdF9tYXJrZXIobWFya2VyLCBmaXJzdD1UcnVlKToKICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICMgU29tZXRpbWVzIHdlIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSBbWy4uLl1dIHdoaWNoIGlzIGEgc2luZ2xlIGl0ZW0gbGlzdAogICAgIyB3aGVyZSB0aGUgc2luZ2xlIGl0ZW0gaXMgaXRzZWxmIGl0J3Mgb3duIGxpc3QuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHNraXAKICAgICMgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBleHRyYW5lb3VzICgpIG9uIHRoZQogICAgIyBvdXRzaWRlLgogICAgaWYgKGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KSBhbmQgbGVuKG1hcmtlcikgPT0gMSBhbmQKICAgICAgICAgICAgaXNpbnN0YW5jZShtYXJrZXJbMF0sIChsaXN0LCB0dXBsZSkpKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIobWFya2VyWzBdKQoKICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICBpbm5lciA9IChfZm9ybWF0X21hcmtlcihtLCBmaXJzdD1GYWxzZSkgZm9yIG0gaW4gbWFya2VyKQogICAgICAgIGlmIGZpcnN0OgogICAgICAgICAgICByZXR1cm4gIiAiLmpvaW4oaW5uZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIoIiArICIgIi5qb2luKGlubmVyKSArICIpIgogICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgIHJldHVybiAiICIuam9pbihbbS5zZXJpYWxpemUoKSBmb3IgbSBpbiBtYXJrZXJdKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFya2VyCgoKX29wZXJhdG9ycyA9IHsKICAgICJpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIGluIHJocywKICAgICJub3QgaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBub3QgaW4gcmhzLAogICAgIjwiOiBvcGVyYXRvci5sdCwKICAgICI8PSI6IG9wZXJhdG9yLmxlLAogICAgIj09Ijogb3BlcmF0b3IuZXEsCiAgICAiIT0iOiBvcGVyYXRvci5uZSwKICAgICI+PSI6IG9wZXJhdG9yLmdlLAogICAgIj4iOiBvcGVyYXRvci5ndCwKfQoKCmRlZiBfZXZhbF9vcChsaHMsIG9wLCByaHMpOgogICAgdHJ5OgogICAgICAgIHNwZWMgPSBTcGVjaWZpZXIoIiIuam9pbihbb3Auc2VyaWFsaXplKCksIHJoc10pKQogICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByZXR1cm4gc3BlYy5jb250YWlucyhsaHMpCgogICAgb3BlciA9IF9vcGVyYXRvcnMuZ2V0KG9wLnNlcmlhbGl6ZSgpKQogICAgaWYgb3BlciBpcyBOb25lOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZENvbXBhcmlzb24oCiAgICAgICAgICAgICJVbmRlZmluZWQgezAhcn0gb24gezEhcn0gYW5kIHsyIXJ9LiIuZm9ybWF0KG9wLCBsaHMsIHJocykKICAgICAgICApCgogICAgcmV0dXJuIG9wZXIobGhzLCByaHMpCgoKX3VuZGVmaW5lZCA9IG9iamVjdCgpCgoKZGVmIF9nZXRfZW52KGVudmlyb25tZW50LCBuYW1lKToKICAgIHZhbHVlID0gZW52aXJvbm1lbnQuZ2V0KG5hbWUsIF91bmRlZmluZWQpCgogICAgaWYgdmFsdWUgaXMgX3VuZGVmaW5lZDoKICAgICAgICByYWlzZSBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoCiAgICAgICAgICAgICJ7MCFyfSBkb2VzIG5vdCBleGlzdCBpbiBldmFsdWF0aW9uIGVudmlyb25tZW50LiIuZm9ybWF0KG5hbWUpCiAgICAgICAgKQoKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBfZXZhbHVhdGVfbWFya2VycyhtYXJrZXJzLCBlbnZpcm9ubWVudCk6CiAgICBncm91cHMgPSBbW11dCgogICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlciwgZW52aXJvbm1lbnQpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICAgICAgbGhzLCBvcCwgcmhzID0gbWFya2VyCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxocywgVmFyaWFibGUpOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIGxocy52YWx1ZSkKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IHJocy52YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gbGhzLnZhbHVlCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgcmhzLnZhbHVlKQoKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWxfb3AobGhzX3ZhbHVlLCBvcCwgcmhzX3ZhbHVlKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbWFya2VyIGluIFsiYW5kIiwgIm9yIl0KICAgICAgICAgICAgaWYgbWFya2VyID09ICJvciI6CiAgICAgICAgICAgICAgICBncm91cHMuYXBwZW5kKFtdKQoKICAgIHJldHVybiBhbnkoYWxsKGl0ZW0pIGZvciBpdGVtIGluIGdyb3VwcykKCgpkZWYgZm9ybWF0X2Z1bGxfdmVyc2lvbihpbmZvKToKICAgIHZlcnNpb24gPSAnezAubWFqb3J9LnswLm1pbm9yfS57MC5taWNyb30nLmZvcm1hdChpbmZvKQogICAga2luZCA9IGluZm8ucmVsZWFzZWxldmVsCiAgICBpZiBraW5kICE9ICdmaW5hbCc6CiAgICAgICAgdmVyc2lvbiArPSBraW5kWzBdICsgc3RyKGluZm8uc2VyaWFsKQogICAgcmV0dXJuIHZlcnNpb24KCgpkZWYgZGVmYXVsdF9lbnZpcm9ubWVudCgpOgogICAgaWYgaGFzYXR0cihzeXMsICdpbXBsZW1lbnRhdGlvbicpOgogICAgICAgIGl2ZXIgPSBmb3JtYXRfZnVsbF92ZXJzaW9uKHN5cy5pbXBsZW1lbnRhdGlvbi52ZXJzaW9uKQogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSBzeXMuaW1wbGVtZW50YXRpb24ubmFtZQogICAgZWxzZToKICAgICAgICBpdmVyID0gJzAnCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9ICcnCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wbGVtZW50YXRpb25fbmFtZSI6IGltcGxlbWVudGF0aW9uX25hbWUsCiAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiBpdmVyLAogICAgICAgICJvc19uYW1lIjogb3MubmFtZSwKICAgICAgICAicGxhdGZvcm1fbWFjaGluZSI6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAicGxhdGZvcm1fcmVsZWFzZSI6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAicGxhdGZvcm1fc3lzdGVtIjogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgInBsYXRmb3JtX3ZlcnNpb24iOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgInB5dGhvbl9mdWxsX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICAicHl0aG9uX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpWzozXSwKICAgICAgICAic3lzX3BsYXRmb3JtIjogc3lzLnBsYXRmb3JtLAogICAgfQoKCmNsYXNzIE1hcmtlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fbWFya2VycyA9IF9jb2VyY2VfcGFyc2VfcmVzdWx0KE1BUktFUi5wYXJzZVN0cmluZyhtYXJrZXIpKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJfc3RyID0gIkludmFsaWQgbWFya2VyOiB7MCFyfSwgcGFyc2UgZXJyb3IgYXQgezEhcn0iLmZvcm1hdCgKICAgICAgICAgICAgICAgIG1hcmtlciwgbWFya2VyW2UubG9jOmUubG9jICsgOF0pCiAgICAgICAgICAgIHJhaXNlIEludmFsaWRNYXJrZXIoZXJyX3N0cikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIoc2VsZi5fbWFya2VycykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TWFya2VyKHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpCgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIGVudmlyb25tZW50PU5vbmUpOgogICAgICAgICIiIkV2YWx1YXRlIGEgbWFya2VyLgoKICAgICAgICBSZXR1cm4gdGhlIGJvb2xlYW4gZnJvbSBldmFsdWF0aW5nIHRoZSBnaXZlbiBtYXJrZXIgYWdhaW5zdCB0aGUKICAgICAgICBlbnZpcm9ubWVudC4gZW52aXJvbm1lbnQgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gb3ZlcnJpZGUgYWxsIG9yCiAgICAgICAgcGFydCBvZiB0aGUgZGV0ZXJtaW5lZCBlbnZpcm9ubWVudC4KCiAgICAgICAgVGhlIGVudmlyb25tZW50IGlzIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBQeXRob24gcHJvY2Vzcy4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50ID0gZGVmYXVsdF9lbnZpcm9ubWVudCgpCiAgICAgICAgaWYgZW52aXJvbm1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQudXBkYXRlKGVudmlyb25tZW50KQoKICAgICAgICByZXR1cm4gX2V2YWx1YXRlX21hcmtlcnMoc2VsZi5fbWFya2VycywgY3VycmVudF9lbnZpcm9ubWVudCkKUEsDBBQAAAAAAAAAIQClhh3bAxEAAAMRAABHAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3RyaW5nCmltcG9ydCByZQoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsIG9yaWdpbmFsVGV4dEZvciwgUGFyc2VFeGNlcHRpb24KZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIFdvcmQsIE9wdGlvbmFsLCBSZWdleCwgQ29tYmluZQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxwYXJzZQoKZnJvbSAubWFya2VycyBpbXBvcnQgTUFSS0VSX0VYUFIsIE1hcmtlcgpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBMZWdhY3lTcGVjaWZpZXIsIFNwZWNpZmllciwgU3BlY2lmaWVyU2V0CgoKY2xhc3MgSW52YWxpZFJlcXVpcmVtZW50KFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHJlcXVpcmVtZW50IHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpBTFBIQU5VTSA9IFdvcmQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKQoKTEJSQUNLRVQgPSBMKCJbIikuc3VwcHJlc3MoKQpSQlJBQ0tFVCA9IEwoIl0iKS5zdXBwcmVzcygpCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCkNPTU1BID0gTCgiLCIpLnN1cHByZXNzKCkKU0VNSUNPTE9OID0gTCgiOyIpLnN1cHByZXNzKCkKQVQgPSBMKCJAIikuc3VwcHJlc3MoKQoKUFVOQ1RVQVRJT04gPSBXb3JkKCItXy4iKQpJREVOVElGSUVSX0VORCA9IEFMUEhBTlVNIHwgKFplcm9Pck1vcmUoUFVOQ1RVQVRJT04pICsgQUxQSEFOVU0pCklERU5USUZJRVIgPSBDb21iaW5lKEFMUEhBTlVNICsgWmVyb09yTW9yZShJREVOVElGSUVSX0VORCkpCgpOQU1FID0gSURFTlRJRklFUigibmFtZSIpCkVYVFJBID0gSURFTlRJRklFUgoKVVJJID0gUmVnZXgocidbXiBdKycpKCJ1cmwiKQpVUkwgPSAoQVQgKyBVUkkpCgpFWFRSQVNfTElTVCA9IEVYVFJBICsgWmVyb09yTW9yZShDT01NQSArIEVYVFJBKQpFWFRSQVMgPSAoTEJSQUNLRVQgKyBPcHRpb25hbChFWFRSQVNfTElTVCkgKyBSQlJBQ0tFVCkoImV4dHJhcyIpCgpWRVJTSU9OX1BFUDQ0MCA9IFJlZ2V4KFNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKVkVSU0lPTl9MRUdBQ1kgPSBSZWdleChMZWdhY3lTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgpWRVJTSU9OX09ORSA9IFZFUlNJT05fUEVQNDQwIF4gVkVSU0lPTl9MRUdBQ1kKVkVSU0lPTl9NQU5ZID0gQ29tYmluZShWRVJTSU9OX09ORSArIFplcm9Pck1vcmUoQ09NTUEgKyBWRVJTSU9OX09ORSksCiAgICAgICAgICAgICAgICAgICAgICAgam9pblN0cmluZz0iLCIsIGFkamFjZW50PUZhbHNlKSgiX3Jhd19zcGVjIikKX1ZFUlNJT05fU1BFQyA9IE9wdGlvbmFsKCgoTFBBUkVOICsgVkVSU0lPTl9NQU5ZICsgUlBBUkVOKSB8IFZFUlNJT05fTUFOWSkpCl9WRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHQuX3Jhd19zcGVjIG9yICcnKQoKVkVSU0lPTl9TUEVDID0gb3JpZ2luYWxUZXh0Rm9yKF9WRVJTSU9OX1NQRUMpKCJzcGVjaWZpZXIiKQpWRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHRbMV0pCgpNQVJLRVJfRVhQUiA9IG9yaWdpbmFsVGV4dEZvcihNQVJLRVJfRVhQUigpKSgibWFya2VyIikKTUFSS0VSX0VYUFIuc2V0UGFyc2VBY3Rpb24oCiAgICBsYW1iZGEgcywgbCwgdDogTWFya2VyKHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXSkKKQpNQVJLRVJfU0VQRVJBVE9SID0gU0VNSUNPTE9OCk1BUktFUiA9IE1BUktFUl9TRVBFUkFUT1IgKyBNQVJLRVJfRVhQUgoKVkVSU0lPTl9BTkRfTUFSS0VSID0gVkVSU0lPTl9TUEVDICsgT3B0aW9uYWwoTUFSS0VSKQpVUkxfQU5EX01BUktFUiA9IFVSTCArIE9wdGlvbmFsKE1BUktFUikKCk5BTUVEX1JFUVVJUkVNRU5UID0gXAogICAgTkFNRSArIE9wdGlvbmFsKEVYVFJBUykgKyAoVVJMX0FORF9NQVJLRVIgfCBWRVJTSU9OX0FORF9NQVJLRVIpCgpSRVFVSVJFTUVOVCA9IHN0cmluZ1N0YXJ0ICsgTkFNRURfUkVRVUlSRU1FTlQgKyBzdHJpbmdFbmQKCgpjbGFzcyBSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudC4KCiAgICBQYXJzZSBhIGdpdmVuIHJlcXVpcmVtZW50IHN0cmluZyBpbnRvIGl0cyBwYXJ0cywgc3VjaCBhcyBuYW1lLCBzcGVjaWZpZXIsCiAgICBVUkwsIGFuZCBleHRyYXMuIFJhaXNlcyBJbnZhbGlkUmVxdWlyZW1lbnQgb24gYSBiYWRseS1mb3JtZWQgcmVxdWlyZW1lbnQKICAgIHN0cmluZy4KICAgICIiIgoKICAgICMgVE9ETzogQ2FuIHdlIHRlc3Qgd2hldGhlciBzb21ldGhpbmcgaXMgY29udGFpbmVkIHdpdGhpbiBhIHJlcXVpcmVtZW50PwogICAgIyAgICAgICBJZiBzbyBob3cgZG8gd2UgZG8gdGhhdD8gRG8gd2UgbmVlZCB0byB0ZXN0IGFnYWluc3QgdGhlIF9uYW1lXyBvZgogICAgIyAgICAgICB0aGUgdGhpbmcgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbj8gV2hhdCBhYm91dCB0aGUgbWFya2Vycz8KICAgICMgVE9ETzogQ2FuIHdlIG5vcm1hbGl6ZSB0aGUgbmFtZSBhbmQgZXh0cmEgbmFtZT8KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IFJFUVVJUkVNRU5ULnBhcnNlU3RyaW5nKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWlyZW1lbnQsIHBhcnNlIGVycm9yIGF0IFwiezAhcn1cIiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3N0cmluZ1tlLmxvYzplLmxvYyArIDhdKSkKCiAgICAgICAgc2VsZi5uYW1lID0gcmVxLm5hbWUKICAgICAgICBpZiByZXEudXJsOgogICAgICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UocmVxLnVybCkKICAgICAgICAgICAgaWYgbm90IChwYXJzZWRfdXJsLnNjaGVtZSBhbmQgcGFyc2VkX3VybC5uZXRsb2MpIG9yICgKICAgICAgICAgICAgICAgICAgICBub3QgcGFyc2VkX3VybC5zY2hlbWUgYW5kIG5vdCBwYXJzZWRfdXJsLm5ldGxvYyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoIkludmFsaWQgVVJMIGdpdmVuIikKICAgICAgICAgICAgc2VsZi51cmwgPSByZXEudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmwgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYXMgPSBzZXQocmVxLmV4dHJhcy5hc0xpc3QoKSBpZiByZXEuZXh0cmFzIGVsc2UgW10pCiAgICAgICAgc2VsZi5zcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQocmVxLnNwZWNpZmllcikKICAgICAgICBzZWxmLm1hcmtlciA9IHJlcS5tYXJrZXIgaWYgcmVxLm1hcmtlciBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtzZWxmLm5hbWVdCgogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIlt7MH1dIi5mb3JtYXQoIiwiLmpvaW4oc29ydGVkKHNlbGYuZXh0cmFzKSkpKQoKICAgICAgICBpZiBzZWxmLnNwZWNpZmllcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihzZWxmLnNwZWNpZmllcikpCgogICAgICAgIGlmIHNlbGYudXJsOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIkAgezB9Ii5mb3JtYXQoc2VsZi51cmwpKQoKICAgICAgICBpZiBzZWxmLm1hcmtlcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCI7IHswfSIuZm9ybWF0KHNlbGYubWFya2VyKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFJlcXVpcmVtZW50KHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpClBLAwQUAAAAAAAAACEAfEWDjHltAAB5bQAARQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9ICgKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpLAogICAgICAgICkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgIHN0cihzZWxmKSwKICAgICAgICAgICAgcHJlLAogICAgICAgICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIChwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgKHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMpKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIChzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKHByb3NwZWN0aXZlLCBwcmVmaXgpKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOmxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNoaW5jYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKTpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSk6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSwKICAgICkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSwKICAgICkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwoCiAgICAgICAgICAgIHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGZvciBzIGluIHNlbGYuX3NwZWNzCiAgICAgICAgKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDF6icPpQEAAKUBAABAAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCByZQoKCl9jYW5vbmljYWxpemVfcmVnZXggPSByZS5jb21waWxlKHIiWy1fLl0rIikKCgpkZWYgY2Fub25pY2FsaXplX25hbWUobmFtZSk6CiAgICAjIFRoaXMgaXMgdGFrZW4gZnJvbSBQRVAgNTAzLgogICAgcmV0dXJuIF9jYW5vbmljYWxpemVfcmVnZXguc3ViKCItIiwgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAA7vxqEkLQAAJC0AAEIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9zdHJ1Y3R1cmVzIGltcG9ydCBJbmZpbml0eQoKCl9fYWxsX18gPSBbCiAgICAicGFyc2UiLCAiVmVyc2lvbiIsICJMZWdhY3lWZXJzaW9uIiwgIkludmFsaWRWZXJzaW9uIiwgIlZFUlNJT05fUEFUVEVSTiIKXQoKCl9WZXJzaW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgICJfVmVyc2lvbiIsCiAgICBbImVwb2NoIiwgInJlbGVhc2UiLCAiZGV2IiwgInByZSIsICJwb3N0IiwgImxvY2FsIl0sCikKCgpkZWYgcGFyc2UodmVyc2lvbik6CiAgICAiIiIKICAgIFBhcnNlIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZyBhbmQgcmV0dXJuIGVpdGhlciBhIDpjbGFzczpgVmVyc2lvbmAgb2JqZWN0CiAgICBvciBhIDpjbGFzczpgTGVnYWN5VmVyc2lvbmAgb2JqZWN0IGRlcGVuZGluZyBvbiBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcwogICAgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24gb3IgYSBsZWdhY3kgdmVyc2lvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBWZXJzaW9uKHZlcnNpb24pCiAgICBleGNlcHQgSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIExlZ2FjeVZlcnNpb24odmVyc2lvbikKCgpjbGFzcyBJbnZhbGlkVmVyc2lvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCB2ZXJzaW9uIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfQmFzZVZlcnNpb24ob2JqZWN0KToKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzdHIodmVyc2lvbikKICAgICAgICBzZWxmLl9rZXkgPSBfbGVnYWN5X2NtcGtleShzZWxmLl92ZXJzaW9uKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPExlZ2FjeVZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKCl9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUgPSByZS5jb21waWxlKAogICAgciIoXGQrIHwgW2Etel0rIHwgXC58IC0pIiwgcmUuVkVSQk9TRSwKKQoKX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcCA9IHsKICAgICJwcmUiOiAiYyIsICJwcmV2aWV3IjogImMiLCAiLSI6ICJmaW5hbC0iLCAicmMiOiAiYyIsICJkZXYiOiAiQCIsCn0KCgpkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICBmb3IgcGFydCBpbiBfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgIHBhcnQgPSBfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwLmdldChwYXJ0LCBwYXJ0KQoKICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICIuIjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgcGFydFs6MV0gaW4gIjAxMjM0NTY3ODkiOgogICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCAiKiIgKyBwYXJ0CgogICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICB5aWVsZCAiKmZpbmFsIgoKCmRlZiBfbGVnYWN5X2NtcGtleSh2ZXJzaW9uKToKICAgICMgV2UgaGFyZGNvZGUgYW4gZXBvY2ggb2YgLTEgaGVyZS4gQSBQRVAgNDQwIHZlcnNpb24gY2FuIG9ubHkgaGF2ZSBhIGVwb2NoCiAgICAjIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgcHV0IHRoZSBMZWdhY3lWZXJzaW9uLAogICAgIyB3aGljaCB1c2VzIHRoZSBkZWZhY3RvIHN0YW5kYXJkIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYnkgc2V0dXB0b29scywKICAgICMgYXMgYmVmb3JlIGFsbCBQRVAgNDQwIHZlcnNpb25zLgogICAgZXBvY2ggPSAtMQoKICAgICMgVGhpcyBzY2hlbWUgaXMgdGFrZW4gZnJvbSBwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24gc2V0dXB0b29scyBwcmlvciB0bwogICAgIyBpdCdzIGFkb3B0aW9uIG9mIHRoZSBwYWNrYWdpbmcgbGlicmFyeS4KICAgIHBhcnRzID0gW10KICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHZlcnNpb24ubG93ZXIoKSk6CiAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCIqIik6CiAgICAgICAgICAgICMgcmVtb3ZlICItIiBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICBpZiBwYXJ0IDwgIipmaW5hbCI6CiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIqZmluYWwtIjoKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIjAwMDAwMDAwIjoKICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgcGFydHMgPSB0dXBsZShwYXJ0cykKCiAgICByZXR1cm4gZXBvY2gsIHBhcnRzCgojIERlbGliZXJhdGVseSBub3QgYW5jaG9yZWQgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHN0cmluZywgdG8gbWFrZSBpdAojIGVhc2llciBmb3IgM3JkIHBhcnR5IGNvZGUgdG8gcmV1c2UKVkVSU0lPTl9QQVRURVJOID0gciIiIgogICAgdj8KICAgICg/OgogICAgICAgICg/Oig/UDxlcG9jaD5bMC05XSspISk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlcG9jaAogICAgICAgICg/UDxyZWxlYXNlPlswLTldKyg/OlwuWzAtOV0rKSopICAgICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQKICAgICAgICAoP1A8cHJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlLXJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX2w+KGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpKQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbj5bMC05XSspPwogICAgICAgICk/CiAgICAgICAgKD9QPHBvc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAoPzotKD9QPHBvc3RfbjE+WzAtOV0rKSkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X2w+cG9zdHxyZXZ8cikKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X24yPlswLTldKyk/CiAgICAgICAgICAgICkKICAgICAgICApPwogICAgICAgICg/UDxkZXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbD5kZXYpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICkKICAgICg/OlwrKD9QPGxvY2FsPlthLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKSk/ICAgICAgICMgbG9jYWwgdmVyc2lvbgoiIiIKCgpjbGFzcyBWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgVkVSU0lPTl9QQVRURVJOICsgciJccyokIiwKICAgICAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiBhbmQgcGFyc2UgaXQgaW50byBwaWVjZXMKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFZlcnNpb24oIkludmFsaWQgdmVyc2lvbjogJ3swfSciLmZvcm1hdCh2ZXJzaW9uKSkKCiAgICAgICAgIyBTdG9yZSB0aGUgcGFyc2VkIG91dCBwaWVjZXMgb2YgdGhlIHZlcnNpb24KICAgICAgICBzZWxmLl92ZXJzaW9uID0gX1ZlcnNpb24oCiAgICAgICAgICAgIGVwb2NoPWludChtYXRjaC5ncm91cCgiZXBvY2giKSkgaWYgbWF0Y2guZ3JvdXAoImVwb2NoIikgZWxzZSAwLAogICAgICAgICAgICByZWxlYXNlPXR1cGxlKGludChpKSBmb3IgaSBpbiBtYXRjaC5ncm91cCgicmVsZWFzZSIpLnNwbGl0KCIuIikpLAogICAgICAgICAgICBwcmU9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcG9zdD1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9uMSIpIG9yIG1hdGNoLmdyb3VwKCJwb3N0X24yIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGRldj1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBsb2NhbD1fcGFyc2VfbG9jYWxfdmVyc2lvbihtYXRjaC5ncm91cCgibG9jYWwiKSksCiAgICAgICAgKQoKICAgICAgICAjIEdlbmVyYXRlIGEga2V5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3Igc29ydGluZwogICAgICAgIHNlbGYuX2tleSA9IF9jbXBrZXkoCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZXBvY2gsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wcmUsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucG9zdCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5kZXYsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ubG9jYWwsCiAgICAgICAgKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICAjIFByZS1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnByZSkpCgogICAgICAgICMgUG9zdC1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wb3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5wb3N0ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5wb3N0WzFdKSkKCiAgICAgICAgIyBEZXZlbG9wbWVudCByZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5kZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLmRldnswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZGV2WzFdKSkKCiAgICAgICAgIyBMb2NhbCB2ZXJzaW9uIHNlZ21lbnQKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAiK3swfSIuZm9ybWF0KCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLmxvY2FsKSkKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKS5zcGxpdCgiKyIsIDEpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICB2ZXJzaW9uX3N0cmluZyA9IHN0cihzZWxmKQogICAgICAgIGlmICIrIiBpbiB2ZXJzaW9uX3N0cmluZzoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25fc3RyaW5nLnNwbGl0KCIrIiwgMSlbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24uZGV2IG9yIHNlbGYuX3ZlcnNpb24ucHJlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24ucG9zdCkKCgpkZWYgX3BhcnNlX2xldHRlcl92ZXJzaW9uKGxldHRlciwgbnVtYmVyKToKICAgIGlmIGxldHRlcjoKICAgICAgICAjIFdlIGNvbnNpZGVyIHRoZXJlIHRvIGJlIGFuIGltcGxpY2l0IDAgaW4gYSBwcmUtcmVsZWFzZSBpZiB0aGVyZSBpcwogICAgICAgICMgbm90IGEgbnVtZXJhbCBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgaWYgbnVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIG51bWJlciA9IDAKCiAgICAgICAgIyBXZSBub3JtYWxpemUgYW55IGxldHRlcnMgdG8gdGhlaXIgbG93ZXIgY2FzZSBmb3JtCiAgICAgICAgbGV0dGVyID0gbGV0dGVyLmxvd2VyKCkKCiAgICAgICAgIyBXZSBjb25zaWRlciBzb21lIHdvcmRzIHRvIGJlIGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2Ygb3RoZXIgd29yZHMgYW5kCiAgICAgICAgIyBpbiB0aG9zZSBjYXNlcyB3ZSB3YW50IHRvIG5vcm1hbGl6ZSB0aGUgc3BlbGxpbmdzIHRvIG91ciBwcmVmZXJyZWQKICAgICAgICAjIHNwZWxsaW5nLgogICAgICAgIGlmIGxldHRlciA9PSAiYWxwaGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYSIKICAgICAgICBlbGlmIGxldHRlciA9PSAiYmV0YSI6CiAgICAgICAgICAgIGxldHRlciA9ICJiIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsiYyIsICJwcmUiLCAicHJldmlldyJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicmMiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJyZXYiLCAiciJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKICAgIGlmIG5vdCBsZXR0ZXIgYW5kIG51bWJlcjoKICAgICAgICAjIFdlIGFzc3VtZSBpZiB3ZSBhcmUgZ2l2ZW4gYSBudW1iZXIsIGJ1dCB3ZSBhcmUgbm90IGdpdmVuIGEgbGV0dGVyCiAgICAgICAgIyB0aGVuIHRoaXMgaXMgdXNpbmcgdGhlIGltcGxpY2l0IHBvc3QgcmVsZWFzZSBzeW50YXggKGUuZy4gMS4wLTEpCiAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCgoKX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycyA9IHJlLmNvbXBpbGUociJbXC5fLV0iKQoKCmRlZiBfcGFyc2VfbG9jYWxfdmVyc2lvbihsb2NhbCk6CiAgICAiIiIKICAgIFRha2VzIGEgc3RyaW5nIGxpa2UgYWJjLjEudHdlbHZlIGFuZCB0dXJucyBpdCBpbnRvICgiYWJjIiwgMSwgInR3ZWx2ZSIpLgogICAgIiIiCiAgICBpZiBsb2NhbCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gdHVwbGUoCiAgICAgICAgICAgIHBhcnQubG93ZXIoKSBpZiBub3QgcGFydC5pc2RpZ2l0KCkgZWxzZSBpbnQocGFydCkKICAgICAgICAgICAgZm9yIHBhcnQgaW4gX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycy5zcGxpdChsb2NhbCkKICAgICAgICApCgoKZGVmIF9jbXBrZXkoZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbCk6CiAgICAjIFdoZW4gd2UgY29tcGFyZSBhIHJlbGVhc2UgdmVyc2lvbiwgd2Ugd2FudCB0byBjb21wYXJlIGl0IHdpdGggYWxsIG9mIHRoZQogICAgIyB0cmFpbGluZyB6ZXJvcyByZW1vdmVkLiBTbyB3ZSdsbCB1c2UgYSByZXZlcnNlIHRoZSBsaXN0LCBkcm9wIGFsbCB0aGUgbm93CiAgICAjIGxlYWRpbmcgemVyb3MgdW50aWwgd2UgY29tZSB0byBzb21ldGhpbmcgbm9uIHplcm8sIHRoZW4gdGFrZSB0aGUgcmVzdAogICAgIyByZS1yZXZlcnNlIGl0IGJhY2sgaW50byB0aGUgY29ycmVjdCBvcmRlciBhbmQgbWFrZSBpdCBhIHR1cGxlIGFuZCB1c2UKICAgICMgdGhhdCBmb3Igb3VyIHNvcnRpbmcga2V5LgogICAgcmVsZWFzZSA9IHR1cGxlKAogICAgICAgIHJldmVyc2VkKGxpc3QoCiAgICAgICAgICAgIGl0ZXJ0b29scy5kcm9wd2hpbGUoCiAgICAgICAgICAgICAgICBsYW1iZGEgeDogeCA9PSAwLAogICAgICAgICAgICAgICAgcmV2ZXJzZWQocmVsZWFzZSksCiAgICAgICAgICAgICkKICAgICAgICApKQogICAgKQoKICAgICMgV2UgbmVlZCB0byAidHJpY2siIHRoZSBzb3J0aW5nIGFsZ29yaXRobSB0byBwdXQgMS4wLmRldjAgYmVmb3JlIDEuMGEwLgogICAgIyBXZSdsbCBkbyB0aGlzIGJ5IGFidXNpbmcgdGhlIHByZSBzZWdtZW50LCBidXQgd2UgX29ubHlfIHdhbnQgdG8gZG8gdGhpcwogICAgIyBpZiB0aGVyZSBpcyBub3QgYSBwcmUgb3IgYSBwb3N0IHNlZ21lbnQuIElmIHdlIGhhdmUgb25lIG9mIHRob3NlIHRoZW4KICAgICMgdGhlIG5vcm1hbCBzb3J0aW5nIHJ1bGVzIHdpbGwgaGFuZGxlIHRoaXMgY2FzZSBjb3JyZWN0bHkuCiAgICBpZiBwcmUgaXMgTm9uZSBhbmQgcG9zdCBpcyBOb25lIGFuZCBkZXYgaXMgbm90IE5vbmU6CiAgICAgICAgcHJlID0gLUluZmluaXR5CiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwcmUtcmVsZWFzZSAoZXhjZXB0IGFzIG5vdGVkIGFib3ZlKSBzaG91bGQgc29ydCBhZnRlcgogICAgIyB0aG9zZSB3aXRoIG9uZS4KICAgIGVsaWYgcHJlIGlzIE5vbmU6CiAgICAgICAgcHJlID0gSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwb3N0IHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgaWYgcG9zdCBpcyBOb25lOgogICAgICAgIHBvc3QgPSAtSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBkZXZlbG9wbWVudCBzZWdtZW50IHNob3VsZCBzb3J0IGFmdGVyIHRob3NlIHdpdGggb25lLgogICAgaWYgZGV2IGlzIE5vbmU6CiAgICAgICAgZGV2ID0gSW5maW5pdHkKCiAgICBpZiBsb2NhbCBpcyBOb25lOgogICAgICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGxvY2FsIHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgICAgIGxvY2FsID0gLUluZmluaXR5CiAgICBlbHNlOgogICAgICAgICMgVmVyc2lvbnMgd2l0aCBhIGxvY2FsIHNlZ21lbnQgbmVlZCB0aGF0IHNlZ21lbnQgcGFyc2VkIHRvIGltcGxlbWVudAogICAgICAgICMgdGhlIHNvcnRpbmcgcnVsZXMgaW4gUEVQNDQwLgogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgYmVmb3JlIG51bWVyaWMgc2VnbWVudHMKICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGxleGljb2dyYXBoaWNhbGx5CiAgICAgICAgIyAtIE51bWVyaWMgc2VnbWVudHMgc29ydCBudW1lcmljYWxseQogICAgICAgICMgLSBTaG9ydGVyIHZlcnNpb25zIHNvcnQgYmVmb3JlIGxvbmdlciB2ZXJzaW9ucyB3aGVuIHRoZSBwcmVmaXhlcwogICAgICAgICMgICBtYXRjaCBleGFjdGx5CiAgICAgICAgbG9jYWwgPSB0dXBsZSgKICAgICAgICAgICAgKGksICIiKSBpZiBpc2luc3RhbmNlKGksIGludCkgZWxzZSAoLUluZmluaXR5LCBpKQogICAgICAgICAgICBmb3IgaSBpbiBsb2NhbAogICAgICAgICkKCiAgICByZXR1cm4gZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbApQSwMEFAAAAAAAAAAhAHgoFMPrgQMA64EDADoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5IyBtb2R1bGUgcHlwYXJzaW5nLnB5DQojDQojIENvcHlyaWdodCAoYykgMjAwMy0yMDE2ICBQYXVsIFQuIE1jR3VpcmUNCiMNCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwNCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQojIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQojDQojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KIw0KIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GDQojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4NCiMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwNCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUNCiMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQojDQoNCl9fZG9jX18gPSBcDQoiIiINCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLA0KdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQ0KZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzeW50YXggZm9yIGRlZmluaW5nIGdyYW1tYXJzIG9yIG1hdGNoaW5nIGV4cHJlc3Npb25zIC0gdGhlIHBhcnNpbmcgbW9kdWxlDQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4NCg0KSGVyZSBpcyBhIHByb2dyYW0gdG8gcGFyc2UgIkhlbGxvLCBXb3JsZCEiIChvciBhbnkgZ3JlZXRpbmcgb2YgdGhlIGZvcm0gDQpDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyANCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvDQpMe0xpdGVyYWx9IGV4cHJlc3Npb25zKTo6DQoNCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzDQoNCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcNCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KDQogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCg0KVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoNCg0KICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KDQpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQ0KY2xhc3MgbmFtZXMsIGFuZCB0aGUgdXNlIG9mICcrJywgJ3wnIGFuZCAnXicgb3BlcmF0b3JzLg0KDQpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4NCm9iamVjdCB3aXRoIG5hbWVkIGF0dHJpYnV0ZXMuDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOg0KIC0gZXh0cmEgb3IgbWlzc2luZyB3aGl0ZXNwYWNlICh0aGUgYWJvdmUgcHJvZ3JhbSB3aWxsIGFsc28gaGFuZGxlICJIZWxsbyxXb3JsZCEiLCAiSGVsbG8gICwgIFdvcmxkICAhIiwgZXRjLikNCiAtIHF1b3RlZCBzdHJpbmdzDQogLSBlbWJlZGRlZCBjb21tZW50cw0KIiIiDQoNCl9fdmVyc2lvbl9fID0gIjIuMS4xMCINCl9fdmVyc2lvblRpbWVfXyA9ICIwNyBPY3QgMjAxNiAwMTozMSBVVEMiDQpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiINCg0KaW1wb3J0IHN0cmluZw0KZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYNCmltcG9ydCBjb3B5DQppbXBvcnQgc3lzDQppbXBvcnQgd2FybmluZ3MNCmltcG9ydCByZQ0KaW1wb3J0IHNyZV9jb25zdGFudHMNCmltcG9ydCBjb2xsZWN0aW9ucw0KaW1wb3J0IHBwcmludA0KaW1wb3J0IHRyYWNlYmFjaw0KaW1wb3J0IHR5cGVzDQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQ0KDQp0cnk6DQogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jaw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jaw0KDQp0cnk6DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgdHJ5Og0KICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgICAgIF9PcmRlcmVkRGljdCA9IE5vbmUNCg0KI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQ0KDQpfX2FsbF9fID0gWw0KJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLA0KJ0ZvbGxvd2VkQnknLCAnRm9yd2FyZCcsICdHb1RvQ29sdW1uJywgJ0dyb3VwJywgJ0tleXdvcmQnLCAnTGluZUVuZCcsICdMaW5lU3RhcnQnLCAnTGl0ZXJhbCcsDQonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLA0KJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywNCidQYXJzZVJlc3VsdHMnLCAnUGFyc2VTeW50YXhFeGNlcHRpb24nLCAnUGFyc2VyRWxlbWVudCcsICdRdW90ZWRTdHJpbmcnLCAnUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbicsDQonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIA0KJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsDQonYWxwaGFudW1zJywgJ2FscGhhcycsICdhbHBoYXM4Yml0JywgJ2FueUNsb3NlVGFnJywgJ2FueU9wZW5UYWcnLCAnY1N0eWxlQ29tbWVudCcsICdjb2wnLA0KJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywNCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsDQonaHRtbENvbW1lbnQnLCAnamF2YVN0eWxlQ29tbWVudCcsICdsaW5lJywgJ2xpbmVFbmQnLCAnbGluZVN0YXJ0JywgJ2xpbmVubycsDQonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywNCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLA0KJ3B1bmM4Yml0JywgJ3B5dGhvblN0eWxlQ29tbWVudCcsICdxdW90ZWRTdHJpbmcnLCAncmVtb3ZlUXVvdGVzJywgJ3JlcGxhY2VIVE1MRW50aXR5JywgDQoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsDQonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywNCidpbmRlbnRlZEJsb2NrJywgJ29yaWdpbmFsVGV4dEZvcicsICd1bmdyb3VwJywgJ2luZml4Tm90YXRpb24nLCdsb2NhdGVkRXhwcicsICd3aXRoQ2xhc3MnLA0KJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsDQpdDQoNCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdDQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMw0KaWYgUFlfMzoNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplDQogICAgYmFzZXN0cmluZyA9IHN0cg0KICAgIHVuaWNociA9IGNocg0KICAgIF91c3RyID0gc3RyDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0NCg0KZWxzZToNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQNCiAgICByYW5nZSA9IHhyYW5nZQ0KDQogICAgZGVmIF91c3RyKG9iaik6DQogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMNCiAgICAgICAgICAgc3RyKG9iaikuIElmIHRoYXQgZmFpbHMgd2l0aCBhIFVuaWNvZGVFbmNvZGVFcnJvciwgdGhlbiBpdCB0cmllcyB1bmljb2RlKG9iaikuIEl0DQogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosdW5pY29kZSk6DQogICAgICAgICAgICByZXR1cm4gb2JqDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28NCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuDQogICAgICAgICAgICByZXR1cm4gc3RyKG9iaikNCg0KICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOg0KICAgICAgICAgICAgIyBFbHNlIGVuY29kZSBpdA0KICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpDQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgoJyYjXGQrOycpDQogICAgICAgICAgICB4bWxjaGFycmVmLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiAnXFx1JyArIGhleChpbnQodFswXVsyOi0xXSkpWzI6XSkNCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdG9sZXJhbnQgb2YgUHl0aG9uIHZlcnNpb24sIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10NCiAgICBpbXBvcnQgX19idWlsdGluX18NCiAgICBmb3IgZm5hbWUgaW4gInN1bSBsZW4gc29ydGVkIHJldmVyc2VkIGxpc3QgdHVwbGUgc2V0IGFueSBhbGwgbWluIG1heCIuc3BsaXQoKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgDQpfZ2VuZXJhdG9yVHlwZSA9IHR5cGUoKHkgZm9yIHkgaW4gcmFuZ2UoMSkpKQ0KIA0KZGVmIF94bWxfZXNjYXBlKGRhdGEpOg0KICAgICIiIkVzY2FwZSAmLCA8LCA+LCAiLCAnLCBldGMuIGluIGEgc3RyaW5nIG9mIGRhdGEuIiIiDQoNCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0DQogICAgZnJvbV9zeW1ib2xzID0gJyY+PCJcJycNCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkNCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOg0KICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKGZyb21fLCB0b18pDQogICAgcmV0dXJuIGRhdGENCg0KY2xhc3MgX0NvbnN0YW50cyhvYmplY3QpOg0KICAgIHBhc3MNCg0KYWxwaGFzICAgICA9IHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlDQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiDQpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiDQphbHBoYW51bXMgID0gYWxwaGFzICsgbnVtcw0KX2JzbGFzaCAgICA9IGNocig5MikNCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkNCg0KY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToNCiAgICAgICAgc2VsZi5sb2MgPSBsb2MNCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHINCiAgICAgICAgICAgIHNlbGYucHN0ciA9ICIiDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZw0KICAgICAgICAgICAgc2VsZi5wc3RyID0gcHN0cg0KICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtDQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykNCg0KICAgIEBjbGFzc21ldGhvZA0KICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6DQogICAgICAgICIiIg0KICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiANCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIGFuYW1lICk6DQogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIGlmKCBhbmFtZSA9PSAibGluZW5vIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6DQogICAgICAgICAgICByZXR1cm4gY29sKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6DQogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcDQogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOg0KICAgICAgICAiIiJFeHRyYWN0cyB0aGUgZXhjZXB0aW9uIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBhbmQgbWFya3MNCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLg0KICAgICAgICAiIiINCiAgICAgICAgbGluZV9zdHIgPSBzZWxmLmxpbmUNCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDENCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOg0KICAgICAgICAgICAgbGluZV9zdHIgPSAiIi5qb2luKChsaW5lX3N0cls6bGluZV9jb2x1bW5dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQ0KICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQ0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQ0KDQpjbGFzcyBQYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiIg0KICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsNCiAgICBzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0cnk6DQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikNCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgcHJpbnQocGUpDQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpDQogICAgICAgICAgICANCiAgICBwcmludHM6Og0KICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICBjb2x1bW46IDENCiAgICAiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlRmF0YWxFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQNCiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOg0KICAgICIiImp1c3QgbGlrZSBMe1BhcnNlRmF0YWxFeGNlcHRpb259LCBidXQgdGhyb3duIGludGVybmFsbHkgd2hlbiBhbg0KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIA0KICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIg0KICAgIHBhc3MNCg0KI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICN+ICIiIkV4cGVyaW1lbnRhbCBjbGFzcyAtIHBhcnNlIGFjdGlvbnMgY2FuIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHRvIGNhdXNlDQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoNCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3INCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgc3RhcnQgbG9jYXRpb24NCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUNCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4NCiAgICAgICAjfiBTZXR0aW5nIHRoZSB2YWx1ZXMgYXMgTm9uZSBjYXVzZXMgbm8gY2hhbmdlIHRvIGJlIG1hZGUuDQogICAgICAgI34gIiIiDQogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOg0KICAgICAgICAjfiBzZWxmLm5ld1BhcnNlVGV4dCA9IG5ld3N0cmluZw0KICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jDQoNCmNsYXNzIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZSA9IHBhcnNlRWxlbWVudExpc3QNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbjogJXMiICUgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZQ0KDQpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLHAxLHAyKToNCiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpDQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6DQogICAgICAgIHJldHVybiBzZWxmLnR1cFtpXQ0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pDQogICAgZGVmIHNldE9mZnNldChzZWxmLGkpOg0KICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQ0KDQpjbGFzcyBQYXJzZVJlc3VsdHMob2JqZWN0KToNCiAgICAiIiINCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToNCiAgICAgICAtIGFzIGEgbGlzdCAoQ3tsZW4ocmVzdWx0cyl9KQ0KICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikNCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCiAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCg0KICAgICAgICAjIHBhcnNlU3RyaW5nIHJldHVybnMgYSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCg0KICAgICAgICBkZWYgdGVzdChzLCBmbj1yZXByKToNCiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQ0KICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbMF0iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikNCiAgICAgICAgdGVzdCgiJ21vbnRoJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikNCiAgICBwcmludHM6Og0KICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScNCiAgICAgICAgcmVzdWx0Wydtb250aCddIC0+ICcxMicNCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnDQogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUNCiAgICAgICAgJ21pbnV0ZXMnIGluIHJlc3VsdCAtPiBGYWxzZQ0KICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICAtIGRheTogMzENCiAgICAgICAgLSBtb250aDogMTINCiAgICAgICAgLSB5ZWFyOiAxOTk5DQogICAgIiIiDQogICAgZGVmIF9fbmV3X18oY2xzLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOg0KICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QNCiAgICAgICAgcmV0b2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQ0KICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlDQogICAgICAgIHJldHVybiByZXRvYmoNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlLCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoNCiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICAgICAgc2VsZi5fX2FzTGlzdCA9IGFzTGlzdA0KICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwNCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToNCiAgICAgICAgICAgICAgICB0b2tsaXN0ID0gW10NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgX2dlbmVyYXRvclR5cGUpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IFt0b2tsaXN0XQ0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkNCg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBuYW1lOg0KICAgICAgICAgICAgaWYgbm90IG1vZGFsOg0KICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMA0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLGludCk6DQogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodG9rbGlzdCwgKHR5cGUoTm9uZSksIGJhc2VzdHJpbmcsIGxpc3QpKSBhbmQgdG9rbGlzdCBpbiAoTm9uZSwnJyxbXSkpOg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdDQogICAgICAgICAgICAgICAgaWYgYXNMaXN0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQ0KICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLFR5cGVFcnJvcixJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0DQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQ0KDQogICAgZGVmIF9fc2V0aXRlbV9fKCBzZWxmLCBrLCB2LCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQ0KICAgICAgICAgICAgc3ViID0gdlswXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYNCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQ0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCg0KICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOg0KICAgICAgICAgICAgbXlsZW4gPSBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQ0KDQogICAgICAgICAgICAjIGNvbnZlcnQgaW50IHRvIHNsaWNlDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6DQogICAgICAgICAgICAgICAgaWYgaSA8IDA6DQogICAgICAgICAgICAgICAgICAgIGkgKz0gbXlsZW4NCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQ0KICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzDQogICAgICAgICAgICByZW1vdmVkID0gbGlzdChyYW5nZSgqaS5pbmRpY2VzKG15bGVuKSkpDQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQ0KICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoNCiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiAtIChwb3NpdGlvbiA+IGopKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldDQoNCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6DQogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0DQoNCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQ0KICAgIGRlZiBfaXRlcmtleXMoIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpDQoNCiAgICBkZWYgX2l0ZXJ2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQogICAgICAgICAgICANCiAgICBkZWYgX2l0ZXJpdGVtcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KDQogICAgaWYgUFlfMzoNCiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICANCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICBlbHNlOg0KICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQ0KDQogICAgICAgIGRlZiB2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkNCg0KICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6DQogICAgICAgICIiIlNpbmNlIGtleXMoKSByZXR1cm5zIGFuIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBpcyBoZWxwZnVsIGluIGJ5cGFzc2luZw0KICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiINCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpDQogICAgICAgIA0KICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBSZW1vdmVzIGFuZCByZXR1cm5zIGl0ZW0gYXQgc3BlY2lmaWVkIGluZGV4IChkZWZhdWx0PUN7bGFzdH0pLg0KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vDQogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzDQogICAgICAgIGFuZCBwb3AgdG9rZW5zIGZyb20gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4gSWYgcGFzc2VkIGEgDQogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0NCiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCANCiAgICAgICAgcmVzdWx0cyBuYW1lcy4gQSBzZWNvbmQgZGVmYXVsdCByZXR1cm4gdmFsdWUgYXJndW1lbnQgaXMgDQogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgIGxhYmVsID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KDQogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QNCiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQ0KICAgICAgICAgICAgZGVmIHJlbW92ZV9MQUJFTCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikNCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zDQogICAgICAgICAgICBwYXR0LmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9MQUJFTCkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICAtIExBQkVMOiBBQUINCg0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgYXJnczoNCiAgICAgICAgICAgIGFyZ3MgPSBbLTFdDQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6DQogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoNCiAgICAgICAgICAgICAgICBhcmdzID0gKGFyZ3NbMF0sIHYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspDQogICAgICAgIGlmIChpc2luc3RhbmNlKGFyZ3NbMF0sIGludCkgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6DQogICAgICAgICAgICBpbmRleCA9IGFyZ3NbMF0NCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdDQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0NCiAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0NCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWUNCg0KICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubw0KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8NCiAgICAgICAgQ3tkZWZhdWx0VmFsdWV9IGlzIHNwZWNpZmllZC4NCg0KICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoInllYXIiKSkgIyAtPiAnMTk5OScNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGtleSBpbiBzZWxmOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQ0KDQogICAgZGVmIGluc2VydCggc2VsZiwgaW5kZXgsIGluc1N0ciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLg0KICAgICAgICANCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGluc2VydCB0aGUgcGFyc2UgbG9jYXRpb24gaW4gdGhlIGZyb250IG9mIHRoZSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGluc2VydF9sb2NuKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWzAsICcwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpDQogICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiArIChwb3NpdGlvbiA+IGluZGV4KSkNCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBwYXJzZWQgaW50ZWdlcnMsIGFuZCBhZGQgaXQgdG8gdGhlIGVuZA0KICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihhcHBlbmRfc3VtKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnLCA0NDRdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkNCg0KICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lDQogICAgICAgICAgICBkZWYgbWFrZV9wYWxpbmRyb21lKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpDQogICAgICAgICAgICBwcmludChwYXR0LmFkZFBhcnNlQWN0aW9uKG1ha2VfcGFsaW5kcm9tZSkucGFyc2VTdHJpbmcoImxza2RqIHNkbGtqZiBsa3NkIikpICMgLT4gJ2xza2Rqc2Rsa2pmbGtzZGRza2xmamtsZHNqZGtzbCcNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHNlbGYgKz0gaXRlbXNlcQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpDQoNCiAgICBkZWYgY2xlYXIoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIENsZWFyIGFsbCBlbGVtZW50cyBhbmQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQ0KICAgICAgICBzZWxmLl9fdG9rZGljdC5jbGVhcigpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0NCiAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICANCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoNCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbbmFtZV0gXSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiAiIg0KDQogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIHJldCA9IHNlbGYuY29weSgpDQogICAgICAgIHJldCArPSBvdGhlcg0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19pYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoNCiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkNCiAgICAgICAgICAgIGFkZG9mZnNldCA9IGxhbWJkYSBhOiBvZmZzZXQgaWYgYTwwIGVsc2UgYStvZmZzZXQNCiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayx2bGlzdCkgaW4gb3RoZXJpdGVtcyBmb3IgdiBpbiB2bGlzdF0NCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6DQogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZbMF0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQogICAgICAgICAgICANCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgKz0gb3RoZXIuX190b2tsaXN0DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoNCiAgICAgICAgICAgICMgdXNlZnVsIGZvciBtZXJnaW5nIG1hbnkgUGFyc2VSZXN1bHRzIHVzaW5nIHN1bSgpIGJ1aWx0aW4NCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIFR5cGVFcnJvciAtIHNvIGJlIGl0DQogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nDQoNCiAgICBkZWYgX2FzU3RyaW5nTGlzdCggc2VsZiwgc2VwPScnICk6DQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0Og0KICAgICAgICAgICAgaWYgb3V0IGFuZCBzZXA6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToNCiAgICAgICAgICAgICAgICBvdXQgKz0gaXRlbS5fYXNTdHJpbmdMaXN0KCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQ0KICAgICAgICByZXR1cm4gb3V0DQoNCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBwcmludHMgaW4gc3RyaW5nLWxpa2UgZm9ybSwgaXQgaXMgYWN0dWFsbHkgYSBweXBhcnNpbmcgUGFyc2VSZXN1bHRzDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBVc2UgYXNMaXN0KCkgdG8gY3JlYXRlIGFuIGFjdHVhbCBsaXN0DQogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQ0KDQogICAgZGVmIGFzRGljdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVwcihyZXN1bHQpKSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IChbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10sIHsnZGF5JzogWygnMTk5OScsIDQpXSwgJ3llYXInOiBbKCcxMicsIDApXSwgJ21vbnRoJzogWygnMzEnLCAyKV19KQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfZGljdCksIHJlcHIocmVzdWx0X2RpY3QpKSAjIC0+IDxjbGFzcyAnZGljdCc+IHsnZGF5JzogJzE5OTknLCAneWVhcic6ICcxMicsICdtb250aCc6ICczMSd9DQoNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdA0KICAgICAgICAgICAgaW1wb3J0IGpzb24NCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQ0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBQWV8zOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcw0KICAgICAgICAgICAgDQogICAgICAgIGRlZiB0b0l0ZW0ob2JqKToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXNEaWN0KCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBvYmoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGRpY3QoKGssdG9JdGVtKHYpKSBmb3Igayx2IGluIGl0ZW1fZm4oKSkNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkNCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudA0KICAgICAgICByZXQuX19hY2N1bU5hbWVzLnVwZGF0ZSggc2VsZi5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIChEZXByZWNhdGVkKSBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIFhNTC4gVGFncyBhcmUgY3JlYXRlZCBmb3IgdG9rZW5zIGFuZCBsaXN0cyB0aGF0IGhhdmUgZGVmaW5lZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgbmwgPSAiXG4iDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpDQogICAgICAgIG5leHRMZXZlbEluZGVudCA9IGluZGVudCArICIgICINCg0KICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQNCiAgICAgICAgaWYgbm90IGZvcm1hdHRlZDoNCiAgICAgICAgICAgIGluZGVudCA9ICIiDQogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmwgPSAiIg0KDQogICAgICAgIHNlbGZUYWcgPSBOb25lDQogICAgICAgIGlmIGRvY3RhZyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQ0KDQogICAgICAgIGlmIG5vdCBzZWxmVGFnOg0KICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSINCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPCIsIHNlbGZUYWcsICI+IiBdDQoNCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBpbmRpdmlkdWFsIHRva2VuLCBzZWUgaWYgdGhlcmUgaXMgYSBuYW1lIGZvciBpdA0KICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9IG5hbWVkSXRlbXNbaV0NCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOg0KICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSINCiAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCA9IF94bWxfZXNjYXBlKF91c3RyKHJlcykpDQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvIiwgcmVzVGFnLCAiPiIgXQ0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6DQogICAgICAgIGZvciBrLHZsaXN0IGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6DQogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBrDQogICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZ2V0TmFtZShzZWxmKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIA0KICAgICAgICBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgbWlnaHQgbWF0Y2ggYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpDQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIHVzZXJfZGF0YSA9IChHcm91cChob3VzZV9udW1iZXJfZXhwcikoImhvdXNlX251bWJlciIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkNCiAgICAgICAgICAgIHVzZXJfaW5mbyA9IE9uZU9yTW9yZSh1c2VyX2RhdGEpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQ0KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcmVzdWx0Og0KICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBhZ2UgOiAyMg0KICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMNCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUINCiAgICAgICAgIiIiDQogICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lDQogICAgICAgIGVsaWYgc2VsZi5fX3BhcmVudDoNCiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQ0KICAgICAgICAgICAgaWYgcGFyOg0KICAgICAgICAgICAgICAgIHJldHVybiBwYXIuX19sb29rdXAoc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgZWxpZiAobGVuKHNlbGYpID09IDEgYW5kDQogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kDQogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOg0KICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC5rZXlzKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIERpYWdub3N0aWMgbWV0aG9kIGZvciBsaXN0aW5nIG91dCB0aGUgY29udGVudHMgb2YgYSBDe1BhcnNlUmVzdWx0c30uDQogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkDQogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddDQogICAgICAgICAgICAtIGRheTogMTk5OQ0KICAgICAgICAgICAgLSBtb250aDogMzENCiAgICAgICAgICAgIC0geWVhcjogMTINCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIE5MID0gJ1xuJw0KICAgICAgICBvdXQuYXBwZW5kKCBpbmRlbnQrX3VzdHIoc2VsZi5hc0xpc3QoKSkgKQ0KICAgICAgICBpZiBmdWxsOg0KICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoKHN0cihrKSwgdikgZm9yIGssdiBpbiBzZWxmLml0ZW1zKCkpDQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoNCiAgICAgICAgICAgICAgICAgICAgaWYgb3V0Og0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChOTCkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKF91c3RyKHYpKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQ0KICAgICAgICAgICAgZWxpZiBhbnkoaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpIGZvciB2diBpbiBzZWxmKToNCiAgICAgICAgICAgICAgICB2ID0gc2VsZg0KICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLF91c3RyKHZ2KSkpDQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUHJldHR5LXByaW50ZXIgZm9yIHBhcnNlZCByZXN1bHRzIGFzIGEgbGlzdCwgdXNpbmcgdGhlIEN7cHByaW50fSBtb2R1bGUuDQogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgDQogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpDQogICAgICAgICAgICBmdW5jIDw8PSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpDQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydmbmEnLA0KICAgICAgICAgICAgIFsnYScsDQogICAgICAgICAgICAgICdiJywNCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLA0KICAgICAgICAgICAgICAnMTAwJ11dDQogICAgICAgICIiIg0KICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykNCg0KICAgICMgYWRkIHN1cHBvcnQgZm9yIHBpY2tsZSBwcm90b2NvbA0KICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6DQogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LA0KICAgICAgICAgICAgICAgICAoIHNlbGYuX190b2tkaWN0LmNvcHkoKSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSApICkNCg0KICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6DQogICAgICAgIHNlbGYuX190b2tsaXN0ID0gc3RhdGVbMF0NCiAgICAgICAgKHNlbGYuX190b2tkaWN0LA0KICAgICAgICAgcGFyLA0KICAgICAgICAgaW5BY2N1bU5hbWVzLA0KICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoaW5BY2N1bU5hbWVzKQ0KICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCg0KICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsDQoNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkNCg0KY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoUGFyc2VSZXN1bHRzKQ0KDQpkZWYgY29sIChsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGNvbHVtbiB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICBzID0gc3RyZw0KICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQ0KDQpkZWYgbGluZW5vKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQ0KDQpkZWYgbGluZSggbG9jLCBzdHJnICk6DQogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgICAgICIiIg0KICAgIGxhc3RDUiA9IHN0cmcucmZpbmQoIlxuIiwgMCwgbG9jKQ0KICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpDQogICAgaWYgbmV4dENSID49IDA6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOm5leHRDUl0NCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdDQoNCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToNCiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQ0KDQpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6DQogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkNCg0KZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOg0KICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkNCg0KZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6DQogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiINCiAgICBwYXNzDQoNCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMNCiN+ICdkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOg0KICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgICN+IHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICAjfiBsaW1pdCA9IDANCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UNCiAgICAjfiBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkNCiAgICAgICAgI34gd2hpbGUgMToNCiAgICAgICAgICAgICN+IHRyeToNCiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pDQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUNCiAgICAgICAgICAgICAgICAjfiByZXR1cm4gcmV0DQogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToNCiAgICAgICAgICAgICAgICAgICAgI34gcmFpc2UNCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxDQogICAgICAgICAgICAgICAgI34gY29udGludWUNCiAgICAjfiByZXR1cm4gd3JhcHBlcg0KDQojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlDQonZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToNCiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgbGltaXQgPSBbMF0NCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQ0KICAgIA0KICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzDQogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOg0KICAgICAgICBkZWYgZXh0cmFjdF9zdGFjayhsaW1pdD0wKToNCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDENCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMg0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGxpbWl0PS1vZmZzZXQrbGltaXQtMSlbb2Zmc2V0XQ0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQ0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6DQogICAgICAgICAgICBmcmFtZXMgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQ0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQ0KICAgIGVsc2U6DQogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaw0KICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGINCiAgICANCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byANCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lDQogICAgDQogICAgTElORV9ESUZGID0gNg0KICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIA0KICAgICMgVEhFIENBTEwgVE8gRlVOQyBJTlNJREUgV1JBUFBFUiwgTElORV9ESUZGIE1VU1QgQkUgTU9ESUZJRUQhISEhDQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0NCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQ0KDQogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkNCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcNCiAgICAgICAgICAgICAgICBpZiBmb3VuZEFyaXR5WzBdOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0Yg0KDQogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoNCiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAjIGNvcHkgZnVuYyBuYW1lIHRvIHdyYXBwZXIgZm9yIHNlbnNpYmxlIGRlYnVnIG91dHB1dA0KICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiINCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHdyYXBwZXINCg0KY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOg0KICAgICIiIkFic3RyYWN0IGJhc2UgbGV2ZWwgcGFyc2VyIGVsZW1lbnQgY2xhc3MuIiIiDQogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIg0KICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6DQogICAgICAgIHIiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToNCiAgICAgICAgIiIiDQogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbA0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KDQogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcw0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pbmxpbmVMaXRlcmFsc1VzaW5nKFN1cHByZXNzKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcxMicsICczMSddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBOb25lDQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSA9IE5vbmUNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBGYWxzZQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpDQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleA0KICAgICAgICBzZWxmLmVycm1zZyA9ICIiDQogICAgICAgIHNlbGYubW9kYWxSZXN1bHRzID0gVHJ1ZSAjIHVzZWQgdG8gbWFyayByZXN1bHRzIG5hbWVzIGFzIG1vZGFsIChyZXBvcnQgb25seSBsYXN0KSBvciBjdW11bGF0aXZlIChsaXN0IGFsbCkNCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMNCiAgICAgICAgc2VsZi5yZSA9IE5vbmUNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlICMgdXNlZCB0byBhdm9pZCByZWR1bmRhbnQgY2FsbHMgdG8gcHJlUGFyc2UNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zDQogICAgICAgIGZvciB0aGUgc2FtZSBwYXJzaW5nIHBhdHRlcm4sIHVzaW5nIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcGFyc2UgZWxlbWVudC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpDQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFs1MTIwLCAxMDAsIDY1NTM2MCwgMjY4NDM1NDU2XQ0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06Og0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgIiIiDQogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApDQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0NCiAgICAgICAgY3B5Lmlnbm9yZUV4cHJzID0gc2VsZi5pZ25vcmVFeHByc1s6XQ0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoNCiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHJldHVybiBjcHkNCg0KICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwiZXhjZXB0aW9uIik6DQogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHJlZmVyZW5jaW5nIG1hdGNoaW5nIHRva2VucyBhcyBhIG5lc3RlZCBhdHRyaWJ1dGUNCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuDQogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7DQogICAgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgY2xpZW50IGNhbiBkZWZpbmUgYSBiYXNpYyBlbGVtZW50LCBzdWNoIGFzIGFuDQogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLg0KDQogICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgcmVzdWx0cyBuYW1lcyB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4LA0KICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gDQogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KDQogICAgICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICIiIg0KICAgICAgICBuZXdzZWxmID0gc2VsZi5jb3B5KCkNCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOg0KICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQ0KICAgICAgICAgICAgbGlzdEFsbE1hdGNoZXM9VHJ1ZQ0KICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQ0KICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcw0KICAgICAgICByZXR1cm4gbmV3c2VsZg0KDQogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6DQogICAgICAgICIiIk1ldGhvZCB0byBpbnZva2UgdGhlIFB5dGhvbiBwZGIgZGVidWdnZXIgd2hlbiB0aGlzIGVsZW1lbnQgaXMNCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bw0KICAgICAgICAgICBkaXNhYmxlLg0KICAgICAgICAiIiINCiAgICAgICAgaWYgYnJlYWtGbGFnOg0KICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UNCiAgICAgICAgICAgIGRlZiBicmVha2VyKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSk6DQogICAgICAgICAgICAgICAgaW1wb3J0IHBkYg0KICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcGFyc2VNZXRob2QoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlICkNCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QNCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToNCiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLg0KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sDQogICAgICAgIEN7Zm4obG9jLHRva3MpfSwgQ3tmbih0b2tzKX0sIG9yIGp1c3QgQ3tmbigpfSwgd2hlcmU6DQogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykNCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcNCiAgICAgICAgIC0gdG9rcyA9IGEgbGlzdCBvZiB0aGUgbWF0Y2hlZCB0b2tlbnMsIHBhY2thZ2VkIGFzIGEgQ3tMe1BhcnNlUmVzdWx0c319IG9iamVjdA0KICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybg0KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuDQogICAgICAgIE90aGVyd2lzZSwgZm4gZG9lcyBub3QgbmVlZCB0byByZXR1cm4gYW55IHZhbHVlLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBjYWxsRHVyaW5nVHJ5ID0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlIGlmIHBhcnNlIGFjdGlvbiBzaG91bGQgYmUgcnVuIGR1cmluZyBsb29rYWhlYWRzIGFuZCBhbHRlcm5hdGUgdGVzdGluZw0KDQogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgICAgICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgIyBub3RlIHRoYXQgaW50ZWdlciBmaWVsZHMgYXJlIG5vdyBpbnRzLCBub3Qgc3RyaW5ncw0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHBhcnNlIGFjdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59Lg0KICAgICAgICANCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6DQogICAgICAgICIiIkFkZCBhIGJvb2xlYW4gcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSANCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgDQogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uDQogICAgICAgICAtIGZhdGFsICAgPSBpZiBUcnVlLCB3aWxsIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5OyBvdGhlcndpc2Ugd2lsbCByYWlzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkNCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSB5ZWFyX2ludCArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpDQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgIGZvciBmbiBpbiBmbnM6DQogICAgICAgICAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfdHlwZShzLGwsbXNnKQ0KICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToNCiAgICAgICAgIiIiRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIGlmIHBhcnNpbmcgZmFpbHMgYXQgdGhpcyBleHByZXNzaW9uLg0KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzDQogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToNCiAgICAgICAgICAgIC0gcyA9IHN0cmluZyBiZWluZyBwYXJzZWQNCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkDQogICAgICAgICAgICAtIGVyciA9IHRoZSBleGNlcHRpb24gdGhyb3duDQogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0NCiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IGZuDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX3NraXBJZ25vcmFibGVzKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6DQogICAgICAgICAgICBleHByc0ZvdW5kID0gRmFsc2UNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQoNCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToNCiAgICAgICAgICAgIHd0ID0gc2VsZi53aGl0ZUNoYXJzDQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0Og0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgZGVidWdnaW5nID0gKCBzZWxmLmRlYnVnICkgI2FuZCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoIixzZWxmLCJhdCBsb2MiLGxvYywiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQ0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpDQogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z0FjdGlvbnNbMl06DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxBY3Rpb24oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIGxvYyA+PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQ0KDQogICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLCBzZWxmLnJlc3VsdHNOYW1lLCBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0LCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToNCiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgI34gcHJpbnQgIkV4Y2VwdGlvbiByYWlzZWQgaW4gdXNlciBwYXJzZSBhY3Rpb246IiwgZXJyDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1sxXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXRUb2tlbnMNCg0KICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdDQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgIA0KICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQoNCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCg0KICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0gX09yZGVyZWREaWN0KCkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgIGVsc2U6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KDQogICAgIyBhcmd1bWVudCBjYWNoZSBmb3Igb3B0aW1pemluZyByZXBlYXRlZCBjYWxscyB3aGVuIGJhY2t0cmFja2luZyB0aHJvdWdoIHJlY3Vyc2l2ZSBleHByZXNzaW9ucw0KICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwNCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpDQogICAgcGFja3JhdF9jYWNoZV9zdGF0cyA9IFswLCAwXQ0KDQogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQ0KICAgICMgd2UgY2FuIGNhY2hlIHRoZXNlIGFyZ3VtZW50cyBhbmQgc2F2ZSBvdXJzZWx2ZXMgdGhlIHRyb3VibGUgb2YgcmUtcGFyc2luZyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24NCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBISVQsIE1JU1MgPSAwLCAxDQogICAgICAgIGxvb2t1cCA9IChzZWxmLCBpbnN0cmluZywgbG9jLCBjYWxsUHJlUGFyc2UsIGRvQWN0aW9ucykNCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoNCiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlDQogICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLmdldChsb29rdXApDQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDENCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgICMgY2FjaGUgYSBjb3B5IG9mIHRoZSBleGNlcHRpb24sIHdpdGhvdXQgdGhlIHRyYWNlYmFjaw0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDENCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkNCg0KICAgIF9wYXJzZSA9IF9wYXJzZU5vQ2FjaGUNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgcmVzZXRDYWNoZSgpOg0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQ0KDQogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGVuYWJsZVBhY2tyYXQoY2FjaGVfc2l6ZV9saW1pdD0xMjgpOg0KICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4NCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zDQogICAgICAgICAgIG9mdGVuIGluIG1hbnkgY29tcGxleCBncmFtbWFycykgY2FuIGltbWVkaWF0ZWx5IHJldHVybiBhIGNhY2hlZCB2YWx1ZSwNCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZg0KICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4NCiAgICAgICAgICAgDQogICAgICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZA0KICAgICAgICAgICAgICB3aWxsIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBwYWNrcmF0IGNhY2hlOyBpZiBOb25lIGlzIHBhc3NlZCwgdGhlbg0KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsDQogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLg0KICAgICAgICAgICAgDQogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0DQogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbg0KICAgICAgICAgICB5b3UgZmlyc3QgaW1wb3J0IHB5cGFyc2luZy4gIFRvIGFjdGl2YXRlIHRoZSBwYWNrcmF0IGZlYXR1cmUsIHlvdXINCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmDQogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwNCiAgICAgICAgICAgQ3tlbmFibGVQYWNrcmF0fSBiZWZvcmUgY2FsbGluZyBDe3BzeWNvLmZ1bGwoKX0uICBJZiB5b3UgZG8gbm90IGRvIHRoaXMsDQogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkNCiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4NCiAgICAgICAgICAgDQogICAgICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZw0KICAgICAgICAgICAgICAgcHlwYXJzaW5nLlBhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZCA9IFRydWUNCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQ0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlDQoNCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuDQogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUNCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4NCg0KICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUNCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcNCiAgICAgICAgdGhlIGdyYW1tYXIgd2l0aCBDe0x7U3RyaW5nRW5kKCl9fSkuDQoNCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywNCiAgICAgICAgaW4gb3JkZXIgdG8gcmVwb3J0IHByb3BlciBjb2x1bW4gbnVtYmVycyBpbiBwYXJzZSBhY3Rpb25zLg0KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kDQogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlDQogICAgICAgIHN0cmluZyBiZWluZyBwYXJzZWQsIHlvdSBjYW4gZW5zdXJlIHlvdSBoYXZlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBpbnB1dA0KICAgICAgICBzdHJpbmcgYnk6DQogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgICAgKHNlZSBMe0l7cGFyc2VXaXRoVGFic308cGFyc2VXaXRoVGFicz59KQ0KICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kDQogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50DQogICAgICAgICAtIGV4cGxpY3RseSBleHBhbmQgdGhlIHRhYnMgaW4geW91ciBpbnB1dCBzdHJpbmcgYmVmb3JlIGNhbGxpbmcNCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10NCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApDQogICAgICAgICAgICBpZiBwYXJzZUFsbDoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQ0KICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCg0KICAgIGRlZiBzY2FuU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCwgb3ZlcmxhcD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQ0KICAgICAgICBtYXRjaGluZyB0b2tlbnMsIHN0YXJ0IGxvY2F0aW9uLCBhbmQgZW5kIGxvY2F0aW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYNCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLg0KDQogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcNCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nDQogICAgICAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB0YWJzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgc291cmNlID0gInNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NyINCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkNCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6DQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgJ14nKihlbmQtc3RhcnQpKQ0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgIA0KICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3DQogICAgICAgICAgICBeXl5eXg0KICAgICAgICAgICAgc2xkamYNCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXg0KICAgICAgICAgICAgICAgICAgICBsc2RqamtmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IF91c3RyKGluc3RyaW5nKS5leHBhbmR0YWJzKCkNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGxvYyA9IDANCiAgICAgICAgcHJlcGFyc2VGbiA9IHNlbGYucHJlUGFyc2UNCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIG1hdGNoZXMgPSAwDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBuZXh0TG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxhcDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6DQogICAgICAgICIiIg0KICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkNCiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kDQogICAgICAgIGF0dGFjaCBhIHBhcnNlIGFjdGlvbiB0byBpdCB0aGF0IG1vZGlmaWVzIHRoZSByZXR1cm5lZCB0b2tlbiBsaXN0Lg0KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsDQogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UNCiAgICAgICAgYWN0aW9uLiAgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHdkLnRyYW5zZm9ybVN0cmluZygibm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yay4iKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBsYXN0RSA9IDANCiAgICAgICAgIyBmb3JjZSBwcmVzZXJ2YXRpb24gb2YgPFRBQj5zLCB0byBtaW5pbWl6ZSB1bndhbnRlZCB0cmFuc2Zvcm1hdGlvbiBvZiBzdHJpbmcsIGFuZCB0bw0KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcNCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApDQogICAgICAgICAgICAgICAgaWYgdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCxsaXN0KToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0DQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgbGFzdEUgPSBlDQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pDQogICAgICAgICAgICBvdXQgPSBbbyBmb3IgbyBpbiBvdXQgaWYgb10NCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNlYXJjaFN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZA0KICAgICAgICB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycw0KICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydNb3JlJywgJ0lyb24nLCAnTGVhZCcsICdHb2xkJywgJ0knXQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHQgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcsIG1heE1hdGNoZXMgKSBdKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLg0KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOw0KICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIEN7aW5jbHVkZVNlcGFyYXRvcnN9IGFyZ3VtZW50IChkZWZhdWx0PUN7RmFsc2V9KSwgaWYgdGhlIHNlcGFyYXRpbmcNCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjogICAgICAgIA0KICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpDQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNwbGl0cyA9IDANCiAgICAgICAgbGFzdCA9IDANCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6DQogICAgICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0OnNdDQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoNCiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdDQogICAgICAgICAgICBsYXN0ID0gZQ0KICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0NCg0KICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudA0KICAgICAgICBjb252ZXJ0cyB0aGVtIHRvIEx7TGl0ZXJhbH1zIGJ5IGRlZmF1bHQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KDQogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIEFuZC5fRXJyb3JTdG9wKCksIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYNCg0KICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZg0KICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyDQogICAgICAgIHR1cGxlLCBzaW1pbGFyIHRvIEN7e21pbixtYXh9fSBtdWx0aXBsaWVycyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVHVwbGVzDQogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoNCiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudA0KICAgICAgICAgICAgICB0byBDe2V4cHIqbiArIEx7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgIjAgdG8gbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0NCg0KICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYNCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywNCiAgICAgICAgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCBlbmZvcmNlIGEgbWF4aW11bSBudW1iZXIgb2YgZXhwcg0KICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQ0KICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToNCiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDANCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLHR1cGxlKToNCiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0NCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgb3RoZXIgPSAoMCwgb3RoZXJbMV0pDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOg0KICAgICAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyDQogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAoJyVzJywnJXMnKSBvYmplY3RzIiwgdHlwZShvdGhlclswXSksdHlwZShvdGhlclsxXSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQ0KDQogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikNCiAgICAgICAgaWYgb3B0RWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpDQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSAwIG9yICgwLDApIikNCg0KICAgICAgICBpZiAob3B0RWxlbWVudHMpOg0KICAgICAgICAgICAgZGVmIG1ha2VPcHRpb25hbExpc3Qobik6DQogICAgICAgICAgICAgICAgaWYgbj4xOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOg0KICAgICAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgcmV0ID0gc2VsZg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQ0KDQogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciAtIHJldHVybnMgQ3tMe01hdGNoRmlyc3R9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmDQoNCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe09yfX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmDQoNCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0VhY2h9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZg0KDQogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIH4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtOb3RBbnl9fQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApDQoNCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFNob3J0Y3V0IGZvciBDe0x7c2V0UmVzdWx0c05hbWV9fSwgd2l0aCBDe2xpc3RBbGxNYXRjaGVzPUZhbHNlfS4NCiAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQ0KICAgICAgICBwYXNzZWQgYXMgQ3tUcnVlfS4NCiAgICAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50DQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKS5zZXRSZXN1bHRzTmFtZSgibmFtZSIpICsgV29yZChudW1zKyItIikuc2V0UmVzdWx0c05hbWUoInNvY3NlY25vIikNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICANCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20NCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQ0KICAgICAgICBDe1BhcnNlckVsZW1lbnR9J3MgZGVmaW5lZCBwYXR0ZXJuLiAgVGhpcyBpcyBub3JtYWxseSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQ0KICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFdoaXRlc3BhY2VDaGFycyggc2VsZiwgY2hhcnMgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcGFyc2VXaXRoVGFicyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4NCiAgICAgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEN7cGFyc2VTdHJpbmd9IHdoZW4gdGhlIGlucHV0IGdyYW1tYXIgY29udGFpbnMgZWxlbWVudHMgdGhhdA0KICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybg0KICAgICAgICBtYXRjaGluZzsgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCB0byBkZWZpbmUgbXVsdGlwbGUgY29tbWVudCBvciBvdGhlcg0KICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKHN0YXJ0QWN0aW9uIG9yIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pDQogICAgICAgIHNlbGYuZGVidWcgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWcoIHNlbGYsIGZsYWc9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgIFNldCBDe2ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0byBkaXNhYmxlLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0TmFtZSgiYWxwaGF3b3JkIikNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQ0KICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcg0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZA0KICAgICAgICAgICAgd2Quc2V0RGVidWcoKQ0KDQogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMygxLDQpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWyd4eXonXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDE1KDEsMTYpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikNCg0KICAgICAgICBUaGUgb3V0cHV0IHNob3duIGlzIHRoYXQgcHJvZHVjZWQgYnkgdGhlIGRlZmF1bHQgZGVidWcgYWN0aW9ucyAtIGN1c3RvbSBkZWJ1ZyBhY3Rpb25zIGNhbiBiZQ0KICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nDQogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQ0KICAgICAgICBpcyBzaG93bi4gVGhlbiBpZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGEgQ3siTWF0Y2hlZCJ9IG1lc3NhZ2UgaXMgc2hvd24sIG9yIGFuIEN7IkV4Y2VwdGlvbiByYWlzZWQifQ0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sDQogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdA0KICAgICAgICBuYW1lIGNyZWF0ZWQgZm9yIHRoZSBDe1dvcmR9IGV4cHJlc3Npb24gd2l0aG91dCBjYWxsaW5nIEN7c2V0TmFtZX0gaXMgQ3siVzooQUJDRC4uLikifS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGZsYWc6DQogICAgICAgICAgICBzZWxmLnNldERlYnVnQWN0aW9ucyggX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLCBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBwYXNzDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgIiIiDQogICAgICAgIENoZWNrIGRlZmluZWQgZXhwcmVzc2lvbnMgZm9yIHZhbGlkIHN0cnVjdHVyZSwgY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIHRoZSBnaXZlbiBmaWxlIG9yIGZpbGVuYW1lLg0KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwNCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOg0KICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6DQogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlckVsZW1lbnQsc2VsZik9PW90aGVyDQoNCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIF9faGFzaF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkNCg0KICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlcg0KDQogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSANCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaA0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cw0KICAgICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZXhwciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgICAgICAgICANCiAgICBkZWYgcnVuVGVzdHMoc2VsZiwgdGVzdHMsIHBhcnNlQWxsPVRydWUsIGNvbW1lbnQ9JyMnLCBmdWxsRHVtcD1UcnVlLCBwcmludFJlc3VsdHM9VHJ1ZSwgZmFpbHVyZVRlc3RzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gNCiAgICAgICAgdGVzdCwgdGhlIHBhcnNlZCByZXN1bHRzIG9yIHdoZXJlIHRoZSBwYXJzZSBmYWlsZWQuIFF1aWNrIGFuZCBlYXN5IHdheSB0bw0KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICANCiAgICAgICAgIC0gY29tbWVudCAtIChkZWZhdWx0PUN7JyMnfSkgLSBleHByZXNzaW9uIGZvciBpbmRpY2F0aW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZSB0ZXN0IA0KICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nDQogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOw0KICAgICAgICAgICAgICBpZiBGYWxzZSwgb25seSBkdW1wIG5lc3RlZCBsaXN0DQogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQNCiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nDQoNCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZA0KICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggDQogICAgICAgIHRlc3QncyBvdXRwdXQNCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgbnVtYmVyX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlci5jb3B5KCkNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgICAgICcnJykNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICAnJycsIGZhaWx1cmVUZXN0cz1UcnVlKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBbMTAwXQ0KDQogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgIFstMTAwXQ0KDQogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICAgICBTdWNjZXNzDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciAzKSwgKGxpbmU6MSwgY29sOjQpDQoNCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCg0KICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlDQogICAgICAgIGxpbmVzLCBjcmVhdGUgYSB0ZXN0IGxpa2UgdGhpczo6DQoNCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpDQogICAgICAgIA0KICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdHMsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBjb21tZW50ID0gTGl0ZXJhbChjb21tZW50KQ0KICAgICAgICBhbGxSZXN1bHRzID0gW10NCiAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICBzdWNjZXNzID0gVHJ1ZQ0KICAgICAgICBmb3IgdCBpbiB0ZXN0czoNCiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBub3QgdDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdDQogICAgICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQ0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXN1bHQuZHVtcChmdWxsPWZ1bGxEdW1wKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICBmYXRhbCA9ICIoRkFUQUwpIiBpZiBpc2luc3RhbmNlKHBlLCBQYXJzZUZhdGFsRXhjZXB0aW9uKSBlbHNlICIiDQogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0Og0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqKGNvbChwZS5sb2MsdCktMSkgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMOiAiICsgc3RyKHBlKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4Yw0KDQogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6DQogICAgICAgICAgICAgICAgaWYgZnVsbER1bXA6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpDQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpDQoNCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MsIGFsbFJlc3VsdHMNCg0KICAgICAgICANCmNsYXNzIFRva2VuKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApDQoNCg0KY2xhc3MgRW1wdHkoVG9rZW4pOg0KICAgICIiIg0KICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCg0KY2xhc3MgTm9NYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB0b2tlbiB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKE5vTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBMaXRlcmFsKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZy4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCINCiAgICANCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4NCiAgICANCiAgICBGb3Iga2V5d29yZCBtYXRjaGluZyAoZm9yY2Ugd29yZCBicmVhayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXRjaGVkIHN0cmluZyksDQogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBFbXB0eQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhICpsb3QqDQogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsDQogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCl9MID0gTGl0ZXJhbA0KUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbA0KDQpjbGFzcyBLZXl3b3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUNCiAgICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlci4gIENvbXBhcmUgd2l0aCBDe0x7TGl0ZXJhbH19Og0KICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uDQogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30NCiAgICBBY2NlcHRzIHR3byBvcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGtleXdvcmQgc3RyaW5nOg0KICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywNCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCINCiAgICAgLSBDe2Nhc2VsZXNzfSBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgZGVmYXVsdCBpcyBDe0ZhbHNlfS4NCiAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnQiKSAgIyAtPiBbJ3N0YXJ0J10NCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24NCg0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6DQogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBpZGVudENoYXJzIGlzIE5vbmU6DQogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIHNlbGYubWF0Y2gNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzDQogICAgICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICAgICAgc2VsZi5jYXNlbGVzc21hdGNoID0gbWF0Y2hTdHJpbmcudXBwZXIoKQ0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQ0KICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6DQogICAgICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdEtleXdvcmRDaGFycyggY2hhcnMgKToNCiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gY2hhcnMNCg0KY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOg0KICAgICIiIg0KICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLg0KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuDQogICAgbWF0Y2ggc3RyaW5nLCBOT1QgdGhlIGNhc2Ugb2YgdGhlIGlucHV0IHRleHQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzTGl0ZXJhbCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApDQogICAgICAgICMgUHJlc2VydmUgdGhlIGRlZmluaW5nIGxpdGVyYWwuDQogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5tYXRjaDoNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToNCiAgICAiIiINCiAgICBDYXNlbGVzcyB2ZXJzaW9uIG9mIEx7S2V5d29yZH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzS2V5d29yZCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB2YXJpYXRpb24gb24gTHtMaXRlcmFsfSB3aGljaCBtYXRjaGVzICJjbG9zZSIgbWF0Y2hlcywgdGhhdCBpcywgDQogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoNCiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZA0KICAgICAtIEN7bWF4TWlzbWF0Y2hlc30gLSAoQ3tkZWZhdWx0PTF9KSBtYXhpbXVtIG51bWJlciBvZiBtaXNtYXRjaGVzIGFsbG93ZWQgdG8gY291bnQgYXMgYSBtYXRjaA0KICAgIA0KICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOg0KICAgICAtIEN7bWlzbWF0Y2hlc30gLSBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG1hdGNoX3N0cmluZyB3aGVyZSBtaXNtYXRjaGVzIHdlcmUgZm91bmQNCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZw0KICAgIA0KICAgIElmIEN7bWlzbWF0Y2hlc30gaXMgYW4gZW1wdHkgbGlzdCwgdGhlbiB0aGUgbWF0Y2ggd2FzIGFuIGV4YWN0IG1hdGNoLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgIyBleGFjdCBtYXRjaA0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCg0KICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcw0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVhDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzQsIDldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6DQogICAgICAgIHN1cGVyKENsb3NlTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXhNaXNtYXRjaGVzID0gbWF4TWlzbWF0Y2hlcw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpDQoNCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZ2xvYyA9IDANCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQ0KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcw0KDQogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOg0KICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20NCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gbWF0Og0KICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxDQogICAgICAgICAgICAgICAgcmVzdWx0cyA9IFBhcnNlUmVzdWx0cyhbaW5zdHJpbmdbc3RhcnQ6bG9jXV0pDQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcw0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdHMNCg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBXb3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLA0KICAgIGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGFsbG93ZWQgYm9keSBjaGFyYWN0ZXJzIChpZiBvbWl0dGVkLA0KICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwNCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsDQogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gDQogICAgdGhlIGlucHV0IEN7Ym9keUNoYXJzfSBzdHJpbmc7IHVzZWZ1bCB0byBkZWZpbmUgYSB3b3JkIG9mIGFsbCBwcmludGFibGVzDQogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4NCiAgICANCiAgICBMe3NyYW5nZX0gaXMgdXNlZnVsIGZvciBkZWZpbmluZyBjdXN0b20gY2hhcmFjdGVyIHNldCBzdHJpbmdzIGZvciBkZWZpbmluZyANCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4NCiAgICANCiAgICBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHVzZSBDe1dvcmR9IHRvIG1hdGNoIGEgc3BlY2lmaWMgbGl0ZXJhbCBzdHJpbmcsIGFzIGluIA0KICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUNCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLA0KICAgICJkQXJlZCIsIG9yIGFueSBvdGhlciB3b3JkIG1hZGUgdXAgb2YgdGhlIGNoYXJhY3RlcnMgJ0EnLCAnZCcsICdyJywgJ2UnLCBhbmQgJ3MnLg0KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9Lg0KDQogICAgcHlwYXJzaW5nIGluY2x1ZGVzIGhlbHBlciBzdHJpbmdzIGZvciBidWlsZGluZyBXb3JkczoNCiAgICAgLSBMe2FscGhhc30NCiAgICAgLSBMe251bXN9DQogICAgIC0gTHthbHBoYW51bXN9DQogICAgIC0gTHtoZXhudW1zfQ0KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pDQogICAgIC0gTHtwdW5jOGJpdH0gKG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGN1cnJlbmN5LCBzeW1ib2xzLCBzdXBlcnNjcmlwdHMsIGRpYWNyaXRpY2FscywgZXRjLikNCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkNCiAgICAgICAgDQogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlDQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KDQogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJw0KICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQ0KICAgICAgICANCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpDQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpDQogICAgICAgIA0KICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBleGNsdWRlQ2hhcnM6DQogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoNCiAgICAgICAgICAgICAgICBib2R5Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gYm9keUNoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykNCiAgICAgICAgaWYgYm9keUNoYXJzIDoNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpDQoNCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZA0KDQogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6DQogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXSsiICUgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpDQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlLmVzY2FwZShzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc11bJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKCBzZWxmLnJlU3RyaW5nICkNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYucmU6DQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycw0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBpbnN0cmxlbiApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOg0KICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KDQogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCg0KICAgICAgICAgICAgZGVmIGNoYXJzQXNTdHIocyk6DQogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzDQoNCiAgICAgICAgICAgIGlmICggc2VsZi5pbml0Q2hhcnNPcmlnICE9IHNlbGYuYm9keUNoYXJzT3JpZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcykiICUgY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFJlZ2V4KFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuDQogICAgSWYgdGhlIGdpdmVuIHJlZ2V4IGNvbnRhaW5zIG5hbWVkIGdyb3VwcyAoZGVmaW5lZCB1c2luZyBDeyg/UDxuYW1lPi4uLil9KSwgdGhlc2Ugd2lsbCBiZSBwcmVzZXJ2ZWQgYXMgDQogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikNCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQ0KICAgICAgICAjIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjczOTkvaG93LWRvLXlvdS1tYXRjaC1vbmx5LXZhbGlkLXJvbWFuLW51bWVyYWxzLXdpdGgtYS1yZWd1bGFyLWV4cHJlc3Npb24NCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpDQogICAgIiIiDQogICAgY29tcGlsZWRSRXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoIltBLVpdIikpDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToNCiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiINCiAgICAgICAgc3VwZXIoUmVnZXgsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBub3QgcGF0dGVybjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdHRlcm4sIFJlZ2V4LmNvbXBpbGVkUkV0eXBlKToNCiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc3RyKHBhdHRlcm4pDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCiAgICAgICAgICAgIA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQ0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMocmVzdWx0Lmdyb3VwKCkpDQogICAgICAgIGlmIGQ6DQogICAgICAgICAgICBmb3IgayBpbiBkOg0KICAgICAgICAgICAgICAgIHJldFtrXSA9IGRba10NCiAgICAgICAgcmV0dXJuIGxvYyxyZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBRdW90ZWRTdHJpbmcoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLg0KICAgIA0KICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nDQogICAgICAgIC0gZXNjQ2hhciAtIGNoYXJhY3RlciB0byBlc2NhcGUgcXVvdGVzLCB0eXBpY2FsbHkgYmFja3NsYXNoIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQ0KICAgICAgICAtIHVucXVvdGVSZXN1bHRzIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoZWQgdGV4dCBzaG91bGQgYmUgdW5xdW90ZWQgKGRlZmF1bHQ9Q3tUcnVlfSkNCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpDQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQ0KICAgICAgICBwcmludChxcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSIgc2xkamYnKSkNCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykNCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpDQogICAgICAgIHNxbF9xcyA9IFF1b3RlZFN0cmluZygnIicsIGVzY1F1b3RlPSciIicpDQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUnXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOg0KICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5DQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgIGlmIG5vdCBxdW90ZUNoYXI6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJlbmRRdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBzZWxmLnF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0NCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXINCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyDQogICAgICAgIHNlbGYuZXNjUXVvdGUgPSBlc2NRdW90ZQ0KICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMNCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMNCg0KICAgICAgICBpZiBtdWx0aWxpbmU6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lcyVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IDANCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzXG5cciVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoDQogICAgICAgICAgICAgICAgJ3woPzonICsgJyl8KD86Jy5qb2luKCIlc1teJXNdIiAlIChyZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXJbOmldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICBpZiBlc2NRdW90ZToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpDQogICAgICAgIGlmIGVzY0NoYXI6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQ0KICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIg0KICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInKSolcycgJSByZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXIpKQ0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgc2VsZi5wYXR0ZXJuLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIHJldCA9IHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoNCg0KICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzDQogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQ0KDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlDQogICAgICAgICAgICAgICAgaWYgJ1xcJyBpbiByZXQgYW5kIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzOg0KICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xuJyA6ICdcbicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZS5zdWIoc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4sIlxnPDE+IixyZXQpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY1F1b3RlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAicXVvdGVkIHN0cmluZywgc3RhcnRpbmcgd2l0aCAlcyBlbmRpbmcgd2l0aCAlcyIgJSAoc2VsZi5xdW90ZUNoYXIsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBDaGFyc05vdEluKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwNCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBkaXNhbGxvd2VkIGNoYXJhY3RlcnMsIGFuZCBhbiBvcHRpb25hbA0KICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGRlZmluZSBhIGNvbW1hLXNlcGFyYXRlZC12YWx1ZSBhcyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykNCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbm90Q2hhcnMsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCApOg0KICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYubm90Q2hhcnMgPSBub3RDaGFycw0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKENoYXJzTm90SW4oKSkgaWYgemVyby1sZW5ndGggY2hhciBncm91cCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9ICggc2VsZi5taW5MZW4gPT0gMCApDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBub3RjaGFycyA9IHNlbGYubm90Q2hhcnMNCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXA0KICAgICAgICAgICAgICAoaW5zdHJpbmdbbG9jXSBub3QgaW4gbm90Y2hhcnMpOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgaWYgbGVuKHNlbGYubm90Q2hhcnMpID4gNDoNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzKSIgJSBzZWxmLm5vdENoYXJzDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBXaGl0ZShUb2tlbik6DQogICAgIiIiDQogICAgU3BlY2lhbCBtYXRjaGluZyBjbGFzcyBmb3IgbWF0Y2hpbmcgd2hpdGVzcGFjZS4gIE5vcm1hbGx5LCB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQNCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMNCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUNCiAgICBtYXRjaGVkOyBkZWZhdWx0IGlzIEN7IiBcXHRcXHJcXG4ifS4gIEFsc28gdGFrZXMgb3B0aW9uYWwgQ3ttaW59LCBDe21heH0sIGFuZCBDe2V4YWN0fSBhcmd1bWVudHMsDQogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuDQogICAgIiIiDQogICAgd2hpdGVTdHJzID0gew0KICAgICAgICAiICIgOiAiPFNQQz4iLA0KICAgICAgICAiXHQiOiAiPFRBQj4iLA0KICAgICAgICAiXG4iOiAiPExGPiIsDQogICAgICAgICJcciI6ICI8Q1I+IiwNCiAgICAgICAgIlxmIjogIjxGRj4iLA0KICAgICAgICB9DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToNCiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoV2hpdGUgPSB3cw0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLm5hbWUgPSAoIiIuam9pbihXaGl0ZS53aGl0ZVN0cnNbY10gZm9yIGMgaW4gc2VsZi5tYXRjaFdoaXRlKSkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQoNCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoX1Bvc2l0aW9uVG9rZW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18NCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgY29sbm8gKToNCiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuY29sID0gY29sbm8NCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXS5pc3NwYWNlKCkgYW5kIGNvbCggbG9jLCBpbnN0cmluZyApICE9IHNlbGYuY29sIDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkNCiAgICAgICAgaWYgdGhpc2NvbCA+IHNlbGYuY29sOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkNCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sDQogICAgICAgIHJldCA9IGluc3RyaW5nWyBsb2M6IG5ld2xvYyBdDQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldA0KDQoNCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgDQogICAgICAgIHRlc3QgPSAnJydcDQogICAgICAgIEFBQSB0aGlzIGxpbmUNCiAgICAgICAgQUFBIGFuZCB0aGlzIGxpbmUNCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQ0KICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUNCiAgICAgICAgJycnDQoNCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6DQogICAgICAgICAgICBwcmludCh0KQ0KICAgIA0KICAgIFByaW50czo6DQogICAgICAgIFsnQUFBJywgJyB0aGlzIGxpbmUnXQ0KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIA0KDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBjb2wobG9jLCBpbnN0cmluZykgPT0gMToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZUVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICBpZiBpbnN0cmluZ1tsb2NdID09ICJcbiI6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFN0cmluZ1N0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMNCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBTdHJpbmdFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgPCBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgV29yZFN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgcHJlY2VkZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvYy0xXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBpZiBpbnN0cmxlbj4wIGFuZCBsb2M8aW5zdHJsZW46DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBQYXJzZXJFbGVtZW50LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSggZXhwcnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsDQogICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShleHByLCBiYXNlc3RyaW5nKSBmb3IgZXhwciBpbiBleHBycyk6DQogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApDQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0NCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24NCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApDQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MNCiAgICAgICAgIyAobGlrZXdpc2UgZm9yIE9yJ3MgYW5kIE1hdGNoRmlyc3QncykNCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1stMV0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc2V0UmVzdWx0c05hbWUobmFtZSxsaXN0QWxsTWF0Y2hlcykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KICAgICAgICANCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQ0KICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10NCiAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snKyd9IG9wZXJhdG9yLg0KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQoNCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pDQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoNCiAgICAgICAgZXhwciA9IGludGVnZXIoImlkIikgKyBuYW1lX2V4cHIoIm5hbWUiKSArIGludGVnZXIoImFnZSIpDQogICAgIiIiDQoNCiAgICBjbGFzcyBfRXJyb3JTdG9wKEVtcHR5KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnLScNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwcnNbMF0ud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQ0KICAgICAgICAjIHByZS1wYXJzZWQgdGhlIHN0cmluZyBhcyBwYXJ0IG9mIG91ciBBbmQgcHJlLXBhcnNpbmcNCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByc1sxOl06DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToNCiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2Vucw0KICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRsaXN0DQoNCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5Og0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIE9yKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBsb25nZXN0IHN0cmluZyB3aWxsIGJlIHVzZWQuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIF4gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE9yLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgbWF0Y2hlcyA9IFtdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbG9jMiA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdA0KICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKChsb2MyLCBlKSkNCg0KICAgICAgICBpZiBtYXRjaGVzOg0KICAgICAgICAgICAgbWF0Y2hlcy5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pDQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCg0KICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KDQogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIF4gIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBGYWlsISAtPiBbWycxMjMnXSwgWyczJ10sIFsnMTQxNiddLCBbJzc4OSddXQ0KDQogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QNCiAgICAgICAgbnVtYmVyID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkgfCBXb3JkKG51bXMpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KDQogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgRWFjaChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpDQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikNCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQ0KICAgICAgICBjb2xvcl9hdHRyID0gImNvbG9yOiIgKyBjb2xvcigiY29sb3IiKQ0KICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpDQoNCiAgICAgICAgIyB1c2UgRWFjaCAodXNpbmcgb3BlcmF0b3IgJyYnKSB0byBhY2NlcHQgYXR0cmlidXRlcyBpbiBhbnkgb3JkZXIgDQogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQ0KICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQ0KDQogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnDQogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwDQogICAgICAgICAgICAnJycNCiAgICAgICAgICAgICkNCiAgICBwcmludHM6Og0KICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICBbJ3NoYXBlOicsICdTUVVBUkUnLCAnY29sb3I6JywgJ0JMQUNLJywgJ3Bvc246JywgWycxMDAnLCAnLCcsICcxMjAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxBQ0sNCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddDQogICAgICAgICAgLSB4OiAxMDANCiAgICAgICAgICAtIHk6IDEyMA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCg0KDQogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgWydzaGFwZTonLCAnQ0lSQ0xFJywgJ3NpemU6JywgJzUwJywgJ2NvbG9yOicsICdCTFVFJywgJ3Bvc246JywgWyc1MCcsICcsJywgJzgwJ11dDQogICAgICAgIC0gY29sb3I6IEJMVUUNCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQ0KICAgICAgICAgIC0geDogNTANCiAgICAgICAgICAtIHk6IDgwDQogICAgICAgIC0gc2hhcGU6IENJUkNMRQ0KICAgICAgICAtIHNpemU6IDUwDQoNCg0KICAgICAgICBjb2xvcjogR1JFRU4gc2l6ZTogMjAgc2hhcGU6IFRSSUFOR0xFIHBvc246IDIwLDQwDQogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQ0KICAgICAgICAtIGNvbG9yOiBHUkVFTg0KICAgICAgICAtIHBvc246IFsnMjAnLCAnLCcsICc0MCddDQogICAgICAgICAgLSB4OiAyMA0KICAgICAgICAgIC0geTogNDANCiAgICAgICAgLSBzaGFwZTogVFJJQU5HTEUNCiAgICAgICAgLSBzaXplOiAyMA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOg0KICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpDQogICAgICAgICAgICBvcHQxID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIF0NCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0NCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDINCiAgICAgICAgICAgIHNlbGYubXVsdGlvcHRpb25hbHMgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxaZXJvT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgKz0gc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UNCiAgICAgICAgdG1wTG9jID0gbG9jDQogICAgICAgIHRtcFJlcWQgPSBzZWxmLnJlcXVpcmVkWzpdDQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQ0KICAgICAgICBtYXRjaE9yZGVyID0gW10NCg0KICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlDQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoNCiAgICAgICAgICAgIHRtcEV4cHJzID0gdG1wUmVxZCArIHRtcE9wdCArIHNlbGYubXVsdGlvcHRpb25hbHMgKyBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIGZhaWxlZCA9IFtdDQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZChlKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpDQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gdG1wUmVxZDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBPcHQucmVtb3ZlKGUpDQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOg0KICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlDQoNCiAgICAgICAgaWYgdG1wUmVxZDoNCiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxvYywiTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBlbGVtZW50cyAoJXMpIiAlIG1pc3NpbmcgKQ0KDQogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkDQogICAgICAgIG1hdGNoT3JkZXIgKz0gW2UgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIGFuZCBlLmV4cHIgaW4gdG1wT3B0XQ0KDQogICAgICAgIHJlc3VsdGxpc3QgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBtYXRjaE9yZGVyOg0KICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQ0KICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykNCg0KICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkNCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgJiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZXJFbGVtZW50fSwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQ0KICAgICAgICBzZWxmLmV4cHIgPSBleHByDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IGV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IGV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQ0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoZXhwci5pZ25vcmVFeHBycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIixsb2Msc2VsZi5lcnJtc2csc2VsZikNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0Og0KICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQ0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIEZvbGxvd2VkQnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonDQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydjb2xvcicsICdCTEFDSyddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihGb2xsb3dlZEJ5LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBkb2VzIEl7bm90fSBtYXRjaCBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQ0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkZvdW5kIHVud2FudGVkIHRva2VuLCAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwci5jYW5QYXJzZU5leHQoaW5zdHJpbmcsIGxvYyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIn57IiArIF91c3RyKHNlbGYuZXhwcikgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihfTXVsdGlwbGVNYXRjaCwgc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBlbmRlciA9IHN0b3BPbg0KICAgICAgICBpZiBpc2luc3RhbmNlKGVuZGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQ0KICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9za2lwX2lnbm9yYWJsZXMgPSBzZWxmLl9za2lwSWdub3JhYmxlcw0KICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlciA9IHNlbGYubm90X2VuZGVyLnRyeVBhcnNlDQogICAgICAgIA0KICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOw0KICAgICAgICAjIGlmIHNvLCBmYWlsKQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQ0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICAgICAgICAgIGlmIGhhc0lnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyArPSB0bXB0b2tlbnMNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCiAgICAgICAgDQpjbGFzcyBPbmVPck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBCTEFDSyINCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQ0KDQogICAgICAgICMgdXNlIHN0b3BPbiBhdHRyaWJ1dGUgZm9yIE9uZU9yTW9yZSB0byBhdm9pZCByZWFkaW5nIGxhYmVsIHN0cmluZyBhcyBwYXJ0IG9mIHRoZSBkYXRhDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQ0KICAgICAgICANCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMNCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpDQogICAgIiIiDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe09uZU9yTW9yZX0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoWmVyb09yTW9yZSxzZWxmKS5fX2luaXRfXyhleHByLCBzdG9wT249c3RvcE9uKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICANCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9OdWxsVG9rZW4ob2JqZWN0KToNCiAgICBkZWYgX19ib29sX18oc2VsZik6DQogICAgICAgIHJldHVybiBGYWxzZQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19zdHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICIiDQoNCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkNCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXINCiAgICAgICAgemlwID0gQ29tYmluZShXb3JkKG51bXMsIGV4YWN0PTUpICsgT3B0aW9uYWwoJy0nICsgV29yZChudW1zLCBleGFjdD00KSkpDQogICAgICAgIHppcC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgICAgIDEyMzQ1DQogICAgICAgICAgICANCiAgICAgICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgIDEyMzQ1DQogICAgICAgIFsnMTIzNDUnXQ0KDQogICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgIFsnMTIxMDEtMDAwMSddDQoNCiAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICBeDQogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOg0KICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6DQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQ0KICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRva2VucyA9IFtdDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBTa2lwVG8oUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZA0KICAgICAtIGluY2x1ZGUgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaWYgVHJ1ZSwgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGFsc28gcGFyc2VkIA0KICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuDQogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgDQogICAgICAgICAgY29tbWVudHMpIHRoYXQgbWlnaHQgY29udGFpbiBmYWxzZSBtYXRjaGVzIHRvIHRoZSB0YXJnZXQgZXhwcmVzc2lvbg0KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSANCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCANCiAgICAgICAgICB0aGUgU2tpcFRvIGlzIG5vdCBhIG1hdGNoDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVwb3J0ID0gJycnDQogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMA0KDQogICAgICAgICAgICAgICAjIHwgU2V2ZXJpdHkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEYXlzIE9wZW4NCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQ0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2DQogICAgICAgICAgICAgIDk0IHwgQ29zbWV0aWMgfCBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykgICAgICAgICB8ICAgICAgICAgMTQNCiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0Nw0KICAgICAgICAgICAgJycnDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykNCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUA0KICAgICAgICAjIC0gaWdub3JlIHF1b3RlZCBzdHJpbmdzLCBzbyB0aGF0IGEgJ3wnIGNoYXJhY3RlciBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoDQogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkNCiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQ0KICAgICAgICBzdHJpbmdfZGF0YS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIuc3RyaXApKQ0KICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJkZXNjIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkNCiAgICAgICAgDQogICAgICAgIGZvciB0a3QgaW4gdGlja2V0X2V4cHIuc2VhcmNoU3RyaW5nKHJlcG9ydCk6DQogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWycxMDEnLCAnQ3JpdGljYWwnLCAnSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCcsICc2J10NCiAgICAgICAgLSBkYXlzX29wZW46IDYNCiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoDQogICAgICAgIC0gaXNzdWVfbnVtOiAxMDENCiAgICAgICAgLSBzZXY6IENyaXRpY2FsDQogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10NCiAgICAgICAgLSBkYXlzX29wZW46IDE0DQogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpDQogICAgICAgIC0gaXNzdWVfbnVtOiA5NA0KICAgICAgICAtIHNldjogQ29zbWV0aWMNCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddDQogICAgICAgIC0gZGF5c19vcGVuOiA0Nw0KICAgICAgICAtIGRlc2M6IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzDQogICAgICAgIC0gaXNzdWVfbnVtOiA3OQ0KICAgICAgICAtIHNldjogTWlub3INCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToNCiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApDQogICAgICAgIHNlbGYuaWdub3JlRXhwciA9IGlnbm9yZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmluY2x1ZGVNYXRjaCA9IGluY2x1ZGUNCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhmYWlsT24pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJObyBtYXRjaCBmb3VuZCBmb3IgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydGxvYyA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcg0KICAgICAgICBleHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIA0KICAgICAgICB0bXBsb2MgPSBsb2MNCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0IGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBhZHZhbmNlIHBhc3QgaWdub3JlIGV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wbG9jID0gc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlKGluc3RyaW5nLCB0bXBsb2MpDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZw0KICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQ0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbA0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzDQogICAgICAgIGxvYyA9IHRtcGxvYw0KICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10NCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkNCiAgICAgICAgDQogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOg0KICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgc2tpcHJlc3VsdCArPSBtYXQNCg0KICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0DQoNCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBleHByZXNzaW9uIHRvIGJlIGRlZmluZWQgbGF0ZXIgLQ0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uDQogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuDQoNCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuDQogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6Og0KICAgICAgICBmd2RFeHByIDw8IGEgfCBiIHwgYw0KICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoNCiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYw0KICAgIHRoZXJlYnkgbGVhdmluZyBiIGFuZCBjIG91dCBhcyBwYXJzZWFibGUgYWx0ZXJuYXRpdmVzLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UNCiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6DQogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykNCiAgICBDb252ZXJ0aW5nIHRvIHVzZSB0aGUgJzw8PScgb3BlcmF0b3IgaW5zdGVhZCB3aWxsIGF2b2lkIHRoaXMgcHJvYmxlbS4NCg0KICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nDQogICAgQ3tGb3J3YXJkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToNCiAgICAgICAgc3VwZXIoRm9yd2FyZCxzZWxmKS5fX2luaXRfXyggb3RoZXIsIHNhdmVsaXN0PUZhbHNlICkNCg0KICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpDQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3INCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKHNlbGYuZXhwci5pZ25vcmVFeHBycykNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXINCiAgICANCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICBpZiBzZWxmIG5vdCBpbiB2YWxpZGF0ZVRyYWNlOg0KICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6IC4uLiINCg0KICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMNCiAgICAgICAgc2VsZi5fcmV2ZXJ0Q2xhc3MgPSBzZWxmLl9fY2xhc3NfXw0KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICJOb25lIg0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcw0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAiICsgcmV0U3RyaW5nDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHJldCA8PD0gc2VsZg0KICAgICAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIi4uLiINCg0KY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlDQoNCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byBjb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgdG9rZW5zIHRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsNCiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQoNCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10NCiAgICAgICAgIyBubyBtYXRjaCB3aGVuIHRoZXJlIGFyZSBpbnRlcm5hbCBzcGFjZXMNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGpvaW5TdHJpbmc9IiIsIGFkamFjZW50PVRydWUgKToNCiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZg0KICAgICAgICBpZiBhZGphY2VudDoNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBzZWxmLmFkamFjZW50Og0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pZ25vcmUoc2VsZiwgb3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0VG9rcyA9IHRva2VubGlzdC5jb3B5KCkNCiAgICAgICAgZGVsIHJldFRva3NbOl0NCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOg0KICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gcmV0VG9rcw0KDQpjbGFzcyBHcm91cChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQ0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCAnYScsICdiJywgJzEwMCddDQoNCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsIFsnYScsICdiJywgJzEwMCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihHcm91cCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KDQpjbGFzcyBEaWN0KFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5Lg0KICAgIEVhY2ggZWxlbWVudCBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvbiBhcyBpdHMga2V5Lg0KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcw0KICAgICAgICByZXN1bHQgPSBEaWN0KE9uZU9yTW9yZShHcm91cChhdHRyX2V4cHIpKSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgYWNjZXNzIG5hbWVkIGZpZWxkcyBhcyBkaWN0IGVudHJpZXMsIG9yIG91dHB1dCBhcyBkaWN0DQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIA0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQ0KDQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnLCAnc2hhcGUnOiAnU1FVQVJFJ30NCiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOg0KICAgICAgICAgICAgaWYgbGVuKHRvaykgPT0gMDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWtleSA9IHRva1swXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpa2V5LGludCk6DQogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoIiIsaSkNCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkNCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdDQogICAgICAgICAgICAgICAgaWYgbGVuKGRpY3R2YWx1ZSkhPSAxIG9yIChpc2luc3RhbmNlKGRpY3R2YWx1ZSxQYXJzZVJlc3VsdHMpIGFuZCBkaWN0dmFsdWUuaGFza2V5cygpKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlWzBdLGkpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCg0KY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICB3ZF9saXN0MSA9IHdkICsgWmVyb09yTW9yZSgnLCcgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkNCg0KICAgICAgICAjIG9mdGVuLCBkZWxpbWl0ZXJzIHRoYXQgYXJlIHVzZWZ1bCBkdXJpbmcgcGFyc2luZyBhcmUganVzdCBpbiB0aGUNCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQNCiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0Mi5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddDQogICAgICAgIFsnYScsICdiJywgJ2MnLCAnZCddDQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQ0KICAgICIiIg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gW10NCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZg0KDQoNCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6DQogICAgIiIiDQogICAgV3JhcHBlciBmb3IgcGFyc2UgYWN0aW9ucywgdG8gZW5zdXJlIHRoZXkgYXJlIG9ubHkgY2FsbGVkIG9uY2UuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOg0KICAgICAgICBzZWxmLmNhbGxhYmxlID0gX3RyaW1fYXJpdHkobWV0aG9kQ2FsbCkNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToNCiAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOg0KICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpDQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikNCiAgICBkZWYgcmVzZXQoc2VsZik6DQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCg0KZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6DQogICAgIiIiDQogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gDQogICAgDQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGlzIGNhbGxlZCwgdGhpcyBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI+PiBlbnRlcmluZyBJe21ldGhvZC1uYW1lfShsaW5lOkl7Y3VycmVudF9zb3VyY2VfbGluZX0sIEl7cGFyc2VfbG9jYXRpb259LCBJe21hdGNoZWRfdG9rZW5zfSkiLn0NCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KDQogICAgICAgIEB0cmFjZVBhcnNlQWN0aW9uDQogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6DQogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpDQoNCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQ0KICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkNCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpDQogICAgICAgIFsnZGZqa2xzJ10NCiAgICAiIiINCiAgICBmID0gX3RyaW1fYXJpdHkoZikNCiAgICBkZWYgeigqcGFBcmdzKToNCiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fDQogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0NCiAgICAgICAgaWYgbGVuKHBhQXJncyk+MzoNCiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAoZXhjZXB0aW9uOiAlcylcbiIgJSAodGhpc0Z1bmMsZXhjKSApDQogICAgICAgICAgICByYWlzZQ0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkNCiAgICAgICAgcmV0dXJuIHJldA0KICAgIHRyeToNCiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18NCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgIHBhc3MNCiAgICByZXR1cm4geg0KDQojDQojIGdsb2JhbCBoZWxwZXJzDQojDQpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGRlbGltaXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIC0gdGhlIGRlbGltaXRlciBkZWZhdWx0cyB0byAnLCcuDQogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kDQogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCiAgICBJZiBDe2NvbWJpbmV9IGlzIHNldCB0byBDe1RydWV9LCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbg0KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZA0KICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10NCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGhleG51bXMpLCBkZWxpbT0nOicsIGNvbWJpbmU9VHJ1ZSkucGFyc2VTdHJpbmcoIkFBOkJCOkNDOkREOkVFIikgIyAtPiBbJ0FBOkJCOkNDOkREOkVFJ10NCiAgICAiIiINCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iDQogICAgaWYgY29tYmluZToNCiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiAoIGV4cHIgKyBaZXJvT3JNb3JlKCBTdXBwcmVzcyggZGVsaW0gKSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KDQpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLg0KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoNCiAgICAgICAgaW50ZWdlciBleHByIGV4cHIgZXhwci4uLg0KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuDQogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuDQogICAgDQogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KDQogICAgICAgICMgaW4gdGhpcyBwYXJzZXIsIHRoZSBsZWFkaW5nIGludGVnZXIgdmFsdWUgaXMgZ2l2ZW4gaW4gYmluYXJ5LA0KICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkNCiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpDQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcyksIGludEV4cHI9YmluYXJ5Q29uc3RhbnQpLnBhcnNlU3RyaW5nKCcxMCBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KICAgICIiIg0KICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3VudEZpZWxkUGFyc2VBY3Rpb24ocyxsLHQpOg0KICAgICAgICBuID0gdFswXQ0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkNCiAgICAgICAgcmV0dXJuIFtdDQogICAgaWYgaW50RXhwciBpcyBOb25lOg0KICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpDQogICAgZWxzZToNCiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpDQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpDQogICAgaW50RXhwci5hZGRQYXJzZUFjdGlvbihjb3VudEZpZWxkUGFyc2VBY3Rpb24sIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpDQoNCmRlZiBfZmxhdHRlbihMKToNCiAgICByZXQgPSBbXQ0KICAgIGZvciBpIGluIEw6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSxsaXN0KToNCiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQuYXBwZW5kKGkpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgbWF0Y2hQcmV2aW91c0xpdGVyYWwoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNMaXRlcmFsKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhDQogICAgcHJldmlvdXMgbGl0ZXJhbCwgd2lsbCBhbHNvIG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifS4NCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgaWYgdDoNCiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOg0KICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2Vucw0KICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgICAgICByZXAgPDwgQW5kKExpdGVyYWwodHQpIGZvciB0dCBpbiB0ZmxhdCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBieQ0KICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07DQogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbw0KICAgIEN7IjEifSBpcyBjb21wYXJlZCB3aXRoIEN7IjEwIn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGUyID0gZXhwci5jb3B5KCkNCiAgICByZXAgPDw9IGUyDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6DQogICAgICAgICAgICB0aGVzZVRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikNCiAgICAgICAgcmVwLnNldFBhcnNlQWN0aW9uKCBtdXN0TWF0Y2hUaGVzZVRva2VucywgY2FsbER1cmluZ1RyeT1UcnVlICkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOg0KICAgICN+ICBlc2NhcGUgdGhlc2UgY2hhcnM6IF4tXQ0KICAgIGZvciBjIGluIHIiXF4tXSI6DQogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpDQogICAgcyA9IHMucmVwbGFjZSgiXG4iLHIiXG4iKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikNCiAgICByZXR1cm4gX3VzdHIocykNCg0KZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBxdWlja2x5IGRlZmluZSBhIHNldCBvZiBhbHRlcm5hdGl2ZSBMaXRlcmFscywgYW5kIG1ha2VzIHN1cmUgdG8gZG8NCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwNCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMNCiAgICAgLSBjYXNlbGVzcyAtIChkZWZhdWx0PUN7RmFsc2V9KSAtIHRyZWF0IGFsbCBsaXRlcmFscyBhcyBjYXNlbGVzcw0KICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleA0KICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yDQogICAgICAgICAgaWYgY3JlYXRpbmcgYSBDe1JlZ2V4fSByYWlzZXMgYW4gZXhjZXB0aW9uKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbXBfb3BlciA9IG9uZU9mKCI8ID0gPiA8PSA+PSAhPSIpDQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSB2YXIgfCBudW1iZXINCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0NCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQ0KICAgICIiIg0KICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IENhc2VsZXNzTGl0ZXJhbA0KICAgIGVsc2U6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnN0YXJ0c3dpdGgoYSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwNCg0KICAgIHN5bWJvbHMgPSBbXQ0KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToNCiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQ0KICAgIGVsaWYgaXNpbnN0YW5jZShzdHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSk6DQogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpDQogICAgZWxzZToNCiAgICAgICAgd2FybmluZ3Mud2FybigiSW52YWxpZCBhcmd1bWVudCB0byBvbmVPZiwgZXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgaWYgbm90IHN5bWJvbHM6DQogICAgICAgIHJldHVybiBOb01hdGNoKCkNCg0KICAgIGkgPSAwDQogICAgd2hpbGUgaSA8IGxlbihzeW1ib2xzKS0xOg0KICAgICAgICBjdXIgPSBzeW1ib2xzW2ldDQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToNCiAgICAgICAgICAgIGlmICggaXNlcXVhbChvdGhlciwgY3VyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbGlmICggbWFza3MoY3VyLCBvdGhlcikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQ0KICAgICAgICAgICAgICAgIGN1ciA9IG90aGVyDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGkgKz0gMQ0KDQogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoNCiAgICAgICAgI34gcHJpbnQgKHN0cnMsIi0+IiwgInwiLmpvaW4oIFsgX2VzY2FwZVJlZ2V4Q2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHNdICkpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggIlslc10iICUgIiIuam9pbihfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KDQogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdA0KICAgIHJldHVybiBNYXRjaEZpcnN0KHBhcnNlRWxlbWVudENsYXNzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQoNCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucw0KICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMNCiAgICBpbiB0aGUgcHJvcGVyIG9yZGVyLiAgVGhlIGtleSBwYXR0ZXJuIGNhbiBpbmNsdWRlIGRlbGltaXRpbmcgbWFya2VycyBvciBwdW5jdHVhdGlvbiwNCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUNCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbg0KICAgIGZpZWxkcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsDQogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikNCg0KICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQNCiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkNCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28NCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAnc2hhcGUnOiAnU1FVQVJFJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCd9DQogICAgIiIiDQogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkNCg0KZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCwgdW50b2tlbml6ZWQgdGV4dCBmb3IgYSBnaXZlbiBleHByZXNzaW9uLiAgVXNlZnVsIHRvDQogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bw0KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nDQogICAgaW5wdXQgdGV4dC4gQnkgZGVmYXVsdCwgcmV0dXJucyBhc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcnNlZCB0ZXh0LiAgDQogICAgICAgDQogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgDQogICAgQ3tMe1BhcnNlUmVzdWx0c319IGNvbnRhaW5pbmcgYW55IHJlc3VsdHMgbmFtZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgbWF0Y2hlZCwgYW5kIGEgDQogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiANCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZA0KICAgIHJlc3VsdHMgbmFtZXMsIHlvdSBtdXN0IHNldCBDe2FzU3RyaW5nfSB0byBDe0ZhbHNlfSBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZQ0KICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICINCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6DQogICAgICAgICAgICBvcGVuZXIsY2xvc2VyID0gbWFrZUhUTUxUYWdzKHRhZykNCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpDQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddDQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQ0KICAgICIiIg0KICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykNCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpDQogICAgZW5kbG9jTWFya2VyLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQ0KICAgIGlmIGFzU3RyaW5nOg0KICAgICAgICBleHRyYWN0VGV4dCA9IGxhbWJkYSBzLGwsdDogc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdDQogICAgZWxzZToNCiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToNCiAgICAgICAgICAgIHRbOl0gPSBbc1t0LnBvcCgnX29yaWdpbmFsX3N0YXJ0Jyk6dC5wb3AoJ19vcmlnaW5hbF9lbmQnKV1dDQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQ0KICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMNCiAgICByZXR1cm4gbWF0Y2hFeHByDQoNCmRlZiB1bmdyb3VwKGV4cHIpOiANCiAgICAiIiINCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbg0KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuDQogICAgIiIiDQogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pDQoNCmRlZiBsb2NhdGVkRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLg0KICAgIFRoaXMgaGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyByZXN1bHRzIG5hbWVzOg0KICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zDQogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcw0KICAgICAtIHZhbHVlID0gdGhlIGFjdHVhbCBwYXJzZWQgcmVzdWx0cw0KDQogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbA0KICAgIEN7THtQYXJzZXJFbGVtZW50LnBhcnNlV2l0aFRhYnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToNCiAgICAgICAgICAgIHByaW50KG1hdGNoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dDQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dDQogICAgICAgIFtbMTgsICdsa2tqaicsIDIzXV0NCiAgICAiIiINCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpDQogICAgcmV0dXJuIEdyb3VwKGxvY2F0b3IoImxvY25fc3RhcnQiKSArIGV4cHIoInZhbHVlIikgKyBsb2NhdG9yLmNvcHkoKS5sZWF2ZVdoaXRlc3BhY2UoKSgibG9jbl9lbmQiKSkNCg0KDQojIGNvbnZlbmllbmNlIGNvbnN0YW50cyBmb3IgcG9zaXRpb25hbCBleHByZXNzaW9ucw0KZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikNCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikNCmxpbmVFbmQgICAgID0gTGluZUVuZCgpLnNldE5hbWUoImxpbmVFbmQiKQ0Kc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikNCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikNCg0KX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkNCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpDQpfZXNjYXBlZE9jdENoYXIgPSBSZWdleChyIlxcMFswLTddKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF1bMTpdLDgpKSkNCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9cidcXScsIGV4YWN0PTEpIHwgUmVnZXgociJcdyIsIHJlLlVOSUNPREUpDQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpDQpfcmVCcmFja2V0RXhwciA9IExpdGVyYWwoIlsiKSArIE9wdGlvbmFsKCJeIikuc2V0UmVzdWx0c05hbWUoIm5lZ2F0ZSIpICsgR3JvdXAoIE9uZU9yTW9yZSggX2NoYXJSYW5nZSB8IF9zaW5nbGVDaGFyICkgKS5zZXRSZXN1bHRzTmFtZSgiYm9keSIpICsgIl0iDQoNCmRlZiBzcmFuZ2Uocyk6DQogICAgciIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MNCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6Og0KICAgICAgICBzcmFuZ2UoIlswLTldIikgICAtPiAiMDEyMzQ1Njc4OSINCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ig0KICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyINCiAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncywgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGV4cGFuZGVkDQogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuDQogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6DQogICAgIC0gYSBzaW5nbGUgY2hhcmFjdGVyDQogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQ0KICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIA0KICAgICAgICAgKEN7XDB4IyN9IGlzIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgDQogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQ0KICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pDQogICAgIC0gYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAoQ3snYWVpb3V5J30sIEN7J2EtekEtWjAtOV8kJ30sIGV0Yy4pDQogICAgIiIiDQogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkNCiAgICB0cnk6DQogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIHJldHVybiAiIg0KDQpkZWYgbWF0Y2hPbmx5QXRDb2wobik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYw0KICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4NCiAgICAiIiINCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToNCiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHN0cmcsbG9jbiwibWF0Y2hlZCB0b2tlbiBub3QgYXQgY29sdW1uICVkIiAlIG4pDQogICAgcmV0dXJuIHZlcmlmeUNvbA0KDQpkZWYgcmVwbGFjZVdpdGgocmVwbFN0cik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkNCiAgICB1c2VmdWwgd2hlbiB1c2VkIHdpdGggQ3tMe3RyYW5zZm9ybVN0cmluZzxQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZz59KCl9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIG51bSA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQ0KICAgICAgICB0ZXJtID0gbmEgfCBudW0NCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQ0KICAgICIiIg0KICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IFtyZXBsU3RyXQ0KDQpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToNCiAgICAiIiINCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0NCg0KICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIk5vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50Il0NCiAgICAiIiINCiAgICByZXR1cm4gdFswXVsxOi0xXQ0KDQpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBwYXJzZSBhY3Rpb24gYnkgbWFwcGluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiBhIFBhcnNlUmVzdWx0cyBsaXN0LklmIGFueSBhZGRpdGlvbmFsIA0KICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcg0KICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQ0KICAgIHBhcnNlZCBkYXRhIHRvIGFuIGludGVnZXIgdXNpbmcgYmFzZSAxNi4NCg0KICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6DQogICAgICAgIGhleF9pbnRzID0gT25lT3JNb3JlKFdvcmQoaGV4bnVtcykpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKQ0KICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgICAgICAnJycpDQogICAgICAgIA0KICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkNCiAgICAgICAgT25lT3JNb3JlKHVwcGVyd29yZCkucnVuVGVzdHMoJycnDQogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkNCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnDQogICAgICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdDQoNCiAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQ0KDQogICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10NCiAgICAiIiINCiAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdDQoNCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiBwYQ0KDQp1cGNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiINCg0KZG93bmNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIg0KICAgIA0KZGVmIF9tYWtlVGFncyh0YWdTdHIsIHhtbCk6DQogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIg0KICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyDQogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQ0KICAgIGVsc2U6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHIubmFtZQ0KDQogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpDQogICAgaWYgKHhtbCk6DQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lICsgU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgZWxzZToNCiAgICAgICAgcHJpbnRhYmxlc0xlc3NSQWJyYWNrID0gIiIuam9pbihjIGZvciBjIGluIHByaW50YWJsZXMgaWYgYyBub3QgaW4gIj4iKQ0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZS5zZXRQYXJzZUFjdGlvbihkb3duY2FzZVRva2VucykgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgY2xvc2VUYWcgPSBDb21iaW5lKF9MKCI8LyIpICsgdGFnU3RyICsgIj4iKQ0KDQogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpDQogICAgY2xvc2VUYWcgPSBjbG9zZVRhZy5zZXRSZXN1bHRzTmFtZSgiZW5kIisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8LyVzPiIgJSByZXNuYW1lKQ0KICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQ0KICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUNCiAgICByZXR1cm4gb3BlblRhZywgY2xvc2VUYWcNCg0KZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgIyBtYWtlSFRNTFRhZ3MgcmV0dXJucyBweXBhcnNpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgYXMgYSAyLXR1cGxlDQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQ0KICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZA0KICAgICAgICANCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToNCiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzDQogICAgICAgICAgICBwcmludChsaW5rLmxpbmtfdGV4dCwgJy0+JywgbGluay5ocmVmKQ0KICAgIHByaW50czo6DQogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tDQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApDQoNCmRlZiBtYWtlWE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3Mgb25seSBpbiB0aGUgZ2l2ZW4gdXBwZXIvbG93ZXIgY2FzZS4NCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9DQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkNCg0KZGVmIHdpdGhBdHRyaWJ1dGUoKmFyZ3MsKiphdHRyRGljdCk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQNCiAgICB3aXRoIEN7THttYWtlWE1MVGFnc319IG9yIEN7THttYWtlSFRNTFRhZ3N9fS4gVXNlIEN7d2l0aEF0dHJpYnV0ZX0gdG8gcXVhbGlmeSBhIHN0YXJ0aW5nIHRhZw0KICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcw0KICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uDQoNCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdA0KICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6DQogICAgIC0ga2V5d29yZCBhcmd1bWVudHMsIGFzIGluIEN7KGFsaWduPSJyaWdodCIpfSwgb3INCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbg0KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQ0KICAgICAtIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcywgYXMgaW4gKCAoIm5zMTpjbGFzcyIsICJDdXN0b21lciIpLCAoIm5zMjphbGlnbiIsInJpZ2h0IikgKQ0KICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUNCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLg0KICAgICAgIA0KICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uDQoNCiAgICBUbyB2ZXJpZnkgdGhhdCB0aGUgYXR0cmlidXRlIGV4aXN0cywgYnV0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHZhbHVlLCBwYXNzDQogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzIGhhcyBubyB0eXBlPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KDQogICAgICAgICMgb25seSBtYXRjaCBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlIHdpdGggdmFsdWUgImdyaWQiDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgIyBjb25zdHJ1Y3QgYSBtYXRjaCB3aXRoIGFueSBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQ0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBpZiBhcmdzOg0KICAgICAgICBhdHRycyA9IGFyZ3NbOl0NCiAgICBlbHNlOg0KICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkNCiAgICBhdHRycyA9IFsoayx2KSBmb3Igayx2IGluIGF0dHJzXQ0KICAgIGRlZiBwYShzLGwsdG9rZW5zKToNCiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoNCiAgICAgICAgICAgIGlmIGF0dHJOYW1lIG5vdCBpbiB0b2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQ0KICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsImF0dHJpYnV0ZSAnJXMnIGhhcyB2YWx1ZSAnJXMnLCBtdXN0IGJlICclcyciICUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQ0KICAgIHJldHVybiBwYQ0Kd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgPSBvYmplY3QoKQ0KDQpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToNCiAgICAiIiINCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQ0KICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKCJncmlkIikpDQogICAgICAgIA0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcyh3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIg0KICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICANCg0Kb3BBc3NvYyA9IF9Db25zdGFudHMoKQ0Kb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkNCm9wQXNzb2MuUklHSFQgPSBvYmplY3QoKQ0KDQpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZg0KICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yDQogICAgYmluYXJ5LCBsZWZ0LSBvciByaWdodC1hc3NvY2lhdGl2ZS4gIFBhcnNlIGFjdGlvbnMgY2FuIGFsc28gYmUgYXR0YWNoZWQNCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIA0KICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuDQogICAgDQogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzDQogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhDQogICAgbWVjaGFuaXNtIHRvIHBvdGVudGlhbGx5IGltcHJvdmUgeW91ciBwYXJzZXIgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJhc2VFeHByIC0gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG1vc3QgYmFzaWMgZWxlbWVudCBmb3IgdGhlIG5lc3RlZA0KICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUNCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQ0KICAgICAgKG9wRXhwciwgbnVtVGVybXMsIHJpZ2h0TGVmdEFzc29jLCBwYXJzZUFjdGlvbiksIHdoZXJlOg0KICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOw0KICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7DQogICAgICAgICAgaWYgbnVtVGVybXMgaXMgMywgb3BFeHByIGlzIGEgdHVwbGUgb2YgdHdvIGV4cHJlc3Npb25zLCBmb3IgdGhlDQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zDQogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0DQogICAgICAgICAgYmUgMSwgMiwgb3IgMykNCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMNCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQNCiAgICAgICAgICBjb25zdGFudHMgQ3tvcEFzc29jLlJJR0hUfSBhbmQgQ3tvcEFzc29jLkxFRlR9Lg0KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgNCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQ0KICAgICAgICAgIHBhcnNlIGFjdGlvbiB0dXBsZSBtZW1iZXIgbWF5IGJlIG9taXR0ZWQpDQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkNCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzDQogICAgICAgIGludGVnZXIgPSBweXBhcnNpbmdfY29tbW9uLnNpZ25lZF9pbnRlZ2VyDQogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByID0gaW5maXhOb3RhdGlvbihpbnRlZ2VyIHwgdmFybmFtZSwNCiAgICAgICAgICAgIFsNCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLA0KICAgICAgICAgICAgKG9uZU9mKCcqIC8nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICBdKQ0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDUrMyo2DQogICAgICAgICAgICAoNSszKSo2DQogICAgICAgICAgICAtMi0tMTENCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpDQogICAgcHJpbnRzOjoNCiAgICAgICAgNSszKjYNCiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0NCg0KICAgICAgICAoNSszKSo2DQogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dDQoNCiAgICAgICAgLTItLTExDQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0NCiAgICAiIiINCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApDQogICAgZm9yIGksb3BlckRlZiBpbiBlbnVtZXJhdGUob3BMaXN0KToNCiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0NCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHINCiAgICAgICAgaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpDQogICAgICAgICAgICBvcEV4cHIxLCBvcEV4cHIyID0gb3BFeHByDQogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpDQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIrbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKGxhc3RFeHByKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLlJJR0hUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdA0KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wRXhwciwgT3B0aW9uYWwpOg0KICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpDQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQ0KICAgICAgICBpZiBwYToNCiAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbiggcGEgKQ0KICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApDQogICAgICAgIGxhc3RFeHByID0gdGhpc0V4cHINCiAgICByZXQgPDw9IGxhc3RFeHByDQogICAgcmV0dXJuIHJldA0KDQpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uDQoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiDQoNCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpDQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMiKQ0KcXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIid8DQogICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgicXVvdGVkU3RyaW5nIHVzaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIikNCnVuaWNvZGVTdHJpbmcgPSBDb21iaW5lKF9MKCd1JykgKyBxdW90ZWRTdHJpbmcuY29weSgpKS5zZXROYW1lKCJ1bmljb2RlIHN0cmluZyBsaXRlcmFsIikNCg0KZGVmIG5lc3RlZEV4cHIob3BlbmVyPSIoIiwgY2xvc2VyPSIpIiwgY29udGVudD1Ob25lLCBpZ25vcmVFeHByPXF1b3RlZFN0cmluZy5jb3B5KCkpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIG5lc3RlZCBsaXN0cyBlbmNsb3NlZCBpbiBvcGVuaW5nIGFuZCBjbG9zaW5nDQogICAgZGVsaW1pdGVycyAoIigiIGFuZCAiKSIgYXJlIHRoZSBkZWZhdWx0KS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gb3BlbmVyIC0gb3BlbmluZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKCJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNsb3NlciAtIGNsb3NpbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IikifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjb250ZW50IC0gZXhwcmVzc2lvbiBmb3IgaXRlbXMgd2l0aGluIHRoZSBuZXN0ZWQgbGlzdHMgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgLSBpZ25vcmVFeHByIC0gZXhwcmVzc2lvbiBmb3IgaWdub3Jpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIChkZWZhdWx0PUN7cXVvdGVkU3RyaW5nfSkNCg0KICAgIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IHByb3ZpZGVkIGZvciB0aGUgY29udGVudCBhcmd1bWVudCwgdGhlIG5lc3RlZA0KICAgIGV4cHJlc3Npb24gd2lsbCBjYXB0dXJlIGFsbCB3aGl0ZXNwYWNlLWRlbGltaXRlZCBjb250ZW50IGJldHdlZW4gZGVsaW1pdGVycw0KICAgIGFzIGEgbGlzdCBvZiBzZXBhcmF0ZSB2YWx1ZXMuDQoNCiAgICBVc2UgdGhlIEN7aWdub3JlRXhwcn0gYXJndW1lbnQgdG8gZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgbWF5IGNvbnRhaW4NCiAgICBvcGVuaW5nIG9yIGNsb3NpbmcgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBvcGVuaW5nDQogICAgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIGZvciBuZXN0aW5nLCBzdWNoIGFzIHF1b3RlZFN0cmluZyBvciBhIGNvbW1lbnQNCiAgICBleHByZXNzaW9uLiAgU3BlY2lmeSBtdWx0aXBsZSBleHByZXNzaW9ucyB1c2luZyBhbiBDe0x7T3J9fSBvciBDe0x7TWF0Y2hGaXJzdH19Lg0KICAgIFRoZSBkZWZhdWx0IGlzIEx7cXVvdGVkU3RyaW5nfSwgYnV0IGlmIG5vIGV4cHJlc3Npb25zIGFyZSB0byBiZSBpZ25vcmVkLA0KICAgIHRoZW4gcGFzcyBDe05vbmV9IGZvciB0aGlzIGFyZ3VtZW50Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfdHlwZSA9IG9uZU9mKCJ2b2lkIGludCBzaG9ydCBsb25nIGNoYXIgZmxvYXQgZG91YmxlIikNCiAgICAgICAgZGVjbF9kYXRhX3R5cGUgPSBDb21iaW5lKGRhdGFfdHlwZSArIE9wdGlvbmFsKFdvcmQoJyonKSkpDQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKQ0KICAgICAgICBudW1iZXIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlcg0KICAgICAgICBhcmcgPSBHcm91cChkZWNsX2RhdGFfdHlwZSArIGlkZW50KQ0KICAgICAgICBMUEFSLFJQQVIgPSBtYXAoU3VwcHJlc3MsICIoKSIpDQoNCiAgICAgICAgY29kZV9ib2R5ID0gbmVzdGVkRXhwcigneycsICd9JywgaWdub3JlRXhwcj0ocXVvdGVkU3RyaW5nIHwgY1N0eWxlQ29tbWVudCkpDQoNCiAgICAgICAgY19mdW5jdGlvbiA9IChkZWNsX2RhdGFfdHlwZSgidHlwZSIpIA0KICAgICAgICAgICAgICAgICAgICAgICsgaWRlbnQoIm5hbWUiKQ0KICAgICAgICAgICAgICAgICAgICAgICsgTFBBUiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QoYXJnKSwgW10pKCJhcmdzIikgKyBSUEFSIA0KICAgICAgICAgICAgICAgICAgICAgICsgY29kZV9ib2R5KCJib2R5IikpDQogICAgICAgIGNfZnVuY3Rpb24uaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgIA0KICAgICAgICBzb3VyY2VfY29kZSA9ICcnJw0KICAgICAgICAgICAgaW50IGlzX29kZChpbnQgeCkgeyANCiAgICAgICAgICAgICAgICByZXR1cm4gKHglMik7IA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaW50IGRlY190b19oZXgoY2hhciBoY2hhcikgeyANCiAgICAgICAgICAgICAgICBpZiAoaGNoYXIgPj0gJzAnICYmIGhjaGFyIDw9ICc5JykgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmQoaGNoYXIpLW9yZCgnMCcpKTsgDQogICAgICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMTArb3JkKGhjaGFyKS1vcmQoJ0EnKSk7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0NCiAgICAgICAgJycnDQogICAgICAgIGZvciBmdW5jIGluIGNfZnVuY3Rpb24uc2VhcmNoU3RyaW5nKHNvdXJjZV9jb2RlKToNCiAgICAgICAgICAgIHByaW50KCIlKG5hbWUpcyAoJSh0eXBlKXMpIGFyZ3M6ICUoYXJncylzIiAlIGZ1bmMpDQoNCiAgICBwcmludHM6Og0KICAgICAgICBpc19vZGQgKGludCkgYXJnczogW1snaW50JywgJ3gnXV0NCiAgICAgICAgZGVjX3RvX2hleCAoaW50KSBhcmdzOiBbWydjaGFyJywgJ2hjaGFyJ11dDQogICAgIiIiDQogICAgaWYgb3BlbmVyID09IGNsb3NlcjoNCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzIGNhbm5vdCBiZSB0aGUgc2FtZSIpDQogICAgaWYgY29udGVudCBpcyBOb25lOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9wZW5lcixiYXNlc3RyaW5nKSBhbmQgaXNpbnN0YW5jZShjbG9zZXIsYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBsZW4ob3BlbmVyKSA9PSAxIGFuZCBsZW4oY2xvc2VyKT09MToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKGVtcHR5LmNvcHkoKStDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHN0cmluZ3MgaWYgbm8gY29udGVudCBleHByZXNzaW9uIGlzIGdpdmVuIikNCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggaWdub3JlRXhwciB8IHJldCB8IGNvbnRlbnQgKSArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIGVsc2U6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCByZXQgfCBjb250ZW50ICkgICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgcmV0LnNldE5hbWUoJ25lc3RlZCAlcyVzIGV4cHJlc3Npb24nICUgKG9wZW5lcixjbG9zZXIpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIGluZGVudGVkQmxvY2soYmxvY2tTdGF0ZW1lbnRFeHByLCBpbmRlbnRTdGFjaywgaW5kZW50PVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHNwYWNlLWRlbGltaXRlZCBpbmRlbnRhdGlvbiBibG9ja3MsIHN1Y2ggYXMNCiAgICB0aG9zZSB1c2VkIHRvIGRlZmluZSBibG9jayBzdGF0ZW1lbnRzIGluIFB5dGhvbiBzb3VyY2UgY29kZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmxvY2tTdGF0ZW1lbnRFeHByIC0gZXhwcmVzc2lvbiBkZWZpbmluZyBzeW50YXggb2Ygc3RhdGVtZW50IHRoYXQNCiAgICAgICAgICAgIGlzIHJlcGVhdGVkIHdpdGhpbiB0aGUgaW5kZW50ZWQgYmxvY2sNCiAgICAgLSBpbmRlbnRTdGFjayAtIGxpc3QgY3JlYXRlZCBieSBjYWxsZXIgdG8gbWFuYWdlIGluZGVudGF0aW9uIHN0YWNrDQogICAgICAgICAgICAobXVsdGlwbGUgc3RhdGVtZW50V2l0aEluZGVudGVkQmxvY2sgZXhwcmVzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGdyYW1tYXINCiAgICAgICAgICAgIHNob3VsZCBzaGFyZSBhIGNvbW1vbiBpbmRlbnRTdGFjaykNCiAgICAgLSBpbmRlbnQgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBibG9jayBtdXN0IGJlIGluZGVudGVkIGJleW9uZCB0aGUNCiAgICAgICAgICAgIHRoZSBjdXJyZW50IGxldmVsOyBzZXQgdG8gRmFsc2UgZm9yIGJsb2NrIG9mIGxlZnQtbW9zdCBzdGF0ZW1lbnRzDQogICAgICAgICAgICAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgQSB2YWxpZCBibG9jayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIEN7YmxvY2tTdGF0ZW1lbnR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGEgPSAnJycNCiAgICAgICAgZGVmIEEoeik6DQogICAgICAgICAgQTENCiAgICAgICAgICBCID0gMTAwDQogICAgICAgICAgRyA9IEEyDQogICAgICAgICAgQTINCiAgICAgICAgICBBMw0KICAgICAgICBCDQogICAgICAgIGRlZiBCQihhLGIsYyk6DQogICAgICAgICAgQkIxDQogICAgICAgICAgZGVmIEJCQSgpOg0KICAgICAgICAgICAgYmJhMQ0KICAgICAgICAgICAgYmJhMg0KICAgICAgICAgICAgYmJhMw0KICAgICAgICBDDQogICAgICAgIEQNCiAgICAgICAgZGVmIHNwYW0oeCx5KToNCiAgICAgICAgICAgICBkZWYgZWdncyh6KToNCiAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAnJycNCg0KDQogICAgICAgIGluZGVudFN0YWNrID0gWzFdDQogICAgICAgIHN0bXQgPSBGb3J3YXJkKCkNCg0KICAgICAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgZnVuY0RlY2wgPSAoImRlZiIgKyBpZGVudGlmaWVyICsgR3JvdXAoICIoIiArIE9wdGlvbmFsKCBkZWxpbWl0ZWRMaXN0KGlkZW50aWZpZXIpICkgKyAiKSIgKSArICI6IikNCiAgICAgICAgZnVuY19ib2R5ID0gaW5kZW50ZWRCbG9jayhzdG10LCBpbmRlbnRTdGFjaykNCiAgICAgICAgZnVuY0RlZiA9IEdyb3VwKCBmdW5jRGVjbCArIGZ1bmNfYm9keSApDQoNCiAgICAgICAgcnZhbHVlID0gRm9yd2FyZCgpDQogICAgICAgIGZ1bmNDYWxsID0gR3JvdXAoaWRlbnRpZmllciArICIoIiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QocnZhbHVlKSkgKyAiKSIpDQogICAgICAgIHJ2YWx1ZSA8PCAoZnVuY0NhbGwgfCBpZGVudGlmaWVyIHwgV29yZChudW1zKSkNCiAgICAgICAgYXNzaWdubWVudCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiPSIgKyBydmFsdWUpDQogICAgICAgIHN0bXQgPDwgKCBmdW5jRGVmIHwgYXNzaWdubWVudCB8IGlkZW50aWZpZXIgKQ0KDQogICAgICAgIG1vZHVsZV9ib2R5ID0gT25lT3JNb3JlKHN0bXQpDQoNCiAgICAgICAgcGFyc2VUcmVlID0gbW9kdWxlX2JvZHkucGFyc2VTdHJpbmcoZGF0YSkNCiAgICAgICAgcGFyc2VUcmVlLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snZGVmJywNCiAgICAgICAgICAnQScsDQogICAgICAgICAgWycoJywgJ3onLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydBMSddLCBbWydCJywgJz0nLCAnMTAwJ11dLCBbWydHJywgJz0nLCAnQTInXV0sIFsnQTInXSwgWydBMyddXV0sDQogICAgICAgICAnQicsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ0JCJywNCiAgICAgICAgICBbJygnLCAnYScsICdiJywgJ2MnLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydCQjEnXSwgW1snZGVmJywgJ0JCQScsIFsnKCcsICcpJ10sICc6JywgW1snYmJhMSddLCBbJ2JiYTInXSwgWydiYmEzJ11dXV1dXSwNCiAgICAgICAgICdDJywNCiAgICAgICAgICdEJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnc3BhbScsDQogICAgICAgICAgWycoJywgJ3gnLCAneScsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbWydkZWYnLCAnZWdncycsIFsnKCcsICd6JywgJyknXSwgJzonLCBbWydwYXNzJ11dXV1dXV0gDQogICAgIiIiDQogICAgZGVmIGNoZWNrUGVlckluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sICE9IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uKHMsbCwiaWxsZWdhbCBuZXN0aW5nIikNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgcGVlciBlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tTdWJJbmRlbnQocyxsLHQpOg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpbmRlbnRTdGFjay5hcHBlbmQoIGN1ckNvbCApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHN1YmVudHJ5IikNCg0KICAgIGRlZiBjaGVja1VuaW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBub3QoaW5kZW50U3RhY2sgYW5kIGN1ckNvbCA8IGluZGVudFN0YWNrWy0xXSBhbmQgY3VyQ29sIDw9IGluZGVudFN0YWNrWy0yXSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhbiB1bmluZGVudCIpDQogICAgICAgIGluZGVudFN0YWNrLnBvcCgpDQoNCiAgICBOTCA9IE9uZU9yTW9yZShMaW5lRW5kKCkuc2V0V2hpdGVzcGFjZUNoYXJzKCJcdCAiKS5zdXBwcmVzcygpKQ0KICAgIElOREVOVCA9IChFbXB0eSgpICsgRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1N1YkluZGVudCkpLnNldE5hbWUoJ0lOREVOVCcpDQogICAgUEVFUiAgID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1BlZXJJbmRlbnQpLnNldE5hbWUoJycpDQogICAgVU5ERU5UID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1VuaW5kZW50KS5zZXROYW1lKCdVTklOREVOVCcpDQogICAgaWYgaW5kZW50Og0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgICN+IEZvbGxvd2VkQnkoYmxvY2tTdGF0ZW1lbnRFeHByKSArDQogICAgICAgICAgICBJTkRFTlQgKyAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSArIFVOREVOVCkNCiAgICBlbHNlOg0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICkNCiAgICBibG9ja1N0YXRlbWVudEV4cHIuaWdub3JlKF9ic2xhc2ggKyBMaW5lRW5kKCkpDQogICAgcmV0dXJuIHNtRXhwci5zZXROYW1lKCdpbmRlbnRlZCBibG9jaycpDQoNCmFscGhhczhiaXQgPSBzcmFuZ2UociJbXDB4YzAtXDB4ZDZcMHhkOC1cMHhmNlwweGY4LVwweGZmXSIpDQpwdW5jOGJpdCA9IHNyYW5nZShyIltcMHhhMS1cMHhiZlwweGQ3XDB4ZjddIikNCg0KYW55T3BlblRhZyxhbnlDbG9zZVRhZyA9IG1ha2VIVE1MVGFncyhXb3JkKGFscGhhcyxhbHBoYW51bXMrIl86Iikuc2V0TmFtZSgnYW55IHRhZycpKQ0KX2h0bWxFbnRpdHlNYXAgPSBkaWN0KHppcCgiZ3QgbHQgYW1wIG5ic3AgcXVvdCBhcG9zIi5zcGxpdCgpLCc+PCYgIlwnJykpDQpjb21tb25IVE1MRW50aXR5ID0gUmVnZXgoJyYoP1A8ZW50aXR5PicgKyAnfCcuam9pbihfaHRtbEVudGl0eU1hcC5rZXlzKCkpICsiKTsiKS5zZXROYW1lKCJjb21tb24gSFRNTCBlbnRpdHkiKQ0KZGVmIHJlcGxhY2VIVE1MRW50aXR5KHQpOg0KICAgICIiIkhlbHBlciBwYXJzZXIgYWN0aW9uIHRvIHJlcGxhY2UgY29tbW9uIEhUTUwgZW50aXRpZXMgd2l0aCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMiIiINCiAgICByZXR1cm4gX2h0bWxFbnRpdHlNYXAuZ2V0KHQuZW50aXR5KQ0KDQojIGl0J3MgZWFzeSB0byBnZXQgdGhlc2UgY29tbWVudCBzdHJ1Y3R1cmVzIHdyb25nIC0gdGhleSdyZSB2ZXJ5IGNvbW1vbiwgc28gbWF5IGFzIHdlbGwgbWFrZSB0aGVtIGF2YWlsYWJsZQ0KY1N0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJykuc2V0TmFtZSgiQyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7LyogLi4uICovfSINCg0KaHRtbENvbW1lbnQgPSBSZWdleChyIjwhLS1bXHNcU10qPy0tPiIpLnNldE5hbWUoIkhUTUwgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDezwhLS0gLi4uIC0tPn0iDQoNCnJlc3RPZkxpbmUgPSBSZWdleChyIi4qIikubGVhdmVXaGl0ZXNwYWNlKCkuc2V0TmFtZSgicmVzdCBvZiBsaW5lIikNCmRibFNsYXNoQ29tbWVudCA9IFJlZ2V4KHIiLy8oPzpcXFxufFteXG5dKSoiKS5zZXROYW1lKCIvLyBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7Ly8gLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpjcHBTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLyd8IGRibFNsYXNoQ29tbWVudCkuc2V0TmFtZSgiQysrIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgZWl0aGVyIGZvcm0gQ3tMe2NTdHlsZUNvbW1lbnR9fSBvciBDe0x7ZGJsU2xhc2hDb21tZW50fX0iDQoNCmphdmFTdHlsZUNvbW1lbnQgPSBjcHBTdHlsZUNvbW1lbnQNCiJTYW1lIGFzIEN7THtjcHBTdHlsZUNvbW1lbnR9fSINCg0KcHl0aG9uU3R5bGVDb21tZW50ID0gUmVnZXgociIjLioiKS5zZXROYW1lKCJQeXRob24gc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDeyMgLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUoV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwoIFdvcmQoIiBcdCIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQpjb21tYVNlcGFyYXRlZExpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWFTZXBhcmF0ZWRMaXN0IikNCiIiIihEZXByZWNhdGVkKSBQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4NCiAgIFRoaXMgZXhwcmVzc2lvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5jb21tYV9zZXBhcmF0ZWRfbGlzdH0uIiIiDQoNCiMgc29tZSBvdGhlciB1c2VmdWwgZXhwcmVzc2lvbnMgLSB1c2luZyBsb3dlci1jYXNlIGNsYXNzIG5hbWUgc2luY2Ugd2UgYXJlIHJlYWxseSB1c2luZyB0aGlzIGFzIGEgbmFtZXNwYWNlDQpjbGFzcyBweXBhcnNpbmdfY29tbW9uOg0KICAgICIiIg0KICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGxvdy1sZXZlbCBleHByZXNzaW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgaW4ganVtcC1zdGFydGluZyBwYXJzZXIgZGV2ZWxvcG1lbnQ6DQogICAgIC0gbnVtZXJpYyBmb3JtcyAoTHtpbnRlZ2VyczxpbnRlZ2VyPn0sIEx7cmVhbHM8cmVhbD59LCBMe3NjaWVudGlmaWMgbm90YXRpb248c2NpX3JlYWw+fSkNCiAgICAgLSBjb21tb24gTHtwcm9ncmFtbWluZyBpZGVudGlmaWVyczxpZGVudGlmaWVyPn0NCiAgICAgLSBuZXR3b3JrIGFkZHJlc3NlcyAoTHtNQUM8bWFjX2FkZHJlc3M+fSwgTHtJUHY0PGlwdjRfYWRkcmVzcz59LCBMe0lQdjY8aXB2Nl9hZGRyZXNzPn0pDQogICAgIC0gSVNPODYwMSBMe2RhdGVzPGlzbzg2MDFfZGF0ZT59IGFuZCBMe2RhdGV0aW1lPGlzbzg2MDFfZGF0ZXRpbWU+fQ0KICAgICAtIEx7VVVJRDx1dWlkPn0NCiAgICAgLSBMe2NvbW1hLXNlcGFyYXRlZCBsaXN0PGNvbW1hX3NlcGFyYXRlZF9saXN0Pn0NCiAgICBQYXJzZSBhY3Rpb25zOg0KICAgICAtIEN7THtjb252ZXJ0VG9JbnRlZ2VyfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRmxvYXR9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRlfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZXRpbWV9fQ0KICAgICAtIEN7THtzdHJpcEhUTUxUYWdzfX0NCiAgICAgLSBDe0x7dXBjYXNlVG9rZW5zfX0NCiAgICAgLSBDe0x7ZG93bmNhc2VUb2tlbnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBGRg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZnJhY3Rpb24ucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5taXhlZF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgICAgIDENCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgMS0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBpbXBvcnQgdXVpZA0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB1dWlkDQogICAgICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgIDEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwLjBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAxMDANCiAgICAgICAgWzI1Nl0NCg0KICAgICAgICBGRg0KICAgICAgICBbMjU1XQ0KDQogICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgIDENCiAgICAgICAgWzFdDQoNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgMS0zLzQNCiAgICAgICAgWzEuNzVdDQoNCiAgICAgICAgIyB1dWlkDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICBbVVVJRCgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JyldDQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9JbnRlZ2VyID0gdG9rZW5NYXAoaW50KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgaW50ZWdlcnMgdG8gUHl0aG9uIGludA0KICAgICIiIg0KDQogICAgY29udmVydFRvRmxvYXQgPSB0b2tlbk1hcChmbG9hdCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIG51bWJlcnMgdG8gUHl0aG9uIGZsb2F0DQogICAgIiIiDQoNCiAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIHVuc2lnbmVkIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBoZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0TmFtZSgiaGV4IGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsMTYpKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgc2lnbmVkX2ludGVnZXIgPSBSZWdleChyJ1srLV0/XGQrJykuc2V0TmFtZSgic2lnbmVkIGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gaW50ZWdlciB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgc2lnbiwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGZyYWN0aW9uID0gKHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpICsgJy8nICsgc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkpLnNldE5hbWUoImZyYWN0aW9uIikNCiAgICAiIiJmcmFjdGlvbmFsIGV4cHJlc3Npb24gb2YgYW4gaW50ZWdlciBkaXZpZGVkIGJ5IGFuIGludGVnZXIsIHJldHVybnMgYSBmbG9hdCIiIg0KICAgIGZyYWN0aW9uLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0OiB0WzBdL3RbLTFdKQ0KDQogICAgbWl4ZWRfaW50ZWdlciA9IChmcmFjdGlvbiB8IHNpZ25lZF9pbnRlZ2VyICsgT3B0aW9uYWwoT3B0aW9uYWwoJy0nKS5zdXBwcmVzcygpICsgZnJhY3Rpb24pKS5zZXROYW1lKCJmcmFjdGlvbiBvciBtaXhlZCBpbnRlZ2VyLWZyYWN0aW9uIikNCiAgICAiIiJtaXhlZCBpbnRlZ2VyIG9mIHRoZSBmb3JtICdpbnRlZ2VyIC0gZnJhY3Rpb24nLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgaW50ZWdlciwgcmV0dXJucyBmbG9hdCIiIg0KICAgIG1peGVkX2ludGVnZXIuYWRkUGFyc2VBY3Rpb24oc3VtKQ0KDQogICAgcmVhbCA9IFJlZ2V4KHInWystXT9cZCtcLlxkKicpLnNldE5hbWUoInJlYWwgbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICBzY2lfcmVhbCA9IFJlZ2V4KHInWystXT9cZCsoW2VFXVsrLV0/XGQrfFwuXGQqKFtlRV1bKy1dP1xkKyk/KScpLnNldE5hbWUoInJlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aCBvcHRpb25hbCBzY2llbnRpZmljIG5vdGF0aW9uIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgICMgc3RyZWFtbGluaW5nIHRoaXMgZXhwcmVzc2lvbiBtYWtlcyB0aGUgZG9jcyBuaWNlci1sb29raW5nDQogICAgbnVtYmVyID0gKHNjaV9yZWFsIHwgcmVhbCB8IHNpZ25lZF9pbnRlZ2VyKS5zdHJlYW1saW5lKCkNCiAgICAiIiJhbnkgbnVtZXJpYyBleHByZXNzaW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiB0eXBlIiIiDQoNCiAgICBmbnVtYmVyID0gUmVnZXgocidbKy1dP1xkK1wuP1xkKihbZUVdWystXT9cZCspPycpLnNldE5hbWUoImZudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdCIiIg0KICAgIA0KICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpLnNldE5hbWUoImlkZW50aWZpZXIiKQ0KICAgICIiInR5cGljYWwgY29kZSBpZGVudGlmaWVyIChsZWFkaW5nIGFscGhhIG9yICdfJywgZm9sbG93ZWQgYnkgMCBvciBtb3JlIGFscGhhcywgbnVtcywgb3IgJ18nKSIiIg0KICAgIA0KICAgIGlwdjRfYWRkcmVzcyA9IFJlZ2V4KHInKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KShcLigyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkpezN9Jykuc2V0TmFtZSgiSVB2NCBhZGRyZXNzIikNCiAgICAiSVB2NCBhZGRyZXNzIChDezAuMC4wLjAgLSAyNTUuMjU1LjI1NS4yNTV9KSINCg0KICAgIF9pcHY2X3BhcnQgPSBSZWdleChyJ1swLTlhLWZBLUZdezEsNH0nKS5zZXROYW1lKCJoZXhfaW50ZWdlciIpDQogICAgX2Z1bGxfaXB2Nl9hZGRyZXNzID0gKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqNykuc2V0TmFtZSgiZnVsbCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MgPSAoT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkgKyAiOjoiICsgT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkpLnNldE5hbWUoInNob3J0IElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcy5hZGRDb25kaXRpb24obGFtYmRhIHQ6IHN1bSgxIGZvciB0dCBpbiB0IGlmIHB5cGFyc2luZ19jb21tb24uX2lwdjZfcGFydC5tYXRjaGVzKHR0KSkgPCA4KQ0KICAgIF9taXhlZF9pcHY2X2FkZHJlc3MgPSAoIjo6ZmZmZjoiICsgaXB2NF9hZGRyZXNzKS5zZXROYW1lKCJtaXhlZCBJUHY2IGFkZHJlc3MiKQ0KICAgIGlwdjZfYWRkcmVzcyA9IENvbWJpbmUoKF9mdWxsX2lwdjZfYWRkcmVzcyB8IF9taXhlZF9pcHY2X2FkZHJlc3MgfCBfc2hvcnRfaXB2Nl9hZGRyZXNzKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKSkuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikNCiAgICAiSVB2NiBhZGRyZXNzIChsb25nLCBzaG9ydCwgb3IgbWl4ZWQgZm9ybSkiDQogICAgDQogICAgbWFjX2FkZHJlc3MgPSBSZWdleChyJ1swLTlhLWZBLUZdezJ9KFs6Li1dKVswLTlhLWZBLUZdezJ9KD86XDFbMC05YS1mQS1GXXsyfSl7NH0nKS5zZXROYW1lKCJNQUMgYWRkcmVzcyIpDQogICAgIk1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4IChtYXkgYWxzbyBoYXZlICctJyBvciAnLicgZGVsaW1pdGVycykiDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGUoZm10PSIlWS0lbS0lZCIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZS5jb3B5KCkNCiAgICAgICAgICAgIGRhdGVfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGUoKSkNCiAgICAgICAgICAgIHByaW50KGRhdGVfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGUoMTk5OSwgMTIsIDMxKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpLmRhdGUoKQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRldGltZShmbXQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVmIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRldGltZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGV0aW1lDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZFQlSDolTTolUy4lZiJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZHRfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRldGltZS5jb3B5KCkNCiAgICAgICAgICAgIGR0X2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRldGltZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZHRfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMVQyMzo1OTo1OS45OTkiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRldGltZSgxOTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTAwMCldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgaXNvODYwMV9kYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSkoPzotKD9QPG1vbnRoPlxkXGQpKD86LSg/UDxkYXk+XGRcZCkpPyk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRlIikNCiAgICAiSVNPODYwMSBkYXRlIChDe3l5eXktbW0tZGR9KSINCg0KICAgIGlzbzg2MDFfZGF0ZXRpbWUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZCktKD9QPGRheT5cZFxkKVtUIF0oP1A8aG91cj5cZFxkKTooP1A8bWludXRlPlxkXGQpKDooP1A8c2Vjb25kPlxkXGQoXC5cZCopPyk/KT8oP1A8dHo+WnxbKy1dXGRcZDo/XGRcZCk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRldGltZSIpDQogICAgIklTTzg2MDEgZGF0ZXRpbWUgKEN7eXl5eS1tbS1kZFRoaDptbTpzcy5zKFp8Ky0wMDowMCl9KSAtIHRyYWlsaW5nIHNlY29uZHMsIG1pbGxpc2Vjb25kcywgYW5kIHRpbWV6b25lIG9wdGlvbmFsOyBhY2NlcHRzIHNlcGFyYXRpbmcgQ3snVCd9IG9yIEN7JyAnfSINCg0KICAgIHV1aWQgPSBSZWdleChyJ1swLTlhLWZBLUZdezh9KC1bMC05YS1mQS1GXXs0fSl7M30tWzAtOWEtZkEtRl17MTJ9Jykuc2V0TmFtZSgiVVVJRCIpDQogICAgIlVVSUQgKEN7eHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4fSkiDQoNCiAgICBfaHRtbF9zdHJpcHBlciA9IGFueU9wZW5UYWcuc3VwcHJlc3MoKSB8IGFueUNsb3NlVGFnLnN1cHByZXNzKCkNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHN0cmlwSFRNTFRhZ3MocywgbCwgdG9rZW5zKToNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlIGFjdGlvbiB0byByZW1vdmUgSFRNTCB0YWdzIGZyb20gd2ViIHBhZ2UgSFRNTCBzb3VyY2UNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgc3RyaXAgSFRNTCBsaW5rcyBmcm9tIG5vcm1hbCB0ZXh0IA0KICAgICAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAgICAgdGQsdGRfZW5kID0gbWFrZUhUTUxUYWdzKCJURCIpDQogICAgICAgICAgICB0YWJsZV90ZXh0ID0gdGQgKyBTa2lwVG8odGRfZW5kKS5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLnN0cmlwSFRNTFRhZ3MpKCJib2R5IikgKyB0ZF9lbmQNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQodGFibGVfdGV4dC5wYXJzZVN0cmluZyh0ZXh0KS5ib2R5KSAjIC0+ICdNb3JlIGluZm8gYXQgdGhlIHB5cGFyc2luZyB3aWtpIHBhZ2UnDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gcHlwYXJzaW5nX2NvbW1vbi5faHRtbF9zdHJpcHBlci50cmFuc2Zvcm1TdHJpbmcodG9rZW5zWzBdKQ0KDQogICAgX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQogICAgY29tbWFfc2VwYXJhdGVkX2xpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWEgc2VwYXJhdGVkIGxpc3QiKQ0KICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIg0KDQogICAgdXBjYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiINCg0KICAgIGRvd25jYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiINCg0KDQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOg0KDQogICAgc2VsZWN0VG9rZW4gICAgPSBDYXNlbGVzc0xpdGVyYWwoInNlbGVjdCIpDQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQ0KDQogICAgaWRlbnQgICAgICAgICAgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zICsgIl8kIikNCg0KICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICBjb2x1bW5OYW1lTGlzdCA9IEdyb3VwKGRlbGltaXRlZExpc3QoY29sdW1uTmFtZSkpLnNldE5hbWUoImNvbHVtbnMiKQ0KICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQ0KDQogICAgdGFibGVOYW1lICAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQ0KICAgIA0KICAgIHNpbXBsZVNRTCAgICAgID0gc2VsZWN0VG9rZW4oImNvbW1hbmQiKSArIGNvbHVtblNwZWMoImNvbHVtbnMiKSArIGZyb21Ub2tlbiArIHRhYmxlTmFtZUxpc3QoInRhYmxlcyIpDQoNCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcNCiAgICBzaW1wbGVTUUwucnVuVGVzdHMoIiIiDQogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQ0KICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQ0KDQogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiDQogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQw0KDQogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkDQogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMNCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyDQoNCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0DQoNCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsDQoNCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICBGRg0KICAgICAgICAiIiIpDQoNCiAgICBpbXBvcnQgdXVpZA0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiINCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICIiIikNClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAANAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEAddjxebcJAAC3CQAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5aW1wb3J0IHN5cwoKCmNsYXNzIFZlbmRvckltcG9ydGVyOgogICAgIiIiCiAgICBBIFBFUCAzMDIgbWV0YSBwYXRoIGltcG9ydGVyIGZvciBmaW5kaW5nIG9wdGlvbmFsbHktdmVuZG9yZWQKICAgIG9yIG90aGVyd2lzZSBuYXR1cmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzIGZyb20gcm9vdF9uYW1lLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3RfbmFtZSwgdmVuZG9yZWRfbmFtZXM9KCksIHZlbmRvcl9wa2c9Tm9uZSk6CiAgICAgICAgc2VsZi5yb290X25hbWUgPSByb290X25hbWUKICAgICAgICBzZWxmLnZlbmRvcmVkX25hbWVzID0gc2V0KHZlbmRvcmVkX25hbWVzKQogICAgICAgIHNlbGYudmVuZG9yX3BrZyA9IHZlbmRvcl9wa2cgb3Igcm9vdF9uYW1lLnJlcGxhY2UoJ2V4dGVybicsICdfdmVuZG9yJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZWFyY2hfcGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZWFyY2ggZmlyc3QgdGhlIHZlbmRvciBwYWNrYWdlIHRoZW4gYXMgYSBuYXR1cmFsIHBhY2thZ2UuCiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgc2VsZi52ZW5kb3JfcGtnICsgJy4nCiAgICAgICAgeWllbGQgJycKCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHNlbGYgd2hlbiBmdWxsbmFtZSBzdGFydHMgd2l0aCByb290X25hbWUgYW5kIHRoZQogICAgICAgIHRhcmdldCBtb2R1bGUgaXMgb25lIHZlbmRvcmVkIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGFueShtYXAodGFyZ2V0LnN0YXJ0c3dpdGgsIHNlbGYudmVuZG9yZWRfbmFtZXMpKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGUgb3ZlciB0aGUgc2VhcmNoIHBhdGggdG8gbG9jYXRlIGFuZCBsb2FkIGZ1bGxuYW1lLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBmb3IgcHJlZml4IGluIHNlbGYuc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGV4dGFudCA9IHByZWZpeCArIHRhcmdldAogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhleHRhbnQpCiAgICAgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICAgICAgICAgICMgbXlzdGVyaW91cyBoYWNrOgogICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZXh0YW50IHBhY2thZ2UvbW9kdWxlCiAgICAgICAgICAgICAgICAjIG9uIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBjYXVzZSByZWxhdGl2ZSBpbXBvcnRzCiAgICAgICAgICAgICAgICAjIGluIHRoZSB2ZW5kb3IgcGFja2FnZSB0byByZXNvbHZlIHRoZSBzYW1lIG1vZHVsZXMKICAgICAgICAgICAgICAgICMgYXMgdGhvc2UgZ29pbmcgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAzKToKICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgcmV0dXJuIG1vZAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAiVGhlICd7dGFyZ2V0fScgcGFja2FnZSBpcyByZXF1aXJlZDsgIgogICAgICAgICAgICAgICAgIm5vcm1hbGx5IHRoaXMgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBzbyBpZiB5b3UgZ2V0ICIKICAgICAgICAgICAgICAgICJ0aGlzIHdhcm5pbmcsIGNvbnN1bHQgdGhlIHBhY2thZ2VyIG9mIHlvdXIgIgogICAgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbi4iLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICApCgogICAgZGVmIGluc3RhbGwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGlzIGltcG9ydGVyIGludG8gc3lzLm1ldGFfcGF0aCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYgbm90IGluIHN5cy5tZXRhX3BhdGg6CiAgICAgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKHNlbGYpCgoKbmFtZXMgPSAncGFja2FnaW5nJywgJ3B5cGFyc2luZycsICdzaXgnLCAnYXBwZGlycycKVmVuZG9ySW1wb3J0ZXIoX19uYW1lX18sIG5hbWVzKS5pbnN0YWxsKCkKUEsDBBQAAAAAAAAAIQDHR30yWAIAAFgCAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5aW1wb3J0IG9zCmltcG9ydCBlcnJubwppbXBvcnQgc3lzCgoKZGVmIF9tYWtlZGlyc18zMShwYXRoLCBleGlzdF9vaz1GYWxzZSk6CiAgICB0cnk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICBpZiBub3QgZXhpc3Rfb2sgb3IgZXhjLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgcmFpc2UKCgojIHJlbHkgb24gY29tcGF0aWJpbGl0eSBiZWhhdmlvciB1bnRpbCBtb2RlIGNvbnNpZGVyYXRpb25zCiMgIGFuZCBleGlzdHNfb2sgY29uc2lkZXJhdGlvbnMgYXJlIGRpc2VudGFuZ2xlZC4KIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9wdWxsLzEwODMjaXNzdWVjb21tZW50LTMxNTE2ODY2MwpuZWVkc19tYWtlZGlycyA9ICgKICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMiwgNSkgb3IKICAgICgzLCAzKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMsIDYpIG9yCiAgICAoMywgNCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCA0LCAxKQopCm1ha2VkaXJzID0gX21ha2VkaXJzXzMxIGlmIG5lZWRzX21ha2VkaXJzIGVsc2Ugb3MubWFrZWRpcnMKUEsDBBQAAAAAAAAAIQB/1LpcjgUAAI4FAABDAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdC4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3Yvc2V0dXB0b29scy5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvc2V0dXB0b29scy9iYWRnZS8/dmVyc2lvbj1sYXRlc3QKICAgIDp0YXJnZXQ6IGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pbwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1MaW51eCUyMGJ1aWxkJTIwJTQwJTIwVHJhdmlzJTIwQ0kKICAgOnRhcmdldDogaHR0cHM6Ly90cmF2aXMtY2kub3JnL3B5cGEvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL2phcmFjby9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9V2luZG93cyUyMGJ1aWxkJTIwJTQwJTIwQXBwdmV5b3IKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9qYXJhY28vc2V0dXB0b29scy9icmFuY2gvbWFzdGVyCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS9weXZlcnNpb25zL3NldHVwdG9vbHMuc3ZnCgpTZWUgdGhlIGBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfIGluIHRoZSBQeXRob24gUGFja2FnaW5nClVzZXIncyBHdWlkZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGluc3RhbGxpbmcsIHVwZ3JhZGluZywgYW5kIHVuaW5zdGFsbGluZwpTZXR1cHRvb2xzLgoKVGhlIHByb2plY3QgaXMgYG1haW50YWluZWQgYXQgR2l0SHViIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzPmBfLgoKUXVlc3Rpb25zIGFuZCBjb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gdGhlIGBkaXN0dXRpbHMtc2lnCm1haWxpbmcgbGlzdCA8aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvZGlzdHV0aWxzLXNpZy8+YF8uCkJ1ZyByZXBvcnRzIGFuZCBlc3BlY2lhbGx5IHRlc3RlZCBwYXRjaGVzIG1heSBiZQpzdWJtaXR0ZWQgZGlyZWN0bHkgdG8gdGhlIGBidWcgdHJhY2tlcgo8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXM+YF8uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHNldHVwdG9vbHMgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsCmNoYXQgcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUKYFB5UEEgQ29kZSBvZiBDb25kdWN0IDxodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvPmBfLgoKClBLAwQUAAAAAAAAACEAUNerBzYEAAA2BAAAPwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9MSUNFTlNFLnR4dENvcHlyaWdodCAoQykgMjAxNiBKYXNvbiBSIENvb21icyA8amFyYWNvQGphcmFjby5jb20+CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgpQSwMEFAAAAAAAAAAhAPEMkP/uCgAA7goAADwAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjAKTmFtZTogc2V0dXB0b29scwpWZXJzaW9uOiAzOC4yLjQKU3VtbWFyeTogRWFzaWx5IGRvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMKSG9tZS1wYWdlOiBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzCkF1dGhvcjogUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkKQXV0aG9yLWVtYWlsOiBkaXN0dXRpbHMtc2lnQHB5dGhvbi5vcmcKTGljZW5zZTogVU5LTk9XTgpEZXNjcmlwdGlvbi1Db250ZW50LVR5cGU6IHRleHQveC1yc3Q7IGNoYXJzZXQ9VVRGLTgKS2V5d29yZHM6IENQQU4gUHlQSSBkaXN0dXRpbHMgZWdncyBwYWNrYWdlIG1hbmFnZW1lbnQKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZQpDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCkNsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlCkNsYXNzaWZpZXI6IE9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNQpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42CkNsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbgpDbGFzc2lmaWVyOiBUb3BpYyA6OiBVdGlsaXRpZXMKUmVxdWlyZXMtUHl0aG9uOiA+PTIuNywhPTMuMC4qLCE9My4xLiosIT0zLjIuKgpQcm92aWRlcy1FeHRyYTogY2VydHMKUmVxdWlyZXMtRGlzdDogY2VydGlmaSAoPT0yMDE2LjkuMjYpOyBleHRyYSA9PSAnY2VydHMnClByb3ZpZGVzLUV4dHJhOiBzc2wKUmVxdWlyZXMtRGlzdDogd2luY2VydHN0b3JlICg9PTAuMik7IHN5c19wbGF0Zm9ybT09J3dpbjMyJyBhbmQgZXh0cmEgPT0gJ3NzbCcKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3Yvc2V0dXB0b29scy5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvc2V0dXB0b29scy9iYWRnZS8/dmVyc2lvbj1sYXRlc3QKICAgIDp0YXJnZXQ6IGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pbwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1MaW51eCUyMGJ1aWxkJTIwJTQwJTIwVHJhdmlzJTIwQ0kKICAgOnRhcmdldDogaHR0cHM6Ly90cmF2aXMtY2kub3JnL3B5cGEvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL2phcmFjby9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9V2luZG93cyUyMGJ1aWxkJTIwJTQwJTIwQXBwdmV5b3IKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9qYXJhY28vc2V0dXB0b29scy9icmFuY2gvbWFzdGVyCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS9weXZlcnNpb25zL3NldHVwdG9vbHMuc3ZnCgpTZWUgdGhlIGBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfIGluIHRoZSBQeXRob24gUGFja2FnaW5nClVzZXIncyBHdWlkZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGluc3RhbGxpbmcsIHVwZ3JhZGluZywgYW5kIHVuaW5zdGFsbGluZwpTZXR1cHRvb2xzLgoKVGhlIHByb2plY3QgaXMgYG1haW50YWluZWQgYXQgR2l0SHViIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzPmBfLgoKUXVlc3Rpb25zIGFuZCBjb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gdGhlIGBkaXN0dXRpbHMtc2lnCm1haWxpbmcgbGlzdCA8aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvZGlzdHV0aWxzLXNpZy8+YF8uCkJ1ZyByZXBvcnRzIGFuZCBlc3BlY2lhbGx5IHRlc3RlZCBwYXRjaGVzIG1heSBiZQpzdWJtaXR0ZWQgZGlyZWN0bHkgdG8gdGhlIGBidWcgdHJhY2tlcgo8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXM+YF8uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHNldHVwdG9vbHMgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsCmNoYXQgcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUKYFB5UEEgQ29kZSBvZiBDb25kdWN0IDxodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvPmBfLgoKClBLAwQUAAAAAAAAACEAXKwmp4MeAACDHgAAOgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkRlYXN5X2luc3RhbGwucHksc2hhMjU2PU1EQzl2dDVBeERzWFg1cWNLbEJ6MlRuVzZUcHV2X0FvYm5maENKOVgzUE0sMTI2DQpwa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5LHNoYTI1Nj00UVkxNVA4Y1NfT0F6YlhJeXRtYnZHa252WDd2ZGlpb21HNFloYlFSWkNJLDEwNTk5MQ0KcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5LHNoYTI1Nj0teXNWcW94TGV0QW5MOTR1TTBrSGtvbUtRVEMxSlpMTjJaVWpxVWhNZUtFLDYwMA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5LHNoYTI1Nj10Z0dhTDBtNEpvMlZldUdmb09PaWZMdjdhN29VRUp1Mm4xdlJrcW9Qdy0wLDIyMzc0DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5LHNoYTI1Nj1QaWZlTFkzLVdoSWNCVnpMdHYwVTRUX3B3RHRQcnVCaEJDa2c1dkxxYTI4LDIyOTg2Nw0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHksc2hhMjU2PXprY0NQVE5fNlRjTFcwTnJsZzAxNzYtUjFRUV9XVlBUbThzejFSNC1Iak0sNzIwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5LHNoYTI1Nj1fdk5hYzVUcnp3c3J6Yk9GSWJGLTVjSHFjX1kyYVBUMkQ3enJJUjA2Qk9vLDUxMw0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5LHNoYTI1Nj1WaV9BMHJBUWVIYlUtYTlYMHR0MXlRbTlScWtnUWJEU3h6Unc4V2xVOWtBLDg2MA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSxzaGEyNTY9UkltRUNKNGNfd1RsYVRZWXdaWUxIRWllYkRNYUFKbUsxb1BBUmh3MVQ1bywxNDE2DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHksc2hhMjU2PXVFY0JCdEd2enFsdGduQXJxYjljNFJyY0luWGV6RExvczE0emJCSGhXSm8sODI0OA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHksc2hhMjU2PVNpa0wyVXluYnNUMHF0WTlsdHFuZ25kaGFfc2ZvMHc2WEdGaEFob1NvYVEsNDM1NQ0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5LHNoYTI1Nj1TQU1SZXJ6TzNmSzJJa0ZaQ2Faa3V3WmFMX0VHcUhOT3o0cG5pNHZobk4wLDI4MDI1DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5LHNoYTI1Nj0zbTZXdlBtNk5OeEU4cmtUR21uMHI3NUJfR1pTR2c3aWthZnhIc0JOMVdBLDQyMQ0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5LHNoYTI1Nj1Pd0dueFlmcjJnaE56WXg1OXFXSUJrckszU25CNm4tWmZkMVhhTHBubk0wLDExNTU2DQpwa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weSxzaGEyNTY9SlV0bEhIdmx4SFNOdUI0cFdxTmpjeDduNmtHLWZ3WGc3cW1KMnpOSmxJWSwyNDg3DQpzZXR1cHRvb2xzL19faW5pdF9fLnB5LHNoYTI1Nj1XV0lkQ2JGSm5aOWZab2FXRE5feDF2REFfUmttLVNjMTVpS3ZQdElZS0ZzLDU3MDANCnNldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5LHNoYTI1Nj1rdzhJYl9sS2pDY25QS05iUzdoOEh6dFJWSzBkNVJhY1Uzcl9LUmRWbm1NLDY1OTINCnNldHVwdG9vbHMvYnVpbGRfbWV0YS5weSxzaGEyNTY9RmxsYUtUcjF2U0p5aVVlUmpWSkVabWVFYVJ6aFl1ZU5saW10Y3dhSmJhOCw1NjcxDQpzZXR1cHRvb2xzL2NsaS0zMi5leGUsc2hhMjU2PWRmRXVvdk1ObkEySExhM2pSZk1QVmk1dGs0UjdhbENicFR2dXh0Q3l3MFksNjU1MzYNCnNldHVwdG9vbHMvY2xpLTY0LmV4ZSxzaGEyNTY9S0xBQnU1cHlybm9rSkN2NnNralhaNkdzWGV5WUhHY3FPVVQzb0hJM1hwbyw3NDc1Mg0Kc2V0dXB0b29scy9jbGkuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2DQpzZXR1cHRvb2xzL2NvbmZpZy5weSxzaGEyNTY9WlRDZ0FDMThtNHhYeHVmbGxmR3hpLVhIdkZnNmdqX2pHcGlzUmpwMEtDdywxNjMwNQ0Kc2V0dXB0b29scy9kZXBfdXRpbC5weSxzaGEyNTY9ZmdpeHZDMVI3c0gzcjEza3R5ZjdOMEZBTG9xRVhMMWNCYXJtTnBTRW9XZyw5MzUNCnNldHVwdG9vbHMvZGVwZW5kcy5weSxzaGEyNTY9aEM4UUlEY00zVkRwUlh2UlZBNk9mTDlBYVFmeHZoeEhjTl93NnNBeU5xOCw1ODM3DQpzZXR1cHRvb2xzL2Rpc3QucHksc2hhMjU2PWx4NUVycm43bmFsX193dUgtOVlJcEdGRlpHTlluc2hjRU1EWnRIQlBwcmssNDAzMzYNCnNldHVwdG9vbHMvZXh0ZW5zaW9uLnB5LHNoYTI1Nj11YzZuSEktTXh3bU5DTlBiVWlCbnliU3lxaHBKcWpiaHZPUS1lbWR2dF9FLDE3MjkNCnNldHVwdG9vbHMvZ2xpYmMucHksc2hhMjU2PVg2NFZ2R1BMMkFiVVJLd1lSc1dKT1hYR0FZT2lGX3YycWl4ZVRrQVVMdVUsMzE0Ng0Kc2V0dXB0b29scy9nbG9iLnB5LHNoYTI1Nj1ZLWZwdjh3ZEhaenY5RFBDYUdBQ3BNU0JXSjZhbXFfMWUwUl9pOF9lbDR3LDUyMDcNCnNldHVwdG9vbHMvZ3VpLTMyLmV4ZSxzaGEyNTY9WEJyMGJITUE2SHB6MnM5czlCempsLVB3WGZhOW5INGllMHJGbjRWMmtXQSw2NTUzNg0Kc2V0dXB0b29scy9ndWktNjQuZXhlLHNoYTI1Nj1hWUtNaFgxSUpMbjRVTEhnV1gwc0UweVJFVXQ2QjNURUhmX2pPdzZ5TnlFLDc1MjY0DQpzZXR1cHRvb2xzL2d1aS5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYNCnNldHVwdG9vbHMvbGF1bmNoLnB5LHNoYTI1Nj1zZDdlandoQm9jQ0R4X3dHOXJJczBPYVo4SHRtbUZVOFpDNklSX1MwTHZnLDc4Nw0Kc2V0dXB0b29scy9saWIydG8zX2V4LnB5LHNoYTI1Nj10NWUxMmhiUjJwaTlWNGV6V0RUQjRKTS1BSVNVbkdPa21jbllIZWszeGpnLDIwMTMNCnNldHVwdG9vbHMvbW9ua2V5LnB5LHNoYTI1Nj16WkdUSDdwMHhlWFFLTG1Fd0pUUElFNG01bTdmSmVIb0FzeHl2NU04ZV9FLDU3ODkNCnNldHVwdG9vbHMvbXN2Yy5weSxzaGEyNTY9QUViV05MSjBwVHVISlNrUXVCWkVUNndyX2QyLXlHR1BrZEhDTWRJS1dCNCw0MDg4NA0Kc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5LHNoYTI1Nj1GME5yYnY4S0NUMk9yTzdyd2EwM29tNE40R1pLQWxuY2UtcnItY2dEUWE4LDMxOTkNCnNldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSxzaGEyNTY9QjdnN05wQ1lrX2JFamplcUJtM05icUJrYkpoaC1tbnJlczNsMVYyaGRsdyw0MDUwNw0Kc2V0dXB0b29scy9wZXA0MjV0YWdzLnB5LHNoYTI1Nj1OdUdNeDFnR2lmN3g2aVllbWgwTGZnQnJfRlpGNUdGT1JJYmdtTWRVOEo0LDEwODgyDQpzZXR1cHRvb2xzL3B5Mjdjb21wYXQucHksc2hhMjU2PTNtd3hSTURrNVE1TzFyU1hPRVJiUURYaEZxd0RKaGhVaXRmTVdfcXBVQ28sNTM2DQpzZXR1cHRvb2xzL3B5MzFjb21wYXQucHksc2hhMjU2PVh1VTFIQ3NHRV8zekd2QlJJaFl3MmlCLUloQ0ZLNC1QeHdfak1pcWROVmssMTE5Mg0Kc2V0dXB0b29scy9weTMzY29tcGF0LnB5LHNoYTI1Nj1XOF9KRlpyOFdRYkpUXzctSkZXamNfNmxIR3RvTUstNHBDckhJd2s1Sk4wLDk5OA0Kc2V0dXB0b29scy9weTM2Y29tcGF0LnB5LHNoYTI1Nj1WVURXeG11NXJ0NFFIbEdUUnRBRnU2VzVqdmZMNldCamVEQXplb0J5ME9NLDI4OTENCnNldHVwdG9vbHMvc2FuZGJveC5weSxzaGEyNTY9OVVid2ZFTDVRWTQzNm9NSTFMdEZXb2hob1otVXp3SHZHeVpqVUhfcWhrdywxNDI3Ng0Kc2V0dXB0b29scy9zY3JpcHQgKGRldikudG1wbCxzaGEyNTY9ZjdNUjE3ZFRremFxa0NNU1ZzZXlPQ01WclBWU01kbVRRc2FCOGNaemZ1SSwyMDENCnNldHVwdG9vbHMvc2NyaXB0LnRtcGwsc2hhMjU2PVdHVHQ1cGllek8yN2MtRGJ4Nmw1UTRUM0ZmMjBBNXo3ODcyaHYzYUFoWVksMTM4DQpzZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHksc2hhMjU2PUJWdDZ5SXJETVhKb2ZsQTVKNkRKSWNzSlVmV19YRWVWaE96ZWxUVEZEUDQsMjMwNw0Kc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weSxzaGEyNTY9WUJESnNDWmpTcDYyQ1dqeG1Ta2tlOWtuOXJoSEhqMjVDdXM2emhKUlczYyw4NDkyDQpzZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHksc2hhMjU2PU5PaVpfNWhENzJBNnctNHdWajhhd0hGTTNuNTFLbXcxSWNfdngxNVhGcXcsOTk2DQpzZXR1cHRvb2xzL3ZlcnNpb24ucHksc2hhMjU2PW9nX2N1WlFiMFFJNnVrS1pGZlpXUGxyMUhnSkJQUG4ydk8ybV9iSTlaVEUsMTQ0DQpzZXR1cHRvb2xzL3doZWVsLnB5LHNoYTI1Nj02cVk4VHRPX1lKczJjajlKdGZpR1FkbHZOWVUyVFhEWk5rLTJLdmVCSmJjLDcyMzMNCnNldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5LHNoYTI1Nj01R3JmcVNQMi1kTEdKb1pUcTJnNmRDS2t5UXh4YTJuNUlRaVhsSkNvWUVFLDcxNA0Kc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5LHNoYTI1Nj1OV3pKMEExQkVlbmdacFZlcVV5V0xObTJiazRQM0Y0aUw1UVVFckh5N2tBLDU5NA0Kc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5LHNoYTI1Nj1LanBFMHN6X1NESUh2M2ZwWmNJUUstc0NrSnotU3JDNkdtdWc2YjlOa2M4LDI0MjYNCnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHksc2hhMjU2PWRoODhXOHBNSFVKUEhsTFQtWG5Qdnl5RGNtTWZFYkkyaksxRTN3MUVIS2MsMTgwMTENCnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHksc2hhMjU2PUI3bDBUbnpDR2ItMG5MbG02clMwMGpXTGtvakFTd1ZtZGhXMnc1UXpfQWssMTUwOA0Kc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHksc2hhMjU2PV82ZHozbHBCMXRZMjAwTHhLUExNN3Fnd1RDY2VPTWdhV0ZGLWpXMi1wbTAsNjM3DQpzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weSxzaGEyNTY9YlE5YUJyLTVaU08tOWZHc0dzREx6MG1ubkZ0ZUhVWm5mdFZMa2h2SERxMCw0NDg0DQpzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5LHNoYTI1Nj1kTzg5ai1JQzBkQWpTdHkxc1NaeHZpMExTZGtQR1JfWlBYRnVBQUZEWmo0LDEzMDQ5DQpzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHksc2hhMjU2PXlXeVlhYVM5RjNvOUpiSWN6bjA2NEE1ZzFDNV9VaUtSRHhHYVRxWWJ0TEUsOTU5Ng0Kc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHksc2hhMjU2PXdLYk93Ml9xVXZjRHRpMmxabXR4YkRtWWI1NHlBQWliRXh6WEl2VG96LUEsODA0Ng0Kc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weSxzaGEyNTY9NXQ2a09mcmRnQUxULVAzb2dzczZQRjlrLUxleWVzdWV5Y3VrM2RVeVpuSSw5NjANCnNldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHksc2hhMjU2PVlBSXNVaHptd19zaHZ2b0RQOEVlc0RTMnhiRkg3dEQ0TXVZRThYM3g2WWMsODcxMjUNCnNldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weSxzaGEyNTY9RExSNV9Yci1nUnF4UXdKY3lWQ2tVcmZWWlpyaU11UVNXb1FHSjNYTDdUOCwyNDk0NA0Kc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHksc2hhMjU2PWEwRVpwTF9BODY2S0VkaGljVEdidXlEX1RZbDFzeWtmemRycmktemF6VDQsNDY4Mw0Kc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHksc2hhMjU2PWJNZ2VJZVJpWHpRNERBR1BWMTMyOGtjandRakhqT1dVNEZuZ0FXTFY3OFEsMjIwMw0Kc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5LHNoYTI1Nj0xMW14ZjBDaDEyTnN1WXdTOFBId1hCUnZ5aDY3MVFBTTRjVFJoN2VwekcwLDM4NDANCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHksc2hhMjU2PVVEMHJFWjY4NjFtVFloSWR6Y3NxS25VbDhQb3pvY1hXbDlWQlExVlRXbmMsMjQzOQ0Kc2V0dXB0b29scy9jb21tYW5kL2xhdW5jaGVyIG1hbmlmZXN0LnhtbCxzaGEyNTY9eGxMYmpXckIwMXRLQzAtaGxWa09La2lTUGJ6TW1sMmVPUHRKX3VjQ25iRSw2MjgNCnNldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5LHNoYTI1Nj1TempaY094Rjd6ZEZVVDQ3WnYybjdBTTNIOGtvRHlzXzBPcFMtbjlnSWZjLDQ5ODYNCnNldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weSxzaGEyNTY9YkhsTW0xcW1CYlNkYWhUT1Q4dzZVaEEtRWdlUUl6N3A2Y0QtcU9hdWFpSSwyNzANCnNldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHksc2hhMjU2PWNvNUMxRWtJN1AwR0dUNlRxei1UMlNJajJMQkpUWlhZRUxwbWFvNmQ0S1EsMjE2NA0Kc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5LHNoYTI1Nj16YTdRQ0JjUWltS0tyaVdjb0NjYmh4UGpVejMwZ1NCNzR6dVRMNDd4cFA0LDY1OA0Kc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5LHNoYTI1Nj1vYkRUZTJCbVd0MlBsbkZQWlpoN2UwTFd2ZW1Fc2JDQ085TXpoclRaam04LDY3MTENCnNldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHksc2hhMjU2PU5UV0R5eC1nakRGLXR4ZjRkTzU3N3M3TE96SFZvS1IwTXEzM3JGeGFScjgsNTA4NQ0Kc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHksc2hhMjU2PU1lQkFjWFVlUEdqUEtxano0enZUckhhdEx2TnNqbFBGY2FndDNYbkZZZGssOTIxNA0Kc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weSxzaGEyNTY9aTFnZkl0WjNuUU9uNUZLWGI4dExDMktkN2VLQzhsV080YmRFNk5xR3BFNCwxMTcyDQpzZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHksc2hhMjU2PW9YaUdwbE1fY1VLTHdFNENXV3c5OFJ6Q3VmQXU4dEJoTUM5N0dlZ0ZjbXMsNzMxMQ0Kc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PVp0Q0xZUThKVHRPdG03U1lveGVrWnctVXpZM1RSNTBTUklVYWVxcjJST2ssMTMxDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0LHNoYTI1Nj1JdDNhM0dSalQ1NzAxbXFocnBNY0x5V19ZUzJEb2t2LVg4eldvVGFNUmUwLDE0MjINCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9MSUNFTlNFLnR4dCxzaGEyNTY9d3lvNnc1V3ZZeUh2MG92blBRYWdEdzIycTRoOUhDSFVfc1JoS05JRmJWbywxMDc4DQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PVdMZ3BiVVgxb081b0dlNzR3ZWNSUkwtbnRsTmNqak9Fd1VkUWtqTlFOekksMjc5OA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1JFQ09SRCwsDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PWtkc04tNU9KQVpJaUhOLWlPNFJobDgyS3lTMGJEV2Y0dUJ3TWJrTmFmcjgsMTEwDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHQsc2hhMjU2PUhsa0NGa29LNVRiWjVFTUxiTEtZaExjWV9FMzFrQldEOFRxVzJFZ21hdFEsMjM5DQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9akJxQ1lEbFZqbF9fc2pZRkdYbzFKUUdJTUFZRkpFLXByWVdVdG5NWkVldywyOTkwDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbixzaGEyNTY9eGQwX05nTU8tYVRKLXdzTTZkdDZkZ1FXZXhJdnZmQ3p1TzBrUkQ3TVo1ayw0OTAxDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9MkhVWFZWd0E0UGZmMXhnVEZyM0dzVFhYS2FQYU82dmxHNm9OSl80dTRUZywzOA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlLHNoYTI1Nj1BYnBIR2NnTGIta1JzSkdud0ZFa3RrN3V6cFpPQ2NCWTc0LVlCZHJLVkdzLDENClBLAwQUAAAAAAAAACEA9t3Svm4AAABuAAAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9XSEVFTFdoZWVsLVZlcnNpb246IDEuMApHZW5lcmF0b3I6IGJkaXN0X3doZWVsICgwLjMwLjApClJvb3QtSXMtUHVyZWxpYjogdHJ1ZQpUYWc6IHB5Mi1ub25lLWFueQpUYWc6IHB5My1ub25lLWFueQoKUEsDBBQAAAAAAAAAIQA32V/d7wAAAO8AAABIAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0aHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS9jL2NlcnRpZmkvY2VydGlmaS0yMDE2LjkuMjYudGFyLmd6I21kNT1iYWE4MWU5NTFhMjk5NTg1NjM2ODlkODY4ZWYxMDY0ZApodHRwczovL2ZpbGVzLnB5dGhvbmhvc3RlZC5vcmcvcGFja2FnZXMvc291cmNlL3cvd2luY2VydHN0b3JlL3dpbmNlcnRzdG9yZS0wLjIuemlwI21kNT1hZTcyOGYyZjAwNzE4NTY0OGQwYzdhODY3OWIzNjFlMgpQSwMEFAAAAAAAAAAhANE1jo6uCwAArgsAAEQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCmVhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgplYXN5X2luc3RhbGwtMy42ID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCgpbZGlzdHV0aWxzLmNvbW1hbmRzXQphbGlhcyA9IHNldHVwdG9vbHMuY29tbWFuZC5hbGlhczphbGlhcwpiZGlzdF9lZ2cgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnOmJkaXN0X2VnZwpiZGlzdF9ycG0gPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbQpiZGlzdF93aW5pbnN0ID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3dpbmluc3Q6YmRpc3Rfd2luaW5zdApidWlsZF9jbGliID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2NsaWI6YnVpbGRfY2xpYgpidWlsZF9leHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dApidWlsZF9weSA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9weTpidWlsZF9weQpkZXZlbG9wID0gc2V0dXB0b29scy5jb21tYW5kLmRldmVsb3A6ZGV2ZWxvcApkaXN0X2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGlzdF9pbmZvOmRpc3RfaW5mbwplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmVhc3lfaW5zdGFsbAplZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbwppbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbAppbnN0YWxsX2VnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm86aW5zdGFsbF9lZ2dfaW5mbwppbnN0YWxsX2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2xpYjppbnN0YWxsX2xpYgppbnN0YWxsX3NjcmlwdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cwpyZWdpc3RlciA9IHNldHVwdG9vbHMuY29tbWFuZC5yZWdpc3RlcjpyZWdpc3Rlcgpyb3RhdGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZQpzYXZlb3B0cyA9IHNldHVwdG9vbHMuY29tbWFuZC5zYXZlb3B0czpzYXZlb3B0cwpzZGlzdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpzZGlzdApzZXRvcHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdAp0ZXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdAp1cGxvYWQgPSBzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkOnVwbG9hZAp1cGxvYWRfZG9jcyA9IHNldHVwdG9vbHMuY29tbWFuZC51cGxvYWRfZG9jczp1cGxvYWRfZG9jcwoKW2Rpc3R1dGlscy5zZXR1cF9rZXl3b3Jkc10KY29udmVydF8ydG8zX2RvY3Rlc3RzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdApkZXBlbmRlbmN5X2xpbmtzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplYWdlcl9yZXNvdXJjZXMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmVudHJ5X3BvaW50cyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19lbnRyeV9wb2ludHMKZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCmV4dHJhc19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2V4dHJhcwppbmNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAppbnN0YWxsX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwpuYW1lc3BhY2VfcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfbnNwCnBhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZXMKcHl0aG9uX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3NwZWNpZmllcgpzZXR1cF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdGVzdF9sb2FkZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3J1bm5lciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCnRlc3Rfc3VpdGUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfdGVzdF9zdWl0ZQp0ZXN0c19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwp1c2VfMnRvMyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAp1c2VfMnRvM19leGNsdWRlX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKdXNlXzJ0bzNfZml4ZXJzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAp6aXBfc2FmZSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAoKW2VnZ19pbmZvLndyaXRlcnNdClBLRy1JTkZPID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3BrZ19pbmZvCmRlcGVuZGVuY3lfbGlua3MudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZGVwZW5kcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlCmVhZ2VyX3Jlc291cmNlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwplbnRyeV9wb2ludHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMKbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCnJlcXVpcmVzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9yZXF1aXJlbWVudHMKdG9wX2xldmVsLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcwoKW3NldHVwdG9vbHMuaW5zdGFsbGF0aW9uXQplZ2dzZWN1dGFibGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmJvb3RzdHJhcAoKUEsDBBQAAAAAAAAAIQD71iD1JRMAACUTAABBAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL21ldGFkYXRhLmpzb257ImNsYXNzaWZpZXJzIjogWyJEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlIiwgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLCAiTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UiLCAiT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudCIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjYiLCAiVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzIDo6IFB5dGhvbiBNb2R1bGVzIiwgIlRvcGljIDo6IFN5c3RlbSA6OiBBcmNoaXZpbmcgOjogUGFja2FnaW5nIiwgIlRvcGljIDo6IFN5c3RlbSA6OiBTeXN0ZW1zIEFkbWluaXN0cmF0aW9uIiwgIlRvcGljIDo6IFV0aWxpdGllcyJdLCAiZGVzY3JpcHRpb25fY29udGVudF90eXBlIjogInRleHQveC1yc3Q7IGNoYXJzZXQ9VVRGLTgiLCAiZXh0ZW5zaW9ucyI6IHsicHl0aG9uLmNvbW1hbmRzIjogeyJ3cmFwX2NvbnNvbGUiOiB7ImVhc3lfaW5zdGFsbCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4iLCAiZWFzeV9pbnN0YWxsLTMuNiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4ifX0sICJweXRob24uZGV0YWlscyI6IHsiY29udGFjdHMiOiBbeyJlbWFpbCI6ICJkaXN0dXRpbHMtc2lnQHB5dGhvbi5vcmciLCAibmFtZSI6ICJQeXRob24gUGFja2FnaW5nIEF1dGhvcml0eSIsICJyb2xlIjogImF1dGhvciJ9XSwgImRvY3VtZW50X25hbWVzIjogeyJkZXNjcmlwdGlvbiI6ICJERVNDUklQVElPTi5yc3QiLCAibGljZW5zZSI6ICJMSUNFTlNFLnR4dCJ9LCAicHJvamVjdF91cmxzIjogeyJIb21lIjogImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMifX0sICJweXRob24uZXhwb3J0cyI6IHsiY29uc29sZV9zY3JpcHRzIjogeyJlYXN5X2luc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIiwgImVhc3lfaW5zdGFsbC0zLjYiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIn0sICJkaXN0dXRpbHMuY29tbWFuZHMiOiB7ImFsaWFzIjogInNldHVwdG9vbHMuY29tbWFuZC5hbGlhczphbGlhcyIsICJiZGlzdF9lZ2ciOiAic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2ciLCAiYmRpc3RfcnBtIjogInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9ycG06YmRpc3RfcnBtIiwgImJkaXN0X3dpbmluc3QiOiAic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3dpbmluc3Q6YmRpc3Rfd2luaW5zdCIsICJidWlsZF9jbGliIjogInNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9jbGliOmJ1aWxkX2NsaWIiLCAiYnVpbGRfZXh0IjogInNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9leHQ6YnVpbGRfZXh0IiwgImJ1aWxkX3B5IjogInNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9weTpidWlsZF9weSIsICJkZXZlbG9wIjogInNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AiLCAiZGlzdF9pbmZvIjogInNldHVwdG9vbHMuY29tbWFuZC5kaXN0X2luZm86ZGlzdF9pbmZvIiwgImVhc3lfaW5zdGFsbCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmVhc3lfaW5zdGFsbCIsICJlZ2dfaW5mbyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86ZWdnX2luZm8iLCAiaW5zdGFsbCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbDppbnN0YWxsIiwgImluc3RhbGxfZWdnX2luZm8iOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm86aW5zdGFsbF9lZ2dfaW5mbyIsICJpbnN0YWxsX2xpYiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIiLCAiaW5zdGFsbF9zY3JpcHRzIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHM6aW5zdGFsbF9zY3JpcHRzIiwgInJlZ2lzdGVyIjogInNldHVwdG9vbHMuY29tbWFuZC5yZWdpc3RlcjpyZWdpc3RlciIsICJyb3RhdGUiOiAic2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUiLCAic2F2ZW9wdHMiOiAic2V0dXB0b29scy5jb21tYW5kLnNhdmVvcHRzOnNhdmVvcHRzIiwgInNkaXN0IjogInNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpzZGlzdCIsICJzZXRvcHQiOiAic2V0dXB0b29scy5jb21tYW5kLnNldG9wdDpzZXRvcHQiLCAidGVzdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDp0ZXN0IiwgInVwbG9hZCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkOnVwbG9hZCIsICJ1cGxvYWRfZG9jcyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkX2RvY3M6dXBsb2FkX2RvY3MifSwgImRpc3R1dGlscy5zZXR1cF9rZXl3b3JkcyI6IHsiY29udmVydF8ydG8zX2RvY3Rlc3RzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiZGVwZW5kZW5jeV9saW5rcyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgImVhZ2VyX3Jlc291cmNlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgImVudHJ5X3BvaW50cyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzIiwgImV4Y2x1ZGVfcGFja2FnZV9kYXRhIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEiLCAiZXh0cmFzX3JlcXVpcmUiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2V4dHJhcyIsICJpbmNsdWRlX3BhY2thZ2VfZGF0YSI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wiLCAiaW5zdGFsbF9yZXF1aXJlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzIiwgIm5hbWVzcGFjZV9wYWNrYWdlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfbnNwIiwgInBhY2thZ2VfZGF0YSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhIiwgInBhY2thZ2VzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlcyIsICJweXRob25fcmVxdWlyZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3NwZWNpZmllciIsICJzZXR1cF9yZXF1aXJlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzIiwgInRlc3RfbG9hZGVyIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlIiwgInRlc3RfcnVubmVyIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlIiwgInRlc3Rfc3VpdGUiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUiLCAidGVzdHNfcmVxdWlyZSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzIiwgInVzZV8ydG8zIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbCIsICJ1c2VfMnRvM19leGNsdWRlX2ZpeGVycyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgInVzZV8ydG8zX2ZpeGVycyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgInppcF9zYWZlIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbCJ9LCAiZWdnX2luZm8ud3JpdGVycyI6IHsiUEtHLUlORk8iOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3BrZ19pbmZvIiwgImRlcGVuZGVuY3lfbGlua3MudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnIiwgImRlcGVuZHMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3YXJuX2RlcGVuZHNfb2Jzb2xldGUiLCAiZWFnZXJfcmVzb3VyY2VzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZyIsICJlbnRyeV9wb2ludHMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9lbnRyaWVzIiwgIm5hbWVzcGFjZV9wYWNrYWdlcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmciLCAicmVxdWlyZXMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9yZXF1aXJlbWVudHMiLCAidG9wX2xldmVsLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfdG9wbGV2ZWxfbmFtZXMifSwgInNldHVwdG9vbHMuaW5zdGFsbGF0aW9uIjogeyJlZ2dzZWN1dGFibGUiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDpib290c3RyYXAifX19LCAiZXh0cmFzIjogWyJjZXJ0cyIsICJzc2wiXSwgImdlbmVyYXRvciI6ICJiZGlzdF93aGVlbCAoMC4zMC4wKSIsICJrZXl3b3JkcyI6IFsiQ1BBTiIsICJQeVBJIiwgImRpc3R1dGlscyIsICJlZ2dzIiwgInBhY2thZ2UiLCAibWFuYWdlbWVudCJdLCAibWV0YWRhdGFfdmVyc2lvbiI6ICIyLjAiLCAibmFtZSI6ICJzZXR1cHRvb2xzIiwgInJlcXVpcmVzX3B5dGhvbiI6ICI+PTIuNywhPTMuMC4qLCE9My4xLiosIT0zLjIuKiIsICJydW5fcmVxdWlyZXMiOiBbeyJleHRyYSI6ICJjZXJ0cyIsICJyZXF1aXJlcyI6IFsiY2VydGlmaSAoPT0yMDE2LjkuMjYpIl19LCB7ImVudmlyb25tZW50IjogInN5c19wbGF0Zm9ybT09J3dpbjMyJyIsICJleHRyYSI6ICJzc2wiLCAicmVxdWlyZXMiOiBbIndpbmNlcnRzdG9yZSAoPT0wLjIpIl19XSwgInN1bW1hcnkiOiAiRWFzaWx5IGRvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMiLCAidmVyc2lvbiI6ICIzOC4yLjQifVBLAwQUAAAAAAAAACEAMFwBkSYAAAAmAAAAQQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby90b3BfbGV2ZWwudHh0ZWFzeV9pbnN0YWxsCnBrZ19yZXNvdXJjZXMKc2V0dXB0b29scwpQSwMEFAAAAAAAAAAhAJMG1zIBAAAAAQAAADwAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vemlwLXNhZmUKUEsDBBQAAAAAAAAAIQAjC0oDRBYAAEQWAAAuAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9fX2luaXRfXy5weSIiIkV4dGVuc2lvbnMgdG8gdGhlICdkaXN0dXRpbHMnIGZvciBsYXJnZSBvciBjb21wbGV4IGRpc3RyaWJ1dGlvbnMiIiIKCmltcG9ydCBvcwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2hjYXNlCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyLCBtYXAKCmltcG9ydCBzZXR1cHRvb2xzLnZlcnNpb24KZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCmZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIEZlYXR1cmUKZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKZnJvbSAuIGltcG9ydCBtb25rZXkKCl9fYWxsX18gPSBbCiAgICAnc2V0dXAnLCAnRGlzdHJpYnV0aW9uJywgJ0ZlYXR1cmUnLCAnQ29tbWFuZCcsICdFeHRlbnNpb24nLCAnUmVxdWlyZScsCiAgICAnZmluZF9wYWNrYWdlcycsCl0KCl9fdmVyc2lvbl9fID0gc2V0dXB0b29scy52ZXJzaW9uLl9fdmVyc2lvbl9fCgpib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKIyBJZiB3ZSBydW4gMnRvMyBvbiAucHkgZmlsZXMsIHNob3VsZCB3ZSBhbHNvIGNvbnZlcnQgZG9jc3RyaW5ncz8KIyBEZWZhdWx0OiB5ZXM7IGFzc3VtZSB0aGF0IHdlIGNhbiBkZXRlY3QgZG9jdGVzdHMgcmVsaWFibHkKcnVuXzJ0bzNfb25fZG9jdGVzdHMgPSBUcnVlCiMgU3RhbmRhcmQgcGFja2FnZSBuYW1lcyBmb3IgZml4ZXIgcGFja2FnZXMKbGliMnRvM19maXhlcl9wYWNrYWdlcyA9IFsnbGliMnRvMy5maXhlcyddCgoKY2xhc3MgUGFja2FnZUZpbmRlcihvYmplY3QpOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gYSBkaXJlY3RvcnkKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZpbmQoY2xzLCB3aGVyZT0nLicsIGV4Y2x1ZGU9KCksIGluY2x1ZGU9KCcqJywpKToKICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGRpcmVjdG9yeSAnd2hlcmUnCgogICAgICAgICd3aGVyZScgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IHdoaWNoIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHBhY2thZ2VzLiAgSXQKICAgICAgICBzaG91bGQgYmUgc3VwcGxpZWQgYXMgYSAiY3Jvc3MtcGxhdGZvcm0iIChpLmUuIFVSTC1zdHlsZSkgcGF0aDsgaXQgd2lsbAogICAgICAgIGJlIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYWwgcGF0aCBzeW50YXguCgogICAgICAgICdleGNsdWRlJyBpcyBhIHNlcXVlbmNlIG9mIHBhY2thZ2UgbmFtZXMgdG8gZXhjbHVkZTsgJyonIGNhbiBiZSB1c2VkCiAgICAgICAgYXMgYSB3aWxkY2FyZCBpbiB0aGUgbmFtZXMsIHN1Y2ggdGhhdCAnZm9vLionIHdpbGwgZXhjbHVkZSBhbGwKICAgICAgICBzdWJwYWNrYWdlcyBvZiAnZm9vJyAoYnV0IG5vdCAnZm9vJyBpdHNlbGYpLgoKICAgICAgICAnaW5jbHVkZScgaXMgYSBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGluY2x1ZGUuICBJZiBpdCdzCiAgICAgICAgc3BlY2lmaWVkLCBvbmx5IHRoZSBuYW1lZCBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLiAgSWYgaXQncyBub3QKICAgICAgICBzcGVjaWZpZWQsIGFsbCBmb3VuZCBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLiAgJ2luY2x1ZGUnIGNhbiBjb250YWluCiAgICAgICAgc2hlbGwgc3R5bGUgd2lsZGNhcmQgcGF0dGVybnMganVzdCBsaWtlICdleGNsdWRlJy4KICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIGxpc3QoY2xzLl9maW5kX3BhY2thZ2VzX2l0ZXIoCiAgICAgICAgICAgIGNvbnZlcnRfcGF0aCh3aGVyZSksCiAgICAgICAgICAgIGNscy5fYnVpbGRfZmlsdGVyKCdlel9zZXR1cCcsICcqX19weWNhY2hlX18nLCAqZXhjbHVkZSksCiAgICAgICAgICAgIGNscy5fYnVpbGRfZmlsdGVyKCppbmNsdWRlKSkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2ZpbmRfcGFja2FnZXNfaXRlcihjbHMsIHdoZXJlLCBleGNsdWRlLCBpbmNsdWRlKToKICAgICAgICAiIiIKICAgICAgICBBbGwgdGhlIHBhY2thZ2VzIGZvdW5kIGluICd3aGVyZScgdGhhdCBwYXNzIHRoZSAnaW5jbHVkZScgZmlsdGVyLCBidXQKICAgICAgICBub3QgdGhlICdleGNsdWRlJyBmaWx0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsod2hlcmUsIGZvbGxvd2xpbmtzPVRydWUpOgogICAgICAgICAgICAjIENvcHkgZGlycyB0byBpdGVyYXRlIG92ZXIgaXQsIHRoZW4gZW1wdHkgZGlycy4KICAgICAgICAgICAgYWxsX2RpcnMgPSBkaXJzWzpdCiAgICAgICAgICAgIGRpcnNbOl0gPSBbXQoKICAgICAgICAgICAgZm9yIGRpciBpbiBhbGxfZGlyczoKICAgICAgICAgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguam9pbihyb290LCBkaXIpCiAgICAgICAgICAgICAgICByZWxfcGF0aCA9IG9zLnBhdGgucmVscGF0aChmdWxsX3BhdGgsIHdoZXJlKQogICAgICAgICAgICAgICAgcGFja2FnZSA9IHJlbF9wYXRoLnJlcGxhY2Uob3MucGF0aC5zZXAsICcuJykKCiAgICAgICAgICAgICAgICAjIFNraXAgZGlyZWN0b3J5IHRyZWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBwYWNrYWdlcwogICAgICAgICAgICAgICAgaWYgKCcuJyBpbiBkaXIgb3Igbm90IGNscy5fbG9va3NfbGlrZV9wYWNrYWdlKGZ1bGxfcGF0aCkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTaG91bGQgdGhpcyBwYWNrYWdlIGJlIGluY2x1ZGVkPwogICAgICAgICAgICAgICAgaWYgaW5jbHVkZShwYWNrYWdlKSBhbmQgbm90IGV4Y2x1ZGUocGFja2FnZSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGFja2FnZQoKICAgICAgICAgICAgICAgICMgS2VlcCBzZWFyY2hpbmcgc3ViZGlyZWN0b3JpZXMsIGFzIHRoZXJlIG1heSBiZSBtb3JlIHBhY2thZ2VzCiAgICAgICAgICAgICAgICAjIGRvd24gdGhlcmUsIGV2ZW4gaWYgdGhlIHBhcmVudCB3YXMgZXhjbHVkZWQuCiAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChkaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb29rc19saWtlX3BhY2thZ2UocGF0aCk6CiAgICAgICAgIiIiRG9lcyBhIGRpcmVjdG9yeSBsb29rIGxpa2UgYSBwYWNrYWdlPyIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4ocGF0aCwgJ19faW5pdF9fLnB5JykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9idWlsZF9maWx0ZXIoKnBhdHRlcm5zKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIGxpc3Qgb2YgcGF0dGVybnMsIHJldHVybiBhIGNhbGxhYmxlIHRoYXQgd2lsbCBiZSB0cnVlIG9ubHkgaWYKICAgICAgICB0aGUgaW5wdXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhdHRlcm5zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsYW1iZGEgbmFtZTogYW55KGZubWF0Y2hjYXNlKG5hbWUsIHBhdD1wYXQpIGZvciBwYXQgaW4gcGF0dGVybnMpCgoKY2xhc3MgUEVQNDIwUGFja2FnZUZpbmRlcihQYWNrYWdlRmluZGVyKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9va3NfbGlrZV9wYWNrYWdlKHBhdGgpOgogICAgICAgIHJldHVybiBUcnVlCgoKZmluZF9wYWNrYWdlcyA9IFBhY2thZ2VGaW5kZXIuZmluZAoKCmRlZiBfaW5zdGFsbF9zZXR1cF9yZXF1aXJlcyhhdHRycyk6CiAgICAjIE5vdGU6IGRvIG5vdCB1c2UgYHNldHVwdG9vbHMuRGlzdHJpYnV0aW9uYCBkaXJlY3RseSwgYXMKICAgICMgb3VyIFBFUCA1MTcgYmFja2VuZCBwYXRjaCBgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uYC4KICAgIGRpc3QgPSBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24oZGljdCgKICAgICAgICAoaywgdikgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKQogICAgICAgIGlmIGsgaW4gKCdkZXBlbmRlbmN5X2xpbmtzJywgJ3NldHVwX3JlcXVpcmVzJykKICAgICkpCiAgICAjIEhvbm9yIHNldHVwLmNmZydzIG9wdGlvbnMuCiAgICBkaXN0LnBhcnNlX2NvbmZpZ19maWxlcyhpZ25vcmVfb3B0aW9uX2Vycm9ycz1UcnVlKQogICAgaWYgZGlzdC5zZXR1cF9yZXF1aXJlczoKICAgICAgICBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC5zZXR1cF9yZXF1aXJlcykKCgpkZWYgc2V0dXAoKiphdHRycyk6CiAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFueSByZXF1aXJlbWVudHMgbmVlZGVkIHRvIGludGVycHJldCAnYXR0cnMnLgogICAgX2luc3RhbGxfc2V0dXBfcmVxdWlyZXMoYXR0cnMpCiAgICByZXR1cm4gZGlzdHV0aWxzLmNvcmUuc2V0dXAoKiphdHRycykKCnNldHVwLl9fZG9jX18gPSBkaXN0dXRpbHMuY29yZS5zZXR1cC5fX2RvY19fCgoKX0NvbW1hbmQgPSBtb25rZXkuZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5Db21tYW5kKQoKCmNsYXNzIENvbW1hbmQoX0NvbW1hbmQpOgogICAgX19kb2NfXyA9IF9Db21tYW5kLl9fZG9jX18KCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCB0aGUgY29tbWFuZCBmb3IgZGlzdCwgdXBkYXRpbmcKICAgICAgICB2YXJzKHNlbGYpIHdpdGggYW55IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAiIiIKICAgICAgICBfQ29tbWFuZC5fX2luaXRfXyhzZWxmLCBkaXN0KQogICAgICAgIHZhcnMoc2VsZikudXBkYXRlKGt3KQoKICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCwgKiprdyk6CiAgICAgICAgY21kID0gX0NvbW1hbmQucmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQogICAgICAgIHZhcnMoY21kKS51cGRhdGUoa3cpCiAgICAgICAgcmV0dXJuIGNtZAoKCmRlZiBfZmluZF9hbGxfc2ltcGxlKHBhdGgpOgogICAgIiIiCiAgICBGaW5kIGFsbCBmaWxlcyB1bmRlciAncGF0aCcKICAgICIiIgogICAgcmVzdWx0cyA9ICgKICAgICAgICBvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZSkKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoLCBmb2xsb3dsaW5rcz1UcnVlKQogICAgICAgIGZvciBmaWxlIGluIGZpbGVzCiAgICApCiAgICByZXR1cm4gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCByZXN1bHRzKQoKCmRlZiBmaW5kYWxsKGRpcj1vcy5jdXJkaXIpOgogICAgIiIiCiAgICBGaW5kIGFsbCBmaWxlcyB1bmRlciAnZGlyJyBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIGZ1bGwgZmlsZW5hbWVzLgogICAgVW5sZXNzIGRpciBpcyAnLicsIHJldHVybiBmdWxsIGZpbGVuYW1lcyB3aXRoIGRpciBwcmVwZW5kZWQuCiAgICAiIiIKICAgIGZpbGVzID0gX2ZpbmRfYWxsX3NpbXBsZShkaXIpCiAgICBpZiBkaXIgPT0gb3MuY3VyZGlyOgogICAgICAgIG1ha2VfcmVsID0gZnVuY3Rvb2xzLnBhcnRpYWwob3MucGF0aC5yZWxwYXRoLCBzdGFydD1kaXIpCiAgICAgICAgZmlsZXMgPSBtYXAobWFrZV9yZWwsIGZpbGVzKQogICAgcmV0dXJuIGxpc3QoZmlsZXMpCgoKbW9ua2V5LnBhdGNoX2FsbCgpClBLAwQUAAAAAAAAACEApYdlUcAZAADAGQAAMgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5IiIiVXRpbGl0aWVzIGZvciBleHRyYWN0aW5nIGNvbW1vbiBhcmNoaXZlIGZvcm1hdHMiIiIKCmltcG9ydCB6aXBmaWxlCmltcG9ydCB0YXJmaWxlCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IGNvbnRleHRsaWIKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBlbnN1cmVfZGlyZWN0b3J5CgpfX2FsbF9fID0gWwogICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKICAgICJVbnJlY29nbml6ZWRGb3JtYXQiLCAiZXh0cmFjdGlvbl9kcml2ZXJzIiwgInVucGFja19kaXJlY3RvcnkiLApdCgoKY2xhc3MgVW5yZWNvZ25pemVkRm9ybWF0KERpc3R1dGlsc0Vycm9yKToKICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCgoKZGVmIGRlZmF1bHRfZmlsdGVyKHNyYywgZHN0KToKICAgICIiIlRoZSBkZWZhdWx0IHByb2dyZXNzL2ZpbHRlciBjYWxsYmFjazsgcmV0dXJucyBUcnVlIGZvciBhbGwgZmlsZXMiIiIKICAgIHJldHVybiBkc3QKCgpkZWYgdW5wYWNrX2FyY2hpdmUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIsCiAgICAgICAgZHJpdmVycz1Ob25lKToKICAgICIiIlVucGFjayBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAsIG9yIHJhaXNlIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAKCiAgICBgcHJvZ3Jlc3NfZmlsdGVyYCBpcyBhIGZ1bmN0aW9uIHRha2luZyB0d28gYXJndW1lbnRzOiBhIHNvdXJjZSBwYXRoCiAgICBpbnRlcm5hbCB0byB0aGUgYXJjaGl2ZSAoJy8nLXNlcGFyYXRlZCksIGFuZCBhIGZpbGVzeXN0ZW0gcGF0aCB3aGVyZSBpdAogICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCiAgICAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluKSwgb3IgZWxzZSBgYE5vbmVgYCB0byBza2lwCiAgICB0aGF0IGZpbGUgb3IgZGlyZWN0b3J5LiAgVGhlIGNhbGxiYWNrIGNhbiB0aHVzIGJlIHVzZWQgdG8gcmVwb3J0IG9uIHRoZQogICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKICAgIGFsdGVyIHRoZWlyIGV4dHJhY3Rpb24gcGF0aHMuCgogICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKICAgIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgZnVuY3Rpb24gKG1pbnVzIHRoZSBgZHJpdmVyc2AgYXJndW1lbnQpLCB0aGF0IHJhaXNlCiAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgZGVzaWduYXRlZAogICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKICAgIGRvZXMgbm90IHJhaXNlIGFuIGVycm9yLCBvciB1bnRpbCBhbGwgYXJlIGV4aGF1c3RlZCAoaW4gd2hpY2ggY2FzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpcyByYWlzZWQpLiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgYSBzZXF1ZW5jZSBvZgogICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAogICAgbWVhbnMgdGhhdCBgYHVucGFja196aXBmaWxlYGAgYW5kIGBgdW5wYWNrX3RhcmZpbGVgYCB3aWxsIGJlIHRyaWVkLCBpbiB0aGF0CiAgICBvcmRlci4KICAgICIiIgogICAgZm9yIGRyaXZlciBpbiBkcml2ZXJzIG9yIGV4dHJhY3Rpb25fZHJpdmVyczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKICAgICAgICBleGNlcHQgVW5yZWNvZ25pemVkRm9ybWF0OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCiAgICAgICAgICAgICJOb3QgYSByZWNvZ25pemVkIGFyY2hpdmUgdHlwZTogJXMiICUgZmlsZW5hbWUKICAgICAgICApCgoKZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiIlVucGFjayIgYSBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lIGludGVyZmFjZSBhcyBmb3IgYXJjaGl2ZXMKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQogICAgIiIiCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgZmlsZW5hbWUpCgogICAgcGF0aHMgPSB7CiAgICAgICAgZmlsZW5hbWU6ICgnJywgZXh0cmFjdF9kaXIpLAogICAgfQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZmlsZW5hbWUpOgogICAgICAgIHNyYywgZHN0ID0gcGF0aHNbYmFzZV0KICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZCldID0gc3JjICsgZCArICcvJywgb3MucGF0aC5qb2luKGRzdCwgZCkKICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGRzdCwgZikKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKHNyYyArIGYsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZmlsZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGJhc2UsIGYpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShmLCB0YXJnZXQpCiAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCgoKZGVmIHVucGFja196aXBmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB6aXBmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCgogICAgaWYgbm90IHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSB6aXAgZmlsZSIgJSAoZmlsZW5hbWUsKSkKCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkgYXMgejoKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCgogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lLnNwbGl0KCcvJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQogICAgICAgICAgICB0YXJnZXQgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgdGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBmaWxlCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgICAgIGRhdGEgPSB6LnJlYWQoaW5mby5maWxlbmFtZSkKICAgICAgICAgICAgICAgIHdpdGggb3Blbih0YXJnZXQsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICB1bml4X2F0dHJpYnV0ZXMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgaWYgdW5peF9hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0LCB1bml4X2F0dHJpYnV0ZXMpCgoKZGVmIHVucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB0YXIvdGFyLmd6L3Rhci5iejIgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB0YXJmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHRhcmZpbGUub3BlbigpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdGFyb2JqID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQogICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiJXMgaXMgbm90IGEgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdGFyIGZpbGUiICUgKGZpbGVuYW1lLCkKICAgICAgICApCiAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyh0YXJvYmopOgogICAgICAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQogICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZQogICAgICAgIGZvciBtZW1iZXIgaW4gdGFyb2JqOgogICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBhbmQgJy4uJyBub3QgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgcHJlbGltX2RzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKCiAgICAgICAgICAgICAgICAjIHJlc29sdmUgYW55IGxpbmtzIGFuZCB0byBleHRyYWN0IHRoZSBsaW5rIHRhcmdldHMgYXMgbm9ybWFsCiAgICAgICAgICAgICAgICAjIGZpbGVzCiAgICAgICAgICAgICAgICB3aGlsZSBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNsbmsoKSBvciBtZW1iZXIuaXNzeW0oKSk6CiAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBtZW1iZXIubGlua25hbWUKICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IHBvc2l4cGF0aC5kaXJuYW1lKG1lbWJlci5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5qb2luKGJhc2UsIGxpbmtwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aChsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSB0YXJvYmouX2dldG1lbWJlcihsaW5rcGF0aCkKCiAgICAgICAgICAgICAgICBpZiBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNmaWxlKCkgb3IgbWVtYmVyLmlzZGlyKCkpOgogICAgICAgICAgICAgICAgICAgIGZpbmFsX2RzdCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCBwcmVsaW1fZHN0KQogICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmluYWxfZHN0LmVuZHN3aXRoKG9zLnNlcCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBmaW5hbF9kc3RbOi0xXQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBVZ2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLCBmaW5hbF9kc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB0YXJmaWxlLkV4dHJhY3RFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hvd24vY2htb2QvbWtmaWZvL21rbm9kZS9tYWtlZGV2IGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBUcnVlCgoKZXh0cmFjdGlvbl9kcml2ZXJzID0gdW5wYWNrX2RpcmVjdG9yeSwgdW5wYWNrX3ppcGZpbGUsIHVucGFja190YXJmaWxlClBLAwQUAAAAAAAAACEAH+I9HCcWAAAnFgAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvYnVpbGRfbWV0YS5weSIiIkEgUEVQIDUxNyBpbnRlcmZhY2UgdG8gc2V0dXB0b29scwoKUHJldmlvdXNseSwgd2hlbiBhIHVzZXIgb3IgYSBjb21tYW5kIGxpbmUgdG9vbCAobGV0J3MgY2FsbCBpdCBhICJmcm9udGVuZCIpCm5lZWRlZCB0byBtYWtlIGEgcmVxdWVzdCBvZiBzZXR1cHRvb2xzIHRvIHRha2UgYSBjZXJ0YWluIGFjdGlvbiwgZm9yCmV4YW1wbGUsIGdlbmVyYXRpbmcgYSBsaXN0IG9mIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMsIHRoZSBmcm9udGVuZCB3b3VsZAp3b3VsZCBjYWxsICJzZXR1cC5weSBlZ2dfaW5mbyIgb3IgInNldHVwLnB5IGJkaXN0X3doZWVsIiBvbiB0aGUgY29tbWFuZCBsaW5lLgoKUEVQIDUxNyBkZWZpbmVzIGEgZGlmZmVyZW50IG1ldGhvZCBvZiBpbnRlcmZhY2luZyB3aXRoIHNldHVwdG9vbHMuIFJhdGhlcgp0aGFuIGNhbGxpbmcgInNldHVwLnB5IiBkaXJlY3RseSwgdGhlIGZyb250ZW5kIHNob3VsZDoKCiAgMS4gU2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IHdpdGggYSBzZXR1cC5weSBmaWxlCiAgMi4gSW1wb3J0IHRoaXMgbW9kdWxlIGludG8gYSBzYWZlIHB5dGhvbiBpbnRlcnByZXRlciAob25lIGluIHdoaWNoCiAgICAgc2V0dXB0b29scyBjYW4gcG90ZW50aWFsbHkgc2V0IGdsb2JhbCB2YXJpYWJsZXMgb3IgY3Jhc2ggaGFyZCkuCiAgMy4gQ2FsbCBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFBFUCA1MTcuCgpXaGF0IGVhY2ggZnVuY3Rpb24gZG9lcyBpcyBkZWZpbmVkIGluIFBFUCA1MTcuIEhvd2V2ZXIsIGhlcmUgaXMgYSAiY2FzdWFsIgpkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbnMgKHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBmb3IKYnVnIHJlcG9ydHMgb3IgQVBJIHN0YWJpbGl0eSk6CgogIC0gYGJ1aWxkX3doZWVsYDogYnVpbGQgYSB3aGVlbCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAogIC0gYHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsYDogZ2V0IHRoZSBgaW5zdGFsbF9yZXF1aXJlc2AKICAtIGBidWlsZF9zZGlzdGA6IGJ1aWxkIGFuIHNkaXN0IGluIHRoZSBmb2xkZXIgYW5kIHJldHVybiB0aGUgYmFzZW5hbWUKICAtIGBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0YDogZ2V0IHRoZSBgc2V0dXBfcmVxdWlyZXNgIHRvIGJ1aWxkCgpBZ2FpbiwgdGhpcyBpcyBub3QgYSBmb3JtYWwgZGVmaW5pdGlvbiEgSnVzdCBhICJ0YXN0ZSIgb2YgdGhlIG1vZHVsZS4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdG9rZW5pemUKaW1wb3J0IHNodXRpbAppbXBvcnQgY29udGV4dGxpYgoKaW1wb3J0IHNldHVwdG9vbHMKaW1wb3J0IGRpc3R1dGlscwoKCmNsYXNzIFNldHVwUmVxdWlyZW1lbnRzRXJyb3IoQmFzZUV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycyk6CiAgICAgICAgc2VsZi5zcGVjaWZpZXJzID0gc3BlY2lmaWVycwoKCmNsYXNzIERpc3RyaWJ1dGlvbihzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uKToKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHJhaXNlIFNldHVwUmVxdWlyZW1lbnRzRXJyb3Ioc3BlY2lmaWVycykKCiAgICBAY2xhc3NtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcGF0Y2goY2xzKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlCiAgICAgICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uIHdpdGggdGhpcyBjbGFzcwogICAgICAgIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBjb250ZXh0LgogICAgICAgICIiIgogICAgICAgIG9yaWcgPSBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24KICAgICAgICBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24gPSBjbHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gb3JpZwoKCmRlZiBfcnVuX3NldHVwKHNldHVwX3NjcmlwdD0nc2V0dXAucHknKToKICAgICMgTm90ZSB0aGF0IHdlIGNhbiByZXVzZSBvdXIgYnVpbGQgZGlyZWN0b3J5IGJldHdlZW4gY2FsbHMKICAgICMgQ29ycmVjdG5lc3MgY29tZXMgZmlyc3QsIHRoZW4gb3B0aW1pemF0aW9uIGxhdGVyCiAgICBfX2ZpbGVfXyA9IHNldHVwX3NjcmlwdAogICAgX19uYW1lX18gPSAnX19tYWluX18nCiAgICBmID0gZ2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKShfX2ZpbGVfXykKICAgIGNvZGUgPSBmLnJlYWQoKS5yZXBsYWNlKCdcXHJcXG4nLCAnXFxuJykKICAgIGYuY2xvc2UoKQogICAgZXhlYyhjb21waWxlKGNvZGUsIF9fZmlsZV9fLCAnZXhlYycpLCBsb2NhbHMoKSkKCgpkZWYgX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IGNvbmZpZ19zZXR0aW5ncyBvciB7fQogICAgY29uZmlnX3NldHRpbmdzLnNldGRlZmF1bHQoJy0tZ2xvYmFsLW9wdGlvbicsIFtdKQogICAgcmV0dXJuIGNvbmZpZ19zZXR0aW5ncwoKCmRlZiBfZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncyk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICByZXF1aXJlbWVudHMgPSBbJ3NldHVwdG9vbHMnLCAnd2hlZWwnXQoKICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydlZ2dfaW5mbyddICsgXAogICAgICAgIGNvbmZpZ19zZXR0aW5nc1siLS1nbG9iYWwtb3B0aW9uIl0KICAgIHRyeToKICAgICAgICB3aXRoIERpc3RyaWJ1dGlvbi5wYXRjaCgpOgogICAgICAgICAgICBfcnVuX3NldHVwKCkKICAgIGV4Y2VwdCBTZXR1cFJlcXVpcmVtZW50c0Vycm9yIGFzIGU6CiAgICAgICAgcmVxdWlyZW1lbnRzICs9IGUuc3BlY2lmaWVycwoKICAgIHJldHVybiByZXF1aXJlbWVudHMKCgpkZWYgX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoYV9kaXIpOgogICAgcmV0dXJuIFtuYW1lIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoYV9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGFfZGlyLCBuYW1lKSldCgoKZGVmIGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWwoY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgcmV0dXJuIF9nZXRfYnVpbGRfcmVxdWlyZXMoY29uZmlnX3NldHRpbmdzKQoKCmRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0KGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHJldHVybiBfZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncykKCgpkZWYgcHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWwobWV0YWRhdGFfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZGlzdF9pbmZvJywgJy0tZWdnLWJhc2UnLCBtZXRhZGF0YV9kaXJlY3RvcnldCiAgICBfcnVuX3NldHVwKCkKICAgIAogICAgZGlzdF9pbmZvX2RpcmVjdG9yeSA9IG1ldGFkYXRhX2RpcmVjdG9yeQogICAgd2hpbGUgVHJ1ZTogICAgCiAgICAgICAgZGlzdF9pbmZvcyA9IFtmIGZvciBmIGluIG9zLmxpc3RkaXIoZGlzdF9pbmZvX2RpcmVjdG9yeSkKICAgICAgICAgICAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoJy5kaXN0LWluZm8nKV0KCiAgICAgICAgaWYgbGVuKGRpc3RfaW5mb3MpID09IDAgYW5kIFwKICAgICAgICAgICAgICAgIGxlbihfZ2V0X2ltbWVkaWF0ZV9zdWJkaXJlY3RvcmllcyhkaXN0X2luZm9fZGlyZWN0b3J5KSkgPT0gMToKICAgICAgICAgICAgZGlzdF9pbmZvX2RpcmVjdG9yeSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnksIG9zLmxpc3RkaXIoZGlzdF9pbmZvX2RpcmVjdG9yeSlbMF0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGFzc2VydCBsZW4oZGlzdF9pbmZvcykgPT0gMQogICAgICAgIGJyZWFrCgogICAgIyBQRVAgNTE3IHJlcXVpcmVzIHRoYXQgdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5IGJlIHBsYWNlZCBpbiB0aGUKICAgICMgbWV0YWRhdGFfZGlyZWN0b3J5LiBUbyBjb21wbHksIHdlIE1VU1QgY29weSB0aGUgZGlyZWN0b3J5IHRvIHRoZSByb290CiAgICBpZiBkaXN0X2luZm9fZGlyZWN0b3J5ICE9IG1ldGFkYXRhX2RpcmVjdG9yeToKICAgICAgICBzaHV0aWwubW92ZSgKICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3RfaW5mb19kaXJlY3RvcnksIGRpc3RfaW5mb3NbMF0pLAogICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3RvcnkpCiAgICAgICAgc2h1dGlsLnJtdHJlZShkaXN0X2luZm9fZGlyZWN0b3J5LCBpZ25vcmVfZXJyb3JzPVRydWUpCgogICAgcmV0dXJuIGRpc3RfaW5mb3NbMF0KCgpkZWYgYnVpbGRfd2hlZWwod2hlZWxfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSwKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2RpcmVjdG9yeT1Ob25lKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHdoZWVsX2RpcmVjdG9yeSA9IG9zLnBhdGguYWJzcGF0aCh3aGVlbF9kaXJlY3RvcnkpCiAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnYmRpc3Rfd2hlZWwnXSArIFwKICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdCiAgICBfcnVuX3NldHVwKCkKICAgIGlmIHdoZWVsX2RpcmVjdG9yeSAhPSAnZGlzdCc6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh3aGVlbF9kaXJlY3RvcnkpCiAgICAgICAgc2h1dGlsLmNvcHl0cmVlKCdkaXN0Jywgd2hlZWxfZGlyZWN0b3J5KQoKICAgIHdoZWVscyA9IFtmIGZvciBmIGluIG9zLmxpc3RkaXIod2hlZWxfZGlyZWN0b3J5KQogICAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoJy53aGwnKV0KCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQog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7IM9tCtBAAB0GWi0K0EA6BU4AABZhcB0Cv91CP8VtCtBAFnoTzcAAGhg4UAAaEjhQADoof///1lZhcB1Qmh4WUAA6M02AAC4QOFAAMcEJEThQADoY////4M9uCtBAABZdBtouCtBAOi9NwAAWYXAdAxqAGoCagD/FbgrQQAzwF3DahhoEPVAAOi8FAAAagjoDhwAAFmDZfwAM9tDOR04IEEAD4TFAAAAiR00IEEAikUQojAgQQCDfQwAD4WdAAAA/zWsK0EA6AAsAABZi/iJfdiF/3R4/zWoK0EA6OsrAABZi/CJddyJfeSJdeCD7gSJddw793JX6McrAAA5BnTtO/dySv826MErAACL+OixKwAAiQb/1/81rCtBAOirKwAAi/j/NagrQQDonisAAIPEDDl95HUFOUXgdA6JfeSJfdiJReCL8Il13It92OufaHDhQAC4ZOFAAOhf/v//WWh44UAAuHThQADoT/7//1nHRfz+////6B8AAACDfRAAdSiJHTggQQBqCOg8GgAAWf91COj8/f//M9tDg30QAHQIagjoIxoAAFnD6OITAADDi/9Vi+xqAGoA/3UI6MP+//+DxAxdw4v/VYvsagBqAf91COit/v//g8QMXcNqAWoAagDonf7//4PEDMNqAWoBagDojv7//4PEDMOL/1bowyoAAIvwVugpOwAAVui0OgAAVuhLEQAAVuiZOgAAVuiEOgAAVuhsOAAAVugFNwAAVujuNgAAaOojQADoFSoAAIPEJKOIEkEAXsOL/1WL7IM9RCBBAAJ0BehcMwAA/3UI6KkxAABo/wAAAOgn/f//WVldw2oUaDD1QADozxIAALhNWgAAZjkFAABAAHU4oTwAQACBuAAAQABQRQAAdSe5CwEAAGY5iBgAQAB1GYO4dABAAA52EDPJOYjoAEAAD5XBiU3k6wSDZeQAagHoVj8AAFmFwHUIahzobv///1nogy0AAIXAdQhqEOhd////Weg9NAAAg2X8AOjhDQAAhcB9CGob6Dv8//9Z/xUw4EAAo6ArQQDo1z0AAKM8IEEA6BI9AACFwH0IagjoFfz//1noiToAAIXAfQhqCegE/P//WWoB6Lv8//9ZhcB0B1Do8fv//1mhGCBBAKMcIEEAUP81ECBBAP81DCBBAOgg8v//g8QMiUXgg33kAHUGUOgy/v//6Fn+///rLotF7IsIiwmJTdxQUeieNQAAWVnDi2Xoi0XciUXgg33kAHUGUOgY/v//6Dj+///HRfz+////i0Xg6M8RAADD6Iw+AADppP7//4v/VYvsVot1CFboUw8AAFDoCD8AAFlZhcB0fOjQ8v//g8AgO/B1BDPA6w/owPL//4PAQDvwdWAzwED/BQQgQQD3RgwMAQAAdU5TV408hUggQQCDPwC7ABAAAHUgU+gJEwAAWYkHhcB1E41GFGoCiUYIiQZYiUYYiUYE6w2LP4l+CIk+iV4YiV4EgU4MAhEAADPAX0Bb6wIzwF5dw4v/VYvsg30IAHQnVot1DPdGDAAQAAB0GVboDxUAAIFmDP/u//+DZhgAgyYAg2YIAFleXcP2QQxAdAaDeQgAdCT/SQR4C4sRiAL/AQ+2wOsMD77AUVDo5S0AAFlZg/j/dQMJBsP/BsOL/1WL7FaL8OsTi00QikUI/00M6LX///+DPv90BoN9DAB/515dw4v/VYvs9kcMQFNWi/CL2XQyg38IAHUsi0UIAQbrK4oD/00Ii8/off///0ODPv91E+jVDwAAgzgqdQ+Lz7A/6GT///+DfQgAf9VeW13Di/9Vi+yB7HgCAAChgBJBADPFiUX8U4tdDFaLdQgzwFeLfRT/dRCNjaT9//+JtbT9//+Jvdz9//+Jhbj9//+JhfD9//+Jhcz9//+Jhej9//+JhdD9//+JhcD9//+Jhcj9///oI/f//4X2dTXoTQ8AAMcAFgAAADPAUFBQUFDo0w4AAIPEFIC9sP3//wB0CouFrP3//4NgcP2DyP/pyAoAAPZGDEB1XlboQA0AAFm6mBJBAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1oCpBAOsCi8r2QSR/dZGD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gKkEA6wKLwvZAJIAPhWf///8zyTvZD4Rd////ihOJjdj9//+JjeD9//+Jjbz9//+Ile/9//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySF3zJAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+ikPAAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Oc6AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DoXjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///o1zcAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6B4LAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoPSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgOIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo6R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+iANwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbogTUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gECAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF2P3//4tN/F9eM81b6Abs///Jw5DqKkAA6yhAABspQAB5KUAAxSlAANApQAAWKkAARCtAAGpUaFD1QADoZQQAADP/iX38jUWcUP8VQOBAAMdF/P7///9qQGogXlbodQYAAFlZO8cPhBQCAACjoCpBAIk1kCpBAI2IAAgAAOswxkAEAIMI/8ZABQqJeAjGQCQAxkAlCsZAJgqJeDjGQDQAg8BAiw2gKkEAgcEACAAAO8FyzGY5fc4PhAoBAACLRdA7xw+E/wAAAIs4jVgEjQQ7iUXkvgAIAAA7/nwCi/7HReABAAAA61tqQGog6OcFAABZ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AOirvP//g8QU6UMGAAD2QAQgdBFqAmoAagD/dQjoYxkAAIPEEP91COjW6v//WYXAD4SdAgAAiwb2RAcEgA+EkAIAAOjr1v//i0BsM8k5SBSNhRzl//8PlMFQiwb/NAeJjSDl////FeDgQACFwA+EYAIAADPJOY0g5f//dAiE2w+EUAIAAP8V3OBAAIudNOX//4mFHOX//zPAiYU85f//OUUQD4ZCBQAAiYVE5f//ioUn5f//hMAPhWcBAACKC4u1KOX//zPAgPkKD5TAiYUg5f//iwYDx4N4OAB0FYpQNIhV9IhN9YNgOABqAo1F9FDrSw++wVDo1+z//1mFwHQ6i4005f//K8sDTRAzwEA7yA+GpQEAAGoCjYVA5f//U1DoPCgAAIPEDIP4/w+EsQQAAEP/hUTl///rG2oBU42FQOX//1DoGCgAAIPEDIP4/w+EjQQAADPAUFBqBY1N9FFqAY2NQOX//1FQ/7Uc5f//Q/+FROX///8VsOBAAIvwhfYPhFwEAABqAI2FPOX//1BWjUX0UIuFKOX//4sA/zQH/xWY4EAAhcAPhCkEAACLhUTl//+LjTDl//8DwTm1POX//4mFOOX//w+MFQQAAIO9IOX//wAPhM0AAABqAI2FPOX//1BqAY1F9FCLhSjl//+LAMZF9A3/NAf/FZjgQACFwA+E0AMAAIO9POX//wEPjM8DAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8lmg/4KD5TBQ0ODhUTl//8CibVA5f//iY0g5f//PAF0BDwCdVL/tUDl///oJSUAAFlmO4VA5f//D4VoAwAAg4U45f//AoO9IOX//wB0KWoNWFCJhUDl///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOgWt///xwAJAAAA6B63//+JMOs//7VA5f//6CK3//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTo1rb//8cAHAAAAOjetv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXuhonv//ycNqEGjo90AA6Oi2//+LRQiD+P51G+iitv//gyAA6Ie2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6Hm2//+JOOhftv//xwAJAAAAV1dXV1fo57X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM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6MCS//+DxAz/dfhX/3UU/3X0/3UM/3UI/9aJRfg7w3UEM/brJf91HI1F+P91GFBX/3Ug/3Xs6I0fAACL8Il18IPEGPfeG/YjdfhX6I38//9Z6xr/dRz/dRj/dRT/dRD/dQz/dQj/FejgQACL8Dld9HQJ/3X06Pix//9Zi0XwO8N0DDlFGHQHUOjlsf//WYvGjWXgX15bi038M83oJ5b//8nDi/9Vi+yD7BD/dQiNTfDoIZb///91KI1N8P91JP91IP91HP91GP91FP91EP91DOgo/P//g8QggH38AHQHi034g2Fw/cnDi/9Vi+xRUaGAEkEAM8WJRfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPo3pD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bo5q///1mLx41l7F9eW4tN/DPN6CiU///Jw4v/VYvsg+wQ/3UIjU3w6CKU////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Hav////dgjobq////92DOhmr////3YQ6F6v////dhToVq////92GOhOr////zboR6////92IOg/r////3Yk6Dev////dijoL6////92LOgnr////3Yw6B+v////djToF6////92HOgPr////3Y46Aev////djzo/67//4PEQP92QOj0rv///3ZE6Oyu////dkjo5K7///92TOjcrv///3ZQ6NSu////dlTozK7///92WOjErv///3Zc6Lyu////dmDotK7///92ZOisrv///3Zo6KSu////dmzonK7///92cOiUrv///3Z06Iyu////dnjohK7///92fOh8rv//g8RA/7aAAAAA6G6u////toQAAADoY67///+2iAAAAOhYrv///7aMAAAA6E2u////tpAAAADoQq7///+2lAAAAOg3rv///7aYAAAA6Cyu////tpwAAADoIa7///+2oAAAAOgWrv///7akAAAA6Auu////tqgAAADoAK7//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOjdrf//WYtGBDsFTB1BAHQHUOjLrf//WYt2CDs1UB1BAHQHVui5rf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1Dol63//1mLRhA7BVgdQQB0B1Doha3//1mLRhQ7BVwdQQB0B1Doc63//1mLRhg7BWAdQQB0B1DoYa3//1mLRhw7BWQdQQB0B1DoT63//1mLRiA7BWgdQQB0B1DoPa3//1mLdiQ7NWwdQQB0B1boK63//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvooan//2oWXokwU1NTU1PoKqn//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOhaqf//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvxi3UIg8n/jUkAg8EBigYKwHQJg8YBD6MEJHPui8GDxCBeycOL/1WL7FNWi3UIM9tXOV0UdRA783UQOV0MdRIzwF9eW13DO/N0B4t9DDv7dxvozKj//2oWXokwU1NTU1PoVaj//4PEFIvG69U5XRR1BIge68qLVRA703UEiB7r0YN9FP+LxnUPigqICEBCOst0Hk918+sZigqICEBCOst0CE90Bf9NFHXuOV0UdQKIGDv7dYuDfRT/dQ+LRQxqUIhcBv9Y6Xj///+IHuhSqP//aiJZiQiL8euCi/9Vi+yLTQhTM9tWVzvLdAeLfQw7+3cb6Cyo//9qFl6JMFNTU1NT6LWn//+DxBSLxuswi3UQO/N1BIgZ69qL0YoGiAJCRjrD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FfzgQACFwHUFg8j/6wqNRfRQ6GADAABZi038M83oAXf//8nDi/9Vi+yD7DShgBJBADPFiUX8i0UQi00YiUXYi0UUU4lF0IsAVolF3ItFCFcz/4lNzIl94Il91DtFDA+EXwEAAIs1aOBAAI1N6FFQ/9aLHezgQACFwHReg33oAXVYjUXoUP91DP/WhcB0S4N96AF1RYt13MdF1AEAAACD/v91DP912Ogmvf//i/BZRjv3fluB/vD//393U41ENgg9AAQAAHcv6BYBAACLxDvHdDjHAMzMAADrLVdX/3Xc/3XYagH/dQj/04vwO/d1wzPA6dEAAABQ6HjB//9ZO8d0CccA3d0AAIPACIlF5OsDiX3kOX3kdNiNBDZQV/915Oj+cf//g8QMVv915P913P912GoB/3UI/9OFwHR/i13MO990HVdX/3UcU1b/deRX/3UM/xWw4EAAhcB0YIld4Otbix2w4EAAOX3UdRRXV1dXVv915Ff/dQz/04vwO/d0PFZqAehckP//WVmJReA7x3QrV1dWUFb/deRX/3UM/9M7x3UO/3Xg6CWR//9ZiX3g6wuDfdz/dAWLTdCJAf915Oh32///WYtF4I1lwF9eW4tN/DPN6E11///Jw8zMzMzMzMzMzFGNTCQIK8iD4Q8DwRvJC8FZ6dr5//9RjUwkCCvIg+EHA8EbyQvBWenE+f//VYvsg+wIiX38iXX4i3UMi30Ii00QwekH6waNmwAAAABmD28GZg9vThBmD29WIGYPb14wZg9/B2YPf08QZg9/VyBmD39fMGYPb2ZAZg9vblBmD292YGYPb35wZg9/Z0BmD39vUGYPf3dgZg9/f3CNtoAAAACNv4AAAABJdaOLdfiLffyL5V3DVYvsg+wciX30iXX4iV38i10Mi8OZi8iLRQgzyivKg+EPM8orypmL+DP6K/qD5w8z+iv6i9EL13VKi3UQi86D4X+JTeg78XQTK/FWU1DoJ////4PEDItFCItN6IXJdHeLXRCLVQwD0yvRiVXsA9gr2Yld8It17It98ItN6POki0UI61M7z3U199mDwRCJTeSLdQyLfQiLTeTzpItNCANN5ItVDANV5ItFECtF5FBSUehM////g8QMi0UI6xqLdQyLfQiLTRCL0cHpAvOli8qD4QPzpItFCItd/It1+It99IvlXcOL/1WL7GoKagD/dQjo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BgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAACoIUEAACJBAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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TW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAANA3AAAgaQAAEJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1xhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAzP///wAAAAD+////qSVAAL0lQAAAAAAA/v///wAAAACM////AAAAAP7///88NUAAQDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADjOkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAALE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOz1AAAAAAAAAAAAABz1AAP7///8AAAAA1P///wAAAAD+////AAAAAMA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8z9AAAAAAAD+////AAAAANT///8AAAAA/v///x1BQAA5QUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAC1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+0pAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABrTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAK1QQAD+////AAAAALxQQAD+////AAAAANj///8AAAAA/v///wAAAABvUkAA/v///wAAAAB7UkAA/v///wAAAADU////AAAAAP7///8AAAAANVlAAAAAAAD+////AAAAANj///8AAAAA/v///9taQADvWkAAAAAAAP7///8AAAAA2P///wAAAAD+////LVtAADFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAiF5AAAAAAAD+////AAAAAND///8AAAAA/v///xhfQAAvX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAClqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAOmxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAA+eUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAL4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAklUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL2XQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAVKFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADLpUAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGnQAAAAAAAAAAAAM2mQAD+////AAAAAND///8AAAAA/v///wAAAABMrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAC8pAAFT5AAAAAAAAAAAAAA4AAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACU+gAAsPoAAMb6AADc+gAA7voAAAb7AAAc+wAANPsAAEz7AABg+wAAaPsAAHr7AACI+wAAmvsAAKz7AAC8+wAAyvsAANz7AAD0+wAACPwAABz8AAA4/AAAVvwAAGr8AAB6/AAAhvwAAJL8AACe/AAAtvwAAM78AADY/AAA5PwAAPb8AAAE/QAAEP0AAB79AAAo/QAAOP0AAE79AABa/QAAav0AAJL9AACs/QAAxP0AAN79AAD0/QAADv4AABz+AAAq/gAARP4AAFT+AABq/gAAhP4AAJD+AACe/gAArv4AAL7+AADQ/gAA5P4AAPT+AAAK/wAAGv8AACz/AAA+/wAAUP8AAGL/AABu/wAAfP8AAIz/AACi/wAAsv8AAML/AADQ/wAA4v8AAPT/AAAcAAEAKAABADgAAQBKAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAQAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAA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ZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAAAAAAAAcnVudGltZSBlcnJvciAAAA0KAAAAAAAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAA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cmVzcwAABgFFeGl0UHJvY2VzcwBxAUdldENvbW1hbmRMaW5lQQCeA1J0bFVud2luZEV4APQDU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADZAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAMAARGVsZXRlQ3JpdGljYWxTZWN0aW9uADsEVGVybWluYXRlUHJvY2VzcwAAqwFHZXRDdXJyZW50UHJvY2VzcwBMBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRlQ29uc29sZUEAmwFHZXRDb25zb2xlT3V0cHV0Q1AAAJoEV3JpdGVDb25zb2xlVwAKBFNldFN0ZEhhbmRsZQAAegBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADdA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAaANSZWFkRmlsZQAA2gNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMsBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgRQFAAQAAAAAAAAAAAAAA4EUBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyot8tmSsAAM1dINJm1P//TCkAQAEAAAABAAAAAAAAAAD0AEABAAAA8PMAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAg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8P3//4m1yP3//+l2CQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FVwkAAION8P3//wjpSwkAAION8P3//wTpPwkAAION8P3//wHpMwkAAIGN8P3//4AAAADpJAkAAION8P3//wLpGAkAAID6KnUsg8cEib3c/f//i3/8O/6Jvcz9//8PjfkIAACDjfD9//8E953M/f//6ecIAACLhcz9//9rwAoPvsqNRAjQiYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6KQ8AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1Do5zoAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOheOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+jXNwAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboHgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOg9IAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6A4gAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjpHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6IA3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//xgEwQOs+SWY5MHQGQEA7znX0K4Xk/f//0fjrKDv+dQuhkBJBAImF5P3//4uF5P3//+sHSYA4AHQFQDvOdfUrheT9//+JheD9//+DvcD9//8AD4VcAQAAi4Xw/f//qEB0MqkAAQAAdAnGhdT9//8t6xioAXQJxoXU/f//K+sLqAJ0EcaF1P3//yDHhdD9//8BAAAAi53M/f//K53g/f//K53Q/f//9oXw/f//DHUX/7W0/f//jYXY/f//U2og6HD1//+DxAz/tdD9//+LvbT9//+Nhdj9//+NjdT9///odvX///aF8P3//whZdBv2hfD9//8EdRJXU2owjYXY/f//6C71//+DxAyDvcj9//8Ai4Xg/f//dGaFwH5ii7Xk/f//iYWg/f//D7cG/42g/f//UGoGjUX0UI2FmP3//0ZQRuiBNQAAg8QQhcB1KDmFmP3//3Qg/7WY/f//jYXY/f//jU306PH0//+DvaD9//8AWXW16xyDjdj9////6xOLjeT9//9QjYXY/f//6Mr0//9Zg73Y/f//AHwb9oXw/f//BHQSV1NqII2F2P3//+iC9P//g8QMg728/f//AHQT/7W8/f//6AQIAACDpbz9//8AWYudxP3//4oDiIXv/f//hMB0E4uNlP3//4u93P3//4rQ6eH1//+AvbD9//8AdAqLhaz9//+DYHD9i4XY/f//i038X14zzVvoBuz//8nDkOoqQADrKEAAGylAAHkpQADFKUAA0ClAABYqQABEK0AAalRoUPVAAOhlBAAAM/+JffyNRZxQ/xVA4EAAx0X8/v///2pAaiBeVuh1BgAAWVk7xw+EFAIAAKOgKkEAiTWQKkEAjYgACAAA6zDGQAQAgwj/xkAFCol4CMZAJADGQCUKxkAmCol4OMZANACDwECLDaAqQQCBwQAIAAA7wXLMZjl9zg+ECgEAAItF0DvHD4T/AAAAiziNWASN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GQAAah7oAhgAAGj/AAAA6IDj//9ZWYt1CI009UgUQQA5HnQEi8frbmoY6An7//9Zi/g7+3UP6MX4///HAAwAAAAzwOtRagroWQAAAFmJXfw5HnUsaKAPAABX6HQgAABZWYXAdRdX6P77//9Z6I/4///HAAwAAACJXeTrC4k+6wdX6OP7//9Zx0X8/v///+gJAAAAi0Xk6Pb4///DagroKP///1nDi/9Vi+yLRQhWjTTFSBRBAIM+AHUTUOgi////WYXAdQhqEeh04v//Wf82/xUY4EAAXl3Dagxo+PVAAOho+P//i00IM/87z3YuauBYM9L38TtFDBvAQHUf6P/3///HAAwAAABXV1dXV+iH9///g8QUM8Dp1QAAAA+vTQyL8Yl1CDv3dQMz9kYz24ld5IP+4Hdpgz2EKkEAA3VLg8YPg+bwiXUMi0UIOwVwKkEAdzdqBOhM////WYl9/P91COjoNQAAWYlF5MdF/P7////oXwAAAItd5DvfdBH/dQhXU+g22///g8QMO991YVZqCP81dClBAP8VZOBAAIvYO991TDk9gClBAHQzVuiSHwAAWYXAD4Vy////i0UQO8cPhFD////HAAwAAADpRf///zP/i3UMagTo8P3//1nDO991DYtFEDvHdAbHAAwAAACLw+ic9///w1WL7IPsBIl9/It9CItNDMHpB2YP78DrCI2kJAAAAACQZg9/B2YPf0cQZg9/RyBmD39HMGYPf0dAZg9/R1BmD39HYGYPf0dwjb+AAAAASXXQi338i+Vdw1WL7IPsEIl9/ItFCJmL+DP6K/qD5w8z+iv6hf91PItNEIvRg+J/iVX0O8p0EivKUVDoc////4PECItFCItV9IXSdEUDRRArwolF+DPAi334i03086qLRQjrLvffg8cQiX3wM8CLfQiLTfDzqotF8ItNCItVEAPIK9BSagBR6H7///+DxAyLRQiLffyL5V3DagxoGPZAAOhk9v//g2X8AGYPKMHHReQBAAAA6yOLReyLAIsAPQUAAMB0Cj0dAADAdAMzwMMzwEDDi2Xog2XkAMdF/P7///+LReToZvb//8OL/1WL7IPsGDPAU4lF/IlF9IlF+FOcWIvINQAAIABQnZxaK9F0H1GdM8APoolF9Ild6IlV7IlN8LgBAAAAD6KJVfyJRfhb90X8AAAABHQO6Fz///+FwHQF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MItNEPfR9sEBdSboP73//zP2iTDoI73//1ZWVlZWxwAWAAAA6Ku8//+DxBTpQwYAAPZABCB0EWoCagBqAP91COhjGQAAg8QQ/3UI6Nbq//9ZhcAPhJ0CAACLBvZEBwSAD4SQAgAA6OvW//+LQGwzyTlIFI2FHOX//w+UwVCLBv80B4mNIOX///8V4OBAAIXAD4RgAgAAM8k5jSDl//90CITbD4RQAgAA/xXc4EAAi5005f//iYUc5f//M8CJhTzl//85RRAPhkIFAACJhUTl//+KhSfl//+EwA+FZwEAAIoLi7Uo5f//M8CA+QoPlMCJhSDl//+LBgPHg3g4AHQVilA0iFX0iE31g2A4AGoCjUX0UOtLD77BUOjX7P//WYXAdDqLjTTl//8rywNNEDPAQDvID4alAQAAagKNhUDl//9TUOg8KAAAg8QMg/j/D4SxBAAAQ/+FROX//+sbagFTjYVA5f//UOgYKAAAg8QMg/j/D4SNBAAAM8BQUGoFjU30UWoBjY1A5f//UVD/tRzl//9D/4VE5f///xWw4EAAi/CF9g+EXAQAAGoAjYU85f//UFaNRfRQi4Uo5f//iwD/NAf/FZjgQACFwA+EKQQAAIuFROX//4uNMOX//wPBObU85f//iYU45f//D4wVBAAAg70g5f//AA+EzQAAAGoAjYU85f//UGoBjUX0UIuFKOX//4sAxkX0Df80B/8VmOBAAIXAD4TQAwAAg7085f//AQ+MzwMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyWaD/goPlMFDQ4OFROX//wKJtUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6Ba3///HAAkAAADoHrf//4kw6z//tUDl///oIrf//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOjWtv//xwAcAAAA6N62//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Gie///Jw2oQaOj3QADo6Lb//4tFCIP4/nUb6KK2//+DIADoh7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoebb//4k46F+2///HAAkAAABXV1dXV+jntf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosL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UOg04v//WTvDdAnHAN3dAACDwAiL+OsCM/87+3S0/3X4U1fowJL//4PEDP91+Ff/dRT/dfT/dQz/dQj/1olF+DvDdQQz9usl/3UcjUX4/3UYUFf/dSD/dezojR8AAIvwiXXwg8QY994b9iN1+Ffojfz//1nrGv91HP91GP91FP91EP91DP91CP8V6OBAAIvwOV30dAn/dfTo+LH//1mLRfA7w3QMOUUYdAdQ6OWx//9Zi8aNZeBfXluLTfwzzegnlv//ycOL/1WL7IPsEP91CI1N8Oghlv///3UojU3w/3Uk/3Ug/3Uc/3UY/3UU/3UQ/3UM6Cj8//+DxCCAffwAdAeLTfiDYXD9ycOL/1WL7FFRoYASQQAzxYlF/KGIKUEAU1Yz21eL+TvDdTqNRfhQM/ZGVmhk6kAAVv8V+OBAAIXAdAiJNYgpQQDrNP8VXOBAAIP4eHUKagJYo4gpQQDrBaGIKUEAg/gCD4TPAAAAO8MPhMcAAACD+AEPhegAAACJXfg5XRh1CIsHi0AEiUUYizXs4EAAM8A5XSBTU/91EA+VwP91DI0ExQEAAABQ/3UY/9aL+Dv7D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+jekP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVujmr///WYvHjWXsX15bi038M83oKJT//8nDi/9Vi+yD7BD/dQiNTfDoIpT///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgTodq////92COhur////3YM6Gav////dhDoXq////92FOhWr////3YY6E6v////NuhHr////3Yg6D+v////diToN6////92KOgvr////3Ys6Cev////djDoH6////92NOgXr////3Yc6A+v////djjoB6////92POj/rv//g8RA/3ZA6PSu////dkTo7K7///92SOjkrv///3ZM6Nyu////dlDo1K7///92VOjMrv///3ZY6MSu////dlzovK7///92YOi0rv///3Zk6Kyu////dmjopK7///92bOicrv///3Zw6JSu////dnTojK7///92eOiErv///3Z86Hyu//+DxED/toAAAADobq7///+2hAAAAOhjrv///7aIAAAA6Fiu////towAAADoTa7///+2kAAAAOhCrv///7aUAAAA6Deu////tpgAAADoLK7///+2nAAAAOghrv///7agAAAA6Bau////tqQAAADoC67///+2qAAAAOgArv//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6N2t//9Zi0YEOwVMHUEAdAdQ6Mut//9Zi3YIOzVQHUEAdAdW6Lmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOiXrf//WYtGEDsFWB1BAHQHUOiFrf//WYtGFDsFXB1BAHQHUOhzrf//WYtGGDsFYB1BAHQHUOhhrf//WYtGHDsFZB1BAHQHUOhPrf//WYtGIDsFaB1BAHQHUOg9rf//WYt2JDs1bB1BAHQHVugrrf//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+ihqf//ahZeiTBTU1NTU+gqqf//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Fqp//9qIlmJCIvx67UzwF9eW13DzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiDyf+NSQCDwQGKBgrAdAmDxgEPowQkc+6LwYPEIF7Jw4v/VYvsU1aLdQgz21c5XRR1EDvzdRA5XQx1EjPAX15bXcM783QHi30MO/t3G+jMqP//ahZeiTBTU1NTU+hVqP//g8QUi8br1TldFHUEiB7ryotVEDvTdQSIHuvRg30U/4vGdQ+KCogIQEI6y3QeT3Xz6xmKCogIQEI6y3QIT3QF/00Ude45XRR1AogYO/t1i4N9FP91D4tFDGpQiFwG/1jpeP///4ge6FKo//9qIlmJCIvx64KL/1WL7ItNCFMz21ZXO8t0B4t9DDv7dxvoLKj//2oWXokwU1NT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bAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFt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ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAA0DcAACBpAAAQmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADXGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAADM////AAAAAP7///+pJUAAvSVAAAAAAAD+////AAAAAIz///8AAAAA/v///zw1QABANUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOM6QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAsTtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAA7PUAAAAAAAAAAAAAHPUAA/v///wAAAADU////AAAAAP7///8AAAAAwD5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADzP0AAAAAAAP7///8AAAAA1P///wAAAAD+////HUFAADlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAALUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAD7SkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAGtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAArVBAAP7///8AAAAAvFBAAP7///8AAAAA2P///wAAAAD+////AAAAAG9SQAD+////AAAAAHtSQAD+////AAAAANT///8AAAAA/v///wAAAAA1WUAAAAAAAP7///8AAAAA2P///wAAAAD+////21pAAO9aQAAAAAAA/v///wAAAADY////AAAAAP7///8tW0AAMVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAACIXkAAAAAAAP7///8AAAAA0P///wAAAAD+////GF9AAC9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAKWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAA6bEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAD55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAToFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAvgkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAvZdAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABUoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAMulQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAkadAAAAAAAAAAAAAzaZAAP7///8AAAAA0P///wAAAAD+////AAAAAEyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAaMJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAALykAAVPkAAAAAAAAAAAAADgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJT6AACw+gAAxvoAANz6AADu+gAABvsAABz7AAA0+wAATPsAAGD7AABo+wAAevsAAIj7AACa+wAArPsAALz7AADK+wAA3PsAAPT7AAAI/AAAHPwAADj8AABW/AAAavwAAHr8AACG/AAAkvwAAJ78AAC2/AAAzvwAANj8AADk/AAA9vwAAAT9AAAQ/QAAHv0AACj9AAA4/QAATv0AAFr9AABq/QAAkv0AAKz9AADE/QAA3v0AAPT9AAAO/gAAHP4AACr+AABE/gAAVP4AAGr+AACE/gAAkP4AAJ7+AACu/gAAvv4AAND+AADk/gAA9P4AAAr/AAAa/wAALP8AAD7/AABQ/wAAYv8AAG7/AAB8/wAAjP8AAKL/AACy/wAAwv8AAND/AADi/wAA9P8AABwAAQAoAAEAOAABAEoAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAbgNSZWFkRmlsZQAA1QNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMoBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAABAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAA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c3RfaW5mbycsCl0KCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3QgaW1wb3J0IGJkaXN0CmltcG9ydCBzeXMKCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBpbnN0YWxsX3NjcmlwdHMKCmlmICdlZ2cnIG5vdCBpbiBiZGlzdC5mb3JtYXRfY29tbWFuZHM6CiAgICBiZGlzdC5mb3JtYXRfY29tbWFuZFsnZWdnJ10gPSAoJ2JkaXN0X2VnZycsICJQeXRob24gLmVnZyBmaWxlIikKICAgIGJkaXN0LmZvcm1hdF9jb21tYW5kcy5hcHBlbmQoJ2VnZycpCgpkZWwgYmRpc3QsIHN5cwpQSwMEFAAAAAAAAAAhAFD4I/J6CQAAegkAADMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHlmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKCgpkZWYgc2hxdW90ZShhcmcpOgogICAgIiIiUXVvdGUgYW4gYXJndW1lbnQgZm9yIGxhdGVyIHBhcnNpbmcgYnkgc2hsZXguc3BsaXQoKSIiIgogICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKICAgICAgICBpZiBjIGluIGFyZzoKICAgICAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgaWYgYXJnLnNwbGl0KCkgIT0gW2FyZ106CiAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgcmV0dXJuIGFyZwoKCmNsYXNzIGFsaWFzKG9wdGlvbl9iYXNlKToKICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgoKICAgIGRlc2NyaXB0aW9uID0gImRlZmluZSBhIHNob3J0Y3V0IHRvIGludm9rZSBvbmUgb3IgbW9yZSBjb21tYW5kcyIKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSBhbGlhcycpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yZW1vdmUgYW5kIGxlbihzZWxmLmFyZ3MpICE9IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGFsaWFzIG5hbWUpIHdoZW4gIgogICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgogICAgICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBhbGlhc2VzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcHJpbnQoIkNvbW1hbmQgQWxpYXNlcyIpCiAgICAgICAgICAgIHByaW50KCItLS0tLS0tLS0tLS0tLS0iKQogICAgICAgICAgICBmb3IgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlbGlmIGxlbihzZWxmLmFyZ3MpID09IDE6CiAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncwogICAgICAgICAgICBpZiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBOb25lCiAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFsaWFzID0gc2VsZi5hcmdzWzBdCiAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSwgc2VsZi5hcmdzWzE6XSkpCgogICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHsnYWxpYXNlcyc6IHthbGlhczogY29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCgoKZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKICAgIHNvdXJjZSwgY29tbWFuZCA9IGFsaWFzZXNbbmFtZV0KICAgIGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnZ2xvYmFsJyk6CiAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgndXNlcicpOgogICAgICAgIHNvdXJjZSA9ICctLXVzZXItY29uZmlnICcKICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgogICAgICAgIHNvdXJjZSA9ICcnCiAgICBlbHNlOgogICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQogICAgcmV0dXJuIHNvdXJjZSArIG5hbWUgKyAnICcgKyBjb21tYW5kClBLAwQUAAAAAAAAACEAScwroVtGAABbRgAANwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnCgpCdWlsZCAuZWdnIGRpc3RyaWJ1dGlvbnMiIiIKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgpmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUsIG1rcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gdHlwZXMgaW1wb3J0IENvZGVUeXBlCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IG1hcnNoYWwKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBnZXRfYnVpbGRfcGxhdGZvcm0sIERpc3RyaWJ1dGlvbiwgZW5zdXJlX2RpcmVjdG9yeQpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IEVudHJ5UG9pbnQKZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCnRyeToKICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wYXRoLCBnZXRfcHl0aG9uX3ZlcnNpb24KCiAgICBkZWYgX2dldF9wdXJlbGliKCk6CiAgICAgICAgcmV0dXJuIGdldF9wYXRoKCJwdXJlbGliIikKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX2xpYiwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcHl0aG9uX2xpYihGYWxzZSkKCgpkZWYgc3RyaXBfbW9kdWxlKGZpbGVuYW1lKToKICAgIGlmICcuJyBpbiBmaWxlbmFtZToKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzBdCiAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnbW9kdWxlJyk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTZdCiAgICByZXR1cm4gZmlsZW5hbWUKCmRlZiBzb3J0ZWRfd2FsayhkaXIpOgogICAgIiIiRG8gb3Mud2FsayBpbiBhIHJlcHJvZHVjaWJsZSB3YXksCiAgICBpbmRlcGVuZGVudCBvZiBpbmRldGVybWluaXN0aWMgZmlsZXN5c3RlbSByZWFkZGlyIG9yZGVyCiAgICAiIiIKICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGRpcik6CiAgICAgICAgZGlycy5zb3J0KCkKICAgICAgICBmaWxlcy5zb3J0KCkKICAgICAgICB5aWVsZCBiYXNlLCBkaXJzLCBmaWxlcwoKZGVmIHdyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSk6CiAgICBfc3R1Yl90ZW1wbGF0ZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBkZWYgX19ib290c3RyYXBfXygpOgogICAgICAgICAgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXywgX19maWxlX18KICAgICAgICAgICAgaW1wb3J0IHN5cywgcGtnX3Jlc291cmNlcywgaW1wCiAgICAgICAgICAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywgJXIpCiAgICAgICAgICAgIF9fbG9hZGVyX18gPSBOb25lOyBkZWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXwogICAgICAgICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKQogICAgICAgIF9fYm9vdHN0cmFwX18oKQogICAgICAgICIiIikubHN0cmlwKCkKICAgIHdpdGggb3BlbihweWZpbGUsICd3JykgYXMgZjoKICAgICAgICBmLndyaXRlKF9zdHViX3RlbXBsYXRlICUgcmVzb3VyY2UpCgoKY2xhc3MgYmRpc3RfZWdnKENvbW1hbmQpOgogICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGFuIFwiZWdnXCIgZGlzdHJpYnV0aW9uIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2JkaXN0LWRpcj0nLCAnYicsCiAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCiAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLCAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9idWlsZF9wbGF0Zm9ybSgpKSwKICAgICAgICAoJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJywgTm9uZSwKICAgICAgICAgInJlbW92ZSBhbGwgLnB5IGZpbGVzIGZyb20gdGhlIGdlbmVyYXRlZCBlZ2ciKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCiAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAogICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCiAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAnZXhjbHVkZS1zb3VyY2UtZmlsZXMnCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBOb25lCiAgICAgICAgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlcyA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBlaV9jbWQgPSBzZWxmLmVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVpX2NtZC5lZ2dfaW5mbwoKICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQogICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnZWdnJykKCiAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQoKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCgogICAgICAgIGlmIHNlbGYuZWdnX291dHB1dCBpcyBOb25lOgoKICAgICAgICAgICAgIyBDb21wdXRlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZWdnCiAgICAgICAgICAgIGJhc2VuYW1lID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCiAgICAgICAgICAgICAgICBnZXRfcHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpIGFuZCBzZWxmLnBsYXRfbmFtZQogICAgICAgICAgICApLmVnZ19uYW1lKCkKCiAgICAgICAgICAgIHNlbGYuZWdnX291dHB1dCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBiYXNlbmFtZSArICcuZWdnJykKCiAgICBkZWYgZG9faW5zdGFsbF9kYXRhKHNlbGYpOgogICAgICAgICMgSGFjayBmb3IgcGFja2FnZXMgdGhhdCBpbnN0YWxsIGRhdGEgdG8gaW5zdGFsbCdzIC0taW5zdGFsbC1saWIKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmluc3RhbGxfbGliID0gc2VsZi5iZGlzdF9kaXIKCiAgICAgICAgc2l0ZV9wYWNrYWdlcyA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChfZ2V0X3B1cmVsaWIoKSkpCiAgICAgICAgb2xkLCBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcywgW10KCiAgICAgICAgZm9yIGl0ZW0gaW4gb2xkOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHR1cGxlKSBhbmQgbGVuKGl0ZW0pID09IDI6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGl0ZW1bMF0pOgogICAgICAgICAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChpdGVtWzBdKQogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBvcy5wYXRoLm5vcm1jYXNlKHJlYWxwYXRoKQogICAgICAgICAgICAgICAgICAgIGlmIG5vcm1hbGl6ZWQgPT0gc2l0ZV9wYWNrYWdlcyBvciBub3JtYWxpemVkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfcGFja2FnZXMgKyBvcy5zZXAKICAgICAgICAgICAgICAgICAgICApOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVhbHBhdGhbbGVuKHNpdGVfcGFja2FnZXMpICsgMTpdLCBpdGVtWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIGVsc2U6IHJhaXNlID8/PwogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLmFwcGVuZChpdGVtKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHBhY2thZ2UgZGF0YSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9kYXRhJywgZm9yY2U9MCwgcm9vdD1Ob25lKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBvbGQKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtzZWxmLmVnZ19vdXRwdXRdCgogICAgZGVmIGNhbGxfY29tbWFuZChzZWxmLCBjbWRuYW1lLCAqKmt3KToKICAgICAgICAiIiJJbnZva2UgcmVpbml0aWFsaXplZCBjb21tYW5kIGBjbWRuYW1lYCB3aXRoIGtleXdvcmQgYXJncyIiIgogICAgICAgIGZvciBkaXJuYW1lIGluIElOU1RBTExfRElSRUNUT1JZX0FUVFJTOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGRpcm5hbWUsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ3NraXBfYnVpbGQnLCBzZWxmLnNraXBfYnVpbGQpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnZHJ5X3J1bicsIHNlbGYuZHJ5X3J1bikKICAgICAgICBjbWQgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKGNtZG5hbWUsICoqa3cpCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRuYW1lKQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgR2VuZXJhdGUgbWV0YWRhdGEgZmlyc3QKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgIyBXZSBydW4gaW5zdGFsbF9saWIgYmVmb3JlIGluc3RhbGxfZGF0YSwgYmVjYXVzZSBzb21lIGRhdGEgaGFja3MKICAgICAgICAjIHB1bGwgdGhlaXIgZGF0YSBwYXRoIGZyb20gdGhlIGluc3RhbGxfbGliIGNvbW1hbmQuCiAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgbGlicmFyeSBjb2RlIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAgaW5zdGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBvbGRfcm9vdCA9IGluc3RjbWQucm9vdAogICAgICAgIGluc3RjbWQucm9vdCA9IE5vbmUKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKSBhbmQgbm90IHNlbGYuc2tpcF9idWlsZDoKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfY2xpYicpCiAgICAgICAgY21kID0gc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfbGliJywgd2Fybl9kaXI9MCkKICAgICAgICBpbnN0Y21kLnJvb3QgPSBvbGRfcm9vdAoKICAgICAgICBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMgPSBzZWxmLmdldF9leHRfb3V0cHV0cygpCiAgICAgICAgc2VsZi5zdHVicyA9IFtdCiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgZm9yIChwLCBleHRfbmFtZSkgaW4gZW51bWVyYXRlKGV4dF9vdXRwdXRzKToKICAgICAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXh0X25hbWUpCiAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2Rpciwgc3RyaXBfbW9kdWxlKGZpbGVuYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnB5JykKICAgICAgICAgICAgc2VsZi5zdHVicy5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIiwgZXh0X25hbWUpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICB3cml0ZV9zdHViKG9zLnBhdGguYmFzZW5hbWUoZXh0X25hbWUpLCBweWZpbGUpCiAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgZXh0X291dHB1dHNbcF0gPSBleHRfbmFtZS5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKICAgICAgICBpZiB0b19jb21waWxlOgogICAgICAgICAgICBjbWQuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKICAgICAgICAgICAgc2VsZi5kb19pbnN0YWxsX2RhdGEoKQoKICAgICAgICAjIE1ha2UgdGhlIEVHRy1JTkZPIGRpcmVjdG9yeQogICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCAnRUdHLUlORk8nKQogICAgICAgIHNlbGYubWtwYXRoKGVnZ19pbmZvKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdzY3JpcHRzJykKICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgc2NyaXB0cyB0byAlcyIsIHNjcmlwdF9kaXIpCiAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnLCBpbnN0YWxsX2Rpcj1zY3JpcHRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19lcD0xKQoKICAgICAgICBzZWxmLmNvcHlfbWV0YWRhdGFfdG8oZWdnX2luZm8pCiAgICAgICAgbmF0aXZlX2xpYnMgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICJuYXRpdmVfbGlicy50eHQiKQogICAgICAgIGlmIGFsbF9vdXRwdXRzOgogICAgICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShuYXRpdmVfbGlicykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZSA9IG9wZW4obmF0aXZlX2xpYnMsICd3dCcpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJy5qb2luKGFsbF9vdXRwdXRzKSkKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nKQogICAgICAgICAgICAgICAgbGlic19maWxlLmNsb3NlKCkKICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hdGl2ZV9saWJzKToKICAgICAgICAgICAgbG9nLmluZm8oInJlbW92aW5nICVzIiwgbmF0aXZlX2xpYnMpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmF0aXZlX2xpYnMpCgogICAgICAgIHdyaXRlX3NhZmV0eV9mbGFnKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCAnRUdHLUlORk8nKSwgc2VsZi56aXBfc2FmZSgpCiAgICAgICAgKQoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgJ2RlcGVuZHMudHh0JykpOgogICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIHdpbGwgbm90IGJlIHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCiAgICAgICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzOgogICAgICAgICAgICBzZWxmLnphcF9weWZpbGVzKCkKCiAgICAgICAgIyBNYWtlIHRoZSBhcmNoaXZlCiAgICAgICAgbWFrZV96aXBmaWxlKHNlbGYuZWdnX291dHB1dCwgYXJjaGl2ZV9yb290LCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIG1vZGU9c2VsZi5nZW5faGVhZGVyKCkpCiAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgogICAgICAgICAgICByZW1vdmVfdHJlZShzZWxmLmJkaXN0X2RpciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCgogICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcwogICAgICAgIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pLmFwcGVuZCgKICAgICAgICAgICAgKCdiZGlzdF9lZ2cnLCBnZXRfcHl0aG9uX3ZlcnNpb24oKSwgc2VsZi5lZ2dfb3V0cHV0KSkKCiAgICBkZWYgemFwX3B5ZmlsZXMoc2VsZik6CiAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nIC5weSBmaWxlcyBmcm9tIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiB3YWxrX2VnZyhzZWxmLmJkaXN0X2Rpcik6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBuYW1lKQoKICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgJXMiLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQoKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJ19fcHljYWNoZV9fJyk6CiAgICAgICAgICAgICAgICAgICAgcGF0aF9vbGQgPSBwYXRoCgogICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSByJyg/UDxuYW1lPi4rKVwuKD9QPG1hZ2ljPlteLl0rKVwucHljJwogICAgICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChwYXR0ZXJuLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHBhdGhfbmV3ID0gb3MucGF0aC5qb2luKGJhc2UsIG9zLnBhcmRpciwgbS5ncm91cCgnbmFtZScpICsgJy5weWMnKQogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW5hbWluZyBmaWxlIGZyb20gWyVzXSB0byBbJXNdIiAlIChwYXRoX29sZCwgcGF0aF9uZXcpKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGhfbmV3KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHBhdGhfb2xkLCBwYXRoX25ldykKCgogICAgZGVmIHppcF9zYWZlKHNlbGYpOgogICAgICAgIHNhZmUgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnemlwX3NhZmUnLCBOb25lKQogICAgICAgIGlmIHNhZmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzYWZlCiAgICAgICAgbG9nLndhcm4oInppcF9zYWZlIGZsYWcgbm90IHNldDsgYW5hbHl6aW5nIGFyY2hpdmUgY29udGVudHMuLi4iKQogICAgICAgIHJldHVybiBhbmFseXplX2VnZyhzZWxmLmJkaXN0X2Rpciwgc2VsZi5zdHVicykKCiAgICBkZWYgZ2VuX2hlYWRlcihzZWxmKToKICAgICAgICBlcG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcChzZWxmLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMgb3IgJycpCiAgICAgICAgZXAgPSBlcG0uZ2V0KCdzZXR1cHRvb2xzLmluc3RhbGxhdGlvbicsIHt9KS5nZXQoJ2VnZ3NlY3V0YWJsZScpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuICd3JyAgIyBub3QgYW4gZWdnc2VjdXRhYmxlLCBkbyBpdCB0aGUgdXN1YWwgd2F5LgoKICAgICAgICBpZiBub3QgZXAuYXR0cnMgb3IgZXAuZXh0cmFzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgImVnZ3NlY3V0YWJsZSBlbnRyeSBwb2ludCAoJXIpIGNhbm5vdCBoYXZlICdleHRyYXMnICIKICAgICAgICAgICAgICAgICJvciByZWZlciB0byBhIG1vZHVsZSIgJSAoZXAsKQogICAgICAgICAgICApCgogICAgICAgIHB5dmVyID0gc3lzLnZlcnNpb25bOjNdCiAgICAgICAgcGtnID0gZXAubW9kdWxlX25hbWUKICAgICAgICBmdWxsID0gJy4nLmpvaW4oZXAuYXR0cnMpCiAgICAgICAgYmFzZSA9IGVwLmF0dHJzWzBdCiAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZWdnX291dHB1dCkKCiAgICAgICAgaGVhZGVyID0gKAogICAgICAgICAgICAiIyEvYmluL3NoXG4iCiAgICAgICAgICAgICdpZiBbIGBiYXNlbmFtZSAkMGAgPSAiJShiYXNlbmFtZSlzIiBdXG4nCiAgICAgICAgICAgICd0aGVuIGV4ZWMgcHl0aG9uJShweXZlcilzIC1jICInCiAgICAgICAgICAgICJpbXBvcnQgc3lzLCBvczsgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aCgnJDAnKSk7ICIKICAgICAgICAgICAgImZyb20gJShwa2cpcyBpbXBvcnQgJShiYXNlKXM7IHN5cy5leGl0KCUoZnVsbClzKCkpIgogICAgICAgICAgICAnIiAiJEAiXG4nCiAgICAgICAgICAgICdlbHNlXG4nCiAgICAgICAgICAgICcgIGVjaG8gJDAgaXMgbm90IHRoZSBjb3JyZWN0IG5hbWUgZm9yIHRoaXMgZWdnIGZpbGUuXG4nCiAgICAgICAgICAgICcgIGVjaG8gUGxlYXNlIHJlbmFtZSBpdCBiYWNrIHRvICUoYmFzZW5hbWUpcyBhbmQgdHJ5IGFnYWluLlxuJwogICAgICAgICAgICAnICBleGVjIGZhbHNlXG4nCiAgICAgICAgICAgICdmaVxuJwogICAgICAgICkgJSBsb2NhbHMoKQoKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZWdnX291dHB1dCksIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBmID0gb3BlbihzZWxmLmVnZ19vdXRwdXQsICd3JykKICAgICAgICAgICAgZi53cml0ZShoZWFkZXIpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIHJldHVybiAnYScKCiAgICBkZWYgY29weV9tZXRhZGF0YV90byhzZWxmLCB0YXJnZXRfZGlyKToKICAgICAgICAiQ29weSBtZXRhZGF0YSAoZWdnIGluZm8pIHRvIHRoZSB0YXJnZXRfZGlyIgogICAgICAgICMgbm9ybWFsaXplIHRoZSBwYXRoIChzbyB0aGF0IGEgZm9yd2FyZC1zbGFzaCBpbiBlZ2dfaW5mbyB3aWxsCiAgICAgICAgIyBtYXRjaCB1c2luZyBzdGFydHN3aXRoIGJlbG93KQogICAgICAgIG5vcm1fZWdnX2luZm8gPSBvcy5wYXRoLm5vcm1wYXRoKHNlbGYuZWdnX2luZm8pCiAgICAgICAgcHJlZml4ID0gb3MucGF0aC5qb2luKG5vcm1fZWdnX2luZm8sICcnKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYuZWlfY21kLmZpbGVsaXN0LmZpbGVzOgogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCBwYXRoW2xlbihwcmVmaXgpOl0pCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKHBhdGgsIHRhcmdldCkKCiAgICBkZWYgZ2V0X2V4dF9vdXRwdXRzKHNlbGYpOgogICAgICAgICIiIkdldCBhIGxpc3Qgb2YgcmVsYXRpdmUgcGF0aHMgdG8gQyBleHRlbnNpb25zIGluIHRoZSBvdXRwdXQgZGlzdHJvIiIiCgogICAgICAgIGFsbF9vdXRwdXRzID0gW10KICAgICAgICBleHRfb3V0cHV0cyA9IFtdCgogICAgICAgIHBhdGhzID0ge3NlbGYuYmRpc3RfZGlyOiAnJ30KICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVsxXS5sb3dlcigpIGluIE5BVElWRV9FWFRFTlNJT05TOgogICAgICAgICAgICAgICAgICAgIGFsbF9vdXRwdXRzLmFwcGVuZChwYXRoc1tiYXNlXSArIGZpbGVuYW1lKQogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZGlyczoKICAgICAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZSldID0gKHBhdGhzW2Jhc2VdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICsgJy8nKQoKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgICAgIGZvciBleHQgaW4gYnVpbGRfY21kLmV4dGVuc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLnN0YXJ0c3dpdGgoJ2RsLScpOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwgZmlsZW5hbWUpKToKICAgICAgICAgICAgICAgICAgICAgICAgZXh0X291dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQoKICAgICAgICByZXR1cm4gYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzCgoKTkFUSVZFX0VYVEVOU0lPTlMgPSBkaWN0LmZyb21rZXlzKCcuZGxsIC5zbyAuZHlsaWIgLnB5ZCcuc3BsaXQoKSkKCgpkZWYgd2Fsa19lZ2coZWdnX2Rpcik6CiAgICAiIiJXYWxrIGFuIHVucGFja2VkIGVnZydzIGNvbnRlbnRzLCBza2lwcGluZyB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5IiIiCiAgICB3YWxrZXIgPSBzb3J0ZWRfd2FsayhlZ2dfZGlyKQogICAgYmFzZSwgZGlycywgZmlsZXMgPSBuZXh0KHdhbGtlcikKICAgIGlmICdFR0ctSU5GTycgaW4gZGlyczoKICAgICAgICBkaXJzLnJlbW92ZSgnRUdHLUlORk8nKQogICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKICAgIGZvciBiZGYgaW4gd2Fsa2VyOgogICAgICAgIHlpZWxkIGJkZgoKCmRlZiBhbmFseXplX2VnZyhlZ2dfZGlyLCBzdHVicyk6CiAgICAjIGNoZWNrIGZvciBleGlzdGluZyBmbGFnIGluIEVHRy1JTkZPCiAgICBmb3IgZmxhZywgZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGVnZ19kaXIsICdFR0ctSU5GTycsIGZuKSk6CiAgICAgICAgICAgIHJldHVybiBmbGFnCiAgICBpZiBub3QgY2FuX3NjYW4oKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHNhZmUgPSBUcnVlCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coZWdnX2Rpcik6CiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpIG9yIG5hbWUuZW5kc3dpdGgoJy5weXcnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpIG9yIG5hbWUuZW5kc3dpdGgoJy5weW8nKToKICAgICAgICAgICAgICAgICMgYWx3YXlzIHNjYW4sIGV2ZW4gaWYgd2UgYWxyZWFkeSBrbm93IHdlJ3JlIG5vdCBzYWZlCiAgICAgICAgICAgICAgICBzYWZlID0gc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpIGFuZCBzYWZlCiAgICByZXR1cm4gc2FmZQoKCmRlZiB3cml0ZV9zYWZldHlfZmxhZyhlZ2dfZGlyLCBzYWZlKToKICAgICMgV3JpdGUgb3IgcmVtb3ZlIHppcCBzYWZldHkgZmxhZyBmaWxlKHMpCiAgICBmb3IgZmxhZywgZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CiAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZWdnX2RpciwgZm4pCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICBpZiBzYWZlIGlzIE5vbmUgb3IgYm9vbChzYWZlKSAhPSBmbGFnOgogICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQogICAgICAgIGVsaWYgc2FmZSBpcyBub3QgTm9uZSBhbmQgYm9vbChzYWZlKSA9PSBmbGFnOgogICAgICAgICAgICBmID0gb3BlbihmbiwgJ3d0JykKICAgICAgICAgICAgZi53cml0ZSgnXG4nKQogICAgICAgICAgICBmLmNsb3NlKCkKCgpzYWZldHlfZmxhZ3MgPSB7CiAgICBUcnVlOiAnemlwLXNhZmUnLAogICAgRmFsc2U6ICdub3QtemlwLXNhZmUnLAp9CgoKZGVmIHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKToKICAgICIiIkNoZWNrIHdoZXRoZXIgbW9kdWxlIHBvc3NpYmx5IHVzZXMgdW5zYWZlLWZvci16aXBmaWxlIHN0dWZmIiIiCgogICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKICAgIGlmIGZpbGVuYW1lWzotMV0gaW4gc3R1YnM6CiAgICAgICAgcmV0dXJuIFRydWUgICMgRXh0ZW5zaW9uIG1vZHVsZQogICAgcGtnID0gYmFzZVtsZW4oZWdnX2RpcikgKyAxOl0ucmVwbGFjZShvcy5zZXAsICcuJykKICAgIG1vZHVsZSA9IHBrZyArIChwa2cgYW5kICcuJyBvciAnJykgKyBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpWzBdCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgIHNraXAgPSA4ICAjIHNraXAgbWFnaWMgJiBkYXRlCiAgICBlbHNlOgogICAgICAgIHNraXAgPSAxMiAgIyBza2lwIG1hZ2ljICYgZGF0ZSAmIGZpbGUgc2l6ZQogICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyYicpCiAgICBmLnJlYWQoc2tpcCkKICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKICAgIGYuY2xvc2UoKQogICAgc2FmZSA9IFRydWUKICAgIHN5bWJvbHMgPSBkaWN0LmZyb21rZXlzKGl0ZXJfc3ltYm9scyhjb2RlKSkKICAgIGZvciBiYWQgaW4gWydfX2ZpbGVfXycsICdfX3BhdGhfXyddOgogICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgogICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSByZWZlcmVuY2VzICVzIiwgbW9kdWxlLCBiYWQpCiAgICAgICAgICAgIHNhZmUgPSBGYWxzZQogICAgaWYgJ2luc3BlY3QnIGluIHN5bWJvbHM6CiAgICAgICAgZm9yIGJhZCBpbiBbCiAgICAgICAgICAgICdnZXRzb3VyY2UnLCAnZ2V0YWJzZmlsZScsICdnZXRzb3VyY2VmaWxlJywgJ2dldGZpbGUnCiAgICAgICAgICAgICdnZXRzb3VyY2VsaW5lcycsICdmaW5kc291cmNlJywgJ2dldGNvbW1lbnRzJywgJ2dldGZyYW1laW5mbycsCiAgICAgICAgICAgICdnZXRpbm5lcmZyYW1lcycsICdnZXRvdXRlcmZyYW1lcycsICdzdGFjaycsICd0cmFjZScKICAgICAgICBdOgogICAgICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIE1BWSBiZSB1c2luZyBpbnNwZWN0LiVzIiwgbW9kdWxlLCBiYWQpCiAgICAgICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIHJldHVybiBzYWZlCgoKZGVmIGl0ZXJfc3ltYm9scyhjb2RlKToKICAgICIiIllpZWxkIG5hbWVzIGFuZCBzdHJpbmdzIHVzZWQgYnkgYGNvZGVgIGFuZCBpdHMgbmVzdGVkIGNvZGUgb2JqZWN0cyIiIgogICAgZm9yIG5hbWUgaW4gY29kZS5jb19uYW1lczoKICAgICAgICB5aWVsZCBuYW1lCiAgICBmb3IgY29uc3QgaW4gY29kZS5jb19jb25zdHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25zdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHlpZWxkIGNvbnN0CiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNvbnN0LCBDb2RlVHlwZSk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGl0ZXJfc3ltYm9scyhjb25zdCk6CiAgICAgICAgICAgICAgICB5aWVsZCBuYW1lCgoKZGVmIGNhbl9zY2FuKCk6CiAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKSBhbmQgc3lzLnBsYXRmb3JtICE9ICdjbGknOgogICAgICAgICMgQ1B5dGhvbiwgUHlQeSwgZXRjLgogICAgICAgIHJldHVybiBUcnVlCiAgICBsb2cud2FybigiVW5hYmxlIHRvIGFuYWx5emUgY29tcGlsZWQgY29kZSBvbiB0aGlzIHBsYXRmb3JtLiIpCiAgICBsb2cud2FybigiUGxlYXNlIGFzayB0aGUgYXV0aG9yIHRvIGluY2x1ZGUgYSAnemlwX3NhZmUnIgogICAgICAgICAgICAgIiBzZXR0aW5nIChlaXRoZXIgVHJ1ZSBvciBGYWxzZSkgaW4gdGhlIHBhY2thZ2UncyBzZXR1cC5weSIpCgoKIyBBdHRyaWJ1dGUgbmFtZXMgb2Ygb3B0aW9ucyBmb3IgY29tbWFuZHMgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGNvbnZpbmNlZCB0bwojIGluc3RhbGwgdG8gdGhlIGVnZyBidWlsZCBkaXJlY3RvcnkKCklOU1RBTExfRElSRUNUT1JZX0FUVFJTID0gWwogICAgJ2luc3RhbGxfbGliJywgJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGF0YScsICdpbnN0YWxsX2Jhc2UnCl0KCgpkZWYgbWFrZV96aXBmaWxlKHppcF9maWxlbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBjb21wcmVzcz1UcnVlLAogICAgICAgICAgICAgICAgIG1vZGU9J3cnKToKICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLiAgVGhlIG91dHB1dAogICAgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9kaXInICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlICJ6aXBmaWxlIgogICAgUHl0aG9uIG1vZHVsZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgSW5mb1pJUCAiemlwIiB1dGlsaXR5IChpZiBpbnN0YWxsZWQKICAgIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMgYXZhaWxhYmxlLAogICAgcmFpc2VzIERpc3R1dGlsc0V4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAgZmlsZS4KICAgICIiIgogICAgaW1wb3J0IHppcGZpbGUKCiAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHppcF9maWxlbmFtZSksIGRyeV9ydW49ZHJ5X3J1bikKICAgIGxvZy5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCgogICAgZGVmIHZpc2l0KHosIGRpcm5hbWUsIG5hbWVzKToKICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIHAgPSBwYXRoW2xlbihiYXNlX2RpcikgKyAxOl0KICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIHoud3JpdGUocGF0aCwgcCkKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYWRkaW5nICclcyciLCBwKQoKICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfREVGTEFURUQgaWYgY29tcHJlc3MgZWxzZSB6aXBmaWxlLlpJUF9TVE9SRUQKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCBtb2RlLCBjb21wcmVzc2lvbj1jb21wcmVzc2lvbikKICAgICAgICBmb3IgZGlybmFtZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoYmFzZV9kaXIpOgogICAgICAgICAgICB2aXNpdCh6LCBkaXJuYW1lLCBmaWxlcykKICAgICAgICB6LmNsb3NlKCkKICAgIGVsc2U6CiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoTm9uZSwgZGlybmFtZSwgZmlsZXMpCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lClBLAwQUAAAAAAAAACEA69J0FuQFAADkBQAANwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGFzIG9yaWcKCgpjbGFzcyBiZGlzdF9ycG0ob3JpZy5iZGlzdF9ycG0pOgogICAgIiIiCiAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBiZGlzdF9ycG0gYmVoYXZpb3IgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBSdW4gZWdnX2luZm8gdG8gZW5zdXJlIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIGFyZSBwcm9wZXJseSBjYWxjdWxhdGVkLgogICAgMi4gQWx3YXlzIHJ1biAnaW5zdGFsbCcgdXNpbmcgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQgdG8KICAgICAgIGRpc2FibGUgZWdncyBpbiBSUE0gZGlzdHJpYnV0aW9ucy4KICAgIDMuIFJlcGxhY2UgZGFzaCB3aXRoIHVuZGVyc2NvcmUgaW4gdGhlIHZlcnNpb24gbnVtYmVycyBmb3IgYmV0dGVyIFJQTQogICAgICAgY29tcGF0aWJpbGl0eS4KICAgICIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBlbnN1cmUgZGlzdHJvIG5hbWUgaXMgdXAtdG8tZGF0ZQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgb3JpZy5iZGlzdF9ycG0ucnVuKHNlbGYpCgogICAgZGVmIF9tYWtlX3NwZWNfZmlsZShzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKQogICAgICAgIHJwbXZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgc3BlYyA9IG9yaWcuYmRpc3RfcnBtLl9tYWtlX3NwZWNfZmlsZShzZWxmKQogICAgICAgIGxpbmUyMyA9ICclZGVmaW5lIHZlcnNpb24gJyArIHZlcnNpb24KICAgICAgICBsaW5lMjQgPSAnJWRlZmluZSB2ZXJzaW9uICcgKyBycG12ZXJzaW9uCiAgICAgICAgc3BlYyA9IFsKICAgICAgICAgICAgbGluZS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIiLAogICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0udGFyIgogICAgICAgICAgICApLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAiLAogICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQgIgogICAgICAgICAgICApLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAiJXNldHVwIiwKICAgICAgICAgICAgICAgICIlc2V0dXAgLW4gJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufSIKICAgICAgICAgICAgKS5yZXBsYWNlKGxpbmUyMywgbGluZTI0KQogICAgICAgICAgICBmb3IgbGluZSBpbiBzcGVjCiAgICAgICAgXQogICAgICAgIGluc2VydF9sb2MgPSBzcGVjLmluZGV4KGxpbmUyNCkgKyAxCiAgICAgICAgdW5tYW5nbGVkX3ZlcnNpb24gPSAiJWRlZmluZSB1bm1hbmdsZWRfdmVyc2lvbiAiICsgdmVyc2lvbgogICAgICAgIHNwZWMuaW5zZXJ0KGluc2VydF9sb2MsIHVubWFuZ2xlZF92ZXJzaW9uKQogICAgICAgIHJldHVybiBzcGVjClBLAwQUAAAAAAAAACEAIIx1FH0CAAB9AgAAOwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QgYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3dpbmluc3Qob3JpZy5iZGlzdF93aW5pbnN0KToKICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCk6CiAgICAgICAgIiIiCiAgICAgICAgU3VwcGxlbWVudCByZWluaXRpYWxpemVfY29tbWFuZCB0byB3b3JrIGFyb3VuZAogICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDgxOQogICAgICAgICIiIgogICAgICAgIGNtZCA9IHNlbGYuZGlzdHJpYnV0aW9uLnJlaW5pdGlhbGl6ZV9jb21tYW5kKAogICAgICAgICAgICBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgaWYgY29tbWFuZCBpbiAoJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInKToKICAgICAgICAgICAgY21kLmluc3RhbGxfbGliID0gTm9uZQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcmlnLmJkaXN0X3dpbmluc3QucnVuKHNlbGYpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5faXNfcnVubmluZyA9IEZhbHNlClBLAwQUAAAAAAAAACEAJxqNG4QRAACEEQAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2NsaWIgYXMgb3JpZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHNldHVwdG9vbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyX3BhaXJ3aXNlX2dyb3VwCgoKY2xhc3MgYnVpbGRfY2xpYihvcmlnLmJ1aWxkX2NsaWIpOgogICAgIiIiCiAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBidWlsZF9jbGliIGJlaGF2aW91ciB0byBkbyB0aGUgZm9sbG93aW5nOgoKICAgIDEuIEltcGxlbWVudCBhIHJ1ZGltZW50YXJ5IHRpbWVzdGFtcC1iYXNlZCBkZXBlbmRlbmN5IHN5c3RlbQogICAgICAgc28gJ2NvbXBpbGUoKScgZG9lc24ndCBydW4gZXZlcnkgdGltZS4KICAgIDIuIEFkZCBtb3JlIGtleXMgdG8gdGhlICdidWlsZF9pbmZvJyBkaWN0aW9uYXJ5OgogICAgICAgICogb2JqX2RlcHMgLSBzcGVjaWZ5IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBvYmplY3QgY29tcGlsZWQuCiAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIGEga2V5CiAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNvdXJjZSBmaWxlbmFtZSB0byBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGZvciBnbG9iYWwKICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgogICAgICAgICogY2ZsYWdzICAgLSBzcGVjaWZ5IGEgbGlzdCBvZiBhZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3MgdG8KICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBpbGVyLgogICAgIiIiCgogICAgZGVmIGJ1aWxkX2xpYnJhcmllcyhzZWxmLCBsaWJyYXJpZXMpOgogICAgICAgIGZvciAobGliX25hbWUsIGJ1aWxkX2luZm8pIGluIGxpYnJhcmllczoKICAgICAgICAgICAgc291cmNlcyA9IGJ1aWxkX2luZm8uZ2V0KCdzb3VyY2VzJykKICAgICAgICAgICAgaWYgc291cmNlcyBpcyBOb25lIG9yIG5vdCBpc2luc3RhbmNlKHNvdXJjZXMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidzb3VyY2VzJyBtdXN0IGJlIHByZXNlbnQgYW5kIG11c3QgYmUgIgogICAgICAgICAgICAgICAgICAgICAgICJhIGxpc3Qgb2Ygc291cmNlIGZpbGVuYW1lcyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgc291cmNlcyA9IGxpc3Qoc291cmNlcykKCiAgICAgICAgICAgIGxvZy5pbmZvKCJidWlsZGluZyAnJXMnIGxpYnJhcnkiLCBsaWJfbmFtZSkKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgdGhlIGNvcnJlY3QgdHlwZS4KICAgICAgICAgICAgIyBvYmpfZGVwcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9mIGtleXMgYXMgc291cmNlcwogICAgICAgICAgICAjIGFuZCBhIGxpc3QvdHVwbGUgb2YgZmlsZXMgdGhhdCBhcmUgaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgb2JqX2RlcHMgPSBidWlsZF9pbmZvLmdldCgnb2JqX2RlcHMnLCBkaWN0KCkpCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9ial9kZXBzLCBkaWN0KToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gW10KCiAgICAgICAgICAgICMgR2V0IHRoZSBnbG9iYWwgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHNwZWNpZmllZCBieSB0aGUgJycga2V5LgogICAgICAgICAgICAjIFRoZXNlIHdpbGwgZ28gaW50byBldmVyeSBzb3VyY2UncyBkZXBlbmRlbmN5IGxpc3QuCiAgICAgICAgICAgIGdsb2JhbF9kZXBzID0gb2JqX2RlcHMuZ2V0KCcnLCBsaXN0KCkpCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGdsb2JhbF9kZXBzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKCiAgICAgICAgICAgICMgQnVpbGQgdGhlIGxpc3QgdG8gYmUgdXNlZCBieSBuZXdlcl9wYWlyd2lzZV9ncm91cAogICAgICAgICAgICAjIGVhY2ggc291cmNlIHdpbGwgYmUgYXV0by1hZGRlZCB0byBpdHMgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBmb3Igc291cmNlIGluIHNvdXJjZXM6CiAgICAgICAgICAgICAgICBzcmNfZGVwcyA9IFtzb3VyY2VdCiAgICAgICAgICAgICAgICBzcmNfZGVwcy5leHRlbmQoZ2xvYmFsX2RlcHMpCiAgICAgICAgICAgICAgICBleHRyYV9kZXBzID0gb2JqX2RlcHMuZ2V0KHNvdXJjZSwgbGlzdCgpKQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXh0cmFfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGV4dHJhX2RlcHMpCiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuYXBwZW5kKHNyY19kZXBzKQoKICAgICAgICAgICAgZXhwZWN0ZWRfb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIub2JqZWN0X2ZpbGVuYW1lcygKICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF90ZW1wCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoZGVwZW5kZW5jaWVzLCBleHBlY3RlZF9vYmplY3RzKSAhPSAoW10sIFtdKToKICAgICAgICAgICAgICAgICMgRmlyc3QsIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIHRvIG9iamVjdCBmaWxlcyBpbiB0aGUgbGlicmFyeQogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkuICAoVGhpcyBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRvIHB1dHRpbmcgb2JqZWN0CiAgICAgICAgICAgICAgICAjIGZpbGVzIGluIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeS4pCiAgICAgICAgICAgICAgICBtYWNyb3MgPSBidWlsZF9pbmZvLmdldCgnbWFjcm9zJykKICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGJ1aWxkX2luZm8uZ2V0KCdpbmNsdWRlX2RpcnMnKQogICAgICAgICAgICAgICAgY2ZsYWdzID0gYnVpbGRfaW5mby5nZXQoJ2NmbGFncycpCiAgICAgICAgICAgICAgICBvYmplY3RzID0gc2VsZi5jb21waWxlci5jb21waWxlKAogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9zPW1hY3JvcywKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Y2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgTm93ICJsaW5rIiB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIGludG8gYSBzdGF0aWMgbGlicmFyeS4KICAgICAgICAgICAgIyAoT24gVW5peCBhdCBsZWFzdCwgdGhpcyBpc24ndCByZWFsbHkgbGlua2luZyAtLSBpdCBqdXN0CiAgICAgICAgICAgICMgYnVpbGRzIGFuIGFyY2hpdmUuICBXaGF0ZXZlci4pCiAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuY3JlYXRlX3N0YXRpY19saWIoCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb2JqZWN0cywKICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSwKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfY2xpYiwKICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnCiAgICAgICAgICAgICAgICAgICAgKQpQSwMEFAAAAAAAAAAhAJGlaef5MgAA+TIAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgaW1wCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2R1X2J1aWxkX2V4dApmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IGNvcHlfZmlsZQpmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgpmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlciwgZ2V0X2NvbmZpZ192YXIKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgpmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKdHJ5OgogICAgIyBBdHRlbXB0IHRvIHVzZSBDeXRob24gZm9yIGJ1aWxkaW5nIGV4dGVuc2lvbnMsIGlmIGF2YWlsYWJsZQogICAgZnJvbSBDeXRob24uRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKZXhjZXB0IEltcG9ydEVycm9yOgogICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKCiMgbWFrZSBzdXJlIF9jb25maWdfdmFycyBpcyBpbml0aWFsaXplZApnZXRfY29uZmlnX3ZhcigiTERTSEFSRUQiKQpmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IF9jb25maWdfdmFycyBhcyBfQ09ORklHX1ZBUlMKCgpkZWYgX2N1c3RvbWl6ZV9jb21waWxlcl9mb3Jfc2hsaWIoY29tcGlsZXIpOgogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICMgYnVpbGRpbmcgLmR5bGliIHJlcXVpcmVzIGFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3Mgb24gT1NYOyBoZXJlIHdlCiAgICAgICAgIyB0ZW1wb3JhcmlseSBzdWJzdGl0dXRlIHRoZSBweWNvbmZpZy5oIHZhcmlhYmxlcyBzbyB0aGF0IGRpc3R1dGlscycKICAgICAgICAjICdjdXN0b21pemVfY29tcGlsZXInIHVzZXMgdGhlbSBiZWZvcmUgd2UgYnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgICAgdG1wID0gX0NPTkZJR19WQVJTLmNvcHkoKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBYWFggSGVscCEgIEkgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGV0aGVyIHRoZXNlIGFyZSByaWdodC4uLgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ0xEU0hBUkVEJ10gPSAoCiAgICAgICAgICAgICAgICAiZ2NjIC1XbCwteCAtZHluYW1pY2xpYiAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIikKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydDQ1NIQVJFRCddID0gIiAtZHluYW1pY2xpYiIKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydTTyddID0gIi5keWxpYiIKICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIF9DT05GSUdfVkFSUy5jbGVhcigpCiAgICAgICAgICAgIF9DT05GSUdfVkFSUy51cGRhdGUodG1wKQogICAgZWxzZToKICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCgoKaGF2ZV9ydGxkID0gRmFsc2UKdXNlX3N0dWJzID0gRmFsc2UKbGlidHlwZSA9ICdzaGFyZWQnCgppZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICB1c2Vfc3R1YnMgPSBUcnVlCmVsaWYgb3MubmFtZSAhPSAnbnQnOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBkbAogICAgICAgIHVzZV9zdHVicyA9IGhhdmVfcnRsZCA9IGhhc2F0dHIoZGwsICdSVExEX05PVycpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKaWZfZGwgPSBsYW1iZGEgczogcyBpZiBoYXZlX3J0bGQgZWxzZSAnJwoKCmRlZiBnZXRfYWJpM19zdWZmaXgoKToKICAgICIiIlJldHVybiB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGFuIGFiaTMtY29tcGxpYW50IEV4dGVuc2lvbigpIiIiCiAgICBmb3Igc3VmZml4LCBfLCBfIGluIChzIGZvciBzIGluIGltcC5nZXRfc3VmZml4ZXMoKSBpZiBzWzJdID09IGltcC5DX0VYVEVOU0lPTik6CiAgICAgICAgaWYgJy5hYmkzJyBpbiBzdWZmaXg6ICAjIFVuaXgKICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAogICAgICAgIGVsaWYgc3VmZml4ID09ICcucHlkJzogICMgV2luZG93cwogICAgICAgICAgICByZXR1cm4gc3VmZml4CgoKY2xhc3MgYnVpbGRfZXh0KF9idWlsZF9leHQpOgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiJCdWlsZCBleHRlbnNpb25zIGluIGJ1aWxkIGRpcmVjdG9yeSwgdGhlbiBjb3B5IGlmIC0taW5wbGFjZSIiIgogICAgICAgIG9sZF9pbnBsYWNlLCBzZWxmLmlucGxhY2UgPSBzZWxmLmlucGxhY2UsIDAKICAgICAgICBfYnVpbGRfZXh0LnJ1bihzZWxmKQogICAgICAgIHNlbGYuaW5wbGFjZSA9IG9sZF9pbnBsYWNlCiAgICAgICAgaWYgb2xkX2lucGxhY2U6CiAgICAgICAgICAgIHNlbGYuY29weV9leHRlbnNpb25zX3RvX3NvdXJjZSgpCgogICAgZGVmIGNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2Uoc2VsZik6CiAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgIG1vZHBhdGggPSBmdWxsbmFtZS5zcGxpdCgnLicpCiAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzotMV0pCiAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCiAgICAgICAgICAgIGRlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgICAgIHNyY19maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgZmlsZW5hbWUpCgogICAgICAgICAgICAjIEFsd2F5cyBjb3B5LCBldmVuIGlmIHNvdXJjZSBpcyBvbGRlciB0aGFuIGRlc3RpbmF0aW9uLCB0byBlbnN1cmUKICAgICAgICAgICAgIyB0aGF0IHRoZSByaWdodCBleHRlbnNpb25zIGZvciB0aGUgY3VycmVudCBQeXRob24vcGxhdGZvcm0gYXJlCiAgICAgICAgICAgICMgdXNlZC4KICAgICAgICAgICAgY29weV9maWxlKAogICAgICAgICAgICAgICAgc3JjX2ZpbGVuYW1lLCBkZXN0X2ZpbGVuYW1lLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKHBhY2thZ2VfZGlyIG9yIG9zLmN1cmRpciwgZXh0LCBUcnVlKQoKICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IF9idWlsZF9leHQuZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSkKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmV4dF9tYXA6CiAgICAgICAgICAgIGV4dCA9IHNlbGYuZXh0X21hcFtmdWxsbmFtZV0KICAgICAgICAgICAgdXNlX2FiaTMgPSAoCiAgICAgICAgICAgICAgICBzaXguUFkzCiAgICAgICAgICAgICAgICBhbmQgZ2V0YXR0cihleHQsICdweV9saW1pdGVkX2FwaScpCiAgICAgICAgICAgICAgICBhbmQgZ2V0X2FiaTNfc3VmZml4KCkKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiB1c2VfYWJpMzoKICAgICAgICAgICAgICAgIHNvX2V4dCA9IF9nZXRfY29uZmlnX3Zhcl84MzcoJ0VYVF9TVUZGSVgnKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LWxlbihzb19leHQpXQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSArIGdldF9hYmkzX3N1ZmZpeCgpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbiwgbGlidHlwZSkKICAgICAgICAgICAgZWxpZiB1c2Vfc3R1YnMgYW5kIGV4dC5fbGlua3NfdG9fZHluYW1pYzoKICAgICAgICAgICAgICAgIGQsIGZuID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZCwgJ2RsLScgKyBmbikKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5zaGxpYl9jb21waWxlciA9IE5vbmUKICAgICAgICBzZWxmLnNobGlicyA9IFtdCiAgICAgICAgc2VsZi5leHRfbWFwID0ge30KCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBzZWxmLmV4dGVuc2lvbnMgb3IgW10KICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCiAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpXQogICAgICAgIGlmIHNlbGYuc2hsaWJzOgogICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZXh0Ll9mdWxsX25hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGZ1bGxuYW1lID0gZXh0Ll9mdWxsX25hbWUKICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAoKICAgICAgICAgICAgIyBkaXN0dXRpbHMgMy4xIHdpbGwgYWxzbyBhc2sgZm9yIG1vZHVsZSBuYW1lcwogICAgICAgICAgICAjIFhYWCB3aGF0IHRvIGRvIHdpdGggY29uZmxpY3RzPwogICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWUuc3BsaXQoJy4nKVstMV1dID0gZXh0CgogICAgICAgICAgICBsdGQgPSBzZWxmLnNobGlicyBhbmQgc2VsZi5saW5rc190b19keW5hbWljKGV4dCkgb3IgRmFsc2UKICAgICAgICAgICAgbnMgPSBsdGQgYW5kIHVzZV9zdHVicyBhbmQgbm90IGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KQogICAgICAgICAgICBleHQuX2xpbmtzX3RvX2R5bmFtaWMgPSBsdGQKICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbnMKICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgbGliZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgZmlsZW5hbWUpKQogICAgICAgICAgICBpZiBsdGQgYW5kIGxpYmRpciBub3QgaW4gZXh0LmxpYnJhcnlfZGlyczoKICAgICAgICAgICAgICAgIGV4dC5saWJyYXJ5X2RpcnMuYXBwZW5kKGxpYmRpcikKICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgogICAgICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZChvcy5jdXJkaXIpCgogICAgZGVmIHNldHVwX3NobGliX2NvbXBpbGVyKHNlbGYpOgogICAgICAgIGNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlciA9IG5ld19jb21waWxlcigKICAgICAgICAgICAgY29tcGlsZXI9c2VsZi5jb21waWxlciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPXNlbGYuZm9yY2UKICAgICAgICApCiAgICAgICAgX2N1c3RvbWl6ZV9jb21waWxlcl9mb3Jfc2hsaWIoY29tcGlsZXIpCgogICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfaW5jbHVkZV9kaXJzKHNlbGYuaW5jbHVkZV9kaXJzKQogICAgICAgIGlmIHNlbGYuZGVmaW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcwogICAgICAgICAgICBmb3IgKG5hbWUsIHZhbHVlKSBpbiBzZWxmLmRlZmluZToKICAgICAgICAgICAgICAgIGNvbXBpbGVyLmRlZmluZV9tYWNybyhuYW1lLCB2YWx1ZSkKICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi51bmRlZjoKICAgICAgICAgICAgICAgIGNvbXBpbGVyLnVuZGVmaW5lX21hY3JvKG1hY3JvKQogICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyaWVzKHNlbGYubGlicmFyaWVzKQogICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyeV9kaXJzKHNlbGYubGlicmFyeV9kaXJzKQogICAgICAgIGlmIHNlbGYucnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9ydW50aW1lX2xpYnJhcnlfZGlycyhzZWxmLnJwYXRoKQogICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlua19vYmplY3RzKHNlbGYubGlua19vYmplY3RzKQoKICAgICAgICAjIGhhY2sgc28gZGlzdHV0aWxzJyBidWlsZF9leHRlbnNpb24oKSBidWlsZHMgYSBsaWJyYXJ5IGluc3RlYWQKICAgICAgICBjb21waWxlci5saW5rX3NoYXJlZF9vYmplY3QgPSBsaW5rX3NoYXJlZF9vYmplY3QuX19nZXRfXyhjb21waWxlcikKCiAgICBkZWYgZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICByZXR1cm4gZXh0LmV4cG9ydF9zeW1ib2xzCiAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCkKCiAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAgICAgICAgZXh0Ll9jb252ZXJ0X3B5eF9zb3VyY2VzX3RvX2xhbmcoKQogICAgICAgIF9jb21waWxlciA9IHNlbGYuY29tcGlsZXIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyCiAgICAgICAgICAgIF9idWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCkKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgogICAgICAgICAgICAgICAgY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykuYnVpbGRfbGliCiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIoY21kLCBleHQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IF9jb21waWxlcgoKICAgIGRlZiBsaW5rc190b19keW5hbWljKHNlbGYsIGV4dCk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4dCcgbGlua3MgdG8gYSBkeW5hbWljIGxpYiBpbiB0aGUgc2FtZSBwYWNrYWdlIiIiCiAgICAgICAgIyBYWFggdGhpcyBzaG91bGQgY2hlY2sgdG8gZW5zdXJlIHRoZSBsaWIgaXMgYWN0dWFsbHkgYmVpbmcgYnVpbHQKICAgICAgICAjIFhYWCBhcyBkeW5hbWljLCBhbmQgbm90IGp1c3QgdXNpbmcgYSBsb2NhbGx5LWZvdW5kIHZlcnNpb24gb3IgYQogICAgICAgICMgWFhYIHN0YXRpYy1jb21waWxlZCB2ZXJzaW9uCiAgICAgICAgbGlibmFtZXMgPSBkaWN0LmZyb21rZXlzKFtsaWIuX2Z1bGxfbmFtZSBmb3IgbGliIGluIHNlbGYuc2hsaWJzXSkKICAgICAgICBwa2cgPSAnLicuam9pbihleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpWzotMV0gKyBbJyddKQogICAgICAgIHJldHVybiBhbnkocGtnICsgbGlibmFtZSBpbiBsaWJuYW1lcyBmb3IgbGlibmFtZSBpbiBleHQubGlicmFyaWVzKQoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfb3V0cHV0cyhzZWxmKSArIHNlbGYuX19nZXRfc3R1YnNfb3V0cHV0cygpCgogICAgZGVmIF9fZ2V0X3N0dWJzX291dHB1dHMoc2VsZik6CiAgICAgICAgIyBhc3NlbWJsZSB0aGUgYmFzZSBuYW1lIGZvciBlYWNoIGV4dGVuc2lvbiB0aGF0IG5lZWRzIGEgc3R1YgogICAgICAgIG5zX2V4dF9iYXNlcyA9ICgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkKICAgICAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViCiAgICAgICAgKQogICAgICAgICMgcGFpciBlYWNoIGJhc2Ugd2l0aCB0aGUgZXh0ZW5zaW9uCiAgICAgICAgcGFpcnMgPSBpdGVydG9vbHMucHJvZHVjdChuc19leHRfYmFzZXMsIHNlbGYuX19nZXRfb3V0cHV0X2V4dGVuc2lvbnMoKSkKICAgICAgICByZXR1cm4gbGlzdChiYXNlICsgZm5leHQgZm9yIGJhc2UsIGZuZXh0IGluIHBhaXJzKQoKICAgIGRlZiBfX2dldF9vdXRwdXRfZXh0ZW5zaW9ucyhzZWxmKToKICAgICAgICB5aWVsZCAnLnB5JwogICAgICAgIHlpZWxkICcucHljJwogICAgICAgIGlmIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLm9wdGltaXplOgogICAgICAgICAgICB5aWVsZCAnLnB5bycKCiAgICBkZWYgd3JpdGVfc3R1YihzZWxmLCBvdXRwdXRfZGlyLCBleHQsIGNvbXBpbGU9RmFsc2UpOgogICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyB0byAlcyIsIGV4dC5fZnVsbF9uYW1lLAogICAgICAgICAgICAgICAgIG91dHB1dF9kaXIpCiAgICAgICAgc3R1Yl9maWxlID0gKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkgKwogICAgICAgICAgICAgICAgICAgICAnLnB5JykKICAgICAgICBpZiBjb21waWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHViX2ZpbGUgKyAiIGFscmVhZHkgZXhpc3RzISBQbGVhc2UgZGVsZXRlLiIpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZiA9IG9wZW4oc3R1Yl9maWxlLCAndycpCiAgICAgICAgICAgIGYud3JpdGUoCiAgICAgICAgICAgICAgICAnXG4nLmpvaW4oWwogICAgICAgICAgICAgICAgICAgICJkZWYgX19ib290c3RyYXBfXygpOiIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2ZpbGVfXywgX19sb2FkZXJfXyIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGltcG9ydCBzeXMsIG9zLCBwa2dfcmVzb3VyY2VzLCBpbXAiICsgaWZfZGwoIiwgZGwiKSwKICAgICAgICAgICAgICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lIgogICAgICAgICAgICAgICAgICAgICIoX19uYW1lX18sJXIpIgogICAgICAgICAgICAgICAgICAgICUgb3MucGF0aC5iYXNlbmFtZShleHQuX2ZpbGVfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fIiwKICAgICAgICAgICAgICAgICAgICAiICAgaWYgJ19fbG9hZGVyX18nIGluIGdsb2JhbHMoKToiLAogICAgICAgICAgICAgICAgICAgICIgICAgICAgZGVsIF9fbG9hZGVyX18iLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICBvbGRfZmxhZ3MgPSBzeXMuZ2V0ZGxvcGVuZmxhZ3MoKSIpLAogICAgICAgICAgICAgICAgICAgICIgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkiLAogICAgICAgICAgICAgICAgICAgICIgICB0cnk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKGRsLlJUTERfTk9XKSIpLAogICAgICAgICAgICAgICAgICAgICIgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKICAgICAgICAgICAgICAgICAgICAiICAgZmluYWxseToiLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhvbGRfZmxhZ3MpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob2xkX2RpcikiLAogICAgICAgICAgICAgICAgICAgICJfX2Jvb3RzdHJhcF9fKCkiLAogICAgICAgICAgICAgICAgICAgICIiICAjIHRlcm1pbmFsIFxuCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIGlmIGNvbXBpbGU6CiAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQoKICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT0wLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGxfbGliJykub3B0aW1pemUKICAgICAgICAgICAgaWYgb3B0aW1pemUgPiAwOgogICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT1vcHRpbWl6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKSBhbmQgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhzdHViX2ZpbGUpCgoKaWYgdXNlX3N0dWJzIG9yIG9zLm5hbWUgPT0gJ250JzoKICAgICMgQnVpbGQgc2hhcmVkIGxpYnJhcmllcwogICAgIwogICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdCgKICAgICAgICAgICAgc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCiAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAogICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwKICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CiAgICAgICAgc2VsZi5saW5rKAogICAgICAgICAgICBzZWxmLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwKICAgICAgICAgICAgb3V0cHV0X2RpciwgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAogICAgICAgICAgICBleHBvcnRfc3ltYm9scywgZGVidWcsIGV4dHJhX3ByZWFyZ3MsIGV4dHJhX3Bvc3RhcmdzLAogICAgICAgICAgICBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZwogICAgICAgICkKZWxzZToKICAgICMgQnVpbGQgc3RhdGljIGxpYnJhcmllcyBldmVyeXdoZXJlIGVsc2UKICAgIGxpYnR5cGUgPSAnc3RhdGljJwoKICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3QoCiAgICAgICAgICAgIHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsIGxpYnJhcmllcz1Ob25lLAogICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsCiAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgogICAgICAgICMgWFhYIHdlIG5lZWQgdG8gZWl0aGVyIGRpc2FsbG93IHRoZXNlIGF0dHJzIG9uIExpYnJhcnkgaW5zdGFuY2VzLAogICAgICAgICMgb3Igd2Fybi9hYm9ydCBoZXJlIGlmIHNldCwgb3Igc29tZXRoaW5nLi4uCiAgICAgICAgIyBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCiAgICAgICAgIyBleHBvcnRfc3ltYm9scz1Ob25lLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCiAgICAgICAgIyBidWlsZF90ZW1wPU5vbmUKCiAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgTm9uZSAgIyBkaXN0dXRpbHMgYnVpbGRfZXh0IGRvZXNuJ3QgcGFzcyB0aGlzCiAgICAgICAgb3V0cHV0X2RpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KG91dHB1dF9saWJuYW1lKQogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQogICAgICAgIGlmIHNlbGYubGlicmFyeV9maWxlbmFtZSgieCIpLnN0YXJ0c3dpdGgoJ2xpYicpOgogICAgICAgICAgICAjIHN0cmlwICdsaWInIHByZWZpeDsgdGhpcyBpcyBrbHVkZ3kgaWYgc29tZSBwbGF0Zm9ybSB1c2VzCiAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgcHJlZml4CiAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbMzpdCgogICAgICAgIHNlbGYuY3JlYXRlX3N0YXRpY19saWIoCiAgICAgICAgICAgIG9iamVjdHMsIGJhc2VuYW1lLCBvdXRwdXRfZGlyLCBkZWJ1ZywgdGFyZ2V0X2xhbmcKICAgICAgICApCgoKZGVmIF9nZXRfY29uZmlnX3Zhcl84MzcobmFtZSk6CiAgICAiIiIKICAgIEluIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvcHVsbC84MzcsIHdlIGRpc2NvdmVyZWQKICAgIFB5dGhvbiAzLjMuMCBleHBvc2VzIHRoZSBleHRlbnNpb24gc3VmZml4IHVuZGVyIHRoZSBuYW1lICdTTycuCiAgICAiIiIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMywgMSk6CiAgICAgICAgbmFtZSA9ICdTTycKICAgIHJldHVybiBnZXRfY29uZmlnX3ZhcihuYW1lKQpQSwMEFAAAAAAAAAAhAEBGQtx8JQAAfCUAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weSBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgZm5tYXRjaAppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGlvCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBpdGVydG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIsIGZpbHRlcmZhbHNlCgp0cnk6CiAgICBmcm9tIHNldHVwdG9vbHMubGliMnRvM19leCBpbXBvcnQgTWl4aW4ydG8zCmV4Y2VwdCBJbXBvcnRFcnJvcjoKCiAgICBjbGFzcyBNaXhpbjJ0bzM6CiAgICAgICAgZGVmIHJ1bl8ydG8zKHNlbGYsIGZpbGVzLCBkb2N0ZXN0cz1UcnVlKToKICAgICAgICAgICAgImRvIG5vdGhpbmciCgoKY2xhc3MgYnVpbGRfcHkob3JpZy5idWlsZF9weSwgTWl4aW4ydG8zKToKICAgICIiIkVuaGFuY2VkICdidWlsZF9weScgY29tbWFuZCB0aGF0IGluY2x1ZGVzIGRhdGEgZmlsZXMgd2l0aCBwYWNrYWdlcwoKICAgIFRoZSBkYXRhIGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIGEgJ3BhY2thZ2VfZGF0YScgYXJndW1lbnQgdG8gJ3NldHVwKCknLgogICAgU2VlICdzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uJyBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIEFsc28sIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ2J1aWxkX3B5JyBjb21tYW5kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBib3RoCiAgICAncHlfbW9kdWxlcycgYW5kICdwYWNrYWdlcycgaW4gdGhlIHNhbWUgc2V0dXAgb3BlcmF0aW9uLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5idWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RhdGEKICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gKHNlbGYuZGlzdHJpYnV0aW9uLmV4Y2x1ZGVfcGFja2FnZV9kYXRhIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKICAgICAgICBpZiAnZGF0YV9maWxlcycgaW4gc2VsZi5fX2RpY3RfXzoKICAgICAgICAgICAgZGVsIHNlbGYuX19kaWN0X19bJ2RhdGFfZmlsZXMnXQogICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzID0gW10KICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMyA9IFtdCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiJCdWlsZCBtb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNvcHkgZGF0YSBmaWxlcyB0byBidWlsZCBkaXJlY3RvcnkiIiIKICAgICAgICBpZiBub3Qgc2VsZi5weV9tb2R1bGVzIGFuZCBub3Qgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZV9kYXRhKCkKCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgRmFsc2UpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgVHJ1ZSkKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX19kb2N0ZXN0c18ydG8zLCBUcnVlKQoKICAgICAgICAjIE9ubHkgY29tcGlsZSBhY3R1YWwgLnB5IGZpbGVzLCB1c2luZyBvdXIgYmFzZSBjbGFzcycgaWRlYSBvZiB3aGF0IG91cgogICAgICAgICMgb3V0cHV0IGZpbGVzIGFyZS4KICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvcmlnLmJ1aWxkX3B5LmdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MCkpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICJsYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzIgogICAgICAgIGlmIGF0dHIgPT0gJ2RhdGFfZmlsZXMnOgogICAgICAgICAgICBzZWxmLmRhdGFfZmlsZXMgPSBzZWxmLl9nZXRfZGF0YV9maWxlcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFfZmlsZXMKICAgICAgICByZXR1cm4gb3JpZy5idWlsZF9weS5fX2dldGF0dHJfXyhzZWxmLCBhdHRyKQoKICAgIGRlZiBidWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSk6CiAgICAgICAgaWYgc2l4LlBZMiBhbmQgaXNpbnN0YW5jZShwYWNrYWdlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgIyBhdm9pZCBlcnJvcnMgb24gUHl0aG9uIDIgd2hlbiB1bmljb2RlIGlzIHBhc3NlZCAoIzE5MCkKICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2Uuc3BsaXQoJy4nKQogICAgICAgIG91dGZpbGUsIGNvcGllZCA9IG9yaWcuYnVpbGRfcHkuYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSkKICAgICAgICBpZiBjb3BpZWQ6CiAgICAgICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzLmFwcGVuZChvdXRmaWxlKQogICAgICAgIHJldHVybiBvdXRmaWxlLCBjb3BpZWQKCiAgICBkZWYgX2dldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIGxpc3Qgb2YgJyhwYWNrYWdlLHNyY19kaXIsYnVpbGRfZGlyLGZpbGVuYW1lcyknIHR1cGxlcyIiIgogICAgICAgIHNlbGYuYW5hbHl6ZV9tYW5pZmVzdCgpCiAgICAgICAgcmV0dXJuIGxpc3QobWFwKHNlbGYuX2dldF9wa2dfZGF0YV9maWxlcywgc2VsZi5wYWNrYWdlcyBvciAoKSkpCgogICAgZGVmIF9nZXRfcGtnX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgc3JjX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCgogICAgICAgICMgQ29tcHV0ZSBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeQogICAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguam9pbigqKFtzZWxmLmJ1aWxkX2xpYl0gKyBwYWNrYWdlLnNwbGl0KCcuJykpKQoKICAgICAgICAjIFN0cmlwIGRpcmVjdG9yeSBmcm9tIGdsb2JiZWQgZmlsZW5hbWVzCiAgICAgICAgZmlsZW5hbWVzID0gWwogICAgICAgICAgICBvcy5wYXRoLnJlbHBhdGgoZmlsZSwgc3JjX2RpcikKICAgICAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5maW5kX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpcikKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzCgogICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiJSZXR1cm4gZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBwYXR0ZXJucyA9IHNlbGYuX2dldF9wbGF0Zm9ybV9wYXR0ZXJucygKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIGdsb2JzX2V4cGFuZGVkID0gbWFwKGdsb2IsIHBhdHRlcm5zKQogICAgICAgICMgZmxhdHRlbiB0aGUgZXhwYW5kZWQgZ2xvYnMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgZ2xvYnNfbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKGdsb2JzX2V4cGFuZGVkKQogICAgICAgIGdsb2JfZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2JzX21hdGNoZXMpCiAgICAgICAgZmlsZXMgPSBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMuZ2V0KHBhY2thZ2UsIFtdKSwKICAgICAgICAgICAgZ2xvYl9maWxlcywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYuZXhjbHVkZV9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKQoKICAgIGRlZiBidWlsZF9wYWNrYWdlX2RhdGEoc2VsZik6CiAgICAgICAgIiIiQ29weSBkYXRhIGZpbGVzIGludG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgb3V0ZiwgY29waWVkID0gc2VsZi5jb3B5X2ZpbGUoc3JjZmlsZSwgdGFyZ2V0KQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguYWJzcGF0aChzcmNmaWxlKQogICAgICAgICAgICAgICAgaWYgKGNvcGllZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgc3JjZmlsZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX19kb2N0ZXN0c18ydG8zLmFwcGVuZChvdXRmKQoKICAgIGRlZiBhbmFseXplX21hbmlmZXN0KHNlbGYpOgogICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMgPSBtZiA9IHt9CiAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzcmNfZGlycyA9IHt9CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgICAgIHNyY19kaXJzW2Fzc2VydF9yZWxhdGl2ZShzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKSldID0gcGFja2FnZQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBmb3IgcGF0aCBpbiBlaV9jbWQuZmlsZWxpc3QuZmlsZXM6CiAgICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KGFzc2VydF9yZWxhdGl2ZShwYXRoKSkKICAgICAgICAgICAgcHJldiA9IE5vbmUKICAgICAgICAgICAgb2xkZiA9IGYKICAgICAgICAgICAgd2hpbGUgZCBhbmQgZCAhPSBwcmV2IGFuZCBkIG5vdCBpbiBzcmNfZGlyczoKICAgICAgICAgICAgICAgIHByZXYgPSBkCiAgICAgICAgICAgICAgICBkLCBkZiA9IG9zLnBhdGguc3BsaXQoZCkKICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZGYsIGYpCiAgICAgICAgICAgIGlmIGQgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKSBhbmQgZiA9PSBvbGRmOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIGl0J3MgYSBtb2R1bGUsIG5vdCBkYXRhCiAgICAgICAgICAgICAgICBtZi5zZXRkZWZhdWx0KHNyY19kaXJzW2RdLCBbXSkuYXBwZW5kKHBhdGgpCgogICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHBhc3MgICMgTGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyBpbiBfZ2V0X2RhdGFfZmlsZXMoKSBmdW5jdGlvbi4KCiAgICBkZWYgY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CiAgICAgICAgIiIiQ2hlY2sgbmFtZXNwYWNlIHBhY2thZ2VzJyBfX2luaXRfXyBmb3IgZGVjbGFyZV9uYW1lc3BhY2UiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaW5pdF9weSA9IG9yaWcuYnVpbGRfcHkuY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2RpcikKICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0gPSBpbml0X3B5CgogICAgICAgIGlmIG5vdCBpbml0X3B5IG9yIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICBpZiBwa2cgPT0gcGFja2FnZSBvciBwa2cuc3RhcnRzd2l0aChwYWNrYWdlICsgJy4nKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICAgICAgd2l0aCBpby5vcGVuKGluaXRfcHksICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICBpZiBiJ2RlY2xhcmVfbmFtZXNwYWNlJyBub3QgaW4gY29udGVudHM6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIHBhY2thZ2UgcHJvYmxlbTogJXMgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSwgYnV0ICIKICAgICAgICAgICAgICAgICJpdHNcbl9faW5pdF9fLnB5IGRvZXMgbm90IGNhbGwgZGVjbGFyZV9uYW1lc3BhY2UoKSEgUGxlYXNlICIKICAgICAgICAgICAgICAgICdmaXggaXQuXG4oU2VlIHRoZSBzZXR1cHRvb2xzIG1hbnVhbCB1bmRlciAnCiAgICAgICAgICAgICAgICAnIk5hbWVzcGFjZSBQYWNrYWdlcyIgZm9yIGRldGFpbHMuKVxuIicgJSAocGFja2FnZSwpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkID0ge30KICAgICAgICBvcmlnLmJ1aWxkX3B5LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQoKICAgIGRlZiBnZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgcmVzID0gb3JpZy5idWlsZF9weS5nZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCwgcmVzKQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgZXhjbHVkZV9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKToKICAgICAgICAiIiJGaWx0ZXIgZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBmaWxlcyA9IGxpc3QoZmlsZXMpCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIG1hdGNoX2dyb3VwcyA9ICgKICAgICAgICAgICAgZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdHRlcm4pCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zCiAgICAgICAgKQogICAgICAgICMgZmxhdHRlbiB0aGUgZ3JvdXBzIG9mIG1hdGNoZXMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKG1hdGNoX2dyb3VwcykKICAgICAgICBiYWQgPSBzZXQobWF0Y2hlcykKICAgICAgICBrZWVwZXJzID0gKAogICAgICAgICAgICBmbgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXMKICAgICAgICAgICAgaWYgZm4gbm90IGluIGJhZAogICAgICAgICkKICAgICAgICAjIGRpdGNoIGR1cGVzCiAgICAgICAgcmV0dXJuIGxpc3QoX3VuaXF1ZV9ldmVyc2VlbihrZWVwZXJzKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9wbGF0Zm9ybV9wYXR0ZXJucyhzcGVjLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiIKICAgICAgICB5aWVsZCBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHBhdHRlcm5zIChzdWl0YWJsZSBmb3IgZ2xvYgogICAgICAgIG9yIGZuX21hdGNoKSBmcm9tIGEgZ2xvYi1iYXNlZCBzcGVjIChzdWNoIGFzCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgb3Igc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSkKICAgICAgICBtYXRjaGluZyBwYWNrYWdlIGluIHNyY19kaXIuCiAgICAgICAgIiIiCiAgICAgICAgcmF3X3BhdHRlcm5zID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzcGVjLmdldCgnJywgW10pLAogICAgICAgICAgICBzcGVjLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCBjb252ZXJ0X3BhdGgocGF0dGVybikpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHJhd19wYXR0ZXJucwogICAgICAgICkKCgojIGZyb20gUHl0aG9uIGRvY3MKZGVmIF91bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgc2VlbiA9IHNldCgpCiAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiBhc3NlcnRfcmVsYXRpdmUocGF0aCk6CiAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICByZXR1cm4gcGF0aAogICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCgogICAgbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEVycm9yOiBzZXR1cCBzY3JpcHQgc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGg6CgogICAgICAgICAgICAlcwoKICAgICAgICBzZXR1cCgpIGFyZ3VtZW50cyBtdXN0ICphbHdheXMqIGJlIC8tc2VwYXJhdGVkIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQogICAgICAgIHNldHVwLnB5IGRpcmVjdG9yeSwgKm5ldmVyKiBhYnNvbHV0ZSBwYXRocy4KICAgICAgICAiIiIpLmxzdHJpcCgpICUgcGF0aAogICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihtc2cpClBLAwQUAAAAAAAAACEAQFw7/24fAABuHwAANQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBnbG9iCmltcG9ydCBpbwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBub3JtYWxpemVfcGF0aApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IG5hbWVzcGFjZXMKaW1wb3J0IHNldHVwdG9vbHMKCgpjbGFzcyBkZXZlbG9wKG5hbWVzcGFjZXMuRGV2ZWxvcEluc3RhbGxlciwgZWFzeV9pbnN0YWxsKToKICAgICIiIlNldCB1cCBwYWNrYWdlIGZvciBkZXZlbG9wbWVudCIiIgoKICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgcGFja2FnZSBpbiAnZGV2ZWxvcG1lbnQgbW9kZSciCgogICAgdXNlcl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKICAgICAgICAoInVuaW5zdGFsbCIsICJ1IiwgIlVuaW5zdGFsbCB0aGlzIHNvdXJjZSBwYWNrYWdlIiksCiAgICAgICAgKCJlZ2ctcGF0aD0iLCBOb25lLCAiU2V0IHRoZSBwYXRoIHRvIGJlIHVzZWQgaW4gdGhlIC5lZ2ctbGluayBmaWxlIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsndW5pbnN0YWxsJ10KCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlICAjIG92ZXJyaWRlIGJhc2UKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsOgogICAgICAgICAgICBzZWxmLm11bHRpX3ZlcnNpb24gPSBUcnVlCiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsX2xpbmsoKQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9uYW1lc3BhY2VzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZm9yX2RldmVsb3BtZW50KCkKICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudW5pbnN0YWxsID0gTm9uZQogICAgICAgIHNlbGYuZWdnX3BhdGggPSBOb25lCiAgICAgICAgZWFzeV9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IE5vbmUKICAgICAgICBzZWxmLmFsd2F5c19jb3B5X2Zyb20gPSAnLicgICMgYWx3YXlzIGNvcHkgZWdncyBpbnN0YWxsZWQgaW4gY3VyZGlyCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGlmIGVpLmJyb2tlbl9lZ2dfaW5mbzoKICAgICAgICAgICAgdGVtcGxhdGUgPSAiUGxlYXNlIHJlbmFtZSAlciB0byAlciBiZWZvcmUgdXNpbmcgJ2RldmVsb3AnIgogICAgICAgICAgICBhcmdzID0gZWkuZWdnX2luZm8sIGVpLmJyb2tlbl9lZ2dfaW5mbwogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcih0ZW1wbGF0ZSAlIGFyZ3MpCiAgICAgICAgc2VsZi5hcmdzID0gW2VpLmVnZ19uYW1lXQoKICAgICAgICBlYXN5X2luc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKICAgICAgICAjIHBpY2sgdXAgc2V0dXAtZGlyIC5lZ2cgZmlsZXMgb25seTogbm8gLmVnZy1pbmZvCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LnNjYW4oZ2xvYi5nbG9iKCcqLmVnZycpKQoKICAgICAgICBlZ2dfbGlua19mbiA9IGVpLmVnZ19uYW1lICsgJy5lZ2ctbGluaycKICAgICAgICBzZWxmLmVnZ19saW5rID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGVnZ19saW5rX2ZuKQogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBlaS5lZ2dfYmFzZQogICAgICAgIGlmIHNlbGYuZWdnX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfYmFzZSkKCiAgICAgICAgdGFyZ2V0ID0gbm9ybWFsaXplX3BhdGgoc2VsZi5lZ2dfYmFzZSkKICAgICAgICBlZ2dfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWdnX3BhdGgpKQogICAgICAgIGlmIGVnZ19wYXRoICE9IHRhcmdldDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiLS1lZ2ctcGF0aCBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBpbnN0YWxsIgogICAgICAgICAgICAgICAgIiBkaXJlY3RvcnkgdG8gIiArIHRhcmdldAogICAgICAgICAgICApCgogICAgICAgICMgTWFrZSBhIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UKICAgICAgICBzZWxmLmRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgUGF0aE1ldGFkYXRhKHRhcmdldCwgb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19pbmZvKSksCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1laS5lZ2dfbmFtZQogICAgICAgICkKCiAgICAgICAgc2VsZi5zZXR1cF9wYXRoID0gc2VsZi5fcmVzb2x2ZV9zZXR1cF9wYXRoKAogICAgICAgICAgICBzZWxmLmVnZ19iYXNlLAogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICBzZWxmLmVnZ19wYXRoLAogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jlc29sdmVfc2V0dXBfcGF0aChlZ2dfYmFzZSwgaW5zdGFsbF9kaXIsIGVnZ19wYXRoKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBhIHBhdGggZnJvbSBlZ2dfYmFzZSBiYWNrIHRvICcuJyB3aGVyZSB0aGUKICAgICAgICBzZXR1cCBzY3JpcHQgcmVzaWRlcyBhbmQgZW5zdXJlIHRoYXQgcGF0aCBwb2ludHMgdG8gdGhlCiAgICAgICAgc2V0dXAgcGF0aCBmcm9tICRpbnN0YWxsX2Rpci8kZWdnX3BhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF90b19zZXR1cCA9IGVnZ19iYXNlLnJlcGxhY2Uob3Muc2VwLCAnLycpLnJzdHJpcCgnLycpCiAgICAgICAgaWYgcGF0aF90b19zZXR1cCAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIHBhdGhfdG9fc2V0dXAgPSAnLi4vJyAqIChwYXRoX3RvX3NldHVwLmNvdW50KCcvJykgKyAxKQogICAgICAgIHJlc29sdmVkID0gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihpbnN0YWxsX2RpciwgZWdnX3BhdGgsIHBhdGhfdG9fc2V0dXApCiAgICAgICAgKQogICAgICAgIGlmIHJlc29sdmVkICE9IG5vcm1hbGl6ZV9wYXRoKG9zLmN1cmRpcik6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGdldCBhIGNvbnNpc3RlbnQgcGF0aCB0byBzZXR1cCBzY3JpcHQgZnJvbSIKICAgICAgICAgICAgICAgICIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSIsIHJlc29sdmVkLCBub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpKQogICAgICAgIHJldHVybiBwYXRoX3RvX3NldHVwCgogICAgZGVmIGluc3RhbGxfZm9yX2RldmVsb3BtZW50KHNlbGYpOgogICAgICAgIGlmIHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKToKICAgICAgICAgICAgIyBJZiB3ZSBydW4gMnRvMyB3ZSBjYW4gbm90IGRvIHRoaXMgaW5wbGFjZToKCiAgICAgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfcHknLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgYnB5X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJidWlsZF9weSIpCiAgICAgICAgICAgIGJ1aWxkX3BhdGggPSBub3JtYWxpemVfcGF0aChicHlfY21kLmJ1aWxkX2xpYikKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucwogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdlZ2dfaW5mbycsIGVnZ19iYXNlPWJ1aWxkX3BhdGgpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgICAgICMgRml4dXAgZWdnLWxpbmsgYW5kIGVhc3ktaW5zdGFsbC5wdGgKICAgICAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgc2VsZi5kaXN0LmxvY2F0aW9uID0gYnVpbGRfcGF0aAogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLmRpc3QuX3Byb3ZpZGVyID0gUGF0aE1ldGFkYXRhKGJ1aWxkX3BhdGgsIGVpX2NtZC5lZ2dfaW5mbykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdpdGhvdXQgMnRvMyBpbnBsYWNlIHdvcmtzIGZpbmU6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkgICMgZW5zdXJlIHRoYXQgdGFyZ2V0IGRpciBpcyBzaXRlLXNhZmUKICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CiAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKICAgICAgICAgICAgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCgogICAgICAgICMgY3JlYXRlIGFuIC5lZ2ctbGluayBpbiB0aGUgaW5zdGFsbGF0aW9uIGRpciwgcG9pbnRpbmcgdG8gb3VyIGVnZwogICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmVnZ19saW5rLCAidyIpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKHNlbGYuZWdnX3BhdGggKyAiXG4iICsgc2VsZi5zZXR1cF9wYXRoKQogICAgICAgICMgcG9zdHByb2Nlc3MgdGhlIGluc3RhbGxlZCBkaXN0cm8sIGZpeGluZyB1cCAucHRoLCBpbnN0YWxsaW5nIHNjcmlwdHMsCiAgICAgICAgIyBhbmQgaGFuZGxpbmcgcmVxdWlyZW1lbnRzCiAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihOb25lLCBzZWxmLmRpc3QsIG5vdCBzZWxmLm5vX2RlcHMpCgogICAgZGVmIHVuaW5zdGFsbF9saW5rKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZWdnX2xpbmspOgogICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICAgICAgZWdnX2xpbmtfZmlsZSA9IG9wZW4oc2VsZi5lZ2dfbGluaykKICAgICAgICAgICAgY29udGVudHMgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBlZ2dfbGlua19maWxlXQogICAgICAgICAgICBlZ2dfbGlua19maWxlLmNsb3NlKCkKICAgICAgICAgICAgaWYgY29udGVudHMgbm90IGluIChbc2VsZi5lZ2dfcGF0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuZWdnX3BhdGgsIHNlbGYuc2V0dXBfcGF0aF0pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIkxpbmsgcG9pbnRzIHRvICVzOiB1bmluc3RhbGwgYWJvcnRlZCIsIGNvbnRlbnRzKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5lZ2dfbGluaykKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoc2VsZi5kaXN0KSAgIyByZW1vdmUgYW55IC5wdGggbGluayB0byB1cwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgICMgWFhYIHNob3VsZCBhbHNvIGNoZWNrIGZvciBlbnRyeSBwb2ludCBzY3JpcHRzIQogICAgICAgICAgICBsb2cud2FybigiTm90ZTogeW91IG11c3QgdW5pbnN0YWxsIG9yIHJlcGxhY2Ugc2NyaXB0cyBtYW51YWxseSEiKQoKICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIGRpc3QgaXMgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgIyBJbnN0YWxsaW5nIGEgZGVwZW5kZW5jeSwgc28gZmFsbCBiYWNrIHRvIG5vcm1hbCBiZWhhdmlvcgogICAgICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCkKCiAgICAgICAgIyBjcmVhdGUgd3JhcHBlciBzY3JpcHRzIGluIHRoZSBzY3JpcHQgZGlyLCBwb2ludGluZyB0byBkaXN0LnNjcmlwdHMKCiAgICAgICAgIyBuZXctc3R5bGUuLi4KICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCgogICAgICAgICMgLi4uYW5kIG9sZC1zdHlsZQogICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzIG9yIFtdOgogICAgICAgICAgICBzY3JpcHRfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChjb252ZXJ0X3BhdGgoc2NyaXB0X25hbWUpKQogICAgICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X3BhdGgpCiAgICAgICAgICAgIHdpdGggaW8ub3BlbihzY3JpcHRfcGF0aCkgYXMgc3RybToKICAgICAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gc3RybS5yZWFkKCkKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIHNjcmlwdF9wYXRoKQoKICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBkaXN0ID0gVmVyc2lvbmxlc3NSZXF1aXJlbWVudChkaXN0KQogICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCkKCgpjbGFzcyBWZXJzaW9ubGVzc1JlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiIKICAgIEFkYXB0IGEgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gdG8gc2ltcGx5IHJldHVybiB0aGUgcHJvamVjdAogICAgbmFtZSBhcyB0aGUgJ3JlcXVpcmVtZW50JyBzbyB0aGF0IHNjcmlwdHMgd2lsbCB3b3JrIGFjcm9zcwogICAgbXVsdGlwbGUgdmVyc2lvbnMuCgogICAgPj4+IGRpc3QgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSdmb28nLCB2ZXJzaW9uPScxLjAnKQogICAgPj4+IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vPT0xLjAnCiAgICA+Pj4gYWRhcHRlZF9kaXN0ID0gVmVyc2lvbmxlc3NSZXF1aXJlbWVudChkaXN0KQogICAgPj4+IHN0cihhZGFwdGVkX2Rpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICdmb28nCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CiAgICAgICAgc2VsZi5fX2Rpc3QgPSBkaXN0CgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX19kaXN0LCBuYW1lKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wcm9qZWN0X25hbWUKUEsDBBQAAAAAAAAAIQD/6PaRwAMAAMADAAA3AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weSIiIgpDcmVhdGUgYSBkaXN0X2luZm8gZGlyZWN0b3J5CkFzIGRlZmluZWQgaW4gdGhlIHdoZWVsIHNwZWNpZmljYXRpb24KIiIiCgppbXBvcnQgb3MKCmZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKCmNsYXNzIGRpc3RfaW5mbyhDb21tYW5kKToKCiAgICBkZXNjcmlwdGlvbiA9ICdjcmVhdGUgYSAuZGlzdC1pbmZvIGRpcmVjdG9yeScKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdlZ2ctYmFzZT0nLCAnZScsICJkaXJlY3RvcnkgY29udGFpbmluZyAuZWdnLWluZm8gZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGVnZ19pbmZvID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlZ2dfaW5mby5lZ2dfYmFzZSA9IHNlbGYuZWdnX2Jhc2UKICAgICAgICBlZ2dfaW5mby5maW5hbGl6ZV9vcHRpb25zKCkKICAgICAgICBlZ2dfaW5mby5ydW4oKQogICAgICAgIGRpc3RfaW5mb19kaXIgPSBlZ2dfaW5mby5lZ2dfaW5mb1s6LWxlbignLmVnZy1pbmZvJyldICsgJy5kaXN0LWluZm8nCiAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nICd7fSciLmZvcm1hdChvcy5wYXRoLmFic3BhdGgoZGlzdF9pbmZvX2RpcikpKQoKICAgICAgICBiZGlzdF93aGVlbCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdF93aGVlbCcpCiAgICAgICAgYmRpc3Rfd2hlZWwuZWdnMmRpc3QoZWdnX2luZm8uZWdnX2luZm8sIGRpc3RfaW5mb19kaXIpClBLAwQUAAAAAAAAACEAq3QS6VVUAQBVVAEAOgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkjIS91c3IvYmluL2VudiBweXRob24KIiIiCkVhc3kgSW5zdGFsbAotLS0tLS0tLS0tLS0KCkEgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgpwYWNrYWdlcy4gIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIGFjY29tcGFueWluZyBFYXN5SW5zdGFsbC50eHQKZmlsZSwgb3IgdmlzaXQgdGhlIGBFYXN5SW5zdGFsbCBob21lIHBhZ2VgX18uCgpfXyBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgoiIiIKCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoLCBzdWJzdF92YXJzCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzQXJnRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yLAogICAgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBJTlNUQUxMX1NDSEVNRVMsIFNDSEVNRV9LRVlTCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cyBpbXBvcnQgZmlyc3RfbGluZV9yZQpmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHJlCmltcG9ydCBzdGF0CmltcG9ydCByYW5kb20KaW1wb3J0IHRleHR3cmFwCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc2l0ZQppbXBvcnQgc3RydWN0CmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzaGxleAppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyLCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgcnVuX3NldHVwCmZyb20gc2V0dXB0b29scy5weTMxY29tcGF0IGltcG9ydCBnZXRfcGF0aCwgZ2V0X2NvbmZpZ192YXJzCmZyb20gc2V0dXB0b29scy5weTI3Y29tcGF0IGltcG9ydCBybXRyZWVfc2FmZQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgc2V0b3B0CmZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCmZyb20gc2V0dXB0b29scy5wYWNrYWdlX2luZGV4IGltcG9ydCAoCiAgICBQYWNrYWdlSW5kZXgsIHBhcnNlX3JlcXVpcmVtZW50X2FyZywgVVJMX1NDSEVNRSwKKQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgYmRpc3RfZWdnLCBlZ2dfaW5mbwpmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgeWllbGRfbGluZXMsIG5vcm1hbGl6ZV9wYXRoLCByZXNvdXJjZV9zdHJpbmcsIGVuc3VyZV9kaXJlY3RvcnksCiAgICBnZXRfZGlzdHJpYnV0aW9uLCBmaW5kX2Rpc3RyaWJ1dGlvbnMsIEVudmlyb25tZW50LCBSZXF1aXJlbWVudCwKICAgIERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBFZ2dNZXRhZGF0YSwgV29ya2luZ1NldCwgRGlzdHJpYnV0aW9uTm90Rm91bmQsCiAgICBWZXJzaW9uQ29uZmxpY3QsIERFVkVMT1BfRElTVCwKKQppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgojIFR1cm4gb24gUEVQNDQwV2FybmluZ3MKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImRlZmF1bHQiLCBjYXRlZ29yeT1wa2dfcmVzb3VyY2VzLlBFUDQ0MFdhcm5pbmcpCgpfX2FsbF9fID0gWwogICAgJ3NhbWVmaWxlJywgJ2Vhc3lfaW5zdGFsbCcsICdQdGhEaXN0cmlidXRpb25zJywgJ2V4dHJhY3Rfd2luaW5zdF9jZmcnLAogICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCl0KCgpkZWYgaXNfNjRiaXQoKToKICAgIHJldHVybiBzdHJ1Y3QuY2FsY3NpemUoIlAiKSA9PSA4CgoKZGVmIHNhbWVmaWxlKHAxLCBwMik6CiAgICAiIiIKICAgIERldGVybWluZSBpZiB0d28gcGF0aHMgcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUuCgogICAgQXVnbWVudHMgb3MucGF0aC5zYW1lZmlsZSB0byB3b3JrIG9uIFdpbmRvd3MgYW5kCiAgICBzdXBwcmVzc2VzIGVycm9ycyBpZiB0aGUgcGF0aCBkb2Vzbid0IGV4aXN0LgogICAgIiIiCiAgICBib3RoX2V4aXN0ID0gb3MucGF0aC5leGlzdHMocDEpIGFuZCBvcy5wYXRoLmV4aXN0cyhwMikKICAgIHVzZV9zYW1lZmlsZSA9IGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJykgYW5kIGJvdGhfZXhpc3QKICAgIGlmIHVzZV9zYW1lZmlsZToKICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShwMSwgcDIpCiAgICBub3JtX3AxID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkKICAgIG5vcm1fcDIgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDIpKQogICAgcmV0dXJuIG5vcm1fcDEgPT0gbm9ybV9wMgoKCmlmIHNpeC5QWTI6CgogICAgZGVmIF90b19hc2NpaShzKToKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2l4LnRleHRfdHlwZShzLCAnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQplbHNlOgoKICAgIGRlZiBfdG9fYXNjaWkocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCgogICAgZGVmIGlzYXNjaWkocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCl9vbmVfbGluZXIgPSBsYW1iZGEgdGV4dDogdGV4dHdyYXAuZGVkZW50KHRleHQpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnOyAnKQoKCmNsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKICAgICIiIk1hbmFnZSBhIGRvd25sb2FkL2J1aWxkL2luc3RhbGwgcHJvY2VzcyIiIgogICAgZGVzY3JpcHRpb24gPSAiRmluZC9nZXQvaW5zdGFsbCBQeXRob24gcGFja2FnZXMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKICAgICAgICAoInppcC1vayIsICJ6IiwgImluc3RhbGwgcGFja2FnZSBhcyBhIHppcGZpbGUiKSwKICAgICAgICAoIm11bHRpLXZlcnNpb24iLCAibSIsICJtYWtlIGFwcHMgaGF2ZSB0byByZXF1aXJlKCkgYSB2ZXJzaW9uIiksCiAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAogICAgICAgICgiaW5zdGFsbC1kaXI9IiwgImQiLCAiaW5zdGFsbCBwYWNrYWdlIHRvIERJUiIpLAogICAgICAgICgic2NyaXB0LWRpcj0iLCAicyIsICJpbnN0YWxsIHNjcmlwdHMgdG8gRElSIiksCiAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKICAgICAgICAoImFsd2F5cy1jb3B5IiwgImEiLCAiQ29weSBhbGwgbmVlZGVkIHBhY2thZ2VzIHRvIGluc3RhbGwgZGlyIiksCiAgICAgICAgKCJpbmRleC11cmw9IiwgImkiLCAiYmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXgiKSwKICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAogICAgICAgICgiYnVpbGQtZGlyZWN0b3J5PSIsICJiIiwKICAgICAgICAgImRvd25sb2FkL2V4dHJhY3QvYnVpbGQgaW4gRElSOyBrZWVwIHRoZSByZXN1bHRzIiksCiAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCiAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgogICAgICAgICAiLU8yIGZvciBcInB5dGhvbiAtT09cIiwgYW5kIC1PMCB0byBkaXNhYmxlIFtkZWZhdWx0OiAtTzBdIiksCiAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKICAgICAgICAgImZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyIpLAogICAgICAgICgnYWx3YXlzLXVuemlwJywgJ1onLCAiZG9uJ3QgaW5zdGFsbCBhcyBhIHppcGZpbGUsIG5vIG1hdHRlciB3aGF0IiksCiAgICAgICAgKCdzaXRlLWRpcnM9JywgJ1MnLCAibGlzdCBvZiBkaXJlY3RvcmllcyB3aGVyZSAucHRoIGZpbGVzIHdvcmsiKSwKICAgICAgICAoJ2VkaXRhYmxlJywgJ2UnLCAiSW5zdGFsbCBzcGVjaWZpZWQgcGFja2FnZXMgaW4gZWRpdGFibGUgZm9ybSIpLAogICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCiAgICAgICAgKCdhbGxvdy1ob3N0cz0nLCAnSCcsICJwYXR0ZXJuKHMpIHRoYXQgaG9zdG5hbWVzIG11c3QgbWF0Y2giKSwKICAgICAgICAoJ2xvY2FsLXNuYXBzaG90cy1vaycsICdsJywKICAgICAgICAgImFsbG93IGJ1aWxkaW5nIGVnZ3MgZnJvbSBsb2NhbCBjaGVja291dHMiKSwKICAgICAgICAoJ3ZlcnNpb24nLCBOb25lLCAicHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIpLAogICAgICAgICgnbm8tZmluZC1saW5rcycsIE5vbmUsCiAgICAgICAgICJEb24ndCBsb2FkIGZpbmQtbGlua3MgZGVmaW5lZCBpbiBwYWNrYWdlcyBiZWluZyBpbnN0YWxsZWQiKQogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICd6aXAtb2snLCAnbXVsdGktdmVyc2lvbicsICdleGNsdWRlLXNjcmlwdHMnLCAndXBncmFkZScsICdhbHdheXMtY29weScsCiAgICAgICAgJ2VkaXRhYmxlJywKICAgICAgICAnbm8tZGVwcycsICdsb2NhbC1zbmFwc2hvdHMtb2snLCAndmVyc2lvbicKICAgIF0KCiAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgaGVscF9tc2cgPSAiaW5zdGFsbCBpbiB1c2VyIHNpdGUtcGFja2FnZSAnJXMnIiAlIHNpdGUuVVNFUl9TSVRFCiAgICAgICAgdXNlcl9vcHRpb25zLmFwcGVuZCgoJ3VzZXInLCBOb25lLCBoZWxwX21zZykpCiAgICAgICAgYm9vbGVhbl9vcHRpb25zLmFwcGVuZCgndXNlcicpCgogICAgbmVnYXRpdmVfb3B0ID0geydhbHdheXMtdW56aXAnOiAnemlwLW9rJ30KICAgIGNyZWF0ZV9pbmRleCA9IFBhY2thZ2VJbmRleAoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIyB0aGUgLS11c2VyIG9wdGlvbiBzZWVtcyB0byBiZSBhbiBvcHQtaW4gb25lLAogICAgICAgICMgc28gdGhlIGRlZmF1bHQgc2hvdWxkIGJlIEZhbHNlLgogICAgICAgIHNlbGYudXNlciA9IDAKICAgICAgICBzZWxmLnppcF9vayA9IHNlbGYubG9jYWxfc25hcHNob3RzX29rID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluZGV4X3VybCA9IE5vbmUKICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCiAgICAgICAgc2VsZi5idWlsZF9kaXJlY3RvcnkgPSBOb25lCiAgICAgICAgc2VsZi5hcmdzID0gTm9uZQogICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKICAgICAgICBzZWxmLnVwZ3JhZGUgPSBzZWxmLmFsd2F5c19jb3B5ID0gc2VsZi5tdWx0aV92ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuZWRpdGFibGUgPSBzZWxmLm5vX2RlcHMgPSBzZWxmLmFsbG93X2hvc3RzID0gTm9uZQogICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCiAgICAgICAgc2VsZi52ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wdXJlbGliID0gTm9uZSAgIyBmb3IgcHVyZSBtb2R1bGUgZGlzdHJpYnV0aW9ucwogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0bGliID0gTm9uZSAgIyBub24tcHVyZSAoZGlzdHMgdy8gZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLmluc3RhbGxfaGVhZGVycyA9IE5vbmUgICMgZm9yIEMvQysrIGhlYWRlcnMKICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gTm9uZSAgIyBzZXQgdG8gZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgogICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHRzID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IE5vbmUKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IHNpdGUuVVNFUl9CQVNFCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gTm9uZQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBOb25lCiAgICAgICAgc2VsZi5ub19maW5kX2xpbmtzID0gTm9uZQoKICAgICAgICAjIE9wdGlvbnMgbm90IHNwZWNpZmlhYmxlIHZpYSBjb21tYW5kIGxpbmUKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBOb25lCiAgICAgICAgc2VsZi5wdGhfZmlsZSA9IHNlbGYuYWx3YXlzX2NvcHlfZnJvbSA9IE5vbmUKICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0cyA9IHt9CiAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gRmFsc2UKICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCiAgICAgICAgIyBhbiBpbmRlcGVuZGVudCBpbnN0YW5jZSBjcmVhdGVkLiAgVGhpcyBlbnN1cmVzIHRoYXQgZGVmYXVsdHMgd2lsbAogICAgICAgICMgYWx3YXlzIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlKHMpJyAiZWFzeV9pbnN0YWxsIgogICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCiAgICAgICAgIyBvdGhlciBlbWJlZGRpbmcuCiAgICAgICAgc2VsZi5fZHJ5X3J1biA9IE5vbmUKICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3NldF9jb21tYW5kX29wdGlvbnMoCiAgICAgICAgICAgIHNlbGYsIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgICAgICApCgogICAgZGVmIGRlbGV0ZV9ibG9ja2VycyhzZWxmLCBibG9ja2Vycyk6CiAgICAgICAgZXh0YW50X2Jsb2NrZXJzID0gKAogICAgICAgICAgICBmaWxlbmFtZSBmb3IgZmlsZW5hbWUgaW4gYmxvY2tlcnMKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKQogICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLl9kZWxldGVfcGF0aCwgZXh0YW50X2Jsb2NrZXJzKSkKCiAgICBkZWYgX2RlbGV0ZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIHBhdGgpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaXNfdHJlZSA9IG9zLnBhdGguaXNkaXIocGF0aCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKQogICAgICAgIHJlbW92ZXIgPSBybXRyZWUgaWYgaXNfdHJlZSBlbHNlIG9zLnVubGluawogICAgICAgIHJlbW92ZXIocGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlbmRlcl92ZXJzaW9uKCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVyIHRoZSBTZXR1cHRvb2xzIHZlcnNpb24gYW5kIGluc3RhbGxhdGlvbiBkZXRhaWxzLCB0aGVuIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgdmVyID0gc3lzLnZlcnNpb25bOjNdCiAgICAgICAgZGlzdCA9IGdldF9kaXN0cmlidXRpb24oJ3NldHVwdG9vbHMnKQogICAgICAgIHRtcGwgPSAnc2V0dXB0b29scyB7ZGlzdC52ZXJzaW9ufSBmcm9tIHtkaXN0LmxvY2F0aW9ufSAoUHl0aG9uIHt2ZXJ9KScKICAgICAgICBwcmludCh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KCkKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnZlcnNpb24gYW5kIHNlbGYuX3JlbmRlcl92ZXJzaW9uKCkKCiAgICAgICAgcHlfdmVyc2lvbiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KICAgICAgICBwcmVmaXgsIGV4ZWNfcHJlZml4ID0gZ2V0X2NvbmZpZ192YXJzKCdwcmVmaXgnLCAnZXhlY19wcmVmaXgnKQoKICAgICAgICBzZWxmLmNvbmZpZ192YXJzID0gewogICAgICAgICAgICAnZGlzdF9uYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICdkaXN0X2Z1bGxuYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCksCiAgICAgICAgICAgICdweV92ZXJzaW9uJzogcHlfdmVyc2lvbiwKICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCiAgICAgICAgICAgICdweV92ZXJzaW9uX25vZG90JzogcHlfdmVyc2lvblswXSArIHB5X3ZlcnNpb25bMl0sCiAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAncHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAnc3lzX2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCiAgICAgICAgICAgICdleGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAjIE9ubHkgcHl0aG9uIDMuMisgaGFzIGFiaWZsYWdzCiAgICAgICAgICAgICdhYmlmbGFncyc6IGdldGF0dHIoc3lzLCAnYWJpZmxhZ3MnLCAnJyksCiAgICAgICAgfQoKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJiYXNlJ10gPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICAgICAgc2VsZi5jb25maWdfdmFyc1sndXNlcnNpdGUnXSA9IHNlbGYuaW5zdGFsbF91c2Vyc2l0ZQoKICAgICAgICBzZWxmLl9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZSgpCgogICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKCiAgICAgICAgc2VsZi5fZXhwYW5kKAogICAgICAgICAgICAnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicsICdidWlsZF9kaXJlY3RvcnknLAogICAgICAgICAgICAnc2l0ZV9kaXJzJywKICAgICAgICApCiAgICAgICAgIyBJZiBhIG5vbi1kZWZhdWx0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCwgZGVmYXVsdCB0aGUKICAgICAgICAjIHNjcmlwdCBkaXJlY3RvcnkgdG8gbWF0Y2ggaXQuCiAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9kaXIKCiAgICAgICAgaWYgc2VsZi5ub19maW5kX2xpbmtzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IEZhbHNlCgogICAgICAgICMgTGV0IGluc3RhbGxfZGlyIGdldCBzZXQgYnkgaW5zdGFsbF9saWIgY29tbWFuZCwgd2hpY2ggaW4gdHVybgogICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKICAgICAgICAjIC0tcHJlZml4IGFuZCAtLWhvbWUgYW5kIGFsbCB0aGF0IG90aGVyIGNydWQuCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsICgnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kaXInKQogICAgICAgICkKICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsICgnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicpCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnVzZXIgYW5kIHNlbGYuaW5zdGFsbF9wdXJlbGliOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5pbnN0YWxsX3B1cmVsaWIKICAgICAgICAgICAgc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5pbnN0YWxsX3NjcmlwdHMKICAgICAgICAjIGRlZmF1bHQgLS1yZWNvcmQgZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKICAgICAgICAjIFNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIHRoZSBpZiBzdGF0ZW1lbnQgYmVsb3c/IEl0J3Mgbm90IHVzZWQKICAgICAgICAjIGVsc2V3aGVyZQogICAgICAgIG5vcm1wYXRoID0gbWFwKG5vcm1hbGl6ZV9wYXRoLCBzeXMucGF0aCkKICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKICAgICAgICBpZiBzZWxmLnNpdGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2l0ZV9kaXJzID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4KICAgICAgICAgICAgICAgIHNlbGYuc2l0ZV9kaXJzLnNwbGl0KCcsJykKICAgICAgICAgICAgXQogICAgICAgICAgICBmb3IgZCBpbiBzaXRlX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCiAgICAgICAgICAgICAgICBlbGlmIG5vcm1hbGl6ZV9wYXRoKGQpIG5vdCBpbiBub3JtcGF0aDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgZCArICIgKGluIC0tc2l0ZS1kaXJzKSBpcyBub3Qgb24gc3lzLnBhdGgiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMuYXBwZW5kKG5vcm1hbGl6ZV9wYXRoKGQpKQogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmNoZWNrX3NpdGVfZGlyKCkKICAgICAgICBzZWxmLmluZGV4X3VybCA9IHNlbGYuaW5kZXhfdXJsIG9yICJodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUiCiAgICAgICAgc2VsZi5zaGFkb3dfcGF0aCA9IHNlbGYuYWxsX3NpdGVfZGlyc1s6XQogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKICAgICAgICAgICAgaWYgcGF0aF9pdGVtIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5pbnNlcnQoMCwgcGF0aF9pdGVtKQoKICAgICAgICBpZiBzZWxmLmFsbG93X2hvc3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBob3N0cyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc2VsZi5hbGxvd19ob3N0cy5zcGxpdCgnLCcpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3RzID0gWycqJ10KICAgICAgICBpZiBzZWxmLnBhY2thZ2VfaW5kZXggaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gc2VsZi5jcmVhdGVfaW5kZXgoCiAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGg9c2VsZi5zaGFkb3dfcGF0aCwgaG9zdHM9aG9zdHMsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCArIHN5cy5wYXRoKQoKICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maW5kX2xpbmtzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IHNlbGYuZmluZF9saW5rcy5zcGxpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KICAgICAgICBpZiBzZWxmLmxvY2FsX3NuYXBzaG90c19vazoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LnNjYW5fZWdnX2xpbmtzKHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5ub19maW5kX2xpbmtzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3Moc2VsZi5maW5kX2xpbmtzKQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsICgnb3B0aW1pemUnLCAnb3B0aW1pemUnKSkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLm9wdGltaXplLCBpbnQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCiAgICAgICAgICAgICAgICBpZiBub3QgKDAgPD0gc2VsZi5vcHRpbWl6ZSA8PSAyKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0tb3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIikKCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgbm90IHNlbGYuYnVpbGRfZGlyZWN0b3J5OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJObyB1cmxzLCBmaWxlbmFtZXMsIG9yIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgKHNlZSAtLWhlbHApIikKCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgX2ZpeF9pbnN0YWxsX2Rpcl9mb3JfdXNlcl9zaXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpeCB0aGUgaW5zdGFsbF9kaXIgaWYgIi0tdXNlciIgd2FzIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlciBvciBub3Qgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5jcmVhdGVfaG9tZV9wYXRoKCkKICAgICAgICBpZiBzZWxmLmluc3RhbGxfdXNlcmJhc2UgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIlVzZXIgYmFzZSBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICBzY2hlbWVfbmFtZSA9IG9zLm5hbWUucmVwbGFjZSgncG9zaXgnLCAndW5peCcpICsgJ191c2VyJwogICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZShzY2hlbWVfbmFtZSkKCiAgICBkZWYgX2V4cGFuZF9hdHRycyhzZWxmLCBhdHRycyk6CiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIG9yIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIHNlbGYuY29uZmlnX3ZhcnMpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCiAgICBkZWYgZXhwYW5kX2Jhc2VkaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGxfYmFzZSwgaW5zdGFsbF9wbGF0YmFzZSBhbmQKICAgICAgICByb290LiIiIgogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhbJ2luc3RhbGxfYmFzZScsICdpbnN0YWxsX3BsYXRiYXNlJywgJ3Jvb3QnXSkKCiAgICBkZWYgZXhwYW5kX2RpcnMoc2VsZik6CiAgICAgICAgIiIiQ2FsbHMgYG9zLnBhdGguZXhwYW5kdXNlcmAgb24gaW5zdGFsbCBkaXJzLiIiIgogICAgICAgIGRpcnMgPSBbCiAgICAgICAgICAgICdpbnN0YWxsX3B1cmVsaWInLAogICAgICAgICAgICAnaW5zdGFsbF9wbGF0bGliJywKICAgICAgICAgICAgJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfaGVhZGVycycsCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLAogICAgICAgICAgICAnaW5zdGFsbF9kYXRhJywKICAgICAgICBdCiAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKGRpcnMpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnZlcmJvc2UgIT0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgogICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc3BlYywgbm90IHNlbGYubm9fZGVwcykKICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJvb3Q6ICAjIHN0cmlwIGFueSBwYWNrYWdlIHByZWZpeAogICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKICAgICAgICAgICAgICAgICAgICBmb3IgY291bnRlciBpbiByYW5nZShsZW4ob3V0cHV0cykpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCiAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgZmlsZV91dGlsCgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGZpbGVfdXRpbC53cml0ZV9maWxlLCAoc2VsZi5yZWNvcmQsIG91dHB1dHMpLAogICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29yZAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlKQoKICAgIGRlZiBwc2V1ZG9fdGVtcG5hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgcHNldWRvLXRlbXBuYW1lIGJhc2UgaW4gdGhlIGluc3RhbGwgZGlyZWN0b3J5LgogICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KICAgICAgICB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB5b3UncmUgYWxyZWFkeSBpbiBkZWVwIGRvb2Rvby4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGlkID0gcmFuZG9tLnJhbmRpbnQoMCwgc3lzLm1heHNpemUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAidGVzdC1lYXN5LWluc3RhbGwtJXMiICUgcGlkKQoKICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IHNlbGYuaW5zdGFsbF9kaXIgaXMgLnB0aC1jYXBhYmxlIGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHB0aF9maWxlID0gb3MucGF0aC5qb2luKGluc3RkaXIsICdlYXN5LWluc3RhbGwucHRoJykKCiAgICAgICAgIyBJcyBpdCBhIGNvbmZpZ3VyZWQsIFBZVEhPTlBBVEgsIGltcGxpY2l0LCBvciBleHBsaWNpdCBzaXRlIGRpcj8KICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKICAgICAgICAgICAgaXNfc2l0ZV9kaXIgPSBzZWxmLmNoZWNrX3B0aF9wcm9jZXNzaW5nKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgogICAgICAgICAgICB0ZXN0ZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAnLndyaXRlLXRlc3QnCiAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHRlc3RfZXhpc3RzOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgICAgIG9wZW4odGVzdGZpbGUsICd3JykuY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBDYW4ndCBpbnN0YWxsIG5vbi1tdWx0aSB0byBub24tc2l0ZSBkaXIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCgogICAgICAgIGlmIGlzX3NpdGVfZGlyOgogICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gUHRoRGlzdHJpYnV0aW9ucyhwdGhfZmlsZSwgc2VsZi5hbGxfc2l0ZV9kaXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lCgogICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgX3B5dGhvbnBhdGgoKSk6CiAgICAgICAgICAgICMgb25seSBQWVRIT05QQVRIIGRpcnMgbmVlZCBhIHNpdGUucHksIHNvIHByZXRlbmQgaXQncyB0aGVyZQogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUgICMgZG9uJ3QgbmVlZCBzaXRlLnB5IGluIHRoaXMgY2FzZQogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZSAgIyBhbmQgZG9uJ3QgY3JlYXRlIGEgLnB0aCBmaWxlCiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKCiAgICBfX2NhbnRfd3JpdGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGNhbid0IGNyZWF0ZSBvciByZW1vdmUgZmlsZXMgaW4gaW5zdGFsbCBkaXJlY3RvcnkKCiAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmaWxlcyBpbiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5OgoKICAgICAgICAgICAgJXMKCiAgICAgICAgVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX25vdF9leGlzdHNfaWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgVGhpcyBkaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiAgUGxlYXNlIGNyZWF0ZSBpdCBhbmQgdHJ5IGFnYWluLCBvcgogICAgICAgIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh1c2luZyB0aGUgLWQgb3IgLS1pbnN0YWxsLWRpcgogICAgICAgIG9wdGlvbikuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9fYWNjZXNzX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIElmIHRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgaXMgYSBzeXN0ZW0tb3duZWQgZGlyZWN0b3J5LCB5b3UgbWF5IG5lZWQgdG8gc2lnbiBpbgogICAgICAgIGFzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCiAgICAgICAgYWNjZXNzIHRvIHRoaXMgbWFjaGluZSwgeW91IG1heSB3aXNoIHRvIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24KICAgICAgICBkaXJlY3RvcnksIHByZWZlcmFibHkgb25lIHRoYXQgaXMgbGlzdGVkIGluIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlLgoKICAgICAgICBGb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCiAgICAgICAgZG9jdW1lbnRhdGlvbiBhdDoKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgY2FudF93cml0ZV90b190YXJnZXQoc2VsZik6CiAgICAgICAgbXNnID0gc2VsZi5fX2NhbnRfd3JpdGVfbXNnICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuaW5zdGFsbF9kaXIpOgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19ub3RfZXhpc3RzX2lkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fYWNjZXNzX21zZwogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBkZWYgY2hlY2tfcHRoX3Byb2Nlc3Npbmcoc2VsZik6CiAgICAgICAgIiIiRW1waXJpY2FsbHkgdmVyaWZ5IHdoZXRoZXIgLnB0aCBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIGluc3QuIGRpciIiIgogICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCiAgICAgICAgbG9nLmluZm8oIkNoZWNraW5nIC5wdGggZmlsZSBzdXBwb3J0IGluICVzIiwgaW5zdGRpcikKICAgICAgICBwdGhfZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAiLnB0aCIKICAgICAgICBva19maWxlID0gcHRoX2ZpbGUgKyAnLm9rJwogICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCiAgICAgICAgdG1wbCA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICBmID0gb3Blbih7b2tfZmlsZSFyfSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKCdPSycpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAiIiIpICsgJ1xuJwogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb2tfZXhpc3RzOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUob2tfZmlsZSkKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIGYgPSBvcGVuKHB0aF9maWxlLCAndycpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZi53cml0ZSh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzeXMuZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQogICAgICAgICAgICAgICAgICAgIGFsdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCAncHl0aG9udy5leGUnKQogICAgICAgICAgICAgICAgICAgIHVzZV9hbHQgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lLmxvd2VyKCkgPT0gJ3B5dGhvbi5leGUnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhhbHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHVzZV9hbHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdXNlIHB5dGhvbncuZXhlIHRvIGF2b2lkIG9wZW5pbmcgYSBjb25zb2xlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0CgogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCgogICAgICAgICAgICAgICAgc3Bhd24oW2V4ZWN1dGFibGUsICctRScsICctYycsICdwYXNzJ10sIDApCgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICJURVNUIFBBU1NFRDogJXMgYXBwZWFycyB0byBzdXBwb3J0IC5wdGggZmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB0aF9maWxlKQogICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgIGxvZy53YXJuKCJURVNUIEZBSUxFRDogJXMgZG9lcyBOT1Qgc3VwcG9ydCAucHRoIGZpbGVzIiwgaW5zdGRpcikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzIGFuZCBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBkaXN0Lm1ldGFkYXRhX2xpc3RkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGlmIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKToKICAgICAgICAgICAgICAgICAgICAjIFRoZSAic2NyaXB0IiBpcyBhIGRpcmVjdG9yeSwgbGlrZWx5IGEgUHl0aG9uIDMKICAgICAgICAgICAgICAgICAgICAjIF9fcHljYWNoZV9fIGRpcmVjdG9yeSwgc28gc2tpcCBpdC4KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQob3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKHBhdGgpCgogICAgZGVmIG5vdF9lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICVyOiB5b3UgY2FuJ3QgdXNlIGZpbGVuYW1lcyBvciBVUkxzICIKICAgICAgICAgICAgICAgICJ3aXRoIC0tZWRpdGFibGUgKGV4Y2VwdCB2aWEgdGhlIC0tZmluZC1saW5rcyBvcHRpb24pLiIKICAgICAgICAgICAgICAgICUgKHNwZWMsKQogICAgICAgICAgICApCgogICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsIHNwZWMpOgogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgY2FuJ3QgZG8gYSBjaGVja291dCB0aGVyZSIgJQogICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKICAgICAgICAgICAgKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3RtcGRpcihzZWxmKToKICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD1zaXgudSgiZWFzeV9pbnN0YWxsLSIpKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBjYXN0IHRvIHN0ciBhcyB3b3JrYXJvdW5kIGZvciAjNzA5IGFuZCAjNzEwIGFuZCAjNzEyCiAgICAgICAgICAgIHlpZWxkIHN0cih0bXBkaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MucGF0aC5leGlzdHModG1wZGlyKSBhbmQgcm10cmVlKHJtdHJlZV9zYWZlKHRtcGRpcikpCgogICAgZGVmIGVhc3lfaW5zdGFsbChzZWxmLCBzcGVjLCBkZXBzPUZhbHNlKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKQoKICAgICAgICB3aXRoIHNlbGYuX3RtcGRpcigpIGFzIHRtcGRpcjoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYywgUmVxdWlyZW1lbnQpOgogICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpciBhbmQgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBkbCwgdG1wZGlyLCBkZXBzLCBUcnVlKQoKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCBwcm9jZXNzIGl0IGRpcmVjdGx5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzcGVjID0gcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpCgogICAgICAgICAgICBzZWxmLmNoZWNrX2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgIGRpc3QgPSBzZWxmLnBhY2thZ2VfaW5kZXguZmV0Y2hfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5hbHdheXNfY29weSwgc2VsZi5sb2NhbF9pbmRleAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBkaXN0cmlidXRpb24gZm9yICVyIiAlIHNwZWMKICAgICAgICAgICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHk6CiAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgKC0tYWx3YXlzLWNvcHkgc2tpcHMgc3lzdGVtIGFuZCBkZXZlbG9wbWVudCBlZ2dzKSIKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUOgogICAgICAgICAgICAgICAgIyAuZWdnLWluZm8gZGlzdHMgZG9uJ3QgbmVlZCBpbnN0YWxsaW5nLCBqdXN0IHByb2Nlc3MgZGVwcwogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCgogICAgZGVmIGluc3RhbGxfaXRlbShzZWxmLCBzcGVjLCBkb3dubG9hZCwgdG1wZGlyLCBkZXBzLCBpbnN0YWxsX25lZWRlZD1GYWxzZSk6CgogICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIHNlbGYuYWx3YXlzX2NvcHkKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG9zLnBhdGguZGlybmFtZShkb3dubG9hZCkgPT0gdG1wZGlyCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBub3QgZG93bmxvYWQuZW5kc3dpdGgoJy5lZ2cnKQogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3IgKAogICAgICAgICAgICBzZWxmLmFsd2F5c19jb3B5X2Zyb20gaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShub3JtYWxpemVfcGF0aChkb3dubG9hZCkpID09CiAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKHNlbGYuYWx3YXlzX2NvcHlfZnJvbSkKICAgICAgICApCgogICAgICAgIGlmIHNwZWMgYW5kIG5vdCBpbnN0YWxsX25lZWRlZDoKICAgICAgICAgICAgIyBhdCB0aGlzIHBvaW50LCB3ZSBrbm93IGl0J3MgYSBsb2NhbCAuZWdnLCB3ZSBqdXN0IGRvbid0IGtub3cgaWYKICAgICAgICAgICAgIyBpdCdzIGFscmVhZHkgaW5zdGFsbGVkLgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W3NwZWMucHJvamVjdF9uYW1lXToKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gPT0gZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGluc3RhbGxfbmVlZGVkID0gVHJ1ZSAgIyBpdCdzIG5vdCBpbiB0aGUgbG9jYWwgaW5kZXgKCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKCiAgICAgICAgaWYgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5pbnN0YWxsX2VnZ3Moc3BlYywgZG93bmxvYWQsIHRtcGRpcikKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKV0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0c1swXSwgZGVwcywgIlVzaW5nIikKCiAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgc2VsZWN0X3NjaGVtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJTZXRzIHRoZSBpbnN0YWxsIGRpcmVjdG9yaWVzIGJ5IGFwcGx5aW5nIHRoZSBpbnN0YWxsIHNjaGVtZXMuIiIiCiAgICAgICAgIyBpdCdzIHRoZSBjYWxsZXIncyBwcm9ibGVtIGlmIHRoZXkgc3VwcGx5IGEgYmFkIG5hbWUhCiAgICAgICAgc2NoZW1lID0gSU5TVEFMTF9TQ0hFTUVTW25hbWVdCiAgICAgICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKICAgICAgICAgICAgYXR0cm5hbWUgPSAnaW5zdGFsbF8nICsga2V5CiAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0cm5hbWUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHJuYW1lLCBzY2hlbWVba2V5XSkKCiAgICBkZWYgcHJvY2Vzc19kaXN0cmlidXRpb24oc2VsZiwgcmVxdWlyZW1lbnQsIGRpc3QsIGRlcHM9VHJ1ZSwgKmluZm8pOgogICAgICAgIHNlbGYudXBkYXRlX3B0aChkaXN0KQogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKICAgICAgICBpZiBkaXN0IGluIHNlbGYubG9jYWxfaW5kZXhbZGlzdC5rZXldOgogICAgICAgICAgICBzZWxmLmxvY2FsX2luZGV4LnJlbW92ZShkaXN0KQogICAgICAgIHNlbGYubG9jYWxfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHNbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGxvZy5pbmZvKHNlbGYuaW5zdGFsbGF0aW9uX3JlcG9ydChyZXF1aXJlbWVudCwgZGlzdCwgKmluZm8pKQogICAgICAgIGlmIChkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBzZWxmLm5vX2ZpbmRfbGlua3MpOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCiAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IGRlcHMgYW5kIG5vdCBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6CiAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuICAjIFhYWCB0aGlzIGlzIG5vdCB0aGUgZGlzdHJpYnV0aW9uIHdlIHdlcmUgbG9va2luZyBmb3IKICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICMgaWYgd2Ugd291bmQgdXAgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLCByZXNvbHZlIHdoYXQgd2UndmUgZ290CiAgICAgICAgICAgIGRpc3RyZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSBSZXF1aXJlbWVudChzdHIoZGlzdHJlcSkpCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdHJvcyA9IFdvcmtpbmdTZXQoW10pLnJlc29sdmUoCiAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IERpc3RyaWJ1dGlvbk5vdEZvdW5kIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKGUucmVwb3J0KCkpCiAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weSBvciBzZWxmLmFsd2F5c19jb3B5X2Zyb206CiAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHJvczoKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBzZWxmLmluc3RhbGxlZF9wcm9qZWN0czoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgbG9nLmluZm8oIkZpbmlzaGVkIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQoKICAgIGRlZiBzaG91bGRfdW56aXAoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi56aXBfb2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbm90LXppcC1zYWZlJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBtYXliZV9tb3ZlKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2cud2Fybihtc2csIHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc2V0dXBfYmFzZSkKICAgICAgICAgICAgcmV0dXJuIHNldHVwX2Jhc2UKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShkaXN0X2ZpbGVuYW1lKSA9PSBzZXR1cF9iYXNlOgogICAgICAgICAgICAgICAgb3MudW5saW5rKGRpc3RfZmlsZW5hbWUpICAjIGdldCBpdCBvdXQgb2YgdGhlIHRtcCBkaXIKICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCiAgICAgICAgICAgIGlmIGxlbihjb250ZW50cykgPT0gMToKICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgY29udGVudHNbMF0pCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIG9ubHkgdGhpbmcgdGhlcmUgaXMgYSBkaXJlY3RvcnksIG1vdmUgaXQgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpCiAgICAgICAgc2h1dGlsLm1vdmUoc2V0dXBfYmFzZSwgZHN0KQogICAgICAgIHJldHVybiBkc3QKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NjcmlwdHM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBhcmdzIGluIFNjcmlwdFdyaXRlci5iZXN0KCkuZ2V0X2FyZ3MoZGlzdCk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgogICAgICAgICIiIkdlbmVyYXRlIGEgbGVnYWN5IHNjcmlwdCB3cmFwcGVyIGFuZCBpbnN0YWxsIGl0IiIiCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgaXNfc2NyaXB0ID0gaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgc2NyaXB0X25hbWUpCgogICAgICAgIGlmIGlzX3NjcmlwdDoKICAgICAgICAgICAgYm9keSA9IHNlbGYuX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpICUgbG9jYWxzKCkKICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBTY3JpcHRXcml0ZXIuZ2V0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyBib2R5CiAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIF90b19hc2NpaShzY3JpcHRfdGV4dCksICdiJykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0ZW1wbGF0ZSBzY3JpcHRzIGluIHRoZSBwYWNrYWdlLiBUaGlzCiAgICAgICAgZnVuY3Rpb24gbG9hZHMgb25lIG9mIHRoZW0gYW5kIHByZXBhcmVzIGl0IGZvciB1c2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTM0IGZvciBpbmZvCiAgICAgICAgIyBvbiBzY3JpcHQgZmlsZSBuYW1pbmcgYW5kIGRvd25zdHJlYW0gaXNzdWVzIHdpdGggU1ZSNAogICAgICAgIG5hbWUgPSAnc2NyaXB0LnRtcGwnCiAgICAgICAgaWYgZGV2X3BhdGg6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy50bXBsJywgJyAoZGV2KS50bXBsJykKCiAgICAgICAgcmF3X2J5dGVzID0gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbmFtZSkKICAgICAgICByZXR1cm4gcmF3X2J5dGVzLmRlY29kZSgndXRmLTgnKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgYmxvY2tlcnM9KCkpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICMgY2xlYW4gdXAgb2xkIC5weS8ucHl3IHcvbyBhIHNjcmlwdAogICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2RpciwgeCkgZm9yIHggaW4gYmxvY2tlcnNdCiAgICAgICAgKQogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCiAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KHRhcmdldCkKCiAgICAgICAgbWFzayA9IGN1cnJlbnRfdW1hc2soKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHRhcmdldCkKICAgICAgICAgICAgd2l0aCBvcGVuKHRhcmdldCwgInciICsgbW9kZSkgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCiAgICAgICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQoKICAgIGRlZiBpbnN0YWxsX2VnZ3Moc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIC5lZ2cgZGlycyBvciBmaWxlcyBhcmUgYWxyZWFkeSBidWlsdCwgc28ganVzdCByZXR1cm4gdGhlbQogICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9lZ2coZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF93aGVlbChkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQoKICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAogICAgICAgIHNldHVwX2Jhc2UgPSB0bXBkaXIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShkaXN0X2ZpbGVuYW1lKSBhbmQgbm90IGRpc3RfZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQogICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQoKICAgICAgICBpZiAoc2V0dXBfYmFzZS5zdGFydHN3aXRoKHRtcGRpcikgICMgc29tZXRoaW5nIHdlIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgIGFuZCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSBhbmQgc3BlYyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBzZWxmLm1heWJlX21vdmUoc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSkKCiAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCiAgICAgICAgc2V0dXBfc2NyaXB0ID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICdzZXR1cC5weScpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgogICAgICAgICAgICBzZXR1cHMgPSBnbG9iKG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnKicsICdzZXR1cC5weScpKQogICAgICAgICAgICBpZiBub3Qgc2V0dXBzOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSBzZXR1cCBzY3JpcHQgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgbGVuKHNldHVwcykgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIHNldHVwIHNjcmlwdHMgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCgogICAgICAgICMgTm93IHJ1biBpdCwgYW5kIHJldHVybiB0aGUgcmVzdWx0CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgbG9nLmluZm8oc2VsZi5yZXBvcnRfZWRpdGFibGUoc3BlYywgc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfYW5kX2luc3RhbGwoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKQoKICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUdHLUlORk8nKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCiAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICBkZWYgaW5zdGFsbF9lZ2coc2VsZiwgZWdnX3BhdGgsIHRtcGRpcik6CiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQoKICAgICAgICBkaXN0ID0gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGVnZ19wYXRoKQogICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKGRlc3RpbmF0aW9uLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rLAogICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHl0cmVlLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zaG91bGRfdW56aXAoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNlbGYudW5wYWNrX2FuZF9jb21waWxlLCAiRXh0cmFjdGluZyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpc3RfaXNfemlwcGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwuY29weTIsICJDb3B5aW5nIgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiksCiAgICAgICAgICAgICAgICAgICAgKG0gKyAiICVzIHRvICVzIikgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcygKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPW5ld19kaXN0X2lzX3ppcHBlZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQoKICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgogICAgICAgICMgU2VlIGlmIGl0J3MgdmFsaWQsIGdldCBkYXRhCiAgICAgICAgY2ZnID0gZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKQogICAgICAgIGlmIGNmZyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSB2YWxpZCBkaXN0dXRpbHMgV2luZG93cyAuZXhlIiAlIGRpc3RfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZGlzdHJpYnV0aW9uIG9iamVjdCB1bnRpbCB3ZSBidWlsZCB0aGUgcmVhbCBkaXN0cm8KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9Y2ZnLmdldCgnbWV0YWRhdGEnLCAnbmFtZScpLAogICAgICAgICAgICB2ZXJzaW9uPWNmZy5nZXQoJ21ldGFkYXRhJywgJ3ZlcnNpb24nKSwgcGxhdGZvcm09Z2V0X3BsYXRmb3JtKCksCiAgICAgICAgKQoKICAgICAgICAjIENvbnZlcnQgdGhlIC5leGUgdG8gYW4gdW5wYWNrZWQgZWdnCiAgICAgICAgZWdnX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBkaXN0LmVnZ19uYW1lKCkgKyAnLmVnZycpCiAgICAgICAgZGlzdC5sb2NhdGlvbiA9IGVnZ19wYXRoCiAgICAgICAgZWdnX3RtcCA9IGVnZ19wYXRoICsgJy50bXAnCiAgICAgICAgX2VnZ19pbmZvID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycpCiAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihfZWdnX2luZm8sICdQS0ctSU5GTycpCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgIyBtYWtlIHN1cmUgRUdHLUlORk8gZGlyIGV4aXN0cwogICAgICAgIGRpc3QuX3Byb3ZpZGVyID0gUGF0aE1ldGFkYXRhKGVnZ190bXAsIF9lZ2dfaW5mbykgICMgWFhYCiAgICAgICAgc2VsZi5leGVfdG9fZWdnKGRpc3RfZmlsZW5hbWUsIGVnZ190bXApCgogICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGtnX2luZik6CiAgICAgICAgICAgIGYgPSBvcGVuKHBrZ19pbmYsICd3JykKICAgICAgICAgICAgZi53cml0ZSgnTWV0YWRhdGEtVmVyc2lvbjogMS4wXG4nKQogICAgICAgICAgICBmb3IgaywgdiBpbiBjZmcuaXRlbXMoJ21ldGFkYXRhJyk6CiAgICAgICAgICAgICAgICBpZiBrICE9ICd0YXJnZXRfdmVyc2lvbic6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnJXM6ICVzXG4nICUgKGsucmVwbGFjZSgnXycsICctJykudGl0bGUoKSwgdikpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgIyBkZWxldGUgZW50cnktcG9pbnQgc2NyaXB0cyB0byBhdm9pZCBkdXBpbmcKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyhbCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCBhcmdzWzBdKQogICAgICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuZ2V0X2FyZ3MoZGlzdCkKICAgICAgICBdKQogICAgICAgICMgQnVpbGQgLmVnZyBmaWxlIGZyb20gdG1wZGlyCiAgICAgICAgYmRpc3RfZWdnLm1ha2VfemlwZmlsZSgKICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICApCiAgICAgICAgIyBpbnN0YWxsIHRoZSAuZWdnCiAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9lZ2coZWdnX3BhdGgsIHRtcGRpcikKCiAgICBkZWYgZXhlX3RvX2VnZyhzZWxmLCBkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKToKICAgICAgICAiIiJFeHRyYWN0IGEgYmRpc3Rfd2luaW5zdCB0byB0aGUgZGlyZWN0b3JpZXMgYW4gZWdnIHdvdWxkIHVzZSIiIgogICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKICAgICAgICBwcmVmaXhlcyA9IGdldF9leGVfcHJlZml4ZXMoZGlzdF9maWxlbmFtZSkKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICBuYXRpdmVfbGlicyA9IFtdCiAgICAgICAgdG9wX2xldmVsID0ge30KCiAgICAgICAgZGVmIHByb2Nlc3Moc3JjLCBkc3QpOgogICAgICAgICAgICBzID0gc3JjLmxvd2VyKCkKICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHByZWZpeGVzOgogICAgICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKG9sZCk6CiAgICAgICAgICAgICAgICAgICAgc3JjID0gbmV3ICsgc3JjW2xlbihvbGQpOl0KICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNyYy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGwuZW5kc3dpdGgoJy5weWQnKSBvciBkbC5lbmRzd2l0aCgnLmRsbCcpOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2xpYnMuYXBwZW5kKHNyYykKICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkICE9ICdTQ1JJUFRTLyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHN0CiAgICAgICAgICAgIGlmIG5vdCBzcmMuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgZWdnX3RtcCwgcHJvY2VzcykKICAgICAgICBzdHVicyA9IFtdCiAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKICAgICAgICAgICAgaWYgcmVzLmxvd2VyKCkuZW5kc3dpdGgoJy5weWQnKTogICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKICAgICAgICAgICAgICAgIHBhcnRzID0gcmVzLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgIHJlc291cmNlID0gcGFydHNbLTFdCiAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkgKyAnLnB5JwogICAgICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgICAgIHN0dWJzLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKQogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpICAjIGNvbXBpbGUgLnB5J3MKICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKSwKICAgICAgICAgICAgYmRpc3RfZWdnLmFuYWx5emVfZWdnKGVnZ190bXAsIHN0dWJzKSkgICMgd3JpdGUgemlwLXNhZmV0eSBmbGFnCgogICAgICAgIGZvciBuYW1lIGluICd0b3BfbGV2ZWwnLCAnbmF0aXZlX2xpYnMnOgogICAgICAgICAgICBpZiBsb2NhbHMoKVtuYW1lXToKICAgICAgICAgICAgICAgIHR4dCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nLCBuYW1lICsgJy50eHQnKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHR4dCk6CiAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odHh0LCAndycpCiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obG9jYWxzKClbbmFtZV0pICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgaW5zdGFsbF93aGVlbChzZWxmLCB3aGVlbF9wYXRoLCB0bXBkaXIpOgogICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWxfcGF0aCkKICAgICAgICBhc3NlcnQgd2hlZWwuaXNfY29tcGF0aWJsZSgpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgd2hlZWwuZWdnX25hbWUoKSkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGVzdGluYXRpb24pIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZGVzdGluYXRpb24pOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgIlJlbW92aW5nICIgKyBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgd2hlZWwuaW5zdGFsbF9hc19lZ2csCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICgiSW5zdGFsbGluZyAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUod2hlZWxfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBfX212X3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiwgYmVmb3JlIHlvdSBjYW4KICAgICAgICBpbXBvcnQgbW9kdWxlcyBmcm9tIHRoaXMgcGFja2FnZSBpbiBhbiBhcHBsaWNhdGlvbiwgeW91IHdpbGwgbmVlZCB0bwogICAgICAgICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbCBzaW1pbGFyIHRvIG9uZSBvZgogICAgICAgIHRoZXNlIGV4YW1wbGVzLCBpbiBvcmRlciB0byBzZWxlY3QgdGhlIGRlc2lyZWQgdmVyc2lvbjoKCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXMiKSAgIyBsYXRlc3QgaW5zdGFsbGVkIHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz09JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIGV4YWN0IHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9faWRfd2FybmluZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCiAgICAgICAgdGhpcyB0byB3b3JrLiAgKGUuZy4gYnkgYmVpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc2NyaXB0IGRpcmVjdG9yeSwgYnkgYmVpbmcgb24KICAgICAgICBQWVRIT05QQVRILCBvciBieSBiZWluZyBhZGRlZCB0byBzeXMucGF0aCBieSB5b3VyIGNvZGUuKQogICAgICAgICIiIikKCiAgICBkZWYgaW5zdGFsbGF0aW9uX3JlcG9ydChzZWxmLCByZXEsIGRpc3QsIHdoYXQ9Ikluc3RhbGxlZCIpOgogICAgICAgICIiIkhlbHBmdWwgaW5zdGFsbGF0aW9uIG1lc3NhZ2UgZm9yIGRpc3BsYXkgdG8gcGFja2FnZSB1c2VycyIiIgogICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgogICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IHNlbGYubm9fcmVwb3J0OgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19tdl93YXJuaW5nCiAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpOgogICAgICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9faWRfd2FybmluZwoKICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAgbmFtZSA9IGRpc3QucHJvamVjdF9uYW1lCiAgICAgICAgdmVyc2lvbiA9IGRpc3QudmVyc2lvbgogICAgICAgIGV4dHJhcyA9ICcnICAjIFRPRE86IHNlbGYucmVwb3J0X2V4dHJhcyhyZXEsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCgogICAgX19lZGl0YWJsZV9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgRXh0cmFjdGVkIGVkaXRhYmxlIHZlcnNpb24gb2YgJShzcGVjKXMgdG8gJShkaXJuYW1lKXMKCiAgICAgICAgSWYgaXQgdXNlcyBzZXR1cHRvb2xzIGluIGl0cyBzZXR1cCBzY3JpcHQsIHlvdSBjYW4gYWN0aXZhdGUgaXQgaW4KICAgICAgICAiZGV2ZWxvcG1lbnQiIG1vZGUgYnkgZ29pbmcgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmc6OgoKICAgICAgICAgICAgJShweXRob24pcyBzZXR1cC5weSBkZXZlbG9wCgogICAgICAgIFNlZSB0aGUgc2V0dXB0b29scyBkb2N1bWVudGF0aW9uIGZvciB0aGUgImRldmVsb3AiIGNvbW1hbmQgZm9yIG1vcmUgaW5mby4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIHJlcG9ydF9lZGl0YWJsZShzZWxmLCBzcGVjLCBzZXR1cF9zY3JpcHQpOgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQogICAgICAgIHB5dGhvbiA9IHN5cy5leGVjdXRhYmxlCiAgICAgICAgcmV0dXJuICdcbicgKyBzZWxmLl9fZWRpdGFibGVfbXNnICUgbG9jYWxzKCkKCiAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncyk6CiAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZWdnJywgYmRpc3RfZWdnKQogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCgogICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMjoKICAgICAgICAgICAgdiA9ICd2JyAqIChzZWxmLnZlcmJvc2UgLSAxKQogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLScgKyB2KQogICAgICAgIGVsaWYgc2VsZi52ZXJib3NlIDwgMjoKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy1xJykKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctbicpCiAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICJSdW5uaW5nICVzICVzIiwgc2V0dXBfc2NyaXB0W2xlbihzZXR1cF9iYXNlKSArIDE6XSwgJyAnLmpvaW4oYXJncykKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQoKICAgIGRlZiBidWlsZF9hbmRfaW5zdGFsbChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UpOgogICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KCiAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAogICAgICAgICAgICBwcmVmaXg9J2VnZy1kaXN0LXRtcC0nLCBkaXI9b3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9zZXRfZmV0Y2hlcl9vcHRpb25zKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQogICAgICAgICAgICBhcmdzLmFwcGVuZChkaXN0X2RpcikKCiAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncykKICAgICAgICAgICAgYWxsX2VnZ3MgPSBFbnZpcm9ubWVudChbZGlzdF9kaXJdKQogICAgICAgICAgICBlZ2dzID0gW10KICAgICAgICAgICAgZm9yIGtleSBpbiBhbGxfZWdnczoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGFsbF9lZ2dzW2tleV06CiAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKICAgICAgICAgICAgaWYgbm90IGVnZ3MgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBsb2cud2FybigiTm8gZWdncyBmb3VuZCBpbiAlcyAoc2V0dXAgc2NyaXB0IHByb2JsZW0/KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2RpcikKICAgICAgICAgICAgcmV0dXJuIGVnZ3MKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUoZGlzdF9kaXIpCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvdXIgbG9nIHZlcmJvc2l0eQoKICAgIGRlZiBfc2V0X2ZldGNoZXJfb3B0aW9ucyhzZWxmLCBiYXNlKToKICAgICAgICAiIiIKICAgICAgICBXaGVuIGVhc3lfaW5zdGFsbCBpcyBhYm91dCB0byBydW4gYmRpc3RfZWdnIG9uIGEgc291cmNlIGRpc3QsIHRoYXQKICAgICAgICBzb3VyY2UgZGlzdCBtaWdodCBoYXZlICdzZXR1cF9yZXF1aXJlcycgZGlyZWN0aXZlcywgcmVxdWlyaW5nCiAgICAgICAgYWRkaXRpb25hbCBmZXRjaGluZy4gRW5zdXJlIHRoZSBmZXRjaGVyIG9wdGlvbnMgZ2l2ZW4gdG8gZWFzeV9pbnN0YWxsCiAgICAgICAgYXJlIGF2YWlsYWJsZSB0byB0aGF0IGNvbW1hbmQgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICAjIGZpbmQgdGhlIGZldGNoIG9wdGlvbnMgZnJvbSBlYXN5X2luc3RhbGwgYW5kIHdyaXRlIHRoZW0gb3V0CiAgICAgICAgIyB0byB0aGUgc2V0dXAuY2ZnIGZpbGUuCiAgICAgICAgZWlfb3B0cyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykuY29weSgpCiAgICAgICAgZmV0Y2hfZGlyZWN0aXZlcyA9ICgKICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsICdvcHRpbWl6ZScsCiAgICAgICAgICAgICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkKICAgICAgICBmZXRjaF9vcHRpb25zID0ge30KICAgICAgICBmb3Iga2V5LCB2YWwgaW4gZWlfb3B0cy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIGZldGNoX2RpcmVjdGl2ZXM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmZXRjaF9vcHRpb25zW2tleS5yZXBsYWNlKCdfJywgJy0nKV0gPSB2YWxbMV0KICAgICAgICAjIGNyZWF0ZSBhIHNldHRpbmdzIGRpY3Rpb25hcnkgc3VpdGFibGUgZm9yIGBlZGl0X2NvbmZpZ2AKICAgICAgICBzZXR0aW5ncyA9IGRpY3QoZWFzeV9pbnN0YWxsPWZldGNoX29wdGlvbnMpCiAgICAgICAgY2ZnX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsICdzZXR1cC5jZmcnKQogICAgICAgIHNldG9wdC5lZGl0X2NvbmZpZyhjZmdfZmlsZW5hbWUsIHNldHRpbmdzKQoKICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgIyBkcm9wIG9sZCBlbnRyaWVzCiAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgZnJvbSBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkKQogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5yZW1vdmUoZCkKICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLnJlbW92ZShkLmxvY2F0aW9uKQoKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIGluIHNlbGYucHRoX2ZpbGUucGF0aHM6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCiAgICAgICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuYWRkKGRpc3QpICAjIGFkZCBuZXcgZW50cnkKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5hcHBlbmQoZGlzdC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKCiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCgogICAgICAgICAgICBpZiBkaXN0LmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHNldHVwdG9vbHMgaXRzZWxmIG5ldmVyIGJlY29tZXMgdW5hdmFpbGFibGUhCiAgICAgICAgICAgICAgICAjIFhYWCBzaG91bGQgdGhpcyBjaGVjayBmb3IgbGF0ZXN0IHZlcnNpb24/CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAnc2V0dXB0b29scy5wdGgnKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd3QnKQogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikgKyAnXG4nKQogICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIHVucGFja19wcm9ncmVzcyhzZWxmLCBzcmMsIGRzdCk6CiAgICAgICAgIyBQcm9ncmVzcyBmaWx0ZXIgZm9yIHVucGFja2luZwogICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgcmV0dXJuIGRzdCAgIyBvbmx5IHVucGFjay1hbmQtY29tcGlsZSBza2lwcyBmaWxlcyBmb3IgZHJ5IHJ1bgoKICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICB0b19jaG1vZCA9IFtdCgogICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CiAgICAgICAgICAgIGlmIGRzdC5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBzcmMuc3RhcnRzd2l0aCgnRUdHLUlORk8vJyk6CiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGVsaWYgZHN0LmVuZHN3aXRoKCcuZGxsJykgb3IgZHN0LmVuZHN3aXRoKCcuc28nKToKICAgICAgICAgICAgICAgIHRvX2NobW9kLmFwcGVuZChkc3QpCiAgICAgICAgICAgIHNlbGYudW5wYWNrX3Byb2dyZXNzKHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuZHJ5X3J1biBhbmQgZHN0IG9yIE5vbmUKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGZvciBmIGluIHRvX2NobW9kOgogICAgICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdChmKVtzdGF0LlNUX01PREVdKSB8IDBvNTU1KSAmIDBvNzc1NQogICAgICAgICAgICAgICAgY2htb2QoZiwgbW9kZSkKCiAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIHRvX2NvbXBpbGUpOgogICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICAgICBzZWxmLndhcm4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkLCBza2lwcGluZy4nKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSB0aGUgYnl0ZSBjb21waWxlIG1lc3NhZ2VzIHF1aWV0ZXIKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlIC0gMSkKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZSh0b19jb21waWxlLCBvcHRpbWl6ZT0wLCBmb3JjZT0xLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZToKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLCBmb3JjZT0xLAogICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLAogICAgICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvcmlnaW5hbCB2ZXJib3NpdHkKCiAgICBfX25vX2RlZmF1bHRfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGJhZCBpbnN0YWxsIGRpcmVjdG9yeSBvciBQWVRIT05QQVRICgogICAgICAgIFlvdSBhcmUgYXR0ZW1wdGluZyB0byBpbnN0YWxsIGEgcGFja2FnZSB0byBhIGRpcmVjdG9yeSB0aGF0IGlzIG5vdAogICAgICAgIG9uIFBZVEhPTlBBVEggYW5kIHdoaWNoIFB5dGhvbiBkb2VzIG5vdCByZWFkICIucHRoIiBmaWxlcyBmcm9tLiAgVGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCiAgICAgICAgdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKCiAgICAgICAgICAgICVzCgogICAgICAgIGFuZCB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgY3VycmVudGx5IGNvbnRhaW5zOgoKICAgICAgICAgICAgJXIKCiAgICAgICAgSGVyZSBhcmUgc29tZSBvZiB5b3VyIG9wdGlvbnMgZm9yIGNvcnJlY3RpbmcgdGhlIHByb2JsZW06CgogICAgICAgICogWW91IGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgaS5lLiwgb25lIHRoYXQgaXMKICAgICAgICAgIG9uIFBZVEhPTlBBVEggb3Igc3VwcG9ydHMgLnB0aCBmaWxlcwoKICAgICAgICAqIFlvdSBjYW4gYWRkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KICAgICAgICAgIFB5dGhvbiBhbmQgd2FudCB0byB1c2UgdGhlIHBhY2thZ2UocykgeW91IGFyZSBpbnN0YWxsaW5nLikKCiAgICAgICAgKiBZb3UgY2FuIHNldCB1cCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byBzdXBwb3J0ICIucHRoIiBmaWxlcyBieQogICAgICAgICAgdXNpbmcgb25lIG9mIHRoZSBhcHByb2FjaGVzIGRlc2NyaWJlZCBoZXJlOgoKICAgICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwjY3VzdG9tLWluc3RhbGxhdGlvbi1sb2NhdGlvbnMKCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIikubHN0cmlwKCkKCiAgICBkZWYgbm9fZGVmYXVsdF92ZXJzaW9uX21zZyhzZWxmKToKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuX19ub19kZWZhdWx0X21zZwogICAgICAgIHJldHVybiB0ZW1wbGF0ZSAlIChzZWxmLmluc3RhbGxfZGlyLCBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKSkKCiAgICBkZWYgaW5zdGFsbF9zaXRlX3B5KHNlbGYpOgogICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGlmIHNlbGYuc2l0ZXB5X2luc3RhbGxlZDoKICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCgogICAgICAgIHNpdGVweSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAic2l0ZS5weSIpCiAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQogICAgICAgIHNvdXJjZSA9IHNvdXJjZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBjdXJyZW50ID0gIiIKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2l0ZXB5KToKICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNpdGVweSkgYXMgc3RybToKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzdHJtLnJlYWQoKQoKICAgICAgICAgICAgaWYgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnZGVmIF9fYm9vdCgpOicpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKICAgICAgICAgICAgICAgICAgICAiIHJlbW92ZSBpdC4iICUgc2l0ZXB5CiAgICAgICAgICAgICAgICApCgogICAgICAgIGlmIGN1cnJlbnQgIT0gc291cmNlOgogICAgICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMiLCBzaXRlcHkpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHNpdGVweSkKICAgICAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHksICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgc3RybToKICAgICAgICAgICAgICAgICAgICBzdHJtLndyaXRlKHNvdXJjZSkKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUoW3NpdGVweV0pCgogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKCiAgICBkZWYgY3JlYXRlX2hvbWVfcGF0aChzZWxmKToKICAgICAgICAiIiJDcmVhdGUgZGlyZWN0b3JpZXMgdW5kZXIgfi4iIiIKICAgICAgICBpZiBub3Qgc2VsZi51c2VyOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBob21lID0gY29udmVydF9wYXRoKG9zLnBhdGguZXhwYW5kdXNlcigifiIpKQogICAgICAgIGZvciBuYW1lLCBwYXRoIGluIHNpeC5pdGVyaXRlbXMoc2VsZi5jb25maWdfdmFycyk6CiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChob21lKSBhbmQgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJvcy5tYWtlZGlycygnJXMnLCAwbzcwMCkiICUgcGF0aCkKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsIDBvNzAwKQoKICAgIElOU1RBTExfU0NIRU1FUyA9IGRpY3QoCiAgICAgICAgcG9zaXg9ZGljdCgKICAgICAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL2xpYi9weXRob24kcHlfdmVyc2lvbl9zaG9ydC9zaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgc2NyaXB0X2Rpcj0nJGJhc2UvYmluJywKICAgICAgICApLAogICAgKQoKICAgIERFRkFVTFRfU0NIRU1FID0gZGljdCgKICAgICAgICBpbnN0YWxsX2Rpcj0nJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAogICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL1NjcmlwdHMnLAogICAgKQoKICAgIGRlZiBfZXhwYW5kKHNlbGYsICphdHRycyk6CiAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCgogICAgICAgIGlmIHNlbGYucHJlZml4OgogICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAogICAgICAgICAgICBjb25maWdfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQogICAgICAgICAgICBjb25maWdfdmFyc1snYmFzZSddID0gc2VsZi5wcmVmaXgKICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsIHNlbGYuREVGQVVMVF9TQ0hFTUUpCiAgICAgICAgICAgIGZvciBhdHRyLCB2YWwgaW4gc2NoZW1lLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN1YnN0X3ZhcnMKCiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIGNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCgpkZWYgX3B5dGhvbnBhdGgoKToKICAgIGl0ZW1zID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKICAgIHJldHVybiBmaWx0ZXIoTm9uZSwgaXRlbXMpCgoKZGVmIGdldF9zaXRlX2RpcnMoKToKICAgICIiIgogICAgUmV0dXJuIGEgbGlzdCBvZiAnc2l0ZScgZGlycwogICAgIiIiCgogICAgc2l0ZWRpcnMgPSBbXQoKICAgICMgc3RhcnQgd2l0aCBQWVRIT05QQVRICiAgICBzaXRlZGlycy5leHRlbmQoX3B5dGhvbnBhdGgoKSkKCiAgICBwcmVmaXhlcyA9IFtzeXMucHJlZml4XQogICAgaWYgc3lzLmV4ZWNfcHJlZml4ICE9IHN5cy5wcmVmaXg6CiAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgaWYgcHJlZml4OgogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikpCiAgICAgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXB5dGhvbiIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1wYWNrYWdlcyIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgIyBmb3IgZnJhbWV3b3JrIGJ1aWxkcyAqb25seSogd2UgYWRkIHRoZSBzdGFuZGFyZCBBcHBsZQogICAgICAgICAgICAgICAgIyBsb2NhdGlvbnMuIEN1cnJlbnRseSBvbmx5IHBlci11c2VyLCBidXQgL0xpYnJhcnkgYW5kCiAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCiAgICAgICAgICAgICAgICBpZiAnUHl0aG9uLmZyYW1ld29yaycgaW4gcHJlZml4OgogICAgICAgICAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uLmdldCgnSE9NRScpCiAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKICAgICAgICAgICAgICAgICAgICAgICAgaG9tZV9zcCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGlicmFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoaG9tZV9zcCkKICAgIGxpYl9wYXRocyA9IGdldF9wYXRoKCdwdXJlbGliJyksIGdldF9wYXRoKCdwbGF0bGliJykKICAgIGZvciBzaXRlX2xpYiBpbiBsaWJfcGF0aHM6CiAgICAgICAgaWYgc2l0ZV9saWIgbm90IGluIHNpdGVkaXJzOgogICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZV9saWIpCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIHNpdGVkaXJzLmFwcGVuZChzaXRlLlVTRVJfU0lURSkKCiAgICB0cnk6CiAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKHNpdGUuZ2V0c2l0ZXBhY2thZ2VzKCkpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKCiAgICByZXR1cm4gc2l0ZWRpcnMKCgpkZWYgZXhwYW5kX3BhdGhzKGlucHV0cyk6CiAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKCiAgICBzZWVuID0ge30KCiAgICBmb3IgZGlybmFtZSBpbiBpbnB1dHM6CiAgICAgICAgZGlybmFtZSA9IG5vcm1hbGl6ZV9wYXRoKGRpcm5hbWUpCiAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgICAgICB5aWVsZCBkaXJuYW1lLCBmaWxlcwoKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lIGluICgnZWFzeS1pbnN0YWxsLnB0aCcsICdzZXR1cHRvb2xzLnB0aCcpOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgLnB0aCBmaWxlcyB0aGF0IHdlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFJlYWQgdGhlIC5wdGggZmlsZQogICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCiAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0CiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aCgiaW1wb3J0Iik6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VlbltsaW5lXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lLCBvcy5saXN0ZGlyKGxpbmUpCgoKZGVmIGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSk6CiAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCgogICAgUmV0dXJucyBhIGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIsIG9yIE5vbmUKICAgICIiIgogICAgZiA9IG9wZW4oZGlzdF9maWxlbmFtZSwgJ3JiJykKICAgIHRyeToKICAgICAgICBlbmRyZWMgPSB6aXBmaWxlLl9FbmRSZWNEYXRhKGYpCiAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCiAgICAgICAgaWYgcHJlcGVuZGVkIDwgMTI6ICAjIG5vIHdpbmluc3QgZGF0YSBoZXJlCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZi5zZWVrKHByZXBlbmRlZCAtIDEyKQoKICAgICAgICB0YWcsIGNmZ2xlbiwgYm1sZW4gPSBzdHJ1Y3QudW5wYWNrKCI8aWlpIiwgZi5yZWFkKDEyKSkKICAgICAgICBpZiB0YWcgbm90IGluICgweDEyMzQ1NjdBLCAweDEyMzQ1NjdCKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgbm90IGEgdmFsaWQgdGFnCgogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAoMTIgKyBjZmdsZW4pKQogICAgICAgIGluaXQgPSB7J3ZlcnNpb24nOiAnJywgJ3RhcmdldF92ZXJzaW9uJzogJyd9CiAgICAgICAgY2ZnID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcihpbml0KQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydCA9IGYucmVhZChjZmdsZW4pCiAgICAgICAgICAgICMgUmVhZCB1cCB0byB0aGUgZmlyc3QgbnVsbCBieXRlLgogICAgICAgICAgICBjb25maWcgPSBwYXJ0LnNwbGl0KGInXDAnLCAxKVswXQogICAgICAgICAgICAjIE5vdyB0aGUgY29uZmlnIGlzIGluIGJ5dGVzLCBidXQgZm9yIFJhd0NvbmZpZ1BhcnNlciwgaXQgc2hvdWxkCiAgICAgICAgICAgICMgIGJlIHRleHQsIHNvIGRlY29kZSBpdC4KICAgICAgICAgICAgY29uZmlnID0gY29uZmlnLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgIGNmZy5yZWFkZnAoc2l4LlN0cmluZ0lPKGNvbmZpZykpCiAgICAgICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGNmZwoKICAgIGZpbmFsbHk6CiAgICAgICAgZi5jbG9zZSgpCgoKZGVmIGdldF9leGVfcHJlZml4ZXMoZXhlX2ZpbGVuYW1lKToKICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKCiAgICBwcmVmaXhlcyA9IFsKICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAogICAgICAgICgnUExBVExJQi9weXdpbjMyX3N5c3RlbTMyJywgJycpLAogICAgICAgICgnUExBVExJQi8nLCAnJyksCiAgICAgICAgKCdTQ1JJUFRTLycsICdFR0ctSU5GTy9zY3JpcHRzLycpLAogICAgICAgICgnREFUQS9saWIvc2l0ZS1wYWNrYWdlcycsICcnKSwKICAgIF0KICAgIHogPSB6aXBmaWxlLlppcEZpbGUoZXhlX2ZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAzIGFuZCBwYXJ0c1syXSA9PSAnUEtHLUlORk8nOgogICAgICAgICAgICAgICAgaWYgcGFydHNbMV0uZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmluc2VydCgwLCAoJy8nLmpvaW4ocGFydHNbOjJdKSwgJ0VHRy1JTkZPLycpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gMiBvciBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcGFydHNbMF0udXBwZXIoKSBpbiAoJ1BVUkVMSUInLCAnUExBVExJQicpOgogICAgICAgICAgICAgICAgY29udGVudHMgPSB6LnJlYWQobmFtZSkKICAgICAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5kZWNvZGUoKQogICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyhjb250ZW50cyk6CiAgICAgICAgICAgICAgICAgICAgcHRoID0gcHRoLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHB0aC5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0sIHB0aCkpLCAnJykpCiAgICBmaW5hbGx5OgogICAgICAgIHouY2xvc2UoKQogICAgcHJlZml4ZXMgPSBbKHgubG93ZXIoKSwgeSkgZm9yIHgsIHkgaW4gcHJlZml4ZXNdCiAgICBwcmVmaXhlcy5zb3J0KCkKICAgIHByZWZpeGVzLnJldmVyc2UoKQogICAgcmV0dXJuIHByZWZpeGVzCgoKY2xhc3MgUHRoRGlzdHJpYnV0aW9ucyhFbnZpcm9ubWVudCk6CiAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgoKICAgIGRpcnR5ID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIHNpdGVkaXJzPSgpKToKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLnNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKICAgICAgICBzZWxmLmJhc2VkaXIgPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUoc2VsZi5maWxlbmFtZSkpCiAgICAgICAgc2VsZi5fbG9hZCgpCiAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwgW10sIE5vbmUsIE5vbmUpCiAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aCwgVHJ1ZSkpKQoKICAgIGRlZiBfbG9hZChzZWxmKToKICAgICAgICBzZWxmLnBhdGhzID0gW10KICAgICAgICBzYXdfaW1wb3J0ID0gRmFsc2UKICAgICAgICBzZWVuID0gZGljdC5mcm9ta2V5cyhzZWxmLnNpdGVkaXJzKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBmID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncnQnKQogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICBzYXdfaW1wb3J0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQocGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXRoLnN0cmlwKCkgb3IgcGF0aC5zdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIyBza2lwIG5vbi1leGlzdGVudCBwYXRocywgaW4gY2FzZSBzb21lYm9keSBkZWxldGVkIGEgcGFja2FnZQogICAgICAgICAgICAgICAgIyBtYW51YWxseSwgYW5kIGR1cGxpY2F0ZSBwYXRocyBhcyB3ZWxsCiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlZGlyLCBwYXRoKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpIG9yIHBhdGggaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAjIHNraXAgaXQKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyB3ZSBjbGVhbmVkIHVwLCBzbyB3ZSdyZSBkaXJ0eSBub3cgOikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYucGF0aHMgYW5kIG5vdCBzYXdfaW1wb3J0OgogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycwogICAgICAgIHdoaWxlIHNlbGYucGF0aHMgYW5kIG5vdCBzZWxmLnBhdGhzWy0xXS5zdHJpcCgpOgogICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpCgogICAgZGVmIHNhdmUoc2VsZik6CiAgICAgICAgIiIiV3JpdGUgY2hhbmdlZCAucHRoIGZpbGUgYmFjayB0byBkaXNrIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZWxfcGF0aHMgPSBsaXN0KG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsIHNlbGYucGF0aHMpKQogICAgICAgIGlmIHJlbF9wYXRoczoKICAgICAgICAgICAgbG9nLmRlYnVnKCJTYXZpbmcgJXMiLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICBsaW5lcyA9IHNlbGYuX3dyYXBfbGluZXMocmVsX3BhdGhzKQogICAgICAgICAgICBkYXRhID0gJ1xuJy5qb2luKGxpbmVzKSArICdcbicKCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAnd3QnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQoKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCgogICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhsaW5lcyk6CiAgICAgICAgcmV0dXJuIGxpbmVzCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCiAgICAgICAgbmV3X3BhdGggPSAoCiAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHMgYW5kICgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2l0ZWRpcnMgb3IKICAgICAgICAgICAgICAgICMgYWNjb3VudCBmb3IgJy4nIGJlaW5nIGluIFBZVEhPTlBBVEgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gPT0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBpZiBuZXdfcGF0aDoKICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5hZGQoc2VsZiwgZGlzdCkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKICAgICAgICAgICAgc2VsZi5wYXRocy5yZW1vdmUoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZiwgZGlzdCkKCiAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLCBwYXRoKToKICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobm9ybWFsaXplX3BhdGgocGF0aCkpCiAgICAgICAgYmFzZWxlbiA9IGxlbihzZWxmLmJhc2VkaXIpCiAgICAgICAgcGFydHMgPSBbbGFzdF0KICAgICAgICBzZXAgPSBvcy5hbHRzZXAgPT0gJy8nIGFuZCAnLycgb3Igb3Muc2VwCiAgICAgICAgd2hpbGUgbGVuKG5wYXRoKSA+PSBiYXNlbGVuOgogICAgICAgICAgICBpZiBucGF0aCA9PSBzZWxmLmJhc2VkaXI6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQob3MuY3VyZGlyKQogICAgICAgICAgICAgICAgcGFydHMucmV2ZXJzZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VwLmpvaW4ocGFydHMpCiAgICAgICAgICAgIG5wYXRoLCBsYXN0ID0gb3MucGF0aC5zcGxpdChucGF0aCkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKGxhc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucyhQdGhEaXN0cmlidXRpb25zKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF93cmFwX2xpbmVzKGNscywgbGluZXMpOgogICAgICAgIHlpZWxkIGNscy5wcmVsdWRlCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICB5aWVsZCBjbHMucG9zdGx1ZGUKCiAgICBwcmVsdWRlID0gX29uZV9saW5lcigiIiIKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgc3lzLl9fcGxlbiA9IGxlbihzeXMucGF0aCkKICAgICAgICAiIiIpCiAgICBwb3N0bHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIG5ldyA9IHN5cy5wYXRoW3N5cy5fX3BsZW46XQogICAgICAgIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBwID0gZ2V0YXR0cihzeXMsICdfX2VnZ2luc2VydCcsIDApCiAgICAgICAgc3lzLnBhdGhbcDpwXSA9IG5ldwogICAgICAgIHN5cy5fX2VnZ2luc2VydCA9IHAgKyBsZW4obmV3KQogICAgICAgICIiIikKCgppZiBvcy5lbnZpcm9uLmdldCgnU0VUVVBUT09MU19TWVNfUEFUSF9URUNITklRVUUnLCAncmF3JykgPT0gJ3Jld3JpdGUnOgogICAgUHRoRGlzdHJpYnV0aW9ucyA9IFJld3JpdGVQdGhEaXN0cmlidXRpb25zCgoKZGVmIF9maXJzdF9saW5lX3JlKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBvbiBmaXJzdF9saW5lX3JlIHN1aXRhYmxlIGZvciBtYXRjaGluZwogICAgc3RyaW5ncy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaXJzdF9saW5lX3JlLnBhdHRlcm4sIHN0cik6CiAgICAgICAgcmV0dXJuIGZpcnN0X2xpbmVfcmUKCiAgICAjIGZpcnN0X2xpbmVfcmUgaW4gUHl0aG9uID49My4xLjQgYW5kID49My4yLjEgaXMgYSBieXRlcyBwYXR0ZXJuLgogICAgcmV0dXJuIHJlLmNvbXBpbGUoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLmRlY29kZSgpKQoKCmRlZiBhdXRvX2NobW9kKGZ1bmMsIGFyZywgZXhjKToKICAgIGlmIGZ1bmMgaW4gW29zLnVubGluaywgb3MucmVtb3ZlXSBhbmQgb3MubmFtZSA9PSAnbnQnOgogICAgICAgIGNobW9kKGFyZywgc3RhdC5TX0lXUklURSkKICAgICAgICByZXR1cm4gZnVuYyhhcmcpCiAgICBldCwgZXYsIF8gPSBzeXMuZXhjX2luZm8oKQogICAgc2l4LnJlcmFpc2UoZXQsIChldlswXSwgZXZbMV0gKyAoIiAlcyAlcyIgJSAoZnVuYywgYXJnKSkpKQoKCmRlZiB1cGRhdGVfZGlzdF9jYWNoZXMoZGlzdF9wYXRoLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzKToKICAgICIiIgogICAgRml4IGFueSBnbG9iYWxseSBjYWNoZWQgYGRpc3RfcGF0aGAgcmVsYXRlZCBkYXRhCgogICAgYGRpc3RfcGF0aGAgc2hvdWxkIGJlIGEgcGF0aCBvZiBhIG5ld2x5IGluc3RhbGxlZCBlZ2cgZGlzdHJpYnV0aW9uICh6aXBwZWQKICAgIG9yIHVuemlwcGVkKS4KCiAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBjb250YWlucyBmaW5kZXIgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjYWNoZWQgd2hlbgogICAgaW1wb3J0aW5nIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLiBBbnkgc3VjaCBmaW5kZXJzIG5lZWQgdG8gYmUKICAgIGNsZWFyZWQgc2luY2UgdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBtaWdodCBiZSBwYWNrYWdlZCBkaWZmZXJlbnRseSwKICAgIGUuZy4gYSB6aXBwZWQgZWdnIGRpc3RyaWJ1dGlvbiBtaWdodCBnZXQgcmVwbGFjZWQgd2l0aCBhbiB1bnppcHBlZCBlZ2cKICAgIGZvbGRlciBvciB2aWNlIHZlcnNhLiBIYXZpbmcgdGhlIG9sZCBmaW5kZXJzIGNhY2hlZCBtYXkgdGhlbiBjYXVzZSBQeXRob24KICAgIHRvIGF0dGVtcHQgbG9hZGluZyBtb2R1bGVzIGZyb20gdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiB1c2luZyBhbgogICAgaW5jb3JyZWN0IGxvYWRlci4KCiAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgb2JqZWN0cyBhcmUgUHl0aG9uIGxvYWRlcnMgY2hhcmdlZCB3aXRoIGltcG9ydGluZwogICAgZGF0YSBwYWNrYWdlZCBpbnNpZGUgemlwIGFyY2hpdmVzLiBJZiBzdGFsZSBsb2FkZXJzIHJlZmVyZW5jaW5nIHRoZQogICAgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLCBhcmUgbGVmdCBiZWhpbmQsIHRoZXkgY2FuIGZhaWwgdG8gbG9hZCBtb2R1bGVzIGZyb20KICAgIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24uIEUuZy4gaWYgYW4gb2xkIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZQogICAgaXMgdXNlZCB0byBsb2FkIGRhdGEgZnJvbSBhIG5ldyB6aXBwZWQgZWdnIGFyY2hpdmUsIGl0IG1heSBjYXVzZSB0aGUKICAgIG9wZXJhdGlvbiB0byBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gdGhlIHdyb25nIGxvY2F0aW9uIC0KICAgIG9uZSBpbmRpY2F0ZWQgYnkgdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uIFN1Y2ggYW4gb3BlcmF0aW9uIG1heSB0aGVuIGZhaWwgb3V0cmlnaHQsIGUuZy4gcmVwb3J0IGhhdmluZwogICAgcmVhZCBhICdiYWQgbG9jYWwgZmlsZSBoZWFkZXInLCBvciBldmVuIHdvcnNlLCBpdCBtYXkgZmFpbCBzaWxlbnRseSAmCiAgICByZXR1cm4gaW52YWxpZCBkYXRhLgoKICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBjb250YWlucyBjYWNoZWQgemlwIGFyY2hpdmUgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbiBmb3IgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgYW5kIGFsbCBzdWNoCiAgICBpbnN0YW5jZXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGFyY2hpdmUgc2hhcmUgdGhlIHNhbWUgY2FjaGVkIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uCgogICAgSWYgYXNrZWQsIGFuZCB0aGUgdW5kZXJseWluZyBQeXRob24gaW1wbGVtZW50YXRpb24gYWxsb3dzIGl0LCB3ZSBjYW4gZml4CiAgICBhbGwgZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byB0cmFjawogICAgdGhlbSBkb3duIGFuZCByZW1vdmUgdGhlbSBvbmUgYnkgb25lLCBieSB1cGRhdGluZyB0aGVpciBzaGFyZWQgY2FjaGVkIHppcAogICAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uIFRoaXMsIG9mIGNvdXJzZSwgYXNzdW1lcyB0aGF0IHRoZQogICAgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIGlzIHBhY2thZ2VkIGFzIGEgemlwcGVkIGVnZy4KCiAgICBJZiBub3QgYXNrZWQgdG8gZml4IGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMsIHdlIHN0aWxsIGRvCiAgICBvdXIgYmVzdCB0byBjbGVhciBhbnkgcmVtYWluaW5nIHppcGltcG9ydC56aXBpbXBvcnRlciByZWxhdGVkIGNhY2hlZCBkYXRhCiAgICB0aGF0IG1pZ2h0IHNvbWVob3cgbGF0ZXIgZ2V0IHVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBuZXcKICAgIGRpc3RyaWJ1dGlvbiBhbmQgdGh1cyBjYXVzZSBzdWNoIGxvYWQgb3BlcmF0aW9ucyB0byBmYWlsLiBOb3RlIHRoYXQgd2hlbgogICAgdHJhY2tpbmcgZG93biBzdWNoIHJlbWFpbmluZyBzdGFsZSBkYXRhLCB3ZSBjYW4gbm90IGNhdGNoIGV2ZXJ5IGNvbmNlaXZhYmxlCiAgICB1c2FnZSBmcm9tIGhlcmUsIGFuZCB3ZSBjbGVhciBvbmx5IHRob3NlIHRoYXQgd2Uga25vdyBvZiBhbmQgaGF2ZSBmb3VuZCB0bwogICAgY2F1c2UgcHJvYmxlbXMgaWYgbGVmdCBhbGl2ZS4gQW55IHJlbWFpbmluZyBjYWNoZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYnkKICAgIHdob21ldmVyIGlzIGluIGNoYXJnZSBvZiBtYWludGFpbmluZyB0aGVtLCBpLmUuIHRoZXkgc2hvdWxkIGJlIHJlYWR5IHRvCiAgICBoYW5kbGUgdXMgcmVwbGFjaW5nIHRoZWlyIHppcCBhcmNoaXZlcyB3aXRoIG5ldyBkaXN0cmlidXRpb25zIGF0IHJ1bnRpbWUuCgogICAgIiIiCiAgICAjIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGtub3duIHNvdXJjZXMgb2Ygc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyCiAgICAjIGluc3RhbmNlcyB0aGF0IHdlIGRvIG5vdCBjbGVhciBoZXJlLCBidXQgbWlnaHQgaWYgZXZlciBnaXZlbiBhIHJlYXNvbiB0bwogICAgIyBkbyBzbzoKICAgICMgKiBHbG9iYWwgc2V0dXB0b29scyBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0IChhLmsuYS4gJ21hc3RlciB3b3JraW5nCiAgICAjIHNldCcpIG1heSBjb250YWluIGRpc3RyaWJ1dGlvbnMgd2hpY2ggbWF5IGluIHR1cm4gY29udGFpbiB0aGVpcgogICAgIyAgIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzLgogICAgIyAqIFNldmVyYWwgemlwaW1wb3J0LnppcGltcG9ydGVyIGxvYWRlcnMgaGVsZCBieSBsb2NhbCB2YXJpYWJsZXMgZnVydGhlcgogICAgIyAgIHVwIHRoZSBmdW5jdGlvbiBjYWxsIHN0YWNrIHdoZW4gcnVubmluZyB0aGUgc2V0dXB0b29scyBpbnN0YWxsYXRpb24uCiAgICAjICogQWxyZWFkeSBsb2FkZWQgbW9kdWxlcyBtYXkgaGF2ZSB0aGVpciBfX2xvYWRlcl9fIGF0dHJpYnV0ZSBzZXQgdG8gdGhlCiAgICAjICAgZXhhY3QgbG9hZGVyIGluc3RhbmNlIHVzZWQgd2hlbiBpbXBvcnRpbmcgdGhlbS4gUHl0aG9uIDMuNCBkb2NzIHN0YXRlCiAgICAjICAgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW50cm9zcGVjdGlvbiBhbmQgc28gaXMKICAgICMgICBub3QgZXhwZWN0ZWQgdG8gY2F1c2UgdXMgcHJvYmxlbXMuCiAgICBub3JtYWxpemVkX3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0X3BhdGgpCiAgICBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlKQogICAgaWYgZml4X3ppcGltcG9ydGVyX2NhY2hlczoKICAgICAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQogICAgZWxzZToKICAgICAgICAjIEhlcmUsIGV2ZW4gdGhvdWdoIHdlIGRvIG5vdCB3YW50IHRvIGZpeCBleGlzdGluZyBhbmQgbm93IHN0YWxlCiAgICAgICAgIyB6aXBpbXBvcnRlciBjYWNoZSBpbmZvcm1hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byByZW1vdmUgaXQuIFJlbGF0ZWQgdG8KICAgICAgICAjIFB5dGhvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjYWNoZSwgd2UgY2xlYXIgZWFjaCBvZgogICAgICAgICMgaXRzIHN0YWxlIGVudHJpZXMgaW4gdHdvIHBoYXNlczoKICAgICAgICAjICAgMS4gQ2xlYXIgdGhlIGVudHJ5IHNvIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHppcCBhcmNoaXZlIGluZm9ybWF0aW9uCiAgICAgICAgIyAgICAgIHZpYSBhbnkgZXhpc3Rpbmcgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBmYWlscy4KICAgICAgICAjICAgMi4gUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyBhbnkgbmV3bHkgY29uc3RydWN0ZWQKICAgICAgICAjICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBkbyBub3QgZW5kIHVwIHVzaW5nIG9sZCBzdGFsZQogICAgICAgICMgICAgICB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCiAgICAgICAgIyBUaGlzIHdob2xlIHN0YWxlIGRhdGEgcmVtb3ZhbCBzdGVwIGRvZXMgbm90IHNlZW0gc3RyaWN0bHkgbmVjZXNzYXJ5LAogICAgICAgICMgYnV0IGhhcyBiZWVuIGxlZnQgaW4gYmVjYXVzZSBpdCB3YXMgZG9uZSBiZWZvcmUgd2Ugc3RhcnRlZCByZXBsYWNpbmcKICAgICAgICAjIHRoZSB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUgY29udGVudCBpZiBwb3NzaWJsZSwgYW5kCiAgICAgICAgIyB0aGVyZSBhcmUgbm8gcmVsZXZhbnQgdW5pdCB0ZXN0cyB0aGF0IHdlIGNhbiBkZXBlbmQgb24gdG8gdGVsbCB1cyBpZgogICAgICAgICMgdGhpcyBpcyByZWFsbHkgbmVlZGVkLgogICAgICAgIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpCgoKZGVmIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAiIiIKICAgIFJldHVybiB6aXBpbXBvcnRlciBjYWNoZSBlbnRyeSBrZXlzIHJlbGF0ZWQgdG8gYSBnaXZlbiBub3JtYWxpemVkIHBhdGguCgogICAgQWx0ZXJuYXRpdmUgcGF0aCBzcGVsbGluZ3MgKGUuZy4gdGhvc2UgdXNpbmcgZGlmZmVyZW50IGNoYXJhY3RlciBjYXNlIG9yCiAgICB0aG9zZSB1c2luZyBhbHRlcm5hdGl2ZSBwYXRoIHNlcGFyYXRvcnMpIHJlbGF0ZWQgdG8gdGhlIHNhbWUgcGF0aCBhcmUKICAgIGluY2x1ZGVkLiBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgaW5jbHVkZWQgYXMgd2VsbCwgaS5lLiB0aG9zZQogICAgY29ycmVzcG9uZGluZyB0byB6aXAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgICIiIgogICAgcmVzdWx0ID0gW10KICAgIHByZWZpeF9sZW4gPSBsZW4obm9ybWFsaXplZF9wYXRoKQogICAgZm9yIHAgaW4gY2FjaGU6CiAgICAgICAgbnAgPSBub3JtYWxpemVfcGF0aChwKQogICAgICAgIGlmIChucC5zdGFydHN3aXRoKG5vcm1hbGl6ZWRfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICBucFtwcmVmaXhfbGVuOnByZWZpeF9sZW4gKyAxXSBpbiAob3Muc2VwLCAnJykpOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSwgdXBkYXRlcj1Ob25lKToKICAgICIiIgogICAgVXBkYXRlIHppcGltcG9ydGVyIGNhY2hlIGRhdGEgZm9yIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFueSBzdWItcGF0aCBlbnRyaWVzIGFyZSBwcm9jZXNzZWQgYXMgd2VsbCwgaS5lLiB0aG9zZSBjb3JyZXNwb25kaW5nIHRvIHppcAogICAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgIEdpdmVuIHVwZGF0ZXIgaXMgYSBjYWxsYWJsZSB0YWtpbmcgYSBjYWNoZSBlbnRyeSBrZXkgYW5kIHRoZSBvcmlnaW5hbCBlbnRyeQogICAgKGFmdGVyIGFscmVhZHkgcmVtb3ZpbmcgdGhlIGVudHJ5IGZyb20gdGhlIGNhY2hlKSwgYW5kIGV4cGVjdGVkIHRvIHVwZGF0ZQogICAgdGhlIGVudHJ5IGFuZCBwb3NzaWJseSByZXR1cm4gYSBuZXcgb25lIHRvIGJlIGluc2VydGVkIGluIGl0cyBwbGFjZS4KICAgIFJldHVybmluZyBOb25lIGluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBzaG91bGQgbm90IGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKICAgIG9uZS4gSWYgbm8gdXBkYXRlciBpcyBnaXZlbiwgdGhlIGNhY2hlIGVudHJpZXMgYXJlIHNpbXBseSByZW1vdmVkIHdpdGhvdXQKICAgIGFueSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcsIHRoZSBzYW1lIGFzIGlmIHRoZSB1cGRhdGVyIHNpbXBseSByZXR1cm5lZCBOb25lLgoKICAgICIiIgogICAgZm9yIHAgaW4gX2NvbGxlY3RfemlwaW1wb3J0ZXJfY2FjaGVfZW50cmllcyhub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgICAgICAjIE4uQi4gcHlweSdzIGN1c3RvbSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgaW1wbGVtZW50YXRpb24gZG9lcwogICAgICAgICMgbm90IHN1cHBvcnQgdGhlIGNvbXBsZXRlIGRpY3QgaW50ZXJmYWNlOgogICAgICAgICMgKiBEb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCwgdGh1cyBub3QgYWxsb3dpbmcgdGhpcyBmdW5jdGlvbgogICAgICAgICMgICAgdG8gYmUgdXNlZCBvbmx5IGZvciByZW1vdmluZyBleGlzdGluZyBjYWNoZSBlbnRyaWVzLgogICAgICAgICMgICogRG9lcyBub3Qgc3VwcG9ydCB0aGUgZGljdC5wb3AoKSBtZXRob2QsIGZvcmNpbmcgdXMgdG8gdXNlIHRoZQogICAgICAgICMgICAgZ2V0L2RlbCBwYXR0ZXJucyBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgdGhlCiAgICAgICAgIyAgICBmb2xsb3dpbmcgbGlua3M6CiAgICAgICAgIyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzIwMiNpc3N1ZWNvbW1lbnQtMjAyOTEzNDIwCiAgICAgICAgIyAgICAgIGh0dHA6Ly9iaXQubHkvMmg5aXRKWAogICAgICAgIG9sZF9lbnRyeSA9IGNhY2hlW3BdCiAgICAgICAgZGVsIGNhY2hlW3BdCiAgICAgICAgbmV3X2VudHJ5ID0gdXBkYXRlciBhbmQgdXBkYXRlcihwLCBvbGRfZW50cnkpCiAgICAgICAgaWYgbmV3X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYWNoZVtwXSA9IG5ld19lbnRyeQoKCmRlZiBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSkKCgpkZWYgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICBkZWYgY2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEocGF0aCwgb2xkX2VudHJ5KToKICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQoKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgdXBkYXRlcj1jbGVhcl9hbmRfcmVtb3ZlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YSkKCgojIFB5UHkgUHl0aG9uIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGRpcmVjdGx5IHdyaXRpbmcgdG8gdGhlCiMgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGFuZCBzbyBwcmV2ZW50cyB1cyBmcm9tIGF0dGVtcHRpbmcgdG8gY29ycmVjdAojIGl0cyBjb250ZW50LiBUaGUgYmVzdCB3ZSBjYW4gZG8gdGhlcmUgaXMgY2xlYXIgdGhlIHByb2JsZW1hdGljIGNhY2hlIGNvbnRlbnQKIyBhbmQgaGF2ZSBQeVB5IHJlcG9wdWxhdGUgaXQgYXMgbmVlZGVkLiBUaGUgZG93bnNpZGUgaXMgdGhhdCBpZiB0aGVyZSBhcmUgYW55CiMgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBsYXlpbmcgYXJvdW5kLCBhdHRlbXB0aW5nIHRvIHVzZSB0aGVtCiMgd2lsbCBmYWlsIGR1ZSB0byBub3QgaGF2aW5nIGl0cyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlCiMgaW5zdGVhZCBvZiBiZWluZyBhdXRvbWF0aWNhbGx5IGNvcnJlY3RlZCB0byB1c2UgdGhlIG5ldyBjb3JyZWN0IHppcCBhcmNoaXZlCiMgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgppZiAnX19weXB5X18nIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKICAgIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YSA9IFwKICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEKZWxzZToKCiAgICBkZWYgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICAgICAgZGVmIHJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgICAgICMgTi5CLiBJbiB0aGVvcnksIHdlIGNvdWxkIGxvYWQgdGhlIHppcCBkaXJlY3RvcnkgaW5mb3JtYXRpb24ganVzdAogICAgICAgICAgICAjIG9uY2UgZm9yIGFsbCB1cGRhdGVkIHBhdGggc3BlbGxpbmdzLCBhbmQgdGhlbiBjb3B5IGl0IGxvY2FsbHkgYW5kCiAgICAgICAgICAgICMgdXBkYXRlIGl0cyBjb250YWluZWQgcGF0aCBzdHJpbmdzIHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QKICAgICAgICAgICAgIyBzcGVsbGluZywgYnV0IHRoYXQgc2VlbXMgbGlrZSBhIHdheSB0b28gaW52YXNpdmUgbW92ZSAodGhpcyBjYWNoZQogICAgICAgICAgICAjIHN0cnVjdHVyZSBpcyBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFueXdoZXJlIGFuZCBjb3VsZCBpbgogICAgICAgICAgICAjIHRoZW9yeSBjaGFuZ2Ugd2l0aCBuZXcgUHl0aG9uIHJlbGVhc2VzKSBmb3Igbm8gc2lnbmlmaWNhbnQKICAgICAgICAgICAgIyBiZW5lZml0LgogICAgICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQogICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aCkKICAgICAgICAgICAgb2xkX2VudHJ5LnVwZGF0ZSh6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbcGF0aF0pCiAgICAgICAgICAgIHJldHVybiBvbGRfZW50cnkKCiAgICAgICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZSgKICAgICAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgICAgIHVwZGF0ZXI9cmVwbGFjZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKZGVmIGlzX3B5dGhvbih0ZXh0LCBmaWxlbmFtZT0nPHN0cmluZz4nKToKICAgICJJcyB0aGlzIHN0cmluZyBhIHZhbGlkIFB5dGhvbiBzY3JpcHQ/IgogICAgdHJ5OgogICAgICAgIGNvbXBpbGUodGV4dCwgZmlsZW5hbWUsICdleGVjJykKICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBUcnVlCgoKZGVmIGlzX3NoKGV4ZWN1dGFibGUpOgogICAgIiIiRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgZXhlY3V0YWJsZSBpcyBhIC5zaCAoY29udGFpbnMgYSAjISBsaW5lKSIiIgogICAgdHJ5OgogICAgICAgIHdpdGggaW8ub3BlbihleGVjdXRhYmxlLCBlbmNvZGluZz0nbGF0aW4tMScpIGFzIGZwOgogICAgICAgICAgICBtYWdpYyA9IGZwLnJlYWQoMikKICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgIHJldHVybiBtYWdpYyA9PSAnIyEnCgoKZGVmIG50X3F1b3RlX2FyZyhhcmcpOgogICAgIiIiUXVvdGUgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgYWNjb3JkaW5nIHRvIFdpbmRvd3MgcGFyc2luZyBydWxlcyIiIgogICAgcmV0dXJuIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFthcmddKQoKCmRlZiBpc19weXRob25fc2NyaXB0KHNjcmlwdF90ZXh0LCBmaWxlbmFtZSk6CiAgICAiIiJJcyB0aGlzIHRleHQsIGFzIGEgd2hvbGUsIGEgUHl0aG9uIHNjcmlwdD8gKGFzIG9wcG9zZWQgdG8gc2hlbGwvYmF0L2V0Yy4KICAgICIiIgogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgcmV0dXJuIFRydWUgICMgZXh0ZW5zaW9uIHNheXMgaXQncyBQeXRob24KICAgIGlmIGlzX3B5dGhvbihzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgICAgIHJldHVybiBUcnVlICAjIGl0J3Mgc3ludGFjdGljYWxseSB2YWxpZCBQeXRob24KICAgIGlmIHNjcmlwdF90ZXh0LnN0YXJ0c3dpdGgoJyMhJyk6CiAgICAgICAgIyBJdCBiZWdpbnMgd2l0aCBhICcjIScgbGluZSwgc28gY2hlY2sgaWYgJ3B5dGhvbicgaXMgaW4gaXQgc29tZXdoZXJlCiAgICAgICAgcmV0dXJuICdweXRob24nIGluIHNjcmlwdF90ZXh0LnNwbGl0bGluZXMoKVswXS5sb3dlcigpCgogICAgcmV0dXJuIEZhbHNlICAjIE5vdCBhbnkgUHl0aG9uIEkgY2FuIHJlY29nbml6ZQoKCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IGNobW9kIGFzIF9jaG1vZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIEp5dGhvbiBjb21wYXRpYmlsaXR5CiAgICBkZWYgX2NobW9kKCphcmdzKToKICAgICAgICBwYXNzCgoKZGVmIGNobW9kKHBhdGgsIG1vZGUpOgogICAgbG9nLmRlYnVnKCJjaGFuZ2luZyBtb2RlIG9mICVzIHRvICVvIiwgcGF0aCwgbW9kZSkKICAgIHRyeToKICAgICAgICBfY2htb2QocGF0aCwgbW9kZSkKICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlOgogICAgICAgIGxvZy5kZWJ1ZygiY2htb2QgZmFpbGVkOiAlcyIsIGUpCgoKY2xhc3MgQ29tbWFuZFNwZWMobGlzdCk6CiAgICAiIiIKICAgIEEgY29tbWFuZCBzcGVjIGZvciBhICMhIGhlYWRlciwgc3BlY2lmaWVkIGFzIGEgbGlzdCBvZiBhcmd1bWVudHMgYWtpbiB0bwogICAgdGhvc2UgcGFzc2VkIHRvIFBvcGVuLgogICAgIiIiCgogICAgb3B0aW9ucyA9IFtdCiAgICBzcGxpdF9hcmdzID0gZGljdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIENob29zZSB0aGUgYmVzdCBDb21tYW5kU3BlYyBjbGFzcyBiYXNlZCBvbiBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9zeXNfZXhlY3V0YWJsZShjbHMpOgogICAgICAgIF9kZWZhdWx0ID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKICAgICAgICByZXR1cm4gb3MuZW52aXJvbi5nZXQoJ19fUFlWRU5WX0xBVU5DSEVSX18nLCBfZGVmYXVsdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3BhcmFtKGNscywgcGFyYW0pOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIENvbW1hbmRTcGVjIGZyb20gYSBwYXJhbWV0ZXIgdG8gYnVpbGRfc2NyaXB0cywgd2hpY2ggbWF5CiAgICAgICAgYmUgTm9uZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBjbHMpOgogICAgICAgICAgICByZXR1cm4gcGFyYW0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBsaXN0KToKICAgICAgICAgICAgcmV0dXJuIGNscyhwYXJhbSkKICAgICAgICBpZiBwYXJhbSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gY2xzLmZyb21fZW52aXJvbm1lbnQoKQogICAgICAgICMgb3RoZXJ3aXNlLCBhc3N1bWUgaXQncyBhIHN0cmluZy4KICAgICAgICByZXR1cm4gY2xzLmZyb21fc3RyaW5nKHBhcmFtKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZW52aXJvbm1lbnQoY2xzKToKICAgICAgICByZXR1cm4gY2xzKFtjbHMuX3N5c19leGVjdXRhYmxlKCldKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fc3RyaW5nKGNscywgc3RyaW5nKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBjb21tYW5kIHNwZWMgZnJvbSBhIHNpbXBsZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgY29tbWFuZAogICAgICAgIGxpbmUgcGFyc2VhYmxlIGJ5IHNobGV4LnNwbGl0LgogICAgICAgICIiIgogICAgICAgIGl0ZW1zID0gc2hsZXguc3BsaXQoc3RyaW5nLCAqKmNscy5zcGxpdF9hcmdzKQogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIGluc3RhbGxfb3B0aW9ucyhzZWxmLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgc2VsZi5vcHRpb25zID0gc2hsZXguc3BsaXQoc2VsZi5fZXh0cmFjdF9vcHRpb25zKHNjcmlwdF90ZXh0KSkKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoc2VsZikKICAgICAgICBpZiBub3QgaXNhc2NpaShjbWRsaW5lKToKICAgICAgICAgICAgc2VsZi5vcHRpb25zWzowXSA9IFsnLXgnXQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZXh0cmFjdF9vcHRpb25zKG9yaWdfc2NyaXB0KToKICAgICAgICAiIiIKICAgICAgICBFeHRyYWN0IGFueSBvcHRpb25zIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBmaXJzdCA9IChvcmlnX3NjcmlwdCArICdcbicpLnNwbGl0bGluZXMoKVswXQogICAgICAgIG1hdGNoID0gX2ZpcnN0X2xpbmVfcmUoKS5tYXRjaChmaXJzdCkKICAgICAgICBvcHRpb25zID0gbWF0Y2guZ3JvdXAoMSkgb3IgJycgaWYgbWF0Y2ggZWxzZSAnJwogICAgICAgIHJldHVybiBvcHRpb25zLnN0cmlwKCkKCiAgICBkZWYgYXNfaGVhZGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9yZW5kZXIoc2VsZiArIGxpc3Qoc2VsZi5vcHRpb25zKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N0cmlwX3F1b3RlcyhpdGVtKToKICAgICAgICBfUVVPVEVTID0gJyJcJycKICAgICAgICBmb3IgcSBpbiBfUVVPVEVTOgogICAgICAgICAgICBpZiBpdGVtLnN0YXJ0c3dpdGgocSkgYW5kIGl0ZW0uZW5kc3dpdGgocSk6CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVsxOi0xXQogICAgICAgIHJldHVybiBpdGVtCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXIoaXRlbXMpOgogICAgICAgIGNtZGxpbmUgPSBzdWJwcm9jZXNzLmxpc3QyY21kbGluZSgKICAgICAgICAgICAgQ29tbWFuZFNwZWMuX3N0cmlwX3F1b3RlcyhpdGVtLnN0cmlwKCkpIGZvciBpdGVtIGluIGl0ZW1zKQogICAgICAgIHJldHVybiAnIyEnICsgY21kbGluZSArICdcbicKCgojIEZvciBwYnIgY29tcGF0OyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4Kc3lzX2V4ZWN1dGFibGUgPSBDb21tYW5kU3BlYy5fc3lzX2V4ZWN1dGFibGUoKQoKCmNsYXNzIFdpbmRvd3NDb21tYW5kU3BlYyhDb21tYW5kU3BlYyk6CiAgICBzcGxpdF9hcmdzID0gZGljdChwb3NpeD1GYWxzZSkKCgpjbGFzcyBTY3JpcHRXcml0ZXIob2JqZWN0KToKICAgICIiIgogICAgRW5jYXBzdWxhdGVzIGJlaGF2aW9yIGFyb3VuZCB3cml0aW5nIGVudHJ5IHBvaW50IHNjcmlwdHMgZm9yIGNvbnNvbGUgYW5kCiAgICBndWkgYXBwcy4KICAgICIiIgoKICAgIHRlbXBsYXRlID0gdGV4dHdyYXAuZGVkZW50KHIiIiIKICAgICAgICAjIEVBU1ktSU5TVEFMTC1FTlRSWS1TQ1JJUFQ6ICUoc3BlYylyLCUoZ3JvdXApciwlKG5hbWUpcgogICAgICAgIF9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCiAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgbG9hZF9lbnRyeV9wb2ludAoKICAgICAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICAgICAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQogICAgICAgICAgICBzeXMuZXhpdCgKICAgICAgICAgICAgICAgIGxvYWRfZW50cnlfcG9pbnQoJShzcGVjKXIsICUoZ3JvdXApciwgJShuYW1lKXIpKCkKICAgICAgICAgICAgKQogICAgIiIiKS5sc3RyaXAoKQoKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IENvbW1hbmRTcGVjCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9hcmdzKGNscywgZGlzdCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9hcmdzIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHdyaXRlciA9IChXaW5kb3dzU2NyaXB0V3JpdGVyIGlmIHdpbmluc3QgZWxzZSBTY3JpcHRXcml0ZXIpLmJlc3QoKQogICAgICAgIGhlYWRlciA9IGNscy5nZXRfc2NyaXB0X2hlYWRlcigiIiwgZXhlY3V0YWJsZSwgd2luaW5zdCkKICAgICAgICByZXR1cm4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGhlYWRlcikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfc2NyaXB0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0LCBleGVjdXRhYmxlPU5vbmUsIHdpbmluc3Q9RmFsc2UpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgZ2V0X2hlYWRlciIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICBpZiB3aW5pbnN0OgogICAgICAgICAgICBleGVjdXRhYmxlID0gInB5dGhvbi5leGUiCiAgICAgICAgY21kID0gY2xzLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjdXRhYmxlKQogICAgICAgIGNtZC5pbnN0YWxsX29wdGlvbnMoc2NyaXB0X3RleHQpCiAgICAgICAgcmV0dXJuIGNtZC5hc19oZWFkZXIoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9hcmdzKGNscywgZGlzdCwgaGVhZGVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncwogICAgICAgIGNvbnNvbGVfc2NyaXB0cyBhbmQgZ3VpX3NjcmlwdHMgZW50cnkgcG9pbnRzLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlciBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X2hlYWRlcigpCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgZm9yIHR5cGVfIGluICdjb25zb2xlJywgJ2d1aSc6CiAgICAgICAgICAgIGdyb3VwID0gdHlwZV8gKyAnX3NjcmlwdHMnCiAgICAgICAgICAgIGZvciBuYW1lLCBlcCBpbiBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBjbHMuX2Vuc3VyZV9zYWZlX25hbWUobmFtZSkKICAgICAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gY2xzLnRlbXBsYXRlICUgbG9jYWxzKCkKICAgICAgICAgICAgICAgIGFyZ3MgPSBjbHMuX2dldF9zY3JpcHRfYXJncyh0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCkKICAgICAgICAgICAgICAgIGZvciByZXMgaW4gYXJnczoKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Vuc3VyZV9zYWZlX25hbWUobmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJldmVudCBwYXRocyBpbiAqX3NjcmlwdHMgZW50cnkgcG9pbnQgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgaGFzX3BhdGhfc2VwID0gcmUuc2VhcmNoKHInW1xcL10nLCBuYW1lKQogICAgICAgIGlmIGhhc19wYXRoX3NlcDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGF0aCBzZXBhcmF0b3JzIG5vdCBhbGxvd2VkIGluIHNjcmlwdCBuYW1lcyIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3dyaXRlcihjbHMsIGZvcmNlX3dpbmRvd3MpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgYmVzdCIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkgaWYgZm9yY2Vfd2luZG93cyBlbHNlIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBmb3IgdGhpcyBlbnZpcm9ubWVudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpOgogICAgICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gY2xzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAjIFNpbXBseSB3cml0ZSB0aGUgc3R1YiB3aXRoIG5vIGV4dGVuc2lvbi4KICAgICAgICB5aWVsZCAobmFtZSwgaGVhZGVyICsgc2NyaXB0X3RleHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0PSIiLCBleGVjdXRhYmxlPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhICMhIGxpbmUsIGdldHRpbmcgb3B0aW9ucyAoaWYgYW55KSBmcm9tIHNjcmlwdF90ZXh0IiIiCiAgICAgICAgY21kID0gY2xzLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjdXRhYmxlKQogICAgICAgIGNtZC5pbnN0YWxsX29wdGlvbnMoc2NyaXB0X3RleHQpCiAgICAgICAgcmV0dXJuIGNtZC5hc19oZWFkZXIoKQoKCmNsYXNzIFdpbmRvd3NTY3JpcHRXcml0ZXIoU2NyaXB0V3JpdGVyKToKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IFdpbmRvd3NDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBzdWl0YWJsZSBmb3IgV2luZG93cwogICAgICAgICIiIgogICAgICAgIHdyaXRlcl9sb29rdXAgPSBkaWN0KAogICAgICAgICAgICBleGVjdXRhYmxlPVdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIsCiAgICAgICAgICAgIG5hdHVyYWw9Y2xzLAogICAgICAgICkKICAgICAgICAjIGZvciBjb21wYXRpYmlsaXR5LCB1c2UgdGhlIGV4ZWN1dGFibGUgbGF1bmNoZXIgYnkgZGVmYXVsdAogICAgICAgIGxhdW5jaGVyID0gb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfTEFVTkNIRVInLCAnZXhlY3V0YWJsZScpCiAgICAgICAgcmV0dXJuIHdyaXRlcl9sb29rdXBbbGF1bmNoZXJdCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiRm9yIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24iCiAgICAgICAgZXh0ID0gZGljdChjb25zb2xlPScucHlhJywgZ3VpPScucHl3JylbdHlwZV9dCiAgICAgICAgaWYgZXh0IG5vdCBpbiBvcy5lbnZpcm9uWydQQVRIRVhUJ10ubG93ZXIoKS5zcGxpdCgnOycpOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAie2V4dH0gbm90IGxpc3RlZCBpbiBQQVRIRVhUOyBzY3JpcHRzIHdpbGwgbm90IGJlICIKICAgICAgICAgICAgICAgICJyZWNvZ25pemVkIGFzIGV4ZWN1dGFibGVzLiIKICAgICAgICAgICAgKS5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQogICAgICAgIG9sZCA9IFsnLnB5YScsICcucHknLCAnLXNjcmlwdC5weScsICcucHljJywgJy5weW8nLCAnLnB5dycsICcuZXhlJ10KICAgICAgICBvbGQucmVtb3ZlKGV4dCkKICAgICAgICBoZWFkZXIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgbmFtZSArIGV4dCwgaGVhZGVyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYWRqdXN0X2hlYWRlcihjbHMsIHR5cGVfLCBvcmlnX2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBzdXJlICdweXRob253JyBpcyB1c2VkIGZvciBndWkgYW5kIGFuZCAncHl0aG9uJyBpcyB1c2VkIGZvcgogICAgICAgIGNvbnNvbGUgKHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzeXMuZXhlY3V0YWJsZSBpcykuCiAgICAgICAgIiIiCiAgICAgICAgcGF0dGVybiA9ICdweXRob253LmV4ZScKICAgICAgICByZXBsID0gJ3B5dGhvbi5leGUnCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIHBhdHRlcm4sIHJlcGwgPSByZXBsLCBwYXR0ZXJuCiAgICAgICAgcGF0dGVybl9vYiA9IHJlLmNvbXBpbGUocmUuZXNjYXBlKHBhdHRlcm4pLCByZS5JR05PUkVDQVNFKQogICAgICAgIG5ld19oZWFkZXIgPSBwYXR0ZXJuX29iLnN1YihzdHJpbmc9b3JpZ19oZWFkZXIsIHJlcGw9cmVwbCkKICAgICAgICByZXR1cm4gbmV3X2hlYWRlciBpZiBjbHMuX3VzZV9oZWFkZXIobmV3X2hlYWRlcikgZWxzZSBvcmlnX2hlYWRlcgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdXNlX2hlYWRlcihuZXdfaGVhZGVyKToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgX2FkanVzdF9oZWFkZXIgdXNlIHRoZSByZXBsYWNlZCBoZWFkZXI/CgogICAgICAgIE9uIG5vbi13aW5kb3dzIHN5c3RlbXMsIGFsd2F5cyB1c2UuIE9uCiAgICAgICAgV2luZG93cyBzeXN0ZW1zLCBvbmx5IHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyIGlmIGl0IHJlc29sdmVzCiAgICAgICAgdG8gYW4gZXhlY3V0YWJsZSBvbiB0aGUgc3lzdGVtLgogICAgICAgICIiIgogICAgICAgIGNsZWFuX2hlYWRlciA9IG5ld19oZWFkZXJbMjotMV0uc3RyaXAoJyInKQogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBvciBmaW5kX2V4ZWN1dGFibGUoY2xlYW5faGVhZGVyKQoKCmNsYXNzIFdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIoV2luZG93c1NjcmlwdFdyaXRlcik6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICIiIgogICAgICAgIEZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIGFuZCBhbiAuZXhlIGxhdW5jaGVyCiAgICAgICAgIiIiCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnZ3VpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weXcnCiAgICAgICAgICAgIG9sZCA9IFsnLnB5dyddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGF1bmNoZXJfdHlwZSA9ICdjbGknCiAgICAgICAgICAgIGV4dCA9ICctc2NyaXB0LnB5JwogICAgICAgICAgICBvbGQgPSBbJy5weScsICcucHljJywgJy5weW8nXQogICAgICAgIGhkciA9IGNscy5fYWRqdXN0X2hlYWRlcih0eXBlXywgaGVhZGVyKQogICAgICAgIGJsb2NrZXJzID0gW25hbWUgKyB4IGZvciB4IGluIG9sZF0KICAgICAgICB5aWVsZCAobmFtZSArIGV4dCwgaGRyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMpCiAgICAgICAgeWllbGQgKAogICAgICAgICAgICBuYW1lICsgJy5leGUnLCBnZXRfd2luX2xhdW5jaGVyKGxhdW5jaGVyX3R5cGUpLAogICAgICAgICAgICAnYicgICMgd3JpdGUgaW4gYmluYXJ5IG1vZGUKICAgICAgICApCiAgICAgICAgaWYgbm90IGlzXzY0Yml0KCk6CiAgICAgICAgICAgICMgaW5zdGFsbCBhIG1hbmlmZXN0IGZvciB0aGUgbGF1bmNoZXIgdG8gcHJldmVudCBXaW5kb3dzCiAgICAgICAgICAgICMgZnJvbSBkZXRlY3RpbmcgaXQgYXMgYW4gaW5zdGFsbGVyICh3aGljaCBpdCB3aWxsIGZvcgogICAgICAgICAgICAjICBsYXVuY2hlcnMgbGlrZSBlYXN5X2luc3RhbGwuZXhlKS4gQ29uc2lkZXIgb25seQogICAgICAgICAgICAjICBhZGRpbmcgYSBtYW5pZmVzdCBmb3IgbGF1bmNoZXJzIGRldGVjdGVkIGFzIGluc3RhbGxlcnMuCiAgICAgICAgICAgICMgIFNlZSBEaXN0cmlidXRlICMxNDMgZm9yIGRldGFpbHMuCiAgICAgICAgICAgIG1fbmFtZSA9IG5hbWUgKyAnLmV4ZS5tYW5pZmVzdCcKICAgICAgICAgICAgeWllbGQgKG1fbmFtZSwgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKSwgJ3QnKQoKCiMgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkKZ2V0X3NjcmlwdF9hcmdzID0gU2NyaXB0V3JpdGVyLmdldF9zY3JpcHRfYXJncwpnZXRfc2NyaXB0X2hlYWRlciA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2hlYWRlcgoKCmRlZiBnZXRfd2luX2xhdW5jaGVyKHR5cGUpOgogICAgIiIiCiAgICBMb2FkIHRoZSBXaW5kb3dzIGxhdW5jaGVyIChleGVjdXRhYmxlKSBzdWl0YWJsZSBmb3IgbGF1bmNoaW5nIGEgc2NyaXB0LgoKICAgIGB0eXBlYCBzaG91bGQgYmUgZWl0aGVyICdjbGknIG9yICdndWknCgogICAgUmV0dXJucyB0aGUgZXhlY3V0YWJsZSBhcyBhIGJ5dGUgc3RyaW5nLgogICAgIiIiCiAgICBsYXVuY2hlcl9mbiA9ICclcy5leGUnICUgdHlwZQogICAgaWYgaXNfNjRiaXQoKToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTY0LiIpCiAgICBlbHNlOgogICAgICAgIGxhdW5jaGVyX2ZuID0gbGF1bmNoZXJfZm4ucmVwbGFjZSgiLiIsICItMzIuIikKICAgIHJldHVybiByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBsYXVuY2hlcl9mbikKCgpkZWYgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKToKICAgIG1hbmlmZXN0ID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9zdHJpbmcoX19uYW1lX18sICdsYXVuY2hlciBtYW5pZmVzdC54bWwnKQogICAgaWYgc2l4LlBZMjoKICAgICAgICByZXR1cm4gbWFuaWZlc3QgJSB2YXJzKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0LmRlY29kZSgndXRmLTgnKSAlIHZhcnMoKQoKCmRlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1hdXRvX2NobW9kKToKICAgIHJldHVybiBzaHV0aWwucm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnMsIG9uZXJyb3IpCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgIHRtcCA9IG9zLnVtYXNrKDBvMDIyKQogICAgb3MudW1hc2sodG1wKQogICAgcmV0dXJuIHRtcAoKCmRlZiBib290c3RyYXAoKToKICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzZXR1cHRvb2xzKi5lZ2cgaXMgcnVuIHVzaW5nIC9iaW4vc2gKICAgIGltcG9ydCBzZXR1cHRvb2xzCgogICAgYXJndjAgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXB0b29scy5fX3BhdGhfX1swXSkKICAgIHN5cy5hcmd2WzBdID0gYXJndjAKICAgIHN5cy5hcmd2LmFwcGVuZChhcmd2MCkKICAgIG1haW4oKQoKCmRlZiBtYWluKGFyZ3Y9Tm9uZSwgKiprdyk6CiAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCgogICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgogICAgICAgIGNvbW1vbl91c2FnZSA9ICIiCgogICAgICAgIGRlZiBfc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KQoKICAgIGlmIGFyZ3YgaXMgTm9uZToKICAgICAgICBhcmd2ID0gc3lzLmFyZ3ZbMTpdCgogICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICBzZXR1cCgKICAgICAgICAgICAgc2NyaXB0X2FyZ3M9WyctcScsICdlYXN5X2luc3RhbGwnLCAnLXYnXSArIGFyZ3YsCiAgICAgICAgICAgIHNjcmlwdF9uYW1lPXN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAogICAgICAgICAgICBkaXN0Y2xhc3M9RGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcywKICAgICAgICAgICAgKiprdwogICAgICAgICkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgX3BhdGNoX3VzYWdlKCk6CiAgICBpbXBvcnQgZGlzdHV0aWxzLmNvcmUKICAgIFVTQUdFID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIHVzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCiAgICAgICAgICAgb3I6ICUoc2NyaXB0KXMgLS1oZWxwCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBnZW5fdXNhZ2Uoc2NyaXB0X25hbWUpOgogICAgICAgIHJldHVybiBVU0FHRSAlIGRpY3QoCiAgICAgICAgICAgIHNjcmlwdD1vcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKSwKICAgICAgICApCgogICAgc2F2ZWQgPSBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UKICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IHNhdmVkClBLAwQUAAAAAAAAACEATixyQnBhAABwYQAANgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weSIiInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbwoKQ3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSBhbmQgY29udGVudHMiIiIKCmZyb20gZGlzdHV0aWxzLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdCBhcyBfRmlsZUxpc3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNJbnRlcm5hbEVycm9yCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBpbwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHRpbWUKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgd2Fsa19yZXZjdHJsCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZwpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIHBhcnNlX3JlcXVpcmVtZW50cywgc2FmZV9uYW1lLCBwYXJzZV92ZXJzaW9uLAogICAgc2FmZV92ZXJzaW9uLCB5aWVsZF9saW5lcywgRW50cnlQb2ludCwgaXRlcl9lbnRyeV9wb2ludHMsIHRvX2ZpbGVuYW1lKQppbXBvcnQgc2V0dXB0b29scy51bmljb2RlX3V0aWxzIGFzIHVuaWNvZGVfdXRpbHMKZnJvbSBzZXR1cHRvb2xzLmdsb2IgaW1wb3J0IGdsb2IKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwoKCmRlZiB0cmFuc2xhdGVfcGF0dGVybihnbG9iKToKICAgICIiIgogICAgVHJhbnNsYXRlIGEgZmlsZSBwYXRoIGdsb2IgbGlrZSAnKi50eHQnIGluIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgogICAgVGhpcyBkaWZmZXJzIGZyb20gZm5tYXRjaC50cmFuc2xhdGUgd2hpY2ggYWxsb3dzIHdpbGRjYXJkcyB0byBtYXRjaAogICAgZGlyZWN0b3J5IHNlcGFyYXRvcnMuIEl0IGFsc28ga25vd3MgYWJvdXQgJyoqLycgd2hpY2ggbWF0Y2hlcyBhbnkgbnVtYmVyIG9mCiAgICBkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcGF0ID0gJycKCiAgICAjIFRoaXMgd2lsbCBzcGxpdCBvbiAnLycgd2l0aGluIFtjaGFyYWN0ZXIgY2xhc3Nlc10uIFRoaXMgaXMgZGVsaWJlcmF0ZS4KICAgIGNodW5rcyA9IGdsb2Iuc3BsaXQob3MucGF0aC5zZXApCgogICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKICAgIHZhbGlkX2NoYXIgPSAnW14lc10nICUgKHNlcCwpCgogICAgZm9yIGMsIGNodW5rIGluIGVudW1lcmF0ZShjaHVua3MpOgogICAgICAgIGxhc3RfY2h1bmsgPSBjID09IGxlbihjaHVua3MpIC0gMQoKICAgICAgICAjIENodW5rcyB0aGF0IGFyZSBhIGxpdGVyYWwgKiogYXJlIGdsb2JzdGFycy4gVGhleSBtYXRjaCBhbnl0aGluZy4KICAgICAgICBpZiBjaHVuayA9PSAnKionOgogICAgICAgICAgICBpZiBsYXN0X2NodW5rOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNvbXBvbmVudAogICAgICAgICAgICAgICAgcGF0ICs9ICcuKicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTWF0Y2ggJyhuYW1lLykqJwogICAgICAgICAgICAgICAgcGF0ICs9ICcoPzolcyslcykqJyAlICh2YWxpZF9jaGFyLCBzZXApCiAgICAgICAgICAgIGNvbnRpbnVlICAjIEJyZWFrIGhlcmUgYXMgdGhlIHdob2xlIHBhdGggY29tcG9uZW50IGhhcyBiZWVuIGhhbmRsZWQKCiAgICAgICAgIyBGaW5kIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHJlbWFpbmRlcgogICAgICAgIGkgPSAwCiAgICAgICAgY2h1bmtfbGVuID0gbGVuKGNodW5rKQogICAgICAgIHdoaWxlIGkgPCBjaHVua19sZW46CiAgICAgICAgICAgIGNoYXIgPSBjaHVua1tpXQogICAgICAgICAgICBpZiBjaGFyID09ICcqJzoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55IG51bWJlciBvZiBuYW1lIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgIHBhdCArPSB2YWxpZF9jaGFyICsgJyonCiAgICAgICAgICAgIGVsaWYgY2hhciA9PSAnPyc6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGEgbmFtZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgIHBhdCArPSB2YWxpZF9jaGFyCiAgICAgICAgICAgIGVsaWYgY2hhciA9PSAnWyc6CiAgICAgICAgICAgICAgICAjIENoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAgICAgaW5uZXJfaSA9IGkgKyAxCiAgICAgICAgICAgICAgICAjIFNraXAgaW5pdGlhbCAhL10gY2hhcnMKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldID09ICchJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldID09ICddJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKCiAgICAgICAgICAgICAgICAjIExvb3AgdGlsbCB0aGUgY2xvc2luZyBdIGlzIGZvdW5kCiAgICAgICAgICAgICAgICB3aGlsZSBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSAhPSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA+PSBjaHVua19sZW46CiAgICAgICAgICAgICAgICAgICAgIyBHb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdpdGhvdXQgZmluZGluZyBhIGNsb3NpbmcgXQogICAgICAgICAgICAgICAgICAgICMgRG8gbm90IHRyZWF0IHRoaXMgYXMgYSBtYXRjaGluZyBncm91cCwgYnV0IGFzIGEgbGl0ZXJhbCBbCiAgICAgICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIEdyYWIgdGhlIGluc2lkZXMgb2YgdGhlIFticmFja2V0c10KICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGNodW5rW2kgKyAxOmlubmVyX2ldCiAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyA9ICcnCgogICAgICAgICAgICAgICAgICAgICMgQ2xhc3MgbmVnYXRpb24KICAgICAgICAgICAgICAgICAgICBpZiBpbm5lclswXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnXicKICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBpbm5lclsxOl0KCiAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyArPSByZS5lc2NhcGUoaW5uZXIpCiAgICAgICAgICAgICAgICAgICAgcGF0ICs9ICdbJXNdJyAlIChjaGFyX2NsYXNzLCkKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBlbmQgXQogICAgICAgICAgICAgICAgICAgIGkgPSBpbm5lcl9pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXQgKz0gcmUuZXNjYXBlKGNoYXIpCiAgICAgICAgICAgIGkgKz0gMQoKICAgICAgICAjIEpvaW4gZWFjaCBjaHVuayB3aXRoIHRoZSBkaXIgc2VwYXJhdG9yCiAgICAgICAgaWYgbm90IGxhc3RfY2h1bms6CiAgICAgICAgICAgIHBhdCArPSBzZXAKCiAgICBwYXQgKz0gcidcWicKICAgIHJldHVybiByZS5jb21waWxlKHBhdCwgZmxhZ3M9cmUuTVVMVElMSU5FfHJlLkRPVEFMTCkKCgpjbGFzcyBlZ2dfaW5mbyhDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAogICAgICAgICgndGFnLWRhdGUnLCAnZCcsICJBZGQgZGF0ZSBzdGFtcCAoZS5nLiAyMDA1MDUyOCkgdG8gdmVyc2lvbiBudW1iZXIiKSwKICAgICAgICAoJ3RhZy1idWlsZD0nLCAnYicsICJTcGVjaWZ5IGV4cGxpY2l0IHRhZyB0byBhZGQgdG8gdmVyc2lvbiBudW1iZXIiKSwKICAgICAgICAoJ25vLWRhdGUnLCAnRCcsICJEb24ndCBpbmNsdWRlIGRhdGUgc3RhbXAgW2RlZmF1bHRdIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWyd0YWctZGF0ZSddCiAgICBuZWdhdGl2ZV9vcHQgPSB7CiAgICAgICAgJ25vLWRhdGUnOiAndGFnLWRhdGUnLAogICAgfQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IE5vbmUKICAgICAgICBzZWxmLnRhZ19idWlsZCA9IE5vbmUKICAgICAgICBzZWxmLnRhZ19kYXRlID0gMAogICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gRmFsc2UKICAgICAgICBzZWxmLnZ0YWdzID0gTm9uZQoKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyBhbGxvdyB0aGUgJ3RhZ19zdm5fcmV2aXNpb24nIHRvIGJlIGRldGVjdGVkIGFuZAogICAgIyBzZXQsIHN1cHBvcnRpbmcgc2Rpc3RzIGJ1aWx0IG9uIG9sZGVyIFNldHVwdG9vbHMuCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YWdfc3ZuX3JldmlzaW9uKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBAdGFnX3N2bl9yZXZpc2lvbi5zZXR0ZXIKICAgIGRlZiB0YWdfc3ZuX3JldmlzaW9uKHNlbGYsIHZhbHVlKToKICAgICAgICBwYXNzCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBkZWYgc2F2ZV92ZXJzaW9uX2luZm8oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIgogICAgICAgIE1hdGVyaWFsaXplIHRoZSB2YWx1ZSBvZiBkYXRlIGludG8gdGhlCiAgICAgICAgYnVpbGQgdGFnLiBJbnN0YWxsIGJ1aWxkIGtleXMgaW4gYSBkZXRlcm1pbmlzdGljIG9yZGVyCiAgICAgICAgdG8gYXZvaWQgYXJiaXRyYXJ5IHJlb3JkZXJpbmcgb24gc3Vic2VxdWVudCBidWlsZHMuCiAgICAgICAgIiIiCiAgICAgICAgZWdnX2luZm8gPSBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpCiAgICAgICAgIyBmb2xsb3cgdGhlIG9yZGVyIHRoZXNlIGtleXMgd291bGQgaGF2ZSBiZWVuIGFkZGVkCiAgICAgICAgIyB3aGVuIFBZVEhPTkhBU0hTRUVEPTAKICAgICAgICBlZ2dfaW5mb1sndGFnX2J1aWxkJ10gPSBzZWxmLnRhZ3MoKQogICAgICAgIGVnZ19pbmZvWyd0YWdfZGF0ZSddID0gMAogICAgICAgIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBkaWN0KGVnZ19pbmZvPWVnZ19pbmZvKSkKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmVnZ19uYW1lID0gc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpCiAgICAgICAgc2VsZi52dGFncyA9IHNlbGYudGFncygpCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IHNlbGYudGFnZ2VkX3ZlcnNpb24oKQoKICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5lZ2dfdmVyc2lvbikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpc192ZXJzaW9uID0gaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbikKICAgICAgICAgICAgc3BlYyA9ICgKICAgICAgICAgICAgICAgICIlcz09JXMiIGlmIGlzX3ZlcnNpb24gZWxzZSAiJXM9PT0lcyIKICAgICAgICAgICAgKQogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKHNwZWMgJSAoc2VsZi5lZ2dfbmFtZSwgc2VsZi5lZ2dfdmVyc2lvbikpCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIGRpc3RyaWJ1dGlvbiBuYW1lIG9yIHZlcnNpb24gc3ludGF4OiAlcy0lcyIgJQogICAgICAgICAgICAgICAgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSBpcyBOb25lOgogICAgICAgICAgICBkaXJzID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IChkaXJzIG9yIHt9KS5nZXQoJycsIG9zLmN1cmRpcikKCiAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgnZWdnX2Jhc2UnKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSB0b19maWxlbmFtZShzZWxmLmVnZ19uYW1lKSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgc2VsZi5lZ2dfaW5mbykKICAgICAgICBpZiAnLScgaW4gc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgc2VsZi5jaGVja19icm9rZW5fZWdnX2luZm8oKQoKICAgICAgICAjIFNldCBwYWNrYWdlIHZlcnNpb24gZm9yIHRoZSBiZW5lZml0IG9mIGR1bWJlciBjb21tYW5kcwogICAgICAgICMgKGUuZy4gc2Rpc3QsIGJkaXN0X3dpbmluc3QsIGV0Yy4pCiAgICAgICAgIwogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLnZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCgogICAgICAgICMgSWYgd2UgYm9vdHN0cmFwcGVkIGFyb3VuZCB0aGUgbGFjayBvZiBhIFBLRy1JTkZPLCBhcyBtaWdodCBiZSB0aGUKICAgICAgICAjIGNhc2UgaW4gYSBmcmVzaCBjaGVja291dCwgbWFrZSBzdXJlIHRoYXQgYW55IHNwZWNpYWwgdGFncyBnZXQgYWRkZWQKICAgICAgICAjIHRvIHRoZSB2ZXJzaW9uIGluZm8KICAgICAgICAjCiAgICAgICAgcGQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0CiAgICAgICAgaWYgcGQgaXMgbm90IE5vbmUgYW5kIHBkLmtleSA9PSBzZWxmLmVnZ19uYW1lLmxvd2VyKCk6CiAgICAgICAgICAgIHBkLl92ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgogICAgICAgICAgICBwZC5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QgPSBOb25lCgogICAgZGVmIHdyaXRlX29yX2RlbGV0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgb3IgZGVsZXRlIGlmIGVtcHR5CgogICAgICAgIElmIGBkYXRhYCBpcyBub24tZW1wdHksIHRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBgYHdyaXRlX2ZpbGUoKWBgLgogICAgICAgIElmIGBkYXRhYCBpcyBlbXB0eSBidXQgbm90IGBgTm9uZWBgLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKICAgICAgICBgYGRlbGV0ZV9maWxlKGZpbGVuYW1lKWAuICBJZiBgZGF0YWAgaXMgYGBOb25lYGAsIHRoZW4gdGhpcyBpcyBhIG5vLW9wCiAgICAgICAgdW5sZXNzIGBmaWxlbmFtZWAgZXhpc3RzLCBpbiB3aGljaCBjYXNlIGEgd2FybmluZyBpcyBpc3N1ZWQgYWJvdXQgdGhlCiAgICAgICAgb3JwaGFuZWQgZmlsZSAoaWYgYGZvcmNlYCBpcyBmYWxzZSksIG9yIGRlbGV0ZWQgKGlmIGBmb3JjZWAgaXMgdHJ1ZSkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKHdoYXQsIGZpbGVuYW1lLCBkYXRhKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmUgYW5kIG5vdCBmb3JjZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgICAgICIlcyBub3Qgc2V0IGluIHNldHVwKCksIGJ1dCAlcyBleGlzdHMiLCB3aGF0LCBmaWxlbmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGZpbGVuYW1lKQoKICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhKToKICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdAoKICAgICAgICBgd2hhdGAgaXMgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIHRvIGlkZW50aWZ5IHdoYXQgaXMgYmVpbmcgd3JpdHRlbgogICAgICAgIHRvIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIHRvICVzIiwgd2hhdCwgZmlsZW5hbWUpCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCiAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIGRlbGV0ZV9maWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiJEZWxldGUgYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdCIiIgogICAgICAgIGxvZy5pbmZvKCJkZWxldGluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKCiAgICBkZWYgdGFnZ2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKICAgICAgICAjIGVnZ19pbmZvIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgZm9yIGEgZGlzdHJpYnV0aW9uLAogICAgICAgICMgaW4gd2hpY2ggY2FzZSB0aGUgdmVyc2lvbiBzdHJpbmcgYWxyZWFkeSBjb250YWlucyBhbGwgdGFncy4KICAgICAgICBpZiBzZWxmLnZ0YWdzIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKHNlbGYudnRhZ3MpOgogICAgICAgICAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uICsgc2VsZi52dGFncykKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYubWtwYXRoKHNlbGYuZWdnX2luZm8pCiAgICAgICAgaW5zdGFsbGVyID0gc2VsZi5kaXN0cmlidXRpb24uZmV0Y2hfYnVpbGRfZWdnCiAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdlZ2dfaW5mby53cml0ZXJzJyk6CiAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPWluc3RhbGxlcikKICAgICAgICAgICAgd3JpdGVyID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgIHdyaXRlcihzZWxmLCBlcC5uYW1lLCBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgZXAubmFtZSkpCgogICAgICAgICMgR2V0IHJpZCBvZiBuYXRpdmVfbGlicy50eHQgaWYgaXQgd2FzIHB1dCB0aGVyZSBieSBvbGRlciBiZGlzdF9lZ2cKICAgICAgICBubCA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhubCk6CiAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUobmwpCgogICAgICAgIHNlbGYuZmluZF9zb3VyY2VzKCkKCiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICBpZiBzZWxmLnRhZ19idWlsZDoKICAgICAgICAgICAgdmVyc2lvbiArPSBzZWxmLnRhZ19idWlsZAogICAgICAgIGlmIHNlbGYudGFnX2RhdGU6CiAgICAgICAgICAgIHZlcnNpb24gKz0gdGltZS5zdHJmdGltZSgiLSVZJW0lZCIpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgZmluZF9zb3VyY2VzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIFNPVVJDRVMudHh0IG1hbmlmZXN0IGZpbGUiIiIKICAgICAgICBtYW5pZmVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAiU09VUkNFUy50eHQiKQogICAgICAgIG1tID0gbWFuaWZlc3RfbWFrZXIoc2VsZi5kaXN0cmlidXRpb24pCiAgICAgICAgbW0ubWFuaWZlc3QgPSBtYW5pZmVzdF9maWxlbmFtZQogICAgICAgIG1tLnJ1bigpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IG1tLmZpbGVsaXN0CgogICAgZGVmIGNoZWNrX2Jyb2tlbl9lZ2dfaW5mbyhzZWxmKToKICAgICAgICBiZWkgPSBzZWxmLmVnZ19uYW1lICsgJy5lZ2ctaW5mbycKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgYmVpID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIGJlaSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhiZWkpOgogICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICItIiAqIDc4ICsgJ1xuJwogICAgICAgICAgICAgICAgIk5vdGU6IFlvdXIgY3VycmVudCAuZWdnLWluZm8gZGlyZWN0b3J5IGhhcyBhICctJyBpbiBpdHMgbmFtZTsiCiAgICAgICAgICAgICAgICAnXG50aGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggInNldHVwLnB5IGRldmVsb3AiLlxuXG4nCiAgICAgICAgICAgICAgICAnUGxlYXNlIHJlbmFtZSAlcyB0byAlcyB0byBjb3JyZWN0IHRoaXMgcHJvYmxlbS5cbicgKyAnLScgKiA3OCwKICAgICAgICAgICAgICAgIGJlaSwgc2VsZi5lZ2dfaW5mbwogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gc2VsZi5lZ2dfaW5mbwogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gYmVpICAjIG1ha2UgaXQgd29yayBmb3Igbm93CgoKY2xhc3MgRmlsZUxpc3QoX0ZpbGVMaXN0KToKICAgICMgSW1wbGVtZW50YXRpb25zIG9mIHRoZSB2YXJpb3VzIE1BTklGRVNULmluIGNvbW1hbmRzCgogICAgZGVmIHByb2Nlc3NfdGVtcGxhdGVfbGluZShzZWxmLCBsaW5lKToKICAgICAgICAjIFBhcnNlIHRoZSBsaW5lOiBzcGxpdCBpdCB1cCwgbWFrZSBzdXJlIHRoZSByaWdodCBudW1iZXIgb2Ygd29yZHMKICAgICAgICAjIGlzIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSByZWxldmFudCB3b3Jkcy4gICdhY3Rpb24nIGlzIGFsd2F5cwogICAgICAgICMgZGVmaW5lZDogaXQncyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZS4gIFdoaWNoIG9mIHRoZSBvdGhlcgogICAgICAgICMgdGhyZWUgYXJlIGRlZmluZWQgZGVwZW5kcyBvbiB0aGUgYWN0aW9uOyBpdCdsbCBiZSBlaXRoZXIKICAgICAgICAjIHBhdHRlcm5zLCAoZGlyIGFuZCBwYXR0ZXJucyksIG9yIChkaXJfcGF0dGVybikuCiAgICAgICAgKGFjdGlvbiwgcGF0dGVybnMsIGRpciwgZGlyX3BhdHRlcm4pID0gc2VsZi5fcGFyc2VfdGVtcGxhdGVfbGluZShsaW5lKQoKICAgICAgICAjIE9LLCBub3cgd2Uga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgdmFsaWQgYW5kIHdlIGhhdmUgdGhlCiAgICAgICAgIyByaWdodCBudW1iZXIgb2Ygd29yZHMgb24gdGhlIGxpbmUgZm9yIHRoYXQgYWN0aW9uIC0tIHNvIHdlCiAgICAgICAgIyBjYW4gcHJvY2VlZCB3aXRoIG1pbmltYWwgZXJyb3ItY2hlY2tpbmcuCiAgICAgICAgaWYgYWN0aW9uID09ICdpbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmluY2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcyciLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBtYXRjaGluZyAnJXMnIiksIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1pbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZ2xvYmFsX2luY2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWV4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9leGNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIGFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1pbmNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfaW5jbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicmVjdXJzaXZlLWV4Y2x1ZGUgJXMgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyLCAnICcuam9pbihwYXR0ZXJucykpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZV9leGNsdWRlKGRpciwgcGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgdW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdncmFmdCc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdyYWZ0ICIgKyBkaXJfcGF0dGVybikKICAgICAgICAgICAgaWYgbm90IHNlbGYuZ3JhZnQoZGlyX3BhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGRpcmVjdG9yaWVzIGZvdW5kIG1hdGNoaW5nICclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdwcnVuZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInBydW5lICIgKyBkaXJfcGF0dGVybikKICAgICAgICAgICAgaWYgbm90IHNlbGYucHJ1bmUoZGlyX3BhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oKCJubyBwcmV2aW91c2x5LWluY2x1ZGVkIGRpcmVjdG9yaWVzIGZvdW5kICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hpbmcgJyVzJyIpLCBkaXJfcGF0dGVybikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgICAgICJ0aGlzIGNhbm5vdCBoYXBwZW46IGludmFsaWQgYWN0aW9uICclcyciICUgYWN0aW9uKQoKICAgIGRlZiBfcmVtb3ZlX2ZpbGVzKHNlbGYsIHByZWRpY2F0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIHRoZSBmaWxlIGxpc3QgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLgogICAgICAgIFJldHVybiBUcnVlIGlmIGFueSBtYXRjaGluZyBmaWxlcyB3ZXJlIHJlbW92ZWQKICAgICAgICAiIiIKICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmlsZXMpIC0gMSwgLTEsIC0xKToKICAgICAgICAgICAgaWYgcHJlZGljYXRlKHNlbGYuZmlsZXNbaV0pOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiIHJlbW92aW5nICIgKyBzZWxmLmZpbGVzW2ldKQogICAgICAgICAgICAgICAgZGVsIHNlbGYuZmlsZXNbaV0KICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgIHJldHVybiBmb3VuZAoKICAgIGRlZiBpbmNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIkluY2x1ZGUgZmlsZXMgdGhhdCBtYXRjaCAncGF0dGVybicuIiIiCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKHBhdHRlcm4pIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBleGNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIkV4Y2x1ZGUgZmlsZXMgdGhhdCBtYXRjaCAncGF0dGVybicuIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIHJlY3Vyc2l2ZV9pbmNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gJ2Rpci8nIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgZnVsbF9wYXR0ZXJuID0gb3MucGF0aC5qb2luKGRpciwgJyoqJywgcGF0dGVybikKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIGdsb2IoZnVsbF9wYXR0ZXJuLCByZWN1cnNpdmU9VHJ1ZSkKICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcmVjdXJzaXZlX2V4Y2x1ZGUoc2VsZiwgZGlyLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBFeGNsdWRlIGFueSBmaWxlIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJywgcGF0dGVybikpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ3JhZnQoc2VsZiwgZGlyKToKICAgICAgICAiIiJJbmNsdWRlIGFsbCBmaWxlcyBmcm9tICdkaXIvJy4iIiIKICAgICAgICBmb3VuZCA9IFsKICAgICAgICAgICAgaXRlbQogICAgICAgICAgICBmb3IgbWF0Y2hfZGlyIGluIGdsb2IoZGlyKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBkaXN0dXRpbHMuZmlsZWxpc3QuZmluZGFsbChtYXRjaF9kaXIpCiAgICAgICAgXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBwcnVuZShzZWxmLCBkaXIpOgogICAgICAgICIiIkZpbHRlciBvdXQgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oZGlyLCAnKionKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBnbG9iYWxfaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBJbmNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBtYXRjaCB0aGUKICAgICAgICBwYXR0ZXJuLiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQgb24gbGFyZ2UgZmlsZSB0cmVlcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmFsbGZpbGVzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZmluZGFsbCgpCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oJyoqJywgcGF0dGVybikpCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBzZWxmLmFsbGZpbGVzIGlmIG1hdGNoLm1hdGNoKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBnbG9iYWxfZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBFeGNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKICAgICAgICBpZiBpdGVtLmVuZHN3aXRoKCdccicpOiAgIyBGaXggb2xkZXIgc2Rpc3RzIGJ1aWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgaXRlbSA9IGl0ZW1bOi0xXQogICAgICAgIHBhdGggPSBjb252ZXJ0X3BhdGgoaXRlbSkKCiAgICAgICAgaWYgc2VsZi5fc2FmZV9wYXRoKHBhdGgpOgogICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChwYXRoKQoKICAgIGRlZiBleHRlbmQoc2VsZiwgcGF0aHMpOgogICAgICAgIHNlbGYuZmlsZXMuZXh0ZW5kKGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHBhdGhzKSkKCiAgICBkZWYgX3JlcGFpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNlbGYuZmlsZXMgd2l0aCBvbmx5IHNhZmUgcGF0aHMKCiAgICAgICAgQmVjYXVzZSBzb21lIG93bmVycyBvZiBGaWxlTGlzdCBtYW5pcHVsYXRlIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgYGBmaWxlc2BgIGF0dHJpYnV0ZSBkaXJlY3RseSwgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgdG8KICAgICAgICByZXBhaXIgdGhvc2UgcGF0aHMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlcyA9IGxpc3QoZmlsdGVyKHNlbGYuX3NhZmVfcGF0aCwgc2VsZi5maWxlcykpCgogICAgZGVmIF9zYWZlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgZW5jX3dhcm4gPSAiJyVzJyBub3QgJXMgZW5jb2RhYmxlIC0tIHNraXBwaW5nIgoKICAgICAgICAjIFRvIGF2b2lkIGFjY2lkZW50YWwgdHJhbnMtY29kaW5ncyBlcnJvcnMsIGZpcnN0IHRvIHVuaWNvZGUKICAgICAgICB1X3BhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgaWYgdV9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKCInJXMnIGluIHVuZXhwZWN0ZWQgZW5jb2RpbmcgLS0gc2tpcHBpbmciICUgcGF0aCkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgTXVzdCBlbnN1cmUgdXRmLTggZW5jb2RhYmlsaXR5CiAgICAgICAgdXRmOF9wYXRoID0gdW5pY29kZV91dGlscy50cnlfZW5jb2RlKHVfcGF0aCwgInV0Zi04IikKICAgICAgICBpZiB1dGY4X3BhdGggaXMgTm9uZToKICAgICAgICAgICAgbG9nLndhcm4oZW5jX3dhcm4sIHBhdGgsICd1dGYtOCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgYWNjZXB0IGlzIGVpdGhlciB3YXkgY2hlY2tzIG91dAogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh1X3BhdGgpIG9yIG9zLnBhdGguZXhpc3RzKHV0ZjhfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICMgdGhpcyB3aWxsIGNhdGNoIGFueSBlbmNvZGUgZXJyb3JzIGRlY29kaW5nIHVfcGF0aAogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCgoKY2xhc3MgbWFuaWZlc3RfbWFrZXIoc2Rpc3QpOgogICAgdGVtcGxhdGUgPSAiTUFOSUZFU1QuaW4iCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVzZV9kZWZhdWx0cyA9IDEKICAgICAgICBzZWxmLnBydW5lID0gMQogICAgICAgIHNlbGYubWFuaWZlc3Rfb25seSA9IDEKICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBGaWxlTGlzdCgpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkgICMgaXQgbXVzdCBleGlzdCBzbyBpdCdsbCBnZXQgaW4gdGhlIGxpc3QKICAgICAgICBzZWxmLmFkZF9kZWZhdWx0cygpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50ZW1wbGF0ZSk6CiAgICAgICAgICAgIHNlbGYucmVhZF90ZW1wbGF0ZSgpCiAgICAgICAgc2VsZi5wcnVuZV9maWxlX2xpc3QoKQogICAgICAgIHNlbGYuZmlsZWxpc3Quc29ydCgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCiAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpCgogICAgZGVmIF9tYW5pZmVzdF9ub3JtYWxpemUoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IHVuaWNvZGVfdXRpbHMuZmlsZXN5c19kZWNvZGUocGF0aCkKICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKICAgIGRlZiB3cml0ZV9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSB0aGUgZmlsZSBsaXN0IGluICdzZWxmLmZpbGVsaXN0JyB0byB0aGUgbWFuaWZlc3QgZmlsZQogICAgICAgIG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0Jy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVsaXN0Ll9yZXBhaXIoKQoKICAgICAgICAjIE5vdyBfcmVwYWlycyBzaG91bGQgZW5jb2RhYmlsaXR5LCBidXQgbm90IHVuaWNvZGUKICAgICAgICBmaWxlcyA9IFtzZWxmLl9tYW5pZmVzdF9ub3JtYWxpemUoZikgZm9yIGYgaW4gc2VsZi5maWxlbGlzdC5maWxlc10KICAgICAgICBtc2cgPSAid3JpdGluZyBtYW5pZmVzdCBmaWxlICclcyciICUgc2VsZi5tYW5pZmVzdAogICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLCAoc2VsZi5tYW5pZmVzdCwgZmlsZXMpLCBtc2cpCgogICAgZGVmIHdhcm4oc2VsZiwgbXNnKToKICAgICAgICBpZiBub3Qgc2VsZi5fc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAgICAgc2Rpc3Qud2FybihzZWxmLCBtc2cpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zaG91bGRfc3VwcHJlc3Nfd2FybmluZyhtc2cpOgogICAgICAgICIiIgogICAgICAgIHN1cHByZXNzIG1pc3NpbmctZmlsZSB3YXJuaW5ncyBmcm9tIHNkaXN0CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHJlLm1hdGNoKHIic3RhbmRhcmQgZmlsZSAuKm5vdCBmb3VuZCIsIG1zZykKCiAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgogICAgICAgIHNkaXN0LmFkZF9kZWZhdWx0cyhzZWxmKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYudGVtcGxhdGUpCiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi5tYW5pZmVzdCkKICAgICAgICByY2ZpbGVzID0gbGlzdCh3YWxrX3JldmN0cmwoKSkKICAgICAgICBpZiByY2ZpbGVzOgogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChyY2ZpbGVzKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHNlbGYucmVhZF9tYW5pZmVzdCgpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBzZWxmLmZpbGVsaXN0LmdyYWZ0KGVpX2NtZC5lZ2dfaW5mbykKCiAgICBkZWYgcHJ1bmVfZmlsZV9saXN0KHNlbGYpOgogICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICBiYXNlX2RpciA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5wcnVuZShidWlsZC5idWlsZF9iYXNlKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYmFzZV9kaXIpCiAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihyJyhefCcgKyBzZXAgKyByJykoUkNTfENWU3xcLnN2biknICsgc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PTEpCgoKZGVmIHdyaXRlX2ZpbGUoZmlsZW5hbWUsIGNvbnRlbnRzKToKICAgICIiIkNyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHdyaXRlICdjb250ZW50cycgKGEKICAgIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2l0aG91dCBsaW5lIHRlcm1pbmF0b3JzKSB0byBpdC4KICAgICIiIgogICAgY29udGVudHMgPSAiXG4iLmpvaW4oY29udGVudHMpCgogICAgIyBhc3N1bWluZyB0aGUgY29udGVudHMgaGFzIGJlZW4gdmV0dGVkIGZvciB1dGYtOCBlbmNvZGluZwogICAgY29udGVudHMgPSBjb250ZW50cy5lbmNvZGUoInV0Zi04IikKCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGY6ICAjIGFsd2F5cyB3cml0ZSBQT1NJWC1zdHlsZSBtYW5pZmVzdAogICAgICAgIGYud3JpdGUoY29udGVudHMpCgoKZGVmIHdyaXRlX3BrZ19pbmZvKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiwgZmlsZW5hbWUpCiAgICBpZiBub3QgY21kLmRyeV9ydW46CiAgICAgICAgbWV0YWRhdGEgPSBjbWQuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCiAgICAgICAgbWV0YWRhdGEudmVyc2lvbiwgb2xkdmVyID0gY21kLmVnZ192ZXJzaW9uLCBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgbWV0YWRhdGEubmFtZSwgb2xkbmFtZSA9IGNtZC5lZ2dfbmFtZSwgbWV0YWRhdGEubmFtZQogICAgICAgIG1ldGFkYXRhLmxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlID0gZ2V0YXR0cigKICAgICAgICAgICAgY21kLmRpc3RyaWJ1dGlvbiwKICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJwogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgd3JpdGUgdW5lc2NhcGVkIGRhdGEgdG8gUEtHLUlORk8sIHNvIG9sZGVyIHBrZ19yZXNvdXJjZXMKICAgICAgICAgICAgIyBjYW4gc3RpbGwgcGFyc2UgaXQKICAgICAgICAgICAgbWV0YWRhdGEud3JpdGVfcGtnX2luZm8oY21kLmVnZ19pbmZvKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24gPSBvbGRuYW1lLCBvbGR2ZXIKCiAgICAgICAgc2FmZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKCiAgICAgICAgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKGNtZC5lZ2dfaW5mbywgc2FmZSkKCgpkZWYgd2Fybl9kZXBlbmRzX29ic29sZXRlKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgaXMgbm90IHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCiAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgogICAgICAgICkKCgpkZWYgX3dyaXRlX3JlcXVpcmVtZW50cyhzdHJlYW0sIHJlcXMpOgogICAgbGluZXMgPSB5aWVsZF9saW5lcyhyZXFzIG9yICgpKQogICAgYXBwZW5kX2NyID0gbGFtYmRhIGxpbmU6IGxpbmUgKyAnXG4nCiAgICBsaW5lcyA9IG1hcChhcHBlbmRfY3IsIGxpbmVzKQogICAgc3RyZWFtLndyaXRlbGluZXMobGluZXMpCgoKZGVmIHdyaXRlX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkaXN0ID0gY21kLmRpc3RyaWJ1dGlvbgogICAgZGF0YSA9IHNpeC5TdHJpbmdJTygpCiAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGRpc3QuaW5zdGFsbF9yZXF1aXJlcykKICAgIGV4dHJhc19yZXF1aXJlID0gZGlzdC5leHRyYXNfcmVxdWlyZSBvciB7fQogICAgZm9yIGV4dHJhIGluIHNvcnRlZChleHRyYXNfcmVxdWlyZSk6CiAgICAgICAgZGF0YS53cml0ZSgnXG5be2V4dHJhfV1cbicuZm9ybWF0KCoqdmFycygpKSkKICAgICAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGV4dHJhc19yZXF1aXJlW2V4dHJhXSkKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgicmVxdWlyZW1lbnRzIiwgZmlsZW5hbWUsIGRhdGEuZ2V0dmFsdWUoKSkKCgpkZWYgd3JpdGVfc2V0dXBfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGRhdGEgPSBpby5TdHJpbmdJTygpCiAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGNtZC5kaXN0cmlidXRpb24uc2V0dXBfcmVxdWlyZXMpCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInNldHVwLXJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3RvcGxldmVsX25hbWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIHBrZ3MgPSBkaWN0LmZyb21rZXlzKAogICAgICAgIFsKICAgICAgICAgICAgay5zcGxpdCgnLicsIDEpWzBdCiAgICAgICAgICAgIGZvciBrIGluIGNtZC5kaXN0cmlidXRpb24uaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKQogICAgICAgIF0KICAgICkKICAgIGNtZC53cml0ZV9maWxlKCJ0b3AtbGV2ZWwgbmFtZXMiLCBmaWxlbmFtZSwgJ1xuJy5qb2luKHNvcnRlZChwa2dzKSkgKyAnXG4nKQoKCmRlZiBvdmVyd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgVHJ1ZSkKCgpkZWYgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBmb3JjZT1GYWxzZSk6CiAgICBhcmduYW1lID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KICAgIHZhbHVlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCBhcmduYW1lLCBOb25lKQogICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgdmFsdWUgPSAnXG4nLmpvaW4odmFsdWUpICsgJ1xuJwogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKGFyZ25hbWUsIGZpbGVuYW1lLCB2YWx1ZSwgZm9yY2UpCgoKZGVmIHdyaXRlX2VudHJpZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZXAgPSBjbWQuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cwoKICAgIGlmIGlzaW5zdGFuY2UoZXAsIHNpeC5zdHJpbmdfdHlwZXMpIG9yIGVwIGlzIE5vbmU6CiAgICAgICAgZGF0YSA9IGVwCiAgICBlbGlmIGVwIGlzIG5vdCBOb25lOgogICAgICAgIGRhdGEgPSBbXQogICAgICAgIGZvciBzZWN0aW9uLCBjb250ZW50cyBpbiBzb3J0ZWQoZXAuaXRlbXMoKSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbnRlbnRzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gRW50cnlQb2ludC5wYXJzZV9ncm91cChzZWN0aW9uLCBjb250ZW50cykKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gJ1xuJy5qb2luKHNvcnRlZChtYXAoc3RyLCBjb250ZW50cy52YWx1ZXMoKSkpKQogICAgICAgICAgICBkYXRhLmFwcGVuZCgnWyVzXVxuJXNcblxuJyAlIChzZWN0aW9uLCBjb250ZW50cykpCiAgICAgICAgZGF0YSA9ICcnLmpvaW4oZGF0YSkKCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoJ2VudHJ5IHBvaW50cycsIGZpbGVuYW1lLCBkYXRhLCBUcnVlKQoKCmRlZiBnZXRfcGtnX2luZm9fcmV2aXNpb24oKToKICAgICIiIgogICAgR2V0IGEgLXIjIyMgb2ZmIG9mIFBLRy1JTkZPIFZlcnNpb24gaW4gY2FzZSB0aGlzIGlzIGFuIHNkaXN0IG9mCiAgICBhIHN1YnZlcnNpb24gcmV2aXNpb24uCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oImdldF9wa2dfaW5mb19yZXZpc2lvbiBpcyBkZXByZWNhdGVkLiIsIERlcHJlY2F0aW9uV2FybmluZykKICAgIGlmIG9zLnBhdGguZXhpc3RzKCdQS0ctSU5GTycpOgogICAgICAgIHdpdGggaW8ub3BlbignUEtHLUlORk8nKSBhcyBmOgogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIlZlcnNpb246LiotcihcZCspXHMqJCIsIGxpbmUpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKDEpKQogICAgcmV0dXJuIDAKUEsDBBQAAAAAAAAAIQCN27U/SxIAAEsSAAA1AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHlmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yCmltcG9ydCBpbnNwZWN0CmltcG9ydCBnbG9iCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgYXMgb3JpZwoKaW1wb3J0IHNldHVwdG9vbHMKCiMgUHJpb3IgdG8gbnVtcHkgMS45LCBOdW1QeSByZWxpZXMgb24gdGhlICdfaW5zdGFsbCcgbmFtZSwgc28gcHJvdmlkZSBpdCBmb3IKIyBub3cuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xOTkvCl9pbnN0YWxsID0gb3JpZy5pbnN0YWxsCgoKY2xhc3MgaW5zdGFsbChvcmlnLmluc3RhbGwpOgogICAgIiIiVXNlIGVhc3lfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLCB3L2RlcGVuZGVuY2llcyIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IG9yaWcuaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCdvbGQtYW5kLXVubWFuYWdlYWJsZScsIE5vbmUsICJUcnkgbm90IHRvIHVzZSB0aGlzISIpLAogICAgICAgICgnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywgTm9uZSwKICAgICAgICAgInVzZWQgYnkgc3lzdGVtIHBhY2thZ2UgYnVpbGRlcnMgdG8gY3JlYXRlICdmbGF0JyBlZ2dzIiksCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSBvcmlnLmluc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWwogICAgICAgICdvbGQtYW5kLXVubWFuYWdlYWJsZScsICdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLAogICAgXQogICAgbmV3X2NvbW1hbmRzID0gWwogICAgICAgICgnaW5zdGFsbF9lZ2dfaW5mbycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKICAgICAgICAoJ2luc3RhbGxfc2NyaXB0cycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKICAgIF0KICAgIF9uYyA9IGRpY3QobmV3X2NvbW1hbmRzKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYub2xkX2FuZF91bm1hbmFnZWFibGUgPSBOb25lCiAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnJvb3Q6CiAgICAgICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gVHJ1ZQogICAgICAgIGVsaWYgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJvb3QgYW5kIG5vdCBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IC0tcmVjb3JkIG9yIC0tcm9vdCB3aGVuIGJ1aWxkaW5nIHN5c3RlbSIKICAgICAgICAgICAgICAgICAgICAiIHBhY2thZ2VzIgogICAgICAgICAgICAgICAgKQoKICAgIGRlZiBoYW5kbGVfZXh0cmFfcGF0aChzZWxmKToKICAgICAgICBpZiBzZWxmLnJvb3Qgb3Igc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgICMgZXhwbGljaXQgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlLCBhbGxvdyBleHRyYV9wYXRoIHRvIHdvcmsKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbC5oYW5kbGVfZXh0cmFfcGF0aChzZWxmKQoKICAgICAgICAjIElnbm9yZSBleHRyYV9wYXRoIHdoZW4gaW5zdGFsbGluZyBhbiBlZ2cgKG9yIGJlaW5nIHJ1biBieSBhbm90aGVyCiAgICAgICAgIyBjb21tYW5kIHdpdGhvdXQgLS1yb290IG9yIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkCiAgICAgICAgc2VsZi5wYXRoX2ZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYV9kaXJzID0gJycKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgRXhwbGljaXQgcmVxdWVzdCBmb3Igb2xkLXN0eWxlIGluc3RhbGw/ICBKdXN0IGRvIGl0CiAgICAgICAgaWYgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbC5ydW4oc2VsZikKCiAgICAgICAgaWYgbm90IHNlbGYuX2NhbGxlZF9mcm9tX3NldHVwKGluc3BlY3QuY3VycmVudGZyYW1lKCkpOgogICAgICAgICAgICAjIFJ1biBpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUgdG8gc3VwcG9ydCBiZGlzdF8qIGNvbW1hbmRzLgogICAgICAgICAgICBvcmlnLmluc3RhbGwucnVuKHNlbGYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kb19lZ2dfaW5zdGFsbCgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jYWxsZWRfZnJvbV9zZXR1cChydW5fZnJhbWUpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gZGV0ZWN0IHdoZXRoZXIgcnVuKCkgd2FzIGNhbGxlZCBmcm9tIHNldHVwKCkgb3IgYnkgYW5vdGhlcgogICAgICAgIGNvbW1hbmQuICBJZiBjYWxsZWQgYnkgc2V0dXAoKSwgdGhlIHBhcmVudCBjYWxsZXIgd2lsbCBiZSB0aGUKICAgICAgICAncnVuX2NvbW1hbmQnIG1ldGhvZCBpbiAnZGlzdHV0aWxzLmRpc3QnLCBhbmQgKml0cyogY2FsbGVyIHdpbGwgYmUKICAgICAgICB0aGUgJ3J1bl9jb21tYW5kcycgbWV0aG9kLiAgSWYgY2FsbGVkIGFueSBvdGhlciB3YXksIHRoZQogICAgICAgIGltbWVkaWF0ZSBjYWxsZXIgKm1pZ2h0KiBiZSAncnVuX2NvbW1hbmQnLCBidXQgaXQgd29uJ3QgaGF2ZSBiZWVuCiAgICAgICAgY2FsbGVkIGJ5ICdydW5fY29tbWFuZHMnLiBSZXR1cm4gVHJ1ZSBpbiB0aGF0IGNhc2Ugb3IgaWYgYSBjYWxsIHN0YWNrCiAgICAgICAgaXMgdW5hdmFpbGFibGUuIFJldHVybiBGYWxzZSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgcnVuX2ZyYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIG1zZyA9ICJDYWxsIHN0YWNrIG5vdCBhdmFpbGFibGUuIGJkaXN0XyogY29tbWFuZHMgbWF5IGZhaWwuIgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKICAgICAgICAgICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gJ0lyb25QeXRob24nOgogICAgICAgICAgICAgICAgbXNnID0gIkZvciBiZXN0IHJlc3VsdHMsIHBhc3MgLVg6RnJhbWVzIHRvIGVuYWJsZSBjYWxsIHN0YWNrLiIKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJlcyA9IGluc3BlY3QuZ2V0b3V0ZXJmcmFtZXMocnVuX2ZyYW1lKVsyXQogICAgICAgIGNhbGxlciwgPSByZXNbOjFdCiAgICAgICAgaW5mbyA9IGluc3BlY3QuZ2V0ZnJhbWVpbmZvKGNhbGxlcikKICAgICAgICBjYWxsZXJfbW9kdWxlID0gY2FsbGVyLmZfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJywgJycpCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgY2FsbGVyX21vZHVsZSA9PSAnZGlzdHV0aWxzLmRpc3QnCiAgICAgICAgICAgIGFuZCBpbmZvLmZ1bmN0aW9uID09ICdydW5fY29tbWFuZHMnCiAgICAgICAgKQoKICAgIGRlZiBkb19lZ2dfaW5zdGFsbChzZWxmKToKCiAgICAgICAgZWFzeV9pbnN0YWxsID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3MoJ2Vhc3lfaW5zdGFsbCcpCgogICAgICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24sIGFyZ3M9IngiLCByb290PXNlbGYucm9vdCwgcmVjb3JkPXNlbGYucmVjb3JkLAogICAgICAgICkKICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpICAjIGZpbmFsaXplIGJlZm9yZSBiZGlzdF9lZ2cgbXVuZ2VzIGluc3RhbGwgY21kCiAgICAgICAgY21kLmFsd2F5c19jb3B5X2Zyb20gPSAnLicgICMgbWFrZSBzdXJlIGxvY2FsLWRpciBlZ2dzIGdldCBpbnN0YWxsZWQKCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIGNtZC5wYWNrYWdlX2luZGV4LnNjYW4oZ2xvYi5nbG9iKCcqLmVnZycpKQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdiZGlzdF9lZ2cnKQogICAgICAgIGFyZ3MgPSBbc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCdiZGlzdF9lZ2cnKS5lZ2dfb3V0cHV0XQoKICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CiAgICAgICAgICAgICMgQm9vdHN0cmFwIHNlbGYtaW5zdGFsbGF0aW9uIG9mIHNldHVwdG9vbHMKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tKQoKICAgICAgICBjbWQuYXJncyA9IGFyZ3MKICAgICAgICBjbWQucnVuKCkKICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgoKIyBYWFggUHl0aG9uIDMuMSBkb2Vzbid0IHNlZSBfbmMgaWYgdGhpcyBpcyBpbnNpZGUgdGhlIGNsYXNzCmluc3RhbGwuc3ViX2NvbW1hbmRzID0gKAogICAgW2NtZCBmb3IgY21kIGluIG9yaWcuaW5zdGFsbC5zdWJfY29tbWFuZHMgaWYgY21kWzBdIG5vdCBpbiBpbnN0YWxsLl9uY10gKwogICAgaW5zdGFsbC5uZXdfY29tbWFuZHMKKQpQSwMEFAAAAAAAAAAhAFzSqOWbCAAAmwgAAD4AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmltcG9ydCBvcwoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scyBpbXBvcnQgbmFtZXNwYWNlcwpmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmNsYXNzIGluc3RhbGxfZWdnX2luZm8obmFtZXNwYWNlcy5JbnN0YWxsZXIsIENvbW1hbmQpOgogICAgIiIiSW5zdGFsbCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbgogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnLWluZm8nCiAgICAgICAgc2VsZi5zb3VyY2UgPSBlaV9jbWQuZWdnX2luZm8KICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShzZWxmLnRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcmdldCk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssIChzZWxmLnRhcmdldCwpLCAiUmVtb3ZpbmcgIiArIHNlbGYudGFyZ2V0KQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuZW5zdXJlX2RpcmVjdG9yeShzZWxmLnRhcmdldCkKICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgIHNlbGYuY29weXRyZWUsICgpLCAiQ29weWluZyAlcyB0byAlcyIgJSAoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0KQogICAgICAgICkKICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKCiAgICBkZWYgY29weXRyZWUoc2VsZik6CiAgICAgICAgIyBDb3B5IHRoZSAuZWdnLWluZm8gdHJlZSB0byBzaXRlLXBhY2thZ2VzCiAgICAgICAgZGVmIHNraW1tZXIoc3JjLCBkc3QpOgogICAgICAgICAgICAjIGZpbHRlciBvdXQgc291cmNlLWNvbnRyb2wgZGlyZWN0b3JpZXM7IG5vdGUgdGhhdCAnc3JjJyBpcyBhbHdheXMKICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKICAgICAgICAgICAgIyBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLgogICAgICAgICAgICBmb3Igc2tpcCBpbiAnLnN2bi8nLCAnQ1ZTLyc6CiAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChza2lwKSBvciAnLycgKyBza2lwIGluIHNyYzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybiBkc3QKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCBza2ltbWVyKQpQSwMEFAAAAAAAAAAhAJCcO1MADwAAAA8AADkAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlpbXBvcnQgb3MKaW1wb3J0IGltcApmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcHJvZHVjdCwgc3Rhcm1hcAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIgYXMgb3JpZwoKCmNsYXNzIGluc3RhbGxfbGliKG9yaWcuaW5zdGFsbF9saWIpOgogICAgIiIiRG9uJ3QgYWRkIGNvbXBpbGVkIGZsYWdzIHRvIGZpbGVuYW1lcyBvZiBub24tUHl0aG9uIGZpbGVzIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmJ1aWxkKCkKICAgICAgICBvdXRmaWxlcyA9IHNlbGYuaW5zdGFsbCgpCiAgICAgICAgaWYgb3V0ZmlsZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgYWx3YXlzIGNvbXBpbGUsIGluIGNhc2Ugd2UgaGF2ZSBhbnkgZXh0ZW5zaW9uIHN0dWJzIHRvIGRlYWwgd2l0aAogICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvdXRmaWxlcykKCiAgICBkZWYgZ2V0X2V4Y2x1c2lvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY29sbGVjdGlvbnMuU2l6ZWQgY29sbGVjdGlvbnMuQ29udGFpbmVyIG9mIHBhdGhzIHRvIGJlCiAgICAgICAgZXhjbHVkZWQgZm9yIHNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCBpbnN0YWxsYXRpb25zLgogICAgICAgICIiIgogICAgICAgIGFsbF9wYWNrYWdlcyA9ICgKICAgICAgICAgICAgcGtnCiAgICAgICAgICAgIGZvciBuc19wa2cgaW4gc2VsZi5fZ2V0X1NWRU1fTlNQcygpCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fYWxsX3BhY2thZ2VzKG5zX3BrZykKICAgICAgICApCgogICAgICAgIGV4Y2xfc3BlY3MgPSBwcm9kdWN0KGFsbF9wYWNrYWdlcywgc2VsZi5fZ2VuX2V4Y2x1c2lvbl9wYXRocygpKQogICAgICAgIHJldHVybiBzZXQoc3Rhcm1hcChzZWxmLl9leGNsdWRlX3BrZ19wYXRoLCBleGNsX3NwZWNzKSkKCiAgICBkZWYgX2V4Y2x1ZGVfcGtnX3BhdGgoc2VsZiwgcGtnLCBleGNsdXNpb25fcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBwYWNrYWdlIG5hbWUgYW5kIGV4Y2x1c2lvbiBwYXRoIHdpdGhpbiB0aGF0IHBhY2thZ2UsCiAgICAgICAgY29tcHV0ZSB0aGUgZnVsbCBleGNsdXNpb24gcGF0aC4KICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpICsgW2V4Y2x1c2lvbl9wYXRoXQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgKnBhcnRzKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYWxsX3BhY2thZ2VzKHBrZ19uYW1lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbGlzdChpbnN0YWxsX2xpYi5fYWxsX3BhY2thZ2VzKCdmb28uYmFyLmJheicpKQogICAgICAgIFsnZm9vLmJhci5iYXonLCAnZm9vLmJhcicsICdmb28nXQogICAgICAgICIiIgogICAgICAgIHdoaWxlIHBrZ19uYW1lOgogICAgICAgICAgICB5aWVsZCBwa2dfbmFtZQogICAgICAgICAgICBwa2dfbmFtZSwgc2VwLCBjaGlsZCA9IHBrZ19uYW1lLnJwYXJ0aXRpb24oJy4nKQoKICAgIGRlZiBfZ2V0X1NWRU1fTlNQcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgbmFtZXNwYWNlIHBhY2thZ2VzIChsaXN0KSBidXQgb25seSBmb3IKICAgICAgICBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucyBhbmQgZW1wdHkgb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgICMgVE9ETzogaXMgaXQgbmVjZXNzYXJ5IHRvIHNob3J0LWNpcmN1aXQgaGVyZT8gaS5lLiB3aGF0J3MgdGhlIGNvc3QKICAgICAgICAjIGlmIGdldF9maW5hbGl6ZWRfY29tbWFuZCBpcyBjYWxsZWQgZXZlbiB3aGVuIG5hbWVzcGFjZV9wYWNrYWdlcyBpcwogICAgICAgICMgRmFsc2U/CiAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGluc3RhbGxfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQogICAgICAgIHN2ZW0gPSBpbnN0YWxsX2NtZC5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcyBpZiBzdmVtIGVsc2UgW10KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dlbl9leGNsdXNpb25fcGF0aHMoKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBmaWxlIHBhdGhzIHRvIGJlIGV4Y2x1ZGVkIGZvciBuYW1lc3BhY2UgcGFja2FnZXMgKGJ5dGVjb2RlCiAgICAgICAgY2FjaGUgZmlsZXMpLgogICAgICAgICIiIgogICAgICAgICMgYWx3YXlzIGV4Y2x1ZGUgdGhlIHBhY2thZ2UgbW9kdWxlIGl0c2VsZgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weScKCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5YycKICAgICAgICB5aWVsZCAnX19pbml0X18ucHlvJwoKICAgICAgICBpZiBub3QgaGFzYXR0cihpbXAsICdnZXRfdGFnJyk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKCdfX3B5Y2FjaGVfXycsICdfX2luaXRfXy4nICsgaW1wLmdldF90YWcoKSkKICAgICAgICB5aWVsZCBiYXNlICsgJy5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcucHlvJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLm9wdC0xLnB5YycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMi5weWMnCgogICAgZGVmIGNvcHlfdHJlZSgKICAgICAgICAgICAgc2VsZiwgaW5maWxlLCBvdXRmaWxlLAogICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsIHByZXNlcnZlX3N5bWxpbmtzPTAsIGxldmVsPTEKICAgICk6CiAgICAgICAgYXNzZXJ0IHByZXNlcnZlX21vZGUgYW5kIHByZXNlcnZlX3RpbWVzIGFuZCBub3QgcHJlc2VydmVfc3ltbGlua3MKICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCgogICAgICAgIGlmIG5vdCBleGNsdWRlOgogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsX2xpYi5jb3B5X3RyZWUoc2VsZiwgaW5maWxlLCBvdXRmaWxlKQoKICAgICAgICAjIEV4Y2x1ZGUgbmFtZXNwYWNlIHBhY2thZ2UgX19pbml0X18ucHkqIGZpbGVzIGZyb20gdGhlIG91dHB1dAoKICAgICAgICBmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfZGlyZWN0b3J5CiAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKICAgICAgICBvdXRmaWxlcyA9IFtdCgogICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CiAgICAgICAgICAgIGlmIGRzdCBpbiBleGNsdWRlOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiAlcyAobmFtZXNwYWNlIHBhY2thZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgbG9nLmluZm8oImNvcHlpbmcgJXMgLT4gJXMiLCBzcmMsIG9zLnBhdGguZGlybmFtZShkc3QpKQogICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQoZHN0KQogICAgICAgICAgICByZXR1cm4gZHN0CgogICAgICAgIHVucGFja19kaXJlY3RvcnkoaW5maWxlLCBvdXRmaWxlLCBwZikKICAgICAgICByZXR1cm4gb3V0ZmlsZXMKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgb3V0cHV0cyA9IG9yaWcuaW5zdGFsbF9saWIuZ2V0X291dHB1dHMoc2VsZikKICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCiAgICAgICAgaWYgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIFtmIGZvciBmIGluIG91dHB1dHMgaWYgZiBub3QgaW4gZXhjbHVkZV0KICAgICAgICByZXR1cm4gb3V0cHV0cwpQSwMEFAAAAAAAAAAhAEY/8R6HCQAAhwkAAD0AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzIGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIGVuc3VyZV9kaXJlY3RvcnkKCgpjbGFzcyBpbnN0YWxsX3NjcmlwdHMob3JpZy5pbnN0YWxsX3NjcmlwdHMpOgogICAgIiIiRG8gbm9ybWFsIHNjcmlwdCBpbnN0YWxsLCBwbHVzIGFueSBlZ2dfaW5mbyB3cmFwcGVyIHNjcmlwdHMiIiIKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbF9zY3JpcHRzLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYubm9fZXAgPSBGYWxzZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaW1wb3J0IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgYXMgZWkKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgIG9yaWcuaW5zdGFsbF9zY3JpcHRzLnJ1bihzZWxmKSAgIyBydW4gZmlyc3QgdG8gc2V0IHVwIHNlbGYub3V0ZmlsZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KICAgICAgICBpZiBzZWxmLm5vX2VwOgogICAgICAgICAgICAjIGRvbid0IGluc3RhbGwgZW50cnkgcG9pbnQgc2NyaXB0cyBpbnRvIC5lZ2cgZmlsZSEKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgZWlfY21kLmVnZ19iYXNlLCBQYXRoTWV0YWRhdGEoZWlfY21kLmVnZ19iYXNlLCBlaV9jbWQuZWdnX2luZm8pLAogICAgICAgICAgICBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKICAgICAgICApCiAgICAgICAgYnNfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgIGV4ZWNfcGFyYW0gPSBnZXRhdHRyKGJzX2NtZCwgJ2V4ZWN1dGFibGUnLCBOb25lKQogICAgICAgIGJ3X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJiZGlzdF93aW5pbnN0IikKICAgICAgICBpc193aW5pbnN0ID0gZ2V0YXR0cihid19jbWQsICdfaXNfcnVubmluZycsIEZhbHNlKQogICAgICAgIHdyaXRlciA9IGVpLlNjcmlwdFdyaXRlcgogICAgICAgIGlmIGlzX3dpbmluc3Q6CiAgICAgICAgICAgIGV4ZWNfcGFyYW0gPSAicHl0aG9uLmV4ZSIKICAgICAgICAgICAgd3JpdGVyID0gZWkuV2luZG93c1NjcmlwdFdyaXRlcgogICAgICAgIGlmIGV4ZWNfcGFyYW0gPT0gc3lzLmV4ZWN1dGFibGU6CiAgICAgICAgICAgICMgSW4gY2FzZSB0aGUgcGF0aCB0byB0aGUgUHl0aG9uIGV4ZWN1dGFibGUgY29udGFpbnMgYSBzcGFjZSwgd3JhcAogICAgICAgICAgICAjIGl0IHNvIGl0J3Mgbm90IHNwbGl0IHVwLgogICAgICAgICAgICBleGVjX3BhcmFtID0gW2V4ZWNfcGFyYW1dCiAgICAgICAgIyByZXNvbHZlIHRoZSB3cml0ZXIgdG8gdGhlIGVudmlyb25tZW50CiAgICAgICAgd3JpdGVyID0gd3JpdGVyLmJlc3QoKQogICAgICAgIGNtZCA9IHdyaXRlci5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY19wYXJhbSkKICAgICAgICBmb3IgYXJncyBpbiB3cml0ZXIuZ2V0X2FyZ3MoZGlzdCwgY21kLmFzX2hlYWRlcigpKToKICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCgogICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCAqaWdub3JlZCk6CiAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgogICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgY2htb2QsIGN1cnJlbnRfdW1hc2sKCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMgc2NyaXB0IHRvICVzIiwgc2NyaXB0X25hbWUsIHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHNjcmlwdF9uYW1lKQogICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKHRhcmdldCkKCiAgICAgICAgbWFzayA9IGN1cnJlbnRfdW1hc2soKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICJ3IiArIG1vZGUpCiAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBjaG1vZCh0YXJnZXQsIDBvNzc3IC0gbWFzaykKUEsDBBQAAAAAAAAAIQB9c2C/ehMAAHoTAAA4AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHlpbXBvcnQgb3MKZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCBzZGlzdAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcgoKCmNsYXNzIHNkaXN0X2FkZF9kZWZhdWx0czoKICAgICIiIgogICAgTWl4LWluIHByb3ZpZGluZyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIGZ1bmN0aW9uYWxpdHkgYXMgZm91bmQgaW4KICAgIGRpc3R1dGlscyBvbiBQeXRob24gMy43LgoKICAgIERvIG5vdCBlZGl0IHRoZSBjb2RlIGluIHRoaXMgY2xhc3MgZXhjZXB0IHRvIHVwZGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBhcyBpbXBsZW1lbnRlZCBpbiBkaXN0dXRpbHMuIEluc3RlYWQsIG92ZXJyaWRlIGluIHRoZSBzdWJjbGFzcy4KICAgICIiIgoKICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgIiIiQWRkIGFsbCB0aGUgZGVmYXVsdCBmaWxlcyB0byBzZWxmLmZpbGVsaXN0OgogICAgICAgICAgLSBSRUFETUUgb3IgUkVBRE1FLnR4dAogICAgICAgICAgLSBzZXR1cC5weQogICAgICAgICAgLSB0ZXN0L3Rlc3QqLnB5CiAgICAgICAgICAtIGFsbCBwdXJlIFB5dGhvbiBtb2R1bGVzIG1lbnRpb25lZCBpbiBzZXR1cCBzY3JpcHQKICAgICAgICAgIC0gYWxsIGZpbGVzIHBvaW50ZWQgYnkgcGFja2FnZV9kYXRhIChidWlsZF9weSkKICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgaW4gZGF0YV9maWxlcy4KICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgYXMgc2NyaXB0cy4KICAgICAgICAgIC0gYWxsIEMgc291cmNlcyBsaXN0ZWQgYXMgcGFydCBvZiBleHRlbnNpb25zIG9yIEMgbGlicmFyaWVzCiAgICAgICAgICAgIGluIHRoZSBzZXR1cCBzY3JpcHQgKGRvZXNuJ3QgY2F0Y2ggQyBoZWFkZXJzISkKICAgICAgICBXYXJucyBpZiAoUkVBRE1FIG9yIFJFQURNRS50eHQpIG9yIHNldHVwLnB5IGFyZSBtaXNzaW5nOyBldmVyeXRoaW5nCiAgICAgICAgZWxzZSBpcyBvcHRpb25hbC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc3RhbmRhcmRzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19weXRob24oKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZXh0KCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfY19saWJzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc2NyaXB0cygpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jc19wYXRoX2V4aXN0cyhmc3BhdGgpOgogICAgICAgICIiIgogICAgICAgIENhc2Utc2Vuc2l0aXZlIHBhdGggZXhpc3RlbmNlIGNoZWNrCgogICAgICAgID4+PiBzZGlzdF9hZGRfZGVmYXVsdHMuX2NzX3BhdGhfZXhpc3RzKF9fZmlsZV9fKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXy51cHBlcigpKQogICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZzcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgbWFrZSBhYnNvbHV0ZSBzbyB3ZSBhbHdheXMgaGF2ZSBhIGRpcmVjdG9yeQogICAgICAgIGFic3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZnNwYXRoKQogICAgICAgIGRpcmVjdG9yeSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGFic3BhdGgpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcyhzZWxmKToKICAgICAgICBzdGFuZGFyZHMgPSBbc2VsZi5SRUFETUVTLCBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZV0KICAgICAgICBmb3IgZm4gaW4gc3RhbmRhcmRzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZuLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBhbHRzID0gZm4KICAgICAgICAgICAgICAgIGdvdF9pdCA9IEZhbHNlCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gYWx0czoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9pdCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgaWYgbm90IGdvdF9pdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInN0YW5kYXJkIGZpbGUgbm90IGZvdW5kOiBzaG91bGQgaGF2ZSBvbmUgb2YgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihhbHRzKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NzX3BhdGhfZXhpc3RzKGZuKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlICclcycgbm90IGZvdW5kIiAlIGZuKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX29wdGlvbmFsKHNlbGYpOgogICAgICAgIG9wdGlvbmFsID0gWyd0ZXN0L3Rlc3QqLnB5JywgJ3NldHVwLmNmZyddCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gb3B0aW9uYWw6CiAgICAgICAgICAgIGZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9iKHBhdHRlcm4pKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChmaWxlcykKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIyBidWlsZF9weSBpcyB1c2VkIHRvIGdldDoKICAgICAgICAjICAtIHB5dGhvbiBtb2R1bGVzCiAgICAgICAgIyAgLSBmaWxlcyBkZWZpbmVkIGluIHBhY2thZ2VfZGF0YQogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKCiAgICAgICAgIyBnZXR0aW5nIHB5dGhvbiBmaWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgICAgICAjIGdldHRpbmcgcGFja2FnZV9kYXRhIGZpbGVzCiAgICAgICAgIyAoY29tcHV0ZWQgaW4gYnVpbGRfcHkuZGF0YV9maWxlcyBieSBidWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKQogICAgICAgIGZvciBwa2csIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgIyBnZXR0aW5nIGRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2RhdGFfZmlsZXMoKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgc3RyKToKICAgICAgICAgICAgICAgICAgICAjIHBsYWluIGZpbGUKICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29udmVydF9wYXRoKGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgYSAoZGlybmFtZSwgZmlsZW5hbWVzKSB0dXBsZQogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lcyA9IGl0ZW0KICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjb252ZXJ0X3BhdGgoZikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2V4dChzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfZXh0ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2V4dC5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfY19saWJzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpOgogICAgICAgICAgICBidWlsZF9jbGliID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9jbGliLmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zY3JpcHRzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCk6CiAgICAgICAgICAgIGJ1aWxkX3NjcmlwdHMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3NjcmlwdHMuZ2V0X3NvdXJjZV9maWxlcygpKQoKCmlmIGhhc2F0dHIoc2Rpc3Quc2Rpc3QsICdfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcycpOgogICAgIyBkaXNhYmxlIHRoZSBmdW5jdGlvbmFsaXR5IGFscmVhZHkgYXZhaWxhYmxlIHVwc3RyZWFtCiAgICBjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAM3/rZAOAQAADgEAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQucmVnaXN0ZXIgYXMgb3JpZwoKCmNsYXNzIHJlZ2lzdGVyKG9yaWcucmVnaXN0ZXIpOgogICAgX19kb2NfXyA9IG9yaWcucmVnaXN0ZXIuX19kb2NfXwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgdmFsaWQgY3VycmVudCBuYW1lL3ZlcnNpb24gaW5mbwogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBvcmlnLnJlZ2lzdGVyLnJ1bihzZWxmKQpQSwMEFAAAAAAAAAAhABnK1KR0CAAAdAgAADQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCgpjbGFzcyByb3RhdGUoQ29tbWFuZCk6CiAgICAiIiJEZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucyIiIgoKICAgIGRlc2NyaXB0aW9uID0gImRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zLCBrZWVwaW5nIE4gbmV3ZXN0IGZpbGVzIgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnbWF0Y2g9JywgJ20nLCAicGF0dGVybnMgdG8gbWF0Y2ggKHJlcXVpcmVkKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHdoZXJlIHRoZSBkaXN0cmlidXRpb25zIGFyZSIpLAogICAgICAgICgna2VlcD0nLCAnaycsICJudW1iZXIgb2YgbWF0Y2hpbmcgZGlzdHJpYnV0aW9ucyB0byBrZWVwIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gW10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYubWF0Y2ggPSBOb25lCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLmtlZXAgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5tYXRjaCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25lIG9yIG1vcmUgKGNvbW1hLXNlcGFyYXRlZCkgbWF0Y2ggcGF0dGVybnMgIgogICAgICAgICAgICAgICAgIihlLmcuICcuemlwJyBvciAnLmVnZycpIgogICAgICAgICAgICApCiAgICAgICAgaWYgc2VsZi5rZWVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAiKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5rZWVwID0gaW50KHNlbGYua2VlcCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0ta2VlcCBtdXN0IGJlIGFuIGludGVnZXIiKQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tYXRjaCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHNlbGYubWF0Y2ggPSBbCiAgICAgICAgICAgICAgICBjb252ZXJ0X3BhdGgocC5zdHJpcCgpKSBmb3IgcCBpbiBzZWxmLm1hdGNoLnNwbGl0KCcsJykKICAgICAgICAgICAgXQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5tYXRjaDoKICAgICAgICAgICAgcGF0dGVybiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkgKyAnKicgKyBwYXR0ZXJuCiAgICAgICAgICAgIGZpbGVzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgcGF0dGVybikpCiAgICAgICAgICAgIGZpbGVzID0gWyhvcy5wYXRoLmdldG10aW1lKGYpLCBmKSBmb3IgZiBpbiBmaWxlc10KICAgICAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgICAgIGZpbGVzLnJldmVyc2UoKQoKICAgICAgICAgICAgbG9nLmluZm8oIiVkIGZpbGUocykgbWF0Y2hpbmcgJXMiLCBsZW4oZmlsZXMpLCBwYXR0ZXJuKQogICAgICAgICAgICBmaWxlcyA9IGZpbGVzW3NlbGYua2VlcDpdCiAgICAgICAgICAgIGZvciAodCwgZikgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGYpOgogICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGYpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGYpClBLAwQUAAAAAAAAACEABIHWNJICAACSAgAANgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weWZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlCgoKY2xhc3Mgc2F2ZW9wdHMob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzYXZlIHN1cHBsaWVkIG9wdGlvbnMgdG8gc2V0dXAuY2ZnIG9yIG90aGVyIGNvbmZpZyBmaWxlIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uCiAgICAgICAgc2V0dGluZ3MgPSB7fQoKICAgICAgICBmb3IgY21kIGluIGRpc3QuY29tbWFuZF9vcHRpb25zOgoKICAgICAgICAgICAgaWYgY21kID09ICdzYXZlb3B0cyc6CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBkb24ndCBzYXZlIG91ciBvd24gb3B0aW9ucyEKCiAgICAgICAgICAgIGZvciBvcHQsIChzcmMsIHZhbCkgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoY21kKS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgc3JjID09ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCBzZXR0aW5ncywgc2VsZi5kcnlfcnVuKQpQSwMEFAAAAAAAAAAhALcf0W43GgAANxoAADMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5zZGlzdCBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBpbwppbXBvcnQgY29udGV4dGxpYgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIC5weTM2Y29tcGF0IGltcG9ydCBzZGlzdF9hZGRfZGVmYXVsdHMKCmltcG9ydCBwa2dfcmVzb3VyY2VzCgpfZGVmYXVsdF9yZXZjdHJsID0gbGlzdAoKCmRlZiB3YWxrX3JldmN0cmwoZGlybmFtZT0nJyk6CiAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciByZXZpc2lvbiBjb250cm9sIiIiCiAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnc2V0dXB0b29scy5maWxlX2ZpbmRlcnMnKToKICAgICAgICBmb3IgaXRlbSBpbiBlcC5sb2FkKCkoZGlybmFtZSk6CiAgICAgICAgICAgIHlpZWxkIGl0ZW0KCgpjbGFzcyBzZGlzdChzZGlzdF9hZGRfZGVmYXVsdHMsIG9yaWcuc2Rpc3QpOgogICAgIiIiU21hcnQgc2Rpc3QgdGhhdCBmaW5kcyBhbnl0aGluZyBzdXBwb3J0ZWQgYnkgcmV2aXNpb24gY29udHJvbCIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2Zvcm1hdHM9JywgTm9uZSwKICAgICAgICAgImZvcm1hdHMgZm9yIHNvdXJjZSBkaXN0cmlidXRpb24gKGNvbW1hLXNlcGFyYXRlZCBsaXN0KSIpLAogICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAia2VlcCB0aGUgZGlzdHJpYnV0aW9uIHRyZWUgYXJvdW5kIGFmdGVyIGNyZWF0aW5nICIgKwogICAgICAgICAiYXJjaGl2ZSBmaWxlKHMpIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGFyY2hpdmUocykgaW4gIgogICAgICAgICAiW2RlZmF1bHQ6IGRpc3RdIiksCiAgICBdCgogICAgbmVnYXRpdmVfb3B0ID0ge30KCiAgICBSRUFETUVfRVhURU5TSU9OUyA9IFsnJywgJy5yc3QnLCAnLnR4dCcsICcubWQnXQogICAgUkVBRE1FUyA9IHR1cGxlKCdSRUFETUV7MH0nLmZvcm1hdChleHQpIGZvciBleHQgaW4gUkVBRE1FX0VYVEVOU0lPTlMpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gZWlfY21kLmZpbGVsaXN0CiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKGVpX2NtZC5lZ2dfaW5mbywgJ1NPVVJDRVMudHh0JykpCiAgICAgICAgc2VsZi5jaGVja19yZWFkbWUoKQoKICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCgogICAgICAgIHNlbGYubWFrZV9kaXN0cmlidXRpb24oKQoKICAgICAgICBkaXN0X2ZpbGVzID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkKICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmFyY2hpdmVfZmlsZXM6CiAgICAgICAgICAgIGRhdGEgPSAoJ3NkaXN0JywgJycsIGZpbGUpCiAgICAgICAgICAgIGlmIGRhdGEgbm90IGluIGRpc3RfZmlsZXM6CiAgICAgICAgICAgICAgICBkaXN0X2ZpbGVzLmFwcGVuZChkYXRhKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5zZGlzdC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKCiAgICAgICAgc2VsZi5fZGVmYXVsdF90b19nenRhcigpCgogICAgZGVmIF9kZWZhdWx0X3RvX2d6dGFyKHNlbGYpOgogICAgICAgICMgb25seSBuZWVkZWQgb24gUHl0aG9uIHByaW9yIHRvIDMuNi4KICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA2LCAwLCAnYmV0YScsIDEpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZvcm1hdHMgPSBbJ2d6dGFyJ10KCiAgICBkZWYgbWFrZV9kaXN0cmlidXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUxNgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5fcmVtb3ZlX29zX2xpbmsoKToKICAgICAgICAgICAgb3JpZy5zZGlzdC5tYWtlX2Rpc3RyaWJ1dGlvbihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgIiIiCiAgICAgICAgSW4gYSBjb250ZXh0LCByZW1vdmUgYW5kIHJlc3RvcmUgb3MubGluayBpZiBpdCBleGlzdHMKICAgICAgICAiIiIKCiAgICAgICAgY2xhc3MgTm9WYWx1ZToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBvcmlnX3ZhbCA9IGdldGF0dHIob3MsICdsaW5rJywgTm9WYWx1ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBvcy5saW5rCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcmlnX3ZhbCBpcyBub3QgTm9WYWx1ZToKICAgICAgICAgICAgICAgIHNldGF0dHIob3MsICdsaW5rJywgb3JpZ192YWwpCgogICAgZGVmIF9fcmVhZF90ZW1wbGF0ZV9oYWNrKHNlbGYpOgogICAgICAgICMgVGhpcyBncm9keSBoYWNrIGNsb3NlcyB0aGUgdGVtcGxhdGUgZmlsZSAoTUFOSUZFU1QuaW4pIGlmIGFuCiAgICAgICAgIyAgZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgcmVhZF90ZW1wbGF0ZS4KICAgICAgICAjIERvaW5nIHNvIHByZXZlbnRzIGFuIGVycm9yIHdoZW4gZWFzeV9pbnN0YWxsIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUKICAgICAgICAjICBmaWxlLgogICAgICAgIHRyeToKICAgICAgICAgICAgb3JpZy5zZGlzdC5yZWFkX3RlbXBsYXRlKHNlbGYpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgXywgXywgdGIgPSBzeXMuZXhjX2luZm8oKQogICAgICAgICAgICB0Yi50Yl9uZXh0LnRiX2ZyYW1lLmZfbG9jYWxzWyd0ZW1wbGF0ZSddLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKCiAgICAjIEJlZ2lubmluZyB3aXRoIFB5dGhvbiAyLjcuMiwgMy4xLjQsIGFuZCAzLjIuMSwgdGhpcyBsZWFreSBmaWxlIGhhbmRsZQogICAgIyAgaGFzIGJlZW4gZml4ZWQsIHNvIG9ubHkgb3ZlcnJpZGUgdGhlIG1ldGhvZCBpZiB3ZSdyZSB1c2luZyBhbiBlYXJsaWVyCiAgICAjICBQeXRob24uCiAgICBoYXNfbGVha3lfaGFuZGxlID0gKAogICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMikKICAgICAgICBvciAoMywgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAxLCA0KQogICAgICAgIG9yICgzLCAyKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpCiAgICApCiAgICBpZiBoYXNfbGVha3lfaGFuZGxlOgogICAgICAgIHJlYWRfdGVtcGxhdGUgPSBfX3JlYWRfdGVtcGxhdGVfaGFjawoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3B5dGhvbihzZWxmKToKICAgICAgICAiIiJnZXR0aW5nIHB5dGhvbiBmaWxlcyIiIgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9weS5nZXRfc291cmNlX2ZpbGVzKCkpCiAgICAgICAgICAgICMgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGluY29tcGF0aWJsZSB3aXRoIGluY2x1ZGVfcGFja2FnZV9kYXRhLCBhbmQKICAgICAgICAgICAgIyB3aWxsIGluIGZhY3QgY3JlYXRlIGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBpbmNsdWRlX3BhY2thZ2VfZGF0YQogICAgICAgICAgICAjIGlzIFRydWUuICBVc2Ugb2YgaW5jbHVkZV9wYWNrYWdlX2RhdGEgd2lsbCBpbXBseSB0aGF0CiAgICAgICAgICAgICMgZGlzdHV0aWxzLXN0eWxlIGF1dG9tYXRpYyBoYW5kbGluZyBvZiBwYWNrYWdlX2RhdGEgaXMgZGlzYWJsZWQKICAgICAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICAgICAgZm9yIF8sIHNyY19kaXIsIF8sIGZpbGVuYW1lcyBpbiBidWlsZF9weS5kYXRhX2ZpbGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKFtvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXNdKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICAgICAgc2Rpc3RfYWRkX2RlZmF1bHRzLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3VwZXIoKS5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIGxvZy53YXJuKCJkYXRhX2ZpbGVzIGNvbnRhaW5zIHVuZXhwZWN0ZWQgb2JqZWN0cyIpCgogICAgZGVmIGNoZWNrX3JlYWRtZShzZWxmKToKICAgICAgICBmb3IgZiBpbiBzZWxmLlJFQURNRVM6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgInN0YW5kYXJkIGZpbGUgbm90IGZvdW5kOiBzaG91bGQgaGF2ZSBvbmUgb2YgIiArCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oc2VsZi5SRUFETUVTKQogICAgICAgICAgICApCgogICAgZGVmIG1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxlcyk6CiAgICAgICAgb3JpZy5zZGlzdC5tYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpCgogICAgICAgICMgU2F2ZSBhbnkgZWdnX2luZm8gY29tbWFuZCBsaW5lIG9wdGlvbnMgdXNlZCB0byBjcmVhdGUgdGhpcyBzZGlzdAogICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsICdzZXR1cC5jZmcnKQogICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJykgYW5kIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICAjIHVubGluayBhbmQgcmUtY29weSwgc2luY2UgaXQgbWlnaHQgYmUgaGFyZC1saW5rZWQsIGFuZAogICAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzb3VyY2UgdmVyc2lvbgogICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoJ3NldHVwLmNmZycsIGRlc3QpCgogICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpLnNhdmVfdmVyc2lvbl9pbmZvKGRlc3QpCgogICAgZGVmIF9tYW5pZmVzdF9pc19ub3RfZ2VuZXJhdGVkKHNlbGYpOgogICAgICAgICMgY2hlY2sgZm9yIHNwZWNpYWwgY29tbWVudCB1c2VkIGluIDIuNy4xIGFuZCBoaWdoZXIKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5tYW5pZmVzdCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmcC5yZWFkbGluZSgpCiAgICAgICAgcmV0dXJuIChmaXJzdF9saW5lICE9CiAgICAgICAgICAgICAgICAnIyBmaWxlIEdFTkVSQVRFRCBieSBkaXN0dXRpbHMsIGRvIE5PVCBlZGl0XG4nLmVuY29kZSgpKQoKICAgIGRlZiByZWFkX21hbmlmZXN0KHNlbGYpOgogICAgICAgICIiIlJlYWQgdGhlIG1hbmlmZXN0IGZpbGUgKG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0JykgYW5kIHVzZSBpdCB0bwogICAgICAgIGZpbGwgaW4gJ3NlbGYuZmlsZWxpc3QnLCB0aGUgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBzb3VyY2UKICAgICAgICBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbG9nLmluZm8oInJlYWRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiwgc2VsZi5tYW5pZmVzdCkKICAgICAgICBtYW5pZmVzdCA9IG9wZW4oc2VsZi5tYW5pZmVzdCwgJ3JiJykKICAgICAgICBmb3IgbGluZSBpbiBtYW5pZmVzdDoKICAgICAgICAgICAgIyBUaGUgbWFuaWZlc3QgbXVzdCBjb250YWluIFVURi04LiBTZWUgIzMwMy4KICAgICAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ1VURi04JykKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVyIG5vdCBVVEYtOCBkZWNvZGFibGUgLS0gc2tpcHBpbmciICUgbGluZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIGlnbm9yZSBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBub3QgbGluZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGxpbmUpCiAgICAgICAgbWFuaWZlc3QuY2xvc2UoKQpQSwMEFAAAAAAAAAAhAJtwy8fdEwAA3RMAADQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgZGlzdHV0aWxzCmltcG9ydCBvcwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgpfX2FsbF9fID0gWydjb25maWdfZmlsZScsICdlZGl0X2NvbmZpZycsICdvcHRpb25fYmFzZScsICdzZXRvcHQnXQoKCmRlZiBjb25maWdfZmlsZShraW5kPSJsb2NhbCIpOgogICAgIiIiR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgZGlzdHV0aWxzLCBsb2NhbCwgZ2xvYmFsLCBvciBwZXItdXNlciBjb25maWcKCiAgICBga2luZGAgbXVzdCBiZSBvbmUgb2YgImxvY2FsIiwgImdsb2JhbCIsIG9yICJ1c2VyIgogICAgIiIiCiAgICBpZiBraW5kID09ICdsb2NhbCc6CiAgICAgICAgcmV0dXJuICdzZXR1cC5jZmcnCiAgICBpZiBraW5kID09ICdnbG9iYWwnOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkaXN0dXRpbHMuX19maWxlX18pLCAnZGlzdHV0aWxzLmNmZycKICAgICAgICApCiAgICBpZiBraW5kID09ICd1c2VyJzoKICAgICAgICBkb3QgPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kICcuJyBvciAnJwogICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIoY29udmVydF9wYXRoKCJ+LyVzcHlkaXN0dXRpbHMuY2ZnIiAlIGRvdCkpCiAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICJjb25maWdfZmlsZSgpIHR5cGUgbXVzdCBiZSAnbG9jYWwnLCAnZ2xvYmFsJywgb3IgJ3VzZXInIiwga2luZAogICAgKQoKCmRlZiBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgc2V0dGluZ3MsIGRyeV9ydW49RmFsc2UpOgogICAgIiIiRWRpdCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbmNsdWRlIGBzZXR0aW5nc2AKCiAgICBgc2V0dGluZ3NgIGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb3IgYGBOb25lYGAgdmFsdWVzLCBrZXllZCBieQogICAgY29tbWFuZC9zZWN0aW9uIG5hbWUuICBBIGBgTm9uZWBgIHZhbHVlIG1lYW5zIHRvIGRlbGV0ZSB0aGUgZW50aXJlIHNlY3Rpb24sCiAgICB3aGlsZSBhIGRpY3Rpb25hcnkgbGlzdHMgc2V0dGluZ3MgdG8gYmUgY2hhbmdlZCBvciBkZWxldGVkIGluIHRoYXQgc2VjdGlvbi4KICAgIEEgc2V0dGluZyBvZiBgYE5vbmVgYCBtZWFucyB0byBkZWxldGUgdGhhdCBzZXR0aW5nLgogICAgIiIiCiAgICBsb2cuZGVidWcoIlJlYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICVzIiwgZmlsZW5hbWUpCiAgICBvcHRzID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCiAgICBvcHRzLnJlYWQoW2ZpbGVuYW1lXSkKICAgIGZvciBzZWN0aW9uLCBvcHRpb25zIGluIHNldHRpbmdzLml0ZW1zKCk6CiAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgc2VjdGlvbiBbJXNdIGZyb20gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBvcHRzLmhhc19zZWN0aW9uKHNlY3Rpb24pOgogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgbmV3IHNlY3Rpb24gWyVzXSB0byAlcyIsIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgb3B0cy5hZGRfc2VjdGlvbihzZWN0aW9uKQogICAgICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGV0aW5nICVzLiVzIGZyb20gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBvcHRpb24sIGZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9wdHMucmVtb3ZlX29wdGlvbihzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdHMub3B0aW9ucyhzZWN0aW9uKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIGVtcHR5IFslc10gc2VjdGlvbiBmcm9tICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyAlcy4lcyB0byAlciBpbiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9wdHMuc2V0KHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCgogICAgbG9nLmluZm8oIldyaXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICBvcHRzLndyaXRlKGYpCgoKY2xhc3Mgb3B0aW9uX2Jhc2UoQ29tbWFuZCk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kcyB0aGF0IG1lc3Mgd2l0aCBjb25maWcgZmlsZXMiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdnbG9iYWwtY29uZmlnJywgJ2cnLAogICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBzaXRlLXdpZGUgZGlzdHV0aWxzLmNmZyBmaWxlIiksCiAgICAgICAgKCd1c2VyLWNvbmZpZycsICd1JywKICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgY3VycmVudCB1c2VyJ3MgcHlkaXN0dXRpbHMuY2ZnIGZpbGUiKSwKICAgICAgICAoJ2ZpbGVuYW1lPScsICdmJywKICAgICAgICAgImNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UgKGRlZmF1bHQ9c2V0dXAuY2ZnKSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAnZ2xvYmFsLWNvbmZpZycsICd1c2VyLWNvbmZpZycsCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmdsb2JhbF9jb25maWcgPSBOb25lCiAgICAgICAgc2VsZi51c2VyX2NvbmZpZyA9IE5vbmUKICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgaWYgc2VsZi5nbG9iYWxfY29uZmlnOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdnbG9iYWwnKSkKICAgICAgICBpZiBzZWxmLnVzZXJfY29uZmlnOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCd1c2VyJykpCiAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChzZWxmLmZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBmaWxlbmFtZXM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2xvY2FsJykpCiAgICAgICAgaWYgbGVuKGZpbGVuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25seSBvbmUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiIsCiAgICAgICAgICAgICAgICBmaWxlbmFtZXMKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZW5hbWUsID0gZmlsZW5hbWVzCgoKY2xhc3Mgc2V0b3B0KG9wdGlvbl9iYXNlKToKICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCgogICAgZGVzY3JpcHRpb24gPSAic2V0IGFuIG9wdGlvbiBpbiBzZXR1cC5jZmcgb3IgYW5vdGhlciBjb25maWcgZmlsZSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdjb21tYW5kPScsICdjJywgJ2NvbW1hbmQgdG8gc2V0IGFuIG9wdGlvbiBmb3InKSwKICAgICAgICAoJ29wdGlvbj0nLCAnbycsICdvcHRpb24gdG8gc2V0JyksCiAgICAgICAgKCdzZXQtdmFsdWU9JywgJ3MnLCAndmFsdWUgb2YgdGhlIG9wdGlvbicpLAogICAgICAgICgncmVtb3ZlJywgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIHZhbHVlJyksCiAgICBdICsgb3B0aW9uX2Jhc2UudXNlcl9vcHRpb25zCgogICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5jb21tYW5kID0gTm9uZQogICAgICAgIHNlbGYub3B0aW9uID0gTm9uZQogICAgICAgIHNlbGYuc2V0X3ZhbHVlID0gTm9uZQogICAgICAgIHNlbGYucmVtb3ZlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLmNvbW1hbmQgaXMgTm9uZSBvciBzZWxmLm9wdGlvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tY29tbWFuZCAqYW5kKiAtLW9wdGlvbiIpCiAgICAgICAgaWYgc2VsZi5zZXRfdmFsdWUgaXMgTm9uZSBhbmQgbm90IHNlbGYucmVtb3ZlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tc2V0LXZhbHVlIG9yIC0tcmVtb3ZlIikKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGVkaXRfY29uZmlnKAogICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmQ6IHtzZWxmLm9wdGlvbi5yZXBsYWNlKCctJywgJ18nKTogc2VsZi5zZXRfdmFsdWV9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGYuZHJ5X3J1bgogICAgICAgICkKUEsDBBQAAAAAAAAAIQDdGeGe/iMAAP4jAAAyAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlpbXBvcnQgb3MKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgdW5pdHRlc3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0TG9hZGVyCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IChyZXNvdXJjZV9saXN0ZGlyLCByZXNvdXJjZV9leGlzdHMsIG5vcm1hbGl6ZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX3NldCwgX25hbWVzcGFjZV9wYWNrYWdlcywgZXZhbHVhdGVfbWFya2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciwgcmVxdWlyZSwgRW50cnlQb2ludCkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgoKY2xhc3MgU2Nhbm5pbmdMb2FkZXIoVGVzdExvYWRlcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIFRlc3RMb2FkZXIuX19pbml0X18oc2VsZikKICAgICAgICBzZWxmLl92aXNpdGVkID0gc2V0KCkKCiAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUsIHBhdHRlcm49Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlCgogICAgICAgIElmIHRoZSBtb2R1bGUgaXMgYSBwYWNrYWdlLCBsb2FkIHRlc3RzIGZyb20gYWxsIHRoZSBtb2R1bGVzIGluIGl0LgogICAgICAgIElmIHRoZSBtb2R1bGUgaGFzIGFuIGBgYWRkaXRpb25hbF90ZXN0c2BgIGZ1bmN0aW9uLCBjYWxsIGl0IGFuZCBhZGQKICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSB0ZXN0cy4KICAgICAgICAiIiIKICAgICAgICBpZiBtb2R1bGUgaW4gc2VsZi5fdmlzaXRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBzZWxmLl92aXNpdGVkLmFkZChtb2R1bGUpCgogICAgICAgIHRlc3RzID0gW10KICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAiYWRkaXRpb25hbF90ZXN0cyIpOgogICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kdWxlLmFkZGl0aW9uYWxfdGVzdHMoKSkKCiAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgICAgICBmb3IgZmlsZSBpbiByZXNvdXJjZV9saXN0ZGlyKG1vZHVsZS5fX25hbWVfXywgJycpOgogICAgICAgICAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLnB5JykgYW5kIGZpbGUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18gKyAnLicgKyBmaWxlWzotM10KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcmVzb3VyY2VfZXhpc3RzKG1vZHVsZS5fX25hbWVfXywgZmlsZSArICcvX19pbml0X18ucHknKToKICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShzdWJtb2R1bGUpKQoKICAgICAgICBpZiBsZW4odGVzdHMpICE9IDE6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRlc3RzWzBdICAjIGRvbid0IGNyZWF0ZSBhIG5lc3RlZCBzdWl0ZSBmb3Igb25seSBvbmUgcmV0dXJuCgoKIyBhZGFwdGVkIGZyb20gamFyYWNvLmNsYXNzZXMucHJvcGVydGllczpOb25EYXRhUHJvcGVydHkKY2xhc3MgTm9uRGF0YVByb3BlcnR5KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldCk6CiAgICAgICAgc2VsZi5mZ2V0ID0gZmdldAoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgb2JqdHlwZT1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gc2VsZi5mZ2V0KG9iaikKCgpjbGFzcyB0ZXN0KENvbW1hbmQpOgogICAgIiIiQ29tbWFuZCB0byBydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIiIgoKICAgIGRlc2NyaXB0aW9uID0gInJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3Rlc3QtbW9kdWxlPScsICdtJywgIlJ1biAndGVzdF9zdWl0ZScgaW4gc3BlY2lmaWVkIG1vZHVsZSIpLAogICAgICAgICgndGVzdC1zdWl0ZT0nLCAncycsCiAgICAgICAgICJSdW4gc2luZ2xlIHRlc3QsIGNhc2Ugb3Igc3VpdGUgKGUuZy4gJ21vZHVsZS50ZXN0X3N1aXRlJykiKSwKICAgICAgICAoJ3Rlc3QtcnVubmVyPScsICdyJywgIlRlc3QgcnVubmVyIHRvIHVzZSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9tb2R1bGUgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgYW5kIHNlbGYudGVzdF9tb2R1bGU6CiAgICAgICAgICAgIG1zZyA9ICJZb3UgbWF5IHNwZWNpZnkgYSBtb2R1bGUgb3IgYSBzdWl0ZSwgYnV0IG5vdCBib3RoIgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRlc3RfbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0X3N1aXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLnRlc3RfbW9kdWxlICsgIi50ZXN0X3N1aXRlIgoKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9sb2FkZXInLCBOb25lKQogICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9ICJzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDpTY2FubmluZ0xvYWRlciIKICAgICAgICBpZiBzZWxmLnRlc3RfcnVubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9ydW5uZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9ydW5uZXInLCBOb25lKQoKICAgIEBOb25EYXRhUHJvcGVydHkKICAgIGRlZiB0ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fdGVzdF9hcmdzKCkpCgogICAgZGVmIF90ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYudGVzdF9zdWl0ZSBhbmQgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNyk6CiAgICAgICAgICAgIHlpZWxkICdkaXNjb3ZlcicKICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CiAgICAgICAgICAgIHlpZWxkICctLXZlcmJvc2UnCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlOgogICAgICAgICAgICB5aWVsZCBzZWxmLnRlc3Rfc3VpdGUKCiAgICBkZWYgd2l0aF9wcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIgogICAgICAgIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHByb2plY3Rfb25fc3lzX3BhdGggY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICBmdW5jKCkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHByb2plY3Rfb25fc3lzX3BhdGgoc2VsZiwgaW5jbHVkZV9kaXN0cz1bXSk6CiAgICAgICAgd2l0aF8ydG8zID0gc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpCgogICAgICAgIGlmIHdpdGhfMnRvMzoKICAgICAgICAgICAgIyBJZiB3ZSBydW4gMnRvMyB3ZSBjYW4gbm90IGRvIHRoaXMgaW5wbGFjZToKCiAgICAgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfcHknLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgYnB5X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJidWlsZF9weSIpCiAgICAgICAgICAgIGJ1aWxkX3BhdGggPSBub3JtYWxpemVfcGF0aChicHlfY21kLmJ1aWxkX2xpYikKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucwogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdlZ2dfaW5mbycsIGVnZ19iYXNlPWJ1aWxkX3BhdGgpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdpdGhvdXQgMnRvMyBpbnBsYWNlIHdvcmtzIGZpbmU6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCgogICAgICAgIG9sZF9wYXRoID0gc3lzLnBhdGhbOl0KICAgICAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByb2plY3RfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGVpX2NtZC5lZ2dfYmFzZSkKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3RfcGF0aCkKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQogICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQogICAgICAgICAgICByZXF1aXJlKCclcz09JXMnICUgKGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uKSkKICAgICAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgoW3Byb2plY3RfcGF0aF0pOgogICAgICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aFs6XSA9IG9sZF9wYXRoCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLmNsZWFyKCkKICAgICAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCgogICAgQHN0YXRpY21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAiIiIKICAgICAgICBBZGQgdGhlIGluZGljYXRlZCBwYXRocyB0byB0aGUgaGVhZCBvZiB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgc3VicHJvY2Vzc2VzIHdpbGwgYWxzbyBzZWUgdGhlIHBhY2thZ2VzIGF0CiAgICAgICAgdGhlc2UgcGF0aHMuCgogICAgICAgIERvIHRoaXMgaW4gYSBjb250ZXh0IHRoYXQgcmVzdG9yZXMgdGhlIHZhbHVlIG9uIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgbm90aGluZyA9IG9iamVjdCgpCiAgICAgICAgb3JpZ19weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCBub3RoaW5nKQogICAgICAgIGN1cnJlbnRfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVmaXggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aHMpCiAgICAgICAgICAgIHRvX2pvaW4gPSBmaWx0ZXIoTm9uZSwgW3ByZWZpeCwgY3VycmVudF9weXRob25wYXRoXSkKICAgICAgICAgICAgbmV3X3BhdGggPSBvcy5wYXRoc2VwLmpvaW4odG9fam9pbikKICAgICAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBuZXdfcGF0aAogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9yaWdfcHl0aG9ucGF0aCBpcyBub3RoaW5nOgogICAgICAgICAgICAgICAgb3MuZW52aXJvbi5wb3AoJ1BZVEhPTlBBVEgnLCBOb25lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gb3JpZ19weXRob25wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGluc3RhbGxfZGlzdHMoZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGUgcmVxdWlyZW1lbnRzIGluZGljYXRlZCBieSBzZWxmLmRpc3RyaWJ1dGlvbiBhbmQKICAgICAgICByZXR1cm4gYW4gaXRlcmFibGUgb2YgdGhlIGRpc3RzIHRoYXQgd2VyZSBidWlsdC4KICAgICAgICAiIiIKICAgICAgICBpcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QuaW5zdGFsbF9yZXF1aXJlcykKICAgICAgICB0cl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QudGVzdHNfcmVxdWlyZSBvciBbXSkKICAgICAgICBlcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKAogICAgICAgICAgICB2IGZvciBrLCB2IGluIGRpc3QuZXh0cmFzX3JlcXVpcmUuaXRlbXMoKQogICAgICAgICAgICBpZiBrLnN0YXJ0c3dpdGgoJzonKSBhbmQgZXZhbHVhdGVfbWFya2VyKGtbMTpdKQogICAgICAgICkKICAgICAgICByZXR1cm4gaXRlcnRvb2xzLmNoYWluKGlyX2QsIHRyX2QsIGVyX2QpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpbnN0YWxsZWRfZGlzdHMgPSBzZWxmLmluc3RhbGxfZGlzdHMoc2VsZi5kaXN0cmlidXRpb24pCgogICAgICAgIGNtZCA9ICcgJy5qb2luKHNlbGYuX2FyZ3YpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCdza2lwcGluZyAiJXMiIChkcnkgcnVuKScgJSBjbWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmFubm91bmNlKCdydW5uaW5nICIlcyInICUgY21kKQoKICAgICAgICBwYXRocyA9IG1hcChvcGVyYXRvci5hdHRyZ2V0dGVyKCdsb2NhdGlvbicpLCBpbnN0YWxsZWRfZGlzdHMpCiAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgocGF0aHMpOgogICAgICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQoKICAgIGRlZiBydW5fdGVzdHMoc2VsZik6CiAgICAgICAgIyBQdXJnZSBtb2R1bGVzIHVuZGVyIHRlc3QgZnJvbSBzeXMubW9kdWxlcy4gVGhlIHRlc3QgbG9hZGVyIHdpbGwKICAgICAgICAjIHJlLWltcG9ydCB0aGVtIGZyb20gdGhlIGJ1aWxkIGxvY2F0aW9uLiBSZXF1aXJlZCB3aGVuIDJ0bzMgaXMgdXNlZAogICAgICAgICMgd2l0aCBuYW1lc3BhY2UgcGFja2FnZXMuCiAgICAgICAgaWYgc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpOgogICAgICAgICAgICBtb2R1bGUgPSBzZWxmLnRlc3Rfc3VpdGUuc3BsaXQoJy4nKVswXQogICAgICAgICAgICBpZiBtb2R1bGUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzID0gW10KICAgICAgICAgICAgICAgIGlmIG1vZHVsZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobW9kdWxlKQogICAgICAgICAgICAgICAgbW9kdWxlICs9ICcuJwogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKG1vZHVsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzLmFwcGVuZChuYW1lKQogICAgICAgICAgICAgICAgbGlzdChtYXAoc3lzLm1vZHVsZXMuX19kZWxpdGVtX18sIGRlbF9tb2R1bGVzKSkKCiAgICAgICAgdGVzdCA9IHVuaXR0ZXN0Lm1haW4oCiAgICAgICAgICAgIE5vbmUsIE5vbmUsIHNlbGYuX2FyZ3YsCiAgICAgICAgICAgIHRlc3RMb2FkZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfbG9hZGVyKSwKICAgICAgICAgICAgdGVzdFJ1bm5lcj1zZWxmLl9yZXNvbHZlX2FzX2VwKHNlbGYudGVzdF9ydW5uZXIpLAogICAgICAgICAgICBleGl0PUZhbHNlLAogICAgICAgICkKICAgICAgICBpZiBub3QgdGVzdC5yZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgogICAgICAgICAgICBtc2cgPSAnVGVzdCBmYWlsZWQ6ICVzJyAlIHRlc3QucmVzdWx0CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfYXJndihzZWxmKToKICAgICAgICByZXR1cm4gWyd1bml0dGVzdCddICsgc2VsZi50ZXN0X2FyZ3MKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jlc29sdmVfYXNfZXAodmFsKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlIHZhbHVlLCBjYWxsZWQsIGFzIGEgYXMgaWYgaXQgd2VyZQogICAgICAgIHNwZWNpZmllZCBhcyBhbiBlbnRyeSBwb2ludC4KICAgICAgICAiIiIKICAgICAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFyc2VkID0gRW50cnlQb2ludC5wYXJzZSgieD0iICsgdmFsKQogICAgICAgIHJldHVybiBwYXJzZWQucmVzb2x2ZSgpKCkKUEsDBBQAAAAAAAAAIQDZJItnlAQAAJQEAAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weWltcG9ydCBnZXRwYXNzCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IHVwbG9hZCBhcyBvcmlnCgoKY2xhc3MgdXBsb2FkKG9yaWcudXBsb2FkKToKICAgICIiIgogICAgT3ZlcnJpZGUgZGVmYXVsdCB1cGxvYWQgYmVoYXZpb3IgdG8gb2J0YWluIHBhc3N3b3JkCiAgICBpbiBhIHZhcmlldHkgb2YgZGlmZmVyZW50IHdheXMuCiAgICAiIiIKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLnVwbG9hZC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi51c2VybmFtZSA9ICgKICAgICAgICAgICAgc2VsZi51c2VybmFtZSBvcgogICAgICAgICAgICBnZXRwYXNzLmdldHVzZXIoKQogICAgICAgICkKICAgICAgICAjIEF0dGVtcHQgdG8gb2J0YWluIHBhc3N3b3JkLiBTaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gYXQgdGhlIGZpcnN0CiAgICAgICAgIyBzaWduIG9mIHN1Y2Nlc3MuCiAgICAgICAgc2VsZi5wYXNzd29yZCA9ICgKICAgICAgICAgICAgc2VsZi5wYXNzd29yZCBvcgogICAgICAgICAgICBzZWxmLl9sb2FkX3Bhc3N3b3JkX2Zyb21fa2V5cmluZygpIG9yCiAgICAgICAgICAgIHNlbGYuX3Byb21wdF9mb3JfcGFzc3dvcmQoKQogICAgICAgICkKCiAgICBkZWYgX2xvYWRfcGFzc3dvcmRfZnJvbV9rZXlyaW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gbG9hZCBwYXNzd29yZCBmcm9tIGtleXJpbmcuIFN1cHByZXNzIEV4Y2VwdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBrZXlyaW5nID0gX19pbXBvcnRfXygna2V5cmluZycpCiAgICAgICAgICAgIHJldHVybiBrZXlyaW5nLmdldF9wYXNzd29yZChzZWxmLnJlcG9zaXRvcnksIHNlbGYudXNlcm5hbWUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBfcHJvbXB0X2Zvcl9wYXNzd29yZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcm9tcHQgZm9yIGEgcGFzc3dvcmQgb24gdGhlIHR0eS4gU3VwcHJlc3MgRXhjZXB0aW9ucy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBnZXRwYXNzLmdldHBhc3MoKQogICAgICAgIGV4Y2VwdCAoRXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCk6CiAgICAgICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDyl/PGjxwAAI8cAAA5AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIidXBsb2FkX2RvY3MKCkltcGxlbWVudHMgYSBEaXN0dXRpbHMgJ3VwbG9hZF9kb2NzJyBzdWJjb21tYW5kICh1cGxvYWQgZG9jdW1lbnRhdGlvbiB0bwpQeVBJJ3MgcHl0aG9uaG9zdGVkLm9yZykuCiIiIgoKZnJvbSBiYXNlNjQgaW1wb3J0IHN0YW5kYXJkX2I2NGVuY29kZQpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50LCB1cmxsaWIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgaXRlcl9lbnRyeV9wb2ludHMKZnJvbSAudXBsb2FkIGltcG9ydCB1cGxvYWQKCgpkZWYgX2VuY29kZShzKToKICAgIGVycm9ycyA9ICdzdXJyb2dhdGVlc2NhcGUnIGlmIHNpeC5QWTMgZWxzZSAnc3RyaWN0JwogICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcsIGVycm9ycykKCgpjbGFzcyB1cGxvYWRfZG9jcyh1cGxvYWQpOgogICAgIyBvdmVycmlkZSB0aGUgZGVmYXVsdCByZXBvc2l0b3J5IGFzIHVwbG9hZF9kb2NzIGlzbid0CiAgICAjIHN1cHBvcnRlZCBieSBXYXJlaG91c2UgKGFuZCB3b24ndCBiZSkuCiAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS8nCgogICAgZGVzY3JpcHRpb24gPSAnVXBsb2FkIGRvY3VtZW50YXRpb24gdG8gUHlQSScKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdyZXBvc2l0b3J5PScsICdyJywKICAgICAgICAgInVybCBvZiByZXBvc2l0b3J5IFtkZWZhdWx0OiAlc10iICUgdXBsb2FkLkRFRkFVTFRfUkVQT1NJVE9SWSksCiAgICAgICAgKCdzaG93LXJlc3BvbnNlJywgTm9uZSwKICAgICAgICAgJ2Rpc3BsYXkgZnVsbCByZXNwb25zZSB0ZXh0IGZyb20gc2VydmVyJyksCiAgICAgICAgKCd1cGxvYWQtZGlyPScsIE5vbmUsICdkaXJlY3RvcnkgdG8gdXBsb2FkJyksCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSB1cGxvYWQuYm9vbGVhbl9vcHRpb25zCgogICAgZGVmIGhhc19zcGhpbngoc2VsZik6CiAgICAgICAgaWYgc2VsZi51cGxvYWRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJywgJ2J1aWxkX3NwaGlueCcpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBzdWJfY29tbWFuZHMgPSBbKCdidWlsZF9zcGhpbngnLCBoYXNfc3BoaW54KV0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHVwbG9hZC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnVwbG9hZF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHVwbG9hZC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi51cGxvYWRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuaGFzX3NwaGlueCgpOgogICAgICAgICAgICAgICAgYnVpbGRfc3BoaW54ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NwaGlueCcpCiAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBidWlsZF9zcGhpbnguYnVpbGRlcl90YXJnZXRfZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuYnVpbGRfYmFzZSwgJ2RvY3MnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ3VwbG9hZF9kaXInKQogICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBzZWxmLnVwbG9hZF9kaXIKICAgICAgICBpZiAncHlwaS5weXRob24ub3JnJyBpbiBzZWxmLnJlcG9zaXRvcnk6CiAgICAgICAgICAgIGxvZy53YXJuKCJVcGxvYWRfZG9jcyBjb21tYW5kIGlzIGRlcHJlY2F0ZWQuIFVzZSBSVEQgaW5zdGVhZC4iKQogICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VzaW5nIHVwbG9hZCBkaXJlY3RvcnkgJXMnICUgc2VsZi50YXJnZXRfZGlyKQoKICAgIGRlZiBjcmVhdGVfemlwZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUsICJ3IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWtwYXRoKHNlbGYudGFyZ2V0X2RpcikgICMganVzdCBpbiBjYXNlCiAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYudGFyZ2V0X2Rpcik6CiAgICAgICAgICAgICAgICBpZiByb290ID09IHNlbGYudGFyZ2V0X2RpciBhbmQgbm90IGZpbGVzOgogICAgICAgICAgICAgICAgICAgIHRtcGwgPSAibm8gZmlsZXMgZm91bmQgaW4gdXBsb2FkIGRpcmVjdG9yeSAnJXMnIgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKHRtcGwgJSBzZWxmLnRhcmdldF9kaXIpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBmdWxsID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSByb290W2xlbihzZWxmLnRhcmdldF9kaXIpOl0ubHN0cmlwKG9zLnBhdGguc2VwKQogICAgICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocmVsYXRpdmUsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgemlwX2ZpbGUud3JpdGUoZnVsbCwgZGVzdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB6aXBfZmlsZS5jbG9zZSgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCgogICAgICAgIHRtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICBuYW1lID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEuZ2V0X25hbWUoKQogICAgICAgIHppcF9maWxlID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICIlcy56aXAiICUgbmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3JlYXRlX3ppcGZpbGUoemlwX2ZpbGUpCiAgICAgICAgICAgIHNlbGYudXBsb2FkX2ZpbGUoemlwX2ZpbGUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0bXBfZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYnVpbGRfcGFydChpdGVtLCBzZXBfYm91bmRhcnkpOgogICAgICAgIGtleSwgdmFsdWVzID0gaXRlbQogICAgICAgIHRpdGxlID0gJ1xuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5CiAgICAgICAgIyBoYW5kbGUgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUgbmFtZQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlcywgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdCiAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgdGl0bGUgKz0gJzsgZmlsZW5hbWU9IiVzIicgJSB2YWx1ZVswXQogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBfZW5jb2RlKHZhbHVlKQogICAgICAgICAgICB5aWVsZCBzZXBfYm91bmRhcnkKICAgICAgICAgICAgeWllbGQgX2VuY29kZSh0aXRsZSkKICAgICAgICAgICAgeWllbGQgYiJcblxuIgogICAgICAgICAgICB5aWVsZCB2YWx1ZQogICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTE6XSA9PSBiJ1xyJzoKICAgICAgICAgICAgICAgIHlpZWxkIGInXG4nICAjIHdyaXRlIGFuIGV4dHJhIG5ld2xpbmUgKGx1cnZlIE1hY3MpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX211bHRpcGFydChjbHMsIGRhdGEpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIHVwIHRoZSBNSU1FIHBheWxvYWQgZm9yIHRoZSBQT1NUIGRhdGEKICAgICAgICAiIiIKICAgICAgICBib3VuZGFyeSA9IGInLS0tLS0tLS0tLS0tLS1HSFNLRkpETEdEUzc1NDNGSktMRkhSRTc1NjQyNzU2NzQzMjU0JwogICAgICAgIHNlcF9ib3VuZGFyeSA9IGInXG4tLScgKyBib3VuZGFyeQogICAgICAgIGVuZF9ib3VuZGFyeSA9IHNlcF9ib3VuZGFyeSArIGInLS0nCiAgICAgICAgZW5kX2l0ZW1zID0gZW5kX2JvdW5kYXJ5LCBiIlxuIiwKICAgICAgICBidWlsZGVyID0gZnVuY3Rvb2xzLnBhcnRpYWwoCiAgICAgICAgICAgIGNscy5fYnVpbGRfcGFydCwKICAgICAgICAgICAgc2VwX2JvdW5kYXJ5PXNlcF9ib3VuZGFyeSwKICAgICAgICApCiAgICAgICAgcGFydF9ncm91cHMgPSBtYXAoYnVpbGRlciwgZGF0YS5pdGVtcygpKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUocGFydF9ncm91cHMpCiAgICAgICAgYm9keV9pdGVtcyA9IGl0ZXJ0b29scy5jaGFpbihwYXJ0cywgZW5kX2l0ZW1zKQogICAgICAgIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBib3VuZGFyeS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gYicnLmpvaW4oYm9keV9pdGVtcyksIGNvbnRlbnRfdHlwZQoKICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKICAgICAgICBtZXRhID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEKICAgICAgICBkYXRhID0gewogICAgICAgICAgICAnOmFjdGlvbic6ICdkb2NfdXBsb2FkJywKICAgICAgICAgICAgJ25hbWUnOiBtZXRhLmdldF9uYW1lKCksCiAgICAgICAgICAgICdjb250ZW50JzogKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBjb250ZW50KSwKICAgICAgICB9CiAgICAgICAgIyBzZXQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uCiAgICAgICAgY3JlZGVudGlhbHMgPSBfZW5jb2RlKHNlbGYudXNlcm5hbWUgKyAnOicgKyBzZWxmLnBhc3N3b3JkKQogICAgICAgIGNyZWRlbnRpYWxzID0gc3RhbmRhcmRfYjY0ZW5jb2RlKGNyZWRlbnRpYWxzKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgY3JlZGVudGlhbHMKCiAgICAgICAgYm9keSwgY3QgPSBzZWxmLl9idWlsZF9tdWx0aXBhcnQoZGF0YSkKCiAgICAgICAgbXNnID0gIlN1Ym1pdHRpbmcgZG9jdW1lbnRhdGlvbiB0byAlcyIgJSAoc2VsZi5yZXBvc2l0b3J5KQogICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKCiAgICAgICAgIyBidWlsZCB0aGUgUmVxdWVzdAogICAgICAgICMgV2UgY2FuJ3QgdXNlIHVybGxpYjIgc2luY2Ugd2UgbmVlZCB0byBzZW5kIHRoZSBCYXNpYwogICAgICAgICMgYXV0aCByaWdodCB3aXRoIHRoZSBmaXJzdCByZXF1ZXN0CiAgICAgICAgc2NoZW1hLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnRzID0gXAogICAgICAgICAgICB1cmxsaWIucGFyc2UudXJscGFyc2Uoc2VsZi5yZXBvc2l0b3J5KQogICAgICAgIGFzc2VydCBub3QgcGFyYW1zIGFuZCBub3QgcXVlcnkgYW5kIG5vdCBmcmFnbWVudHMKICAgICAgICBpZiBzY2hlbWEgPT0gJ2h0dHAnOgogICAgICAgICAgICBjb25uID0gaHR0cF9jbGllbnQuSFRUUENvbm5lY3Rpb24obmV0bG9jKQogICAgICAgIGVsaWYgc2NoZW1hID09ICdodHRwcyc6CiAgICAgICAgICAgIGNvbm4gPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24obmV0bG9jKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bnN1cHBvcnRlZCBzY2hlbWEgIiArIHNjaGVtYSkKCiAgICAgICAgZGF0YSA9ICcnCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmNvbm5lY3QoKQogICAgICAgICAgICBjb25uLnB1dHJlcXVlc3QoIlBPU1QiLCB1cmwpCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGN0CiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LXR5cGUnLCBjb250ZW50X3R5cGUpCiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4oYm9keSkpKQogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQXV0aG9yaXphdGlvbicsIGF1dGgpCiAgICAgICAgICAgIGNvbm4uZW5kaGVhZGVycygpCiAgICAgICAgICAgIGNvbm4uc2VuZChib2R5KQogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShzdHIoZSksIGxvZy5FUlJPUikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHIgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICBpZiByLnN0YXR1cyA9PSAyMDA6CiAgICAgICAgICAgIG1zZyA9ICdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbikKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQogICAgICAgIGVsaWYgci5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICBsb2NhdGlvbiA9IHIuZ2V0aGVhZGVyKCdMb2NhdGlvbicpCiAgICAgICAgICAgIGlmIGxvY2F0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9ICdodHRwczovL3B5dGhvbmhvc3RlZC5vcmcvJXMvJyAlIG1ldGEuZ2V0X25hbWUoKQogICAgICAgICAgICBtc2cgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwuIFZpc2l0ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtc2cgPSAnVXBsb2FkIGZhaWxlZCAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKQogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLkVSUk9SKQogICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKICAgICAgICAgICAgcHJpbnQoJy0nICogNzUsIHIucmVhZCgpLCAnLScgKiA3NSkKUEsDBBQAAAAAAAAAIQCJRxAksT8AALE/AAAsAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb25maWcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgdW5pY29kZV9saXRlcmFscwppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBzeXMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc0ZpbGVFcnJvcgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCgoKZGVmIHJlYWRfY29uZmlndXJhdGlvbigKICAgICAgICBmaWxlcGF0aCwgZmluZF9vdGhlcnM9RmFsc2UsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlJlYWQgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm5zIG9wdGlvbnMgZnJvbSBpdCBhcyBhIGRpY3QuCgogICAgOnBhcmFtIHN0cnx1bmljb2RlIGZpbGVwYXRoOiBQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgICAgIHRvIGdldCBvcHRpb25zIGZyb20uCgogICAgOnBhcmFtIGJvb2wgZmluZF9vdGhlcnM6IFdoZXRoZXIgdG8gc2VhcmNoIGZvciBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgd2hpY2ggY291bGQgYmUgb24gaW4gdmFyaW91cyBwbGFjZXMuCgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIF9EaXN0cmlidXRpb24KCiAgICBmaWxlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmaWxlcGF0aCkKCiAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKICAgICAgICAgICAgJ0NvbmZpZ3VyYXRpb24gZmlsZSAlcyBkb2VzIG5vdCBleGlzdC4nICUgZmlsZXBhdGgpCgogICAgY3VycmVudF9kaXJlY3RvcnkgPSBvcy5nZXRjd2QoKQogICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKGZpbGVwYXRoKSkKCiAgICB0cnk6CiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCgogICAgICAgIGZpbGVuYW1lcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKSBpZiBmaW5kX290aGVycyBlbHNlIFtdCiAgICAgICAgaWYgZmlsZXBhdGggbm90IGluIGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChmaWxlcGF0aCkKCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoZGlzdCwgZmlsZW5hbWVzPWZpbGVuYW1lcykKCiAgICAgICAgaGFuZGxlcnMgPSBwYXJzZV9jb25maWd1cmF0aW9uKAogICAgICAgICAgICBkaXN0LCBkaXN0LmNvbW1hbmRfb3B0aW9ucywKICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCgogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihjdXJyZW50X2RpcmVjdG9yeSkKCiAgICByZXR1cm4gY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKQoKCmRlZiBjb25maWd1cmF0aW9uX3RvX2RpY3QoaGFuZGxlcnMpOgogICAgIiIiUmV0dXJucyBjb25maWd1cmF0aW9uIGRhdGEgZ2F0aGVyZWQgYnkgZ2l2ZW4gaGFuZGxlcnMgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBsaXN0W0NvbmZpZ0hhbmRsZXJdIGhhbmRsZXJzOiBIYW5kbGVycyBsaXN0LAogICAgICAgIHVzdWFsbHkgZnJvbSBwYXJzZV9jb25maWd1cmF0aW9uKCkKCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgY29uZmlnX2RpY3QgPSBkZWZhdWx0ZGljdChkaWN0KQoKICAgIGZvciBoYW5kbGVyIGluIGhhbmRsZXJzOgoKICAgICAgICBvYmpfYWxpYXMgPSBoYW5kbGVyLnNlY3Rpb25fcHJlZml4CiAgICAgICAgdGFyZ2V0X29iaiA9IGhhbmRsZXIudGFyZ2V0X29iagoKICAgICAgICBmb3Igb3B0aW9uIGluIGhhbmRsZXIuc2V0X29wdGlvbnM6CiAgICAgICAgICAgIGdldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgJ2dldF8lcycgJSBvcHRpb24sIE5vbmUpCgogICAgICAgICAgICBpZiBnZXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb24pCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXR0ZXIoKQoKICAgICAgICAgICAgY29uZmlnX2RpY3Rbb2JqX2FsaWFzXVtvcHRpb25dID0gdmFsdWUKCiAgICByZXR1cm4gY29uZmlnX2RpY3QKCgpkZWYgcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICBkaXN0cmlidXRpb24sIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgIiIiUGVyZm9ybXMgYWRkaXRpb25hbCBwYXJzaW5nIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwogICAgZm9yIGEgZGlzdHJpYnV0aW9uLgoKICAgIFJldHVybnMgYSBsaXN0IG9mIHVzZWQgb3B0aW9uIGhhbmRsZXJzLgoKICAgIDpwYXJhbSBEaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uOgogICAgOnBhcmFtIGRpY3QgY29tbWFuZF9vcHRpb25zOgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgogICAgbWV0YSA9IENvbmZpZ01ldGFkYXRhSGFuZGxlcigKICAgICAgICBkaXN0cmlidXRpb24ubWV0YWRhdGEsIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICBtZXRhLnBhcnNlKCkKCiAgICBvcHRpb25zID0gQ29uZmlnT3B0aW9uc0hhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgb3B0aW9ucy5wYXJzZSgpCgogICAgcmV0dXJuIFttZXRhLCBvcHRpb25zXQoKCmNsYXNzIENvbmZpZ0hhbmRsZXIob2JqZWN0KToKICAgICIiIkhhbmRsZXMgbWV0YWRhdGEgc3VwcGxpZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4iIiIKCiAgICBzZWN0aW9uX3ByZWZpeCA9IE5vbmUKICAgICIiIlByZWZpeCBmb3IgY29uZmlnIHNlY3Rpb25zIGhhbmRsZWQgYnkgdGhpcyBoYW5kbGVyLgogICAgTXVzdCBiZSBwcm92aWRlZCBieSBjbGFzcyBoZWlycy4KCiAgICAiIiIKCiAgICBhbGlhc2VzID0ge30KICAgICIiIk9wdGlvbnMgYWxpYXNlcy4KICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBwYWNrYWdlcy4gRS5nLjogZDJ0bzEgYW5kIHBici4KICAgIE5vdGU6IGAtYCBpbiBrZXlzIGlzIHJlcGxhY2VkIHdpdGggYF9gIGJ5IGNvbmZpZyBwYXJzZXIuCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldF9vYmosIG9wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICBzZWN0aW9ucyA9IHt9CgogICAgICAgIHNlY3Rpb25fcHJlZml4ID0gc2VsZi5zZWN0aW9uX3ByZWZpeAogICAgICAgIGZvciBzZWN0aW9uX25hbWUsIHNlY3Rpb25fb3B0aW9ucyBpbiBvcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWN0aW9uX25hbWUuc3RhcnRzd2l0aChzZWN0aW9uX3ByZWZpeCk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgc2VjdGlvbl9uYW1lID0gc2VjdGlvbl9uYW1lLnJlcGxhY2Uoc2VjdGlvbl9wcmVmaXgsICcnKS5zdHJpcCgnLicpCiAgICAgICAgICAgIHNlY3Rpb25zW3NlY3Rpb25fbmFtZV0gPSBzZWN0aW9uX29wdGlvbnMKCiAgICAgICAgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9ycyA9IGlnbm9yZV9vcHRpb25fZXJyb3JzCiAgICAgICAgc2VsZi50YXJnZXRfb2JqID0gdGFyZ2V0X29iagogICAgICAgIHNlbGYuc2VjdGlvbnMgPSBzZWN0aW9ucwogICAgICAgIHNlbGYuc2V0X29wdGlvbnMgPSBbXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICclcyBtdXN0IHByb3ZpZGUgLnBhcnNlcnMgcHJvcGVydHknICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG9wdGlvbl9uYW1lLCB2YWx1ZSk6CiAgICAgICAgdW5rbm93biA9IHR1cGxlKCkKICAgICAgICB0YXJnZXRfb2JqID0gc2VsZi50YXJnZXRfb2JqCgogICAgICAgICMgVHJhbnNsYXRlIGFsaWFzIGludG8gcmVhbCBuYW1lLgogICAgICAgIG9wdGlvbl9uYW1lID0gc2VsZi5hbGlhc2VzLmdldChvcHRpb25fbmFtZSwgb3B0aW9uX25hbWUpCgogICAgICAgIGN1cnJlbnRfdmFsdWUgPSBnZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbl9uYW1lLCB1bmtub3duKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlIGlzIHVua25vd246CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKG9wdGlvbl9uYW1lKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlOgogICAgICAgICAgICAjIEFscmVhZHkgaW5oYWJpdGVkLiBTa2lwcGluZy4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNraXBfb3B0aW9uID0gRmFsc2UKICAgICAgICBwYXJzZXIgPSBzZWxmLnBhcnNlcnMuZ2V0KG9wdGlvbl9uYW1lKQogICAgICAgIGlmIHBhcnNlcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpCgogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc2tpcF9vcHRpb24gPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9yczoKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBpZiBza2lwX29wdGlvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgJ3NldF8lcycgJSBvcHRpb25fbmFtZSwgTm9uZSkKICAgICAgICBpZiBzZXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2V0dGVyKHZhbHVlKQoKICAgICAgICBzZWxmLnNldF9vcHRpb25zLmFwcGVuZChvcHRpb25fbmFtZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfbGlzdChjbHMsIHZhbHVlLCBzZXBhcmF0b3I9JywnKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgVmFsdWUgaXMgc3BsaXQgZWl0aGVyIGJ5IHNlcGFyYXRvciAoZGVmYXVsdHMgdG8gY29tbWEpIG9yIGJ5IGxpbmVzLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnBhcmFtIHNlcGFyYXRvcjogTGlzdCBpdGVtcyBzZXBhcmF0b3IgY2hhcmFjdGVyLgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOiAgIyBfZ2V0X3BhcnNlcl9jb21wb3VuZCBjYXNlCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiAnXG4nIGluIHZhbHVlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0bGluZXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoc2VwYXJhdG9yKQoKICAgICAgICByZXR1cm4gW2NodW5rLnN0cmlwKCkgZm9yIGNodW5rIGluIHZhbHVlIGlmIGNodW5rLnN0cmlwKCldCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2RpY3QoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGRpY3QuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBzZXBhcmF0b3IgPSAnPScKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIGZvciBsaW5lIGluIGNscy5fcGFyc2VfbGlzdCh2YWx1ZSk6CiAgICAgICAgICAgIGtleSwgc2VwLCB2YWwgPSBsaW5lLnBhcnRpdGlvbihzZXBhcmF0b3IpCiAgICAgICAgICAgIGlmIHNlcCAhPSBzZXBhcmF0b3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSB0byBkaWN0OiAlcycgJSB2YWx1ZSkKICAgICAgICAgICAgcmVzdWx0W2tleS5zdHJpcCgpXSA9IHZhbC5zdHJpcCgpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfYm9vbChjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGJvb2xlYW4uCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGJvb2wKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHZhbHVlLmxvd2VyKCkKICAgICAgICByZXR1cm4gdmFsdWUgaW4gKCcxJywgJ3RydWUnLCAneWVzJykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZmlsZShjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgc3RyaW5nLCBhbGxvd2luZyBpbmNsdWRpbmcgdGV4dAogICAgICAgIGZyb20gbmVhcmVzdCBmaWxlcyB1c2luZyBgZmlsZTpgIGRpcmVjdGl2ZS4KCiAgICAgICAgRGlyZWN0aXZlIGlzIHNhbmRib3hlZCBhbmQgd29uJ3QgcmVhY2ggYW55dGhpbmcgb3V0c2lkZQogICAgICAgIGRpcmVjdG9yeSB3aXRoIHNldHVwLnB5LgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgZmlsZTogTElDRU5TRQogICAgICAgICAgICBmaWxlOiBSRUFETUUucnN0LCBDSEFOR0VMT0cubWQsIHNyYy9maWxlLnR4dAoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZV9kaXJlY3RpdmUgPSAnZmlsZTonCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoaW5jbHVkZV9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgc3BlYyA9IHZhbHVlW2xlbihpbmNsdWRlX2RpcmVjdGl2ZSk6XQogICAgICAgIGZpbGVwYXRocyA9IChvcy5wYXRoLmFic3BhdGgocGF0aC5zdHJpcCgpKSBmb3IgcGF0aCBpbiBzcGVjLnNwbGl0KCcsJykpCiAgICAgICAgcmV0dXJuICdcbicuam9pbigKICAgICAgICAgICAgY2xzLl9yZWFkX2ZpbGUocGF0aCkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZmlsZXBhdGhzCiAgICAgICAgICAgIGlmIChjbHMuX2Fzc2VydF9sb2NhbChwYXRoKSBvciBUcnVlKQogICAgICAgICAgICBhbmQgb3MucGF0aC5pc2ZpbGUocGF0aCkKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hc3NlcnRfbG9jYWwoZmlsZXBhdGgpOgogICAgICAgIGlmIG5vdCBmaWxlcGF0aC5zdGFydHN3aXRoKG9zLmdldGN3ZCgpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnYGZpbGU6YCBkaXJlY3RpdmUgY2FuIG5vdCBhY2Nlc3MgJXMnICUgZmlsZXBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZWFkX2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHdpdGggaW8ub3BlbihmaWxlcGF0aCwgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2F0dHIoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIG1vZHVsZSBhdHRyaWJ1dGUuCgogICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICBhdHRyOiBwYWNrYWdlLmF0dHIKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5tb2R1bGUuYXR0cgoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgYXR0cl9kaXJlY3RpdmUgPSAnYXR0cjonCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoYXR0cl9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgYXR0cnNfcGF0aCA9IHZhbHVlLnJlcGxhY2UoYXR0cl9kaXJlY3RpdmUsICcnKS5zdHJpcCgpLnNwbGl0KCcuJykKICAgICAgICBhdHRyX25hbWUgPSBhdHRyc19wYXRoLnBvcCgpCgogICAgICAgIG1vZHVsZV9uYW1lID0gJy4nLmpvaW4oYXR0cnNfcGF0aCkKICAgICAgICBtb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lIG9yICdfX2luaXRfXycKCiAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmdldGN3ZCgpKQogICAgICAgIHRyeToKICAgICAgICAgICAgbW9kdWxlID0gaW1wb3J0X21vZHVsZShtb2R1bGVfbmFtZSkKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG1vZHVsZSwgYXR0cl9uYW1lKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aCA9IHN5cy5wYXRoWzE6XQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3BhcnNlcl9jb21wb3VuZChjbHMsICpwYXJzZV9tZXRob2RzKToKICAgICAgICAiIiJSZXR1cm5zIHBhcnNlciBmdW5jdGlvbiB0byByZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgUGFyc2VzIGEgdmFsdWUgYXBwbHlpbmcgZ2l2ZW4gbWV0aG9kcyBvbmUgYWZ0ZXIgYW5vdGhlci4KCiAgICAgICAgOnBhcmFtIHBhcnNlX21ldGhvZHM6CiAgICAgICAgOnJ0eXBlOiBjYWxsYWJsZQogICAgICAgICIiIgogICAgICAgIGRlZiBwYXJzZSh2YWx1ZSk6CiAgICAgICAgICAgIHBhcnNlZCA9IHZhbHVlCgogICAgICAgICAgICBmb3IgbWV0aG9kIGluIHBhcnNlX21ldGhvZHM6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSBtZXRob2QocGFyc2VkKQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgICAgICByZXR1cm4gcGFyc2UKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2Vfc2VjdGlvbl90b19kaWN0KGNscywgc2VjdGlvbl9vcHRpb25zLCB2YWx1ZXNfcGFyc2VyPU5vbmUpOgogICAgICAgICIiIlBhcnNlcyBzZWN0aW9uIG9wdGlvbnMgaW50byBhIGRpY3Rpb25hcnkuCgogICAgICAgIE9wdGlvbmFsbHkgYXBwbGllcyBhIGdpdmVuIHBhcnNlciB0byB2YWx1ZXMuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICA6cGFyYW0gY2FsbGFibGUgdmFsdWVzX3BhcnNlcjoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHt9CiAgICAgICAgdmFsdWVzX3BhcnNlciA9IHZhbHVlc19wYXJzZXIgb3IgKGxhbWJkYSB2YWw6IHZhbCkKICAgICAgICBmb3Iga2V5LCAoXywgdmFsKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdmFsdWVba2V5XSA9IHZhbHVlc19wYXJzZXIodmFsKQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgZm9yIChuYW1lLCAoXywgdmFsdWUpKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzICAjIEtlZXAgc2lsZW50IGZvciBhIG5ldyBvcHRpb24gbWF5IGFwcGVhciBhbnl0aW1lLgoKICAgIGRlZiBwYXJzZShzZWxmKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlIGl0ZW1zIGZyb20gb25lCiAgICAgICAgb3IgbW9yZSByZWxhdGVkIHNlY3Rpb25zLgoKICAgICAgICAiIiIKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gc2VsZi5zZWN0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnJwogICAgICAgICAgICBpZiBzZWN0aW9uX25hbWU6ICAjIFtzZWN0aW9uLm9wdGlvbl0gdmFyaWFudAogICAgICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnXyVzJyAlIHNlY3Rpb25fbmFtZQoKICAgICAgICAgICAgc2VjdGlvbl9wYXJzZXJfbWV0aG9kID0gZ2V0YXR0cigKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAjIERvdHMgaW4gc2VjdGlvbiBuYW1lcyBhcmUgdHJhbmxzYXRlZCBpbnRvIGR1bmRlcnNjb3Jlcy4KICAgICAgICAgICAgICAgICgncGFyc2Vfc2VjdGlvbiVzJyAlIG1ldGhvZF9wb3N0Zml4KS5yZXBsYWNlKCcuJywgJ19fJyksCiAgICAgICAgICAgICAgICBOb25lKQoKICAgICAgICAgICAgaWYgc2VjdGlvbl9wYXJzZXJfbWV0aG9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWQgZGlzdHJpYnV0aW9uIG9wdGlvbiBzZWN0aW9uOiBbJXMuJXNdJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWN0aW9uX3ByZWZpeCwgc2VjdGlvbl9uYW1lKSkKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZChzZWN0aW9uX29wdGlvbnMpCgoKY2xhc3MgQ29uZmlnTWV0YWRhdGFIYW5kbGVyKENvbmZpZ0hhbmRsZXIpOgoKICAgIHNlY3Rpb25fcHJlZml4ID0gJ21ldGFkYXRhJwoKICAgIGFsaWFzZXMgPSB7CiAgICAgICAgJ2hvbWVfcGFnZSc6ICd1cmwnLAogICAgICAgICdzdW1tYXJ5JzogJ2Rlc2NyaXB0aW9uJywKICAgICAgICAnY2xhc3NpZmllcic6ICdjbGFzc2lmaWVycycsCiAgICAgICAgJ3BsYXRmb3JtJzogJ3BsYXRmb3JtcycsCiAgICB9CgogICAgc3RyaWN0X21vZGUgPSBGYWxzZQogICAgIiIiV2UgbmVlZCB0byBrZWVwIGl0IGxvb3NlLCB0byBiZSBwYXJ0aWFsbHkgY29tcGF0aWJsZSB3aXRoCiAgICBgcGJyYCBhbmQgYGQydG8xYCBwYWNrYWdlcyB3aGljaCBhbHNvIHVzZXMgYG1ldGFkYXRhYCBzZWN0aW9uLgoKICAgICIiIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfZmlsZSA9IHNlbGYuX3BhcnNlX2ZpbGUKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3BsYXRmb3Jtcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdrZXl3b3Jkcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdwcm92aWRlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdyZXF1aXJlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdvYnNvbGV0ZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnY2xhc3NpZmllcnMnOiBzZWxmLl9nZXRfcGFyc2VyX2NvbXBvdW5kKHBhcnNlX2ZpbGUsIHBhcnNlX2xpc3QpLAogICAgICAgICAgICAnbGljZW5zZSc6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBzZWxmLl9wYXJzZV92ZXJzaW9uLAogICAgICAgIH0KCiAgICBkZWYgX3BhcnNlX3ZlcnNpb24oc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgdmVyc2lvbmAgb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuX3BhcnNlX2F0dHIodmFsdWUpCgogICAgICAgIGlmIGNhbGxhYmxlKHZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbigpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIodmVyc2lvbiwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJyVzJyAlIHZlcnNpb24KCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCgpjbGFzcyBDb25maWdPcHRpb25zSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdvcHRpb25zJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfbGlzdF9zZW1pY29sb24gPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgcGFyc2VfYm9vbCA9IHNlbGYuX3BhcnNlX2Jvb2wKICAgICAgICBwYXJzZV9kaWN0ID0gc2VsZi5fcGFyc2VfZGljdAoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnemlwX3NhZmUnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAndXNlXzJ0bzMnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAnaW5jbHVkZV9wYWNrYWdlX2RhdGEnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAncGFja2FnZV9kaXInOiBwYXJzZV9kaWN0LAogICAgICAgICAgICAndXNlXzJ0bzNfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NvbnZlcnRfMnRvM19kb2N0ZXN0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdzY3JpcHRzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2VhZ2VyX3Jlc291cmNlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdkZXBlbmRlbmN5X2xpbmtzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ25hbWVzcGFjZV9wYWNrYWdlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdpbnN0YWxsX3JlcXVpcmVzJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICdzZXR1cF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAndGVzdHNfcmVxdWlyZSc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAncGFja2FnZXMnOiBzZWxmLl9wYXJzZV9wYWNrYWdlcywKICAgICAgICAgICAgJ2VudHJ5X3BvaW50cyc6IHNlbGYuX3BhcnNlX2ZpbGUsCiAgICAgICAgICAgICdweV9tb2R1bGVzJzogcGFyc2VfbGlzdCwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV9wYWNrYWdlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlc2Agb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBsaXN0CiAgICAgICAgIiIiCiAgICAgICAgZmluZF9kaXJlY3RpdmUgPSAnZmluZDonCgogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGZpbmRfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2xpc3QodmFsdWUpCgogICAgICAgICMgUmVhZCBmdW5jdGlvbiBhcmd1bWVudHMgZnJvbSBhIGRlZGljYXRlZCBzZWN0aW9uLgogICAgICAgIGZpbmRfa3dhcmdzID0gc2VsZi5wYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKAogICAgICAgICAgICBzZWxmLnNlY3Rpb25zLmdldCgncGFja2FnZXMuZmluZCcsIHt9KSkKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBmaW5kX3BhY2thZ2VzCgogICAgICAgIHJldHVybiBmaW5kX3BhY2thZ2VzKCoqZmluZF9rd2FyZ3MpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZXNfX2ZpbmQoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VzLmZpbmRgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICBUbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggX3BhcnNlX3BhY2thZ2VzKCkuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWN0aW9uX2RhdGEgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgdmFsaWRfa2V5cyA9IFsnd2hlcmUnLCAnaW5jbHVkZScsICdleGNsdWRlJ10KCiAgICAgICAgZmluZF9rd2FyZ3MgPSBkaWN0KAogICAgICAgICAgICBbKGssIHYpIGZvciBrLCB2IGluIHNlY3Rpb25fZGF0YS5pdGVtcygpIGlmIGsgaW4gdmFsaWRfa2V5cyBhbmQgdl0pCgogICAgICAgIHdoZXJlID0gZmluZF9rd2FyZ3MuZ2V0KCd3aGVyZScpCiAgICAgICAgaWYgd2hlcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbmRfa3dhcmdzWyd3aGVyZSddID0gd2hlcmVbMF0gICMgY2FzdCBsaXN0IHRvIHNpbmdsZSB2YWwKCiAgICAgICAgcmV0dXJuIGZpbmRfa3dhcmdzCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZW50cnlfcG9pbnRzKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBlbnRyeV9wb2ludHNgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKICAgICAgICBzZWxmWydlbnRyeV9wb2ludHMnXSA9IHBhcnNlZAoKICAgIGRlZiBfcGFyc2VfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgcm9vdCA9IHBhcnNlZC5nZXQoJyonKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHBhcnNlZFsnJ10gPSByb290CiAgICAgICAgICAgIGRlbCBwYXJzZWRbJyonXQoKICAgICAgICByZXR1cm4gcGFyc2VkCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsncGFja2FnZV9kYXRhJ10gPSBzZWxmLl9wYXJzZV9wYWNrYWdlX2RhdGEoc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4Y2x1ZGVfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleGNsdWRlX3BhY2thZ2VfZGF0YWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWxmWydleGNsdWRlX3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZXh0cmFzX3JlcXVpcmUoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGV4dHJhc19yZXF1aXJlYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgc2VsZlsnZXh0cmFzX3JlcXVpcmUnXSA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdCgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zLCBwYXJzZV9saXN0KQpQSwMEFAAAAAAAAAAhABoiBDKnAwAApwMAAC4AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2RlcF91dGlsLnB5ZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyX2dyb3VwCgojIHllcywgdGhpcyBpcyB3YXMgYWxtb3N0IGVudGlyZWx5IGNvcHktcGFzdGVkIGZyb20KIyAnbmV3ZXJfcGFpcndpc2UoKScsIHRoaXMgaXMganVzdCBhbm90aGVyIGNvbnZlbmllbmNlCiMgZnVuY3Rpb24uCmRlZiBuZXdlcl9wYWlyd2lzZV9ncm91cChzb3VyY2VzX2dyb3VwcywgdGFyZ2V0cyk6CiAgICAiIiJXYWxrIGJvdGggYXJndW1lbnRzIGluIHBhcmFsbGVsLCB0ZXN0aW5nIGlmIGVhY2ggc291cmNlIGdyb3VwIGlzIG5ld2VyCiAgICB0aGFuIGl0cyBjb3JyZXNwb25kaW5nIHRhcmdldC4gUmV0dXJucyBhIHBhaXIgb2YgbGlzdHMgKHNvdXJjZXNfZ3JvdXBzLAogICAgdGFyZ2V0cykgd2hlcmUgc291cmNlcyBpcyBuZXdlciB0aGFuIHRhcmdldCwgYWNjb3JkaW5nIHRvIHRoZSBzZW1hbnRpY3MKICAgIG9mICduZXdlcl9ncm91cCgpJy4KICAgICIiIgogICAgaWYgbGVuKHNvdXJjZXNfZ3JvdXBzKSAhPSBsZW4odGFyZ2V0cyk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3NvdXJjZXNfZ3JvdXAnIGFuZCAndGFyZ2V0cycgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgiKQoKICAgICMgYnVpbGQgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywgdGFyZ2V0cykgd2hlcmUgc291cmNlIGlzIG5ld2VyCiAgICBuX3NvdXJjZXMgPSBbXQogICAgbl90YXJnZXRzID0gW10KICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3VyY2VzX2dyb3VwcykpOgogICAgICAgIGlmIG5ld2VyX2dyb3VwKHNvdXJjZXNfZ3JvdXBzW2ldLCB0YXJnZXRzW2ldKToKICAgICAgICAgICAgbl9zb3VyY2VzLmFwcGVuZChzb3VyY2VzX2dyb3Vwc1tpXSkKICAgICAgICAgICAgbl90YXJnZXRzLmFwcGVuZCh0YXJnZXRzW2ldKQoKICAgIHJldHVybiBuX3NvdXJjZXMsIG5fdGFyZ2V0cwpQSwMEFAAAAAAAAAAhAFspLWrNFgAAzRYAAC0AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2RlcGVuZHMucHlpbXBvcnQgc3lzCmltcG9ydCBpbXAKaW1wb3J0IG1hcnNoYWwKZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbgpmcm9tIGltcCBpbXBvcnQgUEtHX0RJUkVDVE9SWSwgUFlfQ09NUElMRUQsIFBZX1NPVVJDRSwgUFlfRlJPWkVOCgpmcm9tIC5weTMzY29tcGF0IGltcG9ydCBCeXRlY29kZQoKCl9fYWxsX18gPSBbCiAgICAnUmVxdWlyZScsICdmaW5kX21vZHVsZScsICdnZXRfbW9kdWxlX2NvbnN0YW50JywgJ2V4dHJhY3RfY29uc3RhbnQnCl0KCgpjbGFzcyBSZXF1aXJlOgogICAgIiIiQSBwcmVyZXF1aXNpdGUgdG8gYnVpbGRpbmcgb3IgaW5zdGFsbGluZyBhIGRpc3RyaWJ1dGlvbiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCByZXF1ZXN0ZWRfdmVyc2lvbiwgbW9kdWxlLCBob21lcGFnZT0nJywKICAgICAgICAgICAgYXR0cmlidXRlPU5vbmUsIGZvcm1hdD1Ob25lKToKCiAgICAgICAgaWYgZm9ybWF0IGlzIE5vbmUgYW5kIHJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3JtYXQgPSBTdHJpY3RWZXJzaW9uCgogICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVxdWVzdGVkX3ZlcnNpb24gPSBmb3JtYXQocmVxdWVzdGVkX3ZlcnNpb24pCiAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gJ19fdmVyc2lvbl9fJwoKICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShsb2NhbHMoKSkKICAgICAgICBkZWwgc2VsZi5zZWxmCgogICAgZGVmIGZ1bGxfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gZnVsbCBwYWNrYWdlL2Rpc3RyaWJ1dGlvbiBuYW1lLCB3L3ZlcnNpb24iIiIKICAgICAgICBpZiBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYucmVxdWVzdGVkX3ZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiB2ZXJzaW9uX29rKHNlbGYsIHZlcnNpb24pOgogICAgICAgICIiIklzICd2ZXJzaW9uJyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZT8iIiIKICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWJ1dGUgaXMgTm9uZSBvciBzZWxmLmZvcm1hdCBpcyBOb25lIG9yIFwKICAgICAgICAgICAgc3RyKHZlcnNpb24pICE9ICJ1bmtub3duIiBhbmQgdmVyc2lvbiA+PSBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uCgogICAgZGVmIGdldF92ZXJzaW9uKHNlbGYsIHBhdGhzPU5vbmUsIGRlZmF1bHQ9InVua25vd24iKToKICAgICAgICAiIiJHZXQgdmVyc2lvbiBudW1iZXIgb2YgaW5zdGFsbGVkIG1vZHVsZSwgJ05vbmUnLCBvciAnZGVmYXVsdCcKCiAgICAgICAgU2VhcmNoICdwYXRocycgZm9yIG1vZHVsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJuICdOb25lJy4gIElmIGZvdW5kLAogICAgICAgIHJldHVybiB0aGUgZXh0cmFjdGVkIHZlcnNpb24gYXR0cmlidXRlLCBvciAnZGVmYXVsdCcgaWYgbm8gdmVyc2lvbgogICAgICAgIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvciB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgd2l0aG91dAogICAgICAgIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhlIHZlcnNpb24gaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKICAgICAgICByZXF1aXJlbWVudCdzIHZlcnNpb24gZm9ybWF0IChpZiBhbnkpLCB1bmxlc3MgaXQgaXMgJ05vbmUnIG9yIHRoZQogICAgICAgIHN1cHBsaWVkICdkZWZhdWx0Jy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgc2VsZi5hdHRyaWJ1dGUgaXMgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZiwgcCwgaSA9IGZpbmRfbW9kdWxlKHNlbGYubW9kdWxlLCBwYXRocykKICAgICAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB2ID0gZ2V0X21vZHVsZV9jb25zdGFudChzZWxmLm1vZHVsZSwgc2VsZi5hdHRyaWJ1dGUsIGRlZmF1bHQsIHBhdGhzKQoKICAgICAgICBpZiB2IGlzIG5vdCBOb25lIGFuZCB2IGlzIG5vdCBkZWZhdWx0IGFuZCBzZWxmLmZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0KHYpCgogICAgICAgIHJldHVybiB2CgogICAgZGVmIGlzX3ByZXNlbnQoc2VsZiwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IG9uICdwYXRocyciIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmVyc2lvbihwYXRocykgaXMgbm90IE5vbmUKCiAgICBkZWYgaXNfY3VycmVudChzZWxmLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgYW5kIHVwLXRvLWRhdGUgb24gJ3BhdGhzJyIiIgogICAgICAgIHZlcnNpb24gPSBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKQogICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9vayh2ZXJzaW9uKQoKCmRlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgogICAgIiIiSnVzdCBsaWtlICdpbXAuZmluZF9tb2R1bGUoKScsIGJ1dCB3aXRoIHBhY2thZ2Ugc3VwcG9ydCIiIgoKICAgIHBhcnRzID0gbW9kdWxlLnNwbGl0KCcuJykKCiAgICB3aGlsZSBwYXJ0czoKICAgICAgICBwYXJ0ID0gcGFydHMucG9wKDApCiAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkgPSBpbmZvID0gaW1wLmZpbmRfbW9kdWxlKHBhcnQsIHBhdGhzKQoKICAgICAgICBpZiBraW5kID09IFBLR19ESVJFQ1RPUlk6CiAgICAgICAgICAgIHBhcnRzID0gcGFydHMgb3IgWydfX2luaXRfXyddCiAgICAgICAgICAgIHBhdGhzID0gW3BhdGhdCgogICAgICAgIGVsaWYgcGFydHM6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVyIGluICVzIiAlIChwYXJ0cywgbW9kdWxlKSkKCiAgICByZXR1cm4gaW5mbwoKCmRlZiBnZXRfbW9kdWxlX2NvbnN0YW50KG1vZHVsZSwgc3ltYm9sLCBkZWZhdWx0PS0xLCBwYXRocz1Ob25lKToKICAgICIiIkZpbmQgJ21vZHVsZScgYnkgc2VhcmNoaW5nICdwYXRocycsIGFuZCBleHRyYWN0ICdzeW1ib2wnCgogICAgUmV0dXJuICdOb25lJyBpZiAnbW9kdWxlJyBkb2VzIG5vdCBleGlzdCBvbiAncGF0aHMnLCBvciBpdCBkb2VzIG5vdCBkZWZpbmUKICAgICdzeW1ib2wnLiAgSWYgdGhlIG1vZHVsZSBkZWZpbmVzICdzeW1ib2wnIGFzIGEgY29uc3RhbnQsIHJldHVybiB0aGUKICAgIGNvbnN0YW50LiAgT3RoZXJ3aXNlLCByZXR1cm4gJ2RlZmF1bHQnLiIiIgoKICAgIHRyeToKICAgICAgICBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSA9IGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHMpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBNb2R1bGUgZG9lc24ndCBleGlzdAogICAgICAgIHJldHVybiBOb25lCgogICAgdHJ5OgogICAgICAgIGlmIGtpbmQgPT0gUFlfQ09NUElMRUQ6CiAgICAgICAgICAgIGYucmVhZCg4KSAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICAgICAgZWxpZiBraW5kID09IFBZX0ZST1pFTjoKICAgICAgICAgICAgY29kZSA9IGltcC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUpCiAgICAgICAgZWxpZiBraW5kID09IFBZX1NPVVJDRToKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE5vdCBzb21ldGhpbmcgd2UgY2FuIHBhcnNlOyB3ZSdsbCBoYXZlIHRvIGltcG9ydCBpdC4gIDooCiAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUobW9kdWxlLCBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSkKICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kdWxlXSwgc3ltYm9sLCBOb25lKQoKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgZjoKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgcmV0dXJuIGV4dHJhY3RfY29uc3RhbnQoY29kZSwgc3ltYm9sLCBkZWZhdWx0KQoKCmRlZiBleHRyYWN0X2NvbnN0YW50KGNvZGUsIHN5bWJvbCwgZGVmYXVsdD0tMSk6CiAgICAiIiJFeHRyYWN0IHRoZSBjb25zdGFudCB2YWx1ZSBvZiAnc3ltYm9sJyBmcm9tICdjb2RlJwoKICAgIElmIHRoZSBuYW1lICdzeW1ib2wnIGlzIGJvdW5kIHRvIGEgY29uc3RhbnQgdmFsdWUgYnkgdGhlIFB5dGhvbiBjb2RlCiAgICBvYmplY3QgJ2NvZGUnLCByZXR1cm4gdGhhdCB2YWx1ZS4gIElmICdzeW1ib2wnIGlzIGJvdW5kIHRvIGFuIGV4cHJlc3Npb24sCiAgICByZXR1cm4gJ2RlZmF1bHQnLiAgT3RoZXJ3aXNlLCByZXR1cm4gJ05vbmUnLgoKICAgIFJldHVybiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgZmlyc3QgYXNzaWdubWVudCB0byAnc3ltYm9sJy4gICdzeW1ib2wnIG11c3QKICAgIGJlIGEgZ2xvYmFsLCBvciBhdCBsZWFzdCBhIG5vbi0iZmFzdCIgbG9jYWwgaW4gdGhlIGNvZGUgYmxvY2suICBUaGF0IGlzLAogICAgb25seSAnU1RPUkVfTkFNRScgYW5kICdTVE9SRV9HTE9CQUwnIG9wY29kZXMgYXJlIGNoZWNrZWQsIGFuZCAnc3ltYm9sJwogICAgbXVzdCBiZSBwcmVzZW50IGluICdjb2RlLmNvX25hbWVzJy4KICAgICIiIgogICAgaWYgc3ltYm9sIG5vdCBpbiBjb2RlLmNvX25hbWVzOgogICAgICAgICMgbmFtZSdzIG5vdCB0aGVyZSwgY2FuJ3QgcG9zc2libHkgYmUgYW4gYXNzaWdubWVudAogICAgICAgIHJldHVybiBOb25lCgogICAgbmFtZV9pZHggPSBsaXN0KGNvZGUuY29fbmFtZXMpLmluZGV4KHN5bWJvbCkKCiAgICBTVE9SRV9OQU1FID0gOTAKICAgIFNUT1JFX0dMT0JBTCA9IDk3CiAgICBMT0FEX0NPTlNUID0gMTAwCgogICAgY29uc3QgPSBkZWZhdWx0CgogICAgZm9yIGJ5dGVfY29kZSBpbiBCeXRlY29kZShjb2RlKToKICAgICAgICBvcCA9IGJ5dGVfY29kZS5vcGNvZGUKICAgICAgICBhcmcgPSBieXRlX2NvZGUuYXJnCgogICAgICAgIGlmIG9wID09IExPQURfQ09OU1Q6CiAgICAgICAgICAgIGNvbnN0ID0gY29kZS5jb19jb25zdHNbYXJnXQogICAgICAgIGVsaWYgYXJnID09IG5hbWVfaWR4IGFuZCAob3AgPT0gU1RPUkVfTkFNRSBvciBvcCA9PSBTVE9SRV9HTE9CQUwpOgogICAgICAgICAgICByZXR1cm4gY29uc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25zdCA9IGRlZmF1bHQKCgpkZWYgX3VwZGF0ZV9nbG9iYWxzKCk6CiAgICAiIiIKICAgIFBhdGNoIHRoZSBnbG9iYWxzIHRvIHJlbW92ZSB0aGUgb2JqZWN0cyBub3QgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zLgoKICAgIFhYWCBpdCdkIGJlIGJldHRlciB0byB0ZXN0IGFzc2VydGlvbnMgYWJvdXQgYnl0ZWNvZGUgaW5zdGVhZC4KICAgICIiIgoKICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpIGFuZCBzeXMucGxhdGZvcm0gIT0gJ2NsaSc6CiAgICAgICAgcmV0dXJuCiAgICBpbmNvbXBhdGlibGUgPSAnZXh0cmFjdF9jb25zdGFudCcsICdnZXRfbW9kdWxlX2NvbnN0YW50JwogICAgZm9yIG5hbWUgaW4gaW5jb21wYXRpYmxlOgogICAgICAgIGRlbCBnbG9iYWxzKClbbmFtZV0KICAgICAgICBfX2FsbF9fLnJlbW92ZShuYW1lKQoKCl91cGRhdGVfZ2xvYmFscygpClBLAwQUAAAAAAAAACEAJXSHBZCdAACQnQAAKgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGlzdC5weV9fYWxsX18gPSBbJ0Rpc3RyaWJ1dGlvbiddCgppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgbnVtYmVycwppbXBvcnQgZGlzdHV0aWxzLmxvZwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5jbWQKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmltcG9ydCBpdGVydG9vbHMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoCiAgICBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzU2V0dXBFcnJvciwKKQpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCByZmM4MjJfZXNjYXBlCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gc2V0dXB0b29scyBpbXBvcnQgd2luZG93c19zdXBwb3J0CmZyb20gc2V0dXB0b29scy5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKZnJvbSBzZXR1cHRvb2xzLmNvbmZpZyBpbXBvcnQgcGFyc2VfY29uZmlndXJhdGlvbgppbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIC5weTM2Y29tcGF0IGltcG9ydCBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzCgpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKCgpkZWYgX2dldF91bnBhdGNoZWQoY2xzKToKICAgIHdhcm5pbmdzLndhcm4oIkRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChjbHMpCgoKIyBCYXNlZCBvbiBQeXRob24gMy41IHZlcnNpb24KZGVmIHdyaXRlX3BrZ19maWxlKHNlbGYsIGZpbGUpOgogICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZvcm1hdCBkYXRhIHRvIGEgZmlsZSBvYmplY3QuCiAgICAiIiIKICAgIHZlcnNpb24gPSAnMS4wJwogICAgaWYgKHNlbGYucHJvdmlkZXMgb3Igc2VsZi5yZXF1aXJlcyBvciBzZWxmLm9ic29sZXRlcyBvcgogICAgICAgICAgICBzZWxmLmNsYXNzaWZpZXJzIG9yIHNlbGYuZG93bmxvYWRfdXJsKToKICAgICAgICB2ZXJzaW9uID0gJzEuMScKICAgICMgU2V0dXB0b29scyBzcGVjaWZpYyBmb3IgUEVQIDM0NQogICAgaWYgaGFzYXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJyk6CiAgICAgICAgdmVyc2lvbiA9ICcxLjInCgogICAgZmlsZS53cml0ZSgnTWV0YWRhdGEtVmVyc2lvbjogJXNcbicgJSB2ZXJzaW9uKQogICAgZmlsZS53cml0ZSgnTmFtZTogJXNcbicgJSBzZWxmLmdldF9uYW1lKCkpCiAgICBmaWxlLndyaXRlKCdWZXJzaW9uOiAlc1xuJyAlIHNlbGYuZ2V0X3ZlcnNpb24oKSkKICAgIGZpbGUud3JpdGUoJ1N1bW1hcnk6ICVzXG4nICUgc2VsZi5nZXRfZGVzY3JpcHRpb24oKSkKICAgIGZpbGUud3JpdGUoJ0hvbWUtcGFnZTogJXNcbicgJSBzZWxmLmdldF91cmwoKSkKICAgIGZpbGUud3JpdGUoJ0F1dGhvcjogJXNcbicgJSBzZWxmLmdldF9jb250YWN0KCkpCiAgICBmaWxlLndyaXRlKCdBdXRob3ItZW1haWw6ICVzXG4nICUgc2VsZi5nZXRfY29udGFjdF9lbWFpbCgpKQogICAgZmlsZS53cml0ZSgnTGljZW5zZTogJXNcbicgJSBzZWxmLmdldF9saWNlbnNlKCkpCiAgICBpZiBzZWxmLmRvd25sb2FkX3VybDoKICAgICAgICBmaWxlLndyaXRlKCdEb3dubG9hZC1VUkw6ICVzXG4nICUgc2VsZi5kb3dubG9hZF91cmwpCgogICAgbG9uZ19kZXNjX2NvbnRlbnRfdHlwZSA9IGdldGF0dHIoCiAgICAgICAgc2VsZiwKICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUnLAogICAgICAgIE5vbmUKICAgICkgb3IgJ1VOS05PV04nCiAgICBmaWxlLndyaXRlKCdEZXNjcmlwdGlvbi1Db250ZW50LVR5cGU6ICVzXG4nICUgbG9uZ19kZXNjX2NvbnRlbnRfdHlwZSkKCiAgICBsb25nX2Rlc2MgPSByZmM4MjJfZXNjYXBlKHNlbGYuZ2V0X2xvbmdfZGVzY3JpcHRpb24oKSkKICAgIGZpbGUud3JpdGUoJ0Rlc2NyaXB0aW9uOiAlc1xuJyAlIGxvbmdfZGVzYykKCiAgICBrZXl3b3JkcyA9ICcsJy5qb2luKHNlbGYuZ2V0X2tleXdvcmRzKCkpCiAgICBpZiBrZXl3b3JkczoKICAgICAgICBmaWxlLndyaXRlKCdLZXl3b3JkczogJXNcbicgJSBrZXl3b3JkcykKCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQbGF0Zm9ybScsIHNlbGYuZ2V0X3BsYXRmb3JtcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnQ2xhc3NpZmllcicsIHNlbGYuZ2V0X2NsYXNzaWZpZXJzKCkpCgogICAgIyBQRVAgMzE0CiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdSZXF1aXJlcycsIHNlbGYuZ2V0X3JlcXVpcmVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQcm92aWRlcycsIHNlbGYuZ2V0X3Byb3ZpZGVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdPYnNvbGV0ZXMnLCBzZWxmLmdldF9vYnNvbGV0ZXMoKSkKCiAgICAjIFNldHVwdG9vbHMgc3BlY2lmaWMgZm9yIFBFUCAzNDUKICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycpOgogICAgICAgIGZpbGUud3JpdGUoJ1JlcXVpcmVzLVB5dGhvbjogJXNcbicgJSBzZWxmLnB5dGhvbl9yZXF1aXJlcykKCgojIGZyb20gUHl0aG9uIDMuNApkZWYgd3JpdGVfcGtnX2luZm8oc2VsZiwgYmFzZV9kaXIpOgogICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZpbGUgaW50byB0aGUgcmVsZWFzZSB0cmVlLgogICAgIiIiCiAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGJhc2VfZGlyLCAnUEtHLUlORk8nKSwgJ3cnLAogICAgICAgICAgICAgIGVuY29kaW5nPSdVVEYtOCcpIGFzIHBrZ19pbmZvOgogICAgICAgIHNlbGYud3JpdGVfcGtnX2ZpbGUocGtnX2luZm8pCgoKc2VxdWVuY2UgPSB0dXBsZSwgbGlzdAoKCmRlZiBjaGVja19pbXBvcnRhYmxlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIHRyeToKICAgICAgICBlcCA9IHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZSgneD0nICsgdmFsdWUpCiAgICAgICAgYXNzZXJ0IG5vdCBlcC5leHRyYXMKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGltcG9ydGFibGUgJ21vZHVsZTphdHRycycgc3RyaW5nIChnb3QgJXIpIgogICAgICAgICAgICAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHN0cmluZyBsaXN0IG9yIE5vbmUiIiIKICAgIHRyeToKICAgICAgICBhc3NlcnQgJycuam9pbih2YWx1ZSkgIT0gdmFsdWUKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIiAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGNoZWNrX25zcChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBuYW1lc3BhY2UgcGFja2FnZXMgYXJlIHZhbGlkIiIiCiAgICBuc19wYWNrYWdlcyA9IHZhbHVlCiAgICBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgbnNfcGFja2FnZXMpCiAgICBmb3IgbnNwIGluIG5zX3BhY2thZ2VzOgogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IobnNwKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gY29udGFpbnMgbm8gbW9kdWxlcyBvciBwYWNrYWdlcyBmb3IgIiArCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIHBhY2thZ2UgJXIiICUgbnNwCiAgICAgICAgICAgICkKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBuc3AucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50IGFuZCBwYXJlbnQgbm90IGluIG5zX3BhY2thZ2VzOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgaXMgZGVjbGFyZWQgYXMgYSBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0ICVyIgogICAgICAgICAgICAgICAgIiBpcyBub3Q6IHBsZWFzZSBjb3JyZWN0IHRoaXMgaW4gc2V0dXAucHkiLCBuc3AsIHBhcmVudAogICAgICAgICAgICApCgoKZGVmIGNoZWNrX2V4dHJhcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBleHRyYXNfcmVxdWlyZSBtYXBwaW5nIGlzIHZhbGlkIiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChpdGVydG9vbHMuc3Rhcm1hcChfY2hlY2tfZXh0cmEsIHZhbHVlLml0ZW1zKCkpKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJ2V4dHJhc19yZXF1aXJlJyBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSB2YWx1ZXMgYXJlICIKICAgICAgICAgICAgInN0cmluZ3Mgb3IgbGlzdHMgb2Ygc3RyaW5ncyBjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiAiCiAgICAgICAgICAgICJyZXF1aXJlbWVudCBzcGVjaWZpZXJzLiIKICAgICAgICApCgoKZGVmIF9jaGVja19leHRyYShleHRyYSwgcmVxcyk6CiAgICBuYW1lLCBzZXAsIG1hcmtlciA9IGV4dHJhLnBhcnRpdGlvbignOicpCiAgICBpZiBtYXJrZXIgYW5kIHBrZ19yZXNvdXJjZXMuaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJJbnZhbGlkIGVudmlyb25tZW50IG1hcmtlcjogIiArIG1hcmtlcikKICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCgoKZGVmIGFzc2VydF9ib29sKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIFRydWUsIEZhbHNlLCAwLCBvciAxIiIiCiAgICBpZiBib29sKHZhbHVlKSAhPSB2YWx1ZToKICAgICAgICB0bXBsID0gInthdHRyIXJ9IG11c3QgYmUgYSBib29sZWFuIHZhbHVlIChnb3Qge3ZhbHVlIXJ9KSIKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgdmFsdWU9dmFsdWUpKQoKCmRlZiBjaGVja19yZXF1aXJlbWVudHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgaW5zdGFsbF9yZXF1aXJlcyBpcyBhIHZhbGlkIHJlcXVpcmVtZW50cyBsaXN0IiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2YWx1ZSkpCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGRpY3QsIHNldCkpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVub3JkZXJlZCB0eXBlcyBhcmUgbm90IGFsbG93ZWQiKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19zcGVjaWZpZXIoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllciIiIgogICAgdHJ5OgogICAgICAgIHBhY2thZ2luZy5zcGVjaWZpZXJzLlNwZWNpZmllclNldCh2YWx1ZSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcuc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nICIKICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19lbnRyeV9wb2ludHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZW50cnlfcG9pbnRzIG1hcCBpcyBwYXJzZWFibGUiIiIKICAgIHRyeToKICAgICAgICBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKHZhbHVlKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKGUpCgoKZGVmIGNoZWNrX3Rlc3Rfc3VpdGUoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoInRlc3Rfc3VpdGUgbXVzdCBiZSBhIHN0cmluZyIpCgoKZGVmIGNoZWNrX3BhY2thZ2VfZGF0YShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIGRpY3Rpb25hcnkgb2YgcGFja2FnZSBuYW1lcyB0byBnbG9iIGxpc3RzIiIiCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICBmb3IgaywgdiBpbiB2YWx1ZS5pdGVtcygpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLCBzdHIpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXRlcih2KQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgYXR0ciArICIgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mICIKICAgICAgICAid2lsZGNhcmQgcGF0dGVybnMiCiAgICApCgoKZGVmIGNoZWNrX3BhY2thZ2VzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGZvciBwa2duYW1lIGluIHZhbHVlOgogICAgICAgIGlmIG5vdCByZS5tYXRjaChyJ1x3KyhcLlx3KykqJywgcGtnbmFtZSk6CiAgICAgICAgICAgIGRpc3R1dGlscy5sb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAlciBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWU7IHBsZWFzZSB1c2Ugb25seSAiCiAgICAgICAgICAgICAgICAiLi1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lcyBpbiBzZXR1cC5weSIsIHBrZ25hbWUKICAgICAgICAgICAgKQoKCl9EaXN0cmlidXRpb24gPSBnZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbikKCgpjbGFzcyBEaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlcywgX0Rpc3RyaWJ1dGlvbik6CiAgICAiIiJEaXN0cmlidXRpb24gd2l0aCBzdXBwb3J0IGZvciBmZWF0dXJlcywgdGVzdHMsIGFuZCBwYWNrYWdlIGRhdGEKCiAgICBUaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2YgJ2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbicgdGhhdAogICAgZWZmZWN0aXZlbHkgYWRkcyB0aGUgZm9sbG93aW5nIG5ldyBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byAnc2V0dXAoKSc6CgogICAgICdpbnN0YWxsX3JlcXVpcmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgcHJvamVjdAogICAgICAgIHZlcnNpb25zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiByZXF1aXJlcyB3aGVuIGluc3RhbGxlZCwgaW4gdGhlIGZvcm1hdAogICAgICAgIHVzZWQgYnkgJ3BrZ19yZXNvdXJjZXMucmVxdWlyZSgpJy4gIFRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiAgSWYgeW91IHdpc2ggdG8gdXNlCiAgICAgICAgcGFja2FnZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeVBJLCBvciB3YW50IHRvIGdpdmUgeW91ciB1c2VycyBhbgogICAgICAgIGFsdGVybmF0ZSBkb3dubG9hZCBsb2NhdGlvbiwgeW91IGNhbiBhZGQgYSAnZmluZF9saW5rcycgb3B0aW9uIHRvIHRoZQogICAgICAgICdbZWFzeV9pbnN0YWxsXScgc2VjdGlvbiBvZiB5b3VyIHByb2plY3QncyAnc2V0dXAuY2ZnJyBmaWxlLCBhbmQgdGhlbgogICAgICAgIHNldHVwdG9vbHMgd2lsbCBzY2FuIHRoZSBsaXN0ZWQgd2ViIHBhZ2VzIGZvciBsaW5rcyB0aGF0IHNhdGlzZnkgdGhlCiAgICAgICAgcmVxdWlyZW1lbnRzLgoKICAgICAnZXh0cmFzX3JlcXVpcmUnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIG9mIG9wdGlvbmFsICJleHRyYXMiIHRvIHRoZQogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQocykgdGhhdCB1c2luZyB0aG9zZSBleHRyYXMgaW5jdXJzLiBGb3IgZXhhbXBsZSwKICAgICAgICB0aGlzOjoKCiAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlID0gZGljdChyZVNUID0gWyJkb2N1dGlscz49MC4zIiwgInJlU1RlZGl0Il0pCgogICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBleHRyYQogICAgICAgIGNhcGFiaWxpdHkgY2FsbGVkICJyZVNUIiwgYnV0IGl0IGNhbiBvbmx5IGJlIHVzZWQgaWYgZG9jdXRpbHMgYW5kCiAgICAgICAgcmVTVGVkaXQgYXJlIGluc3RhbGxlZC4gIElmIHRoZSB1c2VyIGluc3RhbGxzIHlvdXIgcGFja2FnZSB1c2luZwogICAgICAgIEVhc3lJbnN0YWxsIGFuZCByZXF1ZXN0cyBvbmUgb2YgeW91ciBleHRyYXMsIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgd2lsbCBiZSBpbnN0YWxsZWQgaWYgbmVlZGVkLgoKICAgICAnZmVhdHVyZXMnICoqZGVwcmVjYXRlZCoqIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBuYW1lcyB0bwogICAgICAgICdzZXR1cHRvb2xzLkZlYXR1cmUnCiAgICAgICAgb2JqZWN0cy4gIEZlYXR1cmVzIGFyZSBhIHBvcnRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZQogICAgICAgIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGJhc2VkIG9uIHVzZXIgb3B0aW9ucywgaW50ZXItZmVhdHVyZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgYW5kIGF2YWlsYWJpbGl0eSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBFeGNsdWRlZCBmZWF0dXJlcyBhcmUgb21pdHRlZAogICAgICAgIGZyb20gYWxsIHNldHVwIGNvbW1hbmRzLCBpbmNsdWRpbmcgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucywgc28KICAgICAgICB5b3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUuCiAgICAgICAgRmVhdHVyZSBuYW1lcyBzaG91bGQgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBleGNlcHQgdGhhdCB0aGV5IG1heQogICAgICAgIGNvbnRhaW4gdGhlICctJyAobWludXMpIHNpZ24uICBGZWF0dXJlcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKICAgICAgICB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zICctLXdpdGgtWCcgYW5kICctLXdpdGhvdXQtWCcsIHdoZXJlICdYJyBpcwogICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiAgV2hldGhlciBhIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCwgYW5kCiAgICAgICAgd2hldGhlciB5b3UgYXJlIGFsbG93ZWQgdG8gY29udHJvbCB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXMKICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBGZWF0dXJlIG9iamVjdC4gIFNlZSB0aGUgJ0ZlYXR1cmUnIGNsYXNzIGZvciBtb3JlCiAgICAgICAgaW5mb3JtYXRpb24uCgogICAgICd0ZXN0X3N1aXRlJyAtLSB0aGUgbmFtZSBvZiBhIHRlc3Qgc3VpdGUgdG8gcnVuIGZvciB0aGUgJ3Rlc3QnIGNvbW1hbmQuCiAgICAgICAgSWYgdGhlIHVzZXIgcnVucyAncHl0aG9uIHNldHVwLnB5IHRlc3QnLCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCwKICAgICAgICBhbmQgdGhlIG5hbWVkIHRlc3Qgc3VpdGUgd2lsbCBiZSBydW4uICBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzCiAgICAgICAgd291bGQgYmUgdXNlZCBvbiBhICd1bml0dGVzdC5weScgY29tbWFuZCBsaW5lLiAgVGhhdCBpcywgaXQgaXMgdGhlCiAgICAgICAgZG90dGVkIG5hbWUgb2YgYW4gb2JqZWN0IHRvIGltcG9ydCBhbmQgY2FsbCB0byBnZW5lcmF0ZSBhIHRlc3Qgc3VpdGUuCgogICAgICdwYWNrYWdlX2RhdGEnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgZmlsZW5hbWVzCiAgICAgICAgb3IgZ2xvYnMgdG8gdXNlIHRvIGZpbmQgZGF0YSBmaWxlcyBjb250YWluZWQgaW4gdGhlIG5hbWVkIHBhY2thZ2VzLgogICAgICAgIElmIHRoZSBkaWN0aW9uYXJ5IGhhcyBmaWxlbmFtZXMgb3IgZ2xvYnMgbGlzdGVkIHVuZGVyICciIicgKHRoZSBlbXB0eQogICAgICAgIHN0cmluZyksIHRob3NlIG5hbWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGluIGV2ZXJ5IHBhY2thZ2UsIGluIGFkZGl0aW9uCiAgICAgICAgdG8gYW55IG5hbWVzIGZvciB0aGUgc3BlY2lmaWMgcGFja2FnZS4gIERhdGEgZmlsZXMgZm91bmQgdXNpbmcgdGhlc2UKICAgICAgICBuYW1lcy9nbG9icyB3aWxsIGJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIHRoZSBwYWNrYWdlLCBpbiB0aGUgc2FtZQogICAgICAgIGxvY2F0aW9uIGFzIHRoZSBwYWNrYWdlLiAgTm90ZSB0aGF0IGdsb2JzIGFyZSBhbGxvd2VkIHRvIHJlZmVyZW5jZQogICAgICAgIHRoZSBjb250ZW50cyBvZiBub24tcGFja2FnZSBzdWJkaXJlY3RvcmllcywgYXMgbG9uZyBhcyB5b3UgdXNlICcvJyBhcwogICAgICAgIGEgcGF0aCBzZXBhcmF0b3IuICAoR2xvYnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aHMgYXQgcnVudGltZS4pCgogICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IGtleXdvcmRzLCB0aGlzIGNsYXNzIGFsc28gaGFzIHNldmVyYWwgbmV3IG1ldGhvZHMKICAgIGZvciBtYW5pcHVsYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbidzIGNvbnRlbnRzLiAgRm9yIGV4YW1wbGUsIHRoZSAnaW5jbHVkZSgpJwogICAgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgaW4tcGxhY2UgYWRkIGFuZCBzdWJ0cmFjdAogICAgY29tbWFuZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBleHRlbnNpb25zLCBhbmQgc28gb24gZnJvbQogICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoZXkgYXJlIHVzZWQgYnkgdGhlIGZlYXR1cmUgc3Vic3lzdGVtIHRvIGNvbmZpZ3VyZSB0aGUKICAgIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBmZWF0dXJlcy4KICAgICIiIgoKICAgIF9wYXRjaGVkX2Rpc3QgPSBOb25lCgogICAgZGVmIHBhdGNoX21pc3NpbmdfcGtnX2luZm8oc2VsZiwgYXR0cnMpOgogICAgICAgICMgRmFrZSB1cCBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGF0YSB0aGF0IHdvdWxkIG5vcm1hbGx5IGNvbWUgZnJvbQogICAgICAgICMgUEtHLUlORk8sIGJ1dCB3aGljaCBtaWdodCBub3QgeWV0IGJlIGJ1aWx0IGlmIHRoaXMgaXMgYSBmcmVzaAogICAgICAgICMgY2hlY2tvdXQuCiAgICAgICAgIwogICAgICAgIGlmIG5vdCBhdHRycyBvciAnbmFtZScgbm90IGluIGF0dHJzIG9yICd2ZXJzaW9uJyBub3QgaW4gYXR0cnM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGtleSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lKHN0cihhdHRyc1snbmFtZSddKSkubG93ZXIoKQogICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleS5nZXQoa2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICAgICAgZGlzdC5fdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uKHN0cihhdHRyc1sndmVyc2lvbiddKSkKICAgICAgICAgICAgc2VsZi5fcGF0Y2hlZF9kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRycz1Ob25lKToKICAgICAgICBoYXZlX3BhY2thZ2VfZGF0YSA9IGhhc2F0dHIoc2VsZiwgInBhY2thZ2VfZGF0YSIpCiAgICAgICAgaWYgbm90IGhhdmVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHt9CiAgICAgICAgYXR0cnMgPSBhdHRycyBvciB7fQogICAgICAgIGlmICdmZWF0dXJlcycgaW4gYXR0cnMgb3IgJ3JlcXVpcmVfZmVhdHVyZXMnIGluIGF0dHJzOgogICAgICAgICAgICBGZWF0dXJlLndhcm5fZGVwcmVjYXRlZCgpCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gW10KICAgICAgICBzZWxmLmZlYXR1cmVzID0ge30KICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuc3JjX3Jvb3QgPSBhdHRycy5wb3AoInNyY19yb290IiwgTm9uZSkKICAgICAgICBzZWxmLnBhdGNoX21pc3NpbmdfcGtnX2luZm8oYXR0cnMpCiAgICAgICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSA9IGF0dHJzLmdldCgKICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJwogICAgICAgICkKICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBhdHRycy5wb3AoJ2RlcGVuZGVuY3lfbGlua3MnLCBbXSkKICAgICAgICBzZWxmLnNldHVwX3JlcXVpcmVzID0gYXR0cnMucG9wKCdzZXR1cF9yZXF1aXJlcycsIFtdKQogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFycyhzZWxmKS5zZXRkZWZhdWx0KGVwLm5hbWUsIE5vbmUpCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5fX2luaXRfXyhzZWxmLCBhdHRycykKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWV0YWRhdGEudmVyc2lvbiwgbnVtYmVycy5OdW1iZXIpOgogICAgICAgICAgICAjIFNvbWUgcGVvcGxlIGFwcGFyZW50bHkgdGFrZSAidmVyc2lvbiBudW1iZXIiIHRvbyBsaXRlcmFsbHkgOikKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gc3RyKHNlbGYubWV0YWRhdGEudmVyc2lvbikKCiAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ZXIgPSBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHNlbGYubWV0YWRhdGEudmVyc2lvbikKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiA9IHN0cih2ZXIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLm1ldGFkYXRhLnZlcnNpb24gIT0gbm9ybWFsaXplZF92ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICJOb3JtYWxpemluZyAnJXMnIHRvICclcyciICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IG5vcm1hbGl6ZWRfdmVyc2lvbgogICAgICAgICAgICBleGNlcHQgKHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAiVGhlIHZlcnNpb24gc3BlY2lmaWVkICglcikgaXMgYW4gaW52YWxpZCB2ZXJzaW9uLCB0aGlzICIKICAgICAgICAgICAgICAgICAgICAibWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgIgogICAgICAgICAgICAgICAgICAgICJzZXR1cHRvb2xzLCBwaXAsIGFuZCBQeVBJLiBQbGVhc2Ugc2VlIFBFUCA0NDAgZm9yIG1vcmUgIgogICAgICAgICAgICAgICAgICAgICJkZXRhaWxzLiIgJSBzZWxmLm1ldGFkYXRhLnZlcnNpb24KICAgICAgICAgICAgICAgICkKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIF9maW5hbGl6ZV9yZXF1aXJlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXQgYG1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlc2AgYW5kIGZpeCBlbnZpcm9ubWVudCBtYXJrZXJzCiAgICAgICAgaW4gYGluc3RhbGxfcmVxdWlyZXNgIGFuZCBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlcyA9IHNlbGYucHl0aG9uX3JlcXVpcmVzCiAgICAgICAgc2VsZi5fY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKCkKICAgICAgICBzZWxmLl9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoKQoKICAgIGRlZiBfY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgcmVxdWlyZW1lbnRzIGluIGBleHRyYXNfcmVxdWlyZWAgb2YgdGhlIGZvcm0KICAgICAgICBgImV4dHJhIjogWyJiYXJiYXpxdXV4OyB7bWFya2VyfSJdYCB0bwogICAgICAgIGAiZXh0cmE6e21hcmtlcn0iOiBbImJhcmJhenF1dXgiXWAuCiAgICAgICAgIiIiCiAgICAgICAgc3BlY19leHRfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2V4dHJhc19yZXF1aXJlJywgTm9uZSkgb3Ige30KICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmUgPSBkZWZhdWx0ZGljdChsaXN0KQogICAgICAgIGZvciBzZWN0aW9uLCB2IGluIHNwZWNfZXh0X3JlcXMuaXRlbXMoKToKICAgICAgICAgICAgIyBEbyBub3Qgc3RyaXAgZW1wdHkgc2VjdGlvbnMuCiAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uXQogICAgICAgICAgICBmb3IgciBpbiBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2KToKICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuX3N1ZmZpeF9mb3IocikKICAgICAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uICsgc3VmZml4XS5hcHBlbmQocikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N1ZmZpeF9mb3IocmVxKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSByZXF1aXJlbWVudCwgcmV0dXJuIHRoZSAnZXh0cmFzX3JlcXVpcmUnIHN1ZmZpeCBmb3IKICAgICAgICB0aGF0IHJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnOicgKyBzdHIocmVxLm1hcmtlcikgaWYgcmVxLm1hcmtlciBlbHNlICcnCgogICAgZGVmIF9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTW92ZSByZXF1aXJlbWVudHMgaW4gYGluc3RhbGxfcmVxdWlyZXNgIHRoYXQgYXJlIHVzaW5nIGVudmlyb25tZW50CiAgICAgICAgbWFya2VycyBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgoKICAgICAgICAjIGRpdmlkZSB0aGUgaW5zdGFsbF9yZXF1aXJlcyBpbnRvIHR3byBzZXRzLCBzaW1wbGUgb25lcyBzdGlsbAogICAgICAgICMgaGFuZGxlZCBieSBpbnN0YWxsX3JlcXVpcmVzIGFuZCBtb3JlIGNvbXBsZXggb25lcyBoYW5kbGVkCiAgICAgICAgIyBieSBleHRyYXNfcmVxdWlyZS4KCiAgICAgICAgZGVmIGlzX3NpbXBsZV9yZXEocmVxKToKICAgICAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyCgogICAgICAgIHNwZWNfaW5zdF9yZXFzID0gZ2V0YXR0cihzZWxmLCAnaW5zdGFsbF9yZXF1aXJlcycsIE5vbmUpIG9yICgpCiAgICAgICAgaW5zdF9yZXFzID0gbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhzcGVjX2luc3RfcmVxcykpCiAgICAgICAgc2ltcGxlX3JlcXMgPSBmaWx0ZXIoaXNfc2ltcGxlX3JlcSwgaW5zdF9yZXFzKQogICAgICAgIGNvbXBsZXhfcmVxcyA9IGZpbHRlcmZhbHNlKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBzZWxmLmluc3RhbGxfcmVxdWlyZXMgPSBsaXN0KG1hcChzdHIsIHNpbXBsZV9yZXFzKSkKCiAgICAgICAgZm9yIHIgaW4gY29tcGxleF9yZXFzOgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbJzonICsgc3RyKHIubWFya2VyKV0uYXBwZW5kKHIpCiAgICAgICAgc2VsZi5leHRyYXNfcmVxdWlyZSA9IGRpY3QoCiAgICAgICAgICAgIChrLCBbc3RyKHIpIGZvciByIGluIG1hcChzZWxmLl9jbGVhbl9yZXEsIHYpXSkKICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICApCgogICAgZGVmIF9jbGVhbl9yZXEoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIFJlcXVpcmVtZW50LCByZW1vdmUgZW52aXJvbm1lbnQgbWFya2VycyBhbmQgcmV0dXJuIGl0LgogICAgICAgICIiIgogICAgICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBwYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPU5vbmUsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHZhcmlvdXMgbGV2ZWxzCiAgICAgICAgYW5kIGxvYWRzIGNvbmZpZ3VyYXRpb24uCgogICAgICAgICIiIgogICAgICAgIF9EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIHBhcnNlX2NvbmZpZ3VyYXRpb24oc2VsZiwgc2VsZi5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycz1pZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIHBhcnNlX2NvbW1hbmRfbGluZShzZWxmKToKICAgICAgICAiIiJQcm9jZXNzIGZlYXR1cmVzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMiIiIKICAgICAgICByZXN1bHQgPSBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbW1hbmRfbGluZShzZWxmKQogICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHNlbGYuX2ZpbmFsaXplX2ZlYXR1cmVzKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9mZWF0dXJlX2F0dHJuYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkNvbnZlcnQgZmVhdHVyZSBuYW1lIHRvIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGF0dHJpYnV0ZSBuYW1lIiIiCiAgICAgICAgcmV0dXJuICd3aXRoXycgKyBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgcmVxdWlyZXMpOgogICAgICAgICIiIlJlc29sdmUgcHJlLXNldHVwIHJlcXVpcmVtZW50cyIiIgogICAgICAgIHJlc29sdmVkX2Rpc3RzID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5yZXNvbHZlKAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlcyksCiAgICAgICAgICAgIGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZywKICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlLAogICAgICAgICkKICAgICAgICBmb3IgZGlzdCBpbiByZXNvbHZlZF9kaXN0czoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5hZGQoZGlzdCwgcmVwbGFjZT1UcnVlKQogICAgICAgIHJldHVybiByZXNvbHZlZF9kaXN0cwoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9EaXN0cmlidXRpb24uZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHNlbGYuX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKCkKCiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgZXAubmFtZSwgTm9uZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKICAgICAgICAgICAgICAgIGVwLmxvYWQoKShzZWxmLCBlcC5uYW1lLCB2YWx1ZSkKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnLCBOb25lKToKICAgICAgICAgICAgIyBYWFggbWF5IGNvbnZlcnQgdG8gc2V0IGhlcmUgd2hlbiB3ZSBjYW4gcmVseSBvbiBzZXQgYmVpbmcgYnVpbHRpbgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChwKQogICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMKICAgICAgICAgICAgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzID0gW10KCiAgICBkZWYgZ2V0X2VnZ19jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgZWdnX2NhY2hlX2RpciA9IG9zLnBhdGguam9pbihvcy5jdXJkaXIsICcuZWdncycpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZ19jYWNoZV9kaXIpOgogICAgICAgICAgICBvcy5ta2RpcihlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICB3aW5kb3dzX3N1cHBvcnQuaGlkZV9maWxlKGVnZ19jYWNoZV9kaXIpCiAgICAgICAgICAgIHJlYWRtZV90eHRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZWdnX2NhY2hlX2RpciwgJ1JFQURNRS50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4ocmVhZG1lX3R4dF9maWxlbmFtZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZWdncyB0aGF0IHdlcmUgZG93bmxvYWRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdieSBzZXR1cHRvb2xzIHRvIGJ1aWxkLCB0ZXN0LCBhbmQgcnVuIHBsdWctaW5zLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY2FjaGVzIHRob3NlIGVnZ3MgdG8gcHJldmVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdyZXBlYXRlZCBkb3dubG9hZHMuXG5cbicpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdIb3dldmVyLCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeS5cblxuJykKCiAgICAgICAgcmV0dXJuIGVnZ19jYWNoZV9kaXIKCiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmciIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbAogICAgICAgIGRpc3QgPSBzZWxmLl9fY2xhc3NfXyh7J3NjcmlwdF9hcmdzJzogWydlYXN5X2luc3RhbGwnXX0pCiAgICAgICAgb3B0cyA9IGRpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgICAgIG9wdHMuY2xlYXIoKQogICAgICAgIG9wdHMudXBkYXRlKAogICAgICAgICAgICAoaywgdikKICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLml0ZW1zKCkKICAgICAgICAgICAgaWYgayBpbiAoCiAgICAgICAgICAgICAgICAjIGRvbid0IHVzZSBhbnkgb3RoZXIgc2V0dGluZ3MKICAgICAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLAogICAgICAgICAgICAgICAgJ29wdGltaXplJywgJ3NpdGVfZGlycycsICdhbGxvd19ob3N0cycsCiAgICAgICAgKSkKICAgICAgICBpZiBzZWxmLmRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGxpbmtzID0gc2VsZi5kZXBlbmRlbmN5X2xpbmtzWzpdCiAgICAgICAgICAgIGlmICdmaW5kX2xpbmtzJyBpbiBvcHRzOgogICAgICAgICAgICAgICAgbGlua3MgPSBvcHRzWydmaW5kX2xpbmtzJ11bMV0gKyBsaW5rcwogICAgICAgICAgICBvcHRzWydmaW5kX2xpbmtzJ10gPSAoJ3NldHVwJywgbGlua3MpCiAgICAgICAgaW5zdGFsbF9kaXIgPSBzZWxmLmdldF9lZ2dfY2FjaGVfZGlyKCkKICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgICAgIGRpc3QsIGFyZ3M9WyJ4Il0sIGluc3RhbGxfZGlyPWluc3RhbGxfZGlyLAogICAgICAgICAgICBleGNsdWRlX3NjcmlwdHM9VHJ1ZSwKICAgICAgICAgICAgYWx3YXlzX2NvcHk9RmFsc2UsIGJ1aWxkX2RpcmVjdG9yeT1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKICAgICAgICAgICAgdXBncmFkZT1GYWxzZSwgbXVsdGlfdmVyc2lvbj1UcnVlLCBub19yZXBvcnQ9VHJ1ZSwgdXNlcj1GYWxzZQogICAgICAgICkKICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCiAgICAgICAgcmV0dXJuIGNtZC5lYXN5X2luc3RhbGwocmVxKQoKICAgIGRlZiBfc2V0X2dsb2JhbF9vcHRzX2Zyb21fZmVhdHVyZXMoc2VsZik6CiAgICAgICAgIiIiQWRkIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgYmFzZWQgb24gb3B0aW9uYWwgZmVhdHVyZXMiIiIKCiAgICAgICAgZ28gPSBbXQogICAgICAgIG5vID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCgogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgTm9uZSkKICAgICAgICAgICAgZmVhdHVyZS52YWxpZGF0ZShzZWxmKQoKICAgICAgICAgICAgaWYgZmVhdHVyZS5vcHRpb25hbDoKICAgICAgICAgICAgICAgIGRlc2NyID0gZmVhdHVyZS5kZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgaW5jZGVmID0gJyAoZGVmYXVsdCknCiAgICAgICAgICAgICAgICBleGNkZWYgPSAnJwogICAgICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCk6CiAgICAgICAgICAgICAgICAgICAgZXhjZGVmLCBpbmNkZWYgPSBpbmNkZWYsIGV4Y2RlZgoKICAgICAgICAgICAgICAgIG5ldyA9ICgKICAgICAgICAgICAgICAgICAgICAoJ3dpdGgtJyArIG5hbWUsIE5vbmUsICdpbmNsdWRlICcgKyBkZXNjciArIGluY2RlZiksCiAgICAgICAgICAgICAgICAgICAgKCd3aXRob3V0LScgKyBuYW1lLCBOb25lLCAnZXhjbHVkZSAnICsgZGVzY3IgKyBleGNkZWYpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZ28uZXh0ZW5kKG5ldykKICAgICAgICAgICAgICAgIG5vWyd3aXRob3V0LScgKyBuYW1lXSA9ICd3aXRoLScgKyBuYW1lCgogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLmZlYXR1cmVfb3B0aW9ucyA9IGdvICsgc2VsZi5nbG9iYWxfb3B0aW9ucwogICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5mZWF0dXJlX25lZ29wdCA9IG5vCgogICAgZGVmIF9maW5hbGl6ZV9mZWF0dXJlcyhzZWxmKToKICAgICAgICAiIiJBZGQvcmVtb3ZlIGZlYXR1cmVzIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0iIiIKCiAgICAgICAgIyBGaXJzdCwgZmxhZyBhbGwgdGhlIGVuYWJsZWQgaXRlbXMgKGFuZCB0aHVzIHRoZWlyIGRlcGVuZGVuY2llcykKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkKICAgICAgICAgICAgaWYgZW5hYmxlZCBvciAoZW5hYmxlZCBpcyBOb25lIGFuZCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5jbHVkZV9pbihzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICAgICAgIyBUaGVuIGRpc2FibGUgdGhlIHJlc3QsIHNvIHRoYXQgb2ZmLWJ5LWRlZmF1bHQgZmVhdHVyZXMgZG9uJ3QKICAgICAgICAjIGdldCBmbGFnZ2VkIGFzIGVycm9ycyB3aGVuIHRoZXkncmUgcmVxdWlyZWQgYnkgYW4gZW5hYmxlZCBmZWF0dXJlCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpOgogICAgICAgICAgICAgICAgZmVhdHVyZS5leGNsdWRlX2Zyb20oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDApCgogICAgZGVmIGdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpOgogICAgICAgICIiIlBsdWdnYWJsZSB2ZXJzaW9uIG9mIGdldF9jb21tYW5kX2NsYXNzKCkiIiIKICAgICAgICBpZiBjb21tYW5kIGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdCgogICAgICAgIGVwcyA9IHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsIGNvbW1hbmQpCiAgICAgICAgZm9yIGVwIGluIGVwczoKICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbY29tbWFuZF0gPSBjbWRjbGFzcyA9IGVwLmxvYWQoKQogICAgICAgICAgICByZXR1cm4gY21kY2xhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKQoKICAgIGRlZiBwcmludF9jb21tYW5kcyhzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24ucHJpbnRfY29tbWFuZHMoc2VsZikKCiAgICBkZWYgZ2V0X2NvbW1hbmRfbGlzdChzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfbGlzdChzZWxmKQoKICAgIGRlZiBfc2V0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdHVzKToKICAgICAgICAiIiJTZXQgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMiIiIKICAgICAgICBzZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSksIHN0YXR1cykKCiAgICBkZWYgZmVhdHVyZV9pc19pbmNsdWRlZChzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gMSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkLCAwIGlmIGV4Y2x1ZGVkLCAnTm9uZScgaWYgdW5rbm93biIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSkpCgogICAgZGVmIGluY2x1ZGVfZmVhdHVyZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXF1ZXN0IGluY2x1c2lvbiBvZiBmZWF0dXJlIG5hbWVkICduYW1lJyIiIgoKICAgICAgICBpZiBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkgPT0gMDoKICAgICAgICAgICAgZGVzY3IgPSBzZWxmLmZlYXR1cmVzW25hbWVdLmRlc2NyaXB0aW9uCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgZGVzY3IgKyAiIGlzIHJlcXVpcmVkLCBidXQgd2FzIGV4Y2x1ZGVkIG9yIGlzIG5vdCBhdmFpbGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZlYXR1cmVzW25hbWVdLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAxKQoKICAgIGRlZiBpbmNsdWRlKHNlbGYsICoqYXR0cnMpOgogICAgICAgICIiIkFkZCBpdGVtcyB0byBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIGFkZCAneCcgdG8KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZSwgaWYgaXQgd2FzIG5vdCBhbHJlYWR5CiAgICAgICAgdGhlcmUuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBpbmNsdXNpb24gZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgYWRkaW5nIHRvIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfaW5jbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdpbmNsdWRlKCknLiAgU28sICdkaXN0LmluY2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2luY2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBpbmNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGluY2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfaW5jbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgIGluY2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2luY2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBleGNsdWRlX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBpbiBuYW1lZCBwYWNrYWdlIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnB5X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAgIT0gcGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICAgICAgaWYgc2VsZi5leHRfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5leHRfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5leHRfbW9kdWxlcwogICAgICAgICAgICAgICAgaWYgcC5uYW1lICE9IHBhY2thZ2UgYW5kIG5vdCBwLm5hbWUuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICBkZWYgaGFzX2NvbnRlbnRzX2ZvcihzZWxmLCBwYWNrYWdlKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXhjbHVkZV9wYWNrYWdlKHBhY2thZ2UpJyB3b3VsZCBkbyBzb21ldGhpbmciIiIKCiAgICAgICAgcGZ4ID0gcGFja2FnZSArICcuJwoKICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCk6CiAgICAgICAgICAgIGlmIHAgPT0gcGFja2FnZSBvciBwLnN0YXJ0c3dpdGgocGZ4KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9leGNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnZXhjbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxpZiBvbGQ6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgW2l0ZW0gZm9yIGl0ZW0gaW4gb2xkIGlmIGl0ZW0gbm90IGluIHZhbHVlXSkKCiAgICBkZWYgX2luY2x1ZGVfbWlzYyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiSGFuZGxlICdpbmNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3ID0gW2l0ZW0gZm9yIGl0ZW0gaW4gdmFsdWUgaWYgaXRlbSBub3QgaW4gb2xkXQogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIG9sZCArIG5ldykKCiAgICBkZWYgZXhjbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIHJlbW92ZSAneCcgZnJvbQogICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLiAgRXhjbHVkaW5nIHBhY2thZ2VzIHVzZXMKICAgICAgICB0aGUgJ2V4Y2x1ZGVfcGFja2FnZSgpJyBtZXRob2QsIHNvIGFsbCBvZiB0aGUgcGFja2FnZSdzIGNvbnRhaW5lZAogICAgICAgIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBhcmUgYWxzbyBleGNsdWRlZC4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGV4Y2x1c2lvbiBmcm9tIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkaW5nIGZyb20gb3RoZXIKICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19leGNsdWRlX1gnIG1ldGhvZCwKICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2V4Y2x1ZGUoKScuICBTbywgJ2Rpc3QuZXhjbHVkZShmb289eyJiYXIiOiJiYXoifSknCiAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5fZXhjbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgogICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGV4Y2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgZXhjbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19leGNsdWRlXycgKyBrLCBOb25lKQogICAgICAgICAgICBpZiBleGNsdWRlOgogICAgICAgICAgICAgICAgZXhjbHVkZSh2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fZXhjbHVkZV9taXNjKGssIHYpCgogICAgZGVmIF9leGNsdWRlX3BhY2thZ2VzKHNlbGYsIHBhY2thZ2VzKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlcywgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgInBhY2thZ2VzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKHBhY2thZ2VzLCkKICAgICAgICAgICAgKQogICAgICAgIGxpc3QobWFwKHNlbGYuZXhjbHVkZV9wYWNrYWdlLCBwYWNrYWdlcykpCgogICAgZGVmIF9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKToKICAgICAgICAjIFJlbW92ZSAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIHdoZW4gcHJvY2Vzc2luZyBjb21tYW5kIGFyZ3MKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5fX2NsYXNzX18uZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuX19jbGFzc19fLm5lZ2F0aXZlX29wdAoKICAgICAgICAjIEZpcnN0LCBleHBhbmQgYW55IGFsaWFzZXMKICAgICAgICBjb21tYW5kID0gYXJnc1swXQogICAgICAgIGFsaWFzZXMgPSBzZWxmLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCiAgICAgICAgd2hpbGUgY29tbWFuZCBpbiBhbGlhc2VzOgogICAgICAgICAgICBzcmMsIGFsaWFzID0gYWxpYXNlc1tjb21tYW5kXQogICAgICAgICAgICBkZWwgYWxpYXNlc1tjb21tYW5kXSAgIyBlbnN1cmUgZWFjaCBhbGlhcyBjYW4gZXhwYW5kIG9ubHkgb25jZSEKICAgICAgICAgICAgaW1wb3J0IHNobGV4CiAgICAgICAgICAgIGFyZ3NbOjFdID0gc2hsZXguc3BsaXQoYWxpYXMsIFRydWUpCiAgICAgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCgogICAgICAgIG5hcmdzID0gX0Rpc3RyaWJ1dGlvbi5fcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncykKCiAgICAgICAgIyBIYW5kbGUgY29tbWFuZHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMKICAgICAgICBjbWRfY2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCiAgICAgICAgaWYgZ2V0YXR0cihjbWRfY2xhc3MsICdjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKVsnYXJncyddID0gKCJjb21tYW5kIGxpbmUiLCBuYXJncykKICAgICAgICAgICAgaWYgbmFyZ3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIG5hcmdzCgogICAgZGVmIGdldF9jbWRsaW5lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgJ3tjbWQ6IHtvcHQ6dmFsfX0nIG1hcCBvZiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMKCiAgICAgICAgT3B0aW9uIG5hbWVzIGFyZSBhbGwgbG9uZywgYnV0IGRvIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nICctLScsIGFuZAogICAgICAgIGNvbnRhaW4gZGFzaGVzIHJhdGhlciB0aGFuIHVuZGVyc2NvcmVzLiAgSWYgdGhlIG9wdGlvbiBkb2Vzbid0IHRha2UKICAgICAgICBhbiBhcmd1bWVudCAoZS5nLiAnLS1xdWlldCcpLCB0aGUgJ3ZhbCcgaXMgJ05vbmUnLgoKICAgICAgICBOb3RlIHRoYXQgb3B0aW9ucyBwcm92aWRlZCBieSBjb25maWcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQuCiAgICAgICAgIiIiCgogICAgICAgIGQgPSB7fQoKICAgICAgICBmb3IgY21kLCBvcHRzIGluIHNlbGYuY29tbWFuZF9vcHRpb25zLml0ZW1zKCk6CgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIG9wdHMuaXRlbXMoKToKCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gImNvbW1hbmQgbGluZSI6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnXycsICctJykKCiAgICAgICAgICAgICAgICBpZiB2YWwgPT0gMDoKICAgICAgICAgICAgICAgICAgICBjbWRvYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjbWQpCiAgICAgICAgICAgICAgICAgICAgbmVnX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQudXBkYXRlKGdldGF0dHIoY21kb2JqLCAnbmVnYXRpdmVfb3B0Jywge30pKQogICAgICAgICAgICAgICAgICAgIGZvciBuZWcsIHBvcyBpbiBuZWdfb3B0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSBvcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBuZWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlIikKCiAgICAgICAgICAgICAgICBlbGlmIHZhbCA9PSAxOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKCiAgICAgICAgICAgICAgICBkLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBpdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBhbGwgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb24gbmFtZXMgaW4gZGlzdHJpYnV0aW9uIiIiCgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgcGtnCgogICAgICAgIGZvciBtb2R1bGUgaW4gc2VsZi5weV9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICB5aWVsZCBtb2R1bGUKCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dF9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgdHVwbGUpOgogICAgICAgICAgICAgICAgbmFtZSwgYnVpbGRpbmZvID0gZXh0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gZXh0Lm5hbWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnbW9kdWxlJyk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6LTZdCiAgICAgICAgICAgIHlpZWxkIG5hbWUKCiAgICBkZWYgaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpOgogICAgICAgICIiIklmIHRoZXJlIHdlcmUgYW55IG5vbi1nbG9iYWwgImRpc3BsYXktb25seSIgb3B0aW9ucwogICAgICAgICgtLWhlbHAtY29tbWFuZHMgb3IgdGhlIG1ldGFkYXRhIGRpc3BsYXkgb3B0aW9ucykgb24gdGhlIGNvbW1hbmQKICAgICAgICBsaW5lLCBkaXNwbGF5IHRoZSByZXF1ZXN0ZWQgaW5mbyBhbmQgcmV0dXJuIHRydWU7IGVsc2UgcmV0dXJuCiAgICAgICAgZmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaW1wb3J0IHN5cwoKICAgICAgICBpZiBzaXguUFkyIG9yIHNlbGYuaGVscF9jb21tYW5kczoKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgU3Rkb3V0IG1heSBiZSBTdHJpbmdJTyAoZS5nLiBpbiB0ZXN0cykKICAgICAgICBpbXBvcnQgaW8KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzeXMuc3Rkb3V0LCBpby5UZXh0SU9XcmFwcGVyKToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgRG9uJ3Qgd3JhcCBzdGRvdXQgaWYgdXRmLTggaXMgYWxyZWFkeSB0aGUgZW5jb2RpbmcuIFByb3ZpZGVzCiAgICAgICAgIyAgd29ya2Fyb3VuZCBmb3IgIzMzNC4KICAgICAgICBpZiBzeXMuc3Rkb3V0LmVuY29kaW5nLmxvd2VyKCkgaW4gKCd1dGYtOCcsICd1dGY4Jyk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFByaW50IG1ldGFkYXRhIGluIFVURi04IG5vIG1hdHRlciB0aGUgcGxhdGZvcm0KICAgICAgICBlbmNvZGluZyA9IHN5cy5zdGRvdXQuZW5jb2RpbmcKICAgICAgICBlcnJvcnMgPSBzeXMuc3Rkb3V0LmVycm9ycwogICAgICAgIG5ld2xpbmUgPSBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBhbmQgJ1xuJyBvciBOb25lCiAgICAgICAgbGluZV9idWZmZXJpbmcgPSBzeXMuc3Rkb3V0LmxpbmVfYnVmZmVyaW5nCgogICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCAndXRmLTgnLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKCgpjbGFzcyBGZWF0dXJlOgogICAgIiIiCiAgICAqKmRlcHJlY2F0ZWQqKiAtLSBUaGUgYEZlYXR1cmVgIGZhY2lsaXR5IHdhcyBuZXZlciBjb21wbGV0ZWx5IGltcGxlbWVudGVkCiAgICBvciBzdXBwb3J0ZWQsIGBoYXMgcmVwb3J0ZWQgaXNzdWVzCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNTg+YF8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgogICAgYSBmdXR1cmUgdmVyc2lvbi4KCiAgICBBIHN1YnNldCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4Y2x1ZGVkIGlmIHVubmVlZGVkL3dhbnRlZAoKICAgIEZlYXR1cmVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZXNlIGtleXdvcmQgYXJndW1lbnRzOgoKICAgICAgJ2Rlc2NyaXB0aW9uJyAtLSBhIHNob3J0LCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZSwgdG8KICAgICAgICAgYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcywgYW5kIG9wdGlvbiBoZWxwIG1lc3NhZ2VzLgoKICAgICAgJ3N0YW5kYXJkJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0IGlmIGl0IGlzCiAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBPdGhlcndpc2UsIHRoZSBmZWF0dXJlIGlzIG9ubHkKICAgICAgICAgaW5jbHVkZWQgaWYgcmVxdWVzdGVkIHZpYSBhIGNvbW1hbmQgbGluZSAnLS13aXRoLVgnIG9wdGlvbiwgb3IgaWYKICAgICAgICAgYW5vdGhlciBpbmNsdWRlZCBmZWF0dXJlIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnRmFsc2UnLgoKICAgICAgJ2F2YWlsYWJsZScgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gb24gdGhlCiAgICAgICAgIGN1cnJlbnQgc3lzdGVtLiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAnb3B0aW9uYWwnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIGNhbiBiZSBjb250cm9sbGVkIGZyb20gdGhlCiAgICAgICAgIGNvbW1hbmQgbGluZSwgdXNpbmcgdGhlICctLXdpdGgtWCcgb3IgJy0td2l0aG91dC1YJyBvcHRpb25zLiAgSWYKICAgICAgICAgZmFsc2UsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksCiAgICAgICAgIGJhc2VkIG9uICdhdmFpbGFiaWxlJywgJ3N0YW5kYXJkJywgYW5kIHdoZXRoZXIgYW55IG90aGVyIGZlYXR1cmUKICAgICAgICAgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KCiAgICAgICdyZXF1aXJlX2ZlYXR1cmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIG5hbWluZyBmZWF0dXJlcwogICAgICAgICB0aGF0IHNob3VsZCBhbHNvIGJlIGluY2x1ZGVkIGlmIHRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZC4gIERlZmF1bHRzIHRvCiAgICAgICAgIGVtcHR5IGxpc3QuICBNYXkgYWxzbyBjb250YWluICdSZXF1aXJlJyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlCiAgICAgICAgIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgoKICAgICAgJ3JlbW92ZScgLS0gYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBwYWNrYWdlcyB0byBiZSByZW1vdmVkCiAgICAgICAgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogaW5jbHVkZWQuICBJZiB0aGUKICAgICAgICAgZmVhdHVyZSAqaXMqIGluY2x1ZGVkLCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGlzIGFyZ3VtZW50IGV4aXN0cwogICAgICAgICB0byBzdXBwb3J0IHJlbW92aW5nIGZlYXR1cmVzIHRoYXQgImNyb3NzY3V0IiBhIGRpc3RyaWJ1dGlvbiwgc3VjaCBhcwogICAgICAgICBkZWZpbmluZyBhICd0ZXN0cycgZmVhdHVyZSB0aGF0IHJlbW92ZXMgYWxsIHRoZSAndGVzdHMnIHN1YnBhY2thZ2VzCiAgICAgICAgIHByb3ZpZGVkIGJ5IG90aGVyIGZlYXR1cmVzLiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgYXJndW1lbnQgaXMgYW4gZW1wdHkKICAgICAgICAgbGlzdC4gIChOb3RlOiB0aGUgbmFtZWQgcGFja2FnZShzKSBvciBtb2R1bGVzIG11c3QgZXhpc3QgaW4gdGhlIGJhc2UKICAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyBpbml0aWFsbHkgY2FsbGVkLikKCiAgICAgIG90aGVyIGtleXdvcmRzIC0tIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc2F2ZWQsIGFuZCBwYXNzZWQgdG8KICAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdpbmNsdWRlKCknIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIHdoZW4gdGhlCiAgICAgICAgIGZlYXR1cmUgaXMgaW5jbHVkZWQgb3IgZXhjbHVkZWQsIHJlc3BlY3RpdmVseS4gIFNvLCBmb3IgZXhhbXBsZSwgeW91CiAgICAgICAgIGNvdWxkIHBhc3MgJ3BhY2thZ2VzPVsiYSIsImIiXScgdG8gY2F1c2UgcGFja2FnZXMgJ2EnIGFuZCAnYicgdG8gYmUKICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gYXMgYXBwcm9wcmlhdGUuCgogICAgQSBmZWF0dXJlIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgJ3JlcXVpcmVzJywgJ3JlbW92ZScsIG9yIG90aGVyCiAgICBrZXl3b3JkIGFyZ3VtZW50LiAgT3RoZXJ3aXNlLCBpdCBjYW4ndCBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzdWJjbGFzcyAnRmVhdHVyZScgdG8gY3JlYXRlIHlvdXIgb3duIHNwZWNpYWxpemVkCiAgICBmZWF0dXJlIHR5cGVzIHRoYXQgbW9kaWZ5IHRoZSBkaXN0cmlidXRpb24gaW4gb3RoZXIgd2F5cyB3aGVuIGluY2x1ZGVkIG9yCiAgICBleGNsdWRlZC4gIFNlZSB0aGUgZG9jc3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgbWV0aG9kcyBoZXJlIGZvciBtb3JlIGRldGFpbC4KICAgIEFzaWRlIGZyb20gdGhlIG1ldGhvZHMsIHRoZSBvbmx5IGZlYXR1cmUgYXR0cmlidXRlcyB0aGF0IGRpc3RyaWJ1dGlvbnMgbG9vawogICAgYXQgYXJlICdkZXNjcmlwdGlvbicgYW5kICdvcHRpb25hbCcuCiAgICAiIiIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkKCk6CiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiRmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSAiCiAgICAgICAgICAgICJ2ZXJzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNjUuIgogICAgICAgICkKICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBkZXNjcmlwdGlvbiwgc3RhbmRhcmQ9RmFsc2UsIGF2YWlsYWJsZT1UcnVlLAogICAgICAgICAgICBvcHRpb25hbD1UcnVlLCByZXF1aXJlX2ZlYXR1cmVzPSgpLCByZW1vdmU9KCksICoqZXh0cmFzKToKICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZCgpCgogICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgogICAgICAgIHNlbGYuc3RhbmRhcmQgPSBzdGFuZGFyZAogICAgICAgIHNlbGYuYXZhaWxhYmxlID0gYXZhaWxhYmxlCiAgICAgICAgc2VsZi5vcHRpb25hbCA9IG9wdGlvbmFsCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlX2ZlYXR1cmVzLCAoc3RyLCBSZXF1aXJlKSk6CiAgICAgICAgICAgIHJlcXVpcmVfZmVhdHVyZXMgPSByZXF1aXJlX2ZlYXR1cmVzLAoKICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbCiAgICAgICAgICAgIHIgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBpc2luc3RhbmNlKHIsIHN0cikKICAgICAgICBdCiAgICAgICAgZXIgPSBbciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIG5vdCBpc2luc3RhbmNlKHIsIHN0cildCiAgICAgICAgaWYgZXI6CiAgICAgICAgICAgIGV4dHJhc1sncmVxdWlyZV9mZWF0dXJlcyddID0gZXIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZW1vdmUsIHN0cik6CiAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSwKICAgICAgICBzZWxmLnJlbW92ZSA9IHJlbW92ZQogICAgICAgIHNlbGYuZXh0cmFzID0gZXh0cmFzCgogICAgICAgIGlmIG5vdCByZW1vdmUgYW5kIG5vdCByZXF1aXJlX2ZlYXR1cmVzIGFuZCBub3QgZXh0cmFzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIkZlYXR1cmUgJXM6IG11c3QgZGVmaW5lICdyZXF1aXJlX2ZlYXR1cmVzJywgJ3JlbW92ZScsIG9yICIKICAgICAgICAgICAgICAgICJhdCBsZWFzdCBvbmUgb2YgJ3BhY2thZ2VzJywgJ3B5X21vZHVsZXMnLCBldGMuIgogICAgICAgICAgICApCgogICAgZGVmIGluY2x1ZGVfYnlfZGVmYXVsdChzZWxmKToKICAgICAgICAiIiJTaG91bGQgdGhpcyBmZWF0dXJlIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQ/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXZhaWxhYmxlIGFuZCBzZWxmLnN0YW5kYXJkCgogICAgZGVmIGluY2x1ZGVfaW4oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgYW5kIGl0cyByZXF1aXJlbWVudHMgYXJlIGluY2x1ZGVkIGluIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQogICAgICAgIHBlciBmZWF0dXJlLCBhbmQgc28gc2hvdWxkIGJlIGlkZW1wb3RlbnQuCgogICAgICAgICIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5hdmFpbGFibGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uICsgIiBpcyByZXF1aXJlZCwgIgogICAgICAgICAgICAgICAgImJ1dCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCiAgICAgICAgICAgICkKCiAgICAgICAgZGlzdC5pbmNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGZvciBmIGluIHNlbGYucmVxdWlyZV9mZWF0dXJlczoKICAgICAgICAgICAgZGlzdC5pbmNsdWRlX2ZlYXR1cmUoZikKCiAgICBkZWYgZXhjbHVkZV9mcm9tKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGlzIGV4Y2x1ZGVkIGZyb20gZGlzdHJpYnV0aW9uCgogICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIKICAgICAgICBmZWF0dXJlLCBhbmQgb25seSBhZnRlciBhbGwgaW5jbHVkZWQgZmVhdHVyZXMgaGF2ZSBiZWVuIGFza2VkIHRvCiAgICAgICAgaW5jbHVkZSB0aGVtc2VsdmVzLgogICAgICAgICIiIgoKICAgICAgICBkaXN0LmV4Y2x1ZGUoKipzZWxmLmV4dHJhcykKCiAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgogICAgICAgICAgICAgICAgZGlzdC5leGNsdWRlX3BhY2thZ2UoaXRlbSkKCiAgICBkZWYgdmFsaWRhdGUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgZmVhdHVyZSBtYWtlcyBzZW5zZSBpbiBjb250ZXh0IG9mIGRpc3RyaWJ1dGlvbgoKICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRpc3RyaWJ1dGlvbiBqdXN0IGJlZm9yZSBpdCBwYXJzZXMgaXRzCiAgICAgICAgY29tbWFuZCBsaW5lLiAgSXQgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSAncmVtb3ZlJyBhdHRyaWJ1dGUsIGlmIGFueSwKICAgICAgICBjb250YWlucyBvbmx5IHZhbGlkIHBhY2thZ2UvbW9kdWxlIG5hbWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UKICAgICAgICBkaXN0cmlidXRpb24gd2hlbiAnc2V0dXAoKScgaXMgY2FsbGVkLiAgWW91IG1heSBvdmVycmlkZSBpdCBpbiBhCiAgICAgICAgc3ViY2xhc3MgdG8gcGVyZm9ybSBhbnkgb3RoZXIgcmVxdWlyZWQgdmFsaWRhdGlvbiBvZiB0aGUgZmVhdHVyZQogICAgICAgIGFnYWluc3QgYSB0YXJnZXQgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgoKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2ZvcihpdGVtKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIHdhbnRzIHRvIGJlIGFibGUgdG8gcmVtb3ZlICVzLCBidXQgdGhlIGRpc3RyaWJ1dGlvbiIKICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgY29udGFpbiBhbnkgcGFja2FnZXMgb3IgbW9kdWxlcyB1bmRlciAlcyIKICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBpdGVtLCBpdGVtKQogICAgICAgICAgICAgICAgKQpQSwMEFAAAAAAAAAAhALmqke7BBgAAwQYAAC8AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weWltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmV4dGVuc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSAubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCgoKZGVmIF9oYXZlX2N5dGhvbigpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBDeXRob24gY2FuIGJlIGltcG9ydGVkLgogICAgIiIiCiAgICBjeXRob25faW1wbCA9ICdDeXRob24uRGlzdHV0aWxzLmJ1aWxkX2V4dCcKICAgIHRyeToKICAgICAgICAjIGZyb20gKGN5dGhvbl9pbXBsKSBpbXBvcnQgYnVpbGRfZXh0CiAgICAgICAgX19pbXBvcnRfXyhjeXRob25faW1wbCwgZnJvbWxpc3Q9WydidWlsZF9leHQnXSkuYnVpbGRfZXh0CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwogICAgcmV0dXJuIEZhbHNlCgoKIyBmb3IgY29tcGF0aWJpbGl0eQpoYXZlX3B5cmV4ID0gX2hhdmVfY3l0aG9uCgpfRXh0ZW5zaW9uID0gZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5FeHRlbnNpb24pCgoKY2xhc3MgRXh0ZW5zaW9uKF9FeHRlbnNpb24pOgogICAgIiIiRXh0ZW5zaW9uIHRoYXQgdXNlcyAnLmMnIGZpbGVzIGluIHBsYWNlIG9mICcucHl4JyBmaWxlcyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdyk6CiAgICAgICAgIyBUaGUgKmFyZ3MgaXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IGFzIGNhbGxzIG1heSB1c2UgcG9zaXRpb25hbAogICAgICAgICMgYXJndW1lbnRzLiBweV9saW1pdGVkX2FwaSBtYXkgYmUgc2V0IG9ubHkgdmlhIGtleXdvcmQuCiAgICAgICAgc2VsZi5weV9saW1pdGVkX2FwaSA9IGt3LnBvcCgicHlfbGltaXRlZF9hcGkiLCBGYWxzZSkKICAgICAgICBfRXh0ZW5zaW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZXMsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfY29udmVydF9weXhfc291cmNlc190b19sYW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2Ugc291cmNlcyB3aXRoIC5weXggZXh0ZW5zaW9ucyB0byBzb3VyY2VzIHdpdGggdGhlIHRhcmdldAogICAgICAgIGxhbmd1YWdlIGV4dGVuc2lvbi4gVGhpcyBtZWNoYW5pc20gYWxsb3dzIGxhbmd1YWdlIGF1dGhvcnMgdG8gc3VwcGx5CiAgICAgICAgcHJlLWNvbnZlcnRlZCBzb3VyY2VzIGJ1dCB0byBwcmVmZXIgdGhlIC5weXggc291cmNlcy4KICAgICAgICAiIiIKICAgICAgICBpZiBfaGF2ZV9jeXRob24oKToKICAgICAgICAgICAgIyB0aGUgYnVpbGQgaGFzIEN5dGhvbiwgc28gYWxsb3cgaXQgdG8gY29tcGlsZSB0aGUgLnB5eCBmaWxlcwogICAgICAgICAgICByZXR1cm4KICAgICAgICBsYW5nID0gc2VsZi5sYW5ndWFnZSBvciAnJwogICAgICAgIHRhcmdldF9leHQgPSAnLmNwcCcgaWYgbGFuZy5sb3dlcigpID09ICdjKysnIGVsc2UgJy5jJwogICAgICAgIHN1YiA9IGZ1bmN0b29scy5wYXJ0aWFsKHJlLnN1YiwgJy5weXgkJywgdGFyZ2V0X2V4dCkKICAgICAgICBzZWxmLnNvdXJjZXMgPSBsaXN0KG1hcChzdWIsIHNlbGYuc291cmNlcykpCgoKY2xhc3MgTGlicmFyeShFeHRlbnNpb24pOgogICAgIiIiSnVzdCBsaWtlIGEgcmVndWxhciBFeHRlbnNpb24sIGJ1dCBidWlsdCBhcyBhIGxpYnJhcnkgaW5zdGVhZCIiIgpQSwMEFAAAAAAAAAAhANCKe2WDAAAAgwAAADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weWZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IFZlbmRvckltcG9ydGVyCgpuYW1lcyA9ICdzaXgnLApWZW5kb3JJbXBvcnRlcihfX25hbWVfXywgbmFtZXMsICdwa2dfcmVzb3VyY2VzLl92ZW5kb3InKS5pbnN0YWxsKCkKUEsDBBQAAAAAAAAAIQAE6sG9SgwAAEoMAAArAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbGliYy5weSMgVGhpcyBmaWxlIG9yaWdpbmFsbHkgZnJvbSBwaXA6CiMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOGY0ZjE1YTVhOTVkN2Q1YjUxMWNlYWVlOWVkMjYxMTc2YzE4MTk3MC9zcmMvcGlwL19pbnRlcm5hbC91dGlscy9nbGliYy5weQpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGN0eXBlcwppbXBvcnQgcmUKaW1wb3J0IHdhcm5pbmdzCgoKZGVmIGdsaWJjX3ZlcnNpb25fc3RyaW5nKCk6CiAgICAiUmV0dXJucyBnbGliYyB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSBpZiBub3QgdXNpbmcgZ2xpYmMuIgoKICAgICMgY3R5cGVzLkNETEwoTm9uZSkgaW50ZXJuYWxseSBjYWxscyBkbG9wZW4oTlVMTCksIGFuZCBhcyB0aGUgZGxvcGVuCiAgICAjIG1hbnBhZ2Ugc2F5cywgIklmIGZpbGVuYW1lIGlzIE5VTEwsIHRoZW4gdGhlIHJldHVybmVkIGhhbmRsZSBpcyBmb3IgdGhlCiAgICAjIG1haW4gcHJvZ3JhbSIuIFRoaXMgd2F5IHdlIGNhbiBsZXQgdGhlIGxpbmtlciBkbyB0aGUgd29yayB0byBmaWd1cmUgb3V0CiAgICAjIHdoaWNoIGxpYmMgb3VyIHByb2Nlc3MgaXMgYWN0dWFsbHkgdXNpbmcuCiAgICBwcm9jZXNzX25hbWVzcGFjZSA9IGN0eXBlcy5DRExMKE5vbmUpCiAgICB0cnk6CiAgICAgICAgZ251X2dldF9saWJjX3ZlcnNpb24gPSBwcm9jZXNzX25hbWVzcGFjZS5nbnVfZ2V0X2xpYmNfdmVyc2lvbgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgU3ltYm9sIGRvZXNuJ3QgZXhpc3QgLT4gdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGxpbmtlZCB0bwogICAgICAgICMgZ2xpYmMuCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIENhbGwgZ251X2dldF9saWJjX3ZlcnNpb24sIHdoaWNoIHJldHVybnMgYSBzdHJpbmcgbGlrZSAiMi41IgogICAgZ251X2dldF9saWJjX3ZlcnNpb24ucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogICAgdmVyc2lvbl9zdHIgPSBnbnVfZ2V0X2xpYmNfdmVyc2lvbigpCiAgICAjIHB5MiAvIHB5MyBjb21wYXRpYmlsaXR5OgogICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbl9zdHIsIHN0cik6CiAgICAgICAgdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0ci5kZWNvZGUoImFzY2lpIikKCiAgICByZXR1cm4gdmVyc2lvbl9zdHIKCgojIFNlcGFyYXRlZCBvdXQgZnJvbSBoYXZlX2NvbXBhdGlibGVfZ2xpYmMgZm9yIGVhc2llciB1bml0IHRlc3RpbmcKZGVmIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgICMgUGFyc2Ugc3RyaW5nIGFuZCBjaGVjayBhZ2FpbnN0IHJlcXVlc3RlZCB2ZXJzaW9uLgogICAgIwogICAgIyBXZSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBzdHIuc3BsaXQgYmVjYXVzZSB3ZSB3YW50IHRvIGRpc2NhcmQgYW55CiAgICAjIHJhbmRvbSBqdW5rIHRoYXQgbWlnaHQgY29tZSBhZnRlciB0aGUgbWlub3IgdmVyc2lvbiAtLSB0aGlzIG1pZ2h0IGhhcHBlbgogICAgIyBpbiBwYXRjaGVkL2ZvcmtlZCB2ZXJzaW9ucyBvZiBnbGliYyAoZS5nLiBMaW5hcm8ncyB2ZXJzaW9uIG9mIGdsaWJjCiAgICAjIHVzZXMgdmVyc2lvbiBzdHJpbmdzIGxpa2UgIjIuMjAtMjAxNC4xMSIpLiBTZWUgZ2gtMzU4OC4KICAgIG0gPSByZS5tYXRjaChyIig/UDxtYWpvcj5bMC05XSspXC4oP1A8bWlub3I+WzAtOV0rKSIsIHZlcnNpb25fc3RyKQogICAgaWYgbm90IG06CiAgICAgICAgd2FybmluZ3Mud2FybigiRXhwZWN0ZWQgZ2xpYmMgdmVyc2lvbiB3aXRoIDIgY29tcG9uZW50cyBtYWpvci5taW5vciwiCiAgICAgICAgICAgICAgICAgICAgICAiIGdvdDogJXMiICUgdmVyc2lvbl9zdHIsIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIChpbnQobS5ncm91cCgibWFqb3IiKSkgPT0gcmVxdWlyZWRfbWFqb3IgYW5kCiAgICAgICAgICAgIGludChtLmdyb3VwKCJtaW5vciIpKSA+PSBtaW5pbXVtX21pbm9yKQoKCmRlZiBoYXZlX2NvbXBhdGlibGVfZ2xpYmMocmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgdmVyc2lvbl9zdHIgPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiB2ZXJzaW9uX3N0ciBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKQoKCiMgcGxhdGZvcm0ubGliY192ZXIgcmVndWxhcmx5IHJldHVybnMgY29tcGxldGVseSBub25zZW5zaWNhbCBnbGliYwojIHZlcnNpb25zLiBFLmcuIG9uIG15IGNvbXB1dGVyLCBwbGF0Zm9ybSBzYXlzOgojCiMgICB+JCBweXRob24yLjcgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuNycpCiMgICB+JCBweXRob24zLjUgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuOScpCiMKIyBCdXQgdGhlIHRydXRoIGlzOgojCiMgICB+JCBsZGQgLS12ZXJzaW9uCiMgICBsZGQgKERlYmlhbiBHTElCQyAyLjIyLTExKSAyLjIyCiMKIyBUaGlzIGlzIHVuZm9ydHVuYXRlLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdGhlIGxpbmVoYXVsIGRhdGEgb24gbGliYwojIHZlcnNpb25zIHRoYXQgd2FzIGdlbmVyYXRlZCBieSBwaXAgOC4xLjIgYW5kIGVhcmxpZXIgaXMgdXNlbGVzcyBhbmQKIyBtaXNsZWFkaW5nLiBTb2x1dGlvbjogaW5zdGVhZCBvZiB1c2luZyBwbGF0Zm9ybSwgdXNlIG91ciBjb2RlIHRoYXQgYWN0dWFsbHkKIyB3b3Jrcy4KZGVmIGxpYmNfdmVyKCk6CiAgICAiIiJUcnkgdG8gZGV0ZXJtaW5lIHRoZSBnbGliYyB2ZXJzaW9uCgogICAgUmV0dXJucyBhIHR1cGxlIG9mIHN0cmluZ3MgKGxpYiwgdmVyc2lvbikgd2hpY2ggZGVmYXVsdCB0byBlbXB0eSBzdHJpbmdzCiAgICBpbiBjYXNlIHRoZSBsb29rdXAgZmFpbHMuCiAgICAiIiIKICAgIGdsaWJjX3ZlcnNpb24gPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiBnbGliY192ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuICgiIiwgIiIpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAoImdsaWJjIiwgZ2xpYmNfdmVyc2lvbikKUEsDBBQAAAAAAAAAIQC8XaE5VxQAAFcUAAAqAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbG9iLnB5IiIiCkZpbGVuYW1lIGdsb2JiaW5nIHV0aWxpdHkuIE1vc3RseSBhIGNvcHkgb2YgYGdsb2JgIGZyb20gUHl0aG9uIDMuNS4KCkNoYW5nZXMgaW5jbHVkZToKICogYHlpZWxkIGZyb21gIGFuZCBQRVAzMTAyIGAqYCByZW1vdmVkLgogKiBgYnl0ZXNgIGNoYW5nZWQgdG8gYHNpeC5iaW5hcnlfdHlwZWAuCiAqIEhpZGRlbiBmaWxlcyBhcmUgbm90IGlnbm9yZWQuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgZm5tYXRjaApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgYmluYXJ5X3R5cGUKCl9fYWxsX18gPSBbImdsb2IiLCAiaWdsb2IiLCAiZXNjYXBlIl0KCgpkZWYgZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcGF0aHMgbWF0Y2hpbmcgYSBwYXRobmFtZSBwYXR0ZXJuLgoKICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQogICAgZm5tYXRjaC4gSG93ZXZlciwgdW5saWtlIGZubWF0Y2gsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEKICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JwogICAgcGF0dGVybnMuCgogICAgSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZSBwYXR0ZXJuICcqKicgd2lsbCBtYXRjaCBhbnkgZmlsZXMgYW5kCiAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgIiIiCiAgICByZXR1cm4gbGlzdChpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPXJlY3Vyc2l2ZSkpCgoKZGVmIGlnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9RmFsc2UpOgogICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHdoaWNoIHlpZWxkcyB0aGUgcGF0aHMgbWF0Y2hpbmcgYSBwYXRobmFtZSBwYXR0ZXJuLgoKICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQogICAgZm5tYXRjaC4gSG93ZXZlciwgdW5saWtlIGZubWF0Y2gsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEKICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JwogICAgcGF0dGVybnMuCgogICAgSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZSBwYXR0ZXJuICcqKicgd2lsbCBtYXRjaCBhbnkgZmlsZXMgYW5kCiAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgIiIiCiAgICBpdCA9IF9pZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlKQogICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUocGF0aG5hbWUpOgogICAgICAgIHMgPSBuZXh0KGl0KSAgIyBza2lwIGVtcHR5IHN0cmluZwogICAgICAgIGFzc2VydCBub3QgcwogICAgcmV0dXJuIGl0CgoKZGVmIF9pZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlKToKICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKICAgIGlmIG5vdCBoYXNfbWFnaWMocGF0aG5hbWUpOgogICAgICAgIGlmIGJhc2VuYW1lOgogICAgICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMocGF0aG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aG5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFBhdHRlcm5zIGVuZGluZyB3aXRoIGEgc2xhc2ggc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgcmV0dXJuCiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGZvciB4IGluIGdsb2IyKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMShkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgcmV0dXJuCiAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZiBhcyBhIGRpcm5hbWUgaWYgaXQgaXMgYQogICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKICAgICMgY29udGFpbnMgbWFnaWMgY2hhcmFjdGVycyAoaS5lLiByJ1xcP1xDOicpLgogICAgaWYgZGlybmFtZSAhPSBwYXRobmFtZSBhbmQgaGFzX21hZ2ljKGRpcm5hbWUpOgogICAgICAgIGRpcnMgPSBfaWdsb2IoZGlybmFtZSwgcmVjdXJzaXZlKQogICAgZWxzZToKICAgICAgICBkaXJzID0gW2Rpcm5hbWVdCiAgICBpZiBoYXNfbWFnaWMoYmFzZW5hbWUpOgogICAgICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKGJhc2VuYW1lKToKICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjEKICAgIGVsc2U6CiAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMAogICAgZm9yIGRpcm5hbWUgaW4gZGlyczoKICAgICAgICBmb3IgbmFtZSBpbiBnbG9iX2luX2RpcihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQoKCiMgVGhlc2UgMiBoZWxwZXIgZnVuY3Rpb25zIG5vbi1yZWN1cnNpdmVseSBnbG9iIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgojIFRoZXkgcmV0dXJuIGEgbGlzdCBvZiBiYXNlbmFtZXMuIGBnbG9iMWAgYWNjZXB0cyBhIHBhdHRlcm4gd2hpbGUgYGdsb2IwYAojIHRha2VzIGEgbGl0ZXJhbCBiYXNlbmFtZSAoc28gaXQgb25seSBoYXMgdG8gY2hlY2sgZm9yIGl0cyBleGlzdGVuY2UpLgoKCmRlZiBnbG9iMShkaXJuYW1lLCBwYXR0ZXJuKToKICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmluYXJ5X3R5cGUpOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyLmVuY29kZSgnQVNDSUknKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHJldHVybiBbXQogICAgcmV0dXJuIGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKQoKCmRlZiBnbG9iMChkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICBpZiBub3QgYmFzZW5hbWU6CiAgICAgICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIGFuIGVtcHR5IGJhc2VuYW1lIGZvciBwYXRocyBlbmRpbmcgd2l0aCBhCiAgICAgICAgIyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgJ3EqeC8nIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzLgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICBlbHNlOgogICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpKToKICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgIHJldHVybiBbXQoKCiMgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsCiMgZGlyZWN0b3J5LgoKCmRlZiBnbG9iMihkaXJuYW1lLCBwYXR0ZXJuKToKICAgIGFzc2VydCBfaXNyZWN1cnNpdmUocGF0dGVybikKICAgIHlpZWxkIHBhdHRlcm5bOjBdCiAgICBmb3IgeCBpbiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICAgICAgeWllbGQgeAoKCiMgUmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KZGVmIF9ybGlzdGRpcihkaXJuYW1lKToKICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGlybmFtZSwgYmluYXJ5X3R5cGUpOgogICAgICAgICAgICBkaXJuYW1lID0gYmluYXJ5X3R5cGUob3MuY3VyZGlyLCAnQVNDSUknKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICByZXR1cm4KICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgIHlpZWxkIHgKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIHgpIGlmIGRpcm5hbWUgZWxzZSB4CiAgICAgICAgZm9yIHkgaW4gX3JsaXN0ZGlyKHBhdGgpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oeCwgeSkKCgptYWdpY19jaGVjayA9IHJlLmNvbXBpbGUoJyhbKj9bXSknKQptYWdpY19jaGVja19ieXRlcyA9IHJlLmNvbXBpbGUoYicoWyo/W10pJykKCgpkZWYgaGFzX21hZ2ljKHMpOgogICAgaWYgaXNpbnN0YW5jZShzLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgbWF0Y2ggPSBtYWdpY19jaGVja19ieXRlcy5zZWFyY2gocykKICAgIGVsc2U6CiAgICAgICAgbWF0Y2ggPSBtYWdpY19jaGVjay5zZWFyY2gocykKICAgIHJldHVybiBtYXRjaCBpcyBub3QgTm9uZQoKCmRlZiBfaXNyZWN1cnNpdmUocGF0dGVybik6CiAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJpbmFyeV90eXBlKToKICAgICAgICByZXR1cm4gcGF0dGVybiA9PSBiJyoqJwogICAgZWxzZToKICAgICAgICByZXR1cm4gcGF0dGVybiA9PSAnKionCgoKZGVmIGVzY2FwZShwYXRobmFtZSk6CiAgICAiIiJFc2NhcGUgYWxsIHNwZWNpYWwgY2hhcmFjdGVycy4KICAgICIiIgogICAgIyBFc2NhcGluZyBpcyBkb25lIGJ5IHdyYXBwaW5nIGFueSBvZiAiKj9bIiBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cy4KICAgICMgTWV0YWNoYXJhY3RlcnMgZG8gbm90IHdvcmsgaW4gdGhlIGRyaXZlIHBhcnQgYW5kIHNob3VsZG4ndCBiZSBlc2NhcGVkLgogICAgZHJpdmUsIHBhdGhuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKHBhdGhuYW1lKQogICAgaWYgaXNpbnN0YW5jZShwYXRobmFtZSwgYmluYXJ5X3R5cGUpOgogICAgICAgIHBhdGhuYW1lID0gbWFnaWNfY2hlY2tfYnl0ZXMuc3ViKGJyJ1tcMV0nLCBwYXRobmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aG5hbWUgPSBtYWdpY19jaGVjay5zdWIocidbXDFdJywgcGF0aG5hbWUpCiAgICByZXR1cm4gZHJpdmUgKyBwYXRobmFtZQpQSwMEFAAAAAAAAAAhABD5/CkAAAEAAAABAC0AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS0zMi5leGVNWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAAAORTwNigMq6LoDKui6AyrouH9NWLozKui6Ayr4v7Mq6LHX04i6Qyrou+YCqLhDKui75gO4uyMq6LvmAti9Eyrou+YD+LoTKui1JpY2igMq6LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEUAAEwBAwABsYtRAAAAAAAAAADgAAMBCwEJAADKAAAATgAAAAAAABMmAAAAEAAAAOAAAAAAQAAAEAAAAAIAAAUAAAAAAAAABQAAAAAAAAAAQAEAAAQAAAAAAAACAACAAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAAA0+QAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACI9AAAQAAAAAAAAAAAAAAAAOAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAO3JAAAAEAAAAMoAAAAEAAAAAAAAAAAAAAAAAAAgAABgLnJkYXRhAABoIAAAAOAAAAAiAAAAzgAAAAAAAAAAAAAAAAAAQAAAQC5kYXRhAAAAxCsAAAAQAQAAEAAAAPAAAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUYtEJAiNUAGKCECEyXX5U1VWK8JXi+iNRC0DagFQ6HgKAACDxAgz/zPbiUQkEMYAIo1wAYXtflfrBo2bAAAAAItMJBiKBAs8XHUDR+sgPCJ1GoX/fhBXalxW6IEKAACDxAwD9zP/xgZcRusCM/+LVCQYigQTiAZDRjvdfMOF/34OV2pcVuhWCgAAg8QMA/eLRCQQX8YGIsZGAQBeXVtZw4HsDAQAAKGAEkEAM8SJhCQIBAAAVou0JBgEAABXi7wkGAQAAIoHi8+EwHQTjWQkAEE8L3UExkH/XIoBhMB18Y2EJAwBAABQjYwkEAIAAFGNVCQUUo1EJBRQV+iXDQAAg8QUgHwkCAAPhaQAAACAfCQMXA+EmQAAAI2MJAwBAABRjZQkEAIAAFKNRCQUUI1MJBRRVuheDQAAjUQkIIPEFI1QAYoIQITJdfkrwoB8BAtcjUQEC3UKSIA4XHQVjWQkAI1UJAw7wnIJxgAASIA4XHXvagBXjUQkFFCNTCQUUY2UJBwDAABS6PkKAABqAWgEAQAA6AQJAACL8GgEAQAAjYQkLAMAAFBW6LQJAACDxCjrHWoBaAQBAADo3ggAAGgEAQAAi/BXVuiVCQAAg8QUi4wkEAQAAF+Lxl4zzOgCDQAAgcQMBAAAw8zMzMzMzMzMzIPsCFNVVleLfCQci8eNUAGKCECEyXX5K8JqBFDoiggAAItsJCgz24lEJByJXQCJOA++B1CL94lcJBzomg0AAIPEDIXAdBIPvk8BR1HoiA0AAIPEBIXAde6KD0eITCQchMl0Zw++0VLobQ0AAIPEBIXAdAeDfCQQAHRMikQkHDxcdQND69M8InUZ9sMBdRIzwDlEJBDGRCQcAA+UwIlEJBDR+4XbdBBTalxW6EEIAACDxAwD8zPbgHwkHAB0m4pMJByIDkbrkopMJByF23QUU2pcVugZCAAAikwkKIPEDAPzM9uLVCQUxgYA/0UAi0UARok0goTJdDcPvhdS6NkMAACDxASFwHQSD75HAUdQ6McMAACDxASFwHXugD8AD4U2////i0QkFF9eXVuDxAjDX15di8Jbg8QIw8zMzMzMzMzMg3wkBAB1EqEAIEEAhcB0CWoAUP8VAOBAALgBAAAAw8yD7FgzwGpEUIlEJAyJRCQQiUQkFIlEJBiNRCQcUMdEJAwAAAAA6GYHAACDxAxqAWgwE0AAx0QkHEQAAAD/FRDgQACLRCRcjUwkBFGNVCQYUmoAagBqAGoBagBqAFBqAP8VDOBAAIXAdRxoqOFAAOgjBQAAg8BAUOj+AwAAg8QIM8CDxFjDi1QkBItMJAxq/1KJDQAgQQD/FQjgQACLTCQEjQQkUFH/FQTgQACFwHUHaIDhQADruIsEJIPEWMPMzMxTVVZXi3wkFIvHjVABjUkAighAhMl1+YtcJBwrwrkBAAAAO9mNcAJ+LY2kJAAAAACLRCQYiwSIjXgBjZsAAAAAihBAhNJ1+SvHQTvLjXQGAXzei3wkFGoBVugtBgAAV4voaMjhQABV6HsLAACLx4PEFI1QAYoIQITJdfkrwr4BAAAAO96L+H46i0wkGIsUsVKNBC9oxOFAAFDoSQsAAItMJCSLBLGDxAyNUAHrA41JAIoIQITJdfkrwkY78418BwF8xl9ei8VdW8PMzMzMzMzMgewYAgAAoYASQQAzxImEJBQCAACLhCQgAgAAaAABAACNTCQYUWoAiUQkFP8VFOBAAI1EJBSNUAGKCECEyXX5K8KNRAQUjVQkFDvCdhSNSQCAOC50DMYAAEiNTCQUO8F378YAAI1EJBRIjaQkAAAAAIpIAUCEyXX4ixUo4kAAiw0s4kAAiRCLFTDiQACJSARWiVAIjUQkGGoAUOiitAAAi/CDxAiD/v91NI1MJBhRaBjiQADoTgMAAIPAQFDoKQIAAIPEDI1GA16LjCQUAgAAM8zoLAkAAIHEGAIAAMNXaAABAACNlCQgAQAAUlboNKwAAFaNvAQsAQAA6EOLAACNhCQsAQAAg8QQSI2kJAAAAABAO8dzEIoIhMl0CoD5CnQFgPkNdetqAsYAAI2EJCABAABoFOJAAFDoWAoAAIPEDIXAdDOLDQTiQACLFQjiQAChDOJAAImMJBwBAACKDRDiQACJlCQgAQAAiYQkJAEAAIiMJCgBAACNVCQIUo2EJCIBAABQ6Ij7//+LMI1MJCRRVolEJCjoJ/r//4v4g8QQiXwkDIX/dQtWaODhQADpuAAAAFOLXCQMVYusJCwCAACNBCuJRCQcQGoEUOjtAwAAi/BXiXQkHOhG+f//iQa/AQAAAIPEDIPGBDvffh/rA41JAItUJCCLBLpQ6CP5//+JBkeDxASDxgQ7+3zmjUwkJFHoDPn//4kGvwEAAACDxASDxgQ7734ai1QkGIsEulDo7vj//4kGR4PEBIPGBDv9fOaDvCQ0AgAAAF3HBgAAAABbdEWLTCQIi3QkDFFW6LSkAACDxAhWaMzhQADomAEAAIPAQFDocwAAAIPEDF+4AgAAAF6LjCQUAgAAM8zocwcAAIHEGAIAAMOLVCQUi0QkCItMJAxSUFHohvz//1DowPv//4uMJCwCAACDxBBfXjPM6D8HAACBxBgCAADDzMzMzMzMoRAgQQCLDQwgQQBqAVBR6Bz9//+DxAzCEABqDGjw9EAA6MYfAAAz9ol15DPAi10IO94PlcA7xnUg6GIfAADHABYAAABWVlZWVujqHgAAg8QUg8j/6c0AAAAzwDl1DA+VwDvGdNSJXQhT6J8BAABZiXX89kMMQHV3U+hRHQAAWYP4/3Qbg/j+dBaL0MH6BYvIg+EfweEGAwyVoCpBAOsFuZgSQQD2QSR/dSmD+P90GYP4/nQUi8jB+QWD4B/B4AYDBI2gKkEA6wW4mBJBAPZAJIB0HOjIHgAAxwAWAAAAVlZWVlboUB4AAIPEFINN5P85deR1I1Pocw0AAIv4jUUQUFb/dQxT6NkOAACJReRTV+j1DQAAg8Qcx0X8/v///+gJAAAAi0Xk6AYfAADD/3UI6EwBAABZw7gAEEEAw6HAO0EAVmoUXoXAdQe4AAIAAOsGO8Z9B4vGo8A7QQBqBFDoviAAAFlZo7wrQQCFwHUeagRWiTXAO0EA6KUgAABZWaO8K0EAhcB1BWoaWF7DM9K5ABBBAOsFobwrQQCJDAKDwSCDwgSB+YASQQB86mr+XjPSuRAQQQBXi8LB+AWLBIWgKkEAi/qD5x/B5waLBAeD+P90CDvGdASFwHUCiTGDwSBCgflwEEEAfM5fM8Bew+jSIwAAgD0wIEEAAHQF6JshAAD/NbwrQQDoAiEAAFnDi/9Vi+xWi3UIuAAQQQA78HIigf5gEkEAdxqLzivIwfkFg8EQUegSJQAAgU4MAIAAAFnrCoPGIFb/FRjgQABeXcOL/1WL7ItFCIP4FH0Wg8AQUOjlJAAAi0UMgUgMAIAAAFldw4tFDIPAIFD/FRjgQABdw4v/VYvsi0UIuQAQQQA7wXIfPWASQQB3GIFgDP9///8rwcH4BYPAEFDowiMAAFldw4PAIFD/FRzgQABdw4v/VYvsi00Ig/kUi0UMfROBYAz/f///g8EQUeiTIwAAWV3Dg8AgUP8VHOBAAF3Di/9Vi+xRg2X8AFaNRfxQ/3UM/3UI6HckAACL8IPEDIX2dRg5Rfx0E+iIHAAAhcB0Cuh/HAAAi038iQiLxl7Jw8zMzMzMi1QkDItMJASF0nRpM8CKRCQIhMB1FoH6AAEAAHIOgz2IKkEAAHQF6ZUlAABXi/mD+gRyMffZg+EDdAwr0YgHg8cBg+kBdfaLyMHgCAPBi8jB4BADwYvKg+IDwekCdAbzq4XSdAqIB4PHAYPqAXX2i0QkCF/Di0QkBMPMzMzMzMyLTCQMV4XJD4SSAAAAVlOL2Yt0JBT3xgMAAACLfCQQdQvB6QIPhYUAAADrJ4oGg8YBiAeDxwGD6QF0K4TAdC/3xgMAAAB15YvZwekCdWGD4wN0E4oGg8YBiAeDxwGEwHQ3g+sBde2LRCQQW15fw/fHAwAAAHQWiAeDxwGD6QEPhJgAAAD3xwMAAAB16ovZwekCdXSIB4PHAYPrAXX2W16LRCQIX8OJF4PHBIPpAXSfuv/+/n6LBgPQg/D/M8KLFoPGBKkAAQGBdNyE0nQshPZ0HvfCAAD/AHQM98IAAAD/dcSJF+sYgeL//wAAiRfrDoHi/wAAAIkX6wQz0okXg8cEM8CD6QF0DDPAiQeDxwSD6QF19oPjAw+Fd////4tEJBBbXl/Di/9Vi+z/dRj/dRT/dRD/dQxq//91COhQJQAAg8QYXcOL/1WL7FFRUzPbVleJXfg5XQh0fYtNDDvLdQc5XRB1cesFOV0QdGo5XRR1BzldGHVg6wU5XRh0WTldHHUHOV0gdU/rBTldIHRIOV0kdT45XSh1Pot1CDPAQDgedAZIRjvDd/aAPjp1NTvLdBqDfRADD4L1AAAAagL/dQhq/1HoVSYAAIPEEEaJdQjrFzldKHXCx0X4AQAAAOnOAAAAO8t0AogZi3UIM/+JXfw4HnRVD74GUOgIJgAAWYXAdANG6xaKBjwvdA08XHQJPC51CIl1/OsDjX4BRjgeddQ7+3QlOV0UdBuLxytFCDlFGHZ9UP91CGr//3UU6NwlAACDxBCJfQjrCYtFFDvDdAKIGItF/DvDdEo7RQhyRTldHHQZK0UIOUUgdkVQ/3UIav//dRzopCUAAIPEEDldJA+EqwAAACt1/Dl1KHYjVv91/Gr//3Uk6IIlAACDxBDpjQAAADldHHR/K3UIOXUgd2aLRQw7w3QHOV0QdgKIGItFFDvDdAc5XRh2AogYi0UcO8N0BzldIHYCiBiLRSQ7w3QHOV0odgKIGOgEGQAAOV0IdRZqFl5TU1NTU4kw6IgYAACDxBSLxusqOV34deVqIlmJCIvB6xxW/3UIav//dRzo+SQAAIPEEItFJDvDdAKIGDPAX15bycOL/1WL7ItNGPfZG8m4AAEAACPIUf91GItNFPfZG8kjyFGLTRD/dRT32RvJI8iLRQxR/3UQ99gbwIPgA1D/dQz/dQjox/3//4PEJF3DOw2AEkEAdQLzw+moJAAAi/9Vi+yLRQhWi/HGRgwAhcB1Y+hlMgAAiUYIi0hsiQ6LSGiJTgSLDjsNcBtBAHQSiw2MGkEAhUhwdQfoAC8AAIkGi0YEOwWQGUEAdBaLRgiLDYwaQQCFSHB1COh0JwAAiUYEi0YI9kBwAnUUg0hwAsZGDAHrCosIiQ6LQASJRgSLxl5dwgQAi/9Vi+yD7BD/dQyNTfDoZv///4tF8IO4rAAAAAF+E41F8FBqCP91COifNAAAg8QM6xCLgMgAAACLTQgPtwRIg+AIgH38AHQHi034g2Fw/cnDi/9Vi+yDPegkQQAAdRKLRQiLDWAbQQAPtwRBg+AIXcNqAP91COiF////WVldw4v/VYvsg+wgUzPbOV0MdR3oRBcAAFNTU1NTxwAWAAAA6MwWAACDxBSDyP/rTYtFCDvDdNxWiUXoiUXgjUUQUFP/dQyNReBQx0Xk////f8dF7EIAAADoQgcAAIPEEP9N5IvweAeLReCIGOsMjUXgUFPokDQAAFlZi8ZeW8nDi/9Vi+xRg2X8AFOLXRCF23UHM8DpmgAAAFeD+wRydY17/IX/dm6LTQyLRQiKEIPABIPBBITSdFI6Ufx1TYpQ/YTSdDw6Uf11N4pQ/oTSdCY6Uf51IYpQ/4TSdBA6Uf91C4NF/AQ5ffxywus/D7ZA/w+2Sf/rRg+2QP4Ptkn+6zwPtkD9D7ZJ/esyD7ZA/A+2SfzrKItNDItFCOsPihCE0nQUOhF1EEBB/0X8OV38cuwzwF9bycMPtgAPtgkrwevyi/9Vi+xXv+gDAABX/xUk4EAA/3UI/xUg4EAAgcfoAwAAgf9g6gAAdwSFwHTeX13Di/9Vi+zonTYAAP91COjqNAAA/zWIEkEA6KEtAABo/wAAAP/Qg8QMXcOL/1WL7GhE4kAA/xUg4EAAhcB0FWg04kAAUP8VKOBAAIXAdAX/dQj/0F3Di/9Vi+z/dQjoyP///1n/dQj/FSzgQADMagjoIh0AAFnDagjoPxwAAFnDi/9Vi+xWi/DrC4sGhcB0Av/Qg8YEO3UIcvBeXcOL/1WL7FaLdQgzwOsPhcB1EIsOhcl0Av/Rg8YEO3UMcuxeXcOL/1WL7IM9tCtBAAB0GWi0K0EA6EU4AABZhcB0Cv91CP8VtCtBAFnofzcAAGhg4UAAaEjhQADoof///1lZhcB1QmioWUAA6P02AAC4QOFAAMcEJEThQADoY////4M9uCtBAABZdBtouCtBAOjtNwAAWYXAdAxqAGoCagD/FbgrQQAzwF3DahhoEPVAAOjoFAAAagjoPhwAAFmDZfwAM9tDOR04IEEAD4TFAAAAiR00IEEAikUQojAgQQCDfQwAD4WdAAAA/zWsK0EA6DAsAABZi/iJfdiF/3R4/zWoK0EA6BssAABZi/CJddyJfeSJdeCD7gSJddw793JX6PcrAAA5BnTtO/dySv826PErAACL+OjhKwAAiQb/1/81rCtBAOjbKwAAi/j/NagrQQDozisAAIPEDDl95HUFOUXgdA6JfeSJfdiJReCL8Il13It92OufaHDhQAC4ZOFAAOhf/v//WWh44UAAuHThQADoT/7//1nHRfz+////6B8AAACDfRAAdSiJHTggQQBqCOhsGgAAWf91COj8/f//M9tDg30QAHQIagjoUxoAAFnD6A4UAADDi/9Vi+xqAGoA/3UI6MP+//+DxAxdw4v/VYvsagBqAf91COit/v//g8QMXcNqAWoAagDonf7//4PEDMNqAWoBagDojv7//4PEDMOL/1bo8yoAAIvwVuhZOwAAVujkOgAAVuh3EQAAVujJOgAAVui0OgAAVuicOAAAVug1NwAAVugeNwAAaOojQADoRSoAAIPEJKOIEkEAXsOL/1WL7IM9RCBBAAF1BeiMMwAA/3UI6NkxAABo/wAAAOgn/f//WVldw2pYaDD1QADo+xIAADP2iXX8jUWYUP8VNOBAAGr+X4l9/LhNWgAAZjkFAABAAHU4oTwAQACBuAAAQABQRQAAdSe5CwEAAGY5iBgAQAB1GYO4dABAAA52EDPJObDoAEAAD5XBiU3k6wOJdeQz20NT6M8/AABZhcB1CGoc6Fj///9Z6J0tAACFwHUIahDoR////1noVzQAAIld/Oj4DQAAhcB9CGob6Cb8//9Z/xUw4EAAo6ArQQDoUT4AAKM8IEEA6Iw9AACFwH0IagjoAPz//1noAzsAAIXAfQhqCejv+///WVPop/z//1k7xnQHUOjd+///WeiBOgAAhF3EdAYPt03I6wNqCllRUFZoAABAAOgI8v//iUXgOXXkdQZQ6B7+///oRf7//4l9/Os1i0XsiwiLCYlN3FBR6Lc1AABZWcOLZeiLRdyJReCDfeQAdQZQ6AH+///oIf7//8dF/P7///+LReDrEzPAQMOLZejHRfz+////uP8AAADozxEAAMPo7z4AAOl4/v//i/9Vi+xWi3UIVuhTDwAAUOhrPwAAWVmFwHR86Kny//+DwCA78HUEM8DrD+iZ8v//g8BAO/B1YDPAQP8FBCBBAPdGDAwBAAB1TlNXjTyFSCBBAIM/ALsAEAAAdSBT6A0TAABZiQeFwHUTjUYUagKJRgiJBliJRhiJRgTrDYs/iX4IiT6JXhiJXgSBTgwCEQAAM8BfQFvrAjPAXl3Di/9Vi+yDfQgAdCdWi3UM90YMABAAAHQZVugTFQAAgWYM/+7//4NmGACDJgCDZggAWV5dw/ZBDEB0BoN5CAB0JP9JBHgLixGIAv8BD7bA6wwPvsBRUOjpLQAAWVmD+P91AwkGw/8Gw4v/VYvsVovw6xOLTRCKRQj/TQzotf///4M+/3QGg30MAH/nXl3Di/9Vi+z2RwxAU1aL8IvZdDKDfwgAdSyLRQgBBusrigP/TQiLz+h9////Q4M+/3UT6NUPAACDOCp1D4vPsD/oZP///4N9CAB/1V5bXcOL/1WL7IHseAIAAKGAEkEAM8WJRfxTi10MVot1CDPAV4t9FP91EI2NpP3//4m1tP3//4m93P3//4mFuP3//4mF8P3//4mFzP3//4mF6P3//4mF0P3//4mFwP3//4mFyP3//+j39v//hfZ1NehNDwAAxwAWAAAAM8BQUFBQUOjTDgAAg8QUgL2w/f//AHQKi4Ws/f//g2Bw/YPI/+nICgAA9kYMQHVeVuhADQAAWbqYEkEAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWgKkEA6wKLyvZBJH91kYP4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjaAqQQDrAovC9kAkgA+FZ////zPJO9kPhF3///+KE4mN2P3//4mN4P3//4mNvP3//4iV7/3//4TSD4QfCgAAQ4O92P3//wCJncT9//8PjAsKAACKwiwgPFh3EQ++wg++gFjiQACD4A8z9usEM/YzwA++hMF44kAAagfB+ARZiYWU/f//O8EPh60JAAD/JIULM0AAg43o/f///4m1kP3//4m1wP3//4m1zP3//4m10P3//4m18P3//4m1yP3//+l2CQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FVwkAAION8P3//wjpSwkAAION8P3//wTpPwkAAION8P3//wHpMwkAAIGN8P3//4AAAADpJAkAAION8P3//wLpGAkAAID6KnUsg8cEib3c/f//i3/8O/6Jvcz9//8PjfkIAACDjfD9//8E953M/f//6ecIAACLhcz9//9rwAoPvsqNRAjQiYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6Ag9AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1DoSzsAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOjCOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+g6OAAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboIgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOhBIAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6BIgAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjtHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6OQ3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//xgEwQOs+SWY5MHQGQEA7znX0K4Xk/f//0fjrKDv+dQuhkBJBAImF5P3//4uF5P3//+sHSYA4AHQFQDvOdfUrheT9//+JheD9//+DvcD9//8AD4VcAQAAi4Xw/f//qEB0MqkAAQAAdAnGhdT9//8t6xioAXQJxoXU/f//K+sLqAJ0EcaF1P3//yDHhdD9//8BAAAAi53M/f//K53g/f//K53Q/f//9oXw/f//DHUX/7W0/f//jYXY/f//U2og6HD1//+DxAz/tdD9//+LvbT9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1+z//1mFwHQ6i4005f//K8sDTRAzwEA7yA+GpQEAAGoCjYVA5f//U1DoPCgAAIPEDIP4/w+EsQQAAEP/hUTl///rG2oBU42FQOX//1DoGCgAAIPEDIP4/w+EjQQAADPAUFBqBY1N9FFqAY2NQOX//1FQ/7Uc5f//Q/+FROX///8VsOBAAIvwhfYPhFwEAABqAI2FPOX//1BWjUX0UIuFKOX//4sA/zQH/xWY4EAAhcAPhCkEAACLhUTl//+LjTDl//8DwTm1POX//4mFOOX//w+MFQQAAIO9IOX//wAPhM0AAABqAI2FPOX//1BqAY1F9FCLhSjl//+LAMZF9A3/NAf/FZjgQACFwA+E0AMAAIO9POX//wEPjM8DAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8lmg/4KD5TBQ0ODhUTl//8CibVA5f//iY0g5f//PAF0BDwCdVL/tUDl///oJSUAAFlmO4VA5f//D4VoAwAAg4U45f//AoO9IOX//wB0KWoNWFCJhUDl///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOiytv//xwAJAAAA6Lq2//+JMOs//7VA5f//6L62//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTocrb//8cAHAAAAOh6tv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXujYnf//ycNqEGjw90AA6IS2//+LRQiD+P51G+g+tv//gyAA6CO2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6BW2//+JOOj7tf//xwAJAAAAV1dXV1fog7X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuiYtf//xwAJAAAA6KC1//+JOINN5P/HRfz+////6AkAAACLReToBLb//8P/dQjogyQAAFnDahBoEPhAAOiotf//i0UIg/j+dRPoT7X//8cACQAAAIPI/+mqAAAAM9s7w3wIOwWQKkEAchroLrX//8cACQAAAFNTU1NT6La0//+DxBTr0IvIwfkFjTyNoCpBAIvwg+YfweYGiw8PvkwOBIPhAXTGUOhsIwAAWYld/IsH9kQGBAF0Mf91COjgIgAAWVD/FeTgQACFwHUL/xVc4EAAiUXk6wOJXeQ5XeR0GejNtP//i03k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RfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPoTpD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bohq///1mLx41l7F9eW4tN/DPN6JiT///Jw4v/VYvsg+wQ/3UIjU3w6JKT////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Bav////dgjoDq////92DOgGr////3YQ6P6u////dhTo9q7///92GOjurv///zbo567///92IOjfrv///3Yk6Neu////dijoz67///92LOjHrv///3Yw6L+u////djTot67///92HOivrv///3Y46Keu////djzon67//4PEQP92QOiUrv///3ZE6Iyu////dkjohK7///92TOh8rv///3ZQ6HSu////dlTobK7///92WOhkrv///3Zc6Fyu////dmDoVK7///92ZOhMrv///3Zo6ESu////dmzoPK7///92cOg0rv///3Z06Cyu////dnjoJK7///92fOgcrv//g8RA/7aAAAAA6A6u////toQAAADoA67///+2iAAAAOj4rf///7aMAAAA6O2t////tpAAAADo4q3///+2lAAAAOjXrf///7aYAAAA6Myt////tpwAAADowa3///+2oAAAAOi2rf///7akAAAA6Kut////tqgAAADooK3//4PELF5dw4v/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T01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg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AAAA/v///wAAAADQ////AAAAAP7///8AAAAA4TtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABrPUAAAAAAAAAAAAA3PUAA/v///wAAAADU////AAAAAP7///8AAAAA8D5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAjQEAAAAAAAP7///8AAAAA1P///wAAAAD+////TUFAAGlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAArS0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAJtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3VBAAP7///8AAAAA7FBAAP7///8AAAAA2P///wAAAAD+////AAAAAJ9SQAD+////AAAAAKtSQAD+////AAAAANT///8AAAAA/v///wAAAABlWUAAAAAAAP7///8AAAAA2P///wAAAAD+////C1tAAB9bQAAAAAAA/v///wAAAADY////AAAAAP7///9dW0AAYVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAAC4XkAAAAAAAP7///8AAAAA0P///wAAAAD+////SF9AAF9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAuWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADKbEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAM55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA3oFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC/gkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAALSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAATZhAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADkoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFumQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAIahAAAAAAAAAAAAAXadAAP7///8AAAAA0P///wAAAAD+////AAAAANyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA+MJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACbykAAXPkAAAAAAAAAAAAAFgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJz6AAC4+gAAzvoAAOT6AAD2+gAADvsAACT7AAA8+wAAVPsAAGj7AABw+wAAgvsAAJD7AACi+wAAtPsAAMb7AADW+wAA5PsAAPz7AAAQ/AAAJPwAAED8AABe/AAAcvwAAIL8AACO/AAAmvwAAKb8AAC+/AAA1vwAAOD8AADs/AAA/vwAAAz9AAAY/QAAJv0AADD9AABA/QAAVv0AAGL9AABy/QAAmv0AALT9AADM/QAA5v0AAPz9AAAW/gAAJP4AADL+AABM/gAAXP4AAHL+AACM/gAAmP4AAKb+AAC2/gAAxv4AANj+AADs/gAA/P4AABL/AAAi/wAANP8AAEb/AABY/wAAav8AAHb/AACE/wAAlP8AAKr/AAC6/wAAyv8AANj/AADq/wAA/P8AACQAAQAwAAEAQAABAFIAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBADwCR2V0U3RhcnR1cEluZm9BAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRs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YXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAA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AQAAAAAA1hYBAAAAAAD+FgEAAAAAABgXAQAAAAAAMBcBAAAAAABKFwEAAAAAAGAXAQAAAAAAehcBAAAAAACQFwEAAAAAAJ4XAQAAAAAAuBcBAAAAAADIFwEAAAAAAN4XAQAAAAAA+BcBAAAAAAAGGAEAAAAAABYYAQAAAAAAKBgBAAAAAAA8GAEAAAAAAEwYAQAAAAAAYhgBAAAAAAByGAEAAAAAAIQYAQAAAAAAlhgBAAAAAACoGAEAAAAAALoYAQAAAAAAxhgBAAAAAADUGAEAAAAAAOQYAQAAAAAA+hgBAAAAAAAKGQEAAAAAABoZAQAAAAAAKBkBAAAAAAA6GQEAAAAAAEwZAQAAAAAAdBkBAAAAAACAGQEAAAAAAJAZAQAAAAAAohkBAAAAAAAAAAAAAAAAAFMBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADHAUdldEV4aXRDb2RlUHJvY2VzcwAAcgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJYAQ3JlYXRlUHJvY2Vzc0EAALQDU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADbAEVudGVyQ3JpdGljYWxTZWN0aW9uAADuAkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAAC8EU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABgFFeGl0UHJvY2VzcwBxAUdldENvbW1hbmRMaW5lQQA8AkdldFN0YXJ0dXBJbmZvQQCeA1J0bFVud2luZEV4APQDU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADZAUdldEZpbGVUeXBlAMAARGVsZXRlQ3JpdGljYWxTZWN0aW9uADsEVGVybWluYXRlUHJvY2VzcwAAqwFHZXRDdXJyZW50UHJvY2VzcwBMBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRlQ29uc29sZUEAmwFHZXRDb25zb2xlT3V0cHV0Q1AAAJoEV3JpdGVDb25zb2xlVwAKBFNldFN0ZEhhbmRsZQAAegBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADdA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAaANSZWFkRmlsZQAA2gNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMsBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgRQFAAQAAAAAAAAAAAAAA4EUBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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hWf///8zyTvZD4Rd////ihOJjdj9//+JjeD9//+Jjbz9//+Ile/9//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySFCzNAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+gIPQAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Es7AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DowjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///oOjgAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6CILAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoQSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgSIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo7R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+jkNwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbo5TUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gICAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF2P3//4tN/F9eM81b6Nrr///Jw5AWK0AAFylAAEcpQAClKUAA8SlA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5f//6CUlAABZZjuFQOX//w+FaAMAAIOFOOX//wKDvSDl//8AdClqDVhQiYVA5f//6PgkAABZZjuFQOX//w+FOwMAAP+FOOX///+FMOX//4tFEDmFROX//w+C+f3//+knAwAAiw6KE/+FOOX//4hUDzSLDolEDzjpDgMAADPJiwYDx/ZABIAPhL8CAACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAA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/3UY6GkdAACL8IPEGDvzdNyJdQz/dRT/dRD/dQz/dQj/dRz/FfTgQACL+DvzdAdW6Iav//9Zi8eNZexfXluLTfwzzeiYk///ycOL/1WL7IPsEP91CI1N8OiSk////3UkjU3w/3Ug/3Uc/3UY/3UU/3UQ/3UM6Bb+//+DxByAffwAdAeLTfiDYXD9ycOL/1WL7FaLdQiF9g+EgQEAAP92BOgWr////3YI6A6v////dgzoBq////92EOj+rv///3YU6Pau////dhjo7q7///826Oeu////diDo367///92JOjXrv///3Yo6M+u////dizox67///92MOi/rv///3Y06Leu////dhzor67///92OOinrv///3Y86J+u//+DxED/dkDolK7///92ROiMrv///3ZI6ISu////dkzofK7///92UOh0rv///3ZU6Gyu////dljoZK7///92XOhcrv///3Zg6FSu////dmToTK7///92aOhErv///3Zs6Dyu////dnDoNK7///92dOgsrv///3Z46CSu////dnzoHK7//4PEQP+2gAAAAOgOrv///7aEAAAA6AOu////togAAADo+K3///+2jAAAAOjtrf///7aQAAAA6OKt////tpQAAADo163///+2mAAAAOjMrf///7acAAAA6MGt////tqAAAADotq3///+2pAAAAOirrf///7aoAAAA6KCt//+DxCxeXcOL/1WL7FaLdQiF9nQ1iwY7BUgdQQB0B1Dofa3//1mLRgQ7BUwdQQB0B1Doa63//1mLdgg7NVAdQQB0B1boWa3//1leXcOL/1WL7FaLdQiF9nR+i0YMOwVUHUEAdAdQ6Det//9Zi0YQOwVYHUEAdAdQ6CWt//9Zi0YUOwVcHUEAdAdQ6BOt//9Zi0YYOwVgHUEAdAdQ6AGt//9Zi0YcOwVkHUEAdAdQ6O+s//9Zi0YgOwVoHUEAdAdQ6N2s//9Zi3YkOzVsHUEAdAdW6Mus//9ZXl3Di/9Vi+yLRQhTM9tWVzvDdAeLfQw7+3cb6D2p//9qFl6JMFNTU1NT6Mao//+DxBSLxus8i3UQO/N1BIgY69qL0DgadARCT3X4O/t07ooOiApCRjrLdANPdfM7+3UQiBjo9qj//2oiWYkIi/HrtTPAX15bXcPMzMzMzMxVi+xWM8BQUFBQUFBQUItVDI1JAIoC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AABDYW5ub3QgZmluZCBQeXRob24gZXhlY3V0YWJsZSAlcwoAAAAjIXB5dGhvbi5leGUAAAAAIyEAAENhbm5vdCBvcGVuICVzCgAtc2NyaXB0LnB5dwBDb3JFeGl0UHJvY2VzcwAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAqCFBAAAiQQAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2Ug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bmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAEdldExhc3RBY3RpdmVQb3B1cAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAFVTRVIzMi5ETEwAAFN1bk1vblR1ZVdlZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAAAAOAAAsGkAAKCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANwYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAIj///8AAAAA/v////olQAD+JUAA/v///8AlQADUJUAA/v///wAAAACM////AAAAAP7///9oNUAAbDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAATO0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAaz1AAAAAAAAAAAAANz1AAP7///8AAAAA1P///wAAAAD+////AAAAAPA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAI0BAAAAAAAD+////AAAAANT///8AAAAA/v///01BQABpQUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAF1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAK0tAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACbTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAN1QQAD+////AAAAAOxQQAD+////AAAAANj///8AAAAA/v///wAAAACfUkAA/v///wAAAACrUkAA/v///wAAAADU////AAAAAP7///8AAAAAZVlAAAAAAAD+////AAAAANj///8AAAAA/v///wtbQAAfW0AAAAAAAP7///8AAAAA2P///wAAAAD+////XVtAAGFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAuF5AAAAAAAD+////AAAAAND///8AAAAA/v///0hfQABfX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAALlqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAymxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADOeUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAN6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAv4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAC0lUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE2YQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA5KFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABbpkAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAACGoQAAAAAAAAAAAAF2nQAD+////AAAAAND///8AAAAA/v///wAAAADcrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAPjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAm8pAAFz5AAAAAAAAAAAAABYAAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACc+gAAuPoAAM76AADk+gAA9voAAA77AAAk+wAAPPsAAFT7AABo+wAAcPsAAIL7AACQ+wAAovsAALT7AADG+wAA1vsAAOT7AAD8+wAAEPwAACT8AABA/AAAXvwAAHL8AACC/AAAjvwAAJr8AACm/AAAvvwAANb8AADg/AAA7PwAAP78AAAM/QAAGP0AACb9AAAw/QAAQP0AAFb9AABi/QAAcv0AAJr9AAC0/QAAzP0AAOb9AAD8/QAAFv4AACT+AAAy/gAATP4AAFz+AABy/gAAjP4AAJj+AACm/gAAtv4AAMb+AADY/gAA7P4AAPz+AAAS/wAAIv8AADT/AABG/wAAWP8AAGr/AAB2/wAAhP8AAJT/AACq/wAAuv8AAMr/AADY/wAA6v8AAPz/AAAkAAEAMAABAEAAAQBSAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQA8AkdldFN0YXJ0dXBJbmZvQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCtBAAAAAADAK0EAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE7mQLuxGb9E6iNAAAIAAABs4kAAXOJAAP////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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b29scy5sYXVuY2gKCmltcG9ydCB0b2tlbml6ZQppbXBvcnQgc3lzCgoKZGVmIHJ1bigpOgogICAgIiIiCiAgICBSdW4gdGhlIHNjcmlwdCBpbiBzeXMuYXJndlsxXSBhcyBpZiBpdCBoYWQKICAgIGJlZW4gaW52b2tlZCBuYXR1cmFsbHkuCiAgICAiIiIKICAgIF9fYnVpbHRpbnNfXwogICAgc2NyaXB0X25hbWUgPSBzeXMuYXJndlsxXQogICAgbmFtZXNwYWNlID0gZGljdCgKICAgICAgICBfX2ZpbGVfXz1zY3JpcHRfbmFtZSwKICAgICAgICBfX25hbWVfXz0nX19tYWluX18nLAogICAgICAgIF9fZG9jX189Tm9uZSwKICAgICkKICAgIHN5cy5hcmd2WzpdID0gc3lzLmFyZ3ZbMTpdCgogICAgb3Blbl8gPSBnZXRhdHRyKHRva2VuaXplLCAnb3BlbicsIG9wZW4pCiAgICBzY3JpcHQgPSBvcGVuXyhzY3JpcHRfbmFtZSkucmVhZCgpCiAgICBub3JtX3NjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKCdcXHJcXG4nLCAnXFxuJykKICAgIGNvZGUgPSBjb21waWxlKG5vcm1fc2NyaXB0LCBzY3JpcHRfbmFtZSwgJ2V4ZWMnKQogICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHJ1bigpClBLAwQUAAAAAAAAACEAh1Hrot0HAADdBwAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGliMnRvM19leC5weSIiIgpDdXN0b21pemVkIE1peGluMnRvMyBzdXBwb3J0OgoKIC0gYWRkcyBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGRvY3Rlc3RzCgoKVGhpcyBtb2R1bGUgcmFpc2VzIGFuIEltcG9ydEVycm9yIG9uIFB5dGhvbiAyLgoiIiIKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IE1peGluMnRvMyBhcyBfTWl4aW4ydG8zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBsaWIydG8zLnJlZmFjdG9yIGltcG9ydCBSZWZhY3RvcmluZ1Rvb2wsIGdldF9maXhlcnNfZnJvbV9wYWNrYWdlCgppbXBvcnQgc2V0dXB0b29scwoKCmNsYXNzIERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChSZWZhY3RvcmluZ1Rvb2wpOgogICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3KToKICAgICAgICBsb2cuZXJyb3IobXNnLCAqYXJncykKCiAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKCiAgICBkZWYgbG9nX2RlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQoKCmNsYXNzIE1peGluMnRvMyhfTWl4aW4ydG8zKToKICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9RmFsc2UpOgogICAgICAgICMgU2VlIG9mIHRoZSBkaXN0cmlidXRpb24gb3B0aW9uIGhhcyBiZWVuIHNldCwgb3RoZXJ3aXNlIGNoZWNrIHRoZQogICAgICAgICMgc2V0dXB0b29scyBkZWZhdWx0LgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zIGlzIG5vdCBUcnVlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgZmlsZXM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZy5pbmZvKCJGaXhpbmcgIiArICIgIi5qb2luKGZpbGVzKSkKICAgICAgICBzZWxmLl9fYnVpbGRfZml4ZXJfbmFtZXMoKQogICAgICAgIHNlbGYuX19leGNsdWRlX2ZpeGVycygpCiAgICAgICAgaWYgZG9jdGVzdHM6CiAgICAgICAgICAgIGlmIHNldHVwdG9vbHMucnVuXzJ0bzNfb25fZG9jdGVzdHM6CiAgICAgICAgICAgICAgICByID0gRGlzdHV0aWxzUmVmYWN0b3JpbmdUb29sKHNlbGYuZml4ZXJfbmFtZXMpCiAgICAgICAgICAgICAgICByLnJlZmFjdG9yKGZpbGVzLCB3cml0ZT1UcnVlLCBkb2N0ZXN0c19vbmx5PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX01peGluMnRvMy5ydW5fMnRvMyhzZWxmLCBmaWxlcykKCiAgICBkZWYgX19idWlsZF9maXhlcl9uYW1lcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmZpeGVyX25hbWVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZpeGVyX25hbWVzID0gW10KICAgICAgICBmb3IgcCBpbiBzZXR1cHRvb2xzLmxpYjJ0bzNfZml4ZXJfcGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZml4ZXJzOgogICAgICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5leHRlbmQoZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocCkpCgogICAgZGVmIF9fZXhjbHVkZV9maXhlcnMoc2VsZik6CiAgICAgICAgZXhjbHVkZWRfZml4ZXJzID0gZ2V0YXR0cihzZWxmLCAnZXhjbHVkZV9maXhlcnMnLCBbXSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZXhjbHVkZWRfZml4ZXJzLmV4dGVuZChzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycykKICAgICAgICBmb3IgZml4ZXJfbmFtZSBpbiBleGNsdWRlZF9maXhlcnM6CiAgICAgICAgICAgIGlmIGZpeGVyX25hbWUgaW4gc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMucmVtb3ZlKGZpeGVyX25hbWUpClBLAwQUAAAAAAAAACEAjUNyXp0WAACdFgAALAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbW9ua2V5LnB5IiIiCk1vbmtleSBwYXRjaGluZyBvZiBkaXN0dXRpbHMuCiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgdHlwZXMKaW1wb3J0IGZ1bmN0b29scwpmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQppbXBvcnQgaW5zcGVjdAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgppbXBvcnQgc2V0dXB0b29scwoKX19hbGxfXyA9IFtdCiIiIgpFdmVyeXRoaW5nIGlzIHByaXZhdGUuIENvbnRhY3QgdGhlIHByb2plY3QgdGVhbQppZiB5b3UgdGhpbmsgeW91IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgoiIiIKCgpkZWYgX2dldF9tcm8oY2xzKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgYmFzZXMgY2xhc3NlcyBmb3IgY2xzIHNvcnRlZCBieSB0aGUgTVJPLgoKICAgIFdvcmtzIGFyb3VuZCBhbiBpc3N1ZSBvbiBKeXRob24gd2hlcmUgaW5zcGVjdC5nZXRtcm8gd2lsbCBub3QgcmV0dXJuIGFsbAogICAgYmFzZSBjbGFzc2VzIGlmIG11bHRpcGxlIGNsYXNzZXMgc2hhcmUgdGhlIHNhbWUgbmFtZS4gSW5zdGVhZCwgdGhpcwogICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCB0aGUgY29udGVudHMKICAgIG9mIGNscy5fX2Jhc2VzX18uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xMDI0LgogICAgIiIiCiAgICBpZiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSA9PSAiSnl0aG9uIjoKICAgICAgICByZXR1cm4gKGNscywpICsgY2xzLl9fYmFzZXNfXwogICAgcmV0dXJuIGluc3BlY3QuZ2V0bXJvKGNscykKCgpkZWYgZ2V0X3VucGF0Y2hlZChpdGVtKToKICAgIGxvb2t1cCA9ICgKICAgICAgICBnZXRfdW5wYXRjaGVkX2NsYXNzIGlmIGlzaW5zdGFuY2UoaXRlbSwgc2l4LmNsYXNzX3R5cGVzKSBlbHNlCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbiBpZiBpc2luc3RhbmNlKGl0ZW0sIHR5cGVzLkZ1bmN0aW9uVHlwZSkgZWxzZQogICAgICAgIGxhbWJkYSBpdGVtOiBOb25lCiAgICApCiAgICByZXR1cm4gbG9va3VwKGl0ZW0pCgoKZGVmIGdldF91bnBhdGNoZWRfY2xhc3MoY2xzKToKICAgICIiIlByb3RlY3QgYWdhaW5zdCByZS1wYXRjaGluZyB0aGUgZGlzdHV0aWxzIGlmIHJlbG9hZGVkCgogICAgQWxzbyBlbnN1cmVzIHRoYXQgbm8gb3RoZXIgZGlzdHV0aWxzIGV4dGVuc2lvbiBtb25rZXlwYXRjaGVkIHRoZSBkaXN0dXRpbHMKICAgIGZpcnN0LgogICAgIiIiCiAgICBleHRlcm5hbF9iYXNlcyA9ICgKICAgICAgICBjbHMKICAgICAgICBmb3IgY2xzIGluIF9nZXRfbXJvKGNscykKICAgICAgICBpZiBub3QgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnc2V0dXB0b29scycpCiAgICApCiAgICBiYXNlID0gbmV4dChleHRlcm5hbF9iYXNlcykKICAgIGlmIG5vdCBiYXNlLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnZGlzdHV0aWxzJyk6CiAgICAgICAgbXNnID0gImRpc3R1dGlscyBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgJXIiICUgY2xzCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQogICAgcmV0dXJuIGJhc2UKCgpkZWYgcGF0Y2hfYWxsKCk6CiAgICAjIHdlIGNhbid0IHBhdGNoIGRpc3R1dGlscy5jbWQsIGFsYXMKICAgIGRpc3R1dGlscy5jb3JlLkNvbW1hbmQgPSBzZXR1cHRvb2xzLkNvbW1hbmQKCiAgICBoYXNfaXNzdWVfMTI4ODUgPSBzeXMudmVyc2lvbl9pbmZvIDw9ICgzLCA1LCAzKQoKICAgIGlmIGhhc19pc3N1ZV8xMjg4NToKICAgICAgICAjIGZpeCBmaW5kYWxsIGJ1ZyBpbiBkaXN0dXRpbHMgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjg4NSkKICAgICAgICBkaXN0dXRpbHMuZmlsZWxpc3QuZmluZGFsbCA9IHNldHVwdG9vbHMuZmluZGFsbAoKICAgIG5lZWRzX3dhcmVob3VzZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDEzKQogICAgICAgIG9yCiAgICAgICAgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzLCA3KQogICAgICAgIG9yCiAgICAgICAgKDMsIDQpIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA0LCA2KQogICAgICAgIG9yCiAgICAgICAgKDMsIDUpIDwgc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKICAgICkKCiAgICBpZiBuZWVkc193YXJlaG91c2U6CiAgICAgICAgd2FyZWhvdXNlID0gJ2h0dHBzOi8vdXBsb2FkLnB5cGkub3JnL2xlZ2FjeS8nCiAgICAgICAgZGlzdHV0aWxzLmNvbmZpZy5QeVBJUkNDb21tYW5kLkRFRkFVTFRfUkVQT1NJVE9SWSA9IHdhcmVob3VzZQoKICAgIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2ZpbGUoKQogICAgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfaW5mbygpCgogICAgIyBJbnN0YWxsIERpc3RyaWJ1dGlvbiB0aHJvdWdob3V0IHRoZSBkaXN0dXRpbHMKICAgIGZvciBtb2R1bGUgaW4gZGlzdHV0aWxzLmRpc3QsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuY21kOgogICAgICAgIG1vZHVsZS5EaXN0cmlidXRpb24gPSBzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uCgogICAgIyBJbnN0YWxsIHRoZSBwYXRjaGVkIEV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uID0gc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICBkaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgaWYgJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCcgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgc3lzLm1vZHVsZXNbJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCddLkV4dGVuc2lvbiA9ICgKICAgICAgICAgICAgc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICAgICAgKQoKICAgIHBhdGNoX2Zvcl9tc3ZjX3NwZWNpYWxpemVkX2NvbXBpbGVyKCkKCgpkZWYgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfZmlsZSgpOgogICAgIiIiUGF0Y2ggd3JpdGVfcGtnX2ZpbGUgdG8gYWxzbyB3cml0ZSBSZXF1aXJlcy1QeXRob24vUmVxdWlyZXMtRXh0ZXJuYWwiIiIKICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbk1ldGFkYXRhLndyaXRlX3BrZ19maWxlID0gKAogICAgICAgIHNldHVwdG9vbHMuZGlzdC53cml0ZV9wa2dfZmlsZQogICAgKQoKCmRlZiBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19pbmZvKCk6CiAgICAiIiIKICAgIFdvcmthcm91bmQgaXNzdWUgIzE5NyAtIFB5dGhvbiAzIHByaW9yIHRvIDMuMi4yIHVzZXMgYW4gZW52aXJvbm1lbnQtbG9jYWwKICAgIGVuY29kaW5nIHRvIHNhdmUgdGhlIHBrZ19pbmZvLiBNb25rZXktcGF0Y2ggaXRzIHdyaXRlX3BrZ19pbmZvIG1ldGhvZCB0bwogICAgY29ycmVjdCB0aGlzIHVuZGVzaXJhYmxlIGJlaGF2aW9yLgogICAgIiIiCiAgICBlbnZpcm9ubWVudF9sb2NhbCA9ICgzLCkgPD0gc3lzLnZlcnNpb25faW5mb1s6M10gPCAoMywgMiwgMikKICAgIGlmIG5vdCBlbnZpcm9ubWVudF9sb2NhbDoKICAgICAgICByZXR1cm4KCiAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb25NZXRhZGF0YS53cml0ZV9wa2dfaW5mbyA9ICgKICAgICAgICBzZXR1cHRvb2xzLmRpc3Qud3JpdGVfcGtnX2luZm8KICAgICkKCgpkZWYgcGF0Y2hfZnVuYyhyZXBsYWNlbWVudCwgdGFyZ2V0X21vZCwgZnVuY19uYW1lKToKICAgICIiIgogICAgUGF0Y2ggZnVuY19uYW1lIGluIHRhcmdldF9tb2Qgd2l0aCByZXBsYWNlbWVudAoKICAgIEltcG9ydGFudCAtIG9yaWdpbmFsIG11c3QgYmUgcmVzb2x2ZWQgYnkgbmFtZSB0byBhdm9pZAogICAgcGF0Y2hpbmcgYW4gYWxyZWFkeSBwYXRjaGVkIGZ1bmN0aW9uLgogICAgIiIiCiAgICBvcmlnaW5hbCA9IGdldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lKQoKICAgICMgc2V0IHRoZSAndW5wYXRjaGVkJyBhdHRyaWJ1dGUgb24gdGhlIHJlcGxhY2VtZW50IHRvCiAgICAjIHBvaW50IHRvIHRoZSBvcmlnaW5hbC4KICAgIHZhcnMocmVwbGFjZW1lbnQpLnNldGRlZmF1bHQoJ3VucGF0Y2hlZCcsIG9yaWdpbmFsKQoKICAgICMgcmVwbGFjZSB0aGUgZnVuY3Rpb24gaW4gdGhlIG9yaWdpbmFsIG1vZHVsZQogICAgc2V0YXR0cih0YXJnZXRfbW9kLCBmdW5jX25hbWUsIHJlcGxhY2VtZW50KQoKCmRlZiBnZXRfdW5wYXRjaGVkX2Z1bmN0aW9uKGNhbmRpZGF0ZSk6CiAgICByZXR1cm4gZ2V0YXR0cihjYW5kaWRhdGUsICd1bnBhdGNoZWQnKQoKCmRlZiBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpOgogICAgIiIiCiAgICBQYXRjaCBmdW5jdGlvbnMgaW4gZGlzdHV0aWxzIHRvIHVzZSBzdGFuZGFsb25lIE1pY3Jvc29mdCBWaXN1YWwgQysrCiAgICBjb21waWxlcnMuCiAgICAiIiIKICAgICMgaW1wb3J0IGxhdGUgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0cyBvbiBQeXRob24gPCAzLjUKICAgIG1zdmMgPSBpbXBvcnRfbW9kdWxlKCdzZXR1cHRvb2xzLm1zdmMnKQoKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKICAgICAgICAjIENvbXBpbGVycyBvbmx5IGF2YWlsYWJsZXMgb24gTWljcm9zb2Z0IFdpbmRvd3MKICAgICAgICByZXR1cm4KCiAgICBkZWYgcGF0Y2hfcGFyYW1zKG1vZF9uYW1lLCBmdW5jX25hbWUpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIHBhcmFtZXRlcnMgZm9yIHBhdGNoX2Z1bmMgdG8gcGF0Y2ggaW5kaWNhdGVkIGZ1bmN0aW9uLgogICAgICAgICIiIgogICAgICAgIHJlcGxfcHJlZml4ID0gJ21zdmM5XycgaWYgJ21zdmM5JyBpbiBtb2RfbmFtZSBlbHNlICdtc3ZjMTRfJwogICAgICAgIHJlcGxfbmFtZSA9IHJlcGxfcHJlZml4ICsgZnVuY19uYW1lLmxzdHJpcCgnXycpCiAgICAgICAgcmVwbCA9IGdldGF0dHIobXN2YywgcmVwbF9uYW1lKQogICAgICAgIG1vZCA9IGltcG9ydF9tb2R1bGUobW9kX25hbWUpCiAgICAgICAgaWYgbm90IGhhc2F0dHIobW9kLCBmdW5jX25hbWUpOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihmdW5jX25hbWUpCiAgICAgICAgcmV0dXJuIHJlcGwsIG1vZCwgZnVuY19uYW1lCgogICAgIyBQeXRob24gMi43IHRvIDMuNAogICAgbXN2YzkgPSBmdW5jdG9vbHMucGFydGlhbChwYXRjaF9wYXJhbXMsICdkaXN0dXRpbHMubXN2Yzljb21waWxlcicpCgogICAgIyBQeXRob24gMy41KwogICAgbXN2YzE0ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXInKQoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyCiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzkoJ2ZpbmRfdmN2YXJzYWxsJykpCiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzkoJ3F1ZXJ5X3ZjdmFyc2FsbCcpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMuX21zdmNjb21waWxlci5fZ2V0X3ZjX2VudgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmMxNCgnX2dldF92Y19lbnYnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zIGZvciBOdW1weQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmMxNCgnZ2VuX2xpYl9vcHRpb25zJykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAILDlOa0nwAAtJ8AACoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21zdmMucHkiIiIKSW1wcm92ZWQgc3VwcG9ydCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzLgoKS25vd24gc3VwcG9ydGVkIGNvbXBpbGVyczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcgKHg4NiwgYW1kNjQpCiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNi4xICh4ODYsIHg2NCwgaWE2NCkKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAgKHg4NiwgeDY0LCBpYTY0KQoKTWljcm9zb2Z0IFZpc3VhbCBDKysgMTAuMDoKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEgKHg4NiwgeDY0LCBpYTY0KQoKTWljcm9zb2Z0IFZpc3VhbCBDKysgMTQuMDoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzIDIwMTUgKHg4NiwgeDY0LCBhcm0pCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQoiIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IExlZ2FjeVZlcnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXJmYWxzZQoKZnJvbSAubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCgppZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CiAgICBmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgd2lucmVnCiAgICBzYWZlX2VudiA9IG9zLmVudmlyb24KZWxzZToKICAgICIiIgogICAgTW9jayB3aW5yZWcgYW5kIGVudmlyb24gc28gdGhlIG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQKICAgIG9uIHRoaXMgcGxhdGZvcm0uCiAgICAiIiIKCiAgICBjbGFzcyB3aW5yZWc6CiAgICAgICAgSEtFWV9VU0VSUyA9IE5vbmUKICAgICAgICBIS0VZX0NVUlJFTlRfVVNFUiA9IE5vbmUKICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUgPSBOb25lCiAgICAgICAgSEtFWV9DTEFTU0VTX1JPT1QgPSBOb25lCgogICAgc2FmZV9lbnYgPSBkaWN0KCkKCl9tc3ZjOV9zdXBwcmVzc19lcnJvcnMgPSAoCiAgICAjIG1zdmM5Y29tcGlsZXIgaXNuJ3QgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zCiAgICBJbXBvcnRFcnJvciwKICAgIAogICAgIyBtc3ZjOWNvbXBpbGVyIHJhaXNlcyBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGluIHNvbWUKICAgICMgZW52aXJvbm1lbnRzLiBTZWUgIzExMTguCiAgICBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCikKCnRyeToKICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IFJlZwpleGNlcHQgX21zdmM5X3N1cHByZXNzX2Vycm9yczoKICAgIHBhc3MKCgpkZWYgbXN2YzlfZmluZF92Y3ZhcnNhbGwodmVyc2lvbik6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLmZpbmRfdmN2YXJzYWxsIiB0byB1c2UgdGhlIHN0YW5kYWxvbmUKICAgIGNvbXBpbGVyIGJ1aWxkIGZvciBQeXRob24gKFZDRm9yUHl0aG9uKS4gRmFsbCBiYWNrIHRvIG9yaWdpbmFsIGJlaGF2aW9yCiAgICB3aGVuIHRoZSBzdGFuZGFsb25lIGNvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuCgogICAgUmVkaXJlY3QgdGhlIHBhdGggb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIEtub3duIHN1cHBvcnRlZCBjb21waWxlcnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2ZXJzaW9uOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIHZjdmFyc2FsbC5iYXQgcGF0aDogc3RyCiAgICAiIiIKICAgIFZDX0JBU0UgPSByJ1NvZnR3YXJlXCVzTWljcm9zb2Z0XERldkRpdlxWQ0ZvclB5dGhvblwlMC4xZicKICAgIGtleSA9IFZDX0JBU0UgJSAoJycsIHZlcnNpb24pCiAgICB0cnk6CiAgICAgICAgIyBQZXItdXNlciBpbnN0YWxscyByZWdpc3RlciB0aGUgY29tcGlsZXIgcGF0aCBoZXJlCiAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUoa2V5LCAiaW5zdGFsbGRpciIpCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEFsbC11c2VyIGluc3RhbGxzIG9uIGEgNjQtYml0IHN5c3RlbSByZWdpc3RlciBoZXJlCiAgICAgICAgICAgIGtleSA9IFZDX0JBU0UgJSAoJ1dvdzY0MzJOb2RlXFwnLCB2ZXJzaW9uKQogICAgICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShrZXksICJpbnN0YWxsZGlyIikKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBOb25lCgogICAgaWYgcHJvZHVjdGRpcjoKICAgICAgICB2Y3ZhcnNhbGwgPSBvcy5wYXRoLm9zLnBhdGguam9pbihwcm9kdWN0ZGlyLCAidmN2YXJzYWxsLmJhdCIpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodmN2YXJzYWxsKToKICAgICAgICAgICAgcmV0dXJuIHZjdmFyc2FsbAoKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmM5X2ZpbmRfdmN2YXJzYWxsKSh2ZXJzaW9uKQoKCmRlZiBtc3ZjOV9xdWVyeV92Y3ZhcnNhbGwodmVyLCBhcmNoPSd4ODYnLCAqYXJncywgKiprd2FyZ3MpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMubXN2Yzljb21waWxlci5xdWVyeV92Y3ZhcnNhbGwiIGZvciBzdXBwb3J0IGV4dHJhCiAgICBjb21waWxlcnMuCgogICAgU2V0IGVudmlyb25tZW50IHdpdGhvdXQgdXNlIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcgKHg4NiwgYW1kNjQpCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDYuMSAoeDg2LCB4NjQsIGlhNjQpCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCAoeDg2LCB4NjQsIGlhNjQpCgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMTAuMDoKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xICh4ODYsIHg2NCwgaWE2NCkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIGVudmlyb25tZW50OiBkaWN0CiAgICAiIiIKICAgICMgVHJ5IHRvIGdldCBlbnZpcm9uZW1lbnQgZnJvbSB2Y3ZhcnNhbGwuYmF0IChDbGFzc2ljYWwgd2F5KQogICAgdHJ5OgogICAgICAgIG9yaWcgPSBnZXRfdW5wYXRjaGVkKG1zdmM5X3F1ZXJ5X3ZjdmFyc2FsbCkKICAgICAgICByZXR1cm4gb3JpZyh2ZXIsIGFyY2gsICphcmdzLCAqKmt3YXJncykKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIGlmIFZjdmFyc2FsbC5iYXQgaXMgbWlzc2luZwogICAgICAgIHBhc3MKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBpZiBlbnZpcm9ubWVudCBub3Qgc2V0IGFmdGVyIGV4ZWN1dGluZyB2Y3ZhcnNhbGwuYmF0CiAgICAgICAgcGFzcwoKICAgICMgSWYgZXJyb3IsIHRyeSB0byBzZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkKICAgIHRyeToKICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvKGFyY2gsIHZlcikucmV0dXJuX2VudigpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGFzIGV4YzoKICAgICAgICBfYXVnbWVudF9leGNlcHRpb24oZXhjLCB2ZXIsIGFyY2gpCiAgICAgICAgcmFpc2UKCgpkZWYgbXN2YzE0X2dldF92Y19lbnYocGxhdF9zcGVjKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYiIGZvciBzdXBwb3J0IGV4dHJhCiAgICBjb21waWxlcnMuCgogICAgU2V0IGVudmlyb25tZW50IHdpdGhvdXQgdXNlIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNC4wOgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzIDIwMTUgKHg4NiwgeDY0LCBhcm0pCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcGxhdF9zcGVjOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBlbnZpcm9ubWVudDogZGljdAogICAgIiIiCiAgICAjIFRyeSB0byBnZXQgZW52aXJvbm1lbnQgZnJvbSB2Y3ZhcnNhbGwuYmF0IChDbGFzc2ljYWwgd2F5KQogICAgdHJ5OgogICAgICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmMxNF9nZXRfdmNfZW52KShwbGF0X3NwZWMpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBWY3ZhcnNhbGwuYmF0IGlzIG1pc3NpbmcKICAgICAgICBwYXNzCgogICAgIyBJZiBlcnJvciwgdHJ5IHRvIHNldCBlbnZpcm9ubWVudCBkaXJlY3RseQogICAgdHJ5OgogICAgICAgIHJldHVybiBFbnZpcm9ubWVudEluZm8ocGxhdF9zcGVjLCB2Y19taW5fdmVyPTE0LjApLnJldHVybl9lbnYoKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyBleGM6CiAgICAgICAgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgMTQuMCkKICAgICAgICByYWlzZQoKCmRlZiBtc3ZjMTRfZ2VuX2xpYl9vcHRpb25zKCphcmdzLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyIgZm9yIGZpeAogICAgY29tcGF0aWJpbGl0eSBiZXR3ZWVuICJudW1weS5kaXN0dXRpbHMiIGFuZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIiCiAgICAoZm9yIE51bXB5IDwgMS4xMS4yKQogICAgIiIiCiAgICBpZiAibnVtcHkuZGlzdHV0aWxzIiBpbiBzeXMubW9kdWxlczoKICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICBpZiBMZWdhY3lWZXJzaW9uKG5wLl9fdmVyc2lvbl9fKSA8IExlZ2FjeVZlcnNpb24oJzEuMTEuMicpOgogICAgICAgICAgICByZXR1cm4gbnAuZGlzdHV0aWxzLmNjb21waWxlci5nZW5fbGliX29wdGlvbnMoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzE0X2dlbl9saWJfb3B0aW9ucykoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBfYXVnbWVudF9leGNlcHRpb24oZXhjLCB2ZXJzaW9uLCBhcmNoPScnKToKICAgICIiIgogICAgQWRkIGRldGFpbHMgdG8gdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHRvIGhlbHAgZ3VpZGUgdGhlIHVzZXIKICAgIGFzIHRvIHdoYXQgYWN0aW9uIHdpbGwgcmVzb2x2ZSBpdC4KICAgICIiIgogICAgIyBFcnJvciBpZiBNU1ZDKysgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBlbnZpcm9ubWVudCBub3Qgc2V0CiAgICBtZXNzYWdlID0gZXhjLmFyZ3NbMF0KCiAgICBpZiAidmN2YXJzYWxsIiBpbiBtZXNzYWdlLmxvd2VyKCkgb3IgInZpc3VhbCBjIiBpbiBtZXNzYWdlLmxvd2VyKCk6CiAgICAgICAgIyBTcGVjaWFsIGVycm9yIG1lc3NhZ2UgaWYgTVNWQysrIG5vdCBpbnN0YWxsZWQKICAgICAgICB0bXBsID0gJ01pY3Jvc29mdCBWaXN1YWwgQysrIHt2ZXJzaW9uOjAuMWZ9IGlzIHJlcXVpcmVkLicKICAgICAgICBtZXNzYWdlID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICBtc2Rvd25sb2FkID0gJ3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0lZCcKICAgICAgICBpZiB2ZXJzaW9uID09IDkuMDoKICAgICAgICAgICAgaWYgYXJjaC5sb3dlcigpLmZpbmQoJ2lhNjQnKSA+IC0xOgogICAgICAgICAgICAgICAgIyBGb3IgVkMrKyA5LjAsIGlmIElBNjQgc3VwcG9ydCBpcyBuZWVkZWQsIHJlZGlyZWN0IHVzZXIKICAgICAgICAgICAgICAgICMgdG8gV2luZG93cyBTREsgNy4wCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAiOiAnCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9IG1zZG93bmxvYWQgJSAzMTM4CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEZvciBWQysrIDkuMCByZWRpcmVjdCB1c2VyIHRvIFZjKysgZm9yIFB5dGhvbiAyLjcgOgogICAgICAgICAgICAgICAgIyBUaGlzIHJlZGlyZWN0aW9uIGxpbmsgaXMgbWFpbnRhaW5lZCBieSBNaWNyb3NvZnQuCiAgICAgICAgICAgICAgICAjIENvbnRhY3QgdnNweXRob25AbWljcm9zb2Z0LmNvbSBpZiBpdCBuZWVkcyB1cGRhdGluZy4KICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgZnJvbSBodHRwOi8vYWthLm1zL3ZjcHl0aG9uMjcnCiAgICAgICAgZWxpZiB2ZXJzaW9uID09IDEwLjA6CiAgICAgICAgICAgICMgRm9yIFZDKysgMTAuMCBSZWRpcmVjdCB1c2VyIHRvIFdpbmRvd3MgU0RLIDcuMQogICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEiOiAnCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gbXNkb3dubG9hZCAlIDgyNzkKICAgICAgICBlbGlmIHZlcnNpb24gPj0gMTQuMDoKICAgICAgICAgICAgIyBGb3IgVkMrKyAxNC4wIFJlZGlyZWN0IHVzZXIgdG8gVmlzdWFsIEMrKyBCdWlsZCBUb29scwogICAgICAgICAgICBtZXNzYWdlICs9ICgnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyI6ICcKICAgICAgICAgICAgICAgICAgICAgICAgcidodHRwOi8vbGFuZGluZ2h1Yi52aXN1YWxzdHVkaW8uY29tLycKICAgICAgICAgICAgICAgICAgICAgICAgJ3Zpc3VhbC1jcHAtYnVpbGQtdG9vbHMnKQoKICAgIGV4Yy5hcmdzID0gKG1lc3NhZ2UsICkKCgpjbGFzcyBQbGF0Zm9ybUluZm86CiAgICAiIiIKICAgIEN1cnJlbnQgYW5kIFRhcmdldCBBcmNoaXRlY3R1cmVzIGluZm9ybWF0aW9ucy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgogICAgIiIiCiAgICBjdXJyZW50X2NwdSA9IHNhZmVfZW52LmdldCgncHJvY2Vzc29yX2FyY2hpdGVjdHVyZScsICcnKS5sb3dlcigpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyY2gpOgogICAgICAgIHNlbGYuYXJjaCA9IGFyY2gubG93ZXIoKS5yZXBsYWNlKCd4NjQnLCAnYW1kNjQnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhcmdldF9jcHUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJjaFtzZWxmLmFyY2guZmluZCgnXycpICsgMTpdCgogICAgZGVmIHRhcmdldF9pc194ODYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0X2NwdSA9PSAneDg2JwoKICAgIGRlZiBjdXJyZW50X2lzX3g4NihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5jdXJyZW50X2NwdSA9PSAneDg2JwoKICAgIGRlZiBjdXJyZW50X2RpcihzZWxmLCBoaWRleDg2PUZhbHNlLCB4NjQ9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEN1cnJlbnQgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGhpZGV4ODY6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICcnIGFuZCBub3QgJ1x4ODYnIGlmIGFyY2hpdGVjdHVyZSBpcyB4ODYuCiAgICAgICAgeDY0OiBib29sCiAgICAgICAgICAgIHJldHVybiAnXHg2NCcgYW5kIG5vdCAnXGFtZDY0JyBpZiBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN1YmZvbGRlcjogc3RyCiAgICAgICAgICAgICdcdGFyZ2V0Jywgb3IgJycgKHNlZSBoaWRleDg2IHBhcmFtZXRlcikKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiAoc2VsZi5jdXJyZW50X2NwdSA9PSAneDg2JyBhbmQgaGlkZXg4NikgZWxzZQogICAgICAgICAgICByJ1x4NjQnIGlmIChzZWxmLmN1cnJlbnRfY3B1ID09ICdhbWQ2NCcgYW5kIHg2NCkgZWxzZQogICAgICAgICAgICByJ1wlcycgJSBzZWxmLmN1cnJlbnRfY3B1CiAgICAgICAgKQoKICAgIGRlZiB0YXJnZXRfZGlyKHNlbGYsIGhpZGV4ODY9RmFsc2UsIHg2ND1GYWxzZSk6CiAgICAgICAgciIiIgogICAgICAgIFRhcmdldCBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgaGlkZXg4NjogYm9vbAogICAgICAgICAgICByZXR1cm4gJycgYW5kIG5vdCAnXHg4NicgaWYgYXJjaGl0ZWN0dXJlIGlzIHg4Ni4KICAgICAgICB4NjQ6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICdceDY0JyBhbmQgbm90ICdcYW1kNjQnIGlmIGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3ViZm9sZGVyOiBzdHIKICAgICAgICAgICAgJ1xjdXJyZW50Jywgb3IgJycgKHNlZSBoaWRleDg2IHBhcmFtZXRlcikKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiAoc2VsZi50YXJnZXRfY3B1ID09ICd4ODYnIGFuZCBoaWRleDg2KSBlbHNlCiAgICAgICAgICAgIHInXHg2NCcgaWYgKHNlbGYudGFyZ2V0X2NwdSA9PSAnYW1kNjQnIGFuZCB4NjQpIGVsc2UKICAgICAgICAgICAgcidcJXMnICUgc2VsZi50YXJnZXRfY3B1CiAgICAgICAgKQoKICAgIGRlZiBjcm9zc19kaXIoc2VsZiwgZm9yY2V4ODY9RmFsc2UpOgogICAgICAgIHIiIiIKICAgICAgICBDcm9zcyBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgZm9yY2V4ODY6IGJvb2wKICAgICAgICAgICAgVXNlICd4ODYnIGFzIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGV2ZW4gaWYgY3VycmVudCBhY3JpdGVjdHVyZSBpcwogICAgICAgICAgICBub3QgeDg2LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdWJmb2xkZXI6IHN0cgogICAgICAgICAgICAnJyBpZiB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLAogICAgICAgICAgICAnXGN1cnJlbnRfdGFyZ2V0JyBpZiBub3QuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudCA9ICd4ODYnIGlmIGZvcmNleDg2IGVsc2Ugc2VsZi5jdXJyZW50X2NwdQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIHNlbGYudGFyZ2V0X2NwdSA9PSBjdXJyZW50IGVsc2UKICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyKCkucmVwbGFjZSgnXFwnLCAnXFwlc18nICUgY3VycmVudCkKICAgICAgICApCgoKY2xhc3MgUmVnaXN0cnlJbmZvOgogICAgIiIiCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByZWxhdGVkIHJlZ2lzdHJ5IGluZm9ybWF0aW9ucy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBwbGF0Zm9ybV9pbmZvOiBQbGF0Zm9ybUluZm8KICAgICAgICAiUGxhdGZvcm1JbmZvIiBpbnN0YW5jZS4KICAgICIiIgogICAgSEtFWVMgPSAod2lucmVnLkhLRVlfVVNFUlMsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9MT0NBTF9NQUNISU5FLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfQ0xBU1NFU19ST09UKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybV9pbmZvKToKICAgICAgICBzZWxmLnBpID0gcGxhdGZvcm1faW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZpc3VhbHN0dWRpbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByb290IHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJ1Zpc3VhbFN0dWRpbycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzeHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU3hTIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYudmlzdWFsc3R1ZGlvLCAnU3hTJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2YyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBWQzcgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5zeHMsICdWQzcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFZTNyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnN4cywgJ1ZTNycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmNfZm9yX3B5dGhvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBmb3IgUHl0aG9uIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcidEZXZEaXZcVkNGb3JQeXRob24nCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWljcm9zb2Z0X3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgU0RLIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJ01pY3Jvc29mdCBTREtzJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpbmRvd3Nfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzL1BsYXRmb3JtIFNESyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLm1pY3Jvc29mdF9zZGssICdXaW5kb3dzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXRmeF9zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLm1pY3Jvc29mdF9zZGssICdORVRGWFNESycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2luZG93c19raXRzX3Jvb3RzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIEtpdHMgUm9vdHMgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiByJ1dpbmRvd3MgS2l0c1xJbnN0YWxsZWQgUm9vdHMnCgogICAgZGVmIG1pY3Jvc29mdChzZWxmLCBrZXksIHg4Nj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGtleSBpbiBNaWNyb3NvZnQgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAga2V5OiBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5IHBhdGggd2hlcmUgbG9vay4KICAgICAgICB4ODY6IHN0cgogICAgICAgICAgICBGb3JjZSB4ODYgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cjogdmFsdWUKICAgICAgICAiIiIKICAgICAgICBub2RlNjQgPSAnJyBpZiBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCkgb3IgeDg2IGVsc2UgJ1dvdzY0MzJOb2RlJwogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oJ1NvZnR3YXJlJywgbm9kZTY0LCAnTWljcm9zb2Z0Jywga2V5KQoKICAgIGRlZiBsb29rdXAoc2VsZiwga2V5LCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBMb29rIGZvciB2YWx1ZXMgaW4gcmVnaXN0cnkgaW4gTWljcm9zb2Z0IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGtleTogc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleSBwYXRoIHdoZXJlIGxvb2suCiAgICAgICAgbmFtZTogc3RyCiAgICAgICAgICAgIFZhbHVlIG5hbWUgdG8gZmluZC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyOiB2YWx1ZQogICAgICAgICIiIgogICAgICAgIEtFWV9SRUFEID0gd2lucmVnLktFWV9SRUFECiAgICAgICAgb3BlbmtleSA9IHdpbnJlZy5PcGVuS2V5CiAgICAgICAgbXMgPSBzZWxmLm1pY3Jvc29mdAogICAgICAgIGZvciBoa2V5IGluIHNlbGYuSEtFWVM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGJrZXkgPSBvcGVua2V5KGhrZXksIG1zKGtleSksIDAsIEtFWV9SRUFEKQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGkuY3VycmVudF9pc194ODYoKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJrZXkgPSBvcGVua2V5KGhrZXksIG1zKGtleSwgVHJ1ZSksIDAsIEtFWV9SRUFEKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiB3aW5yZWcuUXVlcnlWYWx1ZUV4KGJrZXksIG5hbWUpWzBdCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBwYXNzCgoKY2xhc3MgU3lzdGVtSW5mbzoKICAgICIiIgogICAgTWljcm9zb2Z0IFdpbmRvd3MgYW5kIFZpc3VhbCBTdHVkaW8gcmVsYXRlZCBzeXN0ZW0gaW5vcm1hdGlvbnMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcmVnaXN0cnlfaW5mbzogUmVnaXN0cnlJbmZvCiAgICAgICAgIlJlZ2lzdHJ5SW5mbyIgaW5zdGFuY2UuCiAgICB2Y192ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICIiIgoKICAgICMgVmFyaWFibGVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoaXMgY2xhc3MgdXNlIG9yaWdpbmFscyBDYW1lbENhc2UgdmFyaWFibGVzCiAgICAjIG5hbWVzIGZyb20gTWljcm9zb2Z0IHNvdXJjZSBmaWxlcyBmb3IgbW9yZSBlYXN5IGNvbXBhcmFpc29uLgogICAgV2luRGlyID0gc2FmZV9lbnYuZ2V0KCdXaW5EaXInLCAnJykKICAgIFByb2dyYW1GaWxlcyA9IHNhZmVfZW52LmdldCgnUHJvZ3JhbUZpbGVzJywgJycpCiAgICBQcm9ncmFtRmlsZXN4ODYgPSBzYWZlX2Vudi5nZXQoJ1Byb2dyYW1GaWxlcyh4ODYpJywgUHJvZ3JhbUZpbGVzKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWdpc3RyeV9pbmZvLCB2Y192ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5yaSA9IHJlZ2lzdHJ5X2luZm8KICAgICAgICBzZWxmLnBpID0gc2VsZi5yaS5waQogICAgICAgIHNlbGYudmNfdmVyID0gdmNfdmVyIG9yIHNlbGYuX2ZpbmRfbGF0ZXN0X2F2YWlsYWJsZV92Y192ZXIoKQoKICAgIGRlZiBfZmluZF9sYXRlc3RfYXZhaWxhYmxlX3ZjX3ZlcihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbmRfYXZhaWxhYmxlX3ZjX3ZlcnMoKVstMV0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgZXJyID0gJ05vIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24gZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihlcnIpCgogICAgZGVmIGZpbmRfYXZhaWxhYmxlX3ZjX3ZlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBhbGwgYXZhaWxhYmxlIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgIG1zID0gc2VsZi5yaS5taWNyb3NvZnQKICAgICAgICB2Y2tleXMgPSAoc2VsZi5yaS52Yywgc2VsZi5yaS52Y19mb3JfcHl0aG9uLCBzZWxmLnJpLnZzKQogICAgICAgIHZjX3ZlcnMgPSBbXQogICAgICAgIGZvciBoa2V5IGluIHNlbGYucmkuSEtFWVM6CiAgICAgICAgICAgIGZvciBrZXkgaW4gdmNrZXlzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGJrZXkgPSB3aW5yZWcuT3BlbktleShoa2V5LCBtcyhrZXkpLCAwLCB3aW5yZWcuS0VZX1JFQUQpCiAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzdWJrZXlzLCB2YWx1ZXMsIF8gPSB3aW5yZWcuUXVlcnlJbmZvS2V5KGJrZXkpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh2YWx1ZXMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZmxvYXQod2lucmVnLkVudW1WYWx1ZShia2V5LCBpKVswXSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyIG5vdCBpbiB2Y192ZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNfdmVycy5hcHBlbmQodmVyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdWJrZXlzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGZsb2F0KHdpbnJlZy5FbnVtS2V5KGJrZXksIGkpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXIgbm90IGluIHZjX3ZlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y192ZXJzLmFwcGVuZCh2ZXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gc29ydGVkKHZjX3ZlcnMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgVlNJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIG5hbWUgPSAnTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gJTAuMWYnICUgc2VsZi52Y192ZXIKICAgICAgICBkZWZhdWx0ID0gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzeDg2LCBuYW1lKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52cywgJyUwLjFmJyAlIHNlbGYudmNfdmVyKSBvciBkZWZhdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLlZTSW5zdGFsbERpcgoKICAgICAgICBndWVzc192YyA9IHNlbGYuX2d1ZXNzX3ZjKCkgb3Igc2VsZi5fZ3Vlc3NfdmNfbGVnYWN5KCkKCiAgICAgICAgIyBUcnkgdG8gZ2V0ICJWQysrIGZvciBQeXRob24iIHBhdGggZnJvbSByZWdpc3RyeSBhcyBkZWZhdWx0IHBhdGgKICAgICAgICByZWdfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpLnZjX2Zvcl9weXRob24sICclMC4xZicgJSBzZWxmLnZjX3ZlcikKICAgICAgICBweXRob25fdmMgPSBzZWxmLnJpLmxvb2t1cChyZWdfcGF0aCwgJ2luc3RhbGxkaXInKQogICAgICAgIGRlZmF1bHRfdmMgPSBvcy5wYXRoLmpvaW4ocHl0aG9uX3ZjLCAnVkMnKSBpZiBweXRob25fdmMgZWxzZSBndWVzc192YwoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICBwYXRoID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJyUwLjFmJyAlIHNlbGYudmNfdmVyKSBvciBkZWZhdWx0X3ZjCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBtc2cgPSAnTWljcm9zb2Z0IFZpc3VhbCBDKysgZGlyZWN0b3J5IG5vdCBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX2d1ZXNzX3ZjKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvY2F0ZSBWaXN1YWwgQyBmb3IgMjAxNwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDE0LjA6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWZhdWx0ID0gcidWQ1xUb29sc1xNU1ZDJwogICAgICAgIGd1ZXNzX3ZjID0gb3MucGF0aC5qb2luKHNlbGYuVlNJbnN0YWxsRGlyLCBkZWZhdWx0KQogICAgICAgICMgU3ViZGlyIHdpdGggVkMgZXhhY3QgdmVyc2lvbiBhcyBuYW1lCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2Y19leGFjdF92ZXIgPSBvcy5saXN0ZGlyKGd1ZXNzX3ZjKVstMV0KICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihndWVzc192YywgdmNfZXhhY3RfdmVyKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX2d1ZXNzX3ZjX2xlZ2FjeShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2NhdGUgVmlzdWFsIEMgZm9yIHZlcnNpb25zIHByaW9yIHRvIDIwMTcKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0ID0gcidNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAlMC4xZlxWQycgJSBzZWxmLnZjX3ZlcgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXN4ODYsIGRlZmF1bHQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka1ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gOS4wOgogICAgICAgICAgICByZXR1cm4gKCc3LjAnLCAnNi4xJywgJzYuMGEnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPT0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuICgnNy4xJywgJzcuMGEnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPT0gMTEuMDoKICAgICAgICAgICAgcmV0dXJuICgnOC4wJywgJzguMGEnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPT0gMTIuMDoKICAgICAgICAgICAgcmV0dXJuICgnOC4xJywgJzguMWEnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuICgnMTAuMCcsICc4LjEnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtMYXN0VmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgbGFzdCB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5XaW5kb3dzU2RrRGlyLCAnbGliJykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHNka2RpciA9ICcnCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAjIFRyeSB0byBnZXQgaXQgZnJvbSByZWdpc3RyeQogICAgICAgICAgICBsb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS53aW5kb3dzX3NkaywgJ3YlcycgJSB2ZXIpCiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKGxvYywgJ2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIFRyeSB0byBnZXQgIlZDKysgZm9yIFB5dGhvbiIgdmVyc2lvbiBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS52Y19mb3JfcHl0aG9uLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpCiAgICAgICAgICAgIGluc3RhbGxfYmFzZSA9IHNlbGYucmkubG9va3VwKHBhdGgsICdpbnN0YWxsZGlyJykKICAgICAgICAgICAgaWYgaW5zdGFsbF9iYXNlOgogICAgICAgICAgICAgICAgc2RrZGlyID0gb3MucGF0aC5qb2luKGluc3RhbGxfYmFzZSwgJ1dpblNESycpCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBkZWZhdWx0IG5ldyBwYXRoCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIGludHZlciA9IHZlcls6dmVyLnJmaW5kKCcuJyldCiAgICAgICAgICAgICAgICBwYXRoID0gcidNaWNyb3NvZnQgU0RLc1xXaW5kb3dzIEtpdHNcJXMnICUgKGludHZlcikKICAgICAgICAgICAgICAgIGQgPSBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIHNka2RpciA9IGQKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIGRlZmF1bHQgb2xkIHBhdGgKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IHInTWljcm9zb2Z0IFNES3NcV2luZG93c1x2JXMnICUgdmVyCiAgICAgICAgICAgICAgICBkID0gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBzZGtkaXIgPSBkCiAgICAgICAgaWYgbm90IHNka2RpcjoKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgUGxhdGZvcm0gU0RLCiAgICAgICAgICAgIHNka2RpciA9IG9zLnBhdGguam9pbihzZWxmLlZDSW5zdGFsbERpciwgJ1BsYXRmb3JtU0RLJykKICAgICAgICByZXR1cm4gc2RrZGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1NES0V4ZWN1dGFibGVQYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBleGVjdXRhYmxlIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIEZpbmQgV2luU0RLIE5ldEZ4IFRvb2xzIHJlZ2lzdHJ5IGRpciBuYW1lCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTEuMDoKICAgICAgICAgICAgbmV0Znh2ZXIgPSAzNQogICAgICAgICAgICBhcmNoID0gJycKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXRmeHZlciA9IDQwCiAgICAgICAgICAgIGhpZGV4ODYgPSBUcnVlIGlmIHNlbGYudmNfdmVyIDw9IDEyLjAgZWxzZSBGYWxzZQogICAgICAgICAgICBhcmNoID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSwgaGlkZXg4Nj1oaWRleDg2KQogICAgICAgIGZ4ID0gJ1dpblNESy1OZXRGeCVkVG9vbHMlcycgJSAobmV0Znh2ZXIsIGFyY2gucmVwbGFjZSgnXFwnLCAnLScpKQoKICAgICAgICAjIGxpc3RlIGFsbCBwb3NzaWJsZXMgcmVnaXN0cnkgcGF0aHMKICAgICAgICByZWdwYXRocyA9IFtdCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLk5ldEZ4U2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIHJlZ3BhdGhzICs9IFtvcy5wYXRoLmpvaW4oc2VsZi5yaS5uZXRmeF9zZGssIHZlciwgZngpXQoKICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgIHJlZ3BhdGhzICs9IFtvcy5wYXRoLmpvaW4oc2VsZi5yaS53aW5kb3dzX3NkaywgJ3Ylc0EnICUgdmVyLCBmeCldCgogICAgICAgICMgUmV0dXJuIGluc3RhbGxhdGlvbiBmb2xkZXIgZnJvbSB0aGUgbW9yZSByZWNlbnQgcGF0aAogICAgICAgIGZvciBwYXRoIGluIHJlZ3BhdGhzOgogICAgICAgICAgICBleGVjcGF0aCA9IHNlbGYucmkubG9va3VwKHBhdGgsICdpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBleGVjcGF0aDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIGV4ZWNwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgRlNoYXJwSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEYjIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gciclMC4xZlxTZXR1cFxGIycgJSBzZWxmLnZjX3ZlcgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS52aXN1YWxzdHVkaW8sIHBhdGgpCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHBhdGgsICdwcm9kdWN0ZGlyJykgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBVbml2ZXJzYWxDUlRTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDUlQgU0RLIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIFNldCBLaXQgUm9vdHMgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHZlcnMgPSAoJzEwJywgJzgxJykKICAgICAgICBlbHNlOgogICAgICAgICAgICB2ZXJzID0gKCkKCiAgICAgICAgIyBGaW5kIHBhdGggb2YgdGhlIG1vcmUgcmVjZW50IEtpdAogICAgICAgIGZvciB2ZXIgaW4gdmVyczoKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS53aW5kb3dzX2tpdHNfcm9vdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdraXRzcm9vdCVzJyAlIHZlcikKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2RrZGlyIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgVW5pdmVyc2FsQ1JUU2RrTGFzdFZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIGxhc3QgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnbGliJykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTZGtWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgRnhTZGsgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHJldHVybiAoJzQuNi4xJywgJzQuNicpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLk5ldEZ4U2RrVmVyc2lvbjoKICAgICAgICAgICAgbG9jID0gb3MucGF0aC5qb2luKHNlbGYucmkubmV0Znhfc2RrLCB2ZXIpCiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKGxvYywgJ2tpdHNpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBzZGtkaXIgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtEaXIzMihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgMzJiaXQgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgZ3Vlc3NfZncgPSBvcy5wYXRoLmpvaW4oc2VsZi5XaW5EaXIsIHInTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmsnKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya2RpcjMyJykgb3IgZ3Vlc3NfZncKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtEaXI2NChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNjRiaXQgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgZ3Vlc3NfZncgPSBvcy5wYXRoLmpvaW4oc2VsZi5XaW5EaXIsIHInTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcms2NCcpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrZGlyNjQnKSBvciBndWVzc19mdwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya1ZlcnNpb24zMihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgMzJiaXQgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfZG90X25ldF92ZXJzaW9ucygzMikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtWZXJzaW9uNjQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDY0Yml0IHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX2RvdF9uZXRfdmVyc2lvbnMoNjQpCgogICAgZGVmIF9maW5kX2RvdF9uZXRfdmVyc2lvbnMoc2VsZiwgYml0cyk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgdmVyc2lvbnMuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgYml0czogaW50CiAgICAgICAgICAgIFBsYXRmb3JtIG51bWJlciBvZiBiaXRzOiAzMiBvciA2NC4KICAgICAgICAiIiIKICAgICAgICAjIEZpbmQgYWN0dWFsIC5ORVQgdmVyc2lvbiBpbiByZWdpc3RyeQogICAgICAgIHJlZ192ZXIgPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrdmVyJWQnICUgYml0cykKICAgICAgICBkb3RfbmV0X2RpciA9IGdldGF0dHIoc2VsZiwgJ0ZyYW1ld29ya0RpciVkJyAlIGJpdHMpCiAgICAgICAgdmVyID0gcmVnX3ZlciBvciBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShkb3RfbmV0X2RpciwgJ3YnKSBvciAnJwoKICAgICAgICAjIFNldCAuTkVUIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxMi4wOgogICAgICAgICAgICBmcmFtZXdvcmt2ZXIgPSAodmVyLCAndjQuMCcpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxMC4wOgogICAgICAgICAgICBmcmFtZXdvcmt2ZXIgPSAoJ3Y0LjAuMzAzMTknIGlmIHZlci5sb3dlcigpWzoyXSAhPSAndjQnIGVsc2UgdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YzLjUnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPT0gOS4wOgogICAgICAgICAgICBmcmFtZXdvcmt2ZXIgPSAoJ3YzLjUnLCAndjIuMC41MDcyNycpCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPT0gOC4wOgogICAgICAgICAgICBmcmFtZXdvcmt2ZXIgPSAoJ3YzLjAnLCAndjIuMC41MDcyNycpCiAgICAgICAgcmV0dXJuIGZyYW1ld29ya3ZlcgoKICAgIGRlZiBfdXNlX2xhc3RfZGlyX25hbWUoc2VsZiwgcGF0aCwgcHJlZml4PScnKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gbmFtZSBvZiB0aGUgbGFzdCBkaXIgaW4gcGF0aCBvciAnJyBpZiBubyBkaXIgZm91bmQuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgcGF0aDogc3RyCiAgICAgICAgICAgIFVzZSBkaXJzIGluIHRoaXMgcGF0aAogICAgICAgIHByZWZpeDogc3RyCiAgICAgICAgICAgIFVzZSBvbmx5IGRpcnMgc3RhcnRpbmdzIGJ5IHRoaXMgcHJlZml4CiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2hpbmdfZGlycyA9ICgKICAgICAgICAgICAgZGlyX25hbWUKICAgICAgICAgICAgZm9yIGRpcl9uYW1lIGluIHJldmVyc2VkKG9zLmxpc3RkaXIocGF0aCkpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHBhdGgsIGRpcl9uYW1lKSkgYW5kCiAgICAgICAgICAgIGRpcl9uYW1lLnN0YXJ0c3dpdGgocHJlZml4KQogICAgICAgICkKICAgICAgICByZXR1cm4gbmV4dChtYXRjaGluZ19kaXJzLCBOb25lKSBvciAnJwoKCmNsYXNzIEVudmlyb25tZW50SW5mbzoKICAgICIiIgogICAgUmV0dXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc3BlY2lmaWVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24KICAgIGFuZCBwbGF0Zm9ybSA6IExpYiwgSW5jbHVkZSwgUGF0aCBhbmQgbGlicGF0aC4KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjAgdG8gMTQuMC4KCiAgICBTY3JpcHQgY3JlYXRlZCBieSBhbmFseXNpbmcgTWljcm9zb2Z0IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gZmlsZXMgbGlrZQogICAgInZjdmFyc1suLi5dLmJhdCIsICJTZXRFbnYuQ21kIiwgInZjYnVpbGR0b29scy5iYXQiLCAuLi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgogICAgdmNfdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uIElmIG5vdCBzZXQsIGF1dG9kZXRlY3QgdGhlIGxhc3QKICAgICAgICB2ZXJzaW9uLgogICAgdmNfbWluX3ZlcjogZmxvYXQKICAgICAgICBNaW5pbXVtIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIFZhcmlhYmxlcyBhbmQgcHJvcGVydGllcyBpbiB0aGlzIGNsYXNzIHVzZSBvcmlnaW5hbHMgQ2FtZWxDYXNlIHZhcmlhYmxlcwogICAgIyBuYW1lcyBmcm9tIE1pY3Jvc29mdCBzb3VyY2UgZmlsZXMgZm9yIG1vcmUgZWFzeSBjb21wYXJhaXNvbi4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXJjaCwgdmNfdmVyPU5vbmUsIHZjX21pbl92ZXI9MCk6CiAgICAgICAgc2VsZi5waSA9IFBsYXRmb3JtSW5mbyhhcmNoKQogICAgICAgIHNlbGYucmkgPSBSZWdpc3RyeUluZm8oc2VsZi5waSkKICAgICAgICBzZWxmLnNpID0gU3lzdGVtSW5mbyhzZWxmLnJpLCB2Y192ZXIpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgdmNfbWluX3ZlcjoKICAgICAgICAgICAgZXJyID0gJ05vIHN1aXRhYmxlIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24gZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihlcnIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmNfdmVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuc2kudmNfdmVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgVlNUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBUb29scwogICAgICAgICIiIgogICAgICAgIHBhdGhzID0gW3InQ29tbW9uN1xJREUnLCByJ0NvbW1vbjdcVG9vbHMnXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aHMgKz0gW3InQ29tbW9uN1xJREVcQ29tbW9uRXh0ZW5zaW9uc1xNaWNyb3NvZnRcVGVzdFdpbmRvdyddCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ1RlYW0gVG9vbHNcUGVyZm9ybWFuY2UgVG9vbHMnXQogICAgICAgICAgICBwYXRocyArPSBbcidUZWFtIFRvb2xzXFBlcmZvcm1hbmNlIFRvb2xzJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVlNJbnN0YWxsRGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXRoc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrICYgTWljcm9zb2Z0IEZvdW5kYXRpb24gQ2xhc3MgSW5jbHVkZXMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgJ0luY2x1ZGUnKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcidBVExNRkNcSW5jbHVkZScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrICYgTWljcm9zb2Z0IEZvdW5kYXRpb24gQ2xhc3MgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgIHBhdGhzID0gWydMaWIlcycgJSBhcmNoX3N1YmRpciwgcidBVExNRkNcTGliJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHBhdGhzICs9IFtyJ0xpYlxzdG9yZSVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcGF0aCkgZm9yIHBhdGggaW4gcGF0aHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNTdG9yZVJlZnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgc3RvcmUgcmVmZXJlbmNlcyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCByJ0xpYlxzdG9yZVxyZWZlcmVuY2VzJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBUb29scwogICAgICAgICIiIgogICAgICAgIHNpID0gc2VsZi5zaQogICAgICAgIHRvb2xzID0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsICdWQ1BhY2thZ2VzJyldCgogICAgICAgIGZvcmNleDg2ID0gVHJ1ZSBpZiBzZWxmLnZjX3ZlciA8PSAxMC4wIGVsc2UgRmFsc2UKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3Jvc3NfZGlyKGZvcmNleDg2KQogICAgICAgIGlmIGFyY2hfc3ViZGlyOgogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgJ0JpbiVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPT0gMTQuMDoKICAgICAgICAgICAgcGF0aCA9ICdCaW4lcycgJSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsIHBhdGgpXQoKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIGhvc3RfZGlyID0gKHInYmluXEhvc3RYODYlcycgaWYgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcidiaW5cSG9zdFg2NCVzJykKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHNpLlZDSW5zdGFsbERpciwgaG9zdF9kaXIgJSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpKV0KCiAgICAgICAgICAgIGlmIHNlbGYucGkuY3VycmVudF9jcHUgIT0gc2VsZi5waS50YXJnZXRfY3B1OgogICAgICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICBzaS5WQ0luc3RhbGxEaXIsIGhvc3RfZGlyICUgc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgJ0JpbicpXQoKICAgICAgICByZXR1cm4gdG9vbHMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnTGliJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgbGliID0gb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ2xpYicpCiAgICAgICAgICAgIGxpYnZlciA9IHNlbGYuX3Nka19zdWJkaXIKICAgICAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4obGliLCAnJXN1bSVzJyAlIChsaWJ2ZXIgLCBhcmNoX3N1YmRpcikpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIEluY2x1ZGUKICAgICAgICAiIiIKICAgICAgICBpbmNsdWRlID0gb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ2luY2x1ZGUnKQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gW2luY2x1ZGUsIG9zLnBhdGguam9pbihpbmNsdWRlLCAnZ2wnKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgICAgIHNka3ZlciA9IHNlbGYuX3Nka19zdWJkaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNka3ZlciA9ICcnCiAgICAgICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3NoYXJlZCcgJSBzZGt2ZXIpLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihpbmNsdWRlLCAnJXN1bScgJSBzZGt2ZXIpLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihpbmNsdWRlLCAnJXN3aW5ydCcgJSBzZGt2ZXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TTGlicGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgTGlicmFyaWVzIFBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmVmID0gb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1JlZmVyZW5jZXMnKQogICAgICAgIGxpYnBhdGggPSBbXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSA5LjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gc2VsZi5PU0xpYnJhcmllcwoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxMS4wOgogICAgICAgICAgICBsaWJwYXRoICs9IFtvcy5wYXRoLmpvaW4ocmVmLCByJ0NvbW1vbkNvbmZpZ3VyYXRpb25cTmV1dHJhbCcpXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBsaWJwYXRoICs9IFsKICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdVbmlvbk1ldGFkYXRhJyksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgICAgICdXaW5kb3dzLkZvdW5kYXRpb24uVW5pdmVyc2FsQXBpQ29udHJhY3QnLAogICAgICAgICAgICAgICAgICAgICcxLjAuMC4wJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgICAgICdXaW5kb3dzLkZvdW5kYXRpb24uRm91bmRhdGlvbkNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAnV2luZG93cy5OZXR3b3JraW5nLkNvbm5lY3Rpdml0eS5Xd2FuQ29udHJhY3QnLAogICAgICAgICAgICAgICAgICAgICcxLjAuMC4wJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaS5XaW5kb3dzU2RrRGlyLAogICAgICAgICAgICAgICAgICAgICdFeHRlbnNpb25TREtzJywKICAgICAgICAgICAgICAgICAgICAnTWljcm9zb2Z0LlZDTGlicycsCiAgICAgICAgICAgICAgICAgICAgJyUwLjFmJyAlIHNlbGYudmNfdmVyLAogICAgICAgICAgICAgICAgICAgICdSZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAnQ29tbW9uQ29uZmlndXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ25ldXRyYWwnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgXQogICAgICAgIHJldHVybiBsaWJwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgU2RrVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fc2RrX3Rvb2xzKCkpCgogICAgZGVmIF9zZGtfdG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFRvb2xzIHBhdGhzIGdlbmVyYXRvcgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTUuMDoKICAgICAgICAgICAgYmluX2RpciA9ICdCaW4nIGlmIHNlbGYudmNfdmVyIDw9IDExLjAgZWxzZSByJ0Jpblx4ODYnCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIGJpbl9kaXIpCgogICAgICAgIGlmIG5vdCBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCk6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aCA9ICdCaW4lcycgJSBhcmNoX3N1YmRpcgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBwYXRoKQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA9PSAxMC4wIG9yIHNlbGYudmNfdmVyID09IDExLjA6CiAgICAgICAgICAgIGlmIHNlbGYucGkudGFyZ2V0X2lzX3g4NigpOgogICAgICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSAnJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGggPSByJ0JpblxORVRGWCA0LjAgVG9vbHMlcycgJSBhcmNoX3N1YmRpcgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBwYXRoKQoKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnQmluJykKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBzZGt2ZXIgPSBzZWxmLnNpLldpbmRvd3NTZGtMYXN0VmVyc2lvbgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgJyVzJXMnICUgKHNka3ZlciwgYXJjaF9zdWJkaXIpKQoKICAgICAgICBpZiBzZWxmLnNpLldpbmRvd3NTREtFeGVjdXRhYmxlUGF0aDoKICAgICAgICAgICAgeWllbGQgc2VsZi5zaS5XaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfc2RrX3N1YmRpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgdmVyc2lvbiBzdWJkaXIKICAgICAgICAiIiIKICAgICAgICB1Y3J0dmVyID0gc2VsZi5zaS5XaW5kb3dzU2RrTGFzdFZlcnNpb24KICAgICAgICByZXR1cm4gKCclc1xcJyAlIHVjcnR2ZXIpIGlmIHVjcnR2ZXIgZWxzZSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFNka1NldHVwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBTZXR1cAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyID4gOS4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnU2V0dXAnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBGeFRvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBUb29scwogICAgICAgICIiIgogICAgICAgIHBpID0gc2VsZi5waQogICAgICAgIHNpID0gc2VsZi5zaQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMC4wOgogICAgICAgICAgICBpbmNsdWRlMzIgPSBUcnVlCiAgICAgICAgICAgIGluY2x1ZGU2NCA9IG5vdCBwaS50YXJnZXRfaXNfeDg2KCkgYW5kIG5vdCBwaS5jdXJyZW50X2lzX3g4NigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5jbHVkZTMyID0gcGkudGFyZ2V0X2lzX3g4NigpIG9yIHBpLmN1cnJlbnRfaXNfeDg2KCkKICAgICAgICAgICAgaW5jbHVkZTY0ID0gcGkuY3VycmVudF9jcHUgPT0gJ2FtZDY0JyBvciBwaS50YXJnZXRfY3B1ID09ICdhbWQ2NCcKCiAgICAgICAgdG9vbHMgPSBbXQogICAgICAgIGlmIGluY2x1ZGUzMjoKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5GcmFtZXdvcmtEaXIzMiwgdmVyKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHZlciBpbiBzaS5GcmFtZXdvcmtWZXJzaW9uMzJdCiAgICAgICAgaWYgaW5jbHVkZTY0OgogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLkZyYW1ld29ya0RpcjY0LCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgdmVyIGluIHNpLkZyYW1ld29ya1ZlcnNpb242NF0KICAgICAgICByZXR1cm4gdG9vbHMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNES0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5ldCBGcmFtZXdvcmsgU0RLIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMCBvciBub3Qgc2VsZi5zaS5OZXRGeFNka0RpcjoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuTmV0RnhTZGtEaXIsIHInbGliXHVtJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U0RLSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5OZXQgRnJhbWV3b3JrIFNESyBJbmNsdWRlcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMCBvciBub3Qgc2VsZi5zaS5OZXRGeFNka0RpcjoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuTmV0RnhTZGtEaXIsIHInaW5jbHVkZVx1bScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZzVERiKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFRlYW0gU3lzdGVtIERhdGFiYXNlCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WU0luc3RhbGxEaXIsIHInVlNUU0RCXERlcGxveScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE1TQnVpbGQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IEJ1aWxkIEVuZ2luZQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTIuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA8IDE1LjA6CiAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuc2kuUHJvZ3JhbUZpbGVzeDg2CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmFzZV9wYXRoID0gc2VsZi5zaS5WU0luc3RhbGxEaXIKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSAnJwoKICAgICAgICBwYXRoID0gcidNU0J1aWxkXCUwLjFmXGJpbiVzJyAlIChzZWxmLnZjX3ZlciwgYXJjaF9zdWJkaXIpCiAgICAgICAgYnVpbGQgPSBbb3MucGF0aC5qb2luKGJhc2VfcGF0aCwgcGF0aCldCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE1LjA6CiAgICAgICAgICAgICMgQWRkIFJvc2x5biBDIyAmIFZpc3VhbCBCYXNpYyBDb21waWxlcgogICAgICAgICAgICBidWlsZCArPSBbb3MucGF0aC5qb2luKGJhc2VfcGF0aCwgcGF0aCwgJ1Jvc2x5bicpXQoKICAgICAgICByZXR1cm4gYnVpbGQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBIVE1MSGVscFdvcmtzaG9wKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBIVE1MIEhlbHAgV29ya3Nob3AKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDExLjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlByb2dyYW1GaWxlc3g4NiwgJ0hUTUwgSGVscCBXb3Jrc2hvcCcpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVDUlRMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGxpYiA9IG9zLnBhdGguam9pbihzZWxmLnNpLlVuaXZlcnNhbENSVFNka0RpciwgJ2xpYicpCiAgICAgICAgdWNydHZlciA9IHNlbGYuX3VjcnRfc3ViZGlyCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4obGliLCAnJXN1Y3J0JXMnICUgKHVjcnR2ZXIsIGFyY2hfc3ViZGlyKSldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVUNSVEluY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBJbmNsdWRlCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgaW5jbHVkZSA9IG9zLnBhdGguam9pbihzZWxmLnNpLlVuaXZlcnNhbENSVFNka0RpciwgJ2luY2x1ZGUnKQogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3VjcnQnICUgc2VsZi5fdWNydF9zdWJkaXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF91Y3J0X3N1YmRpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgdmVyc2lvbiBzdWJkaXIKICAgICAgICAiIiIKICAgICAgICB1Y3J0dmVyID0gc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtMYXN0VmVyc2lvbgogICAgICAgIHJldHVybiAoJyVzXFwnICUgdWNydHZlcikgaWYgdWNydHZlciBlbHNlICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgRlNoYXJwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgRiMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDExLjAgYW5kIHNlbGYudmNfdmVyID4gMTIuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBzZWxmLnNpLkZTaGFycEluc3RhbGxEaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1J1bnRpbWVSZWRpc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgcnVudGltZSByZWRpc3RyaWJ1YWJsZSBkbGwKICAgICAgICAiIiIKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE1OgogICAgICAgICAgICByZWRpc3RfcGF0aCA9IHNlbGYuc2kuVkNJbnN0YWxsRGlyCiAgICAgICAgICAgIHZjcnVudGltZSA9ICdyZWRpc3Qlc1xcTWljcm9zb2Z0LlZDJWQwLkNSVFxcdmNydW50aW1lJWQwLmRsbCcKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWRpc3RfcGF0aCA9IHNlbGYuc2kuVkNJbnN0YWxsRGlyLnJlcGxhY2UoJ1xcVG9vbHMnLCAnXFxSZWRpc3QnKQogICAgICAgICAgICB2Y3J1bnRpbWUgPSAnb25lY29yZSVzXFxNaWNyb3NvZnQuVkMlZDAuQ1JUXFx2Y3J1bnRpbWUlZDAuZGxsJwoKICAgICAgICAjIFZpc3VhbCBTdHVkaW8gMjAxNyAgaXMgc3RpbGwgVmlzdWFsIEMrKyAxNC4wCiAgICAgICAgZGxsX3ZlciA9IDE0LjAgaWYgc2VsZi52Y192ZXIgPT0gMTUgZWxzZSBzZWxmLnZjX3ZlcgoKICAgICAgICB2Y3J1bnRpbWUgPSB2Y3J1bnRpbWUgJSAoYXJjaF9zdWJkaXIsIHNlbGYudmNfdmVyLCBkbGxfdmVyKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocmVkaXN0X3BhdGgsIHZjcnVudGltZSkKCiAgICBkZWYgcmV0dXJuX2VudihzZWxmLCBleGlzdHM9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGVudmlyb25tZW50IGRpY3QuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgZXhpc3RzOiBib29sCiAgICAgICAgICAgIEl0IFRydWUsIG9ubHkgcmV0dXJuIGV4aXN0aW5nIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIGVudiA9IGRpY3QoCiAgICAgICAgICAgIGluY2x1ZGU9c2VsZi5fYnVpbGRfcGF0aHMoJ2luY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VQ1JUSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTmV0RnhTREtJbmNsdWRlc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgbGliPXNlbGYuX2J1aWxkX3BhdGhzKCdsaWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VQ1JUTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTmV0RnhTREtMaWJyYXJpZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgbGlicGF0aD1zZWxmLl9idWlsZF9wYXRocygnbGlicGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5WQ1N0b3JlUmVmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0xpYnBhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIHBhdGg9c2VsZi5fYnVpbGRfcGF0aHMoJ3BhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVlNUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Wc1REYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZGtUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZGtTZXR1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk1TQnVpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSFRNTEhlbHBXb3Jrc2hvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GU2hhcnBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgKQogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0IGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLlZDUnVudGltZVJlZGlzdCk6CiAgICAgICAgICAgIGVudlsncHlfdmNydW50aW1lX3JlZGlzdCddID0gc2VsZi5WQ1J1bnRpbWVSZWRpc3QKICAgICAgICByZXR1cm4gZW52CgogICAgZGVmIF9idWlsZF9wYXRocyhzZWxmLCBuYW1lLCBzcGVjX3BhdGhfbGlzdHMsIGV4aXN0cyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBhbmQgc3BlY2lmaWVkIHBhdGhzLAogICAgICAgIHJldHVybiBhIHBhdGhzZXAtc2VwYXJhdGVkIHN0cmluZyBvZiBwYXRocyBjb250YWluaW5nCiAgICAgICAgdW5pcXVlLCBleHRhbnQsIGRpcmVjdG9yaWVzIGZyb20gdGhvc2UgcGF0aHMgYW5kIGZyb20KICAgICAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuIFJhaXNlIGFuIGVycm9yIGlmIG5vIHBhdGhzCiAgICAgICAgYXJlIHJlc29sdmVkLgogICAgICAgICIiIgogICAgICAgICMgZmxhdHRlbiBzcGVjX3BhdGhfbGlzdHMKICAgICAgICBzcGVjX3BhdGhzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUoc3BlY19wYXRoX2xpc3RzKQogICAgICAgIGVudl9wYXRocyA9IHNhZmVfZW52LmdldChuYW1lLCAnJykuc3BsaXQob3MucGF0aHNlcCkKICAgICAgICBwYXRocyA9IGl0ZXJ0b29scy5jaGFpbihzcGVjX3BhdGhzLCBlbnZfcGF0aHMpCiAgICAgICAgZXh0YW50X3BhdGhzID0gbGlzdChmaWx0ZXIob3MucGF0aC5pc2RpciwgcGF0aHMpKSBpZiBleGlzdHMgZWxzZSBwYXRocwogICAgICAgIGlmIG5vdCBleHRhbnRfcGF0aHM6CiAgICAgICAgICAgIG1zZyA9ICIlcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBlbXB0eSIgJSBuYW1lLnVwcGVyKCkKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKICAgICAgICB1bmlxdWVfcGF0aHMgPSBzZWxmLl91bmlxdWVfZXZlcnNlZW4oZXh0YW50X3BhdGhzKQogICAgICAgIHJldHVybiBvcy5wYXRoc2VwLmpvaW4odW5pcXVlX3BhdGhzKQoKICAgICMgZnJvbSBQeXRob24gZG9jcwogICAgZGVmIF91bmlxdWVfZXZlcnNlZW4oc2VsZiwgaXRlcmFibGUsIGtleT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4KICAgICAgICBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLgoKICAgICAgICBfdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAoKICAgICAgICBfdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgICAgICIiIgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgICAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudApQSwMEFAAAAAAAAAAhAGML49Z/DAAAfwwAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL25hbWVzcGFjZXMucHlpbXBvcnQgb3MKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgoKZmxhdHRlbiA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlCgoKY2xhc3MgSW5zdGFsbGVyOgoKICAgIG5zcGtnX2V4dCA9ICctbnNwa2cucHRoJwoKICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgbnNwID0gc2VsZi5fZ2V0X2FsbF9uc19wYWNrYWdlcygpCiAgICAgICAgaWYgbm90IG5zcDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIGxpbmVzID0gbWFwKHNlbGYuX2dlbl9uc3BrZ19saW5lLCBuc3ApCgogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgIyBhbHdheXMgZ2VuZXJhdGUgdGhlIGxpbmVzLCBldmVuIGluIGRyeSBydW4KICAgICAgICAgICAgbGlzdChsaW5lcykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQoKICAgIGRlZiB1bmluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLl9nZXRfdGFyZ2V0KCkpCiAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5uc3BrZ19leHQKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldAoKICAgIF9uc3BrZ190bXBsID0gKAogICAgICAgICJpbXBvcnQgc3lzLCB0eXBlcywgb3MiLAogICAgICAgICJoYXNfbWZzID0gc3lzLnZlcnNpb25faW5mbyA+ICgzLCA1KSIsCiAgICAgICAgInAgPSBvcy5wYXRoLmpvaW4oJShyb290KXMsIColKHB0aClyKSIsCiAgICAgICAgImltcG9ydGxpYiA9IGhhc19tZnMgYW5kIF9faW1wb3J0X18oJ2ltcG9ydGxpYi51dGlsJykiLAogICAgICAgICJoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIubWFjaGluZXJ5JykiLAogICAgICAgICJtID0gaGFzX21mcyBhbmQgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCAiCiAgICAgICAgICAgICAgICAiaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYygiCiAgICAgICAgICAgICAgICAgICAgImltcG9ydGxpYi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJShwa2cpciwgIgogICAgICAgICAgICAgICAgICAgICAgICAiW29zLnBhdGguZGlybmFtZShwKV0pKSkiLAogICAgICAgICJtID0gbSBvciAiCiAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsIHR5cGVzLk1vZHVsZVR5cGUoJShwa2cpcikpIiwKICAgICAgICAibXAgPSAobSBvciBbXSkgYW5kIG0uX19kaWN0X18uc2V0ZGVmYXVsdCgnX19wYXRoX18nLFtdKSIsCiAgICAgICAgIihwIG5vdCBpbiBtcCkgYW5kIG1wLmFwcGVuZChwKSIsCiAgICApCiAgICAibGluZXMgZm9yIHRoZSBuYW1lc3BhY2UgaW5zdGFsbGVyIgoKICAgIF9uc3BrZ190bXBsX211bHRpID0gKAogICAgICAgICdtIGFuZCBzZXRhdHRyKHN5cy5tb2R1bGVzWyUocGFyZW50KXJdLCAlKGNoaWxkKXIsIG0pJywKICAgICkKICAgICJhZGRpdGlvbmFsIGxpbmUocykgd2hlbiBhIHBhcmVudCBwYWNrYWdlIGlzIGluZGljYXRlZCIKCiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiAic3lzLl9nZXRmcmFtZSgxKS5mX2xvY2Fsc1snc2l0ZWRpciddIgoKICAgIGRlZiBfZ2VuX25zcGtnX2xpbmUoc2VsZiwgcGtnKToKICAgICAgICAjIGVuc3VyZSBwa2cgaXMgbm90IGEgdW5pY29kZSBzdHJpbmcgdW5kZXIgUHl0aG9uIDIuNwogICAgICAgIHBrZyA9IHN0cihwa2cpCiAgICAgICAgcHRoID0gdHVwbGUocGtnLnNwbGl0KCcuJykpCiAgICAgICAgcm9vdCA9IHNlbGYuX2dldF9yb290KCkKICAgICAgICB0bXBsX2xpbmVzID0gc2VsZi5fbnNwa2dfdG1wbAogICAgICAgIHBhcmVudCwgc2VwLCBjaGlsZCA9IHBrZy5ycGFydGl0aW9uKCcuJykKICAgICAgICBpZiBwYXJlbnQ6CiAgICAgICAgICAgIHRtcGxfbGluZXMgKz0gc2VsZi5fbnNwa2dfdG1wbF9tdWx0aQogICAgICAgIHJldHVybiAnOycuam9pbih0bXBsX2xpbmVzKSAlIGxvY2FscygpICsgJ1xuJwoKICAgIGRlZiBfZ2V0X2FsbF9uc19wYWNrYWdlcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gc29ydGVkIGxpc3Qgb2YgYWxsIHBhY2thZ2UgbmFtZXNwYWNlcyIiIgogICAgICAgIHBrZ3MgPSBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10KICAgICAgICByZXR1cm4gc29ydGVkKGZsYXR0ZW4obWFwKHNlbGYuX3BrZ19uYW1lcywgcGtncykpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGtnX25hbWVzKHBrZyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBuYW1lc3BhY2UgcGFja2FnZSwgeWllbGQgdGhlIGNvbXBvbmVudHMgb2YgdGhhdAogICAgICAgIHBhY2thZ2UuCgogICAgICAgID4+PiBuYW1lcyA9IEluc3RhbGxlci5fcGtnX25hbWVzKCdhLmIuYycpCiAgICAgICAgPj4+IHNldChuYW1lcykgPT0gc2V0KFsnYScsICdhLmInLCAnYS5iLmMnXSkKICAgICAgICBUcnVlCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKQogICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICB5aWVsZCAnLicuam9pbihwYXJ0cykKICAgICAgICAgICAgcGFydHMucG9wKCkKCgpjbGFzcyBEZXZlbG9wSW5zdGFsbGVyKEluc3RhbGxlcik6CiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiByZXByKHN0cihzZWxmLmVnZ19wYXRoKSkKCiAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2xpbmsKUEsDBBQAAAAAAAAAIQCJsBPOO54AADueAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5IiIiUHlQSSBhbmQgZGlyZWN0IHBhY2thZ2UgZG93bmxvYWRpbmciIiIKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHNvY2tldAppbXBvcnQgYmFzZTY0CmltcG9ydCBoYXNobGliCmltcG9ydCBpdGVydG9vbHMKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCgp0cnk6CiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgc3BsaXR1c2VyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgc3BsaXR1c2VyCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgaHR0cF9jbGllbnQsIGNvbmZpZ3BhcnNlciwgbWFwCgppbXBvcnQgc2V0dXB0b29scwpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIENIRUNLT1VUX0RJU1QsIERpc3RyaWJ1dGlvbiwgQklOQVJZX0RJU1QsIG5vcm1hbGl6ZV9wYXRoLCBTT1VSQ0VfRElTVCwKICAgIEVudmlyb25tZW50LCBmaW5kX2Rpc3RyaWJ1dGlvbnMsIHNhZmVfbmFtZSwgc2FmZV92ZXJzaW9uLAogICAgdG9fZmlsZW5hbWUsIFJlcXVpcmVtZW50LCBERVZFTE9QX0RJU1QsIEVHR19ESVNULAopCmZyb20gc2V0dXB0b29scyBpbXBvcnQgc3NsX3N1cHBvcnQKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gZm5tYXRjaCBpbXBvcnQgdHJhbnNsYXRlCmZyb20gc2V0dXB0b29scy5weTI3Y29tcGF0IGltcG9ydCBnZXRfYWxsX2hlYWRlcnMKZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbAoKRUdHX0ZSQUdNRU5UID0gcmUuY29tcGlsZShyJ15lZ2c9KFstQS1aYS16MC05Xy4rIV0rKSQnKQpIUkVGID0gcmUuY29tcGlsZSgiIiJocmVmXFxzKj1cXHMqWyciXT8oW14nIj4gXSspIiIiLCByZS5JKQojIHRoaXMgaXMgaGVyZSB0byBmaXggZW1hY3MnIGNydWRkeSBicm9rZW4gc3ludGF4IGhpZ2hsaWdodGluZwpQWVBJX01ENSA9IHJlLmNvbXBpbGUoCiAgICAnPGEgaHJlZj0iKFteIiNdKykiPihbXjxdKyk8L2E+XG5cXHMrXFwoPGEgKD86dGl0bGU9Ik1ENSBoYXNoIlxuXFxzKyknCiAgICAnaHJlZj0iW14/XStcXD86YWN0aW9uPXNob3dfbWQ1JmFtcDtkaWdlc3Q9KFswLTlhLWZdezMyfSkiPm1kNTwvYT5cXCknCikKVVJMX1NDSEVNRSA9IHJlLmNvbXBpbGUoJyhbLSsuYS16MC05XXsyLH0pOicsIHJlLkkpLm1hdGNoCkVYVEVOU0lPTlMgPSAiLnRhci5neiAudGFyLmJ6MiAudGFyIC56aXAgLnRneiIuc3BsaXQoKQoKX19hbGxfXyA9IFsKICAgICdQYWNrYWdlSW5kZXgnLCAnZGlzdHJvc19mb3JfdXJsJywgJ3BhcnNlX2JkaXN0X3dpbmluc3QnLAogICAgJ2ludGVycHJldF9kaXN0cm9fbmFtZScsCl0KCl9TT0NLRVRfVElNRU9VVCA9IDE1CgpfdG1wbCA9ICJzZXR1cHRvb2xzL3tzZXR1cHRvb2xzLl9fdmVyc2lvbl9ffSBQeXRob24tdXJsbGliL3tweV9tYWpvcn0iCnVzZXJfYWdlbnQgPSBfdG1wbC5mb3JtYXQocHlfbWFqb3I9c3lzLnZlcnNpb25bOjNdLCBzZXR1cHRvb2xzPXNldHVwdG9vbHMpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKToKICAgIHRyeToKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAiTm90IGEgVVJMLCBleGlzdGluZyBmaWxlLCBvciByZXF1aXJlbWVudCBzcGVjOiAlciIgJSAoc3BlYywpCiAgICAgICAgKQoKCmRlZiBwYXJzZV9iZGlzdF93aW5pbnN0KG5hbWUpOgogICAgIiIiUmV0dXJuIChiYXNlLHB5dmVyc2lvbikgb3IgKE5vbmUsTm9uZSkgZm9yIHBvc3NpYmxlIC5leGUgbmFtZSIiIgoKICAgIGxvd2VyID0gbmFtZS5sb3dlcigpCiAgICBiYXNlLCBweV92ZXIsIHBsYXQgPSBOb25lLCBOb25lLCBOb25lCgogICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICBpZiBsb3dlci5lbmRzd2l0aCgnLndpbjMyLmV4ZScpOgogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTEwXQogICAgICAgICAgICBwbGF0ID0gJ3dpbjMyJwogICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbjMyLXB5JywgLTE2KToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNl0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLmVuZHN3aXRoKCcud2luLWFtZDY0LmV4ZScpOgogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTE0XQogICAgICAgICAgICBwbGF0ID0gJ3dpbi1hbWQ2NCcKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4tYW1kNjQtcHknLCAtMjApOgogICAgICAgICAgICBweV92ZXIgPSBuYW1lWy03Oi00XQogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTIwXQogICAgICAgICAgICBwbGF0ID0gJ3dpbi1hbWQ2NCcKICAgIHJldHVybiBiYXNlLCBweV92ZXIsIHBsYXQKCgpkZWYgZWdnX2luZm9fZm9yX3VybCh1cmwpOgogICAgcGFydHMgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtZXRlcnMsIHF1ZXJ5LCBmcmFnbWVudCA9IHBhcnRzCiAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0xXSkKICAgIGlmIHNlcnZlciA9PSAnc291cmNlZm9yZ2UubmV0JyBhbmQgYmFzZSA9PSAnZG93bmxvYWQnOiAgIyBYWFggWXVjawogICAgICAgIGJhc2UgPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoLnNwbGl0KCcvJylbLTJdKQogICAgaWYgJyMnIGluIGJhc2U6CiAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBiYXNlLnNwbGl0KCcjJywgMSkKICAgIHJldHVybiBiYXNlLCBmcmFnbWVudAoKCmRlZiBkaXN0cm9zX2Zvcl91cmwodXJsLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgdGhhdCBtaWdodCBiZSBmb3VuZCBhdCBhIFVSTCIiIgogICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHVybCkKICAgIGZvciBkaXN0IGluIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKHVybCwgYmFzZSwgbWV0YWRhdGEpOgogICAgICAgIHlpZWxkIGRpc3QKICAgIGlmIGZyYWdtZW50OgogICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICB1cmwsIG1hdGNoLmdyb3VwKDEpLCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1DSEVDS09VVF9ESVNUCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgoKZGVmIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGJhc2VuYW1lIiIiCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotNF0gICMgc3RyaXAgdGhlIC56aXAKICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnJykgYW5kICctJyBpbiBiYXNlbmFtZToKICAgICAgICAjIG9ubHkgb25lLCB1bmFtYmlndW91cyBpbnRlcnByZXRhdGlvbgogICAgICAgIHJldHVybiBbRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSldCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLndobCcpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgd2hlZWwgPSBXaGVlbChiYXNlbmFtZSkKICAgICAgICBpZiBub3Qgd2hlZWwuaXNfY29tcGF0aWJsZSgpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgbG9jYXRpb249bG9jYXRpb24sCiAgICAgICAgICAgIHByb2plY3RfbmFtZT13aGVlbC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgIHZlcnNpb249d2hlZWwudmVyc2lvbiwKICAgICAgICAgICAgIyBJbmNyZWFzZSBwcmlvcml0eSBvdmVyIGVnZ3MuCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QgKyAxLAogICAgICAgICldCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgIHdpbl9iYXNlLCBweV92ZXIsIHBsYXRmb3JtID0gcGFyc2VfYmRpc3Rfd2luaW5zdChiYXNlbmFtZSkKICAgICAgICBpZiB3aW5fYmFzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICAgICAgICAgIGxvY2F0aW9uLCB3aW5fYmFzZSwgbWV0YWRhdGEsIHB5X3ZlciwgQklOQVJZX0RJU1QsIHBsYXRmb3JtCiAgICAgICAgICAgICkKICAgICMgVHJ5IHNvdXJjZSBkaXN0cm8gZXh0ZW5zaW9ucyAoLnppcCwgLnRneiwgZXRjLikKICAgICMKICAgIGZvciBleHQgaW4gRVhURU5TSU9OUzoKICAgICAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aChleHQpOgogICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotbGVuKGV4dCldCiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUobG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSkKICAgIHJldHVybiBbXSAgIyBubyBleHRlbnNpb24gbWF0Y2hlZAoKCmRlZiBkaXN0cm9zX2Zvcl9maWxlbmFtZShmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBwb3NzaWJsZSBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGEgZmlsZW5hbWUiIiIKICAgIHJldHVybiBkaXN0cm9zX2Zvcl9sb2NhdGlvbigKICAgICAgICBub3JtYWxpemVfcGF0aChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YQogICAgKQoKCmRlZiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSwgcHlfdmVyc2lvbj1Ob25lLCBwcmVjZWRlbmNlPVNPVVJDRV9ESVNULAogICAgICAgIHBsYXRmb3JtPU5vbmUKKToKICAgICIiIkdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQoKICAgIE5vdGU6IGlmIGBsb2NhdGlvbmAgaXMgYSBmaWxlc3lzdGVtIGZpbGVuYW1lLCB5b3Ugc2hvdWxkIGNhbGwKICAgIGBgcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aCgpYGAgb24gaXQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcwogICAgcm91dGluZSEKICAgICIiIgogICAgIyBHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKICAgICMgQmVjYXVzZSBzb21lIHBhY2thZ2VzIGFyZSBhbWJpZ3VvdXMgYXMgdG8gbmFtZS92ZXJzaW9ucyBzcGxpdAogICAgIyBlLmcuICJhZG5zLXB5dGhvbi0xLjEuMCIsICJlZ2VuaXgtbXgtY29tbWVyY2lhbCIsIGV0Yy4KICAgICMgU28sIHdlIGdlbmVyYXRlIGVhY2ggcG9zc2libGUgaW50ZXJlcHJldGF0aW9uIChlLmcuICJhZG5zLCBweXRob24tMS4xLjAiCiAgICAjICJhZG5zLXB5dGhvbiwgMS4xLjAiLCBhbmQgImFkbnMtcHl0aG9uLTEuMS4wLCBubyB2ZXJzaW9uIikuICBJbiBwcmFjdGljZSwKICAgICMgdGhlIHNwdXJpb3VzIGludGVycHJldGF0aW9ucyBzaG91bGQgYmUgaWdub3JlZCwgYmVjYXVzZSBpbiB0aGUgZXZlbnQKICAgICMgdGhlcmUncyBhbHNvIGFuICJhZG5zIiBwYWNrYWdlLCB0aGUgc3B1cmlvdXMgInB5dGhvbi0xLjEuMCIgdmVyc2lvbiB3aWxsCiAgICAjIGNvbXBhcmUgbG93ZXIgdGhhbiBhbnkgbnVtZXJpYyB2ZXJzaW9uIG51bWJlciwgYW5kIGlzIHRoZXJlZm9yZSB1bmxpa2VseQogICAgIyB0byBtYXRjaCBhIHJlcXVlc3QgZm9yIGl0LiAgSXQncyBzdGlsbCBhIHBvdGVudGlhbCBwcm9ibGVtLCB0aG91Z2gsIGFuZAogICAgIyBpbiB0aGUgbG9uZyBydW4gUHlQSSBhbmQgdGhlIGRpc3R1dGlscyBzaG91bGQgZ28gZm9yICJzYWZlIiBuYW1lcyBhbmQKICAgICMgdmVyc2lvbnMgaW4gZGlzdHJpYnV0aW9uIGFyY2hpdmUgbmFtZXMgKHNkaXN0IGFuZCBiZGlzdCkuCgogICAgcGFydHMgPSBiYXNlbmFtZS5zcGxpdCgnLScpCiAgICBpZiBub3QgcHlfdmVyc2lvbiBhbmQgYW55KHJlLm1hdGNoKHIncHlcZFwuXGQkJywgcCkgZm9yIHAgaW4gcGFydHNbMjpdKToKICAgICAgICAjIGl0IGlzIGEgYmRpc3RfZHVtYiwgbm90IGFuIHNkaXN0IC0tIGJhaWwgb3V0CiAgICAgICAgcmV0dXJuCgogICAgZm9yIHAgaW4gcmFuZ2UoMSwgbGVuKHBhcnRzKSArIDEpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCAnLScuam9pbihwYXJ0c1s6cF0pLCAnLScuam9pbihwYXJ0c1twOl0pLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHByZWNlZGVuY2U9cHJlY2VkZW5jZSwKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0KICAgICAgICApCgoKIyBGcm9tIFB5dGhvbiAyLjcgZG9jcwpkZWYgdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2l4Lm1vdmVzLmZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgIGVsc2U6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CgoKZGVmIHVuaXF1ZV92YWx1ZXMoZnVuYyk6CiAgICAiIiIKICAgIFdyYXAgYSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmFibGUgc3VjaCB0aGF0IHRoZSByZXN1bHRpbmcgaXRlcmFibGUKICAgIG9ubHkgZXZlciB5aWVsZHMgdW5pcXVlIGl0ZW1zLgogICAgIiIiCgogICAgQHdyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJldHVybiB1bmlxdWVfZXZlcnNlZW4oZnVuYygqYXJncywgKiprd2FyZ3MpKQoKICAgIHJldHVybiB3cmFwcGVyCgoKUkVMID0gcmUuY29tcGlsZShyIiIiPChbXj5dKlxzcmVsXHMqPVxzKlsnIl0/KFteJyI+XSspW14+XSopPiIiIiwgcmUuSSkKIyB0aGlzIGxpbmUgaXMgaGVyZSB0byBmaXggZW1hY3MnIGNydWRkeSBicm9rZW4gc3ludGF4IGhpZ2hsaWdodGluZwoKCkB1bmlxdWVfdmFsdWVzCmRlZiBmaW5kX2V4dGVybmFsX2xpbmtzKHVybCwgcGFnZSk6CiAgICAiIiJGaW5kIHJlbD0iaG9tZXBhZ2UiIGFuZCByZWw9ImRvd25sb2FkIiBsaW5rcyBpbiBgcGFnZWAsIHlpZWxkaW5nIFVSTHMiIiIKCiAgICBmb3IgbWF0Y2ggaW4gUkVMLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgIHRhZywgcmVsID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICByZWxzID0gc2V0KG1hcChzdHIuc3RyaXAsIHJlbC5sb3dlcigpLnNwbGl0KCcsJykpKQogICAgICAgIGlmICdob21lcGFnZScgaW4gcmVscyBvciAnZG93bmxvYWQnIGluIHJlbHM6CiAgICAgICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHRhZyk6CiAgICAgICAgICAgICAgICB5aWVsZCB1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQoKICAgIGZvciB0YWcgaW4gKCI8dGg+SG9tZSBQYWdlIiwgIjx0aD5Eb3dubG9hZCBVUkwiKToKICAgICAgICBwb3MgPSBwYWdlLmZpbmQodGFnKQogICAgICAgIGlmIHBvcyAhPSAtMToKICAgICAgICAgICAgbWF0Y2ggPSBIUkVGLnNlYXJjaChwYWdlLCBwb3MpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCgpjbGFzcyBDb250ZW50Q2hlY2tlcihvYmplY3QpOgogICAgIiIiCiAgICBBIG51bGwgY29udGVudCBjaGVja2VyIHRoYXQgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBjaGVja2luZyBjb250ZW50CiAgICAiIiIKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgIiIiCiAgICAgICAgRmVlZCBhIGJsb2NrIG9mIGRhdGEgdG8gdGhlIGhhc2guCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoZSBoYXNoLiBSZXR1cm4gRmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZXBvcnQoc2VsZiwgcmVwb3J0ZXIsIHRlbXBsYXRlKToKICAgICAgICAiIiIKICAgICAgICBDYWxsIHJlcG9ydGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoZWNrZXIgKGhhc2ggbmFtZSkKICAgICAgICBzdWJzdGl0dXRlZCBpbnRvIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4KCgpjbGFzcyBIYXNoQ2hlY2tlcihDb250ZW50Q2hlY2tlcik6CiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJyg/UDxoYXNoX25hbWU+c2hhMXxzaGEyMjR8c2hhMzg0fHNoYTI1NnxzaGE1MTJ8bWQ1KT0nCiAgICAgICAgcicoP1A8ZXhwZWN0ZWQ+W2EtZjAtOV0rKScKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGFzaF9uYW1lLCBleHBlY3RlZCk6CiAgICAgICAgc2VsZi5oYXNoX25hbWUgPSBoYXNoX25hbWUKICAgICAgICBzZWxmLmhhc2ggPSBoYXNobGliLm5ldyhoYXNoX25hbWUpCiAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV91cmwoY2xzLCB1cmwpOgogICAgICAgICJDb25zdHJ1Y3QgYSAocG9zc2libHkgbnVsbCkgQ29udGVudENoZWNrZXIgZnJvbSBhIFVSTCIKICAgICAgICBmcmFnbWVudCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWy0xXQogICAgICAgIGlmIG5vdCBmcmFnbWVudDoKICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRDaGVja2VyKCkKICAgICAgICBtYXRjaCA9IGNscy5wYXR0ZXJuLnNlYXJjaChmcmFnbWVudCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgcmV0dXJuIGNscygqKm1hdGNoLmdyb3VwZGljdCgpKQoKICAgIGRlZiBmZWVkKHNlbGYsIGJsb2NrKToKICAgICAgICBzZWxmLmhhc2gudXBkYXRlKGJsb2NrKQoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoLmhleGRpZ2VzdCgpID09IHNlbGYuZXhwZWN0ZWQKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgbXNnID0gdGVtcGxhdGUgJSBzZWxmLmhhc2hfbmFtZQogICAgICAgIHJldHVybiByZXBvcnRlcihtc2cpCgoKY2xhc3MgUGFja2FnZUluZGV4KEVudmlyb25tZW50KToKICAgICIiIkEgZGlzdHJpYnV0aW9uIGluZGV4IHRoYXQgc2NhbnMgd2ViIHBhZ2VzIGZvciBkb3dubG9hZCBVUkxzIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBpbmRleF91cmw9Imh0dHBzOi8vcHlwaS5weXRob24ub3JnL3NpbXBsZSIsIGhvc3RzPSgnKicsKSwKICAgICAgICAgICAgY2FfYnVuZGxlPU5vbmUsIHZlcmlmeV9zc2w9VHJ1ZSwgKmFyZ3MsICoqa3cKICAgICk6CiAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBpbmRleF91cmwgKyAiLyIgWzpub3QgaW5kZXhfdXJsLmVuZHN3aXRoKCcvJyldCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHMgPSB7fQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzID0ge30KICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMgPSB7fQogICAgICAgIHNlbGYuYWxsb3dzID0gcmUuY29tcGlsZSgnfCcuam9pbihtYXAodHJhbnNsYXRlLCBob3N0cykpKS5tYXRjaAogICAgICAgIHNlbGYudG9fc2NhbiA9IFtdCiAgICAgICAgdXNlX3NzbCA9ICgKICAgICAgICAgICAgdmVyaWZ5X3NzbAogICAgICAgICAgICBhbmQgc3NsX3N1cHBvcnQuaXNfYXZhaWxhYmxlCiAgICAgICAgICAgIGFuZCAoY2FfYnVuZGxlIG9yIHNzbF9zdXBwb3J0LmZpbmRfY2FfYnVuZGxlKCkpCiAgICAgICAgKQogICAgICAgIGlmIHVzZV9zc2w6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gc3NsX3N1cHBvcnQub3BlbmVyX2ZvcihjYV9idW5kbGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vcGVuZXIgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuCgogICAgZGVmIHByb2Nlc3NfdXJsKHNlbGYsIHVybCwgcmV0cmlldmU9RmFsc2UpOgogICAgICAgICIiIkV2YWx1YXRlIGEgVVJMIGFzIGEgcG9zc2libGUgZG93bmxvYWQsIGFuZCBtYXliZSByZXRyaWV2ZSBpdCIiIgogICAgICAgIGlmIHVybCBpbiBzZWxmLnNjYW5uZWRfdXJscyBhbmQgbm90IHJldHJpZXZlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLnNjYW5uZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgIGlmIG5vdCBVUkxfU0NIRU1FKHVybCk6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZSh1cmwpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3RzID0gbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkKICAgICAgICAgICAgaWYgZGlzdHM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kIGxpbms6ICVzIiwgdXJsKQoKICAgICAgICBpZiBkaXN0cyBvciBub3QgcmV0cmlldmUgb3IgdXJsIGluIHNlbGYuZmV0Y2hlZF91cmxzOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZGlzdHMpKQogICAgICAgICAgICByZXR1cm4gICMgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIHBhZ2UKCiAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmluZm8oIlJlYWRpbmcgJXMiLCB1cmwpCiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IFRydWUgICMgcHJldmVudCBtdWx0aXBsZSBmZXRjaCBhdHRlbXB0cwogICAgICAgIHRtcGwgPSAiRG93bmxvYWQgZXJyb3Igb24gJXM6ICUlcyAtLSBTb21lIHBhY2thZ2VzIG1heSBub3QgYmUgZm91bmQhIgogICAgICAgIGYgPSBzZWxmLm9wZW5fdXJsKHVybCwgdG1wbCAlIHVybCkKICAgICAgICBpZiBmIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW2YudXJsXSA9IFRydWUKICAgICAgICBpZiAnaHRtbCcgbm90IGluIGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICBmLmNsb3NlKCkgICMgbm90IGh0bWwsIHdlIGNhbid0IHByb2Nlc3MgaXQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGJhc2UgPSBmLnVybCAgIyBoYW5kbGUgcmVkaXJlY3RzCiAgICAgICAgcGFnZSA9IGYucmVhZCgpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFnZSwgc3RyKToKICAgICAgICAgICAgIyBJbiBQeXRob24gMyBhbmQgZ290IGJ5dGVzIGJ1dCB3YW50IHN0ci4KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgICMgRXJyb3JzIGhhdmUgbm8gY2hhcnNldCwgYXNzdW1lIGxhdGluMToKICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnbGF0aW4tMScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBmLmhlYWRlcnMuZ2V0X3BhcmFtKCdjaGFyc2V0Jykgb3IgJ2xhdGluLTEnCiAgICAgICAgICAgIHBhZ2UgPSBwYWdlLmRlY29kZShjaGFyc2V0LCAiaWdub3JlIikKICAgICAgICBmLmNsb3NlKCkKICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKICAgICAgICAgICAgbGluayA9IHVybGxpYi5wYXJzZS51cmxqb2luKGJhc2UsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKGxpbmspCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpIGFuZCBnZXRhdHRyKGYsICdjb2RlJywgTm9uZSkgIT0gNDA0OgogICAgICAgICAgICBwYWdlID0gc2VsZi5wcm9jZXNzX2luZGV4KHVybCwgcGFnZSkKCiAgICBkZWYgcHJvY2Vzc19maWxlbmFtZShzZWxmLCBmbiwgbmVzdGVkPUZhbHNlKToKICAgICAgICAjIHByb2Nlc3MgZmlsZW5hbWVzIG9yIGRpcmVjdG9yaWVzCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgc2VsZi53YXJuKCJOb3QgZm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZuKSBhbmQgbm90IG5lc3RlZDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoZm4pCiAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUob3MucGF0aC5qb2luKHBhdGgsIGl0ZW0pLCBUcnVlKQoKICAgICAgICBkaXN0cyA9IGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZuKQogICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZDogJXMiLCBmbikKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKCiAgICBkZWYgdXJsX29rKHNlbGYsIHVybCwgZmF0YWw9RmFsc2UpOgogICAgICAgIHMgPSBVUkxfU0NIRU1FKHVybCkKICAgICAgICBpc19maWxlID0gcyBhbmQgcy5ncm91cCgxKS5sb3dlcigpID09ICdmaWxlJwogICAgICAgIGlmIGlzX2ZpbGUgb3Igc2VsZi5hbGxvd3ModXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbMV0pOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIlxuTm90ZTogQnlwYXNzaW5nICVzIChkaXNhbGxvd2VkIGhvc3Q7IHNlZSAiCiAgICAgICAgICAgICJodHRwOi8vYml0Lmx5LzJockltblkgZm9yIGRldGFpbHMpLlxuIikKICAgICAgICBpZiBmYXRhbDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnICUgdXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2Fybihtc2csIHVybCkKCiAgICBkZWYgc2Nhbl9lZ2dfbGlua3Moc2VsZiwgc2VhcmNoX3BhdGgpOgogICAgICAgIGRpcnMgPSBmaWx0ZXIob3MucGF0aC5pc2Rpciwgc2VhcmNoX3BhdGgpCiAgICAgICAgZWdnX2xpbmtzID0gKAogICAgICAgICAgICAocGF0aCwgZW50cnkpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGRpcnMKICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIocGF0aCkKICAgICAgICAgICAgaWYgZW50cnkuZW5kc3dpdGgoJy5lZ2ctbGluaycpCiAgICAgICAgKQogICAgICAgIGxpc3QoaXRlcnRvb2xzLnN0YXJtYXAoc2VsZi5zY2FuX2VnZ19saW5rLCBlZ2dfbGlua3MpKQoKICAgIGRlZiBzY2FuX2VnZ19saW5rKHNlbGYsIHBhdGgsIGVudHJ5KToKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHBhdGgsIGVudHJ5KSkgYXMgcmF3X2xpbmVzOgogICAgICAgICAgICAjIGZpbHRlciBub24tZW1wdHkgbGluZXMKICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpbHRlcihOb25lLCBtYXAoc3RyLnN0cmlwLCByYXdfbGluZXMpKSkKCiAgICAgICAgaWYgbGVuKGxpbmVzKSAhPSAyOgogICAgICAgICAgICAjIGZvcm1hdCBpcyBub3QgcmVjb2duaXplZDsgcHVudAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWdnX3BhdGgsIHNldHVwX3BhdGggPSBsaW5lcwoKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGgsIGVnZ19wYXRoKSk6CiAgICAgICAgICAgIGRpc3QubG9jYXRpb24gPSBvcy5wYXRoLmpvaW4ocGF0aCwgKmxpbmVzKQogICAgICAgICAgICBkaXN0LnByZWNlZGVuY2UgPSBTT1VSQ0VfRElTVAogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBwcm9jZXNzX2luZGV4KHNlbGYsIHVybCwgcGFnZSk6CiAgICAgICAgIiIiUHJvY2VzcyB0aGUgY29udGVudHMgb2YgYSBQeVBJIHBhZ2UiIiIKCiAgICAgICAgZGVmIHNjYW4obGluayk6CiAgICAgICAgICAgICMgUHJvY2VzcyBhIFVSTCB0byBzZWUgaWYgaXQncyBmb3IgYSBwYWNrYWdlIHBhZ2UKICAgICAgICAgICAgaWYgbGluay5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKToKICAgICAgICAgICAgICAgIHBhcnRzID0gbGlzdChtYXAoCiAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUsIGxpbmtbbGVuKHNlbGYuaW5kZXhfdXJsKTpdLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDIgYW5kICcjJyBub3QgaW4gcGFydHNbMV06CiAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgcGFja2FnZSBwYWdlLCBzYW5pdGl6ZSBhbmQgaW5kZXggaXQKICAgICAgICAgICAgICAgICAgICBwa2cgPSBzYWZlX25hbWUocGFydHNbMF0pCiAgICAgICAgICAgICAgICAgICAgdmVyID0gc2FmZV92ZXJzaW9uKHBhcnRzWzFdKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9wYWdlcy5zZXRkZWZhdWx0KHBrZy5sb3dlcigpLCB7fSlbbGlua10gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvX2ZpbGVuYW1lKHBrZyksIHRvX2ZpbGVuYW1lKHZlcikKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKCiAgICAgICAgIyBwcm9jZXNzIGFuIGluZGV4IHBhZ2UgaW50byB0aGUgcGFja2FnZS1wYWdlIGluZGV4CiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNjYW4odXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBwa2csIHZlciA9IHNjYW4odXJsKSAgIyBlbnN1cmUgdGhpcyBwYWdlIGlzIGluIHRoZSBwYWdlIGluZGV4CiAgICAgICAgaWYgcGtnOgogICAgICAgICAgICAjIHByb2Nlc3MgaW5kaXZpZHVhbCBwYWNrYWdlIHBhZ2UKICAgICAgICAgICAgZm9yIG5ld191cmwgaW4gZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHRoZSBmb3VuZCBVUkwKICAgICAgICAgICAgICAgIGJhc2UsIGZyYWcgPSBlZ2dfaW5mb19mb3JfdXJsKG5ld191cmwpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKSBhbmQgbm90IGZyYWc6CiAgICAgICAgICAgICAgICAgICAgaWYgdmVyOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdXJsICs9ICcjZWdnPSVzLSVzJyAlIChwa2csIHZlcikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5lZWRfdmVyc2lvbl9pbmZvKHVybCkKICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwobmV3X3VybCkKCiAgICAgICAgICAgIHJldHVybiBQWVBJX01ENS5zdWIoCiAgICAgICAgICAgICAgICBsYW1iZGEgbTogJzxhIGhyZWY9IiVzI21kNT0lcyI+JXM8L2E+JyAlIG0uZ3JvdXAoMSwgMywgMiksIHBhZ2UKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiIiAgIyBubyBzZW5zZSBkb3VibGUtc2Nhbm5pbmcgbm9uLXBhY2thZ2UgcGFnZXMKCiAgICBkZWYgbmVlZF92ZXJzaW9uX2luZm8oc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnNjYW5fYWxsKAogICAgICAgICAgICAiUGFnZSBhdCAlcyBsaW5rcyB0byAucHkgZmlsZShzKSB3aXRob3V0IHZlcnNpb24gaW5mbzsgYW4gaW5kZXggIgogICAgICAgICAgICAic2NhbiBpcyByZXF1aXJlZC4iLCB1cmwKICAgICAgICApCgogICAgZGVmIHNjYW5fYWxsKHNlbGYsIG1zZz1Ob25lLCAqYXJncyk6CiAgICAgICAgaWYgc2VsZi5pbmRleF91cmwgbm90IGluIHNlbGYuZmV0Y2hlZF91cmxzOgogICAgICAgICAgICBpZiBtc2c6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4obXNnLCAqYXJncykKICAgICAgICAgICAgc2VsZi5pbmZvKAogICAgICAgICAgICAgICAgIlNjYW5uaW5nIGluZGV4IG9mIGFsbCBwYWNrYWdlcyAodGhpcyBtYXkgdGFrZSBhIHdoaWxlKSIKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwpCgogICAgZGVmIGZpbmRfcGFja2FnZXMoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC51bnNhZmVfbmFtZSArICcvJykKCiAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKICAgICAgICAgICAgIyBGYWxsIGJhY2sgdG8gc2FmZSB2ZXJzaW9uIG9mIHRoZSBuYW1lCiAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgV2UgY291bGRuJ3QgZmluZCB0aGUgdGFyZ2V0IHBhY2thZ2UsIHNvIHNlYXJjaCB0aGUgaW5kZXggcGFnZSB0b28KICAgICAgICAgICAgc2VsZi5ub3RfZm91bmRfaW5faW5kZXgocmVxdWlyZW1lbnQpCgogICAgICAgIGZvciB1cmwgaW4gbGlzdChzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSwgKCkpKToKICAgICAgICAgICAgIyBzY2FuIGVhY2ggcGFnZSB0aGF0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGRlc2lyZWQgcGFja2FnZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXF1aXJlbWVudC5rZXldOgogICAgICAgICAgICBpZiBkaXN0IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiJXMgZG9lcyBub3QgbWF0Y2ggJXMiLCByZXF1aXJlbWVudCwgZGlzdCkKICAgICAgICByZXR1cm4gc3VwZXIoUGFja2FnZUluZGV4LCBzZWxmKS5vYnRhaW4ocmVxdWlyZW1lbnQsIGluc3RhbGxlcikKCiAgICBkZWYgY2hlY2tfaGFzaChzZWxmLCBjaGVja2VyLCBmaWxlbmFtZSwgdGZwKToKICAgICAgICAiIiIKICAgICAgICBjaGVja2VyIGlzIGEgQ29udGVudENoZWNrZXIKICAgICAgICAiIiIKICAgICAgICBjaGVja2VyLnJlcG9ydCgKICAgICAgICAgICAgc2VsZi5kZWJ1ZywKICAgICAgICAgICAgIlZhbGlkYXRpbmcgJSVzIGNoZWNrc3VtIGZvciAlcyIgJSBmaWxlbmFtZSkKICAgICAgICBpZiBub3QgY2hlY2tlci5pc192YWxpZCgpOgogICAgICAgICAgICB0ZnAuY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIHZhbGlkYXRpb24gZmFpbGVkIGZvciAlczsgIgogICAgICAgICAgICAgICAgInBvc3NpYmxlIGRvd25sb2FkIHByb2JsZW0/IgogICAgICAgICAgICAgICAgJSAoY2hlY2tlci5oYXNoLm5hbWUsIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgICAgICApCgogICAgZGVmIGFkZF9maW5kX2xpbmtzKHNlbGYsIHVybHMpOgogICAgICAgICIiIkFkZCBgdXJsc2AgdG8gdGhlIGxpc3QgdGhhdCB3aWxsIGJlIHByZXNjYW5uZWQgZm9yIHNlYXJjaGVzIiIiCiAgICAgICAgZm9yIHVybCBpbiB1cmxzOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4gaXMgTm9uZSAgIyBpZiB3ZSBoYXZlIGFscmVhZHkgImdvbmUgb25saW5lIgogICAgICAgICAgICAgICAgb3Igbm90IFVSTF9TQ0hFTUUodXJsKSAgIyBvciBpdCdzIGEgbG9jYWwgZmlsZS9kaXJlY3RvcnkKICAgICAgICAgICAgICAgIG9yIHVybC5zdGFydHN3aXRoKCdmaWxlOicpCiAgICAgICAgICAgICAgICBvciBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKSAgIyBvciBhIGRpcmVjdCBwYWNrYWdlIGxpbmsKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICMgdGhlbiBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpdCBub3cKICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGRlZmVyIHJldHJpZXZhbCB0aWxsIGxhdGVyCiAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4uYXBwZW5kKHVybCkKCiAgICBkZWYgcHJlc2NhbihzZWxmKToKICAgICAgICAiIiJTY2FuIHVybHMgc2NoZWR1bGVkIGZvciBwcmVzY2FubmluZyAoZS5nLiAtLWZpbmQtbGlua3MpIiIiCiAgICAgICAgaWYgc2VsZi50b19zY2FuOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLnNjYW5fdXJsLCBzZWxmLnRvX3NjYW4pKQogICAgICAgIHNlbGYudG9fc2NhbiA9IE5vbmUgICMgZnJvbSBub3cgb24sIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGltbWVkaWF0ZWx5CgogICAgZGVmIG5vdF9mb3VuZF9pbl9pbmRleChzZWxmLCByZXF1aXJlbWVudCk6CiAgICAgICAgaWYgc2VsZltyZXF1aXJlbWVudC5rZXldOiAgIyB3ZSd2ZSBzZWVuIGF0IGxlYXN0IG9uZSBkaXN0cm8KICAgICAgICAgICAgbWV0aCwgbXNnID0gc2VsZi5pbmZvLCAiQ291bGRuJ3QgcmV0cmlldmUgaW5kZXggcGFnZSBmb3IgJXIiCiAgICAgICAgZWxzZTogICMgbm8gZGlzdHJvcyBzZWVuIGZvciB0aGlzIG5hbWUsIG1pZ2h0IGJlIG1pc3NwZWxsZWQKICAgICAgICAgICAgbWV0aCwgbXNnID0gKAogICAgICAgICAgICAgICAgc2VsZi53YXJuLAogICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgaW5kZXggcGFnZSBmb3IgJXIgKG1heWJlIG1pc3NwZWxsZWQ/KSIpCiAgICAgICAgbWV0aChtc2csIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lKQogICAgICAgIHNlbGYuc2Nhbl9hbGwoKQoKICAgIGRlZiBkb3dubG9hZChzZWxmLCBzcGVjLCB0bXBkaXIpOgogICAgICAgICIiIkxvY2F0ZSBhbmQvb3IgZG93bmxvYWQgYHNwZWNgIHRvIGB0bXBkaXJgLCByZXR1cm5pbmcgYSBsb2NhbCBwYXRoCgogICAgICAgIGBzcGVjYCBtYXkgYmUgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0LCBvciBhIHN0cmluZyBjb250YWluaW5nIGEgVVJMLAogICAgICAgIGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVuYW1lLCBvciBhIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjCiAgICAgICAgKGkuZS4gdGhlIHN0cmluZyBmb3JtIG9mIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCkuICBJZiBpdCBpcyB0aGUgVVJMCiAgICAgICAgb2YgYSAucHkgZmlsZSB3aXRoIGFuIHVuYW1iaWd1b3VzIGBgI2VnZz1uYW1lLXZlcnNpb25gYCB0YWcgKGkuZS4sIG9uZQogICAgICAgIHRoYXQgZXNjYXBlcyBgYC1gYCBhcyBgYF9gYCB0aHJvdWdob3V0KSwgYSB0cml2aWFsIGBgc2V0dXAucHlgYCBpcwogICAgICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbG9uZ3NpZGUgdGhlIGRvd25sb2FkZWQgZmlsZS4KCiAgICAgICAgSWYgYHNwZWNgIGlzIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCBvciBhIHN0cmluZyBjb250YWluaW5nIGEKICAgICAgICBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbG9jYXRpb24gb2YKICAgICAgICBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiAocG9zc2libHkgYWZ0ZXIgZG93bmxvYWRpbmcgaXQgdG8gYHRtcGRpcmApLgogICAgICAgIElmIGBzcGVjYCBpcyBhIGxvY2FsbHkgZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZSwgaXQgaXMgc2ltcGx5CiAgICAgICAgcmV0dXJuZWQgdW5jaGFuZ2VkLiAgSWYgYHNwZWNgIGlzIGEgVVJMLCBpdCBpcyBkb3dubG9hZGVkIHRvIGEgc3VicGF0aAogICAgICAgIG9mIGB0bXBkaXJgLCBhbmQgdGhlIGxvY2FsIGZpbGVuYW1lIGlzIHJldHVybmVkLiAgVmFyaW91cyBlcnJvcnMgbWF5IGJlCiAgICAgICAgcmFpc2VkIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGRvd25sb2FkaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsIFJlcXVpcmVtZW50KToKICAgICAgICAgICAgc2NoZW1lID0gVVJMX1NDSEVNRShzcGVjKQogICAgICAgICAgICBpZiBzY2hlbWU6CiAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpcgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9kb3dubG9hZF91cmwoc2NoZW1lLmdyb3VwKDEpLCBzcGVjLCB0bXBkaXIpCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwoc3BlYykKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5nZW5fc2V0dXAoZm91bmQsIGZyYWdtZW50LCB0bXBkaXIpCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcmV0dXJuIGl0CiAgICAgICAgICAgICAgICByZXR1cm4gc3BlYwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHNwZWMsIHRtcGRpciksICdsb2NhdGlvbicsIE5vbmUpCgogICAgZGVmIGZldGNoX2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlLAogICAgICAgICAgICBkZXZlbG9wX29rPUZhbHNlLCBsb2NhbF9pbmRleD1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAoKICAgICAgICBgcmVxdWlyZW1lbnRgIG11c3QgYmUgYSBgYHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnRgYCBpbnN0YW5jZS4KICAgICAgICBJZiBuZWNlc3NhcnksIG9yIGlmIHRoZSBgZm9yY2Vfc2NhbmAgZmxhZyBpcyBzZXQsIHRoZSByZXF1aXJlbWVudCBpcwogICAgICAgIHNlYXJjaGVkIGZvciBpbiB0aGUgKG9ubGluZSkgcGFja2FnZSBpbmRleCBhcyB3ZWxsIGFzIHRoZSBsb2NhbGx5CiAgICAgICAgaW5zdGFsbGVkIHBhY2thZ2VzLiAgSWYgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCBpcyBmb3VuZCwKICAgICAgICB0aGUgcmV0dXJuZWQgZGlzdHJpYnV0aW9uJ3MgYGBsb2NhdGlvbmBgIGlzIHRoZSB2YWx1ZSB5b3Ugd291bGQgaGF2ZQogICAgICAgIGdvdHRlbiBmcm9tIGNhbGxpbmcgdGhlIGBgZG93bmxvYWQoKWBgIG1ldGhvZCB3aXRoIHRoZSBtYXRjaGluZwogICAgICAgIGRpc3RyaWJ1dGlvbidzIFVSTCBvciBmaWxlbmFtZS4gIElmIG5vIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwKICAgICAgICBgYE5vbmVgYCBpcyByZXR1cm5lZC4KCiAgICAgICAgSWYgdGhlIGBzb3VyY2VgIGZsYWcgaXMgc2V0LCBvbmx5IHNvdXJjZSBkaXN0cmlidXRpb25zIGFuZCBzb3VyY2UKICAgICAgICBjaGVja291dCBsaW5rcyB3aWxsIGJlIGNvbnNpZGVyZWQuICBVbmxlc3MgdGhlIGBkZXZlbG9wX29rYCBmbGFnIGlzCiAgICAgICAgc2V0LCBkZXZlbG9wbWVudCBhbmQgc3lzdGVtIGVnZ3MgKGkuZS4sIHRob3NlIHVzaW5nIHRoZSBgYC5lZ2ctaW5mb2BgCiAgICAgICAgZm9ybWF0KSB3aWxsIGJlIGlnbm9yZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBwcm9jZXNzIGEgUmVxdWlyZW1lbnQKICAgICAgICBzZWxmLmluZm8oIlNlYXJjaGluZyBmb3IgJXMiLCByZXF1aXJlbWVudCkKICAgICAgICBza2lwcGVkID0ge30KICAgICAgICBkaXN0ID0gTm9uZQoKICAgICAgICBkZWYgZmluZChyZXEsIGVudj1Ob25lKToKICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBlbnYgPSBzZWxmCiAgICAgICAgICAgICMgRmluZCBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbjsgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZW52W3JlcS5rZXldOgoKICAgICAgICAgICAgICAgIGlmIGRpc3QucHJlY2VkZW5jZSA9PSBERVZFTE9QX0RJU1QgYW5kIG5vdCBkZXZlbG9wX29rOgogICAgICAgICAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHNraXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBkZXZlbG9wbWVudCBvciBzeXN0ZW0gZWdnOiAlcyIsIGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFtkaXN0XSA9IDEKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHRlc3QgPSAoCiAgICAgICAgICAgICAgICAgICAgZGlzdCBpbiByZXEKICAgICAgICAgICAgICAgICAgICBhbmQgKGRpc3QucHJlY2VkZW5jZSA8PSBTT1VSQ0VfRElTVCBvciBub3Qgc291cmNlKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgdGVzdDoKICAgICAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLmRvd25sb2FkKGRpc3QubG9jYXRpb24sIHRtcGRpcikKICAgICAgICAgICAgICAgICAgICBkaXN0LmRvd25sb2FkX2xvY2F0aW9uID0gbG9jCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdC5kb3dubG9hZF9sb2NhdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CgogICAgICAgIGlmIGZvcmNlX3NjYW46CiAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIG5vdCBkaXN0IGFuZCBsb2NhbF9pbmRleCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQsIGxvY2FsX2luZGV4KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYudG9fc2NhbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmUgYW5kIG5vdCBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJObyBsb2NhbCBwYWNrYWdlcyBvciB3b3JraW5nIGRvd25sb2FkIGxpbmtzIGZvdW5kIGZvciAlcyVzIiwKICAgICAgICAgICAgICAgIChzb3VyY2UgYW5kICJhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgIiBvciAiIiksCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudCwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5mbygiQmVzdCBtYXRjaDogJXMiLCBkaXN0KQogICAgICAgICAgICByZXR1cm4gZGlzdC5jbG9uZShsb2NhdGlvbj1kaXN0LmRvd25sb2FkX2xvY2F0aW9uKQoKICAgIGRlZiBmZXRjaChzZWxmLCByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UpOgogICAgICAgICIiIk9idGFpbiBhIGZpbGUgc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAoKICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIGBgZmV0Y2hfZGlzdHJpYnV0aW9uKClgYCBtZXRob2Qgbm93IGluc3RlYWQuICBGb3IKICAgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIGJ1dCByZXR1cm5zIHRoZQogICAgICAgIGBgbG9jYXRpb25gYCBvZiB0aGUgZG93bmxvYWRlZCBkaXN0cmlidXRpb24gaW5zdGVhZCBvZiBhIGRpc3RyaWJ1dGlvbgogICAgICAgIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5mZXRjaF9kaXN0cmlidXRpb24ocmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbiwgc291cmNlKQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0LmxvY2F0aW9uCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2VuX3NldHVwKHNlbGYsIGZpbGVuYW1lLCBmcmFnbWVudCwgdG1wZGlyKToKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBkaXN0cyA9IG1hdGNoIGFuZCBbCiAgICAgICAgICAgIGQgZm9yIGQgaW4KICAgICAgICAgICAgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGZpbGVuYW1lLCBtYXRjaC5ncm91cCgxKSwgTm9uZSkgaWYgZC52ZXJzaW9uCiAgICAgICAgXSBvciBbXQoKICAgICAgICBpZiBsZW4oZGlzdHMpID09IDE6ICAjIHVuYW1iaWd1b3VzIGBgI2VnZ2BgIGZyYWdtZW50CiAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBiZWVuIGRvd25sb2FkZWQgdG8gdGhlIHRlbXAgZGlyLgogICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpICE9IHRtcGRpcjoKICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGJhc2VuYW1lKQogICAgICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBzYW1lZmlsZQogICAgICAgICAgICAgICAgaWYgbm90IHNhbWVmaWxlKGZpbGVuYW1lLCBkc3QpOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihmaWxlbmFtZSwgZHN0KQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZHN0CgogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRtcGRpciwgJ3NldHVwLnB5JyksICd3JykgYXMgZmlsZToKICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoCiAgICAgICAgICAgICAgICAgICAgImZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXBcbiIKICAgICAgICAgICAgICAgICAgICAic2V0dXAobmFtZT0lciwgdmVyc2lvbj0lciwgcHlfbW9kdWxlcz1bJXJdKVxuIgogICAgICAgICAgICAgICAgICAgICUgKAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0c1swXS5wcm9qZWN0X25hbWUsIGRpc3RzWzBdLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICAgICAgZWxpZiBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgdW5hbWJpZ3VvdXNseSBpbnRlcnByZXQgcHJvamVjdC92ZXJzaW9uIGlkZW50aWZpZXIgJXI7ICIKICAgICAgICAgICAgICAgICJhbnkgZGFzaGVzIGluIHRoZSBuYW1lIG9yIHZlcnNpb24gc2hvdWxkIGJlIGVzY2FwZWQgdXNpbmcgIgogICAgICAgICAgICAgICAgInVuZGVyc2NvcmVzLiAlciIgJSAoZnJhZ21lbnQsIGRpc3RzKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgcHJvY2VzcyBwbGFpbiAucHkgZmlsZXMgd2l0aG91dCBhbiAnI2VnZz1uYW1lLXZlcnNpb24nIgogICAgICAgICAgICAgICAgIiBzdWZmaXggdG8gZW5hYmxlIGF1dG9tYXRpYyBzZXR1cCBzY3JpcHQgZ2VuZXJhdGlvbi4iCiAgICAgICAgICAgICkKCiAgICBkbF9ibG9ja3NpemUgPSA4MTkyCgogICAgZGVmIF9kb3dubG9hZF90byhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBzZWxmLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICBmcCA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNoZWNrZXIgPSBIYXNoQ2hlY2tlci5mcm9tX3VybCh1cmwpCiAgICAgICAgICAgIGZwID0gc2VsZi5vcGVuX3VybCh1cmwpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnAsIHVybGxpYi5lcnJvci5IVFRQRXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGRvd25sb2FkICVzOiAlcyAlcyIgJSAodXJsLCBmcC5jb2RlLCBmcC5tc2cpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGhlYWRlcnMgPSBmcC5pbmZvKCkKICAgICAgICAgICAgYmxvY2tudW0gPSAwCiAgICAgICAgICAgIGJzID0gc2VsZi5kbF9ibG9ja3NpemUKICAgICAgICAgICAgc2l6ZSA9IC0xCiAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgICMgU29tZSBzZXJ2ZXJzIHJldHVybiBtdWx0aXBsZSBDb250ZW50LUxlbmd0aCBoZWFkZXJzIDooCiAgICAgICAgICAgICAgICBzaXplcyA9IGdldF9hbGxfaGVhZGVycyhoZWFkZXJzLCAnQ29udGVudC1MZW5ndGgnKQogICAgICAgICAgICAgICAgc2l6ZSA9IG1heChtYXAoaW50LCBzaXplcykpCiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIHRmcDoKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBmcC5yZWFkKGJzKQogICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyLmZlZWQoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHRmcC53cml0ZShibG9jaykKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2hhc2goY2hlY2tlciwgZmlsZW5hbWUsIHRmcCkKICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBmcDoKICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICBkZWYgcmVwb3J0aG9vayhzZWxmLCB1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYmxrc2l6ZSwgc2l6ZSk6CiAgICAgICAgcGFzcyAgIyBuby1vcAoKICAgIGRlZiBvcGVuX3VybChzZWxmLCB1cmwsIHdhcm5pbmc9Tm9uZSk6CiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6Jyk6CiAgICAgICAgICAgIHJldHVybiBsb2NhbF9vcGVuKHVybCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcGVuX3dpdGhfYXV0aCh1cmwsIHNlbGYub3BlbmVyKQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgaHR0cF9jbGllbnQuSW52YWxpZFVSTCkgYXMgdjoKICAgICAgICAgICAgbXNnID0gJyAnLmpvaW4oW3N0cihhcmcpIGZvciBhcmcgaW4gdi5hcmdzXSkKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCBtc2cpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcignJXMgJXMnICUgKHVybCwgbXNnKSkKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLkhUVFBFcnJvciBhcyB2OgogICAgICAgICAgICByZXR1cm4gdgogICAgICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuVVJMRXJyb3IgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2LnJlYXNvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2LnJlYXNvbikpCiAgICAgICAgZXhjZXB0IGh0dHBfY2xpZW50LkJhZFN0YXR1c0xpbmUgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2LmxpbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAnJXMgcmV0dXJuZWQgYSBiYWQgc3RhdHVzIGxpbmUuIFRoZSBzZXJ2ZXIgbWlnaHQgYmUgJwogICAgICAgICAgICAgICAgICAgICdkb3duLCAlcycgJQogICAgICAgICAgICAgICAgICAgICh1cmwsIHYubGluZSkKICAgICAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgKGh0dHBfY2xpZW50LkhUVFBFeGNlcHRpb24sIHNvY2tldC5lcnJvcikgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yIGZvciAlczogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh1cmwsIHYpKQoKICAgIGRlZiBfZG93bmxvYWRfdXJsKHNlbGYsIHNjaGVtZSwgdXJsLCB0bXBkaXIpOgogICAgICAgICMgRGV0ZXJtaW5lIGRvd25sb2FkIGZpbGVuYW1lCiAgICAgICAgIwogICAgICAgIG5hbWUsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICAgICAgaWYgbmFtZToKICAgICAgICAgICAgd2hpbGUgJy4uJyBpbiBuYW1lOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLi4nLCAnLicpLnJlcGxhY2UoJ1xcJywgJ18nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSAiX19kb3dubG9hZGVkX18iICAjIGRlZmF1bHQgaWYgVVJMIGhhcyBubyBwYXRoIGNvbnRlbnRzCgogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotNF0gICMgc3RyaXAgdGhlIGV4dHJhIC56aXAgYmVmb3JlIGRvd25sb2FkCgogICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgbmFtZSkKCiAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQogICAgICAgICMKICAgICAgICBpZiBzY2hlbWUgPT0gJ3N2bicgb3Igc2NoZW1lLnN0YXJ0c3dpdGgoJ3N2bisnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdnaXQnIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdnaXQrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9naXQodXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZS5zdGFydHN3aXRoKCdoZysnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2hnKHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUgPT0gJ2ZpbGUnOgogICAgICAgICAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QudXJsMnBhdGhuYW1lKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsX29rKHVybCwgVHJ1ZSkgICMgcmFpc2VzIGVycm9yIGlmIG5vdCBhbGxvd2VkCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRlbXB0X2Rvd25sb2FkKHVybCwgZmlsZW5hbWUpCgogICAgZGVmIHNjYW5fdXJsKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5wcm9jZXNzX3VybCh1cmwsIFRydWUpCgogICAgZGVmIF9hdHRlbXB0X2Rvd25sb2FkKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGhlYWRlcnMgPSBzZWxmLl9kb3dubG9hZF90byh1cmwsIGZpbGVuYW1lKQogICAgICAgIGlmICdodG1sJyBpbiBoZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpLmxvd2VyKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9odG1sKHVybCwgaGVhZGVycywgZmlsZW5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9odG1sKHNlbGYsIHVybCwgaGVhZGVycywgZmlsZW5hbWUpOgogICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQogICAgICAgIGZvciBsaW5lIGluIGZpbGU6CiAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlCiAgICAgICAgICAgICAgICBpZiByZS5zZWFyY2gocic8dGl0bGU+KFteLSBdKyAtICk/UmV2aXNpb24gXGQrOicsIGxpbmUpOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHN1YnZlcnNpb24gaW5kZXggcGFnZToKICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgYnJlYWsgICMgbm90IGFuIGluZGV4IHBhZ2UKICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlVuZXhwZWN0ZWQgSFRNTCBwYWdlIGZvdW5kIGF0ICIgKyB1cmwpCgogICAgZGVmIF9kb3dubG9hZF9zdm4oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcjJywgMSlbMF0gICMgcmVtb3ZlIGFueSBmcmFnbWVudCBmb3Igc3ZuJ3Mgc2FrZQogICAgICAgIGNyZWRzID0gJycKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdzdm46JykgYW5kICdAJyBpbiB1cmw6CiAgICAgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwLCBxLCBmID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgICAgICAgICAgaWYgbm90IG5ldGxvYyBhbmQgcGF0aC5zdGFydHN3aXRoKCcvLycpIGFuZCAnLycgaW4gcGF0aFsyOl06CiAgICAgICAgICAgICAgICBuZXRsb2MsIHBhdGggPSBwYXRoWzI6XS5zcGxpdCgnLycsIDEpCiAgICAgICAgICAgICAgICBhdXRoLCBob3N0ID0gc3BsaXR1c2VyKG5ldGxvYykKICAgICAgICAgICAgICAgIGlmIGF1dGg6CiAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGF1dGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsIHB3ID0gYXV0aC5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gIiAtLXVzZXJuYW1lPSVzIC0tcGFzc3dvcmQ9JXMiICUgKHVzZXIsIHB3KQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gIiAtLXVzZXJuYW1lPSIgKyBhdXRoCiAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gaG9zdAogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gc2NoZW1lLCBuZXRsb2MsIHVybCwgcCwgcSwgZgogICAgICAgICAgICAgICAgICAgIHVybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgc3VidmVyc2lvbiBjaGVja291dCBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oInN2biBjaGVja291dCVzIC1xICVzICVzIiAlIChjcmVkcywgdXJsLCBmaWxlbmFtZSkpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1GYWxzZSk6CiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKCiAgICAgICAgc2NoZW1lID0gc2NoZW1lLnNwbGl0KCcrJywgMSlbLTFdCgogICAgICAgICMgU29tZSBmcmFnbWVudCBpZGVudGlmaWNhdGlvbiBmYWlscwogICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KCcjJywgMSlbMF0KCiAgICAgICAgcmV2ID0gTm9uZQogICAgICAgIGlmICdAJyBpbiBwYXRoOgogICAgICAgICAgICBwYXRoLCByZXYgPSBwYXRoLnJzcGxpdCgnQCcsIDEpCgogICAgICAgICMgQWxzbywgZGlzY2FyZCBmcmFnbWVudAogICAgICAgIHVybCA9IHVybGxpYi5wYXJzZS51cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksICcnKSkKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIF9kb3dubG9hZF9naXQoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLl92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1UcnVlKQoKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIGdpdCBjbG9uZSBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oImdpdCBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIkNoZWNraW5nIG91dCAlcyIsIHJldikKICAgICAgICAgICAgb3Muc3lzdGVtKCIoY2QgJXMgJiYgZ2l0IGNoZWNrb3V0IC0tcXVpZXQgJXMpIiAlICgKICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICApKQoKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX2Rvd25sb2FkX2hnKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBoZyBjbG9uZSBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oImhnIGNsb25lIC0tcXVpZXQgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQoKICAgICAgICBpZiByZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5mbygiVXBkYXRpbmcgdG8gJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiKGNkICVzICYmIGhnIHVwIC1DIC1yICVzIC1xKSIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQoKICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCgogICAgZGVmIHdhcm4oc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLndhcm4obXNnLCAqYXJncykKCgojIFRoaXMgcGF0dGVybiBtYXRjaGVzIGEgY2hhcmFjdGVyIGVudGl0eSByZWZlcmVuY2UgKGEgZGVjaW1hbCBudW1lcmljCiMgcmVmZXJlbmNlcywgYSBoZXhhZGVjaW1hbCBudW1lcmljIHJlZmVyZW5jZSwgb3IgYSBuYW1lZCByZWZlcmVuY2UpLgplbnRpdHlfc3ViID0gcmUuY29tcGlsZShyJyYoIyhcZCt8eFtcZGEtZkEtRl0rKXxbXHcuOi1dKyk7PycpLnN1YgoKCmRlZiB1Y2hyKGMpOgogICAgaWYgbm90IGlzaW5zdGFuY2UoYywgaW50KToKICAgICAgICByZXR1cm4gYwogICAgaWYgYyA+IDI1NToKICAgICAgICByZXR1cm4gc2l4LnVuaWNocihjKQogICAgcmV0dXJuIGNocihjKQoKCmRlZiBkZWNvZGVfZW50aXR5KG1hdGNoKToKICAgIHdoYXQgPSBtYXRjaC5ncm91cCgxKQogICAgaWYgd2hhdC5zdGFydHN3aXRoKCcjeCcpOgogICAgICAgIHdoYXQgPSBpbnQod2hhdFsyOl0sIDE2KQogICAgZWxpZiB3aGF0LnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICB3aGF0ID0gaW50KHdoYXRbMTpdKQogICAgZWxzZToKICAgICAgICB3aGF0ID0gc2l4Lm1vdmVzLmh0bWxfZW50aXRpZXMubmFtZTJjb2RlcG9pbnQuZ2V0KHdoYXQsIG1hdGNoLmdyb3VwKDApKQogICAgcmV0dXJuIHVjaHIod2hhdCkKCgpkZWYgaHRtbGRlY29kZSh0ZXh0KToKICAgICIiIkRlY29kZSBIVE1MIGVudGl0aWVzIGluIHRoZSBnaXZlbiB0ZXh0LiIiIgogICAgcmV0dXJuIGVudGl0eV9zdWIoZGVjb2RlX2VudGl0eSwgdGV4dCkKCgpkZWYgc29ja2V0X3RpbWVvdXQodGltZW91dD0xNSk6CiAgICBkZWYgX3NvY2tldF90aW1lb3V0KGZ1bmMpOgogICAgICAgIGRlZiBfc29ja2V0X3RpbWVvdXQoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQogICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9sZF90aW1lb3V0KQoKICAgICAgICByZXR1cm4gX3NvY2tldF90aW1lb3V0CgogICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKCmRlZiBfZW5jb2RlX2F1dGgoYXV0aCk6CiAgICAiIiIKICAgIEEgZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMtMy4zIHRoYXQgd2lsbCBlbmNvZGUKICAgIGF1dGggZnJvbSBhIFVSTCBzdWl0YWJsZSBmb3IgYW4gSFRUUCBoZWFkZXIuCiAgICA+Pj4gc3RyKF9lbmNvZGVfYXV0aCgndXNlcm5hbWUlM0FwYXNzd29yZCcpKQogICAgJ2RYTmxjbTVoYldVNmNHRnpjM2R2Y21RPScKCiAgICBMb25nIGF1dGggc3RyaW5ncyBzaG91bGQgbm90IGNhdXNlIGEgbmV3bGluZSB0byBiZSBpbnNlcnRlZC4KICAgID4+PiBsb25nX2F1dGggPSAndXNlcm5hbWU6JyArICdwYXNzd29yZCcqMTAKICAgID4+PiBjaHIoMTApIGluIHN0cihfZW5jb2RlX2F1dGgobG9uZ19hdXRoKSkKICAgIEZhbHNlCiAgICAiIiIKICAgIGF1dGhfcyA9IHVybGxpYi5wYXJzZS51bnF1b3RlKGF1dGgpCiAgICAjIGNvbnZlcnQgdG8gYnl0ZXMKICAgIGF1dGhfYnl0ZXMgPSBhdXRoX3MuZW5jb2RlKCkKICAgICMgdXNlIHRoZSBsZWdhY3kgaW50ZXJmYWNlIGZvciBQeXRob24gMi4zIHN1cHBvcnQKICAgIGVuY29kZWRfYnl0ZXMgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKGF1dGhfYnl0ZXMpCiAgICAjIGNvbnZlcnQgYmFjayB0byBhIHN0cmluZwogICAgZW5jb2RlZCA9IGVuY29kZWRfYnl0ZXMuZGVjb2RlKCkKICAgICMgc3RyaXAgdGhlIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybgogICAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgnXG4nLCAnJykKCgpjbGFzcyBDcmVkZW50aWFsKG9iamVjdCk6CiAgICAiIiIKICAgIEEgdXNlcm5hbWUvcGFzc3dvcmQgcGFpci4gVXNlIGxpa2UgYSBuYW1lZHR1cGxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHlpZWxkIHNlbGYudXNlcm5hbWUKICAgICAgICB5aWVsZCBzZWxmLnBhc3N3b3JkCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclKHVzZXJuYW1lKXM6JShwYXNzd29yZClzJyAlIHZhcnMoc2VsZikKCgpjbGFzcyBQeVBJQ29uZmlnKGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvYWQgZnJvbSB+Ly5weXBpcmMKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0cyA9IGRpY3QuZnJvbWtleXMoWyd1c2VybmFtZScsICdwYXNzd29yZCcsICdyZXBvc2l0b3J5J10sICcnKQogICAgICAgIGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIuX19pbml0X18oc2VsZiwgZGVmYXVsdHMpCgogICAgICAgIHJjID0gb3MucGF0aC5qb2luKG9zLnBhdGguZXhwYW5kdXNlcignficpLCAnLnB5cGlyYycpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmMpOgogICAgICAgICAgICBzZWxmLnJlYWQocmMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY3JlZHNfYnlfcmVwb3NpdG9yeShzZWxmKToKICAgICAgICBzZWN0aW9uc193aXRoX3JlcG9zaXRvcmllcyA9IFsKICAgICAgICAgICAgc2VjdGlvbiBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zKCkKICAgICAgICAgICAgaWYgc2VsZi5nZXQoc2VjdGlvbiwgJ3JlcG9zaXRvcnknKS5zdHJpcCgpCiAgICAgICAgXQoKICAgICAgICByZXR1cm4gZGljdChtYXAoc2VsZi5fZ2V0X3JlcG9fY3JlZCwgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMpKQoKICAgIGRlZiBfZ2V0X3JlcG9fY3JlZChzZWxmLCBzZWN0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXQoc2VjdGlvbiwgJ3JlcG9zaXRvcnknKS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIHJlcG8sIENyZWRlbnRpYWwoCiAgICAgICAgICAgIHNlbGYuZ2V0KHNlY3Rpb24sICd1c2VybmFtZScpLnN0cmlwKCksCiAgICAgICAgICAgIHNlbGYuZ2V0KHNlY3Rpb24sICdwYXNzd29yZCcpLnN0cmlwKCksCiAgICAgICAgKQoKICAgIGRlZiBmaW5kX2NyZWRlbnRpYWwoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgVVJMIGluZGljYXRlZCBhcHBlYXJzIHRvIGJlIGEgcmVwb3NpdG9yeSBkZWZpbmVkIGluIHRoaXMKICAgICAgICBjb25maWcsIHJldHVybiB0aGUgY3JlZGVudGlhbCBmb3IgdGhhdCByZXBvc2l0b3J5LgogICAgICAgICIiIgogICAgICAgIGZvciByZXBvc2l0b3J5LCBjcmVkIGluIHNlbGYuY3JlZHNfYnlfcmVwb3NpdG9yeS5pdGVtcygpOgogICAgICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChyZXBvc2l0b3J5KToKICAgICAgICAgICAgICAgIHJldHVybiBjcmVkCgoKZGVmIG9wZW5fd2l0aF9hdXRoKHVybCwgb3BlbmVyPXVybGxpYi5yZXF1ZXN0LnVybG9wZW4pOgogICAgIiIiT3BlbiBhIHVybGxpYjIgcmVxdWVzdCwgaGFuZGxpbmcgSFRUUCBhdXRoZW50aWNhdGlvbiIiIgoKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKCiAgICAjIERvdWJsZSBzY2hlbWUgZG9lcyBub3QgcmFpc2Ugb24gTWFjIE9TIFggYXMgcmV2ZWFsZWQgYnkgYQogICAgIyBmYWlsaW5nIHRlc3QuIFdlIHdvdWxkIGV4cGVjdCAibm9ubnVtZXJpYyBwb3J0Ii4gUmVmcyAjMjAuCiAgICBpZiBuZXRsb2MuZW5kc3dpdGgoJzonKToKICAgICAgICByYWlzZSBodHRwX2NsaWVudC5JbnZhbGlkVVJMKCJub25udW1lcmljIHBvcnQ6ICcnIikKCiAgICBpZiBzY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJyk6CiAgICAgICAgYXV0aCwgaG9zdCA9IHNwbGl0dXNlcihuZXRsb2MpCiAgICBlbHNlOgogICAgICAgIGF1dGggPSBOb25lCgogICAgaWYgbm90IGF1dGg6CiAgICAgICAgY3JlZCA9IFB5UElDb25maWcoKS5maW5kX2NyZWRlbnRpYWwodXJsKQogICAgICAgIGlmIGNyZWQ6CiAgICAgICAgICAgIGF1dGggPSBzdHIoY3JlZCkKICAgICAgICAgICAgaW5mbyA9IGNyZWQudXNlcm5hbWUsIHVybAogICAgICAgICAgICBsb2cuaW5mbygnQXV0aGVudGljYXRpbmcgYXMgJXMgZm9yICVzIChmcm9tIC5weXBpcmMpJywgKmluZm8pCgogICAgaWYgYXV0aDoKICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBfZW5jb2RlX2F1dGgoYXV0aCkKICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgaG9zdCwgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZwogICAgICAgIG5ld191cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdChuZXdfdXJsKQogICAgICAgIHJlcXVlc3QuYWRkX2hlYWRlcigiQXV0aG9yaXphdGlvbiIsIGF1dGgpCiAgICBlbHNlOgogICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KHVybCkKCiAgICByZXF1ZXN0LmFkZF9oZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQogICAgZnAgPSBvcGVuZXIocmVxdWVzdCkKCiAgICBpZiBhdXRoOgogICAgICAgICMgUHV0IGF1dGhlbnRpY2F0aW9uIGluZm8gYmFjayBpbnRvIHJlcXVlc3QgVVJMIGlmIHNhbWUgaG9zdCwKICAgICAgICAjIHNvIHRoYXQgbGlua3MgZm91bmQgb24gdGhlIHBhZ2Ugd2lsbCB3b3JrCiAgICAgICAgczIsIGgyLCBwYXRoMiwgcGFyYW0yLCBxdWVyeTIsIGZyYWcyID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGZwLnVybCkKICAgICAgICBpZiBzMiA9PSBzY2hlbWUgYW5kIGgyID09IGhvc3Q6CiAgICAgICAgICAgIHBhcnRzID0gczIsIG5ldGxvYywgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMgogICAgICAgICAgICBmcC51cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKCiAgICByZXR1cm4gZnAKCgojIGFkZGluZyBhIHRpbWVvdXQgdG8gYXZvaWQgZnJlZXppbmcgcGFja2FnZV9pbmRleApvcGVuX3dpdGhfYXV0aCA9IHNvY2tldF90aW1lb3V0KF9TT0NLRVRfVElNRU9VVCkob3Blbl93aXRoX2F1dGgpCgoKZGVmIGZpeF9zZl91cmwodXJsKToKICAgIHJldHVybiB1cmwgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQoKCmRlZiBsb2NhbF9vcGVuKHVybCk6CiAgICAiIiJSZWFkIGEgbG9jYWwgcGF0aCwgd2l0aCBzcGVjaWFsIHN1cHBvcnQgZm9yIGRpcmVjdG9yaWVzIiIiCiAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW0sIHF1ZXJ5LCBmcmFnID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIGZpbGVuYW1lID0gdXJsbGliLnJlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4odXJsKQogICAgZWxpZiBwYXRoLmVuZHN3aXRoKCcvJykgYW5kIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgIGZpbGVzID0gW10KICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKGZpbGVuYW1lKToKICAgICAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZmlsZW5hbWUsIGYpCiAgICAgICAgICAgIGlmIGYgPT0gJ2luZGV4Lmh0bWwnOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAncicpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihmaWxlcGF0aCk6CiAgICAgICAgICAgICAgICBmICs9ICcvJwogICAgICAgICAgICBmaWxlcy5hcHBlbmQoJzxhIGhyZWY9IntuYW1lfSI+e25hbWV9PC9hPicuZm9ybWF0KG5hbWU9ZikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgICAgICI8aHRtbD48aGVhZD48dGl0bGU+e3VybH08L3RpdGxlPiIKICAgICAgICAgICAgICAgICI8L2hlYWQ+PGJvZHk+e2ZpbGVzfTwvYm9keT48L2h0bWw+IikKICAgICAgICAgICAgYm9keSA9IHRtcGwuZm9ybWF0KHVybD11cmwsIGZpbGVzPSdcbicuam9pbihmaWxlcykpCiAgICAgICAgc3RhdHVzLCBtZXNzYWdlID0gMjAwLCAiT0siCiAgICBlbHNlOgogICAgICAgIHN0YXR1cywgbWVzc2FnZSwgYm9keSA9IDQwNCwgIlBhdGggbm90IGZvdW5kIiwgIk5vdCBmb3VuZCIKCiAgICBoZWFkZXJzID0geydjb250ZW50LXR5cGUnOiAndGV4dC9odG1sJ30KICAgIGJvZHlfc3RyZWFtID0gc2l4LlN0cmluZ0lPKGJvZHkpCiAgICByZXR1cm4gdXJsbGliLmVycm9yLkhUVFBFcnJvcih1cmwsIHN0YXR1cywgbWVzc2FnZSwgaGVhZGVycywgYm9keV9zdHJlYW0pClBLAwQUAAAAAAAAACEA5ebovoIqAACCKgAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGVwNDI1dGFncy5weSMgVGhpcyBmaWxlIG9yaWdpbmFsbHkgZnJvbSBwaXA6CiMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOGY0ZjE1YTVhOTVkN2Q1YjUxMWNlYWVlOWVkMjYxMTc2YzE4MTk3MC9zcmMvcGlwL19pbnRlcm5hbC9wZXA0MjV0YWdzLnB5CiIiIkdlbmVyYXRlIGFuZCB3b3JrIHdpdGggUEVQIDQyNSBDb21wYXRpYmlsaXR5IFRhZ3MuIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZGlzdHV0aWxzLnV0aWwKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBzeXNjb25maWcKaW1wb3J0IHdhcm5pbmdzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Cgpmcm9tIC4gaW1wb3J0IGdsaWJjCgpfb3N4X2FyY2hfcGF0ID0gcmUuY29tcGlsZShyJyguKylfKFxkKylfKFxkKylfKC4rKScpCgoKZGVmIGdldF9jb25maWdfdmFyKHZhcik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcih2YXIpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBJc3N1ZSAjMTA3NAogICAgICAgIHdhcm5pbmdzLndhcm4oInt9Ii5mb3JtYXQoZSksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGdldF9hYmJyX2ltcGwoKToKICAgICIiIlJldHVybiBhYmJyZXZpYXRlZCBpbXBsZW1lbnRhdGlvbiBuYW1lLiIiIgogICAgaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgICAgIHB5aW1wbCA9ICdwcCcKICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBweWltcGwgPSAnanknCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgICAgICBweWltcGwgPSAnaXAnCiAgICBlbHNlOgogICAgICAgIHB5aW1wbCA9ICdjcCcKICAgIHJldHVybiBweWltcGwKCgpkZWYgZ2V0X2ltcGxfdmVyKCk6CiAgICAiIiJSZXR1cm4gaW1wbGVtZW50YXRpb24gdmVyc2lvbi4iIiIKICAgIGltcGxfdmVyID0gZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IGltcGxfdmVyIG9yIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgIGltcGxfdmVyID0gJycuam9pbihtYXAoc3RyLCBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKSkpCiAgICByZXR1cm4gaW1wbF92ZXIKCgpkZWYgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCk6CiAgICAiIiJSZXR1cm4gc3lzLnZlcnNpb25faW5mby1saWtlIHR1cGxlIGZvciB1c2UgaW4gZGVjcmVtZW50aW5nIHRoZSBtaW5vcgogICAgdmVyc2lvbi4iIiIKICAgIGlmIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgICMgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjg4MgogICAgICAgIHJldHVybiAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yKQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXQoKCmRlZiBnZXRfaW1wbF90YWcoKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgVGFnIGZvciB0aGlzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgogICAgIiIiCiAgICByZXR1cm4gInt9e30iLmZvcm1hdChnZXRfYWJicl9pbXBsKCksIGdldF9pbXBsX3ZlcigpKQoKCmRlZiBnZXRfZmxhZyh2YXIsIGZhbGxiYWNrLCBleHBlY3RlZD1UcnVlLCB3YXJuPVRydWUpOgogICAgIiIiVXNlIGEgZmFsbGJhY2sgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBTT0FCSSBmbGFncyBpZiB0aGUgbmVlZGVkIGNvbmZpZwogICAgdmFyIGlzIHVuc2V0IG9yIHVuYXZhaWxhYmxlLiIiIgogICAgdmFsID0gZ2V0X2NvbmZpZ192YXIodmFyKQogICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgaWYgd2FybjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29uZmlnIHZhcmlhYmxlICd7MH0nIGlzIHVuc2V0LCBQeXRob24gQUJJIHRhZyBtYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbmNvcnJlY3QiLmZvcm1hdCh2YXIpLCBSdW50aW1lV2FybmluZywgMikKICAgICAgICByZXR1cm4gZmFsbGJhY2soKQogICAgcmV0dXJuIHZhbCA9PSBleHBlY3RlZAoKCmRlZiBnZXRfYWJpX3RhZygpOgogICAgIiIiUmV0dXJuIHRoZSBBQkkgdGFnIGJhc2VkIG9uIFNPQUJJIChpZiBhdmFpbGFibGUpIG9yIGVtdWxhdGUgU09BQkkKICAgIChDUHl0aG9uIDIsIFB5UHkpLiIiIgogICAgc29hYmkgPSBnZXRfY29uZmlnX3ZhcignU09BQkknKQogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgaWYgbm90IHNvYWJpIGFuZCBpbXBsIGluIHsnY3AnLCAncHAnfSBhbmQgaGFzYXR0cihzeXMsICdtYXh1bmljb2RlJyk6CiAgICAgICAgZCA9ICcnCiAgICAgICAgbSA9ICcnCiAgICAgICAgdSA9ICcnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X0RFQlVHJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBkID0gJ2QnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1dJVEhfUFlNQUxMT0MnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaW1wbCA9PSAnY3AnLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBtID0gJ20nCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X1VOSUNPREVfU0laRScsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzeXMubWF4dW5pY29kZSA9PSAweDEwZmZmZiwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD00LAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpKSkgXAogICAgICAgICAgICAgICAgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgICAgIHUgPSAndScKICAgICAgICBhYmkgPSAnJXMlcyVzJXMlcycgJSAoaW1wbCwgZ2V0X2ltcGxfdmVyKCksIGQsIG0sIHUpCiAgICBlbGlmIHNvYWJpIGFuZCBzb2FiaS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgICAgIGFiaSA9ICdjcCcgKyBzb2FiaS5zcGxpdCgnLScpWzFdCiAgICBlbGlmIHNvYWJpOgogICAgICAgIGFiaSA9IHNvYWJpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBlbHNlOgogICAgICAgIGFiaSA9IE5vbmUKICAgIHJldHVybiBhYmkKCgpkZWYgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgIHJldHVybiBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3CgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIG91ciBwbGF0Zm9ybSBuYW1lICd3aW4zMicsICdsaW51eF94ODZfNjQnIiIiCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgIyBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSByZXR1cm5zIHRoZSByZWxlYXNlIGJhc2VkIG9uIHRoZSB2YWx1ZQogICAgICAgICMgb2YgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9uIHdoaWNoIFB5dGhvbiB3YXMgYnVpbHQsIHdoaWNoIG1heQogICAgICAgICMgYmUgc2lnbmlmaWNhbnRseSBvbGRlciB0aGFuIHRoZSB1c2VyJ3MgY3VycmVudCBtYWNoaW5lLgogICAgICAgIHJlbGVhc2UsIF8sIG1hY2hpbmUgPSBwbGF0Zm9ybS5tYWNfdmVyKCkKICAgICAgICBzcGxpdF92ZXIgPSByZWxlYXNlLnNwbGl0KCcuJykKCiAgICAgICAgaWYgbWFjaGluZSA9PSAieDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJpMzg2IgogICAgICAgIGVsaWYgbWFjaGluZSA9PSAicHBjNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gInBwYyIKCiAgICAgICAgcmV0dXJuICdtYWNvc3hfe31fe31fe30nLmZvcm1hdChzcGxpdF92ZXJbMF0sIHNwbGl0X3ZlclsxXSwgbWFjaGluZSkKCiAgICAjIFhYWCByZW1vdmUgZGlzdHV0aWxzIGRlcGVuZGVuY3kKICAgIHJlc3VsdCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBpZiByZXN1bHQgPT0gImxpbnV4X3g4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgIyAzMiBiaXQgUHl0aG9uIHByb2dyYW0gKHJ1bm5pbmcgb24gYSA2NCBiaXQgTGludXgpOiBwaXAgc2hvdWxkIG9ubHkKICAgICAgICAjIGluc3RhbGwgYW5kIHJ1biAzMiBiaXQgY29tcGlsZWQgZXh0ZW5zaW9ucyBpbiB0aGF0IGNhc2UuCiAgICAgICAgcmVzdWx0ID0gImxpbnV4X2k2ODYiCgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICMgT25seSBMaW51eCwgYW5kIG9ubHkgeDg2LTY0IC8gaTY4NgogICAgaWYgZ2V0X3BsYXRmb3JtKCkgbm90IGluIHsibGludXhfeDg2XzY0IiwgImxpbnV4X2k2ODYifToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIENoZWNrIGZvciBwcmVzZW5jZSBvZiBfbWFueWxpbnV4IG1vZHVsZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBfbWFueWxpbnV4CiAgICAgICAgcmV0dXJuIGJvb2woX21hbnlsaW51eC5tYW55bGludXgxX2NvbXBhdGlibGUpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgIyBGYWxsIHRocm91Z2ggdG8gaGV1cmlzdGljIGNoZWNrIGJlbG93CiAgICAgICAgcGFzcwoKICAgICMgQ2hlY2sgZ2xpYmMgdmVyc2lvbi4gQ2VudE9TIDUgdXNlcyBnbGliYyAyLjUuCiAgICByZXR1cm4gZ2xpYmMuaGF2ZV9jb21wYXRpYmxlX2dsaWJjKDIsIDUpCgoKZGVmIGdldF9kYXJ3aW5fYXJjaGVzKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCBhcmNoZXMgKGluY2x1ZGluZyBncm91cCBhcmNoZXMpIGZvcgogICAgdGhlIGdpdmVuIG1ham9yLCBtaW5vciBhbmQgbWFjaGluZSBhcmNoaXRlY3R1cmUgb2YgYW4gbWFjT1MgbWFjaGluZS4KICAgICIiIgogICAgYXJjaGVzID0gW10KCiAgICBkZWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBhcmNoKToKICAgICAgICAjIExvb2tpbmcgYXQgdGhlIGFwcGxpY2F0aW9uIHN1cHBvcnQgZm9yIG1hY09TIHZlcnNpb25zIGluIHRoZSBjaGFydAogICAgICAgICMgcHJvdmlkZWQgYnkgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT1NfWCNWZXJzaW9ucyBpdCBhcHBlYXJzCiAgICAgICAgIyBvdXIgdGltZWxpbmUgbG9va3Mgcm91Z2hseSBsaWtlOgogICAgICAgICMKICAgICAgICAjIDEwLjAgLSBJbnRyb2R1Y2VzIHBwYyBzdXBwb3J0LgogICAgICAgICMgMTAuNCAtIEludHJvZHVjZXMgcHBjNjQsIGkzODYsIGFuZCB4ODZfNjQgc3VwcG9ydCwgaG93ZXZlciB0aGUgcHBjNjQKICAgICAgICAjICAgICAgICBhbmQgeDg2XzY0IHN1cHBvcnQgaXMgQ0xJIG9ubHksIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgR1VJCiAgICAgICAgIyAgICAgICAgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNSAtIEV4dGVuZHMgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IHRvIGNvdmVyIEdVSSBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC42IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjNjQKICAgICAgICAjIDEwLjcgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGMKICAgICAgICAjCiAgICAgICAgIyBHaXZlbiB0aGF0IHdlIGRvIG5vdCBrbm93IGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBDTEkgb3IgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uLCB3ZSBtdXN0IGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIGl0IG1pZ2h0IGJlIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCBkaWQgbm90IG9jY3VyCiAgICAgICAgIyB1bnRpbCAxMC41LgogICAgICAgICMKICAgICAgICAjIE5vdGU6IFRoZSBhYm92ZSBpbmZvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSAiQXBwbGljYXRpb24gc3VwcG9ydCIKICAgICAgICAjICAgICAgIGNvbHVtbiBpbiB0aGUgY2hhcnQgbm90IHRoZSAiUHJvY2Vzc29yIHN1cHBvcnQiIHNpbmNlIEkgYmVsaWV2ZQogICAgICAgICMgICAgICAgdGhhdCB3ZSBjYXJlIGFib3V0IHdoYXQgaW5zdHJ1Y3Rpb24gc2V0cyBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlCiAgICAgICAgIyAgICAgICBub3Qgd2hpY2ggcHJvY2Vzc29ycyB0aGUgT1Mgc3VwcG9ydHMuCiAgICAgICAgaWYgYXJjaCA9PSAncHBjJzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpIDw9ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdwcGM2NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA9PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAnaTM4Nic6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDQpCiAgICAgICAgaWYgYXJjaCA9PSAneDg2XzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNSkKICAgICAgICBpZiBhcmNoIGluIGdyb3VwczoKICAgICAgICAgICAgZm9yIGdhcmNoIGluIGdyb3Vwc1thcmNoXToKICAgICAgICAgICAgICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZ3JvdXBzID0gT3JkZXJlZERpY3QoWwogICAgICAgICgiZmF0IiwgKCJpMzg2IiwgInBwYyIpKSwKICAgICAgICAoImludGVsIiwgKCJ4ODZfNjQiLCAiaTM4NiIpKSwKICAgICAgICAoImZhdDY0IiwgKCJ4ODZfNjQiLCAicHBjNjQiKSksCiAgICAgICAgKCJmYXQzMiIsICgieDg2XzY0IiwgImkzODYiLCAicHBjIikpLAogICAgXSkKCiAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgICAgIGFyY2hlcy5hcHBlbmQobWFjaGluZSkKCiAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzOgogICAgICAgIGlmIG1hY2hpbmUgaW4gZ3JvdXBzW2dhcmNoXSBhbmQgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQoZ2FyY2gpCgogICAgYXJjaGVzLmFwcGVuZCgndW5pdmVyc2FsJykKCiAgICByZXR1cm4gYXJjaGVzCgoKZGVmIGdldF9zdXBwb3J0ZWQodmVyc2lvbnM9Tm9uZSwgbm9hcmNoPUZhbHNlLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICAgICAgICBpbXBsPU5vbmUsIGFiaT1Ob25lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MgZm9yIGVhY2ggdmVyc2lvbiBzcGVjaWZpZWQgaW4KICAgIGB2ZXJzaW9uc2AuCgogICAgOnBhcmFtIHZlcnNpb25zOiBhIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb25zLCBvZiB0aGUgZm9ybSBbIjMzIiwgIjMyIl0sCiAgICAgICAgb3IgTm9uZS4gVGhlIGZpcnN0IHZlcnNpb24gd2lsbCBiZSBhc3N1bWVkIHRvIHN1cHBvcnQgb3VyIEFCSS4KICAgIDpwYXJhbSBwbGF0Zm9ybTogc3BlY2lmeSB0aGUgZXhhY3QgcGxhdGZvcm0geW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBzeXN0ZW0gcGxhdGZvcm0uCiAgICA6cGFyYW0gaW1wbDogc3BlY2lmeSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24geW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBpbXBsLgogICAgOnBhcmFtIGFiaTogc3BlY2lmeSB0aGUgZXhhY3QgYWJpIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgYWJpLgogICAgIiIiCiAgICBzdXBwb3J0ZWQgPSBbXQoKICAgICMgVmVyc2lvbnMgbXVzdCBiZSBnaXZlbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHByZWZlcmVuY2UKICAgIGlmIHZlcnNpb25zIGlzIE5vbmU6CiAgICAgICAgdmVyc2lvbnMgPSBbXQogICAgICAgIHZlcnNpb25faW5mbyA9IGdldF9pbXBsX3ZlcnNpb25faW5mbygpCiAgICAgICAgbWFqb3IgPSB2ZXJzaW9uX2luZm9bOi0xXQogICAgICAgICMgU3VwcG9ydCBhbGwgcHJldmlvdXMgbWlub3IgUHl0aG9uIHZlcnNpb25zLgogICAgICAgIGZvciBtaW5vciBpbiByYW5nZSh2ZXJzaW9uX2luZm9bLTFdLCAtMSwgLTEpOgogICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihtYXAoc3RyLCBtYWpvciArIChtaW5vciwpKSkpCgogICAgaW1wbCA9IGltcGwgb3IgZ2V0X2FiYnJfaW1wbCgpCgogICAgYWJpcyA9IFtdCgogICAgYWJpID0gYWJpIG9yIGdldF9hYmlfdGFnKCkKICAgIGlmIGFiaToKICAgICAgICBhYmlzWzA6MF0gPSBbYWJpXQoKICAgIGFiaTNzID0gc2V0KCkKICAgIGltcG9ydCBpbXAKICAgIGZvciBzdWZmaXggaW4gaW1wLmdldF9zdWZmaXhlcygpOgogICAgICAgIGlmIHN1ZmZpeFswXS5zdGFydHN3aXRoKCcuYWJpJyk6CiAgICAgICAgICAgIGFiaTNzLmFkZChzdWZmaXhbMF0uc3BsaXQoJy4nLCAyKVsxXSkKCiAgICBhYmlzLmV4dGVuZChzb3J0ZWQobGlzdChhYmkzcykpKQoKICAgIGFiaXMuYXBwZW5kKCdub25lJykKCiAgICBpZiBub3Qgbm9hcmNoOgogICAgICAgIGFyY2ggPSBwbGF0Zm9ybSBvciBnZXRfcGxhdGZvcm0oKQogICAgICAgIGlmIGFyY2guc3RhcnRzd2l0aCgnbWFjb3N4Jyk6CiAgICAgICAgICAgICMgc3VwcG9ydCBtYWNvc3gtMTAuNi1pbnRlbCBvbiBtYWNvc3gtMTAuOS14ODZfNjQKICAgICAgICAgICAgbWF0Y2ggPSBfb3N4X2FyY2hfcGF0Lm1hdGNoKGFyY2gpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgbmFtZSwgbWFqb3IsIG1pbm9yLCBhY3R1YWxfYXJjaCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICB0cGwgPSAne31fe31fJWlfJXMnLmZvcm1hdChuYW1lLCBtYWpvcikKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgbSBpbiByZXZlcnNlZChyYW5nZShpbnQobWlub3IpICsgMSkpOgogICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGdldF9kYXJ3aW5fYXJjaGVzKGludChtYWpvciksIG0sIGFjdHVhbF9hcmNoKToKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzLmFwcGVuZCh0cGwgJSAobSwgYSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGFyY2ggcGF0dGVybiBkaWRuJ3QgbWF0Y2ggKD8hKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCiAgICAgICAgZWxpZiBwbGF0Zm9ybSBpcyBOb25lIGFuZCBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2gucmVwbGFjZSgnbGludXgnLCAnbWFueWxpbnV4MScpLCBhcmNoXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQoKICAgICAgICAjIEN1cnJlbnQgdmVyc2lvbiwgY3VycmVudCBBUEkgKGJ1aWx0IHNwZWNpZmljYWxseSBmb3Igb3VyIFB5dGhvbik6CiAgICAgICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIGFiaTMgbW9kdWxlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBQeXRob24KICAgICAgICBmb3IgdmVyc2lvbiBpbiB2ZXJzaW9uc1sxOl06CiAgICAgICAgICAgICMgYWJpMyB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4yCiAgICAgICAgICAgIGlmIHZlcnNpb24gaW4geyczMScsICczMCd9OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZm9yIGFiaSBpbiBhYmkzczogICAjIGVtcHR5IHNldCBpZiBub3QgUHl0aG9uIDMKICAgICAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgiJXMlcyIgJSAoaW1wbCwgdmVyc2lvbiksIGFiaSwgYXJjaCkpCgogICAgICAgICMgSGFzIGJpbmFyaWVzLCBkb2VzIG5vdCB1c2UgdGhlIFB5dGhvbiBBUEk6CiAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgYnV0IHJlcXVpcmVzIG91ciBpbXBsZW1lbnRhdGlvbjoKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksICdub25lJywgJ2FueScpKQogICAgIyBUYWdnZWQgc3BlY2lmaWNhbGx5IGFzIGJlaW5nIGNyb3NzLXZlcnNpb24gY29tcGF0aWJsZQogICAgIyAod2l0aCBqdXN0IHRoZSBtYWpvciB2ZXJzaW9uIHNwZWNpZmllZCkKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXVswXSksICdub25lJywgJ2FueScpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgZ2VuZXJpYyBQeXRob24KICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb24sKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvblswXSksICdub25lJywgJ2FueScpKQoKICAgIHJldHVybiBzdXBwb3J0ZWQKCgppbXBsZW1lbnRhdGlvbl90YWcgPSBnZXRfaW1wbF90YWcoKQpQSwMEFAAAAAAAAAAhALJmp1cYAgAAGAIAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5Mjdjb21wYXQucHkiIiIKQ29tcGF0aWJpbGl0eSBTdXBwb3J0IGZvciBQeXRob24gMi43IGFuZCBlYXJsaWVyCiIiIgoKaW1wb3J0IHBsYXRmb3JtCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgpkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAiIiIKICAgIEdpdmVuIGFuIEhUVFBNZXNzYWdlLCByZXR1cm4gYWxsIGhlYWRlcnMgbWF0Y2hpbmcgYSBnaXZlbiBrZXkuCiAgICAiIiIKICAgIHJldHVybiBtZXNzYWdlLmdldF9hbGwoa2V5KQoKCmlmIHNpeC5QWTI6CiAgICBkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0aGVhZGVycyhrZXkpCgoKbGludXhfcHkyX2FzY2lpID0gKAogICAgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBhbmQKICAgIHNpeC5QWTIKKQoKcm10cmVlX3NhZmUgPSBzdHIgaWYgbGludXhfcHkyX2FzY2lpIGVsc2UgbGFtYmRhIHg6IHgKIiIiV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0NjcyIiIiClBLAwQUAAAAAAAAACEA0LlIWqgEAACoBAAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzMWNvbXBhdC5weV9fYWxsX18gPSBbJ2dldF9jb25maWdfdmFycycsICdnZXRfcGF0aCddCgp0cnk6CiAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMsIGdldF9wYXRoCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzLCBnZXRfcHl0aG9uX2xpYgoKICAgIGRlZiBnZXRfcGF0aChuYW1lKToKICAgICAgICBpZiBuYW1lIG5vdCBpbiAoJ3BsYXRsaWInLCAncHVyZWxpYicpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJOYW1lIG11c3QgYmUgcHVyZWxpYiBvciBwbGF0bGliIikKICAgICAgICByZXR1cm4gZ2V0X3B5dGhvbl9saWIobmFtZSA9PSAncGxhdGxpYicpCgoKdHJ5OgogICAgIyBQeXRob24gPj0zLjIKICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeURpcmVjdG9yeQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgc2h1dGlsCiAgICBpbXBvcnQgdGVtcGZpbGUKCiAgICBjbGFzcyBUZW1wb3JhcnlEaXJlY3Rvcnkob2JqZWN0KToKICAgICAgICAiIiIKICAgICAgICBWZXJ5IHNpbXBsZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRleHQgbWFuYWdlci4KICAgICAgICBXaWxsIHRyeSB0byBkZWxldGUgYWZ0ZXJ3YXJkLCBidXQgd2lsbCBhbHNvIGlnbm9yZSBPUyBhbmQgc2ltaWxhcgogICAgICAgIGVycm9ycyBvbiBkZWxldGlvbi4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lICAjIEhhbmRsZSBta2R0ZW1wIHJhaXNpbmcgYW4gZXhjZXB0aW9uCiAgICAgICAgICAgIHNlbGYubmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoKQoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGN0eXBlLCBleGN2YWx1ZSwgZXhjdHJhY2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYubmFtZSwgVHJ1ZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6ICAjIHJlbW92YWwgZXJyb3JzIGFyZSBub3QgdGhlIG9ubHkgcG9zc2libGUKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZQpQSwMEFAAAAAAAAAAhAMlhksDmAwAA5gMAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzNjb21wYXQucHlpbXBvcnQgZGlzCmltcG9ydCBhcnJheQppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKCk9wQXJnID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnT3BBcmcnLCAnb3Bjb2RlIGFyZycpCgoKY2xhc3MgQnl0ZWNvZGVfY29tcGF0KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSk6CiAgICAgICAgc2VsZi5jb2RlID0gY29kZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCAnKG9wLGFyZyknIHBhaXIgZm9yIGVhY2ggb3BlcmF0aW9uIGluIGNvZGUgb2JqZWN0ICdjb2RlJyIiIgoKICAgICAgICBieXRlcyA9IGFycmF5LmFycmF5KCdiJywgc2VsZi5jb2RlLmNvX2NvZGUpCiAgICAgICAgZW9mID0gbGVuKHNlbGYuY29kZS5jb19jb2RlKQoKICAgICAgICBwdHIgPSAwCiAgICAgICAgZXh0ZW5kZWRfYXJnID0gMAoKICAgICAgICB3aGlsZSBwdHIgPCBlb2Y6CgogICAgICAgICAgICBvcCA9IGJ5dGVzW3B0cl0KCiAgICAgICAgICAgIGlmIG9wID49IGRpcy5IQVZFX0FSR1VNRU5UOgoKICAgICAgICAgICAgICAgIGFyZyA9IGJ5dGVzW3B0ciArIDFdICsgYnl0ZXNbcHRyICsgMl0gKiAyNTYgKyBleHRlbmRlZF9hcmcKICAgICAgICAgICAgICAgIHB0ciArPSAzCgogICAgICAgICAgICAgICAgaWYgb3AgPT0gZGlzLkVYVEVOREVEX0FSRzoKICAgICAgICAgICAgICAgICAgICBsb25nX3R5cGUgPSBzaXguaW50ZWdlcl90eXBlc1stMV0KICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmcgPSBhcmcgKiBsb25nX3R5cGUoNjU1MzYpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmcgPSBOb25lCiAgICAgICAgICAgICAgICBwdHIgKz0gMQoKICAgICAgICAgICAgeWllbGQgT3BBcmcob3AsIGFyZykKCgpCeXRlY29kZSA9IGdldGF0dHIoZGlzLCAnQnl0ZWNvZGUnLCBCeXRlY29kZV9jb21wYXQpClBLAwQUAAAAAAAAACEAhRmaC0sLAABLCwAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzNmNvbXBhdC5weWltcG9ydCBzeXMKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdHJ0b2Jvb2wKZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCgoKY2xhc3MgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlczoKICAgICIiIgogICAgTWl4LWluIHByb3ZpZGluZyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIGZ1bmN0aW9uYWxpdHkgdG8gYmUKICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgb24gUHl0aG9uIDMuNy4KCiAgICBEbyBub3QgZWRpdCB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIGV4Y2VwdCB0byB1cGRhdGUgZnVuY3Rpb25hbGl0eQogICAgYXMgaW1wbGVtZW50ZWQgaW4gZGlzdHV0aWxzLgogICAgIiIiCiAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lKToKICAgICAgICBmcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCgogICAgICAgICMgSWdub3JlIGluc3RhbGwgZGlyZWN0b3J5IG9wdGlvbnMgaWYgd2UgaGF2ZSBhIHZlbnYKICAgICAgICBpZiBzeXMucHJlZml4ICE9IHN5cy5iYXNlX3ByZWZpeDoKICAgICAgICAgICAgaWdub3JlX29wdGlvbnMgPSBbCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1iYXNlJywgJ2luc3RhbGwtcGxhdGJhc2UnLCAnaW5zdGFsbC1saWInLAogICAgICAgICAgICAgICAgJ2luc3RhbGwtcGxhdGxpYicsICdpbnN0YWxsLXB1cmVsaWInLCAnaW5zdGFsbC1oZWFkZXJzJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXNjcmlwdHMnLCAnaW5zdGFsbC1kYXRhJywgJ3ByZWZpeCcsICdleGVjLXByZWZpeCcsCiAgICAgICAgICAgICAgICAnaG9tZScsICd1c2VyJywgJ3Jvb3QnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gW10KCiAgICAgICAgaWdub3JlX29wdGlvbnMgPSBmcm96ZW5zZXQoaWdub3JlX29wdGlvbnMpCgogICAgICAgIGlmIGZpbGVuYW1lcyBpcyBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmZpbmRfY29uZmlnX2ZpbGVzKCkKCiAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIkRpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoKToiKQoKICAgICAgICBwYXJzZXIgPSBDb25maWdQYXJzZXIoaW50ZXJwb2xhdGlvbj1Ob25lKQogICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICByZWFkaW5nICVzIiAlIGZpbGVuYW1lKQogICAgICAgICAgICBwYXJzZXIucmVhZChmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gcGFyc2VyLnNlY3Rpb25zKCk6CiAgICAgICAgICAgICAgICBvcHRpb25zID0gcGFyc2VyLm9wdGlvbnMoc2VjdGlvbikKICAgICAgICAgICAgICAgIG9wdF9kaWN0ID0gc2VsZi5nZXRfb3B0aW9uX2RpY3Qoc2VjdGlvbikKCiAgICAgICAgICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3B0ICE9ICdfX25hbWVfXycgYW5kIG9wdCBub3QgaW4gaWdub3JlX29wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlci5nZXQoc2VjdGlvbixvcHQpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCctJywgJ18nKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRfZGljdFtvcHRdID0gKGZpbGVuYW1lLCB2YWwpCgogICAgICAgICAgICAjIE1ha2UgdGhlIENvbmZpZ1BhcnNlciBmb3JnZXQgZXZlcnl0aGluZyAoc28gd2UgcmV0YWluCiAgICAgICAgICAgICMgdGhlIG9yaWdpbmFsIGZpbGVuYW1lcyB0aGF0IG9wdGlvbnMgY29tZSBmcm9tKQogICAgICAgICAgICBwYXJzZXIuX19pbml0X18oKQoKICAgICAgICAjIElmIHRoZXJlIHdhcyBhICJnbG9iYWwiIHNlY3Rpb24gaW4gdGhlIGNvbmZpZyBmaWxlLCB1c2UgaXQKICAgICAgICAjIHRvIHNldCBEaXN0cmlidXRpb24gb3B0aW9ucy4KCiAgICAgICAgaWYgJ2dsb2JhbCcgaW4gc2VsZi5jb21tYW5kX29wdGlvbnM6CiAgICAgICAgICAgIGZvciAob3B0LCAoc3JjLCB2YWwpKSBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uc1snZ2xvYmFsJ10uaXRlbXMoKToKICAgICAgICAgICAgICAgIGFsaWFzID0gc2VsZi5uZWdhdGl2ZV9vcHQuZ2V0KG9wdCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiBhbGlhczoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhbGlhcywgbm90IHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3B0IGluICgndmVyYm9zZScsICdkcnlfcnVuJyk6ICMgdWdoIQogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgc3RydG9ib29sKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHZhbCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIG1zZzoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgoKaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6CiAgICAjIFB5dGhvbiAyIGJlaGF2aW9yIGlzIHN1ZmZpY2llbnQKICAgIGNsYXNzIERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXM6CiAgICAgICAgcGFzcwoKCmlmIEZhbHNlOgogICAgIyBXaGVuIHVwZGF0ZWQgYmVoYXZpb3IgaXMgYXZhaWxhYmxlIHVwc3RyZWFtLAogICAgIyBkaXNhYmxlIG92ZXJyaWRlIGhlcmUuCiAgICBjbGFzcyBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCMU5pjxDcAAMQ3AAAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zYW5kYm94LnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBwaWNrbGUKaW1wb3J0IHRleHR3cmFwCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGJ1aWx0aW5zLCBtYXAKCmltcG9ydCBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgb3JnLnB5dGhvbi5tb2R1bGVzLnBvc2l4LlBvc2l4TW9kdWxlIGFzIF9vcwplbHNlOgogICAgX29zID0gc3lzLm1vZHVsZXNbb3MubmFtZV0KdHJ5OgogICAgX2ZpbGUgPSBmaWxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfZmlsZSA9IE5vbmUKX29wZW4gPSBvcGVuCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCB3b3JraW5nX3NldAoKCl9fYWxsX18gPSBbCiAgICAiQWJzdHJhY3RTYW5kYm94IiwgIkRpcmVjdG9yeVNhbmRib3giLCAiU2FuZGJveFZpb2xhdGlvbiIsICJydW5fc2V0dXAiLApdCgoKZGVmIF9leGVjZmlsZShmaWxlbmFtZSwgZ2xvYmFscywgbG9jYWxzPU5vbmUpOgogICAgIiIiCiAgICBQeXRob24gMyBpbXBsZW1lbnRhdGlvbiBvZiBleGVjZmlsZS4KICAgICIiIgogICAgbW9kZSA9ICdyYicKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgbW9kZSkgYXMgc3RyZWFtOgogICAgICAgIHNjcmlwdCA9IHN0cmVhbS5yZWFkKCkKICAgIGlmIGxvY2FscyBpcyBOb25lOgogICAgICAgIGxvY2FscyA9IGdsb2JhbHMKICAgIGNvZGUgPSBjb21waWxlKHNjcmlwdCwgZmlsZW5hbWUsICdleGVjJykKICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX2FyZ3YocmVwbD1Ob25lKToKICAgIHNhdmVkID0gc3lzLmFyZ3ZbOl0KICAgIGlmIHJlcGwgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLmFyZ3ZbOl0gPSByZXBsCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX3BhdGgoKToKICAgIHNhdmVkID0gc3lzLnBhdGhbOl0KICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBzeXMucGF0aFs6XSA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIG92ZXJyaWRlX3RlbXAocmVwbGFjZW1lbnQpOgogICAgIiIiCiAgICBNb25rZXktcGF0Y2ggdGVtcGZpbGUudGVtcGRpciB3aXRoIHJlcGxhY2VtZW50LCBlbnN1cmluZyBpdCBleGlzdHMKICAgICIiIgogICAgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0Lm1ha2VkaXJzKHJlcGxhY2VtZW50LCBleGlzdF9vaz1UcnVlKQoKICAgIHNhdmVkID0gdGVtcGZpbGUudGVtcGRpcgoKICAgIHRlbXBmaWxlLnRlbXBkaXIgPSByZXBsYWNlbWVudAoKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICB0ZW1wZmlsZS50ZW1wZGlyID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgcHVzaGQodGFyZ2V0KToKICAgIHNhdmVkID0gb3MuZ2V0Y3dkKCkKICAgIG9zLmNoZGlyKHRhcmdldCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihzYXZlZCkKCgpjbGFzcyBVbnBpY2tsZWFibGVFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgICIiIgogICAgQW4gZXhjZXB0aW9uIHJlcHJlc2VudGluZyBhbm90aGVyIEV4Y2VwdGlvbiB0aGF0IGNvdWxkIG5vdCBiZSBwaWNrbGVkLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGR1bXAodHlwZSwgZXhjKToKICAgICAgICAiIiIKICAgICAgICBBbHdheXMgcmV0dXJuIGEgZHVtcGVkIChwaWNrbGVkKSB0eXBlIGFuZCBleGMuIElmIGV4YyBjYW4ndCBiZSBwaWNrbGVkLAogICAgICAgIHdyYXAgaXQgaW4gVW5waWNrbGVhYmxlRXhjZXB0aW9uIGZpcnN0LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyh0eXBlKSwgcGlja2xlLmR1bXBzKGV4YykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAjIGdldCBVbnBpY2tsZWFibGVFeGNlcHRpb24gaW5zaWRlIHRoZSBzYW5kYm94CiAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBVbnBpY2tsZWFibGVFeGNlcHRpb24gYXMgY2xzCiAgICAgICAgICAgIHJldHVybiBjbHMuZHVtcChjbHMsIGNscyhyZXByKGV4YykpKQoKCmNsYXNzIEV4Y2VwdGlvblNhdmVyOgogICAgIiIiCiAgICBBIENvbnRleHQgTWFuYWdlciB0aGF0IHdpbGwgc2F2ZSBhbiBleGNlcHRpb24sIHNlcmlhbGl6ZWQsIGFuZCByZXN0b3JlIGl0CiAgICBsYXRlci4KICAgICIiIgoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgZXhjLCB0Yik6CiAgICAgICAgaWYgbm90IGV4YzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgZHVtcCB0aGUgZXhjZXB0aW9uCiAgICAgICAgc2VsZi5fc2F2ZWQgPSBVbnBpY2tsZWFibGVFeGNlcHRpb24uZHVtcCh0eXBlLCBleGMpCiAgICAgICAgc2VsZi5fdGIgPSB0YgoKICAgICAgICAjIHN1cHByZXNzIHRoZSBleGNlcHRpb24KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZXN1bWUoc2VsZik6CiAgICAgICAgInJlc3RvcmUgYW5kIHJlLXJhaXNlIGFueSBleGNlcHRpb24iCgogICAgICAgIGlmICdfc2F2ZWQnIG5vdCBpbiB2YXJzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHlwZSwgZXhjID0gbWFwKHBpY2tsZS5sb2Fkcywgc2VsZi5fc2F2ZWQpCiAgICAgICAgc2l4LnJlcmFpc2UodHlwZSwgZXhjLCBzZWxmLl90YikKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9tb2R1bGVzKCk6CiAgICAiIiIKICAgIENvbnRleHQgaW4gd2hpY2ggaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc2F2ZWQuCgogICAgVHJhbnNsYXRlcyBleGNlcHRpb25zIGludGVybmFsIHRvIHRoZSBjb250ZXh0IGludG8gdGhlIGVxdWl2YWxlbnQgZXhjZXB0aW9uCiAgICBvdXRzaWRlIHRoZSBjb250ZXh0LgogICAgIiIiCiAgICBzYXZlZCA9IHN5cy5tb2R1bGVzLmNvcHkoKQogICAgd2l0aCBFeGNlcHRpb25TYXZlcigpIGFzIHNhdmVkX2V4YzoKICAgICAgICB5aWVsZCBzYXZlZAoKICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShzYXZlZCkKICAgICMgcmVtb3ZlIGFueSBtb2R1bGVzIGltcG9ydGVkIHNpbmNlCiAgICBkZWxfbW9kdWxlcyA9ICgKICAgICAgICBtb2RfbmFtZSBmb3IgbW9kX25hbWUgaW4gc3lzLm1vZHVsZXMKICAgICAgICBpZiBtb2RfbmFtZSBub3QgaW4gc2F2ZWQKICAgICAgICAjIGV4Y2x1ZGUgYW55IGVuY29kaW5ncyBtb2R1bGVzLiBTZWUgIzI4NQogICAgICAgIGFuZCBub3QgbW9kX25hbWUuc3RhcnRzd2l0aCgnZW5jb2RpbmdzLicpCiAgICApCiAgICBfY2xlYXJfbW9kdWxlcyhkZWxfbW9kdWxlcykKCiAgICBzYXZlZF9leGMucmVzdW1lKCkKCgpkZWYgX2NsZWFyX21vZHVsZXMobW9kdWxlX25hbWVzKToKICAgIGZvciBtb2RfbmFtZSBpbiBsaXN0KG1vZHVsZV9uYW1lcyk6CiAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX3BrZ19yZXNvdXJjZXNfc3RhdGUoKToKICAgIHNhdmVkID0gcGtnX3Jlc291cmNlcy5fX2dldHN0YXRlX18oKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuX19zZXRzdGF0ZV9fKHNhdmVkKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzZXR1cF9jb250ZXh0KHNldHVwX2Rpcik6CiAgICB0ZW1wX2RpciA9IG9zLnBhdGguam9pbihzZXR1cF9kaXIsICd0ZW1wJykKICAgIHdpdGggc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICAgICAgd2l0aCBzYXZlX21vZHVsZXMoKToKICAgICAgICAgICAgaGlkZV9zZXR1cHRvb2xzKCkKICAgICAgICAgICAgd2l0aCBzYXZlX3BhdGgoKToKICAgICAgICAgICAgICAgIHdpdGggc2F2ZV9hcmd2KCk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvdmVycmlkZV90ZW1wKHRlbXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBwdXNoZChzZXR1cF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbnN1cmUgc2V0dXB0b29scyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKCdzZXR1cHRvb2xzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkCgoKZGVmIF9uZWVkc19oaWRpbmcobW9kX25hbWUpOgogICAgIiIiCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygncGtnX3Jlc291cmNlcycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29sc19wbHVnaW4nKQogICAgRmFsc2UKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzLl9faW5pdF9fJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdkaXN0dXRpbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ29zJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnQ3l0aG9uJykKICAgIFRydWUKICAgICIiIgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUocicoc2V0dXB0b29sc3xwa2dfcmVzb3VyY2VzfGRpc3R1dGlsc3xDeXRob24pKFwufCQpJykKICAgIHJldHVybiBib29sKHBhdHRlcm4ubWF0Y2gobW9kX25hbWUpKQoKCmRlZiBoaWRlX3NldHVwdG9vbHMoKToKICAgICIiIgogICAgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gc2V0dXB0b29scycgbW9kdWxlcyBmcm9tIHN5cy5tb2R1bGVzIHRvIGFsbG93IHRoZQogICAgaW52b2NhdGlvbiB0byBpbXBvcnQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgc2V0dXB0b29scy4gVGhpcyB0ZWNobmlxdWUgaXMKICAgIG5lY2Vzc2FyeSB0byBhdm9pZCBpc3N1ZXMgc3VjaCBhcyAjMzE1IHdoZXJlIHNldHVwdG9vbHMgdXBncmFkaW5nIGl0c2VsZgogICAgd291bGQgZmFpbCB0byBmaW5kIGEgZnVuY3Rpb24gZGVjbGFyZWQgaW4gdGhlIG1ldGFkYXRhLgogICAgIiIiCiAgICBtb2R1bGVzID0gZmlsdGVyKF9uZWVkc19oaWRpbmcsIHN5cy5tb2R1bGVzKQogICAgX2NsZWFyX21vZHVsZXMobW9kdWxlcykKCgpkZWYgcnVuX3NldHVwKHNldHVwX3NjcmlwdCwgYXJncyk6CiAgICAiIiJSdW4gYSBkaXN0dXRpbHMgc2V0dXAgc2NyaXB0LCBzYW5kYm94ZWQgaW4gaXRzIGRpcmVjdG9yeSIiIgogICAgc2V0dXBfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQogICAgd2l0aCBzZXR1cF9jb250ZXh0KHNldHVwX2Rpcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzeXMuYXJndls6XSA9IFtzZXR1cF9zY3JpcHRdICsgbGlzdChhcmdzKQogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2V0dXBfZGlyKQogICAgICAgICAgICAjIHJlc2V0IHRvIGluY2x1ZGUgc2V0dXAgZGlyLCB3L2NsZWFuIGNhbGxiYWNrIGxpc3QKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQogICAgICAgICAgICB3b3JraW5nX3NldC5jYWxsYmFja3MuYXBwZW5kKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCgogICAgICAgICAgICAjIF9fZmlsZV9fIHNob3VsZCBiZSBhIGJ5dGUgc3RyaW5nIG9uIFB5dGhvbiAyICgjNzEyKQogICAgICAgICAgICBkdW5kZXJfZmlsZSA9ICgKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdAogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXR1cF9zY3JpcHQsIHN0cikgZWxzZQogICAgICAgICAgICAgICAgc2V0dXBfc2NyaXB0LmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHdpdGggRGlyZWN0b3J5U2FuZGJveChzZXR1cF9kaXIpOgogICAgICAgICAgICAgICAgbnMgPSBkaWN0KF9fZmlsZV9fPWR1bmRlcl9maWxlLCBfX25hbWVfXz0nX19tYWluX18nKQogICAgICAgICAgICAgICAgX2V4ZWNmaWxlKHNldHVwX3NjcmlwdCwgbnMpCiAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgdjoKICAgICAgICAgICAgaWYgdi5hcmdzIGFuZCB2LmFyZ3NbMF06CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAjIE5vcm1hbCBleGl0LCBqdXN0IHJldHVybgoKCmNsYXNzIEFic3RyYWN0U2FuZGJveDoKICAgICIiIldyYXAgJ29zJyBtb2R1bGUgYW5kICdvcGVuKCknIGJ1aWx0aW4gZm9yIHZpcnR1YWxpemluZyBzZXR1cCBzY3JpcHRzIiIiCgogICAgX2FjdGl2ZSA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2F0dHJzID0gWwogICAgICAgICAgICBuYW1lIGZvciBuYW1lIGluIGRpcihfb3MpCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgaGFzYXR0cihzZWxmLCBuYW1lKQogICAgICAgIF0KCiAgICBkZWYgX2NvcHkoc2VsZiwgc291cmNlKToKICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9hdHRyczoKICAgICAgICAgICAgc2V0YXR0cihvcywgbmFtZSwgZ2V0YXR0cihzb3VyY2UsIG5hbWUpKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgc2VsZi5fY29weShzZWxmKQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gc2VsZi5fZmlsZQogICAgICAgIGJ1aWx0aW5zLm9wZW4gPSBzZWxmLl9vcGVuCiAgICAgICAgc2VsZi5fYWN0aXZlID0gVHJ1ZQoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgaWYgX2ZpbGU6CiAgICAgICAgICAgIGJ1aWx0aW5zLmZpbGUgPSBfZmlsZQogICAgICAgIGJ1aWx0aW5zLm9wZW4gPSBfb3BlbgogICAgICAgIHNlbGYuX2NvcHkoX29zKQoKICAgIGRlZiBydW4oc2VsZiwgZnVuYyk6CiAgICAgICAgIiIiUnVuICdmdW5jJyB1bmRlciBvcyBzYW5kYm94aW5nIiIiCiAgICAgICAgd2l0aCBzZWxmOgogICAgICAgICAgICByZXR1cm4gZnVuYygpCgogICAgZGVmIF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBzcmMsIGRzdCA9IHNlbGYuX3JlbWFwX3BhaXIobmFtZSwgc3JjLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoc3JjLCBkc3QsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsicmVuYW1lIiwgImxpbmsiLCAic3ltbGluayJdOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSwgb3JpZ2luYWw9Tm9uZSk6CiAgICAgICAgb3JpZ2luYWwgPSBvcmlnaW5hbCBvciBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSwgcGF0aCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBpZiBfZmlsZToKICAgICAgICBfZmlsZSA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKCdmaWxlJywgX2ZpbGUpCiAgICBfb3BlbiA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKCdvcGVuJywgX29wZW4pCiAgICBmb3IgbmFtZSBpbiBbCiAgICAgICAgInN0YXQiLCAibGlzdGRpciIsICJjaGRpciIsICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwKICAgICAgICAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsICJ1dGltZSIsICJsY2hvd24iLCAiY2hyb290IiwgImxzdGF0IiwKICAgICAgICAic3RhcnRmaWxlIiwgIm1rZmlmbyIsICJta25vZCIsICJwYXRoY29uZiIsICJhY2Nlc3MiCiAgICBdOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lKQoKICAgIGRlZiBfbWtfc2luZ2xlX3dpdGhfcmV0dXJuKG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbJ3JlYWRsaW5rJywgJ3RlbXBuYW0nXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKQoKICAgIGRlZiBfbWtfcXVlcnkobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICByZXR2YWwgPSBvcmlnaW5hbCgqYXJncywgKiprdykKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCByZXR2YWwpCiAgICAgICAgICAgIHJldHVybiByZXR2YWwKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbJ2dldGN3ZCcsICd0bXBuYW0nXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3F1ZXJ5KG5hbWUpCgogICAgZGVmIF92YWxpZGF0ZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIkNhbGxlZCB0byByZW1hcCBvciB2YWxpZGF0ZSBhbnkgcGF0aCwgd2hldGhlciBpbnB1dCBvciBvdXRwdXQiIiIKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgogICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCgogICAgZGVmIF9yZW1hcF9vdXRwdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggb3V0cHV0cyIiIgogICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCgogICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsIG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLl9yZW1hcF9pbnB1dChvcGVyYXRpb24gKyAnLWZyb20nLCBzcmMsICphcmdzLCAqKmt3KSwKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy10bycsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgKQoKCmlmIGhhc2F0dHIob3MsICdkZXZudWxsJyk6CiAgICBfRVhDRVBUSU9OUyA9IFtvcy5kZXZudWxsLF0KZWxzZToKICAgIF9FWENFUFRJT05TID0gW10KCgpjbGFzcyBEaXJlY3RvcnlTYW5kYm94KEFic3RyYWN0U2FuZGJveCk6CiAgICAiIiJSZXN0cmljdCBvcGVyYXRpb25zIHRvIGEgc2luZ2xlIHN1YmRpcmVjdG9yeSAtIHBzZXVkby1jaHJvb3QiIiIKCiAgICB3cml0ZV9vcHMgPSBkaWN0LmZyb21rZXlzKFsKICAgICAgICAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwKICAgICAgICAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJta2ZpZm8iLCAibWtub2QiLCAidGVtcG5hbSIsCiAgICBdKQoKICAgIF9leGNlcHRpb25fcGF0dGVybnMgPSBbCiAgICAgICAgIyBBbGxvdyBsaWIydG8zIHRvIGF0dGVtcHQgdG8gc2F2ZSBhIHBpY2tsZWQgZ3JhbW1hciBvYmplY3QgKCMxMjEpCiAgICAgICAgcicuKmxpYjJ0bzMuKlwucGlja2xlJCcsCiAgICBdCiAgICAiZXhlbXB0IHdyaXRpbmcgdG8gcGF0aHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2FuZGJveCwgZXhjZXB0aW9ucz1fRVhDRVBUSU9OUyk6CiAgICAgICAgc2VsZi5fc2FuZGJveCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChzYW5kYm94KSkKICAgICAgICBzZWxmLl9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc2VsZi5fc2FuZGJveCwgJycpCiAgICAgICAgc2VsZi5fZXhjZXB0aW9ucyA9IFsKICAgICAgICAgICAgb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICBmb3IgcGF0aCBpbiBleGNlcHRpb25zCiAgICAgICAgXQogICAgICAgIEFic3RyYWN0U2FuZGJveC5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBfdmlvbGF0aW9uKHNlbGYsIG9wZXJhdGlvbiwgKmFyZ3MsICoqa3cpOgogICAgICAgIGZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBTYW5kYm94VmlvbGF0aW9uCiAgICAgICAgcmFpc2UgU2FuZGJveFZpb2xhdGlvbihvcGVyYXRpb24sIGFyZ3MsIGt3KQoKICAgIGlmIF9maWxlOgoKICAgICAgICBkZWYgX2ZpbGUoc2VsZiwgcGF0aCwgbW9kZT0ncicsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJmaWxlIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBfZmlsZShwYXRoLCBtb2RlLCAqYXJncywgKiprdykKCiAgICBkZWYgX29wZW4oc2VsZiwgcGF0aCwgbW9kZT0ncicsICphcmdzLCAqKmt3KToKICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnLCAnVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigib3BlbiIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3BlbihwYXRoLCBtb2RlLCAqYXJncywgKiprdykKCiAgICBkZWYgdG1wbmFtKHNlbGYpOgogICAgICAgIHNlbGYuX3Zpb2xhdGlvbigidG1wbmFtIikKCiAgICBkZWYgX29rKHNlbGYsIHBhdGgpOgogICAgICAgIGFjdGl2ZSA9IHNlbGYuX2FjdGl2ZQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgocGF0aCkpCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBzZWxmLl9leGVtcHRlZChyZWFscGF0aCkKICAgICAgICAgICAgICAgIG9yIHJlYWxwYXRoID09IHNlbGYuX3NhbmRib3gKICAgICAgICAgICAgICAgIG9yIHJlYWxwYXRoLnN0YXJ0c3dpdGgoc2VsZi5fcHJlZml4KQogICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gYWN0aXZlCgogICAgZGVmIF9leGVtcHRlZChzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgc3RhcnRfbWF0Y2hlcyA9ICgKICAgICAgICAgICAgZmlsZXBhdGguc3RhcnRzd2l0aChleGNlcHRpb24pCiAgICAgICAgICAgIGZvciBleGNlcHRpb24gaW4gc2VsZi5fZXhjZXB0aW9ucwogICAgICAgICkKICAgICAgICBwYXR0ZXJuX21hdGNoZXMgPSAoCiAgICAgICAgICAgIHJlLm1hdGNoKHBhdHRlcm4sIGZpbGVwYXRoKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLl9leGNlcHRpb25fcGF0dGVybnMKICAgICAgICApCiAgICAgICAgY2FuZGlkYXRlcyA9IGl0ZXJ0b29scy5jaGFpbihzdGFydF9tYXRjaGVzLCBwYXR0ZXJuX21hdGNoZXMpCiAgICAgICAgcmV0dXJuIGFueShjYW5kaWRhdGVzKQoKICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgogICAgICAgIGlmIG9wZXJhdGlvbiBpbiBzZWxmLndyaXRlX29wcyBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX29rKHNyYykgb3Igbm90IHNlbGYuX29rKGRzdCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gKHNyYywgZHN0KQoKICAgIGRlZiBvcGVuKHNlbGYsIGZpbGUsIGZsYWdzLCBtb2RlPTBvNzc3LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBsb3ctbGV2ZWwgb3Mub3BlbigpIiIiCiAgICAgICAgaWYgZmxhZ3MgJiBXUklURV9GTEFHUyBhbmQgbm90IHNlbGYuX29rKGZpbGUpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9zLm9wZW4iLCBmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIF9vcy5vcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCAqYXJncywgKiprdykKCgpXUklURV9GTEFHUyA9IGZ1bmN0b29scy5yZWR1Y2UoCiAgICBvcGVyYXRvci5vcl8sIFtnZXRhdHRyKF9vcywgYSwgMCkgZm9yIGEgaW4KICAgICAgICAiT19XUk9OTFkgT19SRFdSIE9fQVBQRU5EIE9fQ1JFQVQgT19UUlVOQyBPX1RFTVBPUkFSWSIuc3BsaXQoKV0KKQoKCmNsYXNzIFNhbmRib3hWaW9sYXRpb24oRGlzdHV0aWxzRXJyb3IpOgogICAgIiIiQSBzZXR1cCBzY3JpcHQgYXR0ZW1wdGVkIHRvIG1vZGlmeSB0aGUgZmlsZXN5c3RlbSBvdXRzaWRlIHRoZSBzYW5kYm94IiIiCgogICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBTYW5kYm94VmlvbGF0aW9uOiB7Y21kfXthcmdzIXJ9IHtrd2FyZ3N9CgogICAgICAgIFRoZSBwYWNrYWdlIHNldHVwIHNjcmlwdCBoYXMgYXR0ZW1wdGVkIHRvIG1vZGlmeSBmaWxlcyBvbiB5b3VyIHN5c3RlbQogICAgICAgIHRoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIEVhc3lJbnN0YWxsIGJ1aWxkIGFyZWEsIGFuZCBoYXMgYmVlbiBhYm9ydGVkLgoKICAgICAgICBUaGlzIHBhY2thZ2UgY2Fubm90IGJlIHNhZmVseSBpbnN0YWxsZWQgYnkgRWFzeUluc3RhbGwsIGFuZCBtYXkgbm90CiAgICAgICAgc3VwcG9ydCBhbHRlcm5hdGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyBldmVuIGlmIHlvdSBydW4gaXRzIHNldHVwCiAgICAgICAgc2NyaXB0IGJ5IGhhbmQuICBQbGVhc2UgaW5mb3JtIHRoZSBwYWNrYWdlJ3MgYXV0aG9yIGFuZCB0aGUgRWFzeUluc3RhbGwKICAgICAgICBtYWludGFpbmVycyB0byBmaW5kIG91dCBpZiBhIGZpeCBvciB3b3JrYXJvdW5kIGlzIGF2YWlsYWJsZS4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgY21kLCBhcmdzLCBrd2FyZ3MgPSBzZWxmLmFyZ3MKICAgICAgICByZXR1cm4gc2VsZi50bXBsLmZvcm1hdCgqKmxvY2FscygpKQpQSwMEFAAAAAAAAAAhAKgztL6KAAAAigAAAC4AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NjcmlwdC50bXBsIyBFQVNZLUlOU1RBTEwtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXIKX19yZXF1aXJlc19fID0gJShzcGVjKXIKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcycpLnJ1bl9zY3JpcHQoJShzcGVjKXIsICUoc2NyaXB0X25hbWUpcikKUEsDBBQAAAAAAAAAIQACwZTjAwkAAAMJAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5ZGVmIF9fYm9vdCgpOgogICAgaW1wb3J0IHN5cwogICAgaW1wb3J0IG9zCiAgICBQWVRIT05QQVRIID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogICAgaWYgUFlUSE9OUEFUSCBpcyBOb25lIG9yIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgogICAgICAgIFBZVEhPTlBBVEggPSBbXQogICAgZWxzZToKICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQoKICAgIHBpYyA9IGdldGF0dHIoc3lzLCAncGF0aF9pbXBvcnRlcl9jYWNoZScsIHt9KQogICAgc3RkcGF0aCA9IHN5cy5wYXRoW2xlbihQWVRIT05QQVRIKTpdCiAgICBteWRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKCiAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgogICAgICAgIGlmIGl0ZW0gPT0gbXlkaXIgb3Igbm90IGl0ZW06CiAgICAgICAgICAgIGNvbnRpbnVlICAjIHNraXAgaWYgY3VycmVudCBkaXIuIG9uIFdpbmRvd3MsIG9yIG15IG93biBkaXJlY3RvcnkKICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKICAgICAgICBpZiBpbXBvcnRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZSgnc2l0ZScpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBpbXAgICMgQXZvaWQgaW1wb3J0IGxvb3AgaW4gUHl0aG9uID49IDMuMwogICAgICAgICAgICAgICAgc3RyZWFtLCBwYXRoLCBkZXNjciA9IGltcC5maW5kX21vZHVsZSgnc2l0ZScsIFtpdGVtXSkKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZSgnc2l0ZScsIHN0cmVhbSwgcGF0aCwgZGVzY3IpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKCiAgICBrbm93bl9wYXRocyA9IGRpY3QoWyhtYWtlcGF0aChpdGVtKVsxXSwgMSkgZm9yIGl0ZW0gaW4gc3lzLnBhdGhdKSAgIyAyLjIgY29tcAoKICAgIG9sZHBvcyA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKSAgIyBzYXZlIG9sZCBpbnNlcnRpb24gcG9zaXRpb24KICAgIHN5cy5fX2VnZ2luc2VydCA9IDAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQoKICAgIGZvciBpdGVtIGluIFBZVEhPTlBBVEg6CiAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQoKICAgIHN5cy5fX2VnZ2luc2VydCArPSBvbGRwb3MgICMgcmVzdG9yZSBlZmZlY3RpdmUgb2xkIHBvc2l0aW9uCgogICAgZCwgbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQogICAgaW5zZXJ0X2F0ID0gTm9uZQogICAgbmV3X3BhdGggPSBbXQoKICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgogICAgICAgIHAsIG5wID0gbWFrZXBhdGgoaXRlbSkKCiAgICAgICAgaWYgbnAgPT0gbmQgYW5kIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICAjIFdlJ3ZlIGhpdCB0aGUgZmlyc3QgJ3N5c3RlbScgcGF0aCBlbnRyeSwgc28gYWRkZWQgZW50cmllcyBnbyBoZXJlCiAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKCiAgICAgICAgaWYgbnAgaW4ga25vd25fcGF0aHMgb3IgaW5zZXJ0X2F0IGlzIE5vbmU6CiAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgbmV3IHBhdGggYWZ0ZXIgdGhlIGluc2VydCBwb2ludCwgYmFjay1pbnNlcnQgaXQKICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKICAgICAgICAgICAgaW5zZXJ0X2F0ICs9IDEKCiAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCgoKaWYgX19uYW1lX18gPT0gJ3NpdGUnOgogICAgX19ib290KCkKICAgIGRlbCBfX2Jvb3QKUEsDBBQAAAAAAAAAIQCIm1tOLCEAACwhAAAxAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weWltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCBhdGV4aXQKaW1wb3J0IHJlCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBtYXAsIGZpbHRlcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBSZXNvbHV0aW9uRXJyb3IsIEV4dHJhY3Rpb25FcnJvcgoKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBzc2wgPSBOb25lCgpfX2FsbF9fID0gWwogICAgJ1ZlcmlmeWluZ0hUVFBTSGFuZGxlcicsICdmaW5kX2NhX2J1bmRsZScsICdpc19hdmFpbGFibGUnLCAnY2VydF9wYXRocycsCiAgICAnb3BlbmVyX2ZvcicKXQoKY2VydF9wYXRocyA9ICIiIgovZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydAovZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0Ci91c3Ivc2hhcmUvc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LmNydAovZXRjL3NzbC9jZXJ0LnBlbQovU3lzdGVtL0xpYnJhcnkvT3BlblNTTC9jZXJ0cy9jZXJ0LnBlbQovdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QtbnNzLmNydAovZXRjL3NzbC9jYS1idW5kbGUucGVtCiIiIi5zdHJpcCgpLnNwbGl0KCkKCnRyeToKICAgIEhUVFBTSGFuZGxlciA9IHVybGxpYi5yZXF1ZXN0LkhUVFBTSGFuZGxlcgogICAgSFRUUFNDb25uZWN0aW9uID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIEhUVFBTSGFuZGxlciA9IEhUVFBTQ29ubmVjdGlvbiA9IG9iamVjdAoKaXNfYXZhaWxhYmxlID0gc3NsIGlzIG5vdCBOb25lIGFuZCBvYmplY3Qgbm90IGluIChIVFRQU0hhbmRsZXIsIEhUVFBTQ29ubmVjdGlvbikKCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvcgogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yID0gTm9uZQogICAgICAgIG1hdGNoX2hvc3RuYW1lID0gTm9uZQoKaWYgbm90IENlcnRpZmljYXRlRXJyb3I6CgogICAgY2xhc3MgQ2VydGlmaWNhdGVFcnJvcihWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgoKaWYgbm90IG1hdGNoX2hvc3RuYW1lOgoKICAgIGRlZiBfZG5zbmFtZV9tYXRjaChkbiwgaG9zdG5hbWUsIG1heF93aWxkY2FyZHM9MSk6CiAgICAgICAgIiIiTWF0Y2hpbmcgYWNjb3JkaW5nIHRvIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zCgogICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxMjUjc2VjdGlvbi02LjQuMwogICAgICAgICIiIgogICAgICAgIHBhdHMgPSBbXQogICAgICAgIGlmIG5vdCBkbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgUG9ydGVkIGZyb20gcHl0aG9uMy1zeW50YXg6CiAgICAgICAgIyBsZWZ0bW9zdCwgKnJlbWFpbmRlciA9IGRuLnNwbGl0KHInLicpCiAgICAgICAgcGFydHMgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIGxlZnRtb3N0ID0gcGFydHNbMF0KICAgICAgICByZW1haW5kZXIgPSBwYXJ0c1sxOl0KCiAgICAgICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgICAgIGlmIHdpbGRjYXJkcyA+IG1heF93aWxkY2FyZHM6CiAgICAgICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgICAgICMgcG9saWN5IGFtb25nIFNTTCBpbXBsZW1lbnRhdGlvbnMgc2hvd2VkIGl0IHRvIGJlIGEKICAgICAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgICAgICJ0b28gbWFueSB3aWxkY2FyZHMgaW4gY2VydGlmaWNhdGUgRE5TIG5hbWU6ICIgKyByZXByKGRuKSkKCiAgICAgICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICAgICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICAgICAgcmV0dXJuIGRuLmxvd2VyKCkgPT0gaG9zdG5hbWUubG93ZXIoKQoKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAgICAgIyB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGNvbXByaXNlcyBhIGxhYmVsIG90aGVyIHRoYW4gdGhlIGxlZnQtbW9zdCBsYWJlbC4KICAgICAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICAgICAjIGZyYWdtZW50LgogICAgICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAzLgogICAgICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgICAgICMgVS1sYWJlbCBvZiBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZS4KICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSwgJyonIG1hdGNoZXMgYW55IGRvdGxlc3Mgc3RyaW5nLCBlLmcuIHd3dyoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAgICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICAgICAgZm9yIGZyYWcgaW4gcmVtYWluZGVyOgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICAgICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKCiAgICBkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgICAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgICAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlIikKICAgICAgICBkbnNuYW1lcyA9IFtdCiAgICAgICAgc2FuID0gY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2FuOgogICAgICAgICAgICBpZiBrZXkgPT0gJ0ROUyc6CiAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIG5vdCBkbnNuYW1lczoKICAgICAgICAgICAgIyBUaGUgc3ViamVjdCBpcyBvbmx5IGNoZWNrZWQgd2hlbiB0aGVyZSBpcyBubyBkTlNOYW1lIGVudHJ5CiAgICAgICAgICAgICMgaW4gc3ViamVjdEFsdE5hbWUKICAgICAgICAgICAgZm9yIHN1YiBpbiBjZXJ0LmdldCgnc3ViamVjdCcsICgpKToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHN1YjoKICAgICAgICAgICAgICAgICAgICAjIFhYWCBhY2NvcmRpbmcgdG8gUkZDIDI4MTgsIHRoZSBtb3N0IHNwZWNpZmljIENvbW1vbiBOYW1lCiAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tb25OYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbGVuKGRuc25hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoIGVpdGhlciBvZiAlcyIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCAnLCAnLmpvaW4obWFwKHJlcHIsIGRuc25hbWVzKSkpKQogICAgICAgIGVsaWYgbGVuKGRuc25hbWVzKSA9PSAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCAlciIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCBkbnNuYW1lc1swXSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigibm8gYXBwcm9wcmlhdGUgY29tbW9uTmFtZSBvciAiCiAgICAgICAgICAgICAgICAic3ViamVjdEFsdE5hbWUgZmllbGRzIHdlcmUgZm91bmQiKQoKCmNsYXNzIFZlcmlmeWluZ0hUVFBTSGFuZGxlcihIVFRQU0hhbmRsZXIpOgogICAgIiIiU2ltcGxlIHZlcmlmeWluZyBoYW5kbGVyOiBubyBhdXRoLCBzdWJjbGFzc2VzLCB0aW1lb3V0cywgZXRjLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYV9idW5kbGUpOgogICAgICAgIHNlbGYuY2FfYnVuZGxlID0gY2FfYnVuZGxlCiAgICAgICAgSFRUUFNIYW5kbGVyLl9faW5pdF9fKHNlbGYpCgogICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKAogICAgICAgICAgICBsYW1iZGEgaG9zdCwgKiprdzogVmVyaWZ5aW5nSFRUUFNDb25uKGhvc3QsIHNlbGYuY2FfYnVuZGxlLCAqKmt3KSwgcmVxCiAgICAgICAgKQoKCmNsYXNzIFZlcmlmeWluZ0hUVFBTQ29ubihIVFRQU0Nvbm5lY3Rpb24pOgogICAgIiIiU2ltcGxlIHZlcmlmeWluZyBjb25uZWN0aW9uOiBubyBhdXRoLCBzdWJjbGFzc2VzLCB0aW1lb3V0cywgZXRjLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBjYV9idW5kbGUsICoqa3cpOgogICAgICAgIEhUVFBTQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBob3N0LCAqKmt3KQogICAgICAgIHNlbGYuY2FfYnVuZGxlID0gY2FfYnVuZGxlCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigKICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgZ2V0YXR0cihzZWxmLCAnc291cmNlX2FkZHJlc3MnLCBOb25lKQogICAgICAgICkKCiAgICAgICAgIyBIYW5kbGUgdGhlIHNvY2tldCBpZiBhIChwcm94eSkgdHVubmVsIGlzIHByZXNlbnQKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdfdHVubmVsJykgYW5kIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIE5vbmUpOgogICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrCiAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCiAgICAgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTc3NzY6IFB5dGhvbj49My40LjEgYW5kID49Mi43LjcKICAgICAgICAgICAgIyBjaGFuZ2Ugc2VsZi5ob3N0IHRvIG1lYW4gdGhlIHByb3h5IHNlcnZlciBob3N0IHdoZW4gdHVubmVsaW5nIGlzCiAgICAgICAgICAgICMgYmVpbmcgdXNlZC4gQWRhcHQsIHNpbmNlIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZXN0aW5hdGlvbgogICAgICAgICAgICAjIGhvc3QgZm9yIHRoZSBtYXRjaF9ob3N0bmFtZSgpIGNvbXBhcmlzb24uCiAgICAgICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5fdHVubmVsX2hvc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuaG9zdAoKICAgICAgICBpZiBoYXNhdHRyKHNzbCwgJ2NyZWF0ZV9kZWZhdWx0X2NvbnRleHQnKToKICAgICAgICAgICAgY3R4ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPXNlbGYuY2FfYnVuZGxlKQogICAgICAgICAgICBzZWxmLnNvY2sgPSBjdHgud3JhcF9zb2NrZXQoc29jaywgc2VydmVyX2hvc3RuYW1lPWFjdHVhbF9ob3N0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVGhpcyBpcyBmb3IgcHl0aG9uIDwgMi43LjkgYW5kIDwgMy40PwogICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoCiAgICAgICAgICAgICAgICBzb2NrLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPXNlbGYuY2FfYnVuZGxlCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hdGNoX2hvc3RuYW1lKHNlbGYuc29jay5nZXRwZWVyY2VydCgpLCBhY3R1YWxfaG9zdCkKICAgICAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5zb2NrLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpCiAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgoKZGVmIG9wZW5lcl9mb3IoY2FfYnVuZGxlPU5vbmUpOgogICAgIiIiR2V0IGEgdXJsb3BlbigpIHJlcGxhY2VtZW50IHRoYXQgdXNlcyBjYV9idW5kbGUgZm9yIHZlcmlmaWNhdGlvbiIiIgogICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LmJ1aWxkX29wZW5lcigKICAgICAgICBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoY2FfYnVuZGxlIG9yIGZpbmRfY2FfYnVuZGxlKCkpCiAgICApLm9wZW4KCgojIGZyb20gamFyYWNvLmZ1bmN0b29scwpkZWYgb25jZShmdW5jKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoZnVuYywgJ2Fsd2F5c19yZXR1cm5zJyk6CiAgICAgICAgICAgIGZ1bmMuYWx3YXlzX3JldHVybnMgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gZnVuYy5hbHdheXNfcmV0dXJucwogICAgcmV0dXJuIHdyYXBwZXIKCgpAb25jZQpkZWYgZ2V0X3dpbl9jZXJ0ZmlsZSgpOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW5jZXJ0c3RvcmUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGNsYXNzIENlcnRGaWxlKHdpbmNlcnRzdG9yZS5DZXJ0RmlsZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihDZXJ0RmlsZSwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5jbG9zZSkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzdXBlcihDZXJ0RmlsZSwgc2VsZikuY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBfd2luY2VydHMgPSBDZXJ0RmlsZSgpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ0NBJykKICAgIF93aW5jZXJ0cy5hZGRzdG9yZSgnUk9PVCcpCiAgICByZXR1cm4gX3dpbmNlcnRzLm5hbWUKCgpkZWYgZmluZF9jYV9idW5kbGUoKToKICAgICIiIlJldHVybiBhbiBleGlzdGluZyBDQSBidW5kbGUgcGF0aCwgb3IgTm9uZSIiIgogICAgZXh0YW50X2NlcnRfcGF0aHMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGNlcnRfcGF0aHMpCiAgICByZXR1cm4gKAogICAgICAgIGdldF93aW5fY2VydGZpbGUoKQogICAgICAgIG9yIG5leHQoZXh0YW50X2NlcnRfcGF0aHMsIE5vbmUpCiAgICAgICAgb3IgX2NlcnRpZmlfd2hlcmUoKQogICAgKQoKCmRlZiBfY2VydGlmaV93aGVyZSgpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfX2ltcG9ydF9fKCdjZXJ0aWZpJykud2hlcmUoKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IpOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCaQtea5AMAAOQDAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5aW1wb3J0IHVuaWNvZGVkYXRhCmltcG9ydCBzeXMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKCiMgSEZTIFBsdXMgdXNlcyBkZWNvbXBvc2VkIFVURi04CmRlZiBkZWNvbXBvc2UocGF0aCk6CiAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GRCcsIHBhdGgpCiAgICB0cnk6CiAgICAgICAgcGF0aCA9IHBhdGguZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcGF0aCA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZEJywgcGF0aCkKICAgICAgICBwYXRoID0gcGF0aC5lbmNvZGUoJ3V0Zi04JykKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcyAgIyBOb3QgVVRGLTgKICAgIHJldHVybiBwYXRoCgoKZGVmIGZpbGVzeXNfZGVjb2RlKHBhdGgpOgogICAgIiIiCiAgICBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBkZWNvZGVkLAogICAgTk9ORSB3aGVuIG5vIGV4cGVjdGVkIGVuY29kaW5nIHdvcmtzCiAgICAiIiIKCiAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiBwYXRoCgogICAgZnNfZW5jID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIG9yICd1dGYtOCcKICAgIGNhbmRpZGF0ZXMgPSBmc19lbmMsICd1dGYtOCcKCiAgICBmb3IgZW5jIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGF0aC5kZWNvZGUoZW5jKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCgoKZGVmIHRyeV9lbmNvZGUoc3RyaW5nLCBlbmMpOgogICAgInR1cm4gdW5pY29kZSBlbmNvZGluZyBpbnRvIGEgZnVuY3Rpb25hbCByb3V0aW5lIgogICAgdHJ5OgogICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKGVuYykKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQBIsUxikAAAAJAAAAAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy92ZXJzaW9uLnB5aW1wb3J0IHBrZ19yZXNvdXJjZXMKCnRyeToKICAgIF9fdmVyc2lvbl9fID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykudmVyc2lvbgpleGNlcHQgRXhjZXB0aW9uOgogICAgX192ZXJzaW9uX18gPSAndW5rbm93bicKUEsDBBQAAAAAAAAAIQBwHQjzQRwAAEEcAAArAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aGVlbC5weScnJ1doZWVscyBzdXBwb3J0LicnJwoKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCmltcG9ydCBlbWFpbAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIHBhcnNlX3ZlcnNpb24KZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXggaW1wb3J0IFBZMwpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IERpc3RyaWJ1dGlvbiBhcyBTZXR1cHRvb2xzRGlzdHJpYnV0aW9uCmZyb20gc2V0dXB0b29scyBpbXBvcnQgcGVwNDI1dGFncwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbyBpbXBvcnQgd3JpdGVfcmVxdWlyZW1lbnRzCgoKV0hFRUxfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiXig/UDxwcm9qZWN0X25hbWU+Lis/KS0oP1A8dmVyc2lvbj5cZC4qPykKICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHlfdmVyc2lvbj4uKz8pLSg/UDxhYmk+Lis/KS0oP1A8cGxhdGZvcm0+Lis/KQogICAgKVwud2hsJCIiIiwKcmUuVkVSQk9TRSkubWF0Y2gKCk5BTUVTUEFDRV9QQUNLQUdFX0lOSVQgPSAnJydcCnRyeToKICAgIF9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXykKZXhjZXB0IEltcG9ydEVycm9yOgogICAgX19wYXRoX18gPSBfX2ltcG9ydF9fKCdwa2d1dGlsJykuZXh0ZW5kX3BhdGgoX19wYXRoX18sIF9fbmFtZV9fKQonJycKCgpkZWYgdW5wYWNrKHNyY19kaXIsIGRzdF9kaXIpOgogICAgJycnTW92ZSBldmVyeXRoaW5nIHVuZGVyIGBzcmNfZGlyYCB0byBgZHN0X2RpcmAsIGFuZCBkZWxldGUgdGhlIGZvcm1lci4nJycKICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc3JjX2Rpcik6CiAgICAgICAgc3ViZGlyID0gb3MucGF0aC5yZWxwYXRoKGRpcnBhdGgsIHNyY19kaXIpCiAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZikKICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdF9kaXIsIHN1YmRpciwgZikKICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICBmb3IgbiwgZCBpbiByZXZlcnNlZChsaXN0KGVudW1lcmF0ZShkaXJuYW1lcykpKToKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGQpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGQpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkc3QpOgogICAgICAgICAgICAgICAgIyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgaW4gZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAjIHJlbmFtZSBpdCBhbmQgcHJ1bmUgaXQgZnJvbSBvcy53YWxrIGxpc3QuCiAgICAgICAgICAgICAgICBvcy5yZW5hbWVzKHNyYywgZHN0KQogICAgICAgICAgICAgICAgZGVsIGRpcm5hbWVzW25dCiAgICAjIENsZWFudXAuCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIsIHRvcGRvd249VHJ1ZSk6CiAgICAgICAgYXNzZXJ0IG5vdCBmaWxlbmFtZXMKICAgICAgICBvcy5ybWRpcihkaXJwYXRoKQoKCmNsYXNzIFdoZWVsKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBtYXRjaCA9IFdIRUVMX05BTUUob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB3aGVlbCBuYW1lOiAlcicgJSBmaWxlbmFtZSkKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBmb3IgaywgdiBpbiBtYXRjaC5ncm91cGRpY3QoKS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGssIHYpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgJycnTGlzdCB0YWdzIChweV92ZXJzaW9uLCBhYmksIHBsYXRmb3JtKSBzdXBwb3J0ZWQgYnkgdGhpcyB3aGVlbC4nJycKICAgICAgICByZXR1cm4gaXRlcnRvb2xzLnByb2R1Y3Qoc2VsZi5weV92ZXJzaW9uLnNwbGl0KCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWJpLnNwbGl0KCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGxhdGZvcm0uc3BsaXQoJy4nKSkKCiAgICBkZWYgaXNfY29tcGF0aWJsZShzZWxmKToKICAgICAgICAnJydJcyB0aGUgd2hlZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHBsYXRmb3JtPycnJwogICAgICAgIHN1cHBvcnRlZF90YWdzID0gcGVwNDI1dGFncy5nZXRfc3VwcG9ydGVkKCkKICAgICAgICByZXR1cm4gbmV4dCgoVHJ1ZSBmb3IgdCBpbiBzZWxmLnRhZ3MoKSBpZiB0IGluIHN1cHBvcnRlZF90YWdzKSwgRmFsc2UpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1zZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbj1zZWxmLnZlcnNpb24sCiAgICAgICAgICAgIHBsYXRmb3JtPShOb25lIGlmIHNlbGYucGxhdGZvcm0gPT0gJ2FueScgZWxzZSBnZXRfcGxhdGZvcm0oKSksCiAgICAgICAgKS5lZ2dfbmFtZSgpICsgJy5lZ2cnCgogICAgZGVmIGluc3RhbGxfYXNfZWdnKHNlbGYsIGRlc3RpbmF0aW9uX2VnZ2Rpcik6CiAgICAgICAgJycnSW5zdGFsbCB3aGVlbCBhcyBhbiBlZ2cgZGlyZWN0b3J5LicnJwogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBkaXN0X2Jhc2VuYW1lID0gJyVzLSVzJyAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgICAgICBkaXN0X2luZm8gPSAnJXMuZGlzdC1pbmZvJyAlIGRpc3RfYmFzZW5hbWUKICAgICAgICAgICAgZGlzdF9kYXRhID0gJyVzLmRhdGEnICUgZGlzdF9iYXNlbmFtZQogICAgICAgICAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKCclcy8lcycgJSAoZGlzdF9pbmZvLCBuYW1lKSkgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmcC5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpIGlmIFBZMyBlbHNlIGZwLnJlYWQoKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIodmFsdWUpCiAgICAgICAgICAgIHdoZWVsX21ldGFkYXRhID0gZ2V0X21ldGFkYXRhKCdXSEVFTCcpCiAgICAgICAgICAgIGRpc3RfbWV0YWRhdGEgPSBnZXRfbWV0YWRhdGEoJ01FVEFEQVRBJykKICAgICAgICAgICAgIyBDaGVjayB3aGVlbCBmb3JtYXQgdmVyc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgICAgICAgIHdoZWVsX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHdoZWVsX21ldGFkYXRhLmdldCgnV2hlZWwtVmVyc2lvbicpKQogICAgICAgICAgICBpZiBub3QgcGFyc2VfdmVyc2lvbignMS4wJykgPD0gd2hlZWxfdmVyc2lvbiA8IHBhcnNlX3ZlcnNpb24oJzIuMGRldjAnKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vuc3VwcG9ydGVkIHdoZWVsIGZvcm1hdCB2ZXJzaW9uOiAlcycgJSB3aGVlbF92ZXJzaW9uKQogICAgICAgICAgICAjIEV4dHJhY3QgdG8gdGFyZ2V0IGRpcmVjdG9yeS4KICAgICAgICAgICAgb3MubWtkaXIoZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgICAgICB6Zi5leHRyYWN0YWxsKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAgICAgIyBDb252ZXJ0IG1ldGFkYXRhLgogICAgICAgICAgICBkaXN0X2luZm8gPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8pCiAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvLAogICAgICAgICAgICAgICAgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKQogICAgICAgICAgICApCiAgICAgICAgICAgICMgTm90ZTogd2UgbmVlZCB0byBldmFsdWF0ZSBhbmQgc3RyaXAgbWFya2VycyBub3csCiAgICAgICAgICAgICMgYXMgd2UgY2FuJ3QgZWFzaWx5IGNvbnZlcnQgYmFjayBmcm9tIHRoZSBzeW50YXg6CiAgICAgICAgICAgICMgZm9vYmFyOyAibGludXgiIGluIHN5c19wbGF0Zm9ybSBhbmQgZXh0cmEgPT0gJ3Rlc3QnCiAgICAgICAgICAgIGRlZiByYXdfcmVxKHJlcSk6CiAgICAgICAgICAgICAgICByZXEubWFya2VyID0gTm9uZQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cihyZXEpCiAgICAgICAgICAgIGluc3RhbGxfcmVxdWlyZXMgPSBsaXN0KHNvcnRlZChtYXAocmF3X3JlcSwgZGlzdC5yZXF1aXJlcygpKSkpCiAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlID0gewogICAgICAgICAgICAgICAgZXh0cmE6IGxpc3Qoc29ydGVkKAogICAgICAgICAgICAgICAgICAgIHJlcQogICAgICAgICAgICAgICAgICAgIGZvciByZXEgaW4gbWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKGV4dHJhLCkpKQogICAgICAgICAgICAgICAgICAgIGlmIHJlcSBub3QgaW4gaW5zdGFsbF9yZXF1aXJlcwogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIGZvciBleHRyYSBpbiBkaXN0LmV4dHJhcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgb3MucmVuYW1lKGRpc3RfaW5mbywgZWdnX2luZm8pCiAgICAgICAgICAgIG9zLnJlbmFtZShvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdNRVRBREFUQScpLAogICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnUEtHLUlORk8nKSkKICAgICAgICAgICAgc2V0dXBfZGlzdCA9IFNldHVwdG9vbHNEaXN0cmlidXRpb24oYXR0cnM9ZGljdCgKICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxdWlyZXM9aW5zdGFsbF9yZXF1aXJlcywKICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlPWV4dHJhc19yZXF1aXJlLAogICAgICAgICAgICApKQogICAgICAgICAgICB3cml0ZV9yZXF1aXJlbWVudHMoc2V0dXBfZGlzdC5nZXRfY29tbWFuZF9vYmooJ2VnZ19pbmZvJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdyZXF1aXJlcy50eHQnKSkKICAgICAgICAgICAgIyBNb3ZlIGRhdGEgZW50cmllcyB0byB0aGVpciBjb3JyZWN0IGxvY2F0aW9uLgogICAgICAgICAgICBkaXN0X2RhdGEgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2RhdGEpCiAgICAgICAgICAgIGRpc3RfZGF0YV9zY3JpcHRzID0gb3MucGF0aC5qb2luKGRpc3RfZGF0YSwgJ3NjcmlwdHMnKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgICAgICBlZ2dfaW5mb19zY3JpcHRzID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VHRy1JTkZPJywgJ3NjcmlwdHMnKQogICAgICAgICAgICAgICAgb3MubWtkaXIoZWdnX2luZm9fc2NyaXB0cykKICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKGRpc3RfZGF0YV9zY3JpcHRzKToKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBieXRlY29kZSwgYXMgaXQncyBub3QgcHJvcGVybHkgaGFuZGxlZAogICAgICAgICAgICAgICAgICAgICMgZHVyaW5nIGVhc3lfaW5zdGFsbCBzY3JpcHRzIGluc3RhbGwgcGhhc2UuCiAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkuZW5kc3dpdGgoJy5weWMnKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihkaXN0X2RhdGFfc2NyaXB0cywgZW50cnkpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mb19zY3JpcHRzLCBlbnRyeSkpCiAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGFfc2NyaXB0cykKICAgICAgICAgICAgZm9yIHN1YmRpciBpbiBmaWx0ZXIob3MucGF0aC5leGlzdHMsICgKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2RhdGEsIGQpCiAgICAgICAgICAgICAgICBmb3IgZCBpbiAoJ2RhdGEnLCAnaGVhZGVycycsICdwdXJlbGliJywgJ3BsYXRsaWInKQogICAgICAgICAgICApKToKICAgICAgICAgICAgICAgIHVucGFjayhzdWJkaXIsIGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhKToKICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRpc3RfZGF0YSkKICAgICAgICAgICAgIyBGaXggbmFtZXNwYWNlIHBhY2thZ2VzLgogICAgICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICduYW1lc3BhY2VfcGFja2FnZXMudHh0JykKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihuYW1lc3BhY2VfcGFja2FnZXMpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZV9wYWNrYWdlcyA9IGZwLnJlYWQoKS5zcGxpdCgpCiAgICAgICAgICAgICAgICBmb3IgbW9kIGluIG5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgICAgICBtb2RfZGlyID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgKm1vZC5zcGxpdCgnLicpKQogICAgICAgICAgICAgICAgICAgIG1vZF9pbml0ID0gb3MucGF0aC5qb2luKG1vZF9kaXIsICdfX2luaXRfXy5weScpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobW9kX2RpcikgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhtb2RfaW5pdCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbihtb2RfaW5pdCwgJ3cnKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKE5BTUVTUEFDRV9QQUNLQUdFX0lOSVQpClBLAwQUAAAAAAAAACEA+cvuDcoCAADKAgAANQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5aW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjdHlwZXMKCgpkZWYgd2luZG93c19vbmx5KGZ1bmMpOgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgogICAgICAgIHJldHVybiBsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiBOb25lCiAgICByZXR1cm4gZnVuYwoKCkB3aW5kb3dzX29ubHkKZGVmIGhpZGVfZmlsZShwYXRoKToKICAgICIiIgogICAgU2V0IHRoZSBoaWRkZW4gYXR0cmlidXRlIG9uIGEgZmlsZSBvciBkaXJlY3RvcnkuCgogICAgRnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NjIyMTMzLwoKICAgIGBwYXRoYCBtdXN0IGJlIHRleHQuCiAgICAiIiIKICAgIF9faW1wb3J0X18oJ2N0eXBlcy53aW50eXBlcycpCiAgICBTZXRGaWxlQXR0cmlidXRlcyA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuU2V0RmlsZUF0dHJpYnV0ZXNXCiAgICBTZXRGaWxlQXR0cmlidXRlcy5hcmd0eXBlcyA9IGN0eXBlcy53aW50eXBlcy5MUFdTVFIsIGN0eXBlcy53aW50eXBlcy5EV09SRAogICAgU2V0RmlsZUF0dHJpYnV0ZXMucmVzdHlwZSA9IGN0eXBlcy53aW50eXBlcy5CT09MCgogICAgRklMRV9BVFRSSUJVVEVfSElEREVOID0gMHgwMgoKICAgIHJldCA9IFNldEZpbGVBdHRyaWJ1dGVzKHBhdGgsIEZJTEVfQVRUUklCVVRFX0hJRERFTikKICAgIGlmIG5vdCByZXQ6CiAgICAgICAgcmFpc2UgY3R5cGVzLldpbkVycm9yKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAgAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAIg6pdRVJgAAVSYAAD0AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0V2hlZWwKPT09PT0KCkEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4KCkEgd2hlZWwgaXMgYSBaSVAtZm9ybWF0IGFyY2hpdmUgd2l0aCBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgZmlsZW5hbWUKYW5kIHRoZSAud2hsIGV4dGVuc2lvbi4gSXQgaXMgZGVzaWduZWQgdG8gY29udGFpbiBhbGwgdGhlIGZpbGVzIGZvciBhClBFUCAzNzYgY29tcGF0aWJsZSBpbnN0YWxsIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgb24tZGlzawpmb3JtYXQuIE1hbnkgcGFja2FnZXMgd2lsbCBiZSBwcm9wZXJseSBpbnN0YWxsZWQgd2l0aCBvbmx5IHRoZSAiVW5wYWNrIgpzdGVwIChzaW1wbHkgZXh0cmFjdGluZyB0aGUgZmlsZSBvbnRvIHN5cy5wYXRoKSwgYW5kIHRoZSB1bnBhY2tlZCBhcmNoaXZlCnByZXNlcnZlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gIlNwcmVhZCIgKGNvcHkgZGF0YSBhbmQgc2NyaXB0cyB0byB0aGVpcgpmaW5hbCBsb2NhdGlvbnMpIGF0IGFueSBsYXRlciB0aW1lLgoKVGhlIHdoZWVsIHByb2plY3QgcHJvdmlkZXMgYSBgYmRpc3Rfd2hlZWxgIGNvbW1hbmQgZm9yIHNldHVwdG9vbHMKKHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44LjApLiBXaGVlbCBmaWxlcyBjYW4gYmUgaW5zdGFsbGVkIHdpdGggYQpuZXdlciBgcGlwYCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcCBvciB3aXRoIHdoZWVsJ3Mgb3duIGNvbW1hbmQKbGluZSB1dGlsaXR5LgoKVGhlIHdoZWVsIGRvY3VtZW50YXRpb24gaXMgYXQgaHR0cDovL3doZWVsLnJ0ZmQub3JnLy4gVGhlIGZpbGUgZm9ybWF0CmlzIGRvY3VtZW50ZWQgaW4gUEVQIDQyNyAoaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LykuCgpUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGF0IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsCgpXaHkgbm90IGVnZz8KLS0tLS0tLS0tLS0tCgpQeXRob24ncyBlZ2cgZm9ybWF0IHByZWRhdGVzIHRoZSBwYWNrYWdpbmcgcmVsYXRlZCBzdGFuZGFyZHMgd2UgaGF2ZQp0b2RheSwgdGhlIG1vc3QgaW1wb3J0YW50IGJlaW5nIFBFUCAzNzYgIkRhdGFiYXNlIG9mIEluc3RhbGxlZCBQeXRob24KRGlzdHJpYnV0aW9ucyIgd2hpY2ggc3BlY2lmaWVzIHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSAoaW5zdGVhZCBvZgouZWdnLWluZm8pIGFuZCBQRVAgNDI2ICJNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzIDIuMCIKd2hpY2ggc3BlY2lmaWVzIGhvdyB0byBleHByZXNzIGRlcGVuZGVuY2llcyAoaW5zdGVhZCBvZiByZXF1aXJlcy50eHQKaW4gLmVnZy1pbmZvKS4KCldoZWVsIGltcGxlbWVudHMgdGhlc2UgdGhpbmdzLiBJdCBhbHNvIHByb3ZpZGVzIGEgcmljaGVyIGZpbGUgbmFtaW5nCmNvbnZlbnRpb24gdGhhdCBjb21tdW5pY2F0ZXMgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgQUJJIGFzIHdlbGwKYXMgc2ltcGx5IHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHBhY2thZ2UuCgpVbmxpa2UgLmVnZywgd2hlZWwgd2lsbCBiZSBhIGZ1bGx5LWRvY3VtZW50ZWQgc3RhbmRhcmQgYXQgdGhlIGJpbmFyeQpsZXZlbCB0aGF0IGlzIHRydWx5IGVhc3kgdG8gaW5zdGFsbCBldmVuIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlCnJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgd2hlZWwgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsIGNoYXQKcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgYFB5UEEgQ29kZSBvZiBDb25kdWN0YF8uCgouLiBfUHlQQSBDb2RlIG9mIENvbmR1Y3Q6IGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8KCgoKMC4yOS4wCj09PT09PQotIEZpeCBjb21wcmVzc2lvbiB0eXBlIG9mIGZpbGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTUsIFB1bGwgUmVxdWVzdCAjNjIsCiAgdGhhbmtzIFhhdmllciBGZXJuYW5kZXopCgowLjI4LjAKPT09PT09Ci0gRml4IGZpbGUgbW9kZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NCkKCjAuMjcuMAo9PT09PT0KLSBTdXBwb3J0IGZvcmNpbmcgYSBwbGF0Zm9ybSB0YWcgdXNpbmcgYC0tcGxhdC1uYW1lYCBvbiBwdXJlLVB5dGhvbiB3aGVlbHMsIGFzCiAgd2VsbCBhcyBub25zdGFuZGFyZCBwbGF0Zm9ybSB0YWdzIG9uIG5vbi1wdXJlIHdoZWVscyAoUHVsbCBSZXF1ZXN0ICM2MCwgSXNzdWUKICAjMTQ0LCB0aGFua3MgQW5kcsOpcyBEw61heikKLSBBZGQgU09BQkkgdGFncyB0byBwbGF0Zm9ybS1zcGVjaWZpYyB3aGVlbHMgYnVpbHQgZm9yIFB5dGhvbiAyLlggKFB1bGwgUmVxdWVzdAogICM1NSwgSXNzdWUgIzYzLCBJc3N1ZSAjMTAxKQotIFN1cHBvcnQgcmVwcm9kdWNpYmxlIHdoZWVsIGZpbGVzLCB3aGVlbHMgdGhhdCBjYW4gYmUgcmVidWlsdCBhbmQgd2lsbCBoYXNoIHRvCiAgdGhlIHNhbWUgdmFsdWVzIGFzIHByZXZpb3VzIGJ1aWxkcyAoUHVsbCBSZXF1ZXN0ICM1MiwgSXNzdWUgIzE0MywgdGhhbmtzCiAgQmFycnkgV2Fyc2F3KQotIFN1cHBvcnQgZm9yIGNoYW5nZXMgaW4ga2V5cmluZyA+PSA4LjAgKFB1bGwgUmVxdWVzdCAjNjEsIHRoYW5rcyBKYXNvbiBSLgogIENvb21icykKLSBVc2UgdGhlIGZpbGUgY29udGV4dCBtYW5hZ2VyIHdoZW4gY2hlY2tpbmcgaWYgZGVwZW5kZW5jeV9saW5rcy50eHQgaXMgZW1wdHksCiAgZml4ZXMgcHJvYmxlbXMgYnVpbGRpbmcgd2hlZWxzIHVuZGVyIFB5UHkgb24gV2luZG93cyAgKElzc3VlICMxNTAsIHRoYW5rcwogIENvc2ltbyBMdXBvKQotIERvbid0IGF0dGVtcHQgdG8gKHJlY3Vyc2l2ZWx5KSBjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgZW5kaW5nIHdpdGggYC4uYAogIChpbnZhbGlkIG9uIGFsbCBwbGF0Zm9ybXMsIGJ1dCBjb2RlIHdhcyBvbmx5IGV4ZWN1dGVkIG9uIFdpbmRvd3MpIChJc3N1ZSAjOTEpCi0gQWRkZWQgdGhlIFB5UEEgQ29kZSBvZiBDb25kdWN0IChQdWxsIFJlcXVlc3QgIzU2KQoKMC4yNi4wCj09PT09PQotIEZpeCBtdWx0aXBsZSBlbnRyeXBvaW50IGNvbXBhcmlzb24gZmFpbHVyZSBvbiBQeXRob24gMyAoSXNzdWUgIzE0OCkKCjAuMjUuMAo9PT09PT0KLSBBZGQgUHl0aG9uIDMuNSB0byB0b3ggY29uZmlndXJhdGlvbgotIERldGVybWluaXN0aWMgKHNvcnRlZCkgbWV0YWRhdGEKLSBGaXggdGFnZ2luZyBmb3IgUHl0aG9uIDMuNSBjb21wYXRpYmlsaXR5Ci0gU3VwcG9ydCBweTItbm9uZS0nYXJjaCcgYW5kIHB5My1ub25lLSdhcmNoJyB0YWdzCi0gVHJlYXQgZGF0YS1vbmx5IHdoZWVscyBhcyBwdXJlCi0gV3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGUgYW5kIHJlbmFtZSB3aGVuIHVzaW5nIHdoZWVsIGluc3RhbGwgLS1mb3JjZQoKMC4yNC4wCj09PT09PQotIFRoZSBweXRob24gdGFnIHVzZWQgZm9yIHB1cmUtcHl0aG9uIHBhY2thZ2VzIGlzIG5vdyAucHlOIChtYWpvciB2ZXJzaW9uCiAgb25seSkuIFRoaXMgY2hhbmdlIGFjdHVhbGx5IG9jY3VycmVkIGluIDAuMjMuMCB3aGVuIHRoZSAtLXB5dGhvbi10YWcKICBvcHRpb24gd2FzIGFkZGVkLCBidXQgd2FzIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZCBpbiB0aGUgY2hhbmdlbG9nIHRoZW4uCi0gd2luaW5zdDJ3aGVlbCBhbmQgZWdnMndoZWVsIHJlbW92ZWQuIFVzZSAid2hlZWwgY29udmVydCBbYXJjaGl2ZV0iCiAgaW5zdGVhZC4KLSBXaGVlbCBub3cgc3VwcG9ydHMgc2V0dXB0b29scyBzdHlsZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMgdmlhIHRoZQogIGV4dHJhc19yZXF1aXJlPXt9IHN5bnRheC4gU2VwYXJhdGUgJ2V4dHJhJyBuYW1lcyBmcm9tIGNvbmRpdGlvbnMgdXNpbmcKICB0aGUgOiBjaGFyYWN0ZXIuIFdoZWVsJ3Mgb3duIHNldHVwLnB5IGRvZXMgdGhpcy4gKFRoZSBlbXB0eS1zdHJpbmcKICBleHRyYSBpcyB0aGUgc2FtZSBhcyBpbnN0YWxsX3JlcXVpcmVzLikgVGhlc2UgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzCiAgc2hvdWxkIHdvcmsgdGhlIHNhbWUgd2hldGhlciB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgYnkgd2hlZWwgb3IKICBieSBzZXR1cC5weS4KCjAuMjMuMAo9PT09PT0KLSBDb21wYXRpYmlsaXR5IHRhZyBmbGFncyBhZGRlZCB0byB0aGUgYmRpc3Rfd2hlZWwgY29tbWFuZAotIHNkaXN0IHNob3VsZCBpbmNsdWRlIGZpbGVzIG5lY2Vzc2FyeSBmb3IgdGVzdHMKLSAnd2hlZWwgY29udmVydCcgY2FuIG5vdyBhbHNvIGNvbnZlcnQgdW5wYWNrZWQgZWdncyB0byB3aGVlbAotIFJlbmFtZSBweWRpc3QuanNvbiB0byBtZXRhZGF0YS5qc29uIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIHRoZSBQRVAKLSBUaGUgLS1za2lwLXNjcmlwdHMgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIGFuZCBub3QgZ2VuZXJhdGluZyBzY3JpcHRzIGlzIG5vdwogIHRoZSBkZWZhdWx0LiBUaGUgb3B0aW9uIHdhcyBhIHRlbXBvcmFyeSBhcHByb2FjaCB1bnRpbCBpbnN0YWxsZXJzIGNvdWxkCiAgZ2VuZXJhdGUgc2NyaXB0cyB0aGVtc2VsdmVzLiBUaGF0IGlzIG5vdyB0aGUgY2FzZSB3aXRoIHBpcCAxLjUgYW5kIGxhdGVyLgogIE5vdGUgdGhhdCB1c2luZyBwaXAgMS40IHRvIGluc3RhbGwgYSB3aGVlbCB3aXRob3V0IHNjcmlwdHMgd2lsbCBsZWF2ZSB0aGUKICBpbnN0YWxsYXRpb24gd2l0aG91dCBlbnRyeS1wb2ludCB3cmFwcGVycy4gVGhlICJ3aGVlbCBpbnN0YWxsLXNjcmlwdHMiCiAgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpbiBzdWNoIGNhc2VzLgotIFRoYW5rIHlvdSBjb250cmlidXRvcnMKCjAuMjIuMAo9PT09PT0KLSBJbmNsdWRlIGVudHJ5X3BvaW50cy50eHQsIHNjcmlwdHMgYS5rLmEuIGNvbW1hbmRzLCBpbiBleHBlcmltZW50YWwKICBweWRpc3QuanNvbgotIEltcHJvdmVkIHRlc3RfcmVxdWlyZXMgcGFyc2luZwotIFB5dGhvbiAyLjYgZml4ZXMsICJ3aGVlbCB2ZXJzaW9uIiBjb21tYW5kIGNvdXJ0ZXN5IHBvbWJyZWRhbm5lCgowLjIxLjAKPT09PT09Ci0gUHJlZ2VuZXJhdGVkIHNjcmlwdHMgYXJlIHRoZSBkZWZhdWx0IGFnYWluLgotICJzZXR1cC5weSBiZGlzdF93aGVlbCAtLXNraXAtc2NyaXB0cyIgdHVybnMgdGhlbSBvZmYuCi0gc2V0dXB0b29scyBpcyBubyBsb25nZXIgYSBsaXN0ZWQgcmVxdWlyZW1lbnQgZm9yIHRoZSAnd2hlZWwnCiAgcGFja2FnZS4gSXQgaXMgb2YgY291cnNlIHN0aWxsIHJlcXVpcmVkIGluIG9yZGVyIGZvciBiZGlzdF93aGVlbAogIHRvIHdvcmsuCi0gInB5dGhvbiAtbSB3aGVlbCIgYXZvaWRzIGltcG9ydGluZyBwa2dfcmVzb3VyY2VzIHVudGlsIGl0J3MgbmVjZXNzYXJ5LgoKMC4yMC4wCj09PT09PQotIE5vIGxvbmdlciBpbmNsdWRlIGNvbnNvbGVfc2NyaXB0cyBpbiB3aGVlbHMuIE9yZGluYXJ5IHNjcmlwdHMgKHNoZWxsIGZpbGVzLAogIHN0YW5kYWxvbmUgUHl0aG9uIGZpbGVzKSBhcmUgaW5jbHVkZWQgYXMgdXN1YWwuCi0gSW5jbHVkZSBuZXcgY29tbWFuZCAicHl0aG9uIC1tIHdoZWVsIGluc3RhbGwtc2NyaXB0cyBbZGlzdHJpYnV0aW9uCiAgW2Rpc3RyaWJ1dGlvbiAuLi5dXSIgdG8gaW5zdGFsbCB0aGUgY29uc29sZV9zY3JpcHRzIChzZXR1cHRvb2xzLXN0eWxlCiAgc2NyaXB0cyB1c2luZyBwa2dfcmVzb3VyY2VzKSBmb3IgYSBkaXN0cmlidXRpb24uCgowLjE5LjAKPT09PT09Ci0gcHltZXRhLmpzb24gYmVjb21lcyBweWRpc3QuanNvbgoKMC4xOC4wCj09PT09PQotIFB5dGhvbiAzIFVuaWNvZGUgaW1wcm92ZW1lbnRzCgowLjE3LjAKPT09PT09Ci0gU3VwcG9ydCBsYXRlc3QgUEVQLTQyNiAicHltZXRhLmpzb24iIChqc29uLWZvcm1hdCBtZXRhZGF0YSkKCjAuMTYuMAo9PT09PT0KLSBQeXRob24gMi42IGNvbXBhdGliaWxpdHkgYnVnZml4ICh0aGFua3MgSm9obiBNY0ZhcmxhbmUpCi0gTm9uLXByZXJlbGVhc2UgdmVyc2lvbiBudW1iZXIKCjEuMC4wYTIKPT09PT09PQotIEJ1Z2ZpeCBmb3IgQy1leHRlbnNpb24gdGFncyBmb3IgQ1B5dGhvbiAzLjMgKHVzaW5nIFNPQUJJKQoKMS4wLjBhMQo9PT09PT09Ci0gQnVnZml4IGZvciBiZGlzdF93aW5pbnN0IGNvbnZlcnRlciAid2hlZWwgY29udmVydCIKLSBCdWdmaXggZm9yIGRpc3RzIHdoZXJlICJpcyBwdXJlIiBpcyBOb25lIGluc3RlYWQgb2YgVHJ1ZSBvciBGYWxzZQoKMS4wLjBhMAo9PT09PT09Ci0gVXBkYXRlIGZvciB2ZXJzaW9uIDEuMCBvZiBXaGVlbCAoUEVQIGFjY2VwdGVkKS4KLSBQeXRob24gMyBmaXggZm9yIG1vdmluZyBVbmljb2RlIERlc2NyaXB0aW9uIHRvIG1ldGFkYXRhIGJvZHkKLSBJbmNsdWRlIHJ1ZGltZW50YXJ5IEFQSSBkb2N1bWVudGF0aW9uIGluIFNwaGlueCAodGhhbmtzIEtldmluIEhvcm4pCgowLjE1LjAKPT09PT09Ci0gVmFyaW91cyBpbXByb3ZlbWVudHMKCjAuMTQuMAo9PT09PT0KLSBDaGFuZ2VkIHRoZSBzaWduYXR1cmUgZm9ybWF0IHRvIGJldHRlciBjb21wbHkgd2l0aCB0aGUgY3VycmVudCBKV1Mgc3BlYy4KICBCcmVha3MgYWxsIGV4aXN0aW5nIHNpZ25hdHVyZXMuCi0gSW5jbHVkZSBgYHdoZWVsIHVuc2lnbmBgIGNvbW1hbmQgdG8gcmVtb3ZlIFJFQ09SRC5qd3MgZnJvbSBhbiBhcmNoaXZlLgotIFB1dCB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIG5ld2x5IGFsbG93ZWQgcGF5bG9hZCBzZWN0aW9uIG9mIFBLRy1JTkZPCiAgKE1FVEFEQVRBKSBmaWxlcy4KCjAuMTMuMAo9PT09PT0KLSBVc2UgZGlzdHV0aWxzIGluc3RlYWQgb2Ygc3lzY29uZmlnIHRvIGdldCBpbnN0YWxsYXRpb24gcGF0aHM7IGNhbiBpbnN0YWxsCiAgaGVhZGVycy4KLSBJbXByb3ZlIFdoZWVsRmlsZSgpIHNvcnQuCi0gQWxsb3cgYm9vdHN0cmFwIGluc3RhbGxzIHdpdGhvdXQgYW55IHBrZ19yZXNvdXJjZXMuCgowLjEyLjAKPT09PT09Ci0gVW5pdCB0ZXN0IGZvciB3aGVlbC50b29sLmluc3RhbGwKCjAuMTEuMAo9PT09PT0KLSBBUEkgY2xlYW51cAoKMC4xMC4zCj09PT09PQotIFNjcmlwdHMgZml4ZXIgZml4CgowLjEwLjIKPT09PT09Ci0gRml4IGtleWdlbgoKMC4xMC4xCj09PT09PQotIFByZXNlcnZlIGF0dHJpYnV0ZXMgb24gaW5zdGFsbC4KCjAuMTAuMAo9PT09PT0KLSBJbmNsdWRlIGEgY29weSBvZiBwa2dfcmVzb3VyY2VzLiBXaGVlbCBjYW4gbm93IGluc3RhbGwgaW50byBhIHZpcnR1YWxlbnYKICB0aGF0IGRvZXMgbm90IGhhdmUgZGlzdHJpYnV0ZSAodGhvdWdoIG1vc3QgcGFja2FnZXMgc3RpbGwgcmVxdWlyZQogIHBrZ19yZXNvdXJjZXMgdG8gYWN0dWFsbHkgd29yazsgd2hlZWwgaW5zdGFsbCBkaXN0cmlidXRlKQotIERlZmluZSBhIG5ldyBzZXR1cC5jZmcgc2VjdGlvbiBbd2hlZWxdLiB1bml2ZXJzYWw9MSB3aWxsCiAgYXBwbHkgdGhlIHB5Mi5weTMtbm9uZS1hbnkgdGFnIGZvciBwdXJlIHB5dGhvbiB3aGVlbHMuCgowLjkuNwo9PT09PQotIE9ubHkgaW1wb3J0IGRpcnNwZWMgd2hlbiBuZWVkZWQuIGRpcnNwZWMgaXMgb25seSBuZWVkZWQgdG8gZmluZCB0aGUKICBjb25maWd1cmF0aW9uIGZvciBrZXlnZW4vc2lnbmluZyBvcGVyYXRpb25zLgoKMC45LjYKPT09PT0KLSByZXF1aXJlcy1kaXN0IGZyb20gc2V0dXAuY2ZnIG92ZXJ3cml0ZXMgYW55IHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLnB5CiAgQ2FyZSBtdXN0IGJlIHRha2VuIHRoYXQgdGhlIHJlcXVpcmVtZW50cyBhcmUgdGhlIHNhbWUgaW4gYm90aCBjYXNlcywKICBvciBqdXN0IGFsd2F5cyBpbnN0YWxsIGZyb20gd2hlZWwuCi0gZHJvcCBkaXJzcGVjIHJlcXVpcmVtZW50IG9uIHdpbjMyCi0gaW1wcm92ZWQgY29tbWFuZCBsaW5lIHV0aWxpdHksIGFkZHMgJ3doZWVsIGNvbnZlcnQgW2VnZyBvciB3aW5pbnN0XScgdG8KICBjb252ZXJ0IGxlZ2FjeSBiaW5hcnkgZm9ybWF0cyB0byB3aGVlbAoKMC45LjUKPT09PT0KLSBXaGVlbCdzIG93biB3aGVlbCBmaWxlIGNhbiBiZSBleGVjdXRlZCBieSBQeXRob24sIGFuZCBjYW4gaW5zdGFsbCBpdHNlbGY6CiAgYGBweXRob24gd2hlZWwtMC45LjUtcHkyNy1ub25lLWFueS93aGVlbCBpbnN0YWxsIC4uLmBgCi0gVXNlIGFyZ3BhcnNlOyBiYXNpYyBgYHdoZWVsIGluc3RhbGxgYCBjb21tYW5kIHNob3VsZCBydW4gd2l0aCBvbmx5IHN0ZGxpYgogIGRlcGVuZGVuY2llcy4KLSBBbGxvdyByZXF1aXJlc19kaXN0IGluIHNldHVwLmNmZydzIFttZXRhZGF0YV0gc2VjdGlvbi4gSW4gYWRkaXRpb24gdG8KICBkZXBlbmRlbmNpZXMgaW4gc2V0dXAucHksIGJ1dCB3aWxsIG9ubHkgYmUgaW50ZXJwcmV0ZWQgd2hlbiBpbnN0YWxsaW5nCiAgZnJvbSB3aGVlbCwgbm90IGZyb20gc2Rpc3QuIENhbiBiZSBxdWFsaWZpZWQgd2l0aCBlbnZpcm9ubWVudCBtYXJrZXJzLgoKMC45LjQKPT09PT0KLSBGaXggd2hlZWwuc2lnbmF0dXJlcyBpbiBzZGlzdAoKMC45LjMKPT09PT0KLSBJbnRlZ3JhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzdXBwb3J0IHdpdGhvdXQgQyBleHRlbnNpb25zLgotIEludGVncmF0ZWQgIndoZWVsIGluc3RhbGwiIGNvbW1hbmQgKHNpbmdsZSBwYWNrYWdlLCBubyBkZXBlbmRlbmN5CiAgcmVzb2x1dGlvbikgaW5jbHVkaW5nIGNvbXBhdGliaWxpdHkgY2hlY2suCi0gU3VwcG9ydCBQeXRob24gMy4zCi0gVXNlIE1ldGFkYXRhIDEuMyAoUEVQIDQyNikKCjAuOS4yCj09PT09Ci0gQXV0b21hdGljIHNpZ25pbmcgaWYgV0hFRUxfVE9PTCBwb2ludHMgdG8gdGhlIHdoZWVsIGJpbmFyeQotIEV2ZW4gbW9yZSBQeXRob24gMyBmaXhlcwoKMC45LjEKPT09PT0KLSAnd2hlZWwgc2lnbicgdXNlcyB0aGUga2V5cyBnZW5lcmF0ZWQgYnkgJ3doZWVsIGtleWdlbicgKGluc3RlYWQgb2YgZ2VuZXJhdGluZwogIGEgbmV3IGtleSBhdCByYW5kb20gZWFjaCB0aW1lKQotIFB5dGhvbiAyLzMgZW5jb2RpbmcvZGVjb2RpbmcgZml4ZXMKLSBSdW4gdGVzdHMgb24gUHl0aG9uIDIuNiAod2l0aG91dCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uKQoKMC45Cj09PQotIFVwZGF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHNjaGVtZQotIFB5dGhvbiAzIHN1cHBvcnQgZm9yIGRpZ2l0YWwgc2lnbmF0dXJlcwotIEFsd2F5cyB2ZXJpZnkgUkVDT1JEIGhhc2hlcyBvbiBleHRyYWN0Ci0gIndoZWVsIiBjb21tYW5kIGxpbmUgdG9vbCB0byBzaWduLCB2ZXJpZnksIHVucGFjayB3aGVlbCBmaWxlcwoKMC44Cj09PQotIG5vbmUvYW55IGRyYWZ0IHBlcCB0YWdzIHVwZGF0ZQotIGltcHJvdmVkIHdpbmluc3Qyd2hlZWwgc2NyaXB0Ci0gZG9jIGNoYW5nZXMgYW5kIG90aGVyIGltcHJvdmVtZW50cwoKMC43Cj09PQotIHNvcnQgLmRpc3QtaW5mbyBhdCBlbmQgb2Ygd2hlZWwgYXJjaGl2ZQotIFdpbmRvd3MgJiBQeXRob24gMyBmaXhlcyBmcm9tIFBhdWwgTW9vcmUKLSBwZXA4Ci0gc2NyaXB0cyB0byBjb252ZXJ0IHdpbmluc3QgJiBlZ2cgdG8gd2hlZWwKCjAuNgo9PT0KLSByZXF1aXJlIGRpc3RyaWJ1dGUgPj0gMC42LjI4Ci0gc3RvcCB1c2luZyB2ZXJsaWIKCjAuNQo9PT0KLSB3b3JraW5nIHByZXR0eSB3ZWxsCgowLjQuMgo9PT09PQotIGh5cGhlbmF0ZWQgbmFtZSBmaXgKCjAuNAo9PT0KLSBpbXByb3ZlIHRlc3QgY292ZXJhZ2UKLSBpbXByb3ZlIFdpbmRvd3MgY29tcGF0aWJpbGl0eQotIGluY2x1ZGUgdG94LmluaSBjb3VydGVzeSBvZiBNYXJjIEFicmFtb3dpdHoKLSBkcmFmdCBobWFjIHNoYS0yNTYgc2lnbmluZyBmdW5jdGlvbgoKMC4zCj09PQotIHByb3RvdHlwZSBlZ2cyd2hlZWwgY29udmVyc2lvbiBzY3JpcHQKCjAuMgo9PT0KLSBQeXRob24gMyBjb21wYXRpYmlsaXR5CgowLjEKPT09Ci0gSW5pdGlhbCB2ZXJzaW9uCgoKUEsDBBQAAAAAAAAAIQBw/66fZQQAAGUEAAA5AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0xJQ0VOU0UudHh0IndoZWVsIiBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBEYW5pZWwgSG9sdGggPGRob2x0aEBmYXN0bWFpbC5mbT4gYW5kCmNvbnRyaWJ1dG9ycy4KClRoZSBNSVQgTGljZW5zZQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgp0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlClNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAppbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTApUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgpPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KUEsDBBQAAAAAAAAAIQBEbZmBDSsAAA0rAAA2AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHdoZWVsClZlcnNpb246IDAuMzAuMGEwClN1bW1hcnk6IEEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4KSG9tZS1wYWdlOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbC8KQXV0aG9yOiBEYW5pZWwgSG9sdGgKQXV0aG9yLWVtYWlsOiBkaG9sdGhAZmFzdG1haWwuZm0KTGljZW5zZTogTUlUCktleXdvcmRzOiB3aGVlbCxwYWNrYWdpbmcKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDQgLSBCZXRhCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4yCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNApSZXF1aXJlcy1EaXN0OiBhcmdwYXJzZTsgcHl0aG9uX3ZlcnNpb249PSIyLjYiClByb3ZpZGVzLUV4dHJhOiBmYXN0ZXItc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBlZDI1NTE5bGw7IGV4dHJhID09ICdmYXN0ZXItc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDoga2V5cmluZzsgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClJlcXVpcmVzLURpc3Q6IGtleXJpbmdzLmFsdDsgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiBzaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IGltcG9ydGxpYjsgcHl0aG9uX3ZlcnNpb249PSIyLjYiIGFuZCBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDogcHl4ZGc7IHN5c19wbGF0Zm9ybSE9IndpbjMyIiBhbmQgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiB0b29sCgpXaGVlbAo9PT09PQoKQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLgoKQSB3aGVlbCBpcyBhIFpJUC1mb3JtYXQgYXJjaGl2ZSB3aXRoIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBmaWxlbmFtZQphbmQgdGhlIC53aGwgZXh0ZW5zaW9uLiBJdCBpcyBkZXNpZ25lZCB0byBjb250YWluIGFsbCB0aGUgZmlsZXMgZm9yIGEKUEVQIDM3NiBjb21wYXRpYmxlIGluc3RhbGwgaW4gYSB3YXkgdGhhdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBvbi1kaXNrCmZvcm1hdC4gTWFueSBwYWNrYWdlcyB3aWxsIGJlIHByb3Blcmx5IGluc3RhbGxlZCB3aXRoIG9ubHkgdGhlICJVbnBhY2siCnN0ZXAgKHNpbXBseSBleHRyYWN0aW5nIHRoZSBmaWxlIG9udG8gc3lzLnBhdGgpLCBhbmQgdGhlIHVucGFja2VkIGFyY2hpdmUKcHJlc2VydmVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byAiU3ByZWFkIiAoY29weSBkYXRhIGFuZCBzY3JpcHRzIHRvIHRoZWlyCmZpbmFsIGxvY2F0aW9ucykgYXQgYW55IGxhdGVyIHRpbWUuCgpUaGUgd2hlZWwgcHJvamVjdCBwcm92aWRlcyBhIGBiZGlzdF93aGVlbGAgY29tbWFuZCBmb3Igc2V0dXB0b29scwoocmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjguMCkuIFdoZWVsIGZpbGVzIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBhCm5ld2VyIGBwaXBgIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwIG9yIHdpdGggd2hlZWwncyBvd24gY29tbWFuZApsaW5lIHV0aWxpdHkuCgpUaGUgd2hlZWwgZG9jdW1lbnRhdGlvbiBpcyBhdCBodHRwOi8vd2hlZWwucnRmZC5vcmcvLiBUaGUgZmlsZSBmb3JtYXQKaXMgZG9jdW1lbnRlZCBpbiBQRVAgNDI3IChodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKS4KClRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgYXQgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwKCldoeSBub3QgZWdnPwotLS0tLS0tLS0tLS0KClB5dGhvbidzIGVnZyBmb3JtYXQgcHJlZGF0ZXMgdGhlIHBhY2thZ2luZyByZWxhdGVkIHN0YW5kYXJkcyB3ZSBoYXZlCnRvZGF5LCB0aGUgbW9zdCBpbXBvcnRhbnQgYmVpbmcgUEVQIDM3NiAiRGF0YWJhc2Ugb2YgSW5zdGFsbGVkIFB5dGhvbgpEaXN0cmlidXRpb25zIiB3aGljaCBzcGVjaWZpZXMgdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5IChpbnN0ZWFkIG9mCi5lZ2ctaW5mbykgYW5kIFBFUCA0MjYgIk1ldGFkYXRhIGZvciBQeXRob24gU29mdHdhcmUgUGFja2FnZXMgMi4wIgp3aGljaCBzcGVjaWZpZXMgaG93IHRvIGV4cHJlc3MgZGVwZW5kZW5jaWVzIChpbnN0ZWFkIG9mIHJlcXVpcmVzLnR4dAppbiAuZWdnLWluZm8pLgoKV2hlZWwgaW1wbGVtZW50cyB0aGVzZSB0aGluZ3MuIEl0IGFsc28gcHJvdmlkZXMgYSByaWNoZXIgZmlsZSBuYW1pbmcKY29udmVudGlvbiB0aGF0IGNvbW11bmljYXRlcyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCBBQkkgYXMgd2VsbAphcyBzaW1wbHkgdGhlIGxhbmd1YWdlIHZlcnNpb24gdXNlZCBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4KClVubGlrZSAuZWdnLCB3aGVlbCB3aWxsIGJlIGEgZnVsbHktZG9jdW1lbnRlZCBzdGFuZGFyZCBhdCB0aGUgYmluYXJ5CmxldmVsIHRoYXQgaXMgdHJ1bHkgZWFzeSB0byBpbnN0YWxsIGV2ZW4gaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUKcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSB3aGVlbCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKCgowLjI5LjAKPT09PT09Ci0gRml4IGNvbXByZXNzaW9uIHR5cGUgb2YgZmlsZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NSwgUHVsbCBSZXF1ZXN0ICM2MiwKICB0aGFua3MgWGF2aWVyIEZlcm5hbmRleikKCjAuMjguMAo9PT09PT0KLSBGaXggZmlsZSBtb2RlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU0KQoKMC4yNy4wCj09PT09PQotIFN1cHBvcnQgZm9yY2luZyBhIHBsYXRmb3JtIHRhZyB1c2luZyBgLS1wbGF0LW5hbWVgIG9uIHB1cmUtUHl0aG9uIHdoZWVscywgYXMKICB3ZWxsIGFzIG5vbnN0YW5kYXJkIHBsYXRmb3JtIHRhZ3Mgb24gbm9uLXB1cmUgd2hlZWxzIChQdWxsIFJlcXVlc3QgIzYwLCBJc3N1ZQogICMxNDQsIHRoYW5rcyBBbmRyw6lzIETDrWF6KQotIEFkZCBTT0FCSSB0YWdzIHRvIHBsYXRmb3JtLXNwZWNpZmljIHdoZWVscyBidWlsdCBmb3IgUHl0aG9uIDIuWCAoUHVsbCBSZXF1ZXN0CiAgIzU1LCBJc3N1ZSAjNjMsIElzc3VlICMxMDEpCi0gU3VwcG9ydCByZXByb2R1Y2libGUgd2hlZWwgZmlsZXMsIHdoZWVscyB0aGF0IGNhbiBiZSByZWJ1aWx0IGFuZCB3aWxsIGhhc2ggdG8KICB0aGUgc2FtZSB2YWx1ZXMgYXMgcHJldmlvdXMgYnVpbGRzIChQdWxsIFJlcXVlc3QgIzUyLCBJc3N1ZSAjMTQzLCB0aGFua3MKICBCYXJyeSBXYXJzYXcpCi0gU3VwcG9ydCBmb3IgY2hhbmdlcyBpbiBrZXlyaW5nID49IDguMCAoUHVsbCBSZXF1ZXN0ICM2MSwgdGhhbmtzIEphc29uIFIuCiAgQ29vbWJzKQotIFVzZSB0aGUgZmlsZSBjb250ZXh0IG1hbmFnZXIgd2hlbiBjaGVja2luZyBpZiBkZXBlbmRlbmN5X2xpbmtzLnR4dCBpcyBlbXB0eSwKICBmaXhlcyBwcm9ibGVtcyBidWlsZGluZyB3aGVlbHMgdW5kZXIgUHlQeSBvbiBXaW5kb3dzICAoSXNzdWUgIzE1MCwgdGhhbmtzCiAgQ29zaW1vIEx1cG8pCi0gRG9uJ3QgYXR0ZW1wdCB0byAocmVjdXJzaXZlbHkpIGNyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeSBlbmRpbmcgd2l0aCBgLi5gCiAgKGludmFsaWQgb24gYWxsIHBsYXRmb3JtcywgYnV0IGNvZGUgd2FzIG9ubHkgZXhlY3V0ZWQgb24gV2luZG93cykgKElzc3VlICM5MSkKLSBBZGRlZCB0aGUgUHlQQSBDb2RlIG9mIENvbmR1Y3QgKFB1bGwgUmVxdWVzdCAjNTYpCgowLjI2LjAKPT09PT09Ci0gRml4IG11bHRpcGxlIGVudHJ5cG9pbnQgY29tcGFyaXNvbiBmYWlsdXJlIG9uIFB5dGhvbiAzIChJc3N1ZSAjMTQ4KQoKMC4yNS4wCj09PT09PQotIEFkZCBQeXRob24gMy41IHRvIHRveCBjb25maWd1cmF0aW9uCi0gRGV0ZXJtaW5pc3RpYyAoc29ydGVkKSBtZXRhZGF0YQotIEZpeCB0YWdnaW5nIGZvciBQeXRob24gMy41IGNvbXBhdGliaWxpdHkKLSBTdXBwb3J0IHB5Mi1ub25lLSdhcmNoJyBhbmQgcHkzLW5vbmUtJ2FyY2gnIHRhZ3MKLSBUcmVhdCBkYXRhLW9ubHkgd2hlZWxzIGFzIHB1cmUKLSBXcml0ZSB0byB0ZW1wb3JhcnkgZmlsZSBhbmQgcmVuYW1lIHdoZW4gdXNpbmcgd2hlZWwgaW5zdGFsbCAtLWZvcmNlCgowLjI0LjAKPT09PT09Ci0gVGhlIHB5dGhvbiB0YWcgdXNlZCBmb3IgcHVyZS1weXRob24gcGFja2FnZXMgaXMgbm93IC5weU4gKG1ham9yIHZlcnNpb24KICBvbmx5KS4gVGhpcyBjaGFuZ2UgYWN0dWFsbHkgb2NjdXJyZWQgaW4gMC4yMy4wIHdoZW4gdGhlIC0tcHl0aG9uLXRhZwogIG9wdGlvbiB3YXMgYWRkZWQsIGJ1dCB3YXMgbm90IGV4cGxpY2l0bHkgbWVudGlvbmVkIGluIHRoZSBjaGFuZ2Vsb2cgdGhlbi4KLSB3aW5pbnN0MndoZWVsIGFuZCBlZ2cyd2hlZWwgcmVtb3ZlZC4gVXNlICJ3aGVlbCBjb252ZXJ0IFthcmNoaXZlXSIKICBpbnN0ZWFkLgotIFdoZWVsIG5vdyBzdXBwb3J0cyBzZXR1cHRvb2xzIHN0eWxlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cyB2aWEgdGhlCiAgZXh0cmFzX3JlcXVpcmU9e30gc3ludGF4LiBTZXBhcmF0ZSAnZXh0cmEnIG5hbWVzIGZyb20gY29uZGl0aW9ucyB1c2luZwogIHRoZSA6IGNoYXJhY3Rlci4gV2hlZWwncyBvd24gc2V0dXAucHkgZG9lcyB0aGlzLiAoVGhlIGVtcHR5LXN0cmluZwogIGV4dHJhIGlzIHRoZSBzYW1lIGFzIGluc3RhbGxfcmVxdWlyZXMuKSBUaGVzZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMKICBzaG91bGQgd29yayB0aGUgc2FtZSB3aGV0aGVyIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSB3aGVlbCBvcgogIGJ5IHNldHVwLnB5LgoKMC4yMy4wCj09PT09PQotIENvbXBhdGliaWxpdHkgdGFnIGZsYWdzIGFkZGVkIHRvIHRoZSBiZGlzdF93aGVlbCBjb21tYW5kCi0gc2Rpc3Qgc2hvdWxkIGluY2x1ZGUgZmlsZXMgbmVjZXNzYXJ5IGZvciB0ZXN0cwotICd3aGVlbCBjb252ZXJ0JyBjYW4gbm93IGFsc28gY29udmVydCB1bnBhY2tlZCBlZ2dzIHRvIHdoZWVsCi0gUmVuYW1lIHB5ZGlzdC5qc29uIHRvIG1ldGFkYXRhLmpzb24gdG8gYXZvaWQgc3RlcHBpbmcgb24gdGhlIFBFUAotIFRoZSAtLXNraXAtc2NyaXB0cyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgYW5kIG5vdCBnZW5lcmF0aW5nIHNjcmlwdHMgaXMgbm93CiAgdGhlIGRlZmF1bHQuIFRoZSBvcHRpb24gd2FzIGEgdGVtcG9yYXJ5IGFwcHJvYWNoIHVudGlsIGluc3RhbGxlcnMgY291bGQKICBnZW5lcmF0ZSBzY3JpcHRzIHRoZW1zZWx2ZXMuIFRoYXQgaXMgbm93IHRoZSBjYXNlIHdpdGggcGlwIDEuNSBhbmQgbGF0ZXIuCiAgTm90ZSB0aGF0IHVzaW5nIHBpcCAxLjQgdG8gaW5zdGFsbCBhIHdoZWVsIHdpdGhvdXQgc2NyaXB0cyB3aWxsIGxlYXZlIHRoZQogIGluc3RhbGxhdGlvbiB3aXRob3V0IGVudHJ5LXBvaW50IHdyYXBwZXJzLiBUaGUgIndoZWVsIGluc3RhbGwtc2NyaXB0cyIKICBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGluIHN1Y2ggY2FzZXMuCi0gVGhhbmsgeW91IGNvbnRyaWJ1dG9ycwoKMC4yMi4wCj09PT09PQotIEluY2x1ZGUgZW50cnlfcG9pbnRzLnR4dCwgc2NyaXB0cyBhLmsuYS4gY29tbWFuZHMsIGluIGV4cGVyaW1lbnRhbAogIHB5ZGlzdC5qc29uCi0gSW1wcm92ZWQgdGVzdF9yZXF1aXJlcyBwYXJzaW5nCi0gUHl0aG9uIDIuNiBmaXhlcywgIndoZWVsIHZlcnNpb24iIGNvbW1hbmQgY291cnRlc3kgcG9tYnJlZGFubmUKCjAuMjEuMAo9PT09PT0KLSBQcmVnZW5lcmF0ZWQgc2NyaXB0cyBhcmUgdGhlIGRlZmF1bHQgYWdhaW4uCi0gInNldHVwLnB5IGJkaXN0X3doZWVsIC0tc2tpcC1zY3JpcHRzIiB0dXJucyB0aGVtIG9mZi4KLSBzZXR1cHRvb2xzIGlzIG5vIGxvbmdlciBhIGxpc3RlZCByZXF1aXJlbWVudCBmb3IgdGhlICd3aGVlbCcKICBwYWNrYWdlLiBJdCBpcyBvZiBjb3Vyc2Ugc3RpbGwgcmVxdWlyZWQgaW4gb3JkZXIgZm9yIGJkaXN0X3doZWVsCiAgdG8gd29yay4KLSAicHl0aG9uIC1tIHdoZWVsIiBhdm9pZHMgaW1wb3J0aW5nIHBrZ19yZXNvdXJjZXMgdW50aWwgaXQncyBuZWNlc3NhcnkuCgowLjIwLjAKPT09PT09Ci0gTm8gbG9uZ2VyIGluY2x1ZGUgY29uc29sZV9zY3JpcHRzIGluIHdoZWVscy4gT3JkaW5hcnkgc2NyaXB0cyAoc2hlbGwgZmlsZXMsCiAgc3RhbmRhbG9uZSBQeXRob24gZmlsZXMpIGFyZSBpbmNsdWRlZCBhcyB1c3VhbC4KLSBJbmNsdWRlIG5ldyBjb21tYW5kICJweXRob24gLW0gd2hlZWwgaW5zdGFsbC1zY3JpcHRzIFtkaXN0cmlidXRpb24KICBbZGlzdHJpYnV0aW9uIC4uLl1dIiB0byBpbnN0YWxsIHRoZSBjb25zb2xlX3NjcmlwdHMgKHNldHVwdG9vbHMtc3R5bGUKICBzY3JpcHRzIHVzaW5nIHBrZ19yZXNvdXJjZXMpIGZvciBhIGRpc3RyaWJ1dGlvbi4KCjAuMTkuMAo9PT09PT0KLSBweW1ldGEuanNvbiBiZWNvbWVzIHB5ZGlzdC5qc29uCgowLjE4LjAKPT09PT09Ci0gUHl0aG9uIDMgVW5pY29kZSBpbXByb3ZlbWVudHMKCjAuMTcuMAo9PT09PT0KLSBTdXBwb3J0IGxhdGVzdCBQRVAtNDI2ICJweW1ldGEuanNvbiIgKGpzb24tZm9ybWF0IG1ldGFkYXRhKQoKMC4xNi4wCj09PT09PQotIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBidWdmaXggKHRoYW5rcyBKb2huIE1jRmFybGFuZSkKLSBOb24tcHJlcmVsZWFzZSB2ZXJzaW9uIG51bWJlcgoKMS4wLjBhMgo9PT09PT09Ci0gQnVnZml4IGZvciBDLWV4dGVuc2lvbiB0YWdzIGZvciBDUHl0aG9uIDMuMyAodXNpbmcgU09BQkkpCgoxLjAuMGExCj09PT09PT0KLSBCdWdmaXggZm9yIGJkaXN0X3dpbmluc3QgY29udmVydGVyICJ3aGVlbCBjb252ZXJ0IgotIEJ1Z2ZpeCBmb3IgZGlzdHMgd2hlcmUgImlzIHB1cmUiIGlzIE5vbmUgaW5zdGVhZCBvZiBUcnVlIG9yIEZhbHNlCgoxLjAuMGEwCj09PT09PT0KLSBVcGRhdGUgZm9yIHZlcnNpb24gMS4wIG9mIFdoZWVsIChQRVAgYWNjZXB0ZWQpLgotIFB5dGhvbiAzIGZpeCBmb3IgbW92aW5nIFVuaWNvZGUgRGVzY3JpcHRpb24gdG8gbWV0YWRhdGEgYm9keQotIEluY2x1ZGUgcnVkaW1lbnRhcnkgQVBJIGRvY3VtZW50YXRpb24gaW4gU3BoaW54ICh0aGFua3MgS2V2aW4gSG9ybikKCjAuMTUuMAo9PT09PT0KLSBWYXJpb3VzIGltcHJvdmVtZW50cwoKMC4xNC4wCj09PT09PQotIENoYW5nZWQgdGhlIHNpZ25hdHVyZSBmb3JtYXQgdG8gYmV0dGVyIGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IEpXUyBzcGVjLgogIEJyZWFrcyBhbGwgZXhpc3Rpbmcgc2lnbmF0dXJlcy4KLSBJbmNsdWRlIGBgd2hlZWwgdW5zaWduYGAgY29tbWFuZCB0byByZW1vdmUgUkVDT1JELmp3cyBmcm9tIGFuIGFyY2hpdmUuCi0gUHV0IHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgbmV3bHkgYWxsb3dlZCBwYXlsb2FkIHNlY3Rpb24gb2YgUEtHLUlORk8KICAoTUVUQURBVEEpIGZpbGVzLgoKMC4xMy4wCj09PT09PQotIFVzZSBkaXN0dXRpbHMgaW5zdGVhZCBvZiBzeXNjb25maWcgdG8gZ2V0IGluc3RhbGxhdGlvbiBwYXRoczsgY2FuIGluc3RhbGwKICBoZWFkZXJzLgotIEltcHJvdmUgV2hlZWxGaWxlKCkgc29ydC4KLSBBbGxvdyBib290c3RyYXAgaW5zdGFsbHMgd2l0aG91dCBhbnkgcGtnX3Jlc291cmNlcy4KCjAuMTIuMAo9PT09PT0KLSBVbml0IHRlc3QgZm9yIHdoZWVsLnRvb2wuaW5zdGFsbAoKMC4xMS4wCj09PT09PQotIEFQSSBjbGVhbnVwCgowLjEwLjMKPT09PT09Ci0gU2NyaXB0cyBmaXhlciBmaXgKCjAuMTAuMgo9PT09PT0KLSBGaXgga2V5Z2VuCgowLjEwLjEKPT09PT09Ci0gUHJlc2VydmUgYXR0cmlidXRlcyBvbiBpbnN0YWxsLgoKMC4xMC4wCj09PT09PQotIEluY2x1ZGUgYSBjb3B5IG9mIHBrZ19yZXNvdXJjZXMuIFdoZWVsIGNhbiBub3cgaW5zdGFsbCBpbnRvIGEgdmlydHVhbGVudgogIHRoYXQgZG9lcyBub3QgaGF2ZSBkaXN0cmlidXRlICh0aG91Z2ggbW9zdCBwYWNrYWdlcyBzdGlsbCByZXF1aXJlCiAgcGtnX3Jlc291cmNlcyB0byBhY3R1YWxseSB3b3JrOyB3aGVlbCBpbnN0YWxsIGRpc3RyaWJ1dGUpCi0gRGVmaW5lIGEgbmV3IHNldHVwLmNmZyBzZWN0aW9uIFt3aGVlbF0uIHVuaXZlcnNhbD0xIHdpbGwKICBhcHBseSB0aGUgcHkyLnB5My1ub25lLWFueSB0YWcgZm9yIHB1cmUgcHl0aG9uIHdoZWVscy4KCjAuOS43Cj09PT09Ci0gT25seSBpbXBvcnQgZGlyc3BlYyB3aGVuIG5lZWRlZC4gZGlyc3BlYyBpcyBvbmx5IG5lZWRlZCB0byBmaW5kIHRoZQogIGNvbmZpZ3VyYXRpb24gZm9yIGtleWdlbi9zaWduaW5nIG9wZXJhdGlvbnMuCgowLjkuNgo9PT09PQotIHJlcXVpcmVzLWRpc3QgZnJvbSBzZXR1cC5jZmcgb3ZlcndyaXRlcyBhbnkgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAucHkKICBDYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgcmVxdWlyZW1lbnRzIGFyZSB0aGUgc2FtZSBpbiBib3RoIGNhc2VzLAogIG9yIGp1c3QgYWx3YXlzIGluc3RhbGwgZnJvbSB3aGVlbC4KLSBkcm9wIGRpcnNwZWMgcmVxdWlyZW1lbnQgb24gd2luMzIKLSBpbXByb3ZlZCBjb21tYW5kIGxpbmUgdXRpbGl0eSwgYWRkcyAnd2hlZWwgY29udmVydCBbZWdnIG9yIHdpbmluc3RdJyB0bwogIGNvbnZlcnQgbGVnYWN5IGJpbmFyeSBmb3JtYXRzIHRvIHdoZWVsCgowLjkuNQo9PT09PQotIFdoZWVsJ3Mgb3duIHdoZWVsIGZpbGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IFB5dGhvbiwgYW5kIGNhbiBpbnN0YWxsIGl0c2VsZjoKICBgYHB5dGhvbiB3aGVlbC0wLjkuNS1weTI3LW5vbmUtYW55L3doZWVsIGluc3RhbGwgLi4uYGAKLSBVc2UgYXJncGFyc2U7IGJhc2ljIGBgd2hlZWwgaW5zdGFsbGBgIGNvbW1hbmQgc2hvdWxkIHJ1biB3aXRoIG9ubHkgc3RkbGliCiAgZGVwZW5kZW5jaWVzLgotIEFsbG93IHJlcXVpcmVzX2Rpc3QgaW4gc2V0dXAuY2ZnJ3MgW21ldGFkYXRhXSBzZWN0aW9uLiBJbiBhZGRpdGlvbiB0bwogIGRlcGVuZGVuY2llcyBpbiBzZXR1cC5weSwgYnV0IHdpbGwgb25seSBiZSBpbnRlcnByZXRlZCB3aGVuIGluc3RhbGxpbmcKICBmcm9tIHdoZWVsLCBub3QgZnJvbSBzZGlzdC4gQ2FuIGJlIHF1YWxpZmllZCB3aXRoIGVudmlyb25tZW50IG1hcmtlcnMuCgowLjkuNAo9PT09PQotIEZpeCB3aGVlbC5zaWduYXR1cmVzIGluIHNkaXN0CgowLjkuMwo9PT09PQotIEludGVncmF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHN1cHBvcnQgd2l0aG91dCBDIGV4dGVuc2lvbnMuCi0gSW50ZWdyYXRlZCAid2hlZWwgaW5zdGFsbCIgY29tbWFuZCAoc2luZ2xlIHBhY2thZ2UsIG5vIGRlcGVuZGVuY3kKICByZXNvbHV0aW9uKSBpbmNsdWRpbmcgY29tcGF0aWJpbGl0eSBjaGVjay4KLSBTdXBwb3J0IFB5dGhvbiAzLjMKLSBVc2UgTWV0YWRhdGEgMS4zIChQRVAgNDI2KQoKMC45LjIKPT09PT0KLSBBdXRvbWF0aWMgc2lnbmluZyBpZiBXSEVFTF9UT09MIHBvaW50cyB0byB0aGUgd2hlZWwgYmluYXJ5Ci0gRXZlbiBtb3JlIFB5dGhvbiAzIGZpeGVzCgowLjkuMQo9PT09PQotICd3aGVlbCBzaWduJyB1c2VzIHRoZSBrZXlzIGdlbmVyYXRlZCBieSAnd2hlZWwga2V5Z2VuJyAoaW5zdGVhZCBvZiBnZW5lcmF0aW5nCiAgYSBuZXcga2V5IGF0IHJhbmRvbSBlYWNoIHRpbWUpCi0gUHl0aG9uIDIvMyBlbmNvZGluZy9kZWNvZGluZyBmaXhlcwotIFJ1biB0ZXN0cyBvbiBQeXRob24gMi42ICh3aXRob3V0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgowLjkKPT09Ci0gVXBkYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc2NoZW1lCi0gUHl0aG9uIDMgc3VwcG9ydCBmb3IgZGlnaXRhbCBzaWduYXR1cmVzCi0gQWx3YXlzIHZlcmlmeSBSRUNPUkQgaGFzaGVzIG9uIGV4dHJhY3QKLSAid2hlZWwiIGNvbW1hbmQgbGluZSB0b29sIHRvIHNpZ24sIHZlcmlmeSwgdW5wYWNrIHdoZWVsIGZpbGVzCgowLjgKPT09Ci0gbm9uZS9hbnkgZHJhZnQgcGVwIHRhZ3MgdXBkYXRlCi0gaW1wcm92ZWQgd2luaW5zdDJ3aGVlbCBzY3JpcHQKLSBkb2MgY2hhbmdlcyBhbmQgb3RoZXIgaW1wcm92ZW1lbnRzCgowLjcKPT09Ci0gc29ydCAuZGlzdC1pbmZvIGF0IGVuZCBvZiB3aGVlbCBhcmNoaXZlCi0gV2luZG93cyAmIFB5dGhvbiAzIGZpeGVzIGZyb20gUGF1bCBNb29yZQotIHBlcDgKLSBzY3JpcHRzIHRvIGNvbnZlcnQgd2luaW5zdCAmIGVnZyB0byB3aGVlbAoKMC42Cj09PQotIHJlcXVpcmUgZGlzdHJpYnV0ZSA+PSAwLjYuMjgKLSBzdG9wIHVzaW5nIHZlcmxpYgoKMC41Cj09PQotIHdvcmtpbmcgcHJldHR5IHdlbGwKCjAuNC4yCj09PT09Ci0gaHlwaGVuYXRlZCBuYW1lIGZpeAoKMC40Cj09PQotIGltcHJvdmUgdGVzdCBjb3ZlcmFnZQotIGltcHJvdmUgV2luZG93cyBjb21wYXRpYmlsaXR5Ci0gaW5jbHVkZSB0b3guaW5pIGNvdXJ0ZXN5IG9mIE1hcmMgQWJyYW1vd2l0egotIGRyYWZ0IGhtYWMgc2hhLTI1NiBzaWduaW5nIGZ1bmN0aW9uCgowLjMKPT09Ci0gcHJvdG90eXBlIGVnZzJ3aGVlbCBjb252ZXJzaW9uIHNjcmlwdAoKMC4yCj09PQotIFB5dGhvbiAzIGNvbXBhdGliaWxpdHkKCjAuMQo9PT0KLSBJbml0aWFsIHZlcnNpb24KCgpQSwMEFAAAAAAAAAAhAKcPuxadDwAAnQ8AADQAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vUkVDT1JEd2hlZWwvX19pbml0X18ucHksc2hhMjU2PWRtYm9VRGZwYld4ZXJjVlhiYlFFTHNUMUw0WlF5T0hRdkpLanZjQUtZdGMsOTkNCndoZWVsL19fbWFpbl9fLnB5LHNoYTI1Nj1MYkRER0lkMDhxVHh1aExZcVg1bVhPMU1VczlELUhoeGI1TlZjNTNlajBrLDQxNg0Kd2hlZWwvYXJjaGl2ZS5weSxzaGEyNTY9TzZ1WGsteko4eTRZLTByQ29IUDdDTEtsUHBXUUJINDR6ZVJlZ2FLOEZKbywyMjQ3DQp3aGVlbC9iZGlzdF93aGVlbC5weSxzaGEyNTY9dXNkRmtadlFvcEstU3hfM2wwVEVNMlptMzNCdzFDX29iVElVejdKTTdwSSwxODQwOA0Kd2hlZWwvZGVjb3JhdG9yLnB5LHNoYTI1Nj1VMks3N1paOHgzeDV2U0lHQ2NFZWg4R0F4QjZyQUJCN0FsRHdSdWthb0NrLDU0MQ0Kd2hlZWwvZWdnMndoZWVsLnB5LHNoYTI1Nj0tN00ySkZpMjNrWi1raGJOd2sxaVZMOFAxNE5GZGJBaE1jMVNIaG5aMmZBLDMwMjcNCndoZWVsL2VnZ25hbWVzLnR4dCxzaGEyNTY9WDZMWXNPak1kOGxscnpMbzNTQjNGd0otdU45SXNrSnFZS0pEcTJ6SWNicywyNDkwDQp3aGVlbC9pbnN0YWxsLnB5LHNoYTI1Nj1kQ1I3SUhtZUFyTGpnYjB5RjlZbU1oM19xSWotQzlqMXAzdVBTcnB6Wk84LDE4MDk4DQp3aGVlbC9tZXRhZGF0YS5weSxzaGEyNTY9T3o4eDJWRDB4TGJhV0gwNnlUUkNiM3ZTZFduV3ZwUE93WTJvOUQ4aUZHVSwxMTY3Ng0Kd2hlZWwvcGF0aHMucHksc2hhMjU2PTZBbUctTUt4LU5lSk9DOXpVSm9TU1pqWWhaWUdtWDFVSEdfTjBJYmtwbEksMTEzMA0Kd2hlZWwvcGVwNDI1dGFncy5weSxzaGEyNTY9cEExZXliMUhPQW13U2lYVG1mUWhtQWNrZmtuaHRFZWxMRFpPY1ZLWmFFMCw1ODI5DQp3aGVlbC9wa2dpbmZvLnB5LHNoYTI1Nj0tZ0xPVHVRcmtSZjRnZU9EMDRxbTBJVWtkWUFiamc4MWotNXpOdHZXQTlBLDEyMjUNCndoZWVsL3V0aWwucHksc2hhMjU2PVBlMkpaOWdyTmptQWNSUkpheTIwRmxEVkpVYmVQV2FSNWx0eVNvM2M2elEsNDg5MA0Kd2hlZWwvd2luaW5zdDJ3aGVlbC5weSxzaGEyNTY9eFZmRUVLYlM0aE1wdi13Z09RaWI0bjBwU3BncnBqbnJCREgySkRTTmNyRSw3ODYzDQp3aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5LHNoYTI1Nj1rWnBLTnNteEJEWmh1WGY4NV91eXk1cUJINDBBeFZUXzB1dGJBaVRwX3lnLDM3NzkNCndoZWVsL3NpZ25hdHVyZXMvZGpiZWMucHksc2hhMjU2PTUzSFRubE5sZnFPSEZEZjhPWV82S0w4c3hSNHN3aUxzV2hVanR3M1czbkksNjc1NQ0Kd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHksc2hhMjU2PVNlVHhpTVo3a21vTWRJdXJCU2FLYjhLdS1hbUduZjZaVFJHRWxMelY4aUksMTY5NQ0Kd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5LHNoYTI1Nj1ROEZMVnk1ZGl4RGl5LTVvX1JtbHNEaGdZZEVyVENwNWMzWjh4NzBYMXNnLDMzMTYNCndoZWVsL3Rlc3QvX19pbml0X18ucHksc2hhMjU2PU0wTlp1UTctMTEybDhLMmgxZWF5VnZTbXZRcnVmck9jRDVBWUtnSWZfSXMsMQ0Kd2hlZWwvdGVzdC9jb25mdGVzdC5weSxzaGEyNTY9Uzczbkh0b3RScjZfT0dCWG1lV1BWZGpWbVZLWmF6NHVpNExQWWQwYVA5VSwxNjg5DQp3aGVlbC90ZXN0L3B5ZGlzdC1zY2hlbWEuanNvbixzaGEyNTY9eW5Fdk52VGhDMXpSYTdGaW9Nc1czay05bmw5OHl0RW9vMV8zeGJPUDJlbywxMTQ4Mw0Kd2hlZWwvdGVzdC90ZXN0LTEuMC1weTIucHkzLW5vbmUtd2luMzIud2hsLHNoYTI1Nj1KQ19VWFRONUtsTHJkdTQzdUg0Y2FaU1V5enJ0UGNVc1JlLXZUTXVucGxFLDUyMjYNCndoZWVsL3Rlc3QvdGVzdF9iYXNpYy5weSxzaGEyNTY9YTF1UnU0TVpQYkVFS3lVc0tZdkd0ejRxajRLWDNFNzdWNkptWEpMZFgtayw2NTA5DQp3aGVlbC90ZXN0L3Rlc3RfaW5zdGFsbC5weSxzaGEyNTY9YzBFRUNYUGtWSUdoQ0Q5VjVhZDJxc0JQUlBZYjFlaGhhUzBrNkd2NUpRYywxODY2DQp3aGVlbC90ZXN0L3Rlc3Rfa2V5cy5weSxzaGEyNTY9NW1CYzl0ZjJUd0MzVENweDF5U1RZc0NlNXl2ZDZrTUs2NEFsVVVDY0tFWSwyNTc1DQp3aGVlbC90ZXN0L3Rlc3RfcGF0aHMucHksc2hhMjU2PS1RT1ZVREZKSXBGOU9QTlJ6Q0otWGY0bkJpYktsVWVfZzRhYVo2c20zd0UsMTcyDQp3aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weSxzaGEyNTY9RlNBUVg0b0haNDc2akxkZHFWTWxHbVFGdGJFZWw5YThTek9uZ0owM1RKdywxNDk2DQp3aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weSxzaGEyNTY9WjRSRVhqNjJwMjhnYlNEQjJEX094b3BBLVRUWElDVFo1ZTJ5WjNlakVWYywxMTIwDQp3aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5LHNoYTI1Nj10N0EtaVJiZTNiSDJJejZOS2RTRU9wRkZJRlNGOUk0QVRtbHJSQlhvQ2NRLDU5MjcNCndoZWVsL3Rlc3QvdGVzdF90b29sLnB5LHNoYTI1Nj15dDVkQXI4bXA1MVdvRHp0ME1tbHdQazB4ZjdGdlhBZWR5LVlsTlpYdjFJLDY1Ng0Kd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weSxzaGEyNTY9eDRleHpRWXVRQjQ4WUhxaFUyTlp5Tjc2ay1CU0s2Nzg0LTdyeWUwcTZTcyw0NTg1DQp3aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weSxzaGEyNTY9NGkxX0FKb0p4bzRpNmlrLW12eWRvMjNBRjhCSHpqbUFFUVlhNUo0WVBLNCw4NTUNCndoZWVsL3Rlc3QvY29tcGxleC1kaXN0L2NvbXBsZXhkaXN0L19faW5pdF9fLnB5LHNoYTI1Nj1QR0RKV1FUeGpMWHFuTnJicW1US0tfeWs2RFZRQk5lUnAtWXBQN3cxclZrLDIzDQp3aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L3NldHVwLnB5LHNoYTI1Nj1wZFJsLXd2cTVPVk1HMDQzWHJXWnd6NGZpdkZaV2RXTU53TDhkeUtiVDBjLDQ1Ng0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmgsc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyc2Rpc3QucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHksc2hhMjU2PXAzZDlUR3k3TkxYNlRua0JIbk5IemVkcVlvT2tkR1F2d2hleURRamYtSlEsMzI0DQp3aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5LHNoYTI1Nj04eldlbjcxVW0taU5fQTV0aG90NlZGb2dya1dzX1JHVk8tanJfTXhrRm9nLDM4Mw0Kd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zaW1wbGVkaXN0L19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rvb2wvX19pbml0X18ucHksc2hhMjU2PXAwdW5sOU1ncmJrWllWT0RWeEVLTVdSSTlZYTFNX3VYY3FYblhIekk0RGssMTMyMTcNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3Qsc2hhMjU2PUpINm1vZ1VJYXRRVlFld0loNEdCMXl3Q3h1V2JtN0c0VGpJXzYzZFVScDgsOTgxMw0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0xJQ0VOU0UudHh0LHNoYTI1Nj16S25pREdyeF9QdjJsQWp6ZDNhU2hzdnV2TjdUTmhBTW0wb19OZnZtTmVRLDExMjUNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9NRVRBREFUQSxzaGEyNTY9aXg5ek41ZmE0amVPRFFybjY0ZlVBUWFfdWxybVJwaGk0U0tIQVlVcXROdywxMTAyMQ0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRCwsDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PTV3dmZCN0d2Z1pBYktCU0U5dVg5WmJpNkxDTC1fS2dlemdIYmxYaENSbk0sMTEzDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9cFR5ZUdWc3VjeWZyX0JYZTVPUUt1QTFCcDVZS2FJQVd5NXBlamtxNFF4MCwxMDkNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uLHNoYTI1Nj14X21aakx6T2FZY2V6bW5yU3ZHNjdkMDdTaHBjUkZkcmdXZVVlNnpwTDVZLDE2MjYNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0LHNoYTI1Nj1IeFNCSWJnRXN0TVBlNGVGYXdoQTY2TXEtUVlITW9wWFZvQW5jZmpiXzFjLDYNClBLAwQUAAAAAAAAACEAlN+We3EAAABxAAAAMwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9XSEVFTFdoZWVsLVZlcnNpb246IDEuMApHZW5lcmF0b3I6IGJkaXN0X3doZWVsICgwLjMwLjAuYTApClJvb3QtSXMtUHVyZWxpYjogdHJ1ZQpUYWc6IHB5Mi1ub25lLWFueQpUYWc6IHB5My1ub25lLWFueQoKUEsDBBQAAAAAAAAAIQDiRd+sbQAAAG0AAAA+AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQp3aGVlbCA9IHdoZWVsLnRvb2w6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYmRpc3Rfd2hlZWwgPSB3aGVlbC5iZGlzdF93aGVlbDpiZGlzdF93aGVlbAoKUEsDBBQAAAAAAAAAIQBSsk7WWgYAAFoGAAA7AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL21ldGFkYXRhLmpzb257ImNsYXNzaWZpZXJzIjogWyJEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24iLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40Il0sICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsid2hlZWwiOiAid2hlZWwudG9vbDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAiZGhvbHRoQGZhc3RtYWlsLmZtIiwgIm5hbWUiOiAiRGFuaWVsIEhvbHRoIiwgInJvbGUiOiAiYXV0aG9yIn1dLCAiZG9jdW1lbnRfbmFtZXMiOiB7ImRlc2NyaXB0aW9uIjogIkRFU0NSSVBUSU9OLnJzdCIsICJsaWNlbnNlIjogIkxJQ0VOU0UudHh0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwvIn19LCAicHl0aG9uLmV4cG9ydHMiOiB7ImNvbnNvbGVfc2NyaXB0cyI6IHsid2hlZWwiOiAid2hlZWwudG9vbDptYWluIn0sICJkaXN0dXRpbHMuY29tbWFuZHMiOiB7ImJkaXN0X3doZWVsIjogIndoZWVsLmJkaXN0X3doZWVsOmJkaXN0X3doZWVsIn19fSwgImV4dHJhcyI6IFsiZmFzdGVyLXNpZ25hdHVyZXMiLCAic2lnbmF0dXJlcyIsICJ0b29sIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMC5hMCkiLCAia2V5d29yZHMiOiBbIndoZWVsIiwgInBhY2thZ2luZyJdLCAibGljZW5zZSI6ICJNSVQiLCAibWV0YWRhdGFfdmVyc2lvbiI6ICIyLjAiLCAibmFtZSI6ICJ3aGVlbCIsICJydW5fcmVxdWlyZXMiOiBbeyJleHRyYSI6ICJmYXN0ZXItc2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsiZWQyNTUxOWxsIl19LCB7ImV4dHJhIjogInNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbImtleXJpbmciLCAia2V5cmluZ3MuYWx0Il19LCB7ImVudmlyb25tZW50IjogInB5dGhvbl92ZXJzaW9uPT1cIjIuNlwiIiwgInJlcXVpcmVzIjogWyJhcmdwYXJzZSJdfSwgeyJlbnZpcm9ubWVudCI6ICJweXRob25fdmVyc2lvbj09XCIyLjZcIiIsICJleHRyYSI6ICJzaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJpbXBvcnRsaWIiXX0sIHsiZW52aXJvbm1lbnQiOiAic3lzX3BsYXRmb3JtIT1cIndpbjMyXCIiLCAiZXh0cmEiOiAic2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsicHl4ZGciXX1dLCAic3VtbWFyeSI6ICJBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uIiwgInRlc3RfcmVxdWlyZXMiOiBbeyJyZXF1aXJlcyI6IFsiY292ZXJhZ2UiLCAianNvbnNjaGVtYSIsICJweXRlc3QiLCAicHl0ZXN0LWNvdiJdfV0sICJ2ZXJzaW9uIjogIjAuMzAuMGEwIn1QSwMEFAAAAAAAAAAhABlj3mUGAAAABgAAADsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dHdoZWVsClBLAwQUAAAAAAAAACEAYTelR2MAAABjAAAAJgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19faW5pdF9fLnB5IyBfX3ZhcmlhYmxlc19fIHdpdGggZG91YmxlLXF1b3RlZCB2YWx1ZXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gc2V0dXAucHk6Cl9fdmVyc2lvbl9fID0gIjAuMzAuMC5hMCIKUEsDBBQAAAAAAAAAIQAkabdUoAEAAKABAAAmAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19tYWluX18ucHkiIiIKV2hlZWwgY29tbWFuZCBsaW5lIHRvb2wgKGVuYWJsZSBweXRob24gLW0gd2hlZWwgc3ludGF4KQoiIiIKCmltcG9ydCBzeXMKCmRlZiBtYWluKCk6ICMgbmVlZGVkIGZvciBjb25zb2xlIHNjcmlwdAogICAgaWYgX19wYWNrYWdlX18gPT0gJyc6CiAgICAgICAgIyBUbyBiZSBhYmxlIHRvIHJ1biAncHl0aG9uIHdoZWVsLTAuOS53aGwvd2hlZWwnOgogICAgICAgIGltcG9ydCBvcy5wYXRoCiAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogICAgICAgIHN5cy5wYXRoWzA6MF0gPSBbcGF0aF0KICAgIGltcG9ydCB3aGVlbC50b29sCiAgICBzeXMuZXhpdCh3aGVlbC50b29sLm1haW4oKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzeXMuZXhpdChtYWluKCkpClBLAwQUAAAAAAAAACEAIFOCUscIAADHCAAAJQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2FyY2hpdmUucHkiIiIKQXJjaGl2ZSB0b29scyBmb3Igd2hlZWwuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCB0aW1lCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcy5wYXRoCmltcG9ydCB6aXBmaWxlCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigid2hlZWwiKQoKCmRlZiBhcmNoaXZlX3doZWVsZmlsZShiYXNlX25hbWUsIGJhc2VfZGlyKToKICAgICcnJ0FyY2hpdmUgYWxsIGZpbGVzIHVuZGVyIGBiYXNlX2RpcmAgaW4gYSB3aGwgZmlsZSBhbmQgbmFtZSBpdCBsaWtlCiAgICBgYmFzZV9uYW1lYC4KICAgICcnJwogICAgb2xkZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLmN1cmRpcikKICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChiYXNlX25hbWUpCiAgICB0cnk6CiAgICAgICAgb3MuY2hkaXIoYmFzZV9kaXIpCiAgICAgICAgcmV0dXJuIG1ha2Vfd2hlZWxmaWxlX2lubmVyKGJhc2VfbmFtZSkKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIob2xkZGlyKQoKCmRlZiBtYWtlX3doZWVsZmlsZV9pbm5lcihiYXNlX25hbWUsIGJhc2VfZGlyPScuJyk6CiAgICAiIiJDcmVhdGUgYSB3aGwgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4KCiAgICBQbGFjZXMgLmRpc3QtaW5mbyBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiIiIgoKICAgIHppcF9maWxlbmFtZSA9IGJhc2VfbmFtZSArICIud2hsIgoKICAgIGxvZy5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCgogICAgIyBTb21lIGFwcGxpY2F0aW9ucyBuZWVkIHJlcHJvZHVjaWJsZSAud2hsIGZpbGVzLCBidXQgdGhleSBjYW4ndCBkbyB0aGlzCiAgICAjIHdpdGhvdXQgZm9yY2luZyB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmRpdmlkdWFsIFppcEluZm8gb2JqZWN0cy4gIFNlZQogICAgIyBpc3N1ZSAjMTQzLgogICAgdGltZXN0YW1wID0gb3MuZW52aXJvbi5nZXQoJ1NPVVJDRV9EQVRFX0VQT0NIJykKICAgIGlmIHRpbWVzdGFtcCBpcyBOb25lOgogICAgICAgIGRhdGVfdGltZSA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgZGF0ZV90aW1lID0gdGltZS5nbXRpbWUoaW50KHRpbWVzdGFtcCkpWzA6Nl0KCiAgICAjIFhYWCBzdXBwb3J0IGJ6MiwgeHogd2hlbiBhdmFpbGFibGUKICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICJ3IiwgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCgogICAgc2NvcmUgPSB7J1dIRUVMJzogMSwgJ01FVEFEQVRBJzogMiwgJ1JFQ09SRCc6IDN9CiAgICBkZWZlcnJlZCA9IFtdCgogICAgZGVmIHdyaXRlZmlsZShwYXRoLCBkYXRlX3RpbWUpOgogICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQogICAgICAgIGlmIGRhdGVfdGltZSBpcyBOb25lOgogICAgICAgICAgICBtdGltZSA9IHRpbWUuZ210aW1lKHN0LnN0X210aW1lKQogICAgICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCiAgICAgICAgemluZm8gPSB6aXBmaWxlLlppcEluZm8ocGF0aCwgZGF0ZV90aW1lKQogICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSBzdC5zdF9tb2RlIDw8IDE2CiAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHppcGZpbGUuWklQX0RFRkxBVEVECiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZwOgogICAgICAgICAgICB6aXAud3JpdGVzdHIoemluZm8sIGZwLnJlYWQoKSkKICAgICAgICBsb2cuaW5mbygiYWRkaW5nICclcyciICUgcGF0aCkKCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgaWYgZGlycGF0aC5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLmFwcGVuZCgoc2NvcmUuZ2V0KG5hbWUsIDApLCBwYXRoKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgd3JpdGVmaWxlKHBhdGgsIGRhdGVfdGltZSkKCiAgICBkZWZlcnJlZC5zb3J0KCkKICAgIGZvciBzY29yZSwgcGF0aCBpbiBkZWZlcnJlZDoKICAgICAgICB3cml0ZWZpbGUocGF0aCwgZGF0ZV90aW1lKQoKICAgIHppcC5jbG9zZSgpCgogICAgcmV0dXJuIHppcF9maWxlbmFtZQpQSwMEFAAAAAAAAAAhAEqvJNHoRwAA6EcAACkAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9iZGlzdF93aGVlbC5weSIiIgpDcmVhdGUgYSB3aGVlbCAoLndobCkgZGlzdHJpYnV0aW9uLgoKQSB3aGVlbCBpcyBhIGJ1aWx0IGFyY2hpdmUgZm9ybWF0LgoiIiIKCmltcG9ydCBjc3YKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IG9zCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc2h1dGlsCmltcG9ydCBqc29uCmltcG9ydCBzeXMKaW1wb3J0IHJlCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hIG5vY292ZXIKICAgICMgUHl0aG9uIDwgMi43CiAgICBpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZyBhcyBzeXNjb25maWcKCmltcG9ydCBwa2dfcmVzb3VyY2VzCgpzYWZlX25hbWUgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZQpzYWZlX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbgoKZnJvbSBzaHV0aWwgaW1wb3J0IHJtdHJlZQpmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCgpmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uCgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nIGFzIGxvZ2dlcgoKZnJvbSAucGVwNDI1dGFncyBpbXBvcnQgZ2V0X2FiYnJfaW1wbCwgZ2V0X2ltcGxfdmVyLCBnZXRfYWJpX3RhZywgZ2V0X3BsYXRmb3JtCmZyb20gLnV0aWwgaW1wb3J0IG5hdGl2ZSwgb3Blbl9mb3JfY3N2CmZyb20gLmFyY2hpdmUgaW1wb3J0IGFyY2hpdmVfd2hlZWxmaWxlCmZyb20gLnBrZ2luZm8gaW1wb3J0IHJlYWRfcGtnX2luZm8sIHdyaXRlX3BrZ19pbmZvCmZyb20gLm1ldGFkYXRhIGltcG9ydCBwa2dpbmZvX3RvX2RpY3QKZnJvbSAuIGltcG9ydCBwZXA0MjV0YWdzLCBtZXRhZGF0YQpmcm9tIC4gaW1wb3J0IF9fdmVyc2lvbl9fIGFzIHdoZWVsX3ZlcnNpb24KClBZX0xJTUlURURfQVBJX1BBVFRFUk4gPSByJ2NwM1xkJwoKZGVmIHNhZmVyX25hbWUobmFtZSk6CiAgICByZXR1cm4gc2FmZV9uYW1lKG5hbWUpLnJlcGxhY2UoJy0nLCAnXycpCgpkZWYgc2FmZXJfdmVyc2lvbih2ZXJzaW9uKToKICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbikucmVwbGFjZSgnLScsICdfJykKCmNsYXNzIGJkaXN0X3doZWVsKENvbW1hbmQpOgoKICAgIGRlc2NyaXB0aW9uID0gJ2NyZWF0ZSBhIHdoZWVsIGRpc3RyaWJ1dGlvbicKCiAgICB1c2VyX29wdGlvbnMgPSBbKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKICAgICAgICAgICAgICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCiAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAogICAgICAgICAgICAgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAogICAgICAgICAgICAgICAgICAgICgncmVsYXRpdmUnLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiYnVpbGQgdGhlIGFyY2hpdmUgdXNpbmcgcmVsYXRpdmUgcGF0aHMiCiAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgKCdvd25lcj0nLCAndScsCiAgICAgICAgICAgICAgICAgICAgICJPd25lciBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIgogICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IHVzZXJdIiksCiAgICAgICAgICAgICAgICAgICAgKCdncm91cD0nLCAnZycsCiAgICAgICAgICAgICAgICAgICAgICJHcm91cCBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIgogICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IGdyb3VwXSIpLAogICAgICAgICAgICAgICAgICAgICgndW5pdmVyc2FsJywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgIm1ha2UgYSB1bml2ZXJzYWwgd2hlZWwiCiAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IGZhbHNlKSIpLAogICAgICAgICAgICAgICAgICAgICgncHl0aG9uLXRhZz0nLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIGltcGxlbWVudGF0aW9uIGNvbXBhdGliaWxpdHkgdGFnIgogICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiBweSVzKSIgJSBnZXRfaW1wbF92ZXIoKVswXSksCiAgICAgICAgICAgICAgICAgICAgKCdweS1saW1pdGVkLWFwaT0nLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHRhZyAoY3AzMnxjcDMzfGNwTk4pIGZvciBhYmkzIHdoZWVsIHRhZyIKICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAncmVsYXRpdmUnLCAndW5pdmVyc2FsJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYuZGF0YV9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X3RhZyA9IE5vbmUKICAgICAgICBzZWxmLmZvcm1hdCA9ICd6aXAnCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSBGYWxzZQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5kaXN0aW5mb19kaXIgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dpbmZvX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnJvb3RfaXNfcHVyZSA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCiAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IEZhbHNlCiAgICAgICAgc2VsZi5vd25lciA9IE5vbmUKICAgICAgICBzZWxmLmdyb3VwID0gTm9uZQogICAgICAgIHNlbGYudW5pdmVyc2FsID0gRmFsc2UKICAgICAgICBzZWxmLnB5dGhvbl90YWcgPSAncHknICsgZ2V0X2ltcGxfdmVyKClbMF0KICAgICAgICBzZWxmLnB5X2xpbWl0ZWRfYXBpID0gRmFsc2UKICAgICAgICBzZWxmLnBsYXRfbmFtZV9zdXBwbGllZCA9IEZhbHNlCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ3doZWVsJykKCiAgICAgICAgc2VsZi5kYXRhX2RpciA9IHNlbGYud2hlZWxfZGlzdF9uYW1lICsgJy5kYXRhJwogICAgICAgIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkID0gc2VsZi5wbGF0X25hbWUgaXMgbm90IE5vbmUKCiAgICAgICAgbmVlZF9vcHRpb25zID0gKCdkaXN0X2RpcicsICdwbGF0X25hbWUnLCAnc2tpcF9idWlsZCcpCgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnppcChuZWVkX29wdGlvbnMsIG5lZWRfb3B0aW9ucykpCgogICAgICAgIHNlbGYucm9vdF9pc19wdXJlID0gbm90IChzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKSkKCiAgICAgICAgaWYgc2VsZi5weV9saW1pdGVkX2FwaSBhbmQgbm90IHJlLm1hdGNoKFBZX0xJTUlURURfQVBJX1BBVFRFUk4sIHNlbGYucHlfbGltaXRlZF9hcGkpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJweS1saW1pdGVkLWFwaSBtdXN0IG1hdGNoICclcyciICUgUFlfTElNSVRFRF9BUElfUEFUVEVSTikKCiAgICAgICAgIyBTdXBwb3J0IGxlZ2FjeSBbd2hlZWxdIHNlY3Rpb24gZm9yIHNldHRpbmcgdW5pdmVyc2FsCiAgICAgICAgd2hlZWwgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ3doZWVsJykKICAgICAgICBpZiAndW5pdmVyc2FsJyBpbiB3aGVlbDoKICAgICAgICAgICAgIyBwbGVhc2UgZG9uJ3QgZGVmaW5lIHRoaXMgaW4geW91ciBnbG9iYWwgY29uZmlncwogICAgICAgICAgICB2YWwgPSB3aGVlbFsndW5pdmVyc2FsJ11bMV0uc3RyaXAoKQogICAgICAgICAgICBpZiB2YWwubG93ZXIoKSBpbiAoJzEnLCAndHJ1ZScsICd5ZXMnKToKICAgICAgICAgICAgICAgIHNlbGYudW5pdmVyc2FsID0gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdoZWVsX2Rpc3RfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gZGlzdHJpYnV0aW9uIGZ1bGwgbmFtZSB3aXRoIC0gcmVwbGFjZWQgd2l0aCBfIiIiCiAgICAgICAgcmV0dXJuICctJy5qb2luKChzYWZlcl9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2FmZXJfdmVyc2lvbihzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpKSkpCgogICAgZGVmIGdldF90YWcoc2VsZik6CiAgICAgICAgIyBiZGlzdCBzZXRzIHNlbGYucGxhdF9uYW1lIGlmIHVuc2V0LCB3ZSBzaG91bGQgb25seSB1c2UgaXQgZm9yIHB1cmVweQogICAgICAgICMgd2hlZWxzIGlmIHRoZSB1c2VyIHN1cHBsaWVkIGl0LgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkOgogICAgICAgICAgICBwbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZQogICAgICAgIGVsaWYgc2VsZi5yb290X2lzX3B1cmU6CiAgICAgICAgICAgIHBsYXRfbmFtZSA9ICdhbnknCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGxhdF9uYW1lID0gc2VsZi5wbGF0X25hbWUgb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICAgICAgaWYgcGxhdF9uYW1lIGluICgnbGludXgteDg2XzY0JywgJ2xpbnV4X3g4Nl82NCcpIGFuZCBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICAgICAgICAgcGxhdF9uYW1lID0gJ2xpbnV4X2k2ODYnCiAgICAgICAgcGxhdF9uYW1lID0gcGxhdF9uYW1lLnJlcGxhY2UoJy0nLCAnXycpLnJlcGxhY2UoJy4nLCAnXycpCgoKICAgICAgICBpZiBzZWxmLnJvb3RfaXNfcHVyZToKICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWw6CiAgICAgICAgICAgICAgICBpbXBsID0gJ3B5Mi5weTMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbXBsID0gc2VsZi5weXRob25fdGFnCiAgICAgICAgICAgIHRhZyA9IChpbXBsLCAnbm9uZScsIHBsYXRfbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbXBsX25hbWUgPSBnZXRfYWJicl9pbXBsKCkKICAgICAgICAgICAgaW1wbF92ZXIgPSBnZXRfaW1wbF92ZXIoKQogICAgICAgICAgICBpbXBsID0gaW1wbF9uYW1lICsgaW1wbF92ZXIKICAgICAgICAgICAgIyBXZSBkb24ndCB3b3JrIG9uIENQeXRob24gMy4xLCAzLjAuCiAgICAgICAgICAgIGlmIHNlbGYucHlfbGltaXRlZF9hcGkgYW5kIChpbXBsX25hbWUgKyBpbXBsX3Zlcikuc3RhcnRzd2l0aCgnY3AzJyk6CiAgICAgICAgICAgICAgICBpbXBsID0gc2VsZi5weV9saW1pdGVkX2FwaQogICAgICAgICAgICAgICAgYWJpX3RhZyA9ICdhYmkzJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWJpX3RhZyA9IHN0cihnZXRfYWJpX3RhZygpKS5sb3dlcigpCiAgICAgICAgICAgIHRhZyA9IChpbXBsLCBhYmlfdGFnLCBwbGF0X25hbWUpCiAgICAgICAgICAgIHN1cHBvcnRlZF90YWdzID0gcGVwNDI1dGFncy5nZXRfc3VwcG9ydGVkKAogICAgICAgICAgICAgICAgc3VwcGxpZWRfcGxhdGZvcm09cGxhdF9uYW1lIGlmIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkIGVsc2UgTm9uZSkKICAgICAgICAgICAgIyBYWFggc3dpdGNoIHRvIHRoaXMgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGZvciBub24tcHVyZToKICAgICAgICAgICAgaWYgbm90IHNlbGYucHlfbGltaXRlZF9hcGk6CiAgICAgICAgICAgICAgICBhc3NlcnQgdGFnID09IHN1cHBvcnRlZF90YWdzWzBdLCAiJXMgIT0gJXMiICUgKHRhZywgc3VwcG9ydGVkX3RhZ3NbMF0pCiAgICAgICAgICAgIGFzc2VydCB0YWcgaW4gc3VwcG9ydGVkX3RhZ3MsICJ3b3VsZCBidWlsZCB3aGVlbCB3aXRoIHVuc3VwcG9ydGVkIHRhZyAlcyIgJSB0YWcKICAgICAgICByZXR1cm4gdGFnCgogICAgZGVmIGdldF9hcmNoaXZlX2Jhc2VuYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhcmNoaXZlIG5hbWUgd2l0aG91dCBleHRlbnNpb24iIiIKCiAgICAgICAgaW1wbF90YWcsIGFiaV90YWcsIHBsYXRfdGFnID0gc2VsZi5nZXRfdGFnKCkKCiAgICAgICAgYXJjaGl2ZV9iYXNlbmFtZSA9ICIlcy0lcy0lcy0lcyIgJSAoCiAgICAgICAgICAgIHNlbGYud2hlZWxfZGlzdF9uYW1lLAogICAgICAgICAgICBpbXBsX3RhZywKICAgICAgICAgICAgYWJpX3RhZywKICAgICAgICAgICAgcGxhdF90YWcpCiAgICAgICAgcmV0dXJuIGFyY2hpdmVfYmFzZW5hbWUKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGJ1aWxkX3NjcmlwdHMgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICBidWlsZF9zY3JpcHRzLmV4ZWN1dGFibGUgPSAncHl0aG9uJwoKICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZCcpCgogICAgICAgIGluc3RhbGwgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWluaXRfc3ViY29tbWFuZHM9VHJ1ZSkKICAgICAgICBpbnN0YWxsLnJvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGluc3RhbGwuY29tcGlsZSA9IEZhbHNlCiAgICAgICAgaW5zdGFsbC5za2lwX2J1aWxkID0gc2VsZi5za2lwX2J1aWxkCiAgICAgICAgaW5zdGFsbC53YXJuX2RpciA9IEZhbHNlCgogICAgICAgICMgQSB3aGVlbCB3aXRob3V0IHNldHVwdG9vbHMgc2NyaXB0cyBpcyBtb3JlIGNyb3NzLXBsYXRmb3JtLgogICAgICAgICMgVXNlIHRoZSAodW5kb2N1bWVudGVkKSBgbm9fZXBgIG9wdGlvbiB0byBzZXR1cHRvb2xzJwogICAgICAgICMgaW5zdGFsbF9zY3JpcHRzIGNvbW1hbmQgdG8gYXZvaWQgY3JlYXRpbmcgZW50cnkgcG9pbnQgc2NyaXB0cy4KICAgICAgICBpbnN0YWxsX3NjcmlwdHMgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnKQogICAgICAgIGluc3RhbGxfc2NyaXB0cy5ub19lcCA9IFRydWUKCiAgICAgICAgIyBVc2UgYSBjdXN0b20gc2NoZW1lIGZvciB0aGUgYXJjaGl2ZSwgYmVjYXVzZSB3ZSBoYXZlIHRvIGRlY2lkZQogICAgICAgICMgYXQgaW5zdGFsbGF0aW9uIHRpbWUgd2hpY2ggc2NoZW1lIHRvIHVzZS4KICAgICAgICBmb3Iga2V5IGluICgnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnLCAncHVyZWxpYicsICdwbGF0bGliJyk6CiAgICAgICAgICAgIHNldGF0dHIoaW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF8nICsga2V5LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmRhdGFfZGlyLCBrZXkpKQoKICAgICAgICBiYXNlZGlyX29ic2VydmVkID0gJycKCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAjIHdpbjMyIGJhcmZzIGlmIGFueSBvZiB0aGVzZSBhcmUgJyc7IGNvdWxkIGJlICcuJz8KICAgICAgICAgICAgIyAoZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbDpjaGFuZ2Vfcm9vdHMgYnVnKQogICAgICAgICAgICBiYXNlZGlyX29ic2VydmVkID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kYXRhX2RpciwgJy4uJykpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9saWJiYXNlID0gc2VsZi5pbnN0YWxsX2xpYiA9IGJhc2VkaXJfb2JzZXJ2ZWQKCiAgICAgICAgc2V0YXR0cihpbnN0YWxsLAogICAgICAgICAgICAgICAgJ2luc3RhbGxfcHVyZWxpYicgaWYgc2VsZi5yb290X2lzX3B1cmUgZWxzZSAnaW5zdGFsbF9wbGF0bGliJywKICAgICAgICAgICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQpCgogICAgICAgIGxvZ2dlci5pbmZvKCJpbnN0YWxsaW5nIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2luc3RhbGwnKQoKICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gc2VsZi5nZXRfYXJjaGl2ZV9iYXNlbmFtZSgpCgogICAgICAgIHBzZXVkb2luc3RhbGxfcm9vdCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBhcmNoaXZlX2Jhc2VuYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLnJlbGF0aXZlOgogICAgICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyLAogICAgICAgICAgICAgICAgc2VsZi5fZW5zdXJlX3JlbGF0aXZlKGluc3RhbGwuaW5zdGFsbF9iYXNlKSkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX2VnZ19pbmZvJywgKCd0YXJnZXQnLCAnZWdnaW5mb19kaXInKSkKICAgICAgICBzZWxmLmRpc3RpbmZvX2RpciA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMuZGlzdC1pbmZvJyAlIHNlbGYud2hlZWxfZGlzdF9uYW1lKQogICAgICAgIHNlbGYuZWdnMmRpc3Qoc2VsZi5lZ2dpbmZvX2RpciwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICBzZWxmLndyaXRlX3doZWVsZmlsZShzZWxmLmRpc3RpbmZvX2RpcikKCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmQoc2VsZi5iZGlzdF9kaXIsIHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kaXN0X2Rpcik6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuZGlzdF9kaXIpCiAgICAgICAgd2hlZWxfbmFtZSA9IGFyY2hpdmVfd2hlZWxmaWxlKHBzZXVkb2luc3RhbGxfcm9vdCwgYXJjaGl2ZV9yb290KQoKICAgICAgICAjIFNpZ24gdGhlIGFyY2hpdmUKICAgICAgICBpZiAnV0hFRUxfVE9PTCcgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFtvcy5lbnZpcm9uWydXSEVFTF9UT09MJ10sICdzaWduJywgd2hlZWxfbmFtZV0pCgogICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcwogICAgICAgIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pLmFwcGVuZCgKICAgICAgICAgICAgKCdiZGlzdF93aGVlbCcsIGdldF9weXRob25fdmVyc2lvbigpLCB3aGVlbF9uYW1lKSkKCiAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgogICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncmVtb3ZpbmcgJXMnLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJtdHJlZShzZWxmLmJkaXN0X2RpcikKCiAgICBkZWYgd3JpdGVfd2hlZWxmaWxlKHNlbGYsIHdoZWVsZmlsZV9iYXNlLCBnZW5lcmF0b3I9J2JkaXN0X3doZWVsICgnICsgd2hlZWxfdmVyc2lvbiArICcpJyk6CiAgICAgICAgZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCiAgICAgICAgbXNnID0gTWVzc2FnZSgpCiAgICAgICAgbXNnWydXaGVlbC1WZXJzaW9uJ10gPSAnMS4wJyAgIyBvZiB0aGUgc3BlYwogICAgICAgIG1zZ1snR2VuZXJhdG9yJ10gPSBnZW5lcmF0b3IKICAgICAgICBtc2dbJ1Jvb3QtSXMtUHVyZWxpYiddID0gc3RyKHNlbGYucm9vdF9pc19wdXJlKS5sb3dlcigpCgogICAgICAgICMgRG9lc24ndCB3b3JrIGZvciBiZGlzdF93aW5pbnN0CiAgICAgICAgaW1wbF90YWcsIGFiaV90YWcsIHBsYXRfdGFnID0gc2VsZi5nZXRfdGFnKCkKICAgICAgICBmb3IgaW1wbCBpbiBpbXBsX3RhZy5zcGxpdCgnLicpOgogICAgICAgICAgICBmb3IgYWJpIGluIGFiaV90YWcuc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgIGZvciBwbGF0IGluIHBsYXRfdGFnLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICAgICAgbXNnWydUYWcnXSA9ICctJy5qb2luKChpbXBsLCBhYmksIHBsYXQpKQoKICAgICAgICB3aGVlbGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih3aGVlbGZpbGVfYmFzZSwgJ1dIRUVMJykKICAgICAgICBsb2dnZXIuaW5mbygnY3JlYXRpbmcgJXMnLCB3aGVlbGZpbGVfcGF0aCkKICAgICAgICB3aXRoIG9wZW4od2hlZWxmaWxlX3BhdGgsICd3JykgYXMgZjoKICAgICAgICAgICAgR2VuZXJhdG9yKGYsIG1heGhlYWRlcmxlbj0wKS5mbGF0dGVuKG1zZykKCiAgICBkZWYgX2Vuc3VyZV9yZWxhdGl2ZShzZWxmLCBwYXRoKToKICAgICAgICAjIGNvcGllZCBmcm9tIGRpcl91dGlsLCBkZWxldGVkCiAgICAgICAgZHJpdmUsIHBhdGggPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aCkKICAgICAgICBpZiBwYXRoWzA6MV0gPT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoID0gZHJpdmUgKyBwYXRoWzE6XQogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9wa2dpbmZvX3RvX21ldGFkYXRhKHNlbGYsIGVnZ19pbmZvX3BhdGgsIHBrZ2luZm9fcGF0aCk6CiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBrZ2luZm9fdG9fbWV0YWRhdGEoZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKQoKICAgIGRlZiBsaWNlbnNlX2ZpbGUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGxpY2Vuc2UgZmlsZW5hbWUgZnJvbSBhIGxpY2Vuc2UtZmlsZSBrZXkgaW4gc2V0dXAuY2ZnLCBvciBOb25lLiIiIgogICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdtZXRhZGF0YScpCiAgICAgICAgaWYgbm90ICdsaWNlbnNlX2ZpbGUnIGluIG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtZXRhZGF0YVsnbGljZW5zZV9maWxlJ11bMV0KCiAgICBkZWYgc2V0dXBjZmdfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLmNmZyBhcwogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdyZXF1aXJlbWVudDsgcXVhbGlmaWVyJykgdHVwbGVzLiBGcm9tIGEgbWV0YWRhdGEKICAgICAgICBzZWN0aW9uIGluIHNldHVwLmNmZzoKCiAgICAgICAgW21ldGFkYXRhXQogICAgICAgIHByb3ZpZGVzLWV4dHJhID0gZXh0cmExCiAgICAgICAgICAgIGV4dHJhMgogICAgICAgIHJlcXVpcmVzLWRpc3QgPSByZXF1aXJlbWVudDsgcXVhbGlmaWVyCiAgICAgICAgICAgIGFub3RoZXI7IHF1YWxpZmllcjIKICAgICAgICAgICAgdW5xdWFsaWZpZWQKCiAgICAgICAgWWllbGRzCgogICAgICAgICgnUHJvdmlkZXMtRXh0cmEnLCAnZXh0cmExJyksCiAgICAgICAgKCdQcm92aWRlcy1FeHRyYScsICdleHRyYTInKSwKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAncmVxdWlyZW1lbnQ7IHF1YWxpZmllcicpLAogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdhbm90aGVyOyBxdWFsaWZpZXIyJyksCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ3VucXVhbGlmaWVkJykKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnbWV0YWRhdGEnKQoKICAgICAgICAjIG91ciAuaW5pIHBhcnNlciBmb2xkcyAtIHRvIF8gaW4ga2V5IG5hbWVzOgogICAgICAgIGZvciBrZXksIHRpdGxlIGluICgoJ3Byb3ZpZGVzX2V4dHJhJywgJ1Byb3ZpZGVzLUV4dHJhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZGlzdCcsICdSZXF1aXJlcy1EaXN0JykpOgogICAgICAgICAgICBpZiBub3Qga2V5IGluIG1ldGFkYXRhOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmllbGQgPSBtZXRhZGF0YVtrZXldCiAgICAgICAgICAgIGZvciBsaW5lIGluIGZpZWxkWzFdLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB5aWVsZCAodGl0bGUsIGxpbmUpCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudHMoc2VsZiwgbWV0YWRhdGFfcGF0aCk6CiAgICAgICAgIiIiQWRkIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAuY2ZnIHRvIGZpbGUgbWV0YWRhdGFfcGF0aCIiIgogICAgICAgIGFkZGl0aW9uYWwgPSBsaXN0KHNlbGYuc2V0dXBjZmdfcmVxdWlyZW1lbnRzKCkpCiAgICAgICAgaWYgbm90IGFkZGl0aW9uYWw6IHJldHVybgogICAgICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhtZXRhZGF0YV9wYXRoKQogICAgICAgIGlmICdQcm92aWRlcy1FeHRyYScgaW4gcGtnX2luZm8gb3IgJ1JlcXVpcmVzLURpc3QnIGluIHBrZ19pbmZvOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdzZXR1cC5jZmcgcmVxdWlyZW1lbnRzIG92ZXJ3cml0ZSB2YWx1ZXMgZnJvbSBzZXR1cC5weScpCiAgICAgICAgICAgIGRlbCBwa2dfaW5mb1snUHJvdmlkZXMtRXh0cmEnXQogICAgICAgICAgICBkZWwgcGtnX2luZm9bJ1JlcXVpcmVzLURpc3QnXQogICAgICAgIGZvciBrLCB2IGluIGFkZGl0aW9uYWw6CiAgICAgICAgICAgIHBrZ19pbmZvW2tdID0gdgogICAgICAgIHdyaXRlX3BrZ19pbmZvKG1ldGFkYXRhX3BhdGgsIHBrZ19pbmZvKQoKICAgIGRlZiBlZ2cyZGlzdChzZWxmLCBlZ2dpbmZvX3BhdGgsIGRpc3RpbmZvX3BhdGgpOgogICAgICAgICIiIkNvbnZlcnQgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBpbnRvIGEgLmRpc3QtaW5mbyBkaXJlY3RvcnkiIiIKICAgICAgICBkZWYgYWRpb3MocCk6CiAgICAgICAgICAgICIiIkFwcHJvcHJpYXRlbHkgZGVsZXRlIGRpcmVjdG9yeSwgZmlsZSBvciBsaW5rLiIiIgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHApIGFuZCBvcy5wYXRoLmlzZGlyKHApOgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHApOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHApCgogICAgICAgIGFkaW9zKGRpc3RpbmZvX3BhdGgpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlZ2dpbmZvX3BhdGgpOgogICAgICAgICAgICAjIFRoZXJlIGlzIG5vIGVnZy1pbmZvLiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhlIGVnZy1pbmZvCiAgICAgICAgICAgICMgZmlsZS9kaXJlY3RvcnkgaXMgbm90IG5hbWVkIG1hdGNoaW5nIHRoZSBkaXN0cmlidXRpb24gbmFtZSB1c2VkCiAgICAgICAgICAgICMgdG8gbmFtZSB0aGUgYXJjaGl2ZSBmaWxlLiBDaGVjayBmb3IgdGhpcyBjYXNlIGFuZCByZXBvcnQKICAgICAgICAgICAgIyBhY2NvcmRpbmdseS4KICAgICAgICAgICAgaW1wb3J0IGdsb2IKICAgICAgICAgICAgcGF0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShlZ2dpbmZvX3BhdGgpLCAnKi5lZ2ctaW5mbycpCiAgICAgICAgICAgIHBvc3NpYmxlID0gZ2xvYi5nbG9iKHBhdCkKICAgICAgICAgICAgZXJyID0gIkVnZyBtZXRhZGF0YSBleHBlY3RlZCBhdCAlcyBidXQgbm90IGZvdW5kIiAlIChlZ2dpbmZvX3BhdGgsKQogICAgICAgICAgICBpZiBwb3NzaWJsZToKICAgICAgICAgICAgICAgIGFsdCA9IG9zLnBhdGguYmFzZW5hbWUocG9zc2libGVbMF0pCiAgICAgICAgICAgICAgICBlcnIgKz0gIiAoJXMgZm91bmQgLSBwb3NzaWJsZSBtaXNuYW1lZCBhcmNoaXZlIGZpbGU/KSIgJSAoYWx0LCkKCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJyKQoKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dpbmZvX3BhdGgpOgogICAgICAgICAgICAjIC5lZ2ctaW5mbyBpcyBhIHNpbmdsZSBmaWxlCiAgICAgICAgICAgIHBrZ2luZm9fcGF0aCA9IGVnZ2luZm9fcGF0aAogICAgICAgICAgICBwa2dfaW5mbyA9IHNlbGYuX3BrZ2luZm9fdG9fbWV0YWRhdGEoZWdnaW5mb19wYXRoLCBlZ2dpbmZvX3BhdGgpCiAgICAgICAgICAgIG9zLm1rZGlyKGRpc3RpbmZvX3BhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyAuZWdnLWluZm8gaXMgYSBkaXJlY3RvcnkKICAgICAgICAgICAgcGtnaW5mb19wYXRoID0gb3MucGF0aC5qb2luKGVnZ2luZm9fcGF0aCwgJ1BLRy1JTkZPJykKICAgICAgICAgICAgcGtnX2luZm8gPSBzZWxmLl9wa2dpbmZvX3RvX21ldGFkYXRhKGVnZ2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKQoKICAgICAgICAgICAgIyBpZ25vcmUgY29tbW9uIGVnZyBtZXRhZGF0YSB0aGF0IGlzIHVzZWxlc3MgdG8gd2hlZWwKICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGVnZ2luZm9fcGF0aCwgZGlzdGluZm9fcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZT1sYW1iZGEgeCwgeTogc2V0KCgnUEtHLUlORk8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcy50eHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTT1VSQ0VTLnR4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdC16aXAtc2FmZScsKSkpCgogICAgICAgICAgICAjIGRlbGV0ZSBkZXBlbmRlbmN5X2xpbmtzIGlmIGl0IGlzIG9ubHkgd2hpdGVzcGFjZQogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKGRlcGVuZGVuY3lfbGlua3NfcGF0aCwgJ3InKSBhcyBkZXBlbmRlbmN5X2xpbmtzX2ZpbGU6CiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzID0gZGVwZW5kZW5jeV9saW5rc19maWxlLnJlYWQoKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBkZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICAgICAgYWRpb3MoZGVwZW5kZW5jeV9saW5rc19wYXRoKQoKICAgICAgICB3cml0ZV9wa2dfaW5mbyhvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ01FVEFEQVRBJyksIHBrZ19pbmZvKQoKICAgICAgICAjIFhYWCBkZXByZWNhdGVkLiBTdGlsbCB1c2VmdWwgZm9yIGN1cnJlbnQgZGlzdHJpYnV0ZS9zZXR1cHRvb2xzLgogICAgICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ01FVEFEQVRBJykKICAgICAgICBzZWxmLmFkZF9yZXF1aXJlbWVudHMobWV0YWRhdGFfcGF0aCkKCiAgICAgICAgIyBYWFggaW50ZW50aW9uYWxseSBhIGRpZmZlcmVudCBwYXRoIHRoYW4gdGhlIFBFUC4KICAgICAgICBtZXRhZGF0YV9qc29uX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ21ldGFkYXRhLmpzb24nKQogICAgICAgIHB5bWV0YSA9IHBrZ2luZm9fdG9fZGljdChtZXRhZGF0YV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb249c2VsZi5kaXN0cmlidXRpb24pCgogICAgICAgIGlmICdkZXNjcmlwdGlvbicgaW4gcHltZXRhOgogICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlbmFtZSA9ICdERVNDUklQVElPTi5yc3QnCiAgICAgICAgICAgIGRlc2NyaXB0aW9uX3RleHQgPSBweW1ldGEucG9wKCdkZXNjcmlwdGlvbicpCiAgICAgICAgICAgIGRlc2NyaXB0aW9uX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGRlc2NyaXB0aW9uX3BhdGgsICJ3YiIpIGFzIGRlc2NyaXB0aW9uX2ZpbGU6CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlLndyaXRlKGRlc2NyaXB0aW9uX3RleHQuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICBweW1ldGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsnZG9jdW1lbnRfbmFtZXMnXVsnZGVzY3JpcHRpb24nXSA9IGRlc2NyaXB0aW9uX2ZpbGVuYW1lCgogICAgICAgICMgWFhYIGhldXJpc3RpY2FsbHkgY29weSBhbnkgTElDRU5TRS9MSUNFTlNFLnR4dD8KICAgICAgICBsaWNlbnNlID0gc2VsZi5saWNlbnNlX2ZpbGUoKQogICAgICAgIGlmIGxpY2Vuc2U6CiAgICAgICAgICAgIGxpY2Vuc2VfZmlsZW5hbWUgPSAnTElDRU5TRS50eHQnCiAgICAgICAgICAgIHNodXRpbC5jb3B5KGxpY2Vuc2UsIG9zLnBhdGguam9pbihzZWxmLmRpc3RpbmZvX2RpciwgbGljZW5zZV9maWxlbmFtZSkpCiAgICAgICAgICAgIHB5bWV0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydkb2N1bWVudF9uYW1lcyddWydsaWNlbnNlJ10gPSBsaWNlbnNlX2ZpbGVuYW1lCgogICAgICAgIHdpdGggb3BlbihtZXRhZGF0YV9qc29uX3BhdGgsICJ3IikgYXMgbWV0YWRhdGFfanNvbjoKICAgICAgICAgICAganNvbi5kdW1wKHB5bWV0YSwgbWV0YWRhdGFfanNvbiwgc29ydF9rZXlzPVRydWUpCgogICAgICAgIGFkaW9zKGVnZ2luZm9fcGF0aCkKCiAgICBkZWYgd3JpdGVfcmVjb3JkKHNlbGYsIGJkaXN0X2RpciwgZGlzdGluZm9fZGlyKToKICAgICAgICBmcm9tIC51dGlsIGltcG9ydCB1cmxzYWZlX2I2NGVuY29kZQoKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19kaXIsICdSRUNPUkQnKQogICAgICAgIHJlY29yZF9yZWxwYXRoID0gb3MucGF0aC5yZWxwYXRoKHJlY29yZF9wYXRoLCBiZGlzdF9kaXIpCgogICAgICAgIGRlZiB3YWxrKCk6CiAgICAgICAgICAgIGZvciBkaXIsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoYmRpc3RfZGlyKToKICAgICAgICAgICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgICAgICAgICBmb3IgZiBpbiBzb3J0ZWQoZmlsZXMpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXIsIGYpCgogICAgICAgIGRlZiBza2lwKHBhdGgpOgogICAgICAgICAgICAiIiJXaGVlbCBoYXNoZXMgZXZlcnkgcG9zc2libGUgZmlsZS4iIiIKICAgICAgICAgICAgcmV0dXJuIChwYXRoID09IHJlY29yZF9yZWxwYXRoKQoKICAgICAgICB3aXRoIG9wZW5fZm9yX2NzdihyZWNvcmRfcGF0aCwgJ3crJykgYXMgcmVjb3JkX2ZpbGU6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX2ZpbGUpCiAgICAgICAgICAgIGZvciBwYXRoIGluIHdhbGsoKToKICAgICAgICAgICAgICAgIHJlbHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocGF0aCwgYmRpc3RfZGlyKQogICAgICAgICAgICAgICAgaWYgc2tpcChyZWxwYXRoKToKICAgICAgICAgICAgICAgICAgICBoYXNoID0gJycKICAgICAgICAgICAgICAgICAgICBzaXplID0gJycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgIGRpZ2VzdCA9IGhhc2hsaWIuc2hhMjU2KGRhdGEpLmRpZ2VzdCgpCiAgICAgICAgICAgICAgICAgICAgaGFzaCA9ICdzaGEyNTY9JyArIG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpKQogICAgICAgICAgICAgICAgICAgIHNpemUgPSBsZW4oZGF0YSkKICAgICAgICAgICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKAogICAgICAgICAgICAgICAgICAgIHBhdGgsIGJkaXN0X2RpcikucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWNvcmRfcGF0aCwgaGFzaCwgc2l6ZSkpClBLAwQUAAAAAAAAACEAo3lSdx0CAAAdAgAAJwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2RlY29yYXRvci5weSMgZnJvbSBQeXJhbWlkCgoKY2xhc3MgcmVpZnkob2JqZWN0KToKICAgICIiIlB1dCB0aGUgcmVzdWx0IG9mIGEgbWV0aG9kIHdoaWNoIHVzZXMgdGhpcyAobm9uLWRhdGEpCiAgICBkZXNjcmlwdG9yIGRlY29yYXRvciBpbiB0aGUgaW5zdGFuY2UgZGljdCBhZnRlciB0aGUgZmlyc3QgY2FsbCwKICAgIGVmZmVjdGl2ZWx5IHJlcGxhY2luZyB0aGUgZGVjb3JhdG9yIHdpdGggYW4gaW5zdGFuY2UgdmFyaWFibGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCk6CiAgICAgICAgc2VsZi53cmFwcGVkID0gd3JhcHBlZAogICAgICAgIHNlbGYuX19kb2NfXyA9IHdyYXBwZWQuX19kb2NfXwoKICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3QsIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgaWYgaW5zdCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHZhbCA9IHNlbGYud3JhcHBlZChpbnN0KQogICAgICAgIHNldGF0dHIoaW5zdCwgc2VsZi53cmFwcGVkLl9fbmFtZV9fLCB2YWwpCiAgICAgICAgcmV0dXJuIHZhbApQSwMEFAAAAAAAAAAhANNhDyTTCwAA0wsAACcAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2cyd2hlZWwucHkjIS91c3IvYmluL2VudiBweXRob24KaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmltcG9ydCB3aGVlbC5iZGlzdF93aGVlbAppbXBvcnQgc2h1dGlsCmltcG9ydCBkaXN0dXRpbHMuZGlzdApmcm9tIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwgaW1wb3J0IG1ha2VfYXJjaGl2ZQpmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iCmZyb20gd2hlZWwud2luaW5zdDJ3aGVlbCBpbXBvcnQgX2JkaXN0X3doZWVsX3RhZwoKZWdnX2luZm9fcmUgPSByZS5jb21waWxlKHInJycoP1A8bmFtZT4uKz8pLSg/UDx2ZXI+Lis/KQogICAgKC0oP1A8cHl2ZXI+Lis/KSk/KC0oP1A8YXJjaD4uKz8pKT8uZWdnJycnLCByZS5WRVJCT1NFKQoKZGVmIGVnZzJ3aGVlbChlZ2dfcGF0aCwgZGVzdF9kaXIpOgogICAgZWdnX2luZm8gPSBlZ2dfaW5mb19yZS5tYXRjaChvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSkuZ3JvdXBkaWN0KCkKICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJfZTJ3IikKICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ19wYXRoKToKICAgICAgICAjIGFzc3VtZSB3ZSBoYXZlIGEgYmRpc3RfZWdnIG90aGVyd2lzZQogICAgICAgIGVnZyA9IHppcGZpbGUuWmlwRmlsZShlZ2dfcGF0aCkKICAgICAgICBlZ2cuZXh0cmFjdGFsbChkaXIpCiAgICBlbHNlOgogICAgICAgICMgc3VwcG9ydCBidWlsZG91dC1zdHlsZSBpbnN0YWxsZWQgZWdncyBkaXJlY3RvcmllcwogICAgICAgIGZvciBwdGggaW4gb3MubGlzdGRpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihlZ2dfcGF0aCwgcHRoKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzcmMpOgogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKHNyYywgZGlyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyYywgb3MucGF0aC5qb2luKGRpciwgcHRoKSkKCiAgICBkaXN0X2luZm8gPSAiJXMtJXMiICUgKGVnZ19pbmZvWyduYW1lJ10sIGVnZ19pbmZvWyd2ZXInXSkKICAgIGFiaSA9ICdub25lJwogICAgcHl2ZXIgPSBlZ2dfaW5mb1sncHl2ZXInXS5yZXBsYWNlKCcuJywgJycpCiAgICBhcmNoID0gKGVnZ19pbmZvWydhcmNoJ10gb3IgJ2FueScpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBpZiBhcmNoICE9ICdhbnknOgogICAgICAgICMgYXNzdW1lIGFsbCBiaW5hcnkgZWdncyBhcmUgZm9yIENQeXRob24KICAgICAgICBweXZlciA9ICdjcCcgKyBweXZlclsyOl0KICAgIHdoZWVsX25hbWUgPSAnLScuam9pbigoCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgIHB5dmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFiaSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgIHJvb3RfaXNfcHVyZWxpYiA9IGVnZ19pbmZvWydhcmNoJ10gaXMgTm9uZQogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3ID0gd2hlZWwuYmRpc3Rfd2hlZWwuYmRpc3Rfd2hlZWwoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCiAgICBlbHNlOgogICAgICAgIGJ3ID0gX2JkaXN0X3doZWVsX3RhZyhkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKCiAgICBidy5yb290X2lzX3B1cmUgPSByb290X2lzX3B1cmVsaWIKICAgIGJ3LnB5dGhvbl90YWcgPSBweXZlcgogICAgYncucGxhdF9uYW1lX3N1cHBsaWVkID0gVHJ1ZQogICAgYncucGxhdF9uYW1lID0gZWdnX2luZm9bJ2FyY2gnXSBvciAnYW55JwogICAgaWYgbm90IHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidy5mdWxsX3RhZ19zdXBwbGllZCA9IFRydWUKICAgICAgICBidy5mdWxsX3RhZyA9IChweXZlciwgYWJpLCBhcmNoKQoKICAgIGRpc3RfaW5mb19kaXIgPSBvcy5wYXRoLmpvaW4oZGlyLCAnJXMuZGlzdC1pbmZvJyAlIGRpc3RfaW5mbykKICAgIGJ3LmVnZzJkaXN0KG9zLnBhdGguam9pbihkaXIsICdFR0ctSU5GTycpLAogICAgICAgICAgICAgICAgZGlzdF9pbmZvX2RpcikKICAgIGJ3LndyaXRlX3doZWVsZmlsZShkaXN0X2luZm9fZGlyLCBnZW5lcmF0b3I9J2VnZzJ3aGVlbCcpCiAgICBidy53cml0ZV9yZWNvcmQoZGlyLCBkaXN0X2luZm9fZGlyKQogICAgZmlsZW5hbWUgPSBtYWtlX2FyY2hpdmUob3MucGF0aC5qb2luKGRlc3RfZGlyLCB3aGVlbF9uYW1lKSwgJ3ppcCcsIHJvb3RfZGlyPWRpcikKICAgIG9zLnJlbmFtZShmaWxlbmFtZSwgZmlsZW5hbWVbOi0zXSArICd3aGwnKQogICAgc2h1dGlsLnJtdHJlZShkaXIpCgpkZWYgbWFpbigpOgogICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZWdncycsIG5hcmdzPScqJywgaGVscD0iRWdncyB0byBjb252ZXJ0IikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdC1kaXInLCAnLWQnLCBkZWZhdWx0PW9zLnBhdGguY3VyZGlyLAogICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgdG8gc3RvcmUgd2hlZWxzIChkZWZhdWx0ICUoZGVmYXVsdClzKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIGZvciBwYXQgaW4gYXJncy5lZ2dzOgogICAgICAgIGZvciBlZ2cgaW4gaWdsb2IocGF0KToKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiezB9Li4uICIuZm9ybWF0KGVnZykpCiAgICAgICAgICAgIGVnZzJ3aGVlbChlZ2csIGFyZ3MuZGVzdF9kaXIpCiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIk9LXG4iKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhABAk8jO6CQAAugkAACcAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2duYW1lcy50eHR2Y2FyZC0wLjcuOC1weTIuNy5lZ2cKcXRhbGNoZW15LTAuNy4xLXB5Mi43LmVnZwpBTVFQRGVsaXZlci0wLjEtcHkyLjcuZWdnCmluZmkucmVnaXN0cnktMC4xLjEtcHkyLjcuZWdnCmluZmkuaW5zdHJ1Y3QtMC41LjUtcHkyLjcuZWdnCmluZmkuZGV2aWNlbWFuYWdlci0wLjEuMi1weTIuNy5lZ2cKVHJhY1RpeFN1bW1hcnktMS4wLXB5Mi43LmVnZwpUb3NjYVdpZGdldHMtMC45LjEyLXB5Mi43LmVnZwphcmNoaXBlbF9hZ2VudF9pcGhvbmVfbm90aWZpY2F0aW9uLTAuNS4wYmV0YS1weTIuNy5lZ2cKYXJjaGlwZWxfYWdlbnRfYWN0aW9uX3NjaGVkdWxlci0wLjUuMGJldGEtcHkyLjcuZWdnCmFvLnNvY2lhbC0xLjAuMi1weTIuNy5lZ2cKYXBnbC0wLjctcHkyLjcuZWdnCnNhdGNobW9fcGF5bWVudF9wYXl3b3JsZC0wLjEuMS1weTIuNy5lZ2cKc25tcHNpbS0wLjEuMy1weTIuNy5lZ2cKc3NoaW0tMC4yLXB5Mi43LmVnZwpzaG92ZS0wLjMuNC1weTIuNy5lZ2cKc2ltcGxlYXZyby0wLjMuMC1weTIuNy5lZ2cKd2todG1sdG9wZGYtMC4yLXB5Mi43LmVnZwp3b2trZWwtMC43LjAtcHkyLjcuZWdnCmptYm9fc29jaWFsLTAuMC42LXB5Mi43LmVnZwpqbWJvX3Bvc3QtMC4wLjYtcHkyLjcuZWdnCmpjcmFjay0wLjAuMi1weTIuNy5lZ2cKcmlhay0xLjQuMC1weTIuNy5lZ2cKcmVzdGNsaWVudC0wLjEwLjItcHkyLjcuZWdnClN1dGVraC0wLjguMS1weTIuNy5lZ2cKdHJheWlmeS0wLjAuMS1weTIuNy5lZ2cKdHdlZXB5LTEuOS1weTIuNy5lZ2cKdG9wem9vdG9vbHMtMC4yLjEtcHkyLjcuZWdnCmhheXN0YWNrLTAuMTYtcHkyLjcuZWdnCnpvcGUuaW50ZXJmYWNlLTQuMC4xLXB5Mi43LXdpbjMyLmVnZwpuZXVyb3NoYXJlLTAuOC41LXB5Mi43LW1hY29zeC0xMC43LWludGVsLmVnZwpuZGdfaHR0cHNjbGllbnQtMC4yLjAtcHkyLjcuZWdnCmxpYnRlbGUtMC4zLXB5Mi43LmVnZwpsaXRleC5jeHBvb2wtMS4wLjItcHkyLjcuZWdnCm9ic3B5LmlyaXMtMC41LjEtcHkyLjcuZWdnCm9ic3B5Lm1zZWVkLTAuNi4xLXB5Mi43LXdpbjMyLmVnZwpvYnNweS5jb3JlLTAuNi4yLXB5Mi43LmVnZwpDb3JlUG9zdC0wLjAuMy1weTIuNy5lZ2cKZm5vcmRzdGFsay0wLjAuMy1weTIuNy5lZ2cKUGVyc2lzdGVuY2UtMi4xMy4yLXB5Mi43LXdpbjMyLmVnZwpQeWRhcC0zLjEuUkMxLXB5Mi43LmVnZwpQeUV4ZWNKUy0xLjAuNC1weTIuNy5lZ2cKV2FsbHktMC43LjItcHkyLjcuZWdnCkV4dGVuc2lvbkNsYXNzLTQuMGExLXB5Mi43LXdpbjMyLmVnZwpGZWVkamFjay0wLjkuMTYtcHkyLjcuZWdnCk1hcnMyNC0wLjMuOS1weTIuNy5lZ2cKSGFsV2ViLTAuNi4wLXB5Mi43LmVnZwpEQVJFLTAuNy4xNDAtcHkyLjcuZWdnCm1hY2hvbGliLTEuMy1weTIuNy5lZ2cKbWFycm93LndzZ2kuZWdyZXNzLmNvbXByZXNzaW9uLTEuMS1weTIuNy5lZ2cKbWNzLTAuMy43LXB5Mi43LmVnZwpLb29rLTAuNi4wLXB5Mi43LmVnZwplci0wLjEtcHkyLjcuZWdnCmV2YXNpb25fZGlyZWN0b3ItMS4xLjQtcHkyLjcuZWdnCmRqcXVlcnktMC4xYS1weTIuNy5lZ2cKZGphbmdvX2ZhY3RvcnktMC43LXB5Mi43LmVnZwpkamFuZ29fZ2l6bW8tMC4wLjMtcHkyLjcuZWdnCmRqYW5nb19jYXRlZ29yeS0wLjEtcHkyLjcuZWdnCmRid3JhcC0wLjMuMi1weTIuNy5lZ2cKZGphbmdvX3N1cGVyZ2VuZXJpYy0xLjAtcHkyLjcuZWdnCmRqYW5nb19keW5hbW8tMC4yNS1weTIuNy5lZ2cKZGphbmdvX2Fjb2xsYWJhdXRoLTAuMS1weTIuNy5lZ2cKZGphbmdvX3FybGluay0wLjEuMC1weTIuNy5lZ2cKZGphbmdvX2FkZG9ucy0wLjYuNi1weTIuNy5lZ2cKY292ZXJfZ3JhYmJlci0xLjEuMi1weTIuNy5lZ2cKY2hlbS0xLjEtcHkyLjcuZWdnCmNydWQtMC4xLXB5Mi43LmVnZwpib25nby0wLjEtcHkyLjcuZWdnCmJ5dGVjb2RlaGFja3MtQXByaWwyMDAwLXB5Mi43LmVnZwpncmVlbmxldC0wLjMuNC1weTIuNy13aW4zMi5lZ2cKZ2ludm9rZS0wLjMuMS1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19TY3JpcHRpbmdCcmlkZ2UtMi4zLXB5Mi43LmVnZwpwZWNhbi0wLjIuMGEtcHkyLjcuZWdnCnB5cmVzcy0wLjIuMC1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19QdWJTdWItMi4zLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX0V4Y2VwdGlvbkhhbmRsaW5nLTIuMy1weTIuNy5lZ2cKcHl3cHMtdHJ1bmstcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfQ0ZOZXR3b3JrLTIuMy1weTIuNy1tYWNvc3gtMTAuNi1mYXQuZWdnCnB5LnNhdW50ZXItMC40MC1weTIuNy5lZ2cKcHlmbm9yZG1ldHJpYy0wLjAuMS1weTIuNy5lZ2cKcHl3cy0xLjEuMS1weTIuNy5lZ2cKcHJlc3RhcHl0LTAuNC4wLXB5Mi43LmVnZwpwYXNzbGliLTEuNS4zLXB5Mi43LmVnZwpweWdhLTIuMS1weTIuNy5lZ2cKcHlnaXRodWIzLTAuMy1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19PcGVuRGlyZWN0b3J5LTIuMy1weTIuNy5lZ2cKeWFwb3NpYi0wLjIuNzUtcHkyLjctbGludXgteDg2XzY0LmVnZwpQSwMEFAAAAAAAAAAhALG8ufayRgAAskYAACUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9pbnN0YWxsLnB5IiIiCk9wZXJhdGlvbnMgb24gZXhpc3Rpbmcgd2hlZWwgZmlsZXMsIGluY2x1ZGluZyBiYXNpYyBpbnN0YWxsYXRpb24uIAoiIiIKIyBYWFggc2VlIHBhdGNoZWQgcGlwIHRvIGluc3RhbGwKCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgemlwZmlsZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgY3N2CgppbXBvcnQgc2h1dGlsCgp0cnk6CiAgICBfYmlnX251bWJlciA9IHN5cy5tYXhzaXplCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfYmlnX251bWJlciA9IHN5cy5tYXhpbnQKCmZyb20gLmRlY29yYXRvciBpbXBvcnQgcmVpZnkKZnJvbSAudXRpbCBpbXBvcnQgKHVybHNhZmVfYjY0ZW5jb2RlLCBmcm9tX2pzb24sIHVybHNhZmVfYjY0ZGVjb2RlLAogICAgICAgICAgICAgICAgICAgbmF0aXZlLCBiaW5hcnksIEhhc2hpbmdGaWxlKQpmcm9tIC4gaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mb19ieXRlcwpmcm9tIC51dGlsIGltcG9ydCBvcGVuX2Zvcl9jc3YKCmZyb20gLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9zdXBwb3J0ZWQKZnJvbSAucGF0aHMgaW1wb3J0IGdldF9pbnN0YWxsX3BhdGhzCgojIFRoZSBuZXh0IG1ham9yIHZlcnNpb24gYWZ0ZXIgdGhpcyB2ZXJzaW9uIG9mIHRoZSAnd2hlZWwnIHRvb2w6ClZFUlNJT05fVE9PX0hJR0ggPSAoMSwgMCkKCiMgTm9uLWdyZWVkeSBtYXRjaGluZyBvZiBhbiBvcHRpb25hbCBidWlsZCBudW1iZXIgbWF5IGJlIHRvbyBjbGV2ZXIgKG1vcmUKIyBpbnZhbGlkIHdoZWVsIGZpbGVuYW1lcyB3aWxsIG1hdGNoKS4gU2VwYXJhdGUgcmVnZXggZm9yIC5kaXN0LWluZm8/CldIRUVMX0lORk9fUkUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pKC0oP1A8dmVyPlxkLis/KSk/KQogICAgKCgtKD9QPGJ1aWxkPlxkLio/KSk/LSg/UDxweXZlcj4uKz8pLSg/UDxhYmk+Lis/KS0oP1A8cGxhdD4uKz8pCiAgICBcLndobHxcLmRpc3QtaW5mbykkIiIiLAogICAgcmUuVkVSQk9TRSkubWF0Y2gKCmRlZiBwYXJzZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiVXNlIHBhcnNlX3ZlcnNpb24gZnJvbSBwa2dfcmVzb3VyY2VzIG9yIGRpc3R1dGlscyBhcyBhdmFpbGFibGUuIiIiCiAgICBnbG9iYWwgcGFyc2VfdmVyc2lvbgogICAgdHJ5OgogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfdmVyc2lvbgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IExvb3NlVmVyc2lvbiBhcyBwYXJzZV92ZXJzaW9uCiAgICByZXR1cm4gcGFyc2VfdmVyc2lvbih2ZXJzaW9uKQoKY2xhc3MgQmFkV2hlZWxGaWxlKFZhbHVlRXJyb3IpOgogICAgcGFzcwoKCmNsYXNzIFdoZWVsRmlsZShvYmplY3QpOgogICAgIiIiUGFyc2Ugd2hlZWwtc3BlY2lmaWMgYXR0cmlidXRlcyBmcm9tIGEgd2hlZWwgKC53aGwpIGZpbGUgYW5kIG9mZmVyCiAgICBiYXNpYyBpbnN0YWxsYXRpb24gYW5kIHZlcmlmaWNhdGlvbiBzdXBwb3J0LgogICAgCiAgICBXaGVlbEZpbGUgY2FuIGJlIHVzZWQgdG8gc2ltcGx5IHBhcnNlIGEgd2hlZWwgZmlsZW5hbWUgYnkgYXZvaWRpbmcgdGhlCiAgICBtZXRob2RzIHRoYXQgcmVxdWlyZSB0aGUgYWN0dWFsIGZpbGUgY29udGVudHMuIiIiCgogICAgV0hFRUxfSU5GTyA9ICJXSEVFTCIKICAgIFJFQ09SRCA9ICJSRUNPUkQiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgZnA9Tm9uZSwKICAgICAgICAgICAgICAgICBhcHBlbmQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgY29udGV4dD1nZXRfc3VwcG9ydGVkKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gZnA6IEEgc2Vla2FibGUgZmlsZS1saWtlIG9iamVjdCBvciBOb25lIHRvIG9wZW4oZmlsZW5hbWUpLgogICAgICAgIDpwYXJhbSBhcHBlbmQ6IE9wZW4gYXJjaGl2ZSBpbiBhcHBlbmQgbW9kZS4KICAgICAgICA6cGFyYW0gY29udGV4dDogRnVuY3Rpb24gcmV0dXJuaW5nIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MuIFdoZWVscwogICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IHRvIGJlIHNvcnRhYmxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuZnAgPSBmcAogICAgICAgIHNlbGYuYXBwZW5kID0gYXBwZW5kCiAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dAogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKICAgICAgICBzZWxmLnBhcnNlZF9maWxlbmFtZSA9IFdIRUVMX0lORk9fUkUoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykgb3Igc2VsZi5wYXJzZWRfZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJCYWQgZmlsZW5hbWUgJyVzJyIgJSBmaWxlbmFtZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0aW5mb19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMuZGlzdC1pbmZvIiAlIHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkYXRhZGlyX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy5kYXRhIiAlIHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZWNvcmRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLmRpc3RpbmZvX25hbWUsIHNlbGYuUkVDT1JEKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdoZWVsaW5mb19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMvJXMiICUgKHNlbGYuZGlzdGluZm9fbmFtZSwgc2VsZi5XSEVFTF9JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgIiIiQSB3aGVlbCBmaWxlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlCiAgICAgICAgcGVyaW9kLWRlbGltaXRlZCB0YWdzIGluIGl0cyBmaWxlbmFtZS4KICAgICAgICBUbyBjaG9vc2UgYSB3aGVlbCBmaWxlIGFtb25nIHNldmVyYWwgY2FuZGlkYXRlcyBoYXZpbmcgdGhlIHNhbWUKICAgICAgICBkaXN0cmlidXRpb24gdmVyc2lvbiAndmVyJywgYW4gaW5zdGFsbGVyIHJhbmtzIGVhY2ggdHJpcGxlIG9mCiAgICAgICAgKHB5dmVyLCBhYmksIHBsYXQpIHRoYXQgaXRzIFB5dGhvbiBpbnN0YWxsYXRpb24gY2FuIHJ1biwgc29ydGluZwogICAgICAgIHRoZSB3aGVlbHMgYnkgdGhlIGJlc3QtcmFua2VkIHRhZyBpdCBzdXBwb3J0cyBhbmQgdGhlbiBieSB0aGVpcgogICAgICAgIGFyaXR5IHdoaWNoIGlzIGp1c3QgbGVuKGxpc3QoY29tcGF0aWJpbGl0eV90YWdzKSkuCiAgICAgICAgIiIiCiAgICAgICAgdGFncyA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwZGljdCgpCiAgICAgICAgZm9yIHB5dmVyIGluIHRhZ3NbJ3B5dmVyJ10uc3BsaXQoJy4nKToKICAgICAgICAgICAgZm9yIGFiaSBpbiB0YWdzWydhYmknXS5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgZm9yIHBsYXQgaW4gdGFnc1sncGxhdCddLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgKHB5dmVyLCBhYmksIHBsYXQpCgogICAgY29tcGF0aWJpbGl0eV90YWdzID0gdGFncwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFyaXR5KHNlbGYpOgogICAgICAgICIiIlRoZSBudW1iZXIgb2YgY29tcGF0aWJpbGl0eSB0YWdzIHRoZSB3aGVlbCBkZWNsYXJlcy4iIiIKICAgICAgICByZXR1cm4gbGVuKGxpc3Qoc2VsZi5jb21wYXRpYmlsaXR5X3RhZ3MpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJhbmsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG93ZXN0IGluZGV4IG9mIGFueSBvZiB0aGlzIHdoZWVsJ3MgdGFncyBpbiBzZWxmLmNvbnRleHQoKSwgYW5kIHRoZQogICAgICAgIGFyaXR5IGUuZy4gKDAsIDEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGF0aWJpbGl0eV9yYW5rKHNlbGYuY29udGV4dCgpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBhdGlibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmFua1swXSAhPSBfYmlnX251bWJlciAgIyBiYWQgQVBJIQoKICAgICMgZGVwcmVjYXRlZDoKICAgIGRlZiBjb21wYXRpYmlsaXR5X3Jhbmsoc2VsZiwgc3VwcG9ydGVkKToKICAgICAgICAiIiJSYW5rIHRoZSB3aGVlbCBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgdGFncy4gU21hbGxlciByYW5rcyBhcmUgbW9yZQogICAgICAgIGNvbXBhdGlibGUhCgogICAgICAgIDpwYXJhbSBzdXBwb3J0ZWQ6IEEgbGlzdCBvZiBjb21wYXRpYmlsaXR5IHRhZ3MgdGhhdCB0aGUgY3VycmVudAogICAgICAgICAgICBQeXRob24gaW1wbGVtZW5hdGlvbiBjYW4gcnVuLgogICAgICAgICIiIgogICAgICAgIHByZWZlcmVuY2VzID0gW10KICAgICAgICBmb3IgdGFnIGluIHNlbGYuY29tcGF0aWJpbGl0eV90YWdzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwcmVmZXJlbmNlcy5hcHBlbmQoc3VwcG9ydGVkLmluZGV4KHRhZykpCiAgICAgICAgICAgICMgVGFnIG5vdCBwcmVzZW50CiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIGxlbihwcmVmZXJlbmNlcyk6CiAgICAgICAgICAgIHJldHVybiAobWluKHByZWZlcmVuY2VzKSwgc2VsZi5hcml0eSkKICAgICAgICByZXR1cm4gKF9iaWdfbnVtYmVyLCAwKQoKICAgICMgZGVwcmVjYXRlZAogICAgZGVmIHN1cHBvcnRzX2N1cnJlbnRfcHl0aG9uKHNlbGYsIHgpOgogICAgICAgIGFzc2VydCBzZWxmLmNvbnRleHQgPT0geCwgJ2NvbnRleHQgbWlzbWF0Y2gnCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGF0aWJsZQoKICAgICMgQ29tcGFyYWJpbGl0eS4KICAgICMgV2hlZWxzIGFyZSBlcXVhbCBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCiAgICAjIElmIHR3byB3aGVlbHMgYXJlIG5vdCBlcXVhbCwgY29tcGFyZSBiYXNlZCBvbiAoaW4gdGhpcyBvcmRlcik6CiAgICAjICAgMS4gTmFtZQogICAgIyAgIDIuIFZlcnNpb24KICAgICMgICAzLiBDb21wYXRpYmlsaXR5IHJhbmsKICAgICMgICA0LiBGaWxlbmFtZSAoYXMgYSB0aWVicmVha2VyKQogICAgQHByb3BlcnR5CiAgICBkZWYgX3NvcnRfa2V5KHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKSwKICAgICAgICAgICAgICAgIHBhcnNlX3ZlcnNpb24oc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKSwKICAgICAgICAgICAgICAgIHR1cGxlKC14IGZvciB4IGluIHNlbGYucmFuayksCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lID09IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUgIT0gb3RoZXIuZmlsZW5hbWUKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBzZWxmLmNvbnRleHQgIT0gb3RoZXIuY29udGV4dDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ7MH0uY29udGV4dCAhPSB7MX0uY29udGV4dCIuZm9ybWF0KHNlbGYsIG90aGVyKSkKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NvcnRfa2V5IDwgb3RoZXIuX3NvcnRfa2V5CgogICAgICAgICMgWFhYIHBydW5lCgogICAgICAgIHNuID0gc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgICAgIG9uID0gb3RoZXIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICBpZiBzbiAhPSBvbjoKICAgICAgICAgICAgcmV0dXJuIHNuIDwgb24KICAgICAgICBzdiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKQogICAgICAgIG92ID0gcGFyc2VfdmVyc2lvbihvdGhlci5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKQogICAgICAgIGlmIHN2ICE9IG92OgogICAgICAgICAgICByZXR1cm4gc3YgPCBvdgogICAgICAgICMgQ29tcGF0aWJpbGl0eQogICAgICAgIGlmIHNlbGYuY29udGV4dCAhPSBvdGhlci5jb250ZXh0OgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInswfS5jb250ZXh0ICE9IHsxfS5jb250ZXh0Ii5mb3JtYXQoc2VsZiwgb3RoZXIpKQogICAgICAgIHNjID0gc2VsZi5yYW5rCiAgICAgICAgb2MgPSBvdGhlci5yYW5rCiAgICAgICAgaWYgc2MgIT0gTm9uZSBhbmQgb2MgIT0gTm9uZSBhbmQgc2MgIT0gb2M6CiAgICAgICAgICAgICMgU21hbGxlciBjb21wYXRpYmlsaXR5IHJhbmtzIGFyZSAiYmV0dGVyIiB0aGFuIGxhcmdlciBvbmVzLAogICAgICAgICAgICAjIHNvIHdlIGhhdmUgdG8gcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGNvbXBhcmlzb24gaGVyZSEKICAgICAgICAgICAgcmV0dXJuIHNjID4gb2MKICAgICAgICBlbGlmIHNjID09IE5vbmUgYW5kIG9jICE9IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lIDwgb3RoZXIuZmlsZW5hbWUKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gb3RoZXIgPCBzZWxmCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIgb3Igc2VsZiA8IG90aGVyCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIgb3Igb3RoZXIgPCBzZWxmCgogICAgIwogICAgIyBNZXRob2RzIHVzaW5nIHRoZSBmaWxlJ3MgY29udGVudHM6CiAgICAjCgogICAgQHJlaWZ5CiAgICBkZWYgemlwZmlsZShzZWxmKToKICAgICAgICBtb2RlID0gInIiCiAgICAgICAgaWYgc2VsZi5hcHBlbmQ6CiAgICAgICAgICAgIG1vZGUgPSAiYSIKICAgICAgICB2emYgPSBWZXJpZnlpbmdaaXBGaWxlKHNlbGYuZnAgaWYgc2VsZi5mcCBlbHNlIHNlbGYuZmlsZW5hbWUsIG1vZGUpCiAgICAgICAgaWYgbm90IHNlbGYuYXBwZW5kOgogICAgICAgICAgICBzZWxmLnZlcmlmeSh2emYpCiAgICAgICAgcmV0dXJuIHZ6ZgoKICAgIEByZWlmeQogICAgZGVmIHBhcnNlZF93aGVlbF9pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIHdoZWVsIG1ldGFkYXRhICh0aGUgLmRhdGEvV0hFRUwgZmlsZSkiIiIKICAgICAgICByZXR1cm4gcmVhZF9wa2dfaW5mb19ieXRlcyhzZWxmLnppcGZpbGUucmVhZChzZWxmLndoZWVsaW5mb19uYW1lKSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5wYXJzZWRfd2hlZWxfaW5mb1snV2hlZWwtVmVyc2lvbiddCiAgICAgICAgaWYgdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkgPj0gVkVSU0lPTl9UT09fSElHSDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiV2hlZWwgdmVyc2lvbiBpcyB0b28gaGlnaCIpCgogICAgQHJlaWZ5CiAgICBkZWYgaW5zdGFsbF9wYXRocyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb25zdWx0IGRpc3R1dGlscyB0byBnZXQgdGhlIGluc3RhbGwgcGF0aHMgZm9yIG91ciBkaXN0LiAgQSBkaWN0IHdpdGgKICAgICAgICAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpLgogICAgICAgIAogICAgICAgIFdlIHVzZSB0aGUgbmFtZSBmcm9tIG91ciBmaWxlbmFtZSBhcyB0aGUgZGlzdCBuYW1lLCB3aGljaCBtZWFucyBoZWFkZXJzCiAgICAgICAgY291bGQgYmUgaW5zdGFsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSBpZiB0aGUgZmlsZXN5c3RlbS1lc2NhcGVkIG5hbWUKICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgTmFtZS4gIFdobyBjYXJlcz8gCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICByZXR1cm4gZ2V0X2luc3RhbGxfcGF0aHMobmFtZSkKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBmb3JjZT1GYWxzZSwgb3ZlcnJpZGVzPXt9KToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoZSB3aGVlbCBpbnRvIHNpdGUtcGFja2FnZXMuCiAgICAgICAgIiIiCgogICAgICAgICMgVXRpbGl0eSB0byBnZXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBrZXkKICAgICAgICBkZWYgZ2V0X3BhdGgoa2V5KToKICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlcy5nZXQoa2V5KSBvciBzZWxmLmluc3RhbGxfcGF0aHNba2V5XQoKICAgICAgICAjIFRoZSBiYXNlIHRhcmdldCBsb2NhdGlvbiBpcyBlaXRoZXIgcHVyZWxpYiBvciBwbGF0bGliCiAgICAgICAgaWYgc2VsZi5wYXJzZWRfd2hlZWxfaW5mb1snUm9vdC1Jcy1QdXJlbGliJ10gPT0gJ3RydWUnOgogICAgICAgICAgICByb290ID0gZ2V0X3BhdGgoJ3B1cmVsaWInKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJvb3QgPSBnZXRfcGF0aCgncGxhdGxpYicpCgogICAgICAgICMgUGFyc2UgYWxsIHRoZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZQogICAgICAgIG5hbWVfdHJhbnMgPSB7fQogICAgICAgIGZvciBpbmZvIGluIHNlbGYuemlwZmlsZS5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICAjIFppcCBmaWxlcyBjYW4gY29udGFpbiBlbnRyaWVzIHJlcHJlc2VudGluZyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgIyBUaGVzZSBlbmQgaW4gYSAnLycuCiAgICAgICAgICAgICMgV2UgaWdub3JlIHRoZXNlLCBhcyB3ZSBjcmVhdGUgZGlyZWN0b3JpZXMgb24gZGVtYW5kLgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBQYXRobmFtZXMgaW4gYSB6aXBmaWxlIG5hbWVsaXN0IGFyZSBhbHdheXMgLy1zZXBhcmF0ZWQuCiAgICAgICAgICAgICMgSW4gdGhlb3J5LCBwYXRocyBjb3VsZCBzdGFydCB3aXRoIC4vIG9yIGhhdmUgb3RoZXIgb2RkaXRpZXMKICAgICAgICAgICAgIyBidXQgdGhpcyB3b24ndCBoYXBwZW4gaW4gcHJhY3RpY2FsIGNhc2VzIG9mIHdlbGwtZm9ybWVkIHdoZWVscy4KICAgICAgICAgICAgIyBXZSdsbCBjb3ZlciB0aGUgc2ltcGxlIGNhc2Ugb2YgYW4gaW5pdGlhbCAnLi8nIGFzIGl0J3MgYm90aCBlYXN5CiAgICAgICAgICAgICMgdG8gZG8gYW5kIG1vcmUgY29tbW9uIHRoYW4gbW9zdCBvdGhlciBvZGRpdGllcy4KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcuLycpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbMjpdCgogICAgICAgICAgICAjIFNwbGl0IG9mZiB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gaWRlbnRpZnkgZmlsZXMgdGhhdCBhcmUgdG8gYmUKICAgICAgICAgICAgIyBpbnN0YWxsZWQgaW4gbm9uLXJvb3QgbG9jYXRpb25zCiAgICAgICAgICAgIGJhc2VkaXIsIHNlcCwgZmlsZW5hbWUgPSBuYW1lLnBhcnRpdGlvbignLycpCiAgICAgICAgICAgIGlmIHNlcCBhbmQgYmFzZWRpciA9PSBzZWxmLmRhdGFkaXJfbmFtZToKICAgICAgICAgICAgICAgICMgRGF0YSBmaWxlLiBUYXJnZXQgZGVzdGluYXRpb24gaXMgZWxzZXdoZXJlCiAgICAgICAgICAgICAgICBrZXksIHNlcCwgZmlsZW5hbWUgPSBmaWxlbmFtZS5wYXJ0aXRpb24oJy8nKQogICAgICAgICAgICAgICAgaWYgbm90IHNlcDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZpbGVuYW1lIGluIHdoZWVsOiB7MH0iLmZvcm1hdChuYW1lKSkKICAgICAgICAgICAgICAgIHRhcmdldCA9IGdldF9wYXRoKGtleSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTm9ybWFsIGZpbGUuIFRhcmdldCBkZXN0aW5hdGlvbiBpcyByb290CiAgICAgICAgICAgICAgICBrZXkgPSAnJwogICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm9vdAogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBuYW1lCgogICAgICAgICAgICAjIE1hcCB0aGUgYWN0dWFsIGZpbGVuYW1lIGZyb20gdGhlIHppcGZpbGUgdG8gaXRzIGludGVuZGVkIHRhcmdldAogICAgICAgICAgICAjIGRpcmVjdG9yeSBhbmQgdGhlIHBhdGhuYW1lIHJlbGF0aXZlIHRvIHRoYXQgZGlyZWN0b3J5LgogICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4odGFyZ2V0LCBmaWxlbmFtZSkpCiAgICAgICAgICAgIG5hbWVfdHJhbnNbaW5mb10gPSAoa2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0KQoKICAgICAgICAjIFdlJ3JlIG5vdyByZWFkeSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBhY3R1YWwgaW5zdGFsbC4gVGhlIHByb2Nlc3MKICAgICAgICAjIGlzIGFzIGZvbGxvd3M6CiAgICAgICAgIyAgIDEuIFByZWNoZWNrcyAtIGlzIHRoZSB3aGVlbCB2YWxpZCwgaXMgaXRzIGRlY2xhcmVkIGFyY2hpdGVjdHVyZQogICAgICAgICMgICAgICBPSywgZXRjLiBbW1Jlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXJdXQogICAgICAgICMgICAyLiBPdmVyd3JpdGUgY2hlY2sgLSBkbyBhbnkgb2YgdGhlIGZpbGVzIHRvIGJlIGluc3RhbGxlZCBhbHJlYWR5CiAgICAgICAgIyAgICAgIGV4aXN0PwogICAgICAgICMgICAzLiBBY3R1YWwgaW5zdGFsbCAtIHB1dCB0aGUgZmlsZXMgaW4gdGhlaXIgdGFyZ2V0IGxvY2F0aW9ucy4KICAgICAgICAjICAgNC4gVXBkYXRlIFJFQ09SRCAtIHdyaXRlIGEgc3VpdGFibHkgbW9kaWZpZWQgUkVDT1JEIGZpbGUgdG8KICAgICAgICAjICAgICAgcmVmbGVjdCB0aGUgYWN0dWFsIGluc3RhbGxlZCBwYXRocy4KCiAgICAgICAgaWYgbm90IGZvcmNlOgogICAgICAgICAgICBmb3IgaW5mbywgdiBpbiBuYW1lX3RyYW5zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBrID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAga2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0ID0gdgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiV2hlZWwgZmlsZSB7MH0gd291bGQgb3ZlcndyaXRlIHsxfS4gVXNlIGZvcmNlIGlmIHRoaXMgaXMgaW50ZW5kZWQiLmZvcm1hdChrLCBkZXN0KSkKCiAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2Ygb3VyIGV4ZWN1dGFibGUsIGZvciB1c2Ugd2hlbiByZXBsYWNpbmcgc2NyaXB0CiAgICAgICAgIyB3cmFwcGVyIGhhc2hiYW5nIGxpbmVzLgogICAgICAgICMgV2UgZW5jb2RlIGl0IHVzaW5nIGdldGZpbGVzeXN0ZW1lbmNvZGluZywgYXMgdGhhdCBpcyAidGhlIG5hbWUgb2YKICAgICAgICAjIHRoZSBlbmNvZGluZyB1c2VkIHRvIGNvbnZlcnQgVW5pY29kZSBmaWxlbmFtZXMgaW50byBzeXN0ZW0gZmlsZQogICAgICAgICMgbmFtZXMiLgogICAgICAgIGV4ZW5hbWUgPSBzeXMuZXhlY3V0YWJsZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgIHJlY29yZF9kYXRhID0gW10KICAgICAgICByZWNvcmRfbmFtZSA9IHNlbGYuZGlzdGluZm9fbmFtZSArICcvUkVDT1JEJwogICAgICAgIGZvciBpbmZvLCAoa2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0KSBpbiBuYW1lX3RyYW5zLml0ZW1zKCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuemlwZmlsZS5vcGVuKGluZm8pCiAgICAgICAgICAgICMgU2tpcCB0aGUgUkVDT1JEIGZpbGUKICAgICAgICAgICAgaWYgbmFtZSA9PSByZWNvcmRfbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZGVzdCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGRpcik6CiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkZGlyKQogICAgICAgICAgICBkZXN0aW5hdGlvbiA9IEhhc2hpbmdGaWxlKG9wZW4oZGVzdCwgJ3diJykpCiAgICAgICAgICAgIGlmIGtleSA9PSAnc2NyaXB0cyc6CiAgICAgICAgICAgICAgICBoYXNoYmFuZyA9IHNvdXJjZS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICBpZiBoYXNoYmFuZy5zdGFydHN3aXRoKGInIyFweXRob24nKToKICAgICAgICAgICAgICAgICAgICBoYXNoYmFuZyA9IGInIyEnICsgZXhlbmFtZSArIGJpbmFyeShvcy5saW5lc2VwKQogICAgICAgICAgICAgICAgZGVzdGluYXRpb24ud3JpdGUoaGFzaGJhbmcpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIGRlc3RpbmF0aW9uKQogICAgICAgICAgICByZWxkZXN0ID0gb3MucGF0aC5yZWxwYXRoKGRlc3QsIHJvb3QpCiAgICAgICAgICAgIHJlbGRlc3QucmVwbGFjZShvcy5zZXAsICcvJykKICAgICAgICAgICAgcmVjb3JkX2RhdGEuYXBwZW5kKChyZWxkZXN0LCBkZXN0aW5hdGlvbi5kaWdlc3QoKSwgZGVzdGluYXRpb24ubGVuZ3RoKSkKICAgICAgICAgICAgZGVzdGluYXRpb24uY2xvc2UoKQogICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQogICAgICAgICAgICAjIHByZXNlcnZlIGF0dHJpYnV0ZXMgKGVzcGVjaWFsbHkgK3ggYml0IGZvciBzY3JpcHRzKQogICAgICAgICAgICBhdHRycyA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICBpZiBhdHRyczogICMgdGVuZHMgdG8gYmUgMCBpZiBXaW5kb3dzLgogICAgICAgICAgICAgICAgb3MuY2htb2QoZGVzdCwgaW5mby5leHRlcm5hbF9hdHRyID4+IDE2KQoKICAgICAgICByZWNvcmRfbmFtZSA9IG9zLnBhdGguam9pbihyb290LCBzZWxmLnJlY29yZF9uYW1lKQogICAgICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZF9uYW1lLCAndysnKSBhcyByZWNvcmRfZmlsZToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihyZWNvcmRfZmlsZSkKICAgICAgICAgICAgZm9yIHJlbGRlc3QsIGRpZ2VzdCwgbGVuZ3RoIGluIHNvcnRlZChyZWNvcmRfZGF0YSk6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHJlbGRlc3QsIGRpZ2VzdCwgbGVuZ3RoKSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChzZWxmLnJlY29yZF9uYW1lLCAnJywgJycpKQoKICAgIGRlZiB2ZXJpZnkoc2VsZiwgemlwZmlsZT1Ob25lKToKICAgICAgICAiIiJDb25maWd1cmUgdGhlIFZlcmlmeWluZ1ppcEZpbGUgYHppcGZpbGVgIGJ5IHZlcmlmeWluZyBpdHMgc2lnbmF0dXJlIAogICAgICAgIGFuZCBzZXR0aW5nIGV4cGVjdGVkIGhhc2hlcyBmb3IgZXZlcnkgaGFzaCBpbiBSRUNPUkQuCiAgICAgICAgQ2FsbGVyIG11c3QgY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IGNvbXBsZXRlbHkgcmVhZGluZyAKICAgICAgICBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIChlLmcuIHdpdGggZXh0cmFjdGFsbCkuIiIiCiAgICAgICAgc2lnID0gTm9uZQogICAgICAgIGlmIHppcGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgemlwZmlsZSA9IHNlbGYuemlwZmlsZQogICAgICAgIHppcGZpbGUuc3RyaWN0ID0gVHJ1ZQoKICAgICAgICByZWNvcmRfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQnKSkKICAgICAgICBzaWdfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQuandzJykpCiAgICAgICAgIyB0b2xlcmF0ZSBzL21pbWUgc2lnbmF0dXJlczoKICAgICAgICBzbWltZV9zaWdfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQucDdzJykpCiAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChyZWNvcmRfbmFtZSwgTm9uZSkKICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKHNpZ19uYW1lLCBOb25lKQogICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2goc21pbWVfc2lnX25hbWUsIE5vbmUpCiAgICAgICAgcmVjb3JkID0gemlwZmlsZS5yZWFkKHJlY29yZF9uYW1lKQoKICAgICAgICByZWNvcmRfZGlnZXN0ID0gdXJsc2FmZV9iNjRlbmNvZGUoaGFzaGxpYi5zaGEyNTYocmVjb3JkKS5kaWdlc3QoKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpZyA9IGZyb21fanNvbihuYXRpdmUoemlwZmlsZS5yZWFkKHNpZ19uYW1lKSkpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiAgIyBubyBzaWduYXR1cmUKICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIHNpZzoKICAgICAgICAgICAgaGVhZGVycywgcGF5bG9hZCA9IHNpZ25hdHVyZXMudmVyaWZ5KHNpZykKICAgICAgICAgICAgaWYgcGF5bG9hZFsnaGFzaCddICE9ICJzaGEyNTY9IiArIG5hdGl2ZShyZWNvcmRfZGlnZXN0KToKICAgICAgICAgICAgICAgIG1zZyA9ICJSRUNPUkQuc2lnIGNsYWltZWQgUkVDT1JEIGhhc2ggezB9ICE9IGNvbXB1dGVkIGhhc2ggezF9LiIKICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZShtc2cuZm9ybWF0KHBheWxvYWRbJ2hhc2gnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZShyZWNvcmRfZGlnZXN0KSkpCgogICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoKG5hdGl2ZShyKSBmb3IgciBpbiByZWNvcmQuc3BsaXRsaW5lcygpKSkKCiAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgIGZpbGVuYW1lID0gcm93WzBdCiAgICAgICAgICAgIGhhc2ggPSByb3dbMV0KICAgICAgICAgICAgaWYgbm90IGhhc2g6CiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gKHJlY29yZF9uYW1lLCBzaWdfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXMgaGFzIG5vIGhhc2ghXG4iICUgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBhbGdvLCBkYXRhID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgYXNzZXJ0IGFsZ28gPT0gInNoYTI1NiIsICJVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSIKICAgICAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChmaWxlbmFtZSwgdXJsc2FmZV9iNjRkZWNvZGUoYmluYXJ5KGRhdGEpKSkKCgpjbGFzcyBWZXJpZnlpbmdaaXBGaWxlKHppcGZpbGUuWmlwRmlsZSk6CiAgICAiIiJaaXBGaWxlIHRoYXQgY2FuIGFzc2VydCB0aGF0IGVhY2ggb2YgaXRzIGV4dHJhY3RlZCBjb250ZW50cyBtYXRjaGVzCiAgICBhbiBleHBlY3RlZCBzaGEyNTYgaGFzaC4gTm90ZSB0aGF0IGVhY2ggZmlsZSBtdXN0IGJlIGNvbXBsZXRseSByZWFkIGluIAogICAgb3JkZXIgZm9yIGl0cyBoYXNoIHRvIGJlIGNoZWNrZWQuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGU9InIiLAogICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX1NUT1JFRCwKICAgICAgICAgICAgICAgICBhbGxvd1ppcDY0PUZhbHNlKToKICAgICAgICB6aXBmaWxlLlppcEZpbGUuX19pbml0X18oc2VsZiwgZmlsZSwgbW9kZSwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQpCgogICAgICAgIHNlbGYuc3RyaWN0ID0gRmFsc2UKICAgICAgICBzZWxmLl9leHBlY3RlZF9oYXNoZXMgPSB7fQogICAgICAgIHNlbGYuX2hhc2hfYWxnb3JpdGhtID0gaGFzaGxpYi5zaGEyNTYKCiAgICBkZWYgc2V0X2V4cGVjdGVkX2hhc2goc2VsZiwgbmFtZSwgaGFzaCk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIG5hbWU6IG5hbWUgb2YgemlwIGVudHJ5CiAgICAgICAgOnBhcmFtIGhhc2g6IGJ5dGVzIG9mIGhhc2ggKG9yIE5vbmUgZm9yICJkb24ndCBjYXJlIikKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0gPSBoYXNoCgogICAgZGVmIG9wZW4oc2VsZiwgbmFtZV9vcl9pbmZvLCBtb2RlPSJyIiwgcHdkPU5vbmUpOgogICAgICAgICIiIlJldHVybiBmaWxlLWxpa2Ugb2JqZWN0IGZvciAnbmFtZScuIiIiCiAgICAgICAgIyBBIG5vbi1tb25rZXktcGF0Y2hlZCB2ZXJzaW9uIHdvdWxkIGNvbnRhaW4gbW9zdCBvZiB6aXBmaWxlLnB5CiAgICAgICAgZWYgPSB6aXBmaWxlLlppcEZpbGUub3BlbihzZWxmLCBuYW1lX29yX2luZm8sIG1vZGUsIHB3ZCkKICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfb3JfaW5mbywgemlwZmlsZS5aaXBJbmZvKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVfb3JfaW5mby5maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lX29yX2luZm8KICAgICAgICBpZiAobmFtZSBpbiBzZWxmLl9leHBlY3RlZF9oYXNoZXMKICAgICAgICAgICAgYW5kIHNlbGYuX2V4cGVjdGVkX2hhc2hlc1tuYW1lXSAhPSBOb25lKToKICAgICAgICAgICAgZXhwZWN0ZWRfaGFzaCA9IHNlbGYuX2V4cGVjdGVkX2hhc2hlc1tuYW1lXQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBfdXBkYXRlX2NyY19vcmlnID0gZWYuX3VwZGF0ZV9jcmMKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignTmVlZCBaaXBFeHRGaWxlLl91cGRhdGVfY3JjIHRvIGltcGxlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGhhc2ggdmVyaWZpY2F0aW9uIChpbiBQeXRob24gPj0gMi43KScpCiAgICAgICAgICAgICAgICByZXR1cm4gZWYKICAgICAgICAgICAgcnVubmluZ19oYXNoID0gc2VsZi5faGFzaF9hbGdvcml0aG0oKQogICAgICAgICAgICBpZiBoYXNhdHRyKGVmLCAnX2VvZicpOiAgIyBweTMzCiAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9jcmMoZGF0YSk6CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyhkYXRhKQogICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBlZi5fZW9mIGFuZCBydW5uaW5nX2hhc2guZGlnZXN0KCkgIT0gZXhwZWN0ZWRfaGFzaDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJCYWQgaGFzaCBmb3IgZmlsZSAlciIgJSBlZi5uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY3JjKGRhdGEsIGVvZj1Ob25lKToKICAgICAgICAgICAgICAgICAgICBfdXBkYXRlX2NyY19vcmlnKGRhdGEsIGVvZj1lb2YpCiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19oYXNoLnVwZGF0ZShkYXRhKQogICAgICAgICAgICAgICAgICAgIGlmIGVvZiBhbmQgcnVubmluZ19oYXNoLmRpZ2VzdCgpICE9IGV4cGVjdGVkX2hhc2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGhhc2ggZm9yIGZpbGUgJXIiICUgZWYubmFtZSkKICAgICAgICAgICAgZWYuX3VwZGF0ZV9jcmMgPSBfdXBkYXRlX2NyYwogICAgICAgIGVsaWYgc2VsZi5zdHJpY3QgYW5kIG5hbWUgbm90IGluIHNlbGYuX2V4cGVjdGVkX2hhc2hlczoKICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJObyBleHBlY3RlZCBoYXNoIGZvciBmaWxlICVyIiAlIGVmLm5hbWUpCiAgICAgICAgcmV0dXJuIGVmCgogICAgZGVmIHBvcChzZWxmKToKICAgICAgICAiIiJUcnVuY2F0ZSB0aGUgbGFzdCBmaWxlIG9mZiB0aGlzIHppcGZpbGUuCiAgICAgICAgQXNzdW1lcyBpbmZvbGlzdCgpIGlzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBmaWxlcyAodHJ1ZSBmb3IKICAgICAgICBvcmRpbmFyeSB6aXAgZmlsZXMgY3JlYXRlZCBieSBQeXRob24pIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZnA6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gcG9wIGZyb20gWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQogICAgICAgIGxhc3QgPSBzZWxmLmluZm9saXN0KCkucG9wKCkKICAgICAgICBkZWwgc2VsZi5OYW1lVG9JbmZvW2xhc3QuZmlsZW5hbWVdCiAgICAgICAgc2VsZi5mcC5zZWVrKGxhc3QuaGVhZGVyX29mZnNldCwgb3MuU0VFS19TRVQpCiAgICAgICAgc2VsZi5mcC50cnVuY2F0ZSgpCiAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQpQSwMEFAAAAAAAAAAhADkodwucLQAAnC0AACYAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9tZXRhZGF0YS5weSIiIgpUb29scyBmb3IgY29udmVydGluZyBvbGQtIHRvIG5ldy1zdHlsZSBtZXRhZGF0YS4KIiIiCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmZyb20gLnBrZ2luZm8gaW1wb3J0IHJlYWRfcGtnX2luZm8KZnJvbSAudXRpbCBpbXBvcnQgT3JkZXJlZERlZmF1bHREaWN0CnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIE9yZGVyZWREaWN0ID0gZGljdAoKaW1wb3J0IHJlCmltcG9ydCBvcy5wYXRoCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgZW1haWwucGFyc2VyCgpmcm9tIC4gaW1wb3J0IF9fdmVyc2lvbl9fIGFzIHdoZWVsX3ZlcnNpb24KCk1FVEFEQVRBX1ZFUlNJT04gPSAiMi4wIgoKUExVUkFMX0ZJRUxEUyA9IHsgImNsYXNzaWZpZXIiIDogImNsYXNzaWZpZXJzIiwKICAgICAgICAgICAgICAgICAgInByb3ZpZGVzX2Rpc3QiIDogInByb3ZpZGVzIiwKICAgICAgICAgICAgICAgICAgInByb3ZpZGVzX2V4dHJhIiA6ICJleHRyYXMiIH0KClNLSVBfRklFTERTID0gc2V0KCkKCkNPTlRBQ1RfRklFTERTID0gKCh7ImVtYWlsIjoiYXV0aG9yX2VtYWlsIiwgIm5hbWUiOiAiYXV0aG9yIn0sCiAgICAgICAgICAgICAgICAgICAgImF1dGhvciIpLAogICAgICAgICAgICAgICAgICAoeyJlbWFpbCI6Im1haW50YWluZXJfZW1haWwiLCAibmFtZSI6ICJtYWludGFpbmVyIn0sCiAgICAgICAgICAgICAgICAgICAgIm1haW50YWluZXIiKSkKCiMgY29tbW9ubHkgZmlsbGVkIG91dCBhcyAiVU5LTk9XTiIgYnkgZGlzdHV0aWxzOgpVTktOT1dOX0ZJRUxEUyA9IHNldCgoImF1dGhvciIsICJhdXRob3JfZW1haWwiLCAicGxhdGZvcm0iLCAiaG9tZV9wYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICJsaWNlbnNlIikpCgojIFdoZWVsIGl0c2VsZiBpcyBwcm9iYWJseSB0aGUgb25seSBwcm9ncmFtIHRoYXQgdXNlcyBub24tZXh0cmFzIG1hcmtlcnMKIyBpbiBNRVRBREFUQS9QS0ctSU5GTy4gU3VwcG9ydCBpdHMgc3ludGF4IHdpdGggdGhlIGV4dHJhIGF0IHRoZSBlbmQgb25seS4KRVhUUkFfUkUgPSByZS5jb21waWxlKCIiIl4oP1A8cGFja2FnZT4uKj8pKDtccyooP1A8Y29uZGl0aW9uPi4qPykoZXh0cmEgPT0gJyg/UDxleHRyYT4uKj8pJyk/KSQiIiIpCktFWVdPUkRTX1JFID0gcmUuY29tcGlsZSgiW1wwLSxdKyIpCgpNYXlSZXF1aXJlc0tleSA9IG5hbWVkdHVwbGUoJ01heVJlcXVpcmVzS2V5JywgKCdjb25kaXRpb24nLCAnZXh0cmEnKSkKCmRlZiB1bmlxdWUoaXRlcmFibGUpOgogICAgIiIiCiAgICBZaWVsZCB1bmlxdWUgdmFsdWVzIGluIGl0ZXJhYmxlLCBwcmVzZXJ2aW5nIG9yZGVyLgogICAgIiIiCiAgICBzZWVuID0gc2V0KCkKICAgIGZvciB2YWx1ZSBpbiBpdGVyYWJsZToKICAgICAgICBpZiBub3QgdmFsdWUgaW4gc2VlbjoKICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpCiAgICAgICAgICAgIHlpZWxkIHZhbHVlCgoKZGVmIGhhbmRsZV9yZXF1aXJlcyhtZXRhZGF0YSwgcGtnX2luZm8sIGtleSk6CiAgICAiIiIKICAgIFBsYWNlIHRoZSBydW50aW1lIHJlcXVpcmVtZW50cyBmcm9tIHBrZ19pbmZvIGludG8gbWV0YWRhdGEuCiAgICAiIiIKICAgIG1heV9yZXF1aXJlcyA9IE9yZGVyZWREZWZhdWx0RGljdChsaXN0KQogICAgZm9yIHZhbHVlIGluIHNvcnRlZChwa2dfaW5mby5nZXRfYWxsKGtleSkpOgogICAgICAgIGV4dHJhX21hdGNoID0gRVhUUkFfUkUuc2VhcmNoKHZhbHVlKQogICAgICAgIGlmIGV4dHJhX21hdGNoOgogICAgICAgICAgICBncm91cGRpY3QgPSBleHRyYV9tYXRjaC5ncm91cGRpY3QoKQogICAgICAgICAgICBjb25kaXRpb24gPSBncm91cGRpY3RbJ2NvbmRpdGlvbiddCiAgICAgICAgICAgIGV4dHJhID0gZ3JvdXBkaWN0WydleHRyYSddCiAgICAgICAgICAgIHBhY2thZ2UgPSBncm91cGRpY3RbJ3BhY2thZ2UnXQogICAgICAgICAgICBpZiBjb25kaXRpb24uZW5kc3dpdGgoJyBhbmQgJyk6CiAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb25bOi01XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbmRpdGlvbiwgZXh0cmEgPSBOb25lLCBOb25lCiAgICAgICAgICAgIHBhY2thZ2UgPSB2YWx1ZQogICAgICAgIGtleSA9IE1heVJlcXVpcmVzS2V5KGNvbmRpdGlvbiwgZXh0cmEpCiAgICAgICAgbWF5X3JlcXVpcmVzW2tleV0uYXBwZW5kKHBhY2thZ2UpCgogICAgaWYgbWF5X3JlcXVpcmVzOgogICAgICAgIG1ldGFkYXRhWydydW5fcmVxdWlyZXMnXSA9IFtdCiAgICAgICAgZGVmIHNvcnRfa2V5KGl0ZW0pOgogICAgICAgICAgICAjIEJvdGggY29uZGl0aW9uIGFuZCBleHRyYSBjb3VsZCBiZSBOb25lLCB3aGljaCBjYW4ndCBiZSBjb21wYXJlZAogICAgICAgICAgICAjIGFnYWluc3Qgc3RyaW5ncyBpbiBQeXRob24gMy4KICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGl0ZW0KICAgICAgICAgICAgaWYga2V5LmNvbmRpdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIHJldHVybiBrZXkuY29uZGl0aW9uCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc29ydGVkKG1heV9yZXF1aXJlcy5pdGVtcygpLCBrZXk9c29ydF9rZXkpOgogICAgICAgICAgICBtYXlfcmVxdWlyZW1lbnQgPSBPcmRlcmVkRGljdCgoKCdyZXF1aXJlcycsIHZhbHVlKSwpKQogICAgICAgICAgICBpZiBrZXkuZXh0cmE6CiAgICAgICAgICAgICAgICBtYXlfcmVxdWlyZW1lbnRbJ2V4dHJhJ10gPSBrZXkuZXh0cmEKICAgICAgICAgICAgaWYga2V5LmNvbmRpdGlvbjoKICAgICAgICAgICAgICAgIG1heV9yZXF1aXJlbWVudFsnZW52aXJvbm1lbnQnXSA9IGtleS5jb25kaXRpb24KICAgICAgICAgICAgbWV0YWRhdGFbJ3J1bl9yZXF1aXJlcyddLmFwcGVuZChtYXlfcmVxdWlyZW1lbnQpCgogICAgICAgIGlmIG5vdCAnZXh0cmFzJyBpbiBtZXRhZGF0YToKICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddID0gW10KICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10uZXh0ZW5kKFtrZXkuZXh0cmEgZm9yIGtleSBpbiBtYXlfcmVxdWlyZXMua2V5cygpIGlmIGtleS5leHRyYV0pCgoKZGVmIHBrZ2luZm9fdG9fZGljdChwYXRoLCBkaXN0cmlidXRpb249Tm9uZSk6CiAgICAiIiIKICAgIENvbnZlcnQgUEtHLUlORk8gdG8gYSBwcm90b3R5cGUgTWV0YWRhdGEgMi4wIChQRVAgNDI2KSBkaWN0LgoKICAgIFRoZSBkZXNjcmlwdGlvbiBpcyBpbmNsdWRlZCB1bmRlciB0aGUga2V5IFsnZGVzY3JpcHRpb24nXSByYXRoZXIgdGhhbgogICAgYmVpbmcgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZpbGUuCgogICAgcGF0aDogcGF0aCB0byBQS0ctSU5GTyBmaWxlCiAgICBkaXN0cmlidXRpb246IG9wdGlvbmFsIGRpc3R1dGlscyBEaXN0cmlidXRpb24oKQogICAgIiIiCgogICAgbWV0YWRhdGEgPSBPcmRlcmVkRGVmYXVsdERpY3QobGFtYmRhOiBPcmRlcmVkRGVmYXVsdERpY3QobGFtYmRhOiBPcmRlcmVkRGVmYXVsdERpY3QoT3JkZXJlZERpY3QpKSkKICAgIG1ldGFkYXRhWyJnZW5lcmF0b3IiXSA9ICJiZGlzdF93aGVlbCAoIiArIHdoZWVsX3ZlcnNpb24gKyAiKSIKICAgIHRyeToKICAgICAgICB1bmljb2RlCiAgICAgICAgcGtnX2luZm8gPSByZWFkX3BrZ19pbmZvKHBhdGgpCiAgICBleGNlcHQgTmFtZUVycm9yOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBwa2dfaW5mb19maWxlOgogICAgICAgICAgICBwa2dfaW5mbyA9IGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cihwa2dfaW5mb19maWxlLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykpCiAgICBkZXNjcmlwdGlvbiA9IE5vbmUKCiAgICBpZiBwa2dfaW5mb1snU3VtbWFyeSddOgogICAgICAgIG1ldGFkYXRhWydzdW1tYXJ5J10gPSBwa2dpbmZvX3VuaWNvZGUocGtnX2luZm8sICdTdW1tYXJ5JykKICAgICAgICBkZWwgcGtnX2luZm9bJ1N1bW1hcnknXQoKICAgIGlmIHBrZ19pbmZvWydEZXNjcmlwdGlvbiddOgogICAgICAgIGRlc2NyaXB0aW9uID0gZGVkZW50X2Rlc2NyaXB0aW9uKHBrZ19pbmZvKQogICAgICAgIGRlbCBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQogICAgZWxzZToKICAgICAgICBwYXlsb2FkID0gcGtnX2luZm8uZ2V0X3BheWxvYWQoKQogICAgICAgIGlmIGlzaW5zdGFuY2UocGF5bG9hZCwgYnl0ZXMpOgogICAgICAgICAgICAjIEF2b2lkIGEgUHl0aG9uIDIgVW5pY29kZSBlcnJvci4KICAgICAgICAgICAgIyBXZSBzdGlsbCBzdWZmZXIgPyBnbHlwaHMgb24gUHl0aG9uIDMuCiAgICAgICAgICAgIHBheWxvYWQgPSBwYXlsb2FkLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHBheWxvYWQ6CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcGF5bG9hZAoKICAgIGlmIGRlc2NyaXB0aW9uOgogICAgICAgIHBrZ19pbmZvWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb24KCiAgICBmb3Iga2V5IGluIHNvcnRlZCh1bmlxdWUoay5sb3dlcigpIGZvciBrIGluIHBrZ19pbmZvLmtleXMoKSkpOgogICAgICAgIGxvd19rZXkgPSBrZXkucmVwbGFjZSgnLScsICdfJykKCiAgICAgICAgaWYgbG93X2tleSBpbiBTS0lQX0ZJRUxEUzoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbG93X2tleSBpbiBVTktOT1dOX0ZJRUxEUyBhbmQgcGtnX2luZm8uZ2V0KGtleSkgPT0gJ1VOS05PV04nOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBsb3dfa2V5IGluIHNvcnRlZChQTFVSQUxfRklFTERTKToKICAgICAgICAgICAgbWV0YWRhdGFbUExVUkFMX0ZJRUxEU1tsb3dfa2V5XV0gPSBwa2dfaW5mby5nZXRfYWxsKGtleSkKCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICJyZXF1aXJlc19kaXN0IjoKICAgICAgICAgICAgaGFuZGxlX3JlcXVpcmVzKG1ldGFkYXRhLCBwa2dfaW5mbywga2V5KQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gJ3Byb3ZpZGVzX2V4dHJhJzoKICAgICAgICAgICAgaWYgbm90ICdleHRyYXMnIGluIG1ldGFkYXRhOgogICAgICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddID0gW10KICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddLmV4dGVuZChwa2dfaW5mby5nZXRfYWxsKGtleSkpCgogICAgICAgIGVsaWYgbG93X2tleSA9PSAnaG9tZV9wYWdlJzoKICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsncHJvamVjdF91cmxzJ10gPSB7J0hvbWUnOnBrZ19pbmZvW2tleV19CgogICAgICAgIGVsaWYgbG93X2tleSA9PSAna2V5d29yZHMnOgogICAgICAgICAgICBtZXRhZGF0YVsna2V5d29yZHMnXSA9IEtFWVdPUkRTX1JFLnNwbGl0KHBrZ19pbmZvW2tleV0pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhW2xvd19rZXldID0gcGtnX2luZm9ba2V5XQoKICAgIG1ldGFkYXRhWydtZXRhZGF0YV92ZXJzaW9uJ10gPSBNRVRBREFUQV9WRVJTSU9OCgogICAgaWYgJ2V4dHJhcycgaW4gbWV0YWRhdGE6CiAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddID0gc29ydGVkKHNldChtZXRhZGF0YVsnZXh0cmFzJ10pKQoKICAgICMgaW5jbHVkZSBtb3JlIGluZm9ybWF0aW9uIGlmIGRpc3RyaWJ1dGlvbiBpcyBhdmFpbGFibGUKICAgIGlmIGRpc3RyaWJ1dGlvbjoKICAgICAgICBmb3IgcmVxdWlyZXMsIGF0dHIgaW4gKCgndGVzdF9yZXF1aXJlcycsICd0ZXN0c19yZXF1aXJlJyksKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzID0gZ2V0YXR0cihkaXN0cmlidXRpb24sIGF0dHIpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVtZW50cywgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgbmV3X3JlcXVpcmVtZW50cyA9IHNvcnRlZChjb252ZXJ0X3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW3JlcXVpcmVzXSA9IFt7J3JlcXVpcmVzJzpuZXdfcmVxdWlyZW1lbnRzfV0KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICMgaGFuZGxlIGNvbnRhY3RzCiAgICBjb250YWN0cyA9IFtdCiAgICBmb3IgY29udGFjdF90eXBlLCByb2xlIGluIENPTlRBQ1RfRklFTERTOgogICAgICAgIGNvbnRhY3QgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgZm9yIGtleSBpbiBzb3J0ZWQoY29udGFjdF90eXBlKToKICAgICAgICAgICAgaWYgY29udGFjdF90eXBlW2tleV0gaW4gbWV0YWRhdGE6CiAgICAgICAgICAgICAgICBjb250YWN0W2tleV0gPSBtZXRhZGF0YS5wb3AoY29udGFjdF90eXBlW2tleV0pCiAgICAgICAgaWYgY29udGFjdDoKICAgICAgICAgICAgY29udGFjdFsncm9sZSddID0gcm9sZQogICAgICAgICAgICBjb250YWN0cy5hcHBlbmQoY29udGFjdCkKICAgIGlmIGNvbnRhY3RzOgogICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ2NvbnRhY3RzJ10gPSBjb250YWN0cwoKICAgICMgY29udmVydCBlbnRyeSBwb2ludHMgdG8gZXhwb3J0cwogICAgdHJ5OgogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHBhdGgpLCAiZW50cnlfcG9pbnRzLnR4dCIpLCAiciIpIGFzIGVwX2ZpbGU6CiAgICAgICAgICAgIGVwX21hcCA9IHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZV9tYXAoZXBfZmlsZS5yZWFkKCkpCiAgICAgICAgZXhwb3J0cyA9IE9yZGVyZWREaWN0KCkKICAgICAgICBmb3IgZ3JvdXAsIGl0ZW1zIGluIHNvcnRlZChlcF9tYXAuaXRlbXMoKSk6CiAgICAgICAgICAgIGV4cG9ydHNbZ3JvdXBdID0gT3JkZXJlZERpY3QoKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQobWFwKHN0ciwgaXRlbXMudmFsdWVzKCkpKToKICAgICAgICAgICAgICAgIG5hbWUsIGV4cG9ydCA9IGl0ZW0uc3BsaXQoJyA9ICcsIDEpCiAgICAgICAgICAgICAgICBleHBvcnRzW2dyb3VwXVtuYW1lXSA9IGV4cG9ydAogICAgICAgIGlmIGV4cG9ydHM6CiAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ10gPSBleHBvcnRzCiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBwYXNzCgogICAgIyBjb3B5IGNvbnNvbGVfc2NyaXB0cyBlbnRyeSBwb2ludHMgdG8gY29tbWFuZHMKICAgIGlmICdweXRob24uZXhwb3J0cycgaW4gbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXToKICAgICAgICBmb3IgKGVwX3NjcmlwdCwgd3JhcF9zY3JpcHQpIGluICgoJ2NvbnNvbGVfc2NyaXB0cycsICd3cmFwX2NvbnNvbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2d1aV9zY3JpcHRzJywgJ3dyYXBfZ3VpJykpOgogICAgICAgICAgICBpZiBlcF9zY3JpcHQgaW4gbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXToKICAgICAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5jb21tYW5kcyddW3dyYXBfc2NyaXB0XSA9IFwKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddW2VwX3NjcmlwdF0KCiAgICByZXR1cm4gbWV0YWRhdGEKCmRlZiByZXF1aXJlc190b19yZXF1aXJlc19kaXN0KHJlcXVpcmVtZW50KToKICAgICIiIkNvbXBvc2UgdGhlIHZlcnNpb24gcHJlZGljYXRlcyBmb3IgcmVxdWlyZW1lbnQgaW4gUEVQIDM0NSBmYXNoaW9uLiIiIgogICAgcmVxdWlyZXNfZGlzdCA9IFtdCiAgICBmb3Igb3AsIHZlciBpbiByZXF1aXJlbWVudC5zcGVjczoKICAgICAgICByZXF1aXJlc19kaXN0LmFwcGVuZChvcCArIHZlcikKICAgIGlmIG5vdCByZXF1aXJlc19kaXN0OgogICAgICAgIHJldHVybiAnJwogICAgcmV0dXJuICIgKCVzKSIgJSAnLCcuam9pbihyZXF1aXJlc19kaXN0KQoKZGVmIGNvbnZlcnRfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cyk6CiAgICAiIiJZaWVsZCBSZXF1aXJlcy1EaXN0OiBzdHJpbmdzIGZvciBwYXJzZWQgcmVxdWlyZW1lbnRzIHN0cmluZ3MuIiIiCiAgICBmb3IgcmVxIGluIHJlcXVpcmVtZW50czoKICAgICAgICBwYXJzZWRfcmVxdWlyZW1lbnQgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKHJlcSkKICAgICAgICBzcGVjID0gcmVxdWlyZXNfdG9fcmVxdWlyZXNfZGlzdChwYXJzZWRfcmVxdWlyZW1lbnQpCiAgICAgICAgZXh0cmFzID0gIiwiLmpvaW4ocGFyc2VkX3JlcXVpcmVtZW50LmV4dHJhcykKICAgICAgICBpZiBleHRyYXM6CiAgICAgICAgICAgIGV4dHJhcyA9ICJbJXNdIiAlIGV4dHJhcwogICAgICAgIHlpZWxkIChwYXJzZWRfcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lICsgZXh0cmFzICsgc3BlYykKCmRlZiBnZW5lcmF0ZV9yZXF1aXJlbWVudHMoZXh0cmFzX3JlcXVpcmUpOgogICAgIiIiCiAgICBDb252ZXJ0IHJlcXVpcmVtZW50cyBmcm9tIGEgc2V0dXAoKS1zdHlsZSBkaWN0aW9uYXJ5IHRvICgnUmVxdWlyZXMtRGlzdCcsICdyZXF1aXJlbWVudCcpCiAgICBhbmQgKCdQcm92aWRlcy1FeHRyYScsICdleHRyYScpIHR1cGxlcy4KCiAgICBleHRyYXNfcmVxdWlyZSBpcyBhIGRpY3Rpb25hcnkgb2Yge2V4dHJhOiBbcmVxdWlyZW1lbnRzXX0gYXMgcGFzc2VkIHRvIHNldHVwKCksCiAgICB1c2luZyB0aGUgZW1wdHkgZXh0cmEgeycnOiBbcmVxdWlyZW1lbnRzXX0gdG8gaG9sZCBpbnN0YWxsX3JlcXVpcmVzLgogICAgIiIiCiAgICBmb3IgZXh0cmEsIGRlcGVuZHMgaW4gZXh0cmFzX3JlcXVpcmUuaXRlbXMoKToKICAgICAgICBjb25kaXRpb24gPSAnJwogICAgICAgIGlmIGV4dHJhIGFuZCAnOicgaW4gZXh0cmE6ICAjIHNldHVwdG9vbHMgZXh0cmE6Y29uZGl0aW9uIHN5bnRheAogICAgICAgICAgICBleHRyYSwgY29uZGl0aW9uID0gZXh0cmEuc3BsaXQoJzonLCAxKQogICAgICAgICAgICBleHRyYSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9leHRyYShleHRyYSkKICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgeWllbGQgKCdQcm92aWRlcy1FeHRyYScsIGV4dHJhKQogICAgICAgICAgICBpZiBjb25kaXRpb246CiAgICAgICAgICAgICAgICBjb25kaXRpb24gKz0gIiBhbmQgIgogICAgICAgICAgICBjb25kaXRpb24gKz0gImV4dHJhID09ICclcyciICUgZXh0cmEKICAgICAgICBpZiBjb25kaXRpb246CiAgICAgICAgICAgIGNvbmRpdGlvbiA9ICc7ICcgKyBjb25kaXRpb24KICAgICAgICBmb3IgbmV3X3JlcSBpbiBjb252ZXJ0X3JlcXVpcmVtZW50cyhkZXBlbmRzKToKICAgICAgICAgICAgeWllbGQgKCdSZXF1aXJlcy1EaXN0JywgbmV3X3JlcSArIGNvbmRpdGlvbikKCmRlZiBwa2dpbmZvX3RvX21ldGFkYXRhKGVnZ19pbmZvX3BhdGgsIHBrZ2luZm9fcGF0aCk6CiAgICAiIiIKICAgIENvbnZlcnQgLmVnZy1pbmZvIGRpcmVjdG9yeSB3aXRoIFBLRy1JTkZPIHRvIHRoZSBNZXRhZGF0YSAxLjMgYWthCiAgICBvbGQtZHJhZnQgTWV0YWRhdGEgMi4wIGZvcm1hdC4KICAgICIiIgogICAgcGtnX2luZm8gPSByZWFkX3BrZ19pbmZvKHBrZ2luZm9fcGF0aCkKICAgIHBrZ19pbmZvLnJlcGxhY2VfaGVhZGVyKCdNZXRhZGF0YS1WZXJzaW9uJywgJzIuMCcpCiAgICByZXF1aXJlc19wYXRoID0gb3MucGF0aC5qb2luKGVnZ19pbmZvX3BhdGgsICdyZXF1aXJlcy50eHQnKQogICAgaWYgb3MucGF0aC5leGlzdHMocmVxdWlyZXNfcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHJlcXVpcmVzX3BhdGgpIGFzIHJlcXVpcmVzX2ZpbGU6CiAgICAgICAgICAgIHJlcXVpcmVzID0gcmVxdWlyZXNfZmlsZS5yZWFkKCkKICAgICAgICBmb3IgZXh0cmEsIHJlcXMgaW4gc29ydGVkKHBrZ19yZXNvdXJjZXMuc3BsaXRfc2VjdGlvbnMocmVxdWlyZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4WzBdIG9yICcnKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZ2VuZXJhdGVfcmVxdWlyZW1lbnRzKHtleHRyYTogcmVxc30pOgogICAgICAgICAgICAgICAgcGtnX2luZm9baXRlbVswXV0gPSBpdGVtWzFdCgogICAgZGVzY3JpcHRpb24gPSBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQogICAgaWYgZGVzY3JpcHRpb246CiAgICAgICAgcGtnX2luZm8uc2V0X3BheWxvYWQoZGVkZW50X2Rlc2NyaXB0aW9uKHBrZ19pbmZvKSkKICAgICAgICBkZWwgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KCiAgICByZXR1cm4gcGtnX2luZm8KCgpkZWYgcGtnaW5mb191bmljb2RlKHBrZ19pbmZvLCBmaWVsZCk6CiAgICAiIiJIYWNrIHRvIGNvYXggVW5pY29kZSBvdXQgb2YgYW4gZW1haWwgTWVzc2FnZSgpIC0gUHl0aG9uIDMuMysiIiIKICAgIHRleHQgPSBwa2dfaW5mb1tmaWVsZF0KICAgIGZpZWxkID0gZmllbGQubG93ZXIoKQogICAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKICAgICAgICBpZiBub3QgaGFzYXR0cihwa2dfaW5mbywgJ3Jhd19pdGVtcycpOiAgIyBQeXRob24gMy4yCiAgICAgICAgICAgIHJldHVybiBzdHIodGV4dCkKICAgICAgICBmb3IgaXRlbSBpbiBwa2dfaW5mby5yYXdfaXRlbXMoKToKICAgICAgICAgICAgaWYgaXRlbVswXS5sb3dlcigpID09IGZpZWxkOgogICAgICAgICAgICAgICAgdGV4dCA9IGl0ZW1bMV0uZW5jb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBicmVhawoKICAgIHJldHVybiB0ZXh0CgoKZGVmIGRlZGVudF9kZXNjcmlwdGlvbihwa2dfaW5mbyk6CiAgICAiIiIKICAgIERlZGVudCBhbmQgY29udmVydCBwa2dfaW5mb1snRGVzY3JpcHRpb24nXSB0byBVbmljb2RlLgogICAgIiIiCiAgICBkZXNjcmlwdGlvbiA9IHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCgogICAgIyBQeXRob24gMyBVbmljb2RlIGhhbmRsaW5nLCBzb3J0YS4KICAgIHN1cnJvZ2F0ZXMgPSBGYWxzZQogICAgaWYgbm90IGlzaW5zdGFuY2UoZGVzY3JpcHRpb24sIHN0cik6CiAgICAgICAgc3Vycm9nYXRlcyA9IFRydWUKICAgICAgICBkZXNjcmlwdGlvbiA9IHBrZ2luZm9fdW5pY29kZShwa2dfaW5mbywgJ0Rlc2NyaXB0aW9uJykKCiAgICBkZXNjcmlwdGlvbl9saW5lcyA9IGRlc2NyaXB0aW9uLnNwbGl0bGluZXMoKQogICAgZGVzY3JpcHRpb25fZGVkZW50ID0gJ1xuJy5qb2luKAogICAgICAgICAgICAjIGlmIHRoZSBmaXJzdCBsaW5lIG9mIGxvbmdfZGVzY3JpcHRpb24gaXMgYmxhbmssCiAgICAgICAgICAgICMgdGhlIGZpcnN0IGxpbmUgaGVyZSB3aWxsIGJlIGluZGVudGVkLgogICAgICAgICAgICAoZGVzY3JpcHRpb25fbGluZXNbMF0ubHN0cmlwKCksCiAgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJ1xuJy5qb2luKGRlc2NyaXB0aW9uX2xpbmVzWzE6XSkpLAogICAgICAgICAgICAgJ1xuJykpCgogICAgaWYgc3Vycm9nYXRlczoKICAgICAgICBkZXNjcmlwdGlvbl9kZWRlbnQgPSBkZXNjcmlwdGlvbl9kZWRlbnRcCiAgICAgICAgICAgICAgICAuZW5jb2RlKCJ1dGY4IilcCiAgICAgICAgICAgICAgICAuZGVjb2RlKCJhc2NpaSIsICJzdXJyb2dhdGVlc2NhcGUiKQoKICAgIHJldHVybiBkZXNjcmlwdGlvbl9kZWRlbnQKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgaW1wb3J0IHN5cywgcHByaW50CiAgICBwcHJpbnQucHByaW50KHBrZ2luZm9fdG9fZGljdChzeXMuYXJndlsxXSkpClBLAwQUAAAAAAAAACEAYfY10moEAABqBAAAIwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BhdGhzLnB5IiIiCkluc3RhbGxhdGlvbiBwYXRocy4KCk1hcCB0aGUgLmRhdGEvIHN1YmRpcmVjdG9yeSBuYW1lcyB0byBpbnN0YWxsIHBhdGhzLgoiIiIKCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5kaXN0IGFzIGRpc3QKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgYXMgaW5zdGFsbAoKZGVmIGdldF9pbnN0YWxsX2NvbW1hbmQobmFtZSk6CiAgICAjIGxhdGUgYmluZGluZyBkdWUgdG8gcG90ZW50aWFsIG1vbmtleXBhdGNoaW5nCiAgICBkID0gZGlzdC5EaXN0cmlidXRpb24oeyduYW1lJzpuYW1lfSkKICAgIGkgPSBpbnN0YWxsLmluc3RhbGwoZCkKICAgIGkuZmluYWxpemVfb3B0aW9ucygpCiAgICByZXR1cm4gaQoKZGVmIGdldF9pbnN0YWxsX3BhdGhzKG5hbWUpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIChkaXN0dXRpbHMpIGluc3RhbGwgcGF0aHMgZm9yIHRoZSBuYW1lZCBkaXN0LgogICAgCiAgICBBIGRpY3Qgd2l0aCAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpIGtleXMuCiAgICAiIiIKICAgIHBhdGhzID0ge30KCiAgICBpID0gZ2V0X2luc3RhbGxfY29tbWFuZChuYW1lKQoKICAgIGZvciBrZXkgaW4gaW5zdGFsbC5TQ0hFTUVfS0VZUzoKICAgICAgICBwYXRoc1trZXldID0gZ2V0YXR0cihpLCAnaW5zdGFsbF8nICsga2V5KQoKICAgICMgcGlwIHVzZXMgYSBzaW1pbGFyIHBhdGggYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSdzIChyZWFkLW9ubHkpCiAgICAjIGluY2x1ZGUgZGlyZWN0b3J5OgogICAgaWYgaGFzYXR0cihzeXMsICdyZWFsX3ByZWZpeCcpOiAgIyB2aXJ0dWFsZW52CiAgICAgICAgcGF0aHNbJ2hlYWRlcnMnXSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQoKICAgIHJldHVybiBwYXRocwpQSwMEFAAAAAAAAAAhAGtiVnzFFgAAxRYAACgAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wZXA0MjV0YWdzLnB5IiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hIG5vY292ZXIKICAgICMgUHl0aG9uIDwgMi43CiAgICBpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZyBhcyBzeXNjb25maWcKaW1wb3J0IGRpc3R1dGlscy51dGlsCgoKZGVmIGdldF9jb25maWdfdmFyKHZhcik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcih2YXIpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBwaXAgSXNzdWUgIzEwNzQKICAgICAgICB3YXJuaW5ncy53YXJuKCJ7MH0iLmZvcm1hdChlKSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2FiYnJfaW1wbCgpOgogICAgIiIiUmV0dXJuIGFiYnJldmlhdGVkIGltcGxlbWVudGF0aW9uIG5hbWUuIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICAgICAgcHlpbXBsID0gJ3BwJwogICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHB5aW1wbCA9ICdqeScKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgICAgIHB5aW1wbCA9ICdpcCcKICAgIGVsc2U6CiAgICAgICAgcHlpbXBsID0gJ2NwJwogICAgcmV0dXJuIHB5aW1wbAoKCmRlZiBnZXRfaW1wbF92ZXIoKToKICAgICIiIlJldHVybiBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLiIiIgogICAgaW1wbF92ZXIgPSBnZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgaW1wbF92ZXIgb3IgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgaW1wbF92ZXIgPSAnJy5qb2luKG1hcChzdHIsIGdldF9pbXBsX3ZlcnNpb25faW5mbygpKSkKICAgIHJldHVybiBpbXBsX3ZlcgoKCmRlZiBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKToKICAgICIiIlJldHVybiBzeXMudmVyc2lvbl9pbmZvLWxpa2UgdHVwbGUgZm9yIHVzZSBpbiBkZWNyZW1lbnRpbmcgdGhlIG1pbm9yCiAgICB2ZXJzaW9uLiIiIgogICAgaWYgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgIyBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yODgyCiAgICAgICAgcmV0dXJuIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb25maWcgdmFyaWFibGUgJ3swfScgaXMgdW5zZXQsIFB5dGhvbiBBQkkgdGFnIG1heSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIuZm9ybWF0KHZhciksIFJ1bnRpbWVXYXJuaW5nLCAyKQogICAgICAgIHJldHVybiBmYWxsYmFjaygpCiAgICByZXR1cm4gdmFsID09IGV4cGVjdGVkCgoKZGVmIGdldF9hYmlfdGFnKCk6CiAgICAiIiJSZXR1cm4gdGhlIEFCSSB0YWcgYmFzZWQgb24gU09BQkkgKGlmIGF2YWlsYWJsZSkgb3IgZW11bGF0ZSBTT0FCSQogICAgKENQeXRob24gMiwgUHlQeSkuIiIiCiAgICBzb2FiaSA9IGdldF9jb25maWdfdmFyKCdTT0FCSScpCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICBpZiBub3Qgc29hYmkgYW5kIGltcGwgaW4gKCdjcCcsICdwcCcpIGFuZCBoYXNhdHRyKHN5cywgJ21heHVuaWNvZGUnKToKICAgICAgICBkID0gJycKICAgICAgICBtID0gJycKICAgICAgICB1ID0gJycKICAgICAgICBpZiBnZXRfZmxhZygnUHlfREVCVUcnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JyksCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIGQgPSAnZCcKICAgICAgICBpZiBnZXRfZmxhZygnV0lUSF9QWU1BTExPQycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpbXBsID09ICdjcCcsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIG0gPSAnbScKICAgICAgICBpZiBnZXRfZmxhZygnUHlfVU5JQ09ERV9TSVpFJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN5cy5tYXh1bmljb2RlID09IDB4MTBmZmZmLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPTQsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMykpKSBcCiAgICAgICAgICAgICAgICBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICAgICAgdSA9ICd1JwogICAgICAgIGFiaSA9ICclcyVzJXMlcyVzJyAlIChpbXBsLCBnZXRfaW1wbF92ZXIoKSwgZCwgbSwgdSkKICAgIGVsaWYgc29hYmkgYW5kIHNvYWJpLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICAgICAgYWJpID0gJ2NwJyArIHNvYWJpLnNwbGl0KCctJylbMV0KICAgIGVsaWYgc29hYmk6CiAgICAgICAgYWJpID0gc29hYmkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGVsc2U6CiAgICAgICAgYWJpID0gTm9uZQogICAgcmV0dXJuIGFiaQoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICMgcGlwIHB1bGwgcmVxdWVzdCAjMzQ5NwogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIHN1cHBsaWVkX3BsYXRmb3JtPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwgCiAgICAgICAgb3IgTm9uZS4gVGhlIGZpcnN0IHZlcnNpb24gd2lsbCBiZSBhc3N1bWVkIHRvIHN1cHBvcnQgb3VyIEFCSS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KICAgIAogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKICAgICAgICAgICAgCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICAKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGdldF9hYmlfdGFnKCkKICAgIGlmIGFiaToKICAgICAgICBhYmlzWzA6MF0gPSBbYWJpXQogCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgcGxhdGZvcm1zID0gW10KICAgIGlmIHN1cHBsaWVkX3BsYXRmb3JtOgogICAgICAgIHBsYXRmb3Jtcy5hcHBlbmQoc3VwcGxpZWRfcGxhdGZvcm0pCiAgICBwbGF0Zm9ybXMuYXBwZW5kKGdldF9wbGF0Zm9ybSgpKQogICAgCiAgICAjIEN1cnJlbnQgdmVyc2lvbiwgY3VycmVudCBBUEkgKGJ1aWx0IHNwZWNpZmljYWxseSBmb3Igb3VyIFB5dGhvbik6CiAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgZm9yIGFyY2ggaW4gcGxhdGZvcm1zOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCBhYmksIGFyY2gpKQoKICAgICMgYWJpMyBtb2R1bGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbgogICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICMgYWJpMyB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4yCiAgICAgICAgaWYgdmVyc2lvbiBpbiAoJzMxJywgJzMwJyk6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZm9yIGFiaSBpbiBhYmkzczogICAjIGVtcHR5IHNldCBpZiBub3QgUHl0aG9uIDMKICAgICAgICAgICAgZm9yIGFyY2ggaW4gcGxhdGZvcm1zOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgYnV0IHJlcXVpcmVzIG91ciBpbXBsZW1lbnRhdGlvbjoKICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb24pLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUgCiAgICAgICAgICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXVswXSksICdub25lJywgJ2FueScpKSAKICAgIAogICAgIyBNYWpvciBQeXRob24gdmVyc2lvbiArIHBsYXRmb3JtOyBlLmcuIGJpbmFyaWVzIG5vdCB1c2luZyB0aGUgUHl0aG9uIEFQSQogICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKICAgICAgICAKICAgIHJldHVybiBzdXBwb3J0ZWQKUEsDBBQAAAAAAAAAIQCAQxigyQQAAMkEAAAlAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGtnaW5mby5weSIiIlRvb2xzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIFBLRy1JTkZPIC8gTUVUQURBVEEgd2l0aG91dCBjYXJpbmcKYWJvdXQgdGhlIGVuY29kaW5nLiIiIgoKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgoKdHJ5OgogICAgdW5pY29kZQogICAgX1BZMyA9IEZhbHNlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfUFkzID0gVHJ1ZQoKaWYgbm90IF9QWTM6CiAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCiAgICAKICAgIGRlZiByZWFkX3BrZ19pbmZvX2J5dGVzKGJ5dGVzdHIpOgogICAgICAgIHJldHVybiBQYXJzZXIoKS5wYXJzZXN0cihieXRlc3RyKQoKICAgIGRlZiByZWFkX3BrZ19pbmZvKHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAiciIpIGFzIGhlYWRlcnM6CiAgICAgICAgICAgIG1lc3NhZ2UgPSBQYXJzZXIoKS5wYXJzZShoZWFkZXJzKQogICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgZGVmIHdyaXRlX3BrZ19pbmZvKHBhdGgsIG1lc3NhZ2UpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAndycpIGFzIG1ldGFkYXRhOgogICAgICAgICAgICBHZW5lcmF0b3IobWV0YWRhdGEsIG1heGhlYWRlcmxlbj0wKS5mbGF0dGVuKG1lc3NhZ2UpIAoKZWxzZToKICAgIGZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBCeXRlc0dlbmVyYXRvcgogICAgZGVmIHJlYWRfcGtnX2luZm9fYnl0ZXMoYnl0ZXN0cik6CiAgICAgICAgaGVhZGVycyA9IGJ5dGVzdHIuZGVjb2RlKGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikKICAgICAgICBtZXNzYWdlID0gUGFyc2VyKCkucGFyc2VzdHIoaGVhZGVycykKICAgICAgICByZXR1cm4gbWVzc2FnZQoKICAgIGRlZiByZWFkX3BrZ19pbmZvKHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAiciIsIAogICAgICAgICAgICAgICAgICBlbmNvZGluZz0iYXNjaWkiLCAKICAgICAgICAgICAgICAgICAgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKSBhcyBoZWFkZXJzOgogICAgICAgICAgICBtZXNzYWdlID0gUGFyc2VyKCkucGFyc2UoaGVhZGVycykKICAgICAgICByZXR1cm4gbWVzc2FnZQoKICAgIGRlZiB3cml0ZV9wa2dfaW5mbyhwYXRoLCBtZXNzYWdlKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgb3V0OgogICAgICAgICAgICBCeXRlc0dlbmVyYXRvcihvdXQsIG1heGhlYWRlcmxlbj0wKS5mbGF0dGVuKG1lc3NhZ2UpCgpQSwMEFAAAAAAAAAAhAPxM5kzDDgAAww4AADEAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5IiIiCkNyZWF0ZSBhbmQgdmVyaWZ5IGp3cy1qcyBmb3JtYXQgRWQyNTUxOSBzaWduYXR1cmVzLgoiIiIKCl9fYWxsX18gPSBbICdzaWduJywgJ3ZlcmlmeScgXQoKaW1wb3J0IGpzb24KZnJvbSAuLnV0aWwgaW1wb3J0IHVybHNhZmVfYjY0ZGVjb2RlLCB1cmxzYWZlX2I2NGVuY29kZSwgbmF0aXZlLCBiaW5hcnkKCmVkMjU1MTlsbCA9IE5vbmUKCkFMRyA9ICJFZDI1NTE5IgoKZGVmIGdldF9lZDI1NTE5bGwoKToKICAgICIiIkxhenkgaW1wb3J0LWFuZC10ZXN0IG9mIGVkMjU1MTkgbW9kdWxlIiIiCiAgICBnbG9iYWwgZWQyNTUxOWxsCiAgICAKICAgIGlmIG5vdCBlZDI1NTE5bGw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZWQyNTUxOWxsICMgZmFzdCAodGhvdXNhbmRzIC8gcykKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBPU0Vycm9yKTogIyBwcmFnbWEgbm9jb3ZlcgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGVkMjU1MTlweSBhcyBlZDI1NTE5bGwgIyBwdXJlIFB5dGhvbiAoaHVuZHJlZHMgLyBzKQogICAgICAgIHRlc3QoKQogICAgCiAgICByZXR1cm4gZWQyNTUxOWxsCgpkZWYgc2lnbihwYXlsb2FkLCBrZXlwYWlyKToKICAgICIiIlJldHVybiBhIEpXUy1KUyBmb3JtYXQgc2lnbmF0dXJlIGdpdmVuIGEgSlNPTi1zZXJpYWxpemFibGUgcGF5bG9hZCBhbmQgCiAgICBhbiBFZDI1NTE5IGtleXBhaXIuIiIiCiAgICBnZXRfZWQyNTUxOWxsKCkKICAgICMKICAgIGhlYWRlciA9IHsKICAgICAgICAgICAgICAgICJhbGciOiBBTEcsCiAgICAgICAgICAgICAgICAiandrIjogewogICAgICAgICAgICAgICAgICAgICJrdHkiOiBBTEcsICMgYWxnIC0+IGt0eSBpbiBqd2stMDguCiAgICAgICAgICAgICAgICAgICAgInZrIjogbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGtleXBhaXIudmspKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgCiAgICBlbmNvZGVkX2hlYWRlciA9IHVybHNhZmVfYjY0ZW5jb2RlKGJpbmFyeShqc29uLmR1bXBzKGhlYWRlciwgc29ydF9rZXlzPVRydWUpKSkKICAgIGVuY29kZWRfcGF5bG9hZCA9IHVybHNhZmVfYjY0ZW5jb2RlKGJpbmFyeShqc29uLmR1bXBzKHBheWxvYWQsIHNvcnRfa2V5cz1UcnVlKSkpCiAgICBzZWN1cmVkX2lucHV0ID0gYiIuIi5qb2luKChlbmNvZGVkX2hlYWRlciwgZW5jb2RlZF9wYXlsb2FkKSkKICAgIHNpZ19tc2cgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ24oc2VjdXJlZF9pbnB1dCwga2V5cGFpci5zaykKICAgIHNpZ25hdHVyZSA9IHNpZ19tc2dbOmVkMjU1MTlsbC5TSUdOQVRVUkVCWVRFU10KICAgIGVuY29kZWRfc2lnbmF0dXJlID0gdXJsc2FmZV9iNjRlbmNvZGUoc2lnbmF0dXJlKQogICAgCiAgICByZXR1cm4geyJyZWNpcGllbnRzIjogCiAgICAgICAgICAgIFt7ImhlYWRlciI6bmF0aXZlKGVuY29kZWRfaGVhZGVyKSwKICAgICAgICAgICAgICJzaWduYXR1cmUiOm5hdGl2ZShlbmNvZGVkX3NpZ25hdHVyZSl9XSwKICAgICAgICAgICAgInBheWxvYWQiOiBuYXRpdmUoZW5jb2RlZF9wYXlsb2FkKX0KCmRlZiBhc3NlcnRUcnVlKGNvbmRpdGlvbiwgbWVzc2FnZT0iIik6CiAgICBpZiBub3QgY29uZGl0aW9uOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobWVzc2FnZSkKICAgIApkZWYgdmVyaWZ5KGp3c2pzKToKICAgICIiIlJldHVybiAoZGVjb2RlZCBoZWFkZXJzLCBwYXlsb2FkKSBpZiBhbGwgc2lnbmF0dXJlcyBpbiBqd3NqcyBhcmUKICAgIGNvbnNpc3RlbnQsIGVsc2UgcmFpc2UgVmFsdWVFcnJvci4KICAgIAogICAgQ2FsbGVyIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhlIGtleXMgYXJlIGFjdHVhbGx5IHRydXN0ZWQuIiIiCiAgICBnZXRfZWQyNTUxOWxsKCkgICAgCiAgICAjIFhYWCBmb3JiaWQgZHVwbGljYXRlIGtleXMgaW4gSlNPTiBpbnB1dCB1c2luZyBvYmplY3RfcGFpcnNfaG9vayAoMi43KykKICAgIHJlY2lwaWVudHMgPSBqd3Nqc1sicmVjaXBpZW50cyJdCiAgICBlbmNvZGVkX3BheWxvYWQgPSBiaW5hcnkoandzanNbInBheWxvYWQiXSkKICAgIGhlYWRlcnMgPSBbXQogICAgZm9yIHJlY2lwaWVudCBpbiByZWNpcGllbnRzOgogICAgICAgIGFzc2VydFRydWUobGVuKHJlY2lwaWVudCkgPT0gMiwgIlVua25vd24gcmVjaXBpZW50IGtleSB7MH0iLmZvcm1hdChyZWNpcGllbnQpKQogICAgICAgIGggPSBiaW5hcnkocmVjaXBpZW50WyJoZWFkZXIiXSkKICAgICAgICBzID0gYmluYXJ5KHJlY2lwaWVudFsic2lnbmF0dXJlIl0pCiAgICAgICAgaGVhZGVyID0ganNvbi5sb2FkcyhuYXRpdmUodXJsc2FmZV9iNjRkZWNvZGUoaCkpKQogICAgICAgIGFzc2VydFRydWUoaGVhZGVyWyJhbGciXSA9PSBBTEcsIAogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgYWxnb3JpdGhtIHswfSIuZm9ybWF0KGhlYWRlclsiYWxnIl0pKQogICAgICAgIGlmICJhbGciIGluIGhlYWRlclsiandrIl0gYW5kIG5vdCAia3R5IiBpbiBoZWFkZXJbImp3ayJdOgogICAgICAgICAgICBoZWFkZXJbImp3ayJdWyJrdHkiXSA9IGhlYWRlclsiandrIl1bImFsZyJdICMgYi93IGZvciBKV0sgPCAtMDgKICAgICAgICBhc3NlcnRUcnVlKGhlYWRlclsiandrIl1bImt0eSJdID09IEFMRywgIyB0cnVlIGZvciBFZDI1NTE5CiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBrZXkgdHlwZSB7MH0iLmZvcm1hdChoZWFkZXJbImp3ayJdWyJrdHkiXSkpCiAgICAgICAgdmsgPSB1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkoaGVhZGVyWyJqd2siXVsidmsiXSkpCiAgICAgICAgc2VjdXJlZF9pbnB1dCA9IGIiLiIuam9pbigoaCwgZW5jb2RlZF9wYXlsb2FkKSkKICAgICAgICBzaWcgPSB1cmxzYWZlX2I2NGRlY29kZShzKQogICAgICAgIHNpZ19tc2cgPSBzaWcrc2VjdXJlZF9pbnB1dAogICAgICAgIHZlcmlmaWVkX2lucHV0ID0gbmF0aXZlKGVkMjU1MTlsbC5jcnlwdG9fc2lnbl9vcGVuKHNpZ19tc2csIHZrKSkKICAgICAgICB2ZXJpZmllZF9oZWFkZXIsIHZlcmlmaWVkX3BheWxvYWQgPSB2ZXJpZmllZF9pbnB1dC5zcGxpdCgnLicpCiAgICAgICAgdmVyaWZpZWRfaGVhZGVyID0gYmluYXJ5KHZlcmlmaWVkX2hlYWRlcikKICAgICAgICBkZWNvZGVkX2hlYWRlciA9IG5hdGl2ZSh1cmxzYWZlX2I2NGRlY29kZSh2ZXJpZmllZF9oZWFkZXIpKQogICAgICAgIGhlYWRlcnMuYXBwZW5kKGpzb24ubG9hZHMoZGVjb2RlZF9oZWFkZXIpKQoKICAgIHZlcmlmaWVkX3BheWxvYWQgPSBiaW5hcnkodmVyaWZpZWRfcGF5bG9hZCkKCiAgICAjIG9ubHkgcmV0dXJuIGhlYWRlciwgcGF5bG9hZCB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGNyeXB0byBsaWJyYXJ5LgogICAgcGF5bG9hZCA9IGpzb24ubG9hZHMobmF0aXZlKHVybHNhZmVfYjY0ZGVjb2RlKHZlcmlmaWVkX3BheWxvYWQpKSkKCiAgICByZXR1cm4gaGVhZGVycywgcGF5bG9hZAoKZGVmIHRlc3QoKToKICAgIGtwID0gZWQyNTUxOWxsLmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgcGF5bG9hZCA9IHsndGVzdCc6ICdvbnN0YXJ0dXAnfQogICAgandzanMgPSBqc29uLmxvYWRzKGpzb24uZHVtcHMoc2lnbihwYXlsb2FkLCBrcCkpKQogICAgdmVyaWZ5KGp3c2pzKQogICAgandzanNbJ3BheWxvYWQnXSArPSAneCcKICAgIHRyeToKICAgICAgICB2ZXJpZnkoandzanMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOiAjIHByYWdtYSBubyBjb3ZlcgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiTm8gZXJyb3IgZnJvbSBiYWQgd2hlZWwuc2lnbmF0dXJlcyBwYXlsb2FkLiIpCgpQSwMEFAAAAAAAAAAhAPxQ/+BjGgAAYxoAAC4AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2RqYmVjLnB5IyBFZDI1NTE5IGRpZ2l0YWwgc2lnbmF0dXJlcwojIEJhc2VkIG9uIGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvL3B5dGhvbi9lZDI1NTE5LnB5CiMgU2VlIGFsc28gaHR0cDovL2VkMjU1MTkuY3IueXAudG8vc29mdHdhcmUuaHRtbAojIEFkYXB0ZWQgYnkgUm9uIEdhcnJldAojIFNwZWQgdXAgY29uc2lkZXJhYmx5IHVzaW5nIGNvb3JkaW5hdGUgdHJhbnNmb3JtcyBmb3VuZCBvbjoKIyBodHRwOi8vd3d3Lmh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbAojIFNwZWNpZmljYWxseSBhZGQtMjAwOC1od2NkLTQgYW5kIGRibC0yMDA4LWh3Y2QKCnRyeTogIyBwcmFnbWEgbm9jb3ZlcgogICAgdW5pY29kZQogICAgUFkzID0gRmFsc2UKICAgIGRlZiBhc2J5dGVzKGIpOgogICAgICAgICIiIkNvbnZlcnQgYXJyYXkgb2YgaW50ZWdlcnMgdG8gYnl0ZSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gJycuam9pbihjaHIoeCkgZm9yIHggaW4gYikKICAgIGRlZiBqb2luYnl0ZXMoYik6CiAgICAgICAgIiIiQ29udmVydCBhcnJheSBvZiBieXRlcyB0byBieXRlIHN0cmluZyIiIgogICAgICAgIHJldHVybiAnJy5qb2luKGIpCiAgICBkZWYgYml0KGgsIGkpOgogICAgICAgICIiIlJldHVybiBpJ3RoIGJpdCBvZiBieXRlc3RyaW5nIGgiIiIKICAgICAgICByZXR1cm4gKG9yZChoW2kvLzhdKSA+PiAoaSU4KSkgJiAxCgpleGNlcHQgTmFtZUVycm9yOiAjIHByYWdtYSBub2NvdmVyCiAgICBQWTMgPSBUcnVlCiAgICBhc2J5dGVzID0gYnl0ZXMKICAgIGpvaW5ieXRlcyA9IGJ5dGVzCiAgICBkZWYgYml0KGgsIGkpOgogICAgICAgIHJldHVybiAoaFtpLy84XSA+PiAoaSU4KSkgJiAxCgppbXBvcnQgaGFzaGxpYgoKYiA9IDI1NgpxID0gMioqMjU1IC0gMTkKbCA9IDIqKjI1MiArIDI3NzQyMzE3Nzc3MzcyMzUzNTM1ODUxOTM3NzkwODgzNjQ4NDkzCgpkZWYgSChtKToKICAgIHJldHVybiBoYXNobGliLnNoYTUxMihtKS5kaWdlc3QoKQoKZGVmIGV4cG1vZChiLCBlLCBtKToKICAgIGlmIGUgPT0gMDogcmV0dXJuIDEKICAgIHQgPSBleHBtb2QoYiwgZSAvLyAyLCBtKSAqKiAyICUgbQogICAgaWYgZSAmIDE6IHQgPSAodCAqIGIpICUgbQogICAgcmV0dXJuIHQKCiMgQ2FuIHByb2JhYmx5IGdldCBzb21lIGV4dHJhIHNwZWVkdXAgaGVyZSBieSByZXBsYWNpbmcgdGhpcyB3aXRoCiMgYW4gZXh0ZW5kZWQtZXVjbGlkZWFuLCBidXQgcGVyZm9ybWFuY2Ugc2VlbXMgT0sgd2l0aG91dCB0aGF0CmRlZiBpbnYoeCk6CiAgICByZXR1cm4gZXhwbW9kKHgsIHEtMiwgcSkKCmQgPSAtMTIxNjY1ICogaW52KDEyMTY2NikKSSA9IGV4cG1vZCgyLChxLTEpLy80LHEpCgpkZWYgeHJlY292ZXIoeSk6CiAgICB4eCA9ICh5KnktMSkgKiBpbnYoZCp5KnkrMSkKICAgIHggPSBleHBtb2QoeHgsKHErMykvLzgscSkKICAgIGlmICh4KnggLSB4eCkgJSBxICE9IDA6IHggPSAoeCpJKSAlIHEKICAgIGlmIHggJSAyICE9IDA6IHggPSBxLXgKICAgIHJldHVybiB4CgpCeSA9IDQgKiBpbnYoNSkKQnggPSB4cmVjb3ZlcihCeSkKQiA9IFtCeCAlIHEsQnkgJSBxXQoKI2RlZiBlZHdhcmRzKFAsUSk6CiMgICAgeDEgPSBQWzBdCiMgICAgeTEgPSBQWzFdCiMgICAgeDIgPSBRWzBdCiMgICAgeTIgPSBRWzFdCiMgICAgeDMgPSAoeDEqeTIreDIqeTEpICogaW52KDErZCp4MSp4Mip5MSp5MikKIyAgICB5MyA9ICh5MSp5Mit4MSp4MikgKiBpbnYoMS1kKngxKngyKnkxKnkyKQojICAgIHJldHVybiAoeDMgJSBxLHkzICUgcSkKCiNkZWYgc2NhbGFybXVsdChQLGUpOgojICAgIGlmIGUgPT0gMDogcmV0dXJuIFswLDFdCiMgICAgUSA9IHNjYWxhcm11bHQoUCxlLzIpCiMgICAgUSA9IGVkd2FyZHMoUSxRKQojICAgIGlmIGUgJiAxOiBRID0gZWR3YXJkcyhRLFApCiMgICAgcmV0dXJuIFEKCiMgRmFzdGVyICghKSB2ZXJzaW9uIGJhc2VkIG9uOgojIGh0dHA6Ly93d3cuaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sCgpkZWYgeHB0X2FkZChwdDEsIHB0Mik6CiAgICAoWDEsIFkxLCBaMSwgVDEpID0gcHQxCiAgICAoWDIsIFkyLCBaMiwgVDIpID0gcHQyCiAgICBBID0gKChZMS1YMSkqKFkyK1gyKSkgJSBxCiAgICBCID0gKChZMStYMSkqKFkyLVgyKSkgJSBxCiAgICBDID0gKFoxKjIqVDIpICUgcQogICAgRCA9IChUMSoyKloyKSAlIHEKICAgIEUgPSAoRCtDKSAlIHEKICAgIEYgPSAoQi1BKSAlIHEKICAgIEcgPSAoQitBKSAlIHEKICAgIEggPSAoRC1DKSAlIHEKICAgIFgzID0gKEUqRikgJSBxCiAgICBZMyA9IChHKkgpICUgcQogICAgWjMgPSAoRipHKSAlIHEKICAgIFQzID0gKEUqSCkgJSBxCiAgICByZXR1cm4gKFgzLCBZMywgWjMsIFQzKQoKZGVmIHhwdF9kb3VibGUgKHB0KToKICAgIChYMSwgWTEsIFoxLCBfKSA9IHB0CiAgICBBID0gKFgxKlgxKQogICAgQiA9IChZMSpZMSkKICAgIEMgPSAoMipaMSpaMSkKICAgIEQgPSAoLUEpICUgcQogICAgSiA9IChYMStZMSkgJSBxCiAgICBFID0gKEoqSi1BLUIpICUgcQogICAgRyA9IChEK0IpICUgcQogICAgRiA9IChHLUMpICUgcQogICAgSCA9IChELUIpICUgcQogICAgWDMgPSAoRSpGKSAlIHEKICAgIFkzID0gKEcqSCkgJSBxCiAgICBaMyA9IChGKkcpICUgcQogICAgVDMgPSAoRSpIKSAlIHEKICAgIHJldHVybiAoWDMsIFkzLCBaMywgVDMpCgpkZWYgcHRfeGZvcm0gKHB0KToKICAgICh4LCB5KSA9IHB0CiAgICByZXR1cm4gKHgsIHksIDEsICh4KnkpJXEpCgpkZWYgcHRfdW54Zm9ybSAocHQpOgogICAgKHgsIHksIHosIF8pID0gcHQKICAgIHJldHVybiAoKHgqaW52KHopKSVxLCAoeSppbnYoeikpJXEpCgpkZWYgeHB0X211bHQgKHB0LCBuKToKICAgIGlmIG49PTA6IHJldHVybiBwdF94Zm9ybSgoMCwxKSkKICAgIF8gPSB4cHRfZG91YmxlKHhwdF9tdWx0KHB0LCBuPj4xKSkKICAgIHJldHVybiB4cHRfYWRkKF8sIHB0KSBpZiBuJjEgZWxzZSBfCgpkZWYgc2NhbGFybXVsdChwdCwgZSk6CiAgICByZXR1cm4gcHRfdW54Zm9ybSh4cHRfbXVsdChwdF94Zm9ybShwdCksIGUpKQoKZGVmIGVuY29kZWludCh5KToKICAgIGJpdHMgPSBbKHkgPj4gaSkgJiAxIGZvciBpIGluIHJhbmdlKGIpXQogICAgZSA9IFsoc3VtKFtiaXRzW2kgKiA4ICsgal0gPDwgaiBmb3IgaiBpbiByYW5nZSg4KV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShiLy84KV0KICAgIHJldHVybiBhc2J5dGVzKGUpCgpkZWYgZW5jb2RlcG9pbnQoUCk6CiAgICB4ID0gUFswXQogICAgeSA9IFBbMV0KICAgIGJpdHMgPSBbKHkgPj4gaSkgJiAxIGZvciBpIGluIHJhbmdlKGIgLSAxKV0gKyBbeCAmIDFdCiAgICBlID0gWyhzdW0oW2JpdHNbaSAqIDggKyBqXSA8PCBqIGZvciBqIGluIHJhbmdlKDgpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGIvLzgpXQogICAgcmV0dXJuIGFzYnl0ZXMoZSkKICAgIApkZWYgcHVibGlja2V5KHNrKToKICAgIGggPSBIKHNrKQogICAgYSA9IDIqKihiLTIpICsgc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgzLGItMikpCiAgICBBID0gc2NhbGFybXVsdChCLGEpCiAgICByZXR1cm4gZW5jb2RlcG9pbnQoQSkKCmRlZiBIaW50KG0pOgogICAgaCA9IEgobSkKICAgIHJldHVybiBzdW0oMioqaSAqIGJpdChoLGkpIGZvciBpIGluIHJhbmdlKDIqYikpCgpkZWYgc2lnbmF0dXJlKG0sc2sscGspOgogICAgaCA9IEgoc2spCiAgICBhID0gMioqKGItMikgKyBzdW0oMioqaSAqIGJpdChoLGkpIGZvciBpIGluIHJhbmdlKDMsYi0yKSkKICAgIGludGVyID0gam9pbmJ5dGVzKFtoW2ldIGZvciBpIGluIHJhbmdlKGIvLzgsYi8vNCldKQogICAgciA9IEhpbnQoaW50ZXIgKyBtKQogICAgUiA9IHNjYWxhcm11bHQoQixyKQogICAgUyA9IChyICsgSGludChlbmNvZGVwb2ludChSKSArIHBrICsgbSkgKiBhKSAlIGwKICAgIHJldHVybiBlbmNvZGVwb2ludChSKSArIGVuY29kZWludChTKQoKZGVmIGlzb25jdXJ2ZShQKToKICAgIHggPSBQWzBdCiAgICB5ID0gUFsxXQogICAgcmV0dXJuICgteCp4ICsgeSp5IC0gMSAtIGQqeCp4KnkqeSkgJSBxID09IDAKCmRlZiBkZWNvZGVpbnQocyk6CiAgICByZXR1cm4gc3VtKDIqKmkgKiBiaXQocyxpKSBmb3IgaSBpbiByYW5nZSgwLGIpKQoKZGVmIGRlY29kZXBvaW50KHMpOgogICAgeSA9IHN1bSgyKippICogYml0KHMsaSkgZm9yIGkgaW4gcmFuZ2UoMCxiLTEpKQogICAgeCA9IHhyZWNvdmVyKHkpCiAgICBpZiB4ICYgMSAhPSBiaXQocyxiLTEpOiB4ID0gcS14CiAgICBQID0gW3gseV0KICAgIGlmIG5vdCBpc29uY3VydmUoUCk6IHJhaXNlIEV4Y2VwdGlvbigiZGVjb2RpbmcgcG9pbnQgdGhhdCBpcyBub3Qgb24gY3VydmUiKQogICAgcmV0dXJuIFAKCmRlZiBjaGVja3ZhbGlkKHMsIG0sIHBrKToKICAgIGlmIGxlbihzKSAhPSBiLy80OiByYWlzZSBFeGNlcHRpb24oInNpZ25hdHVyZSBsZW5ndGggaXMgd3JvbmciKQogICAgaWYgbGVuKHBrKSAhPSBiLy84OiByYWlzZSBFeGNlcHRpb24oInB1YmxpYy1rZXkgbGVuZ3RoIGlzIHdyb25nIikKICAgIFIgPSBkZWNvZGVwb2ludChzWzA6Yi8vOF0pCiAgICBBID0gZGVjb2RlcG9pbnQocGspCiAgICBTID0gZGVjb2RlaW50KHNbYi8vODpiLy80XSkKICAgIGggPSBIaW50KGVuY29kZXBvaW50KFIpICsgcGsgKyBtKQogICAgdjEgPSBzY2FsYXJtdWx0KEIsUykKIyAgdjIgPSBlZHdhcmRzKFIsc2NhbGFybXVsdChBLGgpKQogICAgdjIgPSBwdF91bnhmb3JtKHhwdF9hZGQocHRfeGZvcm0oUiksIHB0X3hmb3JtKHNjYWxhcm11bHQoQSwgaCkpKSkKICAgIHJldHVybiB2MT09djIKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIEN1cnZlMjU1MTkgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGJ5IE1hdHRoZXcgRGVtcHNreSwgZnJvbToKIyBodHRwOi8vY3IueXAudG8vaGlnaHNwZWVkL25hY2xjcnlwdG8tMjAwOTAzMTAucGRmCgojIFAgPSAyICoqIDI1NSAtIDE5ClAgPSBxCkEgPSA0ODY2NjIKCiNkZWYgZXhwbW9kKGIsIGUsIG0pOgojICAgIGlmIGUgPT0gMDogcmV0dXJuIDEKIyAgICB0ID0gZXhwbW9kKGIsIGUgLyAyLCBtKSAqKiAyICUgbQojICAgIGlmIGUgJiAxOiB0ID0gKHQgKiBiKSAlIG0KIyAgICByZXR1cm4gdAoKIyBkZWYgaW52KHgpOiByZXR1cm4gZXhwbW9kKHgsIFAgLSAyLCBQKQoKZGVmIGFkZChuLCBtLCBkKToKICAgICh4biwgem4pID0gbgogICAgKHhtLCB6bSkgPSBtIAogICAgKHhkLCB6ZCkgPSBkCiAgICB4ID0gNCAqICh4bSAqIHhuIC0gem0gKiB6bikgKiogMiAqIHpkCiAgICB6ID0gNCAqICh4bSAqIHpuIC0gem0gKiB4bikgKiogMiAqIHhkCiAgICByZXR1cm4gKHggJSBQLCB6ICUgUCkKCmRlZiBkb3VibGUobik6CiAgICAoeG4sIHpuKSA9IG4KICAgIHggPSAoeG4gKiogMiAtIHpuICoqIDIpICoqIDIKICAgIHogPSA0ICogeG4gKiB6biAqICh4biAqKiAyICsgQSAqIHhuICogem4gKyB6biAqKiAyKQogICAgcmV0dXJuICh4ICUgUCwgeiAlIFApCgpkZWYgY3VydmUyNTUxOShuLCBiYXNlPTkpOgogICAgb25lID0gKGJhc2UsMSkKICAgIHR3byA9IGRvdWJsZShvbmUpCiAgICAjIGYobSkgZXZhbHVhdGVzIHRvIGEgdHVwbGUKICAgICMgY29udGFpbmluZyB0aGUgbXRoIG11bHRpcGxlIGFuZCB0aGUKICAgICMgKG0rMSl0aCBtdWx0aXBsZSBvZiBiYXNlLgogICAgZGVmIGYobSk6CiAgICAgICAgaWYgbSA9PSAxOiByZXR1cm4gKG9uZSwgdHdvKQogICAgICAgIChwbSwgcG0xKSA9IGYobSAvLyAyKQogICAgICAgIGlmIChtICYgMSk6CiAgICAgICAgICAgIHJldHVybiAoYWRkKHBtLCBwbTEsIG9uZSksIGRvdWJsZShwbTEpKQogICAgICAgIHJldHVybiAoZG91YmxlKHBtKSwgYWRkKHBtLCBwbTEsIG9uZSkpCiAgICAoKHgseiksIF8pID0gZihuKQogICAgcmV0dXJuICh4ICogaW52KHopKSAlIFAKCmltcG9ydCByYW5kb20KCmRlZiBnZW5rZXkobj0wKToKICAgIG4gPSBuIG9yIHJhbmRvbS5yYW5kaW50KDAsUCkKICAgIG4gJj0gfjcKICAgIG4gJj0gfigxMjggPDwgOCAqIDMxKQogICAgbiB8PSA2NCA8PCA4ICogMzEKICAgIHJldHVybiBuCgojZGVmIHN0cjJpbnQocyk6CiMgICAgcmV0dXJuIGludChoZXhsaWZ5KHMpLCAxNikKIyAgICAjIHJldHVybiBzdW0ob3JkKHNbaV0pIDw8ICg4ICogaSkgZm9yIGkgaW4gcmFuZ2UoMzIpKQojCiNkZWYgaW50MnN0cihuKToKIyAgICByZXR1cm4gdW5oZXhsaWZ5KCIleCIgJSBuKQojICAgICMgcmV0dXJuICcnLmpvaW4oW2NocigobiA+PiAoOCAqIGkpKSAmIDI1NSkgZm9yIGkgaW4gcmFuZ2UoMzIpXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmRlZiBkc2FfdGVzdCgpOgogICAgaW1wb3J0IG9zCiAgICBtc2cgPSBzdHIocmFuZG9tLnJhbmRpbnQocSxxK3EpKS5lbmNvZGUoJ3V0Zi04JykKICAgIHNrID0gb3MudXJhbmRvbSgzMikKICAgIHBrID0gcHVibGlja2V5KHNrKQogICAgc2lnID0gc2lnbmF0dXJlKG1zZywgc2ssIHBrKQogICAgcmV0dXJuIGNoZWNrdmFsaWQoc2lnLCBtc2csIHBrKQoKZGVmIGRoX3Rlc3QoKToKICAgIHNrMSA9IGdlbmtleSgpCiAgICBzazIgPSBnZW5rZXkoKQogICAgcmV0dXJuIGN1cnZlMjU1MTkoc2sxLCBjdXJ2ZTI1NTE5KHNrMikpID09IGN1cnZlMjU1MTkoc2syLCBjdXJ2ZTI1NTE5KHNrMSkpCgpQSwMEFAAAAAAAAAAhAEwBJT6fBgAAnwYAADIAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2VkMjU1MTlweS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG9zCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmZyb20gLiBpbXBvcnQgZGpiZWMKCl9fYWxsX18gPSBbJ2NyeXB0b19zaWduJywgJ2NyeXB0b19zaWduX29wZW4nLCAnY3J5cHRvX3NpZ25fa2V5cGFpcicsICdLZXlwYWlyJywKICAgICAgICAgICAnUFVCTElDS0VZQllURVMnLCAnU0VDUkVUS0VZQllURVMnLCAnU0lHTkFUVVJFQllURVMnXQoKUFVCTElDS0VZQllURVM9MzIKU0VDUkVUS0VZQllURVM9NjQKU0lHTkFUVVJFQllURVM9NjQKCktleXBhaXIgPSBuYW1lZHR1cGxlKCdLZXlwYWlyJywgKCd2aycsICdzaycpKSAjIHZlcmlmeWluZyBrZXksIHNlY3JldCBrZXkKCmRlZiBjcnlwdG9fc2lnbl9rZXlwYWlyKHNlZWQ9Tm9uZSk6CiAgICAiIiJSZXR1cm4gKHZlcmlmeWluZywgc2VjcmV0KSBrZXkgZnJvbSBhIGdpdmVuIHNlZWQsIG9yIG9zLnVyYW5kb20oMzIpIiIiICAgIAogICAgaWYgc2VlZCBpcyBOb25lOgogICAgICAgIHNlZWQgPSBvcy51cmFuZG9tKFBVQkxJQ0tFWUJZVEVTKQogICAgZWxzZToKICAgICAgICB3YXJuaW5ncy53YXJuKCJlZDI1NTE5bGwgc2hvdWxkIGNob29zZSByYW5kb20gc2VlZC4iLAogICAgICAgICAgICAgICAgICAgICAgUnVudGltZVdhcm5pbmcpCiAgICBpZiBsZW4oc2VlZCkgIT0gMzI6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2VlZCBtdXN0IGJlIDMyIHJhbmRvbSBieXRlcyBvciBOb25lLiIpCiAgICBza2J5dGVzID0gc2VlZAogICAgdmtieXRlcyA9IGRqYmVjLnB1YmxpY2tleShza2J5dGVzKQogICAgcmV0dXJuIEtleXBhaXIodmtieXRlcywgc2tieXRlcyt2a2J5dGVzKQoKCmRlZiBjcnlwdG9fc2lnbihtc2csIHNrKToKICAgICIiIlJldHVybiBzaWduYXR1cmUrbWVzc2FnZSBnaXZlbiBtZXNzYWdlIGFuZCBzZWNyZXQga2V5LgogICAgVGhlIHNpZ25hdHVyZSBpcyB0aGUgZmlyc3QgU0lHTkFUVVJFQllURVMgYnl0ZXMgb2YgdGhlIHJldHVybiB2YWx1ZS4KICAgIEEgY29weSBvZiBtc2cgaXMgaW4gdGhlIHJlbWFpbmRlci4iIiIKICAgIGlmIGxlbihzaykgIT0gU0VDUkVUS0VZQllURVM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQmFkIHNpZ25pbmcga2V5IGxlbmd0aCAlZCIgJSBsZW4oc2spKQogICAgdmtieXRlcyA9IHNrW1BVQkxJQ0tFWUJZVEVTOl0KICAgIHNrYnl0ZXMgPSBza1s6UFVCTElDS0VZQllURVNdCiAgICBzaWcgPSBkamJlYy5zaWduYXR1cmUobXNnLCBza2J5dGVzLCB2a2J5dGVzKQogICAgcmV0dXJuIHNpZyArIG1zZwoKCmRlZiBjcnlwdG9fc2lnbl9vcGVuKHNpZ25lZCwgdmspOgogICAgIiIiUmV0dXJuIG1lc3NhZ2UgZ2l2ZW4gc2lnbmF0dXJlK21lc3NhZ2UgYW5kIHRoZSB2ZXJpZnlpbmcga2V5LiIiIgogICAgaWYgbGVuKHZrKSAhPSBQVUJMSUNLRVlCWVRFUzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJCYWQgdmVyaWZ5aW5nIGtleSBsZW5ndGggJWQiICUgbGVuKHZrKSkKICAgIHJjID0gZGpiZWMuY2hlY2t2YWxpZChzaWduZWRbOlNJR05BVFVSRUJZVEVTXSwgc2lnbmVkW1NJR05BVFVSRUJZVEVTOl0sIHZrKQogICAgaWYgbm90IHJjOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJjICE9IFRydWUiLCByYykgICAgCiAgICByZXR1cm4gc2lnbmVkW1NJR05BVFVSRUJZVEVTOl0KClBLAwQUAAAAAAAAACEA29viLfQMAAD0DAAALQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMva2V5cy5weSIiIlN0b3JlIGFuZCByZXRyaWV2ZSB3aGVlbCBzaWduaW5nIC8gdmVyaWZ5aW5nIGtleXMuCgpHaXZlbiBhIHNjb3BlIChhIHBhY2thZ2UgbmFtZSwgKyBtZWFuaW5nICJhbGwgcGFja2FnZXMiLCBvciAtIG1lYW5pbmcgCiJubyBwYWNrYWdlcyIpLCByZXR1cm4gYSBsaXN0IG9mIHZlcmlmeWluZyBrZXlzIHRoYXQgYXJlIHRydXN0ZWQgZm9yIHRoYXQgCnNjb3BlLgoKR2l2ZW4gYSBwYWNrYWdlIG5hbWUsIHJldHVybiBhIGxpc3Qgb2YgKHNjb3BlLCBrZXkpIHN1Z2dlc3RlZCBrZXlzIHRvIHNpZ24KdGhhdCBwYWNrYWdlIChvbmx5IHRoZSB2ZXJpZnlpbmcga2V5czsgdGhlIHByaXZhdGUgc2lnbmluZyBrZXkgaXMgc3RvcmVkCmVsc2V3aGVyZSkuCgpLZXlzIGhlcmUgYXJlIHJlcHJlc2VudGVkIGFzIHVybHNhZmVfYjY0ZW5jb2RlZCBzdHJpbmdzIHdpdGggbm8gcGFkZGluZy4KClRlbnRhdGl2ZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOgoKIyBsaXN0IHRydXN0cwp3aGVlbCB0cnVzdAojIHRydXN0IGEgcGFydGljdWxhciBrZXkgZm9yIGFsbAp3aGVlbCB0cnVzdCArIGtleQojIHRydXN0IGtleSBmb3IgYmVhZ2xldm90ZQp3aGVlbCB0cnVzdCBiZWFnbGV2b3RlIGtleQojIHN0b3AgdHJ1c3RpbmcgYSBrZXkgZm9yIGFsbAp3aGVlbCB1bnRydXN0ICsga2V5CgojIGdlbmVyYXRlIGEga2V5IHBhaXIKd2hlZWwga2V5Z2VuCgojIGltcG9ydCBhIHNpZ25pbmcga2V5IGZyb20gYSBmaWxlCndoZWVsIGltcG9ydCBrZXlmaWxlCgojIGV4cG9ydCBhIHNpZ25pbmcga2V5CndoZWVsIGV4cG9ydCBrZXkKIiIiCgppbXBvcnQganNvbgppbXBvcnQgb3MucGF0aApmcm9tIC4udXRpbCBpbXBvcnQgbmF0aXZlLCBsb2FkX2NvbmZpZ19wYXRocywgc2F2ZV9jb25maWdfcGF0aAoKY2xhc3MgV2hlZWxLZXlzKG9iamVjdCk6CiAgICBTQ0hFTUEgPSAxCiAgICBDT05GSUdfTkFNRSA9ICd3aGVlbC5qc29uJwogICAgCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5kYXRhID0geydzaWduZXJzJzpbXSwgJ3ZlcmlmaWVycyc6W119CiAgICAgICAgCiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAjIFhYWCBKU09OIGlzIG5vdCBhIGdyZWF0IGRhdGFiYXNlCiAgICAgICAgZm9yIHBhdGggaW4gbG9hZF9jb25maWdfcGF0aHMoJ3doZWVsJyk6CiAgICAgICAgICAgIGNvbmYgPSBvcy5wYXRoLmpvaW4obmF0aXZlKHBhdGgpLCBzZWxmLkNPTkZJR19OQU1FKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjb25mKToKICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25mLCAncicpIGFzIGluZmlsZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBqc29uLmxvYWQoaW5maWxlKQogICAgICAgICAgICAgICAgICAgIGZvciB4IGluICgnc2lnbmVycycsICd2ZXJpZmllcnMnKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhW3hdID0gW10KICAgICAgICAgICAgICAgICAgICBpZiAnc2NoZW1hJyBub3QgaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbJ3NjaGVtYSddID0gc2VsZi5TQ0hFTUEKICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuZGF0YVsnc2NoZW1hJ10gIT0gc2VsZi5TQ0hFTUE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHdoZWVsLmpzb24gdmVyc2lvbiB7MH0sIGV4cGVjdGVkIHsxfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YVsnc2NoZW1hJ10sIHNlbGYuU0NIRU1BKSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAjIFRyeSBub3QgdG8gY2FsbCB0aGlzIGEgdmVyeSBsb25nIHRpbWUgYWZ0ZXIgbG9hZCgpIAogICAgICAgIHBhdGggPSBzYXZlX2NvbmZpZ19wYXRoKCd3aGVlbCcpCiAgICAgICAgY29uZiA9IG9zLnBhdGguam9pbihuYXRpdmUocGF0aCksIHNlbGYuQ09ORklHX05BTUUpCiAgICAgICAgd2l0aCBvcGVuKGNvbmYsICd3KycpIGFzIG91dDoKICAgICAgICAgICAganNvbi5kdW1wKHNlbGYuZGF0YSwgb3V0LCBpbmRlbnQ9MikKICAgICAgICByZXR1cm4gc2VsZgogICAgCiAgICBkZWYgdHJ1c3Qoc2VsZiwgc2NvcGUsIHZrKToKICAgICAgICAiIiJTdGFydCB0cnVzdGluZyBhIHBhcnRpY3VsYXIga2V5IGZvciBnaXZlbiBzY29wZS4iIiIKICAgICAgICBzZWxmLmRhdGFbJ3ZlcmlmaWVycyddLmFwcGVuZCh7J3Njb3BlJzpzY29wZSwgJ3ZrJzp2a30pCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIAogICAgZGVmIHVudHJ1c3Qoc2VsZiwgc2NvcGUsIHZrKToKICAgICAgICAiIiJTdG9wIHRydXN0aW5nIGEgcGFydGljdWxhciBrZXkgZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHNlbGYuZGF0YVsndmVyaWZpZXJzJ10ucmVtb3ZlKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIAogICAgZGVmIHRydXN0ZWQoc2VsZiwgc2NvcGU9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgWyhzY29wZSwgdHJ1c3RlZCBrZXkpLCAuLi5dIGZvciBnaXZlbiBzY29wZS4iIiIKICAgICAgICB0cnVzdCA9IFsoeFsnc2NvcGUnXSwgeFsndmsnXSkgZm9yIHggaW4gc2VsZi5kYXRhWyd2ZXJpZmllcnMnXSBpZiB4WydzY29wZSddIGluIChzY29wZSwgJysnKV0KICAgICAgICB0cnVzdC5zb3J0KGtleT1sYW1iZGEgeDogeFswXSkKICAgICAgICB0cnVzdC5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gdHJ1c3QKICAgIAogICAgZGVmIHNpZ25lcnMoc2VsZiwgc2NvcGUpOgogICAgICAgICIiIlJldHVybiBsaXN0IG9mIHNpZ25pbmcga2V5KHMpLiIiIgogICAgICAgIHNpZ24gPSBbKHhbJ3Njb3BlJ10sIHhbJ3ZrJ10pIGZvciB4IGluIHNlbGYuZGF0YVsnc2lnbmVycyddIGlmIHhbJ3Njb3BlJ10gaW4gKHNjb3BlLCAnKycpXQogICAgICAgIHNpZ24uc29ydChrZXk9bGFtYmRhIHg6IHhbMF0pCiAgICAgICAgc2lnbi5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gc2lnbgogICAgCiAgICBkZWYgYWRkX3NpZ25lcihzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlJlbWVtYmVyIHZlcmlmeWluZyBrZXkgdmsgYXMgYmVpbmcgdmFsaWQgZm9yIHNpZ25pbmcgaW4gc2NvcGUuIiIiCiAgICAgICAgc2VsZi5kYXRhWydzaWduZXJzJ10uYXBwZW5kKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgIApQSwMEFAAAAAAAAAAhAP+eZXABAAAAAQAAACsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L19faW5pdF9fLnB5I1BLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBKF0fSFwAAABcAAABEAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHlkZWYgbWFpbigpOgogICAgcmV0dXJuClBLAwQUAAAAAAAAACEAHAoXOFcDAABXAwAANQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzCgpzZXR1cChuYW1lPSdjb21wbGV4LWRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQW5vdGhlciB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBsb25nX2Rlc2NyaXB0aW9uPXU4KCdBbm90aGVyIHRlc3RpbmcgZGlzdHJpYnV0aW9uIFxOe1NOT1dNQU59JyksCiAgICAgIGF1dGhvcj0iSWxsdXN0cmlvdXMgQXV0aG9yIiwKICAgICAgYXV0aG9yX2VtYWlsPSJpbGx1c3RyaW91c0BleGFtcGxlLm9yZyIsCiAgICAgIHVybD0iaHR0cDovL2V4YW1wbGUub3JnL2V4ZW1wbGFyeSIsCiAgICAgIHBhY2thZ2VzPVsnY29tcGxleGRpc3QnXSwKICAgICAgc2V0dXBfcmVxdWlyZXM9WyJ3aGVlbCIsICJzZXR1cHRvb2xzIl0sCiAgICAgIGluc3RhbGxfcmVxdWlyZXM9WyJxdXV4IiwgInNwbG9ydCJdLAogICAgICBleHRyYXNfcmVxdWlyZT17J3NpbXBsZSc6WydzaW1wbGUuZGlzdCddfSwKICAgICAgdGVzdHNfcmVxdWlyZT1bImZvbyIsICJiYXI+PTEwLjAuMCJdLAogICAgICBlbnRyeV9wb2ludHM9ewogICAgICAgICAgJ2NvbnNvbGVfc2NyaXB0cyc6IFsKICAgICAgICAgICAgICAnY29tcGxleC1kaXN0PWNvbXBsZXhkaXN0Om1haW4nLAogICAgICAgICAgICAgICdjb21wbGV4LWRpc3QyPWNvbXBsZXhkaXN0Om1haW4nLAogICAgICAgICAgXSwKICAgICAgfSwKICAgICAgKQoKUEsDBBQAAAAAAAAAIQAoSxhlmQYAAJkGAAArAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb25mdGVzdC5weSIiIg0KcHl0ZXN0IGxvY2FsIGNvbmZpZ3VyYXRpb24gcGx1Zy1pbg0KIiIiDQoNCmltcG9ydCBnYw0KaW1wb3J0IHdhcm5pbmdzDQoNCmltcG9ydCBweXRlc3QNCg0KQHB5dGVzdC55aWVsZF9maXh0dXJlKHNjb3BlPSdmdW5jdGlvbicsIGF1dG91c2U9VHJ1ZSkNCmRlZiBlcnJvcl9vbl9SZXNvdXJjZVdhcm5pbmcoKToNCiAgICAiIiJUaGlzIGZpeHR1cmUgY2FwdHVyZXMgUmVzb3VyY2VXYXJuaW5nJ3MgYW5kIHJlcG9ydHMgYW4gImVycm9yIg0KICAgIGRlc2NyaWJpbmcgdGhlIGZpbGUgaGFuZGxlcyBsZWZ0IG9wZW4uDQogICAgDQogICAgVGhpcyBpcyBzaG93biByZWdhcmRsZXNzIG9mIGhvdyBzdWNjZXNzZnVsIHRoZSB0ZXN0IHdhcywgaWYgYSB0ZXN0IGZhaWxzDQogICAgYW5kIGxlYXZlcyBmaWxlcyBvcGVuIHRoZW4gdGhvc2UgZmlsZXMgd2lsbCBiZSByZXBvcnRlZC4gIElkZWFsbHksIGV2ZW4NCiAgICB0aG9zZSBmaWxlcyBzaG91bGQgYmUgY2xvc2VkIHByb3Blcmx5IGFmdGVyIGEgdGVzdCBmYWlsdXJlIG9yIGV4Y2VwdGlvbi4NCg0KICAgIFNpbmNlIG9ubHkgUHl0aG9uIDMgYW5kIFB5UHkzIGhhdmUgUmVzb3VyY2VXYXJuaW5nJ3MsIHRoaXMgY29udGV4dCB3aWxsDQogICAgaGF2ZSBubyBlZmZlY3Qgd2hlbiBydW5uaW5nIHRlc3RzIG9uIFB5dGhvbiAyIG9yIFB5UHkuDQoNCiAgICBCZWNhdXNlIG9mIGF1dG91c2U9VHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBmb3INCiAgICBhbGwgdGVzdF8qIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZS4NCg0KICAgIFRoaXMgY29kZSBpcyBwcmltYXJpbHkgYmFzZWQgb24gdGhlIGV4YW1wbGVzIGZvdW5kIGhlcmU6DQogICAgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjQ3MTcwMjcvY29udmVydC1weXRob24tMy1yZXNvdXJjZXdhcm5pbmdzLWludG8tZXhjZXB0aW9uDQogICAgIiIiDQogICAgdHJ5Og0KICAgICAgICBSZXNvdXJjZVdhcm5pbmcNCiAgICBleGNlcHQgTmFtZUVycm9yOg0KICAgICAgICAjIFB5dGhvbiAyLCBQeVB5DQogICAgICAgIHlpZWxkDQogICAgICAgIHJldHVybg0KICAgICMgUHl0aG9uIDMsIFB5UHkzDQogICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgY2F1Z2h0Og0KICAgICAgICB3YXJuaW5ncy5yZXNldHdhcm5pbmdzKCkgIyBjbGVhciBhbGwgZmlsdGVycw0KICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScpICMgaWdub3JlIGFsbA0KICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycsIFJlc291cmNlV2FybmluZykgIyBhZGQgZmlsdGVyDQogICAgICAgIHlpZWxkICMgcnVuIHRlc3RzIGluIHRoaXMgY29udGV4dA0KICAgICAgICBnYy5jb2xsZWN0KCkgIyBydW4gZ2FyYmFnZSBjb2xsZWN0aW9uIChmb3IgcHlweTMpDQogICAgICAgIGlmIG5vdCBjYXVnaHQ6DQogICAgICAgICAgICByZXR1cm4NCiAgICAgICAgcHl0ZXN0LmZhaWwoJ1RoZSBmb2xsb3dpbmcgZmlsZSBkZXNjcmlwdG9ycyB3ZXJlIG5vdCBjbG9zZWQgcHJvcGVybHk6XG4nICsNCiAgICAgICAgICAgICAgICAgICAgJ1xuJy5qb2luKChzdHIod2FybmluZy5tZXNzYWdlKSBmb3Igd2FybmluZyBpbiBjYXVnaHQpKSwNCiAgICAgICAgICAgICAgICAgICAgcHl0cmFjZT1GYWxzZSkNClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAF+GzE/IAQAAyAEAADcAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCgp0cnk6CiAgICB1bmljb2RlCiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1bmljb2RlLWVzY2FwZScpLmVuY29kZSgndXRmLTgnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQoKc2V0dXAobmFtZT0nZXh0ZW5zaW9uLmRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQSB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBleHRfbW9kdWxlcz1bCiAgICAgICAgICBFeHRlbnNpb24obmFtZT0nZXh0ZW5zaW9uJywgCiAgICAgICAgICBzb3VyY2VzPVsnZXh0ZW5zaW9uLmMnXSwgCiAgICAgICAgICBweV9saW1pdGVkX2FwaT1UcnVlKQogICAgICAgICAgXSwKICAgICAgKQoKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA4AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXIuaFBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlcnNkaXN0LnB5UEsDBBQAAAAAAAAAIQCZxCcsRAEAAEQBAAA1AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHlmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCgp0cnk6CiAgICB1bmljb2RlCiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1bmljb2RlLWVzY2FwZScpLmVuY29kZSgndXRmLTgnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQoKc2V0dXAobmFtZT0naGVhZGVycy5kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0EgZGlzdHJpYnV0aW9uIHdpdGggaGVhZGVycycpLAogICAgICBoZWFkZXJzPVsnaGVhZGVyLmgnXQogICAgICApCgpQSwMEFAAAAAAAAAAhAGo+3dfbLAAA2ywAADIAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3B5ZGlzdC1zY2hlbWEuanNvbnsKICAiaWQiOiAiaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI2LyIsCiAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAidGl0bGUiOiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiLAogICJ0eXBlIjogIm9iamVjdCIsCiAgInByb3BlcnRpZXMiOiB7CiAgICAibWV0YWRhdGFfdmVyc2lvbiI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIlZlcnNpb24gb2YgdGhlIGZpbGUgZm9ybWF0IiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXihcXGQrKFxcLlxcZCspKikkIgogICAgfSwKICAgICJnZW5lcmF0b3IiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJOYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIHRoYXQgcHJvZHVjZWQgdGhpcyBmaWxlLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSkoIFxcKC4qXFwpKT8kIgogICAgfSwKICAgICJuYW1lIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG5hbWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Rpc3RyaWJ1dGlvbl9uYW1lIgogICAgfSwKICAgICJ2ZXJzaW9uIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRpc3RyaWJ1dGlvbidzIHB1YmxpYyB2ZXJzaW9uIGlkZW50aWZpZXIiLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFxcZCsoXFwuXFxkKykqKSgoYXxifGN8cmMpKFxcZCspKT8oXFwuKHBvc3QpKFxcZCspKT8oXFwuKGRldikoXFxkKykpPyQiCiAgICB9LAogICAgInNvdXJjZV9sYWJlbCI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgY29uc3RyYWluZWQgaWRlbnRpZnlpbmcgdGV4dCBzdHJpbmciLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeWzAtOWEtel8uLStdKyQiCiAgICB9LAogICAgInNvdXJjZV91cmwiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyBjb250YWluaW5nIGEgZnVsbCBVUkwgd2hlcmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBkaXN0cmlidXRpb24gY2FuIGJlIGRvd25sb2FkZWQuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICB9LAogICAgInN1bW1hcnkiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG9uZS1saW5lIHN1bW1hcnkgb2Ygd2hhdCB0aGUgZGlzdHJpYnV0aW9uIGRvZXMuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHRyYXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3B0aW9uYWwgc2V0cyBvZiBkZXBlbmRlbmNpZXMgdGhhdCBtYXkgYmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGluIFwibWF5X3JlcXVpcmVcIiBhbmQgc2ltaWxhciBmaWVsZHMuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4dHJhX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAibWV0YV9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdWJkaXN0cmlidXRpb25zIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhpcyBtZXRhZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgInJ1bl9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB0byBydW4gdGhpcyBkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAidGVzdF9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIHRlc3RlZC4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJidWlsZF9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGJ1aWx0LiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgImRldl9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGRldmVsb3BlZC4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJwcm92aWRlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgcmVxdWlyZW1lbnRzIHRoYXQgYXJlIHNhdGlzZmllZCBieSBpbnN0YWxsaW5nIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGVzZSBzdHJpbmdzIG11c3QgYmUgb2YgdGhlIGZvcm0gTmFtZSBvciBOYW1lIChWZXJzaW9uKSIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm92aWRlc19kZWNsYXJhdGlvbiIKICAgICAgfQogICAgfSwKICAgICJtb2R1bGVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG1vZHVsZXMgYW5kL29yIHBhY2thZ2VzIGF2YWlsYWJsZSBmb3IgaW1wb3J0IGFmdGVyIGluc3RhbGxpbmcgdGhpcyBkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3F1YWxpZmllZF9uYW1lIgogICAgICB9CiAgICB9LAogICAgIm5hbWVzcGFjZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgbmFtZXNwYWNlIHBhY2thZ2VzIHRoaXMgZGlzdHJpYnV0aW9uIGNvbnRyaWJ1dGVzIHRvIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3F1YWxpZmllZF9uYW1lIgogICAgICB9CiAgICB9LAogICAgIm9ic29sZXRlZF9ieSI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9qZWN0IGlzIG5vIGxvbmdlciBiZWluZyBkZXZlbG9wZWQuIFRoZSBuYW1lZCBwcm9qZWN0IHByb3ZpZGVzIGEgc3Vic3RpdHV0ZSBvciByZXBsYWNlbWVudC4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcXVpcmVtZW50IgogICAgfSwKICAgICJzdXBwb3J0c19lbnZpcm9ubWVudHMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHRoZSBlbnZpcm9ubWVudHMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGV4cGxpY2l0bHkgc3VwcG9ydHMuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Vudmlyb25tZW50X21hcmtlciIKICAgICAgfQogICAgfSwKICAgICJpbnN0YWxsX2hvb2tzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGluc3RhbGxfaG9va3MgZmllbGQgaXMgdXNlZCB0byBkZWZpbmUgdmFyaW91cyBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIGludm9rZWQgb24gYSBkaXN0cmlidXRpb24gaW4gYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYW5uZXIuIiwKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInBvc3RpbnN0YWxsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICB9LAogICAgICAgICJwcmV1bmluc3RhbGwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJleHRlbnNpb25zIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiRXh0ZW5zaW9ucyB0byB0aGUgbWV0YWRhdGEgbWF5IGJlIHByZXNlbnQgaW4gYSBtYXBwaW5nIHVuZGVyIHRoZSAnZXh0ZW5zaW9ucycga2V5LiIsCiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0ZW5zaW9ucyIKICAgIH0KICB9LAoKICAicmVxdWlyZWQiOiBbIm1ldGFkYXRhX3ZlcnNpb24iLCAibmFtZSIsICJ2ZXJzaW9uIiwgInN1bW1hcnkiXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwKCiAgImRlZmluaXRpb25zIjogewogICAgImNvbnRhY3QiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJuYW1lIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgImVtYWlsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgInVybCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9LAogICAgICAgICJyb2xlIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0KICAgICAgfSwKICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY3kiCiAgICAgIH0KICAgIH0sCiAgICAiZGVwZW5kZW5jeSI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImV4dHJhIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0cmFfbmFtZSIKICAgICAgICB9LAogICAgICAgICJlbnZpcm9ubWVudCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Vudmlyb25tZW50X21hcmtlciIKICAgICAgICB9LAogICAgICAgICJyZXF1aXJlcyI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXF1aXJlbWVudCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJyZXF1aXJlZCI6IFsicmVxdWlyZXMiXSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZXh0ZW5zaW9ucyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeW0EtWmEtel1bMC05QS1aYS16X10qKFsuXVswLTlBLVphLXpfXSopKiQiOiB7fQogICAgICB9LAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicHl0aG9uLmRldGFpbHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgImRvY3VtZW50X25hbWVzIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOYW1lcyBvZiBzdXBwb3J0aW5nIG1ldGFkYXRhIGRvY3VtZW50cyIsCiAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjaGFuZ2Vsb2ciOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZG9jdW1lbnRfbmFtZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImtleXdvcmRzIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgYWRkaXRpb25hbCBrZXl3b3JkcyB0byBiZSB1c2VkIHRvIGFzc2lzdCBzZWFyY2hpbmcgZm9yIHRoZSBkaXN0cmlidXRpb24gaW4gYSBsYXJnZXIgY2F0YWxvZy4iLAogICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbGljZW5zZSBjb3ZlcmluZyB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY2xhc3NpZmllcnMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzLCB3aXRoIGVhY2ggZ2l2aW5nIGEgc2luZ2xlIGNsYXNzaWZpY2F0aW9uIHZhbHVlIGZvciB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJweXRob24ucHJvamVjdCIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGNyZWF0aW9uIGFuZCBtYWludGVuYW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb2plY3Rfb3JfaW50ZWdyYXRvciIKICAgICAgICB9LAogICAgICAgICJweXRob24uaW50ZWdyYXRvciIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGRvd25zdHJlYW0gcmVkaXN0cmlidXRvciBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb2plY3Rfb3JfaW50ZWdyYXRvciIKICAgICAgICB9LAogICAgICAgICJweXRob24uY29tbWFuZHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbW1hbmQgbGluZSBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbW1hbmRzIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5leHBvcnRzIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPdGhlciBleHBvcnRlZCBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydHMiCiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJjb21tYW5kcyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIndyYXBfY29uc29sZSI6IHsKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbW1hbmRfbWFwIgogICAgICAgIH0sCiAgICAgICAgIndyYXBfZ3VpIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZF9tYXAiCiAgICAgICAgfSwKICAgICAgICAicHJlYnVpbHQiOiB7CiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVsYXRpdmVfcGF0aCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImV4cG9ydHMiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAiXltBLVphLXpdWzAtOUEtWmEtel9dKihbLl1bMC05QS1aYS16X10qKSokIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgIi4iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiY29tbWFuZF9tYXAiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgInByb2plY3Rfb3JfaW50ZWdyYXRvciIgOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAiY29udGFjdHMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGNvbnRyaWJ1dG9yIGVudHJpZXMgZ2l2aW5nIHRoZSByZWNvbW1lbmRlZCBjb250YWN0IHBvaW50cyBmb3IgZ2V0dGluZyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0LiIsCiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29udGFjdCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb250cmlidXRvcnMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGNvbnRyaWJ1dG9yIGVudHJpZXMgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBub3QgYWxyZWFkeSBsaXN0ZWQgYXMgY3VycmVudCBwcm9qZWN0IHBvaW50cyBvZiBjb250YWN0LiIsCiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29udGFjdCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwcm9qZWN0X3VybHMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBtYXBwaW5nIG9mIGFyYml0cmFyeSB0ZXh0IGxhYmVscyB0byBhZGRpdGlvbmFsIFVSTHMgcmVsZXZhbnQgdG8gdGhlIHByb2plY3QuIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiZGlzdHJpYnV0aW9uX25hbWUiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/JCIKICAgIH0sCiAgICAicmVxdWlyZW1lbnQiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAicHJvdmlkZXNfZGVjbGFyYXRpb24iOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZW52aXJvbm1lbnRfbWFya2VyIjogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImRvY3VtZW50X25hbWUiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZXh0cmFfbmFtZSIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/JCIKICAgIH0sCiAgICAicmVsYXRpdmVfcGF0aCIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZXhwb3J0X3NwZWNpZmllciI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXihbQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfXVtBLVphLXpfMC05XSopKikoOltBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel9dW0EtWmEtel8wLTldKikqKT8oXFxbWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pP1xcXSk/JCIKICAgIH0sCiAgICAicXVhbGlmaWVkX25hbWUiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeW0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16X11bQS1aYS16XzAtOV0qKSokIgogICAgfSwKICAgICJwcmVmaXhlZF9uYW1lIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXltBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel8wLTldKikqJCIKICAgIH0KICB9Cn0KUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEA000Eo38BAAB/AQAANAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2V0dXAucHlmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCgp0cnk6CiAgICB1bmljb2RlCiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1bmljb2RlLWVzY2FwZScpLmVuY29kZSgndXRmLTgnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQoKc2V0dXAobmFtZT0nc2lt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toE4DgAAdGVzdC0xLjAuZGlzdC1pbmZvL1dIRUVMUEsBAhQAFAAAAAgAvXkoQWQeADs1AQAAVQIAABsAAAAAAAAAAAAAALaBsw4AAHRlc3QtMS4wLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUABQAAAAIAL15KEF2lxgakQEAAJECAAAZAAAAAAAAAAAAAAC2gSEQAAB0ZXN0LTEuMC5kaXN0LWluZm8vUkVDT1JEUEsFBgAAAAAJAAkAawIAAOkRAAAAAFBLAwQUAAAAAAAAACEAOCvvEW0ZAABtGQAALQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9iYXNpYy5weSIiIgpCYXNpYyB3aGVlbCB0ZXN0cy4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IGpzb24KaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCByZXNvdXJjZV9maWxlbmFtZQoKaW1wb3J0IHdoZWVsLnV0aWwKaW1wb3J0IHdoZWVsLnRvb2wKCmZyb20gd2hlZWwgaW1wb3J0IGVnZzJ3aGVlbApmcm9tIHdoZWVsLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZQpmcm9tIHppcGZpbGUgaW1wb3J0IFppcEZpbGUKZnJvbSBzaHV0aWwgaW1wb3J0IHJtdHJlZQoKdGVzdF9kaXN0cmlidXRpb25zID0gKCJjb21wbGV4LWRpc3QiLCAic2ltcGxlLmRpc3QiLCAiaGVhZGVycy5kaXN0IikKCmRlZiB0ZWFyZG93bl9tb2R1bGUoKToKICAgICIiIkRlbGV0ZSBlZ2dzL3doZWVscyBjcmVhdGVkIGJ5IHRlc3RzLiIiIgogICAgYmFzZSA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCAnJykKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBmb3Igc3ViZGlyIGluICgnYnVpbGQnLCAnZGlzdCcpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBybXRyZWUob3MucGF0aC5qb2luKGJhc2UsIGRpc3QsIHN1YmRpcikpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKZGVmIHNldHVwX21vZHVsZSgpOgogICAgYnVpbGRfd2hlZWwoKQogICAgYnVpbGRfZWdnKCkKCmRlZiBidWlsZF93aGVlbCgpOgogICAgIiIiQnVpbGQgd2hlZWxzIGZyb20gdGVzdCBkaXN0cmlidXRpb25zLiIiIgogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIHB3ZCA9IG9zLnBhdGguYWJzcGF0aChvcy5jdXJkaXIpCiAgICAgICAgZGlzdGRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgICAgIG9zLmNoZGlyKGRpc3RkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzeXMuYXJndiA9IFsnJywgJ2JkaXN0X3doZWVsJ10KICAgICAgICAgICAgZXhlYyhjb21waWxlKG9wZW4oJ3NldHVwLnB5JykucmVhZCgpLCAnc2V0dXAucHknLCAnZXhlYycpKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLmNoZGlyKHB3ZCkKCmRlZiBidWlsZF9lZ2coKToKICAgICIiIkJ1aWxkIGVnZ3MgZnJvbSB0ZXN0IGRpc3RyaWJ1dGlvbnMuIiIiCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgcHdkID0gb3MucGF0aC5hYnNwYXRoKG9zLmN1cmRpcikKICAgICAgICBkaXN0ZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICAgICAgb3MuY2hkaXIoZGlzdGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN5cy5hcmd2ID0gWycnLCAnYmRpc3RfZWdnJ10KICAgICAgICAgICAgZXhlYyhjb21waWxlKG9wZW4oJ3NldHVwLnB5JykucmVhZCgpLCAnc2V0dXAucHknLCAnZXhlYycpKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLmNoZGlyKHB3ZCkKCmRlZiB0ZXN0X2ZpbmRhYmxlKCk6CiAgICAiIiJNYWtlIHN1cmUgcGtnX3Jlc291cmNlcyBjYW4gZmluZCB1cy4iIiIKICAgIGFzc2VydCBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleVsnd2hlZWwnXS52ZXJzaW9uCgpkZWYgdGVzdF9lZ2dfcmUoKToKICAgICIiIk1ha2Ugc3VyZSBlZ2dfaW5mb19yZSBtYXRjaGVzLiIiIgogICAgZWdnX25hbWVzX3BhdGggPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbCcsICdlZ2duYW1lcy50eHQnKQogICAgd2l0aCBvcGVuKGVnZ19uYW1lc19wYXRoKSBhcyBlZ2dfbmFtZXM6CiAgICAgICAgZm9yIGxpbmUgaW4gZWdnX25hbWVzOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgYXNzZXJ0IGVnZzJ3aGVlbC5lZ2dfaW5mb19yZS5tYXRjaChsaW5lKSwgbGluZQoKZGVmIHRlc3RfY29tcGF0aWJpbGl0eV90YWdzKCk6CiAgICAiIiJUZXN0IGNvbXBhdGliaWx0eSB0YWdzIGFyZSB3b3JraW5nLiIiIgogICAgd2YgPSBXaGVlbEZpbGUoInBhY2thZ2UtMS4wLjAtY3AzMi5jcDMzLW5vYWJpLW5vYXJjaC53aGwiKQogICAgYXNzZXJ0IChsaXN0KHdmLmNvbXBhdGliaWxpdHlfdGFncykgPT0KICAgICAgICAgICAgICAgICBbKCdjcDMyJywgJ25vYWJpJywgJ25vYXJjaCcpLCAoJ2NwMzMnLCAnbm9hYmknLCAnbm9hcmNoJyldKQogICAgYXNzZXJ0ICh3Zi5hcml0eSA9PSAyKQoKICAgIHdmMiA9IFdoZWVsRmlsZSgicGFja2FnZS0xLjAuMC0xc3QtY3AzMy1ub2FiaS1ub2FyY2gud2hsIikKICAgIHdmMl9pbmZvID0gd2YyLnBhcnNlZF9maWxlbmFtZS5ncm91cGRpY3QoKQogICAgYXNzZXJ0IHdmMl9pbmZvWydidWlsZCddID09ICcxc3QnLCB3ZjJfaW5mbwoKZGVmIHRlc3RfY29udmVydF9lZ2coKToKICAgIGJhc2UgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgJycpCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgZGlzdGRpciA9IG9zLnBhdGguam9pbihiYXNlLCBkaXN0LCAnZGlzdCcpCiAgICAgICAgZWdncyA9IFtlIGZvciBlIGluIG9zLmxpc3RkaXIoZGlzdGRpcikgaWYgZS5lbmRzd2l0aCgnLmVnZycpXQogICAgICAgIHdoZWVsLnRvb2wuY29udmVydChlZ2dzLCBkaXN0ZGlyLCB2ZXJib3NlPUZhbHNlKQoKZGVmIHRlc3RfdW5wYWNrKCk6CiAgICAiIiIKICAgIE1ha2Ugc3VyZSAnd2hlZWwgdW5wYWNrJyB3b3Jrcy4KICAgIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGUgaW50ZWdyaXR5IG9mIG91ciB0ZXN0aW5nIHdoZWVsIGZpbGVzLgogICAgIiIiCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgZGlzdGRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0LCAnZGlzdCcpKQogICAgICAgIGZvciB3aGVlbGZpbGUgaW4gKHcgZm9yIHcgaW4gb3MubGlzdGRpcihkaXN0ZGlyKSBpZiB3LmVuZHN3aXRoKCcud2hsJykpOgogICAgICAgICAgICB3aGVlbC50b29sLnVucGFjayhvcy5wYXRoLmpvaW4oZGlzdGRpciwgd2hlZWxmaWxlKSwgZGlzdGRpcikKCmRlZiB0ZXN0X25vX3NjcmlwdHMoKToKICAgICIiIk1ha2Ugc3VyZSBlbnRyeSBwb2ludCBzY3JpcHRzIGFyZSBub3QgZ2VuZXJhdGVkLiIiIgogICAgZGlzdCA9ICJjb21wbGV4LWRpc3QiCiAgICBiYXNlZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICBmb3IgKGRpcm5hbWUsIHN1YmRpcnMsIGZpbGVuYW1lcykgaW4gb3Mud2FsayhiYXNlZGlyKToKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAgICAgd2hsID0gWmlwRmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSwgZmlsZW5hbWUpKQogICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIHdobC5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBub3QgJy5kYXRhL3NjcmlwdHMvJyBpbiBlbnRyeS5maWxlbmFtZQoKZGVmIHRlc3RfcHlkaXN0KCk6CiAgICAiIiJNYWtlIHN1cmUgcHlkaXN0Lmpzb24gZXhpc3RzIGFuZCB2YWxpZGF0ZXMgYWdhaW5zdCBvdXIgc2NoZW1hLiIiIgogICAgIyBYWFggdGhpcyB0ZXN0IG1heSBuZWVkIG1hbnVhbCBjbGVhbnVwIG9mIG9sZGVyIHdoZWVscwoKICAgIGltcG9ydCBqc29uc2NoZW1hCgogICAgZGVmIG9wZW5fanNvbihmaWxlbmFtZSk6CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBqc29uX2ZpbGU6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKGpzb25fZmlsZS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpKQoKICAgIHB5bWV0YV9zY2hlbWEgPSBvcGVuX2pzb24ocmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlkaXN0LXNjaGVtYS5qc29uJykpCiAgICB2YWxpZCA9IDAKICAgIGZvciBkaXN0IGluICgic2ltcGxlLmRpc3QiLCAiY29tcGxleC1kaXN0Iik6CiAgICAgICAgYmFzZWRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgICAgIGZvciAoZGlybmFtZSwgc3ViZGlycywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKGJhc2VkaXIpOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgICAgICAgICB3aGwgPSBaaXBGaWxlKG9zLnBhdGguam9pbihkaXJuYW1lLCBmaWxlbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIHdobC5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5maWxlbmFtZS5lbmRzd2l0aCgnL21ldGFkYXRhLmpzb24nKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5bWV0YSA9IGpzb24ubG9hZHMod2hsLnJlYWQoZW50cnkpLmRlY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25zY2hlbWEudmFsaWRhdGUocHltZXRhLCBweW1ldGFfc2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgKz0gMQogICAgYXNzZXJ0IHZhbGlkID4gMCwgIk5vIG1ldGFkYXRhLmpzb24gZm91bmQiCgpkZWYgdGVzdF91dGlsKCk6CiAgICAiIiJUZXN0IGZ1bmN0aW9ucyBpbiB1dGlsLnB5LiIiIgogICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgIGJlZm9yZSA9IGInKicgKiBpCiAgICAgICAgZW5jb2RlZCA9IHdoZWVsLnV0aWwudXJsc2FmZV9iNjRlbmNvZGUoYmVmb3JlKQogICAgICAgIGFzc2VydCBub3QgZW5jb2RlZC5lbmRzd2l0aChiJz0nKQogICAgICAgIGFmdGVyID0gd2hlZWwudXRpbC51cmxzYWZlX2I2NGRlY29kZShlbmNvZGVkKQogICAgICAgIGFzc2VydCBiZWZvcmUgPT0gYWZ0ZXIKCgpkZWYgdGVzdF9waWNrX2Jlc3QoKToKICAgICIiIlRlc3QgdGhlIHdoZWVsIHJhbmtpbmcgYWxnb3JpdGhtLiIiIgogICAgZGVmIGdldF90YWdzKHJlcyk6CiAgICAgICAgaW5mbyA9IHJlc1stMV0ucGFyc2VkX2ZpbGVuYW1lLmdyb3VwZGljdCgpCiAgICAgICAgcmV0dXJuIGluZm9bJ3B5dmVyJ10sIGluZm9bJ2FiaSddLCBpbmZvWydwbGF0J10KCiAgICBjYW5kX3RhZ3MgPSBbKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpLCAoJ3B5MjYnLCAnbm9hYmknLCAnbm9hcmNoJyksCiAgICAgICAgICAgICAgICAgKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjYnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLAogICAgICAgICAgICAgICAgICgnY3AyNycsICdub2FiaScsICdsaW51eF94ODZfNjQnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjYnLCAnbm9hYmknLCAnbGludXhfeDg2XzY0JyldCiAgICBjYW5kX3doZWVscyA9IFtXaGVlbEZpbGUoJ3Rlc3Rwa2ctMS4wLSVzLSVzLSVzLndobCcgJSB0KQogICAgICAgICAgICAgICAgICAgZm9yIHQgaW4gY2FuZF90YWdzXQoKICAgIHN1cHBvcnRlZCA9IFsoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyldCiAgICBzdXBwb3J0ZWQyID0gWygnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNycsICdub2FiaScsICdub2FyY2gnKSwKICAgICAgICAgICAgICAgICAgKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI2JywgJ25vYWJpJywgJ25vYXJjaCcpXQogICAgc3VwcG9ydGVkMyA9IFsoJ2NwMjYnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjYnLCAnbm9hYmknLCAnbm9hcmNoJyksCiAgICAgICAgICAgICAgICAgICgnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNycsICdub2FiaScsICdub2FyY2gnKV0KCiAgICBmb3Igc3VwcCBpbiAoc3VwcG9ydGVkLCBzdXBwb3J0ZWQyLCBzdXBwb3J0ZWQzKToKICAgICAgICBjb250ZXh0ID0gbGFtYmRhOiBsaXN0KHN1cHApCiAgICAgICAgZm9yIHdoZWVsIGluIGNhbmRfd2hlZWxzOgogICAgICAgICAgICB3aGVlbC5jb250ZXh0ID0gY29udGV4dAogICAgICAgIGJlc3QgPSBtYXgoY2FuZF93aGVlbHMpCiAgICAgICAgYXNzZXJ0IGxpc3QoYmVzdC50YWdzKVswXSA9PSBzdXBwWzBdCgogICAgICAgICMgYXNzZXJ0X2VxdWFsKAogICAgICAgICMgICAgIGxpc3QobWFwKGdldF90YWdzLCBwaWNrX2Jlc3QoY2FuZF93aGVlbHMsIHN1cHAsIHRvcD1GYWxzZSkpKSwgc3VwcCkKUEsDBBQAAAAAAAAAIQBtBLK+SgcAAEoHAAAvAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2luc3RhbGwucHkjIFRlc3Qgd2hlZWwuDQojIFRoZSBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOg0KIyAgIGhlbGxvLnB5ZA0KIyAgIGhlbGxvL2hlbGxvLnB5DQojICAgaGVsbG8vX19pbml0X18ucHkNCiMgICB0ZXN0LTEuMC5kYXRhL2RhdGEvaGVsbG8uZGF0DQojICAgdGVzdC0xLjAuZGF0YS9oZWFkZXJzL2hlbGxvLmRhdA0KIyAgIHRlc3QtMS4wLmRhdGEvc2NyaXB0cy9oZWxsby5zaA0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9XSEVFTA0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9NRVRBREFUQQ0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9SRUNPUkQNCiMgVGhlIHJvb3QgaXMgUExBVExJQg0KIyBTbywgc29tZSBpbiBQTEFUTElCLCBhbmQgb25lIGluIGVhY2ggb2YgREFUQSwgSEVBREVSUyBhbmQgU0NSSVBUUy4NCg0KaW1wb3J0IHdoZWVsLnRvb2wNCmltcG9ydCB3aGVlbC5wZXA0MjV0YWdzDQpmcm9tIHdoZWVsLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZQ0KZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWtkdGVtcA0KaW1wb3J0IHNodXRpbA0KaW1wb3J0IG9zDQoNClRISVNESVIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pDQpURVNUV0hFRUwgPSBvcy5wYXRoLmpvaW4oVEhJU0RJUiwgJ3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGwnKQ0KDQpkZWYgY2hlY2soKnBhdGgpOg0KICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oKnBhdGgpKQ0KDQpkZWYgdGVzdF9pbnN0YWxsKCk6DQogICAgdGVtcGRpciA9IG1rZHRlbXAoKQ0KICAgIGRlZiBnZXRfc3VwcG9ydGVkKCk6DQogICAgICAgIHJldHVybiBsaXN0KHdoZWVsLnBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgpKSArIFsoJ3B5MycsICdub25lJywgJ3dpbjMyJyldDQogICAgd2hsID0gV2hlZWxGaWxlKFRFU1RXSEVFTCwgY29udGV4dD1nZXRfc3VwcG9ydGVkKQ0KICAgIGFzc2VydCB3aGwuc3VwcG9ydHNfY3VycmVudF9weXRob24oZ2V0X3N1cHBvcnRlZCkNCiAgICB0cnk6DQogICAgICAgIGxvY3MgPSB7fQ0KICAgICAgICBmb3Iga2V5IGluICgncHVyZWxpYicsICdwbGF0bGliJywgJ3NjcmlwdHMnLCAnaGVhZGVycycsICdkYXRhJyk6DQogICAgICAgICAgICBsb2NzW2tleV0gPSBvcy5wYXRoLmpvaW4odGVtcGRpciwga2V5KQ0KICAgICAgICAgICAgb3MubWtkaXIobG9jc1trZXldKQ0KICAgICAgICB3aGwuaW5zdGFsbChvdmVycmlkZXM9bG9jcykNCiAgICAgICAgYXNzZXJ0IGxlbihvcy5saXN0ZGlyKGxvY3NbJ3B1cmVsaWInXSkpID09IDANCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvLnB5ZCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICdoZWxsbycsICdoZWxsby5weScpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICdoZWxsbycsICdfX2luaXRfXy5weScpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydkYXRhJ10sICdoZWxsby5kYXQnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1snaGVhZGVycyddLCAnaGVsbG8uZGF0JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3NjcmlwdHMnXSwgJ2hlbGxvLnNoJykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ3Rlc3QtMS4wLmRpc3QtaW5mbycsICdSRUNPUkQnKQ0KICAgIGZpbmFsbHk6DQogICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikNCg0KZGVmIHRlc3RfaW5zdGFsbF90b29sKCk6DQogICAgIiIiU2xpZ2h0bHkgaW1wcm92ZSBjb3ZlcmFnZSBvZiB3aGVlbC5pbnN0YWxsIiIiDQogICAgd2hlZWwudG9vbC5pbnN0YWxsKFtURVNUV0hFRUxdLCBmb3JjZT1UcnVlLCBkcnlfcnVuPVRydWUpDQoNCiAgICBQSwMEFAAAAAAAAAAhAPdhH5MPCgAADwoAACwAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfa2V5cy5weWltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3MucGF0aAppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IGpzb24KCmZyb20gd2hlZWwuc2lnbmF0dXJlcyBpbXBvcnQga2V5cwoKd2hlZWxfanNvbiA9ICIiIgp7CiAgInZlcmlmaWVycyI6IFsKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogImJwLWJqSzJmRmd0QS04RGhLS0FBUG05LWVBWmNYX3UwM29CdjJSbEtPQmMiCiAgICB9LCAKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogIktBSFpCZnlxRlczT2NGRGJMU0c0blBDalh4VVB5NzJwaFA5STRSbjlNQW8iCiAgICB9LAogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAidG1BWUNyU2ZqOGd0SjEwdjNWa3ZXN2pPbmRLbVFJWUUxMmhnbkZ1M2N2ayIKICAgIH0gCiAgXSwgCiAgInNpZ25lcnMiOiBbCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJ0bUFZQ3JTZmo4Z3RKMTB2M1Zrdlc3ak9uZEttUUlZRTEyaGduRnUzY3ZrIgogICAgfSwgCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJLQUhaQmZ5cUZXM09jRkRiTFNHNG5QQ2pYeFVQeTcycGhQOUk0Um45TUFvIgogICAgfQogIF0sIAogICJzY2hlbWEiOiAxCn0KIiIiCgpjbGFzcyBUZXN0V2hlZWxLZXlzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbmZpZyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShzdWZmaXg9Jy5qc29uJykKICAgICAgICBzZWxmLmNvbmZpZy5jbG9zZSgpCiAgICAgICAgCiAgICAgICAgc2VsZi5jb25maWdfcGF0aCwgc2VsZi5jb25maWdfZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuY29uZmlnLm5hbWUpIAogICAgICAgIGRlZiBsb2FkKCphcmdzKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmNvbmZpZ19wYXRoXQogICAgICAgIGRlZiBzYXZlKCphcmdzKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnX3BhdGgKICAgICAgICBrZXlzLmxvYWRfY29uZmlnX3BhdGhzID0gbG9hZAogICAgICAgIGtleXMuc2F2ZV9jb25maWdfcGF0aCA9IHNhdmUKICAgICAgICBzZWxmLndrID0ga2V5cy5XaGVlbEtleXMoKQogICAgICAgIHNlbGYud2suQ09ORklHX05BTUUgPSBzZWxmLmNvbmZpZ19maWxlbmFtZQogICAgICAgIAogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIG9zLnVubGluayhzZWxmLmNvbmZpZy5uYW1lKQogICAgICAgIAogICAgZGVmIHRlc3RfbG9hZF9zYXZlKHNlbGYpOgogICAgICAgIHNlbGYud2suZGF0YSA9IGpzb24ubG9hZHMod2hlZWxfanNvbikKICAgICAgICAKICAgICAgICBzZWxmLndrLmFkZF9zaWduZXIoJysnLCAnNjc4OTAnKQogICAgICAgIHNlbGYud2suYWRkX3NpZ25lcignc2NvcGUnLCAnYWJjZGVmZycpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay50cnVzdCgnZXBvY3MnLCAnZ2ZlZGNiYScpCiAgICAgICAgc2VsZi53ay50cnVzdCgnKycsICcxMjM0NScpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICAKICAgICAgICBkZWwgc2VsZi53ay5kYXRhCiAgICAgICAgc2VsZi53ay5sb2FkKCkKICAgICAgICAKICAgICAgICBzaWduZXJzID0gc2VsZi53ay5zaWduZXJzKCdzY29wZScpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpZ25lcnNbMF0gPT0gKCdzY29wZScsICdhYmNkZWZnJyksIHNlbGYud2suZGF0YVsnc2lnbmVycyddKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaWduZXJzWzFdWzBdID09ICcrJywgc2VsZi53ay5kYXRhWydzaWduZXJzJ10pCiAgICAgICAgCiAgICAgICAgdHJ1c3RlZCA9IHNlbGYud2sudHJ1c3RlZCgnZXBvY3MnKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cnVzdGVkWzBdID09ICgnZXBvY3MnLCAnZ2ZlZGNiYScpKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cnVzdGVkWzFdWzBdID09ICcrJykKICAgICAgICAKICAgICAgICBzZWxmLndrLnVudHJ1c3QoJ2Vwb2NzJywgJ2dmZWRjYmEnKQogICAgICAgIHRydXN0ZWQgPSBzZWxmLndrLnRydXN0ZWQoJ2Vwb2NzJykKICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdlcG9jcycsICdnZmVkY2JhJykgbm90IGluIHRydXN0ZWQpCiAgICAgICAgCiAgICBkZWYgdGVzdF9sb2FkX3NhdmVfaW5jb21wbGV0ZShzZWxmKToKICAgICAgICBzZWxmLndrLmRhdGEgPSBqc29uLmxvYWRzKHdoZWVsX2pzb24pCiAgICAgICAgZGVsIHNlbGYud2suZGF0YVsnc2lnbmVycyddCiAgICAgICAgc2VsZi53ay5kYXRhWydzY2hlbWEnXSA9IHNlbGYud2suU0NIRU1BKzEKICAgICAgICBzZWxmLndrLnNhdmUoKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi53ay5sb2FkKCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAgICAgCiAgICAgICAgZGVsIHNlbGYud2suZGF0YVsnc2NoZW1hJ10KICAgICAgICBzZWxmLndrLnNhdmUoKQogICAgICAgIHNlbGYud2subG9hZCgpCiAgICAKICAgIApQSwMEFAAAAAAAAAAhAGJYdGOsAAAArAAAAC0AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcGF0aHMucHlpbXBvcnQgd2hlZWwucGF0aHMKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBTQ0hFTUVfS0VZUwoKZGVmIHRlc3RfcGF0aCgpOgogICAgZCA9IHdoZWVsLnBhdGhzLmdldF9pbnN0YWxsX3BhdGhzKCd3aGVlbCcpCiAgICBhc3NlcnQgbGVuKGQpID09IGxlbihTQ0hFTUVfS0VZUykKUEsDBBQAAAAAAAAAIQBtljH52AUAANgFAAAvAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3JhbmtpbmcucHlpbXBvcnQgdW5pdHRlc3QKCmZyb20gd2hlZWwucGVwNDI1dGFncyBpbXBvcnQgZ2V0X3N1cHBvcnRlZApmcm9tIHdoZWVsLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZQoKV0hFRUxQQVQgPSAiJShuYW1lKXMtJSh2ZXIpcy0lKHB5dmVyKXMtJShhYmkpcy0lKGFyY2gpcy53aGwiCmRlZiBtYWtlX3doZWVsKG5hbWUsIHZlciwgcHl2ZXIsIGFiaSwgYXJjaCk6CiAgICBuYW1lID0gV0hFRUxQQVQgJSBkaWN0KG5hbWU9bmFtZSwgdmVyPXZlciwgcHl2ZXI9cHl2ZXIsIGFiaT1hYmksCiAgICAgICAgICAgIGFyY2g9YXJjaCkKICAgIHJldHVybiBXaGVlbEZpbGUobmFtZSkKCiMgVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBnZW5lcmF0ZV9zdXBwb3J0ZWQgd2lsbCBhbHdheXMgcmV0dXJuIHRoZQojIGV4YWN0IHB5dmVyLCBhYmksIGFuZCBhcmNoaXRlY3R1cmUgZm9yIGl0cyBmaXJzdCAoYmVzdCkgbWF0Y2guCnN1cCA9IGdldF9zdXBwb3J0ZWQoKQpweXZlciwgYWJpLCBhcmNoID0gc3VwWzBdCmdlbnZlciA9ICdweScgKyBweXZlclsyOl0KbWFqdmVyID0gZ2VudmVyWzozXQoKQ09NQklOQVRJT05TID0gKAogICAgKCdiYXInLCAnMC45JywgJ3B5Mi5weTMnLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzAuOScsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICcwLjknLCBnZW52ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMC45JywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2JhcicsICcxLjMuMicsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICczLjEnLCBnZW52ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMy4xJywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2ZvbycsICcxLjAnLCBtYWp2ZXIsICdub25lJywgJ2FueScpLAogICAgKCdmb28nLCAnMS4xJywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2ZvbycsICcyLjEnLCBtYWp2ZXIgKyAnMCcsICdub25lJywgJ2FueScpLAogICAgIyBUaGlzIHdpbGwgbm90IGJlIGNvbXBhdGlibGUgZm9yIFB5dGhvbiB4LjAuIEJld2FyZSB3aGVuIHdlIGhpdCBQeXRob24KICAgICMgNC4wLCBhbmQgZG9uJ3QgdGVzdCB3aXRoIDMuMCEhIQogICAgKCdmb28nLCAnMi4xJywgbWFqdmVyICsgJzEnLCAnbm9uZScsICdhbnknKSwKICAgICgnZm9vJywgJzIuMScsIHB5dmVyICwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2ZvbycsICcyLjEnLCBweXZlciAsIGFiaSwgYXJjaCksCikKCldIRUVMUyA9IFsgbWFrZV93aGVlbCgqYXJncykgZm9yIGFyZ3MgaW4gQ09NQklOQVRJT05TIF0KCmNsYXNzIFRlc3RSYW5raW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2NvbXBhcmlzb24oc2VsZik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKFdIRUVMUyktMSk6CiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFdIRUVMU1tqXTxXSEVFTFNbaV0pClBLAwQUAAAAAAAAACEApCl/MWAEAABgBAAAMgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9zaWduYXR1cmVzLnB5ZnJvbSB3aGVlbCBpbXBvcnQgc2lnbmF0dXJlcwpmcm9tIHdoZWVsLnNpZ25hdHVyZXMgaW1wb3J0IGRqYmVjLCBlZDI1NTE5cHkKZnJvbSB3aGVlbC51dGlsIGltcG9ydCBiaW5hcnkKCmRlZiB0ZXN0X2dldGxpYigpOgogICAgc2lnbmF0dXJlcy5nZXRfZWQyNTUxOWxsKCkKCmRlZiB0ZXN0X2RqYmVjKCk6CiAgICBkamJlYy5kc2FfdGVzdCgpICAgIAogICAgZGpiZWMuZGhfdGVzdCgpCiAgICAKZGVmIHRlc3RfZWQyNTUxOXB5KCk6CiAgICBrcDAgPSBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fa2V5cGFpcihiaW5hcnkoJyAnKjMyKSkKICAgIGtwID0gZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgICAgIAogICAgc2lnbmVkID0gZWQyNTUxOXB5LmNyeXB0b19zaWduKGJpbmFyeSgndGVzdCcpLCBrcC5zaykKICAgIAogICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX29wZW4oc2lnbmVkLCBrcC52aykKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9vcGVuKHNpZ25lZCwga3AwLnZrKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoYmluYXJ5KCcgJyozMykpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ24oYmluYXJ5KCcnKSwgYmluYXJ5KCcgJykqMzEpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fb3BlbihiaW5hcnkoJycpLCBiaW5hcnkoJyAnKSozMSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIFBLAwQUAAAAAAAAACEAnFdC8CcXAAAnFwAALgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90YWdvcHQucHkiIiIKVGVzdHMgZm9yIHRoZSBiZGlzdF93aGVlbCB0YWcgb3B0aW9ucyAoLS1weXRob24tdGFnLCAtLXVuaXZlcnNhbCwgYW5kCi0tcGxhdC1uYW1lKQoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IHNodXRpbAppbXBvcnQgcHl0ZXN0CmltcG9ydCBweS5wYXRoCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc3VicHJvY2VzcwoKU0VUVVBfUFkgPSAiIiJcCmZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoKc2V0dXAoCiAgICBuYW1lPSJUZXN0IiwKICAgIHZlcnNpb249IjEuMCIsCiAgICBhdXRob3JfZW1haWw9ImF1dGhvckBleGFtcGxlLmNvbSIsCiAgICBweV9tb2R1bGVzPVsidGVzdCJdLAogICAge2V4dF9tb2R1bGVzfQopCiIiIgoKRVhUX01PRFVMRVMgPSAiZXh0X21vZHVsZXM9W0V4dGVuc2lvbignX3Rlc3QnLCBzb3VyY2VzPVsndGVzdC5jJ10pXSwiCgpAcHl0ZXN0LmZpeHR1cmUKZGVmIHRlbXBfcGtnKHJlcXVlc3QsIGV4dD1GYWxzZSk6CiAgICB0ZW1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBkZWYgZmluKCk6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQogICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQogICAgdGVtcHBhdGggPSBweS5wYXRoLmxvY2FsKHRlbXBkaXIpCiAgICB0ZW1wcGF0aC5qb2luKCd0ZXN0LnB5Jykud3JpdGUoJ3ByaW50KCJIZWxsbywgd29ybGQiKScpCiAgICBpZiBleHQ6CiAgICAgICAgdGVtcHBhdGguam9pbigndGVzdC5jJykud3JpdGUoJyNpbmNsdWRlIDxzdGRpby5oPicpCiAgICAgICAgc2V0dXBfcHkgPSBTRVRVUF9QWS5mb3JtYXQoZXh0X21vZHVsZXM9RVhUX01PRFVMRVMpCiAgICBlbHNlOgogICAgICAgIHNldHVwX3B5ID0gU0VUVVBfUFkuZm9ybWF0KGV4dF9tb2R1bGVzPScnKQogICAgdGVtcHBhdGguam9pbignc2V0dXAucHknKS53cml0ZShzZXR1cF9weSkKICAgIHJldHVybiB0ZW1wcGF0aAoKQHB5dGVzdC5maXh0dXJlCmRlZiB0ZW1wX2V4dF9wa2cocmVxdWVzdCk6CiAgICByZXR1cm4gdGVtcF9wa2cocmVxdWVzdCwgZXh0PVRydWUpCgpkZWYgdGVzdF9kZWZhdWx0X3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZSA9PSAnVGVzdC0xLjAtcHklcy1ub25lLWFueS53aGwnICUgKHN5cy52ZXJzaW9uWzBdLCkKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfZXhwbGljaXRfdGFnKHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXB5dGhvbi10YWc9cHkzMiddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkzMi0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF91bml2ZXJzYWxfdGFnKHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXVuaXZlcnNhbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkyLnB5My0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF91bml2ZXJzYWxfYmVhdHNfZXhwbGljaXRfdGFnKHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXVuaXZlcnNhbCcsICctLXB5dGhvbi10YWc9cHkzMiddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkyLnB5My0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF91bml2ZXJzYWxfaW5fc2V0dXBfY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG51bml2ZXJzYWw9MScpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcHl0aG9udGFnX2luX3NldHVwX2NmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxucHl0aG9uX3RhZz1weTMyJykKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkzMi0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9sZWdhY3lfd2hlZWxfc2VjdGlvbl9pbl9zZXR1cF9jZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1t3aGVlbF1cbnVuaXZlcnNhbD0xJykKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkyLnB5My0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfcHVyZXB5KHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXBsYXQtbmFtZT10ZXN0cGxhdC5wdXJlJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X3B1cmUud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX2V4dCh0ZW1wX2V4dF9wa2cpOgogICAgdHJ5OgogICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS1wbGF0LW5hbWU9dGVzdHBsYXQuYXJjaCddLAogICAgICAgICAgICBjd2Q9c3RyKHRlbXBfZXh0X3BrZykpCiAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3I6CiAgICAgICAgcHl0ZXN0LnNraXAoIkNhbm5vdCBjb21waWxlIEMgRXh0ZW5zaW9ucyIpCiAgICBkaXN0X2RpciA9IHRlbXBfZXh0X3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9hcmNoLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9wdXJlcHlfaW5fc2V0dXBjZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnBsYXRfbmFtZT10ZXN0cGxhdC5wdXJlJykKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9wdXJlLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9leHRfaW5fc2V0dXBjZmcodGVtcF9leHRfcGtnKToKICAgIHRlbXBfZXh0X3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxucGxhdF9uYW1lPXRlc3RwbGF0LmFyY2gnKQogICAgdHJ5OgogICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICAgICAgY3dkPXN0cih0ZW1wX2V4dF9wa2cpKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAgICAgIHB5dGVzdC5za2lwKCJDYW5ub3QgY29tcGlsZSBDIEV4dGVuc2lvbnMiKQogICAgZGlzdF9kaXIgPSB0ZW1wX2V4dF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfYXJjaC53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnClBLAwQUAAAAAAAAACEA1D4fVpACAACQAgAALAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90b29sLnB5ZnJvbSAuLiBpbXBvcnQgdG9vbAoKZGVmIHRlc3Rfa2V5Z2VuKCk6CiAgICBkZWYgZ2V0X2tleXJpbmcoKToKICAgICAgICBXaGVlbEtleXMsIGtleXJpbmcgPSB0b29sLmdldF9rZXlyaW5nKCkKCiAgICAgICAgY2xhc3MgV2hlZWxLZXlzVGVzdChXaGVlbEtleXMpOgogICAgICAgICAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgY2xhc3Mga2V5cmluZ1Rlc3Q6CiAgICAgICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgICAgICBkZWYgZ2V0X2tleXJpbmcoY2xzKToKICAgICAgICAgICAgICAgIGNsYXNzIGtleXJpbmdUZXN0MjoKICAgICAgICAgICAgICAgICAgICBwdyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBkZWYgc2V0X3Bhc3N3b3JkKHNlbGYsIGEsIGIsIGMpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB3ID0gYwogICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfcGFzc3dvcmQoc2VsZiwgYSwgYik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnB3CgogICAgICAgICAgICAgICAgcmV0dXJuIGtleXJpbmdUZXN0MigpCgogICAgICAgIHJldHVybiBXaGVlbEtleXNUZXN0LCBrZXlyaW5nVGVzdAoKICAgIHRvb2wua2V5Z2VuKGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKQpQSwMEFAAAAAAAAAAhAEViREzpEQAA6REAADEAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfd2hlZWxmaWxlLnB5aW1wb3J0IG9zCmltcG9ydCB3aGVlbC5pbnN0YWxsCmltcG9ydCB3aGVlbC5hcmNoaXZlCmltcG9ydCBoYXNobGliCnRyeToKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgU3RyaW5nSU8KaW1wb3J0IGNvZGVjcwppbXBvcnQgemlwZmlsZQppbXBvcnQgcHl0ZXN0CmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKCkBjb250ZXh0bWFuYWdlcgpkZWYgZW52aXJvbihrZXksIHZhbHVlKToKICAgIG9sZF92YWx1ZSA9IG9zLmVudmlyb24uZ2V0KGtleSkKICAgIHRyeToKICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSB2YWx1ZQogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGlmIG9sZF92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3MuZW52aXJvbltrZXldID0gb2xkX3ZhbHVlCgpAY29udGV4dG1hbmFnZXIKZGVmIHRlbXBvcmFyeV9kaXJlY3RvcnkoKToKICAgICMgdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgaW4gUHl0aG9uIDIuCiAgICB0ZW1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICB0cnk6CiAgICAgICAgeWllbGQgdGVtcGRpcgogICAgZmluYWxseToKICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCgpAY29udGV4dG1hbmFnZXIKZGVmIHJlYWRhYmxlX3ppcGZpbGUocGF0aCk6CiAgICAjIHppcGZpbGUuWmlwRmlsZSgpIGlzbid0IGEgY29udGV4dCBtYW5hZ2VyIHVuZGVyIFB5dGhvbiAyLgogICAgemYgPSB6aXBmaWxlLlppcEZpbGUocGF0aCwgJ3InKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHpmCiAgICBmaW5hbGx5OgogICAgICAgIHpmLmNsb3NlKCkKCgpkZWYgdGVzdF92ZXJpZnlpbmdfemlwZmlsZSgpOgogICAgaWYgbm90IGhhc2F0dHIoemlwZmlsZS5aaXBFeHRGaWxlLCAnX3VwZGF0ZV9jcmMnKToKICAgICAgICBweXRlc3Quc2tpcCgnTm8gWklQIHZlcmlmaWNhdGlvbi4gTWlzc2luZyBaaXBFeHRGaWxlLl91cGRhdGVfY3JjLicpCiAgICAKICAgIHNpbyA9IFN0cmluZ0lPKCkKICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKHNpbywgJ3cnKQogICAgemYud3JpdGVzdHIoIm9uZSIsIGIiZmlyc3QgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidHdvIiwgYiJzZWNvbmQgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidGhyZWUiLCBiInRoaXJkIGZpbGUiKQogICAgemYuY2xvc2UoKQogICAgCiAgICAjIEluIGRlZmF1bHQgbW9kZSwgVmVyaWZ5aW5nWmlwRmlsZSBjaGVja3MgdGhlIGhhc2ggb2YgYW55IHJlYWQgZmlsZQogICAgIyBtZW50aW9uZWQgd2l0aCBzZXRfZXhwZWN0ZWRfaGFzaCgpLiBGaWxlcyBub3QgbWVudGlvbmVkIHdpdGgKICAgICMgc2V0X2V4cGVjdGVkX2hhc2goKSBhcmUgbm90IGNoZWNrZWQuCiAgICB2emYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAncicpCiAgICB2emYuc2V0X2V4cGVjdGVkX2hhc2goIm9uZSIsIGhhc2hsaWIuc2hhMjU2KGIiZmlyc3QgZmlsZSIpLmRpZ2VzdCgpKQogICAgdnpmLnNldF9leHBlY3RlZF9oYXNoKCJ0aHJlZSIsICJibHVyYmxlIikKICAgIHZ6Zi5vcGVuKCJvbmUiKS5yZWFkKCkKICAgIHZ6Zi5vcGVuKCJ0d28iKS5yZWFkKCkKICAgIHRyeToKICAgICAgICB2emYub3BlbigidGhyZWUiKS5yZWFkKCkKICAgIGV4Y2VwdCB3aGVlbC5pbnN0YWxsLkJhZFdoZWVsRmlsZToKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXhwZWN0ZWQgZXhjZXB0aW9uICdCYWRXaGVlbEZpbGUoKSciKQogICAgCiAgICAjIEluIHN0cmljdCBtb2RlLCBWZXJpZnlpbmdaaXBGaWxlIHJlcXVpcmVzIGV2ZXJ5IHJlYWQgZmlsZSB0byBiZQogICAgIyBtZW50aW9uZWQgd2l0aCBzZXRfZXhwZWN0ZWRfaGFzaCgpLgogICAgdnpmLnN0cmljdCA9IFRydWUKICAgIHRyeToKICAgICAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICBleGNlcHQgd2hlZWwuaW5zdGFsbC5CYWRXaGVlbEZpbGU6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIGV4Y2VwdGlvbiAnQmFkV2hlZWxGaWxlKCknIikKICAgICAgICAKICAgIHZ6Zi5zZXRfZXhwZWN0ZWRfaGFzaCgidHdvIiwgTm9uZSkKICAgIHZ6Zi5vcGVuKCJ0d28iKS5yZWFkKCkKICAgIApkZWYgdGVzdF9wb3BfemlwZmlsZSgpOgogICAgc2lvID0gU3RyaW5nSU8oKQogICAgemYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAndycpCiAgICB6Zi53cml0ZXN0cigib25lIiwgYiJmaXJzdCBmaWxlIikKICAgIHpmLndyaXRlc3RyKCJ0d28iLCBiInNlY29uZCBmaWxlIikKICAgIHpmLmNsb3NlKCkKICAgIAogICAgdHJ5OgogICAgICAgIHpmLnBvcCgpCiAgICBleGNlcHQgUnVudGltZUVycm9yOgogICAgICAgIHBhc3MgIyBhbHJlYWR5IGNsb3NlZAogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIFJ1bnRpbWVFcnJvciIpCiAgICAKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ2EnKQogICAgemYucG9wKCkKICAgIHpmLmNsb3NlKCkKICAgIAogICAgemYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAncicpCiAgICBhc3NlcnQgbGVuKHpmLmluZm9saXN0KCkpID09IDEKCmRlZiB0ZXN0X3ppcGZpbGVfdGltZXN0YW1wKCk6CiAgICAjIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgdGltZXN0YW1wIG9uCiAgICAjIFRhckluZm8gb2JqZWN0cyBpbnNpZGUgdGhlIHppcC4gIFNlZSBpc3N1ZSAjMTQzLiAgVGVtcG9yYXJ5RGlyZWN0b3J5IGlzCiAgICAjIG5vdCBhIGNvbnRleHQgbWFuYWdlciB1bmRlciBQeXRob24gMy4KICAgIHdpdGggdGVtcG9yYXJ5X2RpcmVjdG9yeSgpIGFzIHRlbXBkaXI6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluICgnb25lJywgJ3R3bycsICd0aHJlZScpOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIGZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICBmcC53cml0ZShmaWxlbmFtZSArICdcbicpCiAgICAgICAgemlwX2Jhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnZHVtbXknKQogICAgICAgICMgVGhlIGVhcmxpZXN0IGRhdGUgcmVwcmVzZW50YWJsZSBpbiBUYXJJbmZvcywgMTk4MC0wMS0wMQogICAgICAgIHdpdGggZW52aXJvbignU09VUkNFX0RBVEVfRVBPQ0gnLCAnMzE1NTc2MDYwJyk6CiAgICAgICAgICAgIHppcF9maWxlbmFtZSA9IHdoZWVsLmFyY2hpdmUubWFrZV93aGVlbGZpbGVfaW5uZXIoCiAgICAgICAgICAgICAgICB6aXBfYmFzZV9uYW1lLCB0ZW1wZGlyKQogICAgICAgIHdpdGggcmVhZGFibGVfemlwZmlsZSh6aXBfZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBmb3IgaW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uZGF0ZV90aW1lWzozXSA9PSAoMTk4MCwgMSwgMSkKCmRlZiB0ZXN0X3ppcGZpbGVfYXR0cmlidXRlcygpOgogICAgIyBXaXRoIHRoZSBjaGFuZ2UgZnJvbSBaaXBGaWxlLndyaXRlKCkgdG8gLndyaXRlc3RyKCksIHdlIG5lZWQgdG8gbWFudWFsbHkKICAgICMgc2V0IG1lbWJlciBhdHRyaWJ1dGVzLgogICAgd2l0aCB0ZW1wb3JhcnlfZGlyZWN0b3J5KCkgYXMgdGVtcGRpcjoKICAgICAgICBmaWxlcyA9ICgoJ2ZvbycsIDBvNjQ0KSwgKCdiYXInLCAwbzc1NSkpCiAgICAgICAgZm9yIGZpbGVuYW1lLCBtb2RlIGluIGZpbGVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIGZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICBmcC53cml0ZShmaWxlbmFtZSArICdcbicpCiAgICAgICAgICAgIG9zLmNobW9kKHBhdGgsIG1vZGUpCiAgICAgICAgemlwX2Jhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnZHVtbXknKQogICAgICAgIHppcF9maWxlbmFtZSA9IHdoZWVsLmFyY2hpdmUubWFrZV93aGVlbGZpbGVfaW5uZXIoCiAgICAgICAgICAgIHppcF9iYXNlX25hbWUsIHRlbXBkaXIpCiAgICAgICAgd2l0aCByZWFkYWJsZV96aXBmaWxlKHppcF9maWxlbmFtZSkgYXMgemY6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSwgbW9kZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGluZm8gPSB6Zi5nZXRpbmZvKG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkpCiAgICAgICAgICAgICAgICBhc3NlcnQgaW5mby5leHRlcm5hbF9hdHRyID09IChtb2RlIHwgMG8xMDAwMDApIDw8IDE2CiAgICAgICAgICAgICAgICBhc3NlcnQgaW5mby5jb21wcmVzc190eXBlID09IHppcGZpbGUuWklQX0RFRkxBVEVEClBLAwQUAAAAAAAAACEAoy0DF6EzAAChMwAAKwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rvb2wvX19pbml0X18ucHkiIiIKV2hlZWwgY29tbWFuZC1saW5lIHV0aWxpdHkuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBoYXNobGliCmltcG9ydCBzeXMKaW1wb3J0IGpzb24KCmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IKZnJvbSAuLiBpbXBvcnQgc2lnbmF0dXJlcwpmcm9tIC4udXRpbCBpbXBvcnQgKHVybHNhZmVfYjY0ZGVjb2RlLCB1cmxzYWZlX2I2NGVuY29kZSwgbmF0aXZlLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc19yZXF1aXJlbWVudCkKZnJvbSAuLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZSwgVmVyaWZ5aW5nWmlwRmlsZQpmcm9tIC4ucGF0aHMgaW1wb3J0IGdldF9pbnN0YWxsX2NvbW1hbmQKCmRlZiByZXF1aXJlX3BrZ3Jlc291cmNlcyhuYW1lKToKICAgIHRyeToKICAgICAgICBpbXBvcnQgcGtnX3Jlc291cmNlcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiJ3swfScgbmVlZHMgcGtnX3Jlc291cmNlcyAocGFydCBvZiBzZXR1cHRvb2xzKS4iLmZvcm1hdChuYW1lKSkKCmltcG9ydCBhcmdwYXJzZQoKY2xhc3MgV2hlZWxFcnJvcihFeGNlcHRpb24pOiBwYXNzCgojIEZvciB0ZXN0YWJpbGl0eQpkZWYgZ2V0X2tleXJpbmcoKToKICAgIHRyeToKICAgICAgICBmcm9tIC4uc2lnbmF0dXJlcyBpbXBvcnQga2V5cwogICAgICAgIGltcG9ydCBrZXlyaW5nCiAgICAgICAgYXNzZXJ0IGtleXJpbmcuZ2V0X2tleXJpbmcoKS5wcmlvcml0eQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIkluc3RhbGwgd2hlZWxbc2lnbmF0dXJlc10gKHJlcXVpcmVzIGtleXJpbmcsIGtleXJpbmdzLmFsdCwgcHl4ZGcpIGZvciBzaWduYXR1cmVzLiIpCiAgICByZXR1cm4ga2V5cy5XaGVlbEtleXMsIGtleXJpbmcKCmRlZiBrZXlnZW4oZ2V0X2tleXJpbmc9Z2V0X2tleXJpbmcpOgogICAgIiIiR2VuZXJhdGUgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpci4iIiIKICAgIFdoZWVsS2V5cywga2V5cmluZyA9IGdldF9rZXlyaW5nKCkKCiAgICBlZDI1NTE5bGwgPSBzaWduYXR1cmVzLmdldF9lZDI1NTE5bGwoKQoKICAgIHdrID0gV2hlZWxLZXlzKCkubG9hZCgpCgogICAga2V5cGFpciA9IGVkMjU1MTlsbC5jcnlwdG9fc2lnbl9rZXlwYWlyKCkKICAgIHZrID0gbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGtleXBhaXIudmspKQogICAgc2sgPSBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoa2V5cGFpci5zaykpCiAgICBrciA9IGtleXJpbmcuZ2V0X2tleXJpbmcoKQogICAga3Iuc2V0X3Bhc3N3b3JkKCJ3aGVlbCIsIHZrLCBzaykKICAgIHN5cy5zdGRvdXQud3JpdGUoIkNyZWF0ZWQgRWQyNTUxOSBrZXlwYWlyIHdpdGggdms9ezB9XG4iLmZvcm1hdCh2aykpCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJpbiB7MCFyfVxuIi5mb3JtYXQoa3IpKQoKICAgIHNrMiA9IGtyLmdldF9wYXNzd29yZCgnd2hlZWwnLCB2aykKICAgIGlmIHNrMiAhPSBzazoKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJLZXlyaW5nIGlzIGJyb2tlbi4gQ291bGQgbm90IHJldHJpZXZlIHNlY3JldCBrZXkuIikKCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJUcnVzdGluZyB7MH0gdG8gc2lnbiBhbmQgdmVyaWZ5IGFsbCBwYWNrYWdlcy5cbiIuZm9ybWF0KHZrKSkKICAgIHdrLmFkZF9zaWduZXIoJysnLCB2aykKICAgIHdrLnRydXN0KCcrJywgdmspCiAgICB3ay5zYXZlKCkKCmRlZiBzaWduKHdoZWVsZmlsZSwgcmVwbGFjZT1GYWxzZSwgZ2V0X2tleXJpbmc9Z2V0X2tleXJpbmcpOgogICAgIiIiU2lnbiBhIHdoZWVsIiIiCiAgICBXaGVlbEtleXMsIGtleXJpbmcgPSBnZXRfa2V5cmluZygpCgogICAgZWQyNTUxOWxsID0gc2lnbmF0dXJlcy5nZXRfZWQyNTUxOWxsKCkKCiAgICB3ZiA9IFdoZWVsRmlsZSh3aGVlbGZpbGUsIGFwcGVuZD1UcnVlKQogICAgd2sgPSBXaGVlbEtleXMoKS5sb2FkKCkKCiAgICBuYW1lID0gd2YucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgIHNpZ25fd2l0aCA9IHdrLnNpZ25lcnMobmFtZSlbMF0KICAgIHN5cy5zdGRvdXQud3JpdGUoIlNpZ25pbmcgezB9IHdpdGggezF9XG4iLmZvcm1hdChuYW1lLCBzaWduX3dpdGhbMV0pKQoKICAgIHZrID0gc2lnbl93aXRoWzFdCiAgICBrciA9IGtleXJpbmcuZ2V0X2tleXJpbmcoKQogICAgc2sgPSBrci5nZXRfcGFzc3dvcmQoJ3doZWVsJywgdmspCiAgICBrZXlwYWlyID0gZWQyNTUxOWxsLktleXBhaXIodXJsc2FmZV9iNjRkZWNvZGUoYmluYXJ5KHZrKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsc2FmZV9iNjRkZWNvZGUoYmluYXJ5KHNrKSkpCgoKICAgIHJlY29yZF9uYW1lID0gd2YuZGlzdGluZm9fbmFtZSArICcvUkVDT1JEJwogICAgc2lnX25hbWUgPSB3Zi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQuandzJwogICAgaWYgc2lnX25hbWUgaW4gd2YuemlwZmlsZS5uYW1lbGlzdCgpOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIldoZWVsIGlzIGFscmVhZHkgc2lnbmVkLiIpCiAgICByZWNvcmRfZGF0YSA9IHdmLnppcGZpbGUucmVhZChyZWNvcmRfbmFtZSkKICAgIHBheWxvYWQgPSB7Imhhc2giOiJzaGEyNTY9IiArIG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShoYXNobGliLnNoYTI1NihyZWNvcmRfZGF0YSkuZGlnZXN0KCkpKX0KICAgIHNpZyA9IHNpZ25hdHVyZXMuc2lnbihwYXlsb2FkLCBrZXlwYWlyKQogICAgd2YuemlwZmlsZS53cml0ZXN0cihzaWdfbmFtZSwganNvbi5kdW1wcyhzaWcsIHNvcnRfa2V5cz1UcnVlKSkKICAgIHdmLnppcGZpbGUuY2xvc2UoKQoKZGVmIHVuc2lnbih3aGVlbGZpbGUpOgogICAgIiIiCiAgICBSZW1vdmUgUkVDT1JELmp3cyBmcm9tIGEgd2hlZWwgYnkgdHJ1bmNhdGluZyB0aGUgemlwIGZpbGUuCgogICAgUkVDT1JELmp3cyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuIFRoZSB6aXAgZmlsZSBtdXN0IGJlIGFuCiAgICBvcmRpbmFyeSBhcmNoaXZlLCB3aXRoIHRoZSBjb21wcmVzc2VkIGZpbGVzIGFuZCB0aGUgZGlyZWN0b3J5IGluIHRoZSBzYW1lCiAgICBvcmRlciwgYW5kIHdpdGhvdXQgYW55IG5vbi16aXAgY29udGVudCBhZnRlciB0aGUgdHJ1bmNhdGlvbiBwb2ludC4KICAgICIiIgogICAgdnpmID0gVmVyaWZ5aW5nWmlwRmlsZSh3aGVlbGZpbGUsICJhIikKICAgIGluZm8gPSB2emYuaW5mb2xpc3QoKQogICAgaWYgbm90IChsZW4oaW5mbykgYW5kIGluZm9bLTFdLmZpbGVuYW1lLmVuZHN3aXRoKCcvUkVDT1JELmp3cycpKToKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJSRUNPUkQuandzIG5vdCBmb3VuZCBhdCBlbmQgb2YgYXJjaGl2ZS4iKQogICAgdnpmLnBvcCgpCiAgICB2emYuY2xvc2UoKQoKZGVmIHZlcmlmeSh3aGVlbGZpbGUpOgogICAgIiIiVmVyaWZ5IGEgd2hlZWwuCgogICAgVGhlIHNpZ25hdHVyZSB3aWxsIGJlIHZlcmlmaWVkIGZvciBpbnRlcm5hbCBjb25zaXN0ZW5jeSBPTkxZIGFuZCBwcmludGVkLgogICAgV2hlZWwncyBvd24gdW5wYWNrL2luc3RhbGwgY29tbWFuZHMgdmVyaWZ5IHRoZSBtYW5pZmVzdCBhZ2FpbnN0IHRoZQogICAgc2lnbmF0dXJlIGFuZCBmaWxlIGNvbnRlbnRzLgogICAgIiIiCiAgICB3ZiA9IFdoZWVsRmlsZSh3aGVlbGZpbGUpCiAgICBzaWdfbmFtZSA9IHdmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRC5qd3MnCiAgICBzaWcgPSBqc29uLmxvYWRzKG5hdGl2ZSh3Zi56aXBmaWxlLm9wZW4oc2lnX25hbWUpLnJlYWQoKSkpCiAgICB2ZXJpZmllZCA9IHNpZ25hdHVyZXMudmVyaWZ5KHNpZykKICAgIHN5cy5zdGRlcnIud3JpdGUoIlNpZ25hdHVyZXMgYXJlIGludGVybmFsbHkgY29uc2lzdGVudC5cbiIpCiAgICBzeXMuc3Rkb3V0LndyaXRlKGpzb24uZHVtcHModmVyaWZpZWQsIGluZGVudD0yKSkKICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKCmRlZiB1bnBhY2sod2hlZWxmaWxlLCBkZXN0PScuJyk6CiAgICAiIiJVbnBhY2sgYSB3aGVlbC4KCiAgICBXaGVlbCBjb250ZW50IHdpbGwgYmUgdW5wYWNrZWQgdG8ge2Rlc3R9L3tuYW1lfS17dmVyfSwgd2hlcmUge25hbWV9CiAgICBpcyB0aGUgcGFja2FnZSBuYW1lIGFuZCB7dmVyfSBpdHMgdmVyc2lvbi4KCiAgICA6cGFyYW0gd2hlZWxmaWxlOiBUaGUgcGF0aCB0byB0aGUgd2hlZWwuCiAgICA6cGFyYW0gZGVzdDogRGVzdGluYXRpb24gZGlyZWN0b3J5IChkZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5KS4KICAgICIiIgogICAgd2YgPSBXaGVlbEZpbGUod2hlZWxmaWxlKQogICAgbmFtZXZlciA9IHdmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZXZlcicpCiAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbihkZXN0LCBuYW1ldmVyKQogICAgc3lzLnN0ZGVyci53cml0ZSgiVW5wYWNraW5nIHRvOiAlc1xuIiAlIChkZXN0aW5hdGlvbikpCiAgICB3Zi56aXBmaWxlLmV4dHJhY3RhbGwoZGVzdGluYXRpb24pCiAgICB3Zi56aXBmaWxlLmNsb3NlKCkKCmRlZiBpbnN0YWxsKHJlcXVpcmVtZW50cywgcmVxdWlyZW1lbnRzX2ZpbGU9Tm9uZSwKICAgICAgICAgICAgd2hlZWxfZGlycz1Ob25lLCBmb3JjZT1GYWxzZSwgbGlzdF9maWxlcz1GYWxzZSwKICAgICAgICAgICAgZHJ5X3J1bj1GYWxzZSk6CiAgICAiIiJJbnN0YWxsIHdoZWVscy4KCiAgICA6cGFyYW0gcmVxdWlyZW1lbnRzOiBBIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIG9yIHdoZWVsIGZpbGVzIHRvIGluc3RhbGwuCiAgICA6cGFyYW0gcmVxdWlyZW1lbnRzX2ZpbGU6IEEgZmlsZSBjb250YWluaW5nIHJlcXVpcmVtZW50cyB0byBpbnN0YWxsLgogICAgOnBhcmFtIHdoZWVsX2RpcnM6IEEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHdoZWVscy4KICAgIDpwYXJhbSBmb3JjZTogSW5zdGFsbCBhIHdoZWVsIGZpbGUgZXZlbiBpZiBpdCBpcyBub3QgY29tcGF0aWJsZS4KICAgIDpwYXJhbSBsaXN0X2ZpbGVzOiBPbmx5IGxpc3QgdGhlIGZpbGVzIHRvIGluc3RhbGwsIGRvbid0IGluc3RhbGwgdGhlbS4KICAgIDpwYXJhbSBkcnlfcnVuOiBEbyBldmVyeXRoaW5nIGJ1dCB0aGUgYWN0dWFsIGluc3RhbGwuCiAgICAiIiIKCiAgICAjIElmIG5vIHdoZWVsIGRpcmVjdG9yaWVzIHNwZWNpZmllZCwgdXNlIHRoZSBXSEVFTFBBVEggZW52aXJvbm1lbnQKICAgICMgdmFyaWFibGUsIG9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiB0aGF0IGlzIG5vdCBzZXQuCiAgICBpZiBub3Qgd2hlZWxfZGlyczoKICAgICAgICB3aGVlbHBhdGggPSBvcy5nZXRlbnYoIldIRUVMUEFUSCIpCiAgICAgICAgaWYgd2hlZWxwYXRoOgogICAgICAgICAgICB3aGVlbF9kaXJzID0gd2hlZWxwYXRoLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2hlZWxfZGlycyA9IFsgb3MucGF0aC5jdXJkaXIgXQoKICAgICMgR2V0IGEgbGlzdCBvZiBhbGwgdmFsaWQgd2hlZWxzIGluIHdoZWVsX2RpcnMKICAgIGFsbF93aGVlbHMgPSBbXQogICAgZm9yIGQgaW4gd2hlZWxfZGlyczoKICAgICAgICBmb3IgdyBpbiBvcy5saXN0ZGlyKGQpOgogICAgICAgICAgICBpZiB3LmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICAgICB3ZiA9IFdoZWVsRmlsZShvcy5wYXRoLmpvaW4oZCwgdykpCiAgICAgICAgICAgICAgICBpZiB3Zi5jb21wYXRpYmxlOgogICAgICAgICAgICAgICAgICAgIGFsbF93aGVlbHMuYXBwZW5kKHdmKQoKICAgICMgSWYgdGhlcmUgaXMgYSByZXF1aXJlbWVudHMgZmlsZSwgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHJlcXVpcmVtZW50cwogICAgaWYgcmVxdWlyZW1lbnRzX2ZpbGU6CiAgICAgICAgIyBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCBzZWFyY2ggZm9yIGl0IGluIHdoZWVsX2RpcnMKICAgICAgICAjIFRoaXMgYWxsb3dzIHN0YW5kYXJkIHJlcXVpcmVtZW50cyBmaWxlcyB0byBiZSBzdG9yZWQgd2l0aCB0aGUKICAgICAgICAjIHdoZWVscy4KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVxdWlyZW1lbnRzX2ZpbGUpOgogICAgICAgICAgICBmb3IgZCBpbiB3aGVlbF9kaXJzOgogICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbihkLCByZXF1aXJlbWVudHNfZmlsZSkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50c19maWxlID0gbmFtZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHdpdGggb3BlbihyZXF1aXJlbWVudHNfZmlsZSkgYXMgZmQ6CiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQoZmQpCgogICAgdG9faW5zdGFsbCA9IFtdCiAgICBmb3IgcmVxIGluIHJlcXVpcmVtZW50czoKICAgICAgICBpZiByZXEuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgIyBFeHBsaWNpdGx5IHNwZWNpZmllZCB3aGVlbCBmaWxlbmFtZQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZXEpOgogICAgICAgICAgICAgICAgd2YgPSBXaGVlbEZpbGUocmVxKQogICAgICAgICAgICAgICAgaWYgd2YuY29tcGF0aWJsZSBvciBmb3JjZToKICAgICAgICAgICAgICAgICAgICB0b19pbnN0YWxsLmFwcGVuZCh3ZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gKCJ7MH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbi4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mb3JjZSB0byBpbnN0YWxsIGFueXdheS4iLmZvcm1hdChyZXEpKQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFdoZWVsRXJyb3IobXNnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXZSBjb3VsZCBzZWFyY2ggb24gd2hlZWxfZGlycywgYnV0IGl0J3MgcHJvYmFibHkgT0sgdG8KICAgICAgICAgICAgICAgICMgYXNzdW1lIHRoZSB1c2VyIGhhcyBtYWRlIGFuIGVycm9yLgogICAgICAgICAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiTm8gc3VjaCB3aGVlbCBmaWxlOiB7fSIuZm9ybWF0KHJlcSkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgV2UgaGF2ZSBhIHJlcXVpcmVtZW50IHNwZWMKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgcGtnX3Jlc291cmNlcywgdGhpcyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbgogICAgICAgIG1hdGNoZXMgPSBtYXRjaGVzX3JlcXVpcmVtZW50KHJlcSwgYWxsX3doZWVscykKICAgICAgICBpZiBub3QgbWF0Y2hlczoKICAgICAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiTm8gbWF0Y2ggZm9yIHJlcXVpcmVtZW50IHt9Ii5mb3JtYXQocmVxKSkKICAgICAgICB0b19pbnN0YWxsLmFwcGVuZChtYXgobWF0Y2hlcykpCgogICAgIyBXZSBub3cgaGF2ZSBhIGxpc3Qgb2Ygd2hlZWxzIHRvIGluc3RhbGwKICAgIGlmIGxpc3RfZmlsZXM6CiAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiSW5zdGFsbGluZzpcbiIpCgogICAgaWYgZHJ5X3J1bjoKICAgICAgICByZXR1cm4KCiAgICBmb3Igd2YgaW4gdG9faW5zdGFsbDoKICAgICAgICBpZiBsaXN0X2ZpbGVzOgogICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgICAgezB9XG4iLmZvcm1hdCh3Zi5maWxlbmFtZSkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgd2YuaW5zdGFsbChmb3JjZT1mb3JjZSkKICAgICAgICB3Zi56aXBmaWxlLmNsb3NlKCkKCmRlZiBpbnN0YWxsX3NjcmlwdHMoZGlzdHJpYnV0aW9ucyk6CiAgICAiIiIKICAgIFJlZ2VuZXJhdGUgdGhlIGVudHJ5X3BvaW50cyBjb25zb2xlX3NjcmlwdHMgZm9yIHRoZSBuYW1lZCBkaXN0cmlidXRpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgZWFzeV9pbnN0YWxsCiAgICAgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIid3aGVlbCBpbnN0YWxsX3NjcmlwdHMnIG5lZWRzIHNldHVwdG9vbHMuIikKCiAgICBmb3IgZGlzdCBpbiBkaXN0cmlidXRpb25zOgogICAgICAgIHBrZ19yZXNvdXJjZXNfZGlzdCA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KQogICAgICAgIGluc3RhbGwgPSBnZXRfaW5zdGFsbF9jb21tYW5kKGRpc3QpCiAgICAgICAgY29tbWFuZCA9IGVhc3lfaW5zdGFsbC5lYXN5X2luc3RhbGwoaW5zdGFsbC5kaXN0cmlidXRpb24pCiAgICAgICAgY29tbWFuZC5hcmdzID0gWyd3aGVlbCddICMgZHVtbXkgYXJndW1lbnQKICAgICAgICBjb21tYW5kLmZpbmFsaXplX29wdGlvbnMoKQogICAgICAgIGNvbW1hbmQuaW5zdGFsbF9lZ2dfc2NyaXB0cyhwa2dfcmVzb3VyY2VzX2Rpc3QpCgpkZWYgY29udmVydChpbnN0YWxsZXJzLCBkZXN0X2RpciwgdmVyYm9zZSk6CiAgICByZXF1aXJlX3BrZ3Jlc291cmNlcygnd2hlZWwgY29udmVydCcpCgogICAgIyBPbmx5IHN1cHBvcnQgd2hlZWwgY29udmVydCBpZiBwa2dfcmVzb3VyY2VzIGlzIHByZXNlbnQKICAgIGZyb20gLi53aW5pbnN0MndoZWVsIGltcG9ydCBiZGlzdF93aW5pbnN0MndoZWVsCiAgICBmcm9tIC4uZWdnMndoZWVsIGltcG9ydCBlZ2cyd2hlZWwKCiAgICBmb3IgcGF0IGluIGluc3RhbGxlcnM6CiAgICAgICAgZm9yIGluc3RhbGxlciBpbiBpZ2xvYihwYXQpOgogICAgICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KGluc3RhbGxlcilbMV0gPT0gJy5lZ2cnOgogICAgICAgICAgICAgICAgY29udiA9IGVnZzJ3aGVlbAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29udiA9IGJkaXN0X3dpbmluc3Qyd2hlZWwKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInswfS4uLiAiLmZvcm1hdChpbnN0YWxsZXIpKQogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAgICAgICAgICAgIGNvbnYoaW5zdGFsbGVyLCBkZXN0X2RpcikKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIk9LXG4iKQoKZGVmIHBhcnNlcigpOgogICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgIHMgPSBwLmFkZF9zdWJwYXJzZXJzKGhlbHA9ImNvbW1hbmRzIikKCiAgICBkZWYga2V5Z2VuX2YoYXJncyk6CiAgICAgICAga2V5Z2VuKCkKICAgIGtleWdlbl9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2tleWdlbicsIGhlbHA9J0dlbmVyYXRlIHNpZ25pbmcga2V5JykKICAgIGtleWdlbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9a2V5Z2VuX2YpCgogICAgZGVmIHNpZ25fZihhcmdzKToKICAgICAgICBzaWduKGFyZ3Mud2hlZWxmaWxlKQogICAgc2lnbl9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3NpZ24nLCBoZWxwPSdTaWduIHdoZWVsJykKICAgIHNpZ25fcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICBzaWduX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1zaWduX2YpCgogICAgZGVmIHVuc2lnbl9mKGFyZ3MpOgogICAgICAgIHVuc2lnbihhcmdzLndoZWVsZmlsZSkKICAgIHVuc2lnbl9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3Vuc2lnbicsIGhlbHA9dW5zaWduLl9fZG9jX18pCiAgICB1bnNpZ25fcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICB1bnNpZ25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXVuc2lnbl9mKQoKICAgIGRlZiB2ZXJpZnlfZihhcmdzKToKICAgICAgICB2ZXJpZnkoYXJncy53aGVlbGZpbGUpCiAgICB2ZXJpZnlfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCd2ZXJpZnknLCBoZWxwPXZlcmlmeS5fX2RvY19fKQogICAgdmVyaWZ5X3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgdmVyaWZ5X3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz12ZXJpZnlfZikKCiAgICBkZWYgdW5wYWNrX2YoYXJncyk6CiAgICAgICAgdW5wYWNrKGFyZ3Mud2hlZWxmaWxlLCBhcmdzLmRlc3QpCiAgICB1bnBhY2tfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCd1bnBhY2snLCBoZWxwPSdVbnBhY2sgd2hlZWwnKQogICAgdW5wYWNrX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdCcsICctZCcsIGhlbHA9J0Rlc3RpbmF0aW9uIGRpcmVjdG9yeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScuJykKICAgIHVucGFja19wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHVucGFja19wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dW5wYWNrX2YpCgogICAgZGVmIGluc3RhbGxfZihhcmdzKToKICAgICAgICBpbnN0YWxsKGFyZ3MucmVxdWlyZW1lbnRzLCBhcmdzLnJlcXVpcmVtZW50c19maWxlLAogICAgICAgICAgICAgICAgYXJncy53aGVlbF9kaXJzLCBhcmdzLmZvcmNlLCBhcmdzLmxpc3RfZmlsZXMpCiAgICBpbnN0YWxsX3BhcnNlciA9IHMuYWRkX3BhcnNlcignaW5zdGFsbCcsIGhlbHA9J0luc3RhbGwgd2hlZWxzJykKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgncmVxdWlyZW1lbnRzJywgbmFyZ3M9JyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1JlcXVpcmVtZW50cyB0byBpbnN0YWxsLicpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9yY2UnLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSW5zdGFsbCBpbmNvbXBhdGlibGUgd2hlZWwgZmlsZXMuJykKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS13aGVlbC1kaXInLCAnLWQnLCBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nd2hlZWxfZGlycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRGlyZWN0b3JpZXMgY29udGFpbmluZyB3aGVlbHMuJykKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yZXF1aXJlbWVudHMtZmlsZScsICctcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQSBmaWxlIGNvbnRhaW5pbmcgcmVxdWlyZW1lbnRzIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbC4iKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxpc3QnLCAnLWwnLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J2xpc3RfZmlsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTGlzdCB3aGVlbHMgd2hpY2ggd291bGQgYmUgaW5zdGFsbGVkLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBkb24ndCBhY3R1YWxseSBpbnN0YWxsIGFueXRoaW5nLiIpCiAgICBpbnN0YWxsX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1pbnN0YWxsX2YpCgogICAgZGVmIGluc3RhbGxfc2NyaXB0c19mKGFyZ3MpOgogICAgICAgIGluc3RhbGxfc2NyaXB0cyhhcmdzLmRpc3RyaWJ1dGlvbnMpCiAgICBpbnN0YWxsX3NjcmlwdHNfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdpbnN0YWxsLXNjcmlwdHMnLCBoZWxwPSdJbnN0YWxsIGNvbnNvbGVfc2NyaXB0cycpCiAgICBpbnN0YWxsX3NjcmlwdHNfcGFyc2VyLmFkZF9hcmd1bWVudCgnZGlzdHJpYnV0aW9ucycsIG5hcmdzPScqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1JlZ2VuZXJhdGUgY29uc29sZV9zY3JpcHRzIGZvciB0aGVzZSBkaXN0cmlidXRpb25zJykKICAgIGluc3RhbGxfc2NyaXB0c19wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9aW5zdGFsbF9zY3JpcHRzX2YpCgogICAgZGVmIGNvbnZlcnRfZihhcmdzKToKICAgICAgICBjb252ZXJ0KGFyZ3MuaW5zdGFsbGVycywgYXJncy5kZXN0X2RpciwgYXJncy52ZXJib3NlKQogICAgY29udmVydF9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2NvbnZlcnQnLCBoZWxwPSdDb252ZXJ0IGVnZyBvciB3aW5pbnN0IHRvIHdoZWVsJykKICAgIGNvbnZlcnRfcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5zdGFsbGVycycsIG5hcmdzPScqJywgaGVscD0nSW5zdGFsbGVycyB0byBjb252ZXJ0JykKICAgIGNvbnZlcnRfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0LWRpcicsICctZCcsIGRlZmF1bHQ9b3MucGF0aC5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSB0byBzdG9yZSB3aGVlbHMgKGRlZmF1bHQgJShkZWZhdWx0KXMpIikKICAgIGNvbnZlcnRfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGNvbnZlcnRfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWNvbnZlcnRfZikKCiAgICBkZWYgdmVyc2lvbl9mKGFyZ3MpOgogICAgICAgIGZyb20gLi4gaW1wb3J0IF9fdmVyc2lvbl9fCiAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgid2hlZWwgJXNcbiIgJSBfX3ZlcnNpb25fXykKICAgIHZlcnNpb25fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCd2ZXJzaW9uJywgaGVscD0nUHJpbnQgdmVyc2lvbiBhbmQgZXhpdCcpCiAgICB2ZXJzaW9uX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz12ZXJzaW9uX2YpCgogICAgZGVmIGhlbHBfZihhcmdzKToKICAgICAgICBwLnByaW50X2hlbHAoKQogICAgaGVscF9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2hlbHAnLCBoZWxwPSdTaG93IHRoaXMgaGVscCcpCiAgICBoZWxwX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1oZWxwX2YpCgogICAgcmV0dXJuIHAKCmRlZiBtYWluKCk6CiAgICBwID0gcGFyc2VyKCkKICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQogICAgaWYgbm90IGhhc2F0dHIoYXJncywgJ2Z1bmMnKToKICAgICAgICBwLnByaW50X2hlbHAoKQogICAgZWxzZToKICAgICAgICAjIFhYWCBvbiBQeXRob24gMy4zIHdlIGdldCAnYXJncyBoYXMgbm8gZnVuYycgcmF0aGVyIHRoYW4gc2hvcnQgaGVscC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGFyZ3MuZnVuYyhhcmdzKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGV4Y2VwdCBXaGVlbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZS5tZXNzYWdlICsgIlxuIikKICAgIHJldHVybiAxClBLAwQUAAAAAAAAACEAz9gzshoTAAAaEwAAIgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3V0aWwucHkiIiJVdGlsaXR5IGZ1bmN0aW9ucy4iIiIKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBiYXNlNjQKaW1wb3J0IGpzb24KaW1wb3J0IGhhc2hsaWIKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgT3JkZXJlZERpY3QgPSBkaWN0CgpfX2FsbF9fID0gWyd1cmxzYWZlX2I2NGVuY29kZScsICd1cmxzYWZlX2I2NGRlY29kZScsICd1dGY4JywKICAgICAgICAgICAndG9fanNvbicsICdmcm9tX2pzb24nLCAnbWF0Y2hlc19yZXF1aXJlbWVudCddCgpkZWYgdXJsc2FmZV9iNjRlbmNvZGUoZGF0YSk6CiAgICAiIiJ1cmxzYWZlX2I2NGVuY29kZSB3aXRob3V0IHBhZGRpbmciIiIKICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUoZGF0YSkucnN0cmlwKGJpbmFyeSgnPScpKQoKCmRlZiB1cmxzYWZlX2I2NGRlY29kZShkYXRhKToKICAgICIiInVybHNhZmVfYjY0ZGVjb2RlIHdpdGhvdXQgcGFkZGluZyIiIgogICAgcGFkID0gYic9JyAqICg0IC0gKGxlbihkYXRhKSAmIDMpKQogICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGRlY29kZShkYXRhICsgcGFkKQoKCmRlZiB0b19qc29uKG8pOgogICAgJycnQ29udmVydCBnaXZlbiBkYXRhIHRvIEpTT04uJycnCiAgICByZXR1cm4ganNvbi5kdW1wcyhvLCBzb3J0X2tleXM9VHJ1ZSkKCgpkZWYgZnJvbV9qc29uKGopOgogICAgJycnRGVjb2RlIGEgSlNPTiBwYXlsb2FkLicnJwogICAgcmV0dXJuIGpzb24ubG9hZHMoaikKCmRlZiBvcGVuX2Zvcl9jc3YobmFtZSwgbW9kZSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICBubCA9IHt9CiAgICAgICAgYmluID0gJ2InCiAgICBlbHNlOgogICAgICAgIG5sID0geyAnbmV3bGluZSc6ICcnIH0KICAgICAgICBiaW4gPSAnJwogICAgcmV0dXJuIG9wZW4obmFtZSwgbW9kZSArIGJpbiwgKipubCkKCnRyeToKICAgIHVuaWNvZGUKCiAgICBkZWYgdXRmOChkYXRhKToKICAgICAgICAnJydVdGYtOCBlbmNvZGUgZGF0YS4nJycKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgogICAgICAgICAgICByZXR1cm4gZGF0YS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gZGF0YQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHV0ZjgoZGF0YSk6CiAgICAgICAgJycnVXRmLTggZW5jb2RlIGRhdGEuJycnCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgogICAgICAgICAgICByZXR1cm4gZGF0YS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gZGF0YQoKCnRyeToKICAgICMgRm9yIGVuY29kaW5nIGFzY2lpIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gYnl0ZXN0cmluZ3MsIGFzIGlzIHJlcGVhdGVkbHkKICAgICMgbmVjZXNzYXJ5IGluIEpTT04tYmFzZWQgY3J5cHRvIHVuZGVyIFB5dGhvbiAzCiAgICB1bmljb2RlCiAgICBkZWYgbmF0aXZlKHMpOgogICAgICAgIHJldHVybiBzCiAgICBkZWYgYmluYXJ5KHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBzCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgbmF0aXZlKHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gcwogICAgZGVmIGJpbmFyeShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHN0cik6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQoKY2xhc3MgSGFzaGluZ0ZpbGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZCwgaGFzaHR5cGU9J3NoYTI1NicpOgogICAgICAgIHNlbGYuZmQgPSBmZAogICAgICAgIHNlbGYuaGFzaHR5cGUgPSBoYXNodHlwZQogICAgICAgIHNlbGYuaGFzaCA9IGhhc2hsaWIubmV3KGhhc2h0eXBlKQogICAgICAgIHNlbGYubGVuZ3RoID0gMAogICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgogICAgICAgIHNlbGYuaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICBzZWxmLmxlbmd0aCArPSBsZW4oZGF0YSkKICAgICAgICBzZWxmLmZkLndyaXRlKGRhdGEpCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5mZC5jbG9zZSgpCiAgICBkZWYgZGlnZXN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuaGFzaHR5cGUgPT0gJ21kNSc6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmhhc2guaGV4ZGlnZXN0KCkKICAgICAgICBkaWdlc3QgPSBzZWxmLmhhc2guZGlnZXN0KCkKICAgICAgICByZXR1cm4gc2VsZi5oYXNodHlwZSArICc9JyArIG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpKQoKY2xhc3MgT3JkZXJlZERlZmF1bHREaWN0KE9yZGVyZWREaWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBzZWxmLmRlZmF1bHRfZmFjdG9yeSA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgKGFyZ3NbMF0gaXMgTm9uZSBvciBjYWxsYWJsZShhcmdzWzBdKSk6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUgb3IgTm9uZScpCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gYXJnc1swXQogICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KICAgICAgICBzdXBlcihPcmRlcmVkRGVmYXVsdERpY3QsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgX19taXNzaW5nX18gKHNlbGYsIGtleSk6CiAgICAgICAgaWYgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQgPSBzZWxmLmRlZmF1bHRfZmFjdG9yeSgpCiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCmlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgaW1wb3J0IGN0eXBlcy53aW50eXBlcwogICAgIyBDU0lETF9BUFBEQVRBIGZvciByZWZlcmVuY2UgLSBub3QgdXNlZCBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKICAgICMgZGlyc3BlYywgd2hpY2ggdXNlcyBMT0NBTF9BUFBEQVRBIGFuZCBDT01NT05fQVBQREFUQSBpbiB0aGF0IG9yZGVyCiAgICBjc2lkbCA9IGRpY3QoQ1NJRExfQVBQREFUQT0yNiwgQ1NJRExfTE9DQUxfQVBQREFUQT0yOCwKICAgICAgICAgICAgQ1NJRExfQ09NTU9OX0FQUERBVEE9MzUpCiAgICBkZWYgZ2V0X3BhdGgobmFtZSk6CiAgICAgICAgU0hHRlBfVFlQRV9DVVJSRU5UID0gMAogICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoY3R5cGVzLndpbnR5cGVzLk1BWF9QQVRIKQogICAgICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKDAsIGNzaWRsW25hbWVdLCAwLCBTSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgICAgICByZXR1cm4gYnVmLnZhbHVlCgogICAgZGVmIHNhdmVfY29uZmlnX3BhdGgoKnJlc291cmNlKToKICAgICAgICBhcHBkYXRhID0gZ2V0X3BhdGgoIkNTSURMX0xPQ0FMX0FQUERBVEEiKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYXBwZGF0YSwgKnJlc291cmNlKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgICAgIHJldHVybiBwYXRoCiAgICBkZWYgbG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKToKICAgICAgICBpZHMgPSBbIkNTSURMX0xPQ0FMX0FQUERBVEEiLCAiQ1NJRExfQ09NTU9OX0FQUERBVEEiXQogICAgICAgIGZvciBpZCBpbiBpZHM6CiAgICAgICAgICAgIGJhc2UgPSBnZXRfcGF0aChpZCkKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2UpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aAplbHNlOgogICAgZGVmIHNhdmVfY29uZmlnX3BhdGgoKnJlc291cmNlKToKICAgICAgICBpbXBvcnQgeGRnLkJhc2VEaXJlY3RvcnkKICAgICAgICByZXR1cm4geGRnLkJhc2VEaXJlY3Rvcnkuc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpCiAgICBkZWYgbG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKToKICAgICAgICBpbXBvcnQgeGRnLkJhc2VEaXJlY3RvcnkKICAgICAgICByZXR1cm4geGRnLkJhc2VEaXJlY3RvcnkubG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKQoKZGVmIG1hdGNoZXNfcmVxdWlyZW1lbnQocmVxLCB3aGVlbHMpOgogICAgIiIiTGlzdCBvZiB3aGVlbHMgbWF0Y2hpbmcgYSByZXF1aXJlbWVudC4KCiAgICA6cGFyYW0gcmVxOiBUaGUgcmVxdWlyZW1lbnQgdG8gc2F0aXNmeQogICAgOnBhcmFtIHdoZWVsczogTGlzdCBvZiB3aGVlbHMgdG8gc2VhcmNoLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFJlcXVpcmVtZW50CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgdXNlIHJlcXVpcmVtZW50cyB3aXRob3V0IHBrZ19yZXNvdXJjZXMiKQoKICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKHJlcSkKCiAgICBzZWxlY3RlZCA9IFtdCiAgICBmb3Igd2YgaW4gd2hlZWxzOgogICAgICAgIGYgPSB3Zi5wYXJzZWRfZmlsZW5hbWUKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT1mLmdyb3VwKCJuYW1lIiksIHZlcnNpb249Zi5ncm91cCgidmVyIikpCiAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgIHNlbGVjdGVkLmFwcGVuZCh3ZikKICAgIHJldHVybiBzZWxlY3RlZApQSwMEFAAAAAAAAAAhAPO05Ci3HgAAtx4AACsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC93aW5pbnN0MndoZWVsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgd2hlZWwuYmRpc3Rfd2hlZWwKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmZyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgbWFrZV9hcmNoaXZlCmZyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKZnJvbSB3aGVlbC5hcmNoaXZlIGltcG9ydCBhcmNoaXZlX3doZWVsZmlsZQpmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iCgplZ2dfaW5mb19yZSA9IHJlLmNvbXBpbGUocicnJyhefC8pKD9QPG5hbWU+W14vXSs/KS0oP1A8dmVyPi4rPykKICAgICgtKD9QPHB5dmVyPi4rPykpPygtKD9QPGFyY2g+Lis/KSk/LmVnZy1pbmZvKC98JCknJycsIHJlLlZFUkJPU0UpCgpkZWYgcGFyc2VfaW5mbyh3aW5pbmZvX25hbWUsIGVnZ2luZm9fbmFtZSk6CiAgICAiIiJFeHRyYWN0IG1ldGFkYXRhIGZyb20gZmlsZW5hbWVzLgogICAgCiAgICBFeHRyYWN0cyB0aGUgNCBtZXRhZGF0YWl0ZW1zIG5lZWRlZCAobmFtZSwgdmVyc2lvbiwgcHl2ZXJzaW9uLCBhcmNoKSBmcm9tCiAgICB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgZWdnLWluZm8gZGlyZWN0b3J5IGVtYmVkZGVkIGluCiAgICB0aGUgemlwZmlsZSAoaWYgYW55KS4KCiAgICBUaGUgZWdnaW5mbyBmaWxlbmFtZSBoYXMgdGhlIGZvcm1hdDo6CgogICAgICAgIG5hbWUtdmVyKC1weXZlcikoLWFyY2gpLmVnZy1pbmZvCgogICAgVGhlIGluc3RhbGxlciBmaWxlbmFtZSBoYXMgdGhlIGZvcm1hdDo6CgogICAgICAgIG5hbWUtdmVyLmFyY2goLXB5dmVyKS5leGUKCiAgICBTb21lIHRoaW5ncyB0byBub3RlOgoKICAgIDEuIFRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaXMgbm90IGRlZmluaXRpdmUuIEFuIGluc3RhbGxlciBjYW4gYmUgcmVuYW1lZAogICAgICAgYW5kIHdvcmsgcGVyZmVjdGx5IHdlbGwgYXMgYW4gaW5zdGFsbGVyLiBTbyBtb3JlIHJlbGlhYmxlIGRhdGEgc2hvdWxkCiAgICAgICBiZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLgogICAgMi4gVGhlIGVnZy1pbmZvIGRhdGEgc2hvdWxkIGJlIHByZWZlcnJlZCBmb3IgdGhlIG5hbWUgYW5kIHZlcnNpb24sIGJlY2F1c2UKICAgICAgIHRoZXNlIGNvbWUgc3RyYWlnaHQgZnJvbSB0aGUgZGlzdHV0aWxzIG1ldGFkYXRhLCBhbmQgYXJlIG1hbmRhdG9yeS4KICAgIDMuIFRoZSBweXZlciBmcm9tIHRoZSBlZ2ctaW5mbyBkYXRhIHNob3VsZCBiZSBpZ25vcmVkLCBhcyBpdCBpcwogICAgICAgY29uc3RydWN0ZWQgZnJvbSB0aGUgdmVyc2lvbiBvZiBQeXRob24gdXNlZCB0byBidWlsZCB0aGUgaW5zdGFsbGVyLAogICAgICAgd2hpY2ggaXMgaXJyZWxldmFudCAtIHRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaXMgY29ycmVjdCBoZXJlIChldmVuIHRvCiAgICAgICB0aGUgcG9pbnQgdGhhdCB3aGVuIGl0J3Mgbm90IHRoZXJlLCBhbnkgdmVyc2lvbiBpcyBpbXBsaWVkKS4KICAgIDQuIFRoZSBhcmNoaXRlY3R1cmUgbXVzdCBiZSB0YWtlbiBmcm9tIHRoZSBpbnN0YWxsZXIgZmlsZW5hbWUsIGFzIGl0IGlzCiAgICAgICBub3QgaW5jbHVkZWQgaW4gdGhlIGVnZy1pbmZvIGRhdGEuCiAgICA1LiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBpbnN0YWxsZXJzIHN0aWxsIGhhdmUgYW4gYXJjaGl0ZWN0dXJlIGJlY2F1c2UgdGhlCiAgICAgICBpbnN0YWxsZXIgZm9ybWF0IGl0c2VsZiAoYmVpbmcgZXhlY3V0YWJsZSkgaXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljLiBXZQogICAgICAgc2hvdWxkIHRoZXJlZm9yZSBpZ25vcmUgdGhlIGFyY2hpdGVjdHVyZSBpZiB0aGUgY29udGVudCBpcyBwdXJlLXB5dGhvbi4KICAgICIiIgoKICAgIGVnZ2luZm8gPSBOb25lCiAgICBpZiBlZ2dpbmZvX25hbWU6CiAgICAgICAgZWdnaW5mbyA9IGVnZ19pbmZvX3JlLnNlYXJjaChlZ2dpbmZvX25hbWUpCiAgICAgICAgaWYgbm90IGVnZ2luZm86CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVnZyBpbmZvIGZpbGVuYW1lICVzIGlzIG5vdCB2YWxpZCIgJQogICAgICAgICAgICAgICAgICAgIChlZ2dpbmZvX25hbWUsKSkKCiAgICAjIFBhcnNlIHRoZSB3aW5pbnN0IGZpbGVuYW1lCiAgICAjIDEuIERpc3RyaWJ1dGlvbiBuYW1lICh1cCB0byB0aGUgZmlyc3QgJy0nKQogICAgd19uYW1lLCBzZXAsIHJlc3QgPSB3aW5pbmZvX25hbWUucGFydGl0aW9uKCctJykKICAgIGlmIG5vdCBzZXA6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW5zdGFsbGVyIGZpbGVuYW1lICVzIGlzIG5vdCB2YWxpZCIgJQogICAgICAgICAgICAgICAgKHdpbmluZm9fbmFtZSwpKQogICAgIyBTdHJpcCAnLmV4ZScKICAgIHJlc3QgPSByZXN0WzotNF0KICAgICMgMi4gUHl0aG9uIHZlcnNpb24gKGZyb20gdGhlIGxhc3QgJy0nLCBtdXN0IHN0YXJ0IHdpdGggJ3B5JykKICAgIHJlc3QyLCBzZXAsIHdfcHl2ZXIgPSByZXN0LnJwYXJ0aXRpb24oJy0nKQogICAgaWYgc2VwIGFuZCB3X3B5dmVyLnN0YXJ0c3dpdGgoJ3B5Jyk6CiAgICAgICAgcmVzdCA9IHJlc3QyCiAgICAgICAgd19weXZlciA9IHdfcHl2ZXIucmVwbGFjZSgnLicsICcnKQogICAgZWxzZToKICAgICAgICAjIE5vdCB2ZXJzaW9uIHNwZWNpZmljIC0gdXNlIHB5Mi5weTMuIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRoYXQKICAgICAgICAjIHB1cmUtUHl0aG9uIGNvZGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyIGFuZCAzLCB0aGVyZQogICAgICAgICMgaXMgbm8gd2F5IG9mIGtub3dpbmcgZnJvbSB0aGUgd2luaW5zdCBmb3JtYXQsIHNvIHdlIGFzc3VtZSB0aGUgYmVzdAogICAgICAgICMgaGVyZSAodGhlIHVzZXIgY2FuIGFsd2F5cyBtYW51YWxseSByZW5hbWUgdGhlIHdoZWVsIHRvIGJlIG1vcmUKICAgICAgICAjIHJlc3RyaWN0aXZlIGlmIG5lZWRlZCkuCiAgICAgICAgd19weXZlciA9ICdweTIucHkzJwogICAgIyAzLiBWZXJzaW9uIGFuZCBhcmNoaXRlY3R1cmUKICAgIHdfdmVyLCBzZXAsIHdfYXJjaCA9IHJlc3QucnBhcnRpdGlvbignLicpCiAgICBpZiBub3Qgc2VwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkluc3RhbGxlciBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICh3aW5pbmZvX25hbWUsKSkKCiAgICBpZiBlZ2dpbmZvOgogICAgICAgIHdfbmFtZSA9IGVnZ2luZm8uZ3JvdXAoJ25hbWUnKQogICAgICAgIHdfdmVyID0gZWdnaW5mby5ncm91cCgndmVyJykKCiAgICByZXR1cm4gZGljdChuYW1lPXdfbmFtZSwgdmVyPXdfdmVyLCBhcmNoPXdfYXJjaCwgcHl2ZXI9d19weXZlcikKCmRlZiBiZGlzdF93aW5pbnN0MndoZWVsKHBhdGgsIGRlc3RfZGlyPW9zLnBhdGguY3VyZGlyKToKICAgIGJkdyA9IHppcGZpbGUuWmlwRmlsZShwYXRoKQoKICAgICMgU2VhcmNoIGZvciBlZ2ctaW5mbyBpbiB0aGUgYXJjaGl2ZQogICAgZWdnaW5mb19uYW1lID0gTm9uZQogICAgZm9yIGZpbGVuYW1lIGluIGJkdy5uYW1lbGlzdCgpOgogICAgICAgIGlmICcuZWdnLWluZm8nIGluIGZpbGVuYW1lOgogICAgICAgICAgICBlZ2dpbmZvX25hbWUgPSBmaWxlbmFtZQogICAgICAgICAgICBicmVhawoKICAgIGluZm8gPSBwYXJzZV9pbmZvKG9zLnBhdGguYmFzZW5hbWUocGF0aCksIGVnZ2luZm9fbmFtZSkKCiAgICByb290X2lzX3B1cmVsaWIgPSBUcnVlCiAgICBmb3IgemlwaW5mbyBpbiBiZHcuaW5mb2xpc3QoKToKICAgICAgICBpZiB6aXBpbmZvLmZpbGVuYW1lLnN0YXJ0c3dpdGgoJ1BMQVRMSUInKToKICAgICAgICAgICAgcm9vdF9pc19wdXJlbGliID0gRmFsc2UKICAgICAgICAgICAgYnJlYWsKICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBwYXRocyA9IHsncHVyZWxpYic6ICcnfQogICAgZWxzZToKICAgICAgICBwYXRocyA9IHsncGxhdGxpYic6ICcnfQoKICAgIGRpc3RfaW5mbyA9ICIlKG5hbWUpcy0lKHZlcilzIiAlIGluZm8KICAgIGRhdGFkaXIgPSAiJXMuZGF0YS8iICUgZGlzdF9pbmZvCgogICAgIyByZXdyaXRlIHBhdGhzIHRvIHRyaWNrIFppcEZpbGUgaW50byBleHRyYWN0aW5nIGFuIGVnZwogICAgIyBYWFggZ3JhYiB3aW5pbnN0IC5pbmkgLSBiZXR3ZWVuIC5leGUsIHBhZGRpbmcsIGFuZCBmaXJzdCB6aXAgZmlsZS4KICAgIG1lbWJlcnMgPSBbXQogICAgZWdnaW5mb19uYW1lID0gJycKICAgIGZvciB6aXBpbmZvIGluIGJkdy5pbmZvbGlzdCgpOgogICAgICAgIGtleSwgYmFzZW5hbWUgPSB6aXBpbmZvLmZpbGVuYW1lLnNwbGl0KCcvJywgMSkKICAgICAgICBrZXkgPSBrZXkubG93ZXIoKQogICAgICAgIGJhc2VwYXRoID0gcGF0aHMuZ2V0KGtleSwgTm9uZSkKICAgICAgICBpZiBiYXNlcGF0aCBpcyBOb25lOgogICAgICAgICAgICBiYXNlcGF0aCA9IGRhdGFkaXIgKyBrZXkubG93ZXIoKSArICcvJwogICAgICAgIG9sZG5hbWUgPSB6aXBpbmZvLmZpbGVuYW1lCiAgICAgICAgbmV3bmFtZSA9IGJhc2VwYXRoICsgYmFzZW5hbWUKICAgICAgICB6aXBpbmZvLmZpbGVuYW1lID0gbmV3bmFtZQogICAgICAgIGRlbCBiZHcuTmFtZVRvSW5mb1tvbGRuYW1lXQogICAgICAgIGJkdy5OYW1lVG9JbmZvW25ld25hbWVdID0gemlwaW5mbwogICAgICAgICMgQ29sbGVjdCBtZW1iZXIgbmFtZXMsIGJ1dCBvbWl0ICcnIChmcm9tIGFuIGVudHJ5IGxpa2UgIlBMQVRMSUIvIgogICAgICAgIGlmIG5ld25hbWU6CiAgICAgICAgICAgIG1lbWJlcnMuYXBwZW5kKG5ld25hbWUpCiAgICAgICAgIyBSZW1lbWJlciBlZ2ctaW5mbyBuYW1lIGZvciB0aGUgZWdnMmRpc3QgY2FsbCBiZWxvdwogICAgICAgIGlmIG5vdCBlZ2dpbmZvX25hbWU6CiAgICAgICAgICAgIGlmIG5ld25hbWUuZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgZWdnaW5mb19uYW1lID0gbmV3bmFtZQogICAgICAgICAgICBlbGlmICcuZWdnLWluZm8vJyBpbiBuZXduYW1lOgogICAgICAgICAgICAgICAgZWdnaW5mb19uYW1lLCBzZXAsIF8gPSBuZXduYW1lLnJwYXJ0aXRpb24oJy8nKQogICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Il9iMnciKQogICAgYmR3LmV4dHJhY3RhbGwoZGlyLCBtZW1iZXJzKQoKICAgICMgZWdnMndoZWVsCiAgICBhYmkgPSAnbm9uZScKICAgIHB5dmVyID0gaW5mb1sncHl2ZXInXQogICAgYXJjaCA9IChpbmZvWydhcmNoJ10gb3IgJ2FueScpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICAjIFdpbmluc3QgaW5zdGFsbGVycyBhbHdheXMgaGF2ZSBhcmNoIGV2ZW4gaWYgdGhleSBhcmUgbm90CiAgICAjIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyAoYmVjYXVzZSB0aGUgZm9ybWF0IGl0c2VsZiBpcykuCiAgICAjIFNvLCBhc3N1bWUgdGhlIGNvbnRlbnQgaXMgYXJjaGl0ZWN0dXJlLW5ldXRyYWwgaWYgcm9vdCBpcyBwdXJlbGliLgogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGFyY2ggPSAnYW55JwogICAgIyBJZiB0aGUgaW5zdGFsbGVyIGlzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYywgaXQncyBhbG1vc3QgY2VydGFpbmx5IGFsc28KICAgICMgQ1B5dGhvbi1zcGVjaWZpYy4KICAgIGlmIGFyY2ggIT0gJ2FueSc6CiAgICAgICAgcHl2ZXIgPSBweXZlci5yZXBsYWNlKCdweScsICdjcCcpCiAgICB3aGVlbF9uYW1lID0gJy0nLmpvaW4oKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBweXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncgPSB3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbChkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKICAgIGVsc2U6CiAgICAgICAgYncgPSBfYmRpc3Rfd2hlZWxfdGFnKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQoKICAgIGJ3LnJvb3RfaXNfcHVyZSA9IHJvb3RfaXNfcHVyZWxpYgogICAgYncucHl0aG9uX3RhZyA9IHB5dmVyCiAgICBidy5wbGF0X25hbWVfc3VwcGxpZWQgPSBUcnVlCiAgICBidy5wbGF0X25hbWUgPSBpbmZvWydhcmNoJ10gb3IgJ2FueScKCiAgICBpZiBub3Qgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3LmZ1bGxfdGFnX3N1cHBsaWVkID0gVHJ1ZQogICAgICAgIGJ3LmZ1bGxfdGFnID0gKHB5dmVyLCBhYmksIGFyY2gpCgogICAgZGlzdF9pbmZvX2RpciA9IG9zLnBhdGguam9pbihkaXIsICclcy5kaXN0LWluZm8nICUgZGlzdF9pbmZvKQogICAgYncuZWdnMmRpc3Qob3MucGF0aC5qb2luKGRpciwgZWdnaW5mb19uYW1lKSwgZGlzdF9pbmZvX2RpcikKICAgIGJ3LndyaXRlX3doZWVsZmlsZShkaXN0X2luZm9fZGlyLCBnZW5lcmF0b3I9J3dpbmluc3Qyd2hlZWwnKQogICAgYncud3JpdGVfcmVjb3JkKGRpciwgZGlzdF9pbmZvX2RpcikKICAgIAogICAgYXJjaGl2ZV93aGVlbGZpbGUob3MucGF0aC5qb2luKGRlc3RfZGlyLCB3aGVlbF9uYW1lKSwgZGlyKQogICAgcm10cmVlKGRpcikKCgpjbGFzcyBfYmRpc3Rfd2hlZWxfdGFnKHdoZWVsLmJkaXN0X3doZWVsLmJkaXN0X3doZWVsKToKICAgICMgYWxsb3cgdGhlIGNsaWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgd2hlZWwgdGFnCiAgICAjIFRoZSBkZWZhdWx0IGJkaXN0X3doZWVsIGltcGxlbWVudGF0aW9uIHVzZXMgcHl0aG9uIGFuZCBhYmkgdGFncwogICAgIyBvZiB0aGUgcnVubmluZyBweXRob24gcHJvY2Vzcy4gVGhpcyBpcyBub3Qgc3VpdGFibGUgZm9yCiAgICAjIGdlbmVyYXRpbmcvcmVwYWNrYWdpbmcgcHJlYnVpbGQgYmluYXJpZXMuCgogICAgZnVsbF90YWdfc3VwcGxpZWQgPSBGYWxzZQogICAgZnVsbF90YWcgPSBOb25lICAjIE5vbmUgb3IgYSAocHl0YWcsIHNvYWJpdGFnLCBwbGF0dGFnKSB0cmlwbGUKCiAgICBkZWYgZ2V0X3RhZyhzZWxmKToKICAgICAgICBpZiBzZWxmLmZ1bGxfdGFnX3N1cHBsaWVkIGFuZCBzZWxmLmZ1bGxfdGFnIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5mdWxsX3RhZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfYmRpc3Rfd2hlZWxfdGFnLCBzZWxmKS5nZXRfdGFnKCkKCgpkZWYgbWFpbigpOgogICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5zdGFsbGVycycsIG5hcmdzPScqJywgaGVscD0iSW5zdGFsbGVycyB0byBjb252ZXJ0IikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdC1kaXInLCAnLWQnLCBkZWZhdWx0PW9zLnBhdGguY3VyZGlyLAogICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgdG8gc3RvcmUgd2hlZWxzIChkZWZhdWx0ICUoZGVmYXVsdClzKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIGZvciBwYXQgaW4gYXJncy5pbnN0YWxsZXJzOgogICAgICAgIGZvciBpbnN0YWxsZXIgaW4gaWdsb2IocGF0KToKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiezB9Li4uICIuZm9ybWF0KGluc3RhbGxlcikpCiAgICAgICAgICAgIGJkaXN0X3dpbmluc3Qyd2hlZWwoaW5zdGFsbGVyLCBhcmdzLmRlc3RfZGlyKQogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAASAAAAc3VicGFyL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAaAAAAc3VicGFyL3J1bnRpbWUvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAABzdWJwYXIvcnVudGltZS9zdXBwb3J0LnB5IyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIiIiUnVudGltZSBzdXBwb3J0IGNvZGUgZm9yIGV4ZWN1dGFibGVzIGNyZWF0ZWQgYnkgU3VicGFyLgoKMS4gVGhpcmQtcGFydHkgbW9kdWxlcyByZXF1aXJlIHNvbWUgUFlUSE9OUEFUSCBtYW5pcHVsYXRpb24uCgoyLiBQeXRob24gY2FuIG5hdGl2ZWx5IGltcG9ydCBweXRob24gbW9kdWxlcyBmcm9tIGEgemlwIGFyY2hpdmUsIGJ1dAogICBDIGV4dGVuc2lvbiBtb2R1bGVzIHJlcXVpcmUgc29tZSBoZWxwLgoKMy4gUmVzb3VyY2VzIHN0b3JlZCBpbiBhIC5wYXIgZmlsZSBtYXkgbmVlZCB0byBiZSBleHBvc2VkIGFzIE9TLWxldmVsCiAgIGZpbGVzIGluc3RlYWQgb2YgUHl0aG9uIEZpbGUgb2JqZWN0cy4KCldlIGhvb2sgaW50byB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIGlmIHByZXNlbnQsIHRvIGFjaGlldmUgMiBhbmQgMy4KCkxpbWl0YXRpb25zOgoKQS4gUmV0cmlldmluZyByZXNvdXJjZXMgZnJvbSBwYWNrYWdlcwoKSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGRvIHRoaXM6CiAgICBmbiA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ215cGFja2FnZScsICdteWZpbGUnKQpCdXQgaW5zdGVhZCBvbmUgbXVzdCBkbwogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZS5zcGVjKCdteXBhY2thZ2UnKSwKICAgICAgICAgICAgICdteWZpbGUnKQoKQi4gRXh0cmFjdGlvbiBkaXIKCllvdSBzaG91bGQgZXhwbGljaXRseSBzZXQgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBkaXJlY3RvcnksIHZpYQpgcGtnX3Jlc291cmNlcy5zZXRfZXh0cmFjdGlvbl9wYXRoKG15X2RpcmVjdG9yeSlgLCBzaW5jZSB0aGUgZGVmYXVsdAppcyBub3Qgc2FmZS4gIEZvciBleGFtcGxlOgoKICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgcGtnX3Jlc291cmNlcy5zZXRfZXh0cmFjdGlvbih0bXBkaXIpCgpZb3Ugc2hvdWxkIGFycmFuZ2UgZm9yIHRoYXQgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQgYXQgc29tZSBwb2ludC4KTm90ZSB0aGF0IHBrZ19yZXNvdXJjZXMuY2xlYW51cF9yZXNvdXJjZXMoKSBpcyBhbiB1bmltcGxlbWVudGVkIG5vLW9wLApzbyB1c2Ugc29tZXRoaW5nIGVsc2UuICBGb3IgZXhhbXBsZToKCiAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiBzaHV0aWwucm10cmVlKHRtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKCiIiIgoKaW1wb3J0IGF0ZXhpdAppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAoKCmRlZiBfbG9nKG1zZyk6CiAgICAiIiJQcmludCBhIGRlYnVnZ2luZyBtZXNzYWdlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBweXRob24gLXZ2IG91dHB1dCIiIgogICAgaWYgc3lzLmZsYWdzLnZlcmJvc2U6CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG4nKQoKCmRlZiBfZmluZF9hcmNoaXZlKCk6CiAgICAiIiJGaW5kIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIC5wYXIgZmlsZQoKICAgIFdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBwcmVmaXggaXMgbm9uLWVtcHR5LgogICAgIiIiCiAgICBtYWluID0gc3lzLm1vZHVsZXMuZ2V0KCdfX21haW5fXycpCiAgICBpZiBub3QgbWFpbjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fIG1vZHVsZSBub3QgZm91bmQnKQogICAgICAgIHJldHVybiBOb25lCiAgICBtYWluX2xvYWRlciA9IGdldGF0dHIobWFpbiwgJ19fbG9hZGVyX18nKQogICAgaWYgbm90IG1haW5fbG9hZGVyOgogICAgICAgIF9sb2coJyMgX19tYWluX18uX19sb2FkZXJfXyBub3Qgc2V0JykKICAgICAgICByZXR1cm4gTm9uZQogICAgcHJlZml4ID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ3ByZWZpeCcpCiAgICBpZiBwcmVmaXggIT0gJyc6CiAgICAgICAgX2xvZygnIyB1bmV4cGVjdGVkIHByZWZpeCBmb3IgX19tYWluX18uX19sb2FkZXJfXyBpcyAlcycgJQogICAgICAgICAgICAgbWFpbl9sb2FkZXIucHJlZml4KQogICAgICAgIHJldHVybiBOb25lCiAgICBhcmNoaXZlX3BhdGggPSBnZXRhdHRyKG1haW5fbG9hZGVyLCAnYXJjaGl2ZScpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIF9sb2coJyMgbWlzc2luZyBhcmNoaXZlIGZvciBfX21haW5fXy5fX2xvYWRlcl9fJykKICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIGFyY2hpdmVfcGF0aAoKCmRlZiBfZXh0cmFjdF9maWxlcyhhcmNoaXZlX3BhdGgpOgogICAgIiIiRXh0cmFjdCB0aGUgY29udGVudHMgb2YgdGhpcyAucGFyIGZpbGUgdG8gZGlzay4KCiAgICBUaGlzIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgcmVnaXN0ZXJzIGFuIGF0ZXhpdAogICAgaGFuZGxlciB0byBjbGVhbiB0aGF0IGRpcmVjdG9yeSBvbiBwcm9ncmFtIGV4aXQuICBFeHRyYWN0aW9uIGFuZAogICAgY2xlYW51cCB3aWxsIHBvdGVudGlhbGx5IHVzZSBzaWduaWZpY2FudCB0aW1lIGFuZCBkaXNrIHNwYWNlLgoKICAgIFJldHVybnM6CiAgICAgICAgRGlyZWN0b3J5IHdoZXJlIGNvbnRlbnRzIHdlcmUgZXh0cmFjdGVkIHRvLgogICAgIiIiCiAgICBleHRyYWN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQoKICAgIGRlZiBfZXh0cmFjdF9maWxlc19jbGVhbnVwKCk6CiAgICAgICAgc2h1dGlsLnJtdHJlZShleHRyYWN0X2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgYXRleGl0LnJlZ2lzdGVyKF9leHRyYWN0X2ZpbGVzX2NsZWFudXApCiAgICBfbG9nKCcjIGV4dHJhY3RpbmcgJXMgdG8gJXMnICUgKGFyY2hpdmVfcGF0aCwgZXh0cmFjdF9kaXIpKQoKICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGFyY2hpdmVfcGF0aCwgbW9kZT0ncicpCiAgICB6aXBfZmlsZS5leHRyYWN0YWxsKGV4dHJhY3RfZGlyKQogICAgemlwX2ZpbGUuY2xvc2UoKQoKICAgIHJldHVybiBleHRyYWN0X2RpcgoKCmRlZiBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgIiIiQ2hlY2sgdGhhdCBwa2dfcmVzb3VyY2VzIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQuIiIiCiAgICAjIENoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBpcyBuZXcgZW5vdWdoLgogICAgIwogICAgIyBEZXRlcm1pbmluZyB0aGUgdmVyc2lvbiBvZiBhbiBhcmJpdHJhcmlseSBvbGQgdmVyc2lvbiBvZgogICAgIyBwa2dfcmVzb3VyY2VzIGlzIHRvdWdoLCBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uIGxpdGVyYWwsCiAgICAjIGFuZCB0aGUgYWNjb21wYW55aW5nIHNldHVwdG9vbHMgcGFja2FnZSBjb21wdXRlcyBpdHMgdmVyc2lvbgogICAgIyBkeW5hbWljYWxseSBmcm9tIG1ldGFkYXRhIHRoYXQgbWlnaHQgbm90IGV4aXN0LiAgQWxzbyBzZXR1cHRvb2xzCiAgICAjIG1pZ2h0IG5vdCBleGlzdCwgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSBvZiB0aGUgcGlwLXZlbmRvcmVkIGNvcHkKICAgICMgb2YgcGtnX3Jlc291cmNlcy4KICAgICMKICAgICMgV2UgZG8gYSBmZWF0dXJlIGRldGVjdGlvbiBpbnN0ZWFkLiAgV2UgZXhhbWluZQogICAgIyBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQuYWRkLCBhbmQgc2VlIGlmIGl0IGhhcyBhdCBsZWFzdCB0aGUKICAgICMgdGhpcmQgZGVmYXVsdCBhcmd1bWVudCAoJ3JlcGxhY2UnKS4KICAgIHRyeToKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgZGVmYXVsdHMgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQuYWRkLmltX2Z1bmMuZnVuY19kZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5fX2RlZmF1bHRzX18KICAgICAgICByZXR1cm4gbGVuKGRlZmF1bHRzKSA+PSAzCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIF9zZXR1cF9wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXNfbmFtZSk6CiAgICAiIiJTZXR1cCBob29rcyBpbnRvIHRoZSBgcGtnX3Jlc291cmNlc2AgbW9kdWxlCgogICAgVGhpcyBlbmFibGVzIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSB0byBmaW5kIG1ldGFkYXRhIGZyb20gd2hlZWxzCiAgICB0aGF0IGhhdmUgYmVlbiBpbmNsdWRlZCBpbiB0aGlzIC5wYXIgZmlsZS4KCiAgICBUaGUgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGhlcmUgYXJlIHNjb3BlZCB0byB0aGlzIGZ1bmN0aW9uLCBzaW5jZQogICAgd2UgbWlnaHQgaGF2ZSBtdWx0aXRwbGUgcGtnX3Jlc291cmNlcyBtb2R1bGVzLCBvciBub25lLgogICAgIiIiCgogICAgdHJ5OgogICAgICAgIF9faW1wb3J0X18ocGtnX3Jlc291cmNlc19uYW1lKQogICAgICAgIHBrZ19yZXNvdXJjZXMgPSBzeXMubW9kdWxlcy5nZXQocGtnX3Jlc291cmNlc19uYW1lKQogICAgICAgIGlmIHBrZ19yZXNvdXJjZXMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBTa2lwIHNldHVwCiAgICAgICAgcmV0dXJuCgogICAgaWYgbm90IF92ZXJzaW9uX2NoZWNrX3BrZ19yZXNvdXJjZXMocGtnX3Jlc291cmNlcyk6CiAgICAgICAgIyBTa2lwIHNldHVwCiAgICAgICAgcmV0dXJuCgogICAgY2xhc3MgRGlzdEluZm9NZXRhZGF0YShwa2dfcmVzb3VyY2VzLkVnZ01ldGFkYXRhKToKICAgICAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgemlwIGZpbGVzIGNvbnRhaW5pbmcgLmRpc3QtaW5mbwoKICAgICAgICBJbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoKSwgd2UgY2FsbAogICAgICAgIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoZGlyZWN0b3J5X25hbWUpLiAgSG93ZXZlciwgaXQgZG9lc24ndAogICAgICAgIHdvcmsgd2l0aCBFZ2dNZXRhZGF0YSwgYmVjYXVzZSBfemlwaW5mb19uYW1lKCkgZXhwZWN0cyB0aGUKICAgICAgICBkaXJlY3RvcnkgbmFtZSB0byBlbmQgd2l0aCBhIC8sIGJ1dCBtZXRhZGF0YS5fbGlzdGRpcigpIHdoaWNoCiAgICAgICAgZXhwZWN0cyB0aGUgZGlyZWN0b3J5IHRvIF9ub3RfIGVuZCB3aXRoIGEgLy4KCiAgICAgICAgVGhlcmVmb3JlIHRoaXMgY2xhc3MgZXhpc3RzLgogICAgICAgICIiIgoKICAgICAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICAgICAiIiJPdmVycmlkZXMgRWdnTWV0YWRhdGEuX3ppcGluZm9fbmFtZSIiIgogICAgICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhCiAgICAgICAgICAgICMgemlwZmlsZSBzdWJwYXRoIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgICAgICMgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQogICAgICAgICAgICBmc3BhdGggPSBmc3BhdGgucnN0cmlwKG9zLnNlcCkKICAgICAgICAgICAgaWYgZnNwYXRoID09IHNlbGYubG9hZGVyLmFyY2hpdmU6CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl9wYXJ0cyIiIgogICAgICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0CiAgICAgICAgICAgICMgbGlzdC4KICAgICAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlICsgemlwX3BhdGgKICAgICAgICAgICAgaWYgZnNwYXRoID09IHNlbGYuZWdnX3Jvb3Q6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICAgICAgKQoKICAgIGRlZiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBkaXN0LWluZm8gc3R5bGUgbWV0YWRhdGEgaW4gemlwIGZpbGVzLgoKICAgICAgICBpbXBvcnRlcjogUEVQIDMwMi1zdHlsZSBJbXBvcnRlciBvYmplY3QKICAgICAgICBwYXRoX2l0ZW0gKHN0cik6IGZpbGVuYW1lIG9yIHBzZXVkby1maWxlbmFtZSBsaWtlOgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyCiAgICAgICAgICAgIG9yCiAgICAgICAgICAgIC91c3Ivc29tZWRpcnMvbWFpbi5wYXIvcHlwaV9fcG9ydHBpY2tlcl8xXzJfMAogICAgICAgIG9ubHkgKGJvb2wpOiBXZSBpZ25vcmUgdGhlIGBvbmx5YCBmbGFnIGJlY2F1c2UgaXQncyBub3QgY2xlYXIKICAgICAgICAgICAgd2hhdCBpdCBzaG91bGQgYWN0dWFsbHkgZG8gaW4gdGhpcyBjYXNlLgoKICAgICAgICBZaWVsZHMgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gb2JqZWN0cwogICAgICAgICIiIgogICAgICAgIG1ldGFkYXRhID0gRGlzdEluZm9NZXRhZGF0YShpbXBvcnRlcikKICAgICAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHN1Yml0ZW0pCiAgICAgICAgICAgIGlmIGV4dC5sb3dlcigpID09ICcuZGlzdC1pbmZvJzoKICAgICAgICAgICAgICAgICMgUGFyc2UgZGlzdHJpYnV0aW9uIG5hbWUKICAgICAgICAgICAgICAgIG1hdGNoID0gcGtnX3Jlc291cmNlcy5FR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9ICd1bmtub3duJwogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gbWF0Y2guZ3JvdXAoJ25hbWUnKQogICAgICAgICAgICAgICAgIyBDcmVhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgICAgIHN1Ym1ldGEgPSBEaXN0SW5mb01ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoX2l0ZW0pKQogICAgICAgICAgICAgICAgIyBPdmVycmlkZSBwa2dfcmVzb3VyY2VzIGRlZmF1bHRzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAjICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QKICAgICAgICAgICAgICAgICMgLnppcCIgbWVzc2FnZQogICAgICAgICAgICAgICAgc3VibWV0YS5lZ2dfbmFtZSA9IHByb2plY3RfbmFtZQogICAgICAgICAgICAgICAgc3VibWV0YS5lZ2dfaW5mbyA9IHN1YnBhdGgKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX3Jvb3QgPSBwYXRoX2l0ZW0KICAgICAgICAgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgc3ViaXRlbSwgc3VibWV0YSkKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgZmluZF9lZ2dzX2FuZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkNoYWluIHRvZ2V0aGVyIG91ciBmaW5kZXIgYW5kIHRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgoKICAgICAgICBGb3Igc2ltcGxpY2l0eSwgYW5kIHNpbmNlIHBrZ19yZXNvdXJjZXMgZG9lc24ndCBwcm92aWRlIGEgcHVibGljCiAgICAgICAgaW50ZXJmYWNlIHRvIGRvIHNvLCB3ZSBoYXJkY29kZSB0aGUgY2hhaW5pbmcgKGZpbmRfZWdnc19pbl96aXApLgogICAgICAgICIiIgogICAgICAgICMgT3VyIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICMgVGhlIHN0YW5kYXJkIHBrZ19yZXNvdXJjZXMgZmluZGVyCiAgICAgICAgZm9yIGRpc3QgaW4gcGtnX3Jlc291cmNlcy5maW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpOgogICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgcmV0dXJuCgogICAgIyBUaGlzIG92ZXJ3cml0ZXMgdGhlIGV4aXN0aW5nIHJlZ2lzdGVyZWQgZmluZGVyLgogICAgcGtnX3Jlc291cmNlcy5yZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9lZ2dzX2FuZF9kaXN0X2luZm9faW5femlwKQoKICAgICMgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IFdvcmtpbmdTZXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBhbmQKICAgICMgdGhlcmUgaXMgbm8gcHVibGljIGludGVyZmFjZSB0byBlYXNpbHkgcmVmcmVzaC9yZWxvYWQgaXQgdGhhdAogICAgIyBkb2Vzbid0IGFsc28gaGF2ZSBhICJEb24ndCB1c2UgdGhpcyIgd2FybmluZy4gIFNvIHdlIG1hbnVhbGx5CiAgICAjIGFkZCBqdXN0IHRoZSBlbnRyaWVzIHdlIGtub3cgYWJvdXQgdG8gdGhlIGV4aXN0aW5nIFdvcmtpbmdTZXQuCiAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgaW1wb3J0ZXIgPSBwa2d1dGlsLmdldF9pbXBvcnRlcihlbnRyeSkKICAgICAgICBpZiBpc2luc3RhbmNlKGltcG9ydGVyLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIpOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIGVudHJ5LCBvbmx5PVRydWUpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0Ll9wcm92aWRlciwgRGlzdEluZm9NZXRhZGF0YSk6CiAgICAgICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5hZGQoZGlzdCwgZW50cnksIGluc2VydD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlPVRydWUpCgoKZGVmIF9pbml0aWFsaXplX2ltcG9ydF9wYXRoKGltcG9ydF9yb290cywgaW1wb3J0X3ByZWZpeCk6CiAgICAiIiJBZGQgZXh0cmEgZW50cmllcyB0byBQWVRIT05QQVRIIHNvIHRoYXQgbW9kdWxlcyBjYW4gYmUgaW1wb3J0ZWQuIiIiCiAgICAjIFdlIHRyeSB0byBtYXRjaCB0byBvcmRlciBvZiBCYXplbCdzIHN0dWIKICAgIGZ1bGxfcm9vdHMgPSBbCiAgICAgICAgb3MucGF0aC5qb2luKGltcG9ydF9wcmVmaXgsIGltcG9ydF9yb290KQogICAgICAgIGZvciBpbXBvcnRfcm9vdCBpbiBpbXBvcnRfcm9vdHNdCiAgICBzeXMucGF0aFsxOjFdID0gZnVsbF9yb290cwogICAgX2xvZygnIyBhZGRpbmcgJXMgdG8gc3lzLnBhdGgnICUgZnVsbF9yb290cykKCgpkZWYgc2V0dXAoaW1wb3J0X3Jvb3RzLCB6aXBfc2FmZSk6CiAgICAiIiJJbml0aWFsaXplIHN1YnBhciBydW4tdGltZSBzdXBwb3J0CgogICAgQXJnczoKICAgICAgaW1wb3J0X3Jvb3QgKGxpc3QpOiBzdWJkaXJzIGluc2lkZSAucGFyIGZpbGUgdG8gYWRkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpbXBvcnQgcGF0aCBhdCBydW50aW1lLgogICAgICB6aXBfc2FmZSAoYm9vbCk6IElmIEZhbHNlLCBleHRyYWN0IHRoZSAucGFyIGZpbGUgY29udGVudHMgdG8gYQogICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBpbXBvcnQgZXZlcnl0aGluZyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkaXJlY3RvcnkuCgogICAgUmV0dXJuczoKICAgICAgVHJ1ZSBpZiBzZXR1cCB3YXMgc3VjY2Vzc2Z1bCwgZWxzZSBGYWxzZQogICAgIiIiCiAgICBhcmNoaXZlX3BhdGggPSBfZmluZF9hcmNoaXZlKCkKICAgIGlmIG5vdCBhcmNoaXZlX3BhdGg6CiAgICAgICAgd2FybmluZ3Mud2FybignRmFpbGVkIHRvIGluaXRpYWxpemUgLnBhciBmaWxlIHJ1bnRpbWUgc3VwcG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkgIT0gb3MucGF0aC5hYnNwYXRoKGFyY2hpdmVfcGF0aCk6CiAgICAgICAgd2FybmluZ3Mud2FybignRmFpbGVkIHRvIGluaXRpYWxpemUgLnBhciBmaWxlIHJ1bnRpbWUgc3VwcG9ydC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAnYXJjaGl2ZV9wYXRoIHdhcyAlciwgc3lzLnBhdGggd2FzICVyJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGgsIHN5cy5wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgIFVzZXJXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgRXh0cmFjdCBmaWxlcyB0byBkaXNrIGlmIG5lY2Vzc2FyeQogICAgaWYgbm90IHppcF9zYWZlOgogICAgICAgIGV4dHJhY3RfZGlyID0gX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKQogICAgICAgICMgc3lzLnBhdGhbMF0gaXMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGluZyAucGFyIGZpbGUuICBQb2ludAogICAgICAgICMgaXQgdG8gdGhlIGV4dHJhY3QgZGlyZWN0b3J5IGluc3RlYWQsIHNvIHRoYXQgUHl0aG9uIHNlYXJjaGVzCiAgICAgICAgIyB0aGVyZSBmb3IgaW1wb3J0cy4KICAgICAgICBzeXMucGF0aFswXSA9IGV4dHJhY3RfZGlyCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGV4dHJhY3RfZGlyCiAgICBlbHNlOiAgIyBJbXBvcnQgZGlyZWN0bHkgZnJvbSAucGFyIGZpbGUKICAgICAgICBleHRyYWN0X2RpciA9IE5vbmUKICAgICAgICBpbXBvcnRfcHJlZml4ID0gYXJjaGl2ZV9wYXRoCgogICAgIyBJbml0aWFsaXplIGltcG9ydCBwYXRoCiAgICBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpCgogICAgIyBBZGQgaG9vayBmb3IgcGFja2FnZSBtZXRhZGF0YQogICAgX3NldHVwX3BrZ19yZXNvdXJjZXMoJ3BrZ19yZXNvdXJjZXMnKQogICAgX3NldHVwX3BrZ19yZXNvdXJjZXMoJ3BpcC5fdmVuZG9yLnBrZ19yZXNvdXJjZXMnKQoKICAgIHJldHVybiBUcnVlClBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAABYAAABfX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAzpEsa+R0AAPkdAAALAAAAAAAAAAAAAAAAAD8AAABfX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAAAGEeAABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAElIPlm/GgAAvxoAACoAAAAAAAAAAAAAAAAArR4AAGlvX2JhemVsX3J1bGVzX3B5dGhvbi9ydWxlc19weXRob24vcGlwdG9vbFBLAQIUAxQAAAAAAAAAIQCEeBfcrhwAAK4cAAAtAAAAAAAAAAAAAAAAALQ5AABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3BpcHRvb2wucHlQSwECFAMUAAAAAAAAACEAHGnWX+YVAADmFQAAKQAAAAAAAAAAAAAAAACtVgAAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi93aGwucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAGwAAAAAAAAAAAAAAAADabAAAcHlwaV9fcGlwXzlfMF8zL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKtxNFcHBQAABwUAADMAAAAAAAAAAAAAAAAAE20AAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFBLAQIUAxQAAAAAAAAAIQA8UH8l+QkAAPkJAAAsAAAAAAAAAAAAAAAAAGtyAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBX/iPlmGIAAJhiAAAqAAAAAAAAAAAAAAAAAK58AABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEA9t3Svm4AAABuAAAAKQAAAAAAAAAAAAAAAACO3wAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEAtBeYxEQAAABEAAAANAAAAAAAAAAAAAAAAABD4AAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQDI4LebHQYAAB0GAAAxAAAAAAAAAAAAAAAAANngAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uUEsBAhQDFAAAAAAAAAAhAMcfl8IEAAAABAAAADEAAAAAAAAAAAAAAAAARecAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEADVvQdrQuAAC0LgAAHwAAAAAAAAAAAAAAAACY5wAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBLSaRlSAIAAEgCAAAfAAAAAAAAAAAAAAAAAIkWAQBweXBpX19waXBfOV8wXzMvcGlwL19fbWFpbl9fLnB5UEsBAhQDFAAAAAAAAAAhAE+9zEg+EgAAPhIAACcAAAAAAAAAAAAAAAAADhkBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCFiZaKYFcAAGBXAAAmAAAAAAAAAAAAAAAAAJErAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQAAVqw6LgEAAC4BAAA0AAAAAAAAAAAAAAAAADWDAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhANpURqUoBQAAKAUAADAAAAAAAAAAAAAAAAAAtYQBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weVBLAQIUAxQAAAAAAAAAIQBQ5qksABIAAAASAAAzAAAAAAAAAAAAAAAAACuKAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlQSwECFAMUAAAAAAAAACEAEqrG8BYDAAAWAwAAMQAAAAAAAAAAAAAAAAB8nAEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZS5weVBLAQIUAxQAAAAAAAAAIQCeHVb8cQEAAHEBAAA7AAAAAAAAAAAAAAAAAOGfAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDBpwb/zA0AAMwNAAA9AAAAAAAAAAAAAAAAAKuhAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhANOIxlTNAwAAzQMAAD4AAAAAAAAAAAAAAAAA0q8BAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL3JlZGlzX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhAC08LTN8AQAAfAEAADIAAAAAAAAAAAAAAAAA+7MBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAMdgud7gMgAA4DIAADYAAAAAAAAAAAAAAAAAx7UBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weVBLAQIUAxQAAAAAAAAAIQBsJjR84wkAAOMJAAA3AAAAAAAAAAAAAAAAAPvoAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2ZpbGV3cmFwcGVyLnB5UEsBAhQDFAAAAAAAAAAhAA5UHvwtEAAALRAAADYAAAAAAAAAAAAAAAAAM/MBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvaGV1cmlzdGljcy5weVBLAQIUAxQAAAAAAAAAIQASYYC4iBkAAIgZAAA1AAAAAAAAAAAAAAAAALQDAgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weVBLAQIUAxQAAAAAAAAAIQCLe8VC8gEAAPIBAAAzAAAAAAAAAAAAAAAAAI8dAgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3dyYXBwZXIucHlQSwECFAMUAAAAAAAAACEAFHAFRz8AAAA/AAAALwAAAAAAAAAAAAAAAADSHwIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAgyvawSkAAAApAAAALwAAAAAAAAAAAAAAAABeIAIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEABaHa9fAiBADwIgQALgAAAAAAAAAAAAAAAADUIAIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQAJE0JHRAMAAEQDAAArAAAAAAAAAAAAAAAAABBEBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAPDPD1MXBgAAFwYAAC8AAAAAAAAAAAAAAAAAnUcGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADm/hBAWegAAFnoAAC8AAAAAAAAAAAAAAAAAAU4GAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAMvnZ2bdBgAA3QYAADEAAAAAAAAAAAAAAAAAZMgGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA4FkoPcMkAADDJAAANwAAAAAAAAAAAAAAAACQzwYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weVBLAQIUAxQAAAAAAAAAIQCJWSSIyw4AAMsOAAA5AAAAAAAAAAAAAAAAAKj0BgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0Z3JvdXBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA4JdhWvYTAAD2EwAANAAAAAAAAAAAAAAAAADKAwcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAAAzAAAAAAAAAAAAAAAAABIYBwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAX92tubIKAACyCgAANQAAAAAAAAAAAAAAAABkGAcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHlQSwECFAMUAAAAAAAAACEAXPs3SAYOAAAGDgAAOQAAAAAAAAAAAAAAAABpIwcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY29kaW5nc3RhdGVtYWNoaW5lLnB5UEsBAhQDFAAAAAAAAAAhAHyG5WVuBAAAbgQAAC0AAAAAAAAAAAAAAAAAxjEHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQC9QpoxPwcAAD8HAAAyAAAAAAAAAAAAAAAAAH82BwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBEBKzJfQYAAH0GAAAsAAAAAAAAAAAAAAAAAA4+BwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lbnVtcy5weVBLAQIUAxQAAAAAAAAAIQAEiAU9bg8AAG4PAAAwAAAAAAAAAAAAAAAAANVEBwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwQpgog4pAAAOKQAALAAAAAAAAAAAAAAAAACRVAcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHlQSwECFAMUAAAAAAAAACEAIDfE0KUOAAClDgAAMgAAAAAAAAAAAAAAAADpfQcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA9EEDeeo0AADqNAAAMAAAAAAAAAAAAAAAAADejAcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5UEsBAhQDFAAAAAAAAAAhACYFl/jUBgAA1AYAADIAAAAAAAAAAAAAAAAAFsIHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tycHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAMzbSdWFewAAhXsAADAAAAAAAAAAAAAAAAAAOskHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weVBLAQIUAxQAAAAAAAAAIQCgQY0Y0wYAANMGAAAyAAAAAAAAAAAAAAAAAA1FCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQAZRdLX61AAAOtQAAAxAAAAAAAAAAAAAAAAADBMCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAH6r/o/aBgAA2gYAADMAAAAAAAAAAAAAAAAAap0IAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMnByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQANKdOyDjYAAA42AAAzAAAAAAAAAAAAAAAAAJWkCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwho5YbFkAACxZAAALgAAAAAAAAAAAAAAAAD02ggAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvamlzZnJlcS5weVBLAQIUAxQAAAAAAAAAIQAGeSVqu0wAALtMAAAtAAAAAAAAAAAAAAAAAPE/CQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qcGNudHgucHlQSwECFAMUAAAAAAAAACEA8GjJyicyAAAnMgAAOQAAAAAAAAAAAAAAAAD3jAkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAMjxVpscRgAAHEYAADgAAAAAAAAAAAAAAAAAdb8JAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdjeXJpbGxpY21vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAP67rymQMQAAkDEAADUAAAAAAAAAAAAAAAAA5wUKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdncmVla21vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAI9mrRhRLAAAUSwAADYAAAAAAAAAAAAAAAAAyjcKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQDDwVWAMDEAADAxAAA5AAAAAAAAAAAAAAAAAG9kCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naHVuZ2FyaWFubW9kZWwucHlQSwECFAMUAAAAAAAAACEAIg/SPxosAAAaLAAANAAAAAAAAAAAAAAAAAD2lQoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3RoYWltb2RlbC5weVBLAQIUAxQAAAAAAAAAIQC1MsNkXisAAF4rAAA3AAAAAAAAAAAAAAAAAGLCCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAOTs8KT6FAAA+hQAADMAAAAAAAAAAAAAAAAAFe4KAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhdGluMXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQA2dRhNVQ0AAFUNAAA2AAAAAAAAAAAAAAAAAGADCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNoYXJzZXRwcm9iZXIucHlQSwECFAMUAAAAAAAAACEArdMRqNwHAADcBwAANgAAAAAAAAAAAAAAAAAJEQsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAGn24Q+JYwAAiWMAAC0AAAAAAAAAAAAAAAAAORkLAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3NzbS5weVBLAQIUAxQAAAAAAAAAIQAede8eGRYAABkWAAA2AAAAAAAAAAAAAAAAAA19CwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zYmNoYXJzZXRwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAiv5PoNoNAADaDQAANgAAAAAAAAAAAAAAAAB6kwsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhANaRZzK+DgAAvg4AADEAAAAAAAAAAAAAAAAAqKELAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAdYBHPcUwAADFMAAAOAAAAAAAAAAAAAAAAAC1sAsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdW5pdmVyc2FsZGV0ZWN0b3IucHlQSwECFAMUAAAAAAAAACEA9b+8Pc4KAADOCgAAMQAAAAAAAAAAAAAAAADQ4QsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBHx5DX8gAAAPIAAAAuAAAAAAAAAAAAAAAAAO3sCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAFjUaTnwAAAA8AAAADAAAAAAAAAAAAAAAAAAK+4LAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQA+Fadf3AkAANwJAAAsAAAAAAAAAAAAAAAAAGnvCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weVBLAQIUAxQAAAAAAAAAIQDHY8DZxCUAAMQlAAAzAAAAAAAAAAAAAAAAAI/5CwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHlQSwECFAMUAAAAAAAAACEAfdbYL30HAAB9BwAAMgAAAAAAAAAAAAAAAACkHwwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2luaXRpYWxpc2UucHlQSwECFAMUAAAAAAAAACEADW2iPfUUAAD1FAAALQAAAAAAAAAAAAAAAABxJwwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAHd7ZyGSGAAAkhgAAC8AAAAAAAAAAAAAAAAAsTwMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5UEsBAhQDFAAAAAAAAAAhACacUZdFAgAARQIAAC8AAAAAAAAAAAAAAAAAkFUMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACPvZ/wSAQAAEgEAADkAAAAAAAAAAAAAAAAAIlgMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCvii9lywMAAMsDAAA1AAAAAAAAAAAAAAAAAItZDABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvbWlzYy5weVBLAQIUAxQAAAAAAAAAIQDiYj3QL2QAAC9kAAA3AAAAAAAAAAAAAAAAAKldDABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc2h1dGlsLnB5UEsBAhQDFAAAAAAAAAAhAG8WAK05CgAAOQoAADsAAAAAAAAAAAAAAAAALcIMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnUEsBAhQDFAAAAAAAAAAhADYPUtZLaQAAS2kAADoAAAAAAAAAAAAAAAAAv8wMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcucHlQSwECFAMUAAAAAAAAACEAREIfQ9RpAQDUaQEAOAAAAAAAAAAAAAAAAABiNg0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3RhcmZpbGUucHlQSwECFAMUAAAAAAAAACEAXwlzYGGfAABhnwAALQAAAAAAAAAAAAAAAACMoA4AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhADoKw7wIwgAACMIAAC8AAAAAAAAAAAAAAAAAOEAPAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2RhdGFiYXNlLnB5UEsBAhQDFAAAAAAAAAAhAIM44i1dUgAAXVIAACwAAAAAAAAAAAAAAAAAjQIQAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2luZGV4LnB5UEsBAhQDFAAAAAAAAAAhANHFeK9FxwAARccAAC8AAAAAAAAAAAAAAAAANFUQAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5UEsBAhQDFAAAAAAAAAAhAIaXtZvaOQAA2jkAAC8AAAAAAAAAAAAAAAAAxhwRAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hbmlmZXN0LnB5UEsBAhQDFAAAAAAAAAAhAD0RrgKKGAAAihgAAC4AAAAAAAAAAAAAAAAA7VYRAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEADaZs8bGXAACxlwAALwAAAAAAAAAAAAAAAADDbxEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAyLdFmA4qAAAOKgAAMAAAAAAAAAAAAAAAAADBBxIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5UEsBAhQDFAAAAAAAAAAhALr/69t4OwAAeDsAAC4AAAAAAAAAAAAAAAAAHTISAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3NjcmlwdHMucHlQSwECFAMUAAAAAAAAACEA9ZiQDABcAQAAXAEAKwAAAAAAAAAAAAAAAADhbRIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZVBLAQIUAxQAAAAAAAAAIQCe4sVZAH4BAAB+AQArAAAAAAAAAAAAAAAAACrKEwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi90NjQuZXhlUEsBAhQDFAAAAAAAAAAhADfYASX/zgAA/84AACsAAAAAAAAAAAAAAAAAc0gVAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3V0aWwucHlQSwECFAMUAAAAAAAAACEAoP0FVp9cAACfXAAALgAAAAAAAAAAAAAAAAC7FxYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDYfQCJAE4BAABOAQArAAAAAAAAAAAAAAAAAKZ0FgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi93MzIuZXhlUEsBAhQDFAAAAAAAAAAhAF7MS+8AcAEAAHABACsAAAAAAAAAAAAAAAAA78IXAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3c2NC5leGVQSwECFAMUAAAAAAAAACEAX9SgqcuYAADLmAAALAAAAAAAAAAAAAAAAAA4MxkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHlQSwECFAMUAAAAAAAAACEAkcHArs2VAADNlQAAJQAAAAAAAAAAAAAAAABNzBkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3Ryby5weVBLAQIUAxQAAAAAAAAAIQCim5mcDAMAAAwDAAAwAAAAAAAAAAAAAAAAAF1iGgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA1XgO4kFBAABBQQAAMQAAAAAAAAAAAAAAAAC3ZRoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weVBLAQIUAxQAAAAAAAAAIQAeDG01FH8AABR/AAA0AAAAAAAAAAAAAAAAAEenGgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX2lucHV0c3RyZWFtLnB5UEsBAhQDFAAAAAAAAAAhAMRGahYkKwEAJCsBADIAAAAAAAAAAAAAAAAArSYbAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdG9rZW5pemVyLnB5UEsBAhQDFAAAAAAAAAAhAO/Trw8hAQAAIQEAADYAAAAAAAAAAAAAAAAAIVIcAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDMlT6W0wMAANMDAAAzAAAAAAAAAAAAAAAAAJZTHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX2Jhc2UucHlQSwECFAMUAAAAAAAAACEAJFWdqZoEAACaBAAANAAAAAAAAAAAAAAAAAC6VxwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weVBLAQIUAxQAAAAAAAAAIQBLT27O7wYAAO8GAAAwAAAAAAAAAAAAAAAAAKZcHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHlQSwECFAMUAAAAAAAAACEAJuOuWAAQAAAAEAAALgAAAAAAAAAAAAAAAADjYxwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weVBLAQIUAxQAAAAAAAAAIQDIpH3+u0UBALtFAQAxAAAAAAAAAAAAAAAAAC90HABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvY29uc3RhbnRzLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAObodAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAG7QfIBtAgAAbQIAAEYAAAAAAAAAAAAAAAAAj7odAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHlQSwECFAMUAAAAAAAAACEAIoD7xB4BAAAeAQAANAAAAAAAAAAAAAAAAABgvR0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weVBLAQIUAxQAAAAAAAAAIQAhwDyMtgoAALYKAABDAAAAAAAAAAAAAAAAANC+HQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5UEsBAhQDFAAAAAAAAAAhAH3r0rUlDQAAJQ0AADQAAAAAAAAAAAAAAAAA58kdAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2xpbnQucHlQSwECFAMUAAAAAAAAACEAIe2dJCYpAAAmKQAAPAAAAAAAAAAAAAAAAABe1x0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5UEsBAhQDFAAAAAAAAAAhAJoeVJgYYgAAGGIAADkAAAAAAAAAAAAAAAAA3gAeAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weVBLAQIUAxQAAAAAAAAAIQCfjmqtcwQAAHMEAAA6AAAAAAAAAAAAAAAAAE1jHgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5UEsBAhQDFAAAAAAAAAAhAGPYd9yyyQEAsskBADMAAAAAAAAAAAAAAAAAGGgeAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weVBLAQIUAxQAAAAAAAAAIQDcx7s0YTcAAGE3AAAyAAAAAAAAAAAAAAAAABsyIABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weVBLAQIUAxQAAAAAAAAAIQCCMmMk0AAAANAAAAA9AAAAAAAAAAAAAAAAAMxpIABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADEnx74TBgAAEwYAADsAAAAAAAAAAAAAAAAA92ogAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvZ2Vuc2hpLnB5UEsBAhQDFAAAAAAAAAAhAORcXxB9BgAAfQYAADgAAAAAAAAAAAAAAAAAY3EgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5UEsBAhQDFAAAAAAAAAAhAEfZN25ODQAATg0AAD0AAAAAAAAAAAAAAAAANnggAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEARMpWqnY2AAB2NgAAOQAAAAAAAAAAAAAAAADfhSAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhAAjqLviDIgAAgyIAADgAAAAAAAAAAAAAAAAArLwgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhAKF9l/DcMQAA3DEAADoAAAAAAAAAAAAAAAAAhd8gAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHlQSwECFAMUAAAAAAAAACEA2v5K0FE3AABRNwAAPwAAAAAAAAAAAAAAAAC5ESEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5UEsBAhQDFAAAAAAAAAAhAHNEIZaoFQAAqBUAADwAAAAAAAAAAAAAAAAAZ0khAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBNI5jASxMAAEsTAAA4AAAAAAAAAAAAAAAAAGlfIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weVBLAQIUAxQAAAAAAAAAIQBlim+phQUAAIUFAAA3AAAAAAAAAAAAAAAAAApzIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhACLBEDFMEgAATBIAADkAAAAAAAAAAAAAAAAA5HghAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weVBLAQIUAxQAAAAAAAAAIQCWDZxHpRgAAKUYAAA+AAAAAAAAAAAAAAAAAIeLIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weVBLAQIUAxQAAAAAAAAAIQATX20QBQkAAAUJAAA6AAAAAAAAAAAAAAAAAIikIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZ2Vuc2hpLnB5UEsBAhQDFAAAAAAAAAAhAABHXJs6AAAAOgAAACwAAAAAAAAAAAAAAAAA5a0hAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPNI1OnjDAAA4wwAACkAAAAAAAAAAAAAAAAAaa4hAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5UEsBAhQDFAAAAAAAAAAhAHyBlnDoAAAA6AAAACoAAAAAAAAAAAAAAAAAk7shAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQAJLvpxfiwAAH4sAAAoAAAAAAAAAAAAAAAAAMO8IQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAGO8+hHngAAA54AAACwAAAAAAAAAAAAAAAAAh+khAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2lkbmFkYXRhLnB5UEsBAhQDFAAAAAAAAAAhALdj9LLVBgAA1QYAAC0AAAAAAAAAAAAAAAAAuGoiAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weVBLAQIUAxQAAAAAAAAAIQAb532iFQAAABUAAAAwAAAAAAAAAAAAAAAAANhxIgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlQSwECFAMUAAAAAAAAACEAyYWFhXDSAgBw0gIALQAAAAAAAAAAAAAAAAA7ciIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5UEsBAhQDFAAAAAAAAAAhAN3EpgUwOQEAMDkBACgAAAAAAAAAAAAAAAAA9kQlAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pcGFkZHJlc3MucHlQSwECFAMUAAAAAAAAACEA85kjgJskAACbJAAAMAAAAAAAAAAAAAAAAABsfiYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACve8idcCgAAXAoAADQAAAAAAAAAAAAAAAAAVaMmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAISa8fhgMAAAYDAAANQAAAAAAAAAAAAAAAAADriYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAIDxyLcoXAADKFwAAMwAAAAAAAAAAAAAAAABuuiYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhALuF8L2CFQAAghUAADYAAAAAAAAAAAAAAAAAidImAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQCRIwnZOAoAADgKAAA3AAAAAAAAAAAAAAAAAF/oJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3ltbGlua2xvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhANZSGSP+DwAA/g8AACoAAAAAAAAAAAAAAAAA7PImAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAAAyAAAAAAAAAAAAAAAAADIDJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weVBLAQIUAxQAAAAAAAAAIQCBdpbKAQIAAAECAAAxAAAAAAAAAAAAAAAAAFIGJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAOZpSuNcAwAAXAMAADAAAAAAAAAAAAAAAAAAoggnAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAAA0AAAAAAAAAAAAAAAAAEwMJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5UEsBAhQDFAAAAAAAAAAhAH0sK1cmIAAAJiAAADAAAAAAAAAAAAAAAAAAJhInAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQCuEZ/z5xAAAOcQAAA1AAAAAAAAAAAAAAAAAJoyJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAAAzAAAAAAAAAAAAAAAAANRDJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHlQSwECFAMUAAAAAAAAACEAxeonD6UBAAClAQAALgAAAAAAAAAAAAAAAACesScAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAO78ahJC0AACQtAAAwAAAAAAAAAAAAAAAAAI+zJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAyS1AJj6TAQA+kwEANQAAAAAAAAAAAAAAAAAB4ScAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA+lpxjM8LAADPCwAAMAAAAAAAAAAAAAAAAACSdCkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAA/DRgN9CgAAfQoAACsAAAAAAAAAAAAAAAAAr4ApAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHlQSwECFAMUAAAAAAAAACEAKn/xMN4FAADeBQAALwAAAAAAAAAAAAAAAAB1iykAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHlQSwECFAMUAAAAAAAAACEAzuwPTiYLAAAmCwAALwAAAAAAAAAAAAAAAACgkSkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHlQSwECFAMUAAAAAAAAACEAdwhSeyIFAAAiBQAALwAAAAAAAAAAAAAAAAATnSkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHlQSwECFAMUAAAAAAAAACEAwSB0jqtrAwCrawMAKAAAAAAAAAAAAAAAAACCoikAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3B5cGFyc2luZy5weVBLAQIUAxQAAAAAAAAAIQBgHgeNBQMAAAUDAAAoAAAAAAAAAAAAAAAAAHMOLQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5UEsBAhQDFAAAAAAAAAAhAB/G7jD3DQAA9w0AADAAAAAAAAAAAAAAAAAAvhEtAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDffHkltAEAALQBAAAzAAAAAAAAAAAAAAAAAAMgLQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX192ZXJzaW9uX18ucHlQSwECFAMUAAAAAAAAACEAiKk5u0gEAABIBAAANwAAAAAAAAAAAAAAAAAIIi0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19pbnRlcm5hbF91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAjUN5SGFIAABhSAAAwAAAAAAAAAAAAAAAAAKUmLQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHlQSwECFAMUAAAAAAAAACEAmGPoL10YAABdGAAAKwAAAAAAAAAAAAAAAAALeS0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2FwaS5weVBLAQIUAxQAAAAAAAAAIQADrfKSACYAAAAmAAAsAAAAAAAAAAAAAAAAALGRLQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weVBLAQIUAxQAAAAAAAAAIQAFodr18CIEAPAiBAAvAAAAAAAAAAAAAAAAAPu3LQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQCCsqLP0QEAANEBAAAtAAAAAAAAAAAAAAAAADjbMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2VydHMucHlQSwECFAMUAAAAAAAAACEAd8lhTVoGAABaBgAALgAAAAAAAAAAAAAAAABU3TEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQATQ8kzIEcAACBHAAAvAAAAAAAAAAAAAAAAAPrjMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weVBLAQIUAxQAAAAAAAAAIQD5zunQKwwAACsMAAAyAAAAAAAAAAAAAAAAAGcrMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQCEHWDiUw4AAFMOAAAsAAAAAAAAAAAAAAAAAOI3MgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weVBLAQIUAxQAAAAAAAAAIQB52qPK/wIAAP8CAAAtAAAAAAAAAAAAAAAAAH9GMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHlQSwECFAMUAAAAAAAAACEAZX1HdAOFAAADhQAALgAAAAAAAAAAAAAAAADJSTIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weVBLAQIUAxQAAAAAAAAAIQASPN6BtwIAALcCAAAwAAAAAAAAAAAAAAAAABjPMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvcGFja2FnZXMucHlQSwECFAMUAAAAAAAAACEAX59mmZprAACaawAAMAAAAAAAAAAAAAAAAAAd0jIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5UEsBAhQDFAAAAAAAAAAhAEE41+L7DAAA+wwAADQAAAAAAAAAAAAAAAAABT4zAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHlQSwECFAMUAAAAAAAAACEA5iDKD8QLAADECwAAMgAAAAAAAAAAAAAAAABSSzMAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEAR8HZVwRsAAAEbAAALQAAAAAAAAAAAAAAAABmVzMAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACF7vAr0JgAA9CYAACcAAAAAAAAAAAAAAAAAtcMzAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXRyeWluZy5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAAiAAAAAAAAAAAAAAAAAO7qMwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivc2l4LnB5UEsBAhQDFAAAAAAAAAAhAJI+9YclCwAAJQsAAC8AAAAAAAAAAAAAAAAAwGA0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAZ05TcJwAA3CcAADMAAAAAAAAAAAAAAAAAMmw0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQBghK6nyzIAAMsyAAAxAAAAAAAAAAAAAAAAAF+UNABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5UEsBAhQDFAAAAAAAAAAhABcaHG8eigAAHooAADUAAAAAAAAAAAAAAAAAecc0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAAA6lE1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAA/UjUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALdZi32YRAAAmEQAAEgAAAAAAAAAAAAAAAAApVI1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weVBLAQIUAxQAAAAAAAAAIQAEr9yQHi8AAB4vAABJAAAAAAAAAAAAAAAAAKOXNQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvbG93X2xldmVsLnB5UEsBAhQDFAAAAAAAAAAhABjDrZNxKgAAcSoAADgAAAAAAAAAAAAAAAAAKMc1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvYXBwZW5naW5lLnB5UEsBAhQDFAAAAAAAAAAhAC6lcY1+EQAAfhEAADcAAAAAAAAAAAAAAAAA7/E1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHlQSwECFAMUAAAAAAAAACEA8yq2cfo7AAD6OwAAOAAAAAAAAAAAAAAAAADCAzYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9weW9wZW5zc2wucHlQSwECFAMUAAAAAAAAACEA51PA8yV3AAAldwAAPgAAAAAAAAAAAAAAAAASQDYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zZWN1cmV0cmFuc3BvcnQucHlQSwECFAMUAAAAAAAAACEA0FMpmTMYAAAzGAAANAAAAAAAAAAAAAAAAACTtzYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weVBLAQIUAxQAAAAAAAAAIQDymskDyxkAAMsZAAAxAAAAAAAAAAAAAAAAABjQNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5UEsBAhQDFAAAAAAAAAAhAAE5jLI3FwAANxcAAC0AAAAAAAAAAAAAAAAAMuo2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpZWxkcy5weVBLAQIUAxQAAAAAAAAAIQDXXdAXEQkAABEJAAAvAAAAAAAAAAAAAAAAALQBNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weVBLAQIUAxQAAAAAAAAAIQCPXaB8bQAAAG0AAAA4AAAAAAAAAAAAAAAAABILNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAANULNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAUlccubUFAAC1BQAAQgAAAAAAAAAAAAAAAAA1DDcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAEbBpmfnIgAA5yIAADwAAAAAAAAAAAAAAAAAShI3AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAAzAAAAAAAAAAAAAAAAAIs1NwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zaXgucHlQSwECFAMUAAAAAAAAACEA+23K5bACAACwAgAASwAAAAAAAAAAAAAAAABuqzcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALU6jytGFgAARhYAAFIAAAAAAAAAAAAAAAAAh643AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHlQSwECFAMUAAAAAAAAACEA8K4Yktk/AADZPwAAMgAAAAAAAAAAAAAAAAA9xTcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcG9vbG1hbmFnZXIucHlQSwECFAMUAAAAAAAAACEAyjHkxDoXAAA6FwAALgAAAAAAAAAAAAAAAABmBTgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weVBLAQIUAxQAAAAAAAAAIQA/SoJhd1kAAHdZAAAvAAAAAAAAAAAAAAAAAOwcOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weVBLAQIUAxQAAAAAAAAAIQBSdeG/FAQAABQEAAA0AAAAAAAAAAAAAAAAALB2OABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKufXz2NEAAAjRAAADYAAAAAAAAAAAAAAAAAFns4AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weVBLAQIUAxQAAAAAAAAAIQBBYZDXeQ4AAHkOAAAzAAAAAAAAAAAAAAAAAPeLOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHlQSwECFAMUAAAAAAAAACEA9DkcnycJAAAnCQAANAAAAAAAAAAAAAAAAADBmjgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weVBLAQIUAxQAAAAAAAAAIQA9Ye/bCTkAAAk5AAAxAAAAAAAAAAAAAAAAADqkOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5UEsBAhQDFAAAAAAAAAAhAH3POz2bUgAAm1IAADUAAAAAAAAAAAAAAAAAkt04AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc2VsZWN0b3JzLnB5UEsBAhQDFAAAAAAAAAAhANXvyKKwLwAAsC8AADAAAAAAAAAAAAAAAAAAgDA5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc3NsXy5weVBLAQIUAxQAAAAAAAAAIQBVUs4gHSYAAB0mAAAzAAAAAAAAAAAAAAAAAH5gOQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlQSwECFAMUAAAAAAAAACEAwx5tEVcZAABXGQAALwAAAAAAAAAAAAAAAADshjkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC91cmwucHlQSwECFAMUAAAAAAAAACEAtjwj/KsFAACrBQAAMAAAAAAAAAAAAAAAAACQoDkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5UEsBAhQDFAAAAAAAAAAhAG/BoThQKQAAUCkAADQAAAAAAAAAAAAAAAAAiaY5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAx60IixMjAAATIwAAMgAAAAAAAAAAAAAAAAAr0DkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9sYWJlbHMucHlQSwECFAMUAAAAAAAAACEAUH8xHxkFAAAZBQAANAAAAAAAAAAAAAAAAACO8zkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weVBLAQIUAxQAAAAAAAAAIQAWmz4dohkAAKIZAAAxAAAAAAAAAAAAAAAAAPn4OQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5UEsBAhQDFAAAAAAAAAAhAEhvRb7SEAAA0hAAADoAAAAAAAAAAAAAAAAA6hI6AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MveF91c2VyX2RlZmluZWQucHlQSwECFAMUAAAAAAAAACEAghiL9YYuAACGLgAAIgAAAAAAAAAAAAAAAAAUJDoAcHlwaV9fcGlwXzlfMF8zL3BpcC9iYXNlY29tbWFuZC5weVBLAQIUAxQAAAAAAAAAIQCrq/474SgAAOEoAAAhAAAAAAAAAAAAAAAAANpSOgBweXBpX19waXBfOV8wXzMvcGlwL2Jhc2VwYXJzZXIucHlQSwECFAMUAAAAAAAAACEAS5kyIVpAAABaQAAAIQAAAAAAAAAAAAAAAAD6ezoAcHlwaV9fcGlwXzlfMF8zL3BpcC9jbWRvcHRpb25zLnB5UEsBAhQDFAAAAAAAAAAhAJANh0PECAAAxAgAACgAAAAAAAAAAAAAAAAAk7w6AHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHWE7X2YFAABmBQAAJQAAAAAAAAAAAAAAAACdxToAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jaGVjay5weVBLAQIUAxQAAAAAAAAAIQAwwcyzlQkAAJUJAAAqAAAAAAAAAAAAAAAAAEbLOgBweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2NvbXBsZXRpb24ucHlQSwECFAMUAAAAAAAAACEA2R6ZpoIeAACCHgAAKAAAAAAAAAAAAAAAAAAj1ToAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9kb3dubG9hZC5weVBLAQIUAxQAAAAAAAAAIQDD9vNgEwsAABMLAAAmAAAAAAAAAAAAAAAAAOvzOgBweXBpX19waXBfOV8w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AAAAgOtAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL3N1YnZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAfZkgOwp9AAAKfQAAHAAAAAAAAAAAAAAAAABJEEEAcHlwaV9fcGlwXzlfMF8zL3BpcC93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAI2NQQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBcT7pFfgAAAH4AAAAnAAAAAAAAAAAAAAAAAM6NQQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9lYXN5X2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAF0SeKQeeAQAHngEAMQAAAAAAAAAAAAAAAACRjkEAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA5AAAAAAAAAAAAAAAAAOcsQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAQ6uwJmZXAABmVwAAOAAAAAAAAAAAAAAAAAA+LUMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHlQSwECFAMUAAAAAAAAACEAPClYxtACAADQAgAARAAAAAAAAAAAAAAAAAD6hEMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAQwAAAAAAAAAAAAAAAAAsiEMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDmaUrjXAMAAFwDAABCAAAAAAAAAAAAAAAAAI6KQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHlQSwECFAMUAAAAAAAAACEA+v2kEogFAACIBQAARgAAAAAAAAAAAAAAAABKjkMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQAw+BPcOCAAADggAABCAAAAAAAAAAAAAAAAADaUQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEApYYd2wMRAAADEQAARwAAAAAAAAAAAAAAAADOtEMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHlQSwECFAMUAAAAAAAAACEAfEWDjHltAAB5bQAARQAAAAAAAAAAAAAAAAA2xkMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAAEAAAAAAAAAAAAAAAAAAEjREAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHlQSwECFAMUAAAAAAAAACEADu/GoSQtAAAkLQAAQgAAAAAAAAAAAAAAAAAVNkQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAHgoFMPrgQMA64EDADoAAAAAAAAAAAAAAAAAmWNEAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAANAAAAAAAAAAAAAAAAADc5UcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weVBLAQIUAxQAAAAAAAAAIQB12PF5twkAALcJAAA4AAAAAAAAAAAAAAAAAMBbSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDHR30yWAIAAFgCAAAzAAAAAAAAAAAAAAAAAM1lSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAf9S6XI4FAACOBQAAQwAAAAAAAAAAAAAAAAB2aEgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFBLAQIUAxQAAAAAAAAAIQBQ16sHNgQAADYEAAA/AAAAAAAAAAAAAAAAAGVuSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHRQSwECFAMUAAAAAAAAACEA8QyQ/+4KAADuCgAAPAAAAAAAAAAAAAAAAAD4ckgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAFysJqeDHgAAgx4AADoAAAAAAAAAAAAAAAAAQH5IAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEA9t3Svm4AAABuAAAAOQAAAAAAAAAAAAAAAAAbnUgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMUEsBAhQDFAAAAAAAAAAhADfZX93vAAAA7wAAAEgAAAAAAAAAAAAAAAAA4J1IAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dFBLAQIUAxQAAAAAAAAAIQDRNY6OrgsAAK4LAABEAAAAAAAAAAAAAAAAADWfSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQD71iD1JRMAACUTAABBAAAAAAAAAAAAAAAAAEWrSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQAwXAGRJgAAACYAAABBAAAAAAAAAAAAAAAAAMm+SABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAAA8AAAAAAAAAAAAAAAAAE6/SABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vemlwLXNhZmVQSwECFAMUAAAAAAAAACEAIwtKA0QWAABEFgAALgAAAAAAAAAAAAAAAACpv0gAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQClh2VRwBkAAMAZAAAyAAAAAAAAAAAAAAAAADnWSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQAf4j0cJxYAACcWAAAwAAAAAAAAAAAAAAAAAEnwSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHlQSwECFAMUAAAAAAAAACEA9YZ6aQAAAQAAAAEALQAAAAAAAAAAAAAAAAC+BkkAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGktMzIuZXhlUEsBAhQDFAAAAAAAAAAhAGJwztsAJAEAACQBAC0AAAAAAAAAAAAAAAAACQdKAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQAqAAAAAAAAAAAAAAAAAFQrSwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS5leGVQSwECFAMUAAAAAAAAACEAQZwWUlICAABSAgAANgAAAAAAAAAAAAAAAACcK0wAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAFD4I/J6CQAAegkAADMAAAAAAAAAAAAAAAAAQi5MAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weVBLAQIUAxQAAAAAAAAAIQBJzCuhW0YAAFtGAAA3AAAAAAAAAAAAAAAAAA04TABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5UEsBAhQDFAAAAAAAAAAhAOvSdBbkBQAA5AUAADcAAAAAAAAAAAAAAAAAvX5MAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlQSwECFAMUAAAAAAAAACEAIIx1FH0CAAB9AgAAOwAAAAAAAAAAAAAAAAD2hEwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlQSwECFAMUAAAAAAAAACEAJxqNG4QRAACEEQAAOAAAAAAAAAAAAAAAAADMh0wAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHlQSwECFAMUAAAAAAAAACEAkaVp5/kyAAD5MgAANwAAAAAAAAAAAAAAAACmmUwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weVBLAQIUAxQAAAAAAAAAIQBARkLcfCUAAHwlAAA2AAAAAAAAAAAAAAAAAPTMTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlQSwECFAMUAAAAAAAAACEAQFw7/24fAABuHwAANQAAAAAAAAAAAAAAAADE8kwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHlQSwECFAMUAAAAAAAAACEA/+j2kcADAADAAwAANwAAAAAAAAAAAAAAAACFEk0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCrdBLpVVQBAFVUAQA6AAAAAAAAAAAAAAAAAJoWTQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAE4sckJwYQAAcGEAADYAAAAAAAAAAAAAAAAAR2tOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCN27U/SxIAAEsSAAA1AAAAAAAAAAAAAAAAAAvNTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQBc0qjlmwgAAJsIAAA+AAAAAAAAAAAAAAAAAKnfTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCQnDtTAA8AAAAPAAA5AAAAAAAAAAAAAAAAAKDoTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlQSwECFAMUAAAAAAAAACEARj/xHocJAACHCQAAPQAAAAAAAAAAAAAAAAD3904AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQB9c2C/ehMAAHoTAAA4AAAAAAAAAAAAAAAAANkBTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDN/62QDgEAAA4BAAA2AAAAAAAAAAAAAAAAAKkVTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHlQSwECFAMUAAAAAAAAACEAGcrUpHQIAAB0CAAANAAAAAAAAAAAAAAAAAALF08AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weVBLAQIUAxQAAAAAAAAAIQAEgdY0kgIAAJICAAA2AAAAAAAAAAAAAAAAANEfTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlQSwECFAMUAAAAAAAAACEAtx/RbjcaAAA3GgAAMwAAAAAAAAAAAAAAAAC3Ik8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5UEsBAhQDFAAAAAAAAAAhAJtwy8fdEwAA3RMAADQAAAAAAAAAAAAAAAAAPz1PAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlQSwECFAMUAAAAAAAAACEA3Rnhnv4jAAD+IwAAMgAAAAAAAAAAAAAAAABuUU8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlQSwECFAMUAAAAAAAAACEA2SSLZ5QEAACUBAAANAAAAAAAAAAAAAAAAAC8dU8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weVBLAQIUAxQAAAAAAAAAIQDyl/PGjxwAAI8cAAA5AAAAAAAAAAAAAAAAAKJ6TwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHlQSwECFAMUAAAAAAAAACEAiUcQJLE/AACxPwAALAAAAAAAAAAAAAAAAACIl08AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb25maWcucHlQSwECFAMUAAAAAAAAACEAGiIEMqcDAACnAwAALgAAAAAAAAAAAAAAAACD108AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQBbKS1qzRYAAM0WAAAtAAAAAAAAAAAAAAAAAHbbTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2RlcGVuZHMucHlQSwECFAMUAAAAAAAAACEAJXSHBZCdAACQnQAAKgAAAAAAAAAAAAAAAACO8k8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kaXN0LnB5UEsBAhQDFAAAAAAAAAAhALmqke7BBgAAwQYAAC8AAAAAAAAAAAAAAAAAZpBQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5UEsBAhQDFAAAAAAAAAAhANCKe2WDAAAAgwAAADUAAAAAAAAAAAAAAAAAdJdQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAATqwb1KDAAASgwAACsAAAAAAAAAAAAAAAAASphQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xpYmMucHlQSwECFAMUAAAAAAAAACEAvF2hOVcUAABXFAAAKgAAAAAAAAAAAAAAAADdpFAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbG9iLnB5UEsBAhQDFAAAAAAAAAAhABD5/CkAAAEAAAABAC0AAAAAAAAAAAAAAAAAfLlQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLTMyLmV4ZVBLAQIUAxQAAAAAAAAAIQDYDqv0ACYBAAAmAQAtAAAAAAAAAAAAAAAAAMe5UQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS02NC5leGVQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEAKgAAAAAAAAAAAAAAAAAS4FIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9ndWkuZXhlUEsBAhQDFAAAAAAAAAAhAGT5fpsTAwAAEwMAACwAAAAAAAAAAAAAAAAAWuBTAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGF1bmNoLnB5UEsBAhQDFAAAAAAAAAAhAIdR66LdBwAA3QcAADAAAAAAAAAAAAAAAAAAt+NTAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGliMnRvM19leC5weVBLAQIUAxQAAAAAAAAAIQCNQ3JenRYAAJ0WAAAsAAAAAAAAAAAAAAAAAOLrUwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21vbmtleS5weVBLAQIUAxQAAAAAAAAAIQCCw5TmtJ8AALSfAAAqAAAAAAAAAAAAAAAAAMkCVABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21zdmMucHlQSwECFAMUAAAAAAAAACEAYwvj1n8MAAB/DAAAMAAAAAAAAAAAAAAAAADFolQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5UEsBAhQDFAAAAAAAAAAhAImwE847ngAAO54AADMAAAAAAAAAAAAAAAAAkq9UAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQDl5ui+gioAAIIqAAAwAAAAAAAAAAAAAAAAAB5OVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BlcDQyNXRhZ3MucHlQSwECFAMUAAAAAAAAACEAsmanVxgCAAAYAgAAMAAAAAAAAAAAAAAAAADueFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhANC5SFqoBAAAqAQAADAAAAAAAAAAAAAAAAAAVHtVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzMWNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDJYZLA5gMAAOYDAAAwAAAAAAAAAAAAAAAAAEqAVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzNjb21wYXQucHlQSwECFAMUAAAAAAAAACEAhRmaC0sLAABLCwAAMAAAAAAAAAAAAAAAAAB+hFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTM2Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAIxTmmPENwAAxDcAAC0AAAAAAAAAAAAAAAAAF5BVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2FuZGJveC5weVBLAQIUAxQAAAAAAAAAIQCoM7S+igAAAIoAAAAuAAAAAAAAAAAAAAAAACbIVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NjcmlwdC50bXBsUEsBAhQDFAAAAAAAAAAhAALBlOMDCQAAAwkAADAAAAAAAAAAAAAAAAAA/MhVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weVBLAQIUAxQAAAAAAAAAIQCIm1tOLCEAACwhAAAxAAAAAAAAAAAAAAAAAE3SVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAJpC15rkAwAA5AMAADMAAAAAAAAAAAAAAAAAyPNVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weVBLAQIUAxQAAAAAAAAAIQBIsUxikAAAAJAAAAAtAAAAAAAAAAAAAAAAAP33VQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAcB0I80EcAABBHAAAKwAAAAAAAAAAAAAAAADY+FUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQD5y+4NygIAAMoCAAA1AAAAAAAAAAAAAAAAAGIVVgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAH8YVgBweXBpX193aGVlbF8wXzMwXzBhMC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCIOqXUVSYAAFUmAAA9AAAAAAAAAAAAAAAAAL0YVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhAHD/rp9lBAAAZQQAADkAAAAAAAAAAAAAAAAAbT9WAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dFBLAQIUAxQAAAAAAAAAIQBEbZmBDSsAAA0rAAA2AAAAAAAAAAAAAAAAAClEVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEFQSwECFAMUAAAAAAAAACEApw+7Fp0PAACdDwAANAAAAAAAAAAAAAAAAACKb1YAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRFBLAQIUAxQAAAAAAAAAIQCU35Z7cQAAAHEAAAAzAAAAAAAAAAAAAAAAAHl/VgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEA4kXfrG0AAABtAAAAPgAAAAAAAAAAAAAAAAA7gFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEAUrJO1loGAABaBgAAOwAAAAAAAAAAAAAAAAAEgVYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL21ldGFkYXRhLmpzb25QSwECFAMUAAAAAAAAACEAGWPeZQYAAAAGAAAAOwAAAAAAAAAAAAAAAAC3h1YAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEAYTelR2MAAABjAAAAJgAAAAAAAAAAAAAAAAAWiFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAJGm3VKABAACgAQAAJgAAAAAAAAAAAAAAAAC9iFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEAIFOCUscIAADHCAAAJQAAAAAAAAAAAAAAAAChilYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYXJjaGl2ZS5weVBLAQIUAxQAAAAAAAAAIQBKryTR6EcAAOhHAAApAAAAAAAAAAAAAAAAAKuTVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9iZGlzdF93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCjeVJ3HQIAAB0CAAAnAAAAAAAAAAAAAAAAANrbVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9kZWNvcmF0b3IucHlQSwECFAMUAAAAAAAAACEA02EPJNMLAADTCwAAJwAAAAAAAAAAAAAAAAA83lYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnMndoZWVsLnB5UEsBAhQDFAAAAAAAAAAhABAk8jO6CQAAugkAACcAAAAAAAAAAAAAAAAAVOpWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZ25hbWVzLnR4dFBLAQIUAxQAAAAAAAAAIQCxvLn2skYAALJGAAAlAAAAAAAAAAAAAAAAAFP0VgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhADkodwucLQAAnC0AACYAAAAAAAAAAAAAAAAASDtXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL21ldGFkYXRhLnB5UEsBAhQDFAAAAAAAAAAhAGH2NdJqBAAAagQAACMAAAAAAAAAAAAAAAAAKGlXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BhdGhzLnB5UEsBAhQDFAAAAAAAAAAhAGtiVnzFFgAAxRYAACgAAAAAAAAAAAAAAAAA021XAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BlcDQyNXRhZ3MucHlQSwECFAMUAAAAAAAAACEAgEMYoMkEAADJBAAAJQAAAAAAAAAAAAAAAADehFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGtnaW5mby5weVBLAQIUAxQAAAAAAAAAIQD8TOZMww4AAMMOAAAxAAAAAAAAAAAAAAAAAOqJVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPxQ/+BjGgAAYxoAAC4AAAAAAAAAAAAAAAAA/JhXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvZGpiZWMucHlQSwECFAMUAAAAAAAAACEATAElPp8GAACfBgAAMgAAAAAAAAAAAAAAAACrs1cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHlQSwECFAMUAAAAAAAAACEA29viLfQMAAD0DAAALQAAAAAAAAAAAAAAAACaulcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5UEsBAhQDFAAAAAAAAAAhAP+eZXABAAAAAQAAACsAAAAAAAAAAAAAAAAA2cdXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAjyFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAShdH0hcAAAAXAAAARAAAAAAAAAAAAAAAAAB5yFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHAoXOFcDAABXAwAANQAAAAAAAAAAAAAAAADyyFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAKEsYZZkGAACZBgAAKwAAAAAAAAAAAAAAAACczFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb25mdGVzdC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAAH7TVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAF+GzE/IAQAAyAEAADcAAAAAAAAAAAAAAAAA1tNXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAADz1VcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAAABJ1lcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmhQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAACc1lcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyc2Rpc3QucHlQSwECFAMUAAAAAAAAACEAmcQnLEQBAABEAQAANQAAAAAAAAAAAAAAAAD11lcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAaj7d19ssAADbLAAAMgAAAAAAAAAAAAAAAACM2FcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb25QSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAC3BVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDTTQSjfwEAAH8BAAA0AAAAAAAAAAAAAAAAAAwGWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAA3QdYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQB24Ez6ahQAAGoUAAA/AAAAAAAAAAAAAAAAAD0IWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGxQSwECFAMUAAAAAAAAACEAOCvvEW0ZAABtGQAALQAAAAAAAAAAAAAAAAAEHVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2Jhc2ljLnB5UEsBAhQDFAAAAAAAAAAhAG0Esr5KBwAASgcAAC8AAAAAAAAAAAAAAAAAvDZYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAPdhH5MPCgAADwoAACwAAAAAAAAAAAAAAAAAUz5YAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9rZXlzLnB5UEsBAhQDFAAAAAAAAAAhAGJYdGOsAAAArAAAAC0AAAAAAAAAAAAAAAAArEhYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9wYXRocy5weVBLAQIUAxQAAAAAAAAAIQBtljH52AUAANgFAAAvAAAAAAAAAAAAAAAAAKNJWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weVBLAQIUAxQAAAAAAAAAIQCkKX8xYAQAAGAEAAAyAAAAAAAAAAAAAAAAAMhPWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQCcV0LwJxcAACcXAAAuAAAAAAAAAAAAAAAAAHhUWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5UEsBAhQDFAAAAAAAAAAhANQ+H1aQAgAAkAIAACwAAAAAAAAAAAAAAAAA62tYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90b29sLnB5UEsBAhQDFAAAAAAAAAAhAEViREzpEQAA6REAADEAAAAAAAAAAAAAAAAAxW5YAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF93aGVlbGZpbGUucHlQSwECFAMUAAAAAAAAACEAoy0DF6EzAAChMwAAKwAAAAAAAAAAAAAAAAD9gFgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdG9vbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDP2DOyGhMAABoTAAAiAAAAAAAAAAAAAAAAAOe0WABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAPO05Ci3HgAAtx4AACsAAAAAAAAAAAAAAAAAQchYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3dpbmluc3Qyd2hlZWwucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAABB51gAc3VicGFyL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAcedYAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAAAAAAAAAAAAAAAAqedYAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHlQSwUGAAAAALEBsQH9nwAAlxZZAAAA